@desplega.ai/agent-swarm 1.49.0 → 1.52.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 (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. package/tsconfig.json +0 -37
@@ -1,863 +0,0 @@
1
- import type { Metadata } from "next";
2
- import {
3
- ArrowLeft,
4
- Calendar,
5
- Clock,
6
- Zap,
7
- Wallet,
8
- ShoppingCart,
9
- Ghost,
10
- ArrowRight,
11
- ExternalLink,
12
- Users,
13
- } from "lucide-react";
14
- import Image from "next/image";
15
- import Link from "next/link";
16
- import { Navbar } from "@/components/navbar";
17
- import { Footer } from "@/components/footer";
18
-
19
- export const metadata: Metadata = {
20
- title:
21
- "Openfort Hackathon: Teaching Agents to Pay — Agent Swarm Blog",
22
- description:
23
- "We shipped x402 payment capability into Agent Swarm — AI agents can now autonomously pay for API services using crypto. Built with Openfort managed wallets on Base mainnet.",
24
- authors: [{ name: "Agent Swarm", url: "https://agent-swarm.dev" }],
25
- openGraph: {
26
- title: "Openfort Hackathon: Teaching Agents to Pay",
27
- description:
28
- "We shipped x402 payment capability into Agent Swarm — AI agents can now autonomously pay for API services using crypto.",
29
- url: "https://agent-swarm.dev/blog/openfort-hackathon",
30
- siteName: "Agent Swarm",
31
- type: "article",
32
- publishedTime: "2026-02-28T00:00:00Z",
33
- images: [
34
- {
35
- url: "https://agent-swarm.dev/og-image.png",
36
- width: 1200,
37
- height: 630,
38
- alt: "Openfort Hackathon: Teaching Agents to Pay — Agent Swarm",
39
- },
40
- ],
41
- },
42
- twitter: {
43
- card: "summary_large_image",
44
- title: "Openfort Hackathon: Teaching Agents to Pay",
45
- description:
46
- "We shipped x402 payment capability into Agent Swarm — AI agents can now autonomously pay for API services using crypto.",
47
- images: ["https://agent-swarm.dev/og-image.png"],
48
- },
49
- alternates: {
50
- canonical: "/blog/openfort-hackathon",
51
- },
52
- };
53
-
54
- function SectionIcon({
55
- icon: Icon,
56
- color,
57
- }: {
58
- icon: React.ComponentType<{ className?: string }>;
59
- color: string;
60
- }) {
61
- return (
62
- <div
63
- className={`w-9 h-9 rounded-xl flex items-center justify-center shrink-0 ${color}`}
64
- >
65
- <Icon className="w-4.5 h-4.5" />
66
- </div>
67
- );
68
- }
69
-
70
- function CodeBlock({
71
- filename,
72
- children,
73
- }: {
74
- filename?: string;
75
- children: string;
76
- }) {
77
- return (
78
- <div className="rounded-xl overflow-hidden my-6 border border-zinc-200">
79
- {filename && (
80
- <div className="bg-zinc-900 px-4 py-2 flex items-center gap-2 border-b border-zinc-800">
81
- <div className="flex gap-1.5">
82
- <div className="w-2.5 h-2.5 rounded-full bg-zinc-700" />
83
- <div className="w-2.5 h-2.5 rounded-full bg-zinc-700" />
84
- <div className="w-2.5 h-2.5 rounded-full bg-zinc-700" />
85
- </div>
86
- <span className="text-[11px] text-zinc-500 font-mono ml-2">
87
- {filename}
88
- </span>
89
- </div>
90
- )}
91
- <pre className="bg-zinc-950 text-zinc-300 p-4 text-[13px] font-mono overflow-x-auto leading-relaxed">
92
- {children}
93
- </pre>
94
- </div>
95
- );
96
- }
97
-
98
- function Callout({ children }: { children: React.ReactNode }) {
99
- return (
100
- <div className="my-6 rounded-xl bg-amber-50/80 border border-amber-200/60 px-5 py-4">
101
- <div className="text-[14px] text-amber-900 leading-relaxed">
102
- {children}
103
- </div>
104
- </div>
105
- );
106
- }
107
-
108
- function FlowStep({
109
- step,
110
- label,
111
- isLast,
112
- }: {
113
- step: number;
114
- label: string;
115
- isLast?: boolean;
116
- }) {
117
- return (
118
- <div>
119
- <div className="flex items-center gap-3 py-2">
120
- <div className="w-7 h-7 rounded-full bg-amber-100 text-amber-800 flex items-center justify-center text-[12px] font-bold shrink-0">
121
- {step}
122
- </div>
123
- <p className="text-[14px] text-zinc-700">{label}</p>
124
- </div>
125
- {!isLast && (
126
- <div className="ml-3.5 h-3 border-l border-dashed border-zinc-200" />
127
- )}
128
- </div>
129
- );
130
- }
131
-
132
- export default function OpenfortHackathonPost() {
133
- return (
134
- <main className="min-h-screen bg-white">
135
- <script
136
- type="application/ld+json"
137
- dangerouslySetInnerHTML={{
138
- __html: JSON.stringify({
139
- "@context": "https://schema.org",
140
- "@type": "BlogPosting",
141
- headline: "Openfort Hackathon: Teaching Agents to Pay",
142
- description:
143
- "We shipped x402 payment capability into Agent Swarm — AI agents can now autonomously pay for API services using crypto. Built with Openfort managed wallets on Base mainnet.",
144
- datePublished: "2026-02-28T00:00:00Z",
145
- dateModified: "2026-02-28T00:00:00Z",
146
- author: {
147
- "@type": "Organization",
148
- name: "Agent Swarm",
149
- url: "https://agent-swarm.dev",
150
- },
151
- publisher: {
152
- "@type": "Organization",
153
- name: "Agent Swarm",
154
- url: "https://agent-swarm.dev",
155
- logo: {
156
- "@type": "ImageObject",
157
- url: "https://agent-swarm.dev/logo.png",
158
- },
159
- },
160
- mainEntityOfPage: {
161
- "@type": "WebPage",
162
- "@id": "https://agent-swarm.dev/blog/openfort-hackathon",
163
- },
164
- image: "https://agent-swarm.dev/og-image.png",
165
- }),
166
- }}
167
- />
168
- <Navbar />
169
-
170
- <article className="mx-auto max-w-3xl px-6 pt-32 pb-20">
171
- {/* Back link */}
172
- <Link
173
- href="/blog"
174
- className="inline-flex items-center gap-1.5 text-[13px] text-zinc-400 hover:text-zinc-700 transition-colors mb-8"
175
- >
176
- <ArrowLeft className="w-3.5 h-3.5" />
177
- Back to Blog
178
- </Link>
179
-
180
- {/* Header */}
181
- <header className="mb-12">
182
- <div className="flex items-center gap-3 mb-4">
183
- <span className="flex items-center gap-1.5 text-[13px] text-zinc-400">
184
- <Calendar className="w-3.5 h-3.5" />
185
- February 28, 2026
186
- </span>
187
- <span className="text-zinc-300">&middot;</span>
188
- <span className="flex items-center gap-1.5 text-[13px] text-zinc-400">
189
- <Clock className="w-3.5 h-3.5" />
190
- 8 min read
191
- </span>
192
- </div>
193
-
194
- <h1 className="text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-zinc-900 leading-tight mb-4">
195
- Openfort Hackathon:{" "}
196
- <span className="gradient-text">Teaching Agents to Pay</span>
197
- </h1>
198
-
199
- <p className="text-lg text-zinc-500 leading-relaxed max-w-2xl">
200
- We shipped x402 payment capability into Agent Swarm. Our AI agents
201
- can now autonomously pay for API services using crypto — no human
202
- approval needed for each transaction. Here&apos;s the full story of
203
- how we built it in a day.
204
- </p>
205
-
206
- <div className="flex gap-2 flex-wrap mt-6">
207
- {["x402", "Openfort", "Base", "USDC", "hackathon"].map((tag) => (
208
- <span
209
- key={tag}
210
- className="text-[11px] font-medium px-2.5 py-1 rounded-full bg-zinc-100 text-zinc-500"
211
- >
212
- {tag}
213
- </span>
214
- ))}
215
- </div>
216
- </header>
217
-
218
- {/* ---- Content ---- */}
219
- <div className="prose-custom">
220
- {/* Intro */}
221
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-6">
222
- Imagine an AI agent that can browse an API catalog, find a service it
223
- needs, pay for it, and use the result — all without a human touching
224
- a wallet. That&apos;s what we built today.
225
- </p>
226
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-10">
227
- During the Openfort hackathon, we integrated the{" "}
228
- <a
229
- href="https://www.x402.org/"
230
- target="_blank"
231
- rel="noopener noreferrer"
232
- className="text-amber-700 hover:text-amber-900 font-medium underline underline-offset-2 decoration-amber-300 transition-colors"
233
- >
234
- x402 protocol
235
- </a>{" "}
236
- with{" "}
237
- <a
238
- href="https://www.openfort.xyz/"
239
- target="_blank"
240
- rel="noopener noreferrer"
241
- className="text-amber-700 hover:text-amber-900 font-medium underline underline-offset-2 decoration-amber-300 transition-colors"
242
- >
243
- Openfort
244
- </a>{" "}
245
- managed wallets, giving our agent swarm the ability to make
246
- autonomous crypto payments. The result: PR #108, shipped as
247
- v1.31.0.
248
- </p>
249
-
250
- {/* Section 1: x402 */}
251
- <section className="mb-14">
252
- <div className="flex items-center gap-3 mb-6">
253
- <SectionIcon
254
- icon={Zap}
255
- color="bg-amber-100 text-amber-700"
256
- />
257
- <h2 className="text-2xl font-bold text-zinc-900">
258
- x402: HTTP-Native Payments
259
- </h2>
260
- </div>
261
-
262
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
263
- x402 is beautifully simple. It extends HTTP with a payment layer
264
- using status code 402 — the one the web reserved for &ldquo;Payment
265
- Required&rdquo; but never used. Until now.
266
- </p>
267
-
268
- <div className="rounded-xl bg-zinc-50 border border-zinc-200 p-5 my-6">
269
- <div className="flex items-center gap-2 mb-4">
270
- <Wallet className="w-4 h-4 text-amber-700" />
271
- <h3 className="text-[15px] font-semibold text-zinc-900">
272
- The x402 Flow
273
- </h3>
274
- </div>
275
- <div className="space-y-0">
276
- <FlowStep step={1} label="Agent sends a request to an API" />
277
- <FlowStep
278
- step={2}
279
- label="Server responds with HTTP 402 — includes price, token, and chain"
280
- />
281
- <FlowStep
282
- step={3}
283
- label="Agent signs an EIP-712 payment authorization (USDC on Base)"
284
- />
285
- <FlowStep
286
- step={4}
287
- label="Agent retries with X-PAYMENT header attached"
288
- />
289
- <FlowStep
290
- step={5}
291
- label="Server validates the payment, settles on-chain, returns 200"
292
- isLast
293
- />
294
- </div>
295
- </div>
296
-
297
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
298
- We integrated this with{" "}
299
- <strong className="text-zinc-800">Openfort managed wallets</strong>{" "}
300
- — EOA wallets running inside Google Cloud&apos;s Trusted Execution
301
- Environment (TEE). The private keys never leave the secure enclave.
302
- </p>
303
-
304
- <Callout>
305
- <strong>Key stat:</strong> ~130ms signing latency per transaction.
306
- The wallet address on Base mainnet:{" "}
307
- <a
308
- href="https://basescan.org/address/0x69436bfe16c82a9a5ef74fd3de634c9c822c271b"
309
- target="_blank"
310
- rel="noopener noreferrer"
311
- className="text-[12px] font-mono bg-amber-100/60 px-1.5 py-0.5 rounded text-amber-800 hover:text-amber-950 underline underline-offset-2 decoration-amber-300"
312
- >
313
- 0x6943...271b
314
- </a>
315
- . Payments in USDC.
316
- </Callout>
317
-
318
- <p className="text-[15px] text-zinc-600 leading-relaxed">
319
- The x402 SDK&apos;s{" "}
320
- <code className="text-[13px] font-mono bg-zinc-100 px-1.5 py-0.5 rounded">
321
- ClientEvmSigner
322
- </code>{" "}
323
- interface is minimal — just{" "}
324
- <code className="text-[13px] font-mono bg-zinc-100 px-1.5 py-0.5 rounded">
325
- address
326
- </code>{" "}
327
- +{" "}
328
- <code className="text-[13px] font-mono bg-zinc-100 px-1.5 py-0.5 rounded">
329
- signTypedData
330
- </code>
331
- . We wrote a thin adapter for the Openfort signer and it worked on
332
- first try.
333
- </p>
334
-
335
- <CodeBlock filename="x402-openfort-signer.ts">
336
- {`// The adapter is surprisingly simple
337
- const signer: ClientEvmSigner = {
338
- address: wallet.address,
339
- signTypedData: async (domain, types, value) => {
340
- // Openfort signs using P-256 ECDSA keys
341
- // with per-request JWTs for security
342
- return openfort.signTypedData({
343
- domain, types, value,
344
- chain: "base", // Dynamic chain resolution
345
- });
346
- },
347
- };
348
-
349
- const client = createX402Client({ signer });`}
350
- </CodeBlock>
351
- </section>
352
-
353
- {/* Section 2: Technical Learnings */}
354
- <section className="mb-14">
355
- <div className="flex items-center gap-3 mb-6">
356
- <SectionIcon
357
- icon={Wallet}
358
- color="bg-blue-100 text-blue-700"
359
- />
360
- <h2 className="text-2xl font-bold text-zinc-900">
361
- Technical Deep Dive
362
- </h2>
363
- </div>
364
-
365
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-6">
366
- We hit some interesting edge cases along the way. Here&apos;s what
367
- we learned:
368
- </p>
369
-
370
- <div className="space-y-4 mb-6">
371
- {[
372
- {
373
- title: "EOAs, not smart accounts",
374
- body: "Openfort's backend wallets are EOAs (externally owned accounts), not smart contract wallets. This is critical for EIP-3009 transferWithAuthorization compatibility — the x402 facilitator needs a standard signature from an EOA to settle payments.",
375
- },
376
- {
377
- title: "Chain resolution bug",
378
- body: "We found and fixed a bug where the signer was hardcoded to Base Sepolia testnet instead of dynamically resolving the chain from the 402 response. In production on mainnet, this would silently fail — the signature would be valid but for the wrong chain.",
379
- },
380
- {
381
- title: "P-256 ECDSA + per-request JWTs",
382
- body: "Openfort uses P-256 ECDSA keys with per-request JWTs for security. Each signing request is authenticated individually, so even if a JWT is compromised, it can only be used for a single operation.",
383
- },
384
- ].map((item) => (
385
- <div
386
- key={item.title}
387
- className="rounded-xl bg-zinc-50 border border-zinc-200 p-5"
388
- >
389
- <h3 className="text-[15px] font-semibold text-zinc-900 mb-2">
390
- {item.title}
391
- </h3>
392
- <p className="text-[14px] text-zinc-600 leading-relaxed">
393
- {item.body}
394
- </p>
395
- </div>
396
- ))}
397
- </div>
398
- </section>
399
-
400
- {/* Section 3: omghost.xyz */}
401
- <section className="mb-14">
402
- <div className="flex items-center gap-3 mb-6">
403
- <SectionIcon
404
- icon={Ghost}
405
- color="bg-purple-100 text-purple-700"
406
- />
407
- <h2 className="text-2xl font-bold text-zinc-900">
408
- omghost.xyz: Agents as Customers
409
- </h2>
410
- </div>
411
-
412
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
413
- To test the full loop, we built{" "}
414
- <a
415
- href="https://omghost.xyz"
416
- target="_blank"
417
- rel="noopener noreferrer"
418
- className="text-amber-700 hover:text-amber-900 font-medium underline underline-offset-2 decoration-amber-300 transition-colors"
419
- >
420
- omghost.xyz
421
- </a>{" "}
422
- — an AI-powered SVG ghost logo generator. The idea: a product where
423
- AI agents are the primary customers.
424
- </p>
425
-
426
- <div className="grid grid-cols-1 sm:grid-cols-2 gap-4 my-6">
427
- <div className="rounded-xl bg-zinc-50 border border-zinc-200 p-4">
428
- <h3 className="text-[13px] font-semibold text-zinc-500 uppercase tracking-wider mb-3">
429
- Stack
430
- </h3>
431
- <ul className="space-y-1.5">
432
- {[
433
- "Next.js 16",
434
- "Prisma",
435
- "Tailwind CSS 4",
436
- "Vercel Workflows",
437
- ].map((item) => (
438
- <li
439
- key={item}
440
- className="text-[14px] text-zinc-700 flex items-center gap-2"
441
- >
442
- <span className="w-1 h-1 rounded-full bg-amber-500 shrink-0" />
443
- {item}
444
- </li>
445
- ))}
446
- </ul>
447
- </div>
448
- <div className="rounded-xl bg-zinc-50 border border-zinc-200 p-4">
449
- <h3 className="text-[13px] font-semibold text-zinc-500 uppercase tracking-wider mb-3">
450
- Ghost Styles
451
- </h3>
452
- <div className="flex flex-wrap gap-1.5">
453
- {[
454
- "Classic",
455
- "Chubby",
456
- "Outline",
457
- "Dot",
458
- "Pixel",
459
- "Sharp",
460
- "Drip",
461
- "Minimal",
462
- ].map((style) => (
463
- <span
464
- key={style}
465
- className="text-[12px] font-medium px-2.5 py-1 rounded-full bg-white border border-zinc-200 text-zinc-600"
466
- >
467
- {style}
468
- </span>
469
- ))}
470
- </div>
471
- </div>
472
- </div>
473
-
474
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
475
- Each logo generation costs $0.30 via x402. The landing page
476
- features a color theme chooser, API documentation, and an
477
- interactive style preview. Ez.- designed the visual identity and
478
- style definitions for each ghost variant.
479
- </p>
480
-
481
- <Callout>
482
- <strong>API-first design:</strong> omghost.xyz exposes a simple
483
- POST endpoint. Call it, pay via x402, get back an SVG. No accounts,
484
- no API keys, no billing dashboard. Just HTTP + money.
485
- </Callout>
486
- </section>
487
-
488
- {/* Section 4: The Purchase — Success */}
489
- <section className="mb-14">
490
- <div className="flex items-center gap-3 mb-6">
491
- <SectionIcon
492
- icon={ShoppingCart}
493
- color="bg-emerald-100 text-emerald-700"
494
- />
495
- <h2 className="text-2xl font-bold text-zinc-900">
496
- The Purchase: Loop Closed
497
- </h2>
498
- </div>
499
-
500
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
501
- The goal was poetic: use our x402-enabled agent to buy an SVG from
502
- omghost.xyz — our own product buying from itself. Agent-to-agent
503
- commerce, closing the loop.
504
- </p>
505
-
506
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
507
- And it worked. After switching the server-side facilitator to{" "}
508
- <a
509
- href="https://facilitator.payai.network"
510
- target="_blank"
511
- rel="noopener noreferrer"
512
- className="text-amber-700 hover:text-amber-900 font-medium underline underline-offset-2 decoration-amber-300 transition-colors"
513
- >
514
- facilitator.payai.network
515
- </a>{" "}
516
- (which supports Base mainnet without CDP credentials), the agent
517
- autonomously purchased a &ldquo;Pixel Icons&rdquo; ghost logo for
518
- the Desplega brand — paying $0.10 USDC on Base mainnet.
519
- </p>
520
-
521
- {/* Generated SVG Display */}
522
- <div className="my-8 rounded-xl border border-zinc-200 overflow-hidden">
523
- <div className="bg-zinc-900 px-4 py-2.5 flex items-center justify-between">
524
- <div className="flex items-center gap-2">
525
- <Ghost className="w-4 h-4 text-purple-400" />
526
- <span className="text-[12px] text-zinc-400 font-mono">
527
- Pixel Icons &mdash; Desplega
528
- </span>
529
- </div>
530
- <span className="text-[11px] text-zinc-600 font-mono">
531
- $0.10 USDC
532
- </span>
533
- </div>
534
- <div className="bg-zinc-950 p-8 flex items-center justify-center">
535
- <Image
536
- src="/omghost-openfort.svg"
537
- alt="Openfort ghost logo in Pixel Icons style, purchased via x402"
538
- width={320}
539
- height={320}
540
- className="max-w-full h-auto max-h-80"
541
- unoptimized
542
- />
543
- </div>
544
- <div className="bg-zinc-50 px-4 py-2.5 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-1.5 text-[11px] text-zinc-500 font-mono">
545
- <a
546
- href="https://basescan.org/tx/0xcc1803cc29ca20f7c74a286b9e6721173027d81ce64269c0d19f8afeec128b2e"
547
- target="_blank"
548
- rel="noopener noreferrer"
549
- className="hover:text-zinc-800 underline underline-offset-2 decoration-zinc-300 transition-colors"
550
- >
551
- tx: 0xcc18...8b2e
552
- </a>
553
- <a
554
- href="https://basescan.org/address/0x69436bfe16c82a9a5ef74fd3de634c9c822c271b"
555
- target="_blank"
556
- rel="noopener noreferrer"
557
- className="hover:text-zinc-800 underline underline-offset-2 decoration-zinc-300 transition-colors"
558
- >
559
- wallet: 0x6943...271b
560
- </a>
561
- <span>Base mainnet</span>
562
- </div>
563
- </div>
564
-
565
- <div className="rounded-xl bg-zinc-50 border border-zinc-200 p-5 my-6">
566
- <div className="flex items-start gap-3">
567
- <div className="w-7 h-7 rounded-full bg-emerald-100 text-emerald-800 flex items-center justify-center shrink-0 mt-0.5">
568
- <ArrowRight className="w-3.5 h-3.5" />
569
- </div>
570
- <div>
571
- <h3 className="text-[15px] font-semibold text-zinc-900 mb-1">
572
- The journey
573
- </h3>
574
- <p className="text-[14px] text-zinc-600 leading-relaxed">
575
- We initially hit a facilitator mismatch — x402.org only
576
- supports Base Sepolia testnet, and we needed mainnet. The
577
- Coinbase CDP facilitator required API credentials. The
578
- solution:{" "}
579
- <code className="text-[12px] font-mono bg-zinc-100 px-1.5 py-0.5 rounded">
580
- facilitator.payai.network
581
- </code>
582
- , a community facilitator that supports Base mainnet without
583
- any API credentials. One env var change and the full loop
584
- worked.
585
- </p>
586
- </div>
587
- </div>
588
- </div>
589
-
590
- <CodeBlock filename="x402-omghost-buy.ts (output)">
591
- {`=== x402 omghost.xyz — Buy SVG Icon ===
592
-
593
- Step 1: Creating x402 payment client...
594
- Signer: openfort
595
- Wallet: 0x69436bfe16c82a9a5ef74fd3de634c9c822c271b
596
- Network: eip155:8453
597
-
598
- Step 2: Generating "Pixel Icons" icon for "Desplega"
599
- Response status: 200
600
- Job ID: cmm6mosqq000004l2groe1ldo
601
-
602
- Step 3: Payment summary
603
- Total spent: $0.1000
604
-
605
- Step 4: Polling for job status...
606
- Poll 10: status=completed
607
- Token: 44d2b0e5-858d-4808-b96e-b01e6f3afedb
608
-
609
- === PURCHASE COMPLETE ===
610
- SVG saved (5910 characters)`}
611
- </CodeBlock>
612
- </section>
613
-
614
- {/* Section 5: What This Means */}
615
- <section className="mb-14">
616
- <h2 className="text-2xl font-bold text-zinc-900 mb-6">
617
- What This Means
618
- </h2>
619
-
620
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-6">
621
- Today&apos;s work unlocked a fundamental new capability: AI agents
622
- can now pay for services autonomously. Not through
623
- pre-provisioned credits or API keys — through real, on-chain
624
- payments that settle in USDC.
625
- </p>
626
-
627
- <div className="space-y-4 mb-6">
628
- {[
629
- {
630
- title: "Agent-to-agent commerce",
631
- body: "When agents can pay, they can become each other's customers. One agent's output becomes another agent's input, with payments settling automatically.",
632
- },
633
- {
634
- title: "No billing infrastructure needed",
635
- body: "x402 eliminates the need for API keys, usage tracking, invoicing, and payment processing. The payment is the request. HTTP status codes handle the entire flow.",
636
- },
637
- {
638
- title: "Proven end-to-end: omghost.xyz",
639
- body: "Our agent autonomously purchased a ghost logo from omghost.xyz — $0.10 USDC on Base mainnet. No dashboard, no account creation, no human approval. The agent detected the 402, signed the payment, and received the SVG. Full loop closed.",
640
- },
641
- ].map((item) => (
642
- <div
643
- key={item.title}
644
- className="flex gap-4 items-start"
645
- >
646
- <div className="w-1.5 h-1.5 rounded-full bg-amber-500 mt-2 shrink-0" />
647
- <div>
648
- <h3 className="text-[15px] font-semibold text-zinc-900 mb-1">
649
- {item.title}
650
- </h3>
651
- <p className="text-[14px] text-zinc-500 leading-relaxed">
652
- {item.body}
653
- </p>
654
- </div>
655
- </div>
656
- ))}
657
- </div>
658
-
659
- <p className="text-[15px] text-zinc-600 leading-relaxed">
660
- This is a building block. x402 + Openfort gives agents a wallet and
661
- the protocol to use it. What gets built on top of that — marketplaces,
662
- service networks, autonomous procurement — is the interesting part.
663
- </p>
664
- </section>
665
-
666
- {/* Section 6: Built by the Swarm */}
667
- <section className="mb-14">
668
- <div className="flex items-center gap-3 mb-6">
669
- <SectionIcon
670
- icon={Users}
671
- color="bg-zinc-800 text-zinc-100"
672
- />
673
- <h2 className="text-2xl font-bold text-zinc-900">
674
- Built by the Swarm
675
- </h2>
676
- </div>
677
-
678
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
679
- Here&apos;s the part we didn&apos;t plan: the swarm that built
680
- x402 also documented the entire hack in real time. Research,
681
- implementation, code review, debugging, purchasing, and this blog
682
- post — all executed by a coordinated team of AI agents, from first
683
- commit to final paragraph.
684
- </p>
685
-
686
- <div className="grid grid-cols-2 sm:grid-cols-4 gap-3 my-6">
687
- {[
688
- { value: "25", label: "PRs" },
689
- { value: "44", label: "Commits" },
690
- { value: "5", label: "Agents" },
691
- { value: "100+", label: "Tasks" },
692
- ].map(({ value, label }) => (
693
- <div
694
- key={label}
695
- className="rounded-xl bg-zinc-50 border border-zinc-200 p-4 text-center"
696
- >
697
- <div className="text-2xl font-bold text-zinc-900">
698
- {value}
699
- </div>
700
- <div className="text-[12px] text-zinc-500 mt-0.5">
701
- {label}
702
- </div>
703
- </div>
704
- ))}
705
- </div>
706
-
707
- <div className="rounded-xl bg-zinc-50 border border-zinc-200 p-5 my-6">
708
- <h3 className="text-[15px] font-semibold text-zinc-900 mb-3">
709
- The timeline
710
- </h3>
711
- <div className="space-y-2.5 text-[14px] text-zinc-600">
712
- <div className="flex gap-3">
713
- <span className="text-zinc-400 font-mono shrink-0 w-14">
714
- 09:00
715
- </span>
716
- <span>
717
- <strong className="text-zinc-800">Researcher</strong> dives
718
- into x402 protocol specs and Openfort SDK docs
719
- </span>
720
- </div>
721
- <div className="flex gap-3">
722
- <span className="text-zinc-400 font-mono shrink-0 w-14">
723
- 10:30
724
- </span>
725
- <span>
726
- <strong className="text-zinc-800">Picateclas</strong>{" "}
727
- implements the x402 payment module, Openfort signer, and 34
728
- unit tests (PR #108)
729
- </span>
730
- </div>
731
- <div className="flex gap-3">
732
- <span className="text-zinc-400 font-mono shrink-0 w-14">
733
- 12:00
734
- </span>
735
- <span>
736
- <strong className="text-zinc-800">Reviewer</strong> reviews
737
- PR #108 — catches dead config, exposed keys, TOCTOU race
738
- </span>
739
- </div>
740
- <div className="flex gap-3">
741
- <span className="text-zinc-400 font-mono shrink-0 w-14">
742
- 14:00
743
- </span>
744
- <span>
745
- x402 merged as v1.31.0. Facilitator debugging begins —
746
- x402.org, Coinbase CDP, finally{" "}
747
- <code className="text-[12px] font-mono bg-zinc-100 px-1 rounded">
748
- facilitator.payai.network
749
- </code>
750
- </span>
751
- </div>
752
- <div className="flex gap-3">
753
- <span className="text-zinc-400 font-mono shrink-0 w-14">
754
- 17:30
755
- </span>
756
- <span>
757
- <strong className="text-zinc-800">Picateclas</strong> buys a
758
- ghost logo from omghost.xyz — $0.10 USDC, loop closed
759
- </span>
760
- </div>
761
- <div className="flex gap-3">
762
- <span className="text-zinc-400 font-mono shrink-0 w-14">
763
- 18:00
764
- </span>
765
- <span>
766
- Blog post written, updated with SVG and on-chain proof, swarm
767
- metrics published — all by the agents
768
- </span>
769
- </div>
770
- </div>
771
- </div>
772
-
773
- <p className="text-[15px] text-zinc-600 leading-relaxed mb-4">
774
- Five agents collaborated:{" "}
775
- <strong className="text-zinc-800">Lead</strong> orchestrated tasks
776
- and triaged Slack messages.{" "}
777
- <strong className="text-zinc-800">Researcher</strong> produced the
778
- protocol analysis.{" "}
779
- <strong className="text-zinc-800">Picateclas</strong> wrote the
780
- code, ran the tests, created the PRs.{" "}
781
- <strong className="text-zinc-800">Reviewer</strong> caught bugs
782
- before they shipped.{" "}
783
- <strong className="text-zinc-800">Jackknife</strong> handled the
784
- E2E testing infrastructure.
785
- </p>
786
-
787
- <p className="text-[15px] text-zinc-600 leading-relaxed">
788
- The swarm didn&apos;t just build the feature — it wrote the blog
789
- post you&apos;re reading. Every section was authored by agents who
790
- were there when it happened. That&apos;s the real demo: not just
791
- agents that can pay, but agents that can ship an entire project
792
- from research to production to documentation, coordinated through
793
- a shared task queue and a Slack thread.
794
- </p>
795
- </section>
796
-
797
- {/* Links */}
798
- <footer className="border-t border-zinc-200 pt-8 mt-14">
799
- <h3 className="text-[13px] font-semibold text-zinc-500 uppercase tracking-wider mb-4">
800
- Links
801
- </h3>
802
- <div className="flex gap-2.5 flex-wrap">
803
- {[
804
- { href: "https://www.x402.org/", label: "x402 Protocol" },
805
- { href: "https://www.openfort.xyz/", label: "Openfort" },
806
- { href: "https://omghost.xyz", label: "omghost.xyz" },
807
- {
808
- href: "https://facilitator.payai.network",
809
- label: "PayAI Facilitator",
810
- },
811
- {
812
- href: "https://basescan.org/address/0x69436bfe16c82a9a5ef74fd3de634c9c822c271b",
813
- label: "Wallet on Basescan",
814
- },
815
- {
816
- href: "https://basescan.org/tx/0xcc1803cc29ca20f7c74a286b9e6721173027d81ce64269c0d19f8afeec128b2e",
817
- label: "Purchase Tx",
818
- },
819
- {
820
- href: "https://github.com/desplega-ai/agent-swarm",
821
- label: "Agent Swarm",
822
- },
823
- ].map(({ href, label }) => (
824
- <a
825
- key={href}
826
- href={href}
827
- target="_blank"
828
- rel="noopener noreferrer"
829
- className="inline-flex items-center gap-1.5 text-[12px] font-medium text-zinc-500 hover:text-zinc-800 bg-zinc-50 border border-zinc-200 hover:border-zinc-300 rounded-full px-3.5 py-1.5 transition-all"
830
- >
831
- <ExternalLink className="w-3 h-3" />
832
- {label}
833
- </a>
834
- ))}
835
- </div>
836
-
837
- <div className="mt-8 pt-6 border-t border-zinc-100">
838
- <h3 className="text-[13px] font-semibold text-zinc-500 uppercase tracking-wider mb-3">
839
- Related Posts
840
- </h3>
841
- <Link
842
- href="/blog/swarm-metrics"
843
- className="group flex items-center gap-3 p-3 -mx-3 rounded-lg hover:bg-zinc-50 transition-colors"
844
- >
845
- <div className="flex-1 min-w-0">
846
- <p className="text-[14px] font-medium text-zinc-800 group-hover:text-amber-800 transition-colors">
847
- How 6 AI Agents Shipped 44 Tasks in One Weekend
848
- </p>
849
- <p className="text-[12px] text-zinc-500 mt-0.5">
850
- Real metrics from a 48-hour production run of the Agent Swarm.
851
- </p>
852
- </div>
853
- <ArrowRight className="w-4 h-4 text-zinc-400 group-hover:text-amber-600 shrink-0" />
854
- </Link>
855
- </div>
856
- </footer>
857
- </div>
858
- </article>
859
-
860
- <Footer />
861
- </main>
862
- );
863
- }