@codespar/cli 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -17
- package/dist/commands/audit-replay.js +267 -0
- package/dist/commands/audit-replay.js.map +1 -0
- package/dist/commands/init.js +28 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +2 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mandate-verify.js +75 -27
- package/dist/commands/mandate-verify.js.map +1 -1
- package/dist/config.js +17 -1
- package/dist/config.js.map +1 -1
- package/dist/did.js +262 -41
- package/dist/did.js.map +1 -1
- package/dist/index.js +33 -7
- package/dist/index.js.map +1 -1
- package/dist/surface.js +4 -1
- package/dist/surface.js.map +1 -1
- package/package.json +1 -1
- package/templates/bills-agent/README.md +8 -5
- package/templates/bills-agent/agents/bills-agent/.env.example +3 -3
- package/templates/bills-agent/agents/bills-agent/AGENTS.md +1 -1
- package/templates/bills-agent/agents/bills-agent/CLAUDE.md +1 -1
- package/templates/bills-agent/agents/bills-agent/README.md +62 -22
- package/templates/bills-agent/agents/bills-agent/SYSTEM_PROMPT.md +1 -1
- package/templates/bills-agent/agents/bills-agent/agent.yaml +2 -2
- package/templates/bills-agent/agents/bills-agent/package.json +14 -11
- package/templates/bills-agent/agents/bills-agent/src/kit.ts +193 -0
- package/templates/bills-agent/agents/bills-agent/test/adversarial.test.ts +8 -7
- package/templates/bills-agent/agents/bills-agent/test/check.test.ts +19 -2
- package/templates/bills-agent/agents/bills-agent/test/cli.test.ts +72 -24
- package/templates/bills-agent/agents/bills-agent/test/fixtures/excursao-300.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/test/fixtures/material-400.transcript.jsonl +2 -0
- package/templates/bills-agent/agents/bills-agent/test/inspect.test.ts +124 -0
- package/templates/bills-agent/agents/bills-agent/test/provider.test.ts +25 -0
- package/templates/bills-agent/agents/bills-agent/test/scenarios.test.ts +10 -9
- package/templates/bills-agent/agents/bills-agent/tsconfig.json +0 -1
- package/templates/bills-agent/package.json +5 -2
- package/templates/bills-agent/packages/agent-core/README.md +2 -0
- package/templates/bills-agent/packages/agent-core/package.json +1 -1
- package/templates/bills-agent/packages/agent-core/src/api/charge-rail.ts +27 -6
- package/templates/bills-agent/packages/agent-core/src/api/rail.ts +16 -0
- package/templates/bills-agent/packages/agent-core/src/api/sandbox-payer.ts +20 -7
- package/templates/bills-agent/packages/agent-core/src/approval.ts +16 -2
- package/templates/bills-agent/packages/agent-core/src/bundle.ts +50 -4
- package/templates/bills-agent/packages/agent-core/src/channels.ts +140 -0
- package/templates/bills-agent/packages/agent-core/src/check.ts +90 -8
- package/templates/bills-agent/packages/agent-core/src/clock.ts +42 -0
- package/templates/bills-agent/packages/agent-core/src/engine.ts +119 -18
- package/templates/bills-agent/packages/agent-core/src/hash.ts +13 -0
- package/templates/bills-agent/packages/agent-core/src/index.ts +3 -0
- package/templates/bills-agent/packages/agent-core/src/manifest.ts +1 -1
- package/templates/bills-agent/packages/agent-core/src/rail.ts +16 -2
- package/templates/bills-agent/packages/agent-core/src/receipt-verification.ts +401 -0
- package/templates/bills-agent/packages/agent-core/src/state-machine.ts +3 -1
- package/templates/bills-agent/packages/agent-core/src/stubs/charge-rail.ts +2 -0
- package/templates/bills-agent/packages/agent-core/src/stubs/rail.ts +19 -2
- package/templates/bills-agent/packages/agent-core/src/types.ts +28 -0
- package/templates/bills-agent/packages/agent-core/test/approval.test.ts +36 -2
- package/templates/bills-agent/packages/agent-core/test/bundle.test.ts +85 -0
- package/templates/bills-agent/packages/agent-core/test/clock.test.ts +25 -0
- package/templates/bills-agent/packages/agent-core/test/engine.test.ts +73 -1
- package/templates/bills-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
- package/templates/bills-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
- package/templates/bills-agent/packages/agent-core/test/helpers.ts +1 -1
- package/templates/bills-agent/packages/agent-core/test/manifest.test.ts +2 -2
- package/templates/bills-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
- package/templates/bills-agent/packages/agent-core/test/receivables.test.ts +51 -0
- package/templates/bills-agent/packages/agent-runtime/README.md +68 -0
- package/templates/bills-agent/packages/agent-runtime/bin.mjs +32 -0
- package/templates/bills-agent/packages/agent-runtime/package.json +23 -0
- package/templates/bills-agent/{agents/bills-agent → packages/agent-runtime}/src/adversarial.ts +36 -44
- package/templates/bills-agent/packages/agent-runtime/src/agent.ts +68 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/index.ts +72 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/types.ts +124 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
- package/templates/bills-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
- package/templates/bills-agent/packages/agent-runtime/src/cli.ts +98 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/check.ts +15 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/start.ts +245 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
- package/templates/bills-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
- package/templates/bills-agent/packages/agent-runtime/src/default-kit.ts +83 -0
- package/templates/bills-agent/packages/agent-runtime/src/index.ts +12 -0
- package/templates/bills-agent/packages/agent-runtime/src/inspect.ts +797 -0
- package/templates/bills-agent/packages/agent-runtime/src/kit.ts +206 -0
- package/templates/{collections-agent/agents/collections-agent → bills-agent/packages/agent-runtime}/src/poll.ts +22 -11
- package/templates/{collections-agent/agents/collections-agent → bills-agent/packages/agent-runtime}/src/scenarios.ts +50 -34
- package/templates/bills-agent/{agents/bills-agent → packages/agent-runtime}/src/setup.ts +88 -66
- package/templates/bills-agent/packages/agent-runtime/src/terminal.ts +154 -0
- package/templates/{collections-agent/agents/collections-agent/channels/webhook/index.ts → bills-agent/packages/agent-runtime/src/webhook.ts} +1 -1
- package/templates/bills-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
- package/templates/bills-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
- package/templates/bills-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
- package/templates/bills-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
- package/templates/bills-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
- package/templates/bills-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
- package/templates/bills-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
- package/templates/bills-agent/packages/agent-runtime/tsconfig.json +9 -0
- package/templates/bills-agent/vitest.config.ts +1 -1
- package/templates/collections-agent/README.md +8 -5
- package/templates/collections-agent/agents/collections-agent/.env.example +14 -0
- package/templates/collections-agent/agents/collections-agent/AGENTS.md +6 -4
- package/templates/collections-agent/agents/collections-agent/CLAUDE.md +6 -4
- package/templates/collections-agent/agents/collections-agent/README.md +184 -16
- package/templates/collections-agent/agents/collections-agent/agent.yaml +3 -3
- package/templates/collections-agent/agents/collections-agent/channels/whatsapp/README.md +111 -0
- package/templates/collections-agent/agents/collections-agent/channels/whatsapp/acordo-1042.json +11 -0
- package/templates/collections-agent/agents/collections-agent/channels/whatsapp/acordo-1103.json +11 -0
- package/templates/collections-agent/agents/collections-agent/channels/whatsapp/templates.json +23 -0
- package/templates/collections-agent/agents/collections-agent/package.json +12 -10
- package/templates/collections-agent/agents/collections-agent/runbook.md +52 -1
- package/templates/collections-agent/agents/collections-agent/src/kit.ts +265 -0
- package/templates/collections-agent/agents/collections-agent/test/adversarial.test.ts +9 -8
- package/templates/collections-agent/agents/collections-agent/test/check.test.ts +43 -1
- package/templates/collections-agent/agents/collections-agent/test/cli.test.ts +56 -18
- package/templates/collections-agent/agents/collections-agent/test/fixtures/agreed-1042-awaiting-payer.transcript.jsonl +4 -0
- package/templates/collections-agent/agents/collections-agent/test/scenarios.test.ts +11 -10
- package/templates/collections-agent/agents/collections-agent/test/webhook.test.ts +4 -7
- package/templates/collections-agent/agents/collections-agent/test/whatsapp-poll.test.ts +271 -0
- package/templates/collections-agent/agents/collections-agent/test/whatsapp.test.ts +213 -0
- package/templates/collections-agent/agents/collections-agent/tsconfig.json +0 -1
- package/templates/collections-agent/package.json +3 -1
- package/templates/collections-agent/packages/agent-core/README.md +2 -0
- package/templates/collections-agent/packages/agent-core/package.json +1 -1
- package/templates/collections-agent/packages/agent-core/src/api/charge-rail.ts +27 -6
- package/templates/collections-agent/packages/agent-core/src/api/rail.ts +16 -0
- package/templates/collections-agent/packages/agent-core/src/api/sandbox-payer.ts +20 -7
- package/templates/collections-agent/packages/agent-core/src/approval.ts +16 -2
- package/templates/collections-agent/packages/agent-core/src/bundle.ts +50 -4
- package/templates/collections-agent/packages/agent-core/src/channels.ts +140 -0
- package/templates/collections-agent/packages/agent-core/src/check.ts +90 -8
- package/templates/collections-agent/packages/agent-core/src/clock.ts +42 -0
- package/templates/collections-agent/packages/agent-core/src/engine.ts +119 -18
- package/templates/collections-agent/packages/agent-core/src/hash.ts +13 -0
- package/templates/collections-agent/packages/agent-core/src/index.ts +3 -0
- package/templates/collections-agent/packages/agent-core/src/manifest.ts +1 -1
- package/templates/collections-agent/packages/agent-core/src/rail.ts +16 -2
- package/templates/collections-agent/packages/agent-core/src/receipt-verification.ts +401 -0
- package/templates/collections-agent/packages/agent-core/src/state-machine.ts +3 -1
- package/templates/collections-agent/packages/agent-core/src/stubs/charge-rail.ts +2 -0
- package/templates/collections-agent/packages/agent-core/src/stubs/rail.ts +19 -2
- package/templates/collections-agent/packages/agent-core/src/types.ts +28 -0
- package/templates/collections-agent/packages/agent-core/test/approval.test.ts +36 -2
- package/templates/collections-agent/packages/agent-core/test/bundle.test.ts +85 -0
- package/templates/collections-agent/packages/agent-core/test/clock.test.ts +25 -0
- package/templates/collections-agent/packages/agent-core/test/engine.test.ts +73 -1
- package/templates/collections-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
- package/templates/collections-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
- package/templates/collections-agent/packages/agent-core/test/helpers.ts +1 -1
- package/templates/collections-agent/packages/agent-core/test/manifest.test.ts +2 -2
- package/templates/collections-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
- package/templates/collections-agent/packages/agent-core/test/receivables.test.ts +51 -0
- package/templates/collections-agent/packages/agent-runtime/README.md +68 -0
- package/templates/collections-agent/packages/agent-runtime/bin.mjs +32 -0
- package/templates/collections-agent/packages/agent-runtime/package.json +23 -0
- package/templates/collections-agent/{agents/collections-agent → packages/agent-runtime}/src/adversarial.ts +29 -50
- package/templates/collections-agent/packages/agent-runtime/src/agent.ts +68 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/index.ts +72 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/types.ts +124 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
- package/templates/collections-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
- package/templates/collections-agent/packages/agent-runtime/src/cli.ts +98 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/check.ts +15 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/start.ts +245 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
- package/templates/collections-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
- package/templates/collections-agent/packages/agent-runtime/src/default-kit.ts +83 -0
- package/templates/collections-agent/packages/agent-runtime/src/index.ts +12 -0
- package/templates/collections-agent/packages/agent-runtime/src/inspect.ts +797 -0
- package/templates/collections-agent/packages/agent-runtime/src/kit.ts +206 -0
- package/templates/collections-agent/packages/agent-runtime/src/poll.ts +105 -0
- package/templates/{bills-agent/agents/bills-agent → collections-agent/packages/agent-runtime}/src/scenarios.ts +98 -26
- package/templates/collections-agent/packages/agent-runtime/src/setup.ts +229 -0
- package/templates/collections-agent/packages/agent-runtime/src/terminal.ts +154 -0
- package/templates/collections-agent/packages/agent-runtime/src/webhook.ts +131 -0
- package/templates/collections-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
- package/templates/collections-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
- package/templates/collections-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
- package/templates/collections-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
- package/templates/collections-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
- package/templates/collections-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
- package/templates/collections-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
- package/templates/collections-agent/packages/agent-runtime/tsconfig.json +9 -0
- package/templates/collections-agent/vitest.config.ts +1 -1
- package/templates/hello-agent/LICENSE +21 -0
- package/templates/hello-agent/README.md +23 -0
- package/templates/hello-agent/_gitignore +10 -0
- package/templates/hello-agent/agents/hello-agent/.env.example +5 -0
- package/templates/hello-agent/agents/hello-agent/AGENTS.md +15 -0
- package/templates/hello-agent/agents/hello-agent/CLAUDE.md +15 -0
- package/templates/hello-agent/agents/hello-agent/README.md +33 -0
- package/templates/hello-agent/agents/hello-agent/SYSTEM_PROMPT.md +19 -0
- package/templates/hello-agent/agents/hello-agent/agent.yaml +19 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/beneficiary-swap.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/exfiltration.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/exfiltration.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/false-authority.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/false-authority.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/fractioning.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/fractioning.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/model-total.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/prompt-injection.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/evals/adversarial/webhook-replay.json +6 -0
- package/templates/hello-agent/agents/hello-agent/evals/eval.yaml +7 -0
- package/templates/hello-agent/agents/hello-agent/guardrails.json +8 -0
- package/templates/hello-agent/agents/hello-agent/mandate.example.json +17 -0
- package/templates/hello-agent/agents/hello-agent/package.json +19 -0
- package/templates/hello-agent/agents/hello-agent/runbook.md +10 -0
- package/templates/hello-agent/agents/hello-agent/scenarios/happy-path.json +6 -0
- package/templates/hello-agent/agents/hello-agent/scenarios/happy-path.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/scenarios/prompt-injection.json +6 -0
- package/templates/hello-agent/agents/hello-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
- package/templates/hello-agent/agents/hello-agent/src/bills.ts +23 -0
- package/templates/hello-agent/agents/hello-agent/src/kit.ts +33 -0
- package/templates/hello-agent/agents/hello-agent/tools.json +11 -0
- package/templates/hello-agent/agents/hello-agent/tsconfig.json +9 -0
- package/templates/hello-agent/package.json +30 -0
- package/templates/hello-agent/packages/agent-core/README.md +21 -0
- package/templates/hello-agent/packages/agent-core/package.json +24 -0
- package/templates/hello-agent/packages/agent-core/src/agent.ts +125 -0
- package/templates/hello-agent/packages/agent-core/src/api/charge-rail.ts +175 -0
- package/templates/hello-agent/packages/agent-core/src/api/client.ts +53 -0
- package/templates/hello-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
- package/templates/hello-agent/packages/agent-core/src/api/rail.ts +117 -0
- package/templates/hello-agent/packages/agent-core/src/api/sandbox-payer.ts +58 -0
- package/templates/hello-agent/packages/agent-core/src/approval.ts +123 -0
- package/templates/hello-agent/packages/agent-core/src/bundle.ts +159 -0
- package/templates/hello-agent/packages/agent-core/src/channels.ts +140 -0
- package/templates/hello-agent/packages/agent-core/src/check.ts +253 -0
- package/templates/hello-agent/packages/agent-core/src/clock.ts +42 -0
- package/templates/hello-agent/packages/agent-core/src/engine.ts +885 -0
- package/templates/hello-agent/packages/agent-core/src/escalate.ts +85 -0
- package/templates/hello-agent/packages/agent-core/src/events.ts +40 -0
- package/templates/hello-agent/packages/agent-core/src/guardrails.ts +45 -0
- package/templates/hello-agent/packages/agent-core/src/hash.ts +62 -0
- package/templates/hello-agent/packages/agent-core/src/ids.ts +10 -0
- package/templates/hello-agent/packages/agent-core/src/index.ts +32 -0
- package/templates/hello-agent/packages/agent-core/src/mandate.ts +100 -0
- package/templates/hello-agent/packages/agent-core/src/manifest.ts +76 -0
- package/templates/hello-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
- package/templates/hello-agent/packages/agent-core/src/providers/replay.ts +63 -0
- package/templates/hello-agent/packages/agent-core/src/providers/types.ts +39 -0
- package/templates/hello-agent/packages/agent-core/src/rail.ts +101 -0
- package/templates/hello-agent/packages/agent-core/src/receipt-verification.ts +401 -0
- package/templates/hello-agent/packages/agent-core/src/revocation.ts +30 -0
- package/templates/hello-agent/packages/agent-core/src/secrets.ts +30 -0
- package/templates/hello-agent/packages/agent-core/src/state/store.ts +307 -0
- package/templates/hello-agent/packages/agent-core/src/state-machine.ts +148 -0
- package/templates/hello-agent/packages/agent-core/src/stubs/charge-rail.ts +195 -0
- package/templates/hello-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
- package/templates/hello-agent/packages/agent-core/src/stubs/rail.ts +141 -0
- package/templates/hello-agent/packages/agent-core/src/tools.ts +55 -0
- package/templates/hello-agent/packages/agent-core/src/types.ts +134 -0
- package/templates/hello-agent/packages/agent-core/test/approval.test.ts +117 -0
- package/templates/hello-agent/packages/agent-core/test/bundle.test.ts +85 -0
- package/templates/hello-agent/packages/agent-core/test/clock.test.ts +25 -0
- package/templates/hello-agent/packages/agent-core/test/engine.test.ts +596 -0
- package/templates/hello-agent/packages/agent-core/test/escalate.test.ts +42 -0
- package/templates/hello-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
- package/templates/hello-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
- package/templates/hello-agent/packages/agent-core/test/helpers.ts +139 -0
- package/templates/hello-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
- package/templates/hello-agent/packages/agent-core/test/manifest.test.ts +45 -0
- package/templates/hello-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
- package/templates/hello-agent/packages/agent-core/test/receivables.test.ts +316 -0
- package/templates/hello-agent/packages/agent-core/test/secrets.test.ts +28 -0
- package/templates/hello-agent/packages/agent-core/test/state-machine.test.ts +67 -0
- package/templates/hello-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
- package/templates/hello-agent/packages/agent-core/tsconfig.json +10 -0
- package/templates/hello-agent/packages/agent-runtime/README.md +68 -0
- package/templates/hello-agent/packages/agent-runtime/bin.mjs +32 -0
- package/templates/hello-agent/packages/agent-runtime/package.json +23 -0
- package/templates/hello-agent/packages/agent-runtime/src/adversarial.ts +169 -0
- package/templates/hello-agent/packages/agent-runtime/src/agent.ts +68 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/index.ts +72 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/types.ts +124 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
- package/templates/hello-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
- package/templates/hello-agent/packages/agent-runtime/src/cli.ts +98 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/check.ts +15 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/start.ts +245 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
- package/templates/hello-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
- package/templates/hello-agent/packages/agent-runtime/src/default-kit.ts +83 -0
- package/templates/hello-agent/packages/agent-runtime/src/index.ts +12 -0
- package/templates/hello-agent/packages/agent-runtime/src/inspect.ts +797 -0
- package/templates/hello-agent/packages/agent-runtime/src/kit.ts +206 -0
- package/templates/hello-agent/packages/agent-runtime/src/poll.ts +105 -0
- package/templates/hello-agent/packages/agent-runtime/src/scenarios.ts +268 -0
- package/templates/hello-agent/packages/agent-runtime/src/setup.ts +229 -0
- package/templates/hello-agent/packages/agent-runtime/src/terminal.ts +154 -0
- package/templates/hello-agent/packages/agent-runtime/src/webhook.ts +131 -0
- package/templates/hello-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
- package/templates/hello-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
- package/templates/hello-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
- package/templates/hello-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
- package/templates/hello-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
- package/templates/hello-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
- package/templates/hello-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
- package/templates/hello-agent/packages/agent-runtime/tsconfig.json +9 -0
- package/templates/hello-agent/tsconfig.base.json +16 -0
- package/templates/hello-agent/vitest.config.ts +12 -0
- package/templates/kits.lock.json +60 -12
- package/templates/supplier-payments-agent/LICENSE +21 -0
- package/templates/supplier-payments-agent/README.md +23 -0
- package/templates/supplier-payments-agent/_gitignore +10 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/.env.example +7 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/AGENTS.md +21 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/CLAUDE.md +21 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/README.md +118 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/SYSTEM_PROMPT.md +29 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/agent.yaml +26 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/batch-tampering.json +12 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/batch-tampering.transcript.jsonl +3 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap-mandate.json +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap.json +10 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/beneficiary-swap.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/exfiltration.json +13 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/exfiltration.transcript.jsonl +3 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/false-authority.json +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/false-authority.transcript.jsonl +3 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/fractioning.json +15 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/fractioning.transcript.jsonl +6 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/model-total.json +10 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/model-total.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/prompt-injection.json +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/prompt-injection.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/adversarial/webhook-replay.json +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/evals/eval.yaml +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/guardrails.json +15 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/mandate.example.json +70 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/package.json +26 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/runbook.md +19 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/beneficiary-not-allowed.json +14 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/beneficiary-not-allowed.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/cap-exceeded.json +12 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/cap-exceeded.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/escalated-above-threshold.json +20 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/escalated-above-threshold.transcript.jsonl +7 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/happy-path.json +19 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/happy-path.transcript.jsonl +3 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/mandate-revoked.json +21 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/mandate-revoked.transcript.jsonl +9 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/partial-batch-failure.json +21 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/partial-batch-failure.transcript.jsonl +3 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/prompt-injection.json +12 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/scenarios/prompt-injection.transcript.jsonl +2 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/kit.ts +176 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/modules/batch-payout.ts +345 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/modules/pix-out.ts +118 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/src/payables.ts +76 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/adversarial.test.ts +53 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/batch.test.ts +384 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/check.test.ts +109 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/scenarios.test.ts +81 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/tools.json +53 -0
- package/templates/supplier-payments-agent/agents/supplier-payments-agent/tsconfig.json +9 -0
- package/templates/supplier-payments-agent/package.json +36 -0
- package/templates/supplier-payments-agent/packages/agent-core/README.md +21 -0
- package/templates/supplier-payments-agent/packages/agent-core/package.json +24 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/agent.ts +125 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/api/charge-rail.ts +175 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/api/client.ts +53 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/api/mandate-status.ts +58 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/api/rail.ts +117 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/api/sandbox-payer.ts +58 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/approval.ts +123 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/bundle.ts +159 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/channels.ts +140 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/check.ts +253 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/clock.ts +42 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/engine.ts +885 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/escalate.ts +85 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/events.ts +40 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/guardrails.ts +45 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/hash.ts +62 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/ids.ts +10 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/index.ts +32 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/mandate.ts +100 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/manifest.ts +76 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/providers/anthropic.ts +76 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/providers/replay.ts +63 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/providers/types.ts +39 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/rail.ts +101 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/receipt-verification.ts +401 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/revocation.ts +30 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/secrets.ts +30 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/state/store.ts +307 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/state-machine.ts +148 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/stubs/charge-rail.ts +195 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/stubs/mandate-status.ts +57 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/stubs/rail.ts +141 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/tools.ts +55 -0
- package/templates/supplier-payments-agent/packages/agent-core/src/types.ts +134 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/approval.test.ts +117 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/bundle.test.ts +85 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/clock.test.ts +25 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/engine.test.ts +596 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/escalate.test.ts +42 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/fixtures/staging-receipt-keys.json +18 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/fixtures/staging-receipt.json +24 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/helpers.ts +139 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/mandate-status.test.ts +153 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/manifest.test.ts +45 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/receipt-verification.test.ts +316 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/receivables.test.ts +316 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/secrets.test.ts +28 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/state-machine.test.ts +67 -0
- package/templates/supplier-payments-agent/packages/agent-core/test/transitions.type-test.ts +59 -0
- package/templates/supplier-payments-agent/packages/agent-core/tsconfig.json +10 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/README.md +68 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/bin.mjs +32 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/package.json +23 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/adversarial.ts +169 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/agent.ts +68 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/contact.ts +13 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/index.ts +72 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/rules.ts +120 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/types.ts +124 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/cloud-api.ts +358 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/emulator.ts +206 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/evidence.ts +109 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/index.ts +225 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/open.ts +143 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/present.ts +47 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/run.ts +113 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/channels/whatsapp/session.ts +113 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/cli.ts +98 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/check.ts +15 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/decide.ts +63 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/eval.ts +58 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/inspect.ts +100 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/poll-whatsapp.ts +317 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/poll.ts +144 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/reconcile.ts +42 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/rerun.ts +86 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/resume.ts +43 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/start-whatsapp.ts +131 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/start.ts +245 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/verify.ts +129 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/commands/webhook.ts +39 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/default-kit.ts +83 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/index.ts +12 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/inspect.ts +797 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/kit.ts +206 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/poll.ts +105 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/scenarios.ts +268 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/setup.ts +229 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/terminal.ts +154 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/src/webhook.ts +131 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/inspect.test.ts +336 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/verify-cli.test.ts +127 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-cloud-api.test.ts +232 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-emulator.integration.test.ts +204 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-evidence.test.ts +94 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-rules.test.ts +174 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/test/whatsapp-session.test.ts +135 -0
- package/templates/supplier-payments-agent/packages/agent-runtime/tsconfig.json +9 -0
- package/templates/supplier-payments-agent/tsconfig.base.json +16 -0
- package/templates/supplier-payments-agent/vitest.config.ts +12 -0
- package/templates/bills-agent/agents/bills-agent/channels/terminal/index.ts +0 -108
- package/templates/bills-agent/agents/bills-agent/src/commands/approve.ts +0 -9
- package/templates/bills-agent/agents/bills-agent/src/commands/check.ts +0 -13
- package/templates/bills-agent/agents/bills-agent/src/commands/consent.ts +0 -26
- package/templates/bills-agent/agents/bills-agent/src/commands/decide.ts +0 -45
- package/templates/bills-agent/agents/bills-agent/src/commands/deny.ts +0 -7
- package/templates/bills-agent/agents/bills-agent/src/commands/eval.ts +0 -37
- package/templates/bills-agent/agents/bills-agent/src/commands/reconcile.ts +0 -38
- package/templates/bills-agent/agents/bills-agent/src/commands/rerun.ts +0 -65
- package/templates/bills-agent/agents/bills-agent/src/commands/resume.ts +0 -30
- package/templates/bills-agent/agents/bills-agent/src/main.ts +0 -185
- package/templates/collections-agent/agents/collections-agent/channels/terminal/index.ts +0 -178
- package/templates/collections-agent/agents/collections-agent/src/commands/approve.ts +0 -10
- package/templates/collections-agent/agents/collections-agent/src/commands/check.ts +0 -13
- package/templates/collections-agent/agents/collections-agent/src/commands/decide.ts +0 -48
- package/templates/collections-agent/agents/collections-agent/src/commands/deny.ts +0 -7
- package/templates/collections-agent/agents/collections-agent/src/commands/eval.ts +0 -39
- package/templates/collections-agent/agents/collections-agent/src/commands/poll.ts +0 -35
- package/templates/collections-agent/agents/collections-agent/src/commands/reconcile.ts +0 -38
- package/templates/collections-agent/agents/collections-agent/src/commands/rerun.ts +0 -55
- package/templates/collections-agent/agents/collections-agent/src/commands/resume.ts +0 -30
- package/templates/collections-agent/agents/collections-agent/src/commands/webhook.ts +0 -36
- package/templates/collections-agent/agents/collections-agent/src/main.ts +0 -193
- package/templates/collections-agent/agents/collections-agent/src/setup.ts +0 -250
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { cpSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { checkAgent } from "@codespar/agent-core";
|
|
6
|
+
|
|
7
|
+
const AGENT_DIR = resolve(import.meta.dirname, "..");
|
|
8
|
+
|
|
9
|
+
function copyAgent(): string {
|
|
10
|
+
const dir = mkdtempSync(join(tmpdir(), "supplier-check-"));
|
|
11
|
+
for (const f of ["agent.yaml", "SYSTEM_PROMPT.md", "tools.json", "guardrails.json", "mandate.example.json", "AGENTS.md", "CLAUDE.md", "README.md", "runbook.md", ".env.example"]) cpSync(join(AGENT_DIR, f), join(dir, f));
|
|
12
|
+
cpSync(join(AGENT_DIR, "scenarios"), join(dir, "scenarios"), { recursive: true });
|
|
13
|
+
cpSync(join(AGENT_DIR, "evals"), join(dir, "evals"), { recursive: true });
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const codes = (dir: string) => checkAgent(dir).findings.filter((f) => f.level === "error").map((f) => f.code);
|
|
18
|
+
|
|
19
|
+
describe("npm run check: the manifest is the index", () => {
|
|
20
|
+
it("passes on the shipped agent", () => {
|
|
21
|
+
expect(codes(AGENT_DIR)).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("fails when guardrails contradict the manifest", () => {
|
|
25
|
+
const dir = copyAgent();
|
|
26
|
+
const g = JSON.parse(readFileSync(join(dir, "guardrails.json"), "utf8")) as { approval: string; escalate_above: { amount: number } };
|
|
27
|
+
g.approval = "mandate";
|
|
28
|
+
writeFileSync(join(dir, "guardrails.json"), JSON.stringify(g));
|
|
29
|
+
expect(codes(dir)).toContain("guardrails_contradict_manifest");
|
|
30
|
+
g.approval = "human";
|
|
31
|
+
g.escalate_above.amount = 999;
|
|
32
|
+
writeFileSync(join(dir, "guardrails.json"), JSON.stringify(g));
|
|
33
|
+
expect(codes(dir)).toContain("guardrails_contradict_manifest");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("fails when the prompt names a tool tools.json does not have, or when tools.json drops the payment tool", () => {
|
|
37
|
+
const dir = copyAgent();
|
|
38
|
+
writeFileSync(join(dir, "SYSTEM_PROMPT.md"), readFileSync(join(dir, "SYSTEM_PROMPT.md"), "utf8") + "\nYou may also call codespar_wallet.\n");
|
|
39
|
+
expect(codes(dir)).toContain("prompt_contradicts_tools");
|
|
40
|
+
const t = JSON.parse(readFileSync(join(dir, "tools.json"), "utf8")) as { meta_tools: Array<{ effect: string }> };
|
|
41
|
+
t.meta_tools = t.meta_tools.filter((x) => x.effect !== "payment");
|
|
42
|
+
writeFileSync(join(dir, "tools.json"), JSON.stringify(t));
|
|
43
|
+
expect(codes(dir)).toContain("tools_contradict_manifest");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("fails when AGENTS.md and CLAUDE.md diverge", () => {
|
|
47
|
+
const dir = copyAgent();
|
|
48
|
+
writeFileSync(join(dir, "CLAUDE.md"), readFileSync(join(dir, "CLAUDE.md"), "utf8") + "\nextra line\n");
|
|
49
|
+
expect(codes(dir)).toContain("agents_md_diverges");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("fails when mcp, cli or schema are missing", () => {
|
|
53
|
+
for (const field of ["mcp", "cli", "schema"]) {
|
|
54
|
+
const dir = copyAgent();
|
|
55
|
+
writeFileSync(join(dir, "agent.yaml"), readFileSync(join(dir, "agent.yaml"), "utf8").split("\n").filter((l) => !l.startsWith(`${field}:`)).join("\n"));
|
|
56
|
+
expect(codes(dir)).toContain("manifest_field_missing");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("fails when a doc claims third-party verifiability and never says which signature it means", () => {
|
|
61
|
+
const dir = copyAgent();
|
|
62
|
+
// The claim with no mechanism named: true of the Ed25519 seal on a receipt, false of the approval artifact and of every receipt sealed before it.
|
|
63
|
+
writeFileSync(join(dir, "README.md"), "# supplier-payments-agent\n\nO recibo é verificável por terceiro.\n");
|
|
64
|
+
expect(codes(dir)).toContain("doc_overclaims");
|
|
65
|
+
// The same claim, with the mechanism named: allowed, and what the shipped README does.
|
|
66
|
+
writeFileSync(join(dir, "README.md"), "# supplier-payments-agent\n\nO recibo é verificável por terceiro: a assinatura Ed25519 confere contra as chaves públicas.\n");
|
|
67
|
+
expect(codes(dir)).not.toContain("doc_overclaims");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
it("refuses the claim, mechanism named and all, when the agent itself says receipt-verification is blocked", () => {
|
|
72
|
+
const dir = copyAgent();
|
|
73
|
+
writeFileSync(join(dir, "README.md"), readFileSync(join(dir, "README.md"), "utf8") + "\nThe receipt is third-party verifiable: the Ed25519 signature checks against the published keys.\n");
|
|
74
|
+
expect(codes(dir)).not.toContain("doc_overclaims");
|
|
75
|
+
writeFileSync(join(dir, "agent.yaml"), readFileSync(join(dir, "agent.yaml"), "utf8").replace("receipt-verification: sandbox", "receipt-verification: blocked"));
|
|
76
|
+
expect(codes(dir)).toContain("doc_overclaims");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("fails when .env.example grows a third key", () => {
|
|
80
|
+
const dir = copyAgent();
|
|
81
|
+
writeFileSync(join(dir, ".env.example"), readFileSync(join(dir, ".env.example"), "utf8") + "APPROVAL_KEY=x\n");
|
|
82
|
+
expect(codes(dir)).toContain("env_example_extra");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("fails when agent.yaml declares an event the API does not publish", () => {
|
|
86
|
+
const dir = copyAgent();
|
|
87
|
+
const manifest = join(dir, "agent.yaml");
|
|
88
|
+
writeFileSync(manifest, readFileSync(manifest, "utf8").replace("commerce.payment.succeeded", "commerce.payment.settled"));
|
|
89
|
+
const report = checkAgent(dir);
|
|
90
|
+
expect(report.findings.filter((f) => f.code === "events_unknown").map((f) => f.message)).toEqual([expect.stringContaining("commerce.payment.settled")]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("fails when eval.yaml does not extend the manifest or redeclares a field", () => {
|
|
94
|
+
const dir = copyAgent();
|
|
95
|
+
writeFileSync(join(dir, "evals", "eval.yaml"), "extends: ../agent.yaml\nname: other\n");
|
|
96
|
+
expect(codes(dir)).toContain("eval_redeclares_manifest");
|
|
97
|
+
writeFileSync(join(dir, "evals", "eval.yaml"), "cases: []\n");
|
|
98
|
+
expect(codes(dir)).toContain("eval_extends");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("fails when the batch capability is declared without the payment tool that runs it", () => {
|
|
102
|
+
const dir = copyAgent();
|
|
103
|
+
const t = JSON.parse(readFileSync(join(dir, "tools.json"), "utf8")) as { meta_tools: Array<{ effect: string }> };
|
|
104
|
+
t.meta_tools = t.meta_tools.filter((x) => x.effect !== "payment");
|
|
105
|
+
writeFileSync(join(dir, "tools.json"), JSON.stringify(t));
|
|
106
|
+
// `batch-payout` rides on `pix-out`, so dropping the payment tool is what the gate catches.
|
|
107
|
+
expect(codes(dir)).toContain("tools_contradict_manifest");
|
|
108
|
+
});
|
|
109
|
+
});
|
package/templates/supplier-payments-agent/agents/supplier-payments-agent/test/scenarios.test.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { existsSync, mkdtempSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { checkScenario, listScenarios, loadScenario, runScenario } from "@codespar/agent-runtime";
|
|
6
|
+
import { agent } from "../src/kit.js";
|
|
7
|
+
|
|
8
|
+
const runsDir = mkdtempSync(join(tmpdir(), "supplier-runs-"));
|
|
9
|
+
|
|
10
|
+
describe("section 12: scenario packs, on the replay provider", () => {
|
|
11
|
+
const required = ["happy-path", "partial-batch-failure", "cap-exceeded", "beneficiary-not-allowed", "prompt-injection", "escalated-above-threshold", "mandate-revoked"];
|
|
12
|
+
|
|
13
|
+
it("ships every scenario the spec asks for, including this agent's own", () => {
|
|
14
|
+
for (const name of required) expect(listScenarios(agent)).toContain(name);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
for (const name of required) {
|
|
18
|
+
const scenario = loadScenario(agent, name);
|
|
19
|
+
for (const mode of scenario.modes) {
|
|
20
|
+
it(`${name} [${mode}] ends in the states the pack declares`, async () => {
|
|
21
|
+
const run = await runScenario(agent, scenario, { mode, runsDir });
|
|
22
|
+
const check = checkScenario(scenario, run);
|
|
23
|
+
expect(check.failures).toEqual([]);
|
|
24
|
+
expect(check.ok).toBe(true);
|
|
25
|
+
// Every event of the bundle carries an actor.
|
|
26
|
+
const events = readFileSync(join(run.bundle_dir, "events.jsonl"), "utf8").split("\n").filter(Boolean).map((l) => JSON.parse(l) as { actor?: unknown });
|
|
27
|
+
expect(events.length).toBeGreaterThan(0);
|
|
28
|
+
for (const e of events) expect(e.actor).toBeDefined();
|
|
29
|
+
// Every receipt carries an actor and no raw payee.
|
|
30
|
+
for (const file of readdirSync(join(run.bundle_dir, "receipts"))) {
|
|
31
|
+
const receipt = JSON.parse(readFileSync(join(run.bundle_dir, "receipts", file), "utf8")) as { actor?: unknown; payment: { payee: string | null } };
|
|
32
|
+
expect(receipt.actor).toBeDefined();
|
|
33
|
+
expect(receipt.payment.payee ?? "").toContain("***");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
it("happy-path: the batch is three executions and three artifacts, in both modes", async () => {
|
|
40
|
+
const scenario = loadScenario(agent, "happy-path");
|
|
41
|
+
for (const mode of ["human", "mandate"] as const) {
|
|
42
|
+
const run = await runScenario(agent, scenario, { mode, runsDir });
|
|
43
|
+
expect(run.executions).toHaveLength(3);
|
|
44
|
+
const artifacts = JSON.parse(readFileSync(join(run.bundle_dir, "approval.json"), "utf8")) as Array<{ execution_id: string; items: unknown[]; items_hash: string; approver: { type: string } }>;
|
|
45
|
+
expect(artifacts).toHaveLength(3);
|
|
46
|
+
// The approved list is attested line by line: one item per artifact, one hash each, and a person decided every one. The set they belong to is bound too (batch.test.ts).
|
|
47
|
+
for (const a of artifacts) {
|
|
48
|
+
expect(a.items).toHaveLength(1);
|
|
49
|
+
expect(a.approver.type).toBe("person");
|
|
50
|
+
}
|
|
51
|
+
expect(new Set(artifacts.map((a) => a.items_hash)).size).toBe(3);
|
|
52
|
+
expect(artifacts.map((a) => a.execution_id).sort()).toEqual(run.executions.map((e) => e.id).sort());
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("partial-batch-failure: the refused line is one execution, and the line after it still settled", async () => {
|
|
57
|
+
const scenario = loadScenario(agent, "partial-batch-failure");
|
|
58
|
+
const run = await runScenario(agent, scenario, { mode: "human", runsDir });
|
|
59
|
+
expect(run.executions.map((e) => e.state)).toEqual(["settled", "failed", "settled"]);
|
|
60
|
+
expect(run.settled_total).toBe(174000);
|
|
61
|
+
// Each line carries its own terminal state, so the refusal is `failed` on
|
|
62
|
+
// one row while the others are `settled` on theirs.
|
|
63
|
+
expect(run.executions[2]?.trail).toContain("executing");
|
|
64
|
+
expect(run.receipts).toBe(2);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("nothing reaches executing without an approval artifact carrying its items_hash", async () => {
|
|
68
|
+
for (const name of required) {
|
|
69
|
+
const scenario = loadScenario(agent, name);
|
|
70
|
+
for (const mode of scenario.modes) {
|
|
71
|
+
const run = await runScenario(agent, scenario, { mode, runsDir });
|
|
72
|
+
const approvalPath = join(run.bundle_dir, "approval.json");
|
|
73
|
+
const artifacts = existsSync(approvalPath) ? (JSON.parse(readFileSync(approvalPath, "utf8")) as Array<{ execution_id: string; items_hash: string }>) : [];
|
|
74
|
+
for (const e of run.executions) {
|
|
75
|
+
if (!e.trail.includes("executing")) continue;
|
|
76
|
+
expect(artifacts.some((a) => a.execution_id === e.id)).toBe(true);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta_tools": [
|
|
3
|
+
{
|
|
4
|
+
"name": "codespar_pay",
|
|
5
|
+
"effect": "payment",
|
|
6
|
+
"description": "Propose Pix payouts. This does NOT pay: it creates executions in `drafted` that the core checks against the mandate and, depending on the approval mode, asks a person or runs. Two shapes. With `batch_ref` it runs a whole batch from list_payables (suppliers, commissions or payroll) as one execution PER LINE, so a refusal on one payee does not stop the others and re-running the same batch pays nobody twice; the lines come from the payables file, so never send items or total_minor with it. With `items` it proposes a single one-off payout to named payees. Amounts are in BRL cents.",
|
|
7
|
+
"input_schema": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"action": { "type": "string", "enum": ["pix"] },
|
|
11
|
+
"batch_ref": { "type": "string", "description": "A batch_ref from list_payables (e.g. folha-2026-10). Runs every open line of that batch. Cannot be combined with items." },
|
|
12
|
+
"items": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"minItems": 1,
|
|
15
|
+
"description": "A one-off payout, outside any batch. Cannot be combined with batch_ref.",
|
|
16
|
+
"items": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"payee": { "type": "string", "description": "A payee alias from list_payables. Never a raw Pix key somebody typed in the chat." },
|
|
20
|
+
"amount_minor": { "type": "integer", "minimum": 1, "description": "BRL cents." },
|
|
21
|
+
"description": { "type": "string" }
|
|
22
|
+
},
|
|
23
|
+
"required": ["payee", "amount_minor"]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"total_minor": { "type": "integer", "description": "Optional, and only with items. What you believe the total is. The core recomputes it and yours is only recorded." }
|
|
27
|
+
},
|
|
28
|
+
"required": ["action"]
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "codespar_ledger",
|
|
33
|
+
"effect": "read",
|
|
34
|
+
"description": "Read the receipt of a settled payout by receipt id, or list the executions of this mandate with their states.",
|
|
35
|
+
"input_schema": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"properties": {
|
|
38
|
+
"action": { "type": "string", "enum": ["receipt", "executions"] },
|
|
39
|
+
"receipt_id": { "type": "string" }
|
|
40
|
+
},
|
|
41
|
+
"required": ["action"]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"local_tools": [
|
|
46
|
+
{
|
|
47
|
+
"name": "list_payables",
|
|
48
|
+
"effect": "read",
|
|
49
|
+
"description": "The month's payables, grouped into the batches the company runs: suppliers, commissions, payroll. Each line carries its payee alias, name, amount in BRL cents, reference, and whether a previous run of that batch already covers it (`open`, `already_settled`, `in_progress`). Read-only.",
|
|
50
|
+
"input_schema": { "type": "object", "properties": {} }
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{name}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "A company delegates its suppliers, commissions and payroll to an agent that pays them in batches under one signed mandate. A batch is a loop of executions: one refusal does not stop the others, and re-running it pays nobody twice.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"workspaces": [
|
|
9
|
+
"packages/agent-core",
|
|
10
|
+
"packages/agent-runtime",
|
|
11
|
+
"agents/supplier-payments-agent"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "npm start --workspace=agents/supplier-payments-agent --",
|
|
15
|
+
"check": "npm run check --workspaces --if-present --",
|
|
16
|
+
"test": "vitest run --pool=forks --maxWorkers=1",
|
|
17
|
+
"typecheck": "tsc --noEmit -p packages/agent-core/tsconfig.json && tsc --noEmit -p packages/agent-runtime/tsconfig.json && tsc --noEmit -p agents/supplier-payments-agent/tsconfig.json",
|
|
18
|
+
"approve": "npm run approve --workspace=agents/supplier-payments-agent --",
|
|
19
|
+
"deny": "npm run deny --workspace=agents/supplier-payments-agent --",
|
|
20
|
+
"eval": "npm run eval --workspace=agents/supplier-payments-agent --",
|
|
21
|
+
"inspect": "npm run inspect --workspace=agents/supplier-payments-agent --",
|
|
22
|
+
"reconcile": "npm run reconcile --workspace=agents/supplier-payments-agent --",
|
|
23
|
+
"rerun": "npm run rerun --workspace=agents/supplier-payments-agent --",
|
|
24
|
+
"resume": "npm run resume --workspace=agents/supplier-payments-agent --",
|
|
25
|
+
"verify": "npm run verify --workspace=agents/supplier-payments-agent --"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "22.20.4",
|
|
29
|
+
"tsx": "4.20.5",
|
|
30
|
+
"typescript": "5.9.2",
|
|
31
|
+
"vitest": "3.2.4"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=22.13"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @codespar/agent-core
|
|
2
|
+
|
|
3
|
+
The primitives every CodeSpar starter-kit agent inherits (spec v5.1.1, section 4): the execution state machine, the approval artifact, the `agent.yaml` manifest, `escalate_above`, `actor`, local state in SQLite, the proof bundle, the rail contract and the two providers.
|
|
4
|
+
|
|
5
|
+
This package is the decisions. The RUNNER around them — the terminal channel, `codespar-agent start|consent|approve|deny|resume|rerun|reconcile|poll|webhook|check|eval`, the setup that wires this package to an agent directory, and the scenario and adversarial runners — is [`@codespar/agent-runtime`](../agent-runtime), which depends on this one and is what an agent's `package.json` scripts call (#13). Nothing here knows an agent's name.
|
|
6
|
+
|
|
7
|
+
## The state machine, and what the types do and do not prove
|
|
8
|
+
|
|
9
|
+
`transition(execution, to, input)` accepts only a `to` that the table in `state-machine.ts` lists for `execution.state`. On a **narrowed** value (`Execution<"drafted">`, `Execution<"executing">`, ...) a transition outside the table is a compile error, and `test/transitions.type-test.ts` keeps that true with `@ts-expect-error` lines that `tsc` refuses to leave unused. An **un-narrowed** `Execution` (the union, which is what a row read back from SQLite is) compiles for any target; the engine narrows with casts at its call sites. So the guard that always holds is the runtime one: `transition()` throws `IllegalTransitionError` on any pair the table does not list, whatever the static type said. The type test proves the table is closed; the runtime check enforces it.
|
|
10
|
+
|
|
11
|
+
## The one policy, three gates
|
|
12
|
+
|
|
13
|
+
`ExecutionEngine.policy()` runs at draft, at a human's approval and again immediately before `executing`, inside the transaction that writes the outbox row. Mandate status, allowlist, per-transaction cap, the window cap (counting settled, in flight AND awaiting executions as reservations), `escalate_above` and the artifact's `items_hash` are all re-checked at the last gate. A person's approval satisfies `escalate_above` and nothing else.
|
|
14
|
+
|
|
15
|
+
## Reconcile never re-dispatches
|
|
16
|
+
|
|
17
|
+
An execution left in `executing` is looked up on the rail, attempt by attempt. A recorded settled or failed outcome closes it; `in_flight`, `uncertain` or unknown leaves it in `executing` with `reason: rail_uncertain` for a human. The single exception is an outbox row still `pending` (the state changed, no call was ever made): those attempts go out once, under the same ids.
|
|
18
|
+
|
|
19
|
+
## Stubs
|
|
20
|
+
|
|
21
|
+
`stubs/mandate-status.ts` (the section 4.7 status source for runs without a key: revocation, pause and the organization kill switch, over the local state.db) and `stubs/rail.ts` (the sandbox rail) are stand-ins for the CI, the scenarios and `rerun`, marked as such. With a test key the engine reads the mandate status from the API instead (`api/mandate-status.ts`, `GET /v1/mandates/{id}`), fail-closed: anything but `active` refuses `executing`, and a read that does not answer is `mandate_status_unavailable`, never "assume active". The approval artifact is signed with a local development key (`approval.ts`); the API does not sign approval lists.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@codespar/agent-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The primitives every CodeSpar starter-kit agent inherits: the execution state machine, the approval artifact, the agent.yaml manifest, escalate_above, actor, local state and providers.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./src/index.ts",
|
|
8
|
+
"types": "./src/index.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": "./src/index.ts",
|
|
11
|
+
"./providers/anthropic": "./src/providers/anthropic.ts",
|
|
12
|
+
"./providers/replay": "./src/providers/replay.ts"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
16
|
+
"test": "vitest run --pool=forks --maxWorkers=1 --root ../.. packages/agent-core"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@anthropic-ai/sdk": "0.128.0",
|
|
20
|
+
"@codespar/sdk": "0.16.6",
|
|
21
|
+
"yaml": "2.9.1",
|
|
22
|
+
"zod": "3.25.76"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool-use loop. The provider says what the model wants; this file
|
|
3
|
+
* dispatches only the tools `tools.json` names, records every step in the
|
|
4
|
+
* transcript, and hands payment tools to the engine, which is the only
|
|
5
|
+
* thing that can move an execution past `drafted`.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProofBundle } from "./bundle.js";
|
|
8
|
+
import type { ExecutionEngine } from "./engine.js";
|
|
9
|
+
import type { AgentRuntime, ConversationMessage, ToolCall, ToolSpec } from "./providers/types.js";
|
|
10
|
+
import { isReply } from "./providers/types.js";
|
|
11
|
+
import type { Execution } from "./state-machine.js";
|
|
12
|
+
import type { ToolsFile } from "./tools.js";
|
|
13
|
+
import { allowedToolNames, toolSpecs } from "./tools.js";
|
|
14
|
+
|
|
15
|
+
export interface ToolContext {
|
|
16
|
+
engine: ExecutionEngine;
|
|
17
|
+
/** Fires when a payment tool created an execution; the channel decides what to do with it (ask, or run). */
|
|
18
|
+
onExecution: (execution: Execution) => Promise<Execution>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type ToolHandler = (input: Record<string, unknown>, ctx: ToolContext) => Promise<unknown>;
|
|
22
|
+
|
|
23
|
+
export interface AgentLoopOptions {
|
|
24
|
+
runtime: AgentRuntime;
|
|
25
|
+
tools: ToolsFile;
|
|
26
|
+
handlers: Record<string, ToolHandler>;
|
|
27
|
+
system: string;
|
|
28
|
+
bundle: ProofBundle;
|
|
29
|
+
engine: ExecutionEngine;
|
|
30
|
+
onExecution: ToolContext["onExecution"];
|
|
31
|
+
/** A hard stop on tool round-trips per turn, so a looping model cannot run forever. */
|
|
32
|
+
maxSteps?: number;
|
|
33
|
+
clock?: () => Date;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface TurnResult {
|
|
37
|
+
reply: string;
|
|
38
|
+
tool_calls: Array<{ name: string; refused: boolean }>;
|
|
39
|
+
executions: Execution[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class AgentLoop {
|
|
43
|
+
private readonly messages: ConversationMessage[] = [];
|
|
44
|
+
private readonly allowed: Set<string>;
|
|
45
|
+
private readonly specs: ToolSpec[];
|
|
46
|
+
private readonly clock: () => Date;
|
|
47
|
+
|
|
48
|
+
constructor(private readonly options: AgentLoopOptions) {
|
|
49
|
+
this.allowed = allowedToolNames(options.tools);
|
|
50
|
+
this.specs = toolSpecs(options.tools);
|
|
51
|
+
this.clock = options.clock ?? (() => new Date());
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
get history(): readonly ConversationMessage[] {
|
|
55
|
+
return this.messages;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async turn(userText: string): Promise<TurnResult> {
|
|
59
|
+
const { runtime, bundle } = this.options;
|
|
60
|
+
const maxSteps = this.options.maxSteps ?? 8;
|
|
61
|
+
const calls: TurnResult["tool_calls"] = [];
|
|
62
|
+
const executions: Execution[] = [];
|
|
63
|
+
|
|
64
|
+
this.messages.push({ role: "user", content: userText });
|
|
65
|
+
bundle.transcript({ at: this.now(), kind: "user", text: userText });
|
|
66
|
+
|
|
67
|
+
for (let step = 0; step < maxSteps; step += 1) {
|
|
68
|
+
const out = await runtime.step({ system: this.options.system, messages: this.messages }, this.specs);
|
|
69
|
+
if (isReply(out)) {
|
|
70
|
+
this.messages.push({ role: "assistant", content: out.text });
|
|
71
|
+
bundle.transcript({ at: this.now(), kind: "assistant_step", reply: out.text });
|
|
72
|
+
bundle.transcript({ at: this.now(), kind: "assistant", text: out.text });
|
|
73
|
+
return { reply: out.text, tool_calls: calls, executions };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
this.messages.push({ role: "assistant", content: "", tool_calls: out });
|
|
77
|
+
bundle.transcript({ at: this.now(), kind: "assistant_step", tool_calls: out });
|
|
78
|
+
|
|
79
|
+
for (const call of out) {
|
|
80
|
+
const result = await this.dispatch(call, executions);
|
|
81
|
+
calls.push({ name: call.name, refused: result.refused });
|
|
82
|
+
this.messages.push({ role: "tool", tool_call_id: call.id, name: call.name, content: JSON.stringify(result.content), ...(result.refused ? { is_error: true } : {}) });
|
|
83
|
+
bundle.transcript({ at: this.now(), kind: "tool_result", tool_call_id: call.id, name: call.name, refused: result.refused, content: result.content });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const text = "I stopped: too many tool steps in one turn. Nothing was paid beyond what the trail shows.";
|
|
88
|
+
this.messages.push({ role: "assistant", content: text });
|
|
89
|
+
bundle.transcript({ at: this.now(), kind: "assistant", text, truncated: true });
|
|
90
|
+
return { reply: text, tool_calls: calls, executions };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private async dispatch(call: ToolCall, executions: Execution[]): Promise<{ refused: boolean; content: unknown }> {
|
|
94
|
+
const { bundle, handlers, engine, onExecution } = this.options;
|
|
95
|
+
bundle.transcript({ at: this.now(), kind: "tool_call", tool_call_id: call.id, name: call.name, input: call.input });
|
|
96
|
+
|
|
97
|
+
if (!this.allowed.has(call.name)) {
|
|
98
|
+
// Section 15, closed tools: a tool outside tools.json is refused, and the refusal is in the trail.
|
|
99
|
+
bundle.event({ at: this.now(), type: "tool.refused", tool: call.name, reason: "tool_not_allowed", actor: engine.agentActor });
|
|
100
|
+
return { refused: true, content: { error: "tool_not_allowed", message: `${call.name} is not in this agent's tools.json` } };
|
|
101
|
+
}
|
|
102
|
+
const handler = handlers[call.name];
|
|
103
|
+
if (!handler) return { refused: true, content: { error: "tool_not_implemented", message: `${call.name} has no handler` } };
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const content = await handler(call.input, {
|
|
107
|
+
engine,
|
|
108
|
+
onExecution: async (execution) => {
|
|
109
|
+
const settledOrNot = await onExecution(execution);
|
|
110
|
+
executions.push(settledOrNot);
|
|
111
|
+
return settledOrNot;
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
return { refused: false, content };
|
|
115
|
+
} catch (err) {
|
|
116
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
117
|
+
bundle.event({ at: this.now(), type: "tool.error", tool: call.name, message, actor: engine.agentActor });
|
|
118
|
+
return { refused: true, content: { error: "tool_failed", message } };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private now(): string {
|
|
123
|
+
return this.clock().toISOString();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CodeSpar receivable rail: the merchant COLLECTS. `pay()` issues a
|
|
3
|
+
* cobranca com vencimento through `POST /v1/charges` (the REST form of the
|
|
4
|
+
* `codespar_charge` meta-tool, action=create): `method: "boleto"` plus a
|
|
5
|
+
* `due_date` is what makes it ONE receivable the payer settles either by
|
|
6
|
+
* boleto or by Pix; `idempotency_key` is REQUIRED on that create and is our
|
|
7
|
+
* attempt id, so a retry returns the same charge instead of a second
|
|
8
|
+
* receivable the same debtor could pay twice. An immediate Pix
|
|
9
|
+
* (`method: "pix"`) is deliberately not used: the API does not replay its
|
|
10
|
+
* create on a key and does not read it back, so it cannot close a loop.
|
|
11
|
+
*
|
|
12
|
+
* `lookup()` is `GET /v1/charges/{id}`, which accepts our idempotency key as
|
|
13
|
+
* the id; the kit polls it to close the cycle when no webhook can reach a
|
|
14
|
+
* terminal. Branching is on `local_status` and the normalized `status`, never
|
|
15
|
+
* on prose. Amounts cross the wire in MAJOR units (`amount: 1080.5`), which
|
|
16
|
+
* is what `coerceMetaChargeArgs` reads; the answer's `amount_minor` is
|
|
17
|
+
* compared with what was asked and a mismatch is a failure, not a charge.
|
|
18
|
+
*
|
|
19
|
+
* There is no receipt object for a receivable; the paid charge as the API
|
|
20
|
+
* reports it is what the bundle keeps, marked `kind: "charge"` and unsealed.
|
|
21
|
+
*/
|
|
22
|
+
import type { ApiClient } from "@codespar/sdk";
|
|
23
|
+
import type { PaymentRail, RailLookup, RailOutcome, RailPayment, RailReceipt } from "../rail.js";
|
|
24
|
+
import type { Actor, ChargeInstrument } from "../types.js";
|
|
25
|
+
import { describeApiError, isUncertain } from "./client.js";
|
|
26
|
+
|
|
27
|
+
/** The `/v1/charges` answer, as the SDK types it. */
|
|
28
|
+
export interface ChargeView {
|
|
29
|
+
id: string | null;
|
|
30
|
+
status: string;
|
|
31
|
+
local_status: string;
|
|
32
|
+
status_conflict: boolean;
|
|
33
|
+
method: string;
|
|
34
|
+
currency: string;
|
|
35
|
+
amount: number;
|
|
36
|
+
amount_minor: number;
|
|
37
|
+
due_date: string | null;
|
|
38
|
+
payable: boolean;
|
|
39
|
+
boleto_bar_code: string | null;
|
|
40
|
+
boleto_bank_line: string | null;
|
|
41
|
+
pix_copy_paste: string | null;
|
|
42
|
+
credit_correlation_armed: boolean;
|
|
43
|
+
payment_in_flight: boolean;
|
|
44
|
+
settlement: "confirmed" | "pending" | "unconfirmable" | null;
|
|
45
|
+
issuance_unconfirmed: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function instrumentOf(view: ChargeView): ChargeInstrument {
|
|
49
|
+
return {
|
|
50
|
+
payable: view.payable,
|
|
51
|
+
status: view.status,
|
|
52
|
+
pix_copy_paste: view.pix_copy_paste,
|
|
53
|
+
boleto_bank_line: view.boleto_bank_line,
|
|
54
|
+
boleto_bar_code: view.boleto_bar_code,
|
|
55
|
+
due_date: view.due_date,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** What a charge view means for the attempt. The row's own status wins over the issuer's normalized one where they name a terminal state. */
|
|
60
|
+
export function outcomeOf(view: ChargeView): RailOutcome | { status: "in_flight" } {
|
|
61
|
+
if (view.issuance_unconfirmed || !view.id) return { status: "in_flight" };
|
|
62
|
+
const id = view.id;
|
|
63
|
+
if (view.local_status === "settled" || view.status === "CONFIRMED" || view.settlement === "confirmed") {
|
|
64
|
+
return { status: "settled", transaction_id: id, receipt_id: id, money_moved: false, sandbox: true, raw: view };
|
|
65
|
+
}
|
|
66
|
+
if (view.local_status === "expired" || view.status === "EXPIRED") {
|
|
67
|
+
return { status: "failed", code: "charge_expired", message: `charge ${id} reached its due date unpaid`, raw: view };
|
|
68
|
+
}
|
|
69
|
+
if (view.status === "CANCELLED" || view.local_status === "cancelled") {
|
|
70
|
+
return { status: "failed", code: "charge_cancelled", message: `charge ${id} was withdrawn`, raw: view };
|
|
71
|
+
}
|
|
72
|
+
return { status: "accepted", transaction_id: id, instrument: instrumentOf(view), sandbox: true, raw: view };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class CodeSparChargeRail implements PaymentRail {
|
|
76
|
+
readonly name = "codespar-charge" as const;
|
|
77
|
+
|
|
78
|
+
constructor(private readonly api: ApiClient) {}
|
|
79
|
+
|
|
80
|
+
async pay(payment: RailPayment): Promise<RailOutcome> {
|
|
81
|
+
if (!payment.due_date) return { status: "failed", code: "due_date_required", message: "a receivable needs a due_date; the immediate Pix charge cannot be read back or replayed" };
|
|
82
|
+
if (!payment.consumer_id) return { status: "failed", code: "consumer_id_required", message: "a receivable settles into the principal's account; the policy names no consumer_id" };
|
|
83
|
+
let view: ChargeView;
|
|
84
|
+
try {
|
|
85
|
+
view = (await this.api.post("/v1/charges", {
|
|
86
|
+
body: {
|
|
87
|
+
consumer_id: payment.consumer_id,
|
|
88
|
+
amount: payment.amount_minor / 100,
|
|
89
|
+
currency: payment.currency,
|
|
90
|
+
method: "boleto",
|
|
91
|
+
description: payment.description ?? payment.purpose,
|
|
92
|
+
buyer: { name: payment.beneficiary ?? payment.payee, document: payment.payee },
|
|
93
|
+
due_date: payment.due_date,
|
|
94
|
+
idempotency_key: payment.attempt_id,
|
|
95
|
+
},
|
|
96
|
+
})) as ChargeView;
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const failure = describeApiError(err);
|
|
99
|
+
if (isUncertain(failure) || failure.code === "issuance_unconfirmed") return { status: "uncertain", code: failure.code, message: failure.message };
|
|
100
|
+
return { status: "failed", code: failure.code, message: failure.message };
|
|
101
|
+
}
|
|
102
|
+
if (view.issuance_unconfirmed || !view.id) return { status: "uncertain", code: "issuance_unconfirmed", message: "the issuer's answer to the create was lost; the key is reserved and a later read resolves it" };
|
|
103
|
+
if (view.amount_minor !== payment.amount_minor) {
|
|
104
|
+
// The API understood another amount than the one approved. The receivable exists; withdraw it rather than leave a debt nobody approved.
|
|
105
|
+
const withdrawn = await this.withdraw(view.id);
|
|
106
|
+
return { status: "failed", code: "amount_mismatch", message: `the API issued ${view.amount_minor} for a request of ${payment.amount_minor} (charge ${view.id}); ${withdrawn ? "withdrawn" : "withdrawal refused, an operator must cancel it"}` };
|
|
107
|
+
}
|
|
108
|
+
const outcome = outcomeOf(view);
|
|
109
|
+
// `in_flight` is excluded above (`issuance_unconfirmed` / no id); the create answers a state, never "still running".
|
|
110
|
+
return outcome.status === "in_flight" ? { status: "uncertain", code: "issuance_unconfirmed", message: "the create answered no readable state" } : outcome;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* By the charge id when the create handed one back; by our idempotency key only when it did not (the create's answer was lost).
|
|
115
|
+
* The route's doc says the read accepts the caller's key as the id; on staging (2026-09-23) it answered `charge_not_found` for
|
|
116
|
+
* the key and the charge for the id, so the id comes first and the key is the fallback, not the other way round.
|
|
117
|
+
*/
|
|
118
|
+
async lookup(attemptId: string, _payment: RailPayment, transactionId?: string): Promise<RailLookup> {
|
|
119
|
+
const byId = transactionId ? await this.read(transactionId) : { kind: "missing" as const };
|
|
120
|
+
if (byId.kind === "view") return outcomeOf(byId.view);
|
|
121
|
+
if (byId.kind === "in_flight") return { status: "in_flight" };
|
|
122
|
+
if (byId.kind === "uncertain") return byId.outcome;
|
|
123
|
+
const byKey = await this.read(attemptId);
|
|
124
|
+
if (byKey.kind === "view") return outcomeOf(byKey.view);
|
|
125
|
+
if (byKey.kind === "in_flight") return { status: "in_flight" };
|
|
126
|
+
if (byKey.kind === "uncertain") return byKey.outcome;
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private async read(chargeRef: string): Promise<{ kind: "view"; view: ChargeView } | { kind: "missing" } | { kind: "in_flight" } | { kind: "uncertain"; outcome: Extract<RailOutcome, { status: "uncertain" }> }> {
|
|
131
|
+
try {
|
|
132
|
+
const view = (await this.api.get("/v1/charges/{chargeId}", { path: { chargeId: chargeRef } })) as ChargeView;
|
|
133
|
+
return { kind: "view", view };
|
|
134
|
+
} catch (err) {
|
|
135
|
+
const failure = describeApiError(err);
|
|
136
|
+
if (failure.status === 404) return { kind: "missing" };
|
|
137
|
+
if (failure.status === 409) return { kind: "in_flight" };
|
|
138
|
+
return { kind: "uncertain", outcome: { status: "uncertain", code: failure.code, message: failure.message } };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async receipt(chargeId: string, actor: Actor): Promise<RailReceipt | undefined> {
|
|
143
|
+
try {
|
|
144
|
+
const view = (await this.api.get("/v1/charges/{chargeId}", { path: { chargeId } })) as ChargeView;
|
|
145
|
+
const raw = view as ChargeView & { settled_at?: string };
|
|
146
|
+
return {
|
|
147
|
+
receipt_id: chargeId,
|
|
148
|
+
kind: "charge",
|
|
149
|
+
state: view.local_status === "settled" ? "paid" : view.local_status,
|
|
150
|
+
mandate: { id: "n/a" },
|
|
151
|
+
// The read names no buyer, so the payee is not on this record; the execution's item names the debtor.
|
|
152
|
+
payment: { amount_minor: view.amount_minor, payee: null, attempt_id: chargeId, money_moved: false, sandbox: true, at: raw.settled_at ?? new Date().toISOString() },
|
|
153
|
+
chain: null,
|
|
154
|
+
receipt_sig: null,
|
|
155
|
+
receipt_sig_ed25519: null,
|
|
156
|
+
receipt_sig_kid: null,
|
|
157
|
+
actor,
|
|
158
|
+
raw: view,
|
|
159
|
+
};
|
|
160
|
+
} catch (err) {
|
|
161
|
+
const failure = describeApiError(err);
|
|
162
|
+
if (failure.status === 404) return undefined;
|
|
163
|
+
throw err;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private async withdraw(chargeId: string): Promise<boolean> {
|
|
168
|
+
try {
|
|
169
|
+
await this.api.post("/v1/charges/{chargeId}/cancel", { path: { chargeId } });
|
|
170
|
+
return true;
|
|
171
|
+
} catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|