@desplega.ai/agent-swarm 1.149.1 → 1.151.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -3
- package/dist/{acp-adapter-vhkzfpjg.js → acp-adapter-ex8hzjfc.js} +5 -5
- package/dist/{actions-9d2694yk.js → actions-2bgpyhww.js} +39 -11
- package/dist/{app-fq2ggynt.js → app-1706zhr1.js} +7 -7
- package/dist/{artifact-gj9arwrr.js → artifact-td4q4dch.js} +1 -1
- package/dist/{assistant-edb6n9nn.js → assistant-bavke5p7.js} +44 -20
- package/dist/{azure-openai-responses-cqar64rc.js → azure-openai-responses-f38x2avq.js} +13 -13
- package/dist/{boot-reembed-msweabbp.js → boot-reembed-3cmrrmpa.js} +9 -9
- package/dist/{boot-reembed-q5wd3tha.js → boot-reembed-nafcmmmc.js} +14 -16
- package/dist/{boot-scrub-logs-3g1az933.js → boot-scrub-logs-cd6a2sq0.js} +5 -5
- package/dist/{claude-adapter-v3rnzsdc.js → claude-adapter-wfp2gzvz.js} +15 -16
- package/dist/{claude-managed-adapter-qvsmh6mv.js → claude-managed-adapter-dsmkcrjy.js} +3 -3
- package/dist/{claude-sdk-session-qxrpsna1.js → claude-sdk-session-bht9jjak.js} +15 -16
- package/dist/{cli-5m0qmvdp.js → cli-0qb1z6s2.js} +1 -1
- package/dist/{cli-9d8ntetj.js → cli-2658f6at.js} +1 -1
- package/dist/{cli-7evafqvy.js → cli-2tbvf1z1.js} +85 -69
- package/dist/{cli-k351hv5k.js → cli-3v9xhjcn.js} +24 -12
- package/dist/{cli-1ebpar1q.js → cli-4wppfkcm.js} +350 -20
- package/dist/{cli-4260r1tg.js → cli-5jd2z7av.js} +97 -84
- package/dist/{cli-cv7s5zdq.js → cli-5tpgq60f.js} +9865 -715
- package/dist/{cli-6skz3rk8.js → cli-7tgcstn2.js} +9 -4
- package/dist/{cli-01g3x1ca.js → cli-9004vfdf.js} +108 -56
- package/dist/{cli-1c94wvcw.js → cli-a1z3h107.js} +124 -99
- package/dist/{cli-9br8ypfv.js → cli-czjtgfys.js} +2 -2
- package/dist/{cli-5my3bjsd.js → cli-d3p82erb.js} +7 -7
- package/dist/{cli-e29gmdmw.js → cli-dv6cdjs2.js} +2 -1
- package/dist/{cli-wby1xnnb.js → cli-f1wky6zp.js} +1 -1
- package/dist/{cli-zvz62chv.js → cli-fm4ytsdk.js} +4 -4
- package/dist/{cli-tg8qj8ee.js → cli-frcta2w4.js} +6 -6
- package/dist/{cli-7xx10h0a.js → cli-g69fdc9g.js} +2 -2
- package/dist/{cli-cmp8g3sw.js → cli-gbfwcd3k.js} +44 -9
- package/dist/{handlers-nsg0bcye.js → cli-gjyvhmmh.js} +97 -45
- package/dist/{cli-08b07b4r.js → cli-ht5rs63n.js} +1 -1
- package/dist/{cli-jecc01cb.js → cli-j4nv2wqy.js} +2 -4
- package/dist/{cli-cd60fv6j.js → cli-j9xczhaq.js} +1 -1
- package/dist/cli-pf9q3696.js +172 -0
- package/dist/{cli-xm87hzbw.js → cli-pgj4a5fb.js} +1 -1
- package/dist/{cli-jezx9b9c.js → cli-ppm4975n.js} +9 -3
- package/dist/{cli-3z634pqe.js → cli-q88st9aj.js} +2 -2
- package/dist/{cli-3sysyjve.js → cli-r2q6pevn.js} +142 -49
- package/dist/{cli-07jd68a1.js → cli-re8z5p8p.js} +1 -1
- package/dist/{cli-qgd4sqz5.js → cli-s14agm5s.js} +121 -14
- package/dist/{cli-svbrpf5q.js → cli-sjaae6ff.js} +9872 -424
- package/dist/{cli-73gq0zxn.js → cli-vwm416m6.js} +13 -13
- package/dist/{cli-4wtq5jjv.js → cli-wbyk465z.js} +1 -1
- package/dist/{cli-3apbzgyk.js → cli-z61ykvam.js} +19 -14
- package/dist/{cli-e06a8a7y.js → cli-zkxymas5.js} +4 -3
- package/dist/cli.js +26 -25
- package/dist/{codex-adapter-jyw7a91z.js → codex-adapter-jjjk8w4m.js} +8 -9
- package/dist/{codex-hook-hfrt9shr.js → codex-hook-8jexc34x.js} +3 -3
- package/dist/{codex-session-runner-bmngj0s5.js → codex-session-runner-nd6ayxkx.js} +8 -9
- package/dist/{commands-n755g391.js → commands-9v4psyq1.js} +5 -5
- package/dist/{db-s1cgh5gv.js → db-wnt58tpe.js} +5 -5
- package/dist/dispatcher-05jh1aqk.js +74 -0
- package/dist/{e2b-p04vmtx0.js → e2b-413b8t4v.js} +1 -1
- package/dist/{google-generative-ai-tsskx7te.js → google-generative-ai-ndjmj5fa.js} +7 -7
- package/dist/{google-vertex-ppw8ydpa.js → google-vertex-fr665tqs.js} +10 -10
- package/dist/handlers-tw90pkh5.js +65 -0
- package/dist/{hook-jf0xe8zh.js → hook-123e2scb.js} +11 -12
- package/dist/{hook-h9cqrm8q.js → hook-sxe3r349.js} +11 -12
- package/dist/{http-nc6pydw5.js → http-ecsar8ez.js} +1442 -581
- package/dist/{index-ezxkds2n.js → index-16js521z.js} +335 -107
- package/dist/{index-769nc012.js → index-hw26vj40.js} +25 -19
- package/dist/{index-0wdy6gwc.js → index-nnrbpcjp.js} +25 -17
- package/dist/index-ymn7em0p.js +25 -0
- package/dist/{index-x1zcj09z.js → index-zj518gf9.js} +26 -20
- package/dist/{keepalive-nesm3xb6.js → keepalive-asqtcm4y.js} +7 -7
- package/dist/{lead-bwy6t2za.js → lead-xbfr7fvt.js} +40 -48
- package/dist/{maintenance-8w393zf0.js → maintenance-qma55qvw.js} +9 -9
- package/dist/{oauth-refresh-sweep-sh8xjy08.js → oauth-refresh-sweep-3s04c6qw.js} +6 -6
- package/dist/{onboard-25ps29h1.js → onboard-drskd386.js} +13 -4
- package/dist/{openai-codex-responses-g7w48y30.js → openai-codex-responses-wy6a43wd.js} +13 -13
- package/dist/{openai-responses-nmeyptke.js → openai-responses-6xwf7bzg.js} +19 -19
- package/dist/{opencode-adapter-dce4wskd.js → opencode-adapter-28axqa09.js} +4 -4
- package/dist/{otel-impl-b93gxnz5.js → otel-impl-943c96er.js} +1 -1
- package/dist/{pi-mono-adapter-zvshk5cj.js → pi-mono-adapter-jcqt71cg.js} +17 -19
- package/dist/{pricing-refresh-5v56x7gb.js → pricing-refresh-mx51az05.js} +7 -7
- package/dist/{rbac-roles-x55cnezn.js → rbac-roles-78baecqd.js} +13 -9
- package/dist/{rbac-roles-0p0s6pbj.js → rbac-roles-wcmrg6sv.js} +7 -7
- package/dist/{render-v2-hyd45w8b.js → render-v2-8zjntgf5.js} +7 -7
- package/dist/{seed-pricing-49gbgn96.js → seed-pricing-jqjs6cws.js} +6 -6
- package/dist/{setup-qvq64vzq.js → setup-4pks0vfk.js} +2 -2
- package/dist/work-objects-wangt792.js +165 -0
- package/dist/{worker-scj60cxg.js → worker-p2mr422x.js} +40 -48
- package/openapi.json +1365 -268
- package/package.json +4 -3
- package/src/agentmail/handlers.ts +95 -66
- package/src/be/budget-refusal-notify.ts +1 -0
- package/src/be/db/tasks/read.ts +3 -0
- package/src/be/db/tasks/write.ts +13 -1
- package/src/be/db-client.ts +5 -0
- package/src/be/db.ts +15 -5
- package/src/be/extensions/db.ts +461 -0
- package/src/be/extensions/validate.ts +107 -0
- package/src/be/memory/boot-reembed.ts +17 -12
- package/src/be/memory/index.ts +12 -0
- package/src/be/memory/providers/openai-embedding.ts +4 -0
- package/src/be/memory/types.ts +2 -0
- package/src/be/migrations/153_deferred_task_wait_members.sql +25 -0
- package/src/be/migrations/154_routing_source.sql +3 -0
- package/src/be/migrations/155_extensions.sql +66 -0
- package/src/be/migrations/156_inbox_item_state_read_at.sql +7 -0
- package/src/be/rbac-roles.ts +3 -2
- package/src/be/scripts/typecheck.ts +59 -41
- package/src/be/seed/schedules-seeder.ts +25 -2
- package/src/be/seed/workflows-seeder.ts +17 -0
- package/src/be/seed-scripts/catalog/delegate.ts +3 -1
- package/src/be/seed-skills/bundled-files.generated.json +1 -1
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/steering.ts +1 -0
- package/src/be/swarm-config-guard.ts +3 -1
- package/src/commands/credential-refresh.ts +70 -0
- package/src/commands/onboard/compose-generator.ts +14 -2
- package/src/commands/onboard/env-generator.ts +7 -0
- package/src/commands/provider-credentials.ts +2 -25
- package/src/commands/runner.ts +24 -57
- package/src/extensions/apply-task-create.ts +135 -0
- package/src/extensions/bundle-path.ts +10 -0
- package/src/extensions/contract-runtime.ts +7 -0
- package/src/extensions/contract-types.generated.ts +4 -0
- package/src/extensions/contract.ts +270 -0
- package/src/extensions/ctx.ts +186 -0
- package/src/extensions/dispatcher.ts +479 -0
- package/src/extensions/identity.ts +44 -0
- package/src/extensions/lifecycle.ts +281 -0
- package/src/extensions/loader.ts +207 -0
- package/src/extensions/post-bridge.ts +161 -0
- package/src/github/handlers.ts +185 -140
- package/src/gitlab/handlers.ts +97 -77
- package/src/heartbeat/heartbeat.ts +155 -83
- package/src/http/agents.ts +1 -1
- package/src/http/all-routes.ts +1 -0
- package/src/http/approval-requests.ts +1 -0
- package/src/http/apps.ts +14 -9
- package/src/http/config.ts +4 -1
- package/src/http/core.ts +38 -2
- package/src/http/extensions.ts +547 -0
- package/src/http/inbox-state.ts +2 -0
- package/src/http/index.ts +41 -3
- package/src/http/mcp-bridge.ts +96 -62
- package/src/http/mcp.ts +1 -1
- package/src/http/script-runs.ts +5 -0
- package/src/http/status.ts +6 -4
- package/src/http/tasks.ts +51 -30
- package/src/integrations/kapso/inbound.ts +15 -10
- package/src/jira/sync.ts +26 -16
- package/src/linear/sync.ts +26 -16
- package/src/prompts/session-templates.ts +18 -13
- package/src/providers/claude-adapter.ts +21 -8
- package/src/rbac/admission.ts +1 -1
- package/src/rbac/elevated-agents.ts +24 -0
- package/src/rbac/legacy-policy.ts +35 -6
- package/src/rbac/permissions.ts +8 -0
- package/src/scheduler/deferred-task-waits.ts +138 -27
- package/src/scheduler/schedule-task.ts +54 -24
- package/src/scheduler/scheduler.ts +108 -125
- package/src/scripts-runtime/executors/native.ts +5 -1
- package/src/scripts-runtime/executors/types.ts +5 -0
- package/src/scripts-runtime/import-allowlist.ts +79 -19
- package/src/scripts-runtime/sdk-allowlist.ts +4 -0
- package/src/scripts-runtime/swarm-config.ts +8 -0
- package/src/scripts-runtime/swarm-sdk.ts +3 -0
- package/src/scripts-runtime/types/stdlib.d.ts +16 -3
- package/src/scripts-runtime/types/swarm-extension.d.ts +562 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +16 -3
- package/src/server.ts +6 -0
- package/src/slack/HEURISTICS.md +3 -1
- package/src/slack/actions.ts +21 -16
- package/src/slack/app.ts +2 -0
- package/src/slack/assistant.ts +4 -12
- package/src/slack/blocks.ts +1 -1
- package/src/slack/handlers.ts +107 -19
- package/src/slack/inbound-files.ts +9 -5
- package/src/slack/render-v2.ts +188 -38
- package/src/slack/router.ts +13 -3
- package/src/slack/steering.ts +3 -3
- package/src/slack/thread-buffer.ts +66 -23
- package/src/slack/work-objects.test.ts +252 -0
- package/src/slack/work-objects.ts +118 -0
- package/src/tasks/errors.ts +9 -0
- package/src/tasks/sibling-awareness.ts +35 -1
- package/src/tasks/worker-follow-up.ts +67 -11
- package/src/tests/acp-adapter.test.ts +10 -10
- package/src/tests/agent-fs-live-url.test.ts +40 -0
- package/src/tests/agent-fs-provision-seeder.test.ts +12 -12
- package/src/tests/api-key-tracking.test.ts +18 -18
- package/src/tests/api-key.test.ts +4 -2
- package/src/tests/apps-rbac.test.ts +1 -1
- package/src/tests/apps-spike5.test.ts +1 -1
- package/src/tests/apps-sync-engine.test.ts +8 -8
- package/src/tests/apps-user-config.test.ts +1 -1
- package/src/tests/artifact-sdk.test.ts +8 -8
- package/src/tests/asset-key-mcp.test.ts +2 -0
- package/src/tests/automation-preflight-alert.test.ts +1 -1
- package/src/tests/base-prompt.test.ts +7 -6
- package/src/tests/budget-user-scope.test.ts +1 -1
- package/src/tests/budgets-routes.test.ts +1 -1
- package/src/tests/claude-adapter-binary.test.ts +22 -40
- package/src/tests/claude-adapter-otel.test.ts +13 -7
- package/src/tests/claude-adapter.test.ts +8 -6
- package/src/tests/claude-hook-credentials.test.ts +3 -3
- package/src/tests/claude-managed-adapter.test.ts +4 -4
- package/src/tests/claude-managed-setup.test.ts +3 -3
- package/src/tests/claude-sdk-lifecycle.test.ts +1 -1
- package/src/tests/claude-sdk-transport.test.ts +6 -6
- package/src/tests/claude-stop-hook.test.ts +8 -8
- package/src/tests/claude-worker-parity.test.ts +3 -3
- package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +5 -5
- package/src/tests/codex-adapter.test.ts +7 -5
- package/src/tests/codex-app-server.test.ts +2 -2
- package/src/tests/codex-login.test.ts +15 -15
- package/src/tests/codex-oauth-credential-info.test.ts +4 -4
- package/src/tests/codex-oauth-keep-warm.test.ts +4 -4
- package/src/tests/codex-oauth-refresh-lock.test.ts +1 -1
- package/src/tests/codex-oauth-storage.test.ts +7 -7
- package/src/tests/codex-pool.test.ts +1 -1
- package/src/tests/codex-steering-hook.test.ts +1 -1
- package/src/tests/codex-swarm-events.test.ts +1 -1
- package/src/tests/config-api-only-keys.test.ts +1 -1
- package/src/tests/config-session-auth.test.ts +2 -2
- package/src/tests/connection-embedded-auth.test.ts +20 -18
- package/src/tests/core-auth.test.ts +1 -1
- package/src/tests/create-page-tool.test.ts +3 -3
- package/src/tests/credential-refresh.test.ts +115 -0
- package/src/tests/credential-wait.test.ts +2 -2
- package/src/tests/credentials.test.ts +6 -4
- package/src/tests/db-queries-oauth.test.ts +40 -40
- package/src/tests/defer-task.test.ts +73 -8
- package/src/tests/deferred-task-wait-migration.test.ts +64 -0
- package/src/tests/deferred-task-wake.test.ts +349 -8
- package/src/tests/devin-adapter.test.ts +1 -1
- package/src/tests/devin-api.test.ts +1 -1
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/e2b-dispatch.test.ts +21 -19
- package/src/tests/e2e-claude-transport.test.ts +3 -3
- package/src/tests/e2e-redact.test.ts +6 -6
- package/src/tests/ensure-token.test.ts +68 -68
- package/src/tests/entrypoint-api-readiness.test.ts +1 -1
- package/src/tests/entrypoint-codex-oauth-seed.test.ts +13 -13
- package/src/tests/env-flag.test.ts +1 -0
- package/src/tests/events-http.test.ts +1 -1
- package/src/tests/extensions-db.test.ts +216 -0
- package/src/tests/extensions-dispatcher.test.ts +275 -0
- package/src/tests/extensions-example-heartbeat-remediate.test.ts +69 -0
- package/src/tests/extensions-example-mcp-install.test.ts +63 -0
- package/src/tests/extensions-example-no-exclamation-marks.test.ts +72 -0
- package/src/tests/extensions-example-rewrite-and-suppress.test.ts +70 -0
- package/src/tests/extensions-example-route-slack-channel.test.ts +217 -0
- package/src/tests/extensions-heartbeat.test.ts +291 -0
- package/src/tests/extensions-http.test.ts +431 -0
- package/src/tests/extensions-lead-equivalence.test.ts +49 -0
- package/src/tests/extensions-lifecycle.test.ts +209 -0
- package/src/tests/extensions-loader.test.ts +95 -0
- package/src/tests/extensions-mcp-tools.test.ts +245 -0
- package/src/tests/extensions-pre-task.test.ts +487 -0
- package/src/tests/extensions-run-context.test.ts +41 -0
- package/src/tests/extensions-tool-call.test.ts +288 -0
- package/src/tests/extensions-validate.test.ts +196 -0
- package/src/tests/fixtures/extensions/bad-import/hooks.ts +8 -0
- package/src/tests/fixtures/extensions/bad-import/manifest.json +9 -0
- package/src/tests/fixtures/extensions/bad-return-shape/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/bad-return-shape/manifest.json +9 -0
- package/src/tests/fixtures/extensions/block-tasks-from-source/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/block-tasks-from-source/manifest.json +9 -0
- package/src/tests/fixtures/extensions/ignore-channel/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/ignore-channel/manifest.json +9 -0
- package/src/tests/fixtures/extensions/load.ts +10 -0
- package/src/tests/fixtures/extensions/minimal/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/minimal/manifest.json +9 -0
- package/src/tests/fixtures/extensions/never-fail-long-tasks/hooks.ts +11 -0
- package/src/tests/fixtures/extensions/never-fail-long-tasks/manifest.json +9 -0
- package/src/tests/fixtures/extensions/no-exclamation-marks/hooks.ts +23 -0
- package/src/tests/fixtures/extensions/no-exclamation-marks/manifest.json +9 -0
- package/src/tests/fixtures/extensions/post-logger/hooks.ts +9 -0
- package/src/tests/fixtures/extensions/post-logger/manifest.json +9 -0
- package/src/tests/fixtures/extensions/priority-a/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/priority-a/manifest.json +9 -0
- package/src/tests/fixtures/extensions/priority-b/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/priority-b/manifest.json +9 -0
- package/src/tests/fixtures/extensions/record-only-on-tag/hooks.ts +16 -0
- package/src/tests/fixtures/extensions/record-only-on-tag/manifest.json +9 -0
- package/src/tests/fixtures/extensions/reserved-assets/hooks.ts +5 -0
- package/src/tests/fixtures/extensions/reserved-assets/manifest.json +10 -0
- package/src/tests/fixtures/extensions/rewrite-progress-prefix/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/rewrite-progress-prefix/manifest.json +9 -0
- package/src/tests/fixtures/extensions/rewrite-task-priority/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/rewrite-task-priority/manifest.json +9 -0
- package/src/tests/fixtures/extensions/route-channel-to-agent/hooks.ts +26 -0
- package/src/tests/fixtures/extensions/route-channel-to-agent/manifest.json +9 -0
- package/src/tests/fixtures/extensions/slow/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/slow/manifest.json +9 -0
- package/src/tests/fixtures/extensions/suppress-lead-follow-up/hooks.ts +12 -0
- package/src/tests/fixtures/extensions/suppress-lead-follow-up/manifest.json +9 -0
- package/src/tests/fixtures/extensions/throws/hooks.ts +12 -0
- package/src/tests/fixtures/extensions/throws/manifest.json +9 -0
- package/src/tests/fixtures/extensions/worker-runtime/hooks.ts +5 -0
- package/src/tests/fixtures/extensions/worker-runtime/manifest.json +9 -0
- package/src/tests/fs-routes.test.ts +1 -1
- package/src/tests/gitlab-auth.test.ts +10 -10
- package/src/tests/harness-provider-resolution.test.ts +8 -5
- package/src/tests/heartbeat-reroute-decision.test.ts +1 -0
- package/src/tests/helper-credentials.test.ts +137 -0
- package/src/tests/http/context-routes.test.ts +2 -2
- package/src/tests/http-api-integration.test.ts +5 -2
- package/src/tests/http-users.test.ts +1 -1
- package/src/tests/identity-refresh.test.ts +2 -2
- package/src/tests/internal-ai/complete-structured.test.ts +2 -2
- package/src/tests/internal-ai/credentials.test.ts +19 -17
- package/src/tests/jira-metadata.test.ts +1 -1
- package/src/tests/jira-oauth.test.ts +5 -5
- package/src/tests/jira-sync.test.ts +1 -1
- package/src/tests/jira-webhook-lifecycle.test.ts +3 -3
- package/src/tests/jira-webhook.test.ts +2 -2
- package/src/tests/kapso-inbound.test.ts +2 -2
- package/src/tests/kv-http.test.ts +1 -1
- package/src/tests/kv-namespace-resolution.test.ts +1 -1
- package/src/tests/kv-page-proxy.test.ts +2 -2
- package/src/tests/launch-password-rejection.test.ts +2 -2
- package/src/tests/linear-webhook.test.ts +1 -1
- package/src/tests/mcp-oauth-dcr-reuse.test.ts +6 -6
- package/src/tests/mcp-oauth-ensure-token.test.ts +28 -22
- package/src/tests/mcp-oauth-manual-client.test.ts +16 -12
- package/src/tests/mcp-oauth-queries.test.ts +35 -32
- package/src/tests/mcp-oauth-resolve-secrets.test.ts +8 -8
- package/src/tests/mcp-oauth-wrapper.test.ts +20 -20
- package/src/tests/mcp-user-route.test.ts +1 -1
- package/src/tests/memory-edges.test.ts +1 -1
- package/src/tests/memory-edit-authorization.test.ts +32 -0
- package/src/tests/memory-rate-endpoint.test.ts +1 -1
- package/src/tests/memory-rate-tool.test.ts +2 -2
- package/src/tests/memory-rater-e2e.test.ts +1 -1
- package/src/tests/memory-rater-llm-summarizer.test.ts +3 -3
- package/src/tests/memory-rater-llm.test.ts +1 -1
- package/src/tests/model-control.test.ts +3 -0
- package/src/tests/multi-runtime-enabled-stats.test.ts +2 -2
- package/src/tests/multi-runtime-registration.test.ts +111 -17
- package/src/tests/oauth-access-token-tool.test.ts +18 -18
- package/src/tests/oauth-callback-flow.test.ts +8 -8
- package/src/tests/oauth-credential-bindings.test.ts +29 -27
- package/src/tests/oauth-keepalive.test.ts +10 -10
- package/src/tests/oauth-presets.test.ts +13 -5
- package/src/tests/oauth-refresh-failure.test.ts +9 -9
- package/src/tests/oauth-refresh-sweep.test.ts +20 -13
- package/src/tests/oauth-wrapper.test.ts +1 -1
- package/src/tests/onboard-compose.test.ts +47 -3
- package/src/tests/onboard-env.test.ts +26 -26
- package/src/tests/onboard-non-interactive.test.ts +4 -4
- package/src/tests/opencode-adapter.test.ts +1 -1
- package/src/tests/opencode-plugin.test.ts +2 -2
- package/src/tests/otel-session-cost-metrics.test.ts +1 -1
- package/src/tests/page-proxy-authed.test.ts +2 -2
- package/src/tests/page-proxy.test.ts +2 -2
- package/src/tests/page-session.test.ts +7 -7
- package/src/tests/page-viewer-auth.test.ts +2 -2
- package/src/tests/pages-authed-mode.test.ts +1 -1
- package/src/tests/pages-http.test.ts +1 -1
- package/src/tests/pages-password-mode.test.ts +1 -1
- package/src/tests/pages-public-authed-401.test.ts +1 -1
- package/src/tests/pages-public-html.test.ts +2 -2
- package/src/tests/pages-view-count.test.ts +1 -1
- package/src/tests/pi-mono-adapter.test.ts +10 -10
- package/src/tests/pi-mono-extension.test.ts +2 -2
- package/src/tests/preload.ts +5 -0
- package/src/tests/pricing-routes.test.ts +1 -1
- package/src/tests/profile-sync-warning.test.ts +8 -8
- package/src/tests/profile-sync.test.ts +8 -8
- package/src/tests/prompt-template-session.test.ts +36 -5
- package/src/tests/provider-process-group.test.ts +95 -4
- package/src/tests/providers/pi-cost.test.ts +1 -1
- package/src/tests/queue-stall-alarm.test.ts +1 -1
- package/src/tests/rbac-admission.test.ts +19 -4
- package/src/tests/rbac-charact-http.test.ts +1 -1
- package/src/tests/rbac-e2e-helpers.ts +1 -1
- package/src/tests/rbac-engine.test.ts +39 -0
- package/src/tests/realtime-room-auth.test.ts +1 -1
- package/src/tests/realtime-room-surfaces.test.ts +1 -1
- package/src/tests/reload-config.test.ts +45 -1
- package/src/tests/routing-affinity-inventory.test.ts +1 -1
- package/src/tests/routing-reason-contract.test.ts +76 -3
- package/src/tests/routing-reason-inventory.test.ts +11 -6
- package/src/tests/routing-source.test.ts +53 -0
- package/src/tests/runner-agent-fs-provision-retry.test.ts +1 -1
- package/src/tests/runner-context-preamble.test.ts +1 -1
- package/src/tests/runner-deployment-resume.test.ts +1 -1
- package/src/tests/runner-fallback-output.test.ts +1 -1
- package/src/tests/runner-identity-refresh.test.ts +1 -1
- package/src/tests/runner-skills-refresh.test.ts +1 -1
- package/src/tests/schedule-target-type.test.ts +3 -3
- package/src/tests/scheduled-tasks.test.ts +14 -5
- package/src/tests/scheduler-occurrence.test.ts +347 -0
- package/src/tests/script-apis-mcp.test.ts +1 -1
- package/src/tests/script-connections-http.test.ts +61 -58
- package/src/tests/script-connections-mcp.test.ts +1 -1
- package/src/tests/script-connections.test.ts +3 -1
- package/src/tests/script-runs-http.test.ts +15 -7
- package/src/tests/script-workflows-runtime-e2e.test.ts +1 -1
- package/src/tests/scripts-boot-reembed.test.ts +4 -0
- package/src/tests/scripts-embeddings.test.ts +4 -0
- package/src/tests/scripts-external-api.test.ts +1 -1
- package/src/tests/scripts-http.test.ts +1 -1
- package/src/tests/scripts-import-allowlist.test.ts +44 -1
- package/src/tests/scripts-mcp-e2e.test.ts +81 -1
- package/src/tests/scripts-only-gating.test.ts +4 -2
- package/src/tests/scripts-retention.test.ts +1 -1
- package/src/tests/scripts-runtime-identity.test.ts +2 -2
- package/src/tests/scripts-runtime-secret-egress.test.ts +1 -1
- package/src/tests/scripts-runtime.test.ts +6 -4
- package/src/tests/scripts-typecheck.test.ts +21 -0
- package/src/tests/sdk-allowlist.test.ts +1 -1
- package/src/tests/secret-scrubber.test.ts +38 -31
- package/src/tests/seed-registry.test.ts +46 -8
- package/src/tests/seed-schedules.test.ts +44 -9
- package/src/tests/seed-workflows.test.ts +21 -9
- package/src/tests/send-task-output-schema.test.ts +9 -1
- package/src/tests/send-task-requested-by.test.ts +1 -0
- package/src/tests/send-task-slack-routing-guard.test.ts +2 -0
- package/src/tests/session-costs-codex-recompute.test.ts +1 -1
- package/src/tests/session-costs-golden.test.ts +2 -2
- package/src/tests/session-costs-model-key-normalize.test.ts +2 -2
- package/src/tests/session-costs-recompute-all-providers.test.ts +1 -1
- package/src/tests/session-tokens.test.ts +1 -1
- package/src/tests/shutdown-error-scrubbing.test.ts +1 -1
- package/src/tests/slack-blocks.test.ts +12 -1
- package/src/tests/slack-file-tools-attachments.test.ts +1 -1
- package/src/tests/slack-inbound-files.test.ts +222 -86
- package/src/tests/slack-reaction-config.test.ts +5 -4
- package/src/tests/slack-read-boundaries.test.ts +1 -1
- package/src/tests/slack-render-v2.test.ts +196 -4
- package/src/tests/slack-router.test.ts +17 -2
- package/src/tests/slack-steering.test.ts +19 -0
- package/src/tests/status.test.ts +19 -7
- package/src/tests/steering-core.test.ts +1 -1
- package/src/tests/steering-enabled.test.ts +6 -8
- package/src/tests/steering-transport.test.ts +4 -4
- package/src/tests/store-progress-output-guidance.test.ts +34 -0
- package/src/tests/swarm-tool-result-gate.test.ts +11 -11
- package/src/tests/swarm-x-tool.test.ts +7 -5
- package/src/tests/sync-ai-toolbox-skills.test.ts +19 -0
- package/src/tests/task-supersede-resume.test.ts +1 -1
- package/src/tests/task-tool-preload-mcp.test.ts +4 -1
- package/src/tests/task-tools-ctx.test.ts +2 -0
- package/src/tests/tasks-requested-by-filter.test.ts +2 -2
- package/src/tests/telemetry-init.test.ts +11 -3
- package/src/tests/tool-annotations.test.ts +1 -1
- package/src/tests/tool-output-agent-id.test.ts +1 -0
- package/src/tests/tool-registrar-no-input.test.ts +42 -1
- package/src/tests/tracker-fold.test.ts +7 -7
- package/src/tests/tracker-tools.test.ts +3 -3
- package/src/tests/ui-followup-lead-delegation.test.ts +1 -0
- package/src/tests/unified-oauth-migration.test.ts +5 -5
- package/src/tests/user-token-rest-auth.test.ts +1 -1
- package/src/tests/user-token-routes.test.ts +1 -1
- package/src/tests/whoami-route.test.ts +1 -1
- package/src/tests/workflow-agent-task.test.ts +15 -13
- package/src/tests/workflow-ctx.test.ts +1 -1
- package/src/tests/workflow-e2e.test.ts +1 -1
- package/src/tests/workflow-engine-v2.test.ts +3 -1
- package/src/tests/workflow-executors.test.ts +2 -2
- package/src/tests/workflow-http-v2.test.ts +8 -6
- package/src/tests/workflow-input-redaction.test.ts +7 -5
- package/src/tests/workflow-integration-io.test.ts +2 -2
- package/src/tests/workflow-llm.test.ts +5 -5
- package/src/tests/workflow-registry.test.ts +1 -1
- package/src/tests/workflow-swarm-script.test.ts +1 -1
- package/src/tests/workflow-triggers-v2.test.ts +23 -21
- package/src/tests/x-composio.test.ts +9 -7
- package/src/tests/x402-client.test.ts +1 -1
- package/src/tests/x402-config.test.ts +28 -41
- package/src/tools/defer-task.ts +156 -24
- package/src/tools/extension-common.ts +84 -0
- package/src/tools/extension-install.ts +65 -0
- package/src/tools/extension-list.ts +66 -0
- package/src/tools/script-common.ts +43 -18
- package/src/tools/send-task.ts +87 -105
- package/src/tools/skills/skill-publish.ts +1 -0
- package/src/tools/store-progress.ts +1 -1
- package/src/tools/task-action.ts +43 -22
- package/src/tools/task-tool-ctx.ts +2 -0
- package/src/tools/templates.ts +2 -1
- package/src/tools/tool-config.ts +3 -1
- package/src/tools/utils.ts +140 -16
- package/src/types.ts +144 -0
- package/src/utils/constants.ts +7 -1
- package/src/utils/credentials.test.ts +16 -16
- package/src/utils/multi-runtime.ts +2 -2
- package/src/utils/steering-enabled.ts +4 -4
- package/src/workflows/executors/agent-task.ts +18 -3
- package/templates/ai-toolbox.manifest.json +7 -1
- package/templates/extensions/README.md +17 -0
- package/templates/extensions/notify-on-complete/README.md +11 -0
- package/templates/extensions/notify-on-complete/hooks.ts +61 -0
- package/templates/extensions/notify-on-complete/manifest.json +7 -0
- package/templates/extensions/require-ticket-ref/README.md +11 -0
- package/templates/extensions/require-ticket-ref/hooks.ts +30 -0
- package/templates/extensions/require-ticket-ref/manifest.json +7 -0
- package/templates/extensions/require-verification-note/README.md +11 -0
- package/templates/extensions/require-verification-note/hooks.ts +32 -0
- package/templates/extensions/require-verification-note/manifest.json +7 -0
- package/templates/schedules/daily-hn-briefing/config.json +1 -1
- package/templates/schedules/gtm-weekly-review/config.json +1 -1
- package/templates/schedules/weekly-code-health-reports/config.json +1 -1
- package/templates/schedules/weekly-dependabot-triage/config.json +1 -1
- package/templates/schedules/weekly-dora-metrics/config.json +1 -1
- package/templates/schedules/weekly-harness-upgrade-check/config.json +1 -1
- package/templates/skills/delegate-work/files/scripts/codex-exec.sh +1 -1
- package/templates/skills/scheduling/content.md +2 -0
- package/templates/skills/serply-search/SKILL.md +95 -0
- package/templates/skills/serply-search/config.json +13 -0
- package/templates/skills/serply-search/content.md +90 -0
- package/templates/skills/swarm-extensions/config.json +14 -0
- package/templates/skills/swarm-extensions/content.md +120 -0
- package/templates/skills/swarm-scripts/SKILL.md +2 -2
- package/templates/skills/swarm-scripts/content.md +2 -2
- package/templates/workflows/claude-code-changelog-watch/config.json +1 -1
- package/templates/workflows/gsc-topic-miner/config.json +1 -1
- package/templates/workflows/linear-drain-loop/config.json +1 -1
- package/templates/workflows/llm-safe-release-context/config.json +1 -1
- package/templates/workflows/ralph-loop/config.json +1 -1
- package/dist/cli-7fehefdf.js +0 -562
- package/dist/cli-ayvy5kde.js +0 -164
- package/dist/cli-ddfw1mc4.js +0 -4322
- package/dist/cli-hzqmgcm2.js +0 -3066
- package/dist/cli-j4d4f6hv.js +0 -338
- package/dist/cli-qgm2pfpq.js +0 -6377
- package/dist/cli-sdzq01t9.js +0 -823
- package/dist/cli-xvkmedgn.js +0 -332
- package/dist/cli-y3pq4v9g.js +0 -664
- package/dist/{anthropic-messages-vs2rabzp.js → anthropic-messages-2y8nktar.js} +19 -19
- package/dist/{claude-managed-setup-f5pmsyrp.js → claude-managed-setup-48dwg9bv.js} +3 -3
- package/dist/{cli-81r683bv.js → cli-ch38q5z4.js} +0 -0
- package/dist/{cli-6664w7y4.js → cli-kj76p1ez.js} +8 -8
- package/dist/{cli-c71mg51n.js → cli-r2fpe7cx.js} +5 -5
- package/dist/{cli-4xz3pmrq.js → cli-y6x0gqtg.js} +16 -16
- package/dist/{index-aa3sa6s8.js → index-2wsdsnmm.js} +1 -1
- package/dist/{mistral-conversations-4ryk7h83.js → mistral-conversations-qhr84ph3.js} +9 -9
- package/dist/{openai-completions-0bqmsajw.js → openai-completions-32rdwmze.js} +19 -19
- package/dist/{openrouter-images-qx18fyp8.js → openrouter-images-9f9ek4rw.js} +3 -3
- package/dist/{pi-messages-79jvzz1d.js → pi-messages-b1mbr6gp.js} +4 -4
|
@@ -6,16 +6,60 @@ import {
|
|
|
6
6
|
ACP_TARGET_IDS
|
|
7
7
|
} from "./cli-dgnj0zcc.js";
|
|
8
8
|
import {
|
|
9
|
+
SIMILARITY_THRESHOLD,
|
|
10
|
+
writeSkillsToFilesystem
|
|
11
|
+
} from "./cli-pf9q3696.js";
|
|
12
|
+
import {
|
|
13
|
+
Anthropic
|
|
14
|
+
} from "./cli-j490egb5.js";
|
|
15
|
+
import {
|
|
16
|
+
isClaudeBridgeEffective,
|
|
17
|
+
resolveClaudeTransport
|
|
18
|
+
} from "./cli-eree7rnv.js";
|
|
19
|
+
import {
|
|
20
|
+
reasoningCapability
|
|
21
|
+
} from "./cli-4yc5d8fk.js";
|
|
22
|
+
import {
|
|
23
|
+
SCRIPT_SDK_TYPES,
|
|
24
|
+
SCRIPT_STDLIB_MODULE_TYPES,
|
|
25
|
+
ensureAgentFsCredentialsForAgent,
|
|
26
|
+
extractArgsJsonSchema,
|
|
27
|
+
extractScriptSignature,
|
|
28
|
+
getScriptAppTypes,
|
|
29
|
+
inviteEmailToSharedOrg,
|
|
30
|
+
scriptSdkTypesWithGeneratedApis,
|
|
31
|
+
scriptStdlibTypesWithGeneratedApis,
|
|
32
|
+
typecheckScript,
|
|
33
|
+
typecheckWithAmbient
|
|
34
|
+
} from "./cli-5jd2z7av.js";
|
|
35
|
+
import {
|
|
36
|
+
checkHeartbeatChecklist,
|
|
37
|
+
runHeartbeatSweep,
|
|
38
|
+
stopHeartbeat
|
|
39
|
+
} from "./cli-9004vfdf.js";
|
|
40
|
+
import {
|
|
41
|
+
AGENT_MAX_TASKS_CONFIG_KEY,
|
|
9
42
|
ALL_CAPABILITIES,
|
|
10
43
|
AssetKeyAuthorizationError,
|
|
11
44
|
BODY_TOO_LARGE,
|
|
12
45
|
DEFAULT_NEGOTIATED_PROTOCOL_VERSION,
|
|
13
46
|
ExplicitSelfDuplicateError,
|
|
47
|
+
ExtensionConfigError,
|
|
48
|
+
ExtensionLifecycleError,
|
|
14
49
|
JSONRPCMessageSchema,
|
|
50
|
+
MAX_TASK_ATTACHMENT_BYTES,
|
|
15
51
|
McpServer,
|
|
52
|
+
RawLlmConfigSchema,
|
|
53
|
+
RawLlmOutputSchema,
|
|
54
|
+
Redacted,
|
|
16
55
|
RoomOperationSchema,
|
|
17
|
-
|
|
56
|
+
SCRIPT_SDK_RESPONSE_LIMIT_BYTES,
|
|
57
|
+
SDK_ALLOWLIST,
|
|
18
58
|
SUPPORTED_PROTOCOL_VERSIONS,
|
|
59
|
+
TaskCreationBlockedError,
|
|
60
|
+
TriggerSchemaError,
|
|
61
|
+
WebhookError,
|
|
62
|
+
activateVersion,
|
|
19
63
|
agentWithCapacity,
|
|
20
64
|
applyRating,
|
|
21
65
|
applyRoomUpdate,
|
|
@@ -24,43 +68,61 @@ import {
|
|
|
24
68
|
assertSelectOnlyQuery,
|
|
25
69
|
authorizeAssetKeyWrite,
|
|
26
70
|
authorizeRoomNamespace,
|
|
71
|
+
automationIntegrationFixUrl,
|
|
72
|
+
calculateNextRun,
|
|
27
73
|
canClaim,
|
|
28
74
|
canReadMemory,
|
|
29
75
|
cancelTaskHandler,
|
|
30
76
|
cancelTaskInputSchema,
|
|
31
77
|
cancelTaskOutputSchema,
|
|
78
|
+
cancelWorkflowRun,
|
|
32
79
|
changeRoom,
|
|
33
80
|
checkOutputSchemaShape,
|
|
34
81
|
clearJiraMetadata,
|
|
35
82
|
closeRooms,
|
|
36
83
|
createEvent,
|
|
37
84
|
createEventsBatch,
|
|
85
|
+
createResumeFollowUp,
|
|
38
86
|
createServer,
|
|
87
|
+
createTaskWithSiblingAwareness,
|
|
39
88
|
createToolRegistrar,
|
|
89
|
+
createWorkerTaskFollowUp,
|
|
40
90
|
decodeRoomSnapshot,
|
|
41
91
|
dedupeMemoryDocumentIds,
|
|
92
|
+
deleteExtension,
|
|
42
93
|
deleteJiraWebhook,
|
|
43
94
|
deriveApiBaseUrl,
|
|
44
95
|
describeRequestRoute,
|
|
96
|
+
disableExtension,
|
|
97
|
+
dispatchScheduleTarget,
|
|
45
98
|
emitBudgetRefusalSideEffects,
|
|
99
|
+
enableExtension,
|
|
46
100
|
enforceContentLengthCap,
|
|
47
101
|
enqueueAdmissionRow,
|
|
48
102
|
enqueueAuditRow,
|
|
103
|
+
executeRawLlm,
|
|
49
104
|
executeReadOnlyQuery,
|
|
50
105
|
expandCandidatesWithGraph,
|
|
51
106
|
extractAndVerifyCookie,
|
|
107
|
+
findUserById,
|
|
108
|
+
fingerprintApiKey,
|
|
52
109
|
flushAuditBuffer,
|
|
110
|
+
getAutomationSetupStates,
|
|
53
111
|
getEnabledCapabilities,
|
|
54
112
|
getEventCountsFiltered,
|
|
55
113
|
getEventsFiltered,
|
|
114
|
+
getExecutorRegistry,
|
|
115
|
+
getExtensionById,
|
|
116
|
+
getExtensionByName,
|
|
117
|
+
getExtensionFiles,
|
|
56
118
|
getJiraMetadata,
|
|
57
119
|
getKapsoConfig,
|
|
58
120
|
getKapsoNumberMapping,
|
|
59
121
|
getLinksForMemory,
|
|
60
122
|
getOAuthPreset,
|
|
61
|
-
getParseErrorMessage,
|
|
62
123
|
getPathSegments,
|
|
63
124
|
getRoom,
|
|
125
|
+
getRuntimeInstanceById,
|
|
64
126
|
getTaskDetailsHandler,
|
|
65
127
|
getTaskDetailsInputSchema,
|
|
66
128
|
getTaskDetailsOutputSchema,
|
|
@@ -68,6 +130,7 @@ import {
|
|
|
68
130
|
getTasksInputSchema,
|
|
69
131
|
getTasksOutputSchema,
|
|
70
132
|
getUserCommsPrefs,
|
|
133
|
+
getUserIdentities,
|
|
71
134
|
guardTerminalTaskResultWrite,
|
|
72
135
|
handleAgentSessionEvent,
|
|
73
136
|
handleAgentSessionPrompted,
|
|
@@ -82,12 +145,14 @@ import {
|
|
|
82
145
|
handleIssueDelete,
|
|
83
146
|
handleIssueUpdate,
|
|
84
147
|
handleJiraWebhook,
|
|
148
|
+
handleMcpBridge,
|
|
85
149
|
handleMergeRequest,
|
|
86
150
|
handleMessageReceived,
|
|
87
151
|
handleNote,
|
|
88
152
|
handlePipeline,
|
|
89
153
|
handlePullRequest,
|
|
90
154
|
handlePullRequestReview,
|
|
155
|
+
handleWebhookTrigger,
|
|
91
156
|
handleWorkflowRun,
|
|
92
157
|
hasCapability,
|
|
93
158
|
httpServerSemconvAttributes,
|
|
@@ -98,6 +163,8 @@ import {
|
|
|
98
163
|
initGitLab,
|
|
99
164
|
initJira,
|
|
100
165
|
initLinear,
|
|
166
|
+
initWorkflows,
|
|
167
|
+
installExtension,
|
|
101
168
|
isAgentMailEnabled,
|
|
102
169
|
isGitHubEnabled,
|
|
103
170
|
isGitLabEnabled,
|
|
@@ -113,43 +180,68 @@ import {
|
|
|
113
180
|
issuePageSessionCookie,
|
|
114
181
|
json,
|
|
115
182
|
jsonError,
|
|
183
|
+
linkIdentity,
|
|
184
|
+
listEnabledAutomationPreflightInputs,
|
|
185
|
+
listExtensionRuns,
|
|
186
|
+
listExtensionVersions,
|
|
187
|
+
listExtensions,
|
|
116
188
|
listOAuthPresetIds,
|
|
117
189
|
listOAuthPresets,
|
|
190
|
+
listRuntimeInstancesForAgent,
|
|
191
|
+
listUserEvents,
|
|
192
|
+
listUserTokens,
|
|
193
|
+
loadEnabledExtensions,
|
|
118
194
|
loadGlobalConfigsIntoEnv,
|
|
119
195
|
markKapsoMessageRead,
|
|
120
196
|
markKapsoMessageSeen,
|
|
121
|
-
markScriptSdkRequestOrigin,
|
|
122
197
|
mcpOverflowAuthError,
|
|
198
|
+
mcpToolNameForSdkMethod,
|
|
123
199
|
mergeScheduleTiming,
|
|
124
|
-
|
|
200
|
+
mintSessionToken,
|
|
201
|
+
mintToken,
|
|
125
202
|
parseBody,
|
|
126
203
|
parseCookieHeader,
|
|
127
204
|
parseQueryParams,
|
|
128
205
|
parseSkillContent,
|
|
129
206
|
patchWorkflowDefinition,
|
|
207
|
+
preflightAutomation,
|
|
208
|
+
readScriptSdkJsonResponse,
|
|
209
|
+
reconcileAgentMaxTasksPolicy,
|
|
210
|
+
reconcileAgentStatusFromRuntimes,
|
|
211
|
+
recordIdentityEvent,
|
|
130
212
|
recordMemoryAccesses,
|
|
131
213
|
recordRetrievals,
|
|
214
|
+
recordTaskAttachmentUpload,
|
|
215
|
+
recordUnmappedIdentity,
|
|
132
216
|
refreshLinks,
|
|
133
217
|
registerJiraWebhook,
|
|
218
|
+
reloadExtension,
|
|
134
219
|
reloadGlobalConfigsAndIntegrations,
|
|
135
220
|
removeAwarenessStates,
|
|
136
221
|
removeNamespaceRooms,
|
|
222
|
+
renderIdentity,
|
|
137
223
|
reservedNamespaceError,
|
|
138
224
|
reservedRoomKeyError,
|
|
225
|
+
resetAgentMaxTasksMirror,
|
|
139
226
|
resetRoom,
|
|
140
227
|
resolveHttpAuditUserId,
|
|
141
228
|
resolveHttpFavoriteOwner,
|
|
142
229
|
resolveHttpRequestAuth,
|
|
230
|
+
resolveIdentity,
|
|
143
231
|
resolveRoomNamespace,
|
|
144
232
|
resolveScopedResourceId,
|
|
145
233
|
resolveScriptsOnlyMode,
|
|
146
234
|
resolveTaskAuditUserId,
|
|
235
|
+
resolveUserByToken,
|
|
236
|
+
retryFailedRun,
|
|
237
|
+
revokeSessionToken,
|
|
238
|
+
revokeToken,
|
|
147
239
|
roomRequestInfo,
|
|
148
240
|
roomTopic,
|
|
149
241
|
roomView,
|
|
150
242
|
route,
|
|
151
243
|
runtimeInstanceHeader,
|
|
152
|
-
|
|
244
|
+
runtimeStaleThresholdMinutes,
|
|
153
245
|
safeRequestUrlForLog,
|
|
154
246
|
scheduleIntegrationsReload,
|
|
155
247
|
scopedResourceScopeIdSchema,
|
|
@@ -157,135 +249,70 @@ import {
|
|
|
157
249
|
sendTaskHandler,
|
|
158
250
|
sendTaskOutputSchema,
|
|
159
251
|
setCorsHeaders,
|
|
252
|
+
setExtensionLoopbackBaseUrl,
|
|
253
|
+
setRuntimeCredentialReady,
|
|
160
254
|
shouldPersistAutomaticTaskMemory,
|
|
255
|
+
snapshotAndUpdateWorkflow,
|
|
161
256
|
snapshotMetric,
|
|
162
257
|
snapshotPage,
|
|
163
258
|
startAuditGc,
|
|
164
259
|
startAuditWriter,
|
|
260
|
+
startWorkflowExecution,
|
|
165
261
|
steerTaskHandler,
|
|
166
262
|
steerTaskOutputSchema,
|
|
167
263
|
steerTaskUserInputSchema,
|
|
168
264
|
stopAuditGc,
|
|
169
265
|
stopAuditWriter,
|
|
266
|
+
stopExtensionRuntime,
|
|
170
267
|
sweepRooms,
|
|
171
268
|
taskActionHandler,
|
|
172
269
|
taskActionInputSchema,
|
|
173
270
|
taskActionOutputSchema,
|
|
174
271
|
toolErr,
|
|
272
|
+
touchRuntimeInstance,
|
|
175
273
|
triggerSchemaErrorResponse,
|
|
274
|
+
unlinkIdentity,
|
|
275
|
+
updateExtensionMeta,
|
|
176
276
|
updateJiraMetadata,
|
|
277
|
+
upsertRuntimeInstance,
|
|
278
|
+
upsertSwarmConfigWithPolicyMirror,
|
|
177
279
|
userCtx,
|
|
280
|
+
validateJsonSchema,
|
|
178
281
|
validateRecurringTiming,
|
|
179
282
|
verifyAgentMailWebhook,
|
|
180
283
|
verifyGitLabWebhook,
|
|
284
|
+
verifyHmacSignature,
|
|
181
285
|
verifyWebhookSignature,
|
|
182
286
|
warnIfCorsAllowsAnyOrigin,
|
|
183
|
-
wireHttpSpanLifecycle
|
|
184
|
-
|
|
185
|
-
} from "./cli-cv7s5zdq.js";
|
|
287
|
+
wireHttpSpanLifecycle
|
|
288
|
+
} from "./cli-5tpgq60f.js";
|
|
186
289
|
import"./cli-0z2v4nhw.js";
|
|
187
|
-
import {
|
|
188
|
-
Anthropic
|
|
189
|
-
} from "./cli-j490egb5.js";
|
|
190
|
-
import {
|
|
191
|
-
isClaudeBridgeEffective,
|
|
192
|
-
resolveClaudeTransport
|
|
193
|
-
} from "./cli-eree7rnv.js";
|
|
194
290
|
import {
|
|
195
291
|
REFERENCES_SOURCE_MAX_LENGTH,
|
|
196
292
|
sanitizeReferencesSource
|
|
197
|
-
} from "./cli-
|
|
293
|
+
} from "./cli-4wppfkcm.js";
|
|
198
294
|
import {
|
|
199
|
-
|
|
200
|
-
|
|
295
|
+
deriveCodexKeySuffix,
|
|
296
|
+
getValidCodexOAuth,
|
|
297
|
+
loadAllCodexOAuthSlots
|
|
298
|
+
} from "./cli-e7d20cty.js";
|
|
201
299
|
import {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
300
|
+
isMultiRuntimeEnabled
|
|
301
|
+
} from "./cli-re8z5p8p.js";
|
|
302
|
+
import"./cli-3dpj7atn.js";
|
|
205
303
|
import {
|
|
206
304
|
getModelsCatalog
|
|
207
|
-
} from "./cli-
|
|
208
|
-
import {
|
|
209
|
-
normalizeModelKey
|
|
210
|
-
} from "./cli-5m0qmvdp.js";
|
|
305
|
+
} from "./cli-g69fdc9g.js";
|
|
211
306
|
import {
|
|
212
307
|
getUserGrant
|
|
213
|
-
} from "./cli-
|
|
308
|
+
} from "./cli-7tgcstn2.js";
|
|
214
309
|
import {
|
|
215
310
|
can,
|
|
216
311
|
clearAuditSink,
|
|
217
312
|
decideToolAdmission,
|
|
218
313
|
isRbacEnabled,
|
|
219
314
|
setAuditSink
|
|
220
|
-
} from "./cli-
|
|
221
|
-
import {
|
|
222
|
-
ensureAgentFsCredentialsForAgent,
|
|
223
|
-
extractArgsJsonSchema,
|
|
224
|
-
extractScriptSignature,
|
|
225
|
-
getScriptAppTypes,
|
|
226
|
-
inviteEmailToSharedOrg,
|
|
227
|
-
scriptSdkTypesWithGeneratedApis,
|
|
228
|
-
scriptStdlibTypesWithGeneratedApis,
|
|
229
|
-
typecheckScript
|
|
230
|
-
} from "./cli-4260r1tg.js";
|
|
231
|
-
import {
|
|
232
|
-
collectScriptReferences,
|
|
233
|
-
getApp,
|
|
234
|
-
listAppRecords
|
|
235
|
-
} from "./cli-hzqmgcm2.js";
|
|
236
|
-
import {
|
|
237
|
-
require_dist
|
|
238
|
-
} from "./cli-qgm2pfpq.js";
|
|
239
|
-
import {
|
|
240
|
-
checkHeartbeatChecklist,
|
|
241
|
-
runHeartbeatSweep,
|
|
242
|
-
stopHeartbeat
|
|
243
|
-
} from "./cli-01g3x1ca.js";
|
|
244
|
-
import {
|
|
245
|
-
AGENT_MAX_TASKS_CONFIG_KEY,
|
|
246
|
-
createResumeFollowUp,
|
|
247
|
-
createWorkerTaskFollowUp,
|
|
248
|
-
getRuntimeInstanceById,
|
|
249
|
-
listRuntimeInstancesForAgent,
|
|
250
|
-
reconcileAgentMaxTasksPolicy,
|
|
251
|
-
reconcileAgentStatusFromRuntimes,
|
|
252
|
-
resetAgentMaxTasksMirror,
|
|
253
|
-
runtimeStaleThresholdMinutes,
|
|
254
|
-
setRuntimeCredentialReady,
|
|
255
|
-
touchRuntimeInstance,
|
|
256
|
-
upsertRuntimeInstance,
|
|
257
|
-
upsertSwarmConfigWithPolicyMirror
|
|
258
|
-
} from "./cli-y3pq4v9g.js";
|
|
259
|
-
import {
|
|
260
|
-
isMultiRuntimeEnabled
|
|
261
|
-
} from "./cli-07jd68a1.js";
|
|
262
|
-
import {
|
|
263
|
-
RawLlmConfigSchema,
|
|
264
|
-
RawLlmOutputSchema,
|
|
265
|
-
TriggerSchemaError,
|
|
266
|
-
WebhookError,
|
|
267
|
-
automationIntegrationFixUrl,
|
|
268
|
-
cancelWorkflowRun,
|
|
269
|
-
executeRawLlm,
|
|
270
|
-
getAutomationSetupStates,
|
|
271
|
-
getExecutorRegistry,
|
|
272
|
-
handleWebhookTrigger,
|
|
273
|
-
initWorkflows,
|
|
274
|
-
listEnabledAutomationPreflightInputs,
|
|
275
|
-
preflightAutomation,
|
|
276
|
-
retryFailedRun,
|
|
277
|
-
snapshotAndUpdateWorkflow,
|
|
278
|
-
startWorkflowExecution,
|
|
279
|
-
validateJsonSchema,
|
|
280
|
-
verifyHmacSignature
|
|
281
|
-
} from "./cli-ddfw1mc4.js";
|
|
282
|
-
import"./cli-1ebpar1q.js";
|
|
283
|
-
import {
|
|
284
|
-
deriveCodexKeySuffix,
|
|
285
|
-
getValidCodexOAuth,
|
|
286
|
-
loadAllCodexOAuthSlots
|
|
287
|
-
} from "./cli-e7d20cty.js";
|
|
288
|
-
import"./cli-3dpj7atn.js";
|
|
315
|
+
} from "./cli-gbfwcd3k.js";
|
|
289
316
|
import {
|
|
290
317
|
ConnectionAuthInputSchema,
|
|
291
318
|
MAX_SCRIPT_WALL_CLOCK_MS,
|
|
@@ -298,6 +325,8 @@ import {
|
|
|
298
325
|
buildSandboxedCommand,
|
|
299
326
|
buildScriptCredentialBindingsWithFailures,
|
|
300
327
|
callMcpServerTool,
|
|
328
|
+
checkImportAllowlist,
|
|
329
|
+
collectScriptReferences,
|
|
301
330
|
computeExpiresAt,
|
|
302
331
|
connectionAuthInputFromFlat,
|
|
303
332
|
connectionAuthSummary,
|
|
@@ -315,6 +344,7 @@ import {
|
|
|
315
344
|
findReusableMcpOAuthClient,
|
|
316
345
|
gcMcpOAuthPending,
|
|
317
346
|
generateEdges,
|
|
347
|
+
getApp,
|
|
318
348
|
getCredentialBindingById,
|
|
319
349
|
getMcpOAuthToken,
|
|
320
350
|
getOAuthBindingTokenStatus,
|
|
@@ -330,6 +360,7 @@ import {
|
|
|
330
360
|
insertMcpOAuthPending,
|
|
331
361
|
invalidateMcpOAuthClient,
|
|
332
362
|
isInvalidClientError,
|
|
363
|
+
listAppRecords,
|
|
333
364
|
listRelationalCredentialBindings,
|
|
334
365
|
listScriptApisForScript,
|
|
335
366
|
listScriptConnections,
|
|
@@ -346,6 +377,7 @@ import {
|
|
|
346
377
|
refreshMcpToken,
|
|
347
378
|
refreshScriptConnection,
|
|
348
379
|
registerClient,
|
|
380
|
+
require_dist,
|
|
349
381
|
require_typescript,
|
|
350
382
|
resolveAdvertisedTokenEndpointAuthMethod,
|
|
351
383
|
restoreScratchScriptLastUsedIfUnchanged,
|
|
@@ -363,19 +395,8 @@ import {
|
|
|
363
395
|
upsertScriptByName,
|
|
364
396
|
upsertScriptConnection,
|
|
365
397
|
validateDefinition
|
|
366
|
-
} from "./cli-
|
|
398
|
+
} from "./cli-sjaae6ff.js";
|
|
367
399
|
import"./cli-epan13p1.js";
|
|
368
|
-
import {
|
|
369
|
-
searchScripts
|
|
370
|
-
} from "./cli-3z634pqe.js";
|
|
371
|
-
import {
|
|
372
|
-
CANDIDATE_SET_MULTIPLIER,
|
|
373
|
-
getEmbeddingProvider,
|
|
374
|
-
getMemoryStore,
|
|
375
|
-
init_constants as init_constants2,
|
|
376
|
-
init_reranker,
|
|
377
|
-
rerank
|
|
378
|
-
} from "./cli-jezx9b9c.js";
|
|
379
400
|
import {
|
|
380
401
|
detachedProcessGroup,
|
|
381
402
|
forceTerminateProcessGroup,
|
|
@@ -386,7 +407,7 @@ import {
|
|
|
386
407
|
import {
|
|
387
408
|
getApiKey
|
|
388
409
|
} from "./cli-f14fvzag.js";
|
|
389
|
-
import"./cli-
|
|
410
|
+
import"./cli-fad8m16k.js";
|
|
390
411
|
import {
|
|
391
412
|
acquireOAuthRefreshLock,
|
|
392
413
|
buildAuthorizationUrl,
|
|
@@ -410,41 +431,15 @@ import {
|
|
|
410
431
|
updateAuthorizationIdentity,
|
|
411
432
|
updateOAuthAppById,
|
|
412
433
|
upsertAuthorization
|
|
413
|
-
} from "./cli-
|
|
414
|
-
import"./cli-fad8m16k.js";
|
|
415
|
-
import"./cli-aehm1rbq.js";
|
|
416
|
-
import"./cli-bsakbbkm.js";
|
|
417
|
-
import"./cli-51tf7ac3.js";
|
|
418
|
-
import {
|
|
419
|
-
MAX_TASK_ATTACHMENT_BYTES,
|
|
420
|
-
recordTaskAttachmentUpload
|
|
421
|
-
} from "./cli-sdzq01t9.js";
|
|
422
|
-
import {
|
|
423
|
-
FilesError,
|
|
424
|
-
getFileStorageProvider,
|
|
425
|
-
normalizeFilesError
|
|
426
|
-
} from "./cli-jsp14b6c.js";
|
|
434
|
+
} from "./cli-j9xczhaq.js";
|
|
427
435
|
import {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
linkIdentity,
|
|
432
|
-
listUserEvents,
|
|
433
|
-
listUserTokens,
|
|
434
|
-
mintSessionToken,
|
|
435
|
-
mintToken,
|
|
436
|
-
recordIdentityEvent,
|
|
437
|
-
recordUnmappedIdentity,
|
|
438
|
-
renderIdentity,
|
|
439
|
-
resolveIdentity,
|
|
440
|
-
resolveUserByToken,
|
|
441
|
-
revokeSessionToken,
|
|
442
|
-
revokeToken,
|
|
443
|
-
unlinkIdentity
|
|
444
|
-
} from "./cli-j4d4f6hv.js";
|
|
436
|
+
normalizeModelKey
|
|
437
|
+
} from "./cli-0qb1z6s2.js";
|
|
438
|
+
import"./cli-bsakbbkm.js";
|
|
445
439
|
import {
|
|
446
|
-
|
|
447
|
-
} from "./cli-
|
|
440
|
+
searchScripts
|
|
441
|
+
} from "./cli-q88st9aj.js";
|
|
442
|
+
import"./cli-51tf7ac3.js";
|
|
448
443
|
import {
|
|
449
444
|
ensure,
|
|
450
445
|
getSlackApp,
|
|
@@ -460,10 +455,25 @@ import {
|
|
|
460
455
|
withRemoteContext,
|
|
461
456
|
withSpan,
|
|
462
457
|
withSpanContext
|
|
463
|
-
} from "./cli-
|
|
458
|
+
} from "./cli-r2q6pevn.js";
|
|
464
459
|
import"./cli-q51yprfq.js";
|
|
465
|
-
import"./cli-9d8ntetj.js";
|
|
466
460
|
import"./cli-yatxqynm.js";
|
|
461
|
+
import {
|
|
462
|
+
CANDIDATE_SET_MULTIPLIER,
|
|
463
|
+
getEmbeddingProvider,
|
|
464
|
+
getMemoryStore,
|
|
465
|
+
init_constants as init_constants2,
|
|
466
|
+
init_reranker,
|
|
467
|
+
rerank
|
|
468
|
+
} from "./cli-ppm4975n.js";
|
|
469
|
+
import"./cli-fm4ytsdk.js";
|
|
470
|
+
import"./cli-aehm1rbq.js";
|
|
471
|
+
import"./cli-2658f6at.js";
|
|
472
|
+
import {
|
|
473
|
+
FilesError,
|
|
474
|
+
getFileStorageProvider,
|
|
475
|
+
normalizeFilesError
|
|
476
|
+
} from "./cli-jsp14b6c.js";
|
|
467
477
|
import {
|
|
468
478
|
ActiveSessionSchema,
|
|
469
479
|
AgentAcpStatusSchema,
|
|
@@ -501,6 +511,11 @@ import {
|
|
|
501
511
|
EventNameSchema,
|
|
502
512
|
EventSourceSchema,
|
|
503
513
|
EventStatusSchema,
|
|
514
|
+
ExtensionInstallBodySchema,
|
|
515
|
+
ExtensionManifestSchema,
|
|
516
|
+
ExtensionRunSchema,
|
|
517
|
+
ExtensionSchema,
|
|
518
|
+
ExtensionVersionSchema,
|
|
504
519
|
FavoriteItemTypeSchema,
|
|
505
520
|
HeartbeatExpiryError,
|
|
506
521
|
InboxItemStateSchema,
|
|
@@ -752,6 +767,7 @@ import {
|
|
|
752
767
|
incrementPageViewCount,
|
|
753
768
|
initTelemetry,
|
|
754
769
|
init_asset_key_audit,
|
|
770
|
+
init_bundle_path,
|
|
755
771
|
init_context_key,
|
|
756
772
|
init_credential_broker,
|
|
757
773
|
init_date_utils,
|
|
@@ -770,6 +786,7 @@ import {
|
|
|
770
786
|
installMcpServer,
|
|
771
787
|
installSkill,
|
|
772
788
|
isReservedConfigKey,
|
|
789
|
+
isSafeBundlePath,
|
|
773
790
|
isSteeringEnabled as isSteeringEnabled2,
|
|
774
791
|
isTerminalTaskStatus,
|
|
775
792
|
listAgentsWithCredStatusByProvider,
|
|
@@ -865,12 +882,12 @@ import {
|
|
|
865
882
|
upsertSwarmConfig,
|
|
866
883
|
validateConfigValue,
|
|
867
884
|
withFavoriteFlags
|
|
868
|
-
} from "./cli-
|
|
885
|
+
} from "./cli-s14agm5s.js";
|
|
869
886
|
import {
|
|
870
887
|
IDENTITY_FIELD_BUDGETS,
|
|
871
888
|
IdentityFieldBudgetError,
|
|
872
889
|
init_identity_field_budget
|
|
873
|
-
} from "./cli-
|
|
890
|
+
} from "./cli-ht5rs63n.js";
|
|
874
891
|
import {
|
|
875
892
|
getAllTemplateDefinitions,
|
|
876
893
|
getTemplateDefinition,
|
|
@@ -881,7 +898,7 @@ import {
|
|
|
881
898
|
interpolate,
|
|
882
899
|
isSteeringEnabled,
|
|
883
900
|
resolveTemplate
|
|
884
|
-
} from "./cli-
|
|
901
|
+
} from "./cli-z61ykvam.js";
|
|
885
902
|
import {
|
|
886
903
|
MAX_PROFILE_FILE_LENGTH,
|
|
887
904
|
getAppUrl,
|
|
@@ -889,7 +906,7 @@ import {
|
|
|
889
906
|
getMcpBaseUrl,
|
|
890
907
|
getPublicMcpBaseUrl,
|
|
891
908
|
init_constants
|
|
892
|
-
} from "./cli-
|
|
909
|
+
} from "./cli-dv6cdjs2.js";
|
|
893
910
|
import"./cli-c2mk1kgf.js";
|
|
894
911
|
import {
|
|
895
912
|
init_env_flag,
|
|
@@ -911,7 +928,7 @@ import {
|
|
|
911
928
|
import {
|
|
912
929
|
init_package,
|
|
913
930
|
package_default
|
|
914
|
-
} from "./cli-
|
|
931
|
+
} from "./cli-zkxymas5.js";
|
|
915
932
|
import {
|
|
916
933
|
init_secret_scrubber,
|
|
917
934
|
registerVolatileSecret,
|
|
@@ -933,21 +950,21 @@ import {
|
|
|
933
950
|
} from "./cli-zf8jjwex.js";
|
|
934
951
|
import {
|
|
935
952
|
bedrockProviderModule
|
|
936
|
-
} from "./cli-
|
|
953
|
+
} from "./cli-y6x0gqtg.js";
|
|
937
954
|
import"./cli-cg4vnyh4.js";
|
|
955
|
+
import"./cli-txgcknmy.js";
|
|
956
|
+
import"./cli-6map995v.js";
|
|
957
|
+
import"./cli-j8dggbcr.js";
|
|
958
|
+
import"./cli-y2apkfe2.js";
|
|
959
|
+
import"./cli-vapyk8sw.js";
|
|
960
|
+
import"./cli-pdz9qde4.js";
|
|
938
961
|
import {
|
|
939
962
|
setBedrockProviderModule
|
|
940
963
|
} from "./cli-c4eeb5q2.js";
|
|
941
|
-
import"./cli-
|
|
942
|
-
import"./cli-txgcknmy.js";
|
|
943
|
-
import"./cli-6map995v.js";
|
|
964
|
+
import"./cli-rgvp6r2x.js";
|
|
944
965
|
import"./cli-btbzvq95.js";
|
|
945
966
|
import"./cli-1m2e086m.js";
|
|
946
|
-
import"./cli-j8dggbcr.js";
|
|
947
|
-
import"./cli-rgvp6r2x.js";
|
|
948
967
|
import"./cli-8wrympd7.js";
|
|
949
|
-
import"./cli-y2apkfe2.js";
|
|
950
|
-
import"./cli-vapyk8sw.js";
|
|
951
968
|
import"./cli-bd957dgb.js";
|
|
952
969
|
import"./cli-jyetr64j.js";
|
|
953
970
|
import"./cli-w1d1bgkk.js";
|
|
@@ -2108,39 +2125,6 @@ import { createServer as createServer2 } from "node:net";
|
|
|
2108
2125
|
import { join, resolve } from "node:path";
|
|
2109
2126
|
import { fileURLToPath } from "node:url";
|
|
2110
2127
|
|
|
2111
|
-
// src/scripts-runtime/response-limit.ts
|
|
2112
|
-
var SCRIPT_SDK_RESPONSE_LIMIT_BYTES = 64 * 1024 * 1024;
|
|
2113
|
-
function responseTooLarge(operation, limitBytes, observedBytes) {
|
|
2114
|
-
return new Error(`Script SDK response for ${operation} exceeded the ${limitBytes}-byte hard limit ` + `(${observedBytes} bytes observed); narrow the query or paginate the request.`);
|
|
2115
|
-
}
|
|
2116
|
-
async function readScriptSdkJsonResponse(response, operation, limitBytes = SCRIPT_SDK_RESPONSE_LIMIT_BYTES) {
|
|
2117
|
-
const contentLength = Number(response.headers.get("content-length"));
|
|
2118
|
-
if (Number.isFinite(contentLength) && contentLength > limitBytes) {
|
|
2119
|
-
await response.body?.cancel().catch(() => {});
|
|
2120
|
-
throw responseTooLarge(operation, limitBytes, contentLength);
|
|
2121
|
-
}
|
|
2122
|
-
if (!response.body)
|
|
2123
|
-
return {};
|
|
2124
|
-
const reader = response.body.getReader();
|
|
2125
|
-
const decoder = new TextDecoder;
|
|
2126
|
-
const parts = [];
|
|
2127
|
-
let receivedBytes = 0;
|
|
2128
|
-
while (true) {
|
|
2129
|
-
const { done, value } = await reader.read();
|
|
2130
|
-
if (done)
|
|
2131
|
-
break;
|
|
2132
|
-
receivedBytes += value.byteLength;
|
|
2133
|
-
if (receivedBytes > limitBytes) {
|
|
2134
|
-
await reader.cancel().catch(() => {});
|
|
2135
|
-
throw responseTooLarge(operation, limitBytes, receivedBytes);
|
|
2136
|
-
}
|
|
2137
|
-
parts.push(decoder.decode(value, { stream: true }));
|
|
2138
|
-
}
|
|
2139
|
-
parts.push(decoder.decode());
|
|
2140
|
-
const text = parts.join("");
|
|
2141
|
-
return text ? JSON.parse(text) : {};
|
|
2142
|
-
}
|
|
2143
|
-
|
|
2144
2128
|
// src/script-workflows/capability-bridge.ts
|
|
2145
2129
|
var MAX_PENDING_CAPABILITY_CALLS = 64;
|
|
2146
2130
|
function protocolError(kind, detail) {
|
|
@@ -2253,145 +2237,6 @@ function scriptRunMaxAgentTasks() {
|
|
|
2253
2237
|
return positiveIntEnv("SCRIPT_RUN_MAX_AGENT_TASKS", DEFAULT_MAX_AGENT_TASKS);
|
|
2254
2238
|
}
|
|
2255
2239
|
|
|
2256
|
-
// src/scripts-runtime/sdk-allowlist.ts
|
|
2257
|
-
var SDK_TOOL_NAME_MAP = {
|
|
2258
|
-
memory_search: "memory-search",
|
|
2259
|
-
memory_get: "memory-get",
|
|
2260
|
-
memory_edit: "memory-edit",
|
|
2261
|
-
memory_store: "memory-store",
|
|
2262
|
-
memory_rate: "memory_rate",
|
|
2263
|
-
memory_delete: "memory-delete",
|
|
2264
|
-
inject_learning: "inject-learning",
|
|
2265
|
-
task_list: "get-tasks",
|
|
2266
|
-
task_get: "get-task-details",
|
|
2267
|
-
task_storeProgress: "store-progress",
|
|
2268
|
-
task_defer: "defer-task",
|
|
2269
|
-
task_poll: "poll-task",
|
|
2270
|
-
task_send: "send-task",
|
|
2271
|
-
task_cancel: "cancel-task",
|
|
2272
|
-
task_steer: "steer-task",
|
|
2273
|
-
task_action: "task-action",
|
|
2274
|
-
kv_get: "kv-get",
|
|
2275
|
-
kv_getOrNull: "kv-get",
|
|
2276
|
-
kv_set: "kv-set",
|
|
2277
|
-
kv_delete: "kv-delete",
|
|
2278
|
-
kv_del: "kv-delete",
|
|
2279
|
-
kv_incr: "kv-incr",
|
|
2280
|
-
kv_list: "kv-list",
|
|
2281
|
-
room_get: "room-get",
|
|
2282
|
-
room_change: "room-change",
|
|
2283
|
-
room_reset: "room-reset",
|
|
2284
|
-
room_decode: "room-decode",
|
|
2285
|
-
repo_list: "get-repos",
|
|
2286
|
-
repo_update: "update-repo",
|
|
2287
|
-
schedule_list: "list-schedules",
|
|
2288
|
-
schedule_create: "create-schedule",
|
|
2289
|
-
schedule_update: "update-schedule",
|
|
2290
|
-
schedule_patch: "patch-schedule",
|
|
2291
|
-
schedule_delete: "delete-schedule",
|
|
2292
|
-
schedule_runNow: "run-schedule-now",
|
|
2293
|
-
script_search: "script-search",
|
|
2294
|
-
script_run: "script-run",
|
|
2295
|
-
script_upsert: "script-upsert",
|
|
2296
|
-
script_delete: "script-delete",
|
|
2297
|
-
script_queryTypes: "script-query-types",
|
|
2298
|
-
script_launchRun: "launch-script-run",
|
|
2299
|
-
script_getRun: "get-script-run",
|
|
2300
|
-
script_listRuns: "list-script-runs",
|
|
2301
|
-
swarm_get: "get-swarm",
|
|
2302
|
-
agent_info: "my-agent-info",
|
|
2303
|
-
agent_join: "join-swarm",
|
|
2304
|
-
metrics_get: "get-metrics",
|
|
2305
|
-
user_resolve: "resolve-user",
|
|
2306
|
-
user_manage: "manage-user",
|
|
2307
|
-
db_query: "db-query",
|
|
2308
|
-
config_get: "get-config",
|
|
2309
|
-
config_list: "list-config",
|
|
2310
|
-
config_set: "set-config",
|
|
2311
|
-
config_delete: "delete-config",
|
|
2312
|
-
slack_read: "slack-read",
|
|
2313
|
-
slack_listChannels: "slack-list-channels",
|
|
2314
|
-
slack_post: "slack-post",
|
|
2315
|
-
slack_reply: "slack-reply",
|
|
2316
|
-
slack_startThread: "slack-start-thread",
|
|
2317
|
-
slack_createChannel: "slack-create-channel",
|
|
2318
|
-
slack_inviteToChannel: "slack-invite-to-channel",
|
|
2319
|
-
slack_archiveChannel: "slack-archive-channel",
|
|
2320
|
-
slack_uploadFile: "slack-upload-file",
|
|
2321
|
-
slack_downloadFile: "slack-download-file",
|
|
2322
|
-
slack_delete: "slack-delete",
|
|
2323
|
-
slack_update: "slack-update",
|
|
2324
|
-
message_read: "read-messages",
|
|
2325
|
-
message_post: "post-message",
|
|
2326
|
-
profile_update: "update-profile",
|
|
2327
|
-
context_history: "context-history",
|
|
2328
|
-
context_diff: "context-diff",
|
|
2329
|
-
service_list: "list-services",
|
|
2330
|
-
service_register: "register-service",
|
|
2331
|
-
service_unregister: "unregister-service",
|
|
2332
|
-
service_updateStatus: "update-service-status",
|
|
2333
|
-
workflow_list: "list-workflows",
|
|
2334
|
-
workflow_get: "get-workflow",
|
|
2335
|
-
workflow_create: "create-workflow",
|
|
2336
|
-
workflow_update: "update-workflow",
|
|
2337
|
-
workflow_patch: "patch-workflow",
|
|
2338
|
-
workflow_patchNode: "patch-workflow-node",
|
|
2339
|
-
workflow_delete: "delete-workflow",
|
|
2340
|
-
workflow_trigger: "trigger-workflow",
|
|
2341
|
-
workflow_listRuns: "list-workflow-runs",
|
|
2342
|
-
workflow_getRun: "get-workflow-run",
|
|
2343
|
-
workflow_retryRun: "retry-workflow-run",
|
|
2344
|
-
workflow_cancelRun: "cancel-workflow-run",
|
|
2345
|
-
prompt_list: "list-prompt-templates",
|
|
2346
|
-
prompt_get: "get-prompt-template",
|
|
2347
|
-
prompt_set: "set-prompt-template",
|
|
2348
|
-
prompt_delete: "delete-prompt-template",
|
|
2349
|
-
prompt_preview: "preview-prompt-template",
|
|
2350
|
-
tracker_status: "tracker-status",
|
|
2351
|
-
tracker_syncStatus: "tracker-sync-status",
|
|
2352
|
-
tracker_linkTask: "tracker-link-task",
|
|
2353
|
-
tracker_unlink: "tracker-unlink",
|
|
2354
|
-
tracker_mapAgent: "tracker-map-agent",
|
|
2355
|
-
skill_list: "skill-list",
|
|
2356
|
-
skill_get: "skill-get",
|
|
2357
|
-
skill_getFile: "skill-get-file",
|
|
2358
|
-
skill_search: "skill-search",
|
|
2359
|
-
skill_create: "skill-create",
|
|
2360
|
-
skill_update: "skill-update",
|
|
2361
|
-
skill_delete: "skill-delete",
|
|
2362
|
-
skill_install: "skill-install",
|
|
2363
|
-
skill_uninstall: "skill-uninstall",
|
|
2364
|
-
skill_publish: "skill-publish",
|
|
2365
|
-
mcpServer_list: "mcp-server-list",
|
|
2366
|
-
mcpServer_get: "mcp-server-get",
|
|
2367
|
-
mcpServer_create: "mcp-server-create",
|
|
2368
|
-
mcpServer_update: "mcp-server-update",
|
|
2369
|
-
mcpServer_delete: "mcp-server-delete",
|
|
2370
|
-
mcpServer_install: "mcp-server-install",
|
|
2371
|
-
mcpServer_uninstall: "mcp-server-uninstall",
|
|
2372
|
-
app_get: "app-get",
|
|
2373
|
-
app_history: "app-history",
|
|
2374
|
-
app_diff: "app-diff",
|
|
2375
|
-
app_list: "app-list",
|
|
2376
|
-
app_patch: "app-patch",
|
|
2377
|
-
app_query: "app-query",
|
|
2378
|
-
app_rollback: "app-rollback",
|
|
2379
|
-
app_sync: "app-sync",
|
|
2380
|
-
app_upsert: "app-upsert",
|
|
2381
|
-
page_create: "create_page",
|
|
2382
|
-
page_delete: "delete-page",
|
|
2383
|
-
metric_create: "create_metric",
|
|
2384
|
-
request_humanInput: "request-human-input"
|
|
2385
|
-
};
|
|
2386
|
-
var SDK_ALLOWLIST = Object.keys(SDK_TOOL_NAME_MAP);
|
|
2387
|
-
var MCP_TOOL_NAMES = new Set(Object.values(SDK_TOOL_NAME_MAP));
|
|
2388
|
-
function isMcpToolAllowedForScripts(mcpToolName) {
|
|
2389
|
-
return MCP_TOOL_NAMES.has(mcpToolName);
|
|
2390
|
-
}
|
|
2391
|
-
function mcpToolNameForSdkMethod(name) {
|
|
2392
|
-
return SDK_TOOL_NAME_MAP[name] ?? name;
|
|
2393
|
-
}
|
|
2394
|
-
|
|
2395
2240
|
// src/script-workflows/swarm-capabilities.ts
|
|
2396
2241
|
var WORKFLOW_SWARM_CAPABILITY_ALLOWLIST = [...SDK_ALLOWLIST];
|
|
2397
2242
|
var WORKFLOW_SWARM_CAPABILITIES = new Set(WORKFLOW_SWARM_CAPABILITY_ALLOWLIST);
|
|
@@ -2399,42 +2244,6 @@ function isWorkflowSwarmCapabilityAllowed(method) {
|
|
|
2399
2244
|
return WORKFLOW_SWARM_CAPABILITIES.has(method);
|
|
2400
2245
|
}
|
|
2401
2246
|
|
|
2402
|
-
// src/scripts-runtime/redacted.ts
|
|
2403
|
-
var registry = new WeakMap;
|
|
2404
|
-
var proto = {
|
|
2405
|
-
toString() {
|
|
2406
|
-
return "<redacted>";
|
|
2407
|
-
},
|
|
2408
|
-
toJSON() {
|
|
2409
|
-
return "<redacted>";
|
|
2410
|
-
},
|
|
2411
|
-
[Symbol.for("nodejs.util.inspect.custom")]() {
|
|
2412
|
-
return "<redacted>";
|
|
2413
|
-
}
|
|
2414
|
-
};
|
|
2415
|
-
function getEntry(self) {
|
|
2416
|
-
const entry = registry.get(self);
|
|
2417
|
-
if (!entry)
|
|
2418
|
-
throw new Error("Redacted value was not in registry");
|
|
2419
|
-
return entry;
|
|
2420
|
-
}
|
|
2421
|
-
var Redacted = {
|
|
2422
|
-
make(value, meta = { type: "user", isSecret: false }) {
|
|
2423
|
-
const redacted = Object.create(proto);
|
|
2424
|
-
registry.set(redacted, { value, meta });
|
|
2425
|
-
return redacted;
|
|
2426
|
-
},
|
|
2427
|
-
value(self) {
|
|
2428
|
-
return getEntry(self).value;
|
|
2429
|
-
},
|
|
2430
|
-
meta(self) {
|
|
2431
|
-
return getEntry(self).meta;
|
|
2432
|
-
},
|
|
2433
|
-
isSecret(self) {
|
|
2434
|
-
return Redacted.meta(self).isSecret;
|
|
2435
|
-
}
|
|
2436
|
-
};
|
|
2437
|
-
|
|
2438
2247
|
// src/scripts-runtime/stdlib/fetch.ts
|
|
2439
2248
|
async function runtimeFetch(input, options = {}) {
|
|
2440
2249
|
const { retries = 3, timeoutMs = 30000, signal, ...init } = options;
|
|
@@ -3708,7 +3517,7 @@ var listAgentRuntimeInstances = route({
|
|
|
3708
3517
|
path: "/api/agents/{id}/runtime-instances",
|
|
3709
3518
|
pattern: ["api", "agents", null, "runtime-instances"],
|
|
3710
3519
|
summary: "List runtime instances serving an agent",
|
|
3711
|
-
description: "Read-only view of the worker processes currently registered for a logical agent. Rows exist only for multi-runtime registrations (MULTI_RUNTIME_ENABLED), so the list is empty
|
|
3520
|
+
description: "Read-only view of the worker processes currently registered for a logical agent. Rows exist only for multi-runtime registrations (MULTI_RUNTIME_ENABLED), so the list is empty when the flag is disabled. `isLive` combines `status` with `lastSeenAt` freshness against the server's staleness cutoff (`staleThresholdMinutes`); `reportedSlots` is each process's self-reported capacity, distinct from the agent's logical `maxTasks` policy.",
|
|
3712
3521
|
tags: ["Agents"],
|
|
3713
3522
|
params: exports_external.object({ id: exports_external.string() }),
|
|
3714
3523
|
responses: {
|
|
@@ -5079,6 +4888,7 @@ async function handleApprovalRequests(req, res, pathSegments, queryParams) {
|
|
|
5079
4888
|
await createTaskExtended(taskText, {
|
|
5080
4889
|
agentId: sourceTask.agentId,
|
|
5081
4890
|
routingReason: sourceTask.agentId ? "continuity" : undefined,
|
|
4891
|
+
routingSource: sourceTask.agentId ? "engine_default" : undefined,
|
|
5082
4892
|
parentTaskId: updated.sourceTaskId,
|
|
5083
4893
|
source: "system",
|
|
5084
4894
|
taskType: "hitl-follow-up",
|
|
@@ -5940,7 +5750,8 @@ async function handleConfig(req, res, pathSegments, queryParams) {
|
|
|
5940
5750
|
}
|
|
5941
5751
|
const presence = {};
|
|
5942
5752
|
for (const key of keys) {
|
|
5943
|
-
|
|
5753
|
+
const value = key === "SWARM_ORG_NAME" ? process.env[key]?.trim() : process.env[key];
|
|
5754
|
+
presence[key] = value !== undefined && value !== "";
|
|
5944
5755
|
}
|
|
5945
5756
|
envPresence.respond(res, 200, { presence });
|
|
5946
5757
|
return true;
|
|
@@ -6317,94 +6128,1210 @@ var getEventsRoute = route({
|
|
|
6317
6128
|
schema: exports_external.object({ events: exports_external.array(SwarmEventSchema) })
|
|
6318
6129
|
}
|
|
6319
6130
|
},
|
|
6320
|
-
auth: { apiKey: true }
|
|
6131
|
+
auth: { apiKey: true }
|
|
6132
|
+
});
|
|
6133
|
+
var getEventCountsRoute = route({
|
|
6134
|
+
method: "get",
|
|
6135
|
+
path: "/api/events/counts",
|
|
6136
|
+
pattern: ["api", "events", "counts"],
|
|
6137
|
+
summary: "Get event counts grouped by event name",
|
|
6138
|
+
tags: ["Events"],
|
|
6139
|
+
query: exports_external.object({
|
|
6140
|
+
category: EventCategorySchema.optional(),
|
|
6141
|
+
source: EventSourceSchema.optional(),
|
|
6142
|
+
agentId: exports_external.string().optional(),
|
|
6143
|
+
taskId: exports_external.string().optional(),
|
|
6144
|
+
sessionId: exports_external.string().optional(),
|
|
6145
|
+
since: exports_external.string().optional(),
|
|
6146
|
+
until: exports_external.string().optional()
|
|
6147
|
+
}),
|
|
6148
|
+
responses: {
|
|
6149
|
+
200: {
|
|
6150
|
+
description: "Event counts",
|
|
6151
|
+
schema: exports_external.object({
|
|
6152
|
+
counts: exports_external.array(exports_external.object({ event: exports_external.string(), count: exports_external.number().int() }))
|
|
6153
|
+
})
|
|
6154
|
+
}
|
|
6155
|
+
},
|
|
6156
|
+
auth: { apiKey: true }
|
|
6157
|
+
});
|
|
6158
|
+
async function handleEvents(req, res, pathSegments, queryParams, _myAgentId) {
|
|
6159
|
+
if (createEventsBatchRoute.match(req.method, pathSegments)) {
|
|
6160
|
+
const parsed = await createEventsBatchRoute.parse(req, res, pathSegments, queryParams);
|
|
6161
|
+
if (!parsed)
|
|
6162
|
+
return true;
|
|
6163
|
+
try {
|
|
6164
|
+
const count = await createEventsBatch(parsed.body.events);
|
|
6165
|
+
createEventsBatchRoute.respond(res, 201, { success: true, count });
|
|
6166
|
+
} catch (error) {
|
|
6167
|
+
console.error("[HTTP] Failed to create events batch:", error);
|
|
6168
|
+
jsonError(res, "Failed to store events batch", 500);
|
|
6169
|
+
}
|
|
6170
|
+
return true;
|
|
6171
|
+
}
|
|
6172
|
+
if (getEventCountsRoute.match(req.method, pathSegments)) {
|
|
6173
|
+
const parsed = await getEventCountsRoute.parse(req, res, pathSegments, queryParams);
|
|
6174
|
+
if (!parsed)
|
|
6175
|
+
return true;
|
|
6176
|
+
const counts = await getEventCountsFiltered({
|
|
6177
|
+
category: parsed.query.category || undefined,
|
|
6178
|
+
source: parsed.query.source || undefined,
|
|
6179
|
+
agentId: parsed.query.agentId || undefined,
|
|
6180
|
+
taskId: parsed.query.taskId || undefined,
|
|
6181
|
+
sessionId: parsed.query.sessionId || undefined,
|
|
6182
|
+
since: parsed.query.since || undefined,
|
|
6183
|
+
until: parsed.query.until || undefined
|
|
6184
|
+
});
|
|
6185
|
+
getEventCountsRoute.respond(res, 200, { counts });
|
|
6186
|
+
return true;
|
|
6187
|
+
}
|
|
6188
|
+
if (createEventRoute.match(req.method, pathSegments)) {
|
|
6189
|
+
const parsed = await createEventRoute.parse(req, res, pathSegments, queryParams);
|
|
6190
|
+
if (!parsed)
|
|
6191
|
+
return true;
|
|
6192
|
+
try {
|
|
6193
|
+
const event = await createEvent(parsed.body);
|
|
6194
|
+
createEventRoute.respond(res, 201, { success: true, event });
|
|
6195
|
+
} catch (error) {
|
|
6196
|
+
console.error("[HTTP] Failed to create event:", error);
|
|
6197
|
+
jsonError(res, "Failed to store event", 500);
|
|
6198
|
+
}
|
|
6199
|
+
return true;
|
|
6200
|
+
}
|
|
6201
|
+
if (getEventsRoute.match(req.method, pathSegments)) {
|
|
6202
|
+
const parsed = await getEventsRoute.parse(req, res, pathSegments, queryParams);
|
|
6203
|
+
if (!parsed)
|
|
6204
|
+
return true;
|
|
6205
|
+
const events = await getEventsFiltered({
|
|
6206
|
+
category: parsed.query.category || undefined,
|
|
6207
|
+
event: parsed.query.event || undefined,
|
|
6208
|
+
status: parsed.query.status || undefined,
|
|
6209
|
+
source: parsed.query.source || undefined,
|
|
6210
|
+
agentId: parsed.query.agentId || undefined,
|
|
6211
|
+
taskId: parsed.query.taskId || undefined,
|
|
6212
|
+
sessionId: parsed.query.sessionId || undefined,
|
|
6213
|
+
dataField: parsed.query.dataField || undefined,
|
|
6214
|
+
since: parsed.query.since || undefined,
|
|
6215
|
+
until: parsed.query.until || undefined,
|
|
6216
|
+
limit: parsed.query.limit ?? 100
|
|
6217
|
+
});
|
|
6218
|
+
getEventsRoute.respond(res, 200, { events });
|
|
6219
|
+
return true;
|
|
6220
|
+
}
|
|
6221
|
+
return false;
|
|
6222
|
+
}
|
|
6223
|
+
|
|
6224
|
+
// src/http/extensions.ts
|
|
6225
|
+
init_zod();
|
|
6226
|
+
init_db();
|
|
6227
|
+
|
|
6228
|
+
// src/be/extensions/validate.ts
|
|
6229
|
+
init_bundle_path();
|
|
6230
|
+
|
|
6231
|
+
// src/extensions/contract-types.generated.ts
|
|
6232
|
+
var EXTENSION_TYPE_DEFINITIONS = `// biome-ignore-all lint/suspicious/noConfusingVoidType: Extension handlers may explicitly return no result.
|
|
6233
|
+
declare module "swarm-extension" {
|
|
6234
|
+
export type CreateTaskOptions = {
|
|
6235
|
+
key?: string | undefined;
|
|
6236
|
+
agentId?: string | null | undefined;
|
|
6237
|
+
creatorAgentId?: string | undefined;
|
|
6238
|
+
source?:
|
|
6239
|
+
| "workflow"
|
|
6240
|
+
| "schedule"
|
|
6241
|
+
| "slack"
|
|
6242
|
+
| "agentmail"
|
|
6243
|
+
| "mcp"
|
|
6244
|
+
| "api"
|
|
6245
|
+
| "ui"
|
|
6246
|
+
| "github"
|
|
6247
|
+
| "gitlab"
|
|
6248
|
+
| "system"
|
|
6249
|
+
| "linear"
|
|
6250
|
+
| "jira"
|
|
6251
|
+
| undefined;
|
|
6252
|
+
routingReason?:
|
|
6253
|
+
| "skill"
|
|
6254
|
+
| "continuity"
|
|
6255
|
+
| "overflow"
|
|
6256
|
+
| "human_pinned"
|
|
6257
|
+
| "reroute_fault"
|
|
6258
|
+
| undefined;
|
|
6259
|
+
routingSource?: "declared" | "engine_default" | undefined;
|
|
6260
|
+
routingNote?: string | undefined;
|
|
6261
|
+
taskType?: string | undefined;
|
|
6262
|
+
tags?: string[] | undefined;
|
|
6263
|
+
priority?: number | undefined;
|
|
6264
|
+
dependsOn?: string[] | undefined;
|
|
6265
|
+
offeredTo?: string | undefined;
|
|
6266
|
+
status?: "draft" | "backlog" | "unassigned" | undefined;
|
|
6267
|
+
slackChannelId?: string | undefined;
|
|
6268
|
+
slackThreadTs?: string | undefined;
|
|
6269
|
+
slackTriggerMessageTs?: string | undefined;
|
|
6270
|
+
slackUserId?: string | undefined;
|
|
6271
|
+
overrideSlackContext?: boolean | undefined;
|
|
6272
|
+
vcsProvider?: "github" | "gitlab" | undefined;
|
|
6273
|
+
vcsRepo?: string | undefined;
|
|
6274
|
+
vcsEventType?: string | undefined;
|
|
6275
|
+
vcsNumber?: number | undefined;
|
|
6276
|
+
vcsCommentId?: number | undefined;
|
|
6277
|
+
vcsAuthor?: string | undefined;
|
|
6278
|
+
vcsUrl?: string | undefined;
|
|
6279
|
+
vcsInstallationId?: number | undefined;
|
|
6280
|
+
vcsNodeId?: string | undefined;
|
|
6281
|
+
agentmailInboxId?: string | undefined;
|
|
6282
|
+
agentmailMessageId?: string | undefined;
|
|
6283
|
+
agentmailThreadId?: string | undefined;
|
|
6284
|
+
mentionMessageId?: string | undefined;
|
|
6285
|
+
mentionChannelId?: string | undefined;
|
|
6286
|
+
dir?: string | undefined;
|
|
6287
|
+
parentTaskId?: string | undefined;
|
|
6288
|
+
model?: string | undefined;
|
|
6289
|
+
modelTier?: "smol" | "regular" | "smart" | "ultra" | undefined;
|
|
6290
|
+
effort?: "off" | "low" | "medium" | "high" | "xhigh" | "max" | undefined;
|
|
6291
|
+
scheduleId?: string | undefined;
|
|
6292
|
+
workflowRunId?: string | undefined;
|
|
6293
|
+
workflowRunStepId?: string | undefined;
|
|
6294
|
+
sourceTaskId?: string | undefined;
|
|
6295
|
+
outputSchema?: Record<string, unknown> | undefined;
|
|
6296
|
+
inheritParentOutputSchema?: boolean | undefined;
|
|
6297
|
+
inheritParentRoutingAffinity?: boolean | undefined;
|
|
6298
|
+
followUpConfig?:
|
|
6299
|
+
| {
|
|
6300
|
+
disabled?: boolean | undefined;
|
|
6301
|
+
onCompleted?: string | undefined;
|
|
6302
|
+
onFailed?: string | undefined;
|
|
6303
|
+
}
|
|
6304
|
+
| undefined;
|
|
6305
|
+
requestedByUserId?: string | undefined;
|
|
6306
|
+
contextKey?: string | undefined;
|
|
6307
|
+
bypassTrackerContextDedup?: boolean | undefined;
|
|
6308
|
+
routingAffinity?:
|
|
6309
|
+
| {
|
|
6310
|
+
capabilities: string[];
|
|
6311
|
+
sourceAgentId?: string | undefined;
|
|
6312
|
+
role?: string | undefined;
|
|
6313
|
+
harnessProvider?:
|
|
6314
|
+
| "claude"
|
|
6315
|
+
| "codex"
|
|
6316
|
+
| "pi"
|
|
6317
|
+
| "devin"
|
|
6318
|
+
| "claude-managed"
|
|
6319
|
+
| "opencode"
|
|
6320
|
+
| "acp"
|
|
6321
|
+
| undefined;
|
|
6322
|
+
leadOnly?: boolean | undefined;
|
|
6323
|
+
}
|
|
6324
|
+
| undefined;
|
|
6325
|
+
};
|
|
6326
|
+
|
|
6327
|
+
export type AgentTask = {
|
|
6328
|
+
id: string;
|
|
6329
|
+
key: string;
|
|
6330
|
+
agentId: string | null;
|
|
6331
|
+
task: string;
|
|
6332
|
+
status:
|
|
6333
|
+
| "draft"
|
|
6334
|
+
| "backlog"
|
|
6335
|
+
| "unassigned"
|
|
6336
|
+
| "offered"
|
|
6337
|
+
| "reviewing"
|
|
6338
|
+
| "pending"
|
|
6339
|
+
| "in_progress"
|
|
6340
|
+
| "paused"
|
|
6341
|
+
| "completed"
|
|
6342
|
+
| "failed"
|
|
6343
|
+
| "cancelled"
|
|
6344
|
+
| "superseded";
|
|
6345
|
+
source:
|
|
6346
|
+
| "workflow"
|
|
6347
|
+
| "schedule"
|
|
6348
|
+
| "slack"
|
|
6349
|
+
| "agentmail"
|
|
6350
|
+
| "mcp"
|
|
6351
|
+
| "api"
|
|
6352
|
+
| "ui"
|
|
6353
|
+
| "github"
|
|
6354
|
+
| "gitlab"
|
|
6355
|
+
| "system"
|
|
6356
|
+
| "linear"
|
|
6357
|
+
| "jira";
|
|
6358
|
+
tags: string[];
|
|
6359
|
+
priority: number;
|
|
6360
|
+
dependsOn: string[];
|
|
6361
|
+
createdAt: string;
|
|
6362
|
+
lastUpdatedAt: string;
|
|
6363
|
+
slackReplySent: boolean;
|
|
6364
|
+
wasPaused: boolean;
|
|
6365
|
+
creatorAgentId?: string | undefined;
|
|
6366
|
+
title?: string | undefined;
|
|
6367
|
+
routingReason?:
|
|
6368
|
+
| "skill"
|
|
6369
|
+
| "continuity"
|
|
6370
|
+
| "overflow"
|
|
6371
|
+
| "human_pinned"
|
|
6372
|
+
| "reroute_fault"
|
|
6373
|
+
| undefined;
|
|
6374
|
+
routingSource?: "declared" | "engine_default" | undefined;
|
|
6375
|
+
routingNote?: string | undefined;
|
|
6376
|
+
taskType?: string | undefined;
|
|
6377
|
+
offeredTo?: string | undefined;
|
|
6378
|
+
offeredAt?: string | undefined;
|
|
6379
|
+
acceptedAt?: string | undefined;
|
|
6380
|
+
rejectionReason?: string | undefined;
|
|
6381
|
+
finishedAt?: string | undefined;
|
|
6382
|
+
notifiedAt?: string | undefined;
|
|
6383
|
+
failureReason?: string | undefined;
|
|
6384
|
+
output?: string | undefined;
|
|
6385
|
+
progress?: string | undefined;
|
|
6386
|
+
slackChannelId?: string | undefined;
|
|
6387
|
+
slackThreadTs?: string | undefined;
|
|
6388
|
+
slackTriggerMessageTs?: string | undefined;
|
|
6389
|
+
slackUserId?: string | undefined;
|
|
6390
|
+
slackProgressMessageTs?: string | undefined;
|
|
6391
|
+
slackTreeRootMessageTs?: string | undefined;
|
|
6392
|
+
vcsProvider?: "github" | "gitlab" | undefined;
|
|
6393
|
+
vcsRepo?: string | undefined;
|
|
6394
|
+
vcsEventType?: string | undefined;
|
|
6395
|
+
vcsNumber?: number | undefined;
|
|
6396
|
+
vcsCommentId?: number | undefined;
|
|
6397
|
+
vcsAuthor?: string | undefined;
|
|
6398
|
+
vcsUrl?: string | undefined;
|
|
6399
|
+
vcsInstallationId?: number | undefined;
|
|
6400
|
+
vcsNodeId?: string | undefined;
|
|
6401
|
+
agentmailInboxId?: string | undefined;
|
|
6402
|
+
agentmailMessageId?: string | undefined;
|
|
6403
|
+
agentmailThreadId?: string | undefined;
|
|
6404
|
+
mentionMessageId?: string | undefined;
|
|
6405
|
+
mentionChannelId?: string | undefined;
|
|
6406
|
+
dir?: string | undefined;
|
|
6407
|
+
parentTaskId?: string | undefined;
|
|
6408
|
+
claudeSessionId?: string | undefined;
|
|
6409
|
+
model?: string | undefined;
|
|
6410
|
+
modelTier?: "smol" | "regular" | "smart" | "ultra" | undefined;
|
|
6411
|
+
effort?: "off" | "low" | "medium" | "high" | "xhigh" | "max" | undefined;
|
|
6412
|
+
scheduleId?: string | undefined;
|
|
6413
|
+
workflowRunId?: string | null | undefined;
|
|
6414
|
+
workflowRunStepId?: string | null | undefined;
|
|
6415
|
+
contextKey?: string | undefined;
|
|
6416
|
+
outputSchema?: Record<string, unknown> | undefined;
|
|
6417
|
+
followUpConfig?:
|
|
6418
|
+
| {
|
|
6419
|
+
disabled?: boolean | undefined;
|
|
6420
|
+
onCompleted?: string | undefined;
|
|
6421
|
+
onFailed?: string | undefined;
|
|
6422
|
+
}
|
|
6423
|
+
| undefined;
|
|
6424
|
+
compactionCount?: number | undefined;
|
|
6425
|
+
peakContextPercent?: number | undefined;
|
|
6426
|
+
peakContextTokens?: number | undefined;
|
|
6427
|
+
contextWindowSize?: number | undefined;
|
|
6428
|
+
credentialKeySuffix?: string | undefined;
|
|
6429
|
+
credentialKeyType?: string | undefined;
|
|
6430
|
+
requestedByUserId?: string | undefined;
|
|
6431
|
+
swarmVersion?: string | undefined;
|
|
6432
|
+
provider?:
|
|
6433
|
+
| "claude"
|
|
6434
|
+
| "codex"
|
|
6435
|
+
| "pi"
|
|
6436
|
+
| "devin"
|
|
6437
|
+
| "claude-managed"
|
|
6438
|
+
| "opencode"
|
|
6439
|
+
| "acp"
|
|
6440
|
+
| undefined;
|
|
6441
|
+
providerMeta?: Record<string, unknown> | undefined;
|
|
6442
|
+
harnessVariant?: string | undefined;
|
|
6443
|
+
harnessVariantMeta?: Record<string, unknown> | undefined;
|
|
6444
|
+
totalCostUsd?: number | undefined;
|
|
6445
|
+
routingAffinity?:
|
|
6446
|
+
| {
|
|
6447
|
+
capabilities: string[];
|
|
6448
|
+
sourceAgentId?: string | undefined;
|
|
6449
|
+
role?: string | undefined;
|
|
6450
|
+
harnessProvider?:
|
|
6451
|
+
| "claude"
|
|
6452
|
+
| "codex"
|
|
6453
|
+
| "pi"
|
|
6454
|
+
| "devin"
|
|
6455
|
+
| "claude-managed"
|
|
6456
|
+
| "opencode"
|
|
6457
|
+
| "acp"
|
|
6458
|
+
| undefined;
|
|
6459
|
+
leadOnly?: boolean | undefined;
|
|
6460
|
+
}
|
|
6461
|
+
| undefined;
|
|
6462
|
+
routingAffinityInvalid?: boolean | undefined;
|
|
6463
|
+
};
|
|
6464
|
+
|
|
6465
|
+
export type ActiveSession = {
|
|
6466
|
+
id: string;
|
|
6467
|
+
agentId: string;
|
|
6468
|
+
taskId: string | null;
|
|
6469
|
+
triggerType: string;
|
|
6470
|
+
inboxMessageId: string | null;
|
|
6471
|
+
taskDescription: string | null;
|
|
6472
|
+
runnerSessionId: string | null;
|
|
6473
|
+
providerSessionId: string | null;
|
|
6474
|
+
startedAt: string;
|
|
6475
|
+
lastHeartbeatAt: string;
|
|
6476
|
+
runtimeInstanceId?: string | null | undefined;
|
|
6477
|
+
};
|
|
6478
|
+
|
|
6479
|
+
export type RequestInfo = {
|
|
6480
|
+
sessionId: string | undefined;
|
|
6481
|
+
agentId: string | undefined;
|
|
6482
|
+
runtimeInstanceId: string | undefined;
|
|
6483
|
+
sourceTaskId: string | undefined;
|
|
6484
|
+
contextKey: string | undefined;
|
|
6485
|
+
callOrigin: "mcp" | "extension" | "script-sdk";
|
|
6486
|
+
};
|
|
6487
|
+
|
|
6488
|
+
import type { SwarmSdk } from "swarm-sdk";
|
|
6489
|
+
import type { z } from "zod";
|
|
6490
|
+
export type Runtime = "api" | "worker";
|
|
6491
|
+
export interface ExtensionManifest {
|
|
6492
|
+
name: string;
|
|
6493
|
+
description: string;
|
|
6494
|
+
version: string;
|
|
6495
|
+
runtime: Runtime;
|
|
6496
|
+
assets: {
|
|
6497
|
+
hooks: string;
|
|
6498
|
+
skills?: string[];
|
|
6499
|
+
workflows?: string[];
|
|
6500
|
+
schedules?: string[];
|
|
6501
|
+
};
|
|
6502
|
+
homepage?: string;
|
|
6503
|
+
author?: string;
|
|
6504
|
+
}
|
|
6505
|
+
export interface HooksModule {
|
|
6506
|
+
default: SwarmExtension;
|
|
6507
|
+
config?: z.ZodTypeAny;
|
|
6508
|
+
}
|
|
6509
|
+
export interface ExtensionState {
|
|
6510
|
+
get<T = unknown>(key: string): Promise<T | null>;
|
|
6511
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
6512
|
+
incr(key: string, by?: number): Promise<number>;
|
|
6513
|
+
del(key: string): Promise<void>;
|
|
6514
|
+
}
|
|
6515
|
+
export interface ExtensionLogger {
|
|
6516
|
+
debug(message: string, data?: unknown): void;
|
|
6517
|
+
info(message: string, data?: unknown): void;
|
|
6518
|
+
warn(message: string, data?: unknown): void;
|
|
6519
|
+
error(message: string, data?: unknown): void;
|
|
6520
|
+
}
|
|
6521
|
+
type ConfigFor<M extends ExtensionManifest> = M extends {
|
|
6522
|
+
config: infer C extends z.ZodTypeAny;
|
|
6523
|
+
}
|
|
6524
|
+
? z.infer<C>
|
|
6525
|
+
: Record<string, unknown>;
|
|
6526
|
+
export interface ApiCtx<Config = Record<string, unknown>> {
|
|
6527
|
+
swarm: SwarmSdk;
|
|
6528
|
+
state: ExtensionState;
|
|
6529
|
+
config: Config;
|
|
6530
|
+
log: ExtensionLogger;
|
|
6531
|
+
signal: AbortSignal;
|
|
6532
|
+
event: {
|
|
6533
|
+
name: keyof SwarmEventMap;
|
|
6534
|
+
at: string;
|
|
6535
|
+
extension: {
|
|
6536
|
+
id: string;
|
|
6537
|
+
version: number;
|
|
6538
|
+
};
|
|
6539
|
+
};
|
|
6540
|
+
}
|
|
6541
|
+
export interface WorkerCtx<Config = Record<string, unknown>>
|
|
6542
|
+
extends Omit<ApiCtx<Config>, "swarm"> {
|
|
6543
|
+
swarm: SwarmSdk;
|
|
6544
|
+
worker: {
|
|
6545
|
+
agentId: string;
|
|
6546
|
+
taskId: string;
|
|
6547
|
+
harness: string;
|
|
6548
|
+
};
|
|
6549
|
+
}
|
|
6550
|
+
export type CtxFor<M extends ExtensionManifest> = M["runtime"] extends "api"
|
|
6551
|
+
? ApiCtx<ConfigFor<M>>
|
|
6552
|
+
: WorkerCtx<ConfigFor<M>>;
|
|
6553
|
+
export type PreResult<Modify> =
|
|
6554
|
+
| void
|
|
6555
|
+
| {
|
|
6556
|
+
action: "continue";
|
|
6557
|
+
}
|
|
6558
|
+
| {
|
|
6559
|
+
action: "modify";
|
|
6560
|
+
data: Modify;
|
|
6561
|
+
}
|
|
6562
|
+
| {
|
|
6563
|
+
action: "block";
|
|
6564
|
+
reason: string;
|
|
6565
|
+
};
|
|
6566
|
+
export type TaskCreateOrigin =
|
|
6567
|
+
| "rest"
|
|
6568
|
+
| "app"
|
|
6569
|
+
| "mcp"
|
|
6570
|
+
| "slack"
|
|
6571
|
+
| "schedule"
|
|
6572
|
+
| "workflow"
|
|
6573
|
+
| "webhook"
|
|
6574
|
+
| "followUp"
|
|
6575
|
+
| \`extension:\${string}\`;
|
|
6576
|
+
export interface TaskCreateEvent {
|
|
6577
|
+
options: CreateTaskOptions;
|
|
6578
|
+
description: string;
|
|
6579
|
+
origin: TaskCreateOrigin;
|
|
6580
|
+
requestInfo?: RequestInfo;
|
|
6581
|
+
}
|
|
6582
|
+
export type TaskCreateModify = Partial<
|
|
6583
|
+
Pick<
|
|
6584
|
+
CreateTaskOptions,
|
|
6585
|
+
| "agentId"
|
|
6586
|
+
| "creatorAgentId"
|
|
6587
|
+
| "source"
|
|
6588
|
+
| "taskType"
|
|
6589
|
+
| "tags"
|
|
6590
|
+
| "priority"
|
|
6591
|
+
| "dependsOn"
|
|
6592
|
+
| "offeredTo"
|
|
6593
|
+
| "vcsProvider"
|
|
6594
|
+
| "vcsRepo"
|
|
6595
|
+
| "vcsEventType"
|
|
6596
|
+
| "vcsNumber"
|
|
6597
|
+
| "vcsCommentId"
|
|
6598
|
+
| "vcsAuthor"
|
|
6599
|
+
| "vcsUrl"
|
|
6600
|
+
| "vcsInstallationId"
|
|
6601
|
+
| "vcsNodeId"
|
|
6602
|
+
| "agentmailInboxId"
|
|
6603
|
+
| "agentmailMessageId"
|
|
6604
|
+
| "agentmailThreadId"
|
|
6605
|
+
| "mentionMessageId"
|
|
6606
|
+
| "mentionChannelId"
|
|
6607
|
+
| "dir"
|
|
6608
|
+
| "model"
|
|
6609
|
+
| "modelTier"
|
|
6610
|
+
| "effort"
|
|
6611
|
+
| "outputSchema"
|
|
6612
|
+
| "followUpConfig"
|
|
6613
|
+
| "bypassTrackerContextDedup"
|
|
6614
|
+
>
|
|
6615
|
+
> & {
|
|
6616
|
+
description?: string;
|
|
6617
|
+
};
|
|
6618
|
+
export interface TaskFollowUpEvent {
|
|
6619
|
+
completedTask: AgentTask;
|
|
6620
|
+
status: "completed" | "failed";
|
|
6621
|
+
output?: string;
|
|
6622
|
+
failureReason?: string;
|
|
6623
|
+
workerAgentId: string;
|
|
6624
|
+
leadAgentId: string;
|
|
6625
|
+
summary: string;
|
|
6626
|
+
}
|
|
6627
|
+
export type TaskFollowUpModify = Partial<
|
|
6628
|
+
Pick<CreateTaskOptions, "agentId" | "priority" | "followUpConfig">
|
|
6629
|
+
> & {
|
|
6630
|
+
description?: string;
|
|
6631
|
+
};
|
|
6632
|
+
export interface SlackRouteEvent {
|
|
6633
|
+
channelId: string;
|
|
6634
|
+
userId: string;
|
|
6635
|
+
text: string;
|
|
6636
|
+
threadTs?: string;
|
|
6637
|
+
botMentioned: boolean;
|
|
6638
|
+
threadContext?: {
|
|
6639
|
+
channelId: string;
|
|
6640
|
+
threadTs: string;
|
|
6641
|
+
};
|
|
6642
|
+
}
|
|
6643
|
+
export interface SlackRouteModify {
|
|
6644
|
+
target:
|
|
6645
|
+
| {
|
|
6646
|
+
kind: "agent";
|
|
6647
|
+
agentId: string;
|
|
6648
|
+
}
|
|
6649
|
+
| {
|
|
6650
|
+
kind: "lead";
|
|
6651
|
+
}
|
|
6652
|
+
| {
|
|
6653
|
+
kind: "broadcast";
|
|
6654
|
+
};
|
|
6655
|
+
}
|
|
6656
|
+
export type HeartbeatClassification = "no-session" | "stale-session" | "fresh-stalled";
|
|
6657
|
+
export type HeartbeatAction = "supersede-resume" | "fail" | "record";
|
|
6658
|
+
export interface HeartbeatRemediateEvent {
|
|
6659
|
+
task: AgentTask;
|
|
6660
|
+
session?: ActiveSession;
|
|
6661
|
+
classification: HeartbeatClassification;
|
|
6662
|
+
proposedAction: HeartbeatAction;
|
|
6663
|
+
reason: string;
|
|
6664
|
+
taskAgeMs: number;
|
|
6665
|
+
sessionHeartbeatAgeMs?: number;
|
|
6666
|
+
}
|
|
6667
|
+
export interface HeartbeatRemediateModify {
|
|
6668
|
+
proposedAction: HeartbeatAction;
|
|
6669
|
+
}
|
|
6670
|
+
export interface ToolCallEvent {
|
|
6671
|
+
tool: string;
|
|
6672
|
+
args: unknown;
|
|
6673
|
+
requestInfo: RequestInfo;
|
|
6674
|
+
}
|
|
6675
|
+
export interface ToolCallModify {
|
|
6676
|
+
args: unknown;
|
|
6677
|
+
}
|
|
6678
|
+
export interface TaskEvent {
|
|
6679
|
+
task: AgentTask;
|
|
6680
|
+
}
|
|
6681
|
+
export interface TaskCompletedEvent extends TaskEvent {
|
|
6682
|
+
output: string;
|
|
6683
|
+
}
|
|
6684
|
+
export interface TaskFailedEvent extends TaskEvent {
|
|
6685
|
+
failureReason: string;
|
|
6686
|
+
}
|
|
6687
|
+
export interface TaskSupersededEvent extends TaskEvent {
|
|
6688
|
+
supersededBy: string;
|
|
6689
|
+
}
|
|
6690
|
+
export interface TaskProgressEvent extends TaskEvent {
|
|
6691
|
+
progress: string;
|
|
6692
|
+
}
|
|
6693
|
+
export interface SlackMessageEvent {
|
|
6694
|
+
channelId: string;
|
|
6695
|
+
userId: string;
|
|
6696
|
+
text: string;
|
|
6697
|
+
threadTs?: string;
|
|
6698
|
+
taskId?: string;
|
|
6699
|
+
}
|
|
6700
|
+
export interface ToolCallCompletedEvent extends ToolCallEvent {
|
|
6701
|
+
result: unknown;
|
|
6702
|
+
durationMs: number;
|
|
6703
|
+
}
|
|
6704
|
+
export interface SwarmEventMap {
|
|
6705
|
+
"pre.task.create": {
|
|
6706
|
+
event: TaskCreateEvent;
|
|
6707
|
+
modify: TaskCreateModify;
|
|
6708
|
+
result: PreResult<TaskCreateModify>;
|
|
6709
|
+
};
|
|
6710
|
+
"pre.task.followUp": {
|
|
6711
|
+
event: TaskFollowUpEvent;
|
|
6712
|
+
modify: TaskFollowUpModify;
|
|
6713
|
+
result: PreResult<TaskFollowUpModify>;
|
|
6714
|
+
};
|
|
6715
|
+
"pre.slack.route": {
|
|
6716
|
+
event: SlackRouteEvent;
|
|
6717
|
+
modify: SlackRouteModify;
|
|
6718
|
+
result: PreResult<SlackRouteModify>;
|
|
6719
|
+
};
|
|
6720
|
+
"pre.heartbeat.remediate": {
|
|
6721
|
+
event: HeartbeatRemediateEvent;
|
|
6722
|
+
modify: HeartbeatRemediateModify;
|
|
6723
|
+
result: PreResult<HeartbeatRemediateModify>;
|
|
6724
|
+
};
|
|
6725
|
+
"pre.tool.call": {
|
|
6726
|
+
event: ToolCallEvent;
|
|
6727
|
+
modify: ToolCallModify;
|
|
6728
|
+
result: PreResult<ToolCallModify>;
|
|
6729
|
+
};
|
|
6730
|
+
"post.task.created": {
|
|
6731
|
+
event: TaskEvent;
|
|
6732
|
+
modify: never;
|
|
6733
|
+
result: void;
|
|
6734
|
+
};
|
|
6735
|
+
"post.task.completed": {
|
|
6736
|
+
event: TaskCompletedEvent;
|
|
6737
|
+
modify: never;
|
|
6738
|
+
result: void;
|
|
6739
|
+
};
|
|
6740
|
+
"post.task.failed": {
|
|
6741
|
+
event: TaskFailedEvent;
|
|
6742
|
+
modify: never;
|
|
6743
|
+
result: void;
|
|
6744
|
+
};
|
|
6745
|
+
"post.task.cancelled": {
|
|
6746
|
+
event: TaskEvent;
|
|
6747
|
+
modify: never;
|
|
6748
|
+
result: void;
|
|
6749
|
+
};
|
|
6750
|
+
"post.task.superseded": {
|
|
6751
|
+
event: TaskSupersededEvent;
|
|
6752
|
+
modify: never;
|
|
6753
|
+
result: void;
|
|
6754
|
+
};
|
|
6755
|
+
"post.task.progress": {
|
|
6756
|
+
event: TaskProgressEvent;
|
|
6757
|
+
modify: never;
|
|
6758
|
+
result: void;
|
|
6759
|
+
};
|
|
6760
|
+
"post.slack.message": {
|
|
6761
|
+
event: SlackMessageEvent;
|
|
6762
|
+
modify: never;
|
|
6763
|
+
result: void;
|
|
6764
|
+
};
|
|
6765
|
+
"post.tool.call": {
|
|
6766
|
+
event: ToolCallCompletedEvent;
|
|
6767
|
+
modify: never;
|
|
6768
|
+
result: void;
|
|
6769
|
+
};
|
|
6770
|
+
}
|
|
6771
|
+
export interface ExtensionApi<
|
|
6772
|
+
M extends ExtensionManifest = ExtensionManifest & {
|
|
6773
|
+
runtime: "api";
|
|
6774
|
+
},
|
|
6775
|
+
> {
|
|
6776
|
+
on<E extends keyof SwarmEventMap>(
|
|
6777
|
+
event: E,
|
|
6778
|
+
handler: (
|
|
6779
|
+
event: SwarmEventMap[E]["event"],
|
|
6780
|
+
ctx: CtxFor<M>,
|
|
6781
|
+
) => Promise<SwarmEventMap[E]["result"]> | SwarmEventMap[E]["result"],
|
|
6782
|
+
opts?: {
|
|
6783
|
+
priority?: number;
|
|
6784
|
+
},
|
|
6785
|
+
): void;
|
|
6786
|
+
}
|
|
6787
|
+
export type SwarmExtension<
|
|
6788
|
+
M extends ExtensionManifest = ExtensionManifest & {
|
|
6789
|
+
runtime: "api";
|
|
6790
|
+
},
|
|
6791
|
+
> = (api: ExtensionApi<M>) => void;
|
|
6792
|
+
export { block, modify } from "./contract-runtime";
|
|
6793
|
+
}
|
|
6794
|
+
`;
|
|
6795
|
+
|
|
6796
|
+
// src/be/extensions/validate.ts
|
|
6797
|
+
init_types();
|
|
6798
|
+
async function validateBundle(input) {
|
|
6799
|
+
const parsedManifest = ExtensionManifestSchema.safeParse(input.manifest);
|
|
6800
|
+
const pathDiagnostics = Object.keys(input.files).filter((path) => !isSafeBundlePath(path)).map((path) => `Unsafe bundle file path: ${JSON.stringify(path)}`);
|
|
6801
|
+
if (!parsedManifest.success) {
|
|
6802
|
+
return {
|
|
6803
|
+
ok: false,
|
|
6804
|
+
diagnostics: [
|
|
6805
|
+
...pathDiagnostics,
|
|
6806
|
+
...parsedManifest.error.issues.map((issue) => `${issue.path.join(".") || "manifest"}: ${issue.message}`)
|
|
6807
|
+
]
|
|
6808
|
+
};
|
|
6809
|
+
}
|
|
6810
|
+
if (pathDiagnostics.length > 0)
|
|
6811
|
+
return { ok: false, diagnostics: pathDiagnostics };
|
|
6812
|
+
const manifest = parsedManifest.data;
|
|
6813
|
+
if (manifest.runtime === "worker") {
|
|
6814
|
+
return { ok: false, diagnostics: ['runtime "worker" is not supported in v1'] };
|
|
6815
|
+
}
|
|
6816
|
+
for (const asset of ["skills", "workflows", "schedules"]) {
|
|
6817
|
+
if ((manifest.assets[asset]?.length ?? 0) > 0) {
|
|
6818
|
+
return { ok: false, diagnostics: [`assets.${asset} is not supported in v1`] };
|
|
6819
|
+
}
|
|
6820
|
+
}
|
|
6821
|
+
const hookPath = manifest.assets.hooks;
|
|
6822
|
+
if (!(hookPath in input.files)) {
|
|
6823
|
+
return {
|
|
6824
|
+
ok: false,
|
|
6825
|
+
diagnostics: [`assets.hooks "${hookPath}" does not name a file in files`]
|
|
6826
|
+
};
|
|
6827
|
+
}
|
|
6828
|
+
const extraPaths = Object.keys(input.files).filter((path) => path !== hookPath);
|
|
6829
|
+
if (extraPaths.length > 0) {
|
|
6830
|
+
return {
|
|
6831
|
+
ok: false,
|
|
6832
|
+
diagnostics: [
|
|
6833
|
+
`Only the hooks asset is supported in v1. Unexpected files: ${extraPaths.join(", ")}`
|
|
6834
|
+
]
|
|
6835
|
+
};
|
|
6836
|
+
}
|
|
6837
|
+
const source = input.files[hookPath];
|
|
6838
|
+
const imports = checkImportAllowlist(source, {
|
|
6839
|
+
allowedBare: ["swarm-extension", "zod", "stdlib"],
|
|
6840
|
+
allowRelative: false,
|
|
6841
|
+
strictDynamic: true
|
|
6842
|
+
});
|
|
6843
|
+
if (!imports.ok)
|
|
6844
|
+
return { ok: false, diagnostics: [imports.diagnostic] };
|
|
6845
|
+
const typecheck = await typecheckWithAmbient({
|
|
6846
|
+
source,
|
|
6847
|
+
modules: {
|
|
6848
|
+
"swarm-extension": EXTENSION_TYPE_DEFINITIONS,
|
|
6849
|
+
"swarm-sdk": SCRIPT_SDK_TYPES,
|
|
6850
|
+
stdlib: SCRIPT_STDLIB_MODULE_TYPES
|
|
6851
|
+
},
|
|
6852
|
+
checkFile: `/// <reference path="./runtime-globals.d.ts" />
|
|
6853
|
+
import * as hooks from "./user-script";
|
|
6854
|
+
import type { SwarmExtension } from "swarm-extension";
|
|
6855
|
+
import type { ZodTypeAny } from "zod";
|
|
6856
|
+
const manifest = ${JSON.stringify(manifest)} as const;
|
|
6857
|
+
type Manifest = typeof hooks extends { config: infer Config extends ZodTypeAny }
|
|
6858
|
+
? typeof manifest & { config: Config }
|
|
6859
|
+
: typeof manifest;
|
|
6860
|
+
const _extension: SwarmExtension<Manifest> = hooks.default;
|
|
6861
|
+
type ConfigIsValid = typeof hooks extends { config: infer Config }
|
|
6862
|
+
? Config extends ZodTypeAny ? true : false
|
|
6863
|
+
: true;
|
|
6864
|
+
const _configIsValid: ConfigIsValid = true;
|
|
6865
|
+
void _extension;
|
|
6866
|
+
void _configIsValid;
|
|
6867
|
+
`
|
|
6868
|
+
});
|
|
6869
|
+
if (!typecheck.ok) {
|
|
6870
|
+
return {
|
|
6871
|
+
ok: false,
|
|
6872
|
+
diagnostics: typecheck.structured.map((diagnostic) => `${diagnostic.file}:${diagnostic.line}:${diagnostic.column} TS${diagnostic.code}: ${diagnostic.message}`)
|
|
6873
|
+
};
|
|
6874
|
+
}
|
|
6875
|
+
return { ok: true, manifest };
|
|
6876
|
+
}
|
|
6877
|
+
|
|
6878
|
+
// src/http/extensions.ts
|
|
6879
|
+
init_types();
|
|
6880
|
+
init_request_auth_context();
|
|
6881
|
+
init_secret_scrubber();
|
|
6882
|
+
var idParamsSchema = exports_external.object({ id: exports_external.string().min(1) });
|
|
6883
|
+
var installRoute = route({
|
|
6884
|
+
method: "post",
|
|
6885
|
+
path: "/api/extensions/install",
|
|
6886
|
+
pattern: ["api", "extensions", "install"],
|
|
6887
|
+
operationId: "extensions_install",
|
|
6888
|
+
summary: "Validate and install an extension bundle",
|
|
6889
|
+
tags: ["Extensions"],
|
|
6890
|
+
body: ExtensionInstallBodySchema,
|
|
6891
|
+
responses: {
|
|
6892
|
+
200: {
|
|
6893
|
+
description: "Installed extension",
|
|
6894
|
+
schema: exports_external.object({
|
|
6895
|
+
extension: ExtensionSchema,
|
|
6896
|
+
manifest: ExtensionManifestSchema,
|
|
6897
|
+
contentDeduped: exports_external.boolean()
|
|
6898
|
+
})
|
|
6899
|
+
},
|
|
6900
|
+
400: { description: "Bundle validation failed" },
|
|
6901
|
+
403: { description: "Permission denied" }
|
|
6902
|
+
},
|
|
6903
|
+
rbac: { permission: "extension.write" }
|
|
6904
|
+
});
|
|
6905
|
+
var listRoute2 = route({
|
|
6906
|
+
method: "get",
|
|
6907
|
+
path: "/api/extensions",
|
|
6908
|
+
pattern: ["api", "extensions"],
|
|
6909
|
+
operationId: "extensions_list",
|
|
6910
|
+
summary: "List installed extensions",
|
|
6911
|
+
tags: ["Extensions"],
|
|
6912
|
+
responses: {
|
|
6913
|
+
200: {
|
|
6914
|
+
description: "Installed extensions",
|
|
6915
|
+
schema: exports_external.object({ extensions: exports_external.array(ExtensionSchema) })
|
|
6916
|
+
}
|
|
6917
|
+
}
|
|
6918
|
+
});
|
|
6919
|
+
var typeDefsRoute = route({
|
|
6920
|
+
method: "get",
|
|
6921
|
+
path: "/api/extensions/type-defs",
|
|
6922
|
+
pattern: ["api", "extensions", "type-defs"],
|
|
6923
|
+
operationId: "extensions_type_defs",
|
|
6924
|
+
summary: "Get extension authoring type definitions",
|
|
6925
|
+
tags: ["Extensions"],
|
|
6926
|
+
responses: {
|
|
6927
|
+
200: {
|
|
6928
|
+
description: "Generated swarm-extension.d.ts",
|
|
6929
|
+
unstructured: "Plain TypeScript declaration text"
|
|
6930
|
+
}
|
|
6931
|
+
}
|
|
6932
|
+
});
|
|
6933
|
+
var getRoute = route({
|
|
6934
|
+
method: "get",
|
|
6935
|
+
path: "/api/extensions/{id}",
|
|
6936
|
+
pattern: ["api", "extensions", null],
|
|
6937
|
+
operationId: "extensions_get",
|
|
6938
|
+
summary: "Get an extension bundle",
|
|
6939
|
+
tags: ["Extensions"],
|
|
6940
|
+
params: idParamsSchema,
|
|
6941
|
+
responses: {
|
|
6942
|
+
200: {
|
|
6943
|
+
description: "Extension bundle",
|
|
6944
|
+
schema: exports_external.object({
|
|
6945
|
+
extension: ExtensionSchema,
|
|
6946
|
+
manifest: ExtensionManifestSchema,
|
|
6947
|
+
files: exports_external.record(exports_external.string(), exports_external.string())
|
|
6948
|
+
})
|
|
6949
|
+
},
|
|
6950
|
+
404: { description: "Extension not found" }
|
|
6951
|
+
}
|
|
6952
|
+
});
|
|
6953
|
+
var versionsRoute = route({
|
|
6954
|
+
method: "get",
|
|
6955
|
+
path: "/api/extensions/{id}/versions",
|
|
6956
|
+
pattern: ["api", "extensions", null, "versions"],
|
|
6957
|
+
operationId: "extensions_versions",
|
|
6958
|
+
summary: "List extension versions",
|
|
6959
|
+
tags: ["Extensions"],
|
|
6960
|
+
params: idParamsSchema,
|
|
6961
|
+
responses: {
|
|
6962
|
+
200: {
|
|
6963
|
+
description: "Extension versions",
|
|
6964
|
+
schema: exports_external.object({ versions: exports_external.array(ExtensionVersionSchema) })
|
|
6965
|
+
},
|
|
6966
|
+
404: { description: "Extension not found" }
|
|
6967
|
+
}
|
|
6968
|
+
});
|
|
6969
|
+
var runsRoute = route({
|
|
6970
|
+
method: "get",
|
|
6971
|
+
path: "/api/extensions/{id}/runs",
|
|
6972
|
+
pattern: ["api", "extensions", null, "runs"],
|
|
6973
|
+
operationId: "extensions_runs",
|
|
6974
|
+
summary: "List extension run log entries",
|
|
6975
|
+
tags: ["Extensions"],
|
|
6976
|
+
params: idParamsSchema,
|
|
6977
|
+
query: exports_external.object({ limit: exports_external.coerce.number().int().min(1).max(500).optional() }),
|
|
6978
|
+
responses: {
|
|
6979
|
+
200: {
|
|
6980
|
+
description: "Extension run log",
|
|
6981
|
+
schema: exports_external.object({ runs: exports_external.array(ExtensionRunSchema) })
|
|
6982
|
+
},
|
|
6983
|
+
404: { description: "Extension not found" }
|
|
6984
|
+
}
|
|
6985
|
+
});
|
|
6986
|
+
var patchRoute = route({
|
|
6987
|
+
method: "patch",
|
|
6988
|
+
path: "/api/extensions/{id}",
|
|
6989
|
+
pattern: ["api", "extensions", null],
|
|
6990
|
+
operationId: "extensions_update",
|
|
6991
|
+
summary: "Update extension priority, config, or description",
|
|
6992
|
+
tags: ["Extensions"],
|
|
6993
|
+
params: idParamsSchema,
|
|
6994
|
+
body: exports_external.object({
|
|
6995
|
+
priority: exports_external.number().int().optional(),
|
|
6996
|
+
config: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
|
|
6997
|
+
description: exports_external.string().optional()
|
|
6998
|
+
}).strict(),
|
|
6999
|
+
responses: {
|
|
7000
|
+
200: { description: "Updated extension", schema: exports_external.object({ extension: ExtensionSchema }) },
|
|
7001
|
+
400: { description: "Extension config validation failed" },
|
|
7002
|
+
403: { description: "Permission denied" },
|
|
7003
|
+
404: { description: "Extension not found" }
|
|
7004
|
+
},
|
|
7005
|
+
rbac: { permission: "extension.write" }
|
|
7006
|
+
});
|
|
7007
|
+
var deleteRoute = route({
|
|
7008
|
+
method: "delete",
|
|
7009
|
+
path: "/api/extensions/{id}",
|
|
7010
|
+
pattern: ["api", "extensions", null],
|
|
7011
|
+
operationId: "extensions_delete",
|
|
7012
|
+
summary: "Uninstall a disabled extension",
|
|
7013
|
+
tags: ["Extensions"],
|
|
7014
|
+
params: idParamsSchema,
|
|
7015
|
+
responses: {
|
|
7016
|
+
200: {
|
|
7017
|
+
description: "Extension uninstalled",
|
|
7018
|
+
schema: exports_external.object({ deleted: exports_external.literal(true) })
|
|
7019
|
+
},
|
|
7020
|
+
403: { description: "Permission denied" },
|
|
7021
|
+
404: { description: "Extension not found" },
|
|
7022
|
+
409: { description: "Enabled extensions cannot be uninstalled" }
|
|
7023
|
+
},
|
|
7024
|
+
rbac: { permission: "extension.write" }
|
|
7025
|
+
});
|
|
7026
|
+
var enableRoute = route({
|
|
7027
|
+
method: "post",
|
|
7028
|
+
path: "/api/extensions/{id}/enable",
|
|
7029
|
+
pattern: ["api", "extensions", null, "enable"],
|
|
7030
|
+
operationId: "extensions_enable",
|
|
7031
|
+
summary: "Enable an extension",
|
|
7032
|
+
description: "Loads and enables an extension. This route is operator-only.",
|
|
7033
|
+
tags: ["Extensions"],
|
|
7034
|
+
params: idParamsSchema,
|
|
7035
|
+
responses: {
|
|
7036
|
+
200: { description: "Enabled extension", schema: exports_external.object({ extension: ExtensionSchema }) },
|
|
7037
|
+
400: { description: "Extension load or config validation failed" },
|
|
7038
|
+
403: { description: "Permission denied" },
|
|
7039
|
+
404: { description: "Extension not found" }
|
|
7040
|
+
},
|
|
7041
|
+
rbac: { permission: "extension.activate" }
|
|
7042
|
+
});
|
|
7043
|
+
var disableRoute = route({
|
|
7044
|
+
method: "post",
|
|
7045
|
+
path: "/api/extensions/{id}/disable",
|
|
7046
|
+
pattern: ["api", "extensions", null, "disable"],
|
|
7047
|
+
operationId: "extensions_disable",
|
|
7048
|
+
summary: "Disable an extension",
|
|
7049
|
+
description: "Unloads and disables an extension. This route is operator-only.",
|
|
7050
|
+
tags: ["Extensions"],
|
|
7051
|
+
params: idParamsSchema,
|
|
7052
|
+
responses: {
|
|
7053
|
+
200: { description: "Disabled extension", schema: exports_external.object({ extension: ExtensionSchema }) },
|
|
7054
|
+
403: { description: "Permission denied" },
|
|
7055
|
+
404: { description: "Extension not found" }
|
|
7056
|
+
},
|
|
7057
|
+
rbac: { permission: "extension.activate" }
|
|
6321
7058
|
});
|
|
6322
|
-
var
|
|
6323
|
-
method: "
|
|
6324
|
-
path: "/api/
|
|
6325
|
-
pattern: ["api", "
|
|
6326
|
-
|
|
6327
|
-
|
|
6328
|
-
|
|
6329
|
-
|
|
6330
|
-
|
|
6331
|
-
|
|
6332
|
-
taskId: exports_external.string().optional(),
|
|
6333
|
-
sessionId: exports_external.string().optional(),
|
|
6334
|
-
since: exports_external.string().optional(),
|
|
6335
|
-
until: exports_external.string().optional()
|
|
6336
|
-
}),
|
|
7059
|
+
var activateVersionRoute = route({
|
|
7060
|
+
method: "post",
|
|
7061
|
+
path: "/api/extensions/{id}/activate-version",
|
|
7062
|
+
pattern: ["api", "extensions", null, "activate-version"],
|
|
7063
|
+
operationId: "extensions_activate_version",
|
|
7064
|
+
summary: "Activate an extension version",
|
|
7065
|
+
description: "Activates a stored version. This route is operator-only.",
|
|
7066
|
+
tags: ["Extensions"],
|
|
7067
|
+
params: idParamsSchema,
|
|
7068
|
+
body: exports_external.object({ version: exports_external.number().int().min(1) }).strict(),
|
|
6337
7069
|
responses: {
|
|
6338
|
-
200: {
|
|
6339
|
-
|
|
6340
|
-
|
|
6341
|
-
|
|
6342
|
-
})
|
|
6343
|
-
}
|
|
7070
|
+
200: { description: "Activated extension", schema: exports_external.object({ extension: ExtensionSchema }) },
|
|
7071
|
+
400: { description: "Extension load or config validation failed" },
|
|
7072
|
+
403: { description: "Permission denied" },
|
|
7073
|
+
404: { description: "Extension or version not found" }
|
|
6344
7074
|
},
|
|
6345
|
-
|
|
7075
|
+
rbac: { permission: "extension.activate" }
|
|
6346
7076
|
});
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
7077
|
+
function redactExtension(extension) {
|
|
7078
|
+
return { ...extension, configJson: scrubSecrets(extension.configJson) };
|
|
7079
|
+
}
|
|
7080
|
+
var REDACTED_CONFIG_VALUE = /^\[REDACTED:[A-Za-z0-9_.:-]+\]$/;
|
|
7081
|
+
function isPlainObject(value) {
|
|
7082
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7083
|
+
}
|
|
7084
|
+
function restoreRedacted(incoming, stored) {
|
|
7085
|
+
if (typeof incoming === "string") {
|
|
7086
|
+
return REDACTED_CONFIG_VALUE.test(incoming) && stored !== undefined ? stored : incoming;
|
|
7087
|
+
}
|
|
7088
|
+
if (Array.isArray(incoming)) {
|
|
7089
|
+
const storedArray = Array.isArray(stored) ? stored : [];
|
|
7090
|
+
return incoming.map((item, index) => restoreRedacted(item, storedArray[index]));
|
|
7091
|
+
}
|
|
7092
|
+
if (isPlainObject(incoming)) {
|
|
7093
|
+
const storedObject = isPlainObject(stored) ? stored : {};
|
|
7094
|
+
return Object.fromEntries(Object.entries(incoming).map(([key, value]) => [
|
|
7095
|
+
key,
|
|
7096
|
+
restoreRedacted(value, storedObject[key])
|
|
7097
|
+
]));
|
|
7098
|
+
}
|
|
7099
|
+
return incoming;
|
|
7100
|
+
}
|
|
7101
|
+
function preserveRedactedConfigValues(incoming, storedJson) {
|
|
7102
|
+
let parsed;
|
|
7103
|
+
try {
|
|
7104
|
+
parsed = JSON.parse(storedJson);
|
|
7105
|
+
} catch {
|
|
7106
|
+
parsed = {};
|
|
7107
|
+
}
|
|
7108
|
+
return restoreRedacted(incoming, parsed);
|
|
7109
|
+
}
|
|
7110
|
+
async function extensionPrincipal(req, callerAgentId) {
|
|
7111
|
+
if (callerAgentId) {
|
|
7112
|
+
const agent = await getAgentById(callerAgentId);
|
|
7113
|
+
return { kind: "agent", agentId: callerAgentId, isLead: agent?.isLead ?? false };
|
|
7114
|
+
}
|
|
7115
|
+
const auth = getRequestAuth(req);
|
|
7116
|
+
if (auth?.kind === "operator")
|
|
7117
|
+
return { kind: "operator" };
|
|
7118
|
+
if (auth?.kind === "user")
|
|
7119
|
+
return { kind: "user", userId: auth.userId };
|
|
7120
|
+
return { kind: "agent", agentId: "", isLead: false };
|
|
7121
|
+
}
|
|
7122
|
+
async function requirePermission(req, res, callerAgentId, verb) {
|
|
7123
|
+
const principal = await extensionPrincipal(req, callerAgentId);
|
|
7124
|
+
const decision = can({ principal, verb, resource: { kind: "none" }, source: "http" });
|
|
7125
|
+
if (decision.allow)
|
|
7126
|
+
return principal;
|
|
7127
|
+
jsonError(res, `Forbidden: ${decision.reason}`, 403);
|
|
7128
|
+
return null;
|
|
7129
|
+
}
|
|
7130
|
+
function respondLifecycleError(res, error) {
|
|
7131
|
+
const status = error instanceof ExtensionConfigError ? 400 : error instanceof ExtensionLifecycleError ? error.status : 500;
|
|
7132
|
+
jsonError(res, scrubSecrets(error instanceof Error ? error.message : String(error)), status);
|
|
7133
|
+
}
|
|
7134
|
+
async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
|
|
7135
|
+
if (installRoute.match(req.method, pathSegments)) {
|
|
7136
|
+
const parsed = await installRoute.parse(req, res, pathSegments, queryParams);
|
|
6350
7137
|
if (!parsed)
|
|
6351
7138
|
return true;
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
6355
|
-
|
|
6356
|
-
|
|
6357
|
-
|
|
7139
|
+
const principal = await requirePermission(req, res, agentId, "extension.write");
|
|
7140
|
+
if (!principal)
|
|
7141
|
+
return true;
|
|
7142
|
+
const validation = await validateBundle(parsed.body);
|
|
7143
|
+
if (!validation.ok) {
|
|
7144
|
+
json(res, { error: "extension_validation_failed", diagnostics: validation.diagnostics }, 400);
|
|
7145
|
+
return true;
|
|
7146
|
+
}
|
|
7147
|
+
const existing = await getExtensionByName(validation.manifest.name);
|
|
7148
|
+
const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
|
|
7149
|
+
const updatedBy = await resolveHttpAuditUserId(req, writerAgentId);
|
|
7150
|
+
const shouldActivate = principal.kind !== "agent" && existing?.enabled === true;
|
|
7151
|
+
const result = await installExtension({
|
|
7152
|
+
manifest: validation.manifest,
|
|
7153
|
+
files: parsed.body.files,
|
|
7154
|
+
priority: parsed.body.priority,
|
|
7155
|
+
config: parsed.body.config,
|
|
7156
|
+
agentId: writerAgentId,
|
|
7157
|
+
createdBy: updatedBy,
|
|
7158
|
+
activate: shouldActivate
|
|
7159
|
+
});
|
|
7160
|
+
let extension = result.extension;
|
|
7161
|
+
if (shouldActivate) {
|
|
7162
|
+
try {
|
|
7163
|
+
extension = await reloadExtension(extension.id, { by: updatedBy });
|
|
7164
|
+
} catch (error) {
|
|
7165
|
+
respondLifecycleError(res, error);
|
|
7166
|
+
return true;
|
|
7167
|
+
}
|
|
6358
7168
|
}
|
|
7169
|
+
installRoute.respond(res, 200, {
|
|
7170
|
+
extension: redactExtension(extension),
|
|
7171
|
+
manifest: validation.manifest,
|
|
7172
|
+
contentDeduped: result.contentDeduped
|
|
7173
|
+
});
|
|
6359
7174
|
return true;
|
|
6360
7175
|
}
|
|
6361
|
-
if (
|
|
6362
|
-
const parsed = await
|
|
7176
|
+
if (listRoute2.match(req.method, pathSegments)) {
|
|
7177
|
+
const parsed = await listRoute2.parse(req, res, pathSegments, queryParams);
|
|
6363
7178
|
if (!parsed)
|
|
6364
7179
|
return true;
|
|
6365
|
-
|
|
6366
|
-
|
|
6367
|
-
|
|
6368
|
-
|
|
6369
|
-
|
|
6370
|
-
|
|
6371
|
-
|
|
6372
|
-
|
|
7180
|
+
listRoute2.respond(res, 200, { extensions: (await listExtensions()).map(redactExtension) });
|
|
7181
|
+
return true;
|
|
7182
|
+
}
|
|
7183
|
+
if (typeDefsRoute.match(req.method, pathSegments)) {
|
|
7184
|
+
const parsed = await typeDefsRoute.parse(req, res, pathSegments, queryParams);
|
|
7185
|
+
if (!parsed)
|
|
7186
|
+
return true;
|
|
7187
|
+
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
|
|
7188
|
+
res.end(EXTENSION_TYPE_DEFINITIONS);
|
|
7189
|
+
return true;
|
|
7190
|
+
}
|
|
7191
|
+
if (versionsRoute.match(req.method, pathSegments)) {
|
|
7192
|
+
const parsed = await versionsRoute.parse(req, res, pathSegments, queryParams);
|
|
7193
|
+
if (!parsed)
|
|
7194
|
+
return true;
|
|
7195
|
+
if (!await getExtensionById(parsed.params.id)) {
|
|
7196
|
+
jsonError(res, "Extension not found", 404);
|
|
7197
|
+
return true;
|
|
7198
|
+
}
|
|
7199
|
+
versionsRoute.respond(res, 200, {
|
|
7200
|
+
versions: await listExtensionVersions(parsed.params.id)
|
|
6373
7201
|
});
|
|
6374
|
-
getEventCountsRoute.respond(res, 200, { counts });
|
|
6375
7202
|
return true;
|
|
6376
7203
|
}
|
|
6377
|
-
if (
|
|
6378
|
-
const parsed = await
|
|
7204
|
+
if (runsRoute.match(req.method, pathSegments)) {
|
|
7205
|
+
const parsed = await runsRoute.parse(req, res, pathSegments, queryParams);
|
|
7206
|
+
if (!parsed)
|
|
7207
|
+
return true;
|
|
7208
|
+
if (!await getExtensionById(parsed.params.id)) {
|
|
7209
|
+
jsonError(res, "Extension not found", 404);
|
|
7210
|
+
return true;
|
|
7211
|
+
}
|
|
7212
|
+
runsRoute.respond(res, 200, {
|
|
7213
|
+
runs: await listExtensionRuns(parsed.params.id, parsed.query.limit)
|
|
7214
|
+
});
|
|
7215
|
+
return true;
|
|
7216
|
+
}
|
|
7217
|
+
if (getRoute.match(req.method, pathSegments)) {
|
|
7218
|
+
const parsed = await getRoute.parse(req, res, pathSegments, queryParams);
|
|
7219
|
+
if (!parsed)
|
|
7220
|
+
return true;
|
|
7221
|
+
const extension = await getExtensionById(parsed.params.id);
|
|
7222
|
+
if (!extension) {
|
|
7223
|
+
jsonError(res, "Extension not found", 404);
|
|
7224
|
+
return true;
|
|
7225
|
+
}
|
|
7226
|
+
getRoute.respond(res, 200, {
|
|
7227
|
+
extension: redactExtension(extension),
|
|
7228
|
+
manifest: ExtensionManifestSchema.parse(JSON.parse(extension.manifestJson)),
|
|
7229
|
+
files: await getExtensionFiles(extension.id)
|
|
7230
|
+
});
|
|
7231
|
+
return true;
|
|
7232
|
+
}
|
|
7233
|
+
if (patchRoute.match(req.method, pathSegments)) {
|
|
7234
|
+
const parsed = await patchRoute.parse(req, res, pathSegments, queryParams);
|
|
7235
|
+
if (!parsed)
|
|
7236
|
+
return true;
|
|
7237
|
+
const principal = await requirePermission(req, res, agentId, "extension.write");
|
|
7238
|
+
if (!principal)
|
|
7239
|
+
return true;
|
|
7240
|
+
const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
|
|
7241
|
+
const stored = parsed.body.config ? await getExtensionById(parsed.params.id) : null;
|
|
7242
|
+
const config = parsed.body.config && stored ? preserveRedactedConfigValues(parsed.body.config, stored.configJson) : parsed.body.config;
|
|
7243
|
+
let extension = await updateExtensionMeta(parsed.params.id, {
|
|
7244
|
+
...parsed.body,
|
|
7245
|
+
...config === undefined ? {} : { config },
|
|
7246
|
+
updatedBy: await resolveHttpAuditUserId(req, writerAgentId)
|
|
7247
|
+
});
|
|
7248
|
+
if (!extension) {
|
|
7249
|
+
jsonError(res, "Extension not found", 404);
|
|
7250
|
+
return true;
|
|
7251
|
+
}
|
|
7252
|
+
if (extension.enabled) {
|
|
7253
|
+
try {
|
|
7254
|
+
extension = await reloadExtension(extension.id);
|
|
7255
|
+
} catch (error) {
|
|
7256
|
+
respondLifecycleError(res, error);
|
|
7257
|
+
return true;
|
|
7258
|
+
}
|
|
7259
|
+
}
|
|
7260
|
+
patchRoute.respond(res, 200, { extension: redactExtension(extension) });
|
|
7261
|
+
return true;
|
|
7262
|
+
}
|
|
7263
|
+
if (deleteRoute.match(req.method, pathSegments)) {
|
|
7264
|
+
const parsed = await deleteRoute.parse(req, res, pathSegments, queryParams);
|
|
7265
|
+
if (!parsed)
|
|
7266
|
+
return true;
|
|
7267
|
+
const principal = await requirePermission(req, res, agentId, "extension.write");
|
|
7268
|
+
if (!principal)
|
|
7269
|
+
return true;
|
|
7270
|
+
const extension = await getExtensionById(parsed.params.id);
|
|
7271
|
+
if (!extension) {
|
|
7272
|
+
jsonError(res, "Extension not found", 404);
|
|
7273
|
+
return true;
|
|
7274
|
+
}
|
|
7275
|
+
if (extension.enabled) {
|
|
7276
|
+
jsonError(res, "Disable the extension before uninstalling it", 409);
|
|
7277
|
+
return true;
|
|
7278
|
+
}
|
|
7279
|
+
await deleteExtension(extension.id);
|
|
7280
|
+
deleteRoute.respond(res, 200, { deleted: true });
|
|
7281
|
+
return true;
|
|
7282
|
+
}
|
|
7283
|
+
if (enableRoute.match(req.method, pathSegments)) {
|
|
7284
|
+
const parsed = await enableRoute.parse(req, res, pathSegments, queryParams);
|
|
6379
7285
|
if (!parsed)
|
|
6380
7286
|
return true;
|
|
7287
|
+
const principal = await requirePermission(req, res, agentId, "extension.activate");
|
|
7288
|
+
if (!principal)
|
|
7289
|
+
return true;
|
|
7290
|
+
const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
|
|
6381
7291
|
try {
|
|
6382
|
-
const
|
|
6383
|
-
|
|
7292
|
+
const extension = await enableExtension(parsed.params.id, {
|
|
7293
|
+
by: await resolveHttpAuditUserId(req, writerAgentId)
|
|
7294
|
+
});
|
|
7295
|
+
enableRoute.respond(res, 200, { extension: redactExtension(extension) });
|
|
6384
7296
|
} catch (error) {
|
|
6385
|
-
|
|
6386
|
-
jsonError(res, "Failed to store event", 500);
|
|
7297
|
+
respondLifecycleError(res, error);
|
|
6387
7298
|
}
|
|
6388
7299
|
return true;
|
|
6389
7300
|
}
|
|
6390
|
-
if (
|
|
6391
|
-
const parsed = await
|
|
7301
|
+
if (disableRoute.match(req.method, pathSegments)) {
|
|
7302
|
+
const parsed = await disableRoute.parse(req, res, pathSegments, queryParams);
|
|
6392
7303
|
if (!parsed)
|
|
6393
7304
|
return true;
|
|
6394
|
-
const
|
|
6395
|
-
|
|
6396
|
-
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
7305
|
+
const principal = await requirePermission(req, res, agentId, "extension.activate");
|
|
7306
|
+
if (!principal)
|
|
7307
|
+
return true;
|
|
7308
|
+
const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
|
|
7309
|
+
try {
|
|
7310
|
+
const extension = await disableExtension(parsed.params.id, {
|
|
7311
|
+
by: await resolveHttpAuditUserId(req, writerAgentId)
|
|
7312
|
+
});
|
|
7313
|
+
disableRoute.respond(res, 200, { extension: redactExtension(extension) });
|
|
7314
|
+
} catch (error) {
|
|
7315
|
+
respondLifecycleError(res, error);
|
|
7316
|
+
}
|
|
7317
|
+
return true;
|
|
7318
|
+
}
|
|
7319
|
+
if (activateVersionRoute.match(req.method, pathSegments)) {
|
|
7320
|
+
const parsed = await activateVersionRoute.parse(req, res, pathSegments, queryParams);
|
|
7321
|
+
if (!parsed)
|
|
7322
|
+
return true;
|
|
7323
|
+
const principal = await requirePermission(req, res, agentId, "extension.activate");
|
|
7324
|
+
if (!principal)
|
|
7325
|
+
return true;
|
|
7326
|
+
const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
|
|
7327
|
+
try {
|
|
7328
|
+
const extension = await activateVersion(parsed.params.id, parsed.body.version, {
|
|
7329
|
+
by: await resolveHttpAuditUserId(req, writerAgentId)
|
|
7330
|
+
});
|
|
7331
|
+
activateVersionRoute.respond(res, 200, { extension: redactExtension(extension) });
|
|
7332
|
+
} catch (error) {
|
|
7333
|
+
respondLifecycleError(res, error);
|
|
7334
|
+
}
|
|
6408
7335
|
return true;
|
|
6409
7336
|
}
|
|
6410
7337
|
return false;
|
|
@@ -7099,7 +8026,8 @@ var upsertState = route({
|
|
|
7099
8026
|
itemType: InboxItemTypeSchema,
|
|
7100
8027
|
itemId: exports_external.string().min(1),
|
|
7101
8028
|
status: InboxItemStatusSchema,
|
|
7102
|
-
snoozeUntil: exports_external.string().datetime().optional()
|
|
8029
|
+
snoozeUntil: exports_external.string().datetime().optional(),
|
|
8030
|
+
readAt: exports_external.string().datetime().optional()
|
|
7103
8031
|
}),
|
|
7104
8032
|
responses: {
|
|
7105
8033
|
200: {
|
|
@@ -7134,7 +8062,8 @@ async function handleInboxState(req, res, pathSegments, queryParams) {
|
|
|
7134
8062
|
itemType: parsed.body.itemType,
|
|
7135
8063
|
itemId: parsed.body.itemId,
|
|
7136
8064
|
status: parsed.body.status,
|
|
7137
|
-
snoozeUntil: parsed.body.snoozeUntil
|
|
8065
|
+
snoozeUntil: parsed.body.snoozeUntil,
|
|
8066
|
+
readAt: parsed.body.readAt
|
|
7138
8067
|
});
|
|
7139
8068
|
upsertState.respond(res, 200, { item });
|
|
7140
8069
|
} catch (err) {
|
|
@@ -9132,7 +10061,7 @@ async function handleMcp(req, res, transports, sessionActivity = {}, sessionAgen
|
|
|
9132
10061
|
};
|
|
9133
10062
|
const configs = await getResolvedConfig(agentId);
|
|
9134
10063
|
const configValue = configs.find((config) => config.key === "SCRIPTS_ONLY_MCP")?.value;
|
|
9135
|
-
const preloadEnabled = parseEnvFlag(configs.find((config) => config.key === "TASK_TOOL_PRELOAD_ENABLED")?.value ?? process.env.TASK_TOOL_PRELOAD_ENABLED,
|
|
10064
|
+
const preloadEnabled = parseEnvFlag(configs.find((config) => config.key === "TASK_TOOL_PRELOAD_ENABLED")?.value ?? process.env.TASK_TOOL_PRELOAD_ENABLED, true);
|
|
9136
10065
|
let preloadedTools = [];
|
|
9137
10066
|
if (preloadEnabled) {
|
|
9138
10067
|
const taskId = headerValue(req.headers["x-source-task-id"]);
|
|
@@ -9182,104 +10111,6 @@ async function handleMcp(req, res, transports, sessionActivity = {}, sessionAgen
|
|
|
9182
10111
|
return true;
|
|
9183
10112
|
}
|
|
9184
10113
|
|
|
9185
|
-
// src/http/mcp-bridge.ts
|
|
9186
|
-
init_zod();
|
|
9187
|
-
var _bridgeServer = null;
|
|
9188
|
-
async function getBridgeServer() {
|
|
9189
|
-
if (!_bridgeServer) {
|
|
9190
|
-
_bridgeServer = await createServer({ scriptsOnly: false, fullSurface: true });
|
|
9191
|
-
}
|
|
9192
|
-
return _bridgeServer;
|
|
9193
|
-
}
|
|
9194
|
-
var mcpBridgeRoute = route({
|
|
9195
|
-
method: "post",
|
|
9196
|
-
path: "/api/mcp-bridge",
|
|
9197
|
-
pattern: ["api", "mcp-bridge"],
|
|
9198
|
-
summary: "Generic MCP tool proxy for the scripts SDK bridge",
|
|
9199
|
-
tags: ["Scripts"],
|
|
9200
|
-
headers: runtimeInstanceHeader("acquire work through bridged tools"),
|
|
9201
|
-
body: exports_external.object({
|
|
9202
|
-
tool: exports_external.string().min(1).max(200),
|
|
9203
|
-
args: exports_external.record(exports_external.string(), exports_external.unknown()).default({})
|
|
9204
|
-
}),
|
|
9205
|
-
responses: {
|
|
9206
|
-
200: {
|
|
9207
|
-
description: "Tool result",
|
|
9208
|
-
unstructured: "Generic MCP tool proxy — response shape is whatever the invoked tool's structuredContent/content returns, which varies per tool"
|
|
9209
|
-
},
|
|
9210
|
-
400: { description: "Invalid tool name or args" },
|
|
9211
|
-
403: { description: "Tool not in SDK allowlist" },
|
|
9212
|
-
404: { description: "Tool not found" }
|
|
9213
|
-
}
|
|
9214
|
-
});
|
|
9215
|
-
async function handleMcpBridge(req, res, pathSegments, _queryParams, myAgentId) {
|
|
9216
|
-
if (!mcpBridgeRoute.match(req.method, pathSegments))
|
|
9217
|
-
return false;
|
|
9218
|
-
const parsed = await mcpBridgeRoute.parse(req, res, pathSegments, new URLSearchParams);
|
|
9219
|
-
if (!parsed)
|
|
9220
|
-
return true;
|
|
9221
|
-
const { tool: toolName, args } = parsed.body;
|
|
9222
|
-
if (!isMcpToolAllowedForScripts(toolName)) {
|
|
9223
|
-
jsonError(res, `Tool '${toolName}' is not in the SDK allowlist`, 403);
|
|
9224
|
-
return true;
|
|
9225
|
-
}
|
|
9226
|
-
const server = await getBridgeServer();
|
|
9227
|
-
const tools = server._registeredTools;
|
|
9228
|
-
const tool = tools[toolName];
|
|
9229
|
-
if (!tool) {
|
|
9230
|
-
jsonError(res, `Tool '${toolName}' not found in the MCP registry`, 404);
|
|
9231
|
-
return true;
|
|
9232
|
-
}
|
|
9233
|
-
if (tool.enabled === false) {
|
|
9234
|
-
jsonError(res, `Tool '${toolName}' is disabled`, 400);
|
|
9235
|
-
return true;
|
|
9236
|
-
}
|
|
9237
|
-
const sourceTaskId = Array.isArray(req.headers["x-source-task-id"]) ? req.headers["x-source-task-id"][0] : req.headers["x-source-task-id"];
|
|
9238
|
-
const runtimeInstanceId = Array.isArray(req.headers["x-runtime-instance-id"]) ? req.headers["x-runtime-instance-id"][0] : req.headers["x-runtime-instance-id"];
|
|
9239
|
-
const extra = markScriptSdkRequestOrigin({
|
|
9240
|
-
sessionId: "mcp-bridge",
|
|
9241
|
-
requestInfo: {
|
|
9242
|
-
headers: {
|
|
9243
|
-
"x-agent-id": myAgentId ?? "",
|
|
9244
|
-
...sourceTaskId ? { "x-source-task-id": sourceTaskId } : {},
|
|
9245
|
-
...runtimeInstanceId ? { "x-runtime-instance-id": runtimeInstanceId } : {}
|
|
9246
|
-
}
|
|
9247
|
-
}
|
|
9248
|
-
});
|
|
9249
|
-
let handlerArgs = args;
|
|
9250
|
-
if (tool.inputSchema) {
|
|
9251
|
-
const inputObj = normalizeObjectSchema(tool.inputSchema);
|
|
9252
|
-
const parseResult = await safeParseAsync(inputObj ?? tool.inputSchema, args);
|
|
9253
|
-
if (!parseResult.success) {
|
|
9254
|
-
const parseError = "error" in parseResult ? parseResult.error : "Unknown error";
|
|
9255
|
-
jsonError(res, `Invalid arguments for tool '${toolName}': ${getParseErrorMessage(parseError)}`, 400);
|
|
9256
|
-
return true;
|
|
9257
|
-
}
|
|
9258
|
-
handlerArgs = parseResult.data;
|
|
9259
|
-
}
|
|
9260
|
-
try {
|
|
9261
|
-
const result = tool.inputSchema ? await Promise.resolve(tool.handler(handlerArgs, extra)) : await Promise.resolve(tool.handler(extra));
|
|
9262
|
-
if (result && typeof result === "object" && "structuredContent" in result) {
|
|
9263
|
-
json(res, result.structuredContent);
|
|
9264
|
-
} else if (result && typeof result === "object" && "content" in result) {
|
|
9265
|
-
const content = result.content;
|
|
9266
|
-
const text = content.filter((c) => c.type === "text" && c.text).map((c) => c.text).join(`
|
|
9267
|
-
`);
|
|
9268
|
-
try {
|
|
9269
|
-
json(res, JSON.parse(text));
|
|
9270
|
-
} catch {
|
|
9271
|
-
json(res, { result: text });
|
|
9272
|
-
}
|
|
9273
|
-
} else {
|
|
9274
|
-
json(res, result ?? {});
|
|
9275
|
-
}
|
|
9276
|
-
} catch (err) {
|
|
9277
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
9278
|
-
jsonError(res, message, 500);
|
|
9279
|
-
}
|
|
9280
|
-
return true;
|
|
9281
|
-
}
|
|
9282
|
-
|
|
9283
10114
|
// src/http/mcp-oauth.ts
|
|
9284
10115
|
init_zod();
|
|
9285
10116
|
init_db();
|
|
@@ -14946,7 +15777,7 @@ var deleteByIdRoute = route({
|
|
|
14946
15777
|
},
|
|
14947
15778
|
auth: { apiKey: true }
|
|
14948
15779
|
});
|
|
14949
|
-
var
|
|
15780
|
+
var listRoute3 = route({
|
|
14950
15781
|
method: "get",
|
|
14951
15782
|
path: "/api/prompt-templates",
|
|
14952
15783
|
pattern: ["api", "prompt-templates"],
|
|
@@ -15126,8 +15957,8 @@ ${templateBody}` : templateBody;
|
|
|
15126
15957
|
}
|
|
15127
15958
|
return true;
|
|
15128
15959
|
}
|
|
15129
|
-
if (
|
|
15130
|
-
const parsed = await
|
|
15960
|
+
if (listRoute3.match(req.method, pathSegments)) {
|
|
15961
|
+
const parsed = await listRoute3.parse(req, res, pathSegments, queryParams);
|
|
15131
15962
|
if (!parsed)
|
|
15132
15963
|
return true;
|
|
15133
15964
|
const templates = getPromptTemplates({
|
|
@@ -15136,7 +15967,7 @@ ${templateBody}` : templateBody;
|
|
|
15136
15967
|
scopeId: parsed.query.scopeId || undefined,
|
|
15137
15968
|
isDefault: parsed.query.isDefault ? parsed.query.isDefault === "true" : undefined
|
|
15138
15969
|
});
|
|
15139
|
-
|
|
15970
|
+
listRoute3.respond(res, 200, { templates: templates.map(toPromptTemplateResponse) });
|
|
15140
15971
|
return true;
|
|
15141
15972
|
}
|
|
15142
15973
|
if (upsertRoute.match(req.method, pathSegments)) {
|
|
@@ -16319,7 +17150,7 @@ init_secret_scrubber();
|
|
|
16319
17150
|
var providerSchema = exports_external.string().min(1).max(255).regex(/^[A-Za-z0-9_-]+$/);
|
|
16320
17151
|
var scopeSchema = exports_external.enum(["global", "agent", "repo"]);
|
|
16321
17152
|
var connectionKindSchema = exports_external.enum(["openapi", "graphql", "mcp"]);
|
|
16322
|
-
var
|
|
17153
|
+
var idParamsSchema2 = exports_external.object({ id: exports_external.string().uuid() });
|
|
16323
17154
|
var providerParamsSchema = exports_external.object({ provider: providerSchema });
|
|
16324
17155
|
var oauthResourceIdParamsSchema = exports_external.object({ id: exports_external.string().min(1).max(255) });
|
|
16325
17156
|
var listConnectionsQuerySchema = exports_external.object({
|
|
@@ -16648,7 +17479,7 @@ var getConnectionRoute = route({
|
|
|
16648
17479
|
operationId: "script_connections_get",
|
|
16649
17480
|
summary: "Get script connection detail",
|
|
16650
17481
|
tags: ["Script Connections"],
|
|
16651
|
-
params:
|
|
17482
|
+
params: idParamsSchema2,
|
|
16652
17483
|
responses: {
|
|
16653
17484
|
200: {
|
|
16654
17485
|
description: "Script connection detail",
|
|
@@ -16682,7 +17513,7 @@ var refreshConnectionRoute = route({
|
|
|
16682
17513
|
operationId: "script_connections_refresh",
|
|
16683
17514
|
summary: "Refresh a script connection",
|
|
16684
17515
|
tags: ["Script Connections"],
|
|
16685
|
-
params:
|
|
17516
|
+
params: idParamsSchema2,
|
|
16686
17517
|
responses: {
|
|
16687
17518
|
200: {
|
|
16688
17519
|
description: "Refreshed script connection",
|
|
@@ -16701,7 +17532,7 @@ var setConnectionEnabledRoute = route({
|
|
|
16701
17532
|
operationId: "script_connections_set_enabled",
|
|
16702
17533
|
summary: "Enable or disable a script connection",
|
|
16703
17534
|
tags: ["Script Connections"],
|
|
16704
|
-
params:
|
|
17535
|
+
params: idParamsSchema2,
|
|
16705
17536
|
body: disableConnectionBodySchema,
|
|
16706
17537
|
responses: {
|
|
16707
17538
|
200: {
|
|
@@ -18272,7 +19103,7 @@ init_types();
|
|
|
18272
19103
|
init_constants();
|
|
18273
19104
|
var DEFAULT_SCRIPT_RUN_CONCURRENCY_CAP = 10;
|
|
18274
19105
|
var runIdParamsSchema = exports_external.object({ runId: exports_external.string().uuid() });
|
|
18275
|
-
var
|
|
19106
|
+
var idParamsSchema3 = exports_external.object({ id: exports_external.string().uuid() });
|
|
18276
19107
|
var stepParamsSchema = exports_external.object({
|
|
18277
19108
|
runId: exports_external.string().uuid(),
|
|
18278
19109
|
stepKey: exports_external.string().min(1)
|
|
@@ -18379,7 +19210,7 @@ var getScriptRunRoute = route({
|
|
|
18379
19210
|
operationId: "script_runs_get",
|
|
18380
19211
|
summary: "Get a script workflow run with journal",
|
|
18381
19212
|
tags: ["Script Runs"],
|
|
18382
|
-
params:
|
|
19213
|
+
params: idParamsSchema3,
|
|
18383
19214
|
responses: {
|
|
18384
19215
|
200: {
|
|
18385
19216
|
description: "Script run detail",
|
|
@@ -18395,7 +19226,7 @@ var deleteScriptRunRoute = route({
|
|
|
18395
19226
|
operationId: "script_runs_cancel",
|
|
18396
19227
|
summary: "Cancel a script workflow run",
|
|
18397
19228
|
tags: ["Script Runs"],
|
|
18398
|
-
params:
|
|
19229
|
+
params: idParamsSchema3,
|
|
18399
19230
|
responses: {
|
|
18400
19231
|
204: { description: "Script run cancelled, or already terminal" },
|
|
18401
19232
|
404: { description: "Script run not found" }
|
|
@@ -18775,6 +19606,7 @@ async function handleScriptRuns(req, res, pathSegments, queryParams, agentId) {
|
|
|
18775
19606
|
agentId: parsed.body.agentId,
|
|
18776
19607
|
routingReason: parsed.body.routingReason ?? (parsed.body.agentId ? "human_pinned" : undefined),
|
|
18777
19608
|
routingNote: parsed.body.routingNote,
|
|
19609
|
+
routingSource: parsed.body.routingReason ? "declared" : parsed.body.agentId ? "engine_default" : undefined,
|
|
18778
19610
|
tags: parsed.body.tags,
|
|
18779
19611
|
priority: parsed.body.priority,
|
|
18780
19612
|
offeredTo: parsed.body.offerMode ? parsed.body.agentId : undefined,
|
|
@@ -18841,7 +19673,7 @@ var searchBodySchema = exports_external.object({
|
|
|
18841
19673
|
var nameParamsSchema = exports_external.object({ name: scriptNameSchema });
|
|
18842
19674
|
var scopeQuerySchema = exports_external.object({ scope: ScriptScopeSchema.default("agent") });
|
|
18843
19675
|
var optionalScopeQuerySchema = exports_external.object({ scope: ScriptScopeSchema.optional() });
|
|
18844
|
-
var
|
|
19676
|
+
var idParamsSchema4 = exports_external.object({ id: exports_external.string().uuid() });
|
|
18845
19677
|
var listScriptsQuerySchema = exports_external.object({
|
|
18846
19678
|
scope: ScriptScopeSchema.optional(),
|
|
18847
19679
|
includeScratch: exports_external.enum(["true", "false"]).optional()
|
|
@@ -18976,7 +19808,7 @@ var searchRoute = route({
|
|
|
18976
19808
|
},
|
|
18977
19809
|
rbac: { permission: "script.search" }
|
|
18978
19810
|
});
|
|
18979
|
-
var
|
|
19811
|
+
var deleteRoute2 = route({
|
|
18980
19812
|
method: "delete",
|
|
18981
19813
|
path: "/api/scripts/{name}",
|
|
18982
19814
|
pattern: ["api", "scripts", null],
|
|
@@ -19024,7 +19856,7 @@ var listScriptsRoute = route({
|
|
|
19024
19856
|
400: { description: "Validation error" }
|
|
19025
19857
|
}
|
|
19026
19858
|
});
|
|
19027
|
-
var
|
|
19859
|
+
var typeDefsRoute2 = route({
|
|
19028
19860
|
method: "get",
|
|
19029
19861
|
path: "/api/scripts/type-defs",
|
|
19030
19862
|
pattern: ["api", "scripts", "type-defs"],
|
|
@@ -19047,7 +19879,7 @@ var getScriptByIdRoute = route({
|
|
|
19047
19879
|
summary: "Get a saved script by id",
|
|
19048
19880
|
description: "Dashboard read: full record including source and parsed signature.",
|
|
19049
19881
|
tags: ["Scripts"],
|
|
19050
|
-
params:
|
|
19882
|
+
params: idParamsSchema4,
|
|
19051
19883
|
responses: {
|
|
19052
19884
|
200: { description: "Script detail", schema: exports_external.object({ script: scriptDetailSchema }) },
|
|
19053
19885
|
404: { description: "Script not found" }
|
|
@@ -19061,7 +19893,7 @@ var listVersionsRoute = route({
|
|
|
19061
19893
|
summary: "List versions of a saved script",
|
|
19062
19894
|
description: "Dashboard read: version history, newest first.",
|
|
19063
19895
|
tags: ["Scripts"],
|
|
19064
|
-
params:
|
|
19896
|
+
params: idParamsSchema4,
|
|
19065
19897
|
responses: {
|
|
19066
19898
|
200: {
|
|
19067
19899
|
description: "Script versions",
|
|
@@ -19093,7 +19925,7 @@ var createScriptApiRoute = route({
|
|
|
19093
19925
|
summary: "Expose a script as an external HTTP API endpoint",
|
|
19094
19926
|
description: "Returns the endpoint plus the plaintext bearer token (when authMode is 'bearer').",
|
|
19095
19927
|
tags: ["Scripts"],
|
|
19096
|
-
params:
|
|
19928
|
+
params: idParamsSchema4,
|
|
19097
19929
|
body: createScriptApiBodySchema,
|
|
19098
19930
|
responses: {
|
|
19099
19931
|
201: { description: "Endpoint created", schema: scriptApiWithSecretSchema },
|
|
@@ -19109,7 +19941,7 @@ var listScriptApisRoute = route({
|
|
|
19109
19941
|
operationId: "scripts_api_list",
|
|
19110
19942
|
summary: "List external API endpoints for a script",
|
|
19111
19943
|
tags: ["Scripts"],
|
|
19112
|
-
params:
|
|
19944
|
+
params: idParamsSchema4,
|
|
19113
19945
|
responses: {
|
|
19114
19946
|
200: {
|
|
19115
19947
|
description: "Endpoints (without secrets)",
|
|
@@ -19472,11 +20304,11 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
|
|
|
19472
20304
|
listScriptsRoute.respond(res, 200, { scripts });
|
|
19473
20305
|
return true;
|
|
19474
20306
|
}
|
|
19475
|
-
if (
|
|
20307
|
+
if (typeDefsRoute2.match(req.method, pathSegments)) {
|
|
19476
20308
|
const apiTypes = getScriptApiTypes();
|
|
19477
20309
|
const mcpTypes = getScriptMcpTypes();
|
|
19478
20310
|
const appTypes = await getScriptAppTypes();
|
|
19479
|
-
|
|
20311
|
+
typeDefsRoute2.respond(res, 200, {
|
|
19480
20312
|
sdkTypes: await scriptSdkTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes),
|
|
19481
20313
|
stdlibTypes: await scriptStdlibTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes)
|
|
19482
20314
|
});
|
|
@@ -19530,8 +20362,8 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
|
|
|
19530
20362
|
});
|
|
19531
20363
|
return true;
|
|
19532
20364
|
}
|
|
19533
|
-
if (
|
|
19534
|
-
const parsed = await
|
|
20365
|
+
if (deleteRoute2.match(req.method, pathSegments)) {
|
|
20366
|
+
const parsed = await deleteRoute2.parse(req, res, pathSegments, queryParams);
|
|
19535
20367
|
if (!parsed)
|
|
19536
20368
|
return true;
|
|
19537
20369
|
const agent = await requireAgent2(res, agentId);
|
|
@@ -19570,7 +20402,7 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
|
|
|
19570
20402
|
}, 409);
|
|
19571
20403
|
return true;
|
|
19572
20404
|
}
|
|
19573
|
-
|
|
20405
|
+
deleteRoute2.respond(res, 200, { deleted: outcome.deleted });
|
|
19574
20406
|
return true;
|
|
19575
20407
|
}
|
|
19576
20408
|
if (createScriptApiRoute.match(req.method, pathSegments)) {
|
|
@@ -21590,8 +22422,7 @@ async function harnessMilestone() {
|
|
|
21590
22422
|
};
|
|
21591
22423
|
}
|
|
21592
22424
|
function embeddingsMilestone() {
|
|
21593
|
-
|
|
21594
|
-
if (embeddingKey) {
|
|
22425
|
+
if (getEmbeddingProvider().isConfigured()) {
|
|
21595
22426
|
return {
|
|
21596
22427
|
id: "embeddings",
|
|
21597
22428
|
label: "Memory search",
|
|
@@ -22073,7 +22904,14 @@ var createTask = route({
|
|
|
22073
22904
|
}),
|
|
22074
22905
|
responses: {
|
|
22075
22906
|
201: { description: "Task created", schema: AgentTaskSchema },
|
|
22076
|
-
400: { description: "Validation error" }
|
|
22907
|
+
400: { description: "Validation error" },
|
|
22908
|
+
422: {
|
|
22909
|
+
description: "Task creation blocked by an extension",
|
|
22910
|
+
schema: exports_external.object({
|
|
22911
|
+
error: exports_external.string(),
|
|
22912
|
+
extension: exports_external.object({ id: exports_external.string(), name: exports_external.string() })
|
|
22913
|
+
})
|
|
22914
|
+
}
|
|
22077
22915
|
}
|
|
22078
22916
|
});
|
|
22079
22917
|
var promoteDraftTaskRoute = route({
|
|
@@ -22557,6 +23395,7 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
|
|
|
22557
23395
|
key: assetKey,
|
|
22558
23396
|
agentId: defaultAgentId,
|
|
22559
23397
|
routingReason: parsed.body.routingReason ?? (defaultAgentId ? parentTask?.agentId === defaultAgentId ? "continuity" : "skill" : undefined),
|
|
23398
|
+
routingSource: parsed.body.routingReason ? "declared" : defaultAgentId ? "engine_default" : undefined,
|
|
22560
23399
|
routingNote: parsed.body.routingNote,
|
|
22561
23400
|
creatorAgentId: myAgentId || undefined,
|
|
22562
23401
|
taskType: parsed.body.taskType || undefined,
|
|
@@ -22576,7 +23415,7 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
|
|
|
22576
23415
|
modelTier: parsed.body.modelTier
|
|
22577
23416
|
}),
|
|
22578
23417
|
effort: parsed.body.effort
|
|
22579
|
-
});
|
|
23418
|
+
}, { origin: "rest" });
|
|
22580
23419
|
ensure({
|
|
22581
23420
|
id: "created",
|
|
22582
23421
|
flow: "task",
|
|
@@ -22594,6 +23433,10 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
|
|
|
22594
23433
|
});
|
|
22595
23434
|
createTask.respond(res, 201, task);
|
|
22596
23435
|
} catch (error) {
|
|
23436
|
+
if (error instanceof TaskCreationBlockedError) {
|
|
23437
|
+
createTask.respond(res, 422, { error: error.reason, extension: error.extension });
|
|
23438
|
+
return true;
|
|
23439
|
+
}
|
|
22597
23440
|
console.error("[HTTP] Failed to create task:", error);
|
|
22598
23441
|
jsonError(res, "Failed to create task", 500);
|
|
22599
23442
|
}
|
|
@@ -24831,13 +25674,14 @@ async function routeKapsoInbound(payload) {
|
|
|
24831
25674
|
const task = await createTaskWithSiblingAwareness(await buildTaskDescription(payload), {
|
|
24832
25675
|
agentId: mapping.agentId ?? null,
|
|
24833
25676
|
routingReason: mapping.agentId ? "human_pinned" : undefined,
|
|
25677
|
+
routingSource: mapping.agentId ? "engine_default" : undefined,
|
|
24834
25678
|
source: "system",
|
|
24835
25679
|
taskType: "kapso-inbound",
|
|
24836
25680
|
tags: ["kapso-whatsapp", "inbound"],
|
|
24837
25681
|
priority: 70,
|
|
24838
25682
|
requestedByUserId: await resolveKapsoRequestedByUserId(payload),
|
|
24839
25683
|
contextKey: `kapso:conversation:${payload.conversation?.id ?? messageId}`
|
|
24840
|
-
});
|
|
25684
|
+
}, { origin: "webhook" });
|
|
24841
25685
|
return { kind: "task", taskId: task.id };
|
|
24842
25686
|
}
|
|
24843
25687
|
|
|
@@ -25717,21 +26561,21 @@ var getWorkflowVersionRoute = route({
|
|
|
25717
26561
|
});
|
|
25718
26562
|
async function handleWorkflows(req, res, pathSegments, queryParams, myAgentId) {
|
|
25719
26563
|
if (listExecutorTypesRoute.match(req.method, pathSegments)) {
|
|
25720
|
-
const
|
|
25721
|
-
listExecutorTypesRoute.respond(res, 200, { executorTypes:
|
|
26564
|
+
const registry = getExecutorRegistry();
|
|
26565
|
+
listExecutorTypesRoute.respond(res, 200, { executorTypes: registry.describeAll() });
|
|
25722
26566
|
return true;
|
|
25723
26567
|
}
|
|
25724
26568
|
if (getExecutorTypeRoute.match(req.method, pathSegments)) {
|
|
25725
26569
|
const parsed = await getExecutorTypeRoute.parse(req, res, pathSegments, queryParams);
|
|
25726
26570
|
if (!parsed)
|
|
25727
26571
|
return true;
|
|
25728
|
-
const
|
|
25729
|
-
if (!
|
|
26572
|
+
const registry = getExecutorRegistry();
|
|
26573
|
+
if (!registry.has(parsed.params.type)) {
|
|
25730
26574
|
res.writeHead(404);
|
|
25731
26575
|
res.end();
|
|
25732
26576
|
return true;
|
|
25733
26577
|
}
|
|
25734
|
-
getExecutorTypeRoute.respond(res, 200,
|
|
26578
|
+
getExecutorTypeRoute.respond(res, 200, registry.describe(parsed.params.type));
|
|
25735
26579
|
return true;
|
|
25736
26580
|
}
|
|
25737
26581
|
if (webhookTriggerRoute.match(req.method, pathSegments)) {
|
|
@@ -26388,6 +27232,7 @@ function startApiGcInterval() {
|
|
|
26388
27232
|
}
|
|
26389
27233
|
if (globalState.__httpServer) {
|
|
26390
27234
|
globalState.__closeRealtime?.();
|
|
27235
|
+
await globalState.__stopExtensions?.();
|
|
26391
27236
|
console.log("[HTTP] Hot reload detected, closing previous server...");
|
|
26392
27237
|
globalState.__httpServer.close();
|
|
26393
27238
|
}
|
|
@@ -26492,6 +27337,7 @@ var httpServer = createHttpServer(async (req, res) => {
|
|
|
26492
27337
|
() => handleApiKeys(req, res, pathSegments, queryParams),
|
|
26493
27338
|
() => handleHeartbeat(req, res, pathSegments),
|
|
26494
27339
|
() => handleEvents(req, res, pathSegments, queryParams, myAgentId),
|
|
27340
|
+
() => handleExtensions(req, res, pathSegments, queryParams, myAgentId),
|
|
26495
27341
|
() => handleFavorites(req, res, pathSegments, queryParams, myAgentId),
|
|
26496
27342
|
() => handleUsers(req, res, pathSegments, queryParams),
|
|
26497
27343
|
() => handleSessions(req, res, pathSegments, queryParams),
|
|
@@ -26546,6 +27392,7 @@ globalState.__mcpSessionAgents = mcpSessionAgents;
|
|
|
26546
27392
|
globalState.__sessionUsers = sessionUsers;
|
|
26547
27393
|
globalState.__transportActivity = transportActivity;
|
|
26548
27394
|
globalState.__transportActivityUser = transportActivityUser;
|
|
27395
|
+
globalState.__stopExtensions = stopExtensionRuntime;
|
|
26549
27396
|
async function shutdown() {
|
|
26550
27397
|
globalState.__closeRealtime?.();
|
|
26551
27398
|
console.log("Shutting down HTTP server...");
|
|
@@ -26555,7 +27402,7 @@ async function shutdown() {
|
|
|
26555
27402
|
sessionsProcessed: getServerSessionsProcessed()
|
|
26556
27403
|
});
|
|
26557
27404
|
if (hasCapability("scheduling")) {
|
|
26558
|
-
const { stopScheduler } = await import("./index-
|
|
27405
|
+
const { stopScheduler } = await import("./index-hw26vj40.js");
|
|
26559
27406
|
stopScheduler();
|
|
26560
27407
|
}
|
|
26561
27408
|
stopHeartbeat();
|
|
@@ -26563,13 +27410,14 @@ async function shutdown() {
|
|
|
26563
27410
|
await stopScriptRunSupervisor();
|
|
26564
27411
|
await stopSlackApp();
|
|
26565
27412
|
if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
|
|
26566
|
-
const { stopOAuthKeepalive } = await import("./keepalive-
|
|
27413
|
+
const { stopOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
|
|
26567
27414
|
await stopOAuthKeepalive();
|
|
26568
27415
|
}
|
|
26569
27416
|
stopOAuthPendingGc();
|
|
26570
27417
|
stopMemoryGc();
|
|
26571
27418
|
await stopDbRetention();
|
|
26572
27419
|
stopScratchScriptGc();
|
|
27420
|
+
await stopExtensionRuntime();
|
|
26573
27421
|
stopAuditGc();
|
|
26574
27422
|
stopAuditWriter();
|
|
26575
27423
|
await flushAuditBuffer();
|
|
@@ -26617,7 +27465,7 @@ if (!globalState.__runId) {
|
|
|
26617
27465
|
startApiGcInterval();
|
|
26618
27466
|
var startupConfigsInjected = [];
|
|
26619
27467
|
try {
|
|
26620
|
-
startupConfigsInjected = await loadGlobalConfigsIntoEnv(
|
|
27468
|
+
startupConfigsInjected = await loadGlobalConfigsIntoEnv(true);
|
|
26621
27469
|
} catch (err) {
|
|
26622
27470
|
console.error("[startup] Failed to load global swarm configs before listen:", err);
|
|
26623
27471
|
process.exitCode = 1;
|
|
@@ -26630,15 +27478,15 @@ try {
|
|
|
26630
27478
|
console.warn("[startup] CAPABILITIES upgrade seed failed (non-fatal):", err);
|
|
26631
27479
|
}
|
|
26632
27480
|
try {
|
|
26633
|
-
const { seedPricingFromModelsDev } = await import("./seed-pricing-
|
|
27481
|
+
const { seedPricingFromModelsDev } = await import("./seed-pricing-jqjs6cws.js");
|
|
26634
27482
|
seedPricingFromModelsDev();
|
|
26635
|
-
const { startPricingRefreshLoop } = await import("./pricing-refresh-
|
|
27483
|
+
const { startPricingRefreshLoop } = await import("./pricing-refresh-mx51az05.js");
|
|
26636
27484
|
startPricingRefreshLoop();
|
|
26637
27485
|
} catch (err) {
|
|
26638
27486
|
console.error("[startup] Failed to seed pricing rows:", err);
|
|
26639
27487
|
}
|
|
26640
27488
|
try {
|
|
26641
|
-
const { ensureRbacSeedsSynced } = await import("./rbac-roles-
|
|
27489
|
+
const { ensureRbacSeedsSynced } = await import("./rbac-roles-wcmrg6sv.js");
|
|
26642
27490
|
ensureRbacSeedsSynced();
|
|
26643
27491
|
} catch (err) {
|
|
26644
27492
|
console.error("[startup] Failed to sync RBAC seed rows:", err);
|
|
@@ -26646,11 +27494,16 @@ try {
|
|
|
26646
27494
|
throw err;
|
|
26647
27495
|
}
|
|
26648
27496
|
try {
|
|
26649
|
-
const { runAllSeeders } = await import("./index-
|
|
27497
|
+
const { runAllSeeders } = await import("./index-16js521z.js");
|
|
26650
27498
|
await runAllSeeders({ scriptEmbeddingMode: "skip" });
|
|
26651
27499
|
} catch (err) {
|
|
26652
27500
|
console.error("[startup] Failed to seed built-in entities:", err);
|
|
26653
27501
|
}
|
|
27502
|
+
try {
|
|
27503
|
+
await loadEnabledExtensions();
|
|
27504
|
+
} catch (err) {
|
|
27505
|
+
console.error("[startup] Failed to initialize extensions:", scrubSecrets(err instanceof Error ? err.message : String(err)));
|
|
27506
|
+
}
|
|
26654
27507
|
setAuditSink(enqueueAuditRow);
|
|
26655
27508
|
startAuditWriter();
|
|
26656
27509
|
await startAuditGc();
|
|
@@ -26658,6 +27511,10 @@ startScratchScriptGc();
|
|
|
26658
27511
|
initialize();
|
|
26659
27512
|
await initOtel("api");
|
|
26660
27513
|
httpServer.listen(port, async () => {
|
|
27514
|
+
const boundAddress = httpServer.address();
|
|
27515
|
+
if (boundAddress && typeof boundAddress === "object") {
|
|
27516
|
+
setExtensionLoopbackBaseUrl(`http://127.0.0.1:${boundAddress.port}`);
|
|
27517
|
+
}
|
|
26661
27518
|
console.log(`MCP HTTP server running on http://localhost:${port}/mcp`);
|
|
26662
27519
|
ensure({
|
|
26663
27520
|
id: "listen",
|
|
@@ -26677,7 +27534,11 @@ httpServer.listen(port, async () => {
|
|
|
26677
27534
|
if (process.env.GITHUB_TOKEN) {
|
|
26678
27535
|
await emitBuiltInIntegrationConnectedOnce("github");
|
|
26679
27536
|
}
|
|
26680
|
-
|
|
27537
|
+
try {
|
|
27538
|
+
await startSlackApp();
|
|
27539
|
+
} catch (err) {
|
|
27540
|
+
console.error("[Slack] Failed to start, continuing boot without Slack:", err);
|
|
27541
|
+
}
|
|
26681
27542
|
startQueueStallAlarm();
|
|
26682
27543
|
initGitHub();
|
|
26683
27544
|
initGitLab();
|
|
@@ -26687,36 +27548,36 @@ httpServer.listen(port, async () => {
|
|
|
26687
27548
|
await initWorkflows();
|
|
26688
27549
|
await startScriptRunSupervisor(getMcpBaseUrl());
|
|
26689
27550
|
if (hasCapability("scheduling")) {
|
|
26690
|
-
const { startScheduler } = await import("./index-
|
|
26691
|
-
const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-
|
|
27551
|
+
const { startScheduler } = await import("./index-hw26vj40.js");
|
|
27552
|
+
const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-nnrbpcjp.js");
|
|
26692
27553
|
const intervalMs = Number(process.env.SCHEDULER_INTERVAL_MS) || 1e4;
|
|
26693
27554
|
startScheduler(getExecutorRegistry2(), intervalMs, {
|
|
26694
27555
|
runId: globalState.__runId
|
|
26695
27556
|
});
|
|
26696
27557
|
}
|
|
26697
27558
|
if (!isEnvFlagEnabled("HEARTBEAT_DISABLE", false)) {
|
|
26698
|
-
const { startHeartbeat } = await import("./index-
|
|
27559
|
+
const { startHeartbeat } = await import("./index-zj518gf9.js");
|
|
26699
27560
|
const heartbeatMs = Number(process.env.HEARTBEAT_INTERVAL_MS) || 90000;
|
|
26700
27561
|
startHeartbeat(heartbeatMs);
|
|
26701
27562
|
}
|
|
26702
27563
|
if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
|
|
26703
|
-
const { startOAuthKeepalive } = await import("./keepalive-
|
|
27564
|
+
const { startOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
|
|
26704
27565
|
startOAuthKeepalive();
|
|
26705
27566
|
}
|
|
26706
27567
|
if (process.env.OAUTH_REFRESH_SWEEP_DISABLE !== "true") {
|
|
26707
|
-
const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-
|
|
27568
|
+
const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-3s04c6qw.js");
|
|
26708
27569
|
startOAuthRefreshSweep();
|
|
26709
27570
|
}
|
|
26710
27571
|
startOAuthPendingGc();
|
|
26711
27572
|
await startMemoryGc();
|
|
26712
27573
|
await startDbRetention();
|
|
26713
|
-
import("./boot-reembed-
|
|
27574
|
+
import("./boot-reembed-nafcmmmc.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
|
|
26714
27575
|
console.error("[boot-reembed] startup backfill failed (non-fatal):", err);
|
|
26715
27576
|
});
|
|
26716
|
-
import("./boot-reembed-
|
|
27577
|
+
import("./boot-reembed-3cmrrmpa.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
|
|
26717
27578
|
console.error("[boot-reembed-scripts] startup backfill failed (non-fatal):", err);
|
|
26718
27579
|
});
|
|
26719
|
-
import("./boot-scrub-logs-
|
|
27580
|
+
import("./boot-scrub-logs-cd6a2sq0.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
|
|
26720
27581
|
console.error("[boot-scrub-logs] startup scrub failed (non-fatal):", err);
|
|
26721
27582
|
});
|
|
26722
27583
|
}).on("error", (err) => {
|