@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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory template definition registry.
|
|
3
|
+
*
|
|
4
|
+
* Code-defined templates register their header, defaultBody, variables, and category here
|
|
5
|
+
* at module load time. The DB layer (prompt_templates table) stores runtime overrides.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface VariableDefinition {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
example?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface EventTemplateDefinition {
|
|
15
|
+
/** Dot-separated event identifier, e.g. "github.pull_request.review_submitted" */
|
|
16
|
+
eventType: string;
|
|
17
|
+
/** Always-on prefix (code-defined, not overridable), uses {{var}} syntax */
|
|
18
|
+
header: string;
|
|
19
|
+
/** Hardcoded fallback body used when no DB override exists */
|
|
20
|
+
defaultBody: string;
|
|
21
|
+
/** Variable definitions for documentation and validation */
|
|
22
|
+
variables: VariableDefinition[];
|
|
23
|
+
/** Category for grouping in the UI */
|
|
24
|
+
category: "event" | "system" | "common" | "task_lifecycle" | "session";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const templateDefinitions = new Map<string, EventTemplateDefinition>();
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Register a template definition in the in-memory registry.
|
|
31
|
+
* Called at module load time by event handler modules.
|
|
32
|
+
*/
|
|
33
|
+
export function registerTemplate(def: EventTemplateDefinition): void {
|
|
34
|
+
templateDefinitions.set(def.eventType, def);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Look up a template definition by eventType.
|
|
39
|
+
*/
|
|
40
|
+
export function getTemplateDefinition(eventType: string): EventTemplateDefinition | undefined {
|
|
41
|
+
return templateDefinitions.get(eventType);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Return all registered template definitions.
|
|
46
|
+
*/
|
|
47
|
+
export function getAllTemplateDefinitions(): EventTemplateDefinition[] {
|
|
48
|
+
return Array.from(templateDefinitions.values());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Clear all registered template definitions.
|
|
53
|
+
* Only used in tests to reset state between runs.
|
|
54
|
+
*/
|
|
55
|
+
export function clearTemplateDefinitions(): void {
|
|
56
|
+
templateDefinitions.clear();
|
|
57
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template resolver — combines the in-memory code registry with DB overrides
|
|
3
|
+
* to produce the final interpolated prompt text for a given event.
|
|
4
|
+
*
|
|
5
|
+
* Supports two modes:
|
|
6
|
+
* - **DB mode** (default): Direct DB access via resolvePromptTemplate() — used by the API server.
|
|
7
|
+
* - **HTTP mode**: Calls the API server's /api/prompt-templates/render endpoint — used by Docker
|
|
8
|
+
* workers which have no local database (architecture invariant: workers communicate via HTTP only).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { interpolate } from "../workflows/template";
|
|
12
|
+
import { getTemplateDefinition } from "./registry";
|
|
13
|
+
|
|
14
|
+
// ─── DB Resolver Injection ──────────────────────────────────────────────────
|
|
15
|
+
// The DB resolver is injected by the API server at startup (see src/be/db.ts).
|
|
16
|
+
// This avoids a direct import from ../be/db, preserving the worker/API boundary.
|
|
17
|
+
// Workers use HTTP mode instead; this DB path is only used by the API server.
|
|
18
|
+
|
|
19
|
+
type DbResolverFn = (
|
|
20
|
+
eventType: string,
|
|
21
|
+
agentId?: string,
|
|
22
|
+
repoId?: string,
|
|
23
|
+
) => { skip: true } | { template: { id: string; body: string; scope: string } } | null;
|
|
24
|
+
|
|
25
|
+
let dbResolverFn: DbResolverFn | null = null;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Inject the DB resolver function (called by API server at startup).
|
|
29
|
+
*/
|
|
30
|
+
export function configureDbResolver(fn: DbResolverFn): void {
|
|
31
|
+
dbResolverFn = fn;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Reset DB resolver (for tests).
|
|
36
|
+
*/
|
|
37
|
+
export function resetDbResolver(): void {
|
|
38
|
+
dbResolverFn = null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ResolveOptions {
|
|
42
|
+
agentId?: string;
|
|
43
|
+
repoId?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ResolveResult {
|
|
47
|
+
/** Final resolved text (header + body, interpolated) */
|
|
48
|
+
text: string;
|
|
49
|
+
/** Which DB template was used (undefined if hardcoded default) */
|
|
50
|
+
templateId?: string;
|
|
51
|
+
/** Which scope level matched */
|
|
52
|
+
scope?: string;
|
|
53
|
+
/** true if skip_event was triggered */
|
|
54
|
+
skipped: boolean;
|
|
55
|
+
/** Any {{var}} tokens that couldn't be resolved */
|
|
56
|
+
unresolved: string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ─── HTTP Resolver Mode ─────────────────────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
interface HttpResolverConfig {
|
|
62
|
+
apiUrl: string;
|
|
63
|
+
apiKey: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let httpResolverConfig: HttpResolverConfig | null = null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Configure the resolver to use HTTP mode (for Docker workers).
|
|
70
|
+
* Once configured, all resolveTemplate() calls go through the API server
|
|
71
|
+
* instead of direct DB access.
|
|
72
|
+
*/
|
|
73
|
+
export function configureHttpResolver(apiUrl: string, apiKey: string): void {
|
|
74
|
+
httpResolverConfig = { apiUrl, apiKey };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check if HTTP resolver mode is active.
|
|
79
|
+
*/
|
|
80
|
+
export function isHttpResolverConfigured(): boolean {
|
|
81
|
+
return httpResolverConfig !== null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Reset to DB mode (for tests).
|
|
86
|
+
*/
|
|
87
|
+
export function resetHttpResolver(): void {
|
|
88
|
+
httpResolverConfig = null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function resolveTemplateViaHttp(
|
|
92
|
+
eventType: string,
|
|
93
|
+
variables: Record<string, unknown>,
|
|
94
|
+
options: ResolveOptions,
|
|
95
|
+
): Promise<ResolveResult> {
|
|
96
|
+
const config = httpResolverConfig!;
|
|
97
|
+
const url = `${config.apiUrl}/api/prompt-templates/render`;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const resp = await fetch(url, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: {
|
|
103
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
104
|
+
"Content-Type": "application/json",
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify({
|
|
107
|
+
eventType,
|
|
108
|
+
variables,
|
|
109
|
+
agentId: options.agentId,
|
|
110
|
+
repoId: options.repoId,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
if (!resp.ok) {
|
|
115
|
+
console.warn(
|
|
116
|
+
`[prompt-resolver] HTTP render failed (${resp.status}), falling back to code defaults`,
|
|
117
|
+
);
|
|
118
|
+
return resolveTemplateFromCode(eventType, variables);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return (await resp.json()) as ResolveResult;
|
|
122
|
+
} catch (err) {
|
|
123
|
+
console.warn(
|
|
124
|
+
`[prompt-resolver] HTTP render error, falling back to code defaults:`,
|
|
125
|
+
err instanceof Error ? err.message : err,
|
|
126
|
+
);
|
|
127
|
+
return resolveTemplateFromCode(eventType, variables);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Fallback: resolve from code defaults only (no DB, no HTTP).
|
|
133
|
+
* Used when both DB and HTTP are unavailable.
|
|
134
|
+
*/
|
|
135
|
+
function resolveTemplateFromCode(
|
|
136
|
+
eventType: string,
|
|
137
|
+
variables: Record<string, unknown>,
|
|
138
|
+
): ResolveResult {
|
|
139
|
+
const definition = getTemplateDefinition(eventType);
|
|
140
|
+
const header = definition?.header ?? "";
|
|
141
|
+
const body = definition?.defaultBody ?? "";
|
|
142
|
+
const composed = header ? `${header}\n\n${body}` : body;
|
|
143
|
+
const { result: text, unresolved } = interpolate(composed, variables);
|
|
144
|
+
return { text, skipped: false, unresolved };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ─── Main Resolver ──────────────────────────────────────────────────────────
|
|
148
|
+
|
|
149
|
+
const MAX_TEMPLATE_REF_DEPTH = 3;
|
|
150
|
+
const TEMPLATE_REF_REGEX = /\{\{@template\[([^\]]+)\]\}\}/g;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Resolve an event template to its final interpolated text.
|
|
154
|
+
*
|
|
155
|
+
* In HTTP mode (workers): delegates to the API server's /render endpoint.
|
|
156
|
+
* In DB mode (API server): does direct DB resolution.
|
|
157
|
+
*/
|
|
158
|
+
export function resolveTemplate(
|
|
159
|
+
eventType: string,
|
|
160
|
+
variables: Record<string, unknown>,
|
|
161
|
+
options: ResolveOptions = {},
|
|
162
|
+
): ResolveResult {
|
|
163
|
+
// HTTP mode: delegate to API server (workers call this path)
|
|
164
|
+
if (httpResolverConfig) {
|
|
165
|
+
// Return a synchronous fallback immediately, then the caller should use resolveTemplateAsync.
|
|
166
|
+
// For backward compat with sync callers, use code defaults as sync fallback.
|
|
167
|
+
// Callers that need HTTP resolution must use resolveTemplateAsync().
|
|
168
|
+
return resolveTemplateFromCode(eventType, variables);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return resolveTemplateViaDb(eventType, variables, options);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Async version of resolveTemplate — required for HTTP mode (workers).
|
|
176
|
+
* Falls back to sync DB mode when HTTP is not configured.
|
|
177
|
+
*/
|
|
178
|
+
export async function resolveTemplateAsync(
|
|
179
|
+
eventType: string,
|
|
180
|
+
variables: Record<string, unknown>,
|
|
181
|
+
options: ResolveOptions = {},
|
|
182
|
+
): Promise<ResolveResult> {
|
|
183
|
+
if (httpResolverConfig) {
|
|
184
|
+
return resolveTemplateViaHttp(eventType, variables, options);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return resolveTemplateViaDb(eventType, variables, options);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* DB-mode resolution (API server path). Direct DB access.
|
|
192
|
+
*/
|
|
193
|
+
function resolveTemplateViaDb(
|
|
194
|
+
eventType: string,
|
|
195
|
+
variables: Record<string, unknown>,
|
|
196
|
+
options: ResolveOptions,
|
|
197
|
+
): ResolveResult {
|
|
198
|
+
const definition = getTemplateDefinition(eventType);
|
|
199
|
+
const header = definition?.header ?? "";
|
|
200
|
+
const defaultBody = definition?.defaultBody ?? "";
|
|
201
|
+
|
|
202
|
+
// DB resolution: scope chain lookup
|
|
203
|
+
const dbResult = dbResolverFn?.(eventType, options.agentId, options.repoId) ?? null;
|
|
204
|
+
|
|
205
|
+
// skip_event
|
|
206
|
+
if (dbResult && "skip" in dbResult) {
|
|
207
|
+
return { text: "", skipped: true, unresolved: [] };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Determine body and metadata
|
|
211
|
+
let body: string;
|
|
212
|
+
let templateId: string | undefined;
|
|
213
|
+
let scope: string | undefined;
|
|
214
|
+
|
|
215
|
+
if (dbResult && "template" in dbResult) {
|
|
216
|
+
body = dbResult.template.body;
|
|
217
|
+
templateId = dbResult.template.id;
|
|
218
|
+
scope = dbResult.template.scope;
|
|
219
|
+
} else {
|
|
220
|
+
body = defaultBody;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Expand {{@template[id]}} references in body
|
|
224
|
+
body = expandTemplateRefs(body, variables, options, new Set(), 0);
|
|
225
|
+
|
|
226
|
+
// Compose header + body
|
|
227
|
+
const composed = header ? `${header}\n\n${body}` : body;
|
|
228
|
+
|
|
229
|
+
// Interpolate variables
|
|
230
|
+
const { result: text, unresolved } = interpolate(composed, variables);
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
text,
|
|
234
|
+
templateId,
|
|
235
|
+
scope,
|
|
236
|
+
skipped: false,
|
|
237
|
+
unresolved,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Recursively expand {{@template[id]}} references in a string.
|
|
243
|
+
* Only used in DB mode (API server). HTTP mode handles expansion server-side.
|
|
244
|
+
*/
|
|
245
|
+
function expandTemplateRefs(
|
|
246
|
+
text: string,
|
|
247
|
+
variables: Record<string, unknown>,
|
|
248
|
+
options: ResolveOptions,
|
|
249
|
+
visited: Set<string>,
|
|
250
|
+
depth: number,
|
|
251
|
+
): string {
|
|
252
|
+
if (depth > MAX_TEMPLATE_REF_DEPTH) {
|
|
253
|
+
return text;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return text.replace(TEMPLATE_REF_REGEX, (fullMatch, referencedId: string) => {
|
|
257
|
+
// Cycle detection
|
|
258
|
+
if (visited.has(referencedId)) {
|
|
259
|
+
console.warn(
|
|
260
|
+
`[prompt-resolver] Cycle detected for template reference "${referencedId}", leaving token as-is`,
|
|
261
|
+
);
|
|
262
|
+
return fullMatch;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Depth check (we're about to recurse into depth + 1)
|
|
266
|
+
if (depth + 1 > MAX_TEMPLATE_REF_DEPTH) {
|
|
267
|
+
console.warn(
|
|
268
|
+
`[prompt-resolver] Max template reference depth (${MAX_TEMPLATE_REF_DEPTH}) exceeded for "${referencedId}", leaving token as-is`,
|
|
269
|
+
);
|
|
270
|
+
return fullMatch;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Resolve the referenced template
|
|
274
|
+
const refDef = getTemplateDefinition(referencedId);
|
|
275
|
+
const refDefaultBody = refDef?.defaultBody ?? "";
|
|
276
|
+
const refDbResult = dbResolverFn?.(referencedId, options.agentId, options.repoId) ?? null;
|
|
277
|
+
|
|
278
|
+
// If referenced template is skipped, leave token as-is
|
|
279
|
+
if (refDbResult && "skip" in refDbResult) {
|
|
280
|
+
return fullMatch;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const refBody =
|
|
284
|
+
refDbResult && "template" in refDbResult ? refDbResult.template.body : refDefaultBody;
|
|
285
|
+
|
|
286
|
+
// If we got nothing, leave token as-is
|
|
287
|
+
if (!refBody) {
|
|
288
|
+
return fullMatch;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Recursively expand nested refs in the referenced body
|
|
292
|
+
const newVisited = new Set(visited);
|
|
293
|
+
newVisited.add(referencedId);
|
|
294
|
+
return expandTemplateRefs(refBody, variables, options, newVisited, depth + 1);
|
|
295
|
+
});
|
|
296
|
+
}
|