@desplega.ai/agent-swarm 1.159.0 → 1.161.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.
Files changed (415) hide show
  1. package/README.md +2 -2
  2. package/dist/{acp-adapter-qhch0n2v.js → acp-adapter-xx489vvb.js} +286 -75
  3. package/dist/{actions-dtsh1mfb.js → actions-ykjkn0m9.js} +32 -30
  4. package/dist/{anthropic-messages-f2h06k64.js → anthropic-messages-5qx80j9k.js} +99 -14
  5. package/dist/{app-y1b9srva.js → app-0hdqa4k1.js} +13 -11
  6. package/dist/{assistant-31hwy5xj.js → assistant-am2g5g8a.js} +40 -32
  7. package/dist/{azure-openai-responses-0k1mfax5.js → azure-openai-responses-fszbkp0e.js} +3 -3
  8. package/dist/{boot-reembed-48d2qpkt.js → boot-reembed-gt5gjkt4.js} +14 -12
  9. package/dist/{boot-reembed-w0bryhkr.js → boot-reembed-xy9t7avg.js} +15 -13
  10. package/dist/{boot-scrub-logs-t65wbrn7.js → boot-scrub-logs-9x0985y5.js} +12 -10
  11. package/dist/boot-seeds-trv0d4vg.js +29 -0
  12. package/dist/{claude-adapter-1t6611ne.js → claude-adapter-jb6e1e54.js} +32 -26
  13. package/dist/{claude-managed-adapter-werp659j.js → claude-managed-adapter-yxkfxg8j.js} +7 -7
  14. package/dist/{claude-managed-setup-y6rdgbc1.js → claude-managed-setup-d1q9hv2b.js} +26 -27
  15. package/dist/{claude-sdk-session-zhkyk8yw.js → claude-sdk-session-zga700s2.js} +11737 -11256
  16. package/dist/{cli-79aq9cgb.js → cli-0383bp7f.js} +1222 -406
  17. package/dist/{cli-xgpf00sk.js → cli-0c7ata9h.js} +24 -23
  18. package/dist/{cli-qjxy52w7.js → cli-121ph74b.js} +2 -2
  19. package/dist/{cli-20035trh.js → cli-17xpf7cm.js} +14 -7
  20. package/dist/{cli-cqt19wg6.js → cli-1a2j50m0.js} +11 -2
  21. package/dist/{cli-g9df2m37.js → cli-1cz0c18q.js} +249 -200
  22. package/dist/{cli-fjtp3463.js → cli-1er0rhz8.js} +13 -12
  23. package/dist/{cli-ca2w7zv7.js → cli-2hhfhfq5.js} +11 -6
  24. package/dist/{cli-npssxgaz.js → cli-2pdaysab.js} +52 -2
  25. package/dist/{cli-rykfmgwg.js → cli-2x0e561b.js} +1 -1
  26. package/dist/{cli-503ya656.js → cli-35pj2yva.js} +20 -150
  27. package/dist/cli-3qhyh31j.js +166 -0
  28. package/dist/{cli-cygyqj3b.js → cli-3zc55ctx.js} +8 -6
  29. package/dist/{cli-96qd5psa.js → cli-58e8yr0d.js} +1 -1
  30. package/dist/{cli-4aj25szq.js → cli-5nbmpy8w.js} +2 -2
  31. package/dist/{cli-mg24hkt4.js → cli-5p3x4zna.js} +2 -2
  32. package/dist/{cli-vwbbaecp.js → cli-7119ja3w.js} +3 -3
  33. package/dist/{cli-mzkqpxee.js → cli-798vkbks.js} +2 -2
  34. package/dist/{cli-3gvrr8vj.js → cli-82c1pacn.js} +111 -54
  35. package/dist/{cli-hgqfttfc.js → cli-89s4ngw3.js} +1 -1
  36. package/dist/{cli-9b13ggd1.js → cli-89v6kyq7.js} +1 -0
  37. package/dist/{cli-b6thtzac.js → cli-8g6mc14k.js} +7 -7
  38. package/dist/{cli-eg7cdg68.js → cli-9m03pzga.js} +5 -5
  39. package/dist/cli-9s68w752.js +303 -0
  40. package/dist/{cli-48527fpw.js → cli-a8c82p2t.js} +16 -15
  41. package/dist/{cli-5f2hq128.js → cli-ad4qxm6j.js} +12 -11
  42. package/dist/{cli-e4xnc0qp.js → cli-akfj32vj.js} +33 -7
  43. package/dist/{cli-ejpygnqz.js → cli-bh7jed3k.js} +212 -22
  44. package/dist/{cli-0z2v4nhw.js → cli-cat6h73s.js} +1 -1
  45. package/dist/{cli-e0ndxhtk.js → cli-cfkrztza.js} +190 -13
  46. package/dist/{cli-kc3dp84d.js → cli-d56tgd45.js} +216 -59
  47. package/dist/cli-dbmwby6a.js +9 -0
  48. package/dist/{cli-0n2e4x49.js → cli-ecfxwnyb.js} +15 -2
  49. package/dist/{cli-gzyh0j0g.js → cli-ee8bc46j.js} +66 -166
  50. package/dist/{cli-kdnehe0t.js → cli-et8m9xsv.js} +1 -1
  51. package/dist/cli-f9w1semm.js +413 -0
  52. package/dist/cli-gt4hxb8p.js +99 -0
  53. package/dist/{cli-qv4jv8bx.js → cli-hgmnf38m.js} +2 -2
  54. package/dist/{cli-10ym38qc.js → cli-hn04t9db.js} +3 -3
  55. package/dist/{cli-qvnnx4ct.js → cli-jpf7e1zq.js} +105 -243
  56. package/dist/cli-jyy6pm2f.js +333872 -0
  57. package/dist/{cli-dvjpkkjd.js → cli-kgd3p0bm.js} +7 -7
  58. package/dist/cli-ma3zvh39.js +10404 -0
  59. package/dist/{cli-r2ap2czm.js → cli-nexqx4ve.js} +6 -0
  60. package/dist/{cli-j9z8mfx3.js → cli-nsdxtcbg.js} +37 -20
  61. package/dist/{cli-wgjx0q33.js → cli-phfg8vy8.js} +392 -53
  62. package/dist/{cli-rgjprct3.js → cli-ptr8h7kp.js} +19 -1
  63. package/dist/{cli-s8s499xy.js → cli-qbksc292.js} +3 -2
  64. package/dist/{cli-bv0a38v9.js → cli-qwsnmjdd.js} +515 -229
  65. package/dist/{cli-68bmme5p.js → cli-r6fsxc76.js} +40018 -52654
  66. package/dist/{cli-rrqmqr1s.js → cli-rtx9dygp.js} +1 -1
  67. package/dist/{cli-rfezr056.js → cli-sqm3r5ps.js} +83 -15
  68. package/dist/{cli-zw65mab6.js → cli-t6v2ah3r.js} +67 -13
  69. package/dist/{cli-vn0qv9cj.js → cli-t845n9xk.js} +28 -14
  70. package/dist/cli-trc24wk2.js +143 -0
  71. package/dist/{cli-wd9hz40d.js → cli-tre4bdgq.js} +5 -5
  72. package/dist/{cli-9yg65c1j.js → cli-tsk3nz8a.js} +29 -1
  73. package/dist/{cli-phsaj4xq.js → cli-v0pvvhfq.js} +1 -1
  74. package/dist/{cli-hj65wsts.js → cli-vnnz5ncg.js} +4695 -4915
  75. package/dist/{cli-cpvsaqsw.js → cli-w0bwte75.js} +8 -5
  76. package/dist/{cli-z9x0sh1t.js → cli-we0q7t0e.js} +3 -3
  77. package/dist/{cli-r94z9p1z.js → cli-wgbezhw2.js} +3 -0
  78. package/dist/{cli-19jenss3.js → cli-xk79303e.js} +51 -17
  79. package/dist/{cli-31nkw3g3.js → cli-ybgv4kw2.js} +15 -8
  80. package/dist/{cli-ardpzhjm.js → cli-yrg7c73k.js} +13 -6
  81. package/dist/{cli-de1396j2.js → cli-ywybs5as.js} +7 -1
  82. package/dist/{cli-vhjwh6cz.js → cli-yy6dew39.js} +2 -2
  83. package/dist/{cli-bgv70kym.js → cli-zb6xbk61.js} +3 -2
  84. package/dist/{cli-4tvgz99m.js → cli-ze1d3wzv.js} +79 -27
  85. package/dist/cli.js +33 -32
  86. package/dist/{cloudflare-workers-ai-system-one-1sg586qv.js → cloudflare-workers-ai-system-one-k6fbxw9d.js} +2 -2
  87. package/dist/{codex-adapter-jqfqqa21.js → codex-adapter-04v97vep.js} +23 -20
  88. package/dist/{codex-hook-5eys3dya.js → codex-hook-20me6byw.js} +2 -2
  89. package/dist/{codex-login-he9vrn90.js → codex-login-cf7mzsgg.js} +48 -3
  90. package/dist/{codex-session-runner-zd341dsm.js → codex-session-runner-ax69mqq3.js} +21 -20
  91. package/dist/{commands-vfsysz4s.js → commands-18gy08n1.js} +12 -10
  92. package/dist/{db-s3znhvbn.js → db-d2pvjpyt.js} +22 -10
  93. package/dist/{devin-adapter-8vgkwh29.js → devin-adapter-dpsv6hd9.js} +1 -1
  94. package/dist/{dispatcher-5xn0c7rf.js → dispatcher-8wbwyzjg.js} +31 -29
  95. package/dist/{dsh-adapter-894mgfvs.js → dsh-adapter-ysqk9snv.js} +9 -4
  96. package/dist/{e2b-ez07znam.js → e2b-esmt1r16.js} +3 -1
  97. package/dist/{execute-71ysgv35.js → execute-cmagrbrz.js} +235 -52
  98. package/dist/{google-generative-ai-1nfcdphp.js → google-generative-ai-k6n5nbpp.js} +3 -3
  99. package/dist/{google-vertex-1tqcd7b1.js → google-vertex-44xxtcvp.js} +3 -3
  100. package/dist/{handlers-5w4jwycr.js → handlers-6b69m5kp.js} +34 -32
  101. package/dist/{hook-z0hbxj85.js → hook-k3mydf2n.js} +16 -14
  102. package/dist/{hook-853bxrr6.js → hook-srnkt0hb.js} +16 -14
  103. package/dist/{http-akc3wy3m.js → http-hrf80ca1.js} +836 -189
  104. package/dist/{index-ttpbhnjg.js → index-1asbaj62.js} +32 -30
  105. package/dist/{index-cd151qkq.js → index-45evq4ee.js} +31 -29
  106. package/dist/{index-k661dzzr.js → index-9rxdvj6w.js} +32 -30
  107. package/dist/index-k4nj18qs.js +31 -0
  108. package/dist/{index-5sz16ksh.js → index-xmevk2b9.js} +89 -61
  109. package/dist/{keepalive-8p9rpvz5.js → keepalive-sfdz6ksp.js} +14 -12
  110. package/dist/{lead-jp69z5h3.js → lead-ej91e9hw.js} +52 -50
  111. package/dist/{llama-cpp-classify-t2tccams.js → llama-cpp-classify-tgj35k8d.js} +1 -1
  112. package/dist/{maintenance-fwx4ev0k.js → maintenance-80dnd7ke.js} +15 -13
  113. package/dist/{mistral-conversations-bhvwqcnk.js → mistral-conversations-pc3ntnxt.js} +1 -1
  114. package/dist/node-f0ykebbv.js +2107 -0
  115. package/dist/node-wyamey5r.js +19 -0
  116. package/dist/{oauth-refresh-sweep-cwcq1ctx.js → oauth-refresh-sweep-m1etk2mx.js} +13 -11
  117. package/dist/{onboard-2b4q0t84.js → onboard-0q8sdfqc.js} +2 -2
  118. package/dist/{openai-codex-responses-nekthgks.js → openai-codex-responses-n7n683p2.js} +2 -2
  119. package/dist/{openai-completions-hxtzwj0s.js → openai-completions-jpaj5g2b.js} +2 -2
  120. package/dist/{openai-responses-w4r118w7.js → openai-responses-9a3nme9j.js} +3 -3
  121. package/dist/{opencode-adapter-zz7xvjj6.js → opencode-adapter-4wcgmvgf.js} +13 -11
  122. package/dist/{openrouter-images-b6sqqjgn.js → openrouter-images-8yx3487g.js} +1 -1
  123. package/dist/{otel-impl-g8rs4vwr.js → otel-impl-hnqm9mxq.js} +2 -2
  124. package/dist/pi-logo-animation-e9a0t68z.js +1003 -0
  125. package/dist/{pi-mono-adapter-n0me28wt.js → pi-mono-adapter-d6sqm9wr.js} +301 -78
  126. package/dist/{pricing-refresh-0v77385v.js → pricing-refresh-y60z64pm.js} +14 -13
  127. package/dist/quickjs-r1pq2107.wasm +0 -0
  128. package/dist/{rbac-roles-krjyazbj.js → rbac-roles-8pa0754b.js} +13 -11
  129. package/dist/{render-v2-3wjsp9aw.js → render-v2-418s1vj7.js} +13 -11
  130. package/dist/{runtime-ktjysacx.js → runtime-3pknc168.js} +5 -4
  131. package/dist/{setup-yeqryke6.js → setup-yghdkj4x.js} +2 -2
  132. package/dist/{typesafe-system-one-96960jxp.js → typesafe-system-one-2ef30pec.js} +2 -2
  133. package/dist/{virtual-modules-dzdeq1sf.js → virtual-modules-jcceevt5.js} +8 -6
  134. package/dist/{work-objects-3pakpkw0.js → work-objects-j1sz20v9.js} +34 -32
  135. package/dist/{worker-85testgj.js → worker-d4gcvkjt.js} +52 -50
  136. package/dist/{x-n3e0v3xa.js → x-f1gt1pz3.js} +2 -2
  137. package/openapi.json +587 -19
  138. package/package.json +16 -15
  139. package/src/azure-devops/api.ts +121 -0
  140. package/src/azure-devops/auth.ts +78 -0
  141. package/src/azure-devops/handlers.ts +413 -0
  142. package/src/azure-devops/index.ts +27 -0
  143. package/src/azure-devops/templates.ts +108 -0
  144. package/src/azure-devops/types.ts +90 -0
  145. package/src/be/db/api-keys.ts +70 -0
  146. package/src/be/db/tasks/read.ts +1 -1
  147. package/src/be/db/tasks/write.ts +16 -0
  148. package/src/be/db-client.ts +11 -2
  149. package/src/be/db-retention.ts +95 -32
  150. package/src/be/db.ts +187 -24
  151. package/src/be/memory/constants.ts +16 -0
  152. package/src/be/memory/graph-expansion.ts +8 -1
  153. package/src/be/memory/index-content.ts +20 -1
  154. package/src/be/memory/key-guard.ts +93 -0
  155. package/src/be/memory/key-paths.ts +103 -0
  156. package/src/be/memory/providers/sqlite-store.ts +203 -60
  157. package/src/be/memory/raters/llm-summarizer.ts +10 -4
  158. package/src/be/memory/raters/llm.ts +15 -5
  159. package/src/be/memory/raters/store.ts +6 -3
  160. package/src/be/memory/raters/types.ts +11 -0
  161. package/src/be/memory/reranker.ts +38 -7
  162. package/src/be/memory/types.ts +12 -1
  163. package/src/be/migrations/185_api_key_auth_failures.sql +6 -0
  164. package/src/be/migrations/186_api_key_seat_mismatch.sql +8 -0
  165. package/src/be/migrations/190_memory_rating_model.sql +7 -0
  166. package/src/be/migrations/191_context_versions_previous_index.sql +8 -0
  167. package/src/be/model-tier-keys.ts +16 -1
  168. package/src/be/model-tier-resolution.ts +63 -18
  169. package/src/be/model-validation.ts +86 -10
  170. package/src/be/pricing-normalize.ts +4 -2
  171. package/src/be/scripts/typecheck.ts +4 -3
  172. package/src/be/seed/runner.ts +18 -12
  173. package/src/be/seed/types.ts +1 -0
  174. package/src/be/seed-pricing.ts +16 -0
  175. package/src/be/seed-scripts/catalog/task-failure-audit.ts +26 -26
  176. package/src/be/swarm-config-guard.ts +13 -1
  177. package/src/commands/claude-managed-setup.ts +33 -31
  178. package/src/commands/codex-login.ts +67 -0
  179. package/src/commands/credential-outcome-report.ts +191 -0
  180. package/src/commands/provider-credentials.ts +28 -15
  181. package/src/commands/rate-limit-outcome.ts +34 -4
  182. package/src/commands/runner.ts +479 -228
  183. package/src/commands/seat-mismatch-report.ts +46 -0
  184. package/src/e2b/env.ts +2 -0
  185. package/src/extensions/apply-task-create.ts +27 -1
  186. package/src/extensions/catalog.generated.json +17 -0
  187. package/src/extensions/contract-types.generated.ts +1 -1
  188. package/src/github/handlers.ts +10 -74
  189. package/src/github/reactions.ts +119 -138
  190. package/src/github/task-reactions.ts +34 -11
  191. package/src/heartbeat/heartbeat.ts +15 -2
  192. package/src/hooks/hook.ts +1 -1
  193. package/src/http/agents.ts +15 -2
  194. package/src/http/api-keys.ts +140 -2
  195. package/src/http/codex-oauth-keep-warm.ts +3 -5
  196. package/src/http/core.ts +12 -0
  197. package/src/http/extensions.ts +51 -27
  198. package/src/http/index.ts +4 -0
  199. package/src/http/mcp-user.ts +8 -13
  200. package/src/http/mcp.ts +19 -12
  201. package/src/http/memory.ts +91 -18
  202. package/src/http/poll.ts +9 -1
  203. package/src/http/schedules.ts +17 -2
  204. package/src/http/script-runs.ts +12 -0
  205. package/src/http/session-data.ts +6 -4
  206. package/src/http/stats.ts +1 -0
  207. package/src/http/status.ts +15 -1
  208. package/src/http/tasks.ts +80 -8
  209. package/src/http/users.ts +1 -1
  210. package/src/http/webhooks.ts +120 -2
  211. package/src/http/workflows.ts +11 -0
  212. package/src/mcp-client/http-client.ts +5 -0
  213. package/src/memory/recall-query.ts +74 -0
  214. package/src/prompts/base-prompt.ts +15 -4
  215. package/src/prompts/session-templates.ts +22 -1
  216. package/src/providers/acp-adapter.ts +1 -0
  217. package/src/providers/claude-adapter.ts +98 -21
  218. package/src/providers/claude-managed-adapter.ts +30 -2
  219. package/src/providers/claude-sdk-session.ts +3 -1
  220. package/src/providers/codex-adapter.ts +11 -11
  221. package/src/providers/codex-skill-resolver.ts +6 -0
  222. package/src/providers/devin-adapter.ts +1 -0
  223. package/src/providers/dsh-adapter.ts +205 -7
  224. package/src/providers/harness-version.ts +83 -7
  225. package/src/providers/opencode-adapter.ts +77 -4
  226. package/src/providers/pi-binary-root/src/extensions/codemode/worker.ts +11 -0
  227. package/src/providers/pi-codemode-runtime.ts +17 -0
  228. package/src/providers/pi-mono-adapter.ts +387 -83
  229. package/src/providers/pi-mono-extension.ts +17 -2
  230. package/src/providers/pricing-sources.md +5 -1
  231. package/src/providers/reasoning-effort.ts +10 -2
  232. package/src/providers/types.ts +9 -1
  233. package/src/rbac/legacy-policy.ts +20 -0
  234. package/src/rbac/permissions.ts +15 -0
  235. package/src/scripts-runtime/types/stdlib.d.ts +13 -5
  236. package/src/scripts-runtime/types/swarm-extension.d.ts +4 -2
  237. package/src/scripts-runtime/types/swarm-sdk.d.ts +13 -5
  238. package/src/slack/assistant.ts +13 -0
  239. package/src/slack/render-v2.ts +87 -37
  240. package/src/slack/session-status.ts +541 -0
  241. package/src/tasks/context-key.ts +38 -1
  242. package/src/tasks/sibling-awareness.ts +3 -2
  243. package/src/telemetry.ts +5 -4
  244. package/src/templates.d.ts +6 -0
  245. package/src/tests/api-key-auth-failure-route.test.ts +142 -0
  246. package/src/tests/api-key-tracking.test.ts +368 -1
  247. package/src/tests/azure-devops-auth.test.ts +100 -0
  248. package/src/tests/azure-devops-handlers.test.ts +324 -0
  249. package/src/tests/azure-devops-webhook-malformed.test.ts +96 -0
  250. package/src/tests/base-prompt.test.ts +40 -2
  251. package/src/tests/claude-adapter.test.ts +58 -0
  252. package/src/tests/claude-default-route.test.ts +260 -0
  253. package/src/tests/claude-managed-adapter.test.ts +47 -0
  254. package/src/tests/claude-managed-setup.test.ts +48 -0
  255. package/src/tests/claude-prompt-body-once.test.ts +117 -0
  256. package/src/tests/claude-routes-e2e.test.ts +316 -0
  257. package/src/tests/codex-auth-failure.test.ts +52 -0
  258. package/src/tests/codex-login.test.ts +116 -0
  259. package/src/tests/context-versions-retention.test.ts +314 -0
  260. package/src/tests/core-auth.test.ts +7 -0
  261. package/src/tests/credential-exhaustion-policy.test.ts +118 -3
  262. package/src/tests/credential-outcome-report.test.ts +171 -0
  263. package/src/tests/credential-status-api.test.ts +103 -2
  264. package/src/tests/db-retention.test.ts +14 -14
  265. package/src/tests/db-task-read-contract.test.ts +6 -0
  266. package/src/tests/db-task-write-contract.test.ts +533 -1
  267. package/src/tests/docs-index-footprint.test.js +3 -3
  268. package/src/tests/dokploy-deploy.test.ts +315 -0
  269. package/src/tests/dsh-adapter.test.ts +134 -2
  270. package/src/tests/dsh-usage.test.ts +153 -0
  271. package/src/tests/explicit-model-validation.test.ts +253 -2
  272. package/src/tests/extensions-catalog.test.ts +1 -0
  273. package/src/tests/extensions-example-deploy-awareness.test.ts +301 -0
  274. package/src/tests/extensions-http.test.ts +137 -10
  275. package/src/tests/extensions-mcp-tools.test.ts +28 -0
  276. package/src/tests/extensions-pre-task.test.ts +73 -0
  277. package/src/tests/fetch-resolved-env.test.ts +70 -0
  278. package/src/tests/fixtures/azure-devops/pull-request-commented.json +129 -0
  279. package/src/tests/fixtures/azure-devops/pull-request-created.json +88 -0
  280. package/src/tests/fixtures/fake-claude-routes.ts +229 -0
  281. package/src/tests/github-handlers-reactions.test.ts +486 -0
  282. package/src/tests/github-reactions.test.ts +280 -0
  283. package/src/tests/hang-watchdog-worker.ts +47 -0
  284. package/src/tests/hang-watchdog.test.ts +45 -0
  285. package/src/tests/hang-watchdog.ts +30 -0
  286. package/src/tests/harness-cli-version.test.ts +62 -0
  287. package/src/tests/harness-model-guard.test.ts +123 -0
  288. package/src/tests/harness-version.test.ts +70 -3
  289. package/src/tests/http-api-integration.test.ts +21 -0
  290. package/src/tests/http-task-write-ownership.test.ts +195 -0
  291. package/src/tests/internal-ai/complete-structured.test.ts +94 -0
  292. package/src/tests/internal-ai/credentials.test.ts +22 -0
  293. package/src/tests/internal-ai/models.test.ts +36 -2
  294. package/src/tests/internal-ai/schema-parity.test.ts +25 -1
  295. package/src/tests/internal-ai/summarize-session.test.ts +23 -7
  296. package/src/tests/mcp-user-route.test.ts +133 -0
  297. package/src/tests/memory-fts-populate.test.ts +139 -0
  298. package/src/tests/memory-http-recall-gating.test.ts +125 -1
  299. package/src/tests/memory-key-paths.test.ts +1055 -0
  300. package/src/tests/memory-rate-endpoint.test.ts +66 -0
  301. package/src/tests/memory-rater-llm-summarizer.test.ts +2 -1
  302. package/src/tests/memory-rater-llm.test.ts +73 -0
  303. package/src/tests/memory-rater-store.test.ts +31 -0
  304. package/src/tests/memory-reranker.test.ts +40 -0
  305. package/src/tests/model-rate-limit-windows.test.ts +19 -0
  306. package/src/tests/model-tier-resolution.test.ts +92 -0
  307. package/src/tests/opencode-adapter.test.ts +214 -2
  308. package/src/tests/opencode-plugin.test.ts +4 -0
  309. package/src/tests/pi-codemode.test.ts +324 -0
  310. package/src/tests/pi-mono-adapter.test.ts +3 -0
  311. package/src/tests/pi-native-mcp.test.ts +193 -0
  312. package/src/tests/pi-tool-exposure.test.ts +374 -0
  313. package/src/tests/preload.ts +9 -0
  314. package/src/tests/prompt-template-session.test.ts +5 -3
  315. package/src/tests/provider-registration.test.ts +0 -2
  316. package/src/tests/providers/pi-cost.test.ts +190 -4
  317. package/src/tests/rate-limit-event.test.ts +65 -0
  318. package/src/tests/rate-limit-outcome.test.ts +90 -0
  319. package/src/tests/rbac-engine.test.ts +41 -2
  320. package/src/tests/runner-key-completion-outcome.test.ts +112 -0
  321. package/src/tests/runner-key-outcome-late-reset.test.ts +224 -0
  322. package/src/tests/runner-registration-retry.test.ts +149 -0
  323. package/src/tests/runner-slot-reconcile.test.ts +199 -0
  324. package/src/tests/script-connections.test.ts +8 -0
  325. package/src/tests/seat-mismatch-report.test.ts +85 -0
  326. package/src/tests/seed-scripts.test.ts +49 -0
  327. package/src/tests/seed.test.ts +25 -0
  328. package/src/tests/session-costs-recompute-all-providers.test.ts +23 -0
  329. package/src/tests/slack-render-v2.test.ts +96 -0
  330. package/src/tests/slack-session-status.test.ts +626 -0
  331. package/src/tests/status.test.ts +29 -0
  332. package/src/tests/steering-promotion.test.ts +51 -0
  333. package/src/tests/store-progress-ownership.test.ts +136 -0
  334. package/src/tests/subscription-plans.test.ts +28 -0
  335. package/src/tests/task-citations.test.ts +3 -2
  336. package/src/tests/task-reactions.test.ts +29 -6
  337. package/src/tests/vcs-azure-devops.test.ts +73 -0
  338. package/src/tests/webhooks-task-blocked.test.ts +23 -0
  339. package/src/tests/workflow-agent-task.test.ts +30 -0
  340. package/src/tests/workflow-llm.test.ts +14 -0
  341. package/src/tests/workflow-triggers-v2.test.ts +320 -0
  342. package/src/tools/context-diff.ts +20 -0
  343. package/src/tools/extension-install.ts +27 -16
  344. package/src/tools/memory-edit.ts +47 -3
  345. package/src/tools/memory-search.ts +13 -1
  346. package/src/tools/memory-store.ts +55 -3
  347. package/src/tools/schedules/create-schedule.ts +1 -1
  348. package/src/tools/schedules/patch-schedule.ts +16 -3
  349. package/src/tools/schedules/update-schedule.ts +16 -3
  350. package/src/tools/send-task.ts +10 -7
  351. package/src/tools/store-progress.ts +49 -4
  352. package/src/tools/task-action.ts +2 -1
  353. package/src/tools/workflows/create-workflow.ts +8 -2
  354. package/src/tools/workflows/update-workflow.ts +8 -2
  355. package/src/types.ts +54 -7
  356. package/src/utils/codex-auth-failure.ts +34 -0
  357. package/src/utils/credentials.test.ts +31 -1
  358. package/src/utils/credentials.ts +92 -39
  359. package/src/utils/dsh-usage.ts +53 -0
  360. package/src/utils/error-tracker.ts +80 -0
  361. package/src/utils/harness-cli-version.ts +6 -4
  362. package/src/utils/internal-ai/complete-structured.ts +26 -3
  363. package/src/utils/internal-ai/credentials.ts +23 -9
  364. package/src/utils/internal-ai/index.ts +8 -1
  365. package/src/utils/internal-ai/models.ts +34 -8
  366. package/src/utils/internal-ai/summarize-session.ts +22 -8
  367. package/src/utils/model-rate-limit-windows.ts +12 -0
  368. package/src/utils/runtime-model-catalog.ts +15 -0
  369. package/src/utils/secret-scrubber.ts +8 -0
  370. package/src/utils/spawn-model-guard.ts +43 -0
  371. package/src/utils/subscription-plans.ts +22 -0
  372. package/src/vcs/azure-devops.ts +80 -0
  373. package/src/vcs/index.ts +5 -1
  374. package/src/vcs/types.ts +2 -2
  375. package/src/workflows/executors/agent-task.ts +7 -6
  376. package/src/workflows/model-validation.ts +45 -0
  377. package/src/workflows/patch-definition.ts +5 -0
  378. package/src/workflows/triggers.ts +85 -0
  379. package/templates/community/open-prompt-showreel/PLAYBOOK.md +336 -0
  380. package/templates/community/open-prompt-showreel/README.md +33 -0
  381. package/templates/community/open-prompt-showreel/example/tla-races/facts.ts +145 -0
  382. package/templates/community/open-prompt-showreel/example/tla-races/facts.v3.json +140 -0
  383. package/templates/community/open-prompt-showreel/example/tla-races/music.mist-city.json +8 -0
  384. package/templates/community/open-prompt-showreel/example/tla-races/reel.html +805 -0
  385. package/templates/community/open-prompt-showreel/example/tla-races/smoke.sh +48 -0
  386. package/templates/community/open-prompt-showreel/lead-prompt.md +89 -0
  387. package/templates/community/open-prompt-showreel/setup.sh +167 -0
  388. package/templates/community/open-prompt-showreel/skills/motion-design-replication/SKILL.md +85 -0
  389. package/templates/community/open-prompt-showreel/skills/motion-design-video-analysis/SKILL.md +115 -0
  390. package/templates/community/open-prompt-showreel/skills/open-prompt-showreel/SKILL.md +147 -0
  391. package/templates/community/open-prompt-showreel/skills/video-generation/SKILL.md +195 -0
  392. package/templates/community/open-prompt-showreel/tools/fetch-music.sh +65 -0
  393. package/templates/community/open-prompt-showreel/tools/music-analyze.py +69 -0
  394. package/templates/community/open-prompt-showreel/tools/music-current.sh +34 -0
  395. package/templates/community/open-prompt-showreel/tools/music-cut.sh +36 -0
  396. package/templates/community/open-prompt-showreel/tools/music-refine.py +39 -0
  397. package/templates/community/open-prompt-showreel/tools/render.mjs +157 -0
  398. package/templates/community/open-prompt-showreel/tools/sheet.sh +44 -0
  399. package/templates/community/open-prompt-showreel/tools/web-compress.sh +17 -0
  400. package/templates/community/open-prompt-showreel/tools/x-reencode.sh +21 -0
  401. package/templates/extensions/README.md +1 -0
  402. package/templates/extensions/deploy-awareness/README.md +28 -0
  403. package/templates/extensions/deploy-awareness/hooks.ts +152 -0
  404. package/templates/extensions/deploy-awareness/manifest.json +8 -0
  405. package/templates/skills/memory/config.json +2 -2
  406. package/templates/skills/memory/content.md +59 -5
  407. package/templates/skills/swarm-extensions/config.json +1 -1
  408. package/templates/skills/swarm-extensions/content.md +28 -5
  409. package/templates/skills/workflow-iterate/content.md +1 -0
  410. package/dist/boot-seeds-h7c32hvm.js +0 -27
  411. package/dist/cli-2djtr51b.js +0 -48
  412. package/dist/cli-7zttzetj.js +0 -324
  413. package/dist/cli-j490egb5.js +0 -5632
  414. package/dist/cli-m4excttz.js +0 -333481
  415. package/dist/index-bjmjh9h4.js +0 -29
@@ -12,14 +12,14 @@ import {
12
12
  import {
13
13
  DEFAULT_MODEL,
14
14
  resolveCredential
15
- } from "./cli-rfezr056.js";
15
+ } from "./cli-sqm3r5ps.js";
16
16
  import {
17
17
  DEFAULT_OPENROUTER_BASE_URL,
18
18
  getOpenRouterBaseUrl
19
19
  } from "./cli-3dpj7atn.js";
20
20
  import {
21
21
  embedScript
22
- } from "./cli-vwbbaecp.js";
22
+ } from "./cli-7119ja3w.js";
23
23
  import {
24
24
  calculatePKCECodeChallenge,
25
25
  ensureAuthorizationTokenOrThrow,
@@ -31,10 +31,10 @@ import {
31
31
  oauthAppRowToProviderConfig,
32
32
  updateAuthorizationTokens,
33
33
  upsertAuthorization
34
- } from "./cli-qv4jv8bx.js";
34
+ } from "./cli-hgmnf38m.js";
35
35
  import {
36
36
  getSlackApp
37
- } from "./cli-wgjx0q33.js";
37
+ } from "./cli-phfg8vy8.js";
38
38
  import {
39
39
  CredentialBroker,
40
40
  DEFAULT_CREDENTIAL_BINDINGS,
@@ -59,17 +59,17 @@ import {
59
59
  placeholderForConfigKey,
60
60
  releaseApprovalCancellationNotificationClaim,
61
61
  upsertSwarmConfig
62
- } from "./cli-g9df2m37.js";
62
+ } from "./cli-1cz0c18q.js";
63
63
  import {
64
64
  TERMINAL_TASK_STATUSES,
65
65
  defaultAssetKey,
66
66
  init_key,
67
67
  init_types
68
- } from "./cli-e4xnc0qp.js";
68
+ } from "./cli-akfj32vj.js";
69
69
  import {
70
70
  init_resolver,
71
71
  resolveTemplate
72
- } from "./cli-rgjprct3.js";
72
+ } from "./cli-ptr8h7kp.js";
73
73
  import {
74
74
  getAppUrl,
75
75
  init_constants
@@ -102,7 +102,7 @@ import {
102
102
  registerVolatileSecret,
103
103
  scrubObject,
104
104
  scrubSecrets
105
- } from "./cli-r2ap2czm.js";
105
+ } from "./cli-nexqx4ve.js";
106
106
  import {
107
107
  __commonJS,
108
108
  __require,
@@ -175590,7 +175590,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
175590
175590
  }
175591
175591
  if (notification.channel === "slack") {
175592
175592
  try {
175593
- const { getSlackApp: getSlackApp2 } = await import("./app-y1b9srva.js");
175593
+ const { getSlackApp: getSlackApp2 } = await import("./app-0hdqa4k1.js");
175594
175594
  const slackApp = getSlackApp2();
175595
175595
  if (!slackApp) {
175596
175596
  console.warn("[HITL] Slack not initialized — cannot send notification");
@@ -184059,7 +184059,7 @@ export interface RoomDecoded {
184059
184059
 
184060
184060
  export interface SwarmSdk {
184061
184061
  // --- memory ---
184062
- memory_search(args: { query: string; intent: string; scope?: "all" | "agent" | "swarm"; limit?: number; source?: string }): Promise<unknown>;
184062
+ memory_search(args: { query: string; intent: string; scope?: "all" | "agent" | "swarm"; limit?: number; source?: string; keyPrefix?: string }): Promise<unknown>;
184063
184063
  memory_get(args: { memoryId: string; intent: string }): Promise<unknown>;
184064
184064
  memory_rate(args: { id: string; useful: boolean; note?: string }): Promise<unknown>;
184065
184065
  // --- tasks ---
@@ -184132,7 +184132,7 @@ export interface SwarmSdk {
184132
184132
 
184133
184133
  // --- write: memory ---
184134
184134
  memory_delete(args: { id: string }): Promise<unknown>;
184135
- memory_store(args: { content: string; name: string; scope?: "agent" | "swarm"; tags?: string[]; taskId?: string; intent?: string }): Promise<unknown>;
184135
+ memory_store(args: { content: string; name: string; scope?: "agent" | "swarm"; tags?: string[]; taskId?: string; intent?: string; key?: string }): Promise<unknown>;
184136
184136
  memory_edit(args: {
184137
184137
  memoryId?: string;
184138
184138
  key?: string;
@@ -184143,6 +184143,7 @@ export interface SwarmSdk {
184143
184143
  newString?: string;
184144
184144
  intent: string;
184145
184145
  expectedVersion?: number;
184146
+ newKey?: string;
184146
184147
  }): Promise<unknown>;
184147
184148
  inject_learning(args: { content: string; name?: string; scope?: "agent" | "swarm"; source?: string; tags?: string[] }): Promise<unknown>;
184148
184149
 
@@ -184226,7 +184227,7 @@ export interface SwarmSdk {
184226
184227
 
184227
184228
  // --- write: extensions ---
184228
184229
  extension_catalog(args?: Record<string, never>): Promise<unknown>;
184229
- extension_install(args: { template: string; priority?: number; config?: Record<string, unknown> }): Promise<unknown>;
184230
+ extension_install(args: { template: string; priority?: number; config?: Record<string, unknown> } | { manifest: Record<string, unknown>; files: Record<string, string>; priority?: number; config?: Record<string, unknown> }): Promise<unknown>;
184230
184231
  extension_list(args?: { enabledOnly?: boolean }): Promise<unknown>;
184231
184232
  extension_delete(args: { id: string }): Promise<unknown>;
184232
184233
  extension_enable(args: { id: string }): Promise<unknown>;
@@ -1,15 +1,16 @@
1
- import {
2
- runtimeCatalogModel,
3
- runtimeCatalogSection
4
- } from "./cli-m4excttz.js";
5
1
  import {
6
2
  claudeCatalogModelId,
3
+ dshCatalogRef,
4
+ init_runtime_model_catalog,
7
5
  init_src,
8
- reasoningLevelsFor
9
- } from "./cli-7zttzetj.js";
6
+ reasoningLevelsFor,
7
+ runtimeCatalogModel,
8
+ runtimeCatalogSection
9
+ } from "./cli-jyy6pm2f.js";
10
10
 
11
11
  // src/providers/reasoning-effort.ts
12
12
  init_src();
13
+ init_runtime_model_catalog();
13
14
  function splitProviderModel(model) {
14
15
  const slash = model.indexOf("/");
15
16
  if (slash === -1)
@@ -27,6 +28,8 @@ function lookupModel(harness, model) {
27
28
  } else if (harness === "codex") {
28
29
  providerId = "openai";
29
30
  modelId = model;
31
+ } else if (harness === "dsh") {
32
+ ({ providerId, modelId } = dshCatalogRef(model));
30
33
  } else {
31
34
  ({ providerId, modelId } = splitProviderModel(model));
32
35
  if (!providerId)
@@ -105,6 +108,8 @@ function applyReasoningEffort(harness, model, level) {
105
108
  return applyPiEffort(level);
106
109
  case "opencode":
107
110
  return applyOpencodeEffort(model, level);
111
+ case "dsh":
112
+ return { kind: "dsh-effort", reasoningEffort: level };
108
113
  default: {
109
114
  const _exhaustive = harness;
110
115
  return _exhaustive;
@@ -3,7 +3,7 @@ import {
3
3
  init_model_rate_limit_windows,
4
4
  isModelScopedWindow,
5
5
  parseModelLimitMessage
6
- } from "./cli-de1396j2.js";
6
+ } from "./cli-ywybs5as.js";
7
7
 
8
8
  // src/utils/error-tracker.ts
9
9
  init_model_rate_limit_windows();
@@ -62,6 +62,39 @@ function parseRateLimitWindowTelemetry(json, lastSeenAt = new Date().toISOString
62
62
  return null;
63
63
  }
64
64
  }
65
+ var SEAT_PAYLOAD_FIELDS = [
66
+ "overageDisabledReason",
67
+ "canUserPurchaseCredits",
68
+ "hasChargeableSavedPaymentMethod"
69
+ ];
70
+ function redactRateLimitEvent(message) {
71
+ if (!message || typeof message !== "object")
72
+ return message;
73
+ const json = message;
74
+ if (json.type !== "rate_limit_event")
75
+ return message;
76
+ const info = json.rate_limit_info;
77
+ if (!info || typeof info !== "object")
78
+ return message;
79
+ if (!SEAT_PAYLOAD_FIELDS.some((field) => (field in info)))
80
+ return message;
81
+ const redactedInfo = { ...info };
82
+ for (const field of SEAT_PAYLOAD_FIELDS)
83
+ delete redactedInfo[field];
84
+ return { ...json, rate_limit_info: redactedInfo };
85
+ }
86
+ function redactRateLimitEventLine(line) {
87
+ if (!line.includes('"rate_limit_event"'))
88
+ return line;
89
+ let parsed;
90
+ try {
91
+ parsed = JSON.parse(line);
92
+ } catch {
93
+ return line;
94
+ }
95
+ const redacted = redactRateLimitEvent(parsed);
96
+ return redacted === parsed ? line : JSON.stringify(redacted);
97
+ }
65
98
  var MAX_RATE_LIMIT_RESET_MS = 7 * 24 * 60 * 60 * 1000;
66
99
  function isRateLimitMessage(s) {
67
100
  return /rate.?limit|hit your[\w\s-]*limit|usage[ _-]?limit|too many requests|\b429\b/i.test(s) || isCodexCreditsExhaustedMessage(s);
@@ -91,6 +124,7 @@ class SessionErrorTracker {
91
124
  errors = [];
92
125
  keyWideRejections = new Map;
93
126
  modelRateLimit;
127
+ creditsRequired;
94
128
  rateLimitWindows = {};
95
129
  addApiError(errorCategory, message) {
96
130
  this.errors.push({
@@ -149,6 +183,14 @@ class SessionErrorTracker {
149
183
  }
150
184
  return;
151
185
  }
186
+ if (info.errorCode === "credits_required") {
187
+ this.creditsRequired = {
188
+ observedAt,
189
+ resetsAtMs: typeof info.resetsAt === "number" && Number.isFinite(info.resetsAt) ? info.resetsAt * 1000 : undefined,
190
+ overageDisabledReason: typeof info.overageDisabledReason === "string" ? info.overageDisabledReason : undefined
191
+ };
192
+ return;
193
+ }
152
194
  const resetsAtSec = info.resetsAt;
153
195
  if (typeof resetsAtSec !== "number" || !Number.isFinite(resetsAtSec) || resetsAtSec <= 0) {
154
196
  console.warn(`[rate_limit_event] Malformed resetsAt value: ${JSON.stringify(resetsAtSec)} — ignoring`);
@@ -202,6 +244,14 @@ class SessionErrorTracker {
202
244
  observedAt: this.modelRateLimit.observedAt
203
245
  };
204
246
  }
247
+ getCreditsRequired() {
248
+ if (!this.creditsRequired)
249
+ return;
250
+ return {
251
+ observedAt: this.creditsRequired.observedAt,
252
+ overageDisabledReason: this.creditsRequired.overageDisabledReason
253
+ };
254
+ }
205
255
  hasErrors() {
206
256
  return this.errors.length > 0;
207
257
  }
@@ -434,4 +484,4 @@ function parseStderrForErrors(stderr, tracker) {
434
484
  }
435
485
  }
436
486
 
437
- export { MAX_RATE_LIMIT_RESET_MS, isRateLimitMessage, isCodexCreditsExhaustedMessage, CODEX_CREDITS_EXHAUSTED_COOLDOWN_MS, resolveCodexCreditsExhaustedCooldownMs, SessionErrorTracker, trackErrorFromJson, parseRateLimitResetTime, parseStderrForErrors };
487
+ export { redactRateLimitEvent, redactRateLimitEventLine, MAX_RATE_LIMIT_RESET_MS, isRateLimitMessage, isCodexCreditsExhaustedMessage, CODEX_CREDITS_EXHAUSTED_COOLDOWN_MS, resolveCodexCreditsExhaustedCooldownMs, SessionErrorTracker, trackErrorFromJson, parseRateLimitResetTime, parseStderrForErrors };
@@ -1,5 +1,5 @@
1
1
  // node_modules/@earendil-works/pi-ai/dist/utils/oauth-page.js
2
- var LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#fff" fill-rule="evenodd" d="M165.29 165.29 H517.36 V400 H400 V517.36 H282.65 V634.72 H165.29 Z M282.65 282.65 V400 H400 V282.65 Z"/><path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/></svg>`;
2
+ var LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#F09082" d="M165.29 165.29H517.36V400H400V282.65H165.29Z"/><path fill="#4D9ABF" d="M165.29 282.65H282.65V400H400V517.36H282.65V634.72H165.29Z"/><path fill="#F1BE58" d="M517.36 400H634.72V634.72H517.36Z"/></svg>`;
3
3
  function escapeHtml(value) {
4
4
  return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5
5
  }
@@ -1,157 +1,18 @@
1
1
  import {
2
- require_proper_lockfile
3
- } from "./cli-ejpygnqz.js";
2
+ mcpNamespace,
3
+ require_proper_lockfile,
4
+ validateMcpServerConfig
5
+ } from "./cli-bh7jed3k.js";
4
6
  import {
5
7
  CONFIG_DIR_NAME,
6
8
  canonicalizePath,
7
9
  resolvePath,
8
10
  stripBom
9
- } from "./cli-hj65wsts.js";
11
+ } from "./cli-vnnz5ncg.js";
10
12
  import {
11
13
  __toESM
12
14
  } from "./cli-bc05qbss.js";
13
15
 
14
- // node_modules/@earendil-works/pi-coding-agent/dist/core/mcp-servers.js
15
- var MCP_EXPOSURES = [
16
- "codemode",
17
- "codemode-deferred",
18
- "deferred",
19
- "direct",
20
- "hidden"
21
- ];
22
- var LOOPBACK_HOSTS = ["localhost", "127.0.0.1", "[::1]"];
23
- function isLoopbackRedirectUri(value) {
24
- if (!URL.canParse(value))
25
- return false;
26
- const url = new URL(value);
27
- return url.protocol === "http:" && LOOPBACK_HOSTS.includes(url.hostname) && url.search === "" && url.hash === "";
28
- }
29
- var SERVER_NAME = /^[A-Za-z0-9_-]+$/;
30
- function isRecord(value) {
31
- return typeof value === "object" && value !== null && !Array.isArray(value);
32
- }
33
- function isStringRecord(value) {
34
- return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
35
- }
36
- function validateOAuth(value) {
37
- if (value === undefined)
38
- return;
39
- if (!isRecord(value))
40
- return "oauth must be an object";
41
- if (value.clientId !== undefined && typeof value.clientId !== "string")
42
- return "oauth.clientId must be a string";
43
- if (value.clientSecret !== undefined && typeof value.clientSecret !== "string") {
44
- return "oauth.clientSecret must be a string";
45
- }
46
- const port = value.callbackPort;
47
- if (port !== undefined && (typeof port !== "number" || !Number.isInteger(port) || port < 1 || port > 65535)) {
48
- return "oauth.callbackPort must be a port number";
49
- }
50
- if (value.callbackUrl !== undefined) {
51
- if (typeof value.callbackUrl !== "string" || !isLoopbackRedirectUri(value.callbackUrl)) {
52
- return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
53
- }
54
- const urlPort = new URL(value.callbackUrl).port;
55
- if (urlPort && port !== undefined && Number(urlPort) !== port) {
56
- return "oauth.callbackUrl and oauth.callbackPort name different ports";
57
- }
58
- }
59
- if (value.scope !== undefined && typeof value.scope !== "string")
60
- return "oauth.scope must be a string";
61
- return;
62
- }
63
- function isExposure(value) {
64
- return typeof value === "string" && MCP_EXPOSURES.includes(value);
65
- }
66
- function toolPatternRegExp(pattern) {
67
- const source = pattern.split("*").map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&")).join(".*");
68
- return new RegExp(`^${source}$`);
69
- }
70
- function getMcpToolExposure(config, toolName) {
71
- const overrides = config.toolExposure ?? {};
72
- const exact = overrides[toolName];
73
- if (exact !== undefined)
74
- return exact;
75
- for (const [pattern, exposure] of Object.entries(overrides)) {
76
- if (pattern.includes("*") && toolPatternRegExp(pattern).test(toolName))
77
- return exposure;
78
- }
79
- return config.exposure ?? "codemode";
80
- }
81
- function validateMcpServerConfig(name, value) {
82
- if (!SERVER_NAME.test(name))
83
- return `invalid server name "${name}" (use letters, digits, "_" and "-")`;
84
- if (!isRecord(value))
85
- return `server "${name}" must be an object`;
86
- const { type, exposure, enabled, timeout, toolExposure } = value;
87
- const exposures = MCP_EXPOSURES.map((value2) => `"${value2}"`).join(", ");
88
- if (exposure !== undefined && !isExposure(exposure)) {
89
- return `server "${name}": exposure must be one of ${exposures}`;
90
- }
91
- if (toolExposure !== undefined) {
92
- if (!isRecord(toolExposure))
93
- return `server "${name}": toolExposure must map tool names to exposures`;
94
- for (const [tool, value2] of Object.entries(toolExposure)) {
95
- if (!isExposure(value2))
96
- return `server "${name}": toolExposure "${tool}" must be one of ${exposures}`;
97
- }
98
- }
99
- if (enabled !== undefined && typeof enabled !== "boolean")
100
- return `server "${name}": enabled must be a boolean`;
101
- if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0))) {
102
- return `server "${name}": timeout must be a positive number of seconds`;
103
- }
104
- if (type === "sse")
105
- return `server "${name}": legacy SSE transport is not supported; use the streamable HTTP URL`;
106
- if (typeof value.url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
107
- if (!URL.canParse(value.url) || !/^https?:$/.test(new URL(value.url).protocol)) {
108
- return `server "${name}": url must be an http or https URL`;
109
- }
110
- if (value.headers !== undefined && !isStringRecord(value.headers)) {
111
- return `server "${name}": headers must map names to strings`;
112
- }
113
- const oauthError = validateOAuth(value.oauth);
114
- if (oauthError)
115
- return `server "${name}": ${oauthError}`;
116
- return value;
117
- }
118
- if (typeof value.command === "string" && (type === undefined || type === "stdio")) {
119
- if (value.args !== undefined && !(Array.isArray(value.args) && value.args.every((arg) => typeof arg === "string"))) {
120
- return `server "${name}": args must be an array of strings`;
121
- }
122
- if (value.env !== undefined && !isStringRecord(value.env))
123
- return `server "${name}": env must map names to strings`;
124
- if (value.cwd !== undefined && typeof value.cwd !== "string")
125
- return `server "${name}": cwd must be a string`;
126
- return value;
127
- }
128
- return `server "${name}" needs either "command" (stdio) or "url" (streamable HTTP)`;
129
- }
130
-
131
- class McpServerRegistry {
132
- servers = new Map;
133
- changeListener;
134
- register(server) {
135
- this.servers.set(server.name, server);
136
- this.changeListener?.();
137
- }
138
- unregister(name, extensionPath) {
139
- if (this.servers.get(name)?.extensionPath !== extensionPath)
140
- return;
141
- this.servers.delete(name);
142
- this.changeListener?.();
143
- }
144
- get(name) {
145
- return this.servers.get(name);
146
- }
147
- list() {
148
- return [...this.servers.values()].map((server) => ({ ...server, config: structuredClone(server.config) }));
149
- }
150
- setChangeListener(listener) {
151
- this.changeListener = listener;
152
- }
153
- }
154
-
155
16
  // node_modules/@earendil-works/pi-coding-agent/dist/core/trust-manager.js
156
17
  var import_proper_lockfile = __toESM(require_proper_lockfile(), 1);
157
18
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -351,7 +212,7 @@ function openBrowser(target) {
351
212
  // node_modules/@earendil-works/pi-coding-agent/dist/extensions/mcp/config.js
352
213
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "node:fs";
353
214
  import { dirname as dirname2, join as join2 } from "node:path";
354
- function isRecord2(value) {
215
+ function isRecord(value) {
355
216
  return typeof value === "object" && value !== null && !Array.isArray(value);
356
217
  }
357
218
  function readConfigFile(path, scope, state) {
@@ -365,7 +226,7 @@ function readConfigFile(path, scope, state) {
365
226
  errors.push(`${path}: ${error instanceof Error ? error.message : String(error)}`);
366
227
  return;
367
228
  }
368
- if (!isRecord2(parsed) || parsed.mcpServers !== undefined && !isRecord2(parsed.mcpServers)) {
229
+ if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
369
230
  errors.push(`${path}: expected an object with an "mcpServers" object`);
370
231
  return;
371
232
  }
@@ -379,6 +240,15 @@ function readConfigFile(path, scope, state) {
379
240
  errors.push(`${path}: ${config}`);
380
241
  continue;
381
242
  }
243
+ const clash = [...servers.keys()].find((other) => other !== name && mcpNamespace(other) === mcpNamespace(name));
244
+ if (clash) {
245
+ errors.push(`${path}: server "${name}" conflicts with "${clash}"`);
246
+ continue;
247
+ }
248
+ if (scope === "project" && "url" in config && config.auth) {
249
+ errors.push(`${path}: server "${name}": auth is only allowed in the global mcp.json`);
250
+ continue;
251
+ }
382
252
  servers.set(name, { name, config, source: path, scope });
383
253
  }
384
254
  }
@@ -396,7 +266,7 @@ function loadMcpConfig(options) {
396
266
  function updateMcpServerConfig(path, name, patch) {
397
267
  editMcpServers(path, (servers) => {
398
268
  const server = servers?.[name];
399
- if (!isRecord2(server))
269
+ if (!isRecord(server))
400
270
  throw new Error(`${path} does not define MCP server "${name}"`);
401
271
  if (patch.enabled !== undefined) {
402
272
  if (patch.enabled)
@@ -440,10 +310,10 @@ function removeMcpServerConfig(path, name) {
440
310
  function editMcpServers(path, edit) {
441
311
  const text = existsSync2(path) ? readFileSync2(path, "utf8") : undefined;
442
312
  const parsed = text === undefined ? {} : JSON.parse(text);
443
- if (!isRecord2(parsed) || parsed.mcpServers !== undefined && !isRecord2(parsed.mcpServers)) {
313
+ if (!isRecord(parsed) || parsed.mcpServers !== undefined && !isRecord(parsed.mcpServers)) {
444
314
  throw new Error(`${path}: expected an object with an "mcpServers" object`);
445
315
  }
446
- const servers = isRecord2(parsed.mcpServers) ? parsed.mcpServers : undefined;
316
+ const servers = isRecord(parsed.mcpServers) ? parsed.mcpServers : undefined;
447
317
  if (!edit(servers, parsed))
448
318
  return;
449
319
  const indent = text && /^([ \t]+)\S/m.exec(text)?.[1] || " ";
@@ -452,4 +322,4 @@ function editMcpServers(path, edit) {
452
322
  `);
453
323
  }
454
324
 
455
- export { getMcpToolExposure, validateMcpServerConfig, McpServerRegistry, getProjectTrustOptions, hasTrustRequiringProjectResources, ProjectTrustStore, openBrowser, loadMcpConfig, updateMcpServerConfig, addMcpServerConfig, removeMcpServerConfig };
325
+ export { getProjectTrustOptions, hasTrustRequiringProjectResources, ProjectTrustStore, openBrowser, loadMcpConfig, updateMcpServerConfig, addMcpServerConfig, removeMcpServerConfig };
@@ -0,0 +1,166 @@
1
+ import {
2
+ __esm
3
+ } from "./cli-bc05qbss.js";
4
+
5
+ // src/tools/tool-config.ts
6
+ var CORE_TOOLS, DEFERRED_TOOLS, ALL_TOOLS;
7
+ var init_tool_config = __esm(() => {
8
+ CORE_TOOLS = new Set([
9
+ "join-swarm",
10
+ "my-agent-info",
11
+ "poll-task",
12
+ "get-task-details",
13
+ "store-progress",
14
+ "task-action",
15
+ "send-task",
16
+ "get-tasks",
17
+ "defer-task",
18
+ "memory-search",
19
+ "memory-get",
20
+ "memory-store",
21
+ "memory-delete",
22
+ "memory_rate",
23
+ "get-swarm",
24
+ "script-run",
25
+ "db-query",
26
+ "kv-get",
27
+ "script-query-types",
28
+ "get-repos",
29
+ "accept-steer",
30
+ "memory-edit",
31
+ "script-search",
32
+ "steer-task",
33
+ "kv-list",
34
+ "get-config"
35
+ ]);
36
+ DEFERRED_TOOLS = new Set([
37
+ "list-schedules",
38
+ "create-schedule",
39
+ "update-schedule",
40
+ "patch-schedule",
41
+ "delete-schedule",
42
+ "run-schedule-now",
43
+ "create-workflow",
44
+ "list-workflows",
45
+ "get-workflow",
46
+ "update-workflow",
47
+ "patch-workflow",
48
+ "patch-workflow-node",
49
+ "delete-workflow",
50
+ "trigger-workflow",
51
+ "list-workflow-runs",
52
+ "get-workflow-run",
53
+ "retry-workflow-run",
54
+ "cancel-workflow-run",
55
+ "register-service",
56
+ "unregister-service",
57
+ "list-services",
58
+ "update-service-status",
59
+ "set-config",
60
+ "list-config",
61
+ "delete-config",
62
+ "credential-bindings",
63
+ "script-connections",
64
+ "model-catalog-refresh",
65
+ "model-catalog-overlay-upsert",
66
+ "update-repo",
67
+ "update-profile",
68
+ "context-history",
69
+ "context-diff",
70
+ "read-messages",
71
+ "post-message",
72
+ "slack-reply",
73
+ "slack-read",
74
+ "slack-upload-file",
75
+ "slack-download-file",
76
+ "slack-list-channels",
77
+ "slack-post",
78
+ "slack-start-thread",
79
+ "slack-create-channel",
80
+ "slack-invite-to-channel",
81
+ "slack-archive-channel",
82
+ "slack-delete",
83
+ "slack-update",
84
+ "create-channel",
85
+ "delete-channel",
86
+ "list-channels",
87
+ "register-agentmail-inbox",
88
+ "register-kapso-number",
89
+ "unregister-kapso-number",
90
+ "send-whatsapp-message",
91
+ "reply-whatsapp-message",
92
+ "tracker-status",
93
+ "get-oauth-access-token",
94
+ "tracker-link-task",
95
+ "tracker-unlink",
96
+ "tracker-sync-status",
97
+ "tracker-map-agent",
98
+ "list-prompt-templates",
99
+ "get-prompt-template",
100
+ "set-prompt-template",
101
+ "delete-prompt-template",
102
+ "preview-prompt-template",
103
+ "create_metric",
104
+ "request-human-input",
105
+ "cancel-approval-request",
106
+ "skill-create",
107
+ "skill-update",
108
+ "skill-delete",
109
+ "skill-get",
110
+ "skill-get-file",
111
+ "skill-list",
112
+ "skill-search",
113
+ "skill-install",
114
+ "skill-uninstall",
115
+ "skill-install-remote",
116
+ "skill-sync-remote",
117
+ "skill-publish",
118
+ "mcp-server-create",
119
+ "mcp-server-delete",
120
+ "mcp-server-get",
121
+ "mcp-server-install",
122
+ "mcp-server-list",
123
+ "mcp-server-uninstall",
124
+ "mcp-server-update",
125
+ "resolve-user",
126
+ "manage-user",
127
+ "app-get",
128
+ "app-list",
129
+ "app-patch",
130
+ "app-query",
131
+ "app-sync",
132
+ "app-upsert",
133
+ "app-history",
134
+ "app-diff",
135
+ "app-rollback",
136
+ "create_page",
137
+ "delete-page",
138
+ "kv-set",
139
+ "kv-delete",
140
+ "kv-incr",
141
+ "room-get",
142
+ "room-change",
143
+ "room-reset",
144
+ "room-decode",
145
+ "script-upsert",
146
+ "script-delete",
147
+ "script-apis",
148
+ "launch-script-run",
149
+ "get-script-run",
150
+ "list-script-runs",
151
+ "extension-delete",
152
+ "extension-enable",
153
+ "extension-disable",
154
+ "extension-activate-version",
155
+ "extension-catalog",
156
+ "extension-install",
157
+ "extension-list",
158
+ "swarm_x",
159
+ "cancel-task",
160
+ "inject-learning",
161
+ "get-metrics"
162
+ ]);
163
+ ALL_TOOLS = new Set([...CORE_TOOLS, ...DEFERRED_TOOLS]);
164
+ });
165
+
166
+ export { CORE_TOOLS, ALL_TOOLS, init_tool_config };
@@ -1,27 +1,29 @@
1
- import {
2
- setRuntimeModelCatalog
3
- } from "./cli-m4excttz.js";
4
1
  import {
5
2
  buildModelsDevSeedRows,
6
3
  loadModelsDevCache
7
- } from "./cli-0n2e4x49.js";
4
+ } from "./cli-ecfxwnyb.js";
8
5
  import {
9
6
  createLogEntry,
10
7
  getActivePricingRow,
11
8
  getDbClient,
12
9
  init_db,
13
10
  insertPricingRow
14
- } from "./cli-g9df2m37.js";
11
+ } from "./cli-1cz0c18q.js";
12
+ import {
13
+ init_runtime_model_catalog,
14
+ setRuntimeModelCatalog
15
+ } from "./cli-jyy6pm2f.js";
15
16
  import {
16
17
  init_secret_scrubber,
17
18
  scrubSecrets
18
- } from "./cli-r2ap2czm.js";
19
+ } from "./cli-nexqx4ve.js";
19
20
 
20
21
  // src/be/pricing-refresh.ts
21
22
  init_secret_scrubber();
22
23
  init_db();
23
24
 
24
25
  // src/be/model-catalog-store.ts
26
+ init_runtime_model_catalog();
25
27
  init_db();
26
28
 
27
29
  // src/be/models-catalog.ts
@@ -2,7 +2,7 @@ import {
2
2
  init_resolver,
3
3
  init_session_templates,
4
4
  resolveTemplateAsync
5
- } from "./cli-rgjprct3.js";
5
+ } from "./cli-ptr8h7kp.js";
6
6
 
7
7
  // src/prompts/steering-delivery.ts
8
8
  init_session_templates();