chainlesschain 0.162.176 → 0.162.177
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/assets/{AIOps-BDLu5Elz.js → AIOps-DT-VPWuN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-DyOreOVN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-DslNsKux.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Duu8xR14.js → AppLayout-BNJJAYME.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DoaAtEcY.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-DPG3WdJ9.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-C_JO6R5G.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-Cv3BooyX.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-D2uQXWu-.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-B4Vczyf3.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DE6reP99.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-qTgk4VeP.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-DlLWcIzj.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-DNO73qp7.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-vRDNpc4j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CEWtIXni.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-KgYC9Fxi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-zj5wvkpT.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BLDoCozU.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BYnff4VY.js} +1 -1
- package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-C75VFsVm.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CXrd5gAw.js → Dashboard-C4Gutni2.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-B5dbO4Kx.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-BDipZtHJ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-DmIzt8jj.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D9QOS-uW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-B47HRwAm.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-3R4mXmgV.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-DrNXZf1C.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-BGd7JR98.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-D-2he1ed.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-C0sHIbK5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-DiBQO-jL.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-DL_5eV2D.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-VR59OdrC.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-DrPzwSd3.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-CBgKALwQ.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-pQ9Tn-Mn.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-mASB6jyj.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-DTMgE7HC.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CwTnCtiL.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-ngm6WU8f.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-4YO4Qww9.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-DP1k45mF.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-r2H8yPKb.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C48mu09U.js → OrderTableRenderer-CoM_Zw0J.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DrO7jRWS.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-Cnwu4i4t.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-zi-cDwA_.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-DBEryDv7.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-lqXK2C3x.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-AX3ypUDV.js → PersonalDataHub-b63T3HJM.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-Kep5KAGW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-CHdvOAh1.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-BhKfdwe9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-Yavk9K8A.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Cc7FC9-e.js → Projects-CN8E_5Mq.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-Bfym6SQn.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-CLSQcrlR.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-VPa2WKQN.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-CGXR8jVU.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C_20YfMB.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-awZh68UV.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-Ctb4oiYN.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-D3sdjvUV.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-C-zfA4kT.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-D9XlmHA3.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-C3UKnr41.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-BQxagZfF.js} +1 -1
- package/src/assets/web-panel/assets/Skills-q6eb6KPZ.js +1 -0
- package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-DveENvek.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-BFjXLNgF.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-BpHgbaP9.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DvepRb8-.js +1 -0
- package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-DEiaoyve.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-ITg774nY.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-D3ZBcvnb.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-BsLU6JjU.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-Cb5Pquc9.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-Dwfy-m9N.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-CnlSRGG0.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-Y4TlvKVo.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-BpKLtTTO.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-LLBzIq8x.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-BeSRiusP.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BK_l1tXO.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-DYd-X7Wg.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C9uip71j.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-JBrfjUP6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-D03fbuiq.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B8LQ8leS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-DLQOR6l-.js} +1 -1
- package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-5YN7F5bO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-6GuLRpBQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-B0X76LjX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-B46YcgsV.js} +1 -1
- package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-BNCdRmWf.js} +1 -1
- package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BYv-LWdy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-Ba-Ps_AJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-BcBZwlnG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-BdH9l8wl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-BfOs_bmg.js} +3 -3
- package/src/assets/web-panel/assets/index-Bh8BPtqR.js +1 -0
- package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BnQgRjsm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BpYKLrUT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-BuNFCZCx.js} +1 -1
- package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-ByHO3SqZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-C2zmOsyD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CChQBM1d.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-CChaISMb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-CILVyK3b.js} +1 -1
- package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CL0ixCxk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-CS63r8h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-CVZWiUE_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Ce0Bf1YF.js} +1 -1
- package/src/assets/web-panel/assets/index-CeVrHLzZ.js +1 -0
- package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-Ck17i0OD.js} +1 -1
- package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-Cpn19c9k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-CqWk1FLG.js} +1 -1
- package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CwoDpKzW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-D-1SqEpQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-D4UY5Z60.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-D8KvuDz0.js} +1 -1
- package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-DNMAAUVk.js} +1 -1
- package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-DYLZY4uh.js} +1 -1
- package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-DaokIHt3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-Q7mmL6w4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-SO6lgMg0.js} +1 -1
- package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-iahNhZwm.js} +1 -1
- package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-l08afIbV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-rIxxfdTN.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-CG9z1c6w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-B1Ky7Zff.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-DME8X2P1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-cuJYSWB7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-UI_EE0uZ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-BIoE_Z_V.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-B48-9HKN.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-D7x_GDgD.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-DjzC5_7m.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-C6BIymhh.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-B4dGrdD9.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-Bken4aNE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BMlqECqv.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B4NkcLaP.js → usePersonalDataHub-DLdrfmMa.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-CKJQmxa0.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-CaZunuau.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +22 -6
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +11 -4
- package/src/commands/batch.js +79 -27
- package/src/commands/changelog.js +15 -4
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/loop.js +9 -2
- package/src/commands/skill.js +2 -0
- package/src/commands/statusline.js +3 -3
- package/src/data/changelog.json +293 -51
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/mcp-client.js +9 -15
- package/src/harness/worktree-isolator.js +18 -21
- package/src/lib/agent-core.js +5 -0
- package/src/lib/agent-ipc-bus.js +12 -3
- package/src/lib/agent-team/team-worktree.js +28 -6
- package/src/lib/agent-worktree.js +20 -19
- package/src/lib/async-hook-supervisor.cjs +134 -24
- package/src/lib/async-hook-supervisor.js +47 -0
- package/src/lib/background-agent-supervisor.js +35 -12
- package/src/lib/background-task-manager.js +5 -1
- package/src/lib/changelog.js +57 -0
- package/src/lib/chrome-connector.js +6 -2
- package/src/lib/claude-code-bridge.js +24 -8
- package/src/lib/cli-anything-bridge.js +82 -25
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/hook-runner.cjs +71 -36
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/host-adb-bridge.js +18 -3
- package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
- package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
- package/src/lib/lsp/benchmark.js +20 -4
- package/src/lib/lsp/lsp-client.js +6 -4
- package/src/lib/lsp/lsp-server-registry.js +0 -2
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/packer/pack-update-applier.js +14 -2
- package/src/lib/packer/smoke-runner.js +18 -5
- package/src/lib/paths.js +1 -1
- package/src/lib/plugin-monitor-supervisor.js +20 -13
- package/src/lib/plugin-runtime/install.js +10 -3
- package/src/lib/repl-bang-memorize.js +10 -2
- package/src/lib/repl-goal.js +19 -2
- package/src/lib/settings-hook-events.cjs +13 -8
- package/src/lib/settings-hook-events.js +20 -0
- package/src/lib/skill-packs/generator.js +18 -9
- package/src/lib/skill-process-broker.js +71 -0
- package/src/lib/slash-commands.js +10 -2
- package/src/lib/status-line.cjs +28 -7
- package/src/lib/status-line.js +33 -0
- package/src/repl/agent-repl.js +48 -43
- package/src/runtime/agent-core.js +133 -49
- package/src/runtime/headless-runner.js +25 -10
- package/src/runtime/headless-stream.js +74 -4
- package/src/runtime/session-slash-commands.js +506 -0
- package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
- package/src/skills/video-editing/extractors/video-extractor.js +13 -3
- package/src/skills/video-editing/media-process.js +20 -0
- package/src/skills/video-editing/render/audio-mix.js +13 -3
- package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
- package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
- package/src/workers/background-agent-worker.js +6 -2
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CGHYrugQ.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
- package/src/assets/web-panel/assets/Skills-BDHh17P0.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DYQ_6lxj.js +0 -1
- package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
- package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
- package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
- package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
* All process/fs access goes through `_deps` for tests.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import { spawnSync as spawnSyncDefault } from "child_process";
|
|
21
20
|
import fsDefault from "fs";
|
|
22
21
|
import pathDefault from "path";
|
|
23
22
|
import { findProjectRoot } from "./project-instructions.js";
|
|
23
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
24
24
|
|
|
25
25
|
export const BANG_TIMEOUT_MS = 120_000;
|
|
26
26
|
export const BANG_MAX_BUFFER = 10 * 1024 * 1024;
|
|
@@ -32,7 +32,7 @@ export const BANG_OUTPUT_CAP = 30_000;
|
|
|
32
32
|
export const MEMO_NOTE_MAX = 4_000;
|
|
33
33
|
|
|
34
34
|
export const _deps = {
|
|
35
|
-
spawnSync:
|
|
35
|
+
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
36
36
|
fs: fsDefault,
|
|
37
37
|
path: pathDefault,
|
|
38
38
|
};
|
|
@@ -83,12 +83,20 @@ export function runBangCommand(line, opts = {}) {
|
|
|
83
83
|
timeout: BANG_TIMEOUT_MS,
|
|
84
84
|
maxBuffer: BANG_MAX_BUFFER,
|
|
85
85
|
cwd,
|
|
86
|
+
origin: "repl:bang-command",
|
|
87
|
+
policy: "allow",
|
|
88
|
+
scope: "repl",
|
|
89
|
+
shell: false,
|
|
86
90
|
})
|
|
87
91
|
: spawnSync("/bin/sh", ["-c", cmd], {
|
|
88
92
|
encoding: "utf-8",
|
|
89
93
|
timeout: BANG_TIMEOUT_MS,
|
|
90
94
|
maxBuffer: BANG_MAX_BUFFER,
|
|
91
95
|
cwd,
|
|
96
|
+
origin: "repl:bang-command",
|
|
97
|
+
policy: "allow",
|
|
98
|
+
scope: "repl",
|
|
99
|
+
shell: false,
|
|
92
100
|
});
|
|
93
101
|
|
|
94
102
|
const exitCode = res.status == null ? (res.error ? -1 : 0) : res.status;
|
package/src/lib/repl-goal.js
CHANGED
|
@@ -19,6 +19,23 @@ import {
|
|
|
19
19
|
GoalConditionEngine,
|
|
20
20
|
GOAL_DECISION,
|
|
21
21
|
} from "./goal-condition-engine.js";
|
|
22
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
23
|
+
|
|
24
|
+
const brokerRunner = executionBroker.spawnSync.bind(executionBroker);
|
|
25
|
+
|
|
26
|
+
export const _processDeps = {
|
|
27
|
+
run: brokerRunner,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function runReplGoalCommand(command, options = {}) {
|
|
31
|
+
return _processDeps.run(command, [], {
|
|
32
|
+
...options,
|
|
33
|
+
timeout: options.timeout ?? 30000,
|
|
34
|
+
origin: "repl-goal:exit-zero",
|
|
35
|
+
policy: "allow",
|
|
36
|
+
scope: "repl-goal",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
22
39
|
|
|
23
40
|
// Interactive sessions are human-paced, so the turn-count budget is generous —
|
|
24
41
|
// it exists only as a backstop (the engine hard-caps at 100 regardless). The
|
|
@@ -94,7 +111,7 @@ export function renderGoalVerdict(decision, events) {
|
|
|
94
111
|
/**
|
|
95
112
|
* Evaluate the session goal against a completed turn's final text. Deterministic
|
|
96
113
|
* conditions run inline (contains/regex on the text; exit-zero/file-exists via
|
|
97
|
-
* injected
|
|
114
|
+
* injected process runner/`existsSync`); a model condition delegates to `judge`.
|
|
98
115
|
*
|
|
99
116
|
* @param {GoalConditionEngine} engine
|
|
100
117
|
* @param {string} finalText the assistant's answer this turn
|
|
@@ -110,7 +127,7 @@ export async function evaluateReplGoalTurn(engine, finalText, deps = {}) {
|
|
|
110
127
|
evaluation = runDeterministicCheck(cond, {
|
|
111
128
|
lastOutput: finalText,
|
|
112
129
|
cwd: deps.cwd,
|
|
113
|
-
spawnSync: deps.spawnSync,
|
|
130
|
+
spawnSync: deps.spawnSync || runReplGoalCommand,
|
|
114
131
|
existsSync: deps.existsSync,
|
|
115
132
|
});
|
|
116
133
|
} else if (typeof deps.judge === "function") {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
const { collectHooks } = require("./settings-hooks.cjs");
|
|
20
|
-
const
|
|
20
|
+
const hookRunner = require("./hook-runner.cjs");
|
|
21
|
+
const _deps = { runHooks: hookRunner.runHooks };
|
|
21
22
|
const { buildHookEnvelope } = require("./hook-event-bus.cjs");
|
|
22
23
|
const hookEventLog = require("./hook-event-log.cjs");
|
|
23
24
|
|
|
@@ -143,7 +144,7 @@ function runUserPromptSubmitHooks(
|
|
|
143
144
|
},
|
|
144
145
|
{ sessionId },
|
|
145
146
|
);
|
|
146
|
-
const outcome = runHooks(sync, payload, {
|
|
147
|
+
const outcome = _deps.runHooks(sync, payload, {
|
|
147
148
|
cwd,
|
|
148
149
|
event: "UserPromptSubmit",
|
|
149
150
|
});
|
|
@@ -211,7 +212,10 @@ function runSessionStartHooks(settingsHooks, { source, cwd, sessionId } = {}) {
|
|
|
211
212
|
},
|
|
212
213
|
{ sessionId },
|
|
213
214
|
);
|
|
214
|
-
const outcome = runHooks(matched, payload, {
|
|
215
|
+
const outcome = _deps.runHooks(matched, payload, {
|
|
216
|
+
cwd,
|
|
217
|
+
event: "SessionStart",
|
|
218
|
+
});
|
|
215
219
|
return { additionalContext: aggregateContext(outcome.results) };
|
|
216
220
|
}
|
|
217
221
|
|
|
@@ -247,7 +251,7 @@ function runCwdChangedHooks(
|
|
|
247
251
|
},
|
|
248
252
|
{ sessionId },
|
|
249
253
|
);
|
|
250
|
-
const outcome = runHooks(sync, payload, {
|
|
254
|
+
const outcome = _deps.runHooks(sync, payload, {
|
|
251
255
|
cwd: newCwd || cwd,
|
|
252
256
|
event: "CwdChanged",
|
|
253
257
|
});
|
|
@@ -291,7 +295,7 @@ function runWorktreeCreateHooks(
|
|
|
291
295
|
},
|
|
292
296
|
{ sessionId },
|
|
293
297
|
);
|
|
294
|
-
const outcome = runHooks(sync, payload, {
|
|
298
|
+
const outcome = _deps.runHooks(sync, payload, {
|
|
295
299
|
cwd: cwd || worktreePath,
|
|
296
300
|
event: "WorktreeCreate",
|
|
297
301
|
});
|
|
@@ -337,7 +341,7 @@ function runWorktreeRemoveHooks(
|
|
|
337
341
|
},
|
|
338
342
|
{ sessionId },
|
|
339
343
|
);
|
|
340
|
-
const outcome = runHooks(sync, payload, {
|
|
344
|
+
const outcome = _deps.runHooks(sync, payload, {
|
|
341
345
|
cwd: cwd || worktreePath,
|
|
342
346
|
event: "WorktreeRemove",
|
|
343
347
|
});
|
|
@@ -386,7 +390,7 @@ function runInstructionsLoadedHooks(
|
|
|
386
390
|
},
|
|
387
391
|
{ sessionId },
|
|
388
392
|
);
|
|
389
|
-
const outcome = runHooks(sync, payload, {
|
|
393
|
+
const outcome = _deps.runHooks(sync, payload, {
|
|
390
394
|
cwd,
|
|
391
395
|
event: "InstructionsLoaded",
|
|
392
396
|
});
|
|
@@ -417,7 +421,7 @@ function runObserveHooks(
|
|
|
417
421
|
const matched = collectHooks(settingsHooks, event, matchTarget || "");
|
|
418
422
|
const { sync } = partitionAsyncHooks(matched);
|
|
419
423
|
if (sync.length === 0) return { decision: "continue", results: [] };
|
|
420
|
-
return runHooks(
|
|
424
|
+
return _deps.runHooks(
|
|
421
425
|
sync,
|
|
422
426
|
withDeliveryId(
|
|
423
427
|
event,
|
|
@@ -440,4 +444,5 @@ module.exports = {
|
|
|
440
444
|
aggregateContext,
|
|
441
445
|
partitionAsyncHooks,
|
|
442
446
|
dispatchAsyncHooks,
|
|
447
|
+
_deps,
|
|
443
448
|
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { runHooks } from "./hook-runner.js";
|
|
2
|
+
import events from "./settings-hook-events.cjs";
|
|
3
|
+
|
|
4
|
+
events._deps.runHooks = runHooks;
|
|
5
|
+
|
|
6
|
+
export const {
|
|
7
|
+
withDeliveryId,
|
|
8
|
+
runUserPromptSubmitHooks,
|
|
9
|
+
runSessionStartHooks,
|
|
10
|
+
runCwdChangedHooks,
|
|
11
|
+
runWorktreeCreateHooks,
|
|
12
|
+
runWorktreeRemoveHooks,
|
|
13
|
+
runInstructionsLoadedHooks,
|
|
14
|
+
runObserveHooks,
|
|
15
|
+
aggregateContext,
|
|
16
|
+
partitionAsyncHooks,
|
|
17
|
+
dispatchAsyncHooks,
|
|
18
|
+
} = events;
|
|
19
|
+
|
|
20
|
+
export default events;
|
|
@@ -115,6 +115,7 @@ cli-version-hash: "${hash}"
|
|
|
115
115
|
tags: [${allTags}]
|
|
116
116
|
user-invocable: true
|
|
117
117
|
handler: handler.js
|
|
118
|
+
capabilities: [shell-exec]
|
|
118
119
|
---
|
|
119
120
|
|
|
120
121
|
# ${domainDef.displayName}
|
|
@@ -176,7 +177,6 @@ export function generateDirectHandler(domainKey, domainDef) {
|
|
|
176
177
|
* 自动生成 — 请勿手动修改,运行 \`chainlesschain skill sync-cli\` 重新生成
|
|
177
178
|
*/
|
|
178
179
|
|
|
179
|
-
const { spawnSync } = require("child_process");
|
|
180
180
|
|
|
181
181
|
/** 解析输入字符串为指令+参数数组 */
|
|
182
182
|
function parseInput(input) {
|
|
@@ -241,7 +241,7 @@ ${commandGuide}
|
|
|
241
241
|
const useJson = JSON_SUPPORTED_COMMANDS.has(command) && !cliArgs.includes("--json");
|
|
242
242
|
if (useJson) cliArgs.push("--json");
|
|
243
243
|
|
|
244
|
-
// Security:
|
|
244
|
+
// Security: Broker execution uses shell:true (needed to run the chainlesschain.cmd
|
|
245
245
|
// shim on Windows), which joins cliArgs into a shell command. Reject shell
|
|
246
246
|
// metacharacters so a crafted skill input can't inject commands.
|
|
247
247
|
const unsafeArg = cliArgs.find((a) => /[;&|\`$<>()\\n\\r]/.test(a));
|
|
@@ -252,11 +252,16 @@ ${commandGuide}
|
|
|
252
252
|
};
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
|
|
256
|
-
|
|
255
|
+
const processBroker = context?.processBroker;
|
|
256
|
+
if (!processBroker || typeof processBroker.runSync !== "function") {
|
|
257
|
+
return { success: false, error: "Process Broker unavailable for skill execution." };
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Execute via the host-scoped Process Broker facade.
|
|
261
|
+
const result = processBroker.runSync("chainlesschain", cliArgs, {
|
|
257
262
|
encoding: "utf-8",
|
|
258
263
|
shell: true,
|
|
259
|
-
cwd: context
|
|
264
|
+
cwd: context?.projectRoot || process.cwd(),
|
|
260
265
|
timeout: 30000,
|
|
261
266
|
env: { ...process.env },
|
|
262
267
|
});
|
|
@@ -407,7 +412,6 @@ export function generateHybridHandler(domainKey, domainDef) {
|
|
|
407
412
|
* 自动生成 — 请勿手动修改,运行 \`chainlesschain skill sync-cli\` 重新生成
|
|
408
413
|
*/
|
|
409
414
|
|
|
410
|
-
const { spawnSync } = require("child_process");
|
|
411
415
|
|
|
412
416
|
const AGENT_ONLY_COMMANDS = new Set([${agentCmds}]);
|
|
413
417
|
const VALID_COMMANDS = new Set(["${commandList}"]);
|
|
@@ -470,7 +474,7 @@ const handler = {
|
|
|
470
474
|
// Direct execution for other commands
|
|
471
475
|
const cliArgs = [...args, "--quiet"];
|
|
472
476
|
|
|
473
|
-
// Security:
|
|
477
|
+
// Security: Broker execution uses shell:true (needed to run the chainlesschain.cmd
|
|
474
478
|
// shim on Windows), which joins cliArgs into a shell command. Reject shell
|
|
475
479
|
// metacharacters so a crafted skill input can't inject commands.
|
|
476
480
|
const unsafeArg = cliArgs.find((a) => /[;&|\`$<>()\\n\\r]/.test(a));
|
|
@@ -481,10 +485,15 @@ const handler = {
|
|
|
481
485
|
};
|
|
482
486
|
}
|
|
483
487
|
|
|
484
|
-
const
|
|
488
|
+
const processBroker = context?.processBroker;
|
|
489
|
+
if (!processBroker || typeof processBroker.runSync !== "function") {
|
|
490
|
+
return { success: false, error: "Process Broker unavailable for skill execution." };
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const result = processBroker.runSync("chainlesschain", cliArgs, {
|
|
485
494
|
encoding: "utf-8",
|
|
486
495
|
shell: true,
|
|
487
|
-
cwd: context
|
|
496
|
+
cwd: context?.projectRoot || process.cwd(),
|
|
488
497
|
timeout: 30000,
|
|
489
498
|
env: { ...process.env },
|
|
490
499
|
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
2
|
+
|
|
3
|
+
const defaultRunSync = executionBroker.spawnSync.bind(executionBroker);
|
|
4
|
+
const defaultRunFileSync = executionBroker.execFileSync.bind(executionBroker);
|
|
5
|
+
|
|
6
|
+
function skillIdentity(skill = {}) {
|
|
7
|
+
const identity = String(
|
|
8
|
+
skill.id || skill.name || skill.skillName || "unknown",
|
|
9
|
+
)
|
|
10
|
+
.trim()
|
|
11
|
+
.replace(/[^a-zA-Z0-9._:-]+/g, "-")
|
|
12
|
+
.slice(0, 96);
|
|
13
|
+
return identity || "unknown";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function declaresShellExecution(skill = {}) {
|
|
17
|
+
return (
|
|
18
|
+
Array.isArray(skill.capabilities) &&
|
|
19
|
+
skill.capabilities.some(
|
|
20
|
+
(capability) => String(capability).toLowerCase() === "shell-exec",
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Create the narrow process facade exposed to a skill handler.
|
|
27
|
+
*
|
|
28
|
+
* The host, not the handler, owns provenance and permission metadata. Generated
|
|
29
|
+
* handlers can choose argv and ordinary process options, but cannot relabel the
|
|
30
|
+
* execution or bypass the Broker boundary.
|
|
31
|
+
*/
|
|
32
|
+
export function createSkillProcessBroker(
|
|
33
|
+
skill,
|
|
34
|
+
{ runSync = defaultRunSync, runFileSync = defaultRunFileSync } = {},
|
|
35
|
+
) {
|
|
36
|
+
if (!declaresShellExecution(skill)) return null;
|
|
37
|
+
|
|
38
|
+
const identity = skillIdentity(skill);
|
|
39
|
+
const metadata = Object.freeze({
|
|
40
|
+
origin: `skill:${identity}`,
|
|
41
|
+
policy: "allow",
|
|
42
|
+
scope: "skill",
|
|
43
|
+
pluginId: skill?.pluginId || skill?.plugin?.id || null,
|
|
44
|
+
pluginVersion: skill?.pluginVersion || skill?.plugin?.version || null,
|
|
45
|
+
pluginSource: skill?.pluginSource || skill?.plugin?.source || null,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
runSync(file, args = [], options = {}) {
|
|
50
|
+
return runSync(file, args, {
|
|
51
|
+
...options,
|
|
52
|
+
...metadata,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
runFileSync(file, args = [], options = {}) {
|
|
57
|
+
return runFileSync(file, args, {
|
|
58
|
+
...options,
|
|
59
|
+
...metadata,
|
|
60
|
+
shell: false,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const _skillProcessDefaults = {
|
|
67
|
+
runSync: defaultRunSync,
|
|
68
|
+
runFileSync: defaultRunFileSync,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export { declaresShellExecution as skillDeclaresShellExecution };
|
|
@@ -21,11 +21,15 @@
|
|
|
21
21
|
import fsDefault from "node:fs";
|
|
22
22
|
import pathDefault from "node:path";
|
|
23
23
|
import { homedir } from "node:os";
|
|
24
|
-
import { execSync as execSyncDefault } from "node:child_process";
|
|
25
24
|
import { expandFileRefs } from "../runtime/file-ref-expander.js";
|
|
26
25
|
import { projectRootBase } from "./project-root.cjs";
|
|
26
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
27
27
|
|
|
28
|
-
const _deps = {
|
|
28
|
+
const _deps = {
|
|
29
|
+
fs: fsDefault,
|
|
30
|
+
path: pathDefault,
|
|
31
|
+
execSync: (...args) => executionBroker.execSync(...args),
|
|
32
|
+
};
|
|
29
33
|
|
|
30
34
|
/**
|
|
31
35
|
* Split `--- ... ---` frontmatter from the body and camelCase the keys (so
|
|
@@ -191,6 +195,10 @@ function runBangs(text, { cwd, execSync }) {
|
|
|
191
195
|
encoding: "utf-8",
|
|
192
196
|
timeout: BANG_TIMEOUT_MS,
|
|
193
197
|
stdio: ["ignore", "pipe", "pipe"],
|
|
198
|
+
origin: "slash-command:bang",
|
|
199
|
+
policy: "allow",
|
|
200
|
+
scope: "slash-command",
|
|
201
|
+
shell: true,
|
|
194
202
|
});
|
|
195
203
|
return String(out).trim();
|
|
196
204
|
} catch (err) {
|
package/src/lib/status-line.cjs
CHANGED
|
@@ -13,15 +13,14 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Best-effort throughout: a missing config, a broken command, or a timeout just
|
|
15
15
|
* yields no status line — it never blocks or breaks the REPL. `_deps` injection
|
|
16
|
-
* (
|
|
16
|
+
* (process runner / settings reader) for tests.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
const cpDefault = require("node:child_process");
|
|
20
19
|
const path = require("node:path");
|
|
21
20
|
const { settingsPaths, readSettingsFile } = require("./settings-loader.cjs");
|
|
22
21
|
|
|
23
22
|
const _deps = {
|
|
24
|
-
|
|
23
|
+
runProcess: null,
|
|
25
24
|
// injectable so tests don't touch real settings files
|
|
26
25
|
readSettings: (cwd, settingsFile) => {
|
|
27
26
|
const out = [];
|
|
@@ -181,7 +180,7 @@ function isStatusLineDisabled({ cwd = process.cwd(), settingsFile } = {}) {
|
|
|
181
180
|
function renderStatusLine(
|
|
182
181
|
config,
|
|
183
182
|
context = {},
|
|
184
|
-
{ cwd, timeout = 5000, columns, rows } = {},
|
|
183
|
+
{ cwd, timeout = 5000, columns, rows, runProcess } = {},
|
|
185
184
|
) {
|
|
186
185
|
if (!config || !config.command) return null;
|
|
187
186
|
// Claude-Code parity (2.1.153): hand the command the terminal width/height so
|
|
@@ -194,7 +193,9 @@ function renderStatusLine(
|
|
|
194
193
|
if (rws != null) env.LINES = String(rws);
|
|
195
194
|
let res;
|
|
196
195
|
try {
|
|
197
|
-
|
|
196
|
+
const runner = runProcess || _deps.runProcess;
|
|
197
|
+
if (typeof runner !== "function") return null;
|
|
198
|
+
res = runner(config.command, [], {
|
|
198
199
|
input: JSON.stringify(context),
|
|
199
200
|
cwd: cwd || process.cwd(),
|
|
200
201
|
env,
|
|
@@ -202,6 +203,9 @@ function renderStatusLine(
|
|
|
202
203
|
timeout,
|
|
203
204
|
shell: true,
|
|
204
205
|
maxBuffer: 1024 * 1024,
|
|
206
|
+
origin: "status-line:command",
|
|
207
|
+
policy: "allow",
|
|
208
|
+
scope: "status-line",
|
|
205
209
|
});
|
|
206
210
|
} catch {
|
|
207
211
|
return null; // spawn failure → no status line
|
|
@@ -216,11 +220,28 @@ function renderStatusLine(
|
|
|
216
220
|
}
|
|
217
221
|
|
|
218
222
|
/** Convenience: load + render in one call (used by the REPL each turn). */
|
|
219
|
-
function getStatusLine({
|
|
223
|
+
function getStatusLine({
|
|
224
|
+
cwd,
|
|
225
|
+
settingsFile,
|
|
226
|
+
sessionId,
|
|
227
|
+
model,
|
|
228
|
+
provider,
|
|
229
|
+
projectDir,
|
|
230
|
+
timeout,
|
|
231
|
+
columns,
|
|
232
|
+
rows,
|
|
233
|
+
runProcess,
|
|
234
|
+
} = {}) {
|
|
220
235
|
const config = loadStatusLineConfig({ cwd, settingsFile });
|
|
221
236
|
if (!config) return null;
|
|
222
237
|
const context = buildContext({ sessionId, model, provider, cwd, projectDir });
|
|
223
|
-
return renderStatusLine(config, context, {
|
|
238
|
+
return renderStatusLine(config, context, {
|
|
239
|
+
cwd,
|
|
240
|
+
timeout,
|
|
241
|
+
columns,
|
|
242
|
+
rows,
|
|
243
|
+
runProcess,
|
|
244
|
+
});
|
|
224
245
|
}
|
|
225
246
|
|
|
226
247
|
module.exports = {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import statusLine from "./status-line.cjs";
|
|
2
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
3
|
+
|
|
4
|
+
const brokerRunner = executionBroker.spawnSync.bind(executionBroker);
|
|
5
|
+
|
|
6
|
+
export function renderStatusLine(config, context, options = {}) {
|
|
7
|
+
return statusLine.renderStatusLine(config, context, {
|
|
8
|
+
...options,
|
|
9
|
+
runProcess:
|
|
10
|
+
options.runProcess || statusLine._deps.runProcess || brokerRunner,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getStatusLine(options = {}) {
|
|
15
|
+
return statusLine.getStatusLine({
|
|
16
|
+
...options,
|
|
17
|
+
runProcess:
|
|
18
|
+
options.runProcess || statusLine._deps.runProcess || brokerRunner,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const {
|
|
23
|
+
loadStatusLineConfig,
|
|
24
|
+
buildContext,
|
|
25
|
+
formatTokens,
|
|
26
|
+
shortenPath,
|
|
27
|
+
renderDefaultStatusLine,
|
|
28
|
+
isStatusLineDisabled,
|
|
29
|
+
terminalSize,
|
|
30
|
+
_deps,
|
|
31
|
+
} = statusLine;
|
|
32
|
+
|
|
33
|
+
export default { ...statusLine, renderStatusLine, getStatusLine };
|