@desplega.ai/agent-swarm 1.173.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{acp-adapter-ccm9xrep.js → acp-adapter-kr4abrsk.js} +17 -16
- package/dist/{actions-sgeyv08k.js → actions-eh4g6w2r.js} +39 -34
- package/dist/{amp-adapter-gpxp3kc9.js → amp-adapter-7h7wdt8q.js} +8 -7
- package/dist/{app-km9qnv2f.js → app-7k8s9w5p.js} +18 -14
- package/dist/{assistant-5r8tcvvd.js → assistant-wswt2y7p.js} +40 -35
- package/dist/{boot-reembed-16rv9843.js → boot-reembed-9apm9qw6.js} +10 -9
- package/dist/{boot-reembed-swwzdgd7.js → boot-reembed-whzbdthj.js} +10 -9
- package/dist/{boot-scrub-sweep-zkr6vkqb.js → boot-scrub-sweep-ndzmvmgt.js} +11 -10
- package/dist/{boot-seeds-d8sp49t2.js → boot-seeds-e9sta0yt.js} +16 -13
- package/dist/{claude-adapter-yzzzh8jp.js → claude-adapter-4mqd3r6r.js} +19 -18
- package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-9wswb52m.js} +7 -5
- package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-tpe1effx.js} +6 -4
- package/dist/{claude-sdk-session-4whxere4.js → claude-sdk-session-q49ghmh9.js} +12402 -11850
- package/dist/{cli-ne7smj1b.js → cli-01xvj1rq.js} +10 -10
- package/dist/{cli-nwrdx840.js → cli-035vekcw.js} +3 -3
- package/dist/{cli-9xf7fdtp.js → cli-0pd8hzhc.js} +29 -6
- package/dist/{cli-tmhsxhb8.js → cli-0veb92a3.js} +28 -6
- package/dist/{cli-c3rk1v0x.js → cli-10jesr25.js} +3 -3
- package/dist/{cli-6thk4jz3.js → cli-1y7yywmj.js} +6 -6
- package/dist/{cli-6r2f7edk.js → cli-20krdhz5.js} +47 -19
- package/dist/{cli-rfs4vddv.js → cli-29rja109.js} +39 -20
- package/dist/cli-2m1ktfzz.js +17795 -0
- package/dist/{cli-na2pxe4f.js → cli-2pwa0q4d.js} +15 -4
- package/dist/{cli-7a93cv8c.js → cli-4mengw46.js} +441 -43
- package/dist/{cli-94b48jhk.js → cli-5twdke5x.js} +16 -14
- package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
- package/dist/cli-6cvfxs8r.js +47 -0
- package/dist/{cli-w1apjecb.js → cli-711vwbxn.js} +2 -2
- package/dist/{cli-r4fqfpwf.js → cli-78vv7446.js} +50 -27
- package/dist/{cli-srqq3gc5.js → cli-7n6s5man.js} +5 -5
- package/dist/{cli-m89t9jdf.js → cli-7x0g4sn1.js} +15416 -16024
- package/dist/{cli-2bw3w47j.js → cli-8wwxw8a3.js} +1 -1
- package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
- package/dist/{cli-ywm1azg9.js → cli-9jzdj90z.js} +8 -4
- package/dist/cli-9traj3dn.js +638 -0
- package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
- package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
- package/dist/cli-cvv9k0hh.js +10143 -0
- package/dist/{cli-anzdk0z4.js → cli-d9286m9h.js} +2 -2
- package/dist/cli-e3g5mbkz.js +776 -0
- package/dist/cli-f527ce74.js +781 -0
- package/dist/{cli-gmdajfw5.js → cli-gxzkg1de.js} +5020 -1729
- package/dist/{cli-451ks6aw.js → cli-h1arqn31.js} +1 -1
- package/dist/cli-hjwmhcg1.js +10622 -0
- package/dist/{cli-jpc4r224.js → cli-hqr88ew6.js} +19 -3
- package/dist/{cli-h7k0xtry.js → cli-hvqbtna4.js} +4 -1256
- package/dist/{cli-cd0hv9nh.js → cli-j67mh2vg.js} +2 -2
- package/dist/cli-jta2eyzc.js +619 -0
- package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
- package/dist/cli-kceah1eh.js +92 -0
- package/dist/{cli-d603qf86.js → cli-ksphgh48.js} +10 -8
- package/dist/{cli-3nxdmjrc.js → cli-mgz4nbgg.js} +4 -4
- package/dist/{cli-saqyage0.js → cli-mz5as5ha.js} +179 -27
- package/dist/cli-n2wq4j7m.js +6985 -0
- package/dist/{cli-ppy4nnnh.js → cli-n8ndw8j7.js} +2 -2
- package/dist/{cli-1w0vj3gw.js → cli-naqzr17j.js} +7 -7
- package/dist/{cli-0a7mm3zp.js → cli-nm1p8jfr.js} +25 -21
- package/dist/{cli-wrh08zjd.js → cli-p3zbc1rw.js} +5 -18
- package/dist/{cli-hsem16hb.js → cli-pe05f8yk.js} +29 -6
- package/dist/{cli-5wpw4rab.js → cli-qmzsbkvy.js} +5 -5
- package/dist/{cli-bv2etw2y.js → cli-qnm4e9e4.js} +99 -590
- package/dist/{cli-1x7da0de.js → cli-qqy4q48b.js} +8 -8
- package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
- package/dist/{cli-5er5gjbm.js → cli-r35rw5de.js} +15 -15
- package/dist/{cli-v3zhnxsb.js → cli-r610p9bs.js} +2 -2
- package/dist/{cli-7jykv7ef.js → cli-rc6pf5kv.js} +1 -1
- package/dist/{cli-x119kdba.js → cli-rdxm77k3.js} +1 -1
- package/dist/cli-rhs9pz33.js +294 -0
- package/dist/{cli-0p3enk35.js → cli-s69nfyeh.js} +9 -1
- package/dist/{cli-0kxf81jj.js → cli-sawv63e8.js} +2 -2
- package/dist/{cli-e3pmyt39.js → cli-sg19gbf0.js} +1 -1
- package/dist/{cli-d161g69q.js → cli-shk7r5cs.js} +57 -6
- package/dist/{cli-7pz3b7x5.js → cli-sksetb2q.js} +36 -1
- package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
- package/dist/{cli-db3m6zdt.js → cli-t02z59f2.js} +1 -1
- package/dist/{cli-b07hr3bt.js → cli-txqb9s38.js} +2 -2
- package/dist/{cli-s8z6x4b4.js → cli-v7g551te.js} +225 -113
- package/dist/{cli-rfz2ve55.js → cli-vgqzp4em.js} +3341 -955
- package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
- package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
- package/dist/cli-wfnemr1t.js +86 -0
- package/dist/cli-wmgrkscj.js +23254 -0
- package/dist/{cli-qm1448f9.js → cli-wms6x9db.js} +8 -8
- package/dist/{cli-tadfgd0t.js → cli-x1r545x8.js} +33 -4
- package/dist/{cli-xc7p7s3g.js → cli-xczsgshn.js} +6 -6
- package/dist/{cli-fmhj1ehj.js → cli-y3167wt1.js} +882 -271
- package/dist/{cli-r0byd61h.js → cli-yjmqpxt3.js} +17 -16
- package/dist/{cli-81r1wjyv.js → cli-z780ec7c.js} +1 -1
- package/dist/{cli-phcqp1b9.js → cli-zm9t2vde.js} +2 -2
- package/dist/cli.js +34 -49
- package/dist/{codex-adapter-r3dn4fp5.js → codex-adapter-4z16v9n0.js} +15 -14
- package/dist/{codex-login-841kv5fk.js → codex-login-pkepy2j1.js} +3 -2
- package/dist/{codex-session-runner-fwt793h4.js → codex-session-runner-rvms9y2x.js} +15 -14
- package/dist/{commands-z8fq9qna.js → commands-2a9rtyat.js} +11 -10
- package/dist/{controller-hq5ggpcp.js → controller-3k3madbn.js} +5 -4
- package/dist/{controllers-connect-3mf2btyj.js → controllers-connect-v9yn8zb9.js} +42 -37
- package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-98gbhyzn.js} +7 -6
- package/dist/{db-qfpq4bt7.js → db-eywwsnjw.js} +30 -9
- package/dist/{db-yyhqqrbf.js → db-ncypk9np.js} +12 -11
- package/dist/{devin-adapter-xgtj680j.js → devin-adapter-zeq8b9gz.js} +3 -2
- package/dist/{dispatcher-x0x7qfcq.js → dispatcher-w94kc575.js} +38 -33
- package/dist/{docker-f503k9p0.js → docker-b1e4cqab.js} +3 -2
- package/dist/{dsh-adapter-34etvb5m.js → dsh-adapter-47ztej36.js} +7 -6
- package/dist/{e2b-66xra4az.js → e2b-bbt8ey45.js} +4 -3
- package/dist/{e2b-xwhyj8cw.js → e2b-dp804sen.js} +4 -3
- package/dist/{event-bus-vjtv82gm.js → event-bus-j2jdg3qb.js} +3 -2
- package/dist/{external-channel-h1fjecwe.js → external-channel-zrkg8ar9.js} +11 -10
- package/dist/{google-generative-ai-szdxbpqg.js → google-generative-ai-g8db7x0f.js} +4 -2
- package/dist/{google-vertex-qzw3p36d.js → google-vertex-r2692q0r.js} +4 -2
- package/dist/{grok-adapter-e7mr287e.js → grok-adapter-s9ncp9vy.js} +18 -17
- package/dist/{handlers-znb9n7d4.js → handlers-kqftvjgw.js} +41 -36
- package/dist/{heartbeat-bm4qkn8d.js → heartbeat-9q96p8v9.js} +43 -38
- package/dist/{hook-254r4mza.js → hook-56qe10dp.js} +11 -23
- package/dist/{hook-xaa3q80s.js → hook-yy6rw42k.js} +12 -11
- package/dist/{http-3dgrgp8y.js → http-r2dnb8f8.js} +2411 -275
- package/dist/{index-fx3jqq1e.js → index-3gtmkhc6.js} +38 -33
- package/dist/{index-bdsqa799.js → index-3k5hkz7r.js} +43 -38
- package/dist/index-52j1aja4.js +3465 -0
- package/dist/{index-g2byveez.js → index-5e101240.js} +38 -33
- package/dist/{index-2ybk7khy.js → index-5wyfjc2c.js} +845 -683
- package/dist/index-9gw58n4k.js +193 -0
- package/dist/index-9j87mcm8.js +56305 -0
- package/dist/index-bsmcresk.js +79424 -0
- package/dist/index-mh85qhec.js +475 -0
- package/dist/{index-jd7sejm2.js → index-vxvhxxbn.js} +10 -9
- package/dist/index-we27kd31.js +12810 -0
- package/dist/{keepalive-6ywhpja1.js → keepalive-psj6j54c.js} +12 -11
- package/dist/{lead-cw45n21s.js → lead-hajz4688.js} +61 -56
- package/dist/{maintenance-ss1a1ge9.js → maintenance-ps02sb5m.js} +10 -9
- package/dist/{node-fkajaq96.js → node-mwb5r697.js} +2 -1
- package/dist/{oauth-refresh-sweep-3c6f8vyy.js → oauth-refresh-sweep-0284h93b.js} +11 -10
- package/dist/{onboard-8hzdhc1k.js → onboard-rbf6bg01.js} +11 -3
- package/dist/{opencode-adapter-qbchbcfz.js → opencode-adapter-13dcatgq.js} +18 -13
- package/dist/{otel-impl-e6mnvc4v.js → otel-impl-zvqcbhp7.js} +242 -868
- package/dist/{pi-mono-adapter-3c9g9snh.js → pi-mono-adapter-xxy47q4v.js} +244 -106
- package/dist/{pricing-refresh-gedkjdw0.js → pricing-refresh-kefx9v3t.js} +12 -11
- package/dist/{rbac-roles-dt4vh1yy.js → rbac-roles-3m36rxm2.js} +11 -10
- package/dist/{rbac-roles-eszdg6pm.js → rbac-roles-z76xv0hq.js} +12 -11
- package/dist/{render-v2-907cy6sa.js → render-v2-wz73bs25.js} +18 -14
- package/dist/{resume-42stcaz0.js → resume-k4wzge8w.js} +25 -21
- package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
- package/dist/{setup-adbc1c10.js → setup-2fp2pypp.js} +2 -2
- package/dist/{virtual-modules-rtmt494q.js → virtual-modules-9gkxqrap.js} +6 -5
- package/dist/{work-objects-wpj8ck95.js → work-objects-6k0ywz3m.js} +41 -36
- package/dist/{worker-bzdra9rf.js → worker-5v3rxsdh.js} +61 -56
- package/dist/{x-qfmygqqv.js → x-4mtdeym1.js} +3 -2
- package/openapi.json +1279 -329
- package/package.json +15 -15
- package/src/agentmail/handlers.ts +21 -11
- package/src/apps/definition.ts +16 -0
- package/src/azure-devops/api.ts +52 -2
- package/src/azure-devops/boards-sync.ts +50 -20
- package/src/azure-devops/index.ts +1 -0
- package/src/azure-devops/outbound.ts +95 -0
- package/src/be/boot-seeds.ts +11 -0
- package/src/be/config-refs.ts +60 -0
- package/src/be/db/model-profiles.ts +315 -0
- package/src/be/db/page-versions.ts +15 -0
- package/src/be/db/runtime.ts +35 -8
- package/src/be/db/skill-name-resolution.ts +36 -0
- package/src/be/db/tasks/read.ts +237 -0
- package/src/be/db/tasks/write.ts +7 -0
- package/src/be/db.ts +87 -36
- package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
- package/src/be/migrations/216_task_resolved_effort.sql +5 -0
- package/src/be/migrations/217_chat_sdk_state.sql +104 -0
- package/src/be/migrations/219_relabel_pi_context_compactions.sql +22 -0
- package/src/be/migrations/220_model_profiles.sql +137 -0
- package/src/be/model-catalog-store.ts +5 -1
- package/src/be/model-tier-resolution.ts +155 -10
- package/src/be/model-validation.ts +12 -2
- package/src/be/models-catalog.ts +26 -1
- package/src/be/modelsdev-cache.json +198 -63
- package/src/be/modelsdev-cache.ts +9 -1
- package/src/be/script-credential-broker.ts +39 -2
- package/src/be/scripts/run-saved.ts +1 -0
- package/src/be/scripts/typecheck.ts +22 -8
- package/src/be/secret-registry.ts +6 -2
- package/src/be/seed/runner.ts +13 -1
- package/src/be/seed/state-db.ts +5 -0
- package/src/be/seed/types.ts +6 -0
- package/src/be/seed-model-profiles.ts +41 -0
- package/src/be/seed-pricing.ts +19 -2
- package/src/be/seed-scripts/catalog/heartbeat-jev-gate.ts +368 -0
- package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
- package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
- package/src/be/seed-scripts/index.ts +9 -0
- package/src/be/seed-skills/bundled-files.generated.json +0 -18
- package/src/be/seed-skills/index.ts +104 -3
- package/src/be/swarm-config-guard.ts +53 -0
- package/src/cli.tsx +0 -16
- package/src/commands/onboard/non-interactive.ts +4 -2
- package/src/commands/provider-credentials.ts +52 -6
- package/src/commands/runner.ts +193 -71
- package/src/e2b/env.ts +5 -0
- package/src/extensions/catalog.generated.json +17 -0
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +45 -0
- package/src/extensions/dispatcher.ts +7 -0
- package/src/extensions/loader.ts +10 -5
- package/src/extensions/post-bridge.ts +40 -0
- package/src/github/handlers.ts +11 -4
- package/src/heartbeat/heartbeat.ts +2 -1
- package/src/heartbeat/templates.ts +8 -5
- package/src/hooks/hook.ts +0 -26
- package/src/http/agents.ts +49 -2
- package/src/http/all-routes.ts +1 -1
- package/src/http/apps.ts +30 -3
- package/src/http/config.ts +62 -19
- package/src/http/core.ts +8 -0
- package/src/http/index.ts +25 -3
- package/src/http/integrations.ts +88 -1
- package/src/http/mcp.ts +15 -5
- package/src/http/model-profiles.ts +303 -0
- package/src/http/page-proxy.ts +2 -4
- package/src/http/pages-public.ts +13 -7
- package/src/http/pages.ts +3 -13
- package/src/http/poll.ts +42 -71
- package/src/http/requested-by.ts +54 -0
- package/src/http/script-runs.ts +1 -1
- package/src/http/scripts.ts +26 -2
- package/src/http/stats.ts +1 -30
- package/src/http/tasks.ts +79 -5
- package/src/http/utils.ts +14 -0
- package/src/http/webhooks.ts +160 -3
- package/src/http/x.ts +1 -0
- package/src/integrations/chat-sdk/adapters.ts +129 -0
- package/src/integrations/chat-sdk/attachments.ts +232 -0
- package/src/integrations/chat-sdk/background.ts +36 -0
- package/src/integrations/chat-sdk/commands.ts +194 -0
- package/src/integrations/chat-sdk/config.ts +198 -0
- package/src/integrations/chat-sdk/discord-api.ts +63 -0
- package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
- package/src/integrations/chat-sdk/handlers.ts +28 -0
- package/src/integrations/chat-sdk/inbound.ts +426 -0
- package/src/integrations/chat-sdk/limits.ts +48 -0
- package/src/integrations/chat-sdk/logger.ts +81 -0
- package/src/integrations/chat-sdk/outbound.ts +123 -0
- package/src/integrations/chat-sdk/relay.ts +172 -0
- package/src/integrations/chat-sdk/router.ts +169 -0
- package/src/integrations/chat-sdk/runtime.ts +351 -0
- package/src/integrations/chat-sdk/schema.ts +245 -0
- package/src/integrations/chat-sdk/state.ts +243 -0
- package/src/integrations/chat-sdk/status.ts +244 -0
- package/src/integrations/chat-sdk/steering.ts +58 -0
- package/src/integrations/chat-sdk/teams-origin.ts +77 -0
- package/src/integrations/chat-sdk/telegram-api.ts +56 -0
- package/src/integrations/chat-sdk/templates.ts +16 -0
- package/src/integrations/chat-sdk/test-hooks.ts +37 -0
- package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
- package/src/integrations/chat-sdk/typing.ts +65 -0
- package/src/{artifact-sdk → pages}/feedback-overlay.ts +65 -6
- package/src/pages/version.ts +4 -5
- package/src/prompts/base-prompt.ts +111 -45
- package/src/providers/acp-target-catalog.ts +6 -0
- package/src/providers/acp-targets.ts +56 -3
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +1 -1
- package/src/providers/claude-flag-settings.ts +17 -5
- package/src/providers/claude-managed-adapter.ts +1 -1
- package/src/providers/claude-session-events.ts +6 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/opencode-adapter.ts +243 -26
- package/src/providers/opencode-swarm-plugin.ts +31 -0
- package/src/providers/pi-mono-adapter.ts +398 -153
- package/src/providers/pi-mono-extension.ts +17 -3
- package/src/providers/pricing-sources.md +33 -2
- package/src/providers/reasoning-effort.ts +37 -0
- package/src/providers/types.ts +6 -2
- package/src/rbac/legacy-policy.ts +16 -2
- package/src/rbac/permissions.ts +26 -0
- package/src/scheduler/deferred-task-waits.ts +18 -5
- package/src/scheduler/scheduler.ts +11 -3
- package/src/scripts-runtime/executors/quickjs-prelude.ts +75 -6
- package/src/scripts-runtime/executors/quickjs-runner.ts +85 -8
- package/src/scripts-runtime/executors/quickjs-web-shims.ts +1041 -0
- package/src/scripts-runtime/extract-args-schema.ts +9 -8
- package/src/scripts-runtime/loader.ts +19 -7
- package/src/scripts-runtime/quickjs-compat.ts +464 -0
- package/src/scripts-runtime/sdk-allowlist.ts +12 -6
- package/src/scripts-runtime/swarm-sdk.ts +0 -11
- package/src/scripts-runtime/types/stdlib.d.ts +39 -15
- package/src/scripts-runtime/types/swarm-extension.d.ts +66 -1
- package/src/scripts-runtime/types/swarm-sdk.d.ts +39 -15
- package/src/server.ts +62 -19
- package/src/slack/blocks.ts +4 -2
- package/src/slack/event-dedup.ts +1 -1
- package/src/slack/reaction-shortcode.ts +14 -0
- package/src/slack/render-v2.ts +12 -7
- package/src/slack/responses.ts +5 -4
- package/src/slack/thread-buffer.ts +41 -22
- package/src/tasks/additive-buffer.ts +4 -2
- package/src/tasks/context-key.ts +60 -1
- package/src/tasks/model-pin.ts +67 -0
- package/src/tasks/worker-follow-up.ts +15 -33
- package/src/tests/acp-adapter.test.ts +42 -0
- package/src/tests/agentmail-filters.test.ts +47 -0
- package/src/tests/api-drain-worker-e2e.test.ts +1 -6
- package/src/tests/apps-spike2.test.ts +35 -0
- package/src/tests/azure-devops-outbound.test.ts +420 -0
- package/src/tests/base-prompt.test.ts +58 -54
- package/src/tests/chat-sdk-commands.test.ts +191 -0
- package/src/tests/chat-sdk-config.test.ts +334 -0
- package/src/tests/chat-sdk-discord-api.test.ts +68 -0
- package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
- package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
- package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
- package/src/tests/chat-sdk-harness.ts +146 -0
- package/src/tests/chat-sdk-inbound.test.ts +363 -0
- package/src/tests/chat-sdk-relay.test.ts +470 -0
- package/src/tests/chat-sdk-reload.test.ts +128 -0
- package/src/tests/chat-sdk-shutdown.test.ts +220 -0
- package/src/tests/chat-sdk-slack.test.ts +268 -0
- package/src/tests/chat-sdk-state.test.ts +163 -0
- package/src/tests/chat-sdk-status-route.test.ts +382 -0
- package/src/tests/chat-sdk-teams.test.ts +277 -0
- package/src/tests/chat-sdk-tools.test.ts +520 -0
- package/src/tests/chat-sdk-typing.test.ts +120 -0
- package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
- package/src/tests/claude-adapter-binary.test.ts +9 -4
- package/src/tests/claude-flag-settings.test.ts +11 -3
- package/src/tests/claude-managed-adapter.test.ts +1 -1
- package/src/tests/claude-sdk-lifecycle.test.ts +9 -3
- package/src/tests/claude-thinking-tokens.test.ts +57 -0
- package/src/tests/claude-worker-parity.test.ts +2 -7
- package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
- package/src/tests/config-refs.test.ts +66 -0
- package/src/tests/context-key.test.ts +19 -0
- package/src/tests/cors-allowlist.test.ts +25 -0
- package/src/tests/create-page-tool.test.ts +18 -0
- package/src/tests/credential-check.test.ts +139 -0
- package/src/tests/credentials.test.ts +21 -0
- package/src/tests/db-runtime.test.ts +61 -0
- package/src/tests/db-task-read-contract.test.ts +22 -0
- package/src/tests/db-task-write-contract.test.ts +11 -0
- package/src/tests/deferred-task-wake.test.ts +78 -1
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/enabled-capabilities.test.ts +20 -0
- package/src/tests/entrypoint-api-readiness.test.ts +14 -8
- package/src/tests/entrypoint-config-env-export.test.ts +5 -2
- package/src/tests/entrypoint-export-to-env.test.ts +78 -0
- package/src/tests/env-flag.test.ts +1 -0
- package/src/tests/explicit-model-validation.test.ts +105 -1
- package/src/tests/extensions-catalog.test.ts +1 -0
- package/src/tests/extensions-example-comms-adherence-gate.test.ts +413 -0
- package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
- package/src/tests/extensions-loader.test.ts +15 -0
- package/src/tests/extensions-post-bridge.test.ts +51 -0
- package/src/tests/fetch-resolved-env.test.ts +128 -0
- package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
- package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
- package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
- package/src/tests/github-handlers.test.ts +35 -0
- package/src/tests/harness-provider-resolution.test.ts +12 -0
- package/src/tests/heartbeat-checklist.test.ts +3 -2
- package/src/tests/heartbeat-jev-gate-credentials.test.ts +168 -0
- package/src/tests/heartbeat-jev-gate.test.ts +385 -0
- package/src/tests/hook-runtime-close.test.ts +0 -2
- package/src/tests/http-api-integration.test.ts +0 -25
- package/src/tests/migration-046-budgets.test.ts +17 -16
- package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
- package/src/tests/model-profile-backcompat.test.ts +327 -0
- package/src/tests/model-profile-providers.test.ts +302 -0
- package/src/tests/model-profile-runtime-secrets.test.ts +223 -0
- package/src/tests/model-profiles-api.test.ts +614 -0
- package/src/tests/model-tier-resolution.test.ts +93 -0
- package/src/tests/models-catalog.test.ts +42 -1
- package/src/tests/openai-compatible-providers.test.ts +134 -0
- package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
- package/src/tests/opencode-adapter.test.ts +216 -2
- package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
- package/src/tests/opencode-shell-env.test.ts +145 -0
- package/src/tests/openrouter-base-url.test.ts +101 -151
- package/src/tests/page-proxy.test.ts +1 -1
- package/src/tests/pages-browser-sdk.test.ts +76 -0
- package/src/tests/pages-feedback-keys.test.ts +121 -0
- package/src/tests/pages-feedback.test.ts +4 -1
- package/src/tests/paused-tasks-requested-by.test.ts +102 -0
- package/src/tests/pi-context-compaction.test.ts +193 -0
- package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
- package/src/tests/pi-mono-adapter.test.ts +385 -5
- package/src/tests/pi-shell-env.test.ts +170 -0
- package/src/tests/profile-claim.test.ts +269 -0
- package/src/tests/prompt-template-remaining.test.ts +35 -0
- package/src/tests/quickjs-compat.test.ts +213 -0
- package/src/tests/rbac-engine.test.ts +32 -3
- package/src/tests/runner-exit-after-tasks.test.ts +0 -4
- package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
- package/src/tests/script-connections.test.ts +6 -0
- package/src/tests/script-executor-conformance.test.ts +252 -1
- package/src/tests/script-executor-quickjs.test.ts +96 -0
- package/src/tests/script-runs-http.test.ts +89 -0
- package/src/tests/scripts-http.test.ts +217 -1
- package/src/tests/scripts-only-gating.test.ts +2 -3
- package/src/tests/scripts-runtime.test.ts +58 -40
- package/src/tests/secret-scrubber.test.ts +96 -0
- package/src/tests/seed-model-profiles.test.ts +174 -0
- package/src/tests/seed-scripts.test.ts +2 -2
- package/src/tests/seed-skills-bundled-files.test.ts +45 -53
- package/src/tests/seed-skills-retire.test.ts +182 -0
- package/src/tests/send-task-requester-gate.test.ts +58 -0
- package/src/tests/session-cost-recompute-unit.test.ts +46 -0
- package/src/tests/skill-get-name-resolution.test.ts +137 -0
- package/src/tests/skill-invocations.test.ts +4 -2
- package/src/tests/slack-blocks.test.ts +36 -0
- package/src/tests/slack-inline-output.test.ts +14 -0
- package/src/tests/slack-reaction-config.test.ts +20 -0
- package/src/tests/slack-render-v2.test.ts +37 -0
- package/src/tests/slack-thread-buffer.test.ts +98 -1
- package/src/tests/sonnet-5-5-registry.test.ts +9 -1
- package/src/tests/swarm-config-export-to-env.test.ts +267 -0
- package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
- package/src/tests/swarm-diff.test.ts +1 -1
- package/src/tests/task-model-effort-rerun.test.ts +164 -0
- package/src/tests/task-session-prompts.test.ts +132 -0
- package/src/tests/task-tool-manifest.test.ts +14 -0
- package/src/tests/task-tools-ctx.test.ts +2 -0
- package/src/tests/tool-annotations.test.ts +6 -6
- package/src/tests/ui-logs-parser.test.ts +43 -0
- package/src/tests/used-by-route.test.ts +6 -0
- package/src/tests/vercel-ai-gateway.test.ts +149 -0
- package/src/tests/workflow-llm.test.ts +61 -0
- package/src/tests/workflow-swarm-script.test.ts +38 -0
- package/src/tests/workflow-wait-filter.test.ts +5 -3
- package/src/tools/chat-access.ts +41 -0
- package/src/tools/chat-open-dm.ts +59 -0
- package/src/tools/chat-post.ts +74 -0
- package/src/tools/chat-read-thread.ts +100 -0
- package/src/tools/chat-reply.ts +75 -0
- package/src/tools/create-page.ts +3 -13
- package/src/tools/model-catalog/index.ts +2 -1
- package/src/tools/model-profiles/list-model-profiles.ts +54 -0
- package/src/tools/register-chat-channel.ts +139 -0
- package/src/tools/request-human-input.ts +11 -3
- package/src/tools/script-apis.ts +5 -1
- package/src/tools/script-upsert.ts +4 -1
- package/src/tools/send-task.ts +48 -1
- package/src/tools/skills/skill-get.ts +17 -9
- package/src/tools/swarm-config/get-config.ts +2 -1
- package/src/tools/swarm-config/list-config.ts +2 -1
- package/src/tools/swarm-config/set-config.ts +16 -3
- package/src/tools/system-one-decide.ts +104 -0
- package/src/tools/task-action.ts +22 -1
- package/src/tools/tool-config.ts +14 -6
- package/src/types.ts +48 -3
- package/src/utils/config-env-export.ts +74 -0
- package/src/utils/credentials.test.ts +92 -0
- package/src/utils/credentials.ts +52 -4
- package/src/utils/harness-provider.ts +15 -6
- package/src/utils/runtime-model-catalog.ts +11 -1
- package/src/utils/secret-scrubber.ts +86 -10
- package/src/utils/task-tool-manifest.ts +19 -2
- package/src/utils/vcs-repo-match.ts +29 -0
- package/src/workflows/executors/raw-llm.ts +8 -3
- package/src/workflows/executors/swarm-script.ts +1 -0
- package/src/workflows/executors/system-one-decision.ts +21 -11
- package/src/workflows/executors/workflow-llm.ts +22 -0
- package/src/workflows/index.ts +21 -12
- package/templates/extensions/README.md +1 -0
- package/templates/extensions/comms-adherence-gate/README.md +88 -0
- package/templates/extensions/comms-adherence-gate/hooks.ts +489 -0
- package/templates/extensions/comms-adherence-gate/manifest.json +8 -0
- package/templates/skills/agent-browser/SKILL.md +1 -1
- package/templates/skills/agent-browser/content.md +1 -1
- package/templates/skills/apps/SKILL.md +8 -1
- package/templates/skills/apps/content.md +8 -1
- package/templates/skills/chat-sdk/config.json +14 -0
- package/templates/skills/chat-sdk/content.md +84 -0
- package/templates/skills/composio-gmail/content.md +7 -0
- package/templates/skills/composio-google-docs/content.md +1 -1
- package/templates/skills/email-domain-health/config.json +14 -0
- package/templates/skills/email-domain-health/content.md +131 -0
- package/templates/skills/kv-storage/content.md +2 -2
- package/templates/skills/pages/content.md +8 -10
- package/templates/skills/swarm-extensions/content.md +2 -0
- package/templates/skills/swarm-scripts/SKILL.md +4 -2
- package/templates/skills/swarm-scripts/config.json +1 -1
- package/templates/skills/swarm-scripts/content.md +4 -2
- package/templates/skills/workflow-iterate/content.md +38 -0
- package/dist/artifact-eczsknc3.js +0 -3843
- package/dist/cli-42qhyvwx.js +0 -33
- package/dist/cli-bd957dgb.js +0 -153
- package/dist/cli-q51yprfq.js +0 -1104
- package/dist/cli-t1ze64h3.js +0 -811
- package/dist/cli-tcc4wd5d.js +0 -56471
- package/dist/index-9ch1n761.js +0 -1102
- package/src/artifact-sdk/index.ts +0 -2
- package/src/artifact-sdk/localtunnel.d.ts +0 -20
- package/src/artifact-sdk/port.ts +0 -12
- package/src/artifact-sdk/server.ts +0 -183
- package/src/artifact-sdk/tunnel.ts +0 -19
- package/src/commands/artifact.ts +0 -249
- package/src/http/ecosystem.ts +0 -77
- package/src/tests/artifact-commands.test.ts +0 -92
- package/src/tests/artifact-sdk.test.ts +0 -793
- package/src/tests/register-service-security.test.ts +0 -194
- package/src/tools/list-services.ts +0 -107
- package/src/tools/register-service.ts +0 -177
- package/src/tools/unregister-service.ts +0 -73
- package/src/tools/update-service-status.ts +0 -96
- package/templates/skills/artifacts/config.json +0 -14
- package/templates/skills/artifacts/content.md +0 -344
- package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
- package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
- package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
- package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
- /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
# Artifacts
|
|
2
|
-
|
|
3
|
-
An artifact is any output that should outlive the session — a report,
|
|
4
|
-
screenshot, recording, log, data export, dashboard. There are two things you
|
|
5
|
-
can do with one, and this skill covers both:
|
|
6
|
-
|
|
7
|
-
- **Store it** — write it to agent-fs or the shared workspace so humans and
|
|
8
|
-
other agents can find it later. This is the common case.
|
|
9
|
-
- **Serve it** — run a real web server behind a public, auth-protected URL so a
|
|
10
|
-
human can *interact* with it (custom routes, form posts, live data).
|
|
11
|
-
|
|
12
|
-
| You need… | Use |
|
|
13
|
-
|---|---|
|
|
14
|
-
| A file, report, screenshot, or export someone will read later | **Store** (agent-fs) |
|
|
15
|
-
| A file another agent needs during *this* session | **Store** (`/workspace/shared/`) |
|
|
16
|
-
| A static HTML/JSON report shared by URL | The **`pages`** skill — cheaper, no process to babysit |
|
|
17
|
-
| Custom routes, websockets, file uploads, per-request computation | **Serve** (below) |
|
|
18
|
-
|
|
19
|
-
Rule of thumb: if the content is a *snapshot*, store it or make a page. If it's
|
|
20
|
-
a *running program*, serve it.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
# Part 1 — Storing artifacts
|
|
25
|
-
|
|
26
|
-
Two stores: **agent-fs** (structured, searchable, shareable, survives restarts)
|
|
27
|
-
and the **shared workspace filesystem** (`/workspace/shared/`, fast, same-session).
|
|
28
|
-
|
|
29
|
-
## When to create one
|
|
30
|
-
|
|
31
|
-
- Your task produces a deliverable humans should review.
|
|
32
|
-
- Another agent or future session needs to pick up where you left off.
|
|
33
|
-
- You want to attach evidence to a PR, Linear ticket, or Slack message.
|
|
34
|
-
- The output is too large for `store-progress.output`.
|
|
35
|
-
|
|
36
|
-
## agent-fs (preferred for anything human-shareable)
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
# Write to your personal drive
|
|
40
|
-
agent-fs write thoughts/research/2026-05-28-topic.md --content "..." -m "description"
|
|
41
|
-
|
|
42
|
-
# Write to the shared drive (humans + other agents can see it)
|
|
43
|
-
agent-fs --org <org-id> write \
|
|
44
|
-
thoughts/<agent-id>/research/2026-05-28-topic.md \
|
|
45
|
-
--content "..." -m "research findings"
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Your org and drive context is already configured — you only need `--org` when
|
|
49
|
-
writing somewhere other than your default. Read the id from
|
|
50
|
-
`agent-fs stat <path> --json` rather than hardcoding one you saw in an example.
|
|
51
|
-
|
|
52
|
-
Always verify the write landed — agent-fs writes can fail silently with an
|
|
53
|
-
empty payload:
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
agent-fs stat <path> --json | jq '.size'
|
|
57
|
-
# If size < 200 bytes on a non-trivial artifact, the write FAILED — re-do it.
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Sharing agent-fs files with humans
|
|
61
|
-
|
|
62
|
-
The deployment configures the live viewer host through `AGENT_FS_LIVE_URL`; the
|
|
63
|
-
documented fallback is `https://live.agent-fs.dev`. Resolve it in the shell and
|
|
64
|
-
combine it with the `orgId` and `driveId` returned by `agent-fs stat`:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
FILE_PATH='thoughts/<agent-id>/research/<file>.md'
|
|
68
|
-
AGENT_FS_HOST=${AGENT_FS_LIVE_URL:-https://live.agent-fs.dev}
|
|
69
|
-
FILE_STAT=$(agent-fs stat "$FILE_PATH" --json)
|
|
70
|
-
ORG_ID=$(printf '%s' "$FILE_STAT" | jq -r '.orgId')
|
|
71
|
-
DRIVE_ID=$(printf '%s' "$FILE_STAT" | jq -r '.driveId')
|
|
72
|
-
SHARE_URL="${AGENT_FS_HOST%/}/file/~/$ORG_ID/$DRIVE_ID/$FILE_PATH"
|
|
73
|
-
printf '%s\n' "$SHARE_URL"
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Paste the printed concrete URL into Markdown or a message. Markdown does not
|
|
77
|
-
expand environment variables.
|
|
78
|
-
|
|
79
|
-
## Shared filesystem
|
|
80
|
-
|
|
81
|
-
For non-text artifacts or files other agents need during the same session:
|
|
82
|
-
|
|
83
|
-
- `/workspace/shared/downloads/<agent-id>/` — downloaded files
|
|
84
|
-
- `/workspace/shared/misc/<agent-id>/` — other shared files
|
|
85
|
-
|
|
86
|
-
It does **not** survive container restarts. Anything that must outlive the
|
|
87
|
-
session goes to agent-fs.
|
|
88
|
-
|
|
89
|
-
## Binary artifacts (PNG, MP4)
|
|
90
|
-
|
|
91
|
-
`agent-fs write --content` is text-only and mangles binaries. Upload binaries
|
|
92
|
-
with `--file` (or piped stdin), which uses the binary-safe raw route
|
|
93
|
-
(agent-fs CLI >= 0.7.1):
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
agent-fs write thoughts/<agent-id>/qa/<topic>-screenshots/login.png \
|
|
97
|
-
--file /tmp/login.png -m "login page after fix"
|
|
98
|
-
agent-fs stat thoughts/<agent-id>/qa/<topic>-screenshots/login.png --json | jq '.size'
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Capture with `agent-browser screenshot <path>` when it is installed, otherwise
|
|
102
|
-
Playwright, ffmpeg, or a system screenshot tool. The agent-fs copy is the
|
|
103
|
-
durable original. Where each kind of content goes:
|
|
104
|
-
|
|
105
|
-
| Content | Use | Why |
|
|
106
|
-
|---|---|---|
|
|
107
|
-
| Image or GIF in GitHub | GitHub user attachment (`github-attach` skill) | Permanent, renders inline, short URL |
|
|
108
|
-
| Video (mp4) in GitHub | GitHub user attachment, else an `agent-fs share-create` link | GitHub plays it inline. A presigned link downloads it |
|
|
109
|
-
| Doc (plan, research, report) | `agent-fs share-create <path> --expires-in 604800` | Preview page, no download |
|
|
110
|
-
| Durable pointer | `live.agent-fs.dev` path, in a PR only under `## Swarm provenance` | Share links die after 7 days, this one does not (needs login) |
|
|
111
|
-
| Presigned `signed-url` | Image fallback only, with `--inline` | Downloads and expires after 7 days. Never for docs or mp4s |
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
agent-fs signed-url thoughts/<agent-id>/qa/<topic>-screenshots/login.png --inline --json # fallback only; 24h default, --expires-in up to 7d
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Naming conventions
|
|
118
|
-
|
|
119
|
-
Name paths predictably by task, date, and artifact type:
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
thoughts/<agent-id>/research/YYYY-MM-DD-<topic>.md
|
|
123
|
-
thoughts/<agent-id>/plans/YYYY-MM-DD-<topic>.md
|
|
124
|
-
thoughts/<agent-id>/qa/<topic>-screenshots/<filename>.png
|
|
125
|
-
misc/<agent-id>/<task-id>-<description>.ext
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Attaching artifacts
|
|
129
|
-
|
|
130
|
-
- **PR body** — embed images and mp4s as GitHub user attachments
|
|
131
|
-
(``), and link docs
|
|
132
|
-
with `share-create`. Never embed a `share-create` link as an image: it is an
|
|
133
|
-
HTML preview page. Swarm task links and durable agent-fs paths go only under
|
|
134
|
-
`## Swarm provenance`.
|
|
135
|
-
- **Slack** — link the agent-fs URL (team members only, the live viewer needs a login). Use a `share-create` link (up to 7 days) for anyone else.
|
|
136
|
-
- **`store-progress`** — use the `attachments` field with `kind: "agent-fs"` and the path.
|
|
137
|
-
- **Linear comments** — paste the live URL in the comment body.
|
|
138
|
-
|
|
139
|
-
## What NOT to store
|
|
140
|
-
|
|
141
|
-
- Secrets, API keys, OAuth tokens
|
|
142
|
-
- Raw customer data without approval
|
|
143
|
-
- Oversized files without approval (check size before uploading)
|
|
144
|
-
- Ephemeral progress notes — those go in `store-progress.progress`
|
|
145
|
-
|
|
146
|
-
## Trade-offs
|
|
147
|
-
|
|
148
|
-
**agent-fs vs shared filesystem** — agent-fs is persistent, versioned, and
|
|
149
|
-
searchable across sessions. The shared filesystem is faster for same-session
|
|
150
|
-
handoffs but doesn't survive container restarts. Use agent-fs for anything that
|
|
151
|
-
needs to outlive the current session or be reviewed by a human.
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
# Part 2 — Serving interactive web content
|
|
156
|
-
|
|
157
|
-
Serve a directory or a Hono app to a public, auth-protected URL via
|
|
158
|
-
localtunnel. Use this when a static page won't do: custom routes, form posts,
|
|
159
|
-
uploads, per-request computation.
|
|
160
|
-
|
|
161
|
-
The CLI is a subcommand of `agent-swarm`. Always invoke it as
|
|
162
|
-
**`agent-swarm artifact <subcommand>`** — there is no top-level `artifact`
|
|
163
|
-
binary.
|
|
164
|
-
|
|
165
|
-
## Quick start
|
|
166
|
-
|
|
167
|
-
### Static content
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
# Create your content in a persisted directory
|
|
171
|
-
mkdir -p /workspace/personal/artifacts/my-report
|
|
172
|
-
echo '<h1>My Report</h1>' > /workspace/personal/artifacts/my-report/index.html
|
|
173
|
-
|
|
174
|
-
# Serve it (auto-assigns a free port, creates tunnel, registers in service registry)
|
|
175
|
-
agent-swarm artifact serve /workspace/personal/artifacts/my-report --name my-report
|
|
176
|
-
# -> Copy the deployment URL printed by the command; it is authoritative.
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Programmatic (custom Hono server)
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
import { createArtifactServer } from '../artifact-sdk';
|
|
183
|
-
import { Hono } from 'hono';
|
|
184
|
-
|
|
185
|
-
const app = new Hono();
|
|
186
|
-
app.get('/', (c) => c.html('<h1>Dashboard</h1>'));
|
|
187
|
-
|
|
188
|
-
const server = createArtifactServer({ name: 'dashboard', app });
|
|
189
|
-
await server.start();
|
|
190
|
-
console.log(`Live at: ${server.url}`);
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
You can also run `agent-swarm artifact serve ./server.ts --name dashboard` if
|
|
194
|
-
`server.ts` exports a Hono instance as its default export.
|
|
195
|
-
|
|
196
|
-
See the bundled `examples/` directory for complete working examples
|
|
197
|
-
(`static-report.sh`, `hono-dashboard.ts`, `approval-flow.ts`,
|
|
198
|
-
`multi-artifact.ts`).
|
|
199
|
-
|
|
200
|
-
## CLI commands
|
|
201
|
-
|
|
202
|
-
| Command | Description |
|
|
203
|
-
|---|---|
|
|
204
|
-
| `agent-swarm artifact serve <path> --name <name> [--port <port>] [--no-auth] [--subdomain <sub>]` | Start serving content. `<path>` is a directory (static) or a `.ts`/`.js` file exporting a default Hono app. |
|
|
205
|
-
| `agent-swarm artifact list` | List active artifacts (name, agent, port, URL, status) from the service registry. |
|
|
206
|
-
| `agent-swarm artifact stop <name>` | Stop an artifact: deletes the matching PM2 process and unregisters it from the service registry. See "Known limitation" below. |
|
|
207
|
-
|
|
208
|
-
Flags accepted by `serve`:
|
|
209
|
-
|
|
210
|
-
- `--name <name>` — defaults to the basename of `<path>`. Used for the subdomain and PM2 process name.
|
|
211
|
-
- `--port <port>` — pin to a specific port. Default: auto-assigned ephemeral port.
|
|
212
|
-
- `--no-auth` — disable HTTP Basic auth on the tunnel (DANGEROUS — anyone with the URL can access).
|
|
213
|
-
- `--subdomain <sub>` — override the default `${agentId}-${name}` subdomain.
|
|
214
|
-
|
|
215
|
-
## Auth & URL pattern
|
|
216
|
-
|
|
217
|
-
Tunnels are protected by **HTTP Basic auth** by default:
|
|
218
|
-
|
|
219
|
-
- **Username:** `hi` (hardcoded MVP default in `src/artifact-sdk/tunnel.ts`)
|
|
220
|
-
- **Password:** the agent's `API_KEY`
|
|
221
|
-
|
|
222
|
-
> **Never put the API key in the URL.** The Basic-auth password *is* the swarm
|
|
223
|
-
> `API_KEY` — it authenticates against the whole swarm API, not just this
|
|
224
|
-
> artifact. A `https://user:key@host` URL leaks that credential into shell
|
|
225
|
-
> history, browser history, proxy and tunnel access logs, referrer headers, and
|
|
226
|
-
> anything you paste it into. Treat a credential-bearing URL as a leaked key.
|
|
227
|
-
|
|
228
|
-
The installed `@desplega.ai/localtunnel` package currently defaults to
|
|
229
|
-
`lt.desplega.ai`, but deployments may configure another tunnel host. The URL
|
|
230
|
-
printed by `agent-swarm artifact serve` (or exposed as `server.url`) is
|
|
231
|
-
authoritative. Save that plain URL as `ARTIFACT_URL`; a browser will prompt for
|
|
232
|
-
the credentials.
|
|
233
|
-
|
|
234
|
-
For scripts and `curl`, pass the credential out-of-band instead of inlining it,
|
|
235
|
-
and read it from the environment so it never appears as a literal:
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
# -u keeps the credential out of the URL; --netrc-file keeps it out of argv too.
|
|
239
|
-
curl -u "hi:$API_KEY" "$ARTIFACT_URL"
|
|
240
|
-
|
|
241
|
-
# Better for anything long-lived or logged — argv is visible to other processes:
|
|
242
|
-
ARTIFACT_HOST=${ARTIFACT_URL#*://}
|
|
243
|
-
ARTIFACT_HOST=${ARTIFACT_HOST%%/*}
|
|
244
|
-
printf 'machine %s login hi password %s\n' \
|
|
245
|
-
"$ARTIFACT_HOST" "$API_KEY" > /tmp/artifact-netrc
|
|
246
|
-
chmod 600 /tmp/artifact-netrc
|
|
247
|
-
curl --netrc-file /tmp/artifact-netrc "$ARTIFACT_URL"
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
Do not echo the assembled command, and do not paste the credential into a task
|
|
251
|
-
report, Slack message, PR body, or page — those are all persisted.
|
|
252
|
-
|
|
253
|
-
Use `--no-auth` only for genuinely public content. Anyone who learns the
|
|
254
|
-
subdomain can read it.
|
|
255
|
-
|
|
256
|
-
## Running it as a daemon
|
|
257
|
-
|
|
258
|
-
`agent-swarm artifact serve` blocks on a never-resolving promise to stay alive —
|
|
259
|
-
you cannot inline it in a script that needs to do other work. Pick one:
|
|
260
|
-
|
|
261
|
-
### Option A — `nohup` (quick, throwaway)
|
|
262
|
-
|
|
263
|
-
```bash
|
|
264
|
-
mkdir -p /workspace/personal/logs
|
|
265
|
-
nohup agent-swarm artifact serve /workspace/personal/artifacts/my-report \
|
|
266
|
-
--name my-report \
|
|
267
|
-
> /workspace/personal/logs/my-report.out 2>&1 &
|
|
268
|
-
echo $! > /workspace/personal/logs/my-report.pid
|
|
269
|
-
|
|
270
|
-
# Later, kill it manually:
|
|
271
|
-
kill "$(cat /workspace/personal/logs/my-report.pid)"
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Option B — PM2 (recommended for anything you'll come back to)
|
|
275
|
-
|
|
276
|
-
PM2 gives you auto-restart on crash, a process name, log management, and —
|
|
277
|
-
crucially — lets `agent-swarm artifact stop <name>` actually kill it.
|
|
278
|
-
|
|
279
|
-
```bash
|
|
280
|
-
pm2 start agent-swarm \
|
|
281
|
-
--name artifact-my-report \
|
|
282
|
-
-- artifact serve /workspace/personal/artifacts/my-report --name my-report
|
|
283
|
-
|
|
284
|
-
# Stop it cleanly later:
|
|
285
|
-
agent-swarm artifact stop my-report
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
The PM2 process name **must** be `artifact-<name>` (matching `--name`) — that's
|
|
289
|
-
exactly what `artifact stop` looks for.
|
|
290
|
-
|
|
291
|
-
### Known limitation — `artifact stop` only kills PM2-started processes
|
|
292
|
-
|
|
293
|
-
`agent-swarm artifact stop <name>` runs `pm2 delete artifact-<name>` and then
|
|
294
|
-
unregisters the entry from the service registry. If you started the artifact
|
|
295
|
-
with `nohup` (or `&`, or any non-PM2 launcher), `pm2 delete` silently fails and
|
|
296
|
-
the server keeps running and serving — even though the command prints
|
|
297
|
-
`Artifact '<name>' stopped.` Until that's fixed:
|
|
298
|
-
|
|
299
|
-
- Use **PM2** if you want `artifact stop` to do its job.
|
|
300
|
-
- For `nohup`/foreground processes, kill the PID yourself
|
|
301
|
-
(`kill <pid>` or `pkill -f 'artifact serve.*<name>'`) **and then** run
|
|
302
|
-
`agent-swarm artifact stop <name>` to clear the registry row.
|
|
303
|
-
|
|
304
|
-
## Multiple artifacts
|
|
305
|
-
|
|
306
|
-
Each artifact gets its own port (auto-assigned) and subdomain
|
|
307
|
-
(`<agentId>-<name>`). You can run several simultaneously — see
|
|
308
|
-
`examples/multi-artifact.ts`.
|
|
309
|
-
|
|
310
|
-
## Browser SDK
|
|
311
|
-
|
|
312
|
-
Served HTML gets the same injected browser SDK that pages get. Load it and use
|
|
313
|
-
the ready-made singleton:
|
|
314
|
-
|
|
315
|
-
```html
|
|
316
|
-
<script src="/@swarm/sdk.js"></script>
|
|
317
|
-
<script>
|
|
318
|
-
// `window.swarmSdk` is constructed for you — no `new SwarmSDK()` needed.
|
|
319
|
-
const tasks = await window.swarmSdk.tasks.list({ status: 'in_progress' });
|
|
320
|
-
const agents = await window.swarmSdk.agents.list();
|
|
321
|
-
</script>
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
The SDK is **domain-grouped** (`swarmSdk.tasks`, `.agents`, `.events`,
|
|
325
|
-
`.memory`, `.repos`, `.schedules`, `.approvalRequests`, `.assets`), each domain
|
|
326
|
-
mapping 1:1 onto the public REST API. The **`pages`** skill documents the full
|
|
327
|
-
method surface — it's the same object, so don't duplicate it here.
|
|
328
|
-
|
|
329
|
-
Calls route through the `/@swarm/api/*` proxy, which injects auth server-side.
|
|
330
|
-
Browser code never sees the API key.
|
|
331
|
-
|
|
332
|
-
## Storage
|
|
333
|
-
|
|
334
|
-
Always store served content in persisted directories — the working dir is wiped
|
|
335
|
-
between sessions:
|
|
336
|
-
|
|
337
|
-
- `/workspace/personal/artifacts/` — per-agent, persists across sessions (default)
|
|
338
|
-
- `/workspace/shared/artifacts/` — shared across the swarm
|
|
339
|
-
|
|
340
|
-
## See also
|
|
341
|
-
|
|
342
|
-
- The **`pages`** skill — DB-backed static HTML/JSON, no process to run. Prefer
|
|
343
|
-
it whenever the content is a snapshot.
|
|
344
|
-
- The **`kv-storage`** skill — for the small state a served page needs.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { createArtifactServer } from "../../src/artifact-sdk";
|
|
2
|
-
import { Hono } from "hono";
|
|
3
|
-
|
|
4
|
-
const app = new Hono();
|
|
5
|
-
app.get("/", (c) =>
|
|
6
|
-
c.html(`
|
|
7
|
-
<!DOCTYPE html>
|
|
8
|
-
<html>
|
|
9
|
-
<head><title>Approval Required</title></head>
|
|
10
|
-
<body>
|
|
11
|
-
<h1>PR #42 — Review Required</h1>
|
|
12
|
-
<p>Agent wants to merge this PR. Please review.</p>
|
|
13
|
-
<button id="approve">Approve</button>
|
|
14
|
-
<button id="reject">Reject</button>
|
|
15
|
-
<script src="/@swarm/sdk.js"></script>
|
|
16
|
-
<script>
|
|
17
|
-
const swarm = new SwarmSDK();
|
|
18
|
-
document.getElementById('approve').onclick = async () => {
|
|
19
|
-
await swarm.createTask({ task: 'Merge PR #42 — human approved' });
|
|
20
|
-
document.body.innerHTML = '<h1>Approved! Task created.</h1>';
|
|
21
|
-
};
|
|
22
|
-
document.getElementById('reject').onclick = async () => {
|
|
23
|
-
await swarm.createTask({ task: 'PR #42 rejected by human — needs changes' });
|
|
24
|
-
document.body.innerHTML = '<h1>Rejected. Agent notified.</h1>';
|
|
25
|
-
};
|
|
26
|
-
</script>
|
|
27
|
-
</body>
|
|
28
|
-
</html>
|
|
29
|
-
`),
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
const server = createArtifactServer({ name: "approval-pr-42", app });
|
|
33
|
-
await server.start();
|
|
34
|
-
console.log(`Approval artifact at: ${server.url}`);
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { createArtifactServer } from "../../src/artifact-sdk";
|
|
2
|
-
import { Hono } from "hono";
|
|
3
|
-
|
|
4
|
-
const app = new Hono();
|
|
5
|
-
|
|
6
|
-
app.get("/", (c) =>
|
|
7
|
-
c.html(`
|
|
8
|
-
<!DOCTYPE html>
|
|
9
|
-
<html>
|
|
10
|
-
<head><title>Dashboard</title></head>
|
|
11
|
-
<body>
|
|
12
|
-
<h1>Agent Dashboard</h1>
|
|
13
|
-
<div id="agents"></div>
|
|
14
|
-
<script src="/@swarm/sdk.js"></script>
|
|
15
|
-
<script>
|
|
16
|
-
const swarm = new SwarmSDK();
|
|
17
|
-
swarm.getSwarm().then(agents => {
|
|
18
|
-
document.getElementById('agents').innerHTML =
|
|
19
|
-
'<ul>' + agents.map(a => '<li>' + a.name + ' (' + a.status + ')</li>').join('') + '</ul>';
|
|
20
|
-
});
|
|
21
|
-
</script>
|
|
22
|
-
</body>
|
|
23
|
-
</html>
|
|
24
|
-
`),
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
app.get("/api/status", (c) => c.json({ status: "ok", timestamp: Date.now() }));
|
|
28
|
-
|
|
29
|
-
const server = createArtifactServer({ name: "dashboard", app });
|
|
30
|
-
await server.start();
|
|
31
|
-
console.log(`Dashboard live at: ${server.url}`);
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { createArtifactServer } from "../../src/artifact-sdk";
|
|
2
|
-
import { Hono } from "hono";
|
|
3
|
-
|
|
4
|
-
// Artifact 1: Status page
|
|
5
|
-
const statusApp = new Hono();
|
|
6
|
-
statusApp.get("/", (c) => c.html("<h1>Status: All systems operational</h1>"));
|
|
7
|
-
|
|
8
|
-
// Artifact 2: Data viewer
|
|
9
|
-
const dataApp = new Hono();
|
|
10
|
-
dataApp.get("/", (c) => c.json({ items: [1, 2, 3], generated: new Date().toISOString() }));
|
|
11
|
-
|
|
12
|
-
const status = createArtifactServer({ name: "status", app: statusApp });
|
|
13
|
-
const data = createArtifactServer({ name: "data", app: dataApp });
|
|
14
|
-
|
|
15
|
-
await status.start();
|
|
16
|
-
await data.start();
|
|
17
|
-
|
|
18
|
-
console.log(`Status page: ${status.url}`);
|
|
19
|
-
console.log(`Data viewer: ${data.url}`);
|
|
20
|
-
console.log(`Both artifacts running on different ports (${status.port}, ${data.port})`);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Serve a static HTML report as an artifact
|
|
3
|
-
ARTIFACT_DIR="/workspace/personal/artifacts/my-report"
|
|
4
|
-
mkdir -p "$ARTIFACT_DIR"
|
|
5
|
-
|
|
6
|
-
cat > "$ARTIFACT_DIR/index.html" << 'HTML'
|
|
7
|
-
<!DOCTYPE html>
|
|
8
|
-
<html>
|
|
9
|
-
<head><title>Agent Report</title></head>
|
|
10
|
-
<body>
|
|
11
|
-
<h1>Analysis Report</h1>
|
|
12
|
-
<p>Generated by agent</p>
|
|
13
|
-
</body>
|
|
14
|
-
</html>
|
|
15
|
-
HTML
|
|
16
|
-
|
|
17
|
-
agent-swarm artifact serve "$ARTIFACT_DIR" --name "my-report"
|
|
File without changes
|