@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.
- package/README.md +1 -1
- package/openapi.json +2070 -728
- package/package.json +10 -1
- package/src/agentmail/handlers.ts +65 -10
- package/src/agentmail/templates.ts +111 -0
- package/src/be/db.ts +1233 -7
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/019_skills.sql +65 -0
- package/src/be/migrations/020_approval_requests.sql +41 -0
- package/src/be/seed.ts +62 -0
- package/src/be/skill-parser.ts +70 -0
- package/src/be/skill-sync.ts +106 -0
- package/src/commands/runner.ts +320 -132
- package/src/commands/templates.ts +172 -0
- package/src/github/handlers.ts +292 -77
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/gitlab/handlers.ts +63 -22
- package/src/gitlab/templates.ts +140 -0
- package/src/heartbeat/heartbeat.ts +19 -10
- package/src/heartbeat/templates.ts +30 -0
- package/src/http/active-sessions.ts +27 -0
- package/src/http/approval-requests.ts +247 -0
- package/src/http/config.ts +3 -3
- package/src/http/index.ts +9 -2
- package/src/http/poll.ts +135 -14
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/schedules.ts +35 -0
- package/src/http/skills.ts +479 -0
- package/src/http/workflows.ts +8 -0
- package/src/linear/sync.ts +28 -4
- package/src/linear/templates.ts +47 -0
- package/src/prompts/base-prompt.ts +41 -490
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +15 -2
- package/src/providers/pi-mono-extension.ts +5 -1
- package/src/scheduler/scheduler.ts +125 -91
- package/src/server.ts +44 -0
- package/src/slack/assistant.ts +7 -4
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/handlers.ts +21 -6
- package/src/slack/templates.ts +55 -0
- package/src/tests/approval-requests.test.ts +735 -0
- package/src/tests/artifact-sdk.test.ts +12 -12
- package/src/tests/base-prompt.test.ts +49 -49
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/heartbeat.test.ts +1 -0
- package/src/tests/linear-webhook.test.ts +7 -3
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/self-improvement.test.ts +8 -7
- package/src/tests/skill-parser.test.ts +178 -0
- package/src/tests/skill-sync.test.ts +171 -0
- package/src/tests/slack-metadata-inheritance.test.ts +1 -1
- package/src/tests/slack-thread-followups.test.ts +1 -1
- package/src/tests/structured-output.test.ts +0 -4
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/workflow-async-v2.test.ts +126 -4
- package/src/tests/workflow-definition-validation.test.ts +76 -0
- package/src/tests/workflow-executors.test.ts +4 -2
- package/src/tests/workflow-retry-v2.test.ts +1 -1
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/request-human-input.ts +106 -0
- package/src/tools/skills/index.ts +11 -0
- package/src/tools/skills/skill-create.ts +105 -0
- package/src/tools/skills/skill-delete.ts +67 -0
- package/src/tools/skills/skill-get.ts +75 -0
- package/src/tools/skills/skill-install-remote.ts +152 -0
- package/src/tools/skills/skill-install.ts +101 -0
- package/src/tools/skills/skill-list.ts +77 -0
- package/src/tools/skills/skill-publish.ts +123 -0
- package/src/tools/skills/skill-search.ts +43 -0
- package/src/tools/skills/skill-sync-remote.ts +128 -0
- package/src/tools/skills/skill-uninstall.ts +60 -0
- package/src/tools/skills/skill-update.ts +128 -0
- package/src/tools/store-progress.ts +22 -4
- package/src/tools/task-action.ts +20 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +23 -0
- package/src/tools/update-profile.ts +106 -34
- package/src/tools/workflows/create-workflow.ts +19 -1
- package/src/tools/workflows/update-workflow.ts +16 -1
- package/src/types.ts +109 -2
- package/src/workflows/definition.ts +30 -12
- package/src/workflows/engine.ts +40 -14
- package/src/workflows/executors/agent-task.ts +14 -3
- package/src/workflows/executors/human-in-the-loop.ts +160 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/index.ts +1 -1
- package/src/workflows/recovery.ts +72 -0
- package/src/workflows/resume.ts +162 -12
- package/src/workflows/triggers.ts +31 -2
- package/src/workflows/version.ts +2 -0
- package/.claude/settings.json +0 -84
- package/.claude/settings.local.json +0 -117
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.entire/settings.json +0 -4
- package/.env.docker.example +0 -56
- package/.env.example +0 -78
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
- package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
- package/.github/workflows/ci.yml +0 -52
- package/.github/workflows/docker-and-deploy.yml +0 -132
- package/.github/workflows/merge-gate.yml +0 -233
- package/.opencode/plugins/entire.ts +0 -133
- package/.superset/config.json +0 -6
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -171
- package/CHANGELOG.md +0 -447
- package/CLAUDE.md +0 -521
- package/CONTRIBUTING.md +0 -315
- package/DEPLOYMENT.md +0 -622
- package/Dockerfile +0 -65
- package/Dockerfile.worker +0 -189
- package/MCP.md +0 -841
- package/UI.md +0 -40
- package/api-entrypoint.sh +0 -56
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/depot.json +0 -1
- package/docker-compose.example.yml +0 -350
- package/docker-compose.local.yml +0 -119
- package/docker-entrypoint.sh +0 -632
- package/docs-site/app/api/search/route.ts +0 -4
- package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
- package/docs-site/app/docs/layout.tsx +0 -12
- package/docs-site/app/globals.css +0 -24
- package/docs-site/app/layout.config.tsx +0 -34
- package/docs-site/app/layout.tsx +0 -119
- package/docs-site/app/llms-full.txt/route.ts +0 -11
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
- package/docs-site/app/llms.txt/route.ts +0 -8
- package/docs-site/app/page.tsx +0 -5
- package/docs-site/app/robots.ts +0 -13
- package/docs-site/app/sitemap.ts +0 -37
- package/docs-site/components/api-page.client.tsx +0 -4
- package/docs-site/components/api-page.tsx +0 -7
- package/docs-site/components/mdx/mermaid.tsx +0 -55
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
- package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
- package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
- package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
- package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
- package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
- package/docs-site/content/docs/(documentation)/index.mdx +0 -65
- package/docs-site/content/docs/(documentation)/meta.json +0 -19
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
- package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
- package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
- package/docs-site/content/docs/api-reference/agents.mdx +0 -9
- package/docs-site/content/docs/api-reference/channels.mdx +0 -9
- package/docs-site/content/docs/api-reference/config.mdx +0 -9
- package/docs-site/content/docs/api-reference/debug.mdx +0 -9
- package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
- package/docs-site/content/docs/api-reference/epics.mdx +0 -9
- package/docs-site/content/docs/api-reference/index.mdx +0 -32
- package/docs-site/content/docs/api-reference/memory.mdx +0 -9
- package/docs-site/content/docs/api-reference/meta.json +0 -25
- package/docs-site/content/docs/api-reference/poll.mdx +0 -9
- package/docs-site/content/docs/api-reference/repos.mdx +0 -9
- package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
- package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
- package/docs-site/content/docs/api-reference/stats.mdx +0 -9
- package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
- package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
- package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
- package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
- package/docs-site/content/docs/meta.json +0 -3
- package/docs-site/lib/get-llm-text.ts +0 -10
- package/docs-site/lib/openapi.ts +0 -23
- package/docs-site/lib/source.ts +0 -8
- package/docs-site/mdx-components.tsx +0 -13
- package/docs-site/next.config.mjs +0 -29
- package/docs-site/package.json +0 -35
- package/docs-site/pnpm-lock.yaml +0 -5407
- package/docs-site/postcss.config.mjs +0 -8
- package/docs-site/public/logo.png +0 -0
- package/docs-site/scripts/generate-docs.ts +0 -171
- package/docs-site/source.config.ts +0 -17
- package/docs-site/tsconfig.json +0 -46
- package/ecosystem.config.cjs +0 -66
- package/landing/next.config.ts +0 -14
- package/landing/package.json +0 -31
- package/landing/pnpm-lock.yaml +0 -1091
- package/landing/postcss.config.mjs +0 -8
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +0 -30
- package/landing/public/omghost-openfort.svg +0 -9
- package/landing/src/app/actions/waitlist.ts +0 -25
- package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
- package/landing/src/app/blog/page.tsx +0 -162
- package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
- package/landing/src/app/examples/page.tsx +0 -174
- package/landing/src/app/examples/x402/page.tsx +0 -456
- package/landing/src/app/globals.css +0 -122
- package/landing/src/app/layout.tsx +0 -134
- package/landing/src/app/page.tsx +0 -27
- package/landing/src/app/robots.ts +0 -13
- package/landing/src/app/sitemap.ts +0 -44
- package/landing/src/components/architecture.tsx +0 -163
- package/landing/src/components/cta.tsx +0 -52
- package/landing/src/components/features.tsx +0 -160
- package/landing/src/components/footer.tsx +0 -100
- package/landing/src/components/hero.tsx +0 -217
- package/landing/src/components/how-it-works.tsx +0 -165
- package/landing/src/components/navbar.tsx +0 -147
- package/landing/src/components/waitlist.tsx +0 -110
- package/landing/src/components/why-choose.tsx +0 -149
- package/landing/src/components/workshops.tsx +0 -328
- package/landing/src/lib/utils.ts +0 -6
- package/landing/tsconfig.json +0 -41
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
- package/new-ui/CLAUDE.md +0 -92
- package/new-ui/README.md +0 -73
- package/new-ui/biome.json +0 -42
- package/new-ui/components.json +0 -21
- package/new-ui/index.html +0 -25
- package/new-ui/package.json +0 -49
- package/new-ui/pnpm-lock.yaml +0 -4845
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +0 -814
- package/new-ui/src/api/hooks/index.ts +0 -64
- package/new-ui/src/api/hooks/use-agents.ts +0 -58
- package/new-ui/src/api/hooks/use-channels.ts +0 -115
- package/new-ui/src/api/hooks/use-config-api.ts +0 -46
- package/new-ui/src/api/hooks/use-costs.ts +0 -122
- package/new-ui/src/api/hooks/use-db-query.ts +0 -29
- package/new-ui/src/api/hooks/use-epics.ts +0 -75
- package/new-ui/src/api/hooks/use-repos.ts +0 -61
- package/new-ui/src/api/hooks/use-schedules.ts +0 -81
- package/new-ui/src/api/hooks/use-services.ts +0 -16
- package/new-ui/src/api/hooks/use-stats.ts +0 -27
- package/new-ui/src/api/hooks/use-tasks.ts +0 -89
- package/new-ui/src/api/hooks/use-workflows.ts +0 -109
- package/new-ui/src/api/types.ts +0 -549
- package/new-ui/src/app/App.tsx +0 -13
- package/new-ui/src/app/providers.tsx +0 -32
- package/new-ui/src/app/router.tsx +0 -52
- package/new-ui/src/components/layout/app-header.tsx +0 -47
- package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
- package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
- package/new-ui/src/components/layout/config-guard.tsx +0 -22
- package/new-ui/src/components/layout/root-layout.tsx +0 -40
- package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
- package/new-ui/src/components/shared/command-menu.tsx +0 -131
- package/new-ui/src/components/shared/data-grid.tsx +0 -141
- package/new-ui/src/components/shared/empty-state.tsx +0 -24
- package/new-ui/src/components/shared/error-boundary.tsx +0 -72
- package/new-ui/src/components/shared/json-viewer.tsx +0 -47
- package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
- package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
- package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
- package/new-ui/src/components/shared/stats-bar.tsx +0 -132
- package/new-ui/src/components/shared/status-badge.tsx +0 -131
- package/new-ui/src/components/shared/usage-summary.tsx +0 -179
- package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
- package/new-ui/src/components/ui/alert.tsx +0 -60
- package/new-ui/src/components/ui/avatar.tsx +0 -96
- package/new-ui/src/components/ui/badge.tsx +0 -46
- package/new-ui/src/components/ui/button.tsx +0 -62
- package/new-ui/src/components/ui/card.tsx +0 -75
- package/new-ui/src/components/ui/command.tsx +0 -160
- package/new-ui/src/components/ui/dialog.tsx +0 -143
- package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
- package/new-ui/src/components/ui/input.tsx +0 -21
- package/new-ui/src/components/ui/label.tsx +0 -19
- package/new-ui/src/components/ui/progress.tsx +0 -26
- package/new-ui/src/components/ui/scroll-area.tsx +0 -54
- package/new-ui/src/components/ui/select.tsx +0 -175
- package/new-ui/src/components/ui/separator.tsx +0 -28
- package/new-ui/src/components/ui/sheet.tsx +0 -132
- package/new-ui/src/components/ui/sidebar.tsx +0 -691
- package/new-ui/src/components/ui/skeleton.tsx +0 -13
- package/new-ui/src/components/ui/sonner.tsx +0 -35
- package/new-ui/src/components/ui/switch.tsx +0 -33
- package/new-ui/src/components/ui/table.tsx +0 -92
- package/new-ui/src/components/ui/tabs.tsx +0 -79
- package/new-ui/src/components/ui/textarea.tsx +0 -18
- package/new-ui/src/components/ui/tooltip.tsx +0 -51
- package/new-ui/src/components/workflows/action-node.tsx +0 -53
- package/new-ui/src/components/workflows/condition-node.tsx +0 -50
- package/new-ui/src/components/workflows/graph-utils.ts +0 -124
- package/new-ui/src/components/workflows/json-tree.tsx +0 -189
- package/new-ui/src/components/workflows/node-styles.ts +0 -10
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
- package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
- package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
- package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
- package/new-ui/src/hooks/use-config.ts +0 -203
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
- package/new-ui/src/hooks/use-mobile.ts +0 -19
- package/new-ui/src/hooks/use-theme.ts +0 -60
- package/new-ui/src/lib/config.ts +0 -188
- package/new-ui/src/lib/slugs.ts +0 -71
- package/new-ui/src/lib/utils.ts +0 -120
- package/new-ui/src/main.tsx +0 -11
- package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
- package/new-ui/src/pages/agents/page.tsx +0 -134
- package/new-ui/src/pages/chat/page.tsx +0 -674
- package/new-ui/src/pages/config/page.tsx +0 -1109
- package/new-ui/src/pages/dashboard/page.tsx +0 -454
- package/new-ui/src/pages/debug/page.tsx +0 -275
- package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
- package/new-ui/src/pages/epics/page.tsx +0 -321
- package/new-ui/src/pages/not-found/page.tsx +0 -18
- package/new-ui/src/pages/repos/page.tsx +0 -369
- package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
- package/new-ui/src/pages/schedules/page.tsx +0 -477
- package/new-ui/src/pages/services/page.tsx +0 -128
- package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
- package/new-ui/src/pages/tasks/page.tsx +0 -592
- package/new-ui/src/pages/usage/page.tsx +0 -195
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
- package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
- package/new-ui/src/pages/workflows/page.tsx +0 -266
- package/new-ui/src/styles/ag-grid.css +0 -36
- package/new-ui/src/styles/globals.css +0 -213
- package/new-ui/test-results/.last-run.json +0 -4
- package/new-ui/tsconfig.app.json +0 -34
- package/new-ui/tsconfig.json +0 -4
- package/new-ui/tsconfig.node.json +0 -26
- package/new-ui/vercel.json +0 -4
- package/new-ui/vite.config.ts +0 -28
- package/plugin/README.md +0 -1
- package/plugin/build-pi-skills.ts +0 -233
- package/plugin/hooks/hooks.json +0 -71
- package/prek.toml +0 -75
- package/pyproject.toml +0 -9
- package/scripts/check-db-boundary.sh +0 -60
- package/scripts/e2e-docker-provider.ts +0 -820
- package/scripts/e2e-io-schemas-test.ts +0 -807
- package/scripts/e2e-provider-test.ts +0 -220
- package/scripts/e2e-workflow-redesign.sh +0 -229
- package/scripts/e2e-workflow-test.sh +0 -285
- package/scripts/e2e-workflow-test.ts +0 -857
- package/scripts/generate-mcp-docs.ts +0 -415
- package/scripts/generate-openapi.ts +0 -26
- package/scripts/measure-tool-tokens.ts +0 -118
- package/scripts/x402-e2e-test.ts +0 -195
- package/scripts/x402-test-server.ts +0 -236
- package/scripts/x402-testnet-e2e.ts +0 -668
- package/slack-manifest.json +0 -88
- package/templates-ui/README.md +0 -46
- package/templates-ui/components.json +0 -17
- package/templates-ui/eslint.config.mjs +0 -18
- package/templates-ui/next.config.ts +0 -7
- package/templates-ui/package.json +0 -35
- package/templates-ui/pnpm-lock.yaml +0 -4571
- package/templates-ui/postcss.config.mjs +0 -7
- package/templates-ui/public/file.svg +0 -1
- package/templates-ui/public/globe.svg +0 -1
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +0 -1
- package/templates-ui/public/vercel.svg +0 -1
- package/templates-ui/public/window.svg +0 -1
- package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
- package/templates-ui/src/app/api/templates/route.ts +0 -18
- package/templates-ui/src/app/builder/page.tsx +0 -37
- package/templates-ui/src/app/globals.css +0 -94
- package/templates-ui/src/app/layout.tsx +0 -79
- package/templates-ui/src/app/page.tsx +0 -38
- package/templates-ui/src/app/robots.ts +0 -11
- package/templates-ui/src/app/sitemap.ts +0 -31
- package/templates-ui/src/components/compose-builder.tsx +0 -442
- package/templates-ui/src/components/compose-preview.tsx +0 -117
- package/templates-ui/src/components/file-preview.tsx +0 -77
- package/templates-ui/src/components/footer.tsx +0 -40
- package/templates-ui/src/components/header.tsx +0 -41
- package/templates-ui/src/components/template-card.tsx +0 -87
- package/templates-ui/src/components/template-detail.tsx +0 -125
- package/templates-ui/src/components/template-gallery.tsx +0 -263
- package/templates-ui/src/components/ui/badge.tsx +0 -36
- package/templates-ui/src/components/ui/button.tsx +0 -57
- package/templates-ui/src/components/ui/card.tsx +0 -76
- package/templates-ui/src/components/ui/separator.tsx +0 -31
- package/templates-ui/src/components/ui/tooltip.tsx +0 -32
- package/templates-ui/src/lib/compose-generator.ts +0 -241
- package/templates-ui/src/lib/templates.ts +0 -137
- package/templates-ui/src/lib/utils.ts +0 -6
- package/templates-ui/tsconfig.json +0 -34
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
- package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
- package/thoughts/shared/plans/.gitkeep +0 -0
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
- package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
- package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
- package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
- package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
- 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">·</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'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'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 “Payment
|
|
265
|
-
Required” 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'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'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'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 “Pixel Icons” 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 — 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'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's the part we didn'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't just build the feature — it wrote the blog
|
|
789
|
-
post you're reading. Every section was authored by agents who
|
|
790
|
-
were there when it happened. That'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
|
-
}
|