@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,551 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "The client"
|
|
3
|
+
description: "createClient: the network, who calls (identity or auth), client.canister, dispose, and one client per request on a server"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import { Aside } from "@astrojs/starlight/components"
|
|
7
|
+
|
|
8
|
+
`createClient` makes the one object an app builds: per browser tab, or per
|
|
9
|
+
request on a server. It decides who calls, keeps one agent per principal, and
|
|
10
|
+
owns the `QueryClient` that every read is cached in.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { createClient } from "@ic-reactor/core"
|
|
14
|
+
|
|
15
|
+
const client = createClient({ network: "ic", identity: "anonymous" })
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`createClient` does no work until the client is used. The same line therefore
|
|
19
|
+
runs in a server render (anonymous, with no auth built) and in a browser.
|
|
20
|
+
|
|
21
|
+
## Options
|
|
22
|
+
|
|
23
|
+
| Option | Meaning |
|
|
24
|
+
| ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
25
|
+
| `network` | Where the canisters are. Required. See [Networks](#networks). |
|
|
26
|
+
| `identity` | A fixed caller: an `Identity`, or `"anonymous"`. |
|
|
27
|
+
| `auth` | A factory for a sign-in the user controls: `() => AuthLike`. |
|
|
28
|
+
| `allowEnvConfig` | Whether the `ic_env` cookie (root key and canister ids) is believed. Absent: only when the page and the replica are local. |
|
|
29
|
+
| `fetch` | The `fetch` every agent sends with. Default: the global one. A test passes a fake replica's. |
|
|
30
|
+
| `maxDepth` | How deep a decoded reply may nest. Default 256. Raise it for replies like an ICRC-3 block log's values. |
|
|
31
|
+
| `maxElements` | How many values a reply may hold beyond one per byte. Default 1,000,000. A blob of any size the IC returns decodes. |
|
|
32
|
+
|
|
33
|
+
Pass exactly one of `identity` and `auth`. `createClient` throws a `TypeError`
|
|
34
|
+
for options that name neither, name both, or name a network, a `maxDepth` or a
|
|
35
|
+
`maxElements` that cannot be used. It also throws for an option it does not have, in the
|
|
36
|
+
options or in a network object (`host` goes inside `network`), and for an
|
|
37
|
+
`allowEnvConfig` or `fetchRootKey` that is not `true` or `false`: an
|
|
38
|
+
environment variable is text, and `"false"` is truthy, so compare it,
|
|
39
|
+
`allowEnvConfig: import.meta.env.VITE_ALLOW_ENV === "true"`. A `rootKey` is the
|
|
40
|
+
133 bytes of the key in a `Uint8Array`: decode hex text first. A `host` is an
|
|
41
|
+
`http:` or `https:` URL, and so must be the one `"env"` takes from the page or
|
|
42
|
+
from `ICP_HOST`: `localhost:4943` reads as the scheme `localhost:`, so write
|
|
43
|
+
`http://localhost:4943`.
|
|
44
|
+
|
|
45
|
+
## Networks
|
|
46
|
+
|
|
47
|
+
| `network` | Host | Root key | Key segment |
|
|
48
|
+
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
49
|
+
| `"ic"` | `https://icp-api.io` | Mainnet's, built into the agent. Nothing is fetched. | `"ic"` |
|
|
50
|
+
| `"local"` | `http://127.0.0.1:8000` | Fetched from the replica before the first call. | `"local"` |
|
|
51
|
+
| an object | `host` | `rootKey` as given, never fetched. Without it, fetched only when `host` is local, unless `fetchRootKey` says otherwise. | `name`, or `host` when there is no `name` |
|
|
52
|
+
| `"env"` | In a browser, the page's own origin when the page is local, on a mainnet boundary domain, or a page that forwards a dev server ([below](#env-off-localhost)). Any other page (Vercel, a custom domain) uses the server rule [below](#env-on-a-server), which in a browser is usually mainnet (`https://icp-api.io`). On a server, see [below](#env-on-a-server). | From the `ic_env` cookie, only where the cookie is trusted. A local replica with no key from the cookie has its root key fetched. | the resolved host |
|
|
53
|
+
|
|
54
|
+
An object network looks like this:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { createClient } from "@ic-reactor/core"
|
|
58
|
+
|
|
59
|
+
declare const stagingRootKey: Uint8Array
|
|
60
|
+
|
|
61
|
+
const client = createClient({
|
|
62
|
+
network: {
|
|
63
|
+
host: "https://replica.staging.example.com",
|
|
64
|
+
rootKey: stagingRootKey,
|
|
65
|
+
name: "staging",
|
|
66
|
+
},
|
|
67
|
+
identity: "anonymous",
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### The root key
|
|
72
|
+
|
|
73
|
+
The root key is what certificates are checked against, so who may hand one over
|
|
74
|
+
is decided by a short list:
|
|
75
|
+
|
|
76
|
+
- A `rootKey` you give is used, and never fetched.
|
|
77
|
+
- Without one, the client fetches the key only from a local host: `localhost`,
|
|
78
|
+
a name ending in `.localhost`, or any loopback address (`127.0.0.0/8`,
|
|
79
|
+
`[::1]`). Any other host is checked against mainnet's key.
|
|
80
|
+
- `fetchRootKey: true` makes the client fetch the key from any host. Write it
|
|
81
|
+
only for a host whose key you trust, because the host then chooses the key.
|
|
82
|
+
|
|
83
|
+
### The `ic_env` cookie
|
|
84
|
+
|
|
85
|
+
The `ic_env` cookie carries a root key and canister ids. The Vite plugin and
|
|
86
|
+
asset canisters set it. The client reads it only in a browser, and believes it
|
|
87
|
+
only when both the replica and the page are local, or when you write
|
|
88
|
+
`allowEnvConfig: true`. Any sibling subdomain of a page's domain can write a
|
|
89
|
+
cookie, so write `allowEnvConfig: true` only when every subdomain of the page's
|
|
90
|
+
domain is trusted. `allowEnvConfig: false` never reads the cookie. One more
|
|
91
|
+
page believes the cookie's canister ids by default, and nothing else in it: a
|
|
92
|
+
canister's own `<id>.icp0.io` page (see [Deploy to mainnet](#deploy-to-mainnet)).
|
|
93
|
+
|
|
94
|
+
Whether siblings can write it depends on the Public Suffix List. `icp0.io` and
|
|
95
|
+
`raw.icp0.io` are on it, so no other canister's page can set a cookie that
|
|
96
|
+
`<id>.icp0.io` reads. `ic0.app`, `app.github.dev` (Codespaces), `gitpod.io`,
|
|
97
|
+
`loca.lt` (localtunnel) and `devtunnels.ms` (VS Code dev tunnels) are not, so
|
|
98
|
+
every canister, workspace or tunnel under them can set one for all the others.
|
|
99
|
+
On a page under those five, `createClient` refuses `allowEnvConfig: true` with
|
|
100
|
+
a `TypeError`. Even where the opt-in is allowed, the cookie's root key is never
|
|
101
|
+
taken for a mainnet host (the agent keeps mainnet's own), and its Internet
|
|
102
|
+
Identity URL is taken over `http:` only on a local page.
|
|
103
|
+
|
|
104
|
+
A page can receive more than one `ic_env` cookie. An asset canister sets it
|
|
105
|
+
with no `Path`, so the browser keeps a copy for each directory a page was
|
|
106
|
+
loaded from, and lists them all. Copies that are the same are believed. Off a
|
|
107
|
+
local page, copies that differ are believed for nothing: a `{ name }` target
|
|
108
|
+
is refused with the reason `untrusted_host`, and neither their root key nor
|
|
109
|
+
their Internet Identity is taken. A local page reads the first, as before.
|
|
110
|
+
|
|
111
|
+
Canisters named in the cookie are called by name: `{ name: "backend" }` reads
|
|
112
|
+
`PUBLIC_CANISTER_ID:backend` from the cookie. See
|
|
113
|
+
[The Vite plugin](/v4/guides/vite-plugin/) for how the local cookie is made.
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import { createClient } from "@ic-reactor/core"
|
|
117
|
+
import { actor, type Actor } from "./generated/backend"
|
|
118
|
+
|
|
119
|
+
const client = createClient({ network: "env", identity: "anonymous" })
|
|
120
|
+
const backend = client.canister<Actor>(actor, { name: "backend" })
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
On Codespaces and Gitpod, the page is routed through its own origin but is not
|
|
124
|
+
local. The key is then neither taken from the cookie nor fetched, and certified
|
|
125
|
+
calls fail verification. Use an object network with the replica's `rootKey`
|
|
126
|
+
(or `fetchRootKey: true`), and `{ id }` canisters. `allowEnvConfig: true` is
|
|
127
|
+
refused there, because any other workspace can set the cookie.
|
|
128
|
+
|
|
129
|
+
### `"env"` off localhost
|
|
130
|
+
|
|
131
|
+
`"env"` is for `localhost` pages. A dev page opened some other way still
|
|
132
|
+
routes through its own origin, so it reaches the dev server and never
|
|
133
|
+
mainnet: Codespaces and Gitpod, a LAN address (`vite --host` on a phone:
|
|
134
|
+
192.168/16, 10/8, 172.16/12, 169.254/16, IPv6 `fc00::/7` and `fe80::/10`), a
|
|
135
|
+
Tailscale address or name (100.64/10, `*.ts.net`), a LAN name with no dot
|
|
136
|
+
(`http://devbox:5173`), a `*.local`, `*.test` or `*.internal` name
|
|
137
|
+
(`host.docker.internal`), and the tunnels `*.ngrok-free.app`,
|
|
138
|
+
`*.ngrok-free.dev`, `*.ngrok.app`, `*.ngrok.io`, `*.trycloudflare.com`,
|
|
139
|
+
`*.loca.lt` and VS Code's `*.devtunnels.ms`. None of these is local, so the
|
|
140
|
+
cookie is not believed (a `{ name }` canister does not resolve) and no root
|
|
141
|
+
key is taken from it or fetched: certified calls fail verification against
|
|
142
|
+
mainnet's key. To use such a page, give the client
|
|
143
|
+
`{ host: location.origin, rootKey }` and `{ id }` canisters, or open the app
|
|
144
|
+
on `localhost`.
|
|
145
|
+
|
|
146
|
+
### `"env"` on a server
|
|
147
|
+
|
|
148
|
+
A server has no page and no cookie. The host is `ICP_HOST` or `IC_HOST` when
|
|
149
|
+
`ICP_NETWORK` is `"local"`, `http://127.0.0.1:8000` (icp-cli's local network,
|
|
150
|
+
as for `"local"`) if neither host is set, and mainnet otherwise. With no
|
|
151
|
+
`ICP_NETWORK`, dfx's `DFX_NETWORK=local` counts too, and its default is dfx's
|
|
152
|
+
replica, `http://127.0.0.1:4943`.
|
|
153
|
+
|
|
154
|
+
Without a cookie, a `{ name }` target never resolves: every call rejects as
|
|
155
|
+
`invalid_args` with code `canister_id_unresolved`, and nothing is sent. Use
|
|
156
|
+
`{ id }` on a server. In development the client warns about this once per
|
|
157
|
+
process.
|
|
158
|
+
|
|
159
|
+
<Aside type="note">
|
|
160
|
+
The network's key segment is part of every query key. With `"env"`, a server's
|
|
161
|
+
segment is its host, and a browser's is often the page's origin, so a read
|
|
162
|
+
dehydrated by the server is found in the browser only when both resolve the
|
|
163
|
+
same host. For server rendering, use `"ic"`, or an object network with the
|
|
164
|
+
same `name` on both sides. See [SSR and hydration](/v4/guides/ssr/).
|
|
165
|
+
</Aside>
|
|
166
|
+
|
|
167
|
+
### A local network without Vite
|
|
168
|
+
|
|
169
|
+
The Vite plugin is what makes `"env"` work on a local page: it sets the
|
|
170
|
+
`ic_env` cookie and proxies `/api` to the local network. Without it (Next.js,
|
|
171
|
+
Rsbuild, webpack, esbuild), there is no cookie, so `{ name }` never resolves,
|
|
172
|
+
and under `next dev` the page's own `/api` is Next's route space, so an agent
|
|
173
|
+
routed through the page's origin gets Next's 404. Name the network and the
|
|
174
|
+
canister instead:
|
|
175
|
+
|
|
176
|
+
- `network: "local"` (icp-cli's network on `http://127.0.0.1:8000`; for dfx,
|
|
177
|
+
`{ host: "http://127.0.0.1:4943" }`). The page calls the network directly,
|
|
178
|
+
and its root key is fetched because the host is local.
|
|
179
|
+
- `{ id }`, read from a build-time variable the framework inlines into the
|
|
180
|
+
page, such as `NEXT_PUBLIC_BACKEND_ID` in Next.js.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
// src/backend.ts
|
|
184
|
+
import { createClient } from "@ic-reactor/core"
|
|
185
|
+
import { actor, type Actor } from "./generated/backend"
|
|
186
|
+
|
|
187
|
+
const id = process.env.NEXT_PUBLIC_BACKEND_ID
|
|
188
|
+
if (!id) throw new Error("NEXT_PUBLIC_BACKEND_ID is not set")
|
|
189
|
+
|
|
190
|
+
export const client = createClient({
|
|
191
|
+
network: process.env.NODE_ENV === "production" ? "ic" : "local",
|
|
192
|
+
identity: "anonymous",
|
|
193
|
+
})
|
|
194
|
+
export const backend = client.canister<Actor>(actor, { id })
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Write the local id into `.env.development.local` after each `icp deploy`
|
|
198
|
+
(icp-cli prints the id of a named canister with
|
|
199
|
+
`icp canister status -e local -i <name>`). Next.js reads that file only under
|
|
200
|
+
`next dev`, so a `next build` never inlines a local id beside `"ic"`. The
|
|
201
|
+
command replaces the file, so keep it for these ids alone:
|
|
202
|
+
|
|
203
|
+
```sh
|
|
204
|
+
echo "NEXT_PUBLIC_BACKEND_ID=$(icp canister status -e local -i backend)" > .env.development.local
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
A production build reads the mainnet id from its own environment instead
|
|
208
|
+
(`NEXT_PUBLIC_BACKEND_ID` set where the app is built for mainnet). `next dev`
|
|
209
|
+
watches the file and picks up a changed id without a restart, unless the
|
|
210
|
+
variable is also set in the shell, which wins over the file.
|
|
211
|
+
|
|
212
|
+
To keep `"env"` instead, the page must answer `/api` as the plugin's proxy
|
|
213
|
+
does. In Next.js, rewrite `/api/v2`, `/api/v3` and `/api/v4` to the same
|
|
214
|
+
paths on the local network (the agent sends updates to v4 first, queries and
|
|
215
|
+
status reads to v3 and v2). Each destination names its path again: Next.js
|
|
216
|
+
does not append the matched path to a destination that has none.
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
// next.config.ts
|
|
220
|
+
const nextConfig = {
|
|
221
|
+
async rewrites() {
|
|
222
|
+
return ["v2", "v3", "v4"].map((version) => ({
|
|
223
|
+
source: `/api/${version}/:path*`,
|
|
224
|
+
destination: `http://127.0.0.1:8000/api/${version}/:path*`,
|
|
225
|
+
}))
|
|
226
|
+
},
|
|
227
|
+
}
|
|
228
|
+
export default nextConfig
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
The page is local, so the client fetches the root key through the rewrite. It
|
|
232
|
+
still gives no cookie, so the canisters still need `{ id }`, and a server
|
|
233
|
+
render has no page origin: run `next dev` with `ICP_NETWORK=local`, or the
|
|
234
|
+
server's `"env"` is mainnet.
|
|
235
|
+
|
|
236
|
+
### Deploy to mainnet
|
|
237
|
+
|
|
238
|
+
`icp deploy -e ic` deploys the project's canisters, the frontend's asset
|
|
239
|
+
canister among them, to mainnet: `ic` is, with `local`, one of the two
|
|
240
|
+
environments every icp-cli project has. The asset canister then serves the
|
|
241
|
+
built page at `https://<frontend-id>.icp0.io`, also reachable as
|
|
242
|
+
`<frontend-id>.raw.icp0.io` and `<frontend-id>.ic0.app`, and at a custom
|
|
243
|
+
domain once you register one. It sets an `ic_env` cookie like the Vite
|
|
244
|
+
plugin's, with the `PUBLIC_CANISTER_ID:<name>` entries icp-cli sets on the
|
|
245
|
+
canisters and mainnet's root key.
|
|
246
|
+
|
|
247
|
+
Serve it with the response headers of
|
|
248
|
+
[Deploy to a frontend canister](/v4/guides/deploy/), which also sends visitors
|
|
249
|
+
of its raw host to `<id>.icp0.io`: the HTTP gateway checks no page on
|
|
250
|
+
`raw.icp0.io`.
|
|
251
|
+
|
|
252
|
+
What `network: "env"` does on each of these pages:
|
|
253
|
+
|
|
254
|
+
| The page | The host | The root key | `{ name: "backend" }` |
|
|
255
|
+
| ---------------------------------- | -------------------- | ------------------- | --------------------------------------- |
|
|
256
|
+
| `<id>.icp0.io`, `<id>.raw.icp0.io` | the page's origin | mainnet's, built in | resolved from the cookie |
|
|
257
|
+
| `<id>.ic0.app` | the page's origin | mainnet's, built in | not resolved (`canister_id_unresolved`) |
|
|
258
|
+
| a custom domain | `https://icp-api.io` | mainnet's, built in | not resolved (`canister_id_unresolved`) |
|
|
259
|
+
|
|
260
|
+
`icp0.io` and `raw.icp0.io` are on the Public Suffix List, so no other
|
|
261
|
+
canister's page can set a cookie that `<id>.icp0.io` receives, and the
|
|
262
|
+
client believes the cookie's canister ids there without `allowEnvConfig`. It
|
|
263
|
+
takes nothing else from it: the agent keeps mainnet's root key, and sign-in
|
|
264
|
+
keeps `AuthClient`'s default, mainnet's Internet Identity, whatever the
|
|
265
|
+
cookie's `INTERNET_IDENTITY_PROVIDER` says. `ic0.app` is not on the list:
|
|
266
|
+
any canister's page can set a cookie there for every other one, so the
|
|
267
|
+
cookie is not believed. A custom domain is not known to be either, and its
|
|
268
|
+
page cannot proxy `/api`, so `"env"` falls back to mainnet's API host.
|
|
269
|
+
|
|
270
|
+
The Public Suffix List keeps other canisters' pages from setting the cookie,
|
|
271
|
+
but a cookie does not say where it came from. So for a mainnet app, bake the
|
|
272
|
+
ids into the build instead of naming canisters: its calls then do not depend
|
|
273
|
+
on the cookie, and the same build works on all three domains and on a local
|
|
274
|
+
network. With Vite, read them from a mode's env file:
|
|
275
|
+
|
|
276
|
+
```ts
|
|
277
|
+
import { createClient } from "@ic-reactor/core"
|
|
278
|
+
import { actor, type Actor } from "./generated/backend"
|
|
279
|
+
|
|
280
|
+
const client = createClient({ network: "env", identity: "anonymous" })
|
|
281
|
+
const backend = client.canister<Actor>(actor, {
|
|
282
|
+
id: import.meta.env.VITE_BACKEND_ID,
|
|
283
|
+
})
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
```sh
|
|
287
|
+
# .env.development: the id on the local network
|
|
288
|
+
VITE_BACKEND_ID=bkyz2-fmaaa-aaaaa-qaaaq-cai
|
|
289
|
+
# .env.production: the id on mainnet
|
|
290
|
+
VITE_BACKEND_ID=<the id icp printed for backend on ic>
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
`icp canister status backend -e local -i` and
|
|
294
|
+
`icp canister status backend -e ic -i` print the two ids. Then
|
|
295
|
+
`vite build` and `icp deploy -e ic` ship a page that calls the mainnet id from
|
|
296
|
+
any of its domains.
|
|
297
|
+
|
|
298
|
+
`allowEnvConfig: true` is safe only on a page whose every sibling subdomain
|
|
299
|
+
is yours, which is to say a custom domain where no subdomain serves content
|
|
300
|
+
anyone else controls. On `<id>.icp0.io` it adds only the cookie's Internet
|
|
301
|
+
Identity, which a mainnet app does not need, and on `ic0.app` it is never
|
|
302
|
+
safe.
|
|
303
|
+
|
|
304
|
+
## Who calls
|
|
305
|
+
|
|
306
|
+
### `identity`
|
|
307
|
+
|
|
308
|
+
- `identity: "anonymous"` makes a read-only client. Every update is refused
|
|
309
|
+
before it is sent, as `unauthenticated` with code `anonymous_write`.
|
|
310
|
+
- `identity: someIdentity` signs every call, updates included. Use it for
|
|
311
|
+
scripts, servers and tests.
|
|
312
|
+
|
|
313
|
+
An explicit `new AnonymousIdentity()` makes an anonymous client that _may_
|
|
314
|
+
send updates, as the anonymous principal. If you are handed an identity that
|
|
315
|
+
might be anonymous, map it:
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
import { createClient } from "@ic-reactor/core"
|
|
319
|
+
import type { Identity } from "@icp-sdk/core/agent"
|
|
320
|
+
|
|
321
|
+
export function clientFor(identity: Identity | undefined) {
|
|
322
|
+
return createClient({
|
|
323
|
+
network: "ic",
|
|
324
|
+
identity:
|
|
325
|
+
identity && !identity.getPrincipal().isAnonymous()
|
|
326
|
+
? identity
|
|
327
|
+
: "anonymous",
|
|
328
|
+
})
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### `auth`
|
|
333
|
+
|
|
334
|
+
`auth` is a factory for a sign-in that users control. It is called once, on
|
|
335
|
+
first use, and only in a browser. The client owns what it returns and disposes
|
|
336
|
+
it with itself. A factory that throws (`new AuthClient()` reads
|
|
337
|
+
`localStorage`, which throws where site data is blocked) is not called again:
|
|
338
|
+
the client calls anonymously, logs the error once in development, and rejects
|
|
339
|
+
`signIn()` and `signOut()` with it. The same holds for a factory that returns
|
|
340
|
+
something other than an auth, such as a Promise from an `async` factory; the
|
|
341
|
+
error is then a `TypeError` that names what the result lacks.
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
import { createClient } from "@ic-reactor/core"
|
|
345
|
+
import { AuthClient } from "@icp-sdk/auth/client"
|
|
346
|
+
|
|
347
|
+
const client = createClient({
|
|
348
|
+
network: "ic",
|
|
349
|
+
auth: (network) => new AuthClient(network),
|
|
350
|
+
})
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
The factory is handed the client's `network` as `AuthClient` takes it:
|
|
354
|
+
`agentOptions` (the host and root key of the client's own agents, and its
|
|
355
|
+
`fetch`, when you gave one) and, where one can be named, `identityProvider`,
|
|
356
|
+
the Internet Identity to sign in with.
|
|
357
|
+
`@icp-sdk/auth` 10's `AuthClient` is an `AuthLike` as it is. Any other sign-in
|
|
358
|
+
that hands over an identity needs a small adapter. A wallet that signs each
|
|
359
|
+
call itself (ICRC-49) does not fit: see
|
|
360
|
+
[Wallets that sign each call](/v4/guides/auth/#wallets-that-sign-each-call).
|
|
361
|
+
|
|
362
|
+
### Who is calling
|
|
363
|
+
|
|
364
|
+
| Question | Answer |
|
|
365
|
+
| ---------------------- | ------------------------------------------------------------------------- |
|
|
366
|
+
| the caller's principal | `client.caller()` (`"2vxsx-fae"` unless signed in), `useAuth().principal` |
|
|
367
|
+
| may a write be sent | `client.authState().status === "signed-in"`; the client refuses the rest |
|
|
368
|
+
| when did it change | `client.subscribe(listener)`, or `useAuth()` re-renders |
|
|
369
|
+
|
|
370
|
+
```ts
|
|
371
|
+
import { client } from "./ledger"
|
|
372
|
+
|
|
373
|
+
const stop = client.subscribe(() => {
|
|
374
|
+
const { status, principal } = client.authState()
|
|
375
|
+
console.log(status, principal)
|
|
376
|
+
})
|
|
377
|
+
// later: stop()
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
A `"signed-in"` session may still be read-only: see
|
|
381
|
+
[Auth](/v4/guides/auth/#authstate).
|
|
382
|
+
|
|
383
|
+
`authState()` returns the same object until the status, the principal or
|
|
384
|
+
`expiresAt` changes. `subscribe` calls the listener once per such change,
|
|
385
|
+
including a session that ends by the clock, and does nothing on a disposed
|
|
386
|
+
client.
|
|
387
|
+
|
|
388
|
+
The client keeps one agent per principal, and a call goes out as the principal
|
|
389
|
+
that was current when it was made, or not at all. A read started for the
|
|
390
|
+
previous caller is cancelled (`cancelled`, code `caller_changed`) instead of
|
|
391
|
+
being sent as the new one. See [Auth](/v4/guides/auth/) for what that means for
|
|
392
|
+
the cache.
|
|
393
|
+
|
|
394
|
+
`client.signIn(options)` and `client.signOut(options)` go to the auth, with
|
|
395
|
+
the options passed on. They reject with a `TypeError` on a client built with an
|
|
396
|
+
`identity`, and with an `Error` on a server and after `dispose()`.
|
|
397
|
+
|
|
398
|
+
## Canisters
|
|
399
|
+
|
|
400
|
+
`client.canister<Actor>(actor, target)` returns a frozen object with one async
|
|
401
|
+
method per Candid method.
|
|
402
|
+
|
|
403
|
+
```ts
|
|
404
|
+
import { createClient } from "@ic-reactor/core"
|
|
405
|
+
import { actor, type Actor } from "./generated/icrc1"
|
|
406
|
+
|
|
407
|
+
const client = createClient({ network: "ic", identity: "anonymous" })
|
|
408
|
+
const ledger = client.canister<Actor>(actor, {
|
|
409
|
+
id: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
410
|
+
})
|
|
411
|
+
|
|
412
|
+
const symbol = await ledger.icrc1_symbol()
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
- The same service and target give the same object every time, so it is safe
|
|
416
|
+
to call in a render.
|
|
417
|
+
- `<Actor>` is not checked against `actor`. Pass the `Actor` of the same
|
|
418
|
+
generated module.
|
|
419
|
+
- It throws a `TypeError` for a schema that is not a service, a target of the
|
|
420
|
+
wrong shape, or an `id` that is not principal text.
|
|
421
|
+
- A method resolves with the value `Actor` types. The exception is a method
|
|
422
|
+
whose single result is a `variant { Ok : T; Err : E }`: it resolves with the
|
|
423
|
+
`Ok` value and rejects as `canister_err` with the `Err` value in `err`.
|
|
424
|
+
- A method sends its call as the caller signed in when it is called. A
|
|
425
|
+
write by a caller who is not signed in rejects as `unauthenticated` and
|
|
426
|
+
sends nothing.
|
|
427
|
+
|
|
428
|
+
### Targets
|
|
429
|
+
|
|
430
|
+
A target is `{ id }` or `{ name }`, plus an optional `certified`:
|
|
431
|
+
|
|
432
|
+
- `{ id: "ryjl3-tyaaa-aaaaa-aaaba-cai" }` names the canister.
|
|
433
|
+
- `{ name: "backend" }` reads the id from the `ic_env` cookie when a call or a
|
|
434
|
+
key is built, and only where the cookie is trusted. If it cannot, every call
|
|
435
|
+
rejects as `invalid_args` with code `canister_id_unresolved`, and the keys
|
|
436
|
+
carry `"$unresolved:backend"`.
|
|
437
|
+
`client.canisterId({ name: "backend" })` asks the same resolver without a
|
|
438
|
+
call: `{ ok: true, id }`, or `{ ok: false, reason, message }` where
|
|
439
|
+
`reason` is `"no_browser"` (no page, so no cookie), `"untrusted_host"` (the
|
|
440
|
+
cookie is not trusted for this network) or `"absent"` (no principal text
|
|
441
|
+
under that name), and `message` is the resolver's reason, which a call's
|
|
442
|
+
error includes after the method and target. It
|
|
443
|
+
reads the cookie on each call, and does not check that a canister answers
|
|
444
|
+
at that id.
|
|
445
|
+
- `certified: true` makes another canister object whose query methods go as
|
|
446
|
+
replicated calls, with certified replies. See [Reads](/v4/guides/reads/).
|
|
447
|
+
|
|
448
|
+
### Re-sends
|
|
449
|
+
|
|
450
|
+
A direct call re-sends itself only when the failure shows it is safe. An update
|
|
451
|
+
is re-sent after a reject code 2 or an HTTP 429, at most twice, and never from
|
|
452
|
+
the management canister. A direct read is re-sent after a retryable failure, at
|
|
453
|
+
most twice. Everything else is final. [Writes](/v4/guides/writes/) has the
|
|
454
|
+
rules; direct calls never touch a cache.
|
|
455
|
+
|
|
456
|
+
### The management canister
|
|
457
|
+
|
|
458
|
+
The management canister, `aaaaa-aa`, works with a module generated from its
|
|
459
|
+
`.did`: `client.canister<Actor>(actor, { id: "aaaaa-aa" })`. The client takes
|
|
460
|
+
the effective canister id from the call's arguments. A call that cannot be
|
|
461
|
+
routed rejects as `invalid_args` with code `effective_canister_id_unknown`.
|
|
462
|
+
|
|
463
|
+
### Function references
|
|
464
|
+
|
|
465
|
+
Some replies carry a function reference: an ICRC ledger's `query_blocks` names
|
|
466
|
+
an archive canister and a method for each older range. `client.func` turns one
|
|
467
|
+
into an async function. It takes the generated schema of the func type and the
|
|
468
|
+
reference, and it follows the same caller rules and the same errors as a
|
|
469
|
+
canister's methods.
|
|
470
|
+
|
|
471
|
+
```ts
|
|
472
|
+
import { client } from "./ledger"
|
|
473
|
+
import {
|
|
474
|
+
QueryArchiveFn,
|
|
475
|
+
type ArchivedBlocksRange,
|
|
476
|
+
type BlockRange,
|
|
477
|
+
type GetBlocksArgs,
|
|
478
|
+
} from "./generated/icp_ledger"
|
|
479
|
+
|
|
480
|
+
type ReadArchive = (arg: GetBlocksArgs) => Promise<BlockRange>
|
|
481
|
+
|
|
482
|
+
export async function readRange(range: ArchivedBlocksRange) {
|
|
483
|
+
const read = client.func<ReadArchive>(QueryArchiveFn, range.callback)
|
|
484
|
+
return read({ start: range.start, length: range.length })
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
A generated func type carries no signature, so you write the one the `.did`
|
|
489
|
+
gives, with the `Ok` payload as the result. The type argument is not checked.
|
|
490
|
+
The [ICRC-1 ledger example](/v4/examples/icrc-ledger/) does this in
|
|
491
|
+
`src/blocks.ts`.
|
|
492
|
+
|
|
493
|
+
## Dispose
|
|
494
|
+
|
|
495
|
+
`client.dispose()` releases everything the client holds. It stops listening to
|
|
496
|
+
the auth and disposes it, clears the `QueryClient`, and drops the agents. Calling
|
|
497
|
+
it again does nothing.
|
|
498
|
+
|
|
499
|
+
Afterwards every call on the client rejects as `cancelled` with code
|
|
500
|
+
`client_disposed` and `mayHaveExecuted: false`, and sends nothing. That covers a
|
|
501
|
+
direct call, a query function, a mutation function and a func reference. A
|
|
502
|
+
direct call that was already sent settles as the replica answers.
|
|
503
|
+
|
|
504
|
+
A client a `ReactorProvider` built from its factory is disposed when the
|
|
505
|
+
provider unmounts. A client made outside a provider, or kept across its
|
|
506
|
+
unmount, is the app's to dispose when it is done with it. A client that lives
|
|
507
|
+
as long as the page needs none.
|
|
508
|
+
|
|
509
|
+
## One client per tab, one per request
|
|
510
|
+
|
|
511
|
+
- In a browser, build one client per tab.
|
|
512
|
+
- On a server, build one client **per request**. A client's cache and agents
|
|
513
|
+
belong to whoever it calls as, so a module-scope client on a server is shared
|
|
514
|
+
by every request.
|
|
515
|
+
- Never build a client per render.
|
|
516
|
+
|
|
517
|
+
In React, `<ReactorProvider client={() => createClient(...)}>` builds the client
|
|
518
|
+
once per mounted tree and disposes it on unmount. A module-scope client passed
|
|
519
|
+
as `client={() => client}` is borrowed, and never disposed. See
|
|
520
|
+
[@ic-reactor/react](/v4/packages/react/).
|
|
521
|
+
|
|
522
|
+
In Next.js, React's `cache` gives one client per request:
|
|
523
|
+
|
|
524
|
+
```ts
|
|
525
|
+
import { createClient } from "@ic-reactor/core"
|
|
526
|
+
import { cache } from "react"
|
|
527
|
+
|
|
528
|
+
export const requestClient = cache(() =>
|
|
529
|
+
createClient({ network: "ic", identity: "anonymous" })
|
|
530
|
+
)
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
[SSR and hydration](/v4/guides/ssr/) has the rest.
|
|
534
|
+
|
|
535
|
+
## Reading the client
|
|
536
|
+
|
|
537
|
+
Two properties are worth knowing:
|
|
538
|
+
|
|
539
|
+
- `client.network` is the network's key segment, as in the table above.
|
|
540
|
+
- `client.queryClient` is the `QueryClient` the client owns. Its default `retry`
|
|
541
|
+
retries a `ReactorError` only after a failure that proves it was not
|
|
542
|
+
delivered, and any other error (an app's own REST query on it) as TanStack
|
|
543
|
+
Query does by default: up to 3 times. Neither is retried on a server. Use it
|
|
544
|
+
for the app's other queries too, one `QueryClient` per tree; a write
|
|
545
|
+
invalidates its reads on the `QueryClient` it ran on and on this one, and
|
|
546
|
+
`dispose()` clears every query on it. Its dehydrate and hydrate defaults keep `bigint`,
|
|
547
|
+
`Uint8Array` and the floats JSON cannot write, so a server's `dehydrate()`
|
|
548
|
+
survives `JSON.stringify` and comes back exact.
|
|
549
|
+
|
|
550
|
+
The next pages use the client: [Values and units](/v4/guides/values/),
|
|
551
|
+
[Reads](/v4/guides/reads/) and [Writes](/v4/guides/writes/).
|