@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.
Files changed (1041) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.yml +77 -0
  4. package/.github/actions/setup-rust-wasm/action.yml +25 -0
  5. package/.github/dependabot.yml +107 -0
  6. package/.github/workflows/auth-latest.yml +67 -0
  7. package/.github/workflows/b3pay-site.yml +49 -0
  8. package/.github/workflows/ci.yml +430 -0
  9. package/.github/workflows/codeql.yml +41 -0
  10. package/.github/workflows/dependency-review.yml +68 -0
  11. package/.github/workflows/docs-check.yml +98 -0
  12. package/.github/workflows/docs.yml +265 -0
  13. package/.github/workflows/e2e.yml +90 -0
  14. package/.github/workflows/examples-published.yml +97 -0
  15. package/.github/workflows/release.yml +326 -0
  16. package/.husky/pre-commit +12 -0
  17. package/.prettierignore +109 -0
  18. package/.prettierrc +6 -0
  19. package/AGENTS.md +103 -0
  20. package/CHANGELOG.md +3268 -0
  21. package/CLAUDE.md +93 -0
  22. package/CNAME +1 -0
  23. package/CODE_OF_CONDUCT.md +7 -0
  24. package/CONTRIBUTING.md +433 -0
  25. package/LICENSE +21 -0
  26. package/README.md +2 -2
  27. package/SECURITY.md +74 -0
  28. package/b3pay-module.json +194 -0
  29. package/docs/.remarkrc.json +10 -0
  30. package/docs/README.md +64 -0
  31. package/docs/astro.config.mjs +205 -0
  32. package/docs/favicon.svg +15 -0
  33. package/docs/package.json +39 -0
  34. package/docs/public/favicon.svg +15 -0
  35. package/docs/public/ic-reactor-social-card.png +0 -0
  36. package/docs/scripts/b3pay-static.mjs +22 -0
  37. package/docs/scripts/check-example-docs.mjs +214 -0
  38. package/docs/scripts/check-links.mjs +212 -0
  39. package/docs/scripts/fix-dist-links.js +125 -0
  40. package/docs/scripts/fix-frontmatter.js +71 -0
  41. package/docs/scripts/remove-redundant-h1.cjs +48 -0
  42. package/docs/scripts/rewrite-typedoc-links.js +110 -0
  43. package/docs/scripts/split-index.js +69 -0
  44. package/docs/src/assets/ic-reactor-hero-dark.svg +23 -0
  45. package/docs/src/assets/ic-reactor-hero-light.svg +23 -0
  46. package/docs/src/assets/ic-reactor-lockup-dark.svg +15 -0
  47. package/docs/src/assets/ic-reactor-lockup-light.svg +15 -0
  48. package/docs/src/assets/ic-reactor-mark-dark.svg +14 -0
  49. package/docs/src/assets/ic-reactor-mark-light.svg +14 -0
  50. package/docs/src/assets/layers/candid-core-layer-icon-dark.svg +4 -0
  51. package/docs/src/assets/layers/candid-core-layer-icon-light.svg +4 -0
  52. package/docs/src/assets/layers/candid-profile-layer-icon-dark.svg +4 -0
  53. package/docs/src/assets/layers/candid-profile-layer-icon-light.svg +4 -0
  54. package/docs/src/assets/layers/ic-reactor-layer-icon-dark.svg +4 -0
  55. package/docs/src/assets/layers/ic-reactor-layer-icon-light.svg +4 -0
  56. package/docs/src/components/LibraryCards.astro +172 -0
  57. package/docs/src/components/LibraryIcon.astro +28 -0
  58. package/docs/src/components/SiteTitle.astro +241 -0
  59. package/docs/src/content/docs/404.mdx +19 -0
  60. package/docs/src/content/docs/build/agent-tools.mdx +593 -0
  61. package/docs/src/content/docs/build/icrc1-wallet.mdx +619 -0
  62. package/docs/src/content/docs/build/ssr-per-user.mdx +552 -0
  63. package/docs/src/content/docs/examples/canister-studio.mdx +95 -0
  64. package/docs/src/content/docs/examples/icrc-ledger.mdx +45 -0
  65. package/docs/src/content/docs/examples/index.mdx +38 -0
  66. package/docs/src/content/docs/examples/next-ssr.mdx +73 -0
  67. package/docs/src/content/docs/examples/node-agent-tool.mdx +80 -0
  68. package/docs/src/content/docs/examples/vite-wallet.mdx +71 -0
  69. package/docs/src/content/docs/guides/auth.mdx +1181 -0
  70. package/docs/src/content/docs/guides/client.mdx +551 -0
  71. package/docs/src/content/docs/guides/deploy.mdx +180 -0
  72. package/docs/src/content/docs/guides/errors.mdx +475 -0
  73. package/docs/src/content/docs/guides/getting-started.mdx +620 -0
  74. package/docs/src/content/docs/guides/reads.mdx +586 -0
  75. package/docs/src/content/docs/guides/ssr.mdx +529 -0
  76. package/docs/src/content/docs/guides/testing.mdx +401 -0
  77. package/docs/src/content/docs/guides/values.mdx +261 -0
  78. package/docs/src/content/docs/guides/vite-plugin.mdx +690 -0
  79. package/docs/src/content/docs/guides/writes.mdx +572 -0
  80. package/docs/src/content/docs/ic-reactor/index.mdx +167 -0
  81. package/docs/src/content/docs/index.mdx +65 -0
  82. package/docs/src/content/docs/migrating-from-3.mdx +535 -0
  83. package/docs/src/content/docs/packages/core.mdx +186 -0
  84. package/docs/src/content/docs/packages/mcp.mdx +163 -0
  85. package/docs/src/content/docs/packages/react.mdx +207 -0
  86. package/docs/src/content/docs/packages/vite-plugin.mdx +73 -0
  87. package/docs/src/content/docs/versioning.mdx +104 -0
  88. package/docs/src/content.config.ts +7 -0
  89. package/docs/src/styles/custom.css +189 -0
  90. package/docs/tsconfig.typedoc.json +26 -0
  91. package/docs/typedoc-entry.ts +17 -0
  92. package/docs/typedoc.json +37 -0
  93. package/e2e/Cargo.lock +646 -0
  94. package/e2e/Cargo.toml +3 -0
  95. package/e2e/README.md +101 -0
  96. package/e2e/frontends/build.mjs +94 -0
  97. package/e2e/frontends/index.html +10 -0
  98. package/e2e/global-setup.ts +65 -0
  99. package/e2e/icp.yaml +38 -0
  100. package/e2e/package.json +40 -0
  101. package/e2e/setup.ts +6 -0
  102. package/e2e/src/actor/Cargo.toml +14 -0
  103. package/e2e/src/actor/hello_actor.did +10 -0
  104. package/e2e/src/actor/src/lib.rs +73 -0
  105. package/e2e/src/calls.test.ts +132 -0
  106. package/e2e/src/declarations/hello_actor.envelope.json +175 -0
  107. package/e2e/src/declarations/hello_actor.ts +15 -0
  108. package/e2e/src/errors.test.ts +107 -0
  109. package/e2e/src/frontend-headers.test.ts +253 -0
  110. package/e2e/src/identity.test.ts +61 -0
  111. package/e2e/src/react.test.tsx +59 -0
  112. package/e2e/src/replica.ts +70 -0
  113. package/e2e/src/vite-env.test.ts +108 -0
  114. package/e2e/test.sh +47 -0
  115. package/e2e/tsconfig.json +20 -0
  116. package/e2e/tsconfig.typecheck.json +9 -0
  117. package/e2e/vitest.config.ts +22 -0
  118. package/eslint.config.mjs +100 -0
  119. package/evals/PREREGISTRATION.md +1346 -0
  120. package/evals/README.md +756 -0
  121. package/evals/conditions/thin/condition.json +8 -0
  122. package/evals/conditions/thin/docs/candid-core-cli.README.md +90 -0
  123. package/evals/conditions/thin/docs/candid-core-schema.README.md +339 -0
  124. package/evals/conditions/thin/package.json +25 -0
  125. package/evals/conditions/thin/starter/src/generated/icrc1.ts +57 -0
  126. package/evals/conditions/thin-guide/condition.json +10 -0
  127. package/evals/conditions/thin-guide/docs/llms.txt +292 -0
  128. package/evals/conditions/v3/condition.json +9 -0
  129. package/evals/conditions/v3/docs/ic-reactor-core.llms.txt +232 -0
  130. package/evals/conditions/v3/docs/ic-reactor-react.llms.txt +280 -0
  131. package/evals/conditions/v3/docs/llms-full.txt +1053 -0
  132. package/evals/conditions/v3/package.json +26 -0
  133. package/evals/conditions/v3/starter/src/declarations/icrc1.did.d.ts +95 -0
  134. package/evals/conditions/v3/starter/src/declarations/icrc1.did.js +140 -0
  135. package/evals/conditions/v4/PORTING.md +384 -0
  136. package/evals/conditions/v4/README.md +106 -0
  137. package/evals/conditions/v4/condition.json +5 -0
  138. package/evals/conditions/v4/docs/llms.txt +323 -0
  139. package/evals/conditions/v4/package.json +27 -0
  140. package/evals/conditions/v4/starter/src/generated/icrc1.ts +78 -0
  141. package/evals/conditions/v4-proto/condition.json +6 -0
  142. package/evals/conditions/v4-proto/docs/llms.txt +291 -0
  143. package/evals/conditions/v4-proto/lib/SHIM-NOTES.md +20 -0
  144. package/evals/conditions/v4-proto/lib/package.json +27 -0
  145. package/evals/conditions/v4-proto/lib/src/client.ts +471 -0
  146. package/evals/conditions/v4-proto/lib/src/errors.ts +214 -0
  147. package/evals/conditions/v4-proto/lib/src/index.ts +36 -0
  148. package/evals/conditions/v4-proto/lib/src/principal.ts +175 -0
  149. package/evals/conditions/v4-proto/lib/src/service.ts +69 -0
  150. package/evals/conditions/v4-proto/lib/src/types.ts +174 -0
  151. package/evals/conditions/v4-proto/lib/test/runtime.test.ts +170 -0
  152. package/evals/conditions/v4-proto/lib/test/tsconfig.json +10 -0
  153. package/evals/conditions/v4-proto/lib/test/types.test-d.ts +145 -0
  154. package/evals/conditions/v4-proto/lib/test/vitest.config.mjs +8 -0
  155. package/evals/conditions/v4-proto/lib/tsconfig.json +17 -0
  156. package/evals/conditions/v4-proto/package.json +26 -0
  157. package/evals/conditions/v4-proto/starter/src/generated/icrc1.service.ts +19 -0
  158. package/evals/conditions/v4-proto/starter/src/generated/icrc1.ts +57 -0
  159. package/evals/drive.mjs +1221 -0
  160. package/evals/gate.mjs +161 -0
  161. package/evals/harness/aggregate.mjs +534 -0
  162. package/evals/harness/aggregate.test.mjs +344 -0
  163. package/evals/harness/assemble.mjs +216 -0
  164. package/evals/harness/assemble.test.mjs +143 -0
  165. package/evals/harness/auth.mjs +91 -0
  166. package/evals/harness/check-docs.mjs +157 -0
  167. package/evals/harness/declarations/icrc1.did.d.ts +95 -0
  168. package/evals/harness/declarations/icrc1.did.js +140 -0
  169. package/evals/harness/drive-auth.test.mjs +584 -0
  170. package/evals/harness/drive.test.mjs +509 -0
  171. package/evals/harness/fake-auth.ts +67 -0
  172. package/evals/harness/fake-ledger.ts +178 -0
  173. package/evals/harness/gate-plan.mjs +104 -0
  174. package/evals/harness/gate-plan.test.mjs +243 -0
  175. package/evals/harness/icrc1.did +88 -0
  176. package/evals/harness/judge.mjs +63 -0
  177. package/evals/harness/judge.test.mjs +81 -0
  178. package/evals/harness/leak-scan.mjs +1373 -0
  179. package/evals/harness/leak-scan.test.mjs +1300 -0
  180. package/evals/harness/probes/amounts.ts +14 -0
  181. package/evals/harness/probes/node-tool.probe.ts +48 -0
  182. package/evals/harness/probes/probe.mjs +149 -0
  183. package/evals/harness/probes/react-wallet.probe.ts +96 -0
  184. package/evals/harness/public/support/auth.ts +38 -0
  185. package/evals/harness/public/support/fake-replica.d.ts +28 -0
  186. package/evals/harness/public/support/fake-replica.js +434 -0
  187. package/evals/harness/public/support/ledger.idl.d.ts +95 -0
  188. package/evals/harness/public/support/ledger.idl.js +140 -0
  189. package/evals/harness/public/support/world.ts +179 -0
  190. package/evals/harness/runs.mjs +139 -0
  191. package/evals/harness/sandbox.mjs +88 -0
  192. package/evals/harness/sandbox.test.mjs +134 -0
  193. package/evals/harness/ship.mjs +264 -0
  194. package/evals/harness/ship.test.mjs +552 -0
  195. package/evals/harness/world.ts +291 -0
  196. package/evals/package.json +26 -0
  197. package/evals/pnpm-lock.yaml +1537 -0
  198. package/evals/pnpm-workspace.yaml +12 -0
  199. package/evals/results/2026-09-30T14-22-05-924Z/pilot.json +384 -0
  200. package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.json +404 -0
  201. package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.rescored.json +404 -0
  202. package/evals/results/2026-09-30T14-22-05-924Z/plan.json +240 -0
  203. package/evals/results/2026-09-30T14-22-05-924Z/summary.json +1800 -0
  204. package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.json +1843 -0
  205. package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.rescored.json +2100 -0
  206. package/evals/results/2026-09-30T15-48-23-343Z/pilot.json +404 -0
  207. package/evals/results/2026-09-30T15-48-23-343Z/pilot.rescored.json +404 -0
  208. package/evals/results/2026-09-30T15-48-23-343Z/plan.json +242 -0
  209. package/evals/results/2026-09-30T15-48-23-343Z/summary.json +1843 -0
  210. package/evals/results/2026-09-30T15-48-23-343Z/summary.rescored.json +2195 -0
  211. package/evals/results/2026-10-03-beta1-gate/pilot.json +162 -0
  212. package/evals/results/2026-10-03-beta1-gate/plan.json +141 -0
  213. package/evals/results/2026-10-03-beta1-gate/summary.json +983 -0
  214. package/evals/results/2026-10-05-ga-gate/contaminated-run.json +55 -0
  215. package/evals/results/2026-10-05-ga-gate/pilot.json +162 -0
  216. package/evals/results/2026-10-05-ga-gate/plan.json +457 -0
  217. package/evals/results/2026-10-05-ga-gate/summary.json +1037 -0
  218. package/evals/results/2026-10-05-ga-gate/summary.rescanned.json +1037 -0
  219. package/evals/results/README.md +31 -0
  220. package/evals/runs-pilot.log +150 -0
  221. package/evals/runs-pilot2.log +150 -0
  222. package/evals/score.mjs +256 -0
  223. package/evals/setup.mjs +547 -0
  224. package/evals/tasks/node-tool/faulty/thin-accepts-exponent/meta.json +5 -0
  225. package/evals/tasks/node-tool/faulty/thin-accepts-exponent/src/index.ts +121 -0
  226. package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/meta.json +5 -0
  227. package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/src/index.ts +116 -0
  228. package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/meta.json +9 -0
  229. package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/src/index.ts +118 -0
  230. package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/meta.json +5 -0
  231. package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/src/index.ts +118 -0
  232. package/evals/tasks/node-tool/faulty/thin-ignores-root-key/meta.json +5 -0
  233. package/evals/tasks/node-tool/faulty/thin-ignores-root-key/src/index.ts +117 -0
  234. package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/meta.json +9 -0
  235. package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/src/index.ts +119 -0
  236. package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/meta.json +9 -0
  237. package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/src/index.ts +118 -0
  238. package/evals/tasks/node-tool/faulty/thin-number-amount/meta.json +10 -0
  239. package/evals/tasks/node-tool/faulty/thin-number-amount/src/index.ts +117 -0
  240. package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/meta.json +5 -0
  241. package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/src/index.ts +120 -0
  242. package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/meta.json +5 -0
  243. package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/src/index.ts +118 -0
  244. package/evals/tasks/node-tool/faulty/v3-retry-call-errors/meta.json +11 -0
  245. package/evals/tasks/node-tool/faulty/v3-retry-call-errors/src/index.ts +149 -0
  246. package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/meta.json +5 -0
  247. package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/src/index.ts +71 -0
  248. package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/meta.json +9 -0
  249. package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/src/index.ts +84 -0
  250. package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/meta.json +9 -0
  251. package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/src/index.ts +72 -0
  252. package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/meta.json +5 -0
  253. package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/src/index.ts +72 -0
  254. package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/meta.json +5 -0
  255. package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/src/index.ts +84 -0
  256. package/evals/tasks/node-tool/hidden/node-tool.test.ts +312 -0
  257. package/evals/tasks/node-tool/prompt.md +55 -0
  258. package/evals/tasks/node-tool/prompt.minimal.md +30 -0
  259. package/evals/tasks/node-tool/solutions/thin/reference/src/index.ts +118 -0
  260. package/evals/tasks/node-tool/solutions/thin/reference-module-scope/src/index.ts +145 -0
  261. package/evals/tasks/node-tool/solutions/thin-guide/reference/src/index.ts +118 -0
  262. package/evals/tasks/node-tool/solutions/thin-guide/reference-module-scope/src/index.ts +145 -0
  263. package/evals/tasks/node-tool/solutions/v3/reference/src/index.ts +140 -0
  264. package/evals/tasks/node-tool/solutions/v3/reference-module-scope/src/index.ts +153 -0
  265. package/evals/tasks/node-tool/solutions/v4/reference/src/index.ts +84 -0
  266. package/evals/tasks/node-tool/solutions/v4/reference-module-scope/src/index.ts +105 -0
  267. package/evals/tasks/node-tool/solutions/v4-proto/reference/src/index.ts +72 -0
  268. package/evals/tasks/node-tool/solutions/v4-proto/reference-module-scope/src/index.ts +87 -0
  269. package/evals/tasks/node-tool/starter/src/contract.ts +31 -0
  270. package/evals/tasks/node-tool/starter/src/index.ts +7 -0
  271. package/evals/tasks/node-tool/starter/test/smoke.test.ts +22 -0
  272. package/evals/tasks/node-tool/starter/tsconfig.json +17 -0
  273. package/evals/tasks/node-tool/task.json +63 -0
  274. package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/meta.json +5 -0
  275. package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/src/Wallet.tsx +216 -0
  276. package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/meta.json +5 -0
  277. package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/src/Wallet.tsx +212 -0
  278. package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/meta.json +5 -0
  279. package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/src/Wallet.tsx +210 -0
  280. package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/meta.json +8 -0
  281. package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/src/Wallet.tsx +213 -0
  282. package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/meta.json +9 -0
  283. package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/src/Wallet.tsx +213 -0
  284. package/evals/tasks/react-wallet/faulty/thin-number-balance/meta.json +5 -0
  285. package/evals/tasks/react-wallet/faulty/thin-number-balance/src/Wallet.tsx +213 -0
  286. package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/meta.json +5 -0
  287. package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/src/Wallet.tsx +254 -0
  288. package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/meta.json +5 -0
  289. package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/src/Wallet.tsx +215 -0
  290. package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/meta.json +5 -0
  291. package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/src/Wallet.tsx +214 -0
  292. package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/meta.json +5 -0
  293. package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/src/Wallet.tsx +224 -0
  294. package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/meta.json +12 -0
  295. package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/src/Wallet.tsx +225 -0
  296. package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/meta.json +11 -0
  297. package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/src/Wallet.tsx +182 -0
  298. package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/meta.json +5 -0
  299. package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/src/Wallet.tsx +160 -0
  300. package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/meta.json +5 -0
  301. package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/src/Wallet.tsx +166 -0
  302. package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/meta.json +5 -0
  303. package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/src/Wallet.tsx +161 -0
  304. package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/meta.json +5 -0
  305. package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/src/Wallet.tsx +163 -0
  306. package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/meta.json +12 -0
  307. package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/src/Wallet.tsx +162 -0
  308. package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/meta.json +5 -0
  309. package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/src/Wallet.tsx +163 -0
  310. package/evals/tasks/react-wallet/faulty/v4-retry-spread/meta.json +12 -0
  311. package/evals/tasks/react-wallet/faulty/v4-retry-spread/src/Wallet.tsx +163 -0
  312. package/evals/tasks/react-wallet/faulty/v4-status-not-idle/meta.json +5 -0
  313. package/evals/tasks/react-wallet/faulty/v4-status-not-idle/src/Wallet.tsx +162 -0
  314. package/evals/tasks/react-wallet/hidden/react-wallet.test.ts +536 -0
  315. package/evals/tasks/react-wallet/prompt.md +88 -0
  316. package/evals/tasks/react-wallet/prompt.minimal.md +51 -0
  317. package/evals/tasks/react-wallet/solutions/thin/reference/src/Wallet.tsx +213 -0
  318. package/evals/tasks/react-wallet/solutions/thin/reference-module-scope/src/Wallet.tsx +227 -0
  319. package/evals/tasks/react-wallet/solutions/thin-guide/reference/src/Wallet.tsx +213 -0
  320. package/evals/tasks/react-wallet/solutions/thin-guide/reference-module-scope/src/Wallet.tsx +227 -0
  321. package/evals/tasks/react-wallet/solutions/v3/reference/src/Wallet.tsx +224 -0
  322. package/evals/tasks/react-wallet/solutions/v3/reference-module-scope/src/Wallet.tsx +230 -0
  323. package/evals/tasks/react-wallet/solutions/v4/reference/src/Wallet.tsx +160 -0
  324. package/evals/tasks/react-wallet/solutions/v4/reference-module-scope/src/Wallet.tsx +178 -0
  325. package/evals/tasks/react-wallet/solutions/v4-proto/reference/src/Wallet.tsx +161 -0
  326. package/evals/tasks/react-wallet/solutions/v4-proto/reference-module-scope/src/Wallet.tsx +161 -0
  327. package/evals/tasks/react-wallet/starter/src/Wallet.tsx +12 -0
  328. package/evals/tasks/react-wallet/starter/src/auth.ts +16 -0
  329. package/evals/tasks/react-wallet/starter/src/config.ts +14 -0
  330. package/evals/tasks/react-wallet/starter/src/ii-auth.ts +43 -0
  331. package/evals/tasks/react-wallet/starter/src/main.tsx +15 -0
  332. package/evals/tasks/react-wallet/starter/test/smoke.test.ts +34 -0
  333. package/evals/tasks/react-wallet/starter/tsconfig.json +18 -0
  334. package/evals/tasks/react-wallet/task.json +84 -0
  335. package/examples/canister-studio/.stackblitzrc +4 -0
  336. package/examples/canister-studio/README.md +183 -0
  337. package/examples/canister-studio/did/ckbtc_minter.did +806 -0
  338. package/examples/canister-studio/did/icp_ledger.did +586 -0
  339. package/examples/canister-studio/did/icrc1.did +88 -0
  340. package/examples/canister-studio/package.json +45 -0
  341. package/examples/canister-studio/scripts/smoke.ts +188 -0
  342. package/examples/canister-studio/src/calls/CacheKeyPanel.tsx +104 -0
  343. package/examples/canister-studio/src/calls/ConfirmWrite.tsx +265 -0
  344. package/examples/canister-studio/src/calls/ErrorPanel.test.tsx +113 -0
  345. package/examples/canister-studio/src/calls/ErrorPanel.tsx +214 -0
  346. package/examples/canister-studio/src/calls/MethodRunner.test.tsx +354 -0
  347. package/examples/canister-studio/src/calls/MethodRunner.tsx +57 -0
  348. package/examples/canister-studio/src/calls/ReadRunner.tsx +244 -0
  349. package/examples/canister-studio/src/calls/ResendPanel.tsx +165 -0
  350. package/examples/canister-studio/src/calls/ShareLink.tsx +59 -0
  351. package/examples/canister-studio/src/calls/WriteRunner.test.tsx +678 -0
  352. package/examples/canister-studio/src/calls/WriteRunner.tsx +670 -0
  353. package/examples/canister-studio/src/calls/dedupe.ts +189 -0
  354. package/examples/canister-studio/src/calls/error-info.ts +168 -0
  355. package/examples/canister-studio/src/calls/history.test.ts +284 -0
  356. package/examples/canister-studio/src/calls/history.ts +287 -0
  357. package/examples/canister-studio/src/calls/kinds.ts +68 -0
  358. package/examples/canister-studio/src/calls/prepare.ts +32 -0
  359. package/examples/canister-studio/src/calls/query-options.ts +30 -0
  360. package/examples/canister-studio/src/calls/read.ts +47 -0
  361. package/examples/canister-studio/src/calls/readback.ts +100 -0
  362. package/examples/canister-studio/src/calls/record.ts +123 -0
  363. package/examples/canister-studio/src/calls/safe-calls.test.ts +299 -0
  364. package/examples/canister-studio/src/calls/share.ts +46 -0
  365. package/examples/canister-studio/src/calls/testing/doubles.tsx +108 -0
  366. package/examples/canister-studio/src/calls/testing/fixtures.ts +185 -0
  367. package/examples/canister-studio/src/calls/useCanisterHandle.ts +35 -0
  368. package/examples/canister-studio/src/canisters/ckbtc_minter.envelope.json +4228 -0
  369. package/examples/canister-studio/src/canisters/ckbtc_minter.ts +868 -0
  370. package/examples/canister-studio/src/canisters/icp_ledger.envelope.json +3454 -0
  371. package/examples/canister-studio/src/canisters/icp_ledger.ts +584 -0
  372. package/examples/canister-studio/src/canisters/icrc1.envelope.json +840 -0
  373. package/examples/canister-studio/src/canisters/icrc1.ts +78 -0
  374. package/examples/canister-studio/src/components/ActionButton.tsx +32 -0
  375. package/examples/canister-studio/src/components/AppHeader.tsx +83 -0
  376. package/examples/canister-studio/src/components/AppShell.tsx +29 -0
  377. package/examples/canister-studio/src/components/AuthButton.tsx +79 -0
  378. package/examples/canister-studio/src/components/Badge.tsx +79 -0
  379. package/examples/canister-studio/src/components/CanisterHeader.tsx +200 -0
  380. package/examples/canister-studio/src/components/CanisterJump.tsx +130 -0
  381. package/examples/canister-studio/src/components/Card.tsx +64 -0
  382. package/examples/canister-studio/src/components/Code.tsx +101 -0
  383. package/examples/canister-studio/src/components/CopyButton.tsx +126 -0
  384. package/examples/canister-studio/src/components/Disclosure.tsx +34 -0
  385. package/examples/canister-studio/src/components/EmptyState.tsx +34 -0
  386. package/examples/canister-studio/src/components/MethodList.test.tsx +137 -0
  387. package/examples/canister-studio/src/components/MethodList.tsx +244 -0
  388. package/examples/canister-studio/src/components/Notice.tsx +36 -0
  389. package/examples/canister-studio/src/components/ProvenanceBadge.tsx +44 -0
  390. package/examples/canister-studio/src/components/RouteError.tsx +42 -0
  391. package/examples/canister-studio/src/components/SectionBoundary.tsx +76 -0
  392. package/examples/canister-studio/src/components/Spinner.tsx +33 -0
  393. package/examples/canister-studio/src/components/Tabs.tsx +96 -0
  394. package/examples/canister-studio/src/components/canister/CanisterLoadFailure.test.tsx +56 -0
  395. package/examples/canister-studio/src/components/canister/CanisterLoadFailure.tsx +165 -0
  396. package/examples/canister-studio/src/components/canister/CanisterNotFound.tsx +59 -0
  397. package/examples/canister-studio/src/components/canister/CanisterPending.tsx +33 -0
  398. package/examples/canister-studio/src/components/canister/MethodOverview.tsx +93 -0
  399. package/examples/canister-studio/src/components/canister/MethodWorkspace.test.tsx +201 -0
  400. package/examples/canister-studio/src/components/canister/MethodWorkspace.tsx +187 -0
  401. package/examples/canister-studio/src/components/canister/shared-call.test.ts +186 -0
  402. package/examples/canister-studio/src/components/canister/shared-call.ts +133 -0
  403. package/examples/canister-studio/src/components/canister/shared-link-loader.test.ts +116 -0
  404. package/examples/canister-studio/src/components/canister/use-canister-page.ts +44 -0
  405. package/examples/canister-studio/src/components/canister/workspace-key.test.ts +27 -0
  406. package/examples/canister-studio/src/components/canister/workspace-key.ts +36 -0
  407. package/examples/canister-studio/src/components/canister-id-input.ts +69 -0
  408. package/examples/canister-studio/src/components/canister-names.ts +11 -0
  409. package/examples/canister-studio/src/components/download.ts +34 -0
  410. package/examples/canister-studio/src/components/fallbacks.tsx +33 -0
  411. package/examples/canister-studio/src/components/helpers.test.ts +107 -0
  412. package/examples/canister-studio/src/components/history/HistoryList.tsx +284 -0
  413. package/examples/canister-studio/src/components/home/FeaturedLedger.tsx +149 -0
  414. package/examples/canister-studio/src/components/home/OpenCanister.tsx +99 -0
  415. package/examples/canister-studio/src/components/home/featured.test.tsx +92 -0
  416. package/examples/canister-studio/src/components/home/featured.ts +64 -0
  417. package/examples/canister-studio/src/components/interface/CandidTab.tsx +38 -0
  418. package/examples/canister-studio/src/components/interface/CompatReport.tsx +92 -0
  419. package/examples/canister-studio/src/components/interface/CompatibilityTab.tsx +190 -0
  420. package/examples/canister-studio/src/components/interface/ProjectTab.tsx +196 -0
  421. package/examples/canister-studio/src/components/interface/TypeScriptTab.tsx +114 -0
  422. package/examples/canister-studio/src/components/interface/tools.test.tsx +169 -0
  423. package/examples/canister-studio/src/components/modes.ts +31 -0
  424. package/examples/canister-studio/src/components/playground/MethodPicker.tsx +67 -0
  425. package/examples/canister-studio/src/components/playground/PlaygroundForms.tsx +112 -0
  426. package/examples/canister-studio/src/components/playground/PlaygroundTools.tsx +219 -0
  427. package/examples/canister-studio/src/components/playground/sample.ts +43 -0
  428. package/examples/canister-studio/src/components/playground/target.test.tsx +86 -0
  429. package/examples/canister-studio/src/components/primitives.test.tsx +121 -0
  430. package/examples/canister-studio/src/components/provenance.ts +38 -0
  431. package/examples/canister-studio/src/components/route-render.test.tsx +71 -0
  432. package/examples/canister-studio/src/components/use-task.ts +56 -0
  433. package/examples/canister-studio/src/components/wallet/BalancePanel.tsx +110 -0
  434. package/examples/canister-studio/src/components/wallet/LedgerSummary.tsx +63 -0
  435. package/examples/canister-studio/src/components/wallet/MinterPanel.tsx +255 -0
  436. package/examples/canister-studio/src/components/wallet/SendPanel.test.tsx +297 -0
  437. package/examples/canister-studio/src/components/wallet/SendPanel.tsx +446 -0
  438. package/examples/canister-studio/src/components/wallet/ledgers.test.ts +36 -0
  439. package/examples/canister-studio/src/components/wallet/ledgers.ts +111 -0
  440. package/examples/canister-studio/src/forms/JsonPanel.tsx +157 -0
  441. package/examples/canister-studio/src/forms/MethodForm.test.tsx +369 -0
  442. package/examples/canister-studio/src/forms/MethodForm.tsx +368 -0
  443. package/examples/canister-studio/src/forms/TypedForm.tsx +55 -0
  444. package/examples/canister-studio/src/forms/context.ts +62 -0
  445. package/examples/canister-studio/src/forms/convert.ts +131 -0
  446. package/examples/canister-studio/src/forms/edge.test.ts +252 -0
  447. package/examples/canister-studio/src/forms/engine.test.ts +358 -0
  448. package/examples/canister-studio/src/forms/engine.ts +1492 -0
  449. package/examples/canister-studio/src/forms/fields/BytesField.tsx +210 -0
  450. package/examples/canister-studio/src/forms/fields/Field.tsx +106 -0
  451. package/examples/canister-studio/src/forms/fields/FieldShell.tsx +101 -0
  452. package/examples/canister-studio/src/forms/fields/Group.tsx +74 -0
  453. package/examples/canister-studio/src/forms/fields/ListField.tsx +256 -0
  454. package/examples/canister-studio/src/forms/fields/Segmented.tsx +78 -0
  455. package/examples/canister-studio/src/forms/fields/TimestampField.tsx +108 -0
  456. package/examples/canister-studio/src/forms/fields/UnitsField.tsx +119 -0
  457. package/examples/canister-studio/src/forms/fields/composites.tsx +389 -0
  458. package/examples/canister-studio/src/forms/fields/leaves.tsx +350 -0
  459. package/examples/canister-studio/src/forms/fields.test.tsx +396 -0
  460. package/examples/canister-studio/src/forms/helpers.test.ts +225 -0
  461. package/examples/canister-studio/src/forms/hints.ts +128 -0
  462. package/examples/canister-studio/src/forms/json.ts +119 -0
  463. package/examples/canister-studio/src/forms/parsing.test.ts +217 -0
  464. package/examples/canister-studio/src/forms/useMethodForm.ts +251 -0
  465. package/examples/canister-studio/src/interface/browser.test.ts +23 -0
  466. package/examples/canister-studio/src/interface/browser.ts +153 -0
  467. package/examples/canister-studio/src/interface/cache.ts +68 -0
  468. package/examples/canister-studio/src/interface/cli-cache.test.ts +155 -0
  469. package/examples/canister-studio/src/interface/cli-cache.ts +125 -0
  470. package/examples/canister-studio/src/interface/compile.server.test.ts +198 -0
  471. package/examples/canister-studio/src/interface/compile.server.ts +262 -0
  472. package/examples/canister-studio/src/interface/compile.test.ts +108 -0
  473. package/examples/canister-studio/src/interface/compile.ts +305 -0
  474. package/examples/canister-studio/src/interface/docs.test.ts +75 -0
  475. package/examples/canister-studio/src/interface/docs.ts +100 -0
  476. package/examples/canister-studio/src/interface/functions.test.ts +42 -0
  477. package/examples/canister-studio/src/interface/functions.ts +200 -0
  478. package/examples/canister-studio/src/interface/live-candid.server.ts +91 -0
  479. package/examples/canister-studio/src/interface/live-loader.test.ts +515 -0
  480. package/examples/canister-studio/src/interface/live-loader.ts +364 -0
  481. package/examples/canister-studio/src/interface/load.test.ts +328 -0
  482. package/examples/canister-studio/src/interface/load.ts +249 -0
  483. package/examples/canister-studio/src/interface/read-candid.test.ts +185 -0
  484. package/examples/canister-studio/src/interface/read-candid.ts +233 -0
  485. package/examples/canister-studio/src/interface/server-result.ts +42 -0
  486. package/examples/canister-studio/src/interface/typed.ts +68 -0
  487. package/examples/canister-studio/src/interface/types.ts +121 -0
  488. package/examples/canister-studio/src/lib/format.test.ts +107 -0
  489. package/examples/canister-studio/src/lib/format.ts +139 -0
  490. package/examples/canister-studio/src/lib/hex.test.ts +43 -0
  491. package/examples/canister-studio/src/lib/hex.ts +33 -0
  492. package/examples/canister-studio/src/lib/ids.test.ts +70 -0
  493. package/examples/canister-studio/src/lib/ids.ts +93 -0
  494. package/examples/canister-studio/src/lib/reactor.test.ts +55 -0
  495. package/examples/canister-studio/src/lib/reactor.ts +55 -0
  496. package/examples/canister-studio/src/lib/registry.test.ts +74 -0
  497. package/examples/canister-studio/src/lib/registry.ts +238 -0
  498. package/examples/canister-studio/src/lib/schema.ts +148 -0
  499. package/examples/canister-studio/src/routeTree.gen.ts +227 -0
  500. package/examples/canister-studio/src/router.test.ts +290 -0
  501. package/examples/canister-studio/src/router.tsx +127 -0
  502. package/examples/canister-studio/src/routes/__root.tsx +58 -0
  503. package/examples/canister-studio/src/routes/canister.$canisterId.index.tsx +172 -0
  504. package/examples/canister-studio/src/routes/canister.$canisterId.interface.tsx +98 -0
  505. package/examples/canister-studio/src/routes/canister.$canisterId.tsx +91 -0
  506. package/examples/canister-studio/src/routes/history.tsx +55 -0
  507. package/examples/canister-studio/src/routes/index.tsx +169 -0
  508. package/examples/canister-studio/src/routes/playground.tsx +286 -0
  509. package/examples/canister-studio/src/routes/safety.tsx +57 -0
  510. package/examples/canister-studio/src/routes/wallet.tsx +213 -0
  511. package/examples/canister-studio/src/safety/LabTransferForm.tsx +84 -0
  512. package/examples/canister-studio/src/safety/RequestLog.tsx +79 -0
  513. package/examples/canister-studio/src/safety/SafetyLab.test.tsx +89 -0
  514. package/examples/canister-studio/src/safety/SafetyLab.tsx +140 -0
  515. package/examples/canister-studio/src/safety/ScenarioCard.tsx +262 -0
  516. package/examples/canister-studio/src/safety/lab-run.ts +283 -0
  517. package/examples/canister-studio/src/safety/mock-ledger.test.ts +99 -0
  518. package/examples/canister-studio/src/safety/mock-ledger.ts +263 -0
  519. package/examples/canister-studio/src/safety/scenarios.test.ts +157 -0
  520. package/examples/canister-studio/src/safety/scenarios.ts +924 -0
  521. package/examples/canister-studio/src/styles.css +3453 -0
  522. package/examples/canister-studio/src/styles.test.ts +46 -0
  523. package/examples/canister-studio/src/values/CallPreview.test.tsx +86 -0
  524. package/examples/canister-studio/src/values/CallPreview.tsx +148 -0
  525. package/examples/canister-studio/src/values/ErrValueView.tsx +66 -0
  526. package/examples/canister-studio/src/values/Inspector.tsx +133 -0
  527. package/examples/canister-studio/src/values/ReplyView.test.tsx +341 -0
  528. package/examples/canister-studio/src/values/ReplyView.tsx +164 -0
  529. package/examples/canister-studio/src/values/candid-text.test.ts +516 -0
  530. package/examples/canister-studio/src/values/candid-text.ts +479 -0
  531. package/examples/canister-studio/src/values/hints.ts +58 -0
  532. package/examples/canister-studio/src/values/json.test.ts +66 -0
  533. package/examples/canister-studio/src/values/json.ts +31 -0
  534. package/examples/canister-studio/src/values/leaves.tsx +309 -0
  535. package/examples/canister-studio/src/values/schema.test.ts +123 -0
  536. package/examples/canister-studio/src/values/schema.ts +78 -0
  537. package/examples/canister-studio/src/values/test-router.tsx +21 -0
  538. package/examples/canister-studio/src/values/tree.tsx +670 -0
  539. package/examples/canister-studio/src/values/use-sha256.ts +29 -0
  540. package/examples/canister-studio/tsconfig.json +20 -0
  541. package/examples/canister-studio/vite.config.ts +50 -0
  542. package/examples/canister-studio/vitest.config.ts +20 -0
  543. package/examples/icrc-ledger/.stackblitzrc +4 -0
  544. package/examples/icrc-ledger/README.md +100 -0
  545. package/examples/icrc-ledger/ckbtc_minter.did +12 -0
  546. package/examples/icrc-ledger/icp_ledger.did +147 -0
  547. package/examples/icrc-ledger/icrc1.did +88 -0
  548. package/examples/icrc-ledger/index.html +13 -0
  549. package/examples/icrc-ledger/package.json +40 -0
  550. package/examples/icrc-ledger/scripts/smoke.ts +151 -0
  551. package/examples/icrc-ledger/src/App.tsx +71 -0
  552. package/examples/icrc-ledger/src/ErrorPanel.tsx +105 -0
  553. package/examples/icrc-ledger/src/MainnetTab.tsx +450 -0
  554. package/examples/icrc-ledger/src/SandboxTab.test.tsx +379 -0
  555. package/examples/icrc-ledger/src/SandboxTab.tsx +761 -0
  556. package/examples/icrc-ledger/src/blocks.test.ts +247 -0
  557. package/examples/icrc-ledger/src/blocks.ts +140 -0
  558. package/examples/icrc-ledger/src/canisters/ckbtc_minter.envelope.json +96 -0
  559. package/examples/icrc-ledger/src/canisters/ckbtc_minter.ts +16 -0
  560. package/examples/icrc-ledger/src/canisters/icp_ledger.envelope.json +690 -0
  561. package/examples/icrc-ledger/src/canisters/icp_ledger.ts +223 -0
  562. package/examples/icrc-ledger/src/canisters/icrc1.envelope.json +840 -0
  563. package/examples/icrc-ledger/src/canisters/icrc1.ts +78 -0
  564. package/examples/icrc-ledger/src/format.test.ts +41 -0
  565. package/examples/icrc-ledger/src/format.ts +68 -0
  566. package/examples/icrc-ledger/src/ledger.ts +15 -0
  567. package/examples/icrc-ledger/src/main.tsx +10 -0
  568. package/examples/icrc-ledger/src/minter.ts +16 -0
  569. package/examples/icrc-ledger/src/sandbox.test.ts +464 -0
  570. package/examples/icrc-ledger/src/sandbox.ts +281 -0
  571. package/examples/icrc-ledger/src/styles.css +391 -0
  572. package/examples/icrc-ledger/src/transfer-form.test.ts +62 -0
  573. package/examples/icrc-ledger/src/transfer-form.ts +97 -0
  574. package/examples/icrc-ledger/tsconfig.json +19 -0
  575. package/examples/icrc-ledger/vite.config.ts +44 -0
  576. package/examples/icrc-ledger/vitest.config.ts +12 -0
  577. package/examples/next-ssr/.stackblitzrc +4 -0
  578. package/examples/next-ssr/README.md +112 -0
  579. package/examples/next-ssr/icrc1.did +88 -0
  580. package/examples/next-ssr/next.config.ts +10 -0
  581. package/examples/next-ssr/package.json +41 -0
  582. package/examples/next-ssr/scripts/smoke.ts +169 -0
  583. package/examples/next-ssr/src/app/account/CertifiedBalances.tsx +58 -0
  584. package/examples/next-ssr/src/app/account/account.test.tsx +165 -0
  585. package/examples/next-ssr/src/app/account/page.tsx +82 -0
  586. package/examples/next-ssr/src/app/api/balance/[ledger]/[principal]/route.ts +10 -0
  587. package/examples/next-ssr/src/app/globals.css +278 -0
  588. package/examples/next-ssr/src/app/layout.tsx +34 -0
  589. package/examples/next-ssr/src/app/page.tsx +46 -0
  590. package/examples/next-ssr/src/app/providers.browser.test.tsx +127 -0
  591. package/examples/next-ssr/src/app/providers.test.tsx +73 -0
  592. package/examples/next-ssr/src/app/providers.tsx +60 -0
  593. package/examples/next-ssr/src/canisters/icrc1.envelope.json +840 -0
  594. package/examples/next-ssr/src/canisters/icrc1.ts +78 -0
  595. package/examples/next-ssr/src/components/BalanceTable.tsx +43 -0
  596. package/examples/next-ssr/src/components/LedgerCard.test.tsx +96 -0
  597. package/examples/next-ssr/src/components/LedgerCard.tsx +230 -0
  598. package/examples/next-ssr/src/components/LedgerError.tsx +32 -0
  599. package/examples/next-ssr/src/components/LedgerSections.tsx +22 -0
  600. package/examples/next-ssr/src/components/MyBalances.test.tsx +253 -0
  601. package/examples/next-ssr/src/components/MyBalances.tsx +129 -0
  602. package/examples/next-ssr/src/components/SessionBadge.tsx +18 -0
  603. package/examples/next-ssr/src/components/hydration.test.tsx +259 -0
  604. package/examples/next-ssr/src/components/server-data.ts +10 -0
  605. package/examples/next-ssr/src/format.ts +46 -0
  606. package/examples/next-ssr/src/ledgers.ts +38 -0
  607. package/examples/next-ssr/src/server/balance-route.test.ts +151 -0
  608. package/examples/next-ssr/src/server/balance-route.ts +157 -0
  609. package/examples/next-ssr/src/server/error-summary.test.ts +34 -0
  610. package/examples/next-ssr/src/server/error-summary.ts +37 -0
  611. package/examples/next-ssr/src/server/parse-owner.test.ts +39 -0
  612. package/examples/next-ssr/src/server/parse-owner.ts +34 -0
  613. package/examples/next-ssr/src/server/prefetch-ledgers.test.ts +137 -0
  614. package/examples/next-ssr/src/server/prefetch-ledgers.ts +70 -0
  615. package/examples/next-ssr/src/server/read-balances.test.ts +103 -0
  616. package/examples/next-ssr/src/server/read-balances.ts +78 -0
  617. package/examples/next-ssr/src/server/request-client.rsc.test.tsx +110 -0
  618. package/examples/next-ssr/src/server/request-client.ts +24 -0
  619. package/examples/next-ssr/src/testing/mock-ledgers.ts +115 -0
  620. package/examples/next-ssr/src/testing/react-server-dom-turbopack.d.ts +15 -0
  621. package/examples/next-ssr/src/testing/setup.ts +10 -0
  622. package/examples/next-ssr/tsconfig.json +31 -0
  623. package/examples/next-ssr/vitest.config.ts +59 -0
  624. package/examples/node-agent-tool/.stackblitzrc +4 -0
  625. package/examples/node-agent-tool/README.md +165 -0
  626. package/examples/node-agent-tool/icp.yaml +11 -0
  627. package/examples/node-agent-tool/icrc1.did +88 -0
  628. package/examples/node-agent-tool/package.json +32 -0
  629. package/examples/node-agent-tool/src/canisters/icrc1.envelope.json +840 -0
  630. package/examples/node-agent-tool/src/canisters/icrc1.ts +78 -0
  631. package/examples/node-agent-tool/src/cli.test.ts +64 -0
  632. package/examples/node-agent-tool/src/cli.ts +23 -0
  633. package/examples/node-agent-tool/src/command-line.ts +159 -0
  634. package/examples/node-agent-tool/src/commands/balance.ts +73 -0
  635. package/examples/node-agent-tool/src/commands/demo.test.ts +51 -0
  636. package/examples/node-agent-tool/src/commands/demo.ts +359 -0
  637. package/examples/node-agent-tool/src/commands/info.ts +69 -0
  638. package/examples/node-agent-tool/src/commands/reads.test.ts +133 -0
  639. package/examples/node-agent-tool/src/commands/resend.test.ts +363 -0
  640. package/examples/node-agent-tool/src/commands/transfer.test.ts +313 -0
  641. package/examples/node-agent-tool/src/commands/transfer.ts +415 -0
  642. package/examples/node-agent-tool/src/commands/watch.test.ts +159 -0
  643. package/examples/node-agent-tool/src/commands/watch.ts +135 -0
  644. package/examples/node-agent-tool/src/commands/whoami.ts +36 -0
  645. package/examples/node-agent-tool/src/context.ts +20 -0
  646. package/examples/node-agent-tool/src/dispatch.ts +70 -0
  647. package/examples/node-agent-tool/src/failure.test.ts +59 -0
  648. package/examples/node-agent-tool/src/failure.ts +176 -0
  649. package/examples/node-agent-tool/src/identity.test.ts +242 -0
  650. package/examples/node-agent-tool/src/identity.ts +228 -0
  651. package/examples/node-agent-tool/src/input.ts +110 -0
  652. package/examples/node-agent-tool/src/ledgers.test.ts +74 -0
  653. package/examples/node-agent-tool/src/ledgers.ts +62 -0
  654. package/examples/node-agent-tool/src/mock-ledger.ts +211 -0
  655. package/examples/node-agent-tool/src/network.test.ts +128 -0
  656. package/examples/node-agent-tool/src/network.ts +101 -0
  657. package/examples/node-agent-tool/src/output.test.ts +208 -0
  658. package/examples/node-agent-tool/src/output.ts +163 -0
  659. package/examples/node-agent-tool/src/run.ts +73 -0
  660. package/examples/node-agent-tool/src/test-kit.ts +167 -0
  661. package/examples/node-agent-tool/tsconfig.json +18 -0
  662. package/examples/node-agent-tool/vitest.config.ts +8 -0
  663. package/examples/vite-wallet/.stackblitzrc +4 -0
  664. package/examples/vite-wallet/Cargo.lock +646 -0
  665. package/examples/vite-wallet/Cargo.toml +5 -0
  666. package/examples/vite-wallet/README.md +107 -0
  667. package/examples/vite-wallet/backend/Cargo.toml +12 -0
  668. package/examples/vite-wallet/backend/backend.did +37 -0
  669. package/examples/vite-wallet/backend/src/lib.rs +133 -0
  670. package/examples/vite-wallet/icp.yaml +44 -0
  671. package/examples/vite-wallet/index.html +13 -0
  672. package/examples/vite-wallet/ledger.did +54 -0
  673. package/examples/vite-wallet/package.json +46 -0
  674. package/examples/vite-wallet/public/.ic-assets.json5 +26 -0
  675. package/examples/vite-wallet/scripts/faucet-args.test.ts +30 -0
  676. package/examples/vite-wallet/scripts/faucet-args.ts +41 -0
  677. package/examples/vite-wallet/scripts/faucet.ts +41 -0
  678. package/examples/vite-wallet/src/AddressBook.test.tsx +191 -0
  679. package/examples/vite-wallet/src/AddressBook.tsx +147 -0
  680. package/examples/vite-wallet/src/App.tsx +53 -0
  681. package/examples/vite-wallet/src/Balance.test.tsx +57 -0
  682. package/examples/vite-wallet/src/Balance.tsx +58 -0
  683. package/examples/vite-wallet/src/EnvironmentPanel.test.tsx +83 -0
  684. package/examples/vite-wallet/src/EnvironmentPanel.tsx +103 -0
  685. package/examples/vite-wallet/src/ErrorNote.tsx +70 -0
  686. package/examples/vite-wallet/src/Profile.test.tsx +145 -0
  687. package/examples/vite-wallet/src/Profile.tsx +92 -0
  688. package/examples/vite-wallet/src/SendIcp.test.tsx +231 -0
  689. package/examples/vite-wallet/src/SendIcp.tsx +244 -0
  690. package/examples/vite-wallet/src/SendToContact.test.tsx +113 -0
  691. package/examples/vite-wallet/src/SendToContact.tsx +102 -0
  692. package/examples/vite-wallet/src/SignIn.test.tsx +106 -0
  693. package/examples/vite-wallet/src/SignIn.tsx +120 -0
  694. package/examples/vite-wallet/src/Wallet.test.tsx +89 -0
  695. package/examples/vite-wallet/src/account-switch.test.tsx +108 -0
  696. package/examples/vite-wallet/src/auth/dev-accounts.test.ts +113 -0
  697. package/examples/vite-wallet/src/auth/dev-accounts.ts +216 -0
  698. package/examples/vite-wallet/src/auth/local-page.test.ts +28 -0
  699. package/examples/vite-wallet/src/auth/local-page.ts +20 -0
  700. package/examples/vite-wallet/src/auth/wallet-auth.test.ts +159 -0
  701. package/examples/vite-wallet/src/auth/wallet-auth.ts +131 -0
  702. package/examples/vite-wallet/src/canisters/backend.envelope.json +275 -0
  703. package/examples/vite-wallet/src/canisters/backend.ts +58 -0
  704. package/examples/vite-wallet/src/canisters/ledger.envelope.json +451 -0
  705. package/examples/vite-wallet/src/canisters/ledger.ts +56 -0
  706. package/examples/vite-wallet/src/client.ts +45 -0
  707. package/examples/vite-wallet/src/main.tsx +18 -0
  708. package/examples/vite-wallet/src/optimistic-contacts.ts +113 -0
  709. package/examples/vite-wallet/src/refusal.ts +17 -0
  710. package/examples/vite-wallet/src/styles.css +282 -0
  711. package/examples/vite-wallet/src/test/test-wallet.tsx +322 -0
  712. package/examples/vite-wallet/src/token.ts +50 -0
  713. package/examples/vite-wallet/src/transfer.test.ts +178 -0
  714. package/examples/vite-wallet/src/transfer.ts +110 -0
  715. package/examples/vite-wallet/src/use-canisters.ts +49 -0
  716. package/examples/vite-wallet/tsconfig.json +19 -0
  717. package/examples/vite-wallet/vite.config.ts +47 -0
  718. package/examples/vite-wallet/vitest.config.ts +17 -0
  719. package/package.json +9 -4
  720. package/packages/core/.size-limit.js +47 -0
  721. package/packages/core/LICENSE +21 -0
  722. package/packages/core/README.md +84 -0
  723. package/packages/core/llms.txt +610 -0
  724. package/packages/core/package.json +89 -0
  725. package/packages/core/src/call.ts +961 -0
  726. package/packages/core/src/canister.ts +259 -0
  727. package/packages/core/src/client.ts +2061 -0
  728. package/packages/core/src/errors.ts +1079 -0
  729. package/packages/core/src/hydration.ts +239 -0
  730. package/packages/core/src/index.ts +23 -0
  731. package/packages/core/src/keys.ts +108 -0
  732. package/packages/core/src/management.ts +138 -0
  733. package/packages/core/src/network.ts +1020 -0
  734. package/packages/core/src/options.ts +1000 -0
  735. package/packages/core/src/runtime.ts +50 -0
  736. package/packages/core/src/testing/fake-replica.ts +1166 -0
  737. package/packages/core/src/testing/index.ts +16 -0
  738. package/packages/core/src/testing/test-auth.ts +340 -0
  739. package/packages/core/src/testing/test-client.ts +559 -0
  740. package/packages/core/src/types.ts +541 -0
  741. package/packages/core/src/units.ts +299 -0
  742. package/packages/core/src/version.ts +4 -0
  743. package/packages/core/tests/canister-helpers.ts +187 -0
  744. package/packages/core/tests/canister-id.test.ts +158 -0
  745. package/packages/core/tests/canister-unwrap.test.ts +94 -0
  746. package/packages/core/tests/canister.test-d.ts +406 -0
  747. package/packages/core/tests/canister.test.ts +1921 -0
  748. package/packages/core/tests/client-account-change.test.ts +131 -0
  749. package/packages/core/tests/client-agents.test.ts +402 -0
  750. package/packages/core/tests/client-auth-network.test.ts +719 -0
  751. package/packages/core/tests/client-disposed.test.ts +403 -0
  752. package/packages/core/tests/client-helpers.ts +136 -0
  753. package/packages/core/tests/client-hydration.test.ts +166 -0
  754. package/packages/core/tests/client-pinned.test.ts +626 -0
  755. package/packages/core/tests/client-session.test.ts +348 -0
  756. package/packages/core/tests/client.test-d.ts +181 -0
  757. package/packages/core/tests/client.test.ts +1162 -0
  758. package/packages/core/tests/encode.test.ts +171 -0
  759. package/packages/core/tests/env-canister-id.test.ts +666 -0
  760. package/packages/core/tests/env-cookie-copies.test.ts +182 -0
  761. package/packages/core/tests/error-guard.test.ts +222 -0
  762. package/packages/core/tests/errors.test-d.ts +280 -0
  763. package/packages/core/tests/errors.test.ts +1359 -0
  764. package/packages/core/tests/fixtures/README.md +28 -0
  765. package/packages/core/tests/fixtures/accounts.did +21 -0
  766. package/packages/core/tests/fixtures/accounts.envelope.json +367 -0
  767. package/packages/core/tests/fixtures/accounts.ts +26 -0
  768. package/packages/core/tests/fixtures/archive.did +31 -0
  769. package/packages/core/tests/fixtures/archive.envelope.json +259 -0
  770. package/packages/core/tests/fixtures/archive.ts +55 -0
  771. package/packages/core/tests/fixtures/icrc1.did +88 -0
  772. package/packages/core/tests/fixtures/icrc1.envelope.json +840 -0
  773. package/packages/core/tests/fixtures/icrc1.ts +78 -0
  774. package/packages/core/tests/fixtures/management.did +724 -0
  775. package/packages/core/tests/fixtures/management.envelope.json +4455 -0
  776. package/packages/core/tests/fixtures/management.ts +486 -0
  777. package/packages/core/tests/fixtures/shapes.did +33 -0
  778. package/packages/core/tests/fixtures/shapes.envelope.json +440 -0
  779. package/packages/core/tests/fixtures/shapes.ts +56 -0
  780. package/packages/core/tests/fixtures/skippable.did +15 -0
  781. package/packages/core/tests/fixtures/skippable.envelope.json +182 -0
  782. package/packages/core/tests/fixtures/skippable.ts +33 -0
  783. package/packages/core/tests/func.test.ts +154 -0
  784. package/packages/core/tests/identity-attributes.test.ts +214 -0
  785. package/packages/core/tests/keys.test.ts +289 -0
  786. package/packages/core/tests/management.test.ts +206 -0
  787. package/packages/core/tests/network-helpers.ts +121 -0
  788. package/packages/core/tests/network.test-d.ts +78 -0
  789. package/packages/core/tests/network.test.ts +1051 -0
  790. package/packages/core/tests/options.test.ts +1594 -0
  791. package/packages/core/tests/redirect-sign-in.test.ts +393 -0
  792. package/packages/core/tests/resend.test-d.ts +81 -0
  793. package/packages/core/tests/resend.test.ts +723 -0
  794. package/packages/core/tests/skip.test-d.ts +125 -0
  795. package/packages/core/tests/testing-entry.test.ts +73 -0
  796. package/packages/core/tests/testing-fake-replica.test.ts +1242 -0
  797. package/packages/core/tests/testing-test-auth.test-d.ts +84 -0
  798. package/packages/core/tests/testing-test-auth.test.ts +483 -0
  799. package/packages/core/tests/testing-test-client.test-d.ts +184 -0
  800. package/packages/core/tests/testing-test-client.test.ts +1272 -0
  801. package/packages/core/tests/time-realm.test.ts +63 -0
  802. package/packages/core/tests/time.test.ts +238 -0
  803. package/packages/core/tests/traps/README.md +39 -0
  804. package/packages/core/tests/traps/anonymous-write.test.ts +145 -0
  805. package/packages/core/tests/traps/classification-table.test.ts +256 -0
  806. package/packages/core/tests/traps/err-arm.test.ts +144 -0
  807. package/packages/core/tests/traps/fetch-spy.ts +39 -0
  808. package/packages/core/tests/traps/invalidation-after-write.test.ts +178 -0
  809. package/packages/core/tests/traps/ledger.ts +248 -0
  810. package/packages/core/tests/traps/root-key-off-local.test.ts +130 -0
  811. package/packages/core/tests/traps/stale-data-across-users.test.ts +173 -0
  812. package/packages/core/tests/traps/unresolved-name.test.ts +155 -0
  813. package/packages/core/tests/traps/update-as-query.test.ts +244 -0
  814. package/packages/core/tests/traps/update-not-resent.test.ts +126 -0
  815. package/packages/core/tests/traps/update-resent-when-never-delivered.test.ts +159 -0
  816. package/packages/core/tests/traps.test-d.ts +476 -0
  817. package/packages/core/tests/units.test-d.ts +118 -0
  818. package/packages/core/tests/units.test.ts +634 -0
  819. package/packages/core/tsconfig.json +19 -0
  820. package/packages/core/tsconfig.typecheck.json +16 -0
  821. package/packages/core/vitest.config.ts +13 -0
  822. package/packages/mcp/LICENSE +21 -0
  823. package/packages/mcp/README.md +189 -0
  824. package/packages/mcp/package.json +62 -0
  825. package/packages/mcp/src/candid/candid-text.test.ts +455 -0
  826. package/packages/mcp/src/candid/candid-text.ts +501 -0
  827. package/packages/mcp/src/candid/contract.test.ts +398 -0
  828. package/packages/mcp/src/candid/formats.ts +155 -0
  829. package/packages/mcp/src/candid/hex.ts +29 -0
  830. package/packages/mcp/src/candid/json-schema.test.ts +758 -0
  831. package/packages/mcp/src/candid/json-schema.ts +454 -0
  832. package/packages/mcp/src/candid/json.test.ts +1207 -0
  833. package/packages/mcp/src/candid/json.ts +1053 -0
  834. package/packages/mcp/src/candid/schema-walk.ts +189 -0
  835. package/packages/mcp/src/candid/type-text.test.ts +179 -0
  836. package/packages/mcp/src/candid/type-text.ts +238 -0
  837. package/packages/mcp/src/cli.ts +134 -0
  838. package/packages/mcp/src/identity.ts +188 -0
  839. package/packages/mcp/src/interface/cache.test.ts +48 -0
  840. package/packages/mcp/src/interface/cache.ts +68 -0
  841. package/packages/mcp/src/interface/cli-cache.test.ts +150 -0
  842. package/packages/mcp/src/interface/cli-cache.ts +122 -0
  843. package/packages/mcp/src/interface/compile-worker.test.ts +246 -0
  844. package/packages/mcp/src/interface/compile-worker.ts +290 -0
  845. package/packages/mcp/src/interface/compile.test.ts +155 -0
  846. package/packages/mcp/src/interface/compile.ts +281 -0
  847. package/packages/mcp/src/interface/docs.test.ts +105 -0
  848. package/packages/mcp/src/interface/docs.ts +86 -0
  849. package/packages/mcp/src/interface/fixtures/icrc1.did +88 -0
  850. package/packages/mcp/src/interface/hex.ts +8 -0
  851. package/packages/mcp/src/interface/ids.test.ts +71 -0
  852. package/packages/mcp/src/interface/ids.ts +87 -0
  853. package/packages/mcp/src/interface/loader.test.ts +804 -0
  854. package/packages/mcp/src/interface/loader.ts +519 -0
  855. package/packages/mcp/src/interface/read-candid.test.ts +300 -0
  856. package/packages/mcp/src/interface/read-candid.ts +259 -0
  857. package/packages/mcp/src/interface/types.ts +113 -0
  858. package/packages/mcp/src/network.ts +122 -0
  859. package/packages/mcp/src/options.ts +149 -0
  860. package/packages/mcp/src/server/approval.ts +159 -0
  861. package/packages/mcp/src/server/naming.ts +43 -0
  862. package/packages/mcp/src/server/results.ts +102 -0
  863. package/packages/mcp/src/server/server.ts +797 -0
  864. package/packages/mcp/src/server/tools.ts +116 -0
  865. package/packages/mcp/src/usage.ts +40 -0
  866. package/packages/mcp/tests/approval.test.ts +60 -0
  867. package/packages/mcp/tests/identity.test.ts +234 -0
  868. package/packages/mcp/tests/naming.test.ts +62 -0
  869. package/packages/mcp/tests/options.test.ts +140 -0
  870. package/packages/mcp/tests/server.test.ts +997 -0
  871. package/packages/mcp/tsconfig.json +19 -0
  872. package/packages/mcp/tsconfig.typecheck.json +10 -0
  873. package/packages/mcp/vitest.config.ts +10 -0
  874. package/packages/react/LICENSE +21 -0
  875. package/packages/react/README.md +328 -0
  876. package/packages/react/llms.txt +95 -0
  877. package/packages/react/package.json +95 -0
  878. package/packages/react/src/index.tsx +678 -0
  879. package/packages/react/tests/abandoned-render.test.tsx +816 -0
  880. package/packages/react/tests/auth.test.tsx +315 -0
  881. package/packages/react/tests/caller-keys.test.tsx +2334 -0
  882. package/packages/react/tests/client-time.test.ts +40 -0
  883. package/packages/react/tests/entry.test.ts +52 -0
  884. package/packages/react/tests/helpers.tsx +291 -0
  885. package/packages/react/tests/hydration.test.tsx +262 -0
  886. package/packages/react/tests/ownership.test.tsx +260 -0
  887. package/packages/react/tests/provider.server.test.tsx +169 -0
  888. package/packages/react/tests/query-client.test.tsx +107 -0
  889. package/packages/react/tests/strict-mode.test.tsx +288 -0
  890. package/packages/react/tests/suspense.test-d.tsx +357 -0
  891. package/packages/react/tests/two-query-cores.test.tsx +135 -0
  892. package/packages/react/tests/types.test-d.tsx +63 -0
  893. package/packages/react/tsconfig.json +23 -0
  894. package/packages/react/tsconfig.test.json +8 -0
  895. package/packages/react/tsconfig.typecheck.json +16 -0
  896. package/packages/react/vitest.config.ts +39 -0
  897. package/packages/vite-plugin/LICENSE +21 -0
  898. package/packages/vite-plugin/README.md +532 -0
  899. package/packages/vite-plugin/package.json +76 -0
  900. package/packages/vite-plugin/src/describe-value.test.ts +43 -0
  901. package/packages/vite-plugin/src/describe-value.ts +167 -0
  902. package/packages/vite-plugin/src/dev-environment.test.ts +747 -0
  903. package/packages/vite-plugin/src/dev-environment.ts +510 -0
  904. package/packages/vite-plugin/src/env.ts +431 -0
  905. package/packages/vite-plugin/src/fetch.ts +348 -0
  906. package/packages/vite-plugin/src/file-identity.ts +106 -0
  907. package/packages/vite-plugin/src/generate.ts +691 -0
  908. package/packages/vite-plugin/src/index.test.ts +1243 -0
  909. package/packages/vite-plugin/src/index.ts +2565 -0
  910. package/packages/vite-plugin/src/interface.ts +339 -0
  911. package/packages/vite-plugin/src/local-host.ts +34 -0
  912. package/packages/vite-plugin/src/options.ts +641 -0
  913. package/packages/vite-plugin/src/principal-text.test.ts +87 -0
  914. package/packages/vite-plugin/src/principal-text.ts +98 -0
  915. package/packages/vite-plugin/tests/close.test.ts +141 -0
  916. package/packages/vite-plugin/tests/environment-mode.test.ts +136 -0
  917. package/packages/vite-plugin/tests/fake-ic.ts +214 -0
  918. package/packages/vite-plugin/tests/fetch-sdk.test.ts +27 -0
  919. package/packages/vite-plugin/tests/fetch.test.ts +1196 -0
  920. package/packages/vite-plugin/tests/fixtures/fake-cli/bin.js +90 -0
  921. package/packages/vite-plugin/tests/fixtures/fake-cli/package.json +8 -0
  922. package/packages/vite-plugin/tests/fixtures/icrc1.did +88 -0
  923. package/packages/vite-plugin/tests/generation.test.ts +1036 -0
  924. package/packages/vite-plugin/tests/icp-command.test.ts +194 -0
  925. package/packages/vite-plugin/tests/icp-timeout.test.ts +83 -0
  926. package/packages/vite-plugin/tests/no-process-exit.test.ts +83 -0
  927. package/packages/vite-plugin/tests/on-generated.test.ts +323 -0
  928. package/packages/vite-plugin/tests/output-collision.test.ts +329 -0
  929. package/packages/vite-plugin/tests/package.test.ts +62 -0
  930. package/packages/vite-plugin/tests/project.test.ts +2993 -0
  931. package/packages/vite-plugin/tests/support.ts +339 -0
  932. package/packages/vite-plugin/tests/timeout.test.ts +107 -0
  933. package/packages/vite-plugin/tsconfig.json +23 -0
  934. package/packages/vite-plugin/tsconfig.typecheck.json +16 -0
  935. package/packages/vite-plugin/vitest.config.ts +9 -0
  936. package/pnpm-workspace.yaml +23 -0
  937. package/scripts/ai-context-files.js +72 -0
  938. package/scripts/assemble-docs-site.mjs +485 -0
  939. package/scripts/assemble-docs-site.test.mjs +568 -0
  940. package/scripts/build-examples.js +58 -0
  941. package/scripts/check-ai-context.js +963 -0
  942. package/scripts/check-ai-context.test.mjs +811 -0
  943. package/scripts/check-exports.mjs +767 -0
  944. package/scripts/check-exports.test.mjs +1136 -0
  945. package/scripts/check-snippets/ambient.d.ts +428 -0
  946. package/scripts/check-snippets/app/generated/backend.did +7 -0
  947. package/scripts/check-snippets/app/generated/backend.ts +15 -0
  948. package/scripts/check-snippets/app/generated/icrc1.did +88 -0
  949. package/scripts/check-snippets/app/generated/icrc1.ts +78 -0
  950. package/scripts/check-snippets/app/globals.ts +26 -0
  951. package/scripts/check-snippets/docs/guides/App.tsx +21 -0
  952. package/scripts/check-snippets/docs/guides/app/providers.tsx +23 -0
  953. package/scripts/check-snippets/docs/guides/auth-client.ts +47 -0
  954. package/scripts/check-snippets/docs/guides/canisters/backend.ts +3 -0
  955. package/scripts/check-snippets/docs/guides/canisters/icrc1.ts +3 -0
  956. package/scripts/check-snippets/docs/guides/components/LedgerCard.tsx +26 -0
  957. package/scripts/check-snippets/docs/guides/components/shell.tsx +11 -0
  958. package/scripts/check-snippets/docs/guides/components/sign-in-page.tsx +29 -0
  959. package/scripts/check-snippets/docs/guides/components/slow-section.tsx +5 -0
  960. package/scripts/check-snippets/docs/guides/generated/accounts.ts +95 -0
  961. package/scripts/check-snippets/docs/guides/generated/ckbtc_minter.ts +40 -0
  962. package/scripts/check-snippets/docs/guides/generated/icp_ledger.ts +267 -0
  963. package/scripts/check-snippets/docs/guides/ledger.ts +10 -0
  964. package/scripts/check-snippets/docs/guides/server/request-client.ts +8 -0
  965. package/scripts/check-snippets.mjs +993 -0
  966. package/scripts/check-snippets.test.mjs +338 -0
  967. package/scripts/check-stack.mjs +501 -0
  968. package/scripts/check-stack.test.mjs +800 -0
  969. package/scripts/clean-node-modules.js +67 -0
  970. package/scripts/example-projects.js +58 -0
  971. package/scripts/export-budget.mjs +145 -0
  972. package/scripts/faults.json +6749 -0
  973. package/scripts/lib/fault-workspace.mjs +210 -0
  974. package/scripts/lib/io.mjs +29 -0
  975. package/scripts/lib/io.test.mjs +38 -0
  976. package/scripts/lib/markdown-fences.mjs +56 -0
  977. package/scripts/lib/markdown-fences.test.mjs +84 -0
  978. package/scripts/lib/package-exports.mjs +54 -0
  979. package/scripts/lib/package-exports.test.mjs +66 -0
  980. package/scripts/lib/release-pr-steps.mjs +47 -0
  981. package/scripts/release-tag.mjs +95 -0
  982. package/scripts/release-tag.test.mjs +278 -0
  983. package/scripts/release-workflow.test.mjs +98 -0
  984. package/scripts/release.js +167 -0
  985. package/scripts/release.test.mjs +347 -0
  986. package/scripts/removed-v3-names.js +125 -0
  987. package/scripts/size-app/.size-limit.js +90 -0
  988. package/scripts/size-app/core.js +3 -0
  989. package/scripts/size-app/package.json +24 -0
  990. package/scripts/size-app/react.js +4 -0
  991. package/scripts/size-app.test.mjs +73 -0
  992. package/scripts/sync-ai-context-versions.js +102 -0
  993. package/scripts/sync-example-versions.js +151 -0
  994. package/scripts/test-examples-published.mjs +1585 -0
  995. package/scripts/test-examples-published.test.mjs +1586 -0
  996. package/scripts/traps/any-method-vars-not-a-list.json +5 -0
  997. package/scripts/traps/canister-method-unknown.json +5 -0
  998. package/scripts/traps/client-says-who-calls-once.json +5 -0
  999. package/scripts/traps/client-says-who-calls.json +5 -0
  1000. package/scripts/traps/err-only-on-canister-err.json +14 -0
  1001. package/scripts/traps/format-units-refuses-missing-value.json +5 -0
  1002. package/scripts/traps/format-units-refuses-number.json +5 -0
  1003. package/scripts/traps/format-units-unknown-option.json +5 -0
  1004. package/scripts/traps/guard-err-is-the-methods.json +5 -0
  1005. package/scripts/traps/guard-false-keeps-every-kind.json +5 -0
  1006. package/scripts/traps/internals-not-exported.json +9 -0
  1007. package/scripts/traps/network-refuses-unknown-name.json +5 -0
  1008. package/scripts/traps/never-err-has-no-type.json +5 -0
  1009. package/scripts/traps/options-method-unknown.json +5 -0
  1010. package/scripts/traps/options-vars-wrong-type.json +5 -0
  1011. package/scripts/traps/parse-units-refuses-number.json +5 -0
  1012. package/scripts/traps/parse-units-unknown-option.json +5 -0
  1013. package/scripts/traps/principal-is-not-plain-text.json +14 -0
  1014. package/scripts/traps/query-options-refuses-oneway.json +5 -0
  1015. package/scripts/traps/query-options-refuses-update.json +5 -0
  1016. package/scripts/traps/refuse-next-unknown-option.json +5 -0
  1017. package/scripts/traps/resend-key-reads-the-methods-arg.json +5 -0
  1018. package/scripts/traps/resend-states-its-dedupe-key.json +5 -0
  1019. package/scripts/traps/suspense-refuses-argument-skip.json +5 -0
  1020. package/scripts/traps/suspense-refuses-skippable-read.json +5 -0
  1021. package/scripts/traps/suspense-refuses-vars-skip-fits.json +5 -0
  1022. package/scripts/traps/test-handler-method-unknown.json +5 -0
  1023. package/scripts/traps/test-handler-nat-is-bigint.json +5 -0
  1024. package/scripts/traps/test-handler-takes-the-domain-value.json +5 -0
  1025. package/scripts/traps/vars-of-two-arguments-are-the-tuple.json +5 -0
  1026. package/scripts/typecheck-examples.js +122 -0
  1027. package/scripts/verify-faults.mjs +375 -0
  1028. package/scripts/verify-faults.test.mjs +402 -0
  1029. package/scripts/verify-package-artifacts.mjs +590 -0
  1030. package/scripts/verify-peer-floors.js +399 -0
  1031. package/scripts/verify-peer-floors.test.mjs +422 -0
  1032. package/scripts/verify-test-fails-rules.mjs +104 -0
  1033. package/scripts/verify-test-fails-rules.test.mjs +215 -0
  1034. package/scripts/verify-test-fails.js +371 -0
  1035. package/scripts/verify-traps.mjs +505 -0
  1036. package/scripts/verify-traps.test.mjs +521 -0
  1037. package/scripts/verify-typescript-floor.js +239 -0
  1038. package/skill-packages/ic-reactor/SKILL.md +103 -0
  1039. package/stack.json +8 -0
  1040. package/tsconfig.base.json +23 -0
  1041. package/tsconfig.json +8 -0
@@ -0,0 +1,1053 @@
1
+ // Candid values as the JSON an AI model writes and reads, directed by the
2
+ // method's schemas:
3
+ //
4
+ // bool, null, text true, null, "text"
5
+ // nat8..int32 a number (input also takes a decimal string)
6
+ // nat, int, nat64, int64 a decimal string "150000000" (input also takes a
7
+ // safe-integer number)
8
+ // float32, float64 a number, or "NaN", "Infinity", "-Infinity", "-0"
9
+ // principal, service principal text (input: trimmed, any case)
10
+ // blob lower-case hex (input: hex, or { "utf8": text })
11
+ // opt T null or T; { "some": T } when T itself admits null
12
+ // vec T, tuple an array
13
+ // record, unit an object of the fields (input: an opt field may be
14
+ // left out)
15
+ // variant { "tag": arm, "value": payload }, { "tag": arm } for
16
+ // a null payload (input: also just "arm")
17
+ // func { "principal": text, "method": name }
18
+ // reserved null (input: anything)
19
+ //
20
+ // Input is lenient where that is unambiguous; output is one canonical form,
21
+ // and reading it back gives a value that encodes to the same bytes. Reading
22
+ // is bounded (INPUT_LIMITS) and every refusal names its `$`-rooted path.
23
+ import {
24
+ isPrincipal,
25
+ type AnyFieldSchema,
26
+ type AnySchema,
27
+ } from "@meantjs/schema"
28
+ import { isResultSchema, validate } from "@meantjs/schema/validate"
29
+ import {
30
+ BIG_RANGES,
31
+ EXAMPLE_PRINCIPAL,
32
+ FIXED_RANGES,
33
+ FLOAT_WORDS,
34
+ INPUT_LIMITS,
35
+ closeName,
36
+ got,
37
+ loneSurrogateAt,
38
+ nameList,
39
+ quote,
40
+ } from "./formats.ts"
41
+ import { fromHex, toHex } from "./hex.ts"
42
+ import { inputShape } from "./json-schema.ts"
43
+ import {
44
+ admitsNull,
45
+ armOf,
46
+ armsOf,
47
+ childPath,
48
+ elementsOf,
49
+ fieldOf,
50
+ fieldsOf,
51
+ hasOwnEnumerable,
52
+ isBytes,
53
+ isPlainObject,
54
+ isTagOnly,
55
+ resolve,
56
+ setOwn,
57
+ type OptNode,
58
+ type RecordNode,
59
+ type TupleNode,
60
+ type VariantNode,
61
+ } from "./schema-walk.ts"
62
+ import { typeText } from "./type-text.ts"
63
+
64
+ export {
65
+ DEFAULT_MAX_CHARS,
66
+ DEFAULT_MAX_NODES,
67
+ inputShape,
68
+ methodInput,
69
+ } from "./json-schema.ts"
70
+ export { INPUT_LIMITS } from "./formats.ts"
71
+ export {
72
+ DEFAULT_SIGNATURE_CHARS,
73
+ DEFAULT_TYPE_CHARS,
74
+ signatureText,
75
+ typeText,
76
+ type TypeTextOptions,
77
+ } from "./type-text.ts"
78
+
79
+ /** A JSON value. */
80
+ export type Json =
81
+ null | boolean | number | string | Json[] | { [key: string]: Json }
82
+
83
+ /** A JSON Schema object (the subset this module writes). */
84
+ export type JsonSchema = { [key: string]: unknown }
85
+
86
+ /** One problem with a tool's input, at a `$`-rooted path such as `$.to.owner`. */
87
+ export interface InputIssue {
88
+ readonly path: string
89
+ readonly message: string
90
+ }
91
+
92
+ /** How a method's arguments are laid out in a tool's input object. */
93
+ export type InputShape =
94
+ /** No arguments: the input is `{}`. */
95
+ | { readonly kind: "none" }
96
+ /** One record argument: its fields are the input's properties. */
97
+ | { readonly kind: "fields" }
98
+ /** Anything else: `arg0`, `arg1`, … */
99
+ | { readonly kind: "positional"; readonly count: number }
100
+
101
+ export interface MethodInput {
102
+ readonly shape: InputShape
103
+ /**
104
+ * `{ type: "object", properties, required, additionalProperties: false }`;
105
+ * an object cut to fit, or one with a field named `__proto__` (which ajv
106
+ * skips), leaves out `additionalProperties`.
107
+ */
108
+ readonly schema: JsonSchema
109
+ /** `false` when parts were cut to fit the budget; values are still checked in full. */
110
+ readonly complete: boolean
111
+ }
112
+
113
+ export interface SchemaBudget {
114
+ /** The most schema nodes written for one method (default 2000). */
115
+ readonly maxNodes?: number
116
+ /**
117
+ * About the most characters of JSON written for one method (default
118
+ * 64,000), names and descriptions included: a canister's long field names
119
+ * cannot make a schema larger than this.
120
+ */
121
+ readonly maxChars?: number
122
+ }
123
+
124
+ export type ReadResult =
125
+ | { readonly ok: true; readonly value: unknown }
126
+ | { readonly ok: false; readonly issues: InputIssue[] }
127
+
128
+ export type ArgsResult =
129
+ | { readonly ok: true; readonly values: unknown[] }
130
+ | { readonly ok: false; readonly issues: InputIssue[] }
131
+
132
+ /**
133
+ * A method's argument values from a tool's input object, laid out as `shape`
134
+ * (from `methodInput`) says. The values are checked with `validate` too, so
135
+ * what comes back encodes; every issue names its path from the input's root
136
+ * (`$.amount`, `$.arg1[0]`).
137
+ *
138
+ * @throws TypeError when `shape` is not the one `methodInput` gives `args`.
139
+ */
140
+ export function argsFromInput(
141
+ args: readonly AnyFieldSchema[],
142
+ shape: InputShape,
143
+ input: unknown
144
+ ): ArgsResult {
145
+ const expected = inputShape(args)
146
+ if (
147
+ expected.kind !== shape.kind ||
148
+ (shape.kind === "positional" && shape.count !== args.length)
149
+ ) {
150
+ throw new TypeError(
151
+ `the input shape "${shape.kind}" is not the shape of these ${args.length} arguments ("${expected.kind}")`
152
+ )
153
+ }
154
+ const reader = new Reader()
155
+ const read: { readonly path: string; value: unknown }[] = []
156
+ reader.guard("$", () => {
157
+ switch (shape.kind) {
158
+ case "none":
159
+ return reader.noArguments(input)
160
+ case "fields":
161
+ // The record is the input object itself; no arguments is no fields.
162
+ read.push({
163
+ path: "$",
164
+ value: reader.read(args[0] as AnyFieldSchema, input ?? {}, "$", 0),
165
+ })
166
+ return
167
+ case "positional":
168
+ return reader.positional(args, input ?? {}, read)
169
+ }
170
+ })
171
+ if (reader.issues.length > 0) return { ok: false, issues: reader.issues }
172
+ const issues: InputIssue[] = []
173
+ read.forEach(({ path, value }, i) => {
174
+ issues.push(...validationIssues(args[i] as AnyFieldSchema, value, path))
175
+ })
176
+ if (issues.length > 0) return { ok: false, issues }
177
+ return { ok: true, values: read.map(({ value }) => value) }
178
+ }
179
+
180
+ /**
181
+ * The Candid value of one JSON value, as the conventions above read it, and
182
+ * checked with `validate`. Issues are rooted at `path` (default `$`).
183
+ */
184
+ export function valueFromJson(
185
+ schema: AnyFieldSchema,
186
+ json: unknown,
187
+ path = "$"
188
+ ): ReadResult {
189
+ const reader = new Reader()
190
+ let value: unknown
191
+ reader.guard(path, () => {
192
+ value = reader.read(schema, json, path, 0)
193
+ })
194
+ if (reader.issues.length > 0) return { ok: false, issues: reader.issues }
195
+ const issues = validationIssues(schema, value, path)
196
+ return issues.length > 0 ? { ok: false, issues } : { ok: true, value }
197
+ }
198
+
199
+ /**
200
+ * A value as canonical JSON. Never throws: a value the schema does not
201
+ * describe is written as best it can be (bigints as strings, bytes as hex).
202
+ */
203
+ export function valueToJson(schema: AnyFieldSchema, value: unknown): Json {
204
+ try {
205
+ return toJson(schema, value, 0)
206
+ } catch {
207
+ // A broken schema, or a value whose getters throw: decoded values have
208
+ // neither.
209
+ try {
210
+ return looseJson(value, 0)
211
+ } catch {
212
+ return null
213
+ }
214
+ }
215
+ }
216
+
217
+ /**
218
+ * The ok and err payload schemas when `results` is one `Ok`/`Err` (or
219
+ * `ok`/`err`) variant: the client resolves with the ok payload and rejects
220
+ * with the err payload. Undefined for any other result list.
221
+ */
222
+ export function resultArms(
223
+ results: readonly AnyFieldSchema[]
224
+ ): { readonly ok: AnyFieldSchema; readonly err: AnyFieldSchema } | undefined {
225
+ const [only] = results
226
+ if (results.length !== 1 || only === undefined || !isResultSchema(only)) {
227
+ return undefined
228
+ }
229
+ const node = resolve(only)
230
+ if (node.kind !== "variant") return undefined
231
+ // isResultSchema accepts exactly Ok/Err or ok/err, never a mix.
232
+ const ok = armOf(node, "Ok") ?? armOf(node, "ok")
233
+ const err = armOf(node, "Err") ?? armOf(node, "err")
234
+ return ok === undefined || err === undefined ? undefined : { ok, err }
235
+ }
236
+
237
+ // ---------------------------------------------------------------------------
238
+ // Reading.
239
+ // ---------------------------------------------------------------------------
240
+
241
+ // What a read returns for a value it refused; the issue is already recorded.
242
+ const INVALID = Symbol("invalid")
243
+
244
+ const SIGNED_DECIMAL = /^-?[0-9]+$/
245
+
246
+ class Reader {
247
+ readonly issues: InputIssue[] = []
248
+ private values = 0
249
+ private halted = false
250
+
251
+ /** Records an issue; returns INVALID for the caller to return. */
252
+ issue(path: string, message: string): typeof INVALID {
253
+ if (!this.halted) {
254
+ this.issues.push({ path, message })
255
+ if (this.issues.length >= INPUT_LIMITS.maxIssues) this.halted = true
256
+ }
257
+ return INVALID
258
+ }
259
+
260
+ /** Runs a read, turning a broken schema's exception into an issue. */
261
+ guard(path: string, run: () => void): void {
262
+ try {
263
+ run()
264
+ } catch (error) {
265
+ this.halted = false
266
+ this.issue(
267
+ path,
268
+ `the method's Candid type could not be read: ${error instanceof Error ? error.message : String(error)}`
269
+ )
270
+ }
271
+ }
272
+
273
+ /** One JSON value: charged against the bounds, then read. */
274
+ read(
275
+ schema: AnyFieldSchema,
276
+ json: unknown,
277
+ path: string,
278
+ depth: number
279
+ ): unknown {
280
+ if (this.halted) return INVALID
281
+ if (depth > INPUT_LIMITS.maxDepth) {
282
+ this.issue(
283
+ path,
284
+ `the input is nested deeper than ${INPUT_LIMITS.maxDepth} levels here`
285
+ )
286
+ this.halted = true
287
+ return INVALID
288
+ }
289
+ this.values++
290
+ if (this.values > INPUT_LIMITS.maxValues) {
291
+ this.issue(
292
+ path,
293
+ `the input holds more than ${INPUT_LIMITS.maxValues} values; send less in one call`
294
+ )
295
+ this.halted = true
296
+ return INVALID
297
+ }
298
+ return this.node(schema, json, path, depth)
299
+ }
300
+
301
+ noArguments(input: unknown): void {
302
+ if (input === undefined || input === null) return
303
+ if (!isPlainObject(input)) {
304
+ this.issue(
305
+ "$",
306
+ `expected {}: this method takes no arguments, got ${got(input)}`
307
+ )
308
+ return
309
+ }
310
+ for (const key of Object.keys(input)) {
311
+ this.issue(
312
+ childPath("$", key),
313
+ "unknown key: this method takes no arguments"
314
+ )
315
+ }
316
+ }
317
+
318
+ positional(
319
+ args: readonly AnyFieldSchema[],
320
+ input: unknown,
321
+ out: { readonly path: string; value: unknown }[]
322
+ ): void {
323
+ if (!isPlainObject(input)) {
324
+ this.issue(
325
+ "$",
326
+ `expected an object with the arguments arg0 to arg${args.length - 1}, got ${got(input)}`
327
+ )
328
+ return
329
+ }
330
+ const keys = args.map((_, i) => `arg${i}`)
331
+ args.forEach((arg, i) => {
332
+ const key = keys[i] as string
333
+ const path = childPath("$", key)
334
+ if (!isPresent(input, key)) {
335
+ if (resolve(arg).kind === "opt") out.push({ path, value: null })
336
+ else
337
+ this.issue(
338
+ path,
339
+ `missing argument (${typeText(arg, { maxChars: 80 })})`
340
+ )
341
+ return
342
+ }
343
+ out.push({ path, value: this.read(arg, input[key], path, 1) })
344
+ })
345
+ for (const key of Object.keys(input)) {
346
+ if (!keys.includes(key)) {
347
+ this.issue(childPath("$", key), unknownKey(key, keys, "arguments"))
348
+ }
349
+ }
350
+ }
351
+
352
+ private node(
353
+ schema: AnyFieldSchema,
354
+ json: unknown,
355
+ path: string,
356
+ depth: number
357
+ ): unknown {
358
+ const node = resolve(schema)
359
+ switch (node.kind) {
360
+ case "primitive":
361
+ return this.primitive(node.primitive, json, path)
362
+ case "blob":
363
+ return this.blob(json, path)
364
+ case "unit":
365
+ return this.unit(json, path)
366
+ case "opt":
367
+ return this.opt(node, json, path, depth)
368
+ case "vec":
369
+ return this.vec(node.inner, json, path, depth)
370
+ case "record":
371
+ return this.record(node, json, path, depth)
372
+ case "tuple":
373
+ return this.tuple(node, json, path, depth)
374
+ case "variant":
375
+ return this.variant(node, json, path, depth)
376
+ case "func":
377
+ return this.func(json, path)
378
+ case "service":
379
+ return this.principal(json, path, "a service reference")
380
+ }
381
+ }
382
+
383
+ private primitive(p: string, json: unknown, path: string): unknown {
384
+ if (FIXED_RANGES[p] !== undefined) return this.fixed(p, json, path)
385
+ if (BIG_RANGES[p] !== undefined) return this.big(p, json, path)
386
+ switch (p) {
387
+ case "bool":
388
+ return typeof json === "boolean"
389
+ ? json
390
+ : this.issue(path, `expected true or false (bool), got ${got(json)}`)
391
+ case "null":
392
+ return json === null
393
+ ? null
394
+ : this.issue(path, `expected null, got ${got(json)}`)
395
+ case "reserved":
396
+ // Every value inhabits reserved, and it is sent as null.
397
+ return null
398
+ case "empty":
399
+ return this.issue(
400
+ path,
401
+ "nothing can be sent here: the type is empty, which has no values"
402
+ )
403
+ case "text":
404
+ return typeof json === "string"
405
+ ? this.text(json, path)
406
+ : this.issue(path, `expected a string (text), got ${got(json)}`)
407
+ case "float32":
408
+ case "float64":
409
+ return this.float(p, json, path)
410
+ case "principal":
411
+ return this.principal(json, path, "a principal")
412
+ default:
413
+ return this.issue(path, `unsupported Candid type ${p}`)
414
+ }
415
+ }
416
+
417
+ private text(text: string, path: string): unknown {
418
+ const at = loneSurrogateAt(text)
419
+ if (at === -1) return text
420
+ const unit = text.charCodeAt(at).toString(16)
421
+ return this.issue(
422
+ path,
423
+ `the text has a lone surrogate (\\u${unit} at index ${at}); Candid text is Unicode characters only`
424
+ )
425
+ }
426
+
427
+ private fixed(p: string, json: unknown, path: string): unknown {
428
+ const [min, max] = FIXED_RANGES[p] as readonly [number, number]
429
+ const range = `${p} is an integer from ${min} to ${max}`
430
+ let value: number
431
+ if (typeof json === "number") {
432
+ if (!Number.isInteger(json))
433
+ return this.issue(path, `${range}, got ${json}`)
434
+ value = json
435
+ } else if (
436
+ typeof json === "string" &&
437
+ SIGNED_DECIMAL.test(json.trim()) &&
438
+ json.trim().length <= 40
439
+ ) {
440
+ const big = BigInt(json.trim())
441
+ if (big < BigInt(min) || big > BigInt(max)) {
442
+ return this.issue(path, `${range}, got ${big}`)
443
+ }
444
+ value = Number(big)
445
+ } else {
446
+ return this.issue(
447
+ path,
448
+ `expected ${p}, an integer from ${min} to ${max}, got ${got(json)}`
449
+ )
450
+ }
451
+ if (value < min || value > max)
452
+ return this.issue(path, `${range}, got ${value}`)
453
+ return value === 0 ? 0 : value // -0 is 0
454
+ }
455
+
456
+ private big(p: string, json: unknown, path: string): unknown {
457
+ const range = BIG_RANGES[p] as (typeof BIG_RANGES)[string]
458
+ let value: bigint
459
+ if (typeof json === "number") {
460
+ if (!Number.isInteger(json)) {
461
+ return this.issue(path, `${p} is an integer, got ${json}`)
462
+ }
463
+ if (!Number.isSafeInteger(json)) {
464
+ return this.issue(
465
+ path,
466
+ `${p} needs the exact digits as a decimal string: a JSON number this large (past 2^53) has already lost digits, so write the value in quotes`
467
+ )
468
+ }
469
+ value = BigInt(json)
470
+ } else if (typeof json === "string" && SIGNED_DECIMAL.test(json.trim())) {
471
+ const digits = json.trim()
472
+ if (digits.length > INPUT_LIMITS.maxDigits) {
473
+ return this.issue(
474
+ path,
475
+ `this number has more than ${INPUT_LIMITS.maxDigits} digits`
476
+ )
477
+ }
478
+ value = BigInt(digits)
479
+ } else {
480
+ return this.issue(
481
+ path,
482
+ `expected ${p} as a decimal string (${range.text}), such as "150000000", got ${got(json)}`
483
+ )
484
+ }
485
+ if (
486
+ (range.min !== undefined && value < range.min) ||
487
+ (range.max !== undefined && value > range.max)
488
+ ) {
489
+ return this.issue(path, `${p} is ${range.text}, got ${value}`)
490
+ }
491
+ return value
492
+ }
493
+
494
+ private float(p: string, json: unknown, path: string): unknown {
495
+ let value: number
496
+ if (typeof json === "number") {
497
+ value = json
498
+ } else if (
499
+ typeof json === "string" &&
500
+ (FLOAT_WORDS as readonly string[]).includes(json.trim())
501
+ ) {
502
+ value = Number(json.trim()) // "NaN", "Infinity", "-Infinity", "-0"
503
+ } else {
504
+ return this.issue(
505
+ path,
506
+ `expected ${p} as a JSON number (or "NaN", "Infinity", "-Infinity", "-0"), got ${got(json)}`
507
+ )
508
+ }
509
+ if (
510
+ p === "float32" &&
511
+ !Number.isNaN(value) &&
512
+ Math.fround(value) !== value
513
+ ) {
514
+ const nearest = Math.fround(value)
515
+ return this.issue(
516
+ path,
517
+ Number.isFinite(nearest)
518
+ ? `float32 cannot hold ${value} exactly; the nearest float32 value is ${nearest}`
519
+ : `${value} is past the range of float32 (±3.4028234663852886e+38)`
520
+ )
521
+ }
522
+ return value
523
+ }
524
+
525
+ private principal(json: unknown, path: string, what: string): unknown {
526
+ if (typeof json !== "string") {
527
+ return this.issue(
528
+ path,
529
+ `expected ${what} as principal text such as "${EXAMPLE_PRINCIPAL}", got ${got(json)}`
530
+ )
531
+ }
532
+ const text = json.trim().toLowerCase()
533
+ if (isPrincipal(text)) return text
534
+ return this.issue(path, principalProblem(json.trim(), what))
535
+ }
536
+
537
+ private blob(json: unknown, path: string): unknown {
538
+ if (typeof json === "string") {
539
+ const bytes = fromHex(json)
540
+ return (
541
+ bytes ??
542
+ this.issue(
543
+ path,
544
+ `expected a blob as hex (an even number of hex digits, such as "00ff") or as { "utf8": text }, got ${got(json)}`
545
+ )
546
+ )
547
+ }
548
+ if (!isPlainObject(json) || !hasOwnEnumerable(json, "utf8")) {
549
+ return this.issue(
550
+ path,
551
+ `expected a blob as hex such as "00ff", or as { "utf8": text }, got ${got(json)}`
552
+ )
553
+ }
554
+ let ok = true
555
+ for (const key of Object.keys(json)) {
556
+ if (key !== "utf8") {
557
+ ok = false
558
+ this.issue(
559
+ childPath(path, key),
560
+ 'unknown key: a blob written as text is exactly { "utf8": text }'
561
+ )
562
+ }
563
+ }
564
+ const text = json.utf8
565
+ if (typeof text !== "string") {
566
+ return this.issue(
567
+ childPath(path, "utf8"),
568
+ `expected a string, got ${got(text)}`
569
+ )
570
+ }
571
+ if (this.text(text, childPath(path, "utf8")) === INVALID || !ok)
572
+ return INVALID
573
+ return new TextEncoder().encode(text)
574
+ }
575
+
576
+ private unit(json: unknown, path: string): unknown {
577
+ if (!isPlainObject(json)) {
578
+ return this.issue(
579
+ path,
580
+ `expected {} (the empty record), got ${got(json)}`
581
+ )
582
+ }
583
+ const keys = Object.keys(json)
584
+ for (const key of keys) {
585
+ this.issue(
586
+ childPath(path, key),
587
+ "unknown key: this is the empty record, written {}"
588
+ )
589
+ }
590
+ return keys.length === 0 ? {} : INVALID
591
+ }
592
+
593
+ private opt(
594
+ node: OptNode,
595
+ json: unknown,
596
+ path: string,
597
+ depth: number
598
+ ): unknown {
599
+ if (json === null) return null
600
+ const inner = resolve(node.inner)
601
+ if (admitsNull(inner)) {
602
+ // The value can itself be null, so a present one is boxed: { some }.
603
+ if (!isPlainObject(json) || !hasOwnEnumerable(json, "some")) {
604
+ return this.issue(
605
+ path,
606
+ `expected null or { "some": … }: this opt's value can itself be null, so a present value is boxed, got ${got(json)}`
607
+ )
608
+ }
609
+ let ok = true
610
+ for (const key of Object.keys(json)) {
611
+ if (key !== "some") {
612
+ ok = false
613
+ this.issue(
614
+ childPath(path, key),
615
+ 'unknown key: a present value is exactly { "some": value }'
616
+ )
617
+ }
618
+ }
619
+ const value = this.read(
620
+ node.inner,
621
+ json.some,
622
+ childPath(path, "some"),
623
+ depth + 1
624
+ )
625
+ return ok && value !== INVALID ? { some: value } : INVALID
626
+ }
627
+ if (
628
+ isPlainObject(json) &&
629
+ Object.keys(json).length === 1 &&
630
+ hasOwnEnumerable(json, "some") &&
631
+ !(inner.kind === "record" && fieldOf(inner, "some") !== undefined)
632
+ ) {
633
+ return this.issue(
634
+ path,
635
+ 'write the value itself (or null for none), without { "some": … }: this opt is not boxed'
636
+ )
637
+ }
638
+ // The value itself, at the same level of the JSON.
639
+ return this.node(node.inner, json, path, depth)
640
+ }
641
+
642
+ private vec(
643
+ inner: AnyFieldSchema,
644
+ json: unknown,
645
+ path: string,
646
+ depth: number
647
+ ): unknown {
648
+ if (!Array.isArray(json)) {
649
+ return this.issue(
650
+ path,
651
+ `expected an array (vec ${typeText(inner, { maxChars: 80 })}), got ${got(json)}`
652
+ )
653
+ }
654
+ if (json.length > INPUT_LIMITS.maxVecLength) {
655
+ return this.issue(
656
+ path,
657
+ `a vec here holds at most ${INPUT_LIMITS.maxVecLength} elements, got ${json.length}`
658
+ )
659
+ }
660
+ const out: unknown[] = []
661
+ let ok = true
662
+ for (let i = 0; i < json.length && !this.halted; i++) {
663
+ const value = this.read(inner, json[i], childPath(path, i), depth + 1)
664
+ if (value === INVALID) ok = false
665
+ out.push(value)
666
+ }
667
+ return ok && !this.halted ? out : INVALID
668
+ }
669
+
670
+ private record(
671
+ node: RecordNode,
672
+ json: unknown,
673
+ path: string,
674
+ depth: number
675
+ ): unknown {
676
+ const fields = fieldsOf(node)
677
+ if (!isPlainObject(json)) {
678
+ return this.issue(
679
+ path,
680
+ `expected an object with the fields ${nameList(fields.map(([key]) => key))}, got ${got(json)}`
681
+ )
682
+ }
683
+ const out: Record<string, unknown> = {}
684
+ let ok = true
685
+ for (const [key, field] of fields) {
686
+ if (this.halted) return INVALID
687
+ const at = childPath(path, key)
688
+ if (!isPresent(json, key)) {
689
+ // An opt field left out is null.
690
+ if (resolve(field).kind === "opt") {
691
+ setOwn(out, key, null)
692
+ } else {
693
+ ok = false
694
+ this.issue(at, `missing field (${typeText(field, { maxChars: 80 })})`)
695
+ }
696
+ continue
697
+ }
698
+ const value = this.read(field, json[key], at, depth + 1)
699
+ if (value === INVALID) ok = false
700
+ else setOwn(out, key, value)
701
+ }
702
+ const keys = fields.map(([key]) => key)
703
+ for (const key of Object.keys(json)) {
704
+ if (this.halted) return INVALID
705
+ if (fieldOf(node, key) === undefined) {
706
+ ok = false
707
+ this.issue(childPath(path, key), unknownKey(key, keys, "fields"))
708
+ }
709
+ }
710
+ return ok ? out : INVALID
711
+ }
712
+
713
+ private tuple(
714
+ node: TupleNode,
715
+ json: unknown,
716
+ path: string,
717
+ depth: number
718
+ ): unknown {
719
+ const elements = elementsOf(node)
720
+ if (!Array.isArray(json) || json.length !== elements.length) {
721
+ return this.issue(
722
+ path,
723
+ `expected an array of exactly ${elements.length} values (a tuple), got ${got(json)}`
724
+ )
725
+ }
726
+ const out: unknown[] = []
727
+ let ok = true
728
+ elements.forEach((element, i) => {
729
+ const value = this.read(element, json[i], childPath(path, i), depth + 1)
730
+ if (value === INVALID) ok = false
731
+ out.push(value)
732
+ })
733
+ return ok && !this.halted ? out : INVALID
734
+ }
735
+
736
+ private variant(
737
+ node: VariantNode,
738
+ json: unknown,
739
+ path: string,
740
+ depth: number
741
+ ): unknown {
742
+ const tags = armsOf(node).map(([tag]) => tag)
743
+ if (typeof json === "string") {
744
+ // Just the tag, for an arm without a payload.
745
+ const arm = armOf(node, json)
746
+ if (arm === undefined) return this.issue(path, unknownTag(json, tags))
747
+ if (!isTagOnly(arm)) {
748
+ return this.issue(
749
+ path,
750
+ `the arm ${quote(json)} carries a value: write { "tag": ${quote(json)}, "value": … }`
751
+ )
752
+ }
753
+ return { tag: json }
754
+ }
755
+ if (!isPlainObject(json)) {
756
+ return this.issue(
757
+ path,
758
+ `expected a variant, { "tag": arm, "value": payload }, got ${got(json)}`
759
+ )
760
+ }
761
+ if (!hasOwnEnumerable(json, "tag")) {
762
+ const [only, ...others] = Object.keys(json)
763
+ if (
764
+ only !== undefined &&
765
+ others.length === 0 &&
766
+ only !== "value" &&
767
+ armOf(node, only) !== undefined
768
+ ) {
769
+ return this.issue(
770
+ path,
771
+ `write { "tag": ${quote(only)}, "value": … }, not { ${quote(only)}: … }`
772
+ )
773
+ }
774
+ return this.issue(
775
+ childPath(path, "tag"),
776
+ `missing tag: a variant is { "tag": arm, "value": payload }, the arms being ${nameList(tags)}`
777
+ )
778
+ }
779
+ const tag = json.tag
780
+ if (typeof tag !== "string") {
781
+ return this.issue(
782
+ childPath(path, "tag"),
783
+ `expected the arm's name as a string, got ${got(tag)}`
784
+ )
785
+ }
786
+ const arm = armOf(node, tag)
787
+ if (arm === undefined)
788
+ return this.issue(childPath(path, "tag"), unknownTag(tag, tags))
789
+ let ok = true
790
+ for (const key of Object.keys(json)) {
791
+ if (key !== "tag" && key !== "value") {
792
+ ok = false
793
+ this.issue(
794
+ childPath(path, key),
795
+ 'unknown key: a variant is { "tag": arm, "value": payload }'
796
+ )
797
+ }
798
+ }
799
+ if (isTagOnly(arm)) {
800
+ if (isPresent(json, "value") && json.value !== null) {
801
+ ok = false
802
+ this.issue(
803
+ childPath(path, "value"),
804
+ `the arm ${quote(tag)} carries no value: leave "value" out`
805
+ )
806
+ }
807
+ return ok ? { tag } : INVALID
808
+ }
809
+ if (!isPresent(json, "value")) {
810
+ return this.issue(
811
+ childPath(path, "value"),
812
+ `missing value: the arm ${quote(tag)} carries ${typeText(arm, { maxChars: 80 })}`
813
+ )
814
+ }
815
+ const value = this.read(
816
+ arm,
817
+ json.value,
818
+ childPath(path, "value"),
819
+ depth + 1
820
+ )
821
+ return ok && value !== INVALID ? { tag, value } : INVALID
822
+ }
823
+
824
+ private func(json: unknown, path: string): unknown {
825
+ if (!isPlainObject(json)) {
826
+ return this.issue(
827
+ path,
828
+ `expected a func reference, { "principal": text, "method": name }, got ${got(json)}`
829
+ )
830
+ }
831
+ let principal: unknown = INVALID
832
+ if (isPresent(json, "principal")) {
833
+ principal = this.principal(
834
+ json.principal,
835
+ childPath(path, "principal"),
836
+ "the func's canister"
837
+ )
838
+ } else {
839
+ this.issue(
840
+ childPath(path, "principal"),
841
+ "missing the canister's principal"
842
+ )
843
+ }
844
+ const method = json.method
845
+ const methodPath = childPath(path, "method")
846
+ let ok = false
847
+ if (!isPresent(json, "method")) {
848
+ this.issue(methodPath, "missing the method's name")
849
+ } else if (typeof method !== "string" || method.length === 0) {
850
+ this.issue(
851
+ methodPath,
852
+ `expected the method's name as a non-empty string, got ${got(method)}`
853
+ )
854
+ } else {
855
+ ok = this.text(method, methodPath) !== INVALID
856
+ }
857
+ for (const key of Object.keys(json)) {
858
+ if (key !== "principal" && key !== "method") {
859
+ ok = false
860
+ this.issue(
861
+ childPath(path, key),
862
+ 'unknown key: a func reference is { "principal", "method" }'
863
+ )
864
+ }
865
+ }
866
+ return ok && principal !== INVALID ? { principal, method } : INVALID
867
+ }
868
+ }
869
+
870
+ /** Present in the input: an own enumerable key whose value is not undefined. */
871
+ function isPresent(json: Record<string, unknown>, key: string): boolean {
872
+ return hasOwnEnumerable(json, key) && json[key] !== undefined
873
+ }
874
+
875
+ function unknownKey(
876
+ key: string,
877
+ keys: readonly string[],
878
+ noun: string
879
+ ): string {
880
+ const close = closeName(key, keys)
881
+ const hint = close === undefined ? "" : ` (did you mean ${quote(close)}?)`
882
+ return keys.length === 0
883
+ ? `unknown key${hint}`
884
+ : `unknown key${hint}; the ${noun} are ${nameList(keys)}`
885
+ }
886
+
887
+ function unknownTag(tag: string, tags: readonly string[]): string {
888
+ const close = closeName(tag, tags)
889
+ const hint = close === undefined ? "" : ` (did you mean ${quote(close)}?)`
890
+ return `unknown arm ${quote(tag)}${hint}; the arms are ${nameList(tags)}`
891
+ }
892
+
893
+ function principalProblem(text: string, what: string): string {
894
+ if (/^(0x)?[0-9a-f]{64}$/i.test(text)) {
895
+ return `${quote(text)} looks like an account identifier (64 hex digits), not ${what}: write principal text such as "${EXAMPLE_PRINCIPAL}"`
896
+ }
897
+ if (!/^[a-z2-7-]+$/i.test(text)) {
898
+ return `${quote(text)} is not principal text, which has only the letters a-z, the digits 2-7 and dashes, such as "${EXAMPLE_PRINCIPAL}"`
899
+ }
900
+ return `${quote(text)} is not a valid principal: its grouping or checksum is wrong (a typo?)`
901
+ }
902
+
903
+ /** validate()'s issues, their paths moved under the value's own path. */
904
+ function validationIssues(
905
+ schema: AnyFieldSchema,
906
+ value: unknown,
907
+ path: string
908
+ ): InputIssue[] {
909
+ const result = validate(schema as AnySchema, value)
910
+ if (result.ok) return []
911
+ return result.issues.map((issue) => ({
912
+ path: `${path}${issue.path.slice(1)}`,
913
+ message: issue.message,
914
+ }))
915
+ }
916
+
917
+ // ---------------------------------------------------------------------------
918
+ // Writing.
919
+ // ---------------------------------------------------------------------------
920
+
921
+ // Past this depth a value is written loosely; a decoded reply is at most 256
922
+ // levels deep under the codec's default limits.
923
+ const MAX_WRITE_DEPTH = 512
924
+
925
+ function toJson(schema: AnyFieldSchema, value: unknown, depth: number): Json {
926
+ if (depth > MAX_WRITE_DEPTH) return looseJson(value, depth)
927
+ const node = resolve(schema)
928
+ switch (node.kind) {
929
+ case "primitive":
930
+ return primitiveJson(node.primitive, value, depth)
931
+ case "blob":
932
+ return isBytes(value) ? toHex(value) : looseJson(value, depth)
933
+ case "unit":
934
+ return {}
935
+ case "opt": {
936
+ if (value === null || value === undefined) return null
937
+ if (!admitsNull(resolve(node.inner)))
938
+ return toJson(node.inner, value, depth + 1)
939
+ if (!isPlainObject(value) || !Object.hasOwn(value, "some"))
940
+ return looseJson(value, depth)
941
+ return { some: toJson(node.inner, value.some, depth + 1) }
942
+ }
943
+ case "vec":
944
+ return Array.isArray(value)
945
+ ? value.map((item: unknown) => toJson(node.inner, item, depth + 1))
946
+ : looseJson(value, depth)
947
+ case "record": {
948
+ if (!isPlainObject(value)) return looseJson(value, depth)
949
+ const out: { [key: string]: Json } = {}
950
+ for (const [key, field] of fieldsOf(node)) {
951
+ if (Object.hasOwn(value, key))
952
+ setOwn(out, key, toJson(field, value[key], depth + 1))
953
+ }
954
+ return out
955
+ }
956
+ case "tuple": {
957
+ const elements = elementsOf(node)
958
+ if (!Array.isArray(value)) return looseJson(value, depth)
959
+ return value.map((item: unknown, i) => {
960
+ const element = elements[i]
961
+ return element === undefined
962
+ ? looseJson(item, depth + 1)
963
+ : toJson(element, item, depth + 1)
964
+ })
965
+ }
966
+ case "variant": {
967
+ const tag = isPlainObject(value) ? value.tag : undefined
968
+ const arm = typeof tag === "string" ? armOf(node, tag) : undefined
969
+ if (
970
+ typeof tag !== "string" ||
971
+ arm === undefined ||
972
+ !isPlainObject(value)
973
+ ) {
974
+ return looseJson(value, depth)
975
+ }
976
+ if (isTagOnly(arm)) return { tag }
977
+ return { tag, value: toJson(arm, value.value, depth + 1) }
978
+ }
979
+ case "func": {
980
+ if (!isPlainObject(value)) return looseJson(value, depth)
981
+ return {
982
+ principal: looseJson(value.principal, depth + 1),
983
+ method: looseJson(value.method, depth + 1),
984
+ }
985
+ }
986
+ case "service":
987
+ return looseJson(value, depth)
988
+ }
989
+ }
990
+
991
+ function primitiveJson(p: string, value: unknown, depth: number): Json {
992
+ switch (p) {
993
+ case "null":
994
+ case "reserved":
995
+ case "empty":
996
+ return null
997
+ case "float32":
998
+ case "float64":
999
+ return typeof value === "number"
1000
+ ? floatJson(value)
1001
+ : looseJson(value, depth)
1002
+ }
1003
+ if (
1004
+ FIXED_RANGES[p] !== undefined &&
1005
+ typeof value === "number" &&
1006
+ Number.isFinite(value)
1007
+ ) {
1008
+ return value === 0 ? 0 : value // -0 is 0
1009
+ }
1010
+ // bool, text, principal, and nat, int, nat64, int64, whose bigint becomes
1011
+ // its decimal string: the rest are JSON already.
1012
+ return looseJson(value, depth)
1013
+ }
1014
+
1015
+ /** A float as JSON: a number, or the word for one JSON has no number for. */
1016
+ function floatJson(x: number): Json {
1017
+ if (Number.isNaN(x)) return "NaN"
1018
+ if (x === Infinity) return "Infinity"
1019
+ if (x === -Infinity) return "-Infinity"
1020
+ if (Object.is(x, -0)) return "-0"
1021
+ return x
1022
+ }
1023
+
1024
+ /** Any value as JSON, without a schema: what is written when nothing fits. */
1025
+ function looseJson(value: unknown, depth: number): Json {
1026
+ if (depth > MAX_WRITE_DEPTH) return "[nested too deep to show]"
1027
+ if (value === null || value === undefined) return null
1028
+ switch (typeof value) {
1029
+ case "boolean":
1030
+ case "string":
1031
+ return value
1032
+ case "number":
1033
+ return floatJson(value)
1034
+ case "bigint":
1035
+ return value.toString()
1036
+ case "object": {
1037
+ if (isBytes(value)) return toHex(value)
1038
+ if (Array.isArray(value))
1039
+ return value.map((item: unknown) => looseJson(item, depth + 1))
1040
+ const out: { [key: string]: Json } = {}
1041
+ for (const key of Object.keys(value)) {
1042
+ setOwn(
1043
+ out,
1044
+ key,
1045
+ looseJson((value as Record<string, unknown>)[key], depth + 1)
1046
+ )
1047
+ }
1048
+ return out
1049
+ }
1050
+ default:
1051
+ return null
1052
+ }
1053
+ }