@desplega.ai/agent-swarm 2.7.4 → 2.7.6
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-bp91d37f.js +15 -0
- package/dist/{actions-gfrr9vb7.js → actions-yj0eeaqh.js} +19 -18
- package/dist/{amp-adapter-0s58gm46.js → amp-adapter-4pg9h34q.js} +3 -3
- package/dist/{app-stvq692g.js → app-909e97cr.js} +3 -3
- package/dist/{assistant-5s37fr9n.js → assistant-qdyb5fyy.js} +32 -23
- package/dist/{boot-reembed-yzy1841n.js → boot-reembed-fk0s9z18.js} +1 -1
- package/dist/{boot-reembed-cv82gz7y.js → boot-reembed-gs1rzrnh.js} +1 -1
- package/dist/{boot-scrub-sweep-8k4q95ap.js → boot-scrub-sweep-4qfd4kfx.js} +4 -4
- package/dist/{boot-seeds-ftt9htah.js → boot-seeds-yr00k13d.js} +4 -4
- package/dist/{boxd-515v1t8z.js → boxd-vdmfssd9.js} +5 -5
- package/dist/{claude-adapter-t00wrzeh.js → claude-adapter-qta1f1xn.js} +7 -7
- package/dist/{claude-managed-adapter-g6vmjccb.js → claude-managed-adapter-dvs2xw5n.js} +2 -2
- package/dist/{claude-managed-setup-afpa82f7.js → claude-managed-setup-sc6j4dm0.js} +3 -3
- package/dist/{claude-sdk-session-vj0c2azx.js → claude-sdk-session-zgrz6yvc.js} +9175 -9076
- package/dist/{cli-gjr2y2xk.js → cli-0agcv1v5.js} +4 -1
- package/dist/{cli-edmm9d9y.js → cli-0at8w34w.js} +7 -7
- package/dist/{cli-a81qevyg.js → cli-0qatpy8q.js} +20 -36
- package/dist/{cli-bcz074zx.js → cli-0yv5z2pg.js} +1 -1
- package/dist/{cli-a4btqqft.js → cli-1b7btd38.js} +1 -1
- package/dist/{cli-a2jw6ee5.js → cli-1p89xny0.js} +1 -1
- package/dist/{cli-v726afdm.js → cli-2pnswgh8.js} +1 -1
- package/dist/{cli-jkt52mgt.js → cli-386tyxxg.js} +2 -2
- package/dist/{cli-az0bpf8p.js → cli-3ypk9vk1.js} +3 -3
- package/dist/{cli-wk9md5px.js → cli-436532ck.js} +4 -4
- package/dist/{cli-7n5sbw0z.js → cli-4necwtsv.js} +5 -5
- package/dist/cli-54t00gt8.js +151 -0
- package/dist/{cli-655xm9ms.js → cli-583frbyr.js} +1 -1
- package/dist/{cli-4r12t6w6.js → cli-5c4hjzne.js} +101 -4
- package/dist/{cli-hf6zt5m6.js → cli-69szn7w7.js} +17 -1
- package/dist/{cli-rtk9g7av.js → cli-73jzwksr.js} +6 -2
- package/dist/{cli-jg0nfda6.js → cli-75gkpjvw.js} +52 -21
- package/dist/{cli-wcmnan2g.js → cli-89knwags.js} +5 -5
- package/dist/{cli-pwyevs29.js → cli-8bc1w0tw.js} +22 -21
- package/dist/{cli-t282jgab.js → cli-8snvgs5r.js} +41 -16
- package/dist/{cli-vqgnyh76.js → cli-98rw5dt5.js} +15 -3
- package/dist/{cli-9cctx1tn.js → cli-a22h291q.js} +1 -1
- package/dist/{cli-ycm6180s.js → cli-a7v854rf.js} +5 -3
- package/dist/{cli-98pke4vk.js → cli-ae7mrdf9.js} +2 -2
- package/dist/{cli-je8yeyc5.js → cli-bjb3z51z.js} +5 -5
- package/dist/{cli-mc97xy2s.js → cli-c60vetmm.js} +16 -4
- package/dist/{cli-j4kw3rsx.js → cli-cm5yqn35.js} +18 -0
- package/dist/{cli-wndv9p7g.js → cli-decfb6v8.js} +6 -6
- package/dist/{cli-h55y2bjc.js → cli-dhar9qay.js} +2 -2
- package/dist/{cli-8yy525ad.js → cli-drr5v6av.js} +2 -2
- package/dist/{cli-5gr1g711.js → cli-dxae2yg7.js} +2 -2
- package/dist/{cli-pe09p6dv.js → cli-e3r2neck.js} +8 -7
- package/dist/{cli-13jvmew3.js → cli-ekwks2vs.js} +7 -7
- package/dist/{cli-jg4p5t36.js → cli-es6va8jk.js} +121 -51
- package/dist/{cli-j4kt1mpb.js → cli-faxe6thg.js} +3 -3
- package/dist/{cli-tzrpv5sc.js → cli-ftyxyspd.js} +1 -1
- package/dist/cli-fw2w0kva.js +47 -0
- package/dist/{cli-2dfbv8qr.js → cli-fy6x31ps.js} +1 -0
- package/dist/{cli-aq58fk5m.js → cli-g83s9ewh.js} +7 -1
- package/dist/cli-gdhpcbhf.js +55 -0
- package/dist/{cli-82jg7fp9.js → cli-he5nxaa8.js} +1 -1
- package/dist/{cli-8veytvbh.js → cli-he9wchme.js} +1 -1
- package/dist/{cli-k76tgq03.js → cli-hgaazk69.js} +2 -2
- package/dist/{cli-d2pzqej1.js → cli-hr2e2fft.js} +741 -7
- package/dist/{cli-dae4sbgy.js → cli-jm2vfpfd.js} +2 -2
- package/dist/{cli-1s1dqn1j.js → cli-k2gzwsj2.js} +297 -140
- package/dist/{cli-b1afgtj3.js → cli-kqdg1bsb.js} +3 -3
- package/dist/cli-m2z8jagn.js +12078 -0
- package/dist/{cli-mvckssyq.js → cli-m48g6p95.js} +5 -5
- package/dist/{cli-bwty35gx.js → cli-mthwvjre.js} +1 -1
- package/dist/{cli-41z8xwj0.js → cli-nhrvpaj7.js} +34 -8
- package/dist/{cli-ahd90bwt.js → cli-nwj0ee2w.js} +6 -6
- package/dist/{cli-kvtc7aez.js → cli-p5gp8pcx.js} +44 -14
- package/dist/{cli-avgcz4ra.js → cli-pd7vagab.js} +436 -171
- package/dist/{cli-zn15c46z.js → cli-q0k1w5zd.js} +1 -1
- package/dist/{cli-bq2pcphn.js → cli-rmmmrjkd.js} +1 -1
- package/dist/{cli-2qpvmmkw.js → cli-s0qnd4wv.js} +1 -1
- package/dist/{cli-kg8hchyg.js → cli-sa02jsqt.js} +1 -1
- package/dist/{cli-1yekbyqm.js → cli-shpbx5ee.js} +283 -82
- package/dist/{cli-9y354g3j.js → cli-srye3vdt.js} +1 -1
- package/dist/{cli-byqfbnjw.js → cli-svj5090z.js} +9 -9
- package/dist/{cli-gcbdjt47.js → cli-vfym7wmz.js} +6 -6
- package/dist/{cli-v1yw3wha.js → cli-vvpx3gsx.js} +4 -4
- package/dist/{cli-a1fhj4n9.js → cli-w6dt9ged.js} +2 -2
- package/dist/{cli-1gm8jcyr.js → cli-waqbxg08.js} +5232 -68
- package/dist/{cli-5hjced2v.js → cli-wp9sp1qb.js} +6 -6
- package/dist/{cli-eny54typ.js → cli-wx3rhnm0.js} +1 -1
- package/dist/{cli-s0exq74r.js → cli-xbbndvjy.js} +3 -3
- package/dist/{cli-f255yaqn.js → cli-xds5f77d.js} +3 -3
- package/dist/{cli-0sbkss7h.js → cli-xnqgpshy.js} +2 -2
- package/dist/{cli-0fgr1w9b.js → cli-xnrwazav.js} +20 -3
- package/dist/{cli-gf5hbmdr.js → cli-yjdgea32.js} +3 -3
- package/dist/{cli-cq1pf336.js → cli-yn4kxs06.js} +124 -11
- package/dist/{cli-224epwwf.js → cli-yx4kfngt.js} +3 -3
- package/dist/{cli-eqx6k993.js → cli-yy3rhsdw.js} +47 -13
- package/dist/{cli-36g23z21.js → cli-zbbwez0r.js} +4 -4
- package/dist/{cli-ktmvb20s.js → cli-zm72anhg.js} +12 -12
- package/dist/cli.js +26 -25
- package/dist/{codex-adapter-g0gctw29.js → codex-adapter-ayd1fb6h.js} +5 -5
- package/dist/{codex-hook-vrzz2xhr.js → codex-hook-9efm2x1m.js} +1 -1
- package/dist/{codex-login-0gg46ygn.js → codex-login-y0pmff1c.js} +1 -1
- package/dist/{codex-session-runner-dr2cxe1c.js → codex-session-runner-jesa32xc.js} +6 -6
- package/dist/{commands-1p07cvff.js → commands-hanewgf2.js} +9 -3
- package/dist/{controller-z0s7sv6r.js → controller-dt1n3c1q.js} +9 -4
- package/dist/{controllers-connect-x9kvvhyk.js → controllers-connect-xx8x64n5.js} +22 -21
- package/dist/{cursor-adapter-m5b98pvk.js → cursor-adapter-9s4dwwdw.js} +2 -2
- package/dist/{db-capk2raj.js → db-3vttcbv4.js} +3 -3
- package/dist/{db-rsh04kh3.js → db-9dv0g1ab.js} +12 -4
- package/dist/{devin-adapter-yxm87fe9.js → devin-adapter-r9phbnc9.js} +1 -1
- package/dist/{devtools-82fzqra8.js → devtools-qxfgbsqz.js} +1 -1
- package/dist/{dispatcher-304q6fwa.js → dispatcher-tx9hd1sv.js} +18 -17
- package/dist/{docker-7rxt0rry.js → docker-c1a3gqmf.js} +91 -24
- package/dist/{dsh-adapter-btewem0y.js → dsh-adapter-007y4ejs.js} +2 -2
- package/dist/{e2b-renc0k8q.js → e2b-a19d28rz.js} +4 -4
- package/dist/{e2b-7fc9b9bd.js → e2b-we6hs6q5.js} +6 -6
- package/dist/{easter-egg-3d-fm1p3n4d.js → easter-egg-3d-rgbrqb8s.js} +1 -1
- package/dist/{embedding-space-s68v49ct.js → embedding-space-ny1e2940.js} +6 -6
- package/dist/{embeddings-4ms3604w.js → embeddings-2t386t13.js} +1 -1
- package/dist/{event-bus-dfjx2qdh.js → event-bus-g0ka3pbw.js} +1 -1
- package/dist/{execute-mcdgccjs.js → execute-pksh0ceh.js} +1 -1
- package/dist/{external-channel-9dxwfztn.js → external-channel-phgmhmd7.js} +2 -2
- package/dist/fx-adapter-fy8rr921.js +18 -0
- package/dist/{google-generative-ai-yvmdxyxa.js → google-generative-ai-8y3m3k4b.js} +1 -1
- package/dist/{google-vertex-jrtdh9gs.js → google-vertex-w3v98n7b.js} +1 -1
- package/dist/{grok-adapter-05ecv4h0.js → grok-adapter-q0abvpaj.js} +8 -8
- package/dist/handlers-by3sfxyx.js +32 -0
- package/dist/{heartbeat-3n94heh3.js → heartbeat-kadyek8p.js} +21 -20
- package/dist/{hook-aadrn69x.js → hook-5zs3msf6.js} +6 -6
- package/dist/{hook-zxwje86c.js → hook-9k551xnj.js} +4 -4
- package/dist/{http-xzxk9mst.js → http-mhz9vw1f.js} +272 -103
- package/dist/index-4f2pvxae.js +37 -0
- package/dist/index-98gz7tmp.js +30 -0
- package/dist/{index-5rk6rfzr.js → index-fvzke5kx.js} +1 -1
- package/dist/index-k08z2cak.js +33 -0
- package/dist/{index-yqhz88yy.js → index-pxn30mse.js} +8 -8
- package/dist/{index-d34f6r87.js → index-q361cg2f.js} +1 -1
- package/dist/{index-9j4zwcht.js → index-rvr00sg7.js} +168 -675
- package/dist/{index-qeb82z37.js → index-vdygbq10.js} +1 -1
- package/dist/{keepalive-w4aakbyk.js → keepalive-w56f32cg.js} +4 -4
- package/dist/lead-enq35nqp.js +70 -0
- package/dist/{maintenance-hbptpk6p.js → maintenance-7mdgxcea.js} +1 -1
- package/dist/{oauth-refresh-sweep-217semrv.js → oauth-refresh-sweep-29txy9vk.js} +3 -3
- package/dist/{onboard-vz2s5df3.js → onboard-kpsrkarj.js} +5 -5
- package/dist/{opencode-adapter-gtfd7d7v.js → opencode-adapter-j25vm3rr.js} +5 -5
- package/dist/{otel-impl-aefave37.js → otel-impl-6kkct7a8.js} +2 -2
- package/dist/{pi-mono-adapter-f8h5yseh.js → pi-mono-adapter-exhkzhn2.js} +117 -23
- package/dist/{pricing-refresh-m1yhh9ya.js → pricing-refresh-n2x7jh6k.js} +3 -3
- package/dist/{rbac-roles-rrw8twdz.js → rbac-roles-81ypx6es.js} +1 -1
- package/dist/{rbac-roles-svj72cdf.js → rbac-roles-b5htkjby.js} +2 -2
- package/dist/{render-v2-amwbnfxh.js → render-v2-qn6jmpk4.js} +3 -3
- package/dist/{resume-9cd6wf6z.js → resume-wd30wx23.js} +7 -7
- package/dist/{runtime-fp4vrx7m.js → runtime-4hsg7h60.js} +1 -1
- package/dist/{session-access-21t6yjyg.js → session-access-5qvfevhk.js} +4 -4
- package/dist/{session-source-backfill-pxbzcsc6.js → session-source-backfill-n1czavbr.js} +3 -3
- package/dist/{setup-4592tqz4.js → setup-dnb56qy5.js} +3 -3
- package/dist/{virtual-modules-gzfnpmnz.js → virtual-modules-76xxv9fs.js} +2 -2
- package/dist/{work-objects-t9tcf174.js → work-objects-4n21tfkm.js} +21 -20
- package/dist/{worker-follow-up-q32jh4yk.js → worker-follow-up-77hvzxww.js} +18 -17
- package/dist/worker-gg1576j3.js +70 -0
- package/dist/{x-b6wxntdt.js → x-vmmye1kb.js} +2 -2
- package/openapi.json +189 -32
- package/package.json +8 -7
- package/src/be/db/script-runs.ts +23 -0
- package/src/be/db/session-summaries.ts +8 -2
- package/src/be/db/session-tree.ts +174 -61
- package/src/be/db/session-visibility.ts +5 -4
- package/src/be/db/tasks/read.ts +122 -3
- package/src/be/db-client.ts +8 -5
- package/src/be/db.ts +23 -8
- package/src/be/memory/providers/sqlite-store.ts +49 -12
- package/src/be/migrations/259_session_summaries_open_tasks.sql +111 -0
- package/src/be/migrations/260_runtime_pool_cache.sql +20 -0
- package/src/be/migrations/262_session_visibility_indexes.sql +18 -0
- package/src/be/migrations/263_task_list_filter_index.sql +11 -0
- package/src/be/migrations/264_slack_thread_cover_index.sql +9 -0
- package/src/be/migrations/266_script_runs_source_task.sql +11 -0
- package/src/be/model-validation.ts +5 -1
- package/src/be/pricing-normalize.ts +7 -2
- package/src/be/runtime-pools/cache-cleanup.ts +109 -0
- package/src/be/runtime-pools/db.ts +65 -6
- package/src/be/runtime-pools/remote-controller.ts +5 -0
- package/src/be/runtime-pools/supervisor.ts +33 -2
- package/src/be/scripts/typecheck.ts +23 -0
- package/src/be/seed/schedules-seeder.ts +135 -9
- package/src/be/seed/workflows-seeder.ts +65 -1
- package/src/be/seed-pricing.ts +23 -0
- package/src/be/seed-scripts/catalog/task-failure-audit.ts +5 -1
- package/src/be/steering.ts +50 -3
- package/src/be/swarm-config-guard.ts +1 -0
- package/src/commands/controller.ts +4 -0
- package/src/commands/entrypoint-api-readiness.ts +74 -0
- package/src/commands/provider-credentials.ts +29 -2
- package/src/commands/runner.ts +86 -5
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +27 -1
- package/src/extensions/dispatcher.ts +4 -0
- package/src/http/agents.ts +1 -0
- package/src/http/index.ts +1 -1
- package/src/http/list-total-cache.ts +14 -7
- package/src/http/mcp-bridge.ts +4 -0
- package/src/http/memory.ts +38 -9
- package/src/http/script-runs.ts +174 -5
- package/src/http/status.ts +10 -2
- package/src/http/tasks.ts +4 -2
- package/src/integrations/chat-sdk/inbound.ts +15 -5
- package/src/integrations/chat-sdk/steering.ts +3 -1
- package/src/kv-reserved-namespaces.ts +2 -0
- package/src/prompts/base-prompt.ts +4 -1
- package/src/prompts/session-templates.ts +26 -0
- package/src/providers/acp-adapter.ts +190 -26
- package/src/providers/acp-targets.ts +306 -6
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/codex-adapter.ts +9 -44
- package/src/providers/codex-oauth/flow.ts +24 -3
- package/src/providers/codex-oauth/storage.ts +56 -17
- package/src/providers/codex-oauth/subscription.ts +67 -0
- package/src/providers/fx-adapter.ts +211 -0
- package/src/providers/index.ts +5 -1
- package/src/providers/mcp-loopback-proxy.ts +94 -0
- package/src/providers/pi-mono-adapter.ts +98 -13
- package/src/providers/pricing-sources.md +8 -0
- package/src/providers/reasoning-effort.ts +17 -1
- package/src/providers/types.ts +2 -1
- package/src/runtime-providers/controller-protocol.ts +14 -1
- package/src/runtime-providers/controller.ts +5 -0
- package/src/runtime-providers/docker.ts +108 -23
- package/src/runtime-providers/types.ts +16 -0
- package/src/scheduler/scheduler.ts +36 -3
- package/src/script-workflows/workflow-ctx.ts +8 -0
- package/src/scripts-runtime/sdk-allowlist.ts +1 -0
- package/src/scripts-runtime/types/stdlib.d.ts +27 -0
- package/src/scripts-runtime/types/swarm-extension.d.ts +33 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -0
- package/src/server-user.ts +1 -0
- package/src/server.ts +7 -0
- package/src/slack/assistant.ts +17 -1
- package/src/slack/commands.ts +5 -1
- package/src/slack/handlers.ts +53 -5
- package/src/slack/left-threads.ts +88 -0
- package/src/slack/steering.ts +3 -0
- package/src/slack/thread-buffer.ts +40 -16
- package/src/tasks/follow-up-redelegation-guard.ts +155 -0
- package/src/tests/acp-adapter.test.ts +79 -0
- package/src/tests/base-prompt.test.ts +12 -0
- package/src/tests/chat-sdk-inbound.test.ts +30 -0
- package/src/tests/chatgpt-subscription-model-groups.test.ts +62 -0
- package/src/tests/chatgpt-subscription-pi.test.ts +170 -0
- package/src/tests/chatgpt-subscription-session-bench.test.ts +198 -0
- package/src/tests/claude-artifacts-read-script.test.ts +209 -0
- package/src/tests/codex-oauth-credential-info.test.ts +40 -0
- package/src/tests/codex-oauth-refresh-egress.test.ts +194 -0
- package/src/tests/context-window.test.ts +7 -0
- package/src/tests/db-client.test.ts +21 -0
- package/src/tests/db-task-read-contract.test.ts +8 -2
- package/src/tests/db-task-write-contract.test.ts +5 -1
- package/src/tests/entrypoint-api-readiness.test.ts +416 -210
- package/src/tests/explicit-model-validation.test.ts +113 -8
- package/src/tests/extensions-run-context.test.ts +11 -0
- package/src/tests/extensions-steering.test.ts +353 -0
- package/src/tests/extensions-validate.test.ts +5 -0
- package/src/tests/fixtures/extensions/steering-policy/hooks.ts +39 -0
- package/src/tests/fixtures/extensions/steering-policy/manifest.json +7 -0
- package/src/tests/fixtures/fake-fx.ts +167 -0
- package/src/tests/fixtures/fx/acp-responses-recorded.json +157 -0
- package/src/tests/fixtures/fx/acp-updates-recorded.jsonl +15 -0
- package/src/tests/follow-up-redelivery-guard.test.ts +432 -202
- package/src/tests/fx-adapter.test.ts +771 -0
- package/src/tests/grok-adapter.test.ts +36 -0
- package/src/tests/list-total-cache.test.ts +27 -2
- package/src/tests/mcp-loopback-proxy.test.ts +193 -0
- package/src/tests/memory-fts-populate.test.ts +11 -9
- package/src/tests/memory-retrieval-purge.test.ts +80 -0
- package/src/tests/migration-260-runtime-pool-cache.test.ts +118 -0
- package/src/tests/model-tier-resolution.test.ts +3 -3
- package/src/tests/pricing-refresh.test.ts +5 -5
- package/src/tests/prompt-template-session.test.ts +5 -3
- package/src/tests/provider-registration.test.ts +2 -1
- package/src/tests/query-audit-plans.test.ts +30 -2
- package/src/tests/runtime-cache-cleanup.test.ts +367 -0
- package/src/tests/runtime-e2b-pools.test.ts +41 -0
- package/src/tests/runtime-pools-db.test.ts +98 -0
- package/src/tests/runtime-pools-http.test.ts +29 -0
- package/src/tests/runtime-providers-docker.test.ts +253 -0
- package/src/tests/runtime-remote-controller.test.ts +66 -2
- package/src/tests/runtime-supervisor.test.ts +66 -2
- package/src/tests/script-connections.test.ts +13 -0
- package/src/tests/script-runs-http.test.ts +684 -2
- package/src/tests/seed-model-profiles.test.ts +2 -2
- package/src/tests/seed-schedules.test.ts +138 -0
- package/src/tests/seed-scripts.test.ts +26 -0
- package/src/tests/session-cost-recompute-unit.test.ts +39 -0
- package/src/tests/session-costs-golden.test.ts +26 -0
- package/src/tests/session-summaries-plans.test.ts +120 -0
- package/src/tests/session-summaries.test.ts +72 -12
- package/src/tests/sessions-tree.test.ts +11 -3
- package/src/tests/slack-leave-thread.test.ts +571 -0
- package/src/tests/slack-render-v2-query-plans.test.ts +24 -2
- package/src/tests/status.test.ts +11 -0
- package/src/tests/tasks-readable-row.test.ts +155 -0
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/workflow-engine-v2.test.ts +42 -0
- package/src/tests/workflow-script-principal.test.ts +207 -7
- package/src/tools/send-task.ts +35 -47
- package/src/tools/slack-leave-thread.ts +104 -0
- package/src/tools/steer-task.ts +3 -2
- package/src/tools/task-dedup.ts +45 -21
- package/src/tools/tool-config.ts +2 -1
- package/src/types.ts +57 -0
- package/src/utils/codex-auth-failure.ts +30 -0
- package/src/utils/context-window.ts +4 -1
- package/src/utils/credentials.ts +7 -0
- package/src/utils/fx-models.ts +43 -0
- package/src/workflows/cooldown.ts +3 -2
- package/src/workflows/engine.ts +24 -9
- package/templates/schedules/dreaming-daily/config.json +1 -1
- package/templates/schedules/dreaming-daily/content.md +6 -14
- package/templates/skills/composio-google-docs/content.md +10 -0
- package/templates/skills/script-workflows/content.md +19 -1
- package/templates/skills/swarm-docs/content.md +2 -0
- package/templates/skills/swarm-scripts/SKILL.md +2 -0
- package/templates/skills/swarm-scripts/content.md +2 -0
- package/templates/workflows/dreaming/content.md +5 -1
- package/dist/acp-adapter-96dc64m2.js +0 -15
- package/dist/cli-dznrgaep.js +0 -30
- package/dist/cli-w3hcrxht.js +0 -6985
- package/dist/handlers-jg7v74ty.js +0 -31
- package/dist/index-8c1zbz59.js +0 -29
- package/dist/index-8k8tmfxd.js +0 -32
- package/dist/index-hq617xdj.js +0 -36
- package/dist/lead-567kw7x3.js +0 -68
- package/dist/worker-fjdqra6q.js +0 -68
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pool refresh or persist failure must never print a token. The OpenAI
|
|
3
|
+
* token endpoint and the config store may echo the request body in an error
|
|
4
|
+
* response; that text reaches console logs, the thrown error and, through
|
|
5
|
+
* `buildPoolRevalidationFailureReason`, the task's failure reason.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
|
|
9
|
+
import { resetFetchForTesting, setFetchForTesting } from "../providers/codex-oauth/flow.js";
|
|
10
|
+
import { persistCodexOAuth, storeCodexOAuth } from "../providers/codex-oauth/storage.js";
|
|
11
|
+
import { loadChatgptSubscriptionCredential } from "../providers/codex-oauth/subscription.js";
|
|
12
|
+
import type { CodexOAuthCredentials } from "../providers/codex-oauth/types.js";
|
|
13
|
+
import { isCodexAuthFailureReason } from "../utils/codex-auth-failure";
|
|
14
|
+
|
|
15
|
+
const API_URL = "http://localhost:3013";
|
|
16
|
+
const OLD_REFRESH = "rt_synthetic_pool_refresh_0123456789abcdef";
|
|
17
|
+
const NEW_ACCESS = "at_synthetic_rotated_access_0123456789abcdef";
|
|
18
|
+
const NEW_REFRESH = "rt_synthetic_rotated_refresh_0123456789abcdef";
|
|
19
|
+
const SECRETS = [OLD_REFRESH, NEW_ACCESS, NEW_REFRESH];
|
|
20
|
+
const CONFIG = { apiUrl: API_URL, apiKey: "test-key", codexSlot: 0, model: "openai-codex/gpt-5.5" };
|
|
21
|
+
|
|
22
|
+
const originalFetch = globalThis.fetch;
|
|
23
|
+
let logged: string[] = [];
|
|
24
|
+
const spies: Array<{ mockRestore: () => void }> = [];
|
|
25
|
+
|
|
26
|
+
/** A transport error whose message echoes the request carrying the tokens. */
|
|
27
|
+
function rejectedPersist(): never {
|
|
28
|
+
throw new TypeError(
|
|
29
|
+
`fetch failed: socket closed while sending {"value":"{\\"access\\":\\"${NEW_ACCESS}\\",\\"refresh\\":\\"${NEW_REFRESH}\\"}"} (${encodeURIComponent(NEW_REFRESH)})`,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Config store holding one expired slot; `putResponse` answers the persist. */
|
|
34
|
+
function installConfigStore(putResponse: () => Response): void {
|
|
35
|
+
const creds: CodexOAuthCredentials = {
|
|
36
|
+
access: "at_expired",
|
|
37
|
+
refresh: OLD_REFRESH,
|
|
38
|
+
expires: Date.now() - 1000,
|
|
39
|
+
accountId: "acct-egress",
|
|
40
|
+
};
|
|
41
|
+
globalThis.fetch = (async (url: string | URL | Request, init?: RequestInit) => {
|
|
42
|
+
const href = url.toString();
|
|
43
|
+
const method = (init?.method ?? "GET").toUpperCase();
|
|
44
|
+
if (href.includes("/api/oauth/refresh-locks/")) {
|
|
45
|
+
return Response.json(method === "POST" ? { owner: "owner-1" } : { released: true });
|
|
46
|
+
}
|
|
47
|
+
if (method === "GET" && href.includes("/api/config/resolved")) {
|
|
48
|
+
return Response.json({ configs: [{ key: "codex_oauth_0", value: JSON.stringify(creds) }] });
|
|
49
|
+
}
|
|
50
|
+
if (method === "PUT" && href.includes("/api/config")) return putResponse();
|
|
51
|
+
if (method === "DELETE" && href.includes("/api/config")) return Response.json({});
|
|
52
|
+
throw new Error(`Unexpected fetch: ${method} ${href}`);
|
|
53
|
+
}) as typeof fetch;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function failureOf(promise: Promise<unknown>): Promise<string> {
|
|
57
|
+
try {
|
|
58
|
+
await promise;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
return err instanceof Error ? err.message : String(err);
|
|
61
|
+
}
|
|
62
|
+
throw new Error("expected a rejection");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function expectNoSecret(text: string): void {
|
|
66
|
+
for (const secret of SECRETS) {
|
|
67
|
+
expect(text).not.toContain(secret);
|
|
68
|
+
expect(text).not.toContain(encodeURIComponent(secret));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
logged = [];
|
|
74
|
+
for (const method of ["log", "error", "warn"] as const) {
|
|
75
|
+
spies.push(
|
|
76
|
+
spyOn(console, method).mockImplementation((...args: unknown[]) => {
|
|
77
|
+
logged.push(args.map((a) => (typeof a === "string" ? a : Bun.inspect(a))).join(" "));
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
for (const spy of spies.splice(0)) spy.mockRestore();
|
|
85
|
+
globalThis.fetch = originalFetch;
|
|
86
|
+
resetFetchForTesting();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe("pool refresh failure egress", () => {
|
|
90
|
+
test("a 401 echoing the submitted refresh token is redacted and still counts", async () => {
|
|
91
|
+
installConfigStore(() => Response.json({}));
|
|
92
|
+
setFetchForTesting((async (_url: string | URL | Request, init?: RequestInit) => {
|
|
93
|
+
const form = String(init?.body ?? "");
|
|
94
|
+
return new Response(
|
|
95
|
+
JSON.stringify({ error: "invalid_grant", echo: OLD_REFRESH, request: form }),
|
|
96
|
+
{ status: 401 },
|
|
97
|
+
);
|
|
98
|
+
}) as typeof fetch);
|
|
99
|
+
|
|
100
|
+
const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
|
|
101
|
+
|
|
102
|
+
expect(reason).toContain("refresh rejected (401");
|
|
103
|
+
expect(reason).toContain("invalid_grant");
|
|
104
|
+
expect(isCodexAuthFailureReason(reason)).toBe(true);
|
|
105
|
+
expectNoSecret(reason);
|
|
106
|
+
expect(logged.length).toBeGreaterThan(0);
|
|
107
|
+
expectNoSecret(logged.join("\n"));
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("a refresh response missing fields never logs the tokens it did carry", async () => {
|
|
111
|
+
installConfigStore(() => Response.json({}));
|
|
112
|
+
setFetchForTesting((async () =>
|
|
113
|
+
Response.json({ access_token: NEW_ACCESS, refresh_token: NEW_REFRESH })) as typeof fetch);
|
|
114
|
+
|
|
115
|
+
const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
|
|
116
|
+
|
|
117
|
+
expectNoSecret(reason);
|
|
118
|
+
expectNoSecret(logged.join("\n"));
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("a persist failure echoing the rotated tokens is redacted and stays transient", async () => {
|
|
122
|
+
installConfigStore(
|
|
123
|
+
() => new Response(`rejected value ${NEW_ACCESS} ${NEW_REFRESH}`, { status: 500 }),
|
|
124
|
+
);
|
|
125
|
+
setFetchForTesting((async () =>
|
|
126
|
+
Response.json({
|
|
127
|
+
access_token: NEW_ACCESS,
|
|
128
|
+
refresh_token: NEW_REFRESH,
|
|
129
|
+
expires_in: 864000,
|
|
130
|
+
})) as typeof fetch);
|
|
131
|
+
|
|
132
|
+
const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
|
|
133
|
+
|
|
134
|
+
expect(reason).toContain("HTTP 500");
|
|
135
|
+
expect(isCodexAuthFailureReason(reason)).toBe(false);
|
|
136
|
+
expectNoSecret(reason);
|
|
137
|
+
expectNoSecret(logged.join("\n"));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("a persist fetch rejection echoing the rotated tokens never reaches the reason or logs", async () => {
|
|
141
|
+
installConfigStore(rejectedPersist);
|
|
142
|
+
setFetchForTesting((async () =>
|
|
143
|
+
Response.json({
|
|
144
|
+
access_token: NEW_ACCESS,
|
|
145
|
+
refresh_token: NEW_REFRESH,
|
|
146
|
+
expires_in: 864000,
|
|
147
|
+
})) as typeof fetch);
|
|
148
|
+
|
|
149
|
+
const reason = await failureOf(loadChatgptSubscriptionCredential(CONFIG));
|
|
150
|
+
|
|
151
|
+
expect(reason).toContain("Failed to store codex_oauth_0 config: fetch failed");
|
|
152
|
+
expect(isCodexAuthFailureReason(reason)).toBe(false);
|
|
153
|
+
expectNoSecret(reason);
|
|
154
|
+
expectNoSecret(logged.join("\n"));
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe("persist egress", () => {
|
|
159
|
+
const rotated: CodexOAuthCredentials = {
|
|
160
|
+
access: NEW_ACCESS,
|
|
161
|
+
refresh: NEW_REFRESH,
|
|
162
|
+
expires: Date.now() + 864000_000,
|
|
163
|
+
accountId: "acct-egress",
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
test("storeCodexOAuth rethrows a fetch rejection with no token and no raw cause", async () => {
|
|
167
|
+
globalThis.fetch = (async () => rejectedPersist()) as unknown as typeof fetch;
|
|
168
|
+
|
|
169
|
+
let thrown: unknown;
|
|
170
|
+
try {
|
|
171
|
+
await storeCodexOAuth(API_URL, "test-key", rotated, 0);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
thrown = err;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
expect(thrown).toBeInstanceOf(Error);
|
|
177
|
+
const err = thrown as Error;
|
|
178
|
+
expect(err.message).toContain("fetch failed");
|
|
179
|
+
expect(err.cause).toBeUndefined();
|
|
180
|
+
expectNoSecret(Bun.inspect(err));
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("persistCodexOAuth logs a fetch rejection or an echoing response without tokens", async () => {
|
|
184
|
+
globalThis.fetch = (async () => rejectedPersist()) as unknown as typeof fetch;
|
|
185
|
+
await persistCodexOAuth(API_URL, "test-key", rotated, 0);
|
|
186
|
+
globalThis.fetch = (async () =>
|
|
187
|
+
new Response(`rejected value ${NEW_ACCESS} ${NEW_REFRESH}`, { status: 500 })) as typeof fetch;
|
|
188
|
+
await persistCodexOAuth(API_URL, "test-key", rotated, 0);
|
|
189
|
+
|
|
190
|
+
expect(logged.join("\n")).toContain("fetch failed");
|
|
191
|
+
expect(logged.join("\n")).toContain("HTTP 500");
|
|
192
|
+
expectNoSecret(logged.join("\n"));
|
|
193
|
+
});
|
|
194
|
+
});
|
|
@@ -41,6 +41,13 @@ describe("getContextWindowSize", () => {
|
|
|
41
41
|
expect(getContextWindowSize("gpt-5")).toBe(400_000);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
test("reads a ChatGPT subscription id's window from its OpenAI id, as codex does", () => {
|
|
45
|
+
expect(getContextWindowSize("openai-codex/gpt-5.6-luna")).toBe(
|
|
46
|
+
getContextWindowSize("gpt-5.6-luna"),
|
|
47
|
+
);
|
|
48
|
+
expect(getContextWindowSize("openai-codex/gpt-5.6-luna")).not.toBe(200_000);
|
|
49
|
+
});
|
|
50
|
+
|
|
44
51
|
test("returns 200K default for unknown models", () => {
|
|
45
52
|
expect(getContextWindowSize("unknown-model")).toBe(200_000);
|
|
46
53
|
expect(getContextWindowSize("")).toBe(200_000);
|
|
@@ -475,6 +475,27 @@ describe("db-client slow statement warning", () => {
|
|
|
475
475
|
}
|
|
476
476
|
});
|
|
477
477
|
|
|
478
|
+
test("does not count a slow database open against the first statement", async () => {
|
|
479
|
+
// The first call opens the database (and applies migrations) through the
|
|
480
|
+
// client's getter. That cost is boot work, not the statement's.
|
|
481
|
+
let opened = false;
|
|
482
|
+
const lazy = createBunSqliteClient(() => {
|
|
483
|
+
if (!opened) {
|
|
484
|
+
opened = true;
|
|
485
|
+
Bun.sleepSync(150);
|
|
486
|
+
}
|
|
487
|
+
return raw;
|
|
488
|
+
});
|
|
489
|
+
const warn = spyOn(console, "warn").mockImplementation(() => {});
|
|
490
|
+
try {
|
|
491
|
+
await lazy.query("SELECT name FROM items");
|
|
492
|
+
expect(opened).toBe(true);
|
|
493
|
+
expect(slowWarnings(warn)).toHaveLength(0);
|
|
494
|
+
} finally {
|
|
495
|
+
warn.mockRestore();
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
|
|
478
499
|
test("does not log fast statements", async () => {
|
|
479
500
|
const warn = spyOn(console, "warn").mockImplementation(() => {});
|
|
480
501
|
try {
|
|
@@ -144,6 +144,7 @@ value:completeApprovalCancellationNotificationClaim
|
|
|
144
144
|
value:completeTask
|
|
145
145
|
value:computeContentHash
|
|
146
146
|
value:countActiveScriptRuns
|
|
147
|
+
value:countAgentDispatchesInThread
|
|
147
148
|
value:countAllMetrics
|
|
148
149
|
value:countAllPages
|
|
149
150
|
value:countKv
|
|
@@ -218,9 +219,10 @@ value:extensionAgentAssignmentError
|
|
|
218
219
|
value:failPendingResumeIfUnclaimed
|
|
219
220
|
value:failTask
|
|
220
221
|
value:findActiveTasksByVcs
|
|
221
|
-
value:
|
|
222
|
+
value:findCompletedTasksInThread
|
|
222
223
|
value:findExistingLinearTrackerContextWork
|
|
223
224
|
value:findRecentCancelledTaskInThread
|
|
225
|
+
value:findRecentFailedTaskInThread
|
|
224
226
|
value:findRecentSimilarTasks
|
|
225
227
|
value:findTaskByAgentMailThread
|
|
226
228
|
value:findTaskByGitHub
|
|
@@ -369,6 +371,7 @@ value:getScheduledTasks
|
|
|
369
371
|
value:getScriptRun
|
|
370
372
|
value:getScriptRunByIdempotencyKey
|
|
371
373
|
value:getScriptRunExecutionArgs
|
|
374
|
+
value:getScriptRunFollowUpGuard
|
|
372
375
|
value:getScriptRunJournalStep
|
|
373
376
|
value:getServiceByAgentAndName
|
|
374
377
|
value:getServiceById
|
|
@@ -561,6 +564,7 @@ value:setApiKeyName
|
|
|
561
564
|
value:setApiKeyPlan
|
|
562
565
|
value:setBudgetRefusalFollowUpTaskId
|
|
563
566
|
value:setFavorite
|
|
567
|
+
value:setScriptRunFollowUpGuard
|
|
564
568
|
value:setSlackMessageTracking
|
|
565
569
|
value:setUserFavorite
|
|
566
570
|
value:settleSupersededTaskDependents
|
|
@@ -622,10 +626,12 @@ type:PendingChatRelay
|
|
|
622
626
|
type:TaskFilters
|
|
623
627
|
value:SUPERSEDED_RESUME_REPAIR_WINDOW_MS
|
|
624
628
|
value:TASK_LINEAGE_LIMITS
|
|
629
|
+
value:countAgentDispatchesInThread
|
|
625
630
|
value:findActiveTasksByVcs
|
|
626
|
-
value:
|
|
631
|
+
value:findCompletedTasksInThread
|
|
627
632
|
value:findExistingLinearTrackerContextWork
|
|
628
633
|
value:findRecentCancelledTaskInThread
|
|
634
|
+
value:findRecentFailedTaskInThread
|
|
629
635
|
value:findTaskByGitHub
|
|
630
636
|
value:findTaskByVcs
|
|
631
637
|
value:getAgentCurrentTask
|
|
@@ -167,6 +167,7 @@ value:completeApprovalCancellationNotificationClaim
|
|
|
167
167
|
value:completeTask
|
|
168
168
|
value:computeContentHash
|
|
169
169
|
value:countActiveScriptRuns
|
|
170
|
+
value:countAgentDispatchesInThread
|
|
170
171
|
value:countAllMetrics
|
|
171
172
|
value:countAllPages
|
|
172
173
|
value:countKv
|
|
@@ -241,9 +242,10 @@ value:extensionAgentAssignmentError
|
|
|
241
242
|
value:failPendingResumeIfUnclaimed
|
|
242
243
|
value:failTask
|
|
243
244
|
value:findActiveTasksByVcs
|
|
244
|
-
value:
|
|
245
|
+
value:findCompletedTasksInThread
|
|
245
246
|
value:findExistingLinearTrackerContextWork
|
|
246
247
|
value:findRecentCancelledTaskInThread
|
|
248
|
+
value:findRecentFailedTaskInThread
|
|
247
249
|
value:findRecentSimilarTasks
|
|
248
250
|
value:findTaskByAgentMailThread
|
|
249
251
|
value:findTaskByGitHub
|
|
@@ -392,6 +394,7 @@ value:getScheduledTasks
|
|
|
392
394
|
value:getScriptRun
|
|
393
395
|
value:getScriptRunByIdempotencyKey
|
|
394
396
|
value:getScriptRunExecutionArgs
|
|
397
|
+
value:getScriptRunFollowUpGuard
|
|
395
398
|
value:getScriptRunJournalStep
|
|
396
399
|
value:getServiceByAgentAndName
|
|
397
400
|
value:getServiceById
|
|
@@ -584,6 +587,7 @@ value:setApiKeyName
|
|
|
584
587
|
value:setApiKeyPlan
|
|
585
588
|
value:setBudgetRefusalFollowUpTaskId
|
|
586
589
|
value:setFavorite
|
|
590
|
+
value:setScriptRunFollowUpGuard
|
|
587
591
|
value:setSlackMessageTracking
|
|
588
592
|
value:setUserFavorite
|
|
589
593
|
value:settleSupersededTaskDependents
|