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
package/src/lib/hook-runner.cjs
CHANGED
|
@@ -17,10 +17,9 @@
|
|
|
17
17
|
* agent — only an explicit block decision blocks).
|
|
18
18
|
*
|
|
19
19
|
* Returns a normalized `{ decision, reason, exitCode, stdout, stderr, ... }`.
|
|
20
|
-
*
|
|
20
|
+
* Process runners are injected for unit tests and by the ESM Broker facade.
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
const cpDefault = require("node:child_process");
|
|
24
23
|
const {
|
|
25
24
|
normalizeShellKind,
|
|
26
25
|
buildPowershellArgv,
|
|
@@ -28,7 +27,27 @@ const {
|
|
|
28
27
|
} = require("./shell-selector.cjs");
|
|
29
28
|
const { mergeHookDecisions } = require("./hook-event-bus.cjs");
|
|
30
29
|
|
|
31
|
-
const _deps = {
|
|
30
|
+
const _deps = { runSync: null, run: null };
|
|
31
|
+
Object.defineProperties(_deps, {
|
|
32
|
+
spawnSync: {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get() {
|
|
35
|
+
return this.runSync;
|
|
36
|
+
},
|
|
37
|
+
set(value) {
|
|
38
|
+
this.runSync = value;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
spawn: {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
get() {
|
|
44
|
+
return this.run;
|
|
45
|
+
},
|
|
46
|
+
set(value) {
|
|
47
|
+
this.run = value;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
32
51
|
|
|
33
52
|
const HOOK_DECISIONS = Object.freeze({
|
|
34
53
|
BLOCK: "block",
|
|
@@ -232,20 +251,29 @@ function _runCommandHookInner(command, input = {}, opts = {}) {
|
|
|
232
251
|
CLAUDE_HOOK_EVENT: event || input.hook_event_name || "",
|
|
233
252
|
},
|
|
234
253
|
};
|
|
235
|
-
const
|
|
254
|
+
const processOptions = {
|
|
236
255
|
...common,
|
|
237
256
|
origin: opts.origin || "hook",
|
|
238
|
-
policy:
|
|
257
|
+
policy: "allow",
|
|
258
|
+
scope: "hook",
|
|
239
259
|
pluginId: opts.pluginId || null,
|
|
240
260
|
pluginVersion: opts.pluginVersion || null,
|
|
241
261
|
pluginSource: opts.pluginSource || null,
|
|
242
262
|
};
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
263
|
+
const brokerRunSync =
|
|
264
|
+
opts.broker &&
|
|
265
|
+
opts.origin === "plugin:hook" &&
|
|
266
|
+
typeof opts.broker["spawnSync"] === "function"
|
|
267
|
+
? opts.broker["spawnSync"].bind(opts.broker)
|
|
268
|
+
: null;
|
|
269
|
+
if (brokerRunSync) {
|
|
270
|
+
const invocation = usePowershell
|
|
271
|
+
? buildPowershellArgv(command, shellKind, {
|
|
272
|
+
executionPolicy: loadShellConfig({ cwd: common.cwd })
|
|
273
|
+
.executionPolicy,
|
|
274
|
+
})
|
|
275
|
+
: { file: command, argv: [] };
|
|
276
|
+
res = brokerRunSync(invocation.file, invocation.argv, processOptions);
|
|
249
277
|
} else if (usePowershell) {
|
|
250
278
|
// Per-hook `shell: powershell|pwsh` (settings hook entry): explicit argv
|
|
251
279
|
// instead of the default shell; the enterprise ExecutionPolicy override
|
|
@@ -254,9 +282,15 @@ function _runCommandHookInner(command, input = {}, opts = {}) {
|
|
|
254
282
|
cwd: common.cwd,
|
|
255
283
|
});
|
|
256
284
|
const inv = buildPowershellArgv(command, shellKind, { executionPolicy });
|
|
257
|
-
|
|
285
|
+
if (typeof _deps.runSync !== "function") {
|
|
286
|
+
throw new Error("hook process runner unavailable");
|
|
287
|
+
}
|
|
288
|
+
res = _deps.runSync(inv.file, inv.argv, processOptions);
|
|
258
289
|
} else {
|
|
259
|
-
|
|
290
|
+
if (typeof _deps.runSync !== "function") {
|
|
291
|
+
throw new Error("hook process runner unavailable");
|
|
292
|
+
}
|
|
293
|
+
res = _deps.runSync(command, { ...processOptions, shell: true });
|
|
260
294
|
}
|
|
261
295
|
} catch (err) {
|
|
262
296
|
return {
|
|
@@ -360,36 +394,37 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
|
|
|
360
394
|
...process.env,
|
|
361
395
|
CLAUDE_HOOK_EVENT: event || input.hook_event_name || "",
|
|
362
396
|
};
|
|
397
|
+
const processOptions = {
|
|
398
|
+
cwd: wd,
|
|
399
|
+
env: spawnEnv,
|
|
400
|
+
origin: opts.origin || "hook",
|
|
401
|
+
policy: "allow",
|
|
402
|
+
scope: "hook",
|
|
403
|
+
pluginId: opts.pluginId || null,
|
|
404
|
+
pluginVersion: opts.pluginVersion || null,
|
|
405
|
+
pluginSource: opts.pluginSource || null,
|
|
406
|
+
};
|
|
363
407
|
|
|
364
408
|
let child;
|
|
365
409
|
try {
|
|
410
|
+
const brokerRun =
|
|
411
|
+
opts.broker &&
|
|
412
|
+
opts.origin === "plugin:hook" &&
|
|
413
|
+
typeof opts.broker["spawn"] === "function"
|
|
414
|
+
? opts.broker["spawn"].bind(opts.broker)
|
|
415
|
+
: null;
|
|
416
|
+
const run = brokerRun || _deps.run;
|
|
417
|
+
if (typeof run !== "function") {
|
|
418
|
+
throw new Error("hook process runner unavailable");
|
|
419
|
+
}
|
|
366
420
|
if (usePowershell) {
|
|
367
421
|
const { executionPolicy } = loadShellConfig({ cwd: wd });
|
|
368
422
|
const inv = buildPowershellArgv(command, shellKind, { executionPolicy });
|
|
369
|
-
child =
|
|
370
|
-
? opts.broker.spawn(inv.file, inv.argv, {
|
|
371
|
-
cwd: wd,
|
|
372
|
-
env: spawnEnv,
|
|
373
|
-
origin: opts.origin,
|
|
374
|
-
policy: "allow",
|
|
375
|
-
pluginId: opts.pluginId || null,
|
|
376
|
-
pluginVersion: opts.pluginVersion || null,
|
|
377
|
-
pluginSource: opts.pluginSource || null,
|
|
378
|
-
})
|
|
379
|
-
: _deps.spawn(inv.file, inv.argv, { cwd: wd, env: spawnEnv });
|
|
423
|
+
child = run(inv.file, inv.argv, processOptions);
|
|
380
424
|
} else {
|
|
381
|
-
child =
|
|
382
|
-
?
|
|
383
|
-
|
|
384
|
-
env: spawnEnv,
|
|
385
|
-
shell: true,
|
|
386
|
-
origin: opts.origin,
|
|
387
|
-
policy: "allow",
|
|
388
|
-
pluginId: opts.pluginId || null,
|
|
389
|
-
pluginVersion: opts.pluginVersion || null,
|
|
390
|
-
pluginSource: opts.pluginSource || null,
|
|
391
|
-
})
|
|
392
|
-
: _deps.spawn(command, { cwd: wd, env: spawnEnv, shell: true });
|
|
425
|
+
child = brokerRun
|
|
426
|
+
? run(command, [], { ...processOptions, shell: true })
|
|
427
|
+
: run(command, { ...processOptions, shell: true });
|
|
393
428
|
}
|
|
394
429
|
} catch (err) {
|
|
395
430
|
return {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import runner from "./hook-runner.cjs";
|
|
2
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
3
|
+
|
|
4
|
+
const brokerRunner = executionBroker.spawn.bind(executionBroker);
|
|
5
|
+
const brokerSyncRunner = executionBroker.spawnSync.bind(executionBroker);
|
|
6
|
+
|
|
7
|
+
export const _processDeps = {
|
|
8
|
+
run: brokerRunner,
|
|
9
|
+
runSync: brokerSyncRunner,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
function normalizeInvocation(argsOrOptions, maybeOptions) {
|
|
13
|
+
return Array.isArray(argsOrOptions)
|
|
14
|
+
? { args: argsOrOptions, options: maybeOptions || {} }
|
|
15
|
+
: { args: [], options: argsOrOptions || {} };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function runHookProcess(file, argsOrOptions, maybeOptions) {
|
|
19
|
+
const { args, options } = normalizeInvocation(argsOrOptions, maybeOptions);
|
|
20
|
+
return _processDeps.run(file, args, {
|
|
21
|
+
...options,
|
|
22
|
+
origin: options.origin || "hook",
|
|
23
|
+
policy: "allow",
|
|
24
|
+
scope: "hook",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function runHookProcessSync(file, argsOrOptions, maybeOptions) {
|
|
29
|
+
const { args, options } = normalizeInvocation(argsOrOptions, maybeOptions);
|
|
30
|
+
return _processDeps.runSync(file, args, {
|
|
31
|
+
...options,
|
|
32
|
+
origin: options.origin || "hook",
|
|
33
|
+
policy: "allow",
|
|
34
|
+
scope: "hook",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
runner._deps.run = runHookProcess;
|
|
39
|
+
runner._deps.runSync = runHookProcessSync;
|
|
40
|
+
|
|
41
|
+
export const {
|
|
42
|
+
runCommandHook,
|
|
43
|
+
runCommandHookAsync,
|
|
44
|
+
runHooks,
|
|
45
|
+
runHooksParallel,
|
|
46
|
+
interpretHookOutcome,
|
|
47
|
+
tryParseDecision,
|
|
48
|
+
HOOK_DECISIONS,
|
|
49
|
+
HOOK_PAYLOAD_SCHEMA_VERSION,
|
|
50
|
+
hookBreakerConfig,
|
|
51
|
+
_resetHookBreaker,
|
|
52
|
+
_deps,
|
|
53
|
+
} = runner;
|
|
54
|
+
|
|
55
|
+
export default runner;
|
|
@@ -31,10 +31,20 @@
|
|
|
31
31
|
* `\n` / EOS — every parse routine strips `\r+$` first.
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
-
import
|
|
35
|
-
import { promisify } from "node:util";
|
|
34
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
36
35
|
|
|
37
|
-
const
|
|
36
|
+
export const _deps = {
|
|
37
|
+
execFile: (...args) => executionBroker.execFile(...args),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
function execFileP(file, args, options) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
_deps.execFile(file, args, options, (error, stdout, stderr) => {
|
|
43
|
+
if (error) reject(error);
|
|
44
|
+
else resolve({ stdout, stderr });
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
38
48
|
|
|
39
49
|
export class HostAdbBridgeUnavailableError extends Error {
|
|
40
50
|
constructor(reason) {
|
|
@@ -52,6 +62,10 @@ async function adb(args, opts = {}) {
|
|
|
52
62
|
timeout: opts.timeoutMs || 30_000,
|
|
53
63
|
maxBuffer: 32 * 1024 * 1024,
|
|
54
64
|
encoding: "utf8",
|
|
65
|
+
origin: "host-adb:command",
|
|
66
|
+
policy: "allow",
|
|
67
|
+
scope: "host-adb",
|
|
68
|
+
shell: false,
|
|
55
69
|
});
|
|
56
70
|
if (stderr && /error:|failed:|protocol fault/i.test(stderr)) {
|
|
57
71
|
throw new HostAdbBridgeUnavailableError(stderr.trim().split("\n")[0]);
|
|
@@ -585,6 +599,7 @@ export function createHostAdbBridge(opts = {}) {
|
|
|
585
599
|
|
|
586
600
|
// Exposed for unit testing without spawning real adb.
|
|
587
601
|
export const _internals = {
|
|
602
|
+
adb,
|
|
588
603
|
parseContentQueryRows,
|
|
589
604
|
mergeContactRows,
|
|
590
605
|
listDevices,
|
|
@@ -8,6 +8,7 @@ import { describe, it, expect } from "vitest";
|
|
|
8
8
|
import {
|
|
9
9
|
percentile,
|
|
10
10
|
summarize,
|
|
11
|
+
sampleRssDefault,
|
|
11
12
|
sumSubtreeRss,
|
|
12
13
|
sumSubtreeRssFromWmicCsv,
|
|
13
14
|
} from "../benchmark.js";
|
|
@@ -86,3 +87,63 @@ describe("sumSubtreeRssFromWmicCsv", () => {
|
|
|
86
87
|
expect(sumSubtreeRssFromWmicCsv("garbage\r\n", 100)).toBeNull();
|
|
87
88
|
});
|
|
88
89
|
});
|
|
90
|
+
|
|
91
|
+
describe("sampleRssDefault", () => {
|
|
92
|
+
it("routes the POSIX process snapshot through the Broker contract", async () => {
|
|
93
|
+
const calls = [];
|
|
94
|
+
const execFileSync = (...args) => {
|
|
95
|
+
calls.push(args);
|
|
96
|
+
return "100 1 1024\n200 100 512\n400 1 9999\n";
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
await expect(
|
|
100
|
+
sampleRssDefault(100, { execFileSync, platform: "linux" }),
|
|
101
|
+
).resolves.toBe(2);
|
|
102
|
+
expect(calls).toEqual([
|
|
103
|
+
[
|
|
104
|
+
"ps",
|
|
105
|
+
["-o", "pid=,ppid=,rss="],
|
|
106
|
+
expect.objectContaining({
|
|
107
|
+
origin: "lsp:benchmark-rss",
|
|
108
|
+
policy: "allow",
|
|
109
|
+
scope: "lsp",
|
|
110
|
+
shell: false,
|
|
111
|
+
}),
|
|
112
|
+
],
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("routes the Windows process snapshot through literal argv", async () => {
|
|
117
|
+
const calls = [];
|
|
118
|
+
const execFileSync = (...args) => {
|
|
119
|
+
calls.push(args);
|
|
120
|
+
return [
|
|
121
|
+
"Node,ParentProcessId,ProcessId,WorkingSetSize",
|
|
122
|
+
"HOST,1,100,1048576",
|
|
123
|
+
"HOST,100,200,1048576",
|
|
124
|
+
].join("\r\n");
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
await expect(
|
|
128
|
+
sampleRssDefault(100, { execFileSync, platform: "win32" }),
|
|
129
|
+
).resolves.toBe(2);
|
|
130
|
+
expect(calls).toEqual([
|
|
131
|
+
[
|
|
132
|
+
"wmic",
|
|
133
|
+
[
|
|
134
|
+
"process",
|
|
135
|
+
"get",
|
|
136
|
+
"ProcessId,ParentProcessId,WorkingSetSize",
|
|
137
|
+
"/format:csv",
|
|
138
|
+
],
|
|
139
|
+
expect.objectContaining({
|
|
140
|
+
origin: "lsp:benchmark-rss",
|
|
141
|
+
policy: "allow",
|
|
142
|
+
scope: "lsp",
|
|
143
|
+
shell: false,
|
|
144
|
+
windowsHide: true,
|
|
145
|
+
}),
|
|
146
|
+
],
|
|
147
|
+
]);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
@@ -87,7 +87,12 @@ describe("LSPClient handshake", () => {
|
|
|
87
87
|
expect(_deps.spawn).toHaveBeenCalledWith(
|
|
88
88
|
"fake-lsp",
|
|
89
89
|
["--stdio"],
|
|
90
|
-
expect.objectContaining({
|
|
90
|
+
expect.objectContaining({
|
|
91
|
+
origin: "lsp:server",
|
|
92
|
+
policy: "allow",
|
|
93
|
+
scope: "lsp",
|
|
94
|
+
shell: false,
|
|
95
|
+
}),
|
|
91
96
|
);
|
|
92
97
|
});
|
|
93
98
|
|
package/src/lib/lsp/benchmark.js
CHANGED
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { CodeIntelligence } from "./code-intelligence.js";
|
|
15
|
+
import executionBroker from "../process-execution-broker/index.js";
|
|
15
16
|
|
|
16
17
|
/** now() in fractional milliseconds — injectable for deterministic tests. */
|
|
17
18
|
export const _deps = {
|
|
18
19
|
now: () => Number(process.hrtime.bigint() / 1000n) / 1000,
|
|
19
20
|
sampleRss: sampleRssDefault,
|
|
21
|
+
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
20
22
|
};
|
|
21
23
|
|
|
22
24
|
/** p-th percentile (0..100) of an UNSORTED sample via linear interpolation. */
|
|
@@ -167,10 +169,12 @@ async function captureServerInfo(ci) {
|
|
|
167
169
|
* lies. We sum the whole subtree. Returns null if it can't be read (never throws
|
|
168
170
|
* — memory is a bonus metric, not load-bearing).
|
|
169
171
|
*/
|
|
170
|
-
async function sampleRssDefault(
|
|
171
|
-
|
|
172
|
+
export async function sampleRssDefault(
|
|
173
|
+
pid,
|
|
174
|
+
{ execFileSync = _deps.execFileSync, platform = process.platform } = {},
|
|
175
|
+
) {
|
|
172
176
|
try {
|
|
173
|
-
if (
|
|
177
|
+
if (platform === "win32") {
|
|
174
178
|
// One snapshot of every process → parent map → sum the subtree at `pid`.
|
|
175
179
|
const csv = execFileSync(
|
|
176
180
|
"wmic",
|
|
@@ -180,7 +184,15 @@ async function sampleRssDefault(pid) {
|
|
|
180
184
|
"ProcessId,ParentProcessId,WorkingSetSize",
|
|
181
185
|
"/format:csv",
|
|
182
186
|
],
|
|
183
|
-
{
|
|
187
|
+
{
|
|
188
|
+
encoding: "utf8",
|
|
189
|
+
windowsHide: true,
|
|
190
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
191
|
+
origin: "lsp:benchmark-rss",
|
|
192
|
+
policy: "allow",
|
|
193
|
+
scope: "lsp",
|
|
194
|
+
shell: false,
|
|
195
|
+
},
|
|
184
196
|
);
|
|
185
197
|
const bytes = sumSubtreeRssFromWmicCsv(csv, pid);
|
|
186
198
|
return bytes != null ? Math.round(bytes / (1024 * 1024)) : null;
|
|
@@ -188,6 +200,10 @@ async function sampleRssDefault(pid) {
|
|
|
188
200
|
// POSIX: not wrapped, so the pid is the real server. Sum pid + children.
|
|
189
201
|
const out = execFileSync("ps", ["-o", "pid=,ppid=,rss="], {
|
|
190
202
|
encoding: "utf8",
|
|
203
|
+
origin: "lsp:benchmark-rss",
|
|
204
|
+
policy: "allow",
|
|
205
|
+
scope: "lsp",
|
|
206
|
+
shell: false,
|
|
191
207
|
});
|
|
192
208
|
const rows = out
|
|
193
209
|
.trim()
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
* does not intercept this file). Nothing here is language-specific.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { spawn as nodeSpawn } from "child_process";
|
|
17
16
|
import { EventEmitter } from "events";
|
|
18
17
|
import { encodeMessage, MessageBuffer } from "./jsonrpc-stream.js";
|
|
19
18
|
import { executionBroker } from "../process-execution-broker/index.js";
|
|
@@ -22,7 +21,9 @@ const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
|
22
21
|
const DEFAULT_INIT_TIMEOUT_MS = 30_000;
|
|
23
22
|
|
|
24
23
|
// Injectable so unit tests can supply a fake child process.
|
|
25
|
-
export const _deps = {
|
|
24
|
+
export const _deps = {
|
|
25
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
26
|
+
};
|
|
26
27
|
|
|
27
28
|
export class LSPClient extends EventEmitter {
|
|
28
29
|
/**
|
|
@@ -88,10 +89,11 @@ export class LSPClient extends EventEmitter {
|
|
|
88
89
|
shell: false,
|
|
89
90
|
windowsHide: true,
|
|
90
91
|
windowsVerbatimArguments: spawnSpec.windowsVerbatimArguments,
|
|
92
|
+
origin: this.origin || "lsp:server",
|
|
93
|
+
policy: "allow",
|
|
94
|
+
scope: "lsp",
|
|
91
95
|
...(this.origin
|
|
92
96
|
? {
|
|
93
|
-
origin: this.origin,
|
|
94
|
-
policy: "allow",
|
|
95
97
|
pluginId: this.pluginId,
|
|
96
98
|
pluginVersion: this.pluginVersion,
|
|
97
99
|
pluginSource: this.pluginSource,
|
|
@@ -14,11 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
import fs from "fs";
|
|
16
16
|
import path from "path";
|
|
17
|
-
import { execFileSync } from "child_process";
|
|
18
17
|
|
|
19
18
|
export const _deps = {
|
|
20
19
|
existsSync: fs.existsSync,
|
|
21
|
-
execFileSync,
|
|
22
20
|
};
|
|
23
21
|
|
|
24
22
|
// Extension → LSP languageId. Kept small and explicit; unknown extensions get
|
package/src/lib/orchestrator.js
CHANGED
|
@@ -22,15 +22,17 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { EventEmitter } from "events";
|
|
25
|
-
import { execSync } from "child_process";
|
|
26
25
|
import crypto from "crypto";
|
|
27
26
|
import { AgentRouter } from "./agent-router.js";
|
|
28
27
|
import { NotificationManager } from "./notifiers/index.js";
|
|
29
28
|
import { createChatFn } from "./cowork-adapter.js";
|
|
30
29
|
import { firstBalancedJson } from "./json-schema-output.js";
|
|
30
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
31
31
|
|
|
32
32
|
/* ---------- _deps injection (Vitest CJS mock pattern) ---------- */
|
|
33
|
-
export const _deps = {
|
|
33
|
+
export const _deps = {
|
|
34
|
+
execSync: (...args) => executionBroker.execSync(...args),
|
|
35
|
+
};
|
|
34
36
|
|
|
35
37
|
// ─── Task statuses ────────────────────────────────────────────────
|
|
36
38
|
export const TASK_STATUS = {
|
|
@@ -389,6 +391,10 @@ export class Orchestrator extends EventEmitter {
|
|
|
389
391
|
// re-dispatch). Give CI output generous headroom.
|
|
390
392
|
maxBuffer: 64 * 1024 * 1024,
|
|
391
393
|
stdio: "pipe",
|
|
394
|
+
origin: "orchestrator:ci",
|
|
395
|
+
policy: "allow",
|
|
396
|
+
scope: "orchestrator",
|
|
397
|
+
shell: true,
|
|
392
398
|
});
|
|
393
399
|
return {
|
|
394
400
|
pass: true,
|
|
@@ -27,7 +27,11 @@
|
|
|
27
27
|
import fs from "node:fs";
|
|
28
28
|
import os from "node:os";
|
|
29
29
|
import path from "node:path";
|
|
30
|
-
import
|
|
30
|
+
import executionBroker from "../process-execution-broker/index.js";
|
|
31
|
+
|
|
32
|
+
export const _deps = {
|
|
33
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
34
|
+
};
|
|
31
35
|
|
|
32
36
|
/**
|
|
33
37
|
* @param {object} ctx
|
|
@@ -55,7 +59,7 @@ export async function scheduleReplace(ctx) {
|
|
|
55
59
|
dryRun = false,
|
|
56
60
|
platform = process.platform === "win32" ? "win32" : "posix",
|
|
57
61
|
parentPid = process.pid,
|
|
58
|
-
spawnImpl = spawn,
|
|
62
|
+
spawnImpl = _deps.spawn,
|
|
59
63
|
} = ctx;
|
|
60
64
|
|
|
61
65
|
if (!newExePath || typeof newExePath !== "string") {
|
|
@@ -92,6 +96,10 @@ export async function scheduleReplace(ctx) {
|
|
|
92
96
|
// Detach so the sidecar survives our process exit. `windowsHide: true`
|
|
93
97
|
// keeps the cmd window from flashing — the replace itself is silent.
|
|
94
98
|
const child = spawnImpl("cmd.exe", ["/c", sidecarPath], {
|
|
99
|
+
origin: "packer:update-sidecar",
|
|
100
|
+
scope: "pack-update",
|
|
101
|
+
policy: "allow",
|
|
102
|
+
shell: false,
|
|
95
103
|
detached: true,
|
|
96
104
|
stdio: "ignore",
|
|
97
105
|
windowsHide: true,
|
|
@@ -123,6 +131,10 @@ export async function scheduleReplace(ctx) {
|
|
|
123
131
|
|
|
124
132
|
if (restart) {
|
|
125
133
|
const child = spawnImpl(targetExePath, process.argv.slice(2), {
|
|
134
|
+
origin: "packer:update-restart",
|
|
135
|
+
scope: "pack-update",
|
|
136
|
+
policy: "allow",
|
|
137
|
+
shell: false,
|
|
126
138
|
detached: true,
|
|
127
139
|
stdio: "ignore",
|
|
128
140
|
});
|
|
@@ -19,11 +19,15 @@
|
|
|
19
19
|
* Called from `runPack()` as Phase 8 when `cliOpts.smokeTest !== false`.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import { spawn } from "node:child_process";
|
|
23
22
|
import { createConnection } from "node:net";
|
|
24
23
|
import http from "node:http";
|
|
25
24
|
import path from "node:path";
|
|
26
25
|
import { PackError, EXIT } from "./errors.js";
|
|
26
|
+
import executionBroker from "../process-execution-broker/index.js";
|
|
27
|
+
|
|
28
|
+
export const _deps = {
|
|
29
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
30
|
+
};
|
|
27
31
|
|
|
28
32
|
const DEFAULT_BOOT_TIMEOUT_MS = 45_000;
|
|
29
33
|
const DEFAULT_PROBE_TIMEOUT_MS = 5_000;
|
|
@@ -80,7 +84,10 @@ export async function smokeTestExe(ctx) {
|
|
|
80
84
|
// artifacts are always .exe so this only kicks in during tests that use
|
|
81
85
|
// a shim — kept here so the smoke-runner is self-testable.
|
|
82
86
|
const needsShell = /\.(cmd|bat|sh)$/i.test(exePath);
|
|
83
|
-
const child = spawn(exePath, ["ui", "--no-open"], {
|
|
87
|
+
const child = _deps.spawn(exePath, ["ui", "--no-open"], {
|
|
88
|
+
origin: "packer:smoke-launch",
|
|
89
|
+
scope: "pack",
|
|
90
|
+
policy: "allow",
|
|
84
91
|
env,
|
|
85
92
|
stdio: ["ignore", "pipe", "pipe"],
|
|
86
93
|
windowsHide: true,
|
|
@@ -116,9 +123,15 @@ export async function smokeTestExe(ctx) {
|
|
|
116
123
|
// unrelated process tree that inherited the number (on CI: another
|
|
117
124
|
// vitest worker or a test's helper child).
|
|
118
125
|
if (child.exitCode !== null || child.signalCode !== null) return;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
126
|
+
_deps
|
|
127
|
+
.spawn("taskkill", ["/F", "/T", "/PID", String(child.pid)], {
|
|
128
|
+
origin: "packer:smoke-taskkill",
|
|
129
|
+
scope: "pack",
|
|
130
|
+
policy: "allow",
|
|
131
|
+
shell: false,
|
|
132
|
+
stdio: "ignore",
|
|
133
|
+
})
|
|
134
|
+
.unref();
|
|
122
135
|
} else if (child.pid) {
|
|
123
136
|
// Negative pid → the whole process group from the detached spawn above,
|
|
124
137
|
// so a shell:true wrapper's exec'd/forked `node` grandchild dies too
|
package/src/lib/paths.js
CHANGED
|
@@ -5,7 +5,7 @@ import { CONFIG_DIR_NAME } from "../constants.js";
|
|
|
5
5
|
import { getPlatform } from "./platform.js";
|
|
6
6
|
|
|
7
7
|
export function getHomeDir() {
|
|
8
|
-
return join(homedir(), CONFIG_DIR_NAME);
|
|
8
|
+
return process.env.CHAINLESSCHAIN_HOME || join(homedir(), CONFIG_DIR_NAME);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export function getBinDir() {
|
|
@@ -21,13 +21,14 @@
|
|
|
21
21
|
* real processes.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { spawn } from "node:child_process";
|
|
25
24
|
import { executionBroker } from "./process-execution-broker/index.js";
|
|
26
25
|
import { EventRuntimeProducer } from "./event-runtime-producer.js";
|
|
27
26
|
import { EventRuntimeStore } from "./event-runtime-store.js";
|
|
28
27
|
import { monitorEventId } from "./monitor-event.js";
|
|
29
28
|
|
|
30
|
-
export const _deps = {
|
|
29
|
+
export const _deps = {
|
|
30
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
31
|
+
};
|
|
31
32
|
|
|
32
33
|
const DEFAULT_INTERVAL_MS = 60_000;
|
|
33
34
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
@@ -40,8 +41,7 @@ export class PluginMonitorSupervisor {
|
|
|
40
41
|
this.defaultIntervalMs = opts.defaultIntervalMs || DEFAULT_INTERVAL_MS;
|
|
41
42
|
this.timeoutMs = opts.timeoutMs || DEFAULT_TIMEOUT_MS;
|
|
42
43
|
this._spawn = opts.spawn || _deps.spawn;
|
|
43
|
-
this.
|
|
44
|
-
opts.brokerSpawn || executionBroker.spawn.bind(executionBroker);
|
|
44
|
+
this._pluginSpawn = opts.brokerSpawn || this._spawn;
|
|
45
45
|
const eventRuntimeStore =
|
|
46
46
|
opts.eventRuntimeStore ||
|
|
47
47
|
(process.env.CC_EVENT_RUNTIME_DURABLE === "1" ? new EventRuntimeStore() : null);
|
|
@@ -210,17 +210,24 @@ export class PluginMonitorSupervisor {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
_spawnForDescriptor(desc, options) {
|
|
213
|
-
|
|
214
|
-
|
|
213
|
+
const isPlugin = desc?.origin === "plugin:monitor";
|
|
214
|
+
return (isPlugin ? this._pluginSpawn : this._spawn)(
|
|
215
|
+
desc.command,
|
|
216
|
+
desc.args,
|
|
217
|
+
{
|
|
215
218
|
...options,
|
|
216
|
-
origin: desc.origin,
|
|
219
|
+
origin: isPlugin ? desc.origin : "plugin-monitor:process",
|
|
217
220
|
policy: "allow",
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
scope: "plugin-monitor",
|
|
222
|
+
...(isPlugin
|
|
223
|
+
? {
|
|
224
|
+
pluginId: desc.pluginId,
|
|
225
|
+
pluginVersion: desc.pluginVersion,
|
|
226
|
+
pluginSource: desc.pluginSource,
|
|
227
|
+
}
|
|
228
|
+
: {}),
|
|
229
|
+
},
|
|
230
|
+
);
|
|
224
231
|
}
|
|
225
232
|
|
|
226
233
|
/**
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
import fs from "fs";
|
|
20
20
|
import os from "os";
|
|
21
21
|
import path from "path";
|
|
22
|
-
import { spawnSync } from "child_process";
|
|
23
22
|
import { parsePluginManifest, isWithin } from "./manifest.js";
|
|
24
23
|
import {
|
|
25
24
|
pluginNameDir,
|
|
@@ -29,7 +28,12 @@ import {
|
|
|
29
28
|
discoverPlugins,
|
|
30
29
|
} from "./scopes.js";
|
|
31
30
|
import { verifyPluginManifest } from "../plugin-security.js";
|
|
32
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
writePluginLock,
|
|
33
|
+
buildPluginSbom,
|
|
34
|
+
LOCK_FILENAME,
|
|
35
|
+
} from "./signature.js";
|
|
36
|
+
import executionBroker from "../process-execution-broker/index.js";
|
|
33
37
|
|
|
34
38
|
export const _deps = {
|
|
35
39
|
existsSync: fs.existsSync,
|
|
@@ -40,7 +44,7 @@ export const _deps = {
|
|
|
40
44
|
lstatSync: fs.lstatSync,
|
|
41
45
|
writeFileSync: fs.writeFileSync,
|
|
42
46
|
mkdtempSync: fs.mkdtempSync,
|
|
43
|
-
spawnSync,
|
|
47
|
+
spawnSync: (...args) => executionBroker.spawnSync(...args),
|
|
44
48
|
};
|
|
45
49
|
|
|
46
50
|
/**
|
|
@@ -272,6 +276,9 @@ export function fetchGitRepo(url, ref) {
|
|
|
272
276
|
encoding: "utf8",
|
|
273
277
|
timeout: 120000,
|
|
274
278
|
windowsHide: true,
|
|
279
|
+
origin: "plugin:install-git",
|
|
280
|
+
policy: "allow",
|
|
281
|
+
scope: "plugin-install",
|
|
275
282
|
shell: false,
|
|
276
283
|
});
|
|
277
284
|
|