chainlesschain 0.162.182 → 0.162.184
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/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-DzZ5_xoj.js → AIOps-DzAl5fGx.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DeLXddIg.js → ActionButton-DAHtMGeC.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-rvDCmet1.js → Analytics-BHQaexv5.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Yt6QVDnp.js → AppLayout-Phz_pD0n.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BS112K5L.js → Artifacts-DHt47kCA.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-0wJuQrNu.js → Audit--Y_8FULl.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B90PMgbn.js → BackgroundAgents-N1zchH7D.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-TkgMglQQ.js → Backup-B_BoyN30.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CQVS9p1l.js → BaseInput-Gl4uQHcT.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-YTjQHoC7.js → Chat-Cg-eIyAZ.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BzeUi3JH.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-5bwaOabq.js → Checkbox-D0MGR2wA.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BFmNQ_Xe.js → Codegen-BdObJEFn.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BT_u4Dzp.js → Col--ghxXT3z.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CJP52u5b.js → Community-BUFeXOqz.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BpzhJE9i.js → Compact-DhQO2_Mr.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Cg7rfslp.js → Compliance-3HoTqKYd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-JisxL6Yy.js → Cowork-B3zmO4VW.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-Bu7Ug_MC.js → Cron-CJDrZOcc.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CvuqoLdj.js → Crosschain-SMl15obd.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C2u9G8Pu.js → DID-CgTrTWrl.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BFt5Yv3d.js → Dashboard-dXFKaKol.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DIaT9Wxq.js → Dropdown-qQHEhCvI.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D_A601Y4.js → EmailListRenderer-C_ej0MWH.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard--IyQ8I8w.js → FamilyGuardDashboard-D6ajoE7I.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BihWHxuY.js → Federation-Cio2y49h.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BB8dOXc_.js → FormItemContext-ClJz1cYp.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DQYhj1HH.js → GenericCardRenderer-Dr_8Maca.js} +1 -1
- package/src/assets/web-panel/assets/{Git-B-2QZxGf.js → Git-CevLwp5u.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CusSb-nG.js → Governance-CW9YyQUY.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BAjmvPPL.js → Inference-CQqeAyER.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DoNYWKYq.js → KnowledgeGraph-cuGVxHrw.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B8fKWD-n.js → Logs-DIuHri5d.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BlJm1J7E.js → MarkdownRenderer-R91Qw5JA.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CyOscbSL.js → Marketplace-CY1VhFGx.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Ex6Om5da.js → McpTools-BBAbi1vt.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-CDcD8l8r.js → Memory-BWYGHxJA.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-xfBqoFDg.js → MobileBridge-CPIFkW7A.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BwObMMA2.js → MobileProjects-DQyWxCho.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CIWd36OV.js → Mtc-Bo3GnQbx.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CPX0ouuA.js → MtcAudit-C8-c4rSW.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BDJsIUuW.js → Multisig-ChqMTtoq.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DEkbuD3N.js → NLProgramming-C48TyhvI.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DJpHRhH1.js → Notes-zogUFWxp.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C1UZ-Qd5.js → NotificationSettings-v-K9XpSB.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-P94JGGNz.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Bbhj0fac.js → Organization-Boi1dQfR.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-1H04x3kx.js → Overflow-DM5YWwgA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CDpPe3et.js → P2P-C57LKpKK.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-MUX0Bpvw.js → PdhVaultBrowser-BFkPqu6Q.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-A07-0Ci1.js → Permissions-D6fB9YSp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DhhDWxAZ.js → PersonalDataHub-Bp7EefEo.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-CyfbJfe-.js → Pipeline-BVln3hZf.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CNFps3ED.js → Privacy-Bf8P3nF6.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit--T-u3Dr5.js → ProjectInit-DM6wA2E2.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DJmrK2fC.js → ProjectSettings-CGbc5Iho.js} +2 -2
- package/src/assets/web-panel/assets/Projects-D0p9EOxm.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DLzzbOZd.js → Providers-B2kJcxS6.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CexOomKS.js → QrScannerModal-Cxu7dXYy.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-QklGi19_.js → QuickAsk-DTlrTPms.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bb9kwSw8.js → Recommend-Cm3X-cCj.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DZuVNNN5.js → RemoteSession-DNb2kjvt.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Dr5cLP0N.js → Reputation-CZUFFjc1.js} +1 -1
- package/src/assets/web-panel/assets/{Row-oCQHYv5t.js → Row-DAPgloxA.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-IFDEykIR.js → RssFeed-dsx9S793.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CspVIxDc.js → Search-DnnC8kz-.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bm66o_DH.js → Security-VuZknRMK.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DvanNqXl.js → Services-B3XNX8Vx.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CHjEe9_O.js → Skeleton-Dl1nVtCj.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CY09CZ_W.js +1 -0
- package/src/assets/web-panel/assets/{Sla-DxZm1491.js → Sla-HzU56n1z.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DWxEEclC.js → SpeechSettings-CRle7Jl2.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-FIvOFw5p.js → SyncSettings-DWadz7Sl.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-CNVTDGg8.js +1 -0
- package/src/assets/web-panel/assets/{Templates-CaNjzV_t.js → Templates-BBAgvrlM.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DjlP6TmH.js → Tenant-BsbbvGN8.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-uscpZI4q.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-DoZ8y7y8.js → TimelineRenderer-mTyjNE6r.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-390cg2TC.js → Tokens-Bz97oBgs.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CLrtCj5_.js → Trigger-BTRKC140.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DpESfSPn.js → Trust-B4A_KuyX.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CN6279O0.js → UkeySign-DES9TmLU.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DPtAUlSe.js → VideoEditing-ClXs7Qxp.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-nKOMV_1n.js → Wallet-IzZqFz-7.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-HuXlSOc4.js → WebAuthn-BtOP04g_.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-CUfFjARi.js → WorkflowEditor-_0cqnopY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-6Eq0PcZJ.js → chat-ax7193uU.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BP_Sf6Iy.js → colors-Bu4WGJah.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BufMKIh5.js → compact-item-BX1dlTW0.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BBMXxWSW.js → createContext-CktA_Dj7.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-x877iKKS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-fUK_tRO2.js → hasIn-D5wd817l.js} +1 -1
- package/src/assets/web-panel/assets/{index-t8N1tSeX.js → index-5PYYkr8S.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLpIs_P_.js → index-A4uBPQCz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVsqvI4M.js → index-BAtBNfkr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bkg4ZePE.js → index-BLLsUNDc.js} +1 -1
- package/src/assets/web-panel/assets/{index-cpEli44X.js → index-BQtoRyTO.js} +1 -1
- package/src/assets/web-panel/assets/{index-wKTLbKyc.js → index-BRfXoRuh.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7Etk0Te.js → index-Bad2CYeH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwSf5pnf.js → index-BcGdL3sG.js} +1 -1
- package/src/assets/web-panel/assets/{index-3FuwBewR.js → index-C3HmzCLt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHy6yNiF.js → index-C8DkWyNr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgiECHu2.js → index-C8tLR2TG.js} +1 -1
- package/src/assets/web-panel/assets/{index-C44atv4k.js → index-CP8ELJBc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CW_G-MXw.js → index-CUForzsG.js} +1 -1
- package/src/assets/web-panel/assets/{index-pum7HYBA.js → index-CYRE0NJA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BWKoBU8R.js → index-CeVZaJSC.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4_MuGkd.js → index-CfzxR61U.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dyngbd29.js → index-Ci3y1ZAv.js} +19 -19
- package/src/assets/web-panel/assets/{index-fzaMtSJ8.js → index-CjEJjl5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp8vhyZy.js → index-Cv7bVWJ5.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPdUNk1i.js → index-D-o4Rwjk.js} +1 -1
- package/src/assets/web-panel/assets/index-D7pfPouB.js +1 -0
- package/src/assets/web-panel/assets/{index-CeASi4fr.js → index-D9op8poE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DASluSqY.js → index-DF1TysIF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DocdRcbd.js → index-DYo9S5OT.js} +1 -1
- package/src/assets/web-panel/assets/{index-2A5ph8b2.js → index-D_cycOET.js} +1 -1
- package/src/assets/web-panel/assets/{index-wV6iGdpY.js → index-Db3CpWTr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMLHv389.js → index-DkD1K-fF.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9WYSn4m.js → index-DmPJ6T6F.js} +1 -1
- package/src/assets/web-panel/assets/{index-uCbEN7cY.js → index-DmVUeWUk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmkMXwnR.js → index-Dzdr0zDf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZ6Yt17L.js → index-PBLzwYnu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE2DdTP2.js → index-bFCaM7Eq.js} +1 -1
- package/src/assets/web-panel/assets/index-e4i-VLBd.js +1 -0
- package/src/assets/web-panel/assets/{index-GwdRUZ-x.js → index-h3KJZr95.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2vS66eI.js → index-iHcPtQ2e.js} +1 -1
- package/src/assets/web-panel/assets/{index-6GmBa4Kg.js → index-jzlzm4VK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9vU25ij.js → index-o14NNnxw.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGjmILDm.js → index-tYPSfGbd.js} +1 -1
- package/src/assets/web-panel/assets/{index-LvCBfTLo.js → index-ytp2H5Zx.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-V5Fo95FM.js → initDefaultProps-D2Iut83B.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BYWU0hUT.js → motion-BuaJVdK9.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cr1M-J2h.js → move-CaEuM92y.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BysQKi2N.js → mtc-parser-wuKNBwys.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D1zHU8GC.js → omit-7a3eklaq.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CUArxtfi.js → pickAttrs-Dn4z7KvJ.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-ChoYEys0.js → placementArrow-DVn_qT4-.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BQRs3Mo7.js → responsiveObserve-Dodz1OMQ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B8zbsCkg.js → slide-CxoGskbp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C2U8Gs6h.js → statusUtils-DBh_epQH.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dd8MgL_V.js → styleChecker-RXQ4gG5P.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-hknqY5NH.js → useFlexGapSupport-1Wxm0HEG.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CLTAmcfw.js → useFs-CI_ySNxJ.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-ByegHbiB.js → usePersonalDataHub-C6973rZP.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DqlAy5DP.js → vnode-CalynwKr.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DiXiztQn.js → zoom-CM1cd-Q0.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +74 -1
- package/src/commands/agent.js +9 -0
- package/src/commands/background-session.js +60 -1
- package/src/commands/batch.js +160 -5
- package/src/commands/plugin.js +318 -43
- package/src/commands/session.js +44 -1
- package/src/commands/team.js +212 -6
- package/src/data/changelog.json +26 -0
- package/src/harness/jsonl-session-store.js +59 -6
- package/src/harness/mcp-client.js +65 -43
- package/src/lib/agent-batch.js +4 -1
- package/src/lib/agent-team/team-runner.js +19 -1
- package/src/lib/agent-team/team-worktree.js +3 -0
- package/src/lib/async-hook-supervisor.cjs +82 -10
- package/src/lib/async-hook-supervisor.js +50 -4
- package/src/lib/background-agent-supervisor.js +49 -0
- package/src/lib/collaboration-run-store.js +362 -0
- package/src/lib/hook-runner.cjs +98 -17
- package/src/lib/hook-runner.js +77 -6
- package/src/lib/hook-shell-command.cjs +148 -0
- package/src/lib/hooks-v2-runtime.js +188 -77
- package/src/lib/jsonl-session-store.js +2 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +18 -0
- package/src/lib/lsp/lsp-client.js +12 -1
- package/src/lib/plugin-monitor-supervisor.js +53 -16
- package/src/lib/plugin-runtime/bin.js +1 -1
- package/src/lib/plugin-runtime/install.js +465 -54
- package/src/lib/plugin-runtime/mcp.js +21 -2
- package/src/lib/plugin-runtime/monitors.js +19 -3
- package/src/lib/plugin-runtime/sandbox-policy.js +99 -0
- package/src/lib/plugin-runtime/scopes.js +13 -2
- package/src/lib/plugin-usage-attribution.js +44 -0
- package/src/lib/process-execution-broker/index.js +705 -13
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +1347 -0
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +1260 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +1831 -157
- package/src/lib/session-usage.js +278 -1
- package/src/lib/stream-retry.js +29 -0
- package/src/repl/agent-repl.js +38 -9
- package/src/runtime/agent-core.js +32 -4
- package/src/runtime/headless-runner.js +46 -1
- package/src/runtime/headless-stream.js +54 -3
- package/src/runtime/mcp-config.js +15 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-PR074hUN.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-GlJtqLjT.js +0 -1
- package/src/assets/web-panel/assets/Projects-Qx_MdX9k.js +0 -1
- package/src/assets/web-panel/assets/Skills-Cb8jWjMX.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CyuLnDFR.js +0 -1
- package/src/assets/web-panel/assets/Terminal-DwzGMniO.js +0 -3
- package/src/assets/web-panel/assets/devWarning-DgVKduH2.js +0 -1
- package/src/assets/web-panel/assets/index-DOZTSoS7.js +0 -1
- package/src/assets/web-panel/assets/index-DhpvjpqI.js +0 -1
package/src/commands/batch.js
CHANGED
|
@@ -30,6 +30,14 @@ import {
|
|
|
30
30
|
} from "../harness/worktree-isolator.js";
|
|
31
31
|
import { findProjectRoot } from "../lib/project-detector.js";
|
|
32
32
|
import executionBroker from "../lib/process-execution-broker/index.js";
|
|
33
|
+
import {
|
|
34
|
+
createCollaborationRun,
|
|
35
|
+
createCollaborationRunId,
|
|
36
|
+
createCollaborationSessionId,
|
|
37
|
+
finalizeCollaborationRun,
|
|
38
|
+
updateCollaborationUnit,
|
|
39
|
+
} from "../lib/collaboration-run-store.js";
|
|
40
|
+
import { loadSideEffectLedger } from "../lib/side-effect-ledger-store.js";
|
|
33
41
|
|
|
34
42
|
export const _processDeps = {
|
|
35
43
|
spawn: executionBroker.spawn.bind(executionBroker),
|
|
@@ -86,6 +94,13 @@ export function registerBatchCommand(program) {
|
|
|
86
94
|
.option("--test <cmd>", "Default test command run in each worktree")
|
|
87
95
|
.option("--merge", "Merge clean, passing branches back to base")
|
|
88
96
|
.option("--model <model>", "Model for agent runs")
|
|
97
|
+
.option(
|
|
98
|
+
"--permission-mode <mode>",
|
|
99
|
+
"Permission mode for each agent unit",
|
|
100
|
+
"acceptEdits",
|
|
101
|
+
)
|
|
102
|
+
.option("--max-turns <n>", "Per-unit agent turn cap")
|
|
103
|
+
.option("--max-budget-usd <amount>", "Per-unit agent cost cap")
|
|
89
104
|
.option("--json", "Machine-readable JSON output")
|
|
90
105
|
.action(async (options) => {
|
|
91
106
|
process.exitCode = await runBatchCommand(options);
|
|
@@ -97,6 +112,18 @@ export async function runBatchCommand(options = {}, _deps = {}) {
|
|
|
97
112
|
const errLog = _deps.err || ((m) => logger.error(m));
|
|
98
113
|
const repoDir =
|
|
99
114
|
_deps.repoDir || findProjectRoot(process.cwd()) || process.cwd();
|
|
115
|
+
const collaborationStore =
|
|
116
|
+
_deps.collaborationStore === false
|
|
117
|
+
? null
|
|
118
|
+
: _deps.collaborationStore || {
|
|
119
|
+
createRun: createCollaborationRun,
|
|
120
|
+
createRunId: createCollaborationRunId,
|
|
121
|
+
createSessionId: createCollaborationSessionId,
|
|
122
|
+
updateUnit: updateCollaborationUnit,
|
|
123
|
+
finalizeRun: finalizeCollaborationRun,
|
|
124
|
+
loadSideEffects: (sessionId) =>
|
|
125
|
+
loadSideEffectLedger(sessionId, { failIfUnavailable: false }),
|
|
126
|
+
};
|
|
100
127
|
|
|
101
128
|
// 1. Resolve the unit list — from a file, or by decomposing a goal.
|
|
102
129
|
let units;
|
|
@@ -123,14 +150,53 @@ export async function runBatchCommand(options = {}, _deps = {}) {
|
|
|
123
150
|
return 4;
|
|
124
151
|
}
|
|
125
152
|
|
|
153
|
+
const permissionMode = normalizePermissionMode(options.permissionMode);
|
|
154
|
+
let governanceRun = null;
|
|
155
|
+
const governanceByKey = new Map();
|
|
156
|
+
if (collaborationStore) {
|
|
157
|
+
try {
|
|
158
|
+
const runId = collaborationStore.createRunId("batch");
|
|
159
|
+
governanceRun = collaborationStore.createRun({
|
|
160
|
+
id: runId,
|
|
161
|
+
kind: "batch",
|
|
162
|
+
repoRoot: repoDir,
|
|
163
|
+
permissionMode,
|
|
164
|
+
resourceBudget: {
|
|
165
|
+
maxTurns: options.maxTurns,
|
|
166
|
+
maxCostUsd: options.maxBudgetUsd,
|
|
167
|
+
maxTasks: Array.isArray(units) ? units.length : null,
|
|
168
|
+
},
|
|
169
|
+
units: (Array.isArray(units) ? units : []).map((unit, index) => {
|
|
170
|
+
const key = String(unit?.key || `unit-${index + 1}`);
|
|
171
|
+
const branch = `batch/${sanitize(key)}`;
|
|
172
|
+
const sessionId = collaborationStore.createSessionId(runId, key);
|
|
173
|
+
return { key, branch, sessionId };
|
|
174
|
+
}),
|
|
175
|
+
});
|
|
176
|
+
for (const unit of governanceRun.units) {
|
|
177
|
+
governanceByKey.set(unit.key, unit);
|
|
178
|
+
}
|
|
179
|
+
} catch (err) {
|
|
180
|
+
errLog(`Failed to persist batch governance: ${err.message}`);
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
126
185
|
// 2. Run the batch with real worktree + agent + git deps.
|
|
127
|
-
const
|
|
186
|
+
const baseDeps = _deps.batchDeps || {
|
|
128
187
|
createWorktree: (key, branch) => createWorktree(repoDir, branch).path,
|
|
129
188
|
removeWorktree: (worktreePath, opts) =>
|
|
130
189
|
removeWorktree(repoDir, worktreePath, opts),
|
|
131
190
|
runAgent:
|
|
132
191
|
_deps.runAgent ||
|
|
133
|
-
((prompt, cwd) =>
|
|
192
|
+
((prompt, cwd, unit) =>
|
|
193
|
+
spawnAgent(prompt, cwd, {
|
|
194
|
+
model: options.model,
|
|
195
|
+
permissionMode,
|
|
196
|
+
maxTurns: options.maxTurns,
|
|
197
|
+
maxBudgetUsd: options.maxBudgetUsd,
|
|
198
|
+
sessionId: governanceByKey.get(unit?.key)?.sessionId,
|
|
199
|
+
})),
|
|
134
200
|
runTest: _deps.runTest || runTestCommand,
|
|
135
201
|
diffStat: _deps.diffStat || gitDiffStat,
|
|
136
202
|
commit: _deps.commit || gitCommitAll,
|
|
@@ -139,6 +205,21 @@ export async function runBatchCommand(options = {}, _deps = {}) {
|
|
|
139
205
|
mergeWorktree(repoDir, branch, { message }),
|
|
140
206
|
branchFor: (key) => `batch/${sanitize(key)}`,
|
|
141
207
|
};
|
|
208
|
+
const deps = {
|
|
209
|
+
...baseDeps,
|
|
210
|
+
createWorktree: (key, branch) => {
|
|
211
|
+
const worktreePath = baseDeps.createWorktree(key, branch);
|
|
212
|
+
if (governanceRun) {
|
|
213
|
+
collaborationStore.updateUnit(governanceRun.id, key, {
|
|
214
|
+
status: "running",
|
|
215
|
+
branch,
|
|
216
|
+
worktreePath,
|
|
217
|
+
startedAt: Date.now(),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return worktreePath;
|
|
221
|
+
},
|
|
222
|
+
};
|
|
142
223
|
|
|
143
224
|
const onEvent = options.json ? () => {} : (ev) => log(formatEvent(ev));
|
|
144
225
|
|
|
@@ -155,10 +236,61 @@ export async function runBatchCommand(options = {}, _deps = {}) {
|
|
|
155
236
|
deps,
|
|
156
237
|
);
|
|
157
238
|
} catch (err) {
|
|
239
|
+
if (governanceRun) {
|
|
240
|
+
try {
|
|
241
|
+
collaborationStore.finalizeRun(governanceRun.id, "failed");
|
|
242
|
+
} catch {
|
|
243
|
+
/* retain the running record for diagnosis */
|
|
244
|
+
}
|
|
245
|
+
}
|
|
158
246
|
errLog(`Batch failed: ${err.message}`);
|
|
159
247
|
return 1;
|
|
160
248
|
}
|
|
161
249
|
|
|
250
|
+
if (governanceRun) {
|
|
251
|
+
try {
|
|
252
|
+
for (const record of outcome.units) {
|
|
253
|
+
const unit = governanceByKey.get(record.key);
|
|
254
|
+
let sideEffects = null;
|
|
255
|
+
if (unit?.sessionId) {
|
|
256
|
+
try {
|
|
257
|
+
sideEffects = collaborationStore.loadSideEffects(unit.sessionId);
|
|
258
|
+
} catch {
|
|
259
|
+
/* side-effect summary is additive */
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const completed = new Set(["done", "no-changes"]).has(record.status);
|
|
263
|
+
collaborationStore.updateUnit(governanceRun.id, record.key, {
|
|
264
|
+
status: completed ? "completed" : record.status,
|
|
265
|
+
endedAt: Date.now(),
|
|
266
|
+
...(sideEffects ? { sideEffects } : {}),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
const failed = outcome.summary.testFailed + outcome.summary.errored > 0;
|
|
270
|
+
const finalized = collaborationStore.finalizeRun(
|
|
271
|
+
governanceRun.id,
|
|
272
|
+
failed ? "failed" : "completed",
|
|
273
|
+
);
|
|
274
|
+
outcome.governance = {
|
|
275
|
+
runId: finalized.id,
|
|
276
|
+
owner: finalized.owner,
|
|
277
|
+
status: finalized.status,
|
|
278
|
+
permissionMode: finalized.permissionMode,
|
|
279
|
+
resourceBudget: finalized.resourceBudget,
|
|
280
|
+
units: finalized.units.map((unit) => ({
|
|
281
|
+
key: unit.key,
|
|
282
|
+
owner: unit.owner,
|
|
283
|
+
sessionId: unit.sessionId,
|
|
284
|
+
status: unit.status,
|
|
285
|
+
sideEffects: unit.sideEffects,
|
|
286
|
+
})),
|
|
287
|
+
};
|
|
288
|
+
} catch (err) {
|
|
289
|
+
errLog(`Failed to finalize batch governance: ${err.message}`);
|
|
290
|
+
return 1;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
162
294
|
if (options.json) {
|
|
163
295
|
log(JSON.stringify(outcome, null, 2));
|
|
164
296
|
} else {
|
|
@@ -187,6 +319,21 @@ function sanitize(key) {
|
|
|
187
319
|
return String(key).replace(/[^a-zA-Z0-9._-]/g, "-");
|
|
188
320
|
}
|
|
189
321
|
|
|
322
|
+
function normalizePermissionMode(value) {
|
|
323
|
+
const mode = String(value || "acceptEdits");
|
|
324
|
+
return new Set([
|
|
325
|
+
"manual",
|
|
326
|
+
"auto",
|
|
327
|
+
"dontAsk",
|
|
328
|
+
"default",
|
|
329
|
+
"plan",
|
|
330
|
+
"acceptEdits",
|
|
331
|
+
"bypassPermissions",
|
|
332
|
+
]).has(mode)
|
|
333
|
+
? mode
|
|
334
|
+
: "acceptEdits";
|
|
335
|
+
}
|
|
336
|
+
|
|
190
337
|
function spawnBatchProcess(command, args, options, origin) {
|
|
191
338
|
return _processDeps.spawn(command, args, {
|
|
192
339
|
...options,
|
|
@@ -212,14 +359,18 @@ function spawnAgent(prompt, cwd, opts = {}) {
|
|
|
212
359
|
const args = [
|
|
213
360
|
BIN,
|
|
214
361
|
"agent",
|
|
215
|
-
"-p",
|
|
216
|
-
prompt,
|
|
217
362
|
"--permission-mode",
|
|
218
|
-
|
|
363
|
+
normalizePermissionMode(opts.permissionMode),
|
|
219
364
|
"--output-format",
|
|
220
365
|
"text",
|
|
221
366
|
];
|
|
222
367
|
if (opts.model) args.push("--model", opts.model);
|
|
368
|
+
if (opts.sessionId) args.push("--session", opts.sessionId);
|
|
369
|
+
if (Number(opts.maxTurns) > 0)
|
|
370
|
+
args.push("--max-turns", String(opts.maxTurns));
|
|
371
|
+
if (Number(opts.maxBudgetUsd) > 0) {
|
|
372
|
+
args.push("--max-budget-usd", String(opts.maxBudgetUsd));
|
|
373
|
+
}
|
|
223
374
|
const child = spawnBatchProcess(
|
|
224
375
|
process.execPath,
|
|
225
376
|
args,
|
|
@@ -233,6 +384,10 @@ function spawnAgent(prompt, cwd, opts = {}) {
|
|
|
233
384
|
);
|
|
234
385
|
let err = "";
|
|
235
386
|
child.stderr?.on("data", (d) => (err += d.toString("utf8")));
|
|
387
|
+
if (child.stdin) {
|
|
388
|
+
child.stdin.on("error", () => {});
|
|
389
|
+
child.stdin.end(String(prompt || ""));
|
|
390
|
+
}
|
|
236
391
|
child.on("error", (e) => reject(new Error(e.message)));
|
|
237
392
|
child.on("close", (code) =>
|
|
238
393
|
code === 0
|