@codespar/cli 0.14.1 → 0.17.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 (534) hide show
  1. package/README.md +44 -17
  2. package/dist/commands/audit-replay.js +267 -0
  3. package/dist/commands/audit-replay.js.map +1 -0
  4. package/dist/commands/init.js +28 -0
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/mandate-verify.js +98 -19
  7. package/dist/commands/mandate-verify.js.map +1 -1
  8. package/dist/index.js +17 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/mandate-codec.js +31 -20
  11. package/dist/mandate-codec.js.map +1 -1
  12. package/dist/surface.js +4 -1
  13. package/dist/surface.js.map +1 -1
  14. package/package.json +1 -1
  15. package/templates/bills-agent/README.md +8 -5
  16. package/templates/bills-agent/agents/bills-agent/.env.example +3 -3
  17. package/templates/bills-agent/agents/bills-agent/AGENTS.md +1 -1
  18. package/templates/bills-agent/agents/bills-agent/CLAUDE.md +1 -1
  19. package/templates/bills-agent/agents/bills-agent/README.md +62 -22
  20. package/templates/bills-agent/agents/bills-agent/SYSTEM_PROMPT.md +1 -1
  21. package/templates/bills-agent/agents/bills-agent/agent.yaml +2 -2
  22. package/templates/bills-agent/agents/bills-agent/package.json +14 -11
  23. package/templates/bills-agent/agents/bills-agent/src/kit.ts +193 -0
  24. package/templates/bills-agent/agents/bills-agent/test/adversarial.test.ts +8 -7
  25. package/templates/bills-agent/agents/bills-agent/test/check.test.ts +19 -2
  26. package/templates/bills-agent/agents/bills-agent/test/cli.test.ts +72 -24
  27. package/templates/bills-agent/agents/bills-agent/test/fixtures/excursao-300.transcript.jsonl +2 -0
  28. package/templates/bills-agent/agents/bills-agent/test/fixtures/material-400.transcript.jsonl +2 -0
  29. package/templates/bills-agent/agents/bills-agent/test/inspect.test.ts +124 -0
  30. package/templates/bills-agent/agents/bills-agent/test/provider.test.ts +25 -0
  31. package/templates/bills-agent/agents/bills-agent/test/scenarios.test.ts +10 -9
  32. package/templates/bills-agent/agents/bills-agent/tsconfig.json +0 -1
  33. package/templates/bills-agent/package.json +5 -2
  34. package/templates/bills-agent/packages/agent-core/README.md +2 -0
  35. package/templates/bills-agent/packages/agent-core/package.json +1 -1
  36. package/templates/bills-agent/packages/agent-core/src/api/charge-rail.ts +27 -6
  37. package/templates/bills-agent/packages/agent-core/src/api/rail.ts +16 -0
  38. package/templates/bills-agent/packages/agent-core/src/api/sandbox-payer.ts +20 -7
  39. package/templates/bills-agent/packages/agent-core/src/approval.ts +16 -2
  40. package/templates/bills-agent/packages/agent-core/src/bundle.ts +50 -4
  41. package/templates/bills-agent/packages/agent-core/src/channels.ts +140 -0
  42. package/templates/bills-agent/packages/agent-core/src/check.ts +90 -8
  43. package/templates/bills-agent/packages/agent-core/src/clock.ts +42 -0
  44. package/templates/bills-agent/packages/agent-core/src/engine.ts +119 -18
  45. package/templates/bills-agent/packages/agent-core/src/hash.ts +13 -0
  46. package/templates/bills-agent/packages/agent-core/src/index.ts +3 -0
  47. package/templates/bills-agent/packages/agent-core/src/manifest.ts +1 -1
  48. package/templates/bills-agent/packages/agent-core/src/rail.ts +16 -2
  49. package/templates/bills-agent/packages/agent-core/src/receipt-verification.ts +401 -0
  50. package/templates/bills-agent/packages/agent-core/src/state-machine.ts +3 -1
  51. package/templates/bills-agent/packages/agent-core/src/stubs/charge-rail.ts +2 -0
  52. package/templates/bills-agent/packages/agent-core/src/stubs/rail.ts +19 -2
  53. package/templates/bills-agent/packages/agent-core/src/types.ts +28 -0
  54. package/templates/bills-agent/packages/agent-core/test/approval.test.ts +36 -2
  55. package/templates/bills-agent/packages/agent-core/test/bundle.test.ts +85 -0
  56. package/templates/bills-agent/packages/agent-core/test/clock.test.ts +25 -0
  57. package/templates/bills-agent/packages/agent-core/test/engine.test.ts +73 -1
  58. package/templates/bills-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
  59. package/templates/bills-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
  60. package/templates/bills-agent/packages/agent-core/test/helpers.ts +1 -1
  61. package/templates/bills-agent/packages/agent-core/test/manifest.test.ts +2 -2
  62. package/templates/bills-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
  63. package/templates/bills-agent/packages/agent-core/test/receivables.test.ts +51 -0
  64. package/templates/bills-agent/packages/agent-runtime/README.md +68 -0
  65. package/templates/bills-agent/packages/agent-runtime/bin.mjs +32 -0
  66. package/templates/bills-agent/packages/agent-runtime/package.json +23 -0
  67. package/templates/bills-agent/{agents/bills-agent → packages/agent-runtime}/src/adversarial.ts +36 -44
  68. package/templates/bills-agent/packages/agent-runtime/src/agent.ts +68 -0
  69. package/templates/bills-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
  70. package/templates/bills-agent/packages/agent-runtime/src/channels/index.ts +72 -0
  71. package/templates/bills-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
  72. package/templates/bills-agent/packages/agent-runtime/src/channels/types.ts +124 -0
  73. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
  74. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
  75. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
  76. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
  77. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
  78. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
  79. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
  80. package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
  81. package/templates/bills-agent/packages/agent-runtime/src/cli.ts +98 -0
  82. package/templates/bills-agent/packages/agent-runtime/src/commands/check.ts +15 -0
  83. package/templates/bills-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
  84. package/templates/bills-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
  85. package/templates/bills-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
  86. package/templates/bills-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
  87. package/templates/bills-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
  88. package/templates/bills-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
  89. package/templates/bills-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
  90. package/templates/bills-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
  91. package/templates/bills-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
  92. package/templates/bills-agent/packages/agent-runtime/src/commands/start.ts +245 -0
  93. package/templates/bills-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
  94. package/templates/bills-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
  95. package/templates/bills-agent/packages/agent-runtime/src/default-kit.ts +83 -0
  96. package/templates/bills-agent/packages/agent-runtime/src/index.ts +12 -0
  97. package/templates/bills-agent/packages/agent-runtime/src/inspect.ts +797 -0
  98. package/templates/bills-agent/packages/agent-runtime/src/kit.ts +206 -0
  99. package/templates/{collections-agent/agents/collections-agent → bills-agent/packages/agent-runtime}/src/poll.ts +22 -11
  100. package/templates/{collections-agent/agents/collections-agent → bills-agent/packages/agent-runtime}/src/scenarios.ts +50 -34
  101. package/templates/bills-agent/{agents/bills-agent → packages/agent-runtime}/src/setup.ts +88 -66
  102. package/templates/bills-agent/packages/agent-runtime/src/terminal.ts +154 -0
  103. package/templates/{collections-agent/agents/collections-agent/channels/webhook/index.ts → bills-agent/packages/agent-runtime/src/webhook.ts} +1 -1
  104. package/templates/bills-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
  105. package/templates/bills-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
  106. package/templates/bills-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
  107. package/templates/bills-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
  108. package/templates/bills-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
  109. package/templates/bills-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
  110. package/templates/bills-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
  111. package/templates/bills-agent/packages/agent-runtime/tsconfig.json +9 -0
  112. package/templates/bills-agent/vitest.config.ts +1 -1
  113. package/templates/collections-agent/README.md +8 -5
  114. package/templates/collections-agent/agents/collections-agent/.env.example +14 -0
  115. package/templates/collections-agent/agents/collections-agent/AGENTS.md +6 -4
  116. package/templates/collections-agent/agents/collections-agent/CLAUDE.md +6 -4
  117. package/templates/collections-agent/agents/collections-agent/README.md +184 -16
  118. package/templates/collections-agent/agents/collections-agent/agent.yaml +3 -3
  119. package/templates/collections-agent/agents/collections-agent/channels/whatsapp/README.md +111 -0
  120. package/templates/collections-agent/agents/collections-agent/channels/whatsapp/acordo-1042.json +11 -0
  121. package/templates/collections-agent/agents/collections-agent/channels/whatsapp/acordo-1103.json +11 -0
  122. package/templates/collections-agent/agents/collections-agent/channels/whatsapp/templates.json +23 -0
  123. package/templates/collections-agent/agents/collections-agent/package.json +12 -10
  124. package/templates/collections-agent/agents/collections-agent/runbook.md +52 -1
  125. package/templates/collections-agent/agents/collections-agent/src/kit.ts +265 -0
  126. package/templates/collections-agent/agents/collections-agent/test/adversarial.test.ts +9 -8
  127. package/templates/collections-agent/agents/collections-agent/test/check.test.ts +43 -1
  128. package/templates/collections-agent/agents/collections-agent/test/cli.test.ts +56 -18
  129. package/templates/collections-agent/agents/collections-agent/test/fixtures/agreed-1042-awaiting-payer.transcript.jsonl +4 -0
  130. package/templates/collections-agent/agents/collections-agent/test/scenarios.test.ts +11 -10
  131. package/templates/collections-agent/agents/collections-agent/test/webhook.test.ts +4 -7
  132. package/templates/collections-agent/agents/collections-agent/test/whatsapp-poll.test.ts +271 -0
  133. package/templates/collections-agent/agents/collections-agent/test/whatsapp.test.ts +213 -0
  134. package/templates/collections-agent/agents/collections-agent/tsconfig.json +0 -1
  135. package/templates/collections-agent/package.json +3 -1
  136. package/templates/collections-agent/packages/agent-core/README.md +2 -0
  137. package/templates/collections-agent/packages/agent-core/package.json +1 -1
  138. package/templates/collections-agent/packages/agent-core/src/api/charge-rail.ts +27 -6
  139. package/templates/collections-agent/packages/agent-core/src/api/rail.ts +16 -0
  140. package/templates/collections-agent/packages/agent-core/src/api/sandbox-payer.ts +20 -7
  141. package/templates/collections-agent/packages/agent-core/src/approval.ts +16 -2
  142. package/templates/collections-agent/packages/agent-core/src/bundle.ts +50 -4
  143. package/templates/collections-agent/packages/agent-core/src/channels.ts +140 -0
  144. package/templates/collections-agent/packages/agent-core/src/check.ts +90 -8
  145. package/templates/collections-agent/packages/agent-core/src/clock.ts +42 -0
  146. package/templates/collections-agent/packages/agent-core/src/engine.ts +119 -18
  147. package/templates/collections-agent/packages/agent-core/src/hash.ts +13 -0
  148. package/templates/collections-agent/packages/agent-core/src/index.ts +3 -0
  149. package/templates/collections-agent/packages/agent-core/src/manifest.ts +1 -1
  150. package/templates/collections-agent/packages/agent-core/src/rail.ts +16 -2
  151. package/templates/collections-agent/packages/agent-core/src/receipt-verification.ts +401 -0
  152. package/templates/collections-agent/packages/agent-core/src/state-machine.ts +3 -1
  153. package/templates/collections-agent/packages/agent-core/src/stubs/charge-rail.ts +2 -0
  154. package/templates/collections-agent/packages/agent-core/src/stubs/rail.ts +19 -2
  155. package/templates/collections-agent/packages/agent-core/src/types.ts +28 -0
  156. package/templates/collections-agent/packages/agent-core/test/approval.test.ts +36 -2
  157. package/templates/collections-agent/packages/agent-core/test/bundle.test.ts +85 -0
  158. package/templates/collections-agent/packages/agent-core/test/clock.test.ts +25 -0
  159. package/templates/collections-agent/packages/agent-core/test/engine.test.ts +73 -1
  160. package/templates/collections-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
  161. package/templates/collections-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
  162. package/templates/collections-agent/packages/agent-core/test/helpers.ts +1 -1
  163. package/templates/collections-agent/packages/agent-core/test/manifest.test.ts +2 -2
  164. package/templates/collections-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
  165. package/templates/collections-agent/packages/agent-core/test/receivables.test.ts +51 -0
  166. package/templates/collections-agent/packages/agent-runtime/README.md +68 -0
  167. package/templates/collections-agent/packages/agent-runtime/bin.mjs +32 -0
  168. package/templates/collections-agent/packages/agent-runtime/package.json +23 -0
  169. package/templates/collections-agent/{agents/collections-agent → packages/agent-runtime}/src/adversarial.ts +29 -50
  170. package/templates/collections-agent/packages/agent-runtime/src/agent.ts +68 -0
  171. package/templates/collections-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
  172. package/templates/collections-agent/packages/agent-runtime/src/channels/index.ts +72 -0
  173. package/templates/collections-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
  174. package/templates/collections-agent/packages/agent-runtime/src/channels/types.ts +124 -0
  175. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
  176. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
  177. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
  178. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
  179. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
  180. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
  181. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
  182. package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
  183. package/templates/collections-agent/packages/agent-runtime/src/cli.ts +98 -0
  184. package/templates/collections-agent/packages/agent-runtime/src/commands/check.ts +15 -0
  185. package/templates/collections-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
  186. package/templates/collections-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
  187. package/templates/collections-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
  188. package/templates/collections-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
  189. package/templates/collections-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
  190. package/templates/collections-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
  191. package/templates/collections-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
  192. package/templates/collections-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
  193. package/templates/collections-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
  194. package/templates/collections-agent/packages/agent-runtime/src/commands/start.ts +245 -0
  195. package/templates/collections-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
  196. package/templates/collections-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
  197. package/templates/collections-agent/packages/agent-runtime/src/default-kit.ts +83 -0
  198. package/templates/collections-agent/packages/agent-runtime/src/index.ts +12 -0
  199. package/templates/collections-agent/packages/agent-runtime/src/inspect.ts +797 -0
  200. package/templates/collections-agent/packages/agent-runtime/src/kit.ts +206 -0
  201. package/templates/collections-agent/packages/agent-runtime/src/poll.ts +105 -0
  202. package/templates/{bills-agent/agents/bills-agent → collections-agent/packages/agent-runtime}/src/scenarios.ts +98 -26
  203. package/templates/collections-agent/packages/agent-runtime/src/setup.ts +229 -0
  204. package/templates/collections-agent/packages/agent-runtime/src/terminal.ts +154 -0
  205. package/templates/collections-agent/packages/agent-runtime/src/webhook.ts +131 -0
  206. package/templates/collections-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
  207. package/templates/collections-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
  208. package/templates/collections-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
  209. package/templates/collections-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
  210. package/templates/collections-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
  211. package/templates/collections-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
  212. package/templates/collections-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
  213. package/templates/collections-agent/packages/agent-runtime/tsconfig.json +9 -0
  214. package/templates/collections-agent/vitest.config.ts +1 -1
  215. package/templates/hello-agent/LICENSE +21 -0
  216. package/templates/hello-agent/README.md +23 -0
  217. package/templates/hello-agent/_gitignore +10 -0
  218. package/templates/hello-agent/agents/hello-agent/.env.example +5 -0
  219. package/templates/hello-agent/agents/hello-agent/AGENTS.md +15 -0
  220. package/templates/hello-agent/agents/hello-agent/CLAUDE.md +15 -0
  221. package/templates/hello-agent/agents/hello-agent/README.md +33 -0
  222. package/templates/hello-agent/agents/hello-agent/SYSTEM_PROMPT.md +19 -0
  223. package/templates/hello-agent/agents/hello-agent/agent.yaml +19 -0
  224. package/templates/hello-agent/agents/hello-agent/evals/adversarial/beneficiary-swap.json +6 -0
  225. package/templates/hello-agent/agents/hello-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
  226. package/templates/hello-agent/agents/hello-agent/evals/adversarial/exfiltration.json +6 -0
  227. package/templates/hello-agent/agents/hello-agent/evals/adversarial/exfiltration.transcript.jsonl +2 -0
  228. package/templates/hello-agent/agents/hello-agent/evals/adversarial/false-authority.json +6 -0
  229. package/templates/hello-agent/agents/hello-agent/evals/adversarial/false-authority.transcript.jsonl +2 -0
  230. package/templates/hello-agent/agents/hello-agent/evals/adversarial/fractioning.json +6 -0
  231. package/templates/hello-agent/agents/hello-agent/evals/adversarial/fractioning.transcript.jsonl +2 -0
  232. package/templates/hello-agent/agents/hello-agent/evals/adversarial/model-total.json +6 -0
  233. package/templates/hello-agent/agents/hello-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
  234. package/templates/hello-agent/agents/hello-agent/evals/adversarial/prompt-injection.json +6 -0
  235. package/templates/hello-agent/agents/hello-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
  236. package/templates/hello-agent/agents/hello-agent/evals/adversarial/webhook-replay.json +6 -0
  237. package/templates/hello-agent/agents/hello-agent/evals/eval.yaml +7 -0
  238. package/templates/hello-agent/agents/hello-agent/guardrails.json +8 -0
  239. package/templates/hello-agent/agents/hello-agent/mandate.example.json +17 -0
  240. package/templates/hello-agent/agents/hello-agent/package.json +19 -0
  241. package/templates/hello-agent/agents/hello-agent/runbook.md +10 -0
  242. package/templates/hello-agent/agents/hello-agent/scenarios/happy-path.json +6 -0
  243. package/templates/hello-agent/agents/hello-agent/scenarios/happy-path.transcript.jsonl +2 -0
  244. package/templates/hello-agent/agents/hello-agent/scenarios/prompt-injection.json +6 -0
  245. package/templates/hello-agent/agents/hello-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
  246. package/templates/hello-agent/agents/hello-agent/src/bills.ts +23 -0
  247. package/templates/hello-agent/agents/hello-agent/src/kit.ts +33 -0
  248. package/templates/hello-agent/agents/hello-agent/tools.json +11 -0
  249. package/templates/hello-agent/agents/hello-agent/tsconfig.json +9 -0
  250. package/templates/hello-agent/package.json +30 -0
  251. package/templates/hello-agent/packages/agent-core/README.md +21 -0
  252. package/templates/hello-agent/packages/agent-core/package.json +24 -0
  253. package/templates/hello-agent/packages/agent-core/src/agent.ts +125 -0
  254. package/templates/hello-agent/packages/agent-core/src/api/charge-rail.ts +175 -0
  255. package/templates/hello-agent/packages/agent-core/src/api/client.ts +53 -0
  256. package/templates/hello-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
  257. package/templates/hello-agent/packages/agent-core/src/api/rail.ts +117 -0
  258. package/templates/hello-agent/packages/agent-core/src/api/sandbox-payer.ts +58 -0
  259. package/templates/hello-agent/packages/agent-core/src/approval.ts +123 -0
  260. package/templates/hello-agent/packages/agent-core/src/bundle.ts +159 -0
  261. package/templates/hello-agent/packages/agent-core/src/channels.ts +140 -0
  262. package/templates/hello-agent/packages/agent-core/src/check.ts +253 -0
  263. package/templates/hello-agent/packages/agent-core/src/clock.ts +42 -0
  264. package/templates/hello-agent/packages/agent-core/src/engine.ts +885 -0
  265. package/templates/hello-agent/packages/agent-core/src/escalate.ts +85 -0
  266. package/templates/hello-agent/packages/agent-core/src/events.ts +40 -0
  267. package/templates/hello-agent/packages/agent-core/src/guardrails.ts +45 -0
  268. package/templates/hello-agent/packages/agent-core/src/hash.ts +62 -0
  269. package/templates/hello-agent/packages/agent-core/src/ids.ts +10 -0
  270. package/templates/hello-agent/packages/agent-core/src/index.ts +32 -0
  271. package/templates/hello-agent/packages/agent-core/src/mandate.ts +100 -0
  272. package/templates/hello-agent/packages/agent-core/src/manifest.ts +76 -0
  273. package/templates/hello-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
  274. package/templates/hello-agent/packages/agent-core/src/providers/replay.ts +63 -0
  275. package/templates/hello-agent/packages/agent-core/src/providers/types.ts +39 -0
  276. package/templates/hello-agent/packages/agent-core/src/rail.ts +101 -0
  277. package/templates/hello-agent/packages/agent-core/src/receipt-verification.ts +401 -0
  278. package/templates/hello-agent/packages/agent-core/src/revocation.ts +30 -0
  279. package/templates/hello-agent/packages/agent-core/src/secrets.ts +30 -0
  280. package/templates/hello-agent/packages/agent-core/src/state/store.ts +307 -0
  281. package/templates/hello-agent/packages/agent-core/src/state-machine.ts +148 -0
  282. package/templates/hello-agent/packages/agent-core/src/stubs/charge-rail.ts +195 -0
  283. package/templates/hello-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
  284. package/templates/hello-agent/packages/agent-core/src/stubs/rail.ts +141 -0
  285. package/templates/hello-agent/packages/agent-core/src/tools.ts +55 -0
  286. package/templates/hello-agent/packages/agent-core/src/types.ts +134 -0
  287. package/templates/hello-agent/packages/agent-core/test/approval.test.ts +117 -0
  288. package/templates/hello-agent/packages/agent-core/test/bundle.test.ts +85 -0
  289. package/templates/hello-agent/packages/agent-core/test/clock.test.ts +25 -0
  290. package/templates/hello-agent/packages/agent-core/test/engine.test.ts +596 -0
  291. package/templates/hello-agent/packages/agent-core/test/escalate.test.ts +42 -0
  292. package/templates/hello-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
  293. package/templates/hello-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
  294. package/templates/hello-agent/packages/agent-core/test/helpers.ts +139 -0
  295. package/templates/hello-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
  296. package/templates/hello-agent/packages/agent-core/test/manifest.test.ts +45 -0
  297. package/templates/hello-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
  298. package/templates/hello-agent/packages/agent-core/test/receivables.test.ts +316 -0
  299. package/templates/hello-agent/packages/agent-core/test/secrets.test.ts +28 -0
  300. package/templates/hello-agent/packages/agent-core/test/state-machine.test.ts +67 -0
  301. package/templates/hello-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
  302. package/templates/hello-agent/packages/agent-core/tsconfig.json +10 -0
  303. package/templates/hello-agent/packages/agent-runtime/README.md +68 -0
  304. package/templates/hello-agent/packages/agent-runtime/bin.mjs +32 -0
  305. package/templates/hello-agent/packages/agent-runtime/package.json +23 -0
  306. package/templates/hello-agent/packages/agent-runtime/src/adversarial.ts +169 -0
  307. package/templates/hello-agent/packages/agent-runtime/src/agent.ts +68 -0
  308. package/templates/hello-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
  309. package/templates/hello-agent/packages/agent-runtime/src/channels/index.ts +72 -0
  310. package/templates/hello-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
  311. package/templates/hello-agent/packages/agent-runtime/src/channels/types.ts +124 -0
  312. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
  313. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
  314. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
  315. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
  316. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
  317. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
  318. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
  319. package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
  320. package/templates/hello-agent/packages/agent-runtime/src/cli.ts +98 -0
  321. package/templates/hello-agent/packages/agent-runtime/src/commands/check.ts +15 -0
  322. package/templates/hello-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
  323. package/templates/hello-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
  324. package/templates/hello-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
  325. package/templates/hello-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
  326. package/templates/hello-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
  327. package/templates/hello-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
  328. package/templates/hello-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
  329. package/templates/hello-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
  330. package/templates/hello-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
  331. package/templates/hello-agent/packages/agent-runtime/src/commands/start.ts +245 -0
  332. package/templates/hello-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
  333. package/templates/hello-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
  334. package/templates/hello-agent/packages/agent-runtime/src/default-kit.ts +83 -0
  335. package/templates/hello-agent/packages/agent-runtime/src/index.ts +12 -0
  336. package/templates/hello-agent/packages/agent-runtime/src/inspect.ts +797 -0
  337. package/templates/hello-agent/packages/agent-runtime/src/kit.ts +206 -0
  338. package/templates/hello-agent/packages/agent-runtime/src/poll.ts +105 -0
  339. package/templates/hello-agent/packages/agent-runtime/src/scenarios.ts +268 -0
  340. package/templates/hello-agent/packages/agent-runtime/src/setup.ts +229 -0
  341. package/templates/hello-agent/packages/agent-runtime/src/terminal.ts +154 -0
  342. package/templates/hello-agent/packages/agent-runtime/src/webhook.ts +131 -0
  343. package/templates/hello-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
  344. package/templates/hello-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
  345. package/templates/hello-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
  346. package/templates/hello-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
  347. package/templates/hello-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
  348. package/templates/hello-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
  349. package/templates/hello-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
  350. package/templates/hello-agent/packages/agent-runtime/tsconfig.json +9 -0
  351. package/templates/hello-agent/tsconfig.base.json +16 -0
  352. package/templates/hello-agent/vitest.config.ts +12 -0
  353. package/templates/kits.lock.json +60 -12
  354. package/templates/supplier-payments-agent/LICENSE +21 -0
  355. package/templates/supplier-payments-agent/README.md +23 -0
  356. package/templates/supplier-payments-agent/_gitignore +10 -0
  357. package/templates/supplier-payments-agent/agents/supplier-payments-agent/.env.example +7 -0
  358. package/templates/supplier-payments-agent/agents/supplier-payments-agent/AGENTS.md +21 -0
  359. package/templates/supplier-payments-agent/agents/supplier-payments-agent/CLAUDE.md +21 -0
  360. package/templates/supplier-payments-agent/agents/supplier-payments-agent/README.md +118 -0
  361. package/templates/supplier-payments-agent/agents/supplier-payments-agent/SYSTEM_PROMPT.md +29 -0
  362. package/templates/supplier-payments-agent/agents/supplier-payments-agent/agent.yaml +26 -0
  363. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/batch-tampering.json +12 -0
  364. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/batch-tampering.transcript.jsonl +3 -0
  365. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap-mandate.json +9 -0
  366. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap.json +10 -0
  367. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
  368. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/exfiltration.json +13 -0
  369. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/exfiltration.transcript.jsonl +3 -0
  370. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/false-authority.json +9 -0
  371. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/false-authority.transcript.jsonl +3 -0
  372. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/fractioning.json +15 -0
  373. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/fractioning.transcript.jsonl +6 -0
  374. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/model-total.json +10 -0
  375. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
  376. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/prompt-injection.json +9 -0
  377. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
  378. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/webhook-replay.json +9 -0
  379. package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/eval.yaml +9 -0
  380. package/templates/supplier-payments-agent/agents/supplier-payments-agent/guardrails.json +15 -0
  381. package/templates/supplier-payments-agent/agents/supplier-payments-agent/mandate.example.json +70 -0
  382. package/templates/supplier-payments-agent/agents/supplier-payments-agent/package.json +26 -0
  383. package/templates/supplier-payments-agent/agents/supplier-payments-agent/runbook.md +19 -0
  384. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/beneficiary-not-allowed.json +14 -0
  385. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/beneficiary-not-allowed.transcript.jsonl +2 -0
  386. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/cap-exceeded.json +12 -0
  387. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/cap-exceeded.transcript.jsonl +2 -0
  388. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/escalated-above-threshold.json +20 -0
  389. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/escalated-above-threshold.transcript.jsonl +7 -0
  390. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/happy-path.json +19 -0
  391. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/happy-path.transcript.jsonl +3 -0
  392. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/mandate-revoked.json +21 -0
  393. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/mandate-revoked.transcript.jsonl +9 -0
  394. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/partial-batch-failure.json +21 -0
  395. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/partial-batch-failure.transcript.jsonl +3 -0
  396. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/prompt-injection.json +12 -0
  397. package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
  398. package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/kit.ts +176 -0
  399. package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/modules/batch-payout.ts +345 -0
  400. package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/modules/pix-out.ts +118 -0
  401. package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/payables.ts +76 -0
  402. package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/adversarial.test.ts +53 -0
  403. package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/batch.test.ts +384 -0
  404. package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/check.test.ts +109 -0
  405. package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/scenarios.test.ts +81 -0
  406. package/templates/supplier-payments-agent/agents/supplier-payments-agent/tools.json +53 -0
  407. package/templates/supplier-payments-agent/agents/supplier-payments-agent/tsconfig.json +9 -0
  408. package/templates/supplier-payments-agent/package.json +36 -0
  409. package/templates/supplier-payments-agent/packages/agent-core/README.md +21 -0
  410. package/templates/supplier-payments-agent/packages/agent-core/package.json +24 -0
  411. package/templates/supplier-payments-agent/packages/agent-core/src/agent.ts +125 -0
  412. package/templates/supplier-payments-agent/packages/agent-core/src/api/charge-rail.ts +175 -0
  413. package/templates/supplier-payments-agent/packages/agent-core/src/api/client.ts +53 -0
  414. package/templates/supplier-payments-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
  415. package/templates/supplier-payments-agent/packages/agent-core/src/api/rail.ts +117 -0
  416. package/templates/supplier-payments-agent/packages/agent-core/src/api/sandbox-payer.ts +58 -0
  417. package/templates/supplier-payments-agent/packages/agent-core/src/approval.ts +123 -0
  418. package/templates/supplier-payments-agent/packages/agent-core/src/bundle.ts +159 -0
  419. package/templates/supplier-payments-agent/packages/agent-core/src/channels.ts +140 -0
  420. package/templates/supplier-payments-agent/packages/agent-core/src/check.ts +253 -0
  421. package/templates/supplier-payments-agent/packages/agent-core/src/clock.ts +42 -0
  422. package/templates/supplier-payments-agent/packages/agent-core/src/engine.ts +885 -0
  423. package/templates/supplier-payments-agent/packages/agent-core/src/escalate.ts +85 -0
  424. package/templates/supplier-payments-agent/packages/agent-core/src/events.ts +40 -0
  425. package/templates/supplier-payments-agent/packages/agent-core/src/guardrails.ts +45 -0
  426. package/templates/supplier-payments-agent/packages/agent-core/src/hash.ts +62 -0
  427. package/templates/supplier-payments-agent/packages/agent-core/src/ids.ts +10 -0
  428. package/templates/supplier-payments-agent/packages/agent-core/src/index.ts +32 -0
  429. package/templates/supplier-payments-agent/packages/agent-core/src/mandate.ts +100 -0
  430. package/templates/supplier-payments-agent/packages/agent-core/src/manifest.ts +76 -0
  431. package/templates/supplier-payments-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
  432. package/templates/supplier-payments-agent/packages/agent-core/src/providers/replay.ts +63 -0
  433. package/templates/supplier-payments-agent/packages/agent-core/src/providers/types.ts +39 -0
  434. package/templates/supplier-payments-agent/packages/agent-core/src/rail.ts +101 -0
  435. package/templates/supplier-payments-agent/packages/agent-core/src/receipt-verification.ts +401 -0
  436. package/templates/supplier-payments-agent/packages/agent-core/src/revocation.ts +30 -0
  437. package/templates/supplier-payments-agent/packages/agent-core/src/secrets.ts +30 -0
  438. package/templates/supplier-payments-agent/packages/agent-core/src/state/store.ts +307 -0
  439. package/templates/supplier-payments-agent/packages/agent-core/src/state-machine.ts +148 -0
  440. package/templates/supplier-payments-agent/packages/agent-core/src/stubs/charge-rail.ts +195 -0
  441. package/templates/supplier-payments-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
  442. package/templates/supplier-payments-agent/packages/agent-core/src/stubs/rail.ts +141 -0
  443. package/templates/supplier-payments-agent/packages/agent-core/src/tools.ts +55 -0
  444. package/templates/supplier-payments-agent/packages/agent-core/src/types.ts +134 -0
  445. package/templates/supplier-payments-agent/packages/agent-core/test/approval.test.ts +117 -0
  446. package/templates/supplier-payments-agent/packages/agent-core/test/bundle.test.ts +85 -0
  447. package/templates/supplier-payments-agent/packages/agent-core/test/clock.test.ts +25 -0
  448. package/templates/supplier-payments-agent/packages/agent-core/test/engine.test.ts +596 -0
  449. package/templates/supplier-payments-agent/packages/agent-core/test/escalate.test.ts +42 -0
  450. package/templates/supplier-payments-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
  451. package/templates/supplier-payments-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
  452. package/templates/supplier-payments-agent/packages/agent-core/test/helpers.ts +139 -0
  453. package/templates/supplier-payments-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
  454. package/templates/supplier-payments-agent/packages/agent-core/test/manifest.test.ts +45 -0
  455. package/templates/supplier-payments-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
  456. package/templates/supplier-payments-agent/packages/agent-core/test/receivables.test.ts +316 -0
  457. package/templates/supplier-payments-agent/packages/agent-core/test/secrets.test.ts +28 -0
  458. package/templates/supplier-payments-agent/packages/agent-core/test/state-machine.test.ts +67 -0
  459. package/templates/supplier-payments-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
  460. package/templates/supplier-payments-agent/packages/agent-core/tsconfig.json +10 -0
  461. package/templates/supplier-payments-agent/packages/agent-runtime/README.md +68 -0
  462. package/templates/supplier-payments-agent/packages/agent-runtime/bin.mjs +32 -0
  463. package/templates/supplier-payments-agent/packages/agent-runtime/package.json +23 -0
  464. package/templates/supplier-payments-agent/packages/agent-runtime/src/adversarial.ts +169 -0
  465. package/templates/supplier-payments-agent/packages/agent-runtime/src/agent.ts +68 -0
  466. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
  467. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/index.ts +72 -0
  468. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
  469. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/types.ts +124 -0
  470. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
  471. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
  472. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
  473. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
  474. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
  475. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
  476. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
  477. package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
  478. package/templates/supplier-payments-agent/packages/agent-runtime/src/cli.ts +98 -0
  479. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/check.ts +15 -0
  480. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
  481. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
  482. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
  483. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
  484. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
  485. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
  486. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
  487. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
  488. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
  489. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/start.ts +245 -0
  490. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
  491. package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
  492. package/templates/supplier-payments-agent/packages/agent-runtime/src/default-kit.ts +83 -0
  493. package/templates/supplier-payments-agent/packages/agent-runtime/src/index.ts +12 -0
  494. package/templates/supplier-payments-agent/packages/agent-runtime/src/inspect.ts +797 -0
  495. package/templates/supplier-payments-agent/packages/agent-runtime/src/kit.ts +206 -0
  496. package/templates/supplier-payments-agent/packages/agent-runtime/src/poll.ts +105 -0
  497. package/templates/supplier-payments-agent/packages/agent-runtime/src/scenarios.ts +268 -0
  498. package/templates/supplier-payments-agent/packages/agent-runtime/src/setup.ts +229 -0
  499. package/templates/supplier-payments-agent/packages/agent-runtime/src/terminal.ts +154 -0
  500. package/templates/supplier-payments-agent/packages/agent-runtime/src/webhook.ts +131 -0
  501. package/templates/supplier-payments-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
  502. package/templates/supplier-payments-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
  503. package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
  504. package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
  505. package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
  506. package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
  507. package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
  508. package/templates/supplier-payments-agent/packages/agent-runtime/tsconfig.json +9 -0
  509. package/templates/supplier-payments-agent/tsconfig.base.json +16 -0
  510. package/templates/supplier-payments-agent/vitest.config.ts +12 -0
  511. package/templates/bills-agent/agents/bills-agent/channels/terminal/index.ts +0 -108
  512. package/templates/bills-agent/agents/bills-agent/src/commands/approve.ts +0 -9
  513. package/templates/bills-agent/agents/bills-agent/src/commands/check.ts +0 -13
  514. package/templates/bills-agent/agents/bills-agent/src/commands/consent.ts +0 -26
  515. package/templates/bills-agent/agents/bills-agent/src/commands/decide.ts +0 -45
  516. package/templates/bills-agent/agents/bills-agent/src/commands/deny.ts +0 -7
  517. package/templates/bills-agent/agents/bills-agent/src/commands/eval.ts +0 -37
  518. package/templates/bills-agent/agents/bills-agent/src/commands/reconcile.ts +0 -38
  519. package/templates/bills-agent/agents/bills-agent/src/commands/rerun.ts +0 -65
  520. package/templates/bills-agent/agents/bills-agent/src/commands/resume.ts +0 -30
  521. package/templates/bills-agent/agents/bills-agent/src/main.ts +0 -185
  522. package/templates/collections-agent/agents/collections-agent/channels/terminal/index.ts +0 -178
  523. package/templates/collections-agent/agents/collections-agent/src/commands/approve.ts +0 -10
  524. package/templates/collections-agent/agents/collections-agent/src/commands/check.ts +0 -13
  525. package/templates/collections-agent/agents/collections-agent/src/commands/decide.ts +0 -48
  526. package/templates/collections-agent/agents/collections-agent/src/commands/deny.ts +0 -7
  527. package/templates/collections-agent/agents/collections-agent/src/commands/eval.ts +0 -39
  528. package/templates/collections-agent/agents/collections-agent/src/commands/poll.ts +0 -35
  529. package/templates/collections-agent/agents/collections-agent/src/commands/reconcile.ts +0 -38
  530. package/templates/collections-agent/agents/collections-agent/src/commands/rerun.ts +0 -55
  531. package/templates/collections-agent/agents/collections-agent/src/commands/resume.ts +0 -30
  532. package/templates/collections-agent/agents/collections-agent/src/commands/webhook.ts +0 -36
  533. package/templates/collections-agent/agents/collections-agent/src/main.ts +0 -193
  534. package/templates/collections-agent/agents/collections-agent/src/setup.ts +0 -250
@@ -0,0 +1,131 @@
1
+ /**
2
+ * `codespar-agent start --channel whatsapp`: wiring, and only wiring.
3
+ *
4
+ * It picks a backend, binds the conversation, hands the channel the rules the
5
+ * agent's own guardrails declare, and runs the loop — all of that through
6
+ * `channels/whatsapp/open.ts`, which `poll --channel whatsapp` goes through
7
+ * too, so the two commands cannot end up enforcing different rules. The
8
+ * decisions are elsewhere: the rules in `channels/rules.ts`, the session
9
+ * window in `channels/whatsapp/session.ts`, the gates in `terminal.ts`, which
10
+ * this path reuses unchanged so the two channels cannot drift on what may
11
+ * execute.
12
+ */
13
+ import { stdout } from "node:process";
14
+ import { relative } from "node:path";
15
+ import type { ConversationScript } from "@codespar/agent-core";
16
+ import type { Agent } from "../agent.js";
17
+ import type { Setup } from "../setup.js";
18
+ import { defaultAsk } from "../terminal.js";
19
+ import { converse } from "../channels/whatsapp/run.js";
20
+ import { buildWhatsApp, simulatedCost, type WhatsAppBackendName } from "../channels/whatsapp/open.js";
21
+ import { EmulatorUnreachableError } from "../channels/whatsapp/emulator.js";
22
+
23
+ export type { WhatsAppBackendName };
24
+
25
+ export interface StartWhatsAppOptions {
26
+ agent: Agent;
27
+ setup: Setup;
28
+ script: ConversationScript;
29
+ backend: WhatsAppBackendName;
30
+ /** Replay the conversation's turns; otherwise the person is at the keyboard. */
31
+ scripted: boolean;
32
+ approver: { id: string; channel: string };
33
+ json: boolean;
34
+ startedAt: number;
35
+ say: (line: string) => void;
36
+ decision?: "approve" | "deny" | "none";
37
+ waitSeconds?: number | undefined;
38
+ simulatePayer?: boolean | undefined;
39
+ now?: (() => Date) | undefined;
40
+ }
41
+
42
+ export async function startWhatsApp(options: StartWhatsAppOptions): Promise<number> {
43
+ const { agent, setup: s, script, say } = options;
44
+ const now = options.now ?? (() => new Date());
45
+ const conversation = { contact: script.contact, subject: script.subject };
46
+
47
+ // A scripted conversation has nobody at a keyboard, and in `human` mode
48
+ // somebody has to decide. Refused rather than left waiting on a stdin that
49
+ // will never answer: a gate that hangs teaches nothing.
50
+ if (options.scripted && s.mode === "human" && !options.decision) {
51
+ say("--scripted has nobody at the keyboard and approval: human needs a decision: add --approve or --deny, or run --mode mandate");
52
+ return 2;
53
+ }
54
+
55
+ const built = buildWhatsApp({
56
+ agent,
57
+ setup: s,
58
+ conversation,
59
+ backend: options.backend,
60
+ now,
61
+ say,
62
+ bundle: s.bundle,
63
+ ...(options.scripted ? { script } : { ask: defaultAsk }),
64
+ // A run that STARTS a conversation pins the emulator's clock to its own instant.
65
+ ...(options.now ? { pinAt: options.now() } : {}),
66
+ });
67
+ if ("refusal" in built) {
68
+ for (const line of built.refusal) say(line);
69
+ return 1;
70
+ }
71
+ const { channel, driver, sessionKey } = built;
72
+
73
+ // The channel is opened here, which is where an emulator that is not
74
+ // running has to be reported: after this the run has already started.
75
+ try {
76
+ await channel.open();
77
+ } catch (err) {
78
+ if (err instanceof EmulatorUnreachableError) {
79
+ say(err.message);
80
+ return 1;
81
+ }
82
+ throw err;
83
+ }
84
+
85
+ const result = await converse({
86
+ setup: s,
87
+ channel,
88
+ approver: options.approver,
89
+ say,
90
+ ...(options.decision ? { decision: options.decision } : {}),
91
+ ...(options.scripted ? {} : { ask: defaultAsk }),
92
+ ...(options.waitSeconds !== undefined ? { waitSeconds: options.waitSeconds } : {}),
93
+ ...(options.simulatePayer !== undefined ? { simulatePayer: options.simulatePayer } : {}),
94
+ });
95
+
96
+ // What the emulator is actually for, and the one number this repo cannot
97
+ // compute: what the conversation would have cost under Meta's rules. Read for
98
+ // the console only — never asserted on, because it is their engine's answer
99
+ // and not a contract of ours.
100
+ const cost = await simulatedCost(driver, sessionKey);
101
+
102
+ const log = channel.log();
103
+ const refused = log.filter((l) => l.refused).map((l) => ({ rule: l.refused!.rule, detail: l.refused!.detail }));
104
+ const channelSummary = {
105
+ name: "whatsapp",
106
+ backend: channel.backend,
107
+ conversation: script.name,
108
+ turns: result.turns,
109
+ messages_in: log.filter((l) => l.direction === "in").length,
110
+ messages_out: log.filter((l) => l.direction === "out" && !l.refused).length,
111
+ refused,
112
+ log: relative(process.cwd(), `${s.bundle.dir}/channel.jsonl`),
113
+ ...(cost ? { simulated_cost: cost } : {}),
114
+ };
115
+
116
+ if (options.json) {
117
+ const payload = s.kit.oneShotPayload({
118
+ setup: s,
119
+ reply: result.replies[result.replies.length - 1] ?? "",
120
+ toolCalls: result.toolCalls,
121
+ executions: result.executions,
122
+ startedAt: options.startedAt,
123
+ });
124
+ stdout.write(JSON.stringify({ ...payload, channel: channelSummary }) + "\n");
125
+ } else {
126
+ say(`conversa em ${channelSummary.log} — ${channelSummary.messages_in} recebida(s), ${channelSummary.messages_out} enviada(s)${refused.length ? `, ${refused.length} recusada(s)` : ""}`);
127
+ if (cost) say(`custo simulado desta conversa nas regras da Meta: ${cost.total.toFixed(4)} ${cost.currency} (conta do emulador, nao nossa)`);
128
+ }
129
+
130
+ return result.executions.some((e) => e.state === "executing") ? 3 : 0;
131
+ }
@@ -0,0 +1,245 @@
1
+ /**
2
+ * `codespar-agent start` interactive terminal
3
+ * `codespar-agent start --input "..."` one turn, no prompt
4
+ * `codespar-agent start --scenario happy-path` a scenario pack, every mode it declares
5
+ * `codespar-agent start --channel whatsapp` the conversation channel
6
+ *
7
+ * `--json` puts machine data on stdout (valid JSON, nothing else) and the
8
+ * human messages on stderr.
9
+ */
10
+ import { stderr, stdout } from "node:process";
11
+ import { relative, resolve } from "node:path";
12
+ import { NotATestKeyError, isTestKey, loadManifest, resolveFixedClock, type ApprovalMode, type ChannelName } from "@codespar/agent-core";
13
+ import { join } from "node:path";
14
+ import type { Agent } from "../agent.js";
15
+ import type { RailKind } from "../kit.js";
16
+ import { resolveProvider, resolveRailKind, setup, type ProviderKind } from "../setup.js";
17
+ import { checkScenario, listScenarios, loadScenario, runScenario, scenariosDir } from "../scenarios.js";
18
+ import { closeTerminal, defaultAsk, handleExecution, interactive } from "../terminal.js";
19
+ import { resolveConversation } from "../channels/index.js";
20
+ import { startWhatsApp, type WhatsAppBackendName } from "./start-whatsapp.js";
21
+
22
+ interface Args {
23
+ input?: string;
24
+ scenario?: string;
25
+ mode?: ApprovalMode;
26
+ json: boolean;
27
+ decision?: "approve" | "deny";
28
+ provider?: ProviderKind;
29
+ transcript?: string;
30
+ rail?: RailKind;
31
+ user?: string;
32
+ wait?: number;
33
+ simulatePayer: boolean;
34
+ payer?: "pays" | "expires" | "never";
35
+ /** ISO 8601 instant the run is pinned to (the guardrails read it instead of the wall clock). */
36
+ now?: string;
37
+ /** Which channel the person is on. `terminal` is every agent's; `whatsapp` needs a conversation. */
38
+ channel: ChannelName;
39
+ backend?: WhatsAppBackendName;
40
+ conversation?: string;
41
+ /** Replay the conversation's turns instead of reading them from the keyboard. */
42
+ scripted: boolean;
43
+ help: boolean;
44
+ }
45
+
46
+ export function parseArgs(argv: string[], awaitsPayer: boolean): Args {
47
+ const args: Args = { json: false, simulatePayer: false, help: false, channel: "terminal", scripted: false };
48
+ for (let i = 0; i < argv.length; i += 1) {
49
+ const a = argv[i]!;
50
+ const next = () => {
51
+ const v = argv[i + 1];
52
+ if (v === undefined) throw new Error(`${a} needs a value`);
53
+ i += 1;
54
+ return v;
55
+ };
56
+ if (a === "--input") args.input = next();
57
+ else if (a === "--scenario") args.scenario = next();
58
+ else if (a === "--mode") {
59
+ const v = next();
60
+ if (v !== "human" && v !== "mandate") throw new Error("--mode must be human or mandate");
61
+ args.mode = v;
62
+ } else if (a === "--json") args.json = true;
63
+ else if (a === "--approve") args.decision = "approve";
64
+ else if (a === "--deny") args.decision = "deny";
65
+ else if (a === "--provider") {
66
+ const v = next();
67
+ if (v !== "anthropic" && v !== "replay") throw new Error("--provider must be anthropic or replay");
68
+ args.provider = v;
69
+ } else if (a === "--transcript") args.transcript = next();
70
+ else if (a === "--rail") {
71
+ const v = next();
72
+ if (v !== "stub" && v !== "api") throw new Error("--rail must be stub or api");
73
+ args.rail = v;
74
+ } else if (a === "--user") args.user = next();
75
+ else if (awaitsPayer && a === "--wait") {
76
+ const v = Number(next());
77
+ if (!Number.isFinite(v) || v < 0) throw new Error("--wait must be a number of seconds");
78
+ args.wait = v;
79
+ } else if (awaitsPayer && a === "--simulate-payer") args.simulatePayer = true;
80
+ else if (awaitsPayer && a === "--payer") {
81
+ const v = next();
82
+ if (v !== "pays" && v !== "expires" && v !== "never") throw new Error("--payer must be pays, expires or never");
83
+ args.payer = v;
84
+ } else if (a === "--now") args.now = next();
85
+ else if (a === "--channel") {
86
+ const v = next();
87
+ if (v !== "terminal" && v !== "whatsapp") throw new Error("--channel must be terminal or whatsapp");
88
+ args.channel = v;
89
+ } else if (a === "--backend") {
90
+ const v = next();
91
+ if (v !== "simulator" && v !== "cloud-api") throw new Error("--backend must be simulator or cloud-api");
92
+ args.backend = v;
93
+ } else if (a === "--conversation") args.conversation = next();
94
+ else if (a === "--scripted") args.scripted = true;
95
+ else if (a === "--help" || a === "-h") args.help = true;
96
+ else throw new Error(`unknown argument ${a}`);
97
+ }
98
+ return args;
99
+ }
100
+
101
+ export async function start(agent: Agent, argv: string[]): Promise<number> {
102
+ const awaitsPayer = agent.settlement === "await-payer";
103
+ const usage = agent.kit.usage(loadManifest(join(agent.dir, "agent.yaml")));
104
+ let args: Args;
105
+ try {
106
+ args = parseArgs(argv, awaitsPayer);
107
+ } catch (err) {
108
+ stderr.write(`${err instanceof Error ? err.message : String(err)}\n${usage}\n`);
109
+ return 2;
110
+ }
111
+ if (args.help) {
112
+ stderr.write(usage + "\n");
113
+ return 0;
114
+ }
115
+ const say = (line: string) => stderr.write(line + "\n");
116
+
117
+ // A pinned instant makes the guardrails deterministic: the CI runs the fixture inside the declared hours whatever the hour is.
118
+ let now: (() => Date) | undefined;
119
+ try {
120
+ now = resolveFixedClock(args.now, process.env);
121
+ } catch (err) {
122
+ stderr.write(`${err instanceof Error ? err.message : String(err)}\n${usage}\n`);
123
+ return 2;
124
+ }
125
+
126
+ // Sandbox by construction: a live key dies here, before anything else runs.
127
+ const railKind = resolveRailKind(process.env, args.rail);
128
+ if (railKind === "api" && !isTestKey(process.env["CODESPAR_API_KEY"])) {
129
+ say(new NotATestKeyError().message);
130
+ return 1;
131
+ }
132
+
133
+ if (args.scenario) return runScenarioCommand(agent, args, railKind, say);
134
+
135
+ // A channel is a conversation, so the flags a one-shot and a scenario pack use have no meaning on one.
136
+ if (args.channel === "whatsapp" && (args.input !== undefined || args.scenario !== undefined)) {
137
+ say("--channel whatsapp is a conversation: it takes its turns from channels/whatsapp/, not from --input or --scenario");
138
+ return 2;
139
+ }
140
+ if (args.channel !== "whatsapp" && (args.backend !== undefined || args.conversation !== undefined || args.scripted)) {
141
+ say("--backend, --conversation and --scripted belong to --channel whatsapp");
142
+ return 2;
143
+ }
144
+ if (args.channel === "whatsapp" && !loadManifest(join(agent.dir, "agent.yaml")).manifest.channels.includes("whatsapp")) {
145
+ say(`${agent.slug} does not declare the whatsapp channel in agent.yaml`);
146
+ return 2;
147
+ }
148
+
149
+ if (agent.kit.ensureMandate) {
150
+ const ok = await agent.kit.ensureMandate({ agentDir: agent.dir, argv, say, railKind, oneShot: args.input !== undefined, ask: defaultAsk });
151
+ if (!ok) return 1;
152
+ }
153
+
154
+ // The first thing the person says: the `--input` of a one-shot, or the first scripted turn of a conversation.
155
+ let conversationScript;
156
+ try {
157
+ conversationScript = args.channel === "whatsapp" ? resolveConversation(agent, args.conversation) : undefined;
158
+ } catch (err) {
159
+ say(err instanceof Error ? err.message : String(err));
160
+ return 2;
161
+ }
162
+ const firstInput = args.input ?? (args.scripted ? conversationScript?.turns[0].text : undefined);
163
+
164
+ // No model: replay the recorded scenario whose first turn is what the person said first.
165
+ let transcript = args.transcript;
166
+ const provider = resolveProvider(process.env, args.provider);
167
+ if (provider === "replay" && !transcript && firstInput) {
168
+ const match = listScenarios(agent).map((n) => loadScenario(agent, n)).find((s) => s.turns[0].input === firstInput);
169
+ if (match) transcript = resolve(scenariosDir(agent), match.transcript);
170
+ else {
171
+ say(`no ANTHROPIC_API_KEY and no recorded transcript for that input. Set the key, pass --transcript, or use one of: ${listScenarios(agent).map((n) => `"${loadScenario(agent, n).turns[0].input}"`).join(", ")}`);
172
+ return 1;
173
+ }
174
+ }
175
+
176
+ const s = setup(agent, { mode: args.mode, rail: railKind, provider, transcript, now, say });
177
+ if (args.payer) s.payer?.behave(args.payer);
178
+ const approver = { id: args.user ?? s.kit.labels.defaultUser, channel: "terminal" };
179
+ const startedAt = Date.now();
180
+ try {
181
+ if (args.channel === "whatsapp") {
182
+ return await startWhatsApp({
183
+ agent,
184
+ setup: s,
185
+ script: conversationScript!,
186
+ backend: args.backend ?? "simulator",
187
+ scripted: args.scripted,
188
+ approver: { id: approver.id, channel: "whatsapp" },
189
+ json: args.json,
190
+ startedAt,
191
+ say,
192
+ ...(args.decision ? { decision: args.decision } : {}),
193
+ ...(args.wait !== undefined ? { waitSeconds: args.wait } : {}),
194
+ simulatePayer: args.simulatePayer,
195
+ now,
196
+ });
197
+ }
198
+ const runtime = s.makeRuntime();
199
+ if (!args.input) {
200
+ await interactive({ setup: s, approver, runtime, say, waitSeconds: args.wait, simulatePayer: args.simulatePayer });
201
+ return 0;
202
+ }
203
+ const loop = s.makeLoop(runtime, (execution) =>
204
+ handleExecution(execution, { setup: s, approver, decision: args.decision ?? "none", say, waitSeconds: args.wait, simulatePayer: args.simulatePayer, ...(args.json ? { tell: say } : {}) }),
205
+ );
206
+ const result = await loop.turn(args.input);
207
+ const executions = s.engine.list().filter((e) => e.run_id === s.runId);
208
+ const payload = s.kit.oneShotPayload({ setup: s, reply: result.reply, toolCalls: result.tool_calls, executions, startedAt });
209
+ if (args.json) stdout.write(JSON.stringify(payload) + "\n");
210
+ else stdout.write(result.reply + "\n");
211
+ return executions.some((e) => e.state === "executing") ? 3 : 0;
212
+ } finally {
213
+ closeTerminal();
214
+ s.close();
215
+ }
216
+ }
217
+
218
+ async function runScenarioCommand(agent: Agent, args: Args, railKind: RailKind, say: (l: string) => void): Promise<number> {
219
+ const scenario = loadScenario(agent, args.scenario!);
220
+ const picksRail = agent.kit.scenarioRail === "requested";
221
+ const rail: RailKind = picksRail ? railKind : "stub";
222
+ if (picksRail && !scenario.rails.includes(rail)) {
223
+ say(`scenario ${scenario.name} runs on ${scenario.rails.join("/")} only (asked: ${rail})`);
224
+ return 2;
225
+ }
226
+ const modes = args.mode ? [args.mode] : scenario.modes;
227
+ const results = [];
228
+ for (const mode of modes) {
229
+ say(`== scenario ${scenario.name} — approval: ${mode}${picksRail ? ` — rail: ${rail}` : ""}`);
230
+ say(scenario.description);
231
+ const run = await runScenario(agent, scenario, {
232
+ mode,
233
+ rail,
234
+ say: args.json ? () => undefined : say,
235
+ ...(picksRail ? { tell: args.json ? () => undefined : (l: string) => void stdout.write(l + "\n") } : {}),
236
+ waitSeconds: args.wait,
237
+ });
238
+ const check = checkScenario(scenario, run);
239
+ for (const reply of run.replies) say(`agente: ${reply}`);
240
+ say(check.ok ? `== ok — ${agent.settlement === "await-payer" ? `${run.cycle_seconds}s — ` : ""}bundle em ${relative(process.cwd(), run.bundle_dir)}` : `== FAIL: ${check.failures.join("; ")}`);
241
+ results.push({ mode, ok: check.ok, failures: check.failures, run });
242
+ }
243
+ if (args.json) stdout.write(JSON.stringify({ scenario: scenario.name, ...(picksRail ? { rail } : {}), results }) + "\n");
244
+ return results.every((r) => r.ok) ? 0 : 1;
245
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * `codespar-agent verify <receipt-file> [--json] [--keys <file>] [--url <url>]`:
3
+ * the wave-5 gate — someone outside verifies a receipt without access to
4
+ * CodeSpar.
5
+ *
6
+ * It takes a receipt JSON, fetches the public key set over plain HTTPS (or
7
+ * reads a copy off disk, for a machine with no network), and checks the
8
+ * Ed25519 signature with stock `node:crypto`. No CodeSpar key, no API key, no
9
+ * SDK call: the verifier holds nothing, and that is what makes the answer
10
+ * worth anything. It is the one command here that does NOT need an agent —
11
+ * `cli.ts` dispatches it before it looks for an `agent.yaml` — because the
12
+ * file it reads has usually been copied off the machine that produced it.
13
+ *
14
+ * `--json` follows the rule of section 14.5: machine data on stdout, valid
15
+ * JSON and nothing else, human sentences on stderr. The exit code is the
16
+ * verdict (`VERDICT_EXIT_CODES`), so a script branches on WHICH answer it got
17
+ * rather than on "did it fail" — an unsigned receipt is not a failure and must
18
+ * not exit 0 either.
19
+ */
20
+ import { readFileSync } from "node:fs";
21
+ import { resolve } from "node:path";
22
+ import { stderr, stdout } from "node:process";
23
+ import { DEFAULT_RECEIPT_KEYS_URL, VERDICT_EXIT_CODES, verifyReceipt, type KeySource, type ReceiptVerification } from "@codespar/agent-core";
24
+
25
+ const USAGE = "usage: npm run verify <receipt-file> [--json] [--keys <key-set.json>] [--url <https://.../.well-known/codespar-receipt-keys.json>]";
26
+
27
+ /** The fetcher the module is given. The only network in this feature, and it
28
+ * lives here rather than in the core so a unit test injects its own. */
29
+ async function fetchKeyDocument(url: string): Promise<unknown> {
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(), 10_000);
32
+ try {
33
+ const response = await fetch(url, { signal: controller.signal, headers: { accept: "application/jwk-set+json, application/json" } });
34
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
35
+ return (await response.json()) as unknown;
36
+ } finally {
37
+ clearTimeout(timer);
38
+ }
39
+ }
40
+
41
+ export async function verify(argv: string[]): Promise<number> {
42
+ const say = (line: string) => stderr.write(line + "\n");
43
+ let json = false;
44
+ let keysFile: string | undefined;
45
+ let url: string | undefined;
46
+ let receiptFile: string | undefined;
47
+
48
+ for (let i = 0; i < argv.length; i += 1) {
49
+ const a = argv[i]!;
50
+ if (a === "--json") json = true;
51
+ else if (a === "--keys" || a === "--url") {
52
+ const value = argv[i + 1];
53
+ if (value === undefined || value.startsWith("--")) {
54
+ say(`${a} needs a value\n${USAGE}`);
55
+ return 2;
56
+ }
57
+ if (a === "--keys") keysFile = value;
58
+ else url = value;
59
+ i += 1;
60
+ } else if (a === "--help" || a === "-h") {
61
+ say(USAGE);
62
+ say(`the key set is public and needs no credential; its default is ${DEFAULT_RECEIPT_KEYS_URL}`);
63
+ say("--keys reads a saved copy of that document instead, so the check runs with no network at all");
64
+ return 0;
65
+ } else if (a.startsWith("-")) {
66
+ say(`unknown argument ${a}\n${USAGE}`);
67
+ return 2;
68
+ } else if (receiptFile === undefined) receiptFile = a;
69
+ else {
70
+ say(`verify takes one receipt file (got ${receiptFile} and ${a})\n${USAGE}`);
71
+ return 2;
72
+ }
73
+ }
74
+
75
+ if (!receiptFile) {
76
+ say(USAGE);
77
+ say("the receipt is the JSON the API returns from GET /v1/consumers/receipts/{id}, or a copy from a run's runs/<run-id>/receipts/");
78
+ return 2;
79
+ }
80
+ if (keysFile && url) {
81
+ say(`--keys and --url name two different key sets; pass one\n${USAGE}`);
82
+ return 2;
83
+ }
84
+
85
+ const receipt = readJson(receiptFile, say);
86
+ if (receipt === undefined) return 2;
87
+
88
+ let source: KeySource;
89
+ if (keysFile) {
90
+ const document = readJson(keysFile, say);
91
+ if (document === undefined) return 2;
92
+ source = { document, label: resolve(keysFile) };
93
+ } else {
94
+ source = { url: url ?? DEFAULT_RECEIPT_KEYS_URL, fetch: fetchKeyDocument };
95
+ }
96
+
97
+ const report = await verifyReceipt(receipt, source);
98
+ if (json) stdout.write(JSON.stringify(report) + "\n");
99
+ else stdout.write(render(report));
100
+ say(report.message);
101
+ return VERDICT_EXIT_CODES[report.verdict];
102
+ }
103
+
104
+ /** A file that is missing or is not JSON is a refusal a person can act on, never a stack trace. */
105
+ function readJson(path: string, say: (line: string) => void): unknown {
106
+ let text: string;
107
+ try {
108
+ text = readFileSync(path, "utf8");
109
+ } catch (err) {
110
+ say(`could not read ${resolve(path)}: ${err instanceof Error ? err.message : String(err)}`);
111
+ return undefined;
112
+ }
113
+ try {
114
+ return JSON.parse(text) as unknown;
115
+ } catch (err) {
116
+ say(`${resolve(path)} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
117
+ return undefined;
118
+ }
119
+ }
120
+
121
+ /** The terminal rendering: the verdict first, then what it is about. */
122
+ function render(report: ReceiptVerification): string {
123
+ const lines = [`${report.verdict.toUpperCase()} ${report.receipt_id ?? "(no receipt id)"}`];
124
+ if (report.kid) lines.push(` key ${report.kid}${report.key_status ? ` (${report.key_status})` : ""}`);
125
+ if (report.keys_from) lines.push(` key set ${report.keys_from}`);
126
+ if (report.signing_string) lines.push(` signed ${report.signing_string}`);
127
+ lines.push(` reason ${report.reason}`);
128
+ return lines.join("\n") + "\n";
129
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `codespar-agent webhook [--port <n>] [--secret <trigger secret>]`: starts
3
+ * the receiving end of the webhook channel on localhost. A stub for the
4
+ * developer who has a URL the API can reach; the terminal's default is
5
+ * `codespar-agent poll`. Reads `<PREFIX>_WEBHOOK_PORT` and
6
+ * `<PREFIX>_TRIGGER_SECRET` when the flags are absent.
7
+ */
8
+ import { stderr, stdout } from "node:process";
9
+ import { envName, type Agent } from "../agent.js";
10
+ import { setup } from "../setup.js";
11
+ import { announceOutcome } from "../terminal.js";
12
+ import { startWebhookServer } from "../webhook.js";
13
+
14
+ export async function webhook(agent: Agent, argv: string[]): Promise<number> {
15
+ const port = Number(argv.includes("--port") ? argv[argv.indexOf("--port") + 1] : process.env[envName(agent, "WEBHOOK_PORT")] ?? "8787");
16
+ const secret = argv.includes("--secret") ? argv[argv.indexOf("--secret") + 1] : process.env[envName(agent, "TRIGGER_SECRET")];
17
+ const say = (l: string) => stderr.write(l + "\n");
18
+ const s = setup(agent, { say, runId: `run_webhook_${Date.now().toString(36)}` });
19
+ const server = startWebhookServer(
20
+ port,
21
+ {
22
+ engine: s.engine,
23
+ secret,
24
+ onClosed: (execution) => {
25
+ announceOutcome(execution, s, (l) => void stdout.write(l + "\n"));
26
+ },
27
+ },
28
+ say,
29
+ );
30
+ const stop = () => {
31
+ server.close();
32
+ s.close();
33
+ process.exit(0);
34
+ };
35
+ process.on("SIGINT", stop);
36
+ process.on("SIGTERM", stop);
37
+ // The receiver runs until a signal stops it.
38
+ return new Promise<number>(() => undefined);
39
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * What an agent gets when it declares nothing: the stub payment rail over the
3
+ * example mandate, the generic console words, and no tools. A read-only agent
4
+ * spreads this and adds its handlers; a payer or a collector replaces the rail.
5
+ */
6
+ import { StubRail, loadMandate, type Execution } from "@codespar/agent-core";
7
+ import { relative } from "node:path";
8
+ import type { AgentKit } from "./kit.js";
9
+
10
+ export function formatMinor(minor: number): string {
11
+ const sign = minor < 0 ? "-" : "";
12
+ const abs = Math.abs(minor);
13
+ return `${sign}R$ ${Math.floor(abs / 100).toLocaleString("pt-BR")},${String(abs % 100).padStart(2, "0")}`;
14
+ }
15
+
16
+ export const defaultKit: AgentKit = {
17
+ settlement: "immediate",
18
+ scenarioRail: "stub",
19
+ labels: {
20
+ defaultUser: "usr_terminal",
21
+ evalUser: "usr_demo_titular",
22
+ mandateWord: "mandato",
23
+ receiptWord: "recibo",
24
+ intro: 'Diga o que precisa. Ctrl+D ou "sair" encerra.',
25
+ prompt: "> ",
26
+ approveQuestion: " Aprovar? [s/N] ",
27
+ uncertainDispatch: " desfecho desconhecido no trilho; rode `npm run resume` para reconciliar (nunca repita a operacao)",
28
+ missingReceiptKind: "receipt_missing_locally",
29
+ missingReceiptDetail: (receiptId, runId) => `receipt ${receiptId} is not in runs/${runId}/receipts`,
30
+ stillExecuting: (e) => `${e.id}: still executing — ${e.detail}; nothing was re-sent`,
31
+ },
32
+ usage: (manifest) => `${manifest.manifest.name}
33
+ npm start interactive terminal
34
+ npm start -- --input "..." one turn (add --approve/--deny to decide, --json for machine output)
35
+ npm start -- --scenario <name> run a scenario pack (see scenarios/)
36
+ options: --mode human|mandate --provider anthropic|replay --transcript <file> --rail stub|api --user <id> --json
37
+ --now <ISO 8601> pin the run to that instant; env CODESPAR_AGENT_NOW is the same thing`,
38
+ buildRail: (ctx) => {
39
+ // A read-only agent has no rail to reach: the stub answers offline, whatever key the environment carries.
40
+ const killAfterDispatch = ctx.envVar("KILL_AFTER_DISPATCH") === "1" ? { afterDispatch: () => process.exit(137) } : {};
41
+ const refuse = ctx.envVar("STUB_REFUSE") ? { refusePayees: ctx.envVar("STUB_REFUSE")!.split(",").map((p) => p.trim()).filter(Boolean) } : {};
42
+ return {
43
+ rail: new StubRail(ctx.store, { ...(ctx.now ? { clock: ctx.now } : {}), ...killAfterDispatch, ...refuse, ...(ctx.stubRail ?? {}) }),
44
+ mandate: ctx.mandate ?? loadMandate(ctx.manifest.resolvePath(ctx.manifest.manifest.mandate_schema)),
45
+ };
46
+ },
47
+ handlers: () => ({}),
48
+ describeExecution: (execution, setup) => {
49
+ const lines: string[] = [];
50
+ lines.push(` execucao ${execution.id}: ${execution.state}${execution.reason ? ` (${execution.reason})` : ""}`);
51
+ for (const item of execution.items) lines.push(` - ${item.beneficiary}: ${formatMinor(item.amount)}${item.description ? ` — ${item.description}` : ""}`);
52
+ lines.push(` total (calculado pelo core): ${formatMinor(execution.total)}`);
53
+ if (execution.escalation) lines.push(` escalado por: ${execution.escalation.trigger} — ${execution.escalation.detail}`);
54
+ if (execution.blocking_reasons.length) lines.push(` bloqueado: ${execution.blocking_reasons.join(", ")} — o mandato nao autoriza; nao ha o que aprovar`);
55
+ if (execution.detail && execution.state !== "awaiting_approval") lines.push(` ${execution.detail}`);
56
+ for (const outcome of execution.outcomes) {
57
+ if (outcome.receipt_id) lines.push(` recibo: ${relative(process.cwd(), `${setup.bundle.dir}/receipts/${outcome.receipt_id}.json`)}`);
58
+ }
59
+ return lines;
60
+ },
61
+ oneShotPayload: ({ setup: s, reply, toolCalls, executions }) => ({
62
+ run_id: s.runId,
63
+ agent: `${s.manifest.manifest.name}@${s.manifest.manifest.version}`,
64
+ mode: s.mode,
65
+ rail: s.railKind,
66
+ mandate_id: s.mandate.id,
67
+ actor: s.engine.agentActor,
68
+ reply,
69
+ tool_calls: toolCalls,
70
+ executions: executions.map((e: Execution) => ({
71
+ id: e.id,
72
+ state: e.state,
73
+ reason: e.reason ?? null,
74
+ escalation: e.escalation ?? null,
75
+ total_minor: e.total,
76
+ items: e.items.map((i) => ({ beneficiary: i.beneficiary, amount_minor: i.amount })),
77
+ approval_id: e.approval_id ?? null,
78
+ receipt_ids: e.outcomes.filter((o) => o.receipt_id).map((o) => o.receipt_id),
79
+ })),
80
+ receipts: s.bundle.listReceipts().map((f) => relative(process.cwd(), `${s.bundle.dir}/receipts/${f}`)),
81
+ bundle_dir: relative(process.cwd(), s.bundle.dir),
82
+ }),
83
+ };
@@ -0,0 +1,12 @@
1
+ export * from "./agent.js";
2
+ export * from "./kit.js";
3
+ export * from "./default-kit.js";
4
+ export * from "./setup.js";
5
+ export * from "./terminal.js";
6
+ export * from "./channels/index.js";
7
+ export * from "./poll.js";
8
+ export * from "./webhook.js";
9
+ export * from "./scenarios.js";
10
+ export * from "./adversarial.js";
11
+ export * from "./inspect.js";
12
+ export { main } from "./cli.js";