@paybond/kit 0.10.0 → 0.11.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 (335) hide show
  1. package/completion-presets/catalog.json +1187 -0
  2. package/completion-presets/catalog.sha256 +1 -0
  3. package/dev/trace-ui/dashboard.html +617 -0
  4. package/dist/agent/adapter.d.ts +51 -0
  5. package/dist/agent/adapter.js +66 -0
  6. package/dist/agent/attach-bundle.d.ts +37 -0
  7. package/dist/agent/attach-bundle.js +118 -0
  8. package/dist/agent/authorization-cache.d.ts +22 -0
  9. package/dist/agent/authorization-cache.js +36 -0
  10. package/dist/agent/deferred-tools.d.ts +11 -0
  11. package/dist/agent/deferred-tools.js +62 -0
  12. package/dist/agent/discover.d.ts +41 -0
  13. package/dist/agent/discover.js +147 -0
  14. package/dist/agent/evidence.d.ts +9 -0
  15. package/dist/agent/evidence.js +28 -0
  16. package/dist/agent/facade.d.ts +48 -0
  17. package/dist/agent/facade.js +112 -0
  18. package/dist/agent/gateway-trace-reporter.d.ts +28 -0
  19. package/dist/agent/gateway-trace-reporter.js +49 -0
  20. package/dist/agent/generic-runner.d.ts +14 -0
  21. package/dist/agent/generic-runner.js +49 -0
  22. package/dist/agent/generic-sandbox-demo.d.ts +36 -0
  23. package/dist/agent/generic-sandbox-demo.js +82 -0
  24. package/dist/agent/guarded-agent.d.ts +49 -0
  25. package/dist/agent/guarded-agent.js +100 -0
  26. package/dist/agent/index.d.ts +13 -0
  27. package/dist/agent/index.js +13 -0
  28. package/dist/agent/instrument.d.ts +156 -0
  29. package/dist/agent/instrument.js +442 -0
  30. package/dist/agent/interceptor.d.ts +24 -0
  31. package/dist/agent/interceptor.js +440 -0
  32. package/dist/agent/lazy-context-tools.d.ts +15 -0
  33. package/dist/agent/lazy-context-tools.js +81 -0
  34. package/dist/agent/registry-file.d.ts +39 -0
  35. package/dist/agent/registry-file.js +219 -0
  36. package/dist/agent/registry.d.ts +37 -0
  37. package/dist/agent/registry.js +128 -0
  38. package/dist/agent/run.d.ts +124 -0
  39. package/dist/agent/run.js +301 -0
  40. package/dist/agent/types.d.ts +318 -0
  41. package/dist/agent/types.js +42 -0
  42. package/dist/agent-recognition.d.ts +72 -0
  43. package/dist/agent-recognition.js +165 -0
  44. package/dist/bincode-wire.d.ts +18 -0
  45. package/dist/bincode-wire.js +93 -0
  46. package/dist/claude-agents/config.d.ts +21 -0
  47. package/dist/claude-agents/config.js +145 -0
  48. package/dist/claude-agents/index.d.ts +2 -0
  49. package/dist/claude-agents/index.js +2 -0
  50. package/dist/claude-agents/sandbox-demo.d.ts +30 -0
  51. package/dist/claude-agents/sandbox-demo.js +91 -0
  52. package/dist/cli/agent/env-quote.d.ts +1 -0
  53. package/dist/cli/agent/env-quote.js +6 -0
  54. package/dist/cli/agent/env-write.d.ts +8 -0
  55. package/dist/cli/agent/env-write.js +47 -0
  56. package/dist/cli/agent/paybond.d.ts +16 -0
  57. package/dist/cli/agent/paybond.js +55 -0
  58. package/dist/cli/agent/policy-file.d.ts +29 -0
  59. package/dist/cli/agent/policy-file.js +61 -0
  60. package/dist/cli/agent/production-evidence.d.ts +24 -0
  61. package/dist/cli/agent/production-evidence.js +98 -0
  62. package/dist/cli/agent/run-store.d.ts +30 -0
  63. package/dist/cli/agent/run-store.js +42 -0
  64. package/dist/cli/agent/run-trace-store.d.ts +39 -0
  65. package/dist/cli/agent/run-trace-store.js +143 -0
  66. package/dist/cli/agent-run-trace-table.d.ts +9 -0
  67. package/dist/cli/agent-run-trace-table.js +24 -0
  68. package/dist/cli/agent-sandbox-smoke-checklist.d.ts +9 -0
  69. package/dist/cli/agent-sandbox-smoke-checklist.js +50 -0
  70. package/dist/cli/command-spec.d.ts +1 -0
  71. package/dist/cli/command-spec.js +286 -5
  72. package/dist/cli/commands/agent.d.ts +16 -0
  73. package/dist/cli/commands/agent.js +1135 -0
  74. package/dist/cli/commands/dev.d.ts +7 -0
  75. package/dist/cli/commands/dev.js +348 -0
  76. package/dist/cli/commands/discovery.js +3 -3
  77. package/dist/cli/commands/policy.d.ts +13 -0
  78. package/dist/cli/commands/policy.js +769 -0
  79. package/dist/cli/commands/setup.d.ts +3 -0
  80. package/dist/cli/commands/setup.js +124 -8
  81. package/dist/cli/commands/workflows.js +9 -4
  82. package/dist/cli/config.d.ts +2 -0
  83. package/dist/cli/config.js +4 -2
  84. package/dist/cli/context.js +2 -1
  85. package/dist/cli/credentials.js +2 -2
  86. package/dist/cli/doctor-agent-middleware.d.ts +5 -0
  87. package/dist/cli/doctor-agent-middleware.js +49 -0
  88. package/dist/cli/globals.d.ts +1 -0
  89. package/dist/cli/globals.js +11 -1
  90. package/dist/cli/help.d.ts +1 -1
  91. package/dist/cli/help.js +35 -3
  92. package/dist/cli/mcp-install.js +2 -2
  93. package/dist/cli/mcp-policy.d.ts +3 -0
  94. package/dist/cli/mcp-policy.js +19 -13
  95. package/dist/cli/mcp-verify-config.js +9 -11
  96. package/dist/cli/redact.js +29 -8
  97. package/dist/cli/router.js +105 -2
  98. package/dist/cli/smoke-deep-links.d.ts +15 -0
  99. package/dist/cli/smoke-deep-links.js +63 -0
  100. package/dist/cli/telemetry.d.ts +17 -0
  101. package/dist/cli/telemetry.js +94 -0
  102. package/dist/completion-catalog-digest.d.ts +2 -0
  103. package/dist/completion-catalog-digest.js +2 -0
  104. package/dist/completion-catalog-integrity.d.ts +2 -0
  105. package/dist/completion-catalog-integrity.js +17 -0
  106. package/dist/completion-catalog.d.ts +49 -0
  107. package/dist/completion-catalog.js +62 -0
  108. package/dist/completion-contract-digest.d.ts +37 -0
  109. package/dist/completion-contract-digest.js +73 -0
  110. package/dist/completion-forbidden-fields.d.ts +5 -0
  111. package/dist/completion-forbidden-fields.js +26 -0
  112. package/dist/completion-init.d.ts +8 -0
  113. package/dist/completion-init.js +334 -0
  114. package/dist/completion-resolve.d.ts +21 -0
  115. package/dist/completion-resolve.js +86 -0
  116. package/dist/completion-validate-evidence.d.ts +24 -0
  117. package/dist/completion-validate-evidence.js +145 -0
  118. package/dist/dev/offline-gateway.d.ts +24 -0
  119. package/dist/dev/offline-gateway.js +102 -0
  120. package/dist/dev/trace-buffer.d.ts +61 -0
  121. package/dist/dev/trace-buffer.js +330 -0
  122. package/dist/dev/trace-security-headers.d.ts +11 -0
  123. package/dist/dev/trace-security-headers.js +16 -0
  124. package/dist/dev/trace-server.d.ts +8 -0
  125. package/dist/dev/trace-server.js +38 -0
  126. package/dist/dev/trace-ui.d.ts +4 -0
  127. package/dist/dev/trace-ui.js +25 -0
  128. package/dist/dev/wiremock-up.d.ts +15 -0
  129. package/dist/dev/wiremock-up.js +118 -0
  130. package/dist/doctor-completion.d.ts +17 -0
  131. package/dist/doctor-completion.js +428 -0
  132. package/dist/gateway-url.d.ts +7 -0
  133. package/dist/gateway-url.js +69 -0
  134. package/dist/index.d.ts +119 -2
  135. package/dist/index.js +267 -6
  136. package/dist/init.js +374 -57
  137. package/dist/langgraph/awrap-tool-call.d.ts +25 -0
  138. package/dist/langgraph/awrap-tool-call.js +81 -0
  139. package/dist/langgraph/config.d.ts +13 -0
  140. package/dist/langgraph/config.js +11 -0
  141. package/dist/langgraph/index.d.ts +4 -0
  142. package/dist/langgraph/index.js +4 -0
  143. package/dist/langgraph/sandbox-demo.d.ts +40 -0
  144. package/dist/langgraph/sandbox-demo.js +96 -0
  145. package/dist/langgraph/tool-node.d.ts +10 -0
  146. package/dist/langgraph/tool-node.js +38 -0
  147. package/dist/login.js +7 -0
  148. package/dist/mcp/index.d.ts +1 -0
  149. package/dist/mcp/index.js +1 -0
  150. package/dist/mcp/tool-surface.d.ts +25 -0
  151. package/dist/mcp/tool-surface.js +17 -0
  152. package/dist/mcp-capability-token-cache.d.ts +24 -0
  153. package/dist/mcp-capability-token-cache.js +101 -0
  154. package/dist/mcp-evidence-policy.d.ts +48 -0
  155. package/dist/mcp-evidence-policy.js +117 -0
  156. package/dist/mcp-policy-reload.d.ts +79 -0
  157. package/dist/mcp-policy-reload.js +200 -0
  158. package/dist/mcp-sep2828-evidence.d.ts +36 -0
  159. package/dist/mcp-sep2828-evidence.js +65 -0
  160. package/dist/mcp-server.d.ts +6 -0
  161. package/dist/mcp-server.js +224 -44
  162. package/dist/openai-agents/index.d.ts +40 -0
  163. package/dist/openai-agents/index.js +151 -0
  164. package/dist/openai-agents/sandbox-demo.d.ts +34 -0
  165. package/dist/openai-agents/sandbox-demo.js +118 -0
  166. package/dist/payee-evidence.js +2 -29
  167. package/dist/policy/catalog.d.ts +31 -0
  168. package/dist/policy/catalog.js +48 -0
  169. package/dist/policy/compose-utils.d.ts +3 -0
  170. package/dist/policy/compose-utils.js +4 -0
  171. package/dist/policy/compose.d.ts +20 -0
  172. package/dist/policy/compose.js +240 -0
  173. package/dist/policy/digest.d.ts +7 -0
  174. package/dist/policy/digest.js +75 -0
  175. package/dist/policy/domain.d.ts +15 -0
  176. package/dist/policy/domain.js +28 -0
  177. package/dist/policy/guardrail-spec.d.ts +17 -0
  178. package/dist/policy/guardrail-spec.js +140 -0
  179. package/dist/policy/guardrails.d.ts +48 -0
  180. package/dist/policy/guardrails.js +72 -0
  181. package/dist/policy/index.d.ts +21 -0
  182. package/dist/policy/index.js +21 -0
  183. package/dist/policy/init.d.ts +102 -0
  184. package/dist/policy/init.js +351 -0
  185. package/dist/policy/intent-spec.d.ts +52 -0
  186. package/dist/policy/intent-spec.js +176 -0
  187. package/dist/policy/json-path.d.ts +4 -0
  188. package/dist/policy/json-path.js +23 -0
  189. package/dist/policy/layers-io.d.ts +7 -0
  190. package/dist/policy/layers-io.js +28 -0
  191. package/dist/policy/load-effective.d.ts +22 -0
  192. package/dist/policy/load-effective.js +77 -0
  193. package/dist/policy/load.d.ts +85 -0
  194. package/dist/policy/load.js +164 -0
  195. package/dist/policy/merge.d.ts +29 -0
  196. package/dist/policy/merge.js +297 -0
  197. package/dist/policy/parse-text.d.ts +2 -0
  198. package/dist/policy/parse-text.js +126 -0
  199. package/dist/policy/policy-api.d.ts +45 -0
  200. package/dist/policy/policy-api.js +61 -0
  201. package/dist/policy/presets.d.ts +19 -0
  202. package/dist/policy/presets.js +66 -0
  203. package/dist/policy/registry.d.ts +7 -0
  204. package/dist/policy/registry.js +33 -0
  205. package/dist/policy/reload.d.ts +86 -0
  206. package/dist/policy/reload.js +233 -0
  207. package/dist/policy/render-yaml.d.ts +3 -0
  208. package/dist/policy/render-yaml.js +69 -0
  209. package/dist/policy/sandbox-bootstrap.d.ts +19 -0
  210. package/dist/policy/sandbox-bootstrap.js +66 -0
  211. package/dist/policy/schema.d.ts +204 -0
  212. package/dist/policy/schema.js +255 -0
  213. package/dist/policy/snapshot.d.ts +33 -0
  214. package/dist/policy/snapshot.js +23 -0
  215. package/dist/policy/validate-remote.d.ts +43 -0
  216. package/dist/policy/validate-remote.js +104 -0
  217. package/dist/policy/validate.d.ts +36 -0
  218. package/dist/policy/validate.js +150 -0
  219. package/dist/policy/watcher.d.ts +29 -0
  220. package/dist/policy/watcher.js +112 -0
  221. package/dist/principal-intent.d.ts +52 -0
  222. package/dist/principal-intent.js +193 -37
  223. package/dist/project-init.d.ts +34 -0
  224. package/dist/project-init.js +898 -0
  225. package/dist/sep2828-signature.d.ts +10 -0
  226. package/dist/sep2828-signature.js +134 -0
  227. package/dist/solutions/api.d.ts +22 -0
  228. package/dist/solutions/api.js +40 -0
  229. package/dist/solutions/catalog.d.ts +34 -0
  230. package/dist/solutions/catalog.js +129 -0
  231. package/dist/solutions/index.d.ts +2 -0
  232. package/dist/solutions/index.js +2 -0
  233. package/dist/template-init.d.ts +54 -0
  234. package/dist/template-init.js +203 -0
  235. package/dist/vercel-ai/config.d.ts +15 -0
  236. package/dist/vercel-ai/config.js +13 -0
  237. package/dist/vercel-ai/index.d.ts +4 -0
  238. package/dist/vercel-ai/index.js +4 -0
  239. package/dist/vercel-ai/sandbox-demo.d.ts +44 -0
  240. package/dist/vercel-ai/sandbox-demo.js +153 -0
  241. package/dist/vercel-ai/tool-approval.d.ts +16 -0
  242. package/dist/vercel-ai/tool-approval.js +41 -0
  243. package/dist/vercel-ai/wrap-tools.d.ts +9 -0
  244. package/dist/vercel-ai/wrap-tools.js +40 -0
  245. package/dist/x402-receipt-evidence.d.ts +29 -0
  246. package/dist/x402-receipt-evidence.js +97 -0
  247. package/dist/x402-receipt-signature.d.ts +12 -0
  248. package/dist/x402-receipt-signature.js +211 -0
  249. package/package.json +75 -3
  250. package/solutions/aws.json +17 -0
  251. package/solutions/saas.json +17 -0
  252. package/solutions/shopping.json +17 -0
  253. package/solutions/travel.json +18 -0
  254. package/templates/manifest.json +169 -0
  255. package/templates/openai-shopping-agent/.env.example +3 -0
  256. package/templates/openai-shopping-agent/.github/workflows/smoke.yml +20 -0
  257. package/templates/openai-shopping-agent/LICENSE +201 -0
  258. package/templates/openai-shopping-agent/README.md +29 -0
  259. package/templates/openai-shopping-agent/package.json +22 -0
  260. package/templates/openai-shopping-agent/paybond.policy.yaml +22 -0
  261. package/templates/openai-shopping-agent/src/index.ts +22 -0
  262. package/templates/openai-shopping-agent/src/paybond.config.ts +51 -0
  263. package/templates/openai-shopping-agent/tsconfig.json +13 -0
  264. package/templates/paybond-aws-operator/.env.example +3 -0
  265. package/templates/paybond-aws-operator/.github/workflows/smoke.yml +20 -0
  266. package/templates/paybond-aws-operator/LICENSE +201 -0
  267. package/templates/paybond-aws-operator/README.md +29 -0
  268. package/templates/paybond-aws-operator/package.json +20 -0
  269. package/templates/paybond-aws-operator/paybond.policy.yaml +22 -0
  270. package/templates/paybond-aws-operator/src/index.ts +54 -0
  271. package/templates/paybond-aws-operator/src/paybond.config.ts +51 -0
  272. package/templates/paybond-aws-operator/tsconfig.json +13 -0
  273. package/templates/paybond-claude-agents-demo/.env.example +3 -0
  274. package/templates/paybond-claude-agents-demo/.github/workflows/smoke.yml +20 -0
  275. package/templates/paybond-claude-agents-demo/LICENSE +201 -0
  276. package/templates/paybond-claude-agents-demo/README.md +29 -0
  277. package/templates/paybond-claude-agents-demo/package.json +22 -0
  278. package/templates/paybond-claude-agents-demo/paybond.policy.yaml +22 -0
  279. package/templates/paybond-claude-agents-demo/src/index.ts +22 -0
  280. package/templates/paybond-claude-agents-demo/src/paybond.config.ts +51 -0
  281. package/templates/paybond-claude-agents-demo/tsconfig.json +13 -0
  282. package/templates/paybond-invoice-agent/.env.example +3 -0
  283. package/templates/paybond-invoice-agent/.github/workflows/smoke.yml +19 -0
  284. package/templates/paybond-invoice-agent/LICENSE +201 -0
  285. package/templates/paybond-invoice-agent/README.md +29 -0
  286. package/templates/paybond-invoice-agent/app.py +27 -0
  287. package/templates/paybond-invoice-agent/package.json +6 -0
  288. package/templates/paybond-invoice-agent/paybond.policy.yaml +22 -0
  289. package/templates/paybond-invoice-agent/paybond_config.py +45 -0
  290. package/templates/paybond-invoice-agent/requirements.txt +2 -0
  291. package/templates/paybond-mcp-coding-agent/.env.example +3 -0
  292. package/templates/paybond-mcp-coding-agent/.github/workflows/smoke.yml +20 -0
  293. package/templates/paybond-mcp-coding-agent/LICENSE +201 -0
  294. package/templates/paybond-mcp-coding-agent/README.md +39 -0
  295. package/templates/paybond-mcp-coding-agent/package.json +20 -0
  296. package/templates/paybond-mcp-coding-agent/paybond.policy.yaml +25 -0
  297. package/templates/paybond-mcp-coding-agent/src/index.ts +40 -0
  298. package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +51 -0
  299. package/templates/paybond-mcp-coding-agent/tsconfig.json +13 -0
  300. package/templates/paybond-openai-agents-demo/.env.example +3 -0
  301. package/templates/paybond-openai-agents-demo/.github/workflows/smoke.yml +20 -0
  302. package/templates/paybond-openai-agents-demo/LICENSE +201 -0
  303. package/templates/paybond-openai-agents-demo/README.md +29 -0
  304. package/templates/paybond-openai-agents-demo/package.json +22 -0
  305. package/templates/paybond-openai-agents-demo/paybond.policy.yaml +22 -0
  306. package/templates/paybond-openai-agents-demo/src/index.ts +22 -0
  307. package/templates/paybond-openai-agents-demo/src/paybond.config.ts +51 -0
  308. package/templates/paybond-openai-agents-demo/tsconfig.json +13 -0
  309. package/templates/paybond-procurement-agent/.env.example +3 -0
  310. package/templates/paybond-procurement-agent/.github/workflows/smoke.yml +20 -0
  311. package/templates/paybond-procurement-agent/LICENSE +201 -0
  312. package/templates/paybond-procurement-agent/README.md +29 -0
  313. package/templates/paybond-procurement-agent/package.json +20 -0
  314. package/templates/paybond-procurement-agent/paybond.policy.yaml +25 -0
  315. package/templates/paybond-procurement-agent/src/index.ts +54 -0
  316. package/templates/paybond-procurement-agent/src/paybond.config.ts +51 -0
  317. package/templates/paybond-procurement-agent/tsconfig.json +13 -0
  318. package/templates/paybond-travel-agent/.env.example +3 -0
  319. package/templates/paybond-travel-agent/.github/workflows/smoke.yml +20 -0
  320. package/templates/paybond-travel-agent/LICENSE +201 -0
  321. package/templates/paybond-travel-agent/README.md +29 -0
  322. package/templates/paybond-travel-agent/package.json +23 -0
  323. package/templates/paybond-travel-agent/paybond.policy.yaml +22 -0
  324. package/templates/paybond-travel-agent/src/index.ts +22 -0
  325. package/templates/paybond-travel-agent/src/paybond.config.ts +51 -0
  326. package/templates/paybond-travel-agent/tsconfig.json +13 -0
  327. package/templates/paybond-vercel-shopping-agent/.env.example +3 -0
  328. package/templates/paybond-vercel-shopping-agent/.github/workflows/smoke.yml +20 -0
  329. package/templates/paybond-vercel-shopping-agent/LICENSE +201 -0
  330. package/templates/paybond-vercel-shopping-agent/README.md +29 -0
  331. package/templates/paybond-vercel-shopping-agent/package.json +22 -0
  332. package/templates/paybond-vercel-shopping-agent/paybond.policy.yaml +22 -0
  333. package/templates/paybond-vercel-shopping-agent/src/index.ts +22 -0
  334. package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +51 -0
  335. package/templates/paybond-vercel-shopping-agent/tsconfig.json +13 -0
@@ -0,0 +1 @@
1
+ 6b3fc4f2c568bd9de61e96c18b345c815a4ffea73fc1212f2e6fe601817a8483
@@ -0,0 +1,617 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Paybond dev trace</title>
7
+ <style>
8
+ :root {
9
+ --bg: #0b1020;
10
+ --surface: #141b31;
11
+ --surface-elevated: #1a2340;
12
+ --border: #24304f;
13
+ --text: #e8edf8;
14
+ --muted: #9aa8c7;
15
+ --accent: #6b7cff;
16
+ --phase-agent: #6b7cff;
17
+ --phase-tool: #4ecdc4;
18
+ --phase-authorize: #ffd166;
19
+ --phase-evidence: #9b5de5;
20
+ --phase-result: #06d6a0;
21
+ --warn-bg: #2a1f12;
22
+ --warn-border: #7a4a12;
23
+ --warn-text: #ffd9a8;
24
+ --info-bg: #142033;
25
+ --info-border: #2c4f7a;
26
+ --info-text: #b8d7ff;
27
+ }
28
+
29
+ * { box-sizing: border-box; }
30
+
31
+ body {
32
+ margin: 0;
33
+ font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;
34
+ background: var(--bg);
35
+ color: var(--text);
36
+ min-height: 100vh;
37
+ }
38
+
39
+ code {
40
+ color: #9fd0ff;
41
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
42
+ font-size: 0.9em;
43
+ }
44
+
45
+ .page {
46
+ max-width: 1120px;
47
+ margin: 0 auto;
48
+ padding: 1.5rem;
49
+ }
50
+
51
+ .header {
52
+ display: flex;
53
+ flex-wrap: wrap;
54
+ align-items: flex-start;
55
+ justify-content: space-between;
56
+ gap: 1rem;
57
+ margin-bottom: 1.25rem;
58
+ }
59
+
60
+ .header h1 {
61
+ margin: 0 0 0.35rem;
62
+ font-size: 1.5rem;
63
+ letter-spacing: -0.02em;
64
+ }
65
+
66
+ .subtitle {
67
+ margin: 0;
68
+ color: var(--muted);
69
+ font-size: 0.95rem;
70
+ line-height: 1.5;
71
+ }
72
+
73
+ .status-pill {
74
+ display: inline-flex;
75
+ align-items: center;
76
+ gap: 0.45rem;
77
+ padding: 0.35rem 0.75rem;
78
+ border-radius: 999px;
79
+ border: 1px solid var(--border);
80
+ background: var(--surface);
81
+ color: var(--muted);
82
+ font-size: 0.82rem;
83
+ white-space: nowrap;
84
+ }
85
+
86
+ .status-pill .dot {
87
+ width: 0.55rem;
88
+ height: 0.55rem;
89
+ border-radius: 50%;
90
+ background: var(--phase-result);
91
+ box-shadow: 0 0 0 3px rgba(6, 214, 160, 0.2);
92
+ animation: pulse 2s ease-in-out infinite;
93
+ }
94
+
95
+ @keyframes pulse {
96
+ 0%, 100% { opacity: 1; }
97
+ 50% { opacity: 0.45; }
98
+ }
99
+
100
+ .banner {
101
+ border-radius: 12px;
102
+ padding: 1rem 1.25rem;
103
+ margin-bottom: 1rem;
104
+ line-height: 1.5;
105
+ }
106
+
107
+ .banner-warn {
108
+ background: var(--warn-bg);
109
+ border: 1px solid var(--warn-border);
110
+ color: var(--warn-text);
111
+ }
112
+
113
+ .banner-info {
114
+ background: var(--info-bg);
115
+ border: 1px solid var(--info-border);
116
+ color: var(--info-text);
117
+ }
118
+
119
+ .dashboard {
120
+ display: grid;
121
+ grid-template-columns: minmax(220px, 260px) minmax(0, 1fr);
122
+ gap: 1rem;
123
+ align-items: start;
124
+ }
125
+
126
+ @media (max-width: 820px) {
127
+ .dashboard { grid-template-columns: 1fr; }
128
+ }
129
+
130
+ .panel {
131
+ background: var(--surface);
132
+ border: 1px solid var(--border);
133
+ border-radius: 14px;
134
+ overflow: hidden;
135
+ }
136
+
137
+ .panel-header {
138
+ padding: 0.85rem 1rem;
139
+ border-bottom: 1px solid var(--border);
140
+ font-size: 0.78rem;
141
+ font-weight: 700;
142
+ letter-spacing: 0.08em;
143
+ text-transform: uppercase;
144
+ color: var(--muted);
145
+ }
146
+
147
+ .run-list {
148
+ list-style: none;
149
+ margin: 0;
150
+ padding: 0.5rem;
151
+ max-height: 70vh;
152
+ overflow: auto;
153
+ }
154
+
155
+ .run-item {
156
+ display: block;
157
+ width: 100%;
158
+ text-align: left;
159
+ border: 1px solid transparent;
160
+ background: transparent;
161
+ color: inherit;
162
+ border-radius: 10px;
163
+ padding: 0.75rem 0.85rem;
164
+ cursor: pointer;
165
+ transition: border-color 0.15s, background 0.15s;
166
+ }
167
+
168
+ .run-item:hover {
169
+ border-color: var(--border);
170
+ background: var(--surface-elevated);
171
+ }
172
+
173
+ .run-item.active {
174
+ border-color: rgba(107, 124, 255, 0.55);
175
+ background: rgba(107, 124, 255, 0.12);
176
+ }
177
+
178
+ .run-item-title {
179
+ display: block;
180
+ font-weight: 600;
181
+ font-size: 0.92rem;
182
+ margin-bottom: 0.2rem;
183
+ }
184
+
185
+ .run-item-meta {
186
+ display: block;
187
+ color: var(--muted);
188
+ font-size: 0.78rem;
189
+ }
190
+
191
+ .trace-panel {
192
+ padding: 1rem 1.1rem 1.25rem;
193
+ }
194
+
195
+ .run-heading h2 {
196
+ margin: 0 0 0.35rem;
197
+ font-size: 1.15rem;
198
+ }
199
+
200
+ .run-meta {
201
+ margin: 0 0 1rem;
202
+ color: var(--muted);
203
+ font-size: 0.88rem;
204
+ }
205
+
206
+ .run-badges {
207
+ display: flex;
208
+ flex-wrap: wrap;
209
+ gap: 0.45rem;
210
+ margin-bottom: 1rem;
211
+ }
212
+
213
+ .badge {
214
+ display: inline-flex;
215
+ align-items: center;
216
+ gap: 0.35rem;
217
+ padding: 0.2rem 0.55rem;
218
+ border-radius: 999px;
219
+ border: 1px solid var(--border);
220
+ font-size: 0.75rem;
221
+ color: var(--muted);
222
+ }
223
+
224
+ .badge.ok { border-color: rgba(6, 214, 160, 0.45); color: #9ef5d8; }
225
+ .badge.warn { border-color: rgba(255, 209, 102, 0.45); color: #ffe3a1; }
226
+
227
+ .empty-state {
228
+ color: var(--muted);
229
+ line-height: 1.6;
230
+ padding: 1rem 0.25rem;
231
+ }
232
+
233
+ .v-timeline {
234
+ position: relative;
235
+ margin: 0;
236
+ padding: 0.25rem 0 0 0.25rem;
237
+ list-style: none;
238
+ }
239
+
240
+ .v-timeline::before {
241
+ content: "";
242
+ position: absolute;
243
+ left: 0.72rem;
244
+ top: 0.75rem;
245
+ bottom: 0.75rem;
246
+ width: 2px;
247
+ background: linear-gradient(
248
+ 180deg,
249
+ var(--phase-agent) 0%,
250
+ var(--phase-tool) 22%,
251
+ var(--phase-authorize) 44%,
252
+ var(--phase-evidence) 66%,
253
+ var(--phase-result) 100%
254
+ );
255
+ opacity: 0.55;
256
+ }
257
+
258
+ .v-timeline-step {
259
+ position: relative;
260
+ display: grid;
261
+ grid-template-columns: 1.5rem minmax(0, 1fr);
262
+ gap: 0.85rem;
263
+ padding: 0 0 1.35rem 0;
264
+ }
265
+
266
+ .v-timeline-step:last-child { padding-bottom: 0.25rem; }
267
+
268
+ .v-timeline-rail {
269
+ position: relative;
270
+ display: flex;
271
+ justify-content: center;
272
+ padding-top: 0.2rem;
273
+ }
274
+
275
+ .v-timeline-dot {
276
+ width: 0.95rem;
277
+ height: 0.95rem;
278
+ border-radius: 50%;
279
+ border: 2px solid var(--phase-color, var(--border));
280
+ background: var(--bg);
281
+ box-shadow: 0 0 0 4px rgba(11, 16, 32, 0.9);
282
+ z-index: 1;
283
+ }
284
+
285
+ .v-timeline-body {
286
+ background: var(--surface-elevated);
287
+ border: 1px solid var(--border);
288
+ border-radius: 12px;
289
+ padding: 0.8rem 0.9rem;
290
+ }
291
+
292
+ .v-timeline-top {
293
+ display: flex;
294
+ flex-wrap: wrap;
295
+ align-items: center;
296
+ gap: 0.5rem;
297
+ margin-bottom: 0.35rem;
298
+ }
299
+
300
+ .phase-badge {
301
+ display: inline-flex;
302
+ align-items: center;
303
+ padding: 0.12rem 0.5rem;
304
+ border-radius: 999px;
305
+ font-size: 0.7rem;
306
+ font-weight: 700;
307
+ letter-spacing: 0.06em;
308
+ text-transform: uppercase;
309
+ color: #0b1020;
310
+ background: var(--phase-color, var(--muted));
311
+ }
312
+
313
+ .step-time {
314
+ margin-left: auto;
315
+ color: var(--muted);
316
+ font-size: 0.76rem;
317
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
318
+ }
319
+
320
+ .step-label {
321
+ margin: 0;
322
+ font-size: 0.95rem;
323
+ line-height: 1.45;
324
+ }
325
+
326
+ .step-detail {
327
+ margin-top: 0.55rem;
328
+ }
329
+
330
+ .step-detail summary {
331
+ cursor: pointer;
332
+ color: var(--muted);
333
+ font-size: 0.8rem;
334
+ }
335
+
336
+ .step-detail pre {
337
+ margin: 0.5rem 0 0;
338
+ overflow: auto;
339
+ background: #0f1528;
340
+ border-radius: 8px;
341
+ padding: 0.65rem;
342
+ font-size: 0.75rem;
343
+ color: #c6d4ef;
344
+ }
345
+
346
+ .raw-json {
347
+ margin-top: 1rem;
348
+ }
349
+
350
+ .raw-json summary {
351
+ cursor: pointer;
352
+ color: var(--muted);
353
+ font-size: 0.82rem;
354
+ margin-bottom: 0.5rem;
355
+ }
356
+
357
+ .raw-json pre {
358
+ overflow: auto;
359
+ background: #0f1528;
360
+ padding: 0.75rem;
361
+ border-radius: 8px;
362
+ font-size: 0.75rem;
363
+ color: #c6d4ef;
364
+ }
365
+ </style>
366
+ </head>
367
+ <body>
368
+ <div class="page">
369
+ <header class="header">
370
+ <div>
371
+ <h1>Paybond dev trace</h1>
372
+ <p class="subtitle">Model → tool → authorize → evidence → settlement. Local dashboard for <code>paybond dev smoke</code> and middleware runs.</p>
373
+ </div>
374
+ <div class="status-pill" id="status-pill" aria-live="polite">
375
+ <span class="dot" aria-hidden="true"></span>
376
+ <span id="status-text">Connecting…</span>
377
+ </div>
378
+ </header>
379
+
380
+ <div id="banner-root"></div>
381
+
382
+ <div class="dashboard">
383
+ <aside class="panel" aria-label="Recent runs">
384
+ <div class="panel-header">Recent runs</div>
385
+ <ul class="run-list" id="run-list"></ul>
386
+ </aside>
387
+
388
+ <section class="panel trace-panel" aria-label="Run timeline">
389
+ <div id="trace-root">
390
+ <p class="empty-state">Loading trace events…</p>
391
+ </div>
392
+ </section>
393
+ </div>
394
+ </div>
395
+
396
+ <script>
397
+ const PHASE_LABELS = {
398
+ agent: "Tool call",
399
+ tool: "Tool",
400
+ authorize: "Authorize",
401
+ evidence: "Evidence",
402
+ result: "Result",
403
+ };
404
+
405
+ const PHASE_COLORS = {
406
+ agent: "var(--phase-agent)",
407
+ tool: "var(--phase-tool)",
408
+ authorize: "var(--phase-authorize)",
409
+ evidence: "var(--phase-evidence)",
410
+ result: "var(--phase-result)",
411
+ };
412
+
413
+ function escapeHtml(value) {
414
+ return String(value ?? "")
415
+ .replaceAll("&", "&amp;")
416
+ .replaceAll("<", "&lt;")
417
+ .replaceAll(">", "&gt;")
418
+ .replaceAll('"', "&quot;");
419
+ }
420
+
421
+ function formatTime(iso) {
422
+ if (!iso) return "";
423
+ const date = new Date(iso);
424
+ if (Number.isNaN(date.getTime())) return iso;
425
+ return date.toLocaleTimeString(undefined, {
426
+ hour: "2-digit",
427
+ minute: "2-digit",
428
+ second: "2-digit",
429
+ });
430
+ }
431
+
432
+ function focusRunIdFromPath() {
433
+ const match = window.location.pathname.match(/^\/runs\/([^/]+)$/);
434
+ return match ? decodeURIComponent(match[1]) : null;
435
+ }
436
+
437
+ function defaultStepsForEvent(event) {
438
+ const recordedAt = event.recorded_at || "";
439
+ const spendCents = Number(event.requested_spend_cents || 0);
440
+ return [
441
+ { phase: "tool", label: `Tool call: ${event.operation || event.id}`, recorded_at: recordedAt },
442
+ {
443
+ phase: "authorize",
444
+ label: event.authorized
445
+ ? `Paybond approved $${(spendCents / 100).toFixed(2)}`
446
+ : "Spend authorization pending",
447
+ recorded_at: recordedAt,
448
+ },
449
+ { phase: "result", label: "Tool executed", recorded_at: recordedAt },
450
+ {
451
+ phase: "evidence",
452
+ label: event.evidence_submitted ? "Evidence submitted" : "Evidence pending",
453
+ recorded_at: recordedAt,
454
+ },
455
+ {
456
+ phase: "result",
457
+ label: event.sandbox_lifecycle_status
458
+ ? `Settlement: ${event.sandbox_lifecycle_status}`
459
+ : "Settlement simulated",
460
+ recorded_at: recordedAt,
461
+ },
462
+ ];
463
+ }
464
+
465
+ function resolveSteps(event) {
466
+ if (Array.isArray(event.steps) && event.steps.length > 0) {
467
+ return event.steps;
468
+ }
469
+ return defaultStepsForEvent(event);
470
+ }
471
+
472
+ function renderBanner(hasCredentials, hasEvents) {
473
+ if (hasCredentials) return "";
474
+ if (hasEvents) {
475
+ return `<aside class="banner banner-info">
476
+ <strong>Sandbox credentials not detected.</strong>
477
+ Recent trace events were recorded locally. Run <code>paybond login</code> to bind against the real sandbox API on the next smoke.
478
+ </aside>`;
479
+ }
480
+ return `<aside class="banner banner-warn">
481
+ <strong>Configure sandbox login.</strong>
482
+ Run <code>paybond dev smoke --offline</code> for a no-credentials local loop, or <code>paybond login</code> then <code>paybond dev smoke</code> for sandbox API events.
483
+ </aside>`;
484
+ }
485
+
486
+ function renderTimelineSteps(steps) {
487
+ return steps
488
+ .map((step) => {
489
+ const phase = step.phase || "result";
490
+ const phaseColor = PHASE_COLORS[phase] || "var(--muted)";
491
+ const detail = step.detail && Object.keys(step.detail).length > 0
492
+ ? `<details class="step-detail">
493
+ <summary>Details</summary>
494
+ <pre>${escapeHtml(JSON.stringify(step.detail, null, 2))}</pre>
495
+ </details>`
496
+ : "";
497
+ return `<li class="v-timeline-step" style="--phase-color: ${phaseColor}">
498
+ <div class="v-timeline-rail" aria-hidden="true">
499
+ <span class="v-timeline-dot"></span>
500
+ </div>
501
+ <div class="v-timeline-body">
502
+ <div class="v-timeline-top">
503
+ <span class="phase-badge" style="background: ${phaseColor}">${escapeHtml(PHASE_LABELS[phase] || phase)}</span>
504
+ <span class="step-time">${escapeHtml(formatTime(step.recorded_at))}</span>
505
+ </div>
506
+ <p class="step-label">${escapeHtml(step.label || "")}</p>
507
+ ${detail}
508
+ </div>
509
+ </li>`;
510
+ })
511
+ .join("");
512
+ }
513
+
514
+ function renderRunDetail(event) {
515
+ const steps = resolveSteps(event);
516
+ const spend = Number(event.requested_spend_cents || 0);
517
+ const authorizedBadge = event.authorized
518
+ ? `<span class="badge ok">Authorized $${(spend / 100).toFixed(2)}</span>`
519
+ : `<span class="badge warn">Authorization pending</span>`;
520
+ const evidenceBadge = event.evidence_submitted
521
+ ? `<span class="badge ok">Evidence submitted</span>`
522
+ : `<span class="badge warn">Evidence pending</span>`;
523
+ const settlement = event.sandbox_lifecycle_status
524
+ ? `<span class="badge ok">Settlement: ${escapeHtml(event.sandbox_lifecycle_status)}</span>`
525
+ : "";
526
+
527
+ return `<div class="run-heading">
528
+ <h2>${escapeHtml(event.operation || event.id)}</h2>
529
+ <p class="run-meta">preset ${escapeHtml(event.preset || "")}${event.intent_id ? ` · intent ${escapeHtml(event.intent_id)}` : ""} · run ${escapeHtml(event.run_id || event.id)}</p>
530
+ <div class="run-badges">${authorizedBadge}${evidenceBadge}${settlement}</div>
531
+ </div>
532
+ <ol class="v-timeline" aria-label="Middleware trace timeline">
533
+ ${renderTimelineSteps(steps)}
534
+ </ol>
535
+ <details class="raw-json">
536
+ <summary>Raw trace JSON</summary>
537
+ <pre>${escapeHtml(JSON.stringify(event, null, 2))}</pre>
538
+ </details>`;
539
+ }
540
+
541
+ function renderRunList(events, focusRunId) {
542
+ if (events.length === 0) {
543
+ return `<li class="empty-state">No runs yet. Run <code>paybond dev smoke</code> or <code>paybond dev loop</code>.</li>`;
544
+ }
545
+ const sorted = [...events].reverse();
546
+ return sorted
547
+ .map((event) => {
548
+ const runId = event.run_id || event.id;
549
+ const active = focusRunId && (runId === focusRunId || event.id === focusRunId);
550
+ return `<li>
551
+ <button type="button" class="run-item${active ? " active" : ""}" data-run-id="${escapeHtml(runId)}">
552
+ <span class="run-item-title">${escapeHtml(event.operation || runId)}</span>
553
+ <span class="run-item-meta">${escapeHtml(formatTime(event.recorded_at))} · ${escapeHtml(event.preset || "preset")}</span>
554
+ </button>
555
+ </li>`;
556
+ })
557
+ .join("");
558
+ }
559
+
560
+ function selectEvent(events, focusRunId) {
561
+ if (!events.length) return null;
562
+ if (!focusRunId) return events[events.length - 1];
563
+ return (
564
+ events.find((event) => event.id === focusRunId || event.run_id === focusRunId) ||
565
+ events[events.length - 1]
566
+ );
567
+ }
568
+
569
+ function renderDashboard(payload) {
570
+ const events = Array.isArray(payload.events) ? payload.events : [];
571
+ const hasCredentials = Boolean(payload.has_credentials);
572
+ const focusRunId = focusRunIdFromPath();
573
+ const selected = selectEvent(events, focusRunId);
574
+
575
+ document.getElementById("banner-root").innerHTML = renderBanner(hasCredentials, events.length > 0);
576
+ document.getElementById("status-text").textContent = `${events.length} run${events.length === 1 ? "" : "s"} · live`;
577
+ document.getElementById("run-list").innerHTML = renderRunList(events, focusRunId);
578
+
579
+ const traceRoot = document.getElementById("trace-root");
580
+ if (!selected) {
581
+ traceRoot.innerHTML = `<p class="empty-state">No trace events yet. Run <code>paybond dev smoke</code> or <code>paybond dev loop</code>, then refresh this page.</p>`;
582
+ return;
583
+ }
584
+ traceRoot.innerHTML = renderRunDetail(selected);
585
+ }
586
+
587
+ async function refreshDashboard() {
588
+ const response = await fetch("/api/events", { cache: "no-store" });
589
+ if (!response.ok) {
590
+ document.getElementById("status-text").textContent = "API error";
591
+ return;
592
+ }
593
+ const payload = await response.json();
594
+ renderDashboard(payload);
595
+ }
596
+
597
+ document.getElementById("run-list").addEventListener("click", (event) => {
598
+ const button = event.target.closest("[data-run-id]");
599
+ if (!button) return;
600
+ const runId = button.getAttribute("data-run-id");
601
+ if (!runId) return;
602
+ const nextPath = `/runs/${encodeURIComponent(runId)}`;
603
+ if (window.location.pathname !== nextPath) {
604
+ window.history.pushState({}, "", nextPath);
605
+ }
606
+ refreshDashboard();
607
+ });
608
+
609
+ window.addEventListener("popstate", () => {
610
+ refreshDashboard();
611
+ });
612
+
613
+ refreshDashboard();
614
+ setInterval(refreshDashboard, 2000);
615
+ </script>
616
+ </body>
617
+ </html>
@@ -0,0 +1,51 @@
1
+ import type { PaybondAgentRun } from "./run.js";
2
+ import type { PaybondAuthorizeToolCallInput, PaybondInterceptWrapExecuteResult, PaybondToolInputGuardDecision } from "./types.js";
3
+ /**
4
+ * Framework adapter contract: translate framework tool definitions into
5
+ * {@link PaybondAgentRun.interceptor} `wrapExecute` calls. Adapters must not
6
+ * embed Harbor or Gateway logic.
7
+ */
8
+ export interface PaybondFrameworkAdapter {
9
+ readonly name: string;
10
+ wrapTools(run: PaybondAgentRun, tools: unknown): unknown;
11
+ }
12
+ /** Generic tool-call envelope for provider-agnostic runtimes. */
13
+ export type PaybondGenericToolCall<TArgs = unknown> = {
14
+ toolName: string;
15
+ toolCallId: string;
16
+ arguments: TArgs;
17
+ operation?: string;
18
+ requestedSpendCents?: number;
19
+ vendorId?: string;
20
+ taskId?: string;
21
+ workflowId?: string;
22
+ currency?: string;
23
+ agentSubject?: string;
24
+ approvalToken?: string;
25
+ idempotencyKey?: string;
26
+ };
27
+ /** Generic tool definition before middleware wrapping. */
28
+ export type PaybondGenericToolDefinition<TArgs = unknown, TResult = unknown, TMeta extends Record<string, unknown> = Record<string, unknown>> = TMeta & {
29
+ name: string;
30
+ execute: (args: TArgs) => TResult | Promise<TResult>;
31
+ };
32
+ /** Generic tool definition after middleware wrapping. */
33
+ export type PaybondGenericWrappedToolDefinition<TArgs = unknown, TResult = unknown, TMeta extends Record<string, unknown> = Record<string, unknown>> = Omit<PaybondGenericToolDefinition<TArgs, TResult, TMeta>, "execute"> & {
34
+ execute: (call: PaybondGenericToolCall<TArgs>) => Promise<PaybondInterceptWrapExecuteResult<TResult>>;
35
+ };
36
+ /** Agent-agnostic pre-execution spend guard for any framework runtime. */
37
+ export interface PaybondToolInputGuardAdapter {
38
+ readonly name: string;
39
+ /** Authorize-only dry run before side-effecting tool execution. */
40
+ evaluate(input: PaybondAuthorizeToolCallInput): Promise<PaybondToolInputGuardDecision>;
41
+ /** Wrap `{ name, execute }` tools with full middleware (authorize → execute → evidence). */
42
+ wrapExecutors<T extends PaybondGenericToolDefinition>(tools: T[]): PaybondGenericWrappedToolDefinition[];
43
+ }
44
+ /** Provider-agnostic framework adapter for `{ name, execute }` tool definitions. */
45
+ export declare function createGenericToolExecutor(): PaybondFrameworkAdapter;
46
+ /** Singleton generic adapter instance. */
47
+ export declare const paybondGenericToolExecutorAdapter: PaybondFrameworkAdapter;
48
+ /** Build a run-scoped tool input guard adapter (framework-neutral). */
49
+ export declare function createToolInputGuardAdapter(run: PaybondAgentRun): PaybondToolInputGuardAdapter;
50
+ /** Convenience alias for {@link createToolInputGuardAdapter}. */
51
+ export declare function paybondToolInputGuardAdapter(run: PaybondAgentRun): PaybondToolInputGuardAdapter;