| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: create/delete schedules if needed when connection is created/deleted (#7584) As with syncs, failing to create the schedule doesn't fail the connection creation. Connection will therefore be not running after schedule creation failure and would require unpausing to be "fixed" <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7584?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: Matej Vobornik <vobornik.matej@gmail.com> | 26 天前 | |
fix(egress): outbound url policy across all customer-controlled egress paths (#6646) ## Summary Builds on the existing base-URL denylist and the `@nangohq/egress` package to add a single, configurable outbound URL policy across all customer-controlled egress paths. Every outbound connection - including each redirect hop - is now routed through DNS-pinning agents that re-validate the *resolved* IP, with a configurable redirect cap. Secure defaults apply out of the box; behavior is tunable via `NANGO_OUTBOUND_URL_POLICY`. ## What changed **Egress policy is now applied at the leaf of each outbound path:** - **Proxy (server + runner):** `ProxyRequest` accepts an `outboundPolicy`; `getAxiosConfiguration` attaches DNS-pinning keep-alive agents, caps `maxRedirects`, and re-validates the resolved address on the initial request and on every `beforeRedirect` hop (mTLS connections included). - **Customer webhook delivery:** `deliver()` resolves an env-derived transport (policy + agents + redirect validator) by default, applies the redirect cap, and skips disallowed targets. - **`uncontrolledFetch` (runner SDK):** validates the resolved address per hop; unresolvable hostnames fall through to a normal fetch failure rather than a policy denial. - **Credential verification + AWS SigV4 hooks:** the internal `ProxyRequest` calls now carry the server policy too. - **Webhook registration (`PATCH .../webhook`):** rejects disallowed URLs at save time. **Config & propagation:** - New optional `NANGO_OUTBOUND_URL_POLICY` (JSON), parsed/validated at startup and memoized. - Propagated automatically to Kubernetes and Lambda runners. - Documented in `.env.example` and the self-hosting guide. **Performance:** safe DNS lookups and agents are memoized per-policy so connections pool and the pinned-address cache is shared across requests. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/6646?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 3 个月前 | |
feat(cli): add --checkpoint option to dryrun command (#5440) adding dryrun option `--checkpoint` to be able to test checkpointing in function (similar to the already existig --metadata option) The object passed via this option would become the initial checkpoint when dry-running the function ``` // Example nango dryrun mySync myConn --checkpoint '{"lastModifiedAt": "2026-02-11T22:04:30.803Z"}' ``` <!-- Summary by @propel-code-bot --> --- The CLI now accepts checkpoint payloads via inline JSON or @file inputs, runs them through the shared JSON parser and central checkpoint validator, threads the seeded state through the sync/action CLIs so dry runs exercise get/save/clear checkpoint logic, and documents the workflow while aligning the SDK’s checkpoint types—removing Date values—around the new validator. <details> <summary><strong>Possible Issues</strong></summary> • Removing `Date` from `CheckpointValue` is a breaking change for any existing checkpoints that stored Date instances—migrations or release notes may be required • CLI still surfaces the raw `Invalid checkpoint: ...` message from Zod, which may be noisy for common mistakes (arrays, null) </details> --- *This summary was automatically generated by @propel-code-bot* | 7 个月前 | |
fix: record schema compilation caching (#4902) when validating saved records we compile and cache the compiled model schema. If the compilation fails for some reason the compilation is attempted again on all batchSave (and keeps failing). Ajv compilation seems to hold some references/data in memory and since we use a static ajv instance the memory is never released and is piling up. This commit ensures we also cache compilation failure and not re-attempt to compile a failing schema. It doesn't solve the static ajv instance holding on memory but it would take 1000s of different models/versions to run into some kind of memory leak. To keep in mind though. <!-- Summary by @propel-code-bot --> --- **Cache Failed JSON Schema Compilations in `dataValidation.ts`** This pull request updates the schema validation logic in `packages/runner-sdk/lib/dataValidation.ts` so that schema compilation failures (via Ajv) are cached, not just successful validator functions. By storing the `Error` instance directly in the cache keyed by `modelName-version`, the system avoids retrying compilation on invalid schemas during subsequent batch operations, which prevents both redundant computations and unbounded memory use caused by the static Ajv instance accumulating data. The change includes explanatory comments and minimal control flow adjustments to implement this error-caching behavior. <details> <summary><strong>Key Changes</strong></summary> • Modified `cache` definition in `dataValidation.ts` to allow both `ValidateFunction<any>` and `Error` as values, keyed by `modelName-version`. • On schema compilation failure, store the `Error` object directly in the `cache` and return it as an array to the caller. • During validation, added logic to immediately return the cached error if present, thus bypassing re-compilation attempts. • Added inline comments clarifying the rationale and flow of the error-caching strategy. • Made minor restructuring in `validateData` to separate handling for cache hits and compilation attempts. </details> <details> <summary><strong>Affected Areas</strong></summary> • `packages/runner-sdk/lib/dataValidation.ts` • `validateData` function • Validator cache logic and error handling code </details> --- *This summary was automatically generated by @propel-code-bot* | 11 个月前 | |
chore(eslint): manual pass over some folders (#3979) ## Changes Didn't want a big PR for import order but it's definitely not going to end without a big push - Import order: manual pass over some folder <!-- This is an auto-generated description by mrge. --> --- ## Summary by mrge Reordered and cleaned up import statements across multiple files to improve code consistency and follow ESLint rules. No functional changes were made. <!-- End of auto-generated description by mrge. --> | 1 年前 | |
feat: expose function checkpoints (from/to) in Nango logs (#5565) Runner is now returning from/to checkpoints which is exposed in the logs operation metadata to make it visible for customers for monitoring/debugging purpose <img width="1009" height="479" alt="Screenshot 2026-03-04 at 14 54 07" src="https://github.com/user-attachments/assets/f70f9468-ce26-4f67-9ae9-4bc2c41aa525" /> `from` is the checkpoint value at the beginning of the execution (aka: last saved checkpoint of the previous execution) `to` is the last saved checkpoints of this execution Note: in a followup PR, the checkpoints info will be added to the sync webhook <!-- Describe the problem and your solution --> <!-- Issue ticket number and link (if applicable) --> <!-- Testing instructions (skip if just adding/editing providers) --> <!-- Summary by @propel-code-bot --> --- It also propagates these checkpoint ranges through execution results into the jobs service, updating the jobs API contract and task payloads so handlers capture checkpoints on both success and error paths for end-to-end logging and metadata. <details> <summary><strong>Possible Issues</strong></summary> • If `getCheckpoint` is never called, `from` may remain `null` and logs may show an incomplete range; confirm that is acceptable for monitoring expectations. </details> --- *This summary was automatically generated by @propel-code-bot* | 7 个月前 | |
feat(functions): support for http trigger (#7250) Functions with http trigger can now compile, be deployed and executed. `debounce` and `subscriptions` support for http trigger is not yet enabled. The shape of trigger is now zod validated. Once this PR land and CLI released, it would be possible to write, deploy and execute action-like functions Example of function that can be run: ```ts import { createFunction } from 'nango/experimental'; import * as z from 'zod'; export default createFunction({ description: '10x', trigger: { kind: 'http', }, input: z.object({ n: z.number(), }), output: z.object({ tenTimes: z.number(), }), exec: async (nango, trigger) => { nango.setLogger({ level: 'debug' }); await nango.log('Hello World!'); await nango.log('Trigger: ' + JSON.stringify(trigger)); const tenTimes = trigger.input.n * 10 await nango.log('Result: ' + tenTimes); return { tenTimes } } }); ``` <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7250?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 1 个月前 | |
fix(function): align types between types package and runner-sdk (#6964) This commit consolidates and align the types between `runner-sdk` and the `types` packages <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/6964?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 2 个月前 | |
feat(runner-sdk): support redirect error in nango.uncontrolledfetch (#7758) <!-- Describe the problem and your solution --> [Customer thread ](https://nangohq.slack.com/archives/C0BTU1N40A3/p1790872266401059) Customer is using uncontrolledFetch to copy a file from the provider to a separate API and wants to ensure the file contents are not posted to another service after redirect. <!-- Issue ticket number and link (if applicable) --> [NAN-7347: feat(sdk): Support `redirect: 'error'` in `nango.uncontrolledFetch()`](https://linear.app/nango/issue/NAN-7347/featsdk-support-redirect-error-in-nangouncontrolledfetch) <!-- Testing instructions (skip if just adding/editing providers) --> Pointing to a local version of the CLI with the updated type, deploy a function like the following: ``` import { createAction } from "nango"; import * as z from "zod"; const uploadUrl = new URL( "https://ilse-blas-virtuously.ngrok-free.dev/api/test/redirect", ); const body = "forensic-file"; const action = createAction({ description: "POST a hardcoded body twice: once refusing redirects, once following them.", version: "1.0.0", input: z.void(), output: z.void(), exec: async (nango) => { await nango.setLogger({ level: "debug", }); for (const redirect of ["error", "follow"] as const) { try { const response = await nango.uncontrolledFetch({ url: uploadUrl, method: "POST", headers: { "content-type": "text/plain" }, body, redirect, }); await nango.log( `redirect ${redirect}: ${response.status} ${await response.text()}`, ); } catch (error) { const payload = error && typeof error === "object" && "payload" in error ? error.payload : undefined; const detail = payload && typeof payload === "object" && "message" in payload && typeof payload.message === "string" ? payload.message : error instanceof Error ? error.message : "Request failed"; await nango.log(`redirect ${redirect} failed: ${detail}`, { level: "error", }); } } }, }); export default action; ``` Where the uploadUrl is some sample app that tries to redirect the request. First request should fail on seeing the redirect, second should go through. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7758?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> | 16 天前 | |
fix: Revert "fix(paginate): throw error if `response_path` isn't present on the first page" (#4637) Reverts NangoHQ/nango#4587 | 1 年前 | |
fix: vitest upgrade (#6315) <!-- Describe the problem and your solution --> <!-- Issue ticket number and link (if applicable) --> <!-- Testing instructions (skip if just adding/editing providers) --> | 4 个月前 | |
chore: execute simple function (#7219) Adding support for function execution in jobs/runner. This is the minimal changes to execute a function. I am trying to not refactor the entire runner and jobs all at once so implementation for now piggybacks on current logic, transforming function config into existing NangoProps and executing it as an action in order to minimize the amount of code change. The goal is to avoid big bang PRs that are introducing many changes and are hard to test or review. Over time the current function execution logic will be extended and some part of the runner would need to be refactored but I prefer to do it little by little rather than all at once Note: it is not yet possible to deploy a function that can be invoked. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7219?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 1 个月前 | |
feat: add CreateFunction definition (#6664) Also remove the recent changes made around createWebhook. They will be folded and reintroduced as part of the function primitive initiative `function` definition types are in https://github.com/NangoHQ/nango/pull/6664/changes#diff-cedceb6eb8af423d2de17f68fed59bd218cf3c5029655359b4361d444c733256 The rest is reverting support for `createWebhook` in `runner-sdk` and `cli` <!-- Describe the problem and your solution --> <!-- Issue ticket number and link (if applicable) --> <!-- Testing instructions (skip if just adding/editing providers) --> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/6664?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 3 个月前 | |
feat(function): implement getVariant() (#7569) in function `nango.getVariant()` can be used to retrieve the variant associated with the current execution. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7569?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: Matej Vobornik <vobornik.matej@gmail.com> | 27 天前 | |
fix: upgrade to zod v4 (#4328) ## Changes - Upgrade zod to v4 It was a bit more involved; they changed the import strategy, some props, error messages, deprecated a bunch of methods - Upgrade zero yaml to v4 Since Zod is now part of our API, we need to be careful about updates like this. Thankfully, it's still mostly compatible. I wrote a little helper that syncs the package.json dependencies version so we keep people in sync whether they like it or not :D ## 🧪 Tests I tested zod v4 with `npm install -g nango@0.63.1-beta.1` and staging Locally: run the dashboard, call some endpoints, deploy your scripts, etc. <!-- Summary by @propel-code-bot --> --- This PR performs a full upgrade from Zod v3 to v4 across the Nango monorepo, affecting core CLI, backend jobs, Connect UI, examples, test suites, and related documentation. All existing imports and usages of Zod are refactored for the new namespace import pattern and breaking API changes in v4. CLI and migration tooling is enhanced to ensure that user projects remain in sync with the required Zod version via a new helper and stricter dependency enforcement during initialization, migration, and dev workflows. Type conversion utilities, test snapshots, and example scripts are adapted for Zod v4 compatibility, and accompanying documentation reflects the updated API. <details> <summary><strong>Key Changes</strong></summary> • Upgrade all Zod packages/dependencies from v3 to v4 and update all import statements to 'import * as z from "zod"'. • Adjust all usage sites for Zod breaking changes (e.g., schema/property APIs, type usage). • Introduce helper utility (checkAndSyncPackageJson) and associated workflow to strictly sync Zod version in user projects' package.json. • Update CLI tooling, migrations, zeroYaml, and example projects to enforce required Zod version. • Update Connect UI and frontend to use new Zod APIs and bump related peer dependencies (e.g., react-hook-form, Vite). • Adapt test snapshots, test fixtures, and CLI migration/unit tests for Zod v4 compatibility. • Adjust and document code samples, migration guides, and all references to Zod usage/patterns. </details> <details> <summary><strong>Affected Areas</strong></summary> • CLI core and migration code • Backend job routes and validation logic • Connect UI frontend and form handling • Package/dependency management for CLI-generated projects • Type conversion utilities between Zod and internal model fields • Test fixtures, snapshots, and unit tests • User and developer documentation, migration guides </details> *This summary was automatically generated by @propel-code-bot* | 1 年前 | |
feat(cli): add --checkpoint option to dryrun command (#5440) adding dryrun option `--checkpoint` to be able to test checkpointing in function (similar to the already existig --metadata option) The object passed via this option would become the initial checkpoint when dry-running the function ``` // Example nango dryrun mySync myConn --checkpoint '{"lastModifiedAt": "2026-02-11T22:04:30.803Z"}' ``` <!-- Summary by @propel-code-bot --> --- The CLI now accepts checkpoint payloads via inline JSON or @file inputs, runs them through the shared JSON parser and central checkpoint validator, threads the seeded state through the sync/action CLIs so dry runs exercise get/save/clear checkpoint logic, and documents the workflow while aligning the SDK’s checkpoint types—removing Date values—around the new validator. <details> <summary><strong>Possible Issues</strong></summary> • Removing `Date` from `CheckpointValue` is a breaking change for any existing checkpoints that stored Date instances—migrations or release notes may be required • CLI still surfaces the raw `Invalid checkpoint: ...` message from Zod, which may be noisy for common mistakes (arrays, null) </details> --- *This summary was automatically generated by @propel-code-bot* | 7 个月前 | |
feat(runner-sdk): support redirect error in nango.uncontrolledfetch (#7758) <!-- Describe the problem and your solution --> [Customer thread ](https://nangohq.slack.com/archives/C0BTU1N40A3/p1790872266401059) Customer is using uncontrolledFetch to copy a file from the provider to a separate API and wants to ensure the file contents are not posted to another service after redirect. <!-- Issue ticket number and link (if applicable) --> [NAN-7347: feat(sdk): Support `redirect: 'error'` in `nango.uncontrolledFetch()`](https://linear.app/nango/issue/NAN-7347/featsdk-support-redirect-error-in-nangouncontrolledfetch) <!-- Testing instructions (skip if just adding/editing providers) --> Pointing to a local version of the CLI with the updated type, deploy a function like the following: ``` import { createAction } from "nango"; import * as z from "zod"; const uploadUrl = new URL( "https://ilse-blas-virtuously.ngrok-free.dev/api/test/redirect", ); const body = "forensic-file"; const action = createAction({ description: "POST a hardcoded body twice: once refusing redirects, once following them.", version: "1.0.0", input: z.void(), output: z.void(), exec: async (nango) => { await nango.setLogger({ level: "debug", }); for (const redirect of ["error", "follow"] as const) { try { const response = await nango.uncontrolledFetch({ url: uploadUrl, method: "POST", headers: { "content-type": "text/plain" }, body, redirect, }); await nango.log( `redirect ${redirect}: ${response.status} ${await response.text()}`, ); } catch (error) { const payload = error && typeof error === "object" && "payload" in error ? error.payload : undefined; const detail = payload && typeof payload === "object" && "message" in payload && typeof payload.message === "string" ? payload.message : error instanceof Error ? error.message : "Request failed"; await nango.log(`redirect ${redirect} failed: ${detail}`, { level: "error", }); } } }, }); export default action; ``` Where the uploadUrl is some sample app that tries to redirect the request. First request should fail on seeing the redirect, second should go through. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7758?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> | 16 天前 | |
feat(runner-sdk): support redirect error in nango.uncontrolledfetch (#7758) <!-- Describe the problem and your solution --> [Customer thread ](https://nangohq.slack.com/archives/C0BTU1N40A3/p1790872266401059) Customer is using uncontrolledFetch to copy a file from the provider to a separate API and wants to ensure the file contents are not posted to another service after redirect. <!-- Issue ticket number and link (if applicable) --> [NAN-7347: feat(sdk): Support `redirect: 'error'` in `nango.uncontrolledFetch()`](https://linear.app/nango/issue/NAN-7347/featsdk-support-redirect-error-in-nangouncontrolledfetch) <!-- Testing instructions (skip if just adding/editing providers) --> Pointing to a local version of the CLI with the updated type, deploy a function like the following: ``` import { createAction } from "nango"; import * as z from "zod"; const uploadUrl = new URL( "https://ilse-blas-virtuously.ngrok-free.dev/api/test/redirect", ); const body = "forensic-file"; const action = createAction({ description: "POST a hardcoded body twice: once refusing redirects, once following them.", version: "1.0.0", input: z.void(), output: z.void(), exec: async (nango) => { await nango.setLogger({ level: "debug", }); for (const redirect of ["error", "follow"] as const) { try { const response = await nango.uncontrolledFetch({ url: uploadUrl, method: "POST", headers: { "content-type": "text/plain" }, body, redirect, }); await nango.log( `redirect ${redirect}: ${response.status} ${await response.text()}`, ); } catch (error) { const payload = error && typeof error === "object" && "payload" in error ? error.payload : undefined; const detail = payload && typeof payload === "object" && "message" in payload && typeof payload.message === "string" ? payload.message : error instanceof Error ? error.message : "Request failed"; await nango.log(`redirect ${redirect} failed: ${detail}`, { level: "error", }); } } }, }); export default action; ``` Where the uploadUrl is some sample app that tries to redirect the request. First request should fail on seeing the redirect, second should go through. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7758?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> | 16 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 26 天前 | ||
| 3 个月前 | ||
| 7 个月前 | ||
| 11 个月前 | ||
| 1 年前 | ||
| 7 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 16 天前 | ||
| 1 年前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 27 天前 | ||
| 1 年前 | ||
| 7 个月前 | ||
| 16 天前 | ||
| 16 天前 |