@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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "@ic-reactor/core"
|
|
3
|
+
description: "What @ic-reactor/core and @ic-reactor/core/testing export, their peers, and how to install them"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@ic-reactor/core` is the client of ic-reactor 4. It sits on a module that
|
|
7
|
+
`meant gen` writes from a `.did` file, and it has no React in it. It
|
|
8
|
+
gives you:
|
|
9
|
+
|
|
10
|
+
- a client with query keys that carry the caller, TanStack Query options for
|
|
11
|
+
reads and writes, and network resolution;
|
|
12
|
+
- one error type that says whether a call may have executed;
|
|
13
|
+
- strict helpers for token amounts;
|
|
14
|
+
- a test client over an in-memory replica, in a separate entry.
|
|
15
|
+
|
|
16
|
+
It works in a browser, in Node and on a server. It ships as ES modules only,
|
|
17
|
+
with no CommonJS build: use it from a package with `"type": "module"` or through a
|
|
18
|
+
bundler (see
|
|
19
|
+
[ES modules only](/v4/guides/getting-started/#es-modules-only)). For React, add
|
|
20
|
+
[`@ic-reactor/react`](/v4/packages/react/). For Vite, add
|
|
21
|
+
[`@ic-reactor/vite-plugin`](/v4/packages/vite-plugin/).
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npm install @ic-reactor/core @icp-sdk/core @tanstack/query-core
|
|
27
|
+
npm install --save-exact @meantjs/schema@0.6.0
|
|
28
|
+
npm install @icp-sdk/auth # for Internet Identity
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The generator is a separate dev dependency, pinned to the version that pairs
|
|
32
|
+
with `@meantjs/schema`:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
npm install --save-dev --save-exact @meantjs/cli@0.5.1
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
See [Getting started](/v4/guides/getting-started/) for the first read and write.
|
|
39
|
+
|
|
40
|
+
Node `>=22.12.0`, the first Node 22 that loads an ES module with `require()`
|
|
41
|
+
(22.12 itself prints an experimental warning when it does).
|
|
42
|
+
|
|
43
|
+
## Peers
|
|
44
|
+
|
|
45
|
+
| Peer | Range |
|
|
46
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
47
|
+
| `@meantjs/schema` | exactly `0.6.0`: the module `meant gen` writes imports it |
|
|
48
|
+
| `@icp-sdk/core` | `^6.1.0` |
|
|
49
|
+
| `@tanstack/query-core` | `^5.62.0` |
|
|
50
|
+
| `@noble/curves` | `^2.2.0`, optional: only `@ic-reactor/core/testing` signs with it, and `@icp-sdk/core` installs it already |
|
|
51
|
+
|
|
52
|
+
With React, install `@tanstack/query-core` at the exact version your
|
|
53
|
+
`@tanstack/react-query` depends on, and check that
|
|
54
|
+
`npm ls @tanstack/query-core` shows one copy; see
|
|
55
|
+
[the React package](/v4/packages/react/#one-copy-of-tanstackquery-core).
|
|
56
|
+
|
|
57
|
+
`@icp-sdk/auth` is not a peer. Install it when users sign in with Internet
|
|
58
|
+
Identity: its `AuthClient` is an `AuthLike` as it is, see
|
|
59
|
+
[Auth](/v4/guides/auth/).
|
|
60
|
+
|
|
61
|
+
## Exports of `@ic-reactor/core`
|
|
62
|
+
|
|
63
|
+
The entry has 13 names: four at runtime and nine types. The export budget caps
|
|
64
|
+
it at 13.
|
|
65
|
+
|
|
66
|
+
| Export | Kind | What it is |
|
|
67
|
+
| ------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
68
|
+
| `createClient` | runtime | Builds a client from a network and a caller. See [The client](/v4/guides/client/). |
|
|
69
|
+
| `isReactorError` | runtime | Tests whether a thrown value is a `ReactorError`; with a canister and a method, one of that call's, its `err` typed. See [Errors](/v4/guides/errors/). |
|
|
70
|
+
| `parseUnits` | runtime | Text to base units: `parseUnits("1.5", 8)` is `150000000n`. See [Values and units](/v4/guides/values/). |
|
|
71
|
+
| `formatUnits` | runtime | Base units to text, without losing digits. See [Values and units](/v4/guides/values/). |
|
|
72
|
+
| `Client` | type | A client offers: `canister`, `canisterId`, `queryOptions`, `mutationOptions`, `resendOf`, `queryKey`, `encode`, `func`, `time`, `signIn`, `signOut`, `caller`, `authState`, `subscribe`, `queryClient`, `network`, `dispose`. |
|
|
73
|
+
| `ClientOptions` | type | The argument of `createClient`: a `network`, and exactly one of `identity` and `auth`. |
|
|
74
|
+
| `Network` | type | `"ic"`, `"local"`, `"env"`, or `{ host, rootKey?, name?, fetchRootKey? }`. |
|
|
75
|
+
| `AuthLike` | type | What `auth` must be: the shape of an `@icp-sdk/auth` 10 `AuthClient`. See [Auth](/v4/guides/auth/). |
|
|
76
|
+
| `AuthState` | type | `{ status, principal, expiresAt? }`: who calls now, why, and until when. |
|
|
77
|
+
| `Canister` | type | What `client.canister<Actor>(actor, target)` returns: one async method per Candid method. |
|
|
78
|
+
| `CanisterTarget` | type | `{ id }` or `{ name }`, each with an optional `certified`. See [Reads](/v4/guides/reads/#certified-reads). |
|
|
79
|
+
| `ReactorError` | type | The error every call rejects with. A type only: there is no class, so test with `isReactorError`. |
|
|
80
|
+
| `ReactorErrorKind` | type | The eight kinds of a `ReactorError`. |
|
|
81
|
+
|
|
82
|
+
The signatures that matter most:
|
|
83
|
+
|
|
84
|
+
```ts nocheck
|
|
85
|
+
function createClient(options: ClientOptions): Client
|
|
86
|
+
|
|
87
|
+
type ClientOptions = {
|
|
88
|
+
readonly network: Network
|
|
89
|
+
readonly allowEnvConfig?: boolean
|
|
90
|
+
readonly fetch?: typeof globalThis.fetch
|
|
91
|
+
readonly maxDepth?: number
|
|
92
|
+
readonly maxElements?: number
|
|
93
|
+
} & (
|
|
94
|
+
| { readonly identity: Identity | "anonymous"; readonly auth?: never }
|
|
95
|
+
| {
|
|
96
|
+
readonly auth: (network: AuthNetwork) => AuthLike
|
|
97
|
+
readonly identity?: never
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
// Not exported: what the auth factory is handed, `network` in `(network) => new AuthClient(network)`.
|
|
102
|
+
type AuthNetwork = {
|
|
103
|
+
readonly agentOptions: {
|
|
104
|
+
readonly host: string
|
|
105
|
+
readonly rootKey?: Uint8Array
|
|
106
|
+
readonly shouldFetchRootKey: boolean
|
|
107
|
+
readonly fetch?: typeof globalThis.fetch
|
|
108
|
+
}
|
|
109
|
+
readonly identityProvider?: {
|
|
110
|
+
readonly authorizeUrl: string
|
|
111
|
+
readonly canisterId: string
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function isReactorError(error: unknown): error is ReactorError<unknown>
|
|
116
|
+
function isReactorError<A, M extends keyof A & string>(
|
|
117
|
+
error: unknown,
|
|
118
|
+
canister: Canister<A>,
|
|
119
|
+
method: M
|
|
120
|
+
): error is ReactorError<ErrorOf<A, M>> & { readonly method: M } // ErrorOf: the method's Err arm, or never
|
|
121
|
+
|
|
122
|
+
function parseUnits(
|
|
123
|
+
text: string,
|
|
124
|
+
decimals: number,
|
|
125
|
+
options?: { signed?: boolean }
|
|
126
|
+
): bigint
|
|
127
|
+
function formatUnits(
|
|
128
|
+
value: bigint,
|
|
129
|
+
decimals: number,
|
|
130
|
+
options?: { maxFractionDigits?: number; minFractionDigits?: number }
|
|
131
|
+
): string
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`createClient` does no work until it is used, so the same line runs in a
|
|
135
|
+
server render and in a browser. It throws a `TypeError` for options that do not
|
|
136
|
+
say who calls, say it twice, or name a network, `maxDepth` or `maxElements` it cannot use; for
|
|
137
|
+
an option it does not have, in the options or in a network object; and for an
|
|
138
|
+
`allowEnvConfig` or `fetchRootKey` that is not a boolean, a `rootKey` that is
|
|
139
|
+
not 133 bytes in a `Uint8Array`, or a `fetch` that is not a function.
|
|
140
|
+
`parseUnits` and `formatUnits` refuse an option they do not have too.
|
|
141
|
+
The `auth` factory is handed the client's network:
|
|
142
|
+
[Auth](/v4/guides/auth/) says where its `identityProvider` comes from.
|
|
143
|
+
|
|
144
|
+
## Exports of `@ic-reactor/core/testing`
|
|
145
|
+
|
|
146
|
+
A separate entry with two names. The main entry never imports it, so none of it
|
|
147
|
+
reaches an app bundle.
|
|
148
|
+
|
|
149
|
+
| Export | Kind | What it is |
|
|
150
|
+
| ------------------ | ------- | --------------------------------------------------------------------------------------------- |
|
|
151
|
+
| `createTestClient` | runtime | A real client over an in-memory replica, with mocked canisters and a sign-in a test controls. |
|
|
152
|
+
| `TestHandlers` | type | The handlers of a mocked canister, typed from the generated `Actor`. |
|
|
153
|
+
|
|
154
|
+
See [Testing](/v4/guides/testing/).
|
|
155
|
+
|
|
156
|
+
## What it does not export
|
|
157
|
+
|
|
158
|
+
The package exports exactly these names, from exactly two subpaths: `.` and
|
|
159
|
+
`./testing` (and `./package.json`). Every name has one import path, so it does
|
|
160
|
+
not re-export what lives elsewhere:
|
|
161
|
+
|
|
162
|
+
- `principal`, `isPrincipal` and the `Principal` type come from
|
|
163
|
+
`@meantjs/schema`.
|
|
164
|
+
- `skipToken`, `useQuery`, `useMutation`, `useSuspenseQuery`,
|
|
165
|
+
`useInfiniteQuery`, `dehydrate` and `HydrationBoundary` come from TanStack
|
|
166
|
+
Query (`@tanstack/react-query`, or `@tanstack/query-core` outside React).
|
|
167
|
+
|
|
168
|
+
## The guide ships in the package
|
|
169
|
+
|
|
170
|
+
The tarball carries a guide for people and coding agents, written against this
|
|
171
|
+
version: `node_modules/@ic-reactor/core/llms.txt`. It covers setup, values,
|
|
172
|
+
reads, writes, errors and a complete React example. These pages go into more
|
|
173
|
+
depth and agree with it.
|
|
174
|
+
|
|
175
|
+
## Where to read next
|
|
176
|
+
|
|
177
|
+
- [Getting started](/v4/guides/getting-started/): install, generate the module, first read and write.
|
|
178
|
+
- [The client](/v4/guides/client/): networks, who calls, canisters, `dispose`.
|
|
179
|
+
- [Values and units](/v4/guides/values/): the value shapes, `parseUnits` and `formatUnits`.
|
|
180
|
+
- [Reads](/v4/guides/reads/) and [Writes](/v4/guides/writes/): the options builders, keys, invalidation and re-sends.
|
|
181
|
+
- [Errors and mayHaveExecuted](/v4/guides/errors/): kinds, codes and what to do for each.
|
|
182
|
+
- [Auth](/v4/guides/auth/): `AuthLike`, Internet Identity and caller changes.
|
|
183
|
+
- [SSR and hydration](/v4/guides/ssr/): one client per request, dehydrate and hydrate.
|
|
184
|
+
- [Testing](/v4/guides/testing/): the test client.
|
|
185
|
+
|
|
186
|
+
Coming from 3.x? See [Migrating from 3.x](/v4/migrating-from-3/).
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "@ic-reactor/mcp"
|
|
3
|
+
description: "An MCP server that gives an AI agent any canister's methods as tools: queries run at once, and an update is sent only after you approve the exact call"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@ic-reactor/mcp` is an [MCP](https://modelcontextprotocol.io) server that
|
|
7
|
+
gives an AI agent any Internet Computer canister's methods as tools. Name a
|
|
8
|
+
canister, and Claude Code, Cursor or any other MCP client gets one tool per
|
|
9
|
+
method, with an input schema built from the canister's Candid. Queries run at
|
|
10
|
+
once. An update is sent only after you approve that exact call in the client.
|
|
11
|
+
|
|
12
|
+
The canister's interface is read from its certified `candid:service` metadata
|
|
13
|
+
and compiled with `@meantjs/cli`, the arguments and replies are checked and
|
|
14
|
+
encoded by `@meantjs/schema`, and calls go through an
|
|
15
|
+
[`@ic-reactor/core`](/v4/packages/core/) client, which verifies every
|
|
16
|
+
certificate and says whether a failed write may have run.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install --global @ic-reactor/mcp
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
It installs one command, `ic-reactor-mcp`, and has nothing to import. A global
|
|
25
|
+
install keeps the version you installed until you update it.
|
|
26
|
+
|
|
27
|
+
Node `>=22.12.0`, as core and react.
|
|
28
|
+
|
|
29
|
+
## Add it to a client
|
|
30
|
+
|
|
31
|
+
Claude Code, for the ICP ledger:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
claude mcp add icp -- ic-reactor-mcp --canister ledger=ryjl3-tyaaa-aaaaa-aaaba-cai
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Cursor (`.cursor/mcp.json`) and other clients that take a JSON entry:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"icp": {
|
|
43
|
+
"command": "ic-reactor-mcp",
|
|
44
|
+
"args": ["--canister", "ledger=ryjl3-tyaaa-aaaaa-aaaba-cai"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Without `--identity` the server calls as the anonymous principal: every query
|
|
51
|
+
works and no update is sent. To send updates, give it a key (see
|
|
52
|
+
[A key](#a-key)).
|
|
53
|
+
|
|
54
|
+
## Tools
|
|
55
|
+
|
|
56
|
+
| Tool | What it does |
|
|
57
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
58
|
+
| `whoami` | The principal calls are signed as, the network, whether the client can show the approval form, the listed canisters |
|
|
59
|
+
| `list_methods` | A canister's methods and their Candid signatures, where the interface came from, and whether updates can be sent |
|
|
60
|
+
| `describe_method` | One method's Candid (the method and every type it uses), its doc comment, and the JSON Schema of its arguments |
|
|
61
|
+
| `query` | Runs a query method of any canister; `certified: true` makes it a replicated call, as the anonymous principal, with a certified reply |
|
|
62
|
+
| `call` | Sends an update to a listed canister once you approve it; a query method is run as a query |
|
|
63
|
+
| `<name>_<method>` | One per method of each `--canister`, such as `ledger_icrc1_transfer`, with the method's own input schema |
|
|
64
|
+
|
|
65
|
+
`call` and the update tools are listed only when an update can be sent: the
|
|
66
|
+
server has a key, the client can show a form, and a canister is listed.
|
|
67
|
+
|
|
68
|
+
Tool arguments and replies are JSON. A `nat`, `int`, `nat64` or `int64` is a
|
|
69
|
+
decimal string such as `"150000000"`, a `blob` is lower-case hex, an `opt` is
|
|
70
|
+
`null` or the value, and a variant is `{ "tag": "Name", "value": payload }`.
|
|
71
|
+
The [package's README](https://github.com/B3Pay/ic-reactor/tree/main/packages/mcp#arguments-and-replies)
|
|
72
|
+
has every Candid type's JSON form.
|
|
73
|
+
|
|
74
|
+
## Updates and approval
|
|
75
|
+
|
|
76
|
+
An update (or a oneway call) is sent only when all of these hold, and a
|
|
77
|
+
refusal says which one did not:
|
|
78
|
+
|
|
79
|
+
1. The server has a key: `--identity <pem file>`.
|
|
80
|
+
2. The canister is listed with `--canister`. Queries reach any canister,
|
|
81
|
+
updates only the ones you named.
|
|
82
|
+
3. Its interface is certified metadata, or a `.did` you gave with `--did`.
|
|
83
|
+
An interface read through the uncertified `__get_candid_interface_tmp_hack`
|
|
84
|
+
query is used for reads only: it is one replica's unproven answer.
|
|
85
|
+
4. The client can show a form (MCP form elicitation), and you tick
|
|
86
|
+
"Send this call" and accept.
|
|
87
|
+
|
|
88
|
+
The form shows the canister, the method, the principal that signs, the
|
|
89
|
+
network, the arguments as Candid text (with invisible and bidirectional
|
|
90
|
+
characters escaped), the size and sha256 of the encoded arguments, and where
|
|
91
|
+
the interface came from. Arguments over 20,000 characters of Candid, or a
|
|
92
|
+
method name over 200 characters, are refused, never cut. The server confirms
|
|
93
|
+
the canister's module hash before it asks you and again after you approve, and
|
|
94
|
+
sends nothing if the canister was upgraded in between. Declining, closing the
|
|
95
|
+
form, ten minutes without an answer, or a client error all mean nothing is
|
|
96
|
+
sent. One approval is asked at a time.
|
|
97
|
+
|
|
98
|
+
A certified read (`query` with `certified: true`) is a replicated call, which
|
|
99
|
+
the IC runs as whatever the canister's module exports under that name. So it
|
|
100
|
+
is made as the anonymous principal, never with your key, and its reply is read
|
|
101
|
+
with the interface of the module installed now.
|
|
102
|
+
|
|
103
|
+
Claude Code shows the form in a dialog. `claude -p` cancels every form unless
|
|
104
|
+
an `Elicitation` hook answers it, so a headless run sends no update unless you
|
|
105
|
+
wrote a hook that approves.
|
|
106
|
+
|
|
107
|
+
## A key
|
|
108
|
+
|
|
109
|
+
`--identity <file>` takes an Ed25519 or secp256k1 private key in PEM form, such
|
|
110
|
+
as `icp identity export <name>` or `dfx identity export <name>` prints. The
|
|
111
|
+
file must be readable by its owner only (`chmod 600`); the server refuses one
|
|
112
|
+
that other users can read. The server never makes a key. Give the agent a key
|
|
113
|
+
of its own, holding only what you would let it spend.
|
|
114
|
+
|
|
115
|
+
## Options
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
--canister <name>=<id> A canister that gets typed tools and takes updates,
|
|
119
|
+
such as ledger=ryjl3-tyaaa-aaaaa-aaaba-cai. A bare
|
|
120
|
+
<id> is named after its first five characters.
|
|
121
|
+
--did <name or id>=<path> Read that canister's interface from this .did file
|
|
122
|
+
instead of the network.
|
|
123
|
+
--identity <pem file> Sign calls with this key (chmod 600).
|
|
124
|
+
--network <ic|local|url> ic (mainnet, the default), local
|
|
125
|
+
(http://127.0.0.1:8000), or a replica's URL.
|
|
126
|
+
--root-key <hex> The root key (DER, hex) of a --network <url> that
|
|
127
|
+
is not on this machine.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
A root key is fetched only from a replica on this machine. Mainnet's key is
|
|
131
|
+
built into the agent, and a remote replica's must be given with `--root-key`.
|
|
132
|
+
|
|
133
|
+
## Limits
|
|
134
|
+
|
|
135
|
+
- A `.did` over 256 KiB, a service with more than 1,000 methods, or a compile
|
|
136
|
+
over 2 seconds is refused; the compiler runs in a worker thread.
|
|
137
|
+
- A tool's input schema is cut at about 64,000 characters, names and
|
|
138
|
+
descriptions included, and says it was cut. The typed tools of one
|
|
139
|
+
`tools/list` stop at 1,000,000 characters; `query` and `call` still reach a
|
|
140
|
+
method past that.
|
|
141
|
+
- A tool result is cut at 60,000 characters, with a note that it was cut.
|
|
142
|
+
- A read waits 60 seconds for its answer, and an approved update 6 minutes; an
|
|
143
|
+
update that gets no answer in time may still have run, and its result says
|
|
144
|
+
so.
|
|
145
|
+
|
|
146
|
+
## What the agent sees
|
|
147
|
+
|
|
148
|
+
Names in a canister's interface (methods, fields, types) are the canister's
|
|
149
|
+
own text and reach the model in tool names, descriptions and schemas. A
|
|
150
|
+
method's doc comment, which is free text, appears only in `describe_method`'s
|
|
151
|
+
result, labelled as written by the canister's authors, and never in a tool
|
|
152
|
+
description. The form is the safeguard for writes: an agent misled by such
|
|
153
|
+
text can still only propose a call, and you read the call itself before it is
|
|
154
|
+
sent.
|
|
155
|
+
|
|
156
|
+
## Read next
|
|
157
|
+
|
|
158
|
+
- [Give an agent a canister's tools](/v4/build/agent-tools/): a ledger's tools
|
|
159
|
+
written by hand with `@ic-reactor/core`, with amounts as decimal text and a
|
|
160
|
+
transfer that never pays twice.
|
|
161
|
+
- [Errors and mayHaveExecuted](/v4/guides/errors/): what a failed write tells
|
|
162
|
+
you about whether it ran.
|
|
163
|
+
- [@ic-reactor/core](/v4/packages/core/): the client the server calls through.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "@ic-reactor/react"
|
|
3
|
+
description: "What @ic-reactor/react exports, its peers, and how to install it"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@ic-reactor/react` is the React binding of ic-reactor 4: three
|
|
7
|
+
`"use client"` exports over a client made by
|
|
8
|
+
[`@ic-reactor/core`](/v4/packages/core/). There is no hook that wraps
|
|
9
|
+
`useQuery` or `useMutation`. You read and write canisters with TanStack Query's
|
|
10
|
+
own hooks and the options the client builds, `client.queryOptions(...)` and
|
|
11
|
+
`client.mutationOptions(...)`.
|
|
12
|
+
|
|
13
|
+
The package never re-exports `@ic-reactor/core`, so every name has one import
|
|
14
|
+
path.
|
|
15
|
+
|
|
16
|
+
Like core, it ships as ES modules only (see
|
|
17
|
+
[ES modules only](/v4/guides/getting-started/#es-modules-only)).
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm install @ic-reactor/core @ic-reactor/react @tanstack/react-query
|
|
23
|
+
npm install @icp-sdk/core @tanstack/query-core
|
|
24
|
+
npm install --save-exact @meantjs/schema@0.6.0
|
|
25
|
+
npm install @icp-sdk/auth # for Internet Identity
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The second and third lines are peers of `@ic-reactor/core`;
|
|
29
|
+
see its [package page](/v4/packages/core/). For a Vite app, see also
|
|
30
|
+
[the Vite plugin](/v4/packages/vite-plugin/).
|
|
31
|
+
|
|
32
|
+
Peers of this package:
|
|
33
|
+
|
|
34
|
+
| Peer | Range |
|
|
35
|
+
| ----------------------- | ------------------------------------------------------------- |
|
|
36
|
+
| `@ic-reactor/core` | exactly this package's version: the two are released together |
|
|
37
|
+
| `@tanstack/react-query` | `^5.90.2` |
|
|
38
|
+
| `react` | `>=18.0.0` |
|
|
39
|
+
|
|
40
|
+
Node `>=22.12.0`, the first Node 22 that loads an ES module with `require()`
|
|
41
|
+
(22.12 itself prints an experimental warning when it does).
|
|
42
|
+
|
|
43
|
+
### One copy of `@tanstack/query-core`
|
|
44
|
+
|
|
45
|
+
Install `@tanstack/query-core` at the exact version your
|
|
46
|
+
`@tanstack/react-query` depends on (`npm view @tanstack/react-query@<version>
|
|
47
|
+
dependencies`), and check that `npm ls @tanstack/query-core` shows one copy.
|
|
48
|
+
npm installs a second copy when the two differ: core then builds its
|
|
49
|
+
`QueryClient` from one copy and the hooks read the other, each with its own
|
|
50
|
+
`skipToken`. `client.queryOptions()` throws a `TypeError` for the hooks'
|
|
51
|
+
`skipToken`, and in development `ReactorProvider` throws when it is handed
|
|
52
|
+
such a client. Both errors name this fix.
|
|
53
|
+
|
|
54
|
+
## Exports
|
|
55
|
+
|
|
56
|
+
The entry has four names. The export budget allows five.
|
|
57
|
+
|
|
58
|
+
| Export | What it is |
|
|
59
|
+
| ---------------------- | ------------------------------------------------------------------------ |
|
|
60
|
+
| `ReactorProvider` | Gives a tree one client, and TanStack Query that client's `QueryClient`. |
|
|
61
|
+
| `useClient` | The client of the nearest provider, for the caller this render shows. |
|
|
62
|
+
| `useAuth` | Who calls (`status`, `principal`), with `signIn` and `signOut`. |
|
|
63
|
+
| `ReactorProviderProps` | A type: `{ client: () => Client; children: ReactNode }`. |
|
|
64
|
+
|
|
65
|
+
Nothing else is importable: the only subpaths are `.` and `./package.json`.
|
|
66
|
+
`useQuery`, `useMutation`, `useSuspenseQuery`, `skipToken`, `dehydrate` and
|
|
67
|
+
`HydrationBoundary` come from `@tanstack/react-query`, and `principal` from
|
|
68
|
+
`@meantjs/schema`.
|
|
69
|
+
|
|
70
|
+
### ReactorProvider
|
|
71
|
+
|
|
72
|
+
```ts nocheck
|
|
73
|
+
interface ReactorProviderProps {
|
|
74
|
+
readonly client: () => Client
|
|
75
|
+
readonly children: ReactNode
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`ReactorProvider` takes a factory, not a client, and calls it once for each
|
|
80
|
+
mounted provider. It renders TanStack's `QueryClientProvider` with
|
|
81
|
+
`client.queryClient`. When it unmounts, it disposes the client only if that
|
|
82
|
+
factory call created it:
|
|
83
|
+
|
|
84
|
+
- **The provider owns the client.** A factory that creates it,
|
|
85
|
+
`client={() => createClient({ ... })}`, gives each mounted provider a client
|
|
86
|
+
of its own, and the provider disposes it when it unmounts. Use this in an app
|
|
87
|
+
that renders on a server: the factory runs once per request.
|
|
88
|
+
- **The app owns the client.** A client created at module scope, one per tab
|
|
89
|
+
and used outside React too, is handed over as `client={() => client}`. The
|
|
90
|
+
provider borrows it and never disposes it.
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
"use client"
|
|
94
|
+
|
|
95
|
+
import { createClient } from "@ic-reactor/core"
|
|
96
|
+
import { ReactorProvider } from "@ic-reactor/react"
|
|
97
|
+
import { AuthClient } from "@icp-sdk/auth/client"
|
|
98
|
+
import type { ReactNode } from "react"
|
|
99
|
+
|
|
100
|
+
export function Providers({ children }: { children: ReactNode }) {
|
|
101
|
+
return (
|
|
102
|
+
<ReactorProvider
|
|
103
|
+
client={() =>
|
|
104
|
+
createClient({
|
|
105
|
+
network: "ic",
|
|
106
|
+
auth: (network) => new AuthClient(network),
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
>
|
|
110
|
+
{children}
|
|
111
|
+
</ReactorProvider>
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Who owns a client follows from when it was created, not from where the factory
|
|
117
|
+
is written. A getter such as `client ??= createClient(...)` makes the first
|
|
118
|
+
provider that calls it the owner. Create a shared client eagerly instead. A
|
|
119
|
+
Server Component cannot pass the factory across the client boundary, so in
|
|
120
|
+
Next.js the provider sits in a client module that the layout renders: see
|
|
121
|
+
[SSR and hydration](/v4/guides/ssr/).
|
|
122
|
+
|
|
123
|
+
An app that already uses TanStack Query keeps one `QueryClient` per tree,
|
|
124
|
+
the client's. `ReactorProvider` provides `client.queryClient`, so the app's own
|
|
125
|
+
queries, REST calls included, run on it: an error that is not a `ReactorError`
|
|
126
|
+
is retried as TanStack Query retries it by default (up to 3 times in a
|
|
127
|
+
browser, never on a server), and `client.dispose()` clears those queries
|
|
128
|
+
along with the client's reads. Set other defaults on each query. A
|
|
129
|
+
`QueryClientProvider` of the app's own nested inside the provider works too: a
|
|
130
|
+
write invalidates its reads on the `QueryClient` it ran on as well as on the
|
|
131
|
+
client's. That `QueryClient` lacks the client's dehydrate and hydrate defaults,
|
|
132
|
+
so a server render dehydrates `client.queryClient`.
|
|
133
|
+
|
|
134
|
+
### useClient
|
|
135
|
+
|
|
136
|
+
`useClient()` returns the client of the nearest provider. It throws outside a
|
|
137
|
+
provider. Call it in the body of each component that builds keys or read
|
|
138
|
+
options, on every render:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import { useClient } from "@ic-reactor/react"
|
|
142
|
+
import { useQuery } from "@tanstack/react-query"
|
|
143
|
+
import { actor, type Actor } from "./generated/icrc1"
|
|
144
|
+
|
|
145
|
+
export function Fee({ id }: { id: string }) {
|
|
146
|
+
const client = useClient()
|
|
147
|
+
const ledger = client.canister<Actor>(actor, { id })
|
|
148
|
+
const fee = useQuery(client.queryOptions(ledger, "icrc1_fee"))
|
|
149
|
+
return <span>{fee.data?.toString() ?? "…"}</span>
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
It follows the client's caller, so a component that calls it renders again on
|
|
154
|
+
a sign-in, a switch of account and a sign-out, and builds the new caller's
|
|
155
|
+
keys. A change of status that leaves the caller as it is renders nothing.
|
|
156
|
+
|
|
157
|
+
It returns a view of the client for the caller the render shows (the anonymous
|
|
158
|
+
one while a page hydrates): one object per caller, a new one when the caller
|
|
159
|
+
changes, the same one on every render while it stays. List it in the
|
|
160
|
+
dependencies of a `useMemo`, an effect or a callback built from it; React
|
|
161
|
+
Compiler memoizes on it the same way, so what is memoized is built again for
|
|
162
|
+
the new caller. Its `mutationOptions` send only as that caller: a write
|
|
163
|
+
pressed before a switch reached the render is refused (`caller_changed`) and
|
|
164
|
+
sends nothing. It is never the provider's client object, so compare two
|
|
165
|
+
clients by their `queryClient`, and do not keep its result past its render.
|
|
166
|
+
See [SSR and hydration](/v4/guides/ssr/).
|
|
167
|
+
|
|
168
|
+
### useAuth
|
|
169
|
+
|
|
170
|
+
`useAuth()` returns `{ status, principal, expiresAt?, signIn, signOut }`: the
|
|
171
|
+
client's `AuthState` with sign-in and sign-out forwarded to the client. It
|
|
172
|
+
renders a component once for each change of status, principal or `expiresAt`,
|
|
173
|
+
and when a session ends by the clock. It is `"anonymous"` on
|
|
174
|
+
a server and during a hydrating render. See [Auth](/v4/guides/auth/).
|
|
175
|
+
|
|
176
|
+
## Life of the client
|
|
177
|
+
|
|
178
|
+
- **StrictMode.** The development double-mount does not dispose a client in
|
|
179
|
+
use: disposal is scheduled for the next macrotask, and the second mount
|
|
180
|
+
cancels it.
|
|
181
|
+
- **A render React throws away.** React runs no cleanup for a render it drops
|
|
182
|
+
before committing it, such as a provider's first render below a Suspense
|
|
183
|
+
boundary that suspends. A client the factory built for it is disposed once
|
|
184
|
+
that render's state is garbage collected (through a `FinalizationRegistry`,
|
|
185
|
+
in a browser).
|
|
186
|
+
- **Replacing the client.** Only the factory of the first render is used.
|
|
187
|
+
Passing another function later does not rebuild the client. To replace the
|
|
188
|
+
client, give the provider another `key`.
|
|
189
|
+
- **Activity.** If React shows a hidden `Activity` again after the client the
|
|
190
|
+
provider owns was disposed, the provider builds another one with the same
|
|
191
|
+
factory, and it starts with an empty cache. To keep the cache across hiding,
|
|
192
|
+
render the provider above the `Activity`, or give it a client the app owns.
|
|
193
|
+
|
|
194
|
+
## Where to go next
|
|
195
|
+
|
|
196
|
+
- [Auth](/v4/guides/auth/): `useAuth`, sign-in and caller changes.
|
|
197
|
+
- [Reads](/v4/guides/reads/) and [Writes](/v4/guides/writes/): the options the
|
|
198
|
+
client builds for TanStack Query.
|
|
199
|
+
- [SSR and hydration](/v4/guides/ssr/): one client per request, and the limits
|
|
200
|
+
of a signed-in reload.
|
|
201
|
+
- [Testing](/v4/guides/testing/): a provider with a borrowed test client.
|
|
202
|
+
- [Examples](/v4/examples/): the Vite wallet and the Next.js app.
|
|
203
|
+
|
|
204
|
+
The guide for both packages is `llms.txt`, shipped in
|
|
205
|
+
`node_modules/@ic-reactor/core/llms.txt`; the React package's own `llms.txt`
|
|
206
|
+
points to it. The released 3.x package is documented on
|
|
207
|
+
[Migrating from 3.x](/v4/migrating-from-3/).
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "@ic-reactor/vite-plugin"
|
|
3
|
+
description: "What @ic-reactor/vite-plugin exports, its peers, and how to install it"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@ic-reactor/vite-plugin` generates the module that `meant gen` writes from a
|
|
7
|
+
`.did` file, with `@meantjs/cli` in a child process, and it sets the `ic_env`
|
|
8
|
+
cookie and the `/api` proxy under `vite dev` and `vite preview`. It adds no
|
|
9
|
+
wrapper files, hooks or reactors.
|
|
10
|
+
|
|
11
|
+
Its 4 line replaces the 0.15 plugin of the 3.x line, which generates reactor
|
|
12
|
+
bindings with `@ic-reactor/codegen`: see
|
|
13
|
+
[Migrating from 3.x](/v4/migrating-from-3/).
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm install --save-exact @meantjs/schema@0.6.0
|
|
19
|
+
npm install --save-dev --save-exact @meantjs/cli@0.5.1
|
|
20
|
+
npm install --save-dev @ic-reactor/vite-plugin
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Exports
|
|
24
|
+
|
|
25
|
+
The package has one entry, `@ic-reactor/vite-plugin`, in ESM and CommonJS. It
|
|
26
|
+
exports two names, and there is no other subpath:
|
|
27
|
+
|
|
28
|
+
| Name | Kind | What it is |
|
|
29
|
+
| ------------------------ | -------- | --------------------------------------------------------------------------- |
|
|
30
|
+
| `icReactor` | function | `icReactor(options?)` returns the Vite plugin |
|
|
31
|
+
| `IcReactorPluginOptions` | type | The options: `canisters`, `injectEnvironment`, `failOnError`, `onGenerated` |
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { icReactor, type IcReactorPluginOptions } from "@ic-reactor/vite-plugin"
|
|
35
|
+
import { defineConfig } from "vite"
|
|
36
|
+
|
|
37
|
+
const options: IcReactorPluginOptions = {
|
|
38
|
+
canisters: { icrc1: { didFile: "did/icrc1.did" } },
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default defineConfig({ plugins: [icReactor(options)] })
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Peers
|
|
45
|
+
|
|
46
|
+
| Peer | Range |
|
|
47
|
+
| --------------- | -------------------------------------------------- |
|
|
48
|
+
| `@meantjs/cli` | exactly `0.5.1` |
|
|
49
|
+
| `@icp-sdk/core` | `^6.1.0`, optional |
|
|
50
|
+
| `vite` | `^4.2.0`, `^5.0.0`, `^6.0.0`, `^7.0.0` or `^8.0.0` |
|
|
51
|
+
|
|
52
|
+
Node `>=22.12.0`, as core and react.
|
|
53
|
+
|
|
54
|
+
The CLI is pinned exactly because the plugin runs the CLI your app installs,
|
|
55
|
+
and that CLI has to pair with the `@meantjs/schema` runtime the generated
|
|
56
|
+
modules import. The plugin itself imports no `@ic-reactor` runtime package, so
|
|
57
|
+
it can be used with the generated module alone. It loads `@icp-sdk/core` only
|
|
58
|
+
to [fetch a `.did` from a live canister](/v4/guides/vite-plugin/#fetch-a-did-from-a-live-canister),
|
|
59
|
+
when a `didFile` is not on disk; every app on `@ic-reactor/core` has it
|
|
60
|
+
installed already.
|
|
61
|
+
|
|
62
|
+
## Read next
|
|
63
|
+
|
|
64
|
+
- [The Vite plugin](/v4/guides/vite-plugin/): options, generation, failures and
|
|
65
|
+
the local environment in full.
|
|
66
|
+
- [Getting started](/v4/guides/getting-started/): install, generate and make a
|
|
67
|
+
first read and write.
|
|
68
|
+
- [Vite wallet](/v4/examples/vite-wallet/): `network: "env"` and `{ name }`
|
|
69
|
+
targets on a local `icp` network.
|
|
70
|
+
- [ICRC-1 ledger](/v4/examples/icrc-ledger/): three `.did` files generated into
|
|
71
|
+
one `outDir`, with `injectEnvironment: false`.
|
|
72
|
+
- [@ic-reactor/core](/v4/packages/core/) and
|
|
73
|
+
[@ic-reactor/react](/v4/packages/react/): the runtime packages.
|