@ic-reactor/mcp 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +77 -0
- package/.github/actions/setup-rust-wasm/action.yml +25 -0
- package/.github/dependabot.yml +107 -0
- package/.github/workflows/auth-latest.yml +67 -0
- package/.github/workflows/b3pay-site.yml +49 -0
- package/.github/workflows/ci.yml +430 -0
- package/.github/workflows/codeql.yml +41 -0
- package/.github/workflows/dependency-review.yml +68 -0
- package/.github/workflows/docs-check.yml +98 -0
- package/.github/workflows/docs.yml +265 -0
- package/.github/workflows/e2e.yml +90 -0
- package/.github/workflows/examples-published.yml +97 -0
- package/.github/workflows/release.yml +326 -0
- package/.husky/pre-commit +12 -0
- package/.prettierignore +109 -0
- package/.prettierrc +6 -0
- package/AGENTS.md +103 -0
- package/CHANGELOG.md +3268 -0
- package/CLAUDE.md +93 -0
- package/CNAME +1 -0
- package/CODE_OF_CONDUCT.md +7 -0
- package/CONTRIBUTING.md +433 -0
- package/LICENSE +21 -0
- package/README.md +2 -2
- package/SECURITY.md +74 -0
- package/b3pay-module.json +194 -0
- package/docs/.remarkrc.json +10 -0
- package/docs/README.md +64 -0
- package/docs/astro.config.mjs +205 -0
- package/docs/favicon.svg +15 -0
- package/docs/package.json +39 -0
- package/docs/public/favicon.svg +15 -0
- package/docs/public/ic-reactor-social-card.png +0 -0
- package/docs/scripts/b3pay-static.mjs +22 -0
- package/docs/scripts/check-example-docs.mjs +214 -0
- package/docs/scripts/check-links.mjs +212 -0
- package/docs/scripts/fix-dist-links.js +125 -0
- package/docs/scripts/fix-frontmatter.js +71 -0
- package/docs/scripts/remove-redundant-h1.cjs +48 -0
- package/docs/scripts/rewrite-typedoc-links.js +110 -0
- package/docs/scripts/split-index.js +69 -0
- package/docs/src/assets/ic-reactor-hero-dark.svg +23 -0
- package/docs/src/assets/ic-reactor-hero-light.svg +23 -0
- package/docs/src/assets/ic-reactor-lockup-dark.svg +15 -0
- package/docs/src/assets/ic-reactor-lockup-light.svg +15 -0
- package/docs/src/assets/ic-reactor-mark-dark.svg +14 -0
- package/docs/src/assets/ic-reactor-mark-light.svg +14 -0
- package/docs/src/assets/layers/candid-core-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/candid-core-layer-icon-light.svg +4 -0
- package/docs/src/assets/layers/candid-profile-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/candid-profile-layer-icon-light.svg +4 -0
- package/docs/src/assets/layers/ic-reactor-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/ic-reactor-layer-icon-light.svg +4 -0
- package/docs/src/components/LibraryCards.astro +172 -0
- package/docs/src/components/LibraryIcon.astro +28 -0
- package/docs/src/components/SiteTitle.astro +241 -0
- package/docs/src/content/docs/404.mdx +19 -0
- package/docs/src/content/docs/build/agent-tools.mdx +593 -0
- package/docs/src/content/docs/build/icrc1-wallet.mdx +619 -0
- package/docs/src/content/docs/build/ssr-per-user.mdx +552 -0
- package/docs/src/content/docs/examples/canister-studio.mdx +95 -0
- package/docs/src/content/docs/examples/icrc-ledger.mdx +45 -0
- package/docs/src/content/docs/examples/index.mdx +38 -0
- package/docs/src/content/docs/examples/next-ssr.mdx +73 -0
- package/docs/src/content/docs/examples/node-agent-tool.mdx +80 -0
- package/docs/src/content/docs/examples/vite-wallet.mdx +71 -0
- package/docs/src/content/docs/guides/auth.mdx +1181 -0
- package/docs/src/content/docs/guides/client.mdx +551 -0
- package/docs/src/content/docs/guides/deploy.mdx +180 -0
- package/docs/src/content/docs/guides/errors.mdx +475 -0
- package/docs/src/content/docs/guides/getting-started.mdx +620 -0
- package/docs/src/content/docs/guides/reads.mdx +586 -0
- package/docs/src/content/docs/guides/ssr.mdx +529 -0
- package/docs/src/content/docs/guides/testing.mdx +401 -0
- package/docs/src/content/docs/guides/values.mdx +261 -0
- package/docs/src/content/docs/guides/vite-plugin.mdx +690 -0
- package/docs/src/content/docs/guides/writes.mdx +572 -0
- package/docs/src/content/docs/ic-reactor/index.mdx +167 -0
- package/docs/src/content/docs/index.mdx +65 -0
- package/docs/src/content/docs/migrating-from-3.mdx +535 -0
- package/docs/src/content/docs/packages/core.mdx +186 -0
- package/docs/src/content/docs/packages/mcp.mdx +163 -0
- package/docs/src/content/docs/packages/react.mdx +207 -0
- package/docs/src/content/docs/packages/vite-plugin.mdx +73 -0
- package/docs/src/content/docs/versioning.mdx +104 -0
- package/docs/src/content.config.ts +7 -0
- package/docs/src/styles/custom.css +189 -0
- package/docs/tsconfig.typedoc.json +26 -0
- package/docs/typedoc-entry.ts +17 -0
- package/docs/typedoc.json +37 -0
- package/e2e/Cargo.lock +646 -0
- package/e2e/Cargo.toml +3 -0
- package/e2e/README.md +101 -0
- package/e2e/frontends/build.mjs +94 -0
- package/e2e/frontends/index.html +10 -0
- package/e2e/global-setup.ts +65 -0
- package/e2e/icp.yaml +38 -0
- package/e2e/package.json +40 -0
- package/e2e/setup.ts +6 -0
- package/e2e/src/actor/Cargo.toml +14 -0
- package/e2e/src/actor/hello_actor.did +10 -0
- package/e2e/src/actor/src/lib.rs +73 -0
- package/e2e/src/calls.test.ts +132 -0
- package/e2e/src/declarations/hello_actor.envelope.json +175 -0
- package/e2e/src/declarations/hello_actor.ts +15 -0
- package/e2e/src/errors.test.ts +107 -0
- package/e2e/src/frontend-headers.test.ts +253 -0
- package/e2e/src/identity.test.ts +61 -0
- package/e2e/src/react.test.tsx +59 -0
- package/e2e/src/replica.ts +70 -0
- package/e2e/src/vite-env.test.ts +108 -0
- package/e2e/test.sh +47 -0
- package/e2e/tsconfig.json +20 -0
- package/e2e/tsconfig.typecheck.json +9 -0
- package/e2e/vitest.config.ts +22 -0
- package/eslint.config.mjs +100 -0
- package/evals/PREREGISTRATION.md +1346 -0
- package/evals/README.md +756 -0
- package/evals/conditions/thin/condition.json +8 -0
- package/evals/conditions/thin/docs/candid-core-cli.README.md +90 -0
- package/evals/conditions/thin/docs/candid-core-schema.README.md +339 -0
- package/evals/conditions/thin/package.json +25 -0
- package/evals/conditions/thin/starter/src/generated/icrc1.ts +57 -0
- package/evals/conditions/thin-guide/condition.json +10 -0
- package/evals/conditions/thin-guide/docs/llms.txt +292 -0
- package/evals/conditions/v3/condition.json +9 -0
- package/evals/conditions/v3/docs/ic-reactor-core.llms.txt +232 -0
- package/evals/conditions/v3/docs/ic-reactor-react.llms.txt +280 -0
- package/evals/conditions/v3/docs/llms-full.txt +1053 -0
- package/evals/conditions/v3/package.json +26 -0
- package/evals/conditions/v3/starter/src/declarations/icrc1.did.d.ts +95 -0
- package/evals/conditions/v3/starter/src/declarations/icrc1.did.js +140 -0
- package/evals/conditions/v4/PORTING.md +384 -0
- package/evals/conditions/v4/README.md +106 -0
- package/evals/conditions/v4/condition.json +5 -0
- package/evals/conditions/v4/docs/llms.txt +323 -0
- package/evals/conditions/v4/package.json +27 -0
- package/evals/conditions/v4/starter/src/generated/icrc1.ts +78 -0
- package/evals/conditions/v4-proto/condition.json +6 -0
- package/evals/conditions/v4-proto/docs/llms.txt +291 -0
- package/evals/conditions/v4-proto/lib/SHIM-NOTES.md +20 -0
- package/evals/conditions/v4-proto/lib/package.json +27 -0
- package/evals/conditions/v4-proto/lib/src/client.ts +471 -0
- package/evals/conditions/v4-proto/lib/src/errors.ts +214 -0
- package/evals/conditions/v4-proto/lib/src/index.ts +36 -0
- package/evals/conditions/v4-proto/lib/src/principal.ts +175 -0
- package/evals/conditions/v4-proto/lib/src/service.ts +69 -0
- package/evals/conditions/v4-proto/lib/src/types.ts +174 -0
- package/evals/conditions/v4-proto/lib/test/runtime.test.ts +170 -0
- package/evals/conditions/v4-proto/lib/test/tsconfig.json +10 -0
- package/evals/conditions/v4-proto/lib/test/types.test-d.ts +145 -0
- package/evals/conditions/v4-proto/lib/test/vitest.config.mjs +8 -0
- package/evals/conditions/v4-proto/lib/tsconfig.json +17 -0
- package/evals/conditions/v4-proto/package.json +26 -0
- package/evals/conditions/v4-proto/starter/src/generated/icrc1.service.ts +19 -0
- package/evals/conditions/v4-proto/starter/src/generated/icrc1.ts +57 -0
- package/evals/drive.mjs +1221 -0
- package/evals/gate.mjs +161 -0
- package/evals/harness/aggregate.mjs +534 -0
- package/evals/harness/aggregate.test.mjs +344 -0
- package/evals/harness/assemble.mjs +216 -0
- package/evals/harness/assemble.test.mjs +143 -0
- package/evals/harness/auth.mjs +91 -0
- package/evals/harness/check-docs.mjs +157 -0
- package/evals/harness/declarations/icrc1.did.d.ts +95 -0
- package/evals/harness/declarations/icrc1.did.js +140 -0
- package/evals/harness/drive-auth.test.mjs +584 -0
- package/evals/harness/drive.test.mjs +509 -0
- package/evals/harness/fake-auth.ts +67 -0
- package/evals/harness/fake-ledger.ts +178 -0
- package/evals/harness/gate-plan.mjs +104 -0
- package/evals/harness/gate-plan.test.mjs +243 -0
- package/evals/harness/icrc1.did +88 -0
- package/evals/harness/judge.mjs +63 -0
- package/evals/harness/judge.test.mjs +81 -0
- package/evals/harness/leak-scan.mjs +1373 -0
- package/evals/harness/leak-scan.test.mjs +1300 -0
- package/evals/harness/probes/amounts.ts +14 -0
- package/evals/harness/probes/node-tool.probe.ts +48 -0
- package/evals/harness/probes/probe.mjs +149 -0
- package/evals/harness/probes/react-wallet.probe.ts +96 -0
- package/evals/harness/public/support/auth.ts +38 -0
- package/evals/harness/public/support/fake-replica.d.ts +28 -0
- package/evals/harness/public/support/fake-replica.js +434 -0
- package/evals/harness/public/support/ledger.idl.d.ts +95 -0
- package/evals/harness/public/support/ledger.idl.js +140 -0
- package/evals/harness/public/support/world.ts +179 -0
- package/evals/harness/runs.mjs +139 -0
- package/evals/harness/sandbox.mjs +88 -0
- package/evals/harness/sandbox.test.mjs +134 -0
- package/evals/harness/ship.mjs +264 -0
- package/evals/harness/ship.test.mjs +552 -0
- package/evals/harness/world.ts +291 -0
- package/evals/package.json +26 -0
- package/evals/pnpm-lock.yaml +1537 -0
- package/evals/pnpm-workspace.yaml +12 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.json +384 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.json +404 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.rescored.json +404 -0
- package/evals/results/2026-09-30T14-22-05-924Z/plan.json +240 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.json +1800 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.json +1843 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.rescored.json +2100 -0
- package/evals/results/2026-09-30T15-48-23-343Z/pilot.json +404 -0
- package/evals/results/2026-09-30T15-48-23-343Z/pilot.rescored.json +404 -0
- package/evals/results/2026-09-30T15-48-23-343Z/plan.json +242 -0
- package/evals/results/2026-09-30T15-48-23-343Z/summary.json +1843 -0
- package/evals/results/2026-09-30T15-48-23-343Z/summary.rescored.json +2195 -0
- package/evals/results/2026-10-03-beta1-gate/pilot.json +162 -0
- package/evals/results/2026-10-03-beta1-gate/plan.json +141 -0
- package/evals/results/2026-10-03-beta1-gate/summary.json +983 -0
- package/evals/results/2026-10-05-ga-gate/contaminated-run.json +55 -0
- package/evals/results/2026-10-05-ga-gate/pilot.json +162 -0
- package/evals/results/2026-10-05-ga-gate/plan.json +457 -0
- package/evals/results/2026-10-05-ga-gate/summary.json +1037 -0
- package/evals/results/2026-10-05-ga-gate/summary.rescanned.json +1037 -0
- package/evals/results/README.md +31 -0
- package/evals/runs-pilot.log +150 -0
- package/evals/runs-pilot2.log +150 -0
- package/evals/score.mjs +256 -0
- package/evals/setup.mjs +547 -0
- package/evals/tasks/node-tool/faulty/thin-accepts-exponent/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-accepts-exponent/src/index.ts +121 -0
- package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/src/index.ts +116 -0
- package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-ignores-root-key/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-ignores-root-key/src/index.ts +117 -0
- package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/src/index.ts +119 -0
- package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-number-amount/meta.json +10 -0
- package/evals/tasks/node-tool/faulty/thin-number-amount/src/index.ts +117 -0
- package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/src/index.ts +120 -0
- package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/v3-retry-call-errors/meta.json +11 -0
- package/evals/tasks/node-tool/faulty/v3-retry-call-errors/src/index.ts +149 -0
- package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/src/index.ts +71 -0
- package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/src/index.ts +84 -0
- package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/src/index.ts +72 -0
- package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/src/index.ts +72 -0
- package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/src/index.ts +84 -0
- package/evals/tasks/node-tool/hidden/node-tool.test.ts +312 -0
- package/evals/tasks/node-tool/prompt.md +55 -0
- package/evals/tasks/node-tool/prompt.minimal.md +30 -0
- package/evals/tasks/node-tool/solutions/thin/reference/src/index.ts +118 -0
- package/evals/tasks/node-tool/solutions/thin/reference-module-scope/src/index.ts +145 -0
- package/evals/tasks/node-tool/solutions/thin-guide/reference/src/index.ts +118 -0
- package/evals/tasks/node-tool/solutions/thin-guide/reference-module-scope/src/index.ts +145 -0
- package/evals/tasks/node-tool/solutions/v3/reference/src/index.ts +140 -0
- package/evals/tasks/node-tool/solutions/v3/reference-module-scope/src/index.ts +153 -0
- package/evals/tasks/node-tool/solutions/v4/reference/src/index.ts +84 -0
- package/evals/tasks/node-tool/solutions/v4/reference-module-scope/src/index.ts +105 -0
- package/evals/tasks/node-tool/solutions/v4-proto/reference/src/index.ts +72 -0
- package/evals/tasks/node-tool/solutions/v4-proto/reference-module-scope/src/index.ts +87 -0
- package/evals/tasks/node-tool/starter/src/contract.ts +31 -0
- package/evals/tasks/node-tool/starter/src/index.ts +7 -0
- package/evals/tasks/node-tool/starter/test/smoke.test.ts +22 -0
- package/evals/tasks/node-tool/starter/tsconfig.json +17 -0
- package/evals/tasks/node-tool/task.json +63 -0
- package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/src/Wallet.tsx +216 -0
- package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/src/Wallet.tsx +212 -0
- package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/src/Wallet.tsx +210 -0
- package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/meta.json +8 -0
- package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/meta.json +9 -0
- package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-number-balance/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-number-balance/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/src/Wallet.tsx +254 -0
- package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/src/Wallet.tsx +215 -0
- package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/src/Wallet.tsx +214 -0
- package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/src/Wallet.tsx +224 -0
- package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/src/Wallet.tsx +225 -0
- package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/meta.json +11 -0
- package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/src/Wallet.tsx +182 -0
- package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/src/Wallet.tsx +160 -0
- package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/src/Wallet.tsx +166 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/src/Wallet.tsx +162 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-retry-spread/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v4-retry-spread/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-status-not-idle/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-status-not-idle/src/Wallet.tsx +162 -0
- package/evals/tasks/react-wallet/hidden/react-wallet.test.ts +536 -0
- package/evals/tasks/react-wallet/prompt.md +88 -0
- package/evals/tasks/react-wallet/prompt.minimal.md +51 -0
- package/evals/tasks/react-wallet/solutions/thin/reference/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/solutions/thin/reference-module-scope/src/Wallet.tsx +227 -0
- package/evals/tasks/react-wallet/solutions/thin-guide/reference/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/solutions/thin-guide/reference-module-scope/src/Wallet.tsx +227 -0
- package/evals/tasks/react-wallet/solutions/v3/reference/src/Wallet.tsx +224 -0
- package/evals/tasks/react-wallet/solutions/v3/reference-module-scope/src/Wallet.tsx +230 -0
- package/evals/tasks/react-wallet/solutions/v4/reference/src/Wallet.tsx +160 -0
- package/evals/tasks/react-wallet/solutions/v4/reference-module-scope/src/Wallet.tsx +178 -0
- package/evals/tasks/react-wallet/solutions/v4-proto/reference/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/solutions/v4-proto/reference-module-scope/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/starter/src/Wallet.tsx +12 -0
- package/evals/tasks/react-wallet/starter/src/auth.ts +16 -0
- package/evals/tasks/react-wallet/starter/src/config.ts +14 -0
- package/evals/tasks/react-wallet/starter/src/ii-auth.ts +43 -0
- package/evals/tasks/react-wallet/starter/src/main.tsx +15 -0
- package/evals/tasks/react-wallet/starter/test/smoke.test.ts +34 -0
- package/evals/tasks/react-wallet/starter/tsconfig.json +18 -0
- package/evals/tasks/react-wallet/task.json +84 -0
- package/examples/canister-studio/.stackblitzrc +4 -0
- package/examples/canister-studio/README.md +183 -0
- package/examples/canister-studio/did/ckbtc_minter.did +806 -0
- package/examples/canister-studio/did/icp_ledger.did +586 -0
- package/examples/canister-studio/did/icrc1.did +88 -0
- package/examples/canister-studio/package.json +45 -0
- package/examples/canister-studio/scripts/smoke.ts +188 -0
- package/examples/canister-studio/src/calls/CacheKeyPanel.tsx +104 -0
- package/examples/canister-studio/src/calls/ConfirmWrite.tsx +265 -0
- package/examples/canister-studio/src/calls/ErrorPanel.test.tsx +113 -0
- package/examples/canister-studio/src/calls/ErrorPanel.tsx +214 -0
- package/examples/canister-studio/src/calls/MethodRunner.test.tsx +354 -0
- package/examples/canister-studio/src/calls/MethodRunner.tsx +57 -0
- package/examples/canister-studio/src/calls/ReadRunner.tsx +244 -0
- package/examples/canister-studio/src/calls/ResendPanel.tsx +165 -0
- package/examples/canister-studio/src/calls/ShareLink.tsx +59 -0
- package/examples/canister-studio/src/calls/WriteRunner.test.tsx +678 -0
- package/examples/canister-studio/src/calls/WriteRunner.tsx +670 -0
- package/examples/canister-studio/src/calls/dedupe.ts +189 -0
- package/examples/canister-studio/src/calls/error-info.ts +168 -0
- package/examples/canister-studio/src/calls/history.test.ts +284 -0
- package/examples/canister-studio/src/calls/history.ts +287 -0
- package/examples/canister-studio/src/calls/kinds.ts +68 -0
- package/examples/canister-studio/src/calls/prepare.ts +32 -0
- package/examples/canister-studio/src/calls/query-options.ts +30 -0
- package/examples/canister-studio/src/calls/read.ts +47 -0
- package/examples/canister-studio/src/calls/readback.ts +100 -0
- package/examples/canister-studio/src/calls/record.ts +123 -0
- package/examples/canister-studio/src/calls/safe-calls.test.ts +299 -0
- package/examples/canister-studio/src/calls/share.ts +46 -0
- package/examples/canister-studio/src/calls/testing/doubles.tsx +108 -0
- package/examples/canister-studio/src/calls/testing/fixtures.ts +185 -0
- package/examples/canister-studio/src/calls/useCanisterHandle.ts +35 -0
- package/examples/canister-studio/src/canisters/ckbtc_minter.envelope.json +4228 -0
- package/examples/canister-studio/src/canisters/ckbtc_minter.ts +868 -0
- package/examples/canister-studio/src/canisters/icp_ledger.envelope.json +3454 -0
- package/examples/canister-studio/src/canisters/icp_ledger.ts +584 -0
- package/examples/canister-studio/src/canisters/icrc1.envelope.json +840 -0
- package/examples/canister-studio/src/canisters/icrc1.ts +78 -0
- package/examples/canister-studio/src/components/ActionButton.tsx +32 -0
- package/examples/canister-studio/src/components/AppHeader.tsx +83 -0
- package/examples/canister-studio/src/components/AppShell.tsx +29 -0
- package/examples/canister-studio/src/components/AuthButton.tsx +79 -0
- package/examples/canister-studio/src/components/Badge.tsx +79 -0
- package/examples/canister-studio/src/components/CanisterHeader.tsx +200 -0
- package/examples/canister-studio/src/components/CanisterJump.tsx +130 -0
- package/examples/canister-studio/src/components/Card.tsx +64 -0
- package/examples/canister-studio/src/components/Code.tsx +101 -0
- package/examples/canister-studio/src/components/CopyButton.tsx +126 -0
- package/examples/canister-studio/src/components/Disclosure.tsx +34 -0
- package/examples/canister-studio/src/components/EmptyState.tsx +34 -0
- package/examples/canister-studio/src/components/MethodList.test.tsx +137 -0
- package/examples/canister-studio/src/components/MethodList.tsx +244 -0
- package/examples/canister-studio/src/components/Notice.tsx +36 -0
- package/examples/canister-studio/src/components/ProvenanceBadge.tsx +44 -0
- package/examples/canister-studio/src/components/RouteError.tsx +42 -0
- package/examples/canister-studio/src/components/SectionBoundary.tsx +76 -0
- package/examples/canister-studio/src/components/Spinner.tsx +33 -0
- package/examples/canister-studio/src/components/Tabs.tsx +96 -0
- package/examples/canister-studio/src/components/canister/CanisterLoadFailure.test.tsx +56 -0
- package/examples/canister-studio/src/components/canister/CanisterLoadFailure.tsx +165 -0
- package/examples/canister-studio/src/components/canister/CanisterNotFound.tsx +59 -0
- package/examples/canister-studio/src/components/canister/CanisterPending.tsx +33 -0
- package/examples/canister-studio/src/components/canister/MethodOverview.tsx +93 -0
- package/examples/canister-studio/src/components/canister/MethodWorkspace.test.tsx +201 -0
- package/examples/canister-studio/src/components/canister/MethodWorkspace.tsx +187 -0
- package/examples/canister-studio/src/components/canister/shared-call.test.ts +186 -0
- package/examples/canister-studio/src/components/canister/shared-call.ts +133 -0
- package/examples/canister-studio/src/components/canister/shared-link-loader.test.ts +116 -0
- package/examples/canister-studio/src/components/canister/use-canister-page.ts +44 -0
- package/examples/canister-studio/src/components/canister/workspace-key.test.ts +27 -0
- package/examples/canister-studio/src/components/canister/workspace-key.ts +36 -0
- package/examples/canister-studio/src/components/canister-id-input.ts +69 -0
- package/examples/canister-studio/src/components/canister-names.ts +11 -0
- package/examples/canister-studio/src/components/download.ts +34 -0
- package/examples/canister-studio/src/components/fallbacks.tsx +33 -0
- package/examples/canister-studio/src/components/helpers.test.ts +107 -0
- package/examples/canister-studio/src/components/history/HistoryList.tsx +284 -0
- package/examples/canister-studio/src/components/home/FeaturedLedger.tsx +149 -0
- package/examples/canister-studio/src/components/home/OpenCanister.tsx +99 -0
- package/examples/canister-studio/src/components/home/featured.test.tsx +92 -0
- package/examples/canister-studio/src/components/home/featured.ts +64 -0
- package/examples/canister-studio/src/components/interface/CandidTab.tsx +38 -0
- package/examples/canister-studio/src/components/interface/CompatReport.tsx +92 -0
- package/examples/canister-studio/src/components/interface/CompatibilityTab.tsx +190 -0
- package/examples/canister-studio/src/components/interface/ProjectTab.tsx +196 -0
- package/examples/canister-studio/src/components/interface/TypeScriptTab.tsx +114 -0
- package/examples/canister-studio/src/components/interface/tools.test.tsx +169 -0
- package/examples/canister-studio/src/components/modes.ts +31 -0
- package/examples/canister-studio/src/components/playground/MethodPicker.tsx +67 -0
- package/examples/canister-studio/src/components/playground/PlaygroundForms.tsx +112 -0
- package/examples/canister-studio/src/components/playground/PlaygroundTools.tsx +219 -0
- package/examples/canister-studio/src/components/playground/sample.ts +43 -0
- package/examples/canister-studio/src/components/playground/target.test.tsx +86 -0
- package/examples/canister-studio/src/components/primitives.test.tsx +121 -0
- package/examples/canister-studio/src/components/provenance.ts +38 -0
- package/examples/canister-studio/src/components/route-render.test.tsx +71 -0
- package/examples/canister-studio/src/components/use-task.ts +56 -0
- package/examples/canister-studio/src/components/wallet/BalancePanel.tsx +110 -0
- package/examples/canister-studio/src/components/wallet/LedgerSummary.tsx +63 -0
- package/examples/canister-studio/src/components/wallet/MinterPanel.tsx +255 -0
- package/examples/canister-studio/src/components/wallet/SendPanel.test.tsx +297 -0
- package/examples/canister-studio/src/components/wallet/SendPanel.tsx +446 -0
- package/examples/canister-studio/src/components/wallet/ledgers.test.ts +36 -0
- package/examples/canister-studio/src/components/wallet/ledgers.ts +111 -0
- package/examples/canister-studio/src/forms/JsonPanel.tsx +157 -0
- package/examples/canister-studio/src/forms/MethodForm.test.tsx +369 -0
- package/examples/canister-studio/src/forms/MethodForm.tsx +368 -0
- package/examples/canister-studio/src/forms/TypedForm.tsx +55 -0
- package/examples/canister-studio/src/forms/context.ts +62 -0
- package/examples/canister-studio/src/forms/convert.ts +131 -0
- package/examples/canister-studio/src/forms/edge.test.ts +252 -0
- package/examples/canister-studio/src/forms/engine.test.ts +358 -0
- package/examples/canister-studio/src/forms/engine.ts +1492 -0
- package/examples/canister-studio/src/forms/fields/BytesField.tsx +210 -0
- package/examples/canister-studio/src/forms/fields/Field.tsx +106 -0
- package/examples/canister-studio/src/forms/fields/FieldShell.tsx +101 -0
- package/examples/canister-studio/src/forms/fields/Group.tsx +74 -0
- package/examples/canister-studio/src/forms/fields/ListField.tsx +256 -0
- package/examples/canister-studio/src/forms/fields/Segmented.tsx +78 -0
- package/examples/canister-studio/src/forms/fields/TimestampField.tsx +108 -0
- package/examples/canister-studio/src/forms/fields/UnitsField.tsx +119 -0
- package/examples/canister-studio/src/forms/fields/composites.tsx +389 -0
- package/examples/canister-studio/src/forms/fields/leaves.tsx +350 -0
- package/examples/canister-studio/src/forms/fields.test.tsx +396 -0
- package/examples/canister-studio/src/forms/helpers.test.ts +225 -0
- package/examples/canister-studio/src/forms/hints.ts +128 -0
- package/examples/canister-studio/src/forms/json.ts +119 -0
- package/examples/canister-studio/src/forms/parsing.test.ts +217 -0
- package/examples/canister-studio/src/forms/useMethodForm.ts +251 -0
- package/examples/canister-studio/src/interface/browser.test.ts +23 -0
- package/examples/canister-studio/src/interface/browser.ts +153 -0
- package/examples/canister-studio/src/interface/cache.ts +68 -0
- package/examples/canister-studio/src/interface/cli-cache.test.ts +155 -0
- package/examples/canister-studio/src/interface/cli-cache.ts +125 -0
- package/examples/canister-studio/src/interface/compile.server.test.ts +198 -0
- package/examples/canister-studio/src/interface/compile.server.ts +262 -0
- package/examples/canister-studio/src/interface/compile.test.ts +108 -0
- package/examples/canister-studio/src/interface/compile.ts +305 -0
- package/examples/canister-studio/src/interface/docs.test.ts +75 -0
- package/examples/canister-studio/src/interface/docs.ts +100 -0
- package/examples/canister-studio/src/interface/functions.test.ts +42 -0
- package/examples/canister-studio/src/interface/functions.ts +200 -0
- package/examples/canister-studio/src/interface/live-candid.server.ts +91 -0
- package/examples/canister-studio/src/interface/live-loader.test.ts +515 -0
- package/examples/canister-studio/src/interface/live-loader.ts +364 -0
- package/examples/canister-studio/src/interface/load.test.ts +328 -0
- package/examples/canister-studio/src/interface/load.ts +249 -0
- package/examples/canister-studio/src/interface/read-candid.test.ts +185 -0
- package/examples/canister-studio/src/interface/read-candid.ts +233 -0
- package/examples/canister-studio/src/interface/server-result.ts +42 -0
- package/examples/canister-studio/src/interface/typed.ts +68 -0
- package/examples/canister-studio/src/interface/types.ts +121 -0
- package/examples/canister-studio/src/lib/format.test.ts +107 -0
- package/examples/canister-studio/src/lib/format.ts +139 -0
- package/examples/canister-studio/src/lib/hex.test.ts +43 -0
- package/examples/canister-studio/src/lib/hex.ts +33 -0
- package/examples/canister-studio/src/lib/ids.test.ts +70 -0
- package/examples/canister-studio/src/lib/ids.ts +93 -0
- package/examples/canister-studio/src/lib/reactor.test.ts +55 -0
- package/examples/canister-studio/src/lib/reactor.ts +55 -0
- package/examples/canister-studio/src/lib/registry.test.ts +74 -0
- package/examples/canister-studio/src/lib/registry.ts +238 -0
- package/examples/canister-studio/src/lib/schema.ts +148 -0
- package/examples/canister-studio/src/routeTree.gen.ts +227 -0
- package/examples/canister-studio/src/router.test.ts +290 -0
- package/examples/canister-studio/src/router.tsx +127 -0
- package/examples/canister-studio/src/routes/__root.tsx +58 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.index.tsx +172 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.interface.tsx +98 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.tsx +91 -0
- package/examples/canister-studio/src/routes/history.tsx +55 -0
- package/examples/canister-studio/src/routes/index.tsx +169 -0
- package/examples/canister-studio/src/routes/playground.tsx +286 -0
- package/examples/canister-studio/src/routes/safety.tsx +57 -0
- package/examples/canister-studio/src/routes/wallet.tsx +213 -0
- package/examples/canister-studio/src/safety/LabTransferForm.tsx +84 -0
- package/examples/canister-studio/src/safety/RequestLog.tsx +79 -0
- package/examples/canister-studio/src/safety/SafetyLab.test.tsx +89 -0
- package/examples/canister-studio/src/safety/SafetyLab.tsx +140 -0
- package/examples/canister-studio/src/safety/ScenarioCard.tsx +262 -0
- package/examples/canister-studio/src/safety/lab-run.ts +283 -0
- package/examples/canister-studio/src/safety/mock-ledger.test.ts +99 -0
- package/examples/canister-studio/src/safety/mock-ledger.ts +263 -0
- package/examples/canister-studio/src/safety/scenarios.test.ts +157 -0
- package/examples/canister-studio/src/safety/scenarios.ts +924 -0
- package/examples/canister-studio/src/styles.css +3453 -0
- package/examples/canister-studio/src/styles.test.ts +46 -0
- package/examples/canister-studio/src/values/CallPreview.test.tsx +86 -0
- package/examples/canister-studio/src/values/CallPreview.tsx +148 -0
- package/examples/canister-studio/src/values/ErrValueView.tsx +66 -0
- package/examples/canister-studio/src/values/Inspector.tsx +133 -0
- package/examples/canister-studio/src/values/ReplyView.test.tsx +341 -0
- package/examples/canister-studio/src/values/ReplyView.tsx +164 -0
- package/examples/canister-studio/src/values/candid-text.test.ts +516 -0
- package/examples/canister-studio/src/values/candid-text.ts +479 -0
- package/examples/canister-studio/src/values/hints.ts +58 -0
- package/examples/canister-studio/src/values/json.test.ts +66 -0
- package/examples/canister-studio/src/values/json.ts +31 -0
- package/examples/canister-studio/src/values/leaves.tsx +309 -0
- package/examples/canister-studio/src/values/schema.test.ts +123 -0
- package/examples/canister-studio/src/values/schema.ts +78 -0
- package/examples/canister-studio/src/values/test-router.tsx +21 -0
- package/examples/canister-studio/src/values/tree.tsx +670 -0
- package/examples/canister-studio/src/values/use-sha256.ts +29 -0
- package/examples/canister-studio/tsconfig.json +20 -0
- package/examples/canister-studio/vite.config.ts +50 -0
- package/examples/canister-studio/vitest.config.ts +20 -0
- package/examples/icrc-ledger/.stackblitzrc +4 -0
- package/examples/icrc-ledger/README.md +100 -0
- package/examples/icrc-ledger/ckbtc_minter.did +12 -0
- package/examples/icrc-ledger/icp_ledger.did +147 -0
- package/examples/icrc-ledger/icrc1.did +88 -0
- package/examples/icrc-ledger/index.html +13 -0
- package/examples/icrc-ledger/package.json +40 -0
- package/examples/icrc-ledger/scripts/smoke.ts +151 -0
- package/examples/icrc-ledger/src/App.tsx +71 -0
- package/examples/icrc-ledger/src/ErrorPanel.tsx +105 -0
- package/examples/icrc-ledger/src/MainnetTab.tsx +450 -0
- package/examples/icrc-ledger/src/SandboxTab.test.tsx +379 -0
- package/examples/icrc-ledger/src/SandboxTab.tsx +761 -0
- package/examples/icrc-ledger/src/blocks.test.ts +247 -0
- package/examples/icrc-ledger/src/blocks.ts +140 -0
- package/examples/icrc-ledger/src/canisters/ckbtc_minter.envelope.json +96 -0
- package/examples/icrc-ledger/src/canisters/ckbtc_minter.ts +16 -0
- package/examples/icrc-ledger/src/canisters/icp_ledger.envelope.json +690 -0
- package/examples/icrc-ledger/src/canisters/icp_ledger.ts +223 -0
- package/examples/icrc-ledger/src/canisters/icrc1.envelope.json +840 -0
- package/examples/icrc-ledger/src/canisters/icrc1.ts +78 -0
- package/examples/icrc-ledger/src/format.test.ts +41 -0
- package/examples/icrc-ledger/src/format.ts +68 -0
- package/examples/icrc-ledger/src/ledger.ts +15 -0
- package/examples/icrc-ledger/src/main.tsx +10 -0
- package/examples/icrc-ledger/src/minter.ts +16 -0
- package/examples/icrc-ledger/src/sandbox.test.ts +464 -0
- package/examples/icrc-ledger/src/sandbox.ts +281 -0
- package/examples/icrc-ledger/src/styles.css +391 -0
- package/examples/icrc-ledger/src/transfer-form.test.ts +62 -0
- package/examples/icrc-ledger/src/transfer-form.ts +97 -0
- package/examples/icrc-ledger/tsconfig.json +19 -0
- package/examples/icrc-ledger/vite.config.ts +44 -0
- package/examples/icrc-ledger/vitest.config.ts +12 -0
- package/examples/next-ssr/.stackblitzrc +4 -0
- package/examples/next-ssr/README.md +112 -0
- package/examples/next-ssr/icrc1.did +88 -0
- package/examples/next-ssr/next.config.ts +10 -0
- package/examples/next-ssr/package.json +41 -0
- package/examples/next-ssr/scripts/smoke.ts +169 -0
- package/examples/next-ssr/src/app/account/CertifiedBalances.tsx +58 -0
- package/examples/next-ssr/src/app/account/account.test.tsx +165 -0
- package/examples/next-ssr/src/app/account/page.tsx +82 -0
- package/examples/next-ssr/src/app/api/balance/[ledger]/[principal]/route.ts +10 -0
- package/examples/next-ssr/src/app/globals.css +278 -0
- package/examples/next-ssr/src/app/layout.tsx +34 -0
- package/examples/next-ssr/src/app/page.tsx +46 -0
- package/examples/next-ssr/src/app/providers.browser.test.tsx +127 -0
- package/examples/next-ssr/src/app/providers.test.tsx +73 -0
- package/examples/next-ssr/src/app/providers.tsx +60 -0
- package/examples/next-ssr/src/canisters/icrc1.envelope.json +840 -0
- package/examples/next-ssr/src/canisters/icrc1.ts +78 -0
- package/examples/next-ssr/src/components/BalanceTable.tsx +43 -0
- package/examples/next-ssr/src/components/LedgerCard.test.tsx +96 -0
- package/examples/next-ssr/src/components/LedgerCard.tsx +230 -0
- package/examples/next-ssr/src/components/LedgerError.tsx +32 -0
- package/examples/next-ssr/src/components/LedgerSections.tsx +22 -0
- package/examples/next-ssr/src/components/MyBalances.test.tsx +253 -0
- package/examples/next-ssr/src/components/MyBalances.tsx +129 -0
- package/examples/next-ssr/src/components/SessionBadge.tsx +18 -0
- package/examples/next-ssr/src/components/hydration.test.tsx +259 -0
- package/examples/next-ssr/src/components/server-data.ts +10 -0
- package/examples/next-ssr/src/format.ts +46 -0
- package/examples/next-ssr/src/ledgers.ts +38 -0
- package/examples/next-ssr/src/server/balance-route.test.ts +151 -0
- package/examples/next-ssr/src/server/balance-route.ts +157 -0
- package/examples/next-ssr/src/server/error-summary.test.ts +34 -0
- package/examples/next-ssr/src/server/error-summary.ts +37 -0
- package/examples/next-ssr/src/server/parse-owner.test.ts +39 -0
- package/examples/next-ssr/src/server/parse-owner.ts +34 -0
- package/examples/next-ssr/src/server/prefetch-ledgers.test.ts +137 -0
- package/examples/next-ssr/src/server/prefetch-ledgers.ts +70 -0
- package/examples/next-ssr/src/server/read-balances.test.ts +103 -0
- package/examples/next-ssr/src/server/read-balances.ts +78 -0
- package/examples/next-ssr/src/server/request-client.rsc.test.tsx +110 -0
- package/examples/next-ssr/src/server/request-client.ts +24 -0
- package/examples/next-ssr/src/testing/mock-ledgers.ts +115 -0
- package/examples/next-ssr/src/testing/react-server-dom-turbopack.d.ts +15 -0
- package/examples/next-ssr/src/testing/setup.ts +10 -0
- package/examples/next-ssr/tsconfig.json +31 -0
- package/examples/next-ssr/vitest.config.ts +59 -0
- package/examples/node-agent-tool/.stackblitzrc +4 -0
- package/examples/node-agent-tool/README.md +165 -0
- package/examples/node-agent-tool/icp.yaml +11 -0
- package/examples/node-agent-tool/icrc1.did +88 -0
- package/examples/node-agent-tool/package.json +32 -0
- package/examples/node-agent-tool/src/canisters/icrc1.envelope.json +840 -0
- package/examples/node-agent-tool/src/canisters/icrc1.ts +78 -0
- package/examples/node-agent-tool/src/cli.test.ts +64 -0
- package/examples/node-agent-tool/src/cli.ts +23 -0
- package/examples/node-agent-tool/src/command-line.ts +159 -0
- package/examples/node-agent-tool/src/commands/balance.ts +73 -0
- package/examples/node-agent-tool/src/commands/demo.test.ts +51 -0
- package/examples/node-agent-tool/src/commands/demo.ts +359 -0
- package/examples/node-agent-tool/src/commands/info.ts +69 -0
- package/examples/node-agent-tool/src/commands/reads.test.ts +133 -0
- package/examples/node-agent-tool/src/commands/resend.test.ts +363 -0
- package/examples/node-agent-tool/src/commands/transfer.test.ts +313 -0
- package/examples/node-agent-tool/src/commands/transfer.ts +415 -0
- package/examples/node-agent-tool/src/commands/watch.test.ts +159 -0
- package/examples/node-agent-tool/src/commands/watch.ts +135 -0
- package/examples/node-agent-tool/src/commands/whoami.ts +36 -0
- package/examples/node-agent-tool/src/context.ts +20 -0
- package/examples/node-agent-tool/src/dispatch.ts +70 -0
- package/examples/node-agent-tool/src/failure.test.ts +59 -0
- package/examples/node-agent-tool/src/failure.ts +176 -0
- package/examples/node-agent-tool/src/identity.test.ts +242 -0
- package/examples/node-agent-tool/src/identity.ts +228 -0
- package/examples/node-agent-tool/src/input.ts +110 -0
- package/examples/node-agent-tool/src/ledgers.test.ts +74 -0
- package/examples/node-agent-tool/src/ledgers.ts +62 -0
- package/examples/node-agent-tool/src/mock-ledger.ts +211 -0
- package/examples/node-agent-tool/src/network.test.ts +128 -0
- package/examples/node-agent-tool/src/network.ts +101 -0
- package/examples/node-agent-tool/src/output.test.ts +208 -0
- package/examples/node-agent-tool/src/output.ts +163 -0
- package/examples/node-agent-tool/src/run.ts +73 -0
- package/examples/node-agent-tool/src/test-kit.ts +167 -0
- package/examples/node-agent-tool/tsconfig.json +18 -0
- package/examples/node-agent-tool/vitest.config.ts +8 -0
- package/examples/vite-wallet/.stackblitzrc +4 -0
- package/examples/vite-wallet/Cargo.lock +646 -0
- package/examples/vite-wallet/Cargo.toml +5 -0
- package/examples/vite-wallet/README.md +107 -0
- package/examples/vite-wallet/backend/Cargo.toml +12 -0
- package/examples/vite-wallet/backend/backend.did +37 -0
- package/examples/vite-wallet/backend/src/lib.rs +133 -0
- package/examples/vite-wallet/icp.yaml +44 -0
- package/examples/vite-wallet/index.html +13 -0
- package/examples/vite-wallet/ledger.did +54 -0
- package/examples/vite-wallet/package.json +46 -0
- package/examples/vite-wallet/public/.ic-assets.json5 +26 -0
- package/examples/vite-wallet/scripts/faucet-args.test.ts +30 -0
- package/examples/vite-wallet/scripts/faucet-args.ts +41 -0
- package/examples/vite-wallet/scripts/faucet.ts +41 -0
- package/examples/vite-wallet/src/AddressBook.test.tsx +191 -0
- package/examples/vite-wallet/src/AddressBook.tsx +147 -0
- package/examples/vite-wallet/src/App.tsx +53 -0
- package/examples/vite-wallet/src/Balance.test.tsx +57 -0
- package/examples/vite-wallet/src/Balance.tsx +58 -0
- package/examples/vite-wallet/src/EnvironmentPanel.test.tsx +83 -0
- package/examples/vite-wallet/src/EnvironmentPanel.tsx +103 -0
- package/examples/vite-wallet/src/ErrorNote.tsx +70 -0
- package/examples/vite-wallet/src/Profile.test.tsx +145 -0
- package/examples/vite-wallet/src/Profile.tsx +92 -0
- package/examples/vite-wallet/src/SendIcp.test.tsx +231 -0
- package/examples/vite-wallet/src/SendIcp.tsx +244 -0
- package/examples/vite-wallet/src/SendToContact.test.tsx +113 -0
- package/examples/vite-wallet/src/SendToContact.tsx +102 -0
- package/examples/vite-wallet/src/SignIn.test.tsx +106 -0
- package/examples/vite-wallet/src/SignIn.tsx +120 -0
- package/examples/vite-wallet/src/Wallet.test.tsx +89 -0
- package/examples/vite-wallet/src/account-switch.test.tsx +108 -0
- package/examples/vite-wallet/src/auth/dev-accounts.test.ts +113 -0
- package/examples/vite-wallet/src/auth/dev-accounts.ts +216 -0
- package/examples/vite-wallet/src/auth/local-page.test.ts +28 -0
- package/examples/vite-wallet/src/auth/local-page.ts +20 -0
- package/examples/vite-wallet/src/auth/wallet-auth.test.ts +159 -0
- package/examples/vite-wallet/src/auth/wallet-auth.ts +131 -0
- package/examples/vite-wallet/src/canisters/backend.envelope.json +275 -0
- package/examples/vite-wallet/src/canisters/backend.ts +58 -0
- package/examples/vite-wallet/src/canisters/ledger.envelope.json +451 -0
- package/examples/vite-wallet/src/canisters/ledger.ts +56 -0
- package/examples/vite-wallet/src/client.ts +45 -0
- package/examples/vite-wallet/src/main.tsx +18 -0
- package/examples/vite-wallet/src/optimistic-contacts.ts +113 -0
- package/examples/vite-wallet/src/refusal.ts +17 -0
- package/examples/vite-wallet/src/styles.css +282 -0
- package/examples/vite-wallet/src/test/test-wallet.tsx +322 -0
- package/examples/vite-wallet/src/token.ts +50 -0
- package/examples/vite-wallet/src/transfer.test.ts +178 -0
- package/examples/vite-wallet/src/transfer.ts +110 -0
- package/examples/vite-wallet/src/use-canisters.ts +49 -0
- package/examples/vite-wallet/tsconfig.json +19 -0
- package/examples/vite-wallet/vite.config.ts +47 -0
- package/examples/vite-wallet/vitest.config.ts +17 -0
- package/package.json +9 -4
- package/packages/core/.size-limit.js +47 -0
- package/packages/core/LICENSE +21 -0
- package/packages/core/README.md +84 -0
- package/packages/core/llms.txt +610 -0
- package/packages/core/package.json +89 -0
- package/packages/core/src/call.ts +961 -0
- package/packages/core/src/canister.ts +259 -0
- package/packages/core/src/client.ts +2061 -0
- package/packages/core/src/errors.ts +1079 -0
- package/packages/core/src/hydration.ts +239 -0
- package/packages/core/src/index.ts +23 -0
- package/packages/core/src/keys.ts +108 -0
- package/packages/core/src/management.ts +138 -0
- package/packages/core/src/network.ts +1020 -0
- package/packages/core/src/options.ts +1000 -0
- package/packages/core/src/runtime.ts +50 -0
- package/packages/core/src/testing/fake-replica.ts +1166 -0
- package/packages/core/src/testing/index.ts +16 -0
- package/packages/core/src/testing/test-auth.ts +340 -0
- package/packages/core/src/testing/test-client.ts +559 -0
- package/packages/core/src/types.ts +541 -0
- package/packages/core/src/units.ts +299 -0
- package/packages/core/src/version.ts +4 -0
- package/packages/core/tests/canister-helpers.ts +187 -0
- package/packages/core/tests/canister-id.test.ts +158 -0
- package/packages/core/tests/canister-unwrap.test.ts +94 -0
- package/packages/core/tests/canister.test-d.ts +406 -0
- package/packages/core/tests/canister.test.ts +1921 -0
- package/packages/core/tests/client-account-change.test.ts +131 -0
- package/packages/core/tests/client-agents.test.ts +402 -0
- package/packages/core/tests/client-auth-network.test.ts +719 -0
- package/packages/core/tests/client-disposed.test.ts +403 -0
- package/packages/core/tests/client-helpers.ts +136 -0
- package/packages/core/tests/client-hydration.test.ts +166 -0
- package/packages/core/tests/client-pinned.test.ts +626 -0
- package/packages/core/tests/client-session.test.ts +348 -0
- package/packages/core/tests/client.test-d.ts +181 -0
- package/packages/core/tests/client.test.ts +1162 -0
- package/packages/core/tests/encode.test.ts +171 -0
- package/packages/core/tests/env-canister-id.test.ts +666 -0
- package/packages/core/tests/env-cookie-copies.test.ts +182 -0
- package/packages/core/tests/error-guard.test.ts +222 -0
- package/packages/core/tests/errors.test-d.ts +280 -0
- package/packages/core/tests/errors.test.ts +1359 -0
- package/packages/core/tests/fixtures/README.md +28 -0
- package/packages/core/tests/fixtures/accounts.did +21 -0
- package/packages/core/tests/fixtures/accounts.envelope.json +367 -0
- package/packages/core/tests/fixtures/accounts.ts +26 -0
- package/packages/core/tests/fixtures/archive.did +31 -0
- package/packages/core/tests/fixtures/archive.envelope.json +259 -0
- package/packages/core/tests/fixtures/archive.ts +55 -0
- package/packages/core/tests/fixtures/icrc1.did +88 -0
- package/packages/core/tests/fixtures/icrc1.envelope.json +840 -0
- package/packages/core/tests/fixtures/icrc1.ts +78 -0
- package/packages/core/tests/fixtures/management.did +724 -0
- package/packages/core/tests/fixtures/management.envelope.json +4455 -0
- package/packages/core/tests/fixtures/management.ts +486 -0
- package/packages/core/tests/fixtures/shapes.did +33 -0
- package/packages/core/tests/fixtures/shapes.envelope.json +440 -0
- package/packages/core/tests/fixtures/shapes.ts +56 -0
- package/packages/core/tests/fixtures/skippable.did +15 -0
- package/packages/core/tests/fixtures/skippable.envelope.json +182 -0
- package/packages/core/tests/fixtures/skippable.ts +33 -0
- package/packages/core/tests/func.test.ts +154 -0
- package/packages/core/tests/identity-attributes.test.ts +214 -0
- package/packages/core/tests/keys.test.ts +289 -0
- package/packages/core/tests/management.test.ts +206 -0
- package/packages/core/tests/network-helpers.ts +121 -0
- package/packages/core/tests/network.test-d.ts +78 -0
- package/packages/core/tests/network.test.ts +1051 -0
- package/packages/core/tests/options.test.ts +1594 -0
- package/packages/core/tests/redirect-sign-in.test.ts +393 -0
- package/packages/core/tests/resend.test-d.ts +81 -0
- package/packages/core/tests/resend.test.ts +723 -0
- package/packages/core/tests/skip.test-d.ts +125 -0
- package/packages/core/tests/testing-entry.test.ts +73 -0
- package/packages/core/tests/testing-fake-replica.test.ts +1242 -0
- package/packages/core/tests/testing-test-auth.test-d.ts +84 -0
- package/packages/core/tests/testing-test-auth.test.ts +483 -0
- package/packages/core/tests/testing-test-client.test-d.ts +184 -0
- package/packages/core/tests/testing-test-client.test.ts +1272 -0
- package/packages/core/tests/time-realm.test.ts +63 -0
- package/packages/core/tests/time.test.ts +238 -0
- package/packages/core/tests/traps/README.md +39 -0
- package/packages/core/tests/traps/anonymous-write.test.ts +145 -0
- package/packages/core/tests/traps/classification-table.test.ts +256 -0
- package/packages/core/tests/traps/err-arm.test.ts +144 -0
- package/packages/core/tests/traps/fetch-spy.ts +39 -0
- package/packages/core/tests/traps/invalidation-after-write.test.ts +178 -0
- package/packages/core/tests/traps/ledger.ts +248 -0
- package/packages/core/tests/traps/root-key-off-local.test.ts +130 -0
- package/packages/core/tests/traps/stale-data-across-users.test.ts +173 -0
- package/packages/core/tests/traps/unresolved-name.test.ts +155 -0
- package/packages/core/tests/traps/update-as-query.test.ts +244 -0
- package/packages/core/tests/traps/update-not-resent.test.ts +126 -0
- package/packages/core/tests/traps/update-resent-when-never-delivered.test.ts +159 -0
- package/packages/core/tests/traps.test-d.ts +476 -0
- package/packages/core/tests/units.test-d.ts +118 -0
- package/packages/core/tests/units.test.ts +634 -0
- package/packages/core/tsconfig.json +19 -0
- package/packages/core/tsconfig.typecheck.json +16 -0
- package/packages/core/vitest.config.ts +13 -0
- package/packages/mcp/LICENSE +21 -0
- package/packages/mcp/README.md +189 -0
- package/packages/mcp/package.json +62 -0
- package/packages/mcp/src/candid/candid-text.test.ts +455 -0
- package/packages/mcp/src/candid/candid-text.ts +501 -0
- package/packages/mcp/src/candid/contract.test.ts +398 -0
- package/packages/mcp/src/candid/formats.ts +155 -0
- package/packages/mcp/src/candid/hex.ts +29 -0
- package/packages/mcp/src/candid/json-schema.test.ts +758 -0
- package/packages/mcp/src/candid/json-schema.ts +454 -0
- package/packages/mcp/src/candid/json.test.ts +1207 -0
- package/packages/mcp/src/candid/json.ts +1053 -0
- package/packages/mcp/src/candid/schema-walk.ts +189 -0
- package/packages/mcp/src/candid/type-text.test.ts +179 -0
- package/packages/mcp/src/candid/type-text.ts +238 -0
- package/packages/mcp/src/cli.ts +134 -0
- package/packages/mcp/src/identity.ts +188 -0
- package/packages/mcp/src/interface/cache.test.ts +48 -0
- package/packages/mcp/src/interface/cache.ts +68 -0
- package/packages/mcp/src/interface/cli-cache.test.ts +150 -0
- package/packages/mcp/src/interface/cli-cache.ts +122 -0
- package/packages/mcp/src/interface/compile-worker.test.ts +246 -0
- package/packages/mcp/src/interface/compile-worker.ts +290 -0
- package/packages/mcp/src/interface/compile.test.ts +155 -0
- package/packages/mcp/src/interface/compile.ts +281 -0
- package/packages/mcp/src/interface/docs.test.ts +105 -0
- package/packages/mcp/src/interface/docs.ts +86 -0
- package/packages/mcp/src/interface/fixtures/icrc1.did +88 -0
- package/packages/mcp/src/interface/hex.ts +8 -0
- package/packages/mcp/src/interface/ids.test.ts +71 -0
- package/packages/mcp/src/interface/ids.ts +87 -0
- package/packages/mcp/src/interface/loader.test.ts +804 -0
- package/packages/mcp/src/interface/loader.ts +519 -0
- package/packages/mcp/src/interface/read-candid.test.ts +300 -0
- package/packages/mcp/src/interface/read-candid.ts +259 -0
- package/packages/mcp/src/interface/types.ts +113 -0
- package/packages/mcp/src/network.ts +122 -0
- package/packages/mcp/src/options.ts +149 -0
- package/packages/mcp/src/server/approval.ts +159 -0
- package/packages/mcp/src/server/naming.ts +43 -0
- package/packages/mcp/src/server/results.ts +102 -0
- package/packages/mcp/src/server/server.ts +797 -0
- package/packages/mcp/src/server/tools.ts +116 -0
- package/packages/mcp/src/usage.ts +40 -0
- package/packages/mcp/tests/approval.test.ts +60 -0
- package/packages/mcp/tests/identity.test.ts +234 -0
- package/packages/mcp/tests/naming.test.ts +62 -0
- package/packages/mcp/tests/options.test.ts +140 -0
- package/packages/mcp/tests/server.test.ts +997 -0
- package/packages/mcp/tsconfig.json +19 -0
- package/packages/mcp/tsconfig.typecheck.json +10 -0
- package/packages/mcp/vitest.config.ts +10 -0
- package/packages/react/LICENSE +21 -0
- package/packages/react/README.md +328 -0
- package/packages/react/llms.txt +95 -0
- package/packages/react/package.json +95 -0
- package/packages/react/src/index.tsx +678 -0
- package/packages/react/tests/abandoned-render.test.tsx +816 -0
- package/packages/react/tests/auth.test.tsx +315 -0
- package/packages/react/tests/caller-keys.test.tsx +2334 -0
- package/packages/react/tests/client-time.test.ts +40 -0
- package/packages/react/tests/entry.test.ts +52 -0
- package/packages/react/tests/helpers.tsx +291 -0
- package/packages/react/tests/hydration.test.tsx +262 -0
- package/packages/react/tests/ownership.test.tsx +260 -0
- package/packages/react/tests/provider.server.test.tsx +169 -0
- package/packages/react/tests/query-client.test.tsx +107 -0
- package/packages/react/tests/strict-mode.test.tsx +288 -0
- package/packages/react/tests/suspense.test-d.tsx +357 -0
- package/packages/react/tests/two-query-cores.test.tsx +135 -0
- package/packages/react/tests/types.test-d.tsx +63 -0
- package/packages/react/tsconfig.json +23 -0
- package/packages/react/tsconfig.test.json +8 -0
- package/packages/react/tsconfig.typecheck.json +16 -0
- package/packages/react/vitest.config.ts +39 -0
- package/packages/vite-plugin/LICENSE +21 -0
- package/packages/vite-plugin/README.md +532 -0
- package/packages/vite-plugin/package.json +76 -0
- package/packages/vite-plugin/src/describe-value.test.ts +43 -0
- package/packages/vite-plugin/src/describe-value.ts +167 -0
- package/packages/vite-plugin/src/dev-environment.test.ts +747 -0
- package/packages/vite-plugin/src/dev-environment.ts +510 -0
- package/packages/vite-plugin/src/env.ts +431 -0
- package/packages/vite-plugin/src/fetch.ts +348 -0
- package/packages/vite-plugin/src/file-identity.ts +106 -0
- package/packages/vite-plugin/src/generate.ts +691 -0
- package/packages/vite-plugin/src/index.test.ts +1243 -0
- package/packages/vite-plugin/src/index.ts +2565 -0
- package/packages/vite-plugin/src/interface.ts +339 -0
- package/packages/vite-plugin/src/local-host.ts +34 -0
- package/packages/vite-plugin/src/options.ts +641 -0
- package/packages/vite-plugin/src/principal-text.test.ts +87 -0
- package/packages/vite-plugin/src/principal-text.ts +98 -0
- package/packages/vite-plugin/tests/close.test.ts +141 -0
- package/packages/vite-plugin/tests/environment-mode.test.ts +136 -0
- package/packages/vite-plugin/tests/fake-ic.ts +214 -0
- package/packages/vite-plugin/tests/fetch-sdk.test.ts +27 -0
- package/packages/vite-plugin/tests/fetch.test.ts +1196 -0
- package/packages/vite-plugin/tests/fixtures/fake-cli/bin.js +90 -0
- package/packages/vite-plugin/tests/fixtures/fake-cli/package.json +8 -0
- package/packages/vite-plugin/tests/fixtures/icrc1.did +88 -0
- package/packages/vite-plugin/tests/generation.test.ts +1036 -0
- package/packages/vite-plugin/tests/icp-command.test.ts +194 -0
- package/packages/vite-plugin/tests/icp-timeout.test.ts +83 -0
- package/packages/vite-plugin/tests/no-process-exit.test.ts +83 -0
- package/packages/vite-plugin/tests/on-generated.test.ts +323 -0
- package/packages/vite-plugin/tests/output-collision.test.ts +329 -0
- package/packages/vite-plugin/tests/package.test.ts +62 -0
- package/packages/vite-plugin/tests/project.test.ts +2993 -0
- package/packages/vite-plugin/tests/support.ts +339 -0
- package/packages/vite-plugin/tests/timeout.test.ts +107 -0
- package/packages/vite-plugin/tsconfig.json +23 -0
- package/packages/vite-plugin/tsconfig.typecheck.json +16 -0
- package/packages/vite-plugin/vitest.config.ts +9 -0
- package/pnpm-workspace.yaml +23 -0
- package/scripts/ai-context-files.js +72 -0
- package/scripts/assemble-docs-site.mjs +485 -0
- package/scripts/assemble-docs-site.test.mjs +568 -0
- package/scripts/build-examples.js +58 -0
- package/scripts/check-ai-context.js +963 -0
- package/scripts/check-ai-context.test.mjs +811 -0
- package/scripts/check-exports.mjs +767 -0
- package/scripts/check-exports.test.mjs +1136 -0
- package/scripts/check-snippets/ambient.d.ts +428 -0
- package/scripts/check-snippets/app/generated/backend.did +7 -0
- package/scripts/check-snippets/app/generated/backend.ts +15 -0
- package/scripts/check-snippets/app/generated/icrc1.did +88 -0
- package/scripts/check-snippets/app/generated/icrc1.ts +78 -0
- package/scripts/check-snippets/app/globals.ts +26 -0
- package/scripts/check-snippets/docs/guides/App.tsx +21 -0
- package/scripts/check-snippets/docs/guides/app/providers.tsx +23 -0
- package/scripts/check-snippets/docs/guides/auth-client.ts +47 -0
- package/scripts/check-snippets/docs/guides/canisters/backend.ts +3 -0
- package/scripts/check-snippets/docs/guides/canisters/icrc1.ts +3 -0
- package/scripts/check-snippets/docs/guides/components/LedgerCard.tsx +26 -0
- package/scripts/check-snippets/docs/guides/components/shell.tsx +11 -0
- package/scripts/check-snippets/docs/guides/components/sign-in-page.tsx +29 -0
- package/scripts/check-snippets/docs/guides/components/slow-section.tsx +5 -0
- package/scripts/check-snippets/docs/guides/generated/accounts.ts +95 -0
- package/scripts/check-snippets/docs/guides/generated/ckbtc_minter.ts +40 -0
- package/scripts/check-snippets/docs/guides/generated/icp_ledger.ts +267 -0
- package/scripts/check-snippets/docs/guides/ledger.ts +10 -0
- package/scripts/check-snippets/docs/guides/server/request-client.ts +8 -0
- package/scripts/check-snippets.mjs +993 -0
- package/scripts/check-snippets.test.mjs +338 -0
- package/scripts/check-stack.mjs +501 -0
- package/scripts/check-stack.test.mjs +800 -0
- package/scripts/clean-node-modules.js +67 -0
- package/scripts/example-projects.js +58 -0
- package/scripts/export-budget.mjs +145 -0
- package/scripts/faults.json +6749 -0
- package/scripts/lib/fault-workspace.mjs +210 -0
- package/scripts/lib/io.mjs +29 -0
- package/scripts/lib/io.test.mjs +38 -0
- package/scripts/lib/markdown-fences.mjs +56 -0
- package/scripts/lib/markdown-fences.test.mjs +84 -0
- package/scripts/lib/package-exports.mjs +54 -0
- package/scripts/lib/package-exports.test.mjs +66 -0
- package/scripts/lib/release-pr-steps.mjs +47 -0
- package/scripts/release-tag.mjs +95 -0
- package/scripts/release-tag.test.mjs +278 -0
- package/scripts/release-workflow.test.mjs +98 -0
- package/scripts/release.js +167 -0
- package/scripts/release.test.mjs +347 -0
- package/scripts/removed-v3-names.js +125 -0
- package/scripts/size-app/.size-limit.js +90 -0
- package/scripts/size-app/core.js +3 -0
- package/scripts/size-app/package.json +24 -0
- package/scripts/size-app/react.js +4 -0
- package/scripts/size-app.test.mjs +73 -0
- package/scripts/sync-ai-context-versions.js +102 -0
- package/scripts/sync-example-versions.js +151 -0
- package/scripts/test-examples-published.mjs +1585 -0
- package/scripts/test-examples-published.test.mjs +1586 -0
- package/scripts/traps/any-method-vars-not-a-list.json +5 -0
- package/scripts/traps/canister-method-unknown.json +5 -0
- package/scripts/traps/client-says-who-calls-once.json +5 -0
- package/scripts/traps/client-says-who-calls.json +5 -0
- package/scripts/traps/err-only-on-canister-err.json +14 -0
- package/scripts/traps/format-units-refuses-missing-value.json +5 -0
- package/scripts/traps/format-units-refuses-number.json +5 -0
- package/scripts/traps/format-units-unknown-option.json +5 -0
- package/scripts/traps/guard-err-is-the-methods.json +5 -0
- package/scripts/traps/guard-false-keeps-every-kind.json +5 -0
- package/scripts/traps/internals-not-exported.json +9 -0
- package/scripts/traps/network-refuses-unknown-name.json +5 -0
- package/scripts/traps/never-err-has-no-type.json +5 -0
- package/scripts/traps/options-method-unknown.json +5 -0
- package/scripts/traps/options-vars-wrong-type.json +5 -0
- package/scripts/traps/parse-units-refuses-number.json +5 -0
- package/scripts/traps/parse-units-unknown-option.json +5 -0
- package/scripts/traps/principal-is-not-plain-text.json +14 -0
- package/scripts/traps/query-options-refuses-oneway.json +5 -0
- package/scripts/traps/query-options-refuses-update.json +5 -0
- package/scripts/traps/refuse-next-unknown-option.json +5 -0
- package/scripts/traps/resend-key-reads-the-methods-arg.json +5 -0
- package/scripts/traps/resend-states-its-dedupe-key.json +5 -0
- package/scripts/traps/suspense-refuses-argument-skip.json +5 -0
- package/scripts/traps/suspense-refuses-skippable-read.json +5 -0
- package/scripts/traps/suspense-refuses-vars-skip-fits.json +5 -0
- package/scripts/traps/test-handler-method-unknown.json +5 -0
- package/scripts/traps/test-handler-nat-is-bigint.json +5 -0
- package/scripts/traps/test-handler-takes-the-domain-value.json +5 -0
- package/scripts/traps/vars-of-two-arguments-are-the-tuple.json +5 -0
- package/scripts/typecheck-examples.js +122 -0
- package/scripts/verify-faults.mjs +375 -0
- package/scripts/verify-faults.test.mjs +402 -0
- package/scripts/verify-package-artifacts.mjs +590 -0
- package/scripts/verify-peer-floors.js +399 -0
- package/scripts/verify-peer-floors.test.mjs +422 -0
- package/scripts/verify-test-fails-rules.mjs +104 -0
- package/scripts/verify-test-fails-rules.test.mjs +215 -0
- package/scripts/verify-test-fails.js +371 -0
- package/scripts/verify-traps.mjs +505 -0
- package/scripts/verify-traps.test.mjs +521 -0
- package/scripts/verify-typescript-floor.js +239 -0
- package/skill-packages/ic-reactor/SKILL.md +103 -0
- package/stack.json +8 -0
- package/tsconfig.base.json +23 -0
- package/tsconfig.json +8 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# CLAUDE.md — IC Reactor Project Context
|
|
2
|
+
|
|
3
|
+
This file gives Claude-based agents the context of this repository. Task
|
|
4
|
+
routing and verification by change type are in [`AGENTS.md`](./AGENTS.md).
|
|
5
|
+
|
|
6
|
+
## Branches
|
|
7
|
+
|
|
8
|
+
- **`main`** (this branch) is the line of ic-reactor 4. Its release lane
|
|
9
|
+
publishes a stable 4.x version under npm's `latest` dist-tag and a 4.x
|
|
10
|
+
prerelease under `beta` (`scripts/release-tag.mjs`).
|
|
11
|
+
- **`v3`** is the 3.x line, cut from `main` at the 4.0 GA flip: security fixes
|
|
12
|
+
only, until 90 days after the 4.0 release, released with its own
|
|
13
|
+
workflows. `v4`, the branch 4 was developed on until GA, was retired on
|
|
14
|
+
2026-10-26.
|
|
15
|
+
|
|
16
|
+
Open pull requests for ic-reactor 4 against `main`, and 3.x security fixes
|
|
17
|
+
against `v3`.
|
|
18
|
+
|
|
19
|
+
## What ic-reactor 4 is
|
|
20
|
+
|
|
21
|
+
A thin layer over a module that `meant gen` generates from a `.did`
|
|
22
|
+
file, plus one consumer guide. There are no typed handles. No package code on
|
|
23
|
+
this branch is written against unpublished Meant shapes: core's peer
|
|
24
|
+
`@meantjs/schema` and the Vite plugin's peer `@meantjs/cli` are pinned
|
|
25
|
+
exactly to published stable releases.
|
|
26
|
+
|
|
27
|
+
## Packages on this branch
|
|
28
|
+
|
|
29
|
+
| Package | Directory | State on `main` |
|
|
30
|
+
| ------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
31
|
+
| `@ic-reactor/core` | `packages/core` | `4.1.1`; `createClient`, `ReactorError`, the units helpers and their types (13 names), and `./testing` with `createTestClient` |
|
|
32
|
+
| `@ic-reactor/react` | `packages/react` | `4.1.1`; `ReactorProvider`, `useClient`, `useAuth` and `ReactorProviderProps`, over a core client |
|
|
33
|
+
| `@ic-reactor/vite-plugin` | `packages/vite-plugin` | `4.1.1`; generates the module with `@meantjs/cli` in a child process, and sets the `ic_env` cookie and `/api` proxy |
|
|
34
|
+
| `@ic-reactor/mcp` | `packages/mcp` | `4.1.1`; the `ic-reactor-mcp` command, an MCP server for any canister that sends an update only after the person approves it |
|
|
35
|
+
|
|
36
|
+
Not in this tree: `@ic-reactor/parser`, `@ic-reactor/codegen` and
|
|
37
|
+
`@ic-reactor/cli` (replaced by `meant gen`), and `@ic-reactor/candid` (frozen at
|
|
38
|
+
3.x, published from `v3`). The 3.x example apps are on `v3`; the five ic-reactor
|
|
39
|
+
4 examples are in `examples/` (`icrc-ledger`, `vite-wallet`, `next-ssr`,
|
|
40
|
+
`node-agent-tool`, `canister-studio`).
|
|
41
|
+
|
|
42
|
+
## AI context
|
|
43
|
+
|
|
44
|
+
- `packages/core/llms.txt` is the one consumer guide, shipped in core's
|
|
45
|
+
tarball; it must not describe an API that is not built yet.
|
|
46
|
+
`packages/react/llms.txt` points at it, and
|
|
47
|
+
`skill-packages/ic-reactor/SKILL.md`, the one consumer skill, adds only
|
|
48
|
+
workflow. `node evals/harness/check-docs.mjs "$PWD/packages/core/llms.txt"`
|
|
49
|
+
must find no hidden-test name or literal in the guide.
|
|
50
|
+
- There is no root `llms.txt` or `llms-full.txt` in this tree. The docs
|
|
51
|
+
deploy serves `packages/core/llms.txt` as the site's `/llms.txt`, and keeps
|
|
52
|
+
the frozen 3.x `llms-full.txt` from `v3` at `/llms-full.txt` and under `/v3/`.
|
|
53
|
+
- `pnpm check:ai-context` checks the version stamps and docs links of
|
|
54
|
+
`scripts/ai-context-files.js`, and that none of the 34 removed 3.x names
|
|
55
|
+
(`scripts/removed-v3-names.js`) appears outside a "Removed in 4.0" section.
|
|
56
|
+
`pnpm check:snippets` compiles the code fences of the same files.
|
|
57
|
+
- The hand-written docs pages follow the removed-names rule as well; only
|
|
58
|
+
`migrating-from-3.mdx` links `/v3/`, and a page names no `@ic-reactor`
|
|
59
|
+
version. `pnpm check:snippets:docs` compiles their fences.
|
|
60
|
+
|
|
61
|
+
## Docs
|
|
62
|
+
|
|
63
|
+
The docs site in `docs/` is built under `/v4/` (`base` in
|
|
64
|
+
`docs/astro.config.mjs`). Its pages are a module of b3pay.net, served at
|
|
65
|
+
`https://b3pay.net/docs/ic-reactor/` (`b3pay-module.json`,
|
|
66
|
+
`.github/workflows/b3pay-site.yml`). `.github/workflows/docs.yml` deploys
|
|
67
|
+
ic-reactor.b3pay.net from `main` (`scripts/assemble-docs-site.mjs` assembles
|
|
68
|
+
it): `/v3/`, rebuilt from the `v3` branch, and `/v2/` stay there, and each
|
|
69
|
+
`/v4/` and `/candid-core/` page sends readers to its page on b3pay.net. The
|
|
70
|
+
deploy stops when b3pay.net does not serve IC Reactor's docs, with the API
|
|
71
|
+
reference, or Meant's.
|
|
72
|
+
|
|
73
|
+
## Development
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pnpm install # pnpm is pinned by packageManager; corepack picks it up
|
|
77
|
+
pnpm build # Build the packages
|
|
78
|
+
pnpm test # Run the package tests
|
|
79
|
+
pnpm size # Tight size limits, peers left out and included (CI gate; build first)
|
|
80
|
+
pnpm typecheck # Type-check every package and e2e/ (CI gate)
|
|
81
|
+
pnpm lint # ESLint over packages/*/src and tests (CI gate; build first)
|
|
82
|
+
pnpm format:check # Prettier over the repo (CI gate)
|
|
83
|
+
pnpm check:ai-context # AI context versions and docs links (CI gate)
|
|
84
|
+
pnpm check:stack # Meant pins and mentions against stack.json (CI gate)
|
|
85
|
+
pnpm check:snippets # Compile the ts/tsx snippets of the READMEs and AI-context files (CI gate; build first)
|
|
86
|
+
pnpm check:exports # Built entries against scripts/export-budget.mjs (CI gate; build first)
|
|
87
|
+
pnpm verify:traps # Each @ts-expect-error of traps.test-d.ts bites (CI gate)
|
|
88
|
+
pnpm verify:faults # Each test of scripts/faults.json fails under its fault (CI gate)
|
|
89
|
+
pnpm test:scripts # The gates' own tests (CI gate; build first)
|
|
90
|
+
pnpm verify:packages # Pack and verify the published artifacts
|
|
91
|
+
pnpm test:examples:published # Each example installed from npm against the published packages (own CI workflow)
|
|
92
|
+
pnpm verify:peer-floors # Lowest peers and oldest TypeScript (CI gate; build first)
|
|
93
|
+
```
|
package/CNAME
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ic-reactor.b3pay.net
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project follows the Contributor Covenant. By participating, you are expected to uphold this code. Please be respectful, considerate, and collaborative.
|
|
4
|
+
|
|
5
|
+
For the full Code of Conduct, see: https://www.contributor-covenant.org/version/2/1/code_of_conduct/
|
|
6
|
+
|
|
7
|
+
If you experience or witness unacceptable behavior, please contact the maintainers at `B3Pay` on GitHub or open an issue.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# Contributing to IC Reactor
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing! This project uses pnpm workspaces. Below are the common workflows and expected standards.
|
|
4
|
+
|
|
5
|
+
## Branches
|
|
6
|
+
|
|
7
|
+
- **`main`** is the line of ic-reactor 4. Open pull requests for new work
|
|
8
|
+
against `main`. It releases 4.x: stable versions under npm's `latest`,
|
|
9
|
+
prereleases (`4.1.0-beta.N`) under `beta`.
|
|
10
|
+
- **`v3`** is the 3.x line, cut from `main` at the 4.0 GA flip. It takes
|
|
11
|
+
security fixes only, until 90 days after the 4.0 release, and 3.x security
|
|
12
|
+
releases are tagged from it with its own workflow files. Open a 3.x security
|
|
13
|
+
fix against `v3`.
|
|
14
|
+
|
|
15
|
+
CI, e2e, CodeQL and dependency review run on pull requests to either branch,
|
|
16
|
+
each with the workflow files of its own line.
|
|
17
|
+
|
|
18
|
+
## Quickstart
|
|
19
|
+
|
|
20
|
+
1. Fork the repository and clone it:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
git clone https://github.com/<your-username>/ic-reactor.git
|
|
24
|
+
cd ic-reactor
|
|
25
|
+
git remote add upstream https://github.com/B3Pay/ic-reactor.git
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
2. Install dependencies:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pnpm install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
3. Run the build and tests locally:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm build
|
|
38
|
+
pnpm test
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
4. Format files (automatically run on commit via Husky):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pnpm format
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
You can check formatting without modifying files:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnpm format:check
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Both scripts cover the whole repo. Exclusions live in one place,
|
|
54
|
+
`.prettierignore`, which the pre-commit hook honours too, so the hook and the
|
|
55
|
+
CI gate operate on exactly the same set of files.
|
|
56
|
+
|
|
57
|
+
5. Run the remaining CI gates before opening a PR:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pnpm check:ai-context # versions, package stamps and docs links in the AI guides
|
|
61
|
+
pnpm check:stack # Meant pins and mentions against stack.json
|
|
62
|
+
pnpm check:snippets # compiles the ts/tsx snippets of the guides and READMEs
|
|
63
|
+
pnpm check:snippets:docs # the same, plus the docs site's pages (needs the examples installed)
|
|
64
|
+
pnpm lint # ESLint over packages/*/src and packages/*/tests
|
|
65
|
+
pnpm typecheck # every package and e2e/, including their tests
|
|
66
|
+
pnpm size # gzipped size limits, see [Size budget](#size-budget)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`pnpm check:snippets`, `pnpm check:snippets:docs` and `pnpm lint` read the
|
|
70
|
+
packages' built declarations, and `pnpm size` measures their built `dist`, so run `pnpm build` first. See [Code snippets](#code-snippets) for what to do
|
|
71
|
+
when a snippet fails.
|
|
72
|
+
|
|
73
|
+
If you touched `packages/` or `examples/`, also type-check and build every
|
|
74
|
+
example app. `tsc` never loads a bundler, so an example can type-check cleanly
|
|
75
|
+
and still fail to build:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pnpm typecheck:examples
|
|
79
|
+
pnpm build:examples
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
If you touched `docs/`, `packages/` or `examples/`, run the docs gate. CI lints
|
|
83
|
+
the MDX, checks the example pages against `examples/`, builds the site and
|
|
84
|
+
crawls it for broken links. The API reference is generated from package
|
|
85
|
+
sources, so a source change can break the docs build too:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pnpm --dir docs run lint:mdx
|
|
89
|
+
pnpm docs:check-examples # sandbox links, file= targets and index cards
|
|
90
|
+
pnpm docs:build
|
|
91
|
+
pnpm docs:check-links # crawls docs/dist, so run it after docs:build
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The pages link Candid Core's site, which the deploy serves at `/candid-core/`
|
|
95
|
+
from a build of B3Pay/Meant. To check those links as CI does, build that
|
|
96
|
+
site and name it (an absolute path):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/B3Pay/Meant ../Meant
|
|
100
|
+
node ../Meant/website/build.mjs
|
|
101
|
+
CANDID_CORE_SITE="$PWD/../Meant/website/dist" pnpm docs:check-links
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
If you changed a package's `exports`, `files`, build output, or module format,
|
|
105
|
+
also run:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
pnpm verify:packages
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
It packs each publishable package, installs the tarballs into a scratch project
|
|
112
|
+
outside the workspace, imports and requires every entry point in real Node, and
|
|
113
|
+
runs `publint` + `attw`. Nothing else in CI can catch a broken published
|
|
114
|
+
artifact, because in-repo consumers resolve through workspace symlinks.
|
|
115
|
+
|
|
116
|
+
## The Meant pins
|
|
117
|
+
|
|
118
|
+
`stack.json` names the Meant release this branch is tested against: an exact
|
|
119
|
+
stable version of `@meantjs/schema` and of `@meantjs/cli`. The rest of the
|
|
120
|
+
tree follows it. `pnpm check:stack` (a CI step) reads each tracked
|
|
121
|
+
`package.json`, Markdown, MDX and text file and the two files that pin in
|
|
122
|
+
code, and fails on each of these that names another version, a range
|
|
123
|
+
included:
|
|
124
|
+
|
|
125
|
+
- a `package.json` entry keyed by the package: a dependency of any kind or an
|
|
126
|
+
override, `parent>package` and `package@range` keys included;
|
|
127
|
+
- an `@meantjs/<name>@<version>` in a `package.json` value or a Markdown,
|
|
128
|
+
MDX or text file: an install line, a script's `npx`, an `npm:` alias, a CDN
|
|
129
|
+
URL;
|
|
130
|
+
- a docs peer-table row that names the package and says exactly `<version>`;
|
|
131
|
+
- the two pins in code: `MEANT_CLI_VERSION` in
|
|
132
|
+
`packages/vite-plugin/src/generate.ts` and the `@meantjs/schema` entry of
|
|
133
|
+
`scripts/export-budget.mjs`.
|
|
134
|
+
|
|
135
|
+
A version in any other file (a `.ts` test, a workflow) is not read. It also
|
|
136
|
+
fails when no `package.json` outside the frozen paths pins a package that
|
|
137
|
+
`stack.json` lists, and when a frozen path holds no tracked file. Changelogs,
|
|
138
|
+
symlinks and the paths of the manifest's `frozen` list keep the versions they
|
|
139
|
+
have: the changelogs record what each release shipped with, and `evals/`
|
|
140
|
+
pins what its conditions were measured with.
|
|
141
|
+
|
|
142
|
+
ic-reactor installs Meant from npm, and only a published stable release. So
|
|
143
|
+
Meant publishes first, and the repin is a pull request of its own:
|
|
144
|
+
|
|
145
|
+
1. Change the versions in `stack.json`. The examples move with the rest of
|
|
146
|
+
the tree: in the workspace they run on this branch's packages, whose peers
|
|
147
|
+
are the new release, and an example left on the old one fails to
|
|
148
|
+
type-check against them (the Type Check Examples job, and the downstream
|
|
149
|
+
check a Meant release runs on this repository). Outside the workspace,
|
|
150
|
+
`pnpm test:examples:published` installs them with the published
|
|
151
|
+
ic-reactor release, whose peers are still the old ones, so that check, which
|
|
152
|
+
is not a required one, fails on the repin and on `main` until the release
|
|
153
|
+
pull request below.
|
|
154
|
+
2. Run `pnpm sync:stack`, then `pnpm install` to update the lockfile.
|
|
155
|
+
`pnpm sync:stack` rewrites in place each disagreement above that is a
|
|
156
|
+
version, a range or a dist-tag; it reports anything else (`catalog:`,
|
|
157
|
+
`workspace:*`) for you to change by hand.
|
|
158
|
+
3. Regenerate the checked-in modules with the new CLI: each example's and
|
|
159
|
+
`e2e/`'s `pnpm gen` (their `gen:check` fails until you do),
|
|
160
|
+
`packages/core/tests/fixtures/` (its README has the command),
|
|
161
|
+
`scripts/check-snippets/app/generated/` from the `.did` beside each module,
|
|
162
|
+
and `scripts/check-snippets/docs/guides/generated/`: `icp_ledger.ts` and
|
|
163
|
+
`ckbtc_minter.ts` are what `gen` writes for the icrc-ledger example's
|
|
164
|
+
`.did` cut down to the methods the guides show (each file's header says
|
|
165
|
+
how), and `accounts.ts` is Prettier's layout of the core fixture of that
|
|
166
|
+
name.
|
|
167
|
+
4. Check what a release changes by hand. The prose that says what one release
|
|
168
|
+
does, such as "`@meantjs/cli` 0.5.0 reads ...", is left alone by
|
|
169
|
+
`pnpm sync:stack`; so is the hand-written copy of a generated `Actor` in
|
|
170
|
+
`packages/react/tests/suspense.test-d.tsx`. `pnpm test` runs the real CLI
|
|
171
|
+
and fails on the generated lines that
|
|
172
|
+
`packages/vite-plugin/tests/generation.test.ts` looks for.
|
|
173
|
+
5. Run the gates, and name the Meant release in the pull request.
|
|
174
|
+
|
|
175
|
+
A feature that needs the new release comes in a pull request after the repin.
|
|
176
|
+
The release pull request that dates the changelog comes last, and soon after:
|
|
177
|
+
it moves the examples to the new ic-reactor version, and the published-examples
|
|
178
|
+
check then waits for its publish. Dependabot leaves `@meantjs/schema` and
|
|
179
|
+
`@meantjs/cli` alone (`.github/dependabot.yml`): its bump would change one pin
|
|
180
|
+
of many and fail `pnpm check:stack`, and a repin is chosen here.
|
|
181
|
+
|
|
182
|
+
## Size budget
|
|
183
|
+
|
|
184
|
+
`pnpm size` (the CI step "Check package sizes") runs size-limit over the built
|
|
185
|
+
packages, gzipped. Every limit sits just above its measured size, on purpose:
|
|
186
|
+
|
|
187
|
+
| Check | Config | What it measures |
|
|
188
|
+
| ----------------------- | --------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
189
|
+
| Core Library | `packages/core/.size-limit.js` | core's own `dist/index.js` |
|
|
190
|
+
| React bindings | `size-limit` in `packages/react/package.json` | react's own `dist/index.js` |
|
|
191
|
+
| App: `{ createClient }` | `scripts/size-app/.size-limit.js` | `createClient` with all it pulls from core's peers |
|
|
192
|
+
| App: React path | `scripts/size-app/.size-limit.js` | `createClient`, `ReactorProvider` and `useClient`, with every peer but React |
|
|
193
|
+
|
|
194
|
+
size-limit adds every `peerDependencies` entry of the package it runs in to
|
|
195
|
+
each check's `ignore`, so the first two never see `@icp-sdk/core`,
|
|
196
|
+
`@meantjs/schema`, `@noble/curves` or `@tanstack/query-core`. The last two
|
|
197
|
+
run from `scripts/size-app/`, a private workspace package that declares no
|
|
198
|
+
peers, so a change in what core pulls from them fails there. Keep it free of
|
|
199
|
+
peers; `pnpm test:scripts` checks that.
|
|
200
|
+
|
|
201
|
+
A pull request that changes any of these numbers says by how much, in bytes,
|
|
202
|
+
and raises the limit it crosses in the same change; one that shrinks a number
|
|
203
|
+
by more than 0.5 kB lowers that limit. Where the config has comments (core's
|
|
204
|
+
and `scripts/size-app/`'s), they record the new measured size and margin. That
|
|
205
|
+
includes a dependency bump that moves a peer's size. Read the numbers with `pnpm build && pnpm size`; run
|
|
206
|
+
`pnpm exec size-limit --json` in `packages/core`, `packages/react` or
|
|
207
|
+
`scripts/size-app` for exact bytes.
|
|
208
|
+
|
|
209
|
+
## Code snippets
|
|
210
|
+
|
|
211
|
+
`pnpm check:snippets` compiles every ` ```ts `, ` ```tsx ` and
|
|
212
|
+
` ```typescript ` fence of `packages/*/llms.txt`, `skill-packages/**/*.md`
|
|
213
|
+
(when a skill exists), `README.md` and `packages/*/README.md`, each as its own
|
|
214
|
+
module, against the built packages. Agents copy these snippets into apps
|
|
215
|
+
as they stand, so when one fails, fix the snippet: add the import it is
|
|
216
|
+
missing, or update it to the current API.
|
|
217
|
+
|
|
218
|
+
A snippet may use names its app would define without importing them: a
|
|
219
|
+
canister's `./declarations/backend`, a `./reactor` module, a name built earlier
|
|
220
|
+
on the page. Those come from `scripts/check-snippets/`: `app/` is the app every
|
|
221
|
+
document shares, and a directory named in `CONTEXTS` in
|
|
222
|
+
`scripts/check-snippets.mjs` holds what differs for one document. A relative
|
|
223
|
+
import resolves to the module of the same path there, and `globals.ts` lists the
|
|
224
|
+
names a snippet may use without importing. Add a missing app name there, never
|
|
225
|
+
a library export: a snippet that uses one must import it. `app/` holds a few
|
|
226
|
+
generic names and the generated modules the guide imports
|
|
227
|
+
(`app/generated/icrc1.ts`, `app/generated/backend.ts`).
|
|
228
|
+
|
|
229
|
+
The consumer guides (`packages/*/llms.txt` and `skill-packages/ic-reactor/`)
|
|
230
|
+
get no globals, since an agent pastes them into
|
|
231
|
+
an app that has none: each of their snippets imports or declares every name
|
|
232
|
+
it uses. A relative import there resolves first to a snippet of the same
|
|
233
|
+
guide (or skill) whose first line names that file, such as `// src/reactor.ts`
|
|
234
|
+
for `./reactor`, so it is checked against the module the reader was shown.
|
|
235
|
+
|
|
236
|
+
A fence that is not code to paste, such as a type signature or an interface
|
|
237
|
+
restating a library type, opts out with `nocheck` after its language,
|
|
238
|
+
` ```ts nocheck `, or with `// @snippet-skip` as its first line. Give a
|
|
239
|
+
placeholder such as `...` a real value instead. `pnpm check:snippets --verbose`
|
|
240
|
+
lists every snippet with its result.
|
|
241
|
+
|
|
242
|
+
The docs site's hand-written pages (`docs/src/content/docs`, without the
|
|
243
|
+
TypeDoc output in `libs/`) are gated too, by `pnpm check:snippets:docs`, which
|
|
244
|
+
CI runs in the job that installs the examples. Unlike the guides, a docs page
|
|
245
|
+
may assume the app it is about, so a page compiles against
|
|
246
|
+
`scripts/check-snippets/docs/<section>/` (its directory under the docs content
|
|
247
|
+
root, `root` for a page at the top), then against the default app. Put a name
|
|
248
|
+
the page assumes there, such as the canister its examples call or a component
|
|
249
|
+
the page only mentions. A fence that uses a library export still imports it,
|
|
250
|
+
and a fixture never re-exports one. A library an example app installs is the
|
|
251
|
+
real package once that example is listed in `DEPENDENCY_SOURCES`; the few
|
|
252
|
+
installed nowhere are declared once, faithfully, in
|
|
253
|
+
`scripts/check-snippets/ambient.d.ts`. An `@/` import resolves to a fixture
|
|
254
|
+
at that path. The checker type-checks, and it fails a snippet that calls a hook
|
|
255
|
+
(`useXxx(...)` or `query.useXxx()`) outside a component or a custom hook: at
|
|
256
|
+
the top of the module, in a class, or in a function that is not capitalised or
|
|
257
|
+
named `useXxx`. Wrap it in a component. A call that must fail to compile is shown with
|
|
258
|
+
`// @ts-expect-error`. Rules it cannot see (no hand-written query keys, update
|
|
259
|
+
methods only through mutations) are yours to keep when you write an example.
|
|
260
|
+
|
|
261
|
+
## Pre-commit hooks
|
|
262
|
+
|
|
263
|
+
This repo uses Husky + lint-staged. Hooks will be installed automatically when you run `pnpm install` (the `prepare` script runs `husky`). The `pre-commit` hook runs `lint-staged` to format and add staged files.
|
|
264
|
+
|
|
265
|
+
If you need to re-install hooks manually:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
pnpm prepare
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Troubleshooting
|
|
272
|
+
|
|
273
|
+
### `Cannot find native binding` after a dependency bump
|
|
274
|
+
|
|
275
|
+
A `node_modules` installed before a dependency bump and then updated in place
|
|
276
|
+
can lose its link to a native optional package while the package itself stays
|
|
277
|
+
on disk. Run `pnpm install` first. For satteri's binding, which the workspace
|
|
278
|
+
hoists (see below), that is enough. If the error remains, the lost link is one
|
|
279
|
+
a plain install does not recreate, with or without `--frozen-lockfile`. Relink
|
|
280
|
+
every package instead:
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
pnpm install --force
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
If that is not enough, delete every `node_modules` in the workspace and
|
|
287
|
+
install from scratch:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
pnpm clean && pnpm install
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
The error blames an npm bug and tells you to delete `package-lock.json` and
|
|
294
|
+
run `npm i` again. That text comes from the native package's loader. This repo
|
|
295
|
+
uses pnpm and has no `package-lock.json`, so the advice does not apply.
|
|
296
|
+
|
|
297
|
+
The Astro 7.3 bump did this to satteri's binding, and `pnpm docs:build` failed
|
|
298
|
+
with `Cannot find module '@bruits/satteri-<platform>'` (issue #408).
|
|
299
|
+
`pnpm-workspace.yaml` now hoists that binding to the root `node_modules`, so
|
|
300
|
+
the docs build no longer depends on the lost link. A future bump can still
|
|
301
|
+
strand a different native package the same way.
|
|
302
|
+
|
|
303
|
+
### `pnpm verify:audit` and the ignored advisories
|
|
304
|
+
|
|
305
|
+
`pnpm verify:audit` (the CI job "Audit") fails on any high or critical
|
|
306
|
+
advisory in the workspace. Fix one by raising the dependency, or a `pnpm.overrides`
|
|
307
|
+
entry in the root `package.json`, past the patched version. Only when no
|
|
308
|
+
patched version exists, and the package is reachable only from tooling that
|
|
309
|
+
never ships (the docs site's build, not `packages/*` or an example's runtime),
|
|
310
|
+
may the advisory go in `pnpm.auditConfig.ignoreGhsas`, with its reason here.
|
|
311
|
+
Remove an entry as soon as a patched version is released.
|
|
312
|
+
|
|
313
|
+
| Advisory | Package | Reached through | Why it is ignored |
|
|
314
|
+
| ------------------------------------------------------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
315
|
+
| [GHSA-ch52-4w7c-c8xp](https://github.com/advisories/GHSA-ch52-4w7c-c8xp) | `http-cache-semantics` ≤ 4.2.0 (no patched version) | `docs > astro` | A shared HTTP cache can serve one user's response to another through `max-stale`. The docs site is built to static files in CI; it runs no shared cache that serves users. |
|
|
316
|
+
| [GHSA-vfj7-8cjw-p6xm](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm) | `braces` ≤ 3.0.3 (no patched version) | `docs > remark-cli > unified-args > chokidar`, `docs > starlight-page-actions > vite-plugin-static-copy > chokidar` | A deeply nested pattern exhausts the stack. The patterns are the docs tooling's own file globs, not input from users. |
|
|
317
|
+
|
|
318
|
+
## Publishing (trusted publishing / tokens)
|
|
319
|
+
|
|
320
|
+
This repository enforces **OIDC Trusted Publishing** for releases (no long-lived publish tokens for the publish step). Trusted publishing is more secure and produces provenance attestations when used from GitHub Actions.
|
|
321
|
+
|
|
322
|
+
- To enable: go to your package on npmjs.com → Settings → Trusted publishers and add this repository's workflow filename (e.g., `release.yml`).
|
|
323
|
+
- `@ic-reactor/core`, `@ic-reactor/react` and `@ic-reactor/vite-plugin` trust `release.yml` (4.x from `main`, and core and react 3.x from `v3`), and so does `@ic-reactor/mcp` (4.x from `main`), once its name exists on npm (see [A package's first release](#a-packages-first-release)). Until the 3.x line's end, `@ic-reactor/vite-plugin` also trusts `release-tools.yml`, which publishes its 0.x security releases from `v3`; remove that publisher then.
|
|
324
|
+
- Bind each trusted publisher to the `npm-release` environment, the environment of every publish job on `main` and `v3`; every publisher of the eight packages names it. A package can hold up to 10 publishers, and an entry without an environment still accepts any job of its workflow, even next to a bound one, so the binding holds only while no entry is left without it: a new entry names `npm-release` from the start, and an unbound one is never added back. npm expires a new entry that no publish uses within 2 days ([npm docs](https://docs.npmjs.com/trusted-publishers)), so add one right before the release that uses it. `npm-release` has no reviewer. With the same deployment tag policy as `npm-publish`, it lets npm refuse the publish job of an older commit, which has no environment (see "Tagging a 3.x release" below), and any job from a ref other than a release tag (see "Approving a release" below).
|
|
325
|
+
- Ensure the publish job of `release.yml` has `permissions: id-token: write` (already configured). It is the only job that has it.
|
|
326
|
+
- After enabling and validating Trusted Publishing, do not add a write `NPM_TOKEN` secret — publishing will use the OIDC token.
|
|
327
|
+
|
|
328
|
+
If your CI needs to install private dependencies, create a **read-only** granular token on npmjs.com and store it as `NPM_READ_TOKEN` (the install step will use this token when present).
|
|
329
|
+
|
|
330
|
+
On `main` the release lane publishes `@ic-reactor/core`, `@ic-reactor/react`, `@ic-reactor/vite-plugin` and `@ic-reactor/mcp` in lockstep from `v4.*` tags: the packages of `LANE_PACKAGES` in `scripts/release-tag.mjs`, which `release.yml` names in each of its lists. `scripts/release-tag.mjs` decides for both `scripts/release.js` and `release.yml`: a stable 4.x version publishes under the `latest` dist-tag and becomes the latest GitHub Release, a 4.x prerelease publishes under `beta`, and any other version (3.x, 5.x, not semver) is refused. `release.yml` also requires the tagged commit to be on `main`.
|
|
331
|
+
|
|
332
|
+
The 3.x line releases from the `v3` branch with that branch's own workflows: `v3.*` tags publish `@ic-reactor/core` and `@ic-reactor/react` 3.x under the `v3-latest` dist-tag and `@ic-reactor/candid` under `latest` (it has no 4.x), and `tools-v*`/`parser-v*` tags publish `@ic-reactor/vite-plugin` 0.x under `v0-latest` and the parser, codegen and cli under `latest`. None of them moves `latest` of core, react or vite-plugin, or takes the GitHub "Latest" badge, as long as the tag is on a `v3` commit that contains those lanes.
|
|
333
|
+
|
|
334
|
+
### Tagging a 3.x release
|
|
335
|
+
|
|
336
|
+
A tag push runs the workflow file of the commit the tag points at, not the branch's current one. `main`'s history (and `v3`'s, up to the merge that added its lanes) holds 3.x commits whose `release.yml` and `release-tools.yml` publish any stable version under `latest`, and some of them carry a version that was never published (core, react and candid 3.0.5; codegen, cli and vite-plugin 0.15.0). A `v3.*`, `tools-v*` or `parser-v*` tag on such a commit runs that commit's workflow, and the older ones have no preflight and no approval job. Before you push a 3.x tag, check the commit it points at:
|
|
337
|
+
|
|
338
|
+
```sh
|
|
339
|
+
SHA=$(git rev-parse v3.13.1) # or tools-v0.15.2, parser-v0.6.1
|
|
340
|
+
git show "$SHA":.github/workflows/release.yml | grep -q v3-latest && echo "v3 lane" # for a v3.* tag
|
|
341
|
+
git show "$SHA":.github/workflows/release-tools.yml | grep -q v0-latest && echo "v0 lane" # for a tools-v* or parser-v* tag
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Push the tag only when the check prints its line. The `npm-release` environment closes this for good, since no package has a trusted publisher without it: the publish jobs of `release.yml` on `main` and of both lanes on `v3` run in it, and the publish jobs of older commits do not, so npm refuses their tokens.
|
|
345
|
+
|
|
346
|
+
`v3` and `main` may carry a ruleset that requires pull requests. A 3.x release script's printed `git push origin v3` then works only for a maintainer on the ruleset's bypass list. Otherwise push the release commit to a branch, merge its pull request with a merge commit (a squash or rebase would leave the tagged commit off the branch, and the preflight refuses it), and push the tag after the merge. A 4.x release from `main` always goes this way (below).
|
|
347
|
+
|
|
348
|
+
### Cutting a release
|
|
349
|
+
|
|
350
|
+
Start from the latest `main`, on a branch of the release's own: `git fetch origin main && git switch -c release/v<version> origin/main`. Then `pnpm release <version>` (such as `pnpm release 4.0.1`) prepares the release on that branch and commits it as `chore: release v<version>`: it bumps the root manifest and the lane's packages (core, react, vite-plugin and mcp), regenerates `packages/core/src/version.ts`, syncs the AI-context files and the examples, and updates the lockfile. It takes no argument but the version, and it never pushes, tags or publishes. It then prints the rest, which goes through a pull request: add the release's `CHANGELOG.md` section (see [Changelog at release time](#changelog-at-release-time)), push the branch and open its pull request into `main`, and once that is merged, put an annotated tag `v<version>` on the merge commit (it prints a `git log` that finds it) and push that tag. The tag starts `release.yml`, which publishes after the approval below.
|
|
351
|
+
|
|
352
|
+
### Approving a release
|
|
353
|
+
|
|
354
|
+
Pushing a release tag no longer publishes unattended. The release workflow (`release.yml`; on `v3` there is also `release-tools.yml` for the 3.x tooling lane) runs an `Approve publish` job against the `npm-publish` environment, which requires a reviewer to approve the run once before any package is published; every package in the release then publishes on that single approval. Preflight still runs first, so by the time the run pauses the tag has been checked against its branch, the manifests, the build, the tests and `verify:packages`, and the tarballs to publish are packed from that build. The approval also waits for the push runs of `ci.yml` and `e2e.yml` on the tagged commit to succeed: a tag on a commit that CI failed, or that no push to `main` tested, publishes nothing. The publish job then publishes the four tarballs back to back, core first and mcp last, with nothing installed, built or tested in between; if it stops part-way, re-running its failed job skips the packages npm already has from the same tarballs and publishes the rest. Approve it from the run's page under Actions, or from the pending-deployments prompt on the workflow run. Approving completes the release unchanged; rejecting it publishes nothing. npm versions are immutable, so this is the last point at which a wrong release can be stopped rather than superseded.
|
|
355
|
+
|
|
356
|
+
The environment lives in repository settings (Settings → Environments → `npm-publish`) and carries:
|
|
357
|
+
|
|
358
|
+
- a required reviewer (self-approval allowed, so for a solo maintainer this is a confirmation step, not a second-person requirement);
|
|
359
|
+
- a deployment tag policy limited to `v*`, `tools-v*` and `parser-v*`, so a run from any other ref cannot deploy to it at all.
|
|
360
|
+
|
|
361
|
+
The publish job runs in a second environment, `npm-release`, which carries the same tag policy and no reviewer. Every trusted publisher names it (see the publishing section above), so npm accepts a token only from a job in it, and a run from any other ref cannot publish whatever its workflow file says: the approval is read from that file, but the tag policy and the binding are not.
|
|
362
|
+
|
|
363
|
+
The `environment:` key is read from the tagged revision, like the preflight, so a tag pointing at a commit that predates it would skip the pause. The tag policy is settings-enforced, but it applies only to a job that names the environment, and such a commit names none: the `npm-release` binding of the trusted publishers is what refuses its publish. The `Release tags` ruleset, which limits who can create those tags, is the third leg; none of the three is sufficient alone.
|
|
364
|
+
|
|
365
|
+
## Commits & PRs
|
|
366
|
+
|
|
367
|
+
- Use clear, descriptive commit messages.
|
|
368
|
+
- Prefer small, focused PRs.
|
|
369
|
+
- Include tests where applicable.
|
|
370
|
+
- State the size delta of `pnpm size` (or that there is none), and raise a
|
|
371
|
+
limit only deliberately, as [Size budget](#size-budget) says.
|
|
372
|
+
- Add or update documentation for public API changes.
|
|
373
|
+
- Record a change users will notice under `## Unreleased` in
|
|
374
|
+
[`CHANGELOG.md`](./CHANGELOG.md), in its package's Added, Changed,
|
|
375
|
+
Deprecated or Fixed list. A behaviour change gets a one-line migration hint.
|
|
376
|
+
|
|
377
|
+
## Changelog at release time
|
|
378
|
+
|
|
379
|
+
The release scripts do not edit `CHANGELOG.md`. Before tagging, move the
|
|
380
|
+
entries of the packages being released from `## Unreleased` into a new section
|
|
381
|
+
named after the release (for example `## core, react, vite-plugin 4.0.0-beta.1`). The GitHub release that
|
|
382
|
+
the tag creates still generates its own notes from the merged pull requests.
|
|
383
|
+
|
|
384
|
+
## Code style
|
|
385
|
+
|
|
386
|
+
- We use Prettier for formatting. Run `pnpm format` before opening a PR if you need to format files manually.
|
|
387
|
+
|
|
388
|
+
## AI-assisted contributions
|
|
389
|
+
|
|
390
|
+
AI-assisted contributions are welcome, but contributors are responsible for correctness before opening a PR.
|
|
391
|
+
|
|
392
|
+
- Prefer existing IC Reactor patterns over introducing new abstractions.
|
|
393
|
+
- The 3.x runtime is gone from `main`. Do not copy 3.x patterns (`ClientManager`, `Reactor`, hook factories) from the `v3` branch; follow the guide in `packages/core/llms.txt`.
|
|
394
|
+
- Validate generated or AI-written code with tests/examples whenever possible.
|
|
395
|
+
- Update docs/examples when public API usage changes.
|
|
396
|
+
|
|
397
|
+
Repository AI context:
|
|
398
|
+
|
|
399
|
+
- `AGENTS.md` — task-to-source routing and verification commands (read this
|
|
400
|
+
first)
|
|
401
|
+
- `CLAUDE.md` — Claude / Anthropic project context
|
|
402
|
+
|
|
403
|
+
Consumer AI context (for apps that install the packages; keep repo paths,
|
|
404
|
+
pnpm commands and CI notes out of it): `packages/core/llms.txt`, shipped in
|
|
405
|
+
core's tarball and opening with an `Applies to` version line, and the one
|
|
406
|
+
consumer skill, `skill-packages/ic-reactor/SKILL.md`, which points at it.
|
|
407
|
+
|
|
408
|
+
## Adding a package
|
|
409
|
+
|
|
410
|
+
To add a new package in the workspace, create a new folder under `packages/` and add it to the workspace if necessary. Follow existing package conventions for `package.json`, `tsconfig`, and build scripts. Mark it `"private": true` until it is meant to publish: the gates and the release lane skip a private package.
|
|
411
|
+
|
|
412
|
+
A package that publishes joins the lane, and every gate that lists the lane's packages:
|
|
413
|
+
|
|
414
|
+
- its directory in `LANE_PACKAGES` (`scripts/release-tag.mjs`), after the packages it depends on, and in each list of `release.yml` (`scripts/release-workflow.test.mjs` holds them to `LANE_PACKAGES`);
|
|
415
|
+
- its entry points in `scripts/export-budget.mjs`, or, for a package that only installs a command, its `bin` under `COMMANDS`;
|
|
416
|
+
- its page in `docs/src/content/docs/packages/`, which names its Node floor, in the sidebars of `docs/astro.config.mjs` and `b3pay-module.json`, and as its `homepage`;
|
|
417
|
+
- its name in the `versionChecks` of `scripts/check-ai-context.js`.
|
|
418
|
+
|
|
419
|
+
### A package's first release
|
|
420
|
+
|
|
421
|
+
npm adds a trusted publisher only to a package that already exists ([`npm trust`](https://github.com/npm/cli/blob/latest/docs/lib/content/commands/npm-trust.md): "The package you're configuring must already exist on the npm registry"), and `release.yml` publishes with no token. So the owner reserves a new name once, by hand, before the first release that includes it:
|
|
422
|
+
|
|
423
|
+
1. From an empty directory, publish a placeholder: a `package.json` with the package's name, version `0.0.0`, the MIT license and the repository, and a `README.md` that says the name is reserved for the package and that its releases come from `release.yml`. Run `npm publish --access public`, signed in with two-factor authentication.
|
|
424
|
+
2. Within the two days before the release tag, add the trusted publisher: `release.yml` in `B3Pay/ic-reactor`, environment `npm-release`, on the package's settings page on npmjs.com, or with npm 11.15.0 or later: `npm trust github @ic-reactor/<name> --file release.yml --repo B3Pay/ic-reactor --env npm-release --allow-publish`.
|
|
425
|
+
3. Once the release is out, deprecate the placeholder: `npm deprecate @ic-reactor/<name>@0.0.0 "A placeholder that reserved the name. Install a 4.x version."`
|
|
426
|
+
|
|
427
|
+
The placeholder holds `latest` until the first stable release, so a first release that is a prerelease leaves `npm install @ic-reactor/<name>` installing it. If the trusted publisher is missing when the tag runs, the publish job stops at that package, after the packages before it have published: add the publisher and re-run the failed jobs, and the job skips what npm already has and publishes the rest.
|
|
428
|
+
|
|
429
|
+
## Reporting issues
|
|
430
|
+
|
|
431
|
+
Use the templates when creating issues. Fill out reproduction steps and environment details to help us triage faster.
|
|
432
|
+
|
|
433
|
+
Thanks again — we appreciate your contribution! 🎉
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023-2026 Behrad Deylami
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @ic-reactor/mcp
|
|
2
2
|
|
|
3
|
-
This version
|
|
3
|
+
This version only reserves the name. The MCP server is released from 4.x on by `release.yml` in [B3Pay/ic-reactor](https://github.com/B3Pay/ic-reactor).
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
**Please do not open a public issue for a security vulnerability.**
|
|
6
|
+
|
|
7
|
+
Report it privately through GitHub's private vulnerability reporting:
|
|
8
|
+
|
|
9
|
+
1. Go to <https://github.com/B3Pay/ic-reactor/security/advisories/new>
|
|
10
|
+
2. Describe the issue, the affected package and version, and how to reproduce it.
|
|
11
|
+
|
|
12
|
+
If private reporting is unavailable, open a public issue containing only "security report — please provide a private contact" and no technical detail, and a maintainer will follow up with a private channel.
|
|
13
|
+
|
|
14
|
+
We aim to acknowledge a report within 5 working days.
|
|
15
|
+
|
|
16
|
+
## What to include
|
|
17
|
+
|
|
18
|
+
The more of this you can provide, the faster a fix lands:
|
|
19
|
+
|
|
20
|
+
- Which package and version (`@ic-reactor/core`, `@ic-reactor/react`, `@ic-reactor/vite-plugin`, or a 3.x package: `@ic-reactor/candid`, `@ic-reactor/parser`, `@ic-reactor/codegen`, `@ic-reactor/cli`)
|
|
21
|
+
- A minimal reproduction — a config file, a `.did`, or a short script
|
|
22
|
+
- What an attacker controls, and what they gain
|
|
23
|
+
- Any known workaround
|
|
24
|
+
|
|
25
|
+
## Supported versions
|
|
26
|
+
|
|
27
|
+
| Package | Line | Supported | Branch |
|
|
28
|
+
| --------------------------------------- | -------- | -------------------------------------------------- | ------ |
|
|
29
|
+
| `@ic-reactor/{core,react,vite-plugin}` | `4.x` | Yes | `main` |
|
|
30
|
+
| `@ic-reactor/{core,react,candid}` | `3.x` | Security fixes until 90 days after the 4.0 release | `v3` |
|
|
31
|
+
| `@ic-reactor/{codegen,cli,vite-plugin}` | `0.15.x` | Security fixes until 90 days after the 4.0 release | `v3` |
|
|
32
|
+
| `@ic-reactor/parser` | `0.6.x` | Security fixes until 90 days after the 4.0 release | `v3` |
|
|
33
|
+
|
|
34
|
+
Fixes land on the latest minor of each supported line. Older minors are not backported. `@ic-reactor/candid`, `@ic-reactor/parser`, `@ic-reactor/codegen` and `@ic-reactor/cli` have no 4.x: ic-reactor 4 generates canister modules with `meant gen` instead, and their lines end with 3.x's. The 0.15 line of `@ic-reactor/vite-plugin` is the plugin of 3.x apps, which generates with `@ic-reactor/codegen`.
|
|
35
|
+
|
|
36
|
+
## Threat model
|
|
37
|
+
|
|
38
|
+
This section is ic-reactor 4's: `@ic-reactor/core`, `@ic-reactor/react` and `@ic-reactor/vite-plugin` 4.x. The 3.x packages' threat model is in the [`v3` branch's SECURITY.md](https://github.com/B3Pay/ic-reactor/blob/v3/SECURITY.md).
|
|
39
|
+
|
|
40
|
+
ic-reactor 4 is a client library and a Vite plugin. Two boundaries matter, and they have different trust assumptions.
|
|
41
|
+
|
|
42
|
+
### Runtime (`core`, `react`)
|
|
43
|
+
|
|
44
|
+
These run in the user's browser or on their server. In scope:
|
|
45
|
+
|
|
46
|
+
- Anything that serves one principal's canister data to another: the caller-scoped query keys, a sign-in or sign-out while a fetch runs, and one client per request on a server
|
|
47
|
+
- Anything that weakens certificate verification, in particular which root key a client takes: mainnet's built-in key, a key given in `network`, or one fetched only from a local host
|
|
48
|
+
- Anything that lets untrusted input choose which canister a call is routed to. Certificate verification does not cover this: a substituted canister ID names a real canister, whose responses verify against the real root key. That includes the `ic_env` cookie: core believes its canister IDs only on a local replica, on a canister's own `<id>.icp0.io` page, or with `allowEnvConfig: true`, and never takes its root key for a mainnet host
|
|
49
|
+
- Anything that mishandles delegations or identity material
|
|
50
|
+
- An error that says a write did not execute when it may have, so that resending it can execute it twice
|
|
51
|
+
|
|
52
|
+
Out of scope:
|
|
53
|
+
|
|
54
|
+
- A canister returning wrong data, unless the library presents it as verified
|
|
55
|
+
- `@ic-reactor/core/testing`: its fake replica and test client are for tests, not for production
|
|
56
|
+
|
|
57
|
+
Candid encoding and decoding are `@meantjs/schema`'s. Report a decoding bug, such as a hostile reply that decodes to the wrong value or crashes the decoder, to Meant through <https://github.com/B3Pay/Meant/security/advisories/new>.
|
|
58
|
+
|
|
59
|
+
### Development and build (`vite-plugin`)
|
|
60
|
+
|
|
61
|
+
The plugin runs in `vite dev`, `vite preview` and `vite build`. Its options come from the Vite config, which is code the developer runs, so they are trusted. A `.did` file, its name, and an interface fetched from a network are not. In scope:
|
|
62
|
+
|
|
63
|
+
- **The generator.** The plugin runs `meant gen` from the app's `node_modules`, with the running Node binary, in a child process and not through a shell. Anything that makes it run another program, or turns a `.did` path into anything but an argument, is in scope.
|
|
64
|
+
- **Live interfaces.** A missing `didFile` is written from the canister's `candid:service` metadata, read from certified state, and `verify: "live"` compares a `didFile` with it. Anything that writes or accepts an interface that does not verify against the network's root key, or writes outside the configured `didFile`, is in scope.
|
|
65
|
+
- **The `ic_env` cookie and the `/api` proxy** under `vite dev` and `vite preview`. A cookie that names a canister the local network did not report for that name, for example after the network restarted, or a proxy that sends requests to a host other than the local network, is in scope.
|
|
66
|
+
- **Generated files.** A `.did` file or a fetched interface that writes outside the configured `outDir`, or puts code into a generated module beyond the declarations it describes. `meant gen` writes the module, so the fix can be Meant's.
|
|
67
|
+
|
|
68
|
+
Out of scope: a developer's own Vite config pointing `outDir` or `didFile` somewhere destructive.
|
|
69
|
+
|
|
70
|
+
If you are unsure which project a bug belongs to, report it here, and we will move it.
|
|
71
|
+
|
|
72
|
+
## Disclosure
|
|
73
|
+
|
|
74
|
+
We will credit reporters who want it. If you plan to publish, please give us 90 days from acknowledgement, or until a fix ships — whichever comes first.
|