@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,690 @@
1
+ ---
2
+ title: "The Vite plugin"
3
+ description: "@ic-reactor/vite-plugin: generation through @meantjs/cli in a child process, the ic_env cookie and /api proxy, and its options"
4
+ ---
5
+
6
+ `@ic-reactor/vite-plugin` is for an app built on a module that
7
+ `meant gen` generates from a `.did` file. It does two things, and it
8
+ exports only `icReactor` and the type `IcReactorPluginOptions`:
9
+
10
+ - **Generation.** It runs `meant gen` on each configured `.did` file
11
+ when a build or the dev server starts, and again when that file changes. The
12
+ module is the generator's, as it wrote it: the plugin adds no wrapper files,
13
+ hooks or reactors. A `.did` that is not on disk yet can be
14
+ [fetched from the live canister](#fetch-a-did-from-a-live-canister) first.
15
+ - **Environment.** Under `vite dev` and `vite preview` it sets the `ic_env`
16
+ cookie and proxies `/api` to the local IC network, so the app finds its
17
+ canister ids and the replica's root key without configuration.
18
+
19
+ ## Install
20
+
21
+ The plugin runs the `@meantjs/cli` that your app installs, and that CLI has
22
+ to pair with the `@meantjs/schema` runtime the generated modules import.
23
+ Both are pinned to one exact release, as Meant asks of every release before
24
+ 1.0, and so is the plugin's peer on the CLI:
25
+
26
+ ```sh
27
+ npm install --save-exact @meantjs/schema@0.6.0
28
+ npm install --save-dev --save-exact @meantjs/cli@0.5.1
29
+ npm install --save-dev @ic-reactor/vite-plugin
30
+ ```
31
+
32
+ The plugin imports neither package, and no `@ic-reactor` runtime. Its peers are
33
+ the CLI, Vite 4.2 up to 8, and `@icp-sdk/core` 6.1 or later, which is optional:
34
+ the plugin loads it only to [fetch a `.did`](#fetch-a-did-from-a-live-canister),
35
+ and an app on `@ic-reactor/core` has it installed already. See
36
+ [@ic-reactor/vite-plugin](/v4/packages/vite-plugin/).
37
+
38
+ ## Quick start
39
+
40
+ ```ts
41
+ // vite.config.ts
42
+ import { icReactor } from "@ic-reactor/vite-plugin"
43
+ import { defineConfig } from "vite"
44
+
45
+ export default defineConfig({
46
+ plugins: [
47
+ icReactor({
48
+ canisters: {
49
+ icrc1: { didFile: "did/icrc1.did" },
50
+ },
51
+ }),
52
+ ],
53
+ })
54
+ ```
55
+
56
+ On `vite dev` and `vite build` this writes `src/canisters/icrc1.ts`, the
57
+ generated module (it exports `actor` and the type `Actor`), and
58
+ `src/canisters/icrc1.envelope.json` beside it. The generator names its output
59
+ after the `.did` file, its name without the final `.did`, not after the key in
60
+ `canisters`, and it reads only a file whose name ends in `.did`. The app
61
+ imports it:
62
+
63
+ ```ts
64
+ import { createClient } from "@ic-reactor/core"
65
+ import { actor, type Actor } from "./canisters/icrc1"
66
+
67
+ const client = createClient({ network: "ic", identity: "anonymous" })
68
+ const ledger = client.canister<Actor>(actor, {
69
+ id: "ryjl3-tyaaa-aaaaa-aaaba-cai",
70
+ })
71
+ ```
72
+
73
+ Without an `outDir` the plugin writes to `src/canisters`. To match the
74
+ `./generated/...` imports of [Getting started](/v4/guides/getting-started/), set
75
+ `outDir: "src/generated"`.
76
+
77
+ The first line the plugin logs says where an agent reads how to use the
78
+ library: `ic-reactor: agent guide at node_modules/@ic-reactor/core/llms.txt`.
79
+
80
+ ## Options
81
+
82
+ | Option | Default | Meaning |
83
+ | ------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------- |
84
+ | `canisters` | `{}` | The app's canisters, by their name in the `icp` project |
85
+ | `injectEnvironment` | `true` | Set the cookie and the `/api` proxy under `vite dev` and `vite preview` |
86
+ | `failOnError` | build and Vitest `true`, dev `false` | Abort the Vite run when a canister fails to generate. See [Failures](#when-generation-fails) |
87
+ | `onGenerated` | none | Called after each generated module. See [After each generation](#after-each-generation) |
88
+
89
+ Each entry of `canisters` takes:
90
+
91
+ | Field | Default | Meaning |
92
+ | ------------ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
93
+ | `didFile` | none | The canister's Candid file, relative to the Vite root. Without it nothing is generated |
94
+ | `outDir` | `"src/canisters"` | Where the generator writes, relative to the Vite root |
95
+ | `canisterId` | none | A fixed id for the cookie, which wins over the one `icp` reports, and the canister a missing `didFile` is [fetched](#fetch-a-did-from-a-live-canister) from |
96
+ | `network` | `"ic"` | Where that canister is, for the fetch: `"ic"`, `"local"` or `{ host }` |
97
+ | `methods` | none | The methods the app calls: a fetched `didFile` is written as the [projection](#only-the-methods-the-app-calls) of the interface to them |
98
+ | `verify` | none | `"live"`: [check](#the-live-check) the `didFile` against the live canister when a build or dev server starts |
99
+
100
+ The key of an entry is the canister's name in the `icp` project, and it is the
101
+ name the cookie carries its id under, kept as given: `__proto__` or
102
+ `constructor` (from a JSON config, or a computed key) is a name as any other,
103
+ and so is a name that begins with `-`. The cookie joins its entries with `&`
104
+ and each name to its id with `=`, as the asset canister writes it, so a name
105
+ that holds either, which no name `icp` gives a canister does, is left out of
106
+ the cookie, with a warning under `vite dev`, and the canister is generated as
107
+ any other. A canister without a `didFile` generates nothing and is only named
108
+ in the cookie.
109
+
110
+ Every value given is checked when the plugin is made, on every canister (one
111
+ without a `didFile` included) and whether or not a build would use it: only an
112
+ omitted field is one not given. A canister whose entry is not a plain object,
113
+ or whose field holds a value that is not one (a `didFile` or `outDir` that is
114
+ not a path, a `canisterId` that is not the text of a principal, a `network`,
115
+ `methods` or `verify` that is none of the values above, or a getter that
116
+ throws) fails, under `failOnError`, with a message that quotes the value as
117
+ given, whatever its kind. The plugin fetches, writes, runs and requests
118
+ nothing to generate it, nor fetches a `didFile` it shares with other
119
+ canisters, and the others build as they would. So does a canister whose
120
+ module a canister before it writes (see
121
+ [below](#canisters-that-share-an-interface)), and one that `IC_REACTOR_FETCH`
122
+ or `IC_REACTOR_VERIFY` names but that has no `canisterId`. Under `vite dev`, a
123
+ save of its file, and the file's deletion, leave it failed for the same reason
124
+ and run nothing for it. Such a canister is still named in the cookie, as every
125
+ entry is (but one whose name the cookie cannot carry, above), and under
126
+ `vite dev` `icp` is still asked for its id: the app may still call it. A
127
+ `canisters`, `injectEnvironment` or `failOnError` that is not one, `null`
128
+ included, throws when the config loads: only an omitted option takes its
129
+ default.
130
+
131
+ Every key is checked too, whatever its value, `undefined` included. A key of
132
+ an entry that is none of the fields above (a misspelled `didfile` or
133
+ `canisterID`), or a key of a `network` of `{ host }` other than `host`, fails
134
+ its canister, and a key of the options that is none of `canisters`,
135
+ `injectEnvironment`, `failOnError` and `onGenerated` throws when the config loads. The
136
+ message names the option the key may misspell:
137
+
138
+ ```text
139
+ ic-reactor: could not generate 1 of 1 canisters:
140
+ - ledger (did/icp_ledger.did): "canisterID" (did you mean canisterId?) is not an option of a canister: its options are didFile, outDir, canisterId, network, methods and verify
141
+ ```
142
+
143
+ Never read, a misspelled key would leave a canister ungenerated, or generated
144
+ without its id, without a word.
145
+
146
+ The options, `canisters`, each entry and a `network` of `{ host }` are plain
147
+ objects: written `{ … }`, or made by `JSON.parse`, `Object.fromEntries` or
148
+ `Object.create(null)`. A `Map`, a `Promise` (a loader that was not awaited),
149
+ an instance of a class or an object that inherits from another is refused as
150
+ any other value that is not one: read for its keys, it would be read as none.
151
+
152
+ ### Canisters that share an interface
153
+
154
+ An ICP ledger and a ckBTC ledger can both use `icrc1.did`. They are two
155
+ entries, so that the cookie carries each id, and one generated module:
156
+
157
+ ```ts
158
+ // vite.config.ts
159
+ import { icReactor } from "@ic-reactor/vite-plugin"
160
+ import { defineConfig } from "vite"
161
+
162
+ export default defineConfig({
163
+ plugins: [
164
+ icReactor({
165
+ canisters: {
166
+ icp_ledger: { didFile: "did/icrc1.did" },
167
+ ckbtc_ledger: { didFile: "did/icrc1.did" },
168
+ },
169
+ }),
170
+ ],
171
+ })
172
+ ```
173
+
174
+ The generator is given `icrc1.did` once, writes `src/canisters/icrc1.ts` once,
175
+ and a save of the file regenerates it once.
176
+
177
+ Different `.did` files that name the same module cannot share an `outDir`:
178
+ `a/ledger.did` and `b/ledger.did` both mean `ledger.ts`. The entry later in
179
+ `canisters` fails, with a message naming both, at the start of each build and
180
+ dev server and before anything is fetched, run or written for it, and a save of
181
+ its file does not generate it either. Give one an `outDir` of its own. Names
182
+ that differ only in case (`Ledger.did`, `ledger.did`) collide only where the
183
+ filesystem of the `outDir` ignores case, as macOS and Windows do by default.
184
+
185
+ ## Fetch a .did from a live canister
186
+
187
+ A canister can publish its Candid interface as `candid:service` metadata. Give
188
+ its entry a `canisterId`, and a `didFile` that is not on disk is written from
189
+ the live canister before it is generated:
190
+
191
+ ```ts
192
+ // vite.config.ts
193
+ import { icReactor } from "@ic-reactor/vite-plugin"
194
+ import { defineConfig } from "vite"
195
+
196
+ export default defineConfig({
197
+ plugins: [
198
+ icReactor({
199
+ canisters: {
200
+ ledger: {
201
+ didFile: "did/icp_ledger.did", // written when missing: commit it
202
+ canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
203
+ network: "ic",
204
+ },
205
+ },
206
+ }),
207
+ ],
208
+ })
209
+ ```
210
+
211
+ - **`didFile` on disk:** the plugin generates from it and makes no network
212
+ request for the canister, under `vite build` and `vite dev` alike. Builds
213
+ stay reproducible and work offline. Commit the file.
214
+ - **`didFile` missing:** the plugin reads `candid:service` from certified
215
+ state (`HttpAgent.readState`, the certificate checked against the network's
216
+ root key), writes it to `didFile` as the canister publishes it, then
217
+ generates. It logs
218
+ `ic-reactor: wrote did/icp_ledger.did from the certified candid:service of ryjl3-tyaaa-aaaaa-aaaba-cai on ic (17368 bytes): commit it with the app`.
219
+ The next build reads the file and makes no request.
220
+ - **Fetching again** happens only when asked: run the build or the dev server
221
+ with `IC_REACTOR_FETCH=ledger` (names separated by commas, or `all`). A build
222
+ without it never rewrites a `didFile`. Under `vite dev` it is served once,
223
+ when the server starts.
224
+ - Canisters that name one `didFile` share one fetch. It is one file however
225
+ it is named: through a symlinked directory, or in another case where the
226
+ filesystem ignores case (macOS and Windows by default). When they name
227
+ different canisters, or one canister on different networks, which one's
228
+ interface the file holds cannot be told: nothing is fetched, and each of
229
+ them fails with a message naming them and the file. Give each its own
230
+ `didFile`, or write the file yourself. A `didFile` on disk is theirs to
231
+ share, whatever their `canisterId`s, since nothing is fetched for it. A
232
+ `didFile` that is a symlink is written through: the fetch goes to the file
233
+ it links to. The sharing is the fetch's only: the generator
234
+ (`@meantjs/cli` 0.5.1) reads a `didFile` only by its exact name on disk,
235
+ and not through a symlink to a file, so an entry that names it either way
236
+ fails with `did_source_not_found`. In each entry, name the file as it is on
237
+ disk.
238
+
239
+ `network` says where the canister is:
240
+
241
+ | `network` | Host | Root key the certificate is checked against |
242
+ | ---------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
243
+ | `"ic"` | `https://icp-api.io` | Mainnet's, which the agent ships with. The default |
244
+ | `"local"` | `http://127.0.0.1:8000` | Fetched from the replica: icp-cli's local network |
245
+ | `{ host }` | `host` | Fetched from the replica only when `host` is local (`localhost`, `*.localhost` or a loopback address), and mainnet's otherwise |
246
+
247
+ These are the rules `createClient` follows: a root key is fetched only from a
248
+ local host, so a host that is not local cannot hand over a key of its own. The
249
+ fetch needs `@icp-sdk/core`, an optional peer of the plugin. An app whose
250
+ `.did` files are all on disk never loads it.
251
+
252
+ `canisterId` is also the id the cookie carries under `vite dev` (see
253
+ [The local environment](#the-local-environment)). A canister deployed to the
254
+ local network under an id of its own, whose interface you want from mainnet,
255
+ keeps its committed `didFile`, or fetches it once and drops `canisterId`.
256
+
257
+ ### When a fetch fails
258
+
259
+ Each failure says what happened to which canister, and what to do next:
260
+
261
+ - **The network cannot be reached** (no connection, or the local network is
262
+ not running): the message names the host. Under `"local"` it says to start
263
+ the network with `icp network start`.
264
+ - **The read is refused:** the canister keeps its interface private, and only
265
+ its controllers can read it (HTTP 403). Get the `.did` from the canister's
266
+ developers.
267
+ - **No metadata:** the canister publishes no `candid:service`, so there is no
268
+ interface to fetch.
269
+ - **No such canister** on that network: check `canisterId` and `network`.
270
+ - **The certificate does not verify** against the root key in the table above:
271
+ the message names that key. A `{ host }` that is not local is checked against
272
+ mainnet's key, so a testnet's own certificates fail there.
273
+ - **No answer within 30 seconds**, retries included: the message names the
274
+ host.
275
+ - **The file cannot be written** (a read-only directory, say): only the
276
+ canisters that name it fail, and the others generate.
277
+
278
+ A canister whose fetch failed is not generated, and the failure follows
279
+ `failOnError` as a generation failure does: under `vite build` it fails the
280
+ build, under Vitest the run's startup, and under `vite dev` it is logged and
281
+ shown in the overlay. A fetch that
282
+ failed, one that `IC_REACTOR_FETCH` asked for included, is tried again at the
283
+ next `buildStart`: each rebuild of
284
+ `vite build --watch`, and each Vite environment that starts one. Writing the
285
+ `didFile` yourself always works instead: the plugin reads a file on disk and
286
+ fetches nothing.
287
+
288
+ ### Only the methods the app calls
289
+
290
+ A canister's interface can be far larger than what the app calls: the ICP
291
+ ledger's is 17 kB. With `methods`, the fetched `didFile` holds only those
292
+ methods and every type they reach, so the generated module has only them:
293
+
294
+ ```ts
295
+ // vite.config.ts
296
+ import { icReactor } from "@ic-reactor/vite-plugin"
297
+ import { defineConfig } from "vite"
298
+
299
+ export default defineConfig({
300
+ plugins: [
301
+ icReactor({
302
+ canisters: {
303
+ ledger: {
304
+ didFile: "did/icp_ledger.did", // the projection: commit it
305
+ canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
306
+ methods: ["icrc1_balance_of", "icrc1_fee", "icrc1_transfer"],
307
+ },
308
+ },
309
+ }),
310
+ ],
311
+ })
312
+ ```
313
+
314
+ The plugin fetches the certified `candid:service` as above, and writes its
315
+ projection to `methods` (`meant project`) instead of the whole
316
+ interface. It logs
317
+ `ic-reactor: wrote did/icp_ledger.did from the certified candid:service of ryjl3-tyaaa-aaaaa-aaaba-cai on ic, projected to icrc1_balance_of, icrc1_fee, icrc1_transfer (1327 bytes): commit it with the app`.
318
+ The projection keeps the canister's type names and doc comments, and prints
319
+ methods in name order. The same interface and the same list give the same
320
+ bytes, so `IC_REACTOR_FETCH` rewrites the file only when the canister changed.
321
+
322
+ - **A name the canister does not have** fails the canister, naming it and
323
+ listing the methods the canister has. Nothing is written.
324
+ - **A `didFile` on disk** is not fetched again when `methods` changes. The
325
+ plugin compares the two, with no network access, when the build starts and
326
+ when the file is saved. A name of `methods` that the file does not hold
327
+ fails the canister, since its module would lack the method. A method the
328
+ file holds that `methods` does not name is a warning, and the module keeps
329
+ it. Both say to run `IC_REACTOR_FETCH=<name>`, which writes the projection to
330
+ the new list. A file whose methods cannot be listed (it does not compile, or
331
+ `meant` fails) fails the canister: a comparison that did not run
332
+ does not pass. A file saved after its methods were listed, before its module
333
+ is generated, is not generated by that run (see
334
+ [A .did saved while the plugin reads it](#a-did-saved-while-the-plugin-reads-it)).
335
+ - Canisters that name one `didFile` share its fetch only when they name one
336
+ list. Every one of them generates from the file, so an entry with no
337
+ `canisterId` counts as much as the one it is fetched for: its `methods`, or
338
+ the whole interface when it names none. With different lists, or when one
339
+ of them fails for a value of its own (a list that cannot be projected to,
340
+ say), nothing is fetched and no request is made: each fails with one
341
+ message naming the entries and the file, and their lists when they differ,
342
+ or the reasons of the one that fails. A `didFile` on disk that nobody asked
343
+ to fetch again is read by them all, and compared with the list of each as
344
+ above.
345
+ - `methods` is a list of names: an empty list, or a name with a comma (which
346
+ `meant project` cannot take), fails the canister before any request. Only an
347
+ omitted `methods` is the whole interface: any other value a JavaScript config
348
+ gives (`null`, `false`, `0`, `""`) fails the canister too. Likewise only an
349
+ omitted `canisterId` is none: one given as `""` or `null`, or as text with a
350
+ letter wrong (its checksum tells) or of more than 63 characters (a principal
351
+ of the IC is at most 29 bytes), fails the canister, whether or not a fetch or
352
+ a check would use it, and is left out of the `ic_env` cookie with a warning
353
+ (see [Options](#options)).
354
+
355
+ ### The live check
356
+
357
+ A committed `didFile` is what the app was compiled against. To find out whether
358
+ the live canister still answers it, ask for the live check: `verify: "live"` on
359
+ an entry, or the variable `IC_REACTOR_VERIFY` for a run: `1` (or `true`, or
360
+ `all`) for every entry with a `canisterId`, or canister names separated by
361
+ commas. The plugin fetches the certified interface as above and checks the
362
+ `didFile` on disk against it (`meant check`) when a build or the dev server
363
+ starts. Each check is a network request, so `verify: "live"` makes every build
364
+ need the network. `IC_REACTOR_VERIFY=1 vite build` in CI keeps the other builds
365
+ offline, and `IC_REACTOR_VERIFY=0` (or `false`) turns the check off for a run,
366
+ `verify: "live"` included, so a project that checks every build can still build
367
+ offline.
368
+
369
+ The check asks whether every method of the file is still in the live service,
370
+ with the same mode, its arguments accepted and its results readable. Methods
371
+ only the canister has are not checked: a projection checks only the methods
372
+ the app calls.
373
+
374
+ | Live canister | Outcome |
375
+ | -------------------------------------------------------------------------- | --------------------------------------------------------- |
376
+ | Unchanged for the file's methods (new methods beside them included) | Logged: `did/icp_ledger.did matches the live interface …` |
377
+ | Changed compatibly for those methods (an optional field added to a result) | A warning, and the canister generates |
378
+ | Compatible only by reading a value as `null` (`special_opt_rule`) | A warning naming each method and path |
379
+ | A method missing (`method_missing`) or of another mode (`mode_changed`) | The canister fails |
380
+ | A method whose types no longer match (`method_incompatible`) | The canister fails, with the path into the type |
381
+
382
+ A failure lists each finding (up to 20) and says to fetch the file again,
383
+ regenerate, and fix the calls the type checker then reports:
384
+
385
+ ```text
386
+ ic-reactor: could not generate 1 of 1 canisters:
387
+ - ledger (did/icp_ledger.did): the live check found ryjl3-tyaaa-aaaaa-aaaba-cai on ic incompatible with did/icp_ledger.did (1 error):
388
+ icrc1_gone: method_missing: the live service has no method "icrc1_gone"
389
+ The generated module no longer matches the canister for these methods: fetch did/icp_ledger.did again with IC_REACTOR_FETCH=ledger, regenerate, and fix the calls the type checker then reports.
390
+ ```
391
+
392
+ A canister that fails the check is not generated, and the failure follows
393
+ `failOnError` as a failed fetch does. A check that cannot be made (the network
394
+ cannot be reached, the canister keeps its interface private, a side does not
395
+ compile) fails the canister too, with the fetch's own message and how to turn
396
+ the check off (`IC_REACTOR_VERIFY=0`): a check that was asked for and did not
397
+ run does not pass. A
398
+ file the same build just fetched is the live interface: it is not checked, and
399
+ passes as fetched.
400
+
401
+ Within one build or dev server, a check that passed is not made again for the
402
+ same text by a rebuild (`vite build --watch`) or by another Vite environment.
403
+ A check of that canister that fails, or cannot be made, drops the pass, and
404
+ so does a fetch of its file that fails or reads another interface. Restoring
405
+ a text that passed earlier then checks it again rather than standing in for a
406
+ check. What passes or fails is the text the run read when it began: the check
407
+ of a file saved before the check is done (even saved back) counts for nothing,
408
+ passed or failed. It records no pass, neither sets nor clears a failure that
409
+ stands, and that run does not generate the file (see
410
+ [A .did saved while the plugin reads it](#a-did-saved-while-the-plugin-reads-it)).
411
+ Each build and each start of the dev server, a restart included, checks every
412
+ canister again, so a restart finds a canister that changed since its last
413
+ check.
414
+
415
+ A save under `vite dev` never makes a request. So under `vite dev` a canister
416
+ whose check failed (or could not be made, as with the network down) stays
417
+ failed after a save, whatever the save changed, and is not generated, until a
418
+ start checks it again and the check passes, fetches the file again
419
+ (`IC_REACTOR_FETCH`), or runs with the check off. Restart the dev server (`r`
420
+ and Enter in its terminal) to check again.
421
+
422
+ `verify` takes only `"live"`: any other value, `true` or `false` included,
423
+ fails the canister, under `IC_REACTOR_VERIFY=0` too, before anything is
424
+ fetched for it, and so does `"live"` with no `canisterId`. Remove `verify` for
425
+ no check.
426
+
427
+ ### How the plugin runs Meant
428
+
429
+ The projection, the comparison of `methods` with a file on disk, and the check
430
+ run `meant project` and `meant check` in a child process, as generation runs
431
+ `gen` (see [Generation](#generation)): the app's own CLI, killed after 60
432
+ seconds, so a bad interface ends that process and not the dev server. Each run
433
+ costs a Node process (under 0.1 s on the ledger's interface), and runs only when
434
+ a file is fetched, when a `methods` entry's file changed, and in a live check.
435
+
436
+ ### A .did saved while the plugin reads it
437
+
438
+ Each step reads the `didFile` itself: listing its methods, the live check, and
439
+ generation each run `meant` on the file as it is then. A file saved
440
+ between two steps would let one step approve a text and another generate a
441
+ different one. So a run (the start of a build or dev server, or the
442
+ regeneration a save starts) reads each `didFile` once, when its steps start,
443
+ and reads it again after each step. A file written before the run is done
444
+ with it (even saved back as it was) is not taken: the run does not generate
445
+ it, reports nothing its steps found of it, and puts back a module the
446
+ generator wrote while the file was written. Then:
447
+
448
+ - Under `vite build`, the canister fails for that reason alone, and follows
449
+ `failOnError`:
450
+ `did/icp_ledger.did changed during the build, after the build read it: … Build again.`
451
+ - Under `vite dev`, the file is queued again, as a save is, and that run
452
+ reports the file as it is then. Until it does, the overlay is left as it
453
+ was: the run that took nothing says nothing of the canister, not even that
454
+ it is fixed. Like any save, the queued run makes no request, so a text saved
455
+ while the start's live check ran is not checked.
456
+
457
+ A live check whose file was saved before the check was done counts for
458
+ nothing, passed or failed: it records no pass, and under `vite dev` it neither
459
+ sets nor clears a failure that stands. One that read the file before it was
460
+ saved keeps its result, as for a save made just after the run.
461
+
462
+ Only the `didFile` itself is read again. `meant` also reads every `.did` beneath
463
+ its directory, for the files it imports; a change to one of those during a run
464
+ is not seen.
465
+
466
+ ## Generation
467
+
468
+ The generator is WebAssembly, so the plugin does not load it. It runs the bin
469
+ script of the `@meantjs/cli` installed for your app (resolved from the Vite
470
+ root, so a monorepo's hoisted copy is found) with the running Node binary, in a
471
+ child process and not through a shell. A trap, a crash or a runaway loop on a
472
+ bad `.did` ends that process, and the plugin reports it. The dev server is not
473
+ affected. The command it runs is
474
+ `gen <didFiles...> -o <outDir> --json`.
475
+
476
+ - Canisters that write into one `outDir` share one process, and each `outDir`
477
+ has its own. A process that dies without a report is run again, one canister
478
+ at a time, so the failure lands on the canister that caused it.
479
+ - A process that runs longer than 60 seconds is killed. A hang therefore costs
480
+ up to two timeouts (120 seconds) before the others are generated.
481
+ - What the generator writes to stderr is logged as a warning, a line at a time.
482
+ Past 200 lines from one process the rest is not logged.
483
+ - A declaration the generator cannot represent is left out of the module, and
484
+ the plugin logs each one as a warning, for example
485
+ `ic-reactor: ledger: omitted declaration Bad (reserved_field_name)`.
486
+ - Closing the dev server (or restarting it, as a `vite.config` edit does)
487
+ kills a generator of that server that is still running and drops its runs
488
+ still waiting, so none outlives the server it belonged to or runs beside the
489
+ next one. A server restarted with the same plugin object (an inline config,
490
+ which `server.restart()` keeps) has runs of its own: Vite starts it before
491
+ it closes the old one, and the old server's close does not stop them. Its
492
+ overlay starts as the old one's, and its runs change it.
493
+ - Editing a `.did` regenerates only the canisters that name it. Under
494
+ `vite build --watch`, a canister is regenerated only when its `.did` text
495
+ changed, or its module or envelope is missing.
496
+ - Deleting a `.did` under `vite dev` fails the canisters that name it at once,
497
+ because the module it generated is still on disk and would look current.
498
+ Putting the file back regenerates them.
499
+
500
+ ### When generation fails
501
+
502
+ A failed canister costs that canister, and nothing else:
503
+
504
+ - Under `vite build`, the build fails with the generator's diagnostics (or its
505
+ stderr, if it crashed) in the error message. A build that exits 0 would ship
506
+ the bindings left over from the last good run.
507
+ - Under `vite dev`, the failure is logged and shown in the browser's error
508
+ overlay, and the server keeps serving. Fixing the last broken canister clears
509
+ the overlay. Vite's client clears an error overlay whenever it applies a hot
510
+ update, so a canister that is still broken can drop out of the overlay after
511
+ you save another file. Its error stays in the terminal log, and a full
512
+ reload shows the overlay again.
513
+ - Under Vitest (mode `test`), the run fails at startup, as a build does: tests
514
+ that pass against the modules left over from the last good run prove
515
+ nothing.
516
+ - `failOnError` overrides each default. It takes `true` or `false`: any
517
+ other value (`null`, `0`, `"false"`) throws when the config loads, as does
518
+ one for `injectEnvironment`.
519
+
520
+ ### After each generation
521
+
522
+ `onGenerated` is called once for each module a run generated, after the
523
+ generator wrote or checked it and its envelope, under `vite build` and
524
+ `vite dev` alike. Use it for a step that reads the generated output and must
525
+ run after every generation:
526
+
527
+ ```ts
528
+ import { readFile } from "node:fs/promises"
529
+ import { icReactor } from "@ic-reactor/vite-plugin"
530
+
531
+ icReactor({
532
+ canisters: { ledger: { didFile: "did/ledger.did" } },
533
+ onGenerated: async ({ names, envelope, status }) => {
534
+ const text = await readFile(envelope, "utf-8")
535
+ // check it, or write derived files; throw to fail the run
536
+ console.log(names, status, text.length)
537
+ },
538
+ })
539
+ ```
540
+
541
+ - It is handed `names` (canisters that share a `didFile` and an `outDir`
542
+ share one module and one call), the absolute paths `didFile`, `module` and
543
+ `envelope`, `status` (`"written"`, or `"unchanged"` when the module on disk
544
+ was already what the generator would write), and a `signal` that aborts
545
+ when the build or dev server closes. A close stops waiting for the hook,
546
+ and the next run generates the module again and calls the hook again.
547
+ - It runs inside the plugin's one queue of runs: it never overlaps a
548
+ generation, and `buildStart` waits for it, so under `vite build` a hook
549
+ that never settles holds the build.
550
+ - It is not called for a canister that failed or was refused, nor for a run
551
+ that does not generate the module again (the second `buildStart` of
552
+ Vite 6 and later, a `vite build --watch` rebuild not caused by a `.did`
553
+ or by a missing module or envelope).
554
+ A save under `vite dev` always generates again, so saving the same text
555
+ calls it with `"unchanged"`.
556
+ - A throw or a rejection fails the module's canisters as a failed generation
557
+ does: the build or the Vitest run fails unless `failOnError` is `false`, and
558
+ otherwise the failure is logged and, under `vite dev`, shown in the error
559
+ overlay. The
560
+ next run generates them again and calls the hook again.
561
+ - A value that is not a function throws when the config loads.
562
+
563
+ ### In CI
564
+
565
+ `meant gen --check` compares the generated files with the ones on disk, writes
566
+ nothing, and exits 1 on any difference. Run it with the arguments the plugin
567
+ uses, to fail a pipeline when the committed output is stale:
568
+
569
+ ```json
570
+ {
571
+ "scripts": {
572
+ "gen:check": "meant gen did/icrc1.did -o src/canisters --check"
573
+ }
574
+ }
575
+ ```
576
+
577
+ ## The local environment
578
+
579
+ When `injectEnvironment` is on, under `vite dev` and `vite preview`, the plugin:
580
+
581
+ 1. asks `icp` for the local network's status (`icp network status`);
582
+ 2. resolves canister ids: the keys of `canisters`, and `internet_identity`,
583
+ which is added if it is not listed;
584
+ 3. sets the `ic_env` cookie on each response;
585
+ 4. proxies `/api` to the local replica.
586
+
587
+ A `canisterId` in the plugin config is used for that canister, and `icp` is not
588
+ asked for its id. `internet_identity` is asked for even then: what `icp`
589
+ reports decides whether the cookie also names icp-cli's built-in Internet
590
+ Identity. Set the `ICP_ENVIRONMENT` environment variable to use a network other
591
+ than `"local"`.
592
+
593
+ The plugin runs `icp` from `PATH`, with no shell. On Windows, where npm links
594
+ icp-cli's npm package as `icp.cmd`, it runs `@icp-sdk/icp-cli` with Node
595
+ instead: the app's own install, else a global npm install, else an `icp.exe`
596
+ on `PATH`.
597
+
598
+ ### The cookie
599
+
600
+ The cookie is `ic_env`, set with `Path=/; SameSite=Lax`. Its value is URI-encoded
601
+ text of this form:
602
+
603
+ ```text
604
+ ic_root_key=<hex key>&PUBLIC_CANISTER_ID:<name>=<id>&...&INTERNET_IDENTITY_PROVIDER=<url>
605
+ ```
606
+
607
+ It carries the replica's root key, one `PUBLIC_CANISTER_ID:<name>` for each
608
+ canister, and the local Internet Identity's url when there is one. A client
609
+ that trusts the cookie hands that url to its `auth` factory, so
610
+ `auth: (network) => new AuthClient(network)` signs in with the local Internet
611
+ Identity (see [Auth](/v4/guides/auth/#the-network-the-factory-is-handed)).
612
+
613
+ ### Detection
614
+
615
+ - If detection fails, the plugin falls back to proxying `/api` to icp-cli's
616
+ local network, `http://127.0.0.1:8000`, and sets no cookie (a page load
617
+ clears one the browser kept), or with no canisters configured, one that
618
+ names only the built-in Internet Identity. It warns when that
619
+ happens with canisters configured, and when a configured canister has no id.
620
+ Run with `DEBUG=ic-reactor` to see the `icp` output behind the warning.
621
+ - Detection is complete once `icp` reports the network and every configured
622
+ canister has an id. Until then the plugin asks `icp` again on each page load,
623
+ so start `vite dev` first, run `icp network start` and `icp deploy`, and
624
+ reload the page.
625
+ - Once detection is complete, page loads run no more `icp` commands, so any
626
+ network restart (`icp network stop`, then `start` and `icp deploy`) needs a
627
+ restart of the dev server, even when the root key stays the same: icp-cli
628
+ 1.2.0's managed network kept its root key across starts while a new deploy
629
+ gave the names other ids.
630
+ - While it serves, the plugin holds a connection to the detected network, so
631
+ it notices the network stop when it stops, whether or not a request reaches
632
+ it. From then on it no longer vouches for the ids it detected, which a
633
+ network started again may have given to other canisters: it warns once,
634
+ page loads get the cookie without those ids and that root key, and
635
+ `vite dev` reloads the pages it has open so that they drop the old cookie.
636
+ `{ name }` canisters then reject `canister_id_unresolved` until the dev
637
+ server restarts. Under `vite preview`, which has no HMR connection, reload
638
+ open pages yourself.
639
+ - A configured canister you never deploy locally keeps detection incomplete.
640
+ Set its `canisterId` and it counts as resolved. If you never run a local
641
+ network, set `injectEnvironment: false`.
642
+ - If your Vite config or another plugin sets `server.proxy["/api"]`, the plugin
643
+ leaves it alone.
644
+
645
+ ### How the app reads it
646
+
647
+ The app reads the cookie through `network: "env"` and calls canisters by name:
648
+
649
+ ```ts
650
+ import { createClient } from "@ic-reactor/core"
651
+ import { actor, type Actor } from "./canisters/backend"
652
+
653
+ const client = createClient({ network: "env", identity: "anonymous" })
654
+ const backend = client.canister<Actor>(actor, { name: "backend" })
655
+ ```
656
+
657
+ On a local page the client trusts the cookie, so `{ name: "backend" }` finds the
658
+ id that `icp deploy` gave the backend. `"env"` is for `localhost` pages: opened
659
+ by a LAN address (`vite --host`), a Docker host name or a tunnel, the page
660
+ still sends only to the dev server, but the client does not believe the
661
+ cookie there, so `{ name }` targets do not resolve and certified calls fail.
662
+ The plugin warns once when a page is loaded by a host that is not loopback.
663
+ See [The client](/v4/guides/client/#env-off-localhost). Nothing in the code names a host, a port
664
+ or an id. Deployed with `icp deploy -e ic`, `"env"` still sends through the
665
+ page's origin on `<id>.icp0.io`, where the client believes the asset
666
+ canister's cookie for canister ids, and for nothing else, so `{ name }`
667
+ resolves and sign-in uses mainnet's Internet Identity. On `<id>.ic0.app` and
668
+ on a custom domain it does not resolve: give the canister an `{ id }` baked in
669
+ at build time, as a mainnet build should on every domain.
670
+ `allowEnvConfig: true` is refused on `ic0.app`, because every other canister's
671
+ page can set a cookie there. See
672
+ [Deploy to mainnet](/v4/guides/client/#deploy-to-mainnet) for each domain and
673
+ [The client](/v4/guides/client/#the-ic_env-cookie) for when the cookie is
674
+ trusted. The [Vite wallet example](/v4/examples/vite-wallet/) is built this way
675
+ for a local network.
676
+
677
+ ## Tests
678
+
679
+ Vitest runs the plugin in mode `test`. There it injects no environment and
680
+ never runs `icp`, whatever `injectEnvironment` says. Generation is not an
681
+ environment concern and still runs, so the modules a test imports exist. A
682
+ canister that fails to generate fails the run at startup, unless `failOnError`
683
+ is `false`: a `.did` that does not parse, a fetch that fails, a live check
684
+ (`verify: "live"`, `IC_REACTOR_VERIFY`) that fails or cannot reach the
685
+ network, an `onGenerated` that throws. For an offline test run with the live
686
+ check on, set `IC_REACTOR_VERIFY=0`. A `.did` that stops generating after
687
+ startup, in watch mode, is logged, as under `vite dev`. A Vitest run in
688
+ another mode (`--mode`, `test.mode`) keeps the dev default, and a Vitest
689
+ config that does not load the plugin generates nothing. To test
690
+ canister code, see [Testing](/v4/guides/testing/).