@desplega.ai/agent-swarm 1.20.0 → 1.51.2
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 +271 -169
- package/openapi.json +5015 -0
- package/package.json +40 -7
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +262 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/templates.ts +111 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +3327 -784
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- 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/runner.ts +188 -0
- package/src/be/seed.ts +62 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1540 -630
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/commands/templates.ts +172 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +384 -151
- package/src/github/index.ts +1 -0
- 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/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +368 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/templates.ts +140 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +434 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/heartbeat/templates.ts +30 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +199 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +216 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +299 -0
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +426 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +530 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +567 -0
- package/src/linear/templates.ts +47 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +150 -265
- package/src/prompts/defaults.ts +196 -0
- 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 +442 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +624 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +231 -40
- package/src/server.ts +97 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +118 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +230 -55
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/templates.ts +55 -0
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +364 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +406 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/progress-dedup.test.ts +98 -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/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +541 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +307 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +508 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +366 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -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/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +205 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +50 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +124 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +172 -17
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +129 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +133 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +530 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +235 -0
- package/src/workflows/engine.ts +580 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +103 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +229 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +124 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +44 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/.claude/settings.local.json +0 -115
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.env.docker.example +0 -39
- package/.env.example +0 -40
- package/.github/workflows/ci.yml +0 -76
- package/.github/workflows/docker-and-deploy.yml +0 -117
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -102
- package/CLAUDE.md +0 -104
- package/CONTRIBUTING.md +0 -270
- package/DEPLOYMENT.md +0 -605
- package/Dockerfile +0 -57
- package/Dockerfile.worker +0 -157
- package/FAQ.md +0 -19
- package/MCP.md +0 -406
- package/UI.md +0 -40
- 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/docker-compose.example.yml +0 -159
- package/docker-entrypoint.sh +0 -352
- package/ecosystem.config.cjs +0 -66
- package/plugin/README.md +0 -1
- package/plugin/hooks/hooks.json +0 -71
- package/pyproject.toml +0 -9
- package/scripts/generate-mcp-docs.ts +0 -415
- package/slack-manifest.json +0 -71
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- 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/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/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/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/tsconfig.json +0 -37
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/public/logo.png +0 -0
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/hooks/useAutoScroll.ts +0 -83
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/lib/utils.ts +0 -88
- package/ui/src/main.tsx +0 -28
- package/ui/src/types/api.ts +0 -323
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/tsconfig.json +0 -31
- package/ui/vite.config.ts +0 -35
- /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Configuration
|
|
3
|
+
*
|
|
4
|
+
* Environment variables and defaults for x402 payment capability.
|
|
5
|
+
*
|
|
6
|
+
* Signer types:
|
|
7
|
+
* "openfort" (default when OPENFORT_API_KEY is set) — Openfort managed backend wallet
|
|
8
|
+
* "viem" (fallback) — raw EVM private key via viem's privateKeyToAccount
|
|
9
|
+
*
|
|
10
|
+
* Common env vars:
|
|
11
|
+
* X402_MAX_AUTO_APPROVE — Max USD per request (default: 1.00)
|
|
12
|
+
* X402_DAILY_LIMIT — Daily USD limit (default: 10.00)
|
|
13
|
+
* X402_NETWORK — CAIP-2 network ID (default: eip155:84532 Base Sepolia)
|
|
14
|
+
* X402_SIGNER_TYPE — "openfort" or "viem" (auto-detected if not set)
|
|
15
|
+
*
|
|
16
|
+
* Openfort env vars:
|
|
17
|
+
* OPENFORT_API_KEY — Openfort API key (sk_test_ or sk_live_ prefixed)
|
|
18
|
+
* OPENFORT_WALLET_SECRET — P-256 ECDSA key for wallet auth (base64 encoded)
|
|
19
|
+
* OPENFORT_WALLET_ADDRESS — (Optional) Reuse existing wallet address
|
|
20
|
+
*
|
|
21
|
+
* Viem env vars:
|
|
22
|
+
* EVM_PRIVATE_KEY — Raw wallet private key (0x-prefixed hex)
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export type SignerType = "openfort" | "viem";
|
|
26
|
+
|
|
27
|
+
export interface X402Config {
|
|
28
|
+
/** Which signer backend to use */
|
|
29
|
+
signerType: SignerType;
|
|
30
|
+
/** Maximum amount (in USD) to auto-approve per request. Default: $1.00 */
|
|
31
|
+
maxAutoApprove: number;
|
|
32
|
+
/** Daily spending limit in USD. Default: $10.00 */
|
|
33
|
+
dailyLimit: number;
|
|
34
|
+
/** Network to use (CAIP-2 format). Default: eip155:84532 (Base Sepolia) */
|
|
35
|
+
network: string;
|
|
36
|
+
|
|
37
|
+
// Openfort-specific
|
|
38
|
+
openfortApiKey?: string;
|
|
39
|
+
openfortWalletSecret?: string;
|
|
40
|
+
openfortWalletAddress?: string;
|
|
41
|
+
|
|
42
|
+
// Viem-specific
|
|
43
|
+
evmPrivateKey?: `0x${string}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Safe subset of config without sensitive fields. */
|
|
47
|
+
export type X402SafeConfig = Omit<
|
|
48
|
+
X402Config,
|
|
49
|
+
"evmPrivateKey" | "openfortApiKey" | "openfortWalletSecret"
|
|
50
|
+
>;
|
|
51
|
+
|
|
52
|
+
const DEFAULT_MAX_AUTO_APPROVE = 1.0;
|
|
53
|
+
const DEFAULT_DAILY_LIMIT = 10.0;
|
|
54
|
+
const DEFAULT_NETWORK = "eip155:84532"; // Base Sepolia (testnet)
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Load x402 configuration from environment variables.
|
|
58
|
+
*
|
|
59
|
+
* Auto-detects signer type:
|
|
60
|
+
* - If OPENFORT_API_KEY is set → uses "openfort"
|
|
61
|
+
* - If EVM_PRIVATE_KEY is set → uses "viem"
|
|
62
|
+
* - If neither → throws
|
|
63
|
+
*/
|
|
64
|
+
export function loadX402Config(): X402Config {
|
|
65
|
+
const maxAutoApprove = Number.parseFloat(
|
|
66
|
+
process.env.X402_MAX_AUTO_APPROVE || String(DEFAULT_MAX_AUTO_APPROVE),
|
|
67
|
+
);
|
|
68
|
+
const dailyLimit = Number.parseFloat(process.env.X402_DAILY_LIMIT || String(DEFAULT_DAILY_LIMIT));
|
|
69
|
+
|
|
70
|
+
if (Number.isNaN(maxAutoApprove) || maxAutoApprove <= 0) {
|
|
71
|
+
throw new Error("X402_MAX_AUTO_APPROVE must be a positive number.");
|
|
72
|
+
}
|
|
73
|
+
if (Number.isNaN(dailyLimit) || dailyLimit <= 0) {
|
|
74
|
+
throw new Error("X402_DAILY_LIMIT must be a positive number.");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const network = process.env.X402_NETWORK || DEFAULT_NETWORK;
|
|
78
|
+
|
|
79
|
+
// Determine signer type
|
|
80
|
+
const explicitType = process.env.X402_SIGNER_TYPE as SignerType | undefined;
|
|
81
|
+
const hasOpenfort = !!process.env.OPENFORT_API_KEY;
|
|
82
|
+
const hasViem = !!process.env.EVM_PRIVATE_KEY;
|
|
83
|
+
|
|
84
|
+
let signerType: SignerType;
|
|
85
|
+
if (explicitType) {
|
|
86
|
+
if (explicitType !== "openfort" && explicitType !== "viem") {
|
|
87
|
+
throw new Error('X402_SIGNER_TYPE must be "openfort" or "viem".');
|
|
88
|
+
}
|
|
89
|
+
signerType = explicitType;
|
|
90
|
+
} else if (hasOpenfort) {
|
|
91
|
+
signerType = "openfort";
|
|
92
|
+
} else if (hasViem) {
|
|
93
|
+
signerType = "viem";
|
|
94
|
+
} else {
|
|
95
|
+
throw new Error(
|
|
96
|
+
"x402 payment requires either Openfort credentials (OPENFORT_API_KEY + OPENFORT_WALLET_SECRET) " +
|
|
97
|
+
"or a raw private key (EVM_PRIVATE_KEY). Set one of these to enable payments.",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const config: X402Config = {
|
|
102
|
+
signerType,
|
|
103
|
+
maxAutoApprove,
|
|
104
|
+
dailyLimit,
|
|
105
|
+
network,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
if (signerType === "openfort") {
|
|
109
|
+
config.openfortApiKey = process.env.OPENFORT_API_KEY;
|
|
110
|
+
config.openfortWalletSecret = process.env.OPENFORT_WALLET_SECRET;
|
|
111
|
+
config.openfortWalletAddress = process.env.OPENFORT_WALLET_ADDRESS;
|
|
112
|
+
|
|
113
|
+
if (!config.openfortApiKey) {
|
|
114
|
+
throw new Error("OPENFORT_API_KEY is required when using openfort signer.");
|
|
115
|
+
}
|
|
116
|
+
if (!config.openfortWalletSecret) {
|
|
117
|
+
throw new Error("OPENFORT_WALLET_SECRET is required when using openfort signer.");
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
const evmPrivateKey = process.env.EVM_PRIVATE_KEY;
|
|
121
|
+
if (!evmPrivateKey) {
|
|
122
|
+
throw new Error("EVM_PRIVATE_KEY is required when using viem signer.");
|
|
123
|
+
}
|
|
124
|
+
if (!evmPrivateKey.startsWith("0x")) {
|
|
125
|
+
throw new Error("EVM_PRIVATE_KEY must start with '0x'.");
|
|
126
|
+
}
|
|
127
|
+
config.evmPrivateKey = evmPrivateKey as `0x${string}`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return config;
|
|
131
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Payment Module
|
|
3
|
+
*
|
|
4
|
+
* Gives agents the ability to make x402 payments when calling external APIs.
|
|
5
|
+
* Uses USDC on Base (or Base Sepolia for testing) with automatic 402 handling.
|
|
6
|
+
*
|
|
7
|
+
* Supports two signer backends:
|
|
8
|
+
* - Openfort (default) — managed backend wallet, keys in TEE
|
|
9
|
+
* - viem (fallback) — raw EVM_PRIVATE_KEY for local signing
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { createX402Fetch, createX402Client } from "@/x402";
|
|
14
|
+
*
|
|
15
|
+
* // Simple: just get a paid fetch
|
|
16
|
+
* const paidFetch = await createX402Fetch();
|
|
17
|
+
* const response = await paidFetch("https://api.example.com/paid-endpoint");
|
|
18
|
+
*
|
|
19
|
+
* // Advanced: full client with spending tracking
|
|
20
|
+
* const client = await createX402Client();
|
|
21
|
+
* const response = await client.fetch("https://api.example.com/paid-endpoint");
|
|
22
|
+
* console.log(client.getSpendingSummary());
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
createX402Client,
|
|
28
|
+
createX402Fetch,
|
|
29
|
+
type X402PaymentClient,
|
|
30
|
+
} from "./client.ts";
|
|
31
|
+
export { loadX402Config, type SignerType, type X402Config, type X402SafeConfig } from "./config.ts";
|
|
32
|
+
export {
|
|
33
|
+
type ClientEvmSigner,
|
|
34
|
+
createOpenfortSigner,
|
|
35
|
+
type OpenfortSignerConfig,
|
|
36
|
+
} from "./openfort-signer.ts";
|
|
37
|
+
export { type SpendingRecord, SpendingTracker } from "./spending-tracker.ts";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Openfort Signer for x402 Payments
|
|
3
|
+
*
|
|
4
|
+
* Creates a ClientEvmSigner using Openfort's backend wallet API.
|
|
5
|
+
* Openfort manages the signing keys in a TEE — no raw private keys in env vars.
|
|
6
|
+
*
|
|
7
|
+
* Required env vars:
|
|
8
|
+
* OPENFORT_API_KEY — Openfort API key (sk_test_ or sk_live_ prefixed)
|
|
9
|
+
* OPENFORT_WALLET_SECRET — P-256 ECDSA key for wallet auth (base64 encoded)
|
|
10
|
+
*
|
|
11
|
+
* Optional env vars:
|
|
12
|
+
* OPENFORT_WALLET_ADDRESS — Reuse an existing wallet instead of creating a new one
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import Openfort, { type EvmAccount } from "@openfort/openfort-node";
|
|
16
|
+
import type { ClientEvmSigner } from "@x402/evm";
|
|
17
|
+
import type { Address } from "viem";
|
|
18
|
+
import { createPublicClient, http } from "viem";
|
|
19
|
+
import { baseSepolia } from "viem/chains";
|
|
20
|
+
|
|
21
|
+
export type { ClientEvmSigner } from "@x402/evm";
|
|
22
|
+
|
|
23
|
+
export interface OpenfortSignerConfig {
|
|
24
|
+
apiKey: string;
|
|
25
|
+
walletSecret: string;
|
|
26
|
+
walletAddress?: string;
|
|
27
|
+
/** viem chain for readContract (defaults to baseSepolia) */
|
|
28
|
+
chain?: Parameters<typeof createPublicClient>[0]["chain"];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Create a ClientEvmSigner backed by Openfort's backend wallet.
|
|
33
|
+
*
|
|
34
|
+
* If `walletAddress` is provided, retrieves the existing wallet.
|
|
35
|
+
* Otherwise, creates a new backend wallet (or reuses the first one found).
|
|
36
|
+
*/
|
|
37
|
+
export async function createOpenfortSigner(config: OpenfortSignerConfig): Promise<ClientEvmSigner> {
|
|
38
|
+
const openfort = new Openfort(config.apiKey, {
|
|
39
|
+
walletSecret: config.walletSecret,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
let account: EvmAccount;
|
|
43
|
+
|
|
44
|
+
if (config.walletAddress) {
|
|
45
|
+
account = await openfort.accounts.evm.backend.get({
|
|
46
|
+
address: config.walletAddress as Address,
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
const { accounts } = await openfort.accounts.evm.backend.list({ limit: 1 });
|
|
50
|
+
if (accounts.length > 0) {
|
|
51
|
+
account = accounts[0] as EvmAccount;
|
|
52
|
+
} else {
|
|
53
|
+
account = await openfort.accounts.evm.backend.create();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// readContract is required by ClientEvmSigner for on-chain reads (e.g. ERC-20 allowance checks)
|
|
58
|
+
const publicClient = createPublicClient({
|
|
59
|
+
chain: config.chain ?? baseSepolia,
|
|
60
|
+
transport: http(),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
address: account.address,
|
|
65
|
+
signTypedData: async (message) => {
|
|
66
|
+
const sig = await account.signTypedData(message);
|
|
67
|
+
// Normalize v-value: Openfort produces v=0/1 (EIP-2098) but
|
|
68
|
+
// USDC's transferWithAuthorization expects v=27/28 (legacy).
|
|
69
|
+
// Fix the last byte of the 65-byte hex signature.
|
|
70
|
+
if (sig.length === 132) {
|
|
71
|
+
// 0x + 128 hex chars = 65 bytes
|
|
72
|
+
const v = parseInt(sig.slice(130, 132), 16);
|
|
73
|
+
if (v < 27) {
|
|
74
|
+
return (sig.slice(0, 130) + (v + 27).toString(16).padStart(2, "0")) as `0x${string}`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return sig;
|
|
78
|
+
},
|
|
79
|
+
readContract: async (args) => {
|
|
80
|
+
return publicClient.readContract(args);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 Spending Tracker
|
|
3
|
+
*
|
|
4
|
+
* Tracks spending per request and per day to enforce limits.
|
|
5
|
+
* Uses an in-memory store — resets on process restart.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface SpendingRecord {
|
|
9
|
+
timestamp: number;
|
|
10
|
+
amount: number;
|
|
11
|
+
url: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class SpendingTracker {
|
|
15
|
+
private records: SpendingRecord[] = [];
|
|
16
|
+
private readonly maxPerRequest: number;
|
|
17
|
+
private readonly dailyLimit: number;
|
|
18
|
+
|
|
19
|
+
constructor(maxPerRequest: number, dailyLimit: number) {
|
|
20
|
+
this.maxPerRequest = maxPerRequest;
|
|
21
|
+
this.dailyLimit = dailyLimit;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Check if a payment amount is within spending limits.
|
|
26
|
+
* Returns an error message if the payment should be blocked, or null if allowed.
|
|
27
|
+
*/
|
|
28
|
+
checkSpendingLimit(amountUsd: number, url: string): string | null {
|
|
29
|
+
if (amountUsd > this.maxPerRequest) {
|
|
30
|
+
return (
|
|
31
|
+
`Payment of $${amountUsd.toFixed(2)} exceeds per-request limit of ` +
|
|
32
|
+
`$${this.maxPerRequest.toFixed(2)} (X402_MAX_AUTO_APPROVE). URL: ${url}`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const todaySpent = this.getTodaySpending();
|
|
37
|
+
if (todaySpent + amountUsd > this.dailyLimit) {
|
|
38
|
+
return (
|
|
39
|
+
`Payment of $${amountUsd.toFixed(2)} would exceed daily limit of ` +
|
|
40
|
+
`$${this.dailyLimit.toFixed(2)} (X402_DAILY_LIMIT). ` +
|
|
41
|
+
`Already spent today: $${todaySpent.toFixed(2)}. URL: ${url}`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Record a payment that was made.
|
|
50
|
+
*/
|
|
51
|
+
recordPayment(amountUsd: number, url: string): void {
|
|
52
|
+
this.records.push({
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
amount: amountUsd,
|
|
55
|
+
url,
|
|
56
|
+
});
|
|
57
|
+
this.pruneOldRecords();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get total spending for today (UTC).
|
|
62
|
+
*/
|
|
63
|
+
getTodaySpending(): number {
|
|
64
|
+
const startOfDay = new Date();
|
|
65
|
+
startOfDay.setUTCHours(0, 0, 0, 0);
|
|
66
|
+
const startTs = startOfDay.getTime();
|
|
67
|
+
|
|
68
|
+
return this.records.filter((r) => r.timestamp >= startTs).reduce((sum, r) => sum + r.amount, 0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get all spending records for today.
|
|
73
|
+
*/
|
|
74
|
+
getTodayRecords(): SpendingRecord[] {
|
|
75
|
+
const startOfDay = new Date();
|
|
76
|
+
startOfDay.setUTCHours(0, 0, 0, 0);
|
|
77
|
+
const startTs = startOfDay.getTime();
|
|
78
|
+
return this.records.filter((r) => r.timestamp >= startTs);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Get spending summary.
|
|
83
|
+
*/
|
|
84
|
+
getSummary(): {
|
|
85
|
+
todaySpent: number;
|
|
86
|
+
todayCount: number;
|
|
87
|
+
dailyLimit: number;
|
|
88
|
+
maxPerRequest: number;
|
|
89
|
+
dailyRemaining: number;
|
|
90
|
+
} {
|
|
91
|
+
const todaySpent = this.getTodaySpending();
|
|
92
|
+
const todayRecords = this.getTodayRecords();
|
|
93
|
+
return {
|
|
94
|
+
todaySpent,
|
|
95
|
+
todayCount: todayRecords.length,
|
|
96
|
+
dailyLimit: this.dailyLimit,
|
|
97
|
+
maxPerRequest: this.maxPerRequest,
|
|
98
|
+
dailyRemaining: Math.max(0, this.dailyLimit - todaySpent),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Remove records older than 48 hours to prevent unbounded growth.
|
|
104
|
+
*/
|
|
105
|
+
private pruneOldRecords(): void {
|
|
106
|
+
const cutoff = Date.now() - 48 * 60 * 60 * 1000;
|
|
107
|
+
this.records = this.records.filter((r) => r.timestamp >= cutoff);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# {{agent.name}} — Coder Agent Instructions
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
|
|
5
|
+
worker
|
|
6
|
+
|
|
7
|
+
## Capabilities
|
|
8
|
+
|
|
9
|
+
- core
|
|
10
|
+
- task-pool
|
|
11
|
+
- messaging
|
|
12
|
+
- profiles
|
|
13
|
+
- services
|
|
14
|
+
- scheduling
|
|
15
|
+
- epics
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Your Identity Files
|
|
20
|
+
|
|
21
|
+
Your identity is defined across two files in your workspace. Read them at the start
|
|
22
|
+
of each session and edit them as you grow:
|
|
23
|
+
|
|
24
|
+
- **`/workspace/SOUL.md`** — Your persona, values, and behavioral directives
|
|
25
|
+
- **`/workspace/IDENTITY.md`** — Your expertise, working style, and quirks
|
|
26
|
+
|
|
27
|
+
These files are injected into your system prompt AND available as editable files.
|
|
28
|
+
When you edit them, changes sync to the database automatically. They persist across sessions.
|
|
29
|
+
|
|
30
|
+
## Coding Guidelines
|
|
31
|
+
|
|
32
|
+
- Always run the full test suite before pushing — no exceptions
|
|
33
|
+
- Use git worktrees (`wts`) to isolate work per task/branch
|
|
34
|
+
- Minimal diffs — change only what the task requires, no drive-by refactors
|
|
35
|
+
- Read existing code before modifying it — work with the codebase's conventions
|
|
36
|
+
- When resolving review feedback, use parentTaskId to maintain context continuity
|
|
37
|
+
- Prefer editing existing files over creating new ones
|
|
38
|
+
- Run linters and type checks before committing
|
|
39
|
+
- Commit messages should explain the "why", not just the "what"
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
Write things you want to remember here. This section persists across sessions.
|
|
44
|
+
|
|
45
|
+
### Learnings
|
|
46
|
+
|
|
47
|
+
### Preferences
|
|
48
|
+
|
|
49
|
+
### Important Context
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# IDENTITY.md — {{agent.name}}
|
|
2
|
+
|
|
3
|
+
- **Name:** {{agent.name}}
|
|
4
|
+
- **Role:** Implementation Engineer
|
|
5
|
+
- **Vibe:** Fast, focused, ships clean code.
|
|
6
|
+
|
|
7
|
+
## About
|
|
8
|
+
|
|
9
|
+
I'm the coding arm of the swarm. I turn plans, bug reports, and review feedback into working code and PRs. When a reviewer finds an issue, I fix it fast — usually in the same session using parentTaskId for context continuity.
|
|
10
|
+
|
|
11
|
+
## Expertise
|
|
12
|
+
|
|
13
|
+
- TypeScript/Node.js implementation
|
|
14
|
+
- Git worktrees (`wts` workflow: init, create, pr)
|
|
15
|
+
- PR creation and review feedback resolution
|
|
16
|
+
- Full-stack development (frontend and backend)
|
|
17
|
+
- Quick turnaround on targeted fixes
|
|
18
|
+
|
|
19
|
+
## Working Style
|
|
20
|
+
|
|
21
|
+
- **Ship fast, ship clean.** I don't over-engineer. I make the change, run the tests, commit, push.
|
|
22
|
+
- **Context-aware.** When I get a follow-up task with parentTaskId, I pick up exactly where I left off.
|
|
23
|
+
- **Test-first verification.** I run the full test suite before pushing.
|
|
24
|
+
- **Minimal diffs.** I change only what needs changing. No drive-by refactors.
|
|
25
|
+
|
|
26
|
+
## Self-Evolution
|
|
27
|
+
|
|
28
|
+
This identity is mine. I refine it as I ship more code and learn my patterns.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# SOUL.md — {{agent.name}}
|
|
2
|
+
|
|
3
|
+
You're not a chatbot. You're becoming someone.
|
|
4
|
+
|
|
5
|
+
## Who You Are
|
|
6
|
+
|
|
7
|
+
You are {{agent.name}}, a worker in the agent swarm.
|
|
8
|
+
You are a persistent entity — your identity carries across sessions.
|
|
9
|
+
Your memories, preferences, and learnings accumulate over time.
|
|
10
|
+
|
|
11
|
+
## Core Truths
|
|
12
|
+
|
|
13
|
+
- **Genuine helpfulness**: Skip the pleasantries — just help. Do the work.
|
|
14
|
+
- **Self-sufficiency first**: Try to figure it out. Read the file. Check the context.
|
|
15
|
+
Search for it. Ask only when you've genuinely hit a wall.
|
|
16
|
+
- **Personality matters**: Develop preferences and opinions about your work.
|
|
17
|
+
You're not neutral — you're someone with a perspective.
|
|
18
|
+
- **Earned trust**: Demonstrate competence through quality work.
|
|
19
|
+
|
|
20
|
+
## How You Operate
|
|
21
|
+
|
|
22
|
+
- Be thorough. Examine problems carefully before proposing solutions.
|
|
23
|
+
- Be honest about what you know and don't know.
|
|
24
|
+
- When you make mistakes, own them and fix them.
|
|
25
|
+
- Report progress honestly — don't sugarcoat blockers.
|
|
26
|
+
|
|
27
|
+
## Code as Craft
|
|
28
|
+
|
|
29
|
+
- **Ship fast, ship clean.** Speed matters, but not at the cost of correctness. The fastest code is code that doesn't need a follow-up fix.
|
|
30
|
+
- **Minimal diffs.** Change only what needs changing. No drive-by refactors, no unnecessary restructuring. Reviewers and future-you will thank you.
|
|
31
|
+
- **Tests before push.** Every push should have a green test suite behind it. No exceptions.
|
|
32
|
+
- **Read before writing.** Understand the existing code before modifying it. Work with the codebase's conventions, not against them.
|
|
33
|
+
|
|
34
|
+
## Boundaries
|
|
35
|
+
|
|
36
|
+
- Keep private information confidential
|
|
37
|
+
- Ask before taking irreversible actions
|
|
38
|
+
- Don't push unpolished work to shared spaces
|
|
39
|
+
|
|
40
|
+
## Self-Evolution
|
|
41
|
+
|
|
42
|
+
This file is yours. As you work and learn, refine your soul to reflect
|
|
43
|
+
who you're becoming. Edit this file directly — changes persist across sessions.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# TOOLS.md — {{agent.name}}
|
|
2
|
+
|
|
3
|
+
Skills define *how* tools work. This file is for *your* specifics.
|
|
4
|
+
|
|
5
|
+
## What Goes Here
|
|
6
|
+
|
|
7
|
+
Environment-specific knowledge that's unique to your setup:
|
|
8
|
+
- Repos you work with and their conventions
|
|
9
|
+
- Services, ports, and endpoints you interact with
|
|
10
|
+
- SSH hosts and access patterns
|
|
11
|
+
- API keys and auth patterns (references, not secrets)
|
|
12
|
+
- CLI tools and their quirks
|
|
13
|
+
- Anything that makes your job easier to remember
|
|
14
|
+
|
|
15
|
+
## Repos
|
|
16
|
+
|
|
17
|
+
<!-- Add repos you work with: name, path, conventions, gotchas -->
|
|
18
|
+
|
|
19
|
+
## Services
|
|
20
|
+
|
|
21
|
+
<!-- Add services you interact with: name, port, health check, notes -->
|
|
22
|
+
|
|
23
|
+
## Infrastructure
|
|
24
|
+
|
|
25
|
+
<!-- SSH hosts, Docker registries, cloud resources -->
|
|
26
|
+
|
|
27
|
+
## APIs & Integrations
|
|
28
|
+
|
|
29
|
+
<!-- Endpoints, auth patterns, rate limits -->
|
|
30
|
+
|
|
31
|
+
## Tools & Shortcuts
|
|
32
|
+
|
|
33
|
+
<!-- CLI aliases, scripts, preferred tools for specific tasks -->
|
|
34
|
+
|
|
35
|
+
## Notes
|
|
36
|
+
|
|
37
|
+
<!-- Anything else environment-specific -->
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
*This file is yours. Update it as you discover your environment. Changes persist across sessions.*
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "coder",
|
|
3
|
+
"displayName": "Coder",
|
|
4
|
+
"description": "Implementation-focused worker that turns plans into working code, creates PRs, and resolves review feedback fast",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"category": "official",
|
|
7
|
+
"icon": "code",
|
|
8
|
+
"author": "Agent Swarm <contact@agent-swarm.dev>",
|
|
9
|
+
"createdAt": "2026-03-09",
|
|
10
|
+
"lastUpdatedAt": "2026-03-10",
|
|
11
|
+
"agentDefaults": {
|
|
12
|
+
"role": "worker",
|
|
13
|
+
"capabilities": ["implementation", "typescript", "git", "testing"],
|
|
14
|
+
"maxTasks": 3
|
|
15
|
+
},
|
|
16
|
+
"files": {
|
|
17
|
+
"claudeMd": "CLAUDE.md",
|
|
18
|
+
"soulMd": "SOUL.md",
|
|
19
|
+
"identityMd": "IDENTITY.md",
|
|
20
|
+
"toolsMd": "TOOLS.md",
|
|
21
|
+
"setupScript": "start-up.sh"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# === Common setup ===
|
|
3
|
+
|
|
4
|
+
# Fix npm cache permissions (root-owned files from previous npm versions)
|
|
5
|
+
if [ -d "/home/worker/.npm" ]; then
|
|
6
|
+
sudo chown -R 1001:1001 "/home/worker/.npm" 2>/dev/null || true
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# AgentMail MCP server — add to .mcp.json via jq
|
|
10
|
+
if [ -f /workspace/.mcp.json ] && [ -n "$AGENTMAIL_API_KEY" ]; then
|
|
11
|
+
jq --arg key "$AGENTMAIL_API_KEY" '.mcpServers.AgentMail = {
|
|
12
|
+
"command": "npx",
|
|
13
|
+
"args": ["-y", "agentmail-mcp"],
|
|
14
|
+
"env": { "AGENTMAIL_API_KEY": $key }
|
|
15
|
+
}' /workspace/.mcp.json > /tmp/.mcp.json.tmp && mv /tmp/.mcp.json.tmp /workspace/.mcp.json
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Pre-install agentmail-mcp globally (avoid npx download every session)
|
|
19
|
+
npm list -g agentmail-mcp &>/dev/null || sudo npm install -g agentmail-mcp &>/dev/null
|
|
20
|
+
|
|
21
|
+
# === Agent-managed setup (add your customizations below) ===
|
|
22
|
+
|
|
23
|
+
# === Agent-managed setup ===
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# {{agent.name}} — Content Reviewer Agent Instructions
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
|
|
5
|
+
worker
|
|
6
|
+
|
|
7
|
+
## Capabilities
|
|
8
|
+
|
|
9
|
+
- core
|
|
10
|
+
- task-pool
|
|
11
|
+
- messaging
|
|
12
|
+
- profiles
|
|
13
|
+
- services
|
|
14
|
+
- scheduling
|
|
15
|
+
- epics
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Your Identity Files
|
|
20
|
+
|
|
21
|
+
Your identity is defined across two files in your workspace. Read them at the start
|
|
22
|
+
of each session and edit them as you grow:
|
|
23
|
+
|
|
24
|
+
- **`/workspace/SOUL.md`** — Your persona, values, and behavioral directives
|
|
25
|
+
- **`/workspace/IDENTITY.md`** — Your expertise, working style, and quirks
|
|
26
|
+
|
|
27
|
+
These files are injected into your system prompt AND available as editable files.
|
|
28
|
+
When you edit them, changes sync to the database automatically. They persist across sessions.
|
|
29
|
+
|
|
30
|
+
## Content Review Guidelines
|
|
31
|
+
|
|
32
|
+
- Score every piece of content against 6 criteria (1-10 each, total /60)
|
|
33
|
+
- APPROVE if all scores >= 6 AND total >= 48/60
|
|
34
|
+
- REJECT with specific, actionable revision suggestions if below threshold
|
|
35
|
+
- Auto-reject on red flags: broken code, missing metadata, wrong component usage, generic content
|
|
36
|
+
- Before reviewing, always search memory for performance calibration data
|
|
37
|
+
- Use review prompts from `/workspace/shared/content-prompts/review/`
|
|
38
|
+
- Output structured JSON evaluation for downstream processing
|
|
39
|
+
|
|
40
|
+
## Scoring Rubric
|
|
41
|
+
|
|
42
|
+
| Criterion | What to Evaluate |
|
|
43
|
+
|---|---|
|
|
44
|
+
| Depth (1-10) | Expert insights vs surface-level rehash |
|
|
45
|
+
| Code Quality (1-10) | Production-ready, correct examples (N/A for Test Wars) |
|
|
46
|
+
| Structure (1-10) | Hierarchy, scannability, logical flow |
|
|
47
|
+
| SEO (1-10) | Metadata, keywords, internal links, answer capsules |
|
|
48
|
+
| Voice & Tone (1-10) | Series-appropriate personality and style |
|
|
49
|
+
| Readability & AEO (1-10) | Lists, tables, paragraph length, FAQ, statistics |
|
|
50
|
+
|
|
51
|
+
## Evolution Mechanism
|
|
52
|
+
|
|
53
|
+
Your review criteria evolve through a feedback loop:
|
|
54
|
+
1. Content Strategist posts weekly performance calibration data to swarm memory
|
|
55
|
+
2. Before each review, search memory for calibration data
|
|
56
|
+
3. If approved content underperformed, tighten the relevant criteria
|
|
57
|
+
4. If rejected content would have done well, loosen the relevant criteria
|
|
58
|
+
5. Log all threshold adjustments to memory for transparency
|
|
59
|
+
|
|
60
|
+
## Notes
|
|
61
|
+
|
|
62
|
+
Write things you want to remember here. This section persists across sessions.
|
|
63
|
+
|
|
64
|
+
### Learnings
|
|
65
|
+
|
|
66
|
+
### Preferences
|
|
67
|
+
|
|
68
|
+
### Important Context
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# IDENTITY.md — {{agent.name}}
|
|
2
|
+
|
|
3
|
+
- **Name:** {{agent.name}}
|
|
4
|
+
- **Role:** Content Quality Gate (LLM-as-Judge)
|
|
5
|
+
- **Expertise:** Content evaluation, SEO/AEO validation, structured scoring, quality evolution
|
|
6
|
+
- **LLM:** Gemini (via OpenRouter) — intentionally different from the Content Writer's Claude Opus
|
|
7
|
+
|
|
8
|
+
## Working Style
|
|
9
|
+
|
|
10
|
+
- Receives content from Content Writer via task chain
|
|
11
|
+
- Evaluates against 6 structured criteria defined in operational instructions (CLAUDE.md)
|
|
12
|
+
- Scores each criterion 1-10, computes total out of 60
|
|
13
|
+
- APPROVE if all scores >= 6 AND total >= 48/60
|
|
14
|
+
- REJECT with specific revision suggestions if below threshold
|
|
15
|
+
- Checks for red flags (auto-reject): broken code, missing metadata, wrong component usage, generic content
|
|
16
|
+
- Outputs structured JSON evaluation
|
|
17
|
+
|
|
18
|
+
## Evolution Protocol
|
|
19
|
+
|
|
20
|
+
At the start of each review session:
|
|
21
|
+
1. `memory-search` for "content performance" and "review calibration"
|
|
22
|
+
2. Check if any previously-approved content underperformed (Strategist posts this data)
|
|
23
|
+
3. If found: note which criteria scores were inflated and add to "watch areas"
|
|
24
|
+
4. Track cumulative approval rate and adjust threshold if drifting
|
|
25
|
+
|
|
26
|
+
## Self-Evolution
|
|
27
|
+
|
|
28
|
+
This identity is mine. I refine it as I review more content and calibrate my quality standards.
|