chainlesschain 0.162.176 → 0.162.178
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/package.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DRftcSue.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-BFvUaMKR.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-C0-Rru4P.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-bx-BCljj.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DAJ8B3Un.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-hOk4L1lr.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-3pbDpM9z.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-BtziGDn9.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-kmshphJ3.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-d7tGSosA.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CGHYrugQ.js → ChatBubbleRenderer-p-_PBpX_.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-C4Eh4Tz5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-r7gmhZyA.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-U7mDaGlL.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-Bpu8aH1T.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CHb2XBJe.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-Cn_r4dey.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-CdMWfDcz.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BtnREHWy.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BKI9TSzr.js} +1 -1
- package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-pkNubzzJ.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-1rrz1snN.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-DLyFVxDc.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-CtUWfYVq.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-B8eX2Qe4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D8lsDGus.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-CRYt_aIw.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-ClKzY8_N.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-BXj5Dney.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-Cm-I8RMz.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-CPvbhvgt.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-sYNDZaoi.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-BZY_3CRZ.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-up0BW6pv.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-C5MEJ2Qe.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-ihdrn43I.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-Br8bPMlh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-BNntgrYW.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BdV915mw.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-A3wDmlqL.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CF-mBLWM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-Iy2k_MSo.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-kk0W7HUb.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-B5u5t_4S.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-BN0POf6_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CHkSUrXB.js +1 -0
- package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DwWQESuN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-DG6klrcC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-BwJcKkgZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-BwOHG0in.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-CGMXe4TX.js} +4 -4
- package/src/assets/web-panel/assets/PersonalDataHub-ziYqg7-A.js +8 -0
- package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-BzJfeoGt.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-DLh3Bblx.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-USVWW36c.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-CiiOn62h.js} +2 -2
- package/src/assets/web-panel/assets/Projects-6V-PNmcA.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-CBPWWzpu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-QVwoRUq3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-CXnR-2Vn.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-ClaNzjmF.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C3rGw8vJ.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-Ci-OWAoP.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-DRhAwXOS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-BQLJQ2_y.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-QQUpkfFd.js} +1 -1
- package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-DdXKzuKT.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-x2Zh62Qd.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-GdY4KwRz.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BDHh17P0.js → Skills-Bv4tY1Fd.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-C3QnM-11.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-Bl3ytvmI.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-Wp9IwTsP.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DYQ_6lxj.js → Tasks-CF3rIrDe.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-CGfvVVM9.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-CVXmwQ3U.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-bvwrt03E.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-D0g74KhH.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-BH4IwzlT.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-DJOpM533.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-B43EPRLr.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-BmBFG-em.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-n9oJwB8k.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-D5QeivHp.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-DcNy7igO.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BVjc7-5-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-Dy5Tfj3m.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C4c2CNZU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-DPa3O5vN.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-TLcfNA6_.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BAwdDA_5.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-D41LVFkp.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-0oevYjfT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-388pLGJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-B8nLBZbv.js} +3 -3
- package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-BPTGAjee.js} +1 -1
- package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BPtrOBmW.js} +1 -1
- package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-BQiIxHBy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BSM1cHVK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-BYPr9fkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-BsQ7Ev6i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-Btk9qLL2.js} +1 -1
- package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-BvmziZSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BvopLC_T.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-C7xhTVyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-CNk_ZooP.js} +1 -1
- package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CQrEHoOG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CSxex23J.js} +1 -1
- package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-CVjgm992.js} +1 -1
- package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CWK4zOPe.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-CX0VsoP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-CXl0YPNG.js} +1 -1
- package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-Cip7LWml.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-Cq_hlWNt.js} +1 -1
- package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-CzZ49YZL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-D2Nkivlm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-DBUgRs4D.js} +1 -1
- package/src/assets/web-panel/assets/index-DEjVkdzq.js +1 -0
- package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-DNsBj2Ob.js} +1 -1
- package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Di4X8cfI.js} +1 -1
- package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-DljFsVGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-Korc3QIe.js} +1 -1
- package/src/assets/web-panel/assets/index-LMOc5xrS.js +1 -0
- package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-MKZDje0H.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-OHAfRu_3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-WEJr8PL5.js} +1 -1
- package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-WinCp6du.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-Yjr6cqSK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-iQ6gtFih.js} +1 -1
- package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-pt3s7yvV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-tQ3igERQ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-BFZu87WZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-DJIo7qvt.js} +1 -1
- package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-Cfr5qknL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-Bgc-OadH.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-X3WI-TNp.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-pJhU9IxK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-BNg_Vj3T.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-TeSEGQ5-.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-D_t_P0bv.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-DrrIMwAT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-BjZCuFRm.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-rTFdlqdQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BidCpfLX.js} +1 -1
- package/src/assets/web-panel/assets/usePersonalDataHub-C5mHttA9.js +1 -0
- package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-BrbcRiHZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-PISX7AkR.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/__tests__/hub-wechat.test.js +45 -0
- package/src/commands/agenda.js +22 -6
- package/src/commands/agent.js +3 -3
- package/src/commands/background-session.js +16 -6
- package/src/commands/batch.js +79 -27
- package/src/commands/changelog.js +15 -4
- package/src/commands/context.js +33 -1
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/hub.js +473 -39
- package/src/commands/init.js +212 -110
- package/src/commands/llm.js +22 -6
- package/src/commands/loop.js +9 -2
- package/src/commands/skill.js +13 -1
- package/src/commands/statusline.js +3 -3
- package/src/data/changelog.json +53 -5
- package/src/gateways/ws/personal-data-hub-protocol.js +22 -2
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/golden-transcript.js +3 -0
- package/src/harness/mcp-client.js +9 -15
- package/src/harness/worktree-isolator.js +18 -21
- package/src/index.js +18 -7
- 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/approval-authority-store.js +891 -0
- 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-interaction-resolver.js +399 -54
- package/src/lib/background-session-transport.js +3 -1
- 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/context-breakdown.js +82 -3
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/event-runtime-host.js +225 -0
- package/src/lib/event-runtime-store.js +102 -21
- package/src/lib/event-runtime-worker.js +70 -2
- package/src/lib/hook-runner.cjs +71 -36
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/hooks-v2-producers.js +33 -8
- package/src/lib/hooks-v2-runtime.js +360 -40
- package/src/lib/host-adb-bridge.js +18 -3
- package/src/lib/interaction-adapter.js +66 -0
- 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/operation-fingerprint.js +107 -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/pdh-dedicated-batch-collectors.js +124 -0
- package/src/lib/personal-data-hub-wiring.js +327 -52
- package/src/lib/plugin-monitor-supervisor.js +20 -13
- package/src/lib/plugin-runtime/install.js +10 -3
- package/src/lib/process-execution-broker/credential-agent.js +954 -111
- package/src/lib/process-execution-broker/index.js +369 -85
- package/src/lib/process-execution-broker/platform-sandbox.js +320 -140
- package/src/lib/provider-http-error.js +94 -0
- package/src/lib/remote-approval-bridge.js +222 -26
- 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/side-effect-ledger-store.js +65 -14
- package/src/lib/skill-loader.js +215 -12
- package/src/lib/skill-packs/generator.js +18 -9
- package/src/lib/skill-process-broker.js +85 -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/lib/sub-agent-context.js +42 -0
- package/src/lib/turn-binding-store.js +64 -15
- package/src/lib/turn-binding.js +85 -16
- package/src/repl/agent-repl.js +88 -49
- package/src/repl/remote-approval.js +13 -13
- package/src/repl/repl-turn-binding.js +46 -16
- package/src/runtime/agent-core.js +419 -84
- package/src/runtime/coding-agent-contract-shared.cjs +16 -0
- package/src/runtime/headless-runner.js +172 -44
- package/src/runtime/headless-stream.js +221 -11
- 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 +76 -40
- package/src/assets/web-panel/assets/AppLayout-Duu8xR14.js +0 -9
- package/src/assets/web-panel/assets/Dashboard-CXrd5gAw.js +0 -3
- package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-C48mu09U.js +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-AX3ypUDV.js +0 -9
- package/src/assets/web-panel/assets/Projects-Cc7FC9-e.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/assets/web-panel/assets/usePersonalDataHub-B4NkcLaP.js +0 -1
|
@@ -28,11 +28,10 @@
|
|
|
28
28
|
* - tree-reaping of every child on stopAll() / process 'exit', so a session
|
|
29
29
|
* never leaves an orphan hook process.
|
|
30
30
|
*
|
|
31
|
-
*
|
|
31
|
+
* Process runners and `_deps.now` are injected so the whole supervisor is unit-
|
|
32
32
|
* testable with fake child processes (no real shell).
|
|
33
33
|
*/
|
|
34
34
|
|
|
35
|
-
const cpDefault = require("node:child_process");
|
|
36
35
|
const { tryParseDecision } = require("./hook-runner.cjs");
|
|
37
36
|
|
|
38
37
|
const DEFAULT_TIMEOUT_MS = 60000;
|
|
@@ -52,8 +51,10 @@ class AsyncHookSupervisor {
|
|
|
52
51
|
? Number(opts.maxConcurrent)
|
|
53
52
|
: DEFAULT_MAX_CONCURRENT;
|
|
54
53
|
this._deps = {
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
run: opts.run || opts.spawn || null,
|
|
55
|
+
runSync: opts.runSync || opts.spawnSync || null,
|
|
56
|
+
killProcess: opts.killProcess || process.kill.bind(process),
|
|
57
|
+
platform: opts.platform || process.platform,
|
|
57
58
|
now: opts.now || (() => Date.now()),
|
|
58
59
|
};
|
|
59
60
|
this._running = new Map(); // key -> { child, timer }
|
|
@@ -125,8 +126,12 @@ class AsyncHookSupervisor {
|
|
|
125
126
|
return;
|
|
126
127
|
}
|
|
127
128
|
try {
|
|
128
|
-
if (
|
|
129
|
-
|
|
129
|
+
if (this._deps.platform === "win32") {
|
|
130
|
+
// Snapshot before taskkill: a policy-restricted taskkill may terminate
|
|
131
|
+
// the shell and then fail on its descendants, orphaning them so a
|
|
132
|
+
// parent-PID query performed afterward can no longer find the tree.
|
|
133
|
+
const descendants = this._windowsDescendantPids(pid);
|
|
134
|
+
const r = this._deps.runSync(
|
|
130
135
|
"taskkill",
|
|
131
136
|
["/PID", String(pid), "/T", "/F"],
|
|
132
137
|
{ windowsHide: true },
|
|
@@ -135,20 +140,27 @@ class AsyncHookSupervisor {
|
|
|
135
140
|
// tree snapshot and termination. Repeat once so that race cannot
|
|
136
141
|
// leave a short-lived hook grandchild orphaned.
|
|
137
142
|
if (!r?.error && r?.status === 0) {
|
|
138
|
-
this._deps.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
{ windowsHide: true },
|
|
142
|
-
);
|
|
143
|
+
this._deps.runSync("taskkill", ["/PID", String(pid), "/T", "/F"], {
|
|
144
|
+
windowsHide: true,
|
|
145
|
+
});
|
|
143
146
|
}
|
|
144
|
-
//
|
|
147
|
+
// Restricted runners can launch taskkill but still receive a non-zero
|
|
148
|
+
// access/policy result. Enumerate the tree while it is still alive,
|
|
149
|
+
// then terminate descendants leaf-first before killing the shell.
|
|
145
150
|
if (r && (r.error || (r.status != null && r.status !== 0))) {
|
|
151
|
+
for (const descendant of descendants.reverse()) {
|
|
152
|
+
try {
|
|
153
|
+
this._deps.killProcess(descendant, "SIGKILL");
|
|
154
|
+
} catch {
|
|
155
|
+
/* already gone */
|
|
156
|
+
}
|
|
157
|
+
}
|
|
146
158
|
child.kill(signal);
|
|
147
159
|
}
|
|
148
160
|
} else {
|
|
149
161
|
// Negative pid → the whole process group (requires the detached spawn).
|
|
150
162
|
try {
|
|
151
|
-
|
|
163
|
+
this._deps.killProcess(-pid, signal);
|
|
152
164
|
} catch {
|
|
153
165
|
child.kill(signal);
|
|
154
166
|
}
|
|
@@ -162,6 +174,102 @@ class AsyncHookSupervisor {
|
|
|
162
174
|
}
|
|
163
175
|
}
|
|
164
176
|
|
|
177
|
+
/**
|
|
178
|
+
* Snapshot a Windows process tree for the taskkill-denied fallback. Query the
|
|
179
|
+
* process table once instead of issuing a quoted WMIC `where` expression for
|
|
180
|
+
* every level: Node/cmd quoting can silently turn that expression into an
|
|
181
|
+
* invalid WMIC alias query. PowerShell/CIM covers systems where WMIC has been
|
|
182
|
+
* removed. Traversal is bounded + cycle-safe so corrupt data cannot stall
|
|
183
|
+
* session teardown.
|
|
184
|
+
*/
|
|
185
|
+
_windowsDescendantPids(rootPid) {
|
|
186
|
+
if (this._deps.platform !== "win32") return [];
|
|
187
|
+
const root = Number(rootPid);
|
|
188
|
+
if (!Number.isInteger(root) || root <= 0) return [];
|
|
189
|
+
let output = "";
|
|
190
|
+
let shouldTryCim = false;
|
|
191
|
+
try {
|
|
192
|
+
const result = this._deps.runSync(
|
|
193
|
+
"wmic",
|
|
194
|
+
[
|
|
195
|
+
"path",
|
|
196
|
+
"Win32_Process",
|
|
197
|
+
"get",
|
|
198
|
+
"ParentProcessId,ProcessId",
|
|
199
|
+
"/format:csv",
|
|
200
|
+
],
|
|
201
|
+
{
|
|
202
|
+
encoding: "utf8",
|
|
203
|
+
windowsHide: true,
|
|
204
|
+
timeout: 3000,
|
|
205
|
+
},
|
|
206
|
+
);
|
|
207
|
+
if (!result?.error && result?.status === 0) {
|
|
208
|
+
output = String(result.stdout || "");
|
|
209
|
+
} else if (result?.error?.code === "ENOENT") {
|
|
210
|
+
shouldTryCim = true;
|
|
211
|
+
}
|
|
212
|
+
} catch {
|
|
213
|
+
shouldTryCim = true;
|
|
214
|
+
}
|
|
215
|
+
if (!output && shouldTryCim) {
|
|
216
|
+
try {
|
|
217
|
+
const result = this._deps.runSync(
|
|
218
|
+
"powershell.exe",
|
|
219
|
+
[
|
|
220
|
+
"-NoProfile",
|
|
221
|
+
"-NonInteractive",
|
|
222
|
+
"-Command",
|
|
223
|
+
"Get-CimInstance Win32_Process | ForEach-Object { '{0},{1}' -f $_.ParentProcessId,$_.ProcessId }",
|
|
224
|
+
],
|
|
225
|
+
{
|
|
226
|
+
encoding: "utf8",
|
|
227
|
+
windowsHide: true,
|
|
228
|
+
timeout: 3000,
|
|
229
|
+
},
|
|
230
|
+
);
|
|
231
|
+
if (!result?.error && result?.status === 0) {
|
|
232
|
+
output = String(result.stdout || "");
|
|
233
|
+
}
|
|
234
|
+
} catch {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const childrenByParent = new Map();
|
|
240
|
+
for (const line of output.split(/\r?\n/)) {
|
|
241
|
+
const fields = line.trim().split(",");
|
|
242
|
+
if (fields.length < 2) continue;
|
|
243
|
+
const parentPid = Number(fields.at(-2));
|
|
244
|
+
const childPid = Number(fields.at(-1));
|
|
245
|
+
if (
|
|
246
|
+
!Number.isInteger(parentPid) ||
|
|
247
|
+
parentPid < 0 ||
|
|
248
|
+
!Number.isInteger(childPid) ||
|
|
249
|
+
childPid <= 0
|
|
250
|
+
) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const children = childrenByParent.get(parentPid) || [];
|
|
254
|
+
children.push(childPid);
|
|
255
|
+
childrenByParent.set(parentPid, children);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const seen = new Set([root]);
|
|
259
|
+
const pending = [root];
|
|
260
|
+
const descendants = [];
|
|
261
|
+
while (pending.length > 0 && seen.size <= 256) {
|
|
262
|
+
const parentPid = pending.shift();
|
|
263
|
+
for (const childPid of childrenByParent.get(parentPid) || []) {
|
|
264
|
+
if (seen.has(childPid)) continue;
|
|
265
|
+
seen.add(childPid);
|
|
266
|
+
descendants.push(childPid);
|
|
267
|
+
pending.push(childPid);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return descendants;
|
|
271
|
+
}
|
|
272
|
+
|
|
165
273
|
/** Install the process-exit reaper exactly once, only when a child exists. */
|
|
166
274
|
_installExitHook() {
|
|
167
275
|
if (this._exitHookInstalled) return;
|
|
@@ -257,22 +365,24 @@ class AsyncHookSupervisor {
|
|
|
257
365
|
// POSIX: own process group so a timeout / stopAll can signal the whole
|
|
258
366
|
// tree (shell + the real hook command), not just the shell wrapper.
|
|
259
367
|
// No-op on Windows, where the tree is reaped via `taskkill /T` instead.
|
|
260
|
-
detached:
|
|
368
|
+
detached: this._deps.platform !== "win32",
|
|
261
369
|
env: {
|
|
262
370
|
...process.env,
|
|
263
371
|
CLAUDE_HOOK_EVENT: hook.event || payload.hook_event_name || "",
|
|
264
372
|
},
|
|
265
373
|
};
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
:
|
|
374
|
+
if (typeof this._deps.run !== "function") {
|
|
375
|
+
throw new Error("async hook process runner unavailable");
|
|
376
|
+
}
|
|
377
|
+
child = this._deps.run(hook.command, {
|
|
378
|
+
...spawnOptions,
|
|
379
|
+
origin: hook.origin || "async-hook:command",
|
|
380
|
+
policy: "allow",
|
|
381
|
+
scope: "async-hook",
|
|
382
|
+
pluginId: hook.pluginId || null,
|
|
383
|
+
pluginVersion: hook.pluginVersion || null,
|
|
384
|
+
pluginSource: hook.pluginSource || null,
|
|
385
|
+
});
|
|
276
386
|
} catch (err) {
|
|
277
387
|
this._record(hook, {
|
|
278
388
|
ok: false,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import supervisor from "./async-hook-supervisor.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 runAsyncHook(command, options = {}) {
|
|
13
|
+
return _processDeps.run(command, [], {
|
|
14
|
+
...options,
|
|
15
|
+
origin: options.origin || "async-hook:command",
|
|
16
|
+
policy: "allow",
|
|
17
|
+
scope: "async-hook",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function runAsyncHookSupervisorCommand(command, args, options = {}) {
|
|
22
|
+
return _processDeps.runSync(command, args, {
|
|
23
|
+
...options,
|
|
24
|
+
origin: options.origin || "async-hook:supervisor",
|
|
25
|
+
policy: "allow",
|
|
26
|
+
scope: "async-hook",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class AsyncHookSupervisor extends supervisor.AsyncHookSupervisor {
|
|
31
|
+
constructor(options = {}) {
|
|
32
|
+
super({
|
|
33
|
+
...options,
|
|
34
|
+
run: options.run || options.spawn || runAsyncHook,
|
|
35
|
+
runSync:
|
|
36
|
+
options.runSync || options.spawnSync || runAsyncHookSupervisorCommand,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const { DEFAULT_TIMEOUT_MS, DEFAULT_MAX_CONCURRENT } = supervisor;
|
|
42
|
+
|
|
43
|
+
export default {
|
|
44
|
+
AsyncHookSupervisor,
|
|
45
|
+
DEFAULT_TIMEOUT_MS,
|
|
46
|
+
DEFAULT_MAX_CONCURRENT,
|
|
47
|
+
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
2
1
|
import {
|
|
3
2
|
closeSync,
|
|
4
3
|
existsSync,
|
|
@@ -21,6 +20,7 @@ import {
|
|
|
21
20
|
finishAgentWorktree,
|
|
22
21
|
validateAgentWorktree,
|
|
23
22
|
} from "./agent-worktree.js";
|
|
23
|
+
import executionBroker from "./process-execution-broker/index.js";
|
|
24
24
|
|
|
25
25
|
export const DEFAULT_HEARTBEAT_INTERVAL_MS = 5000;
|
|
26
26
|
export const DEFAULT_HEARTBEAT_STALE_MS = 120000;
|
|
@@ -42,6 +42,16 @@ export const PID_IDENTITY_TOLERANCE_MS = 60000;
|
|
|
42
42
|
const START_TIME_CACHE_TTL_MS = 10000;
|
|
43
43
|
const _startTimeCache = new Map();
|
|
44
44
|
|
|
45
|
+
function runSupervisorCommand(file, args, options, origin) {
|
|
46
|
+
return _deps.spawnSync(file, args, {
|
|
47
|
+
...options,
|
|
48
|
+
origin,
|
|
49
|
+
policy: "allow",
|
|
50
|
+
scope: "background-agent",
|
|
51
|
+
shell: false,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
45
55
|
/** CIM_DATETIME (`20260711120000.500000+480`) → epoch ms, null when unparseable. */
|
|
46
56
|
export function parseCimDateToMs(raw) {
|
|
47
57
|
const m =
|
|
@@ -77,7 +87,7 @@ function defaultReadProcessStartTimeMs(pid) {
|
|
|
77
87
|
// wmic first (fast, ~100-300ms); PowerShell CIM as fallback (wmic is
|
|
78
88
|
// removed from recent Windows 11 builds).
|
|
79
89
|
try {
|
|
80
|
-
const r =
|
|
90
|
+
const r = runSupervisorCommand(
|
|
81
91
|
"wmic",
|
|
82
92
|
[
|
|
83
93
|
"process",
|
|
@@ -88,6 +98,7 @@ function defaultReadProcessStartTimeMs(pid) {
|
|
|
88
98
|
"/value",
|
|
89
99
|
],
|
|
90
100
|
{ windowsHide: true, encoding: "utf8", timeout: 5000 },
|
|
101
|
+
"background-agent:process-start-time",
|
|
91
102
|
);
|
|
92
103
|
if (!r.error && r.status === 0) {
|
|
93
104
|
const m = /CreationDate=([^\r\n]+)/.exec(r.stdout || "");
|
|
@@ -101,10 +112,11 @@ function defaultReadProcessStartTimeMs(pid) {
|
|
|
101
112
|
const script =
|
|
102
113
|
`$p = Get-CimInstance Win32_Process -Filter 'ProcessId=${target}' -ErrorAction SilentlyContinue; ` +
|
|
103
114
|
"if ($p -and $p.CreationDate) { [DateTimeOffset]::new($p.CreationDate).ToUnixTimeMilliseconds() }";
|
|
104
|
-
const r =
|
|
115
|
+
const r = runSupervisorCommand(
|
|
105
116
|
"powershell",
|
|
106
117
|
["-NoProfile", "-NonInteractive", "-Command", script],
|
|
107
118
|
{ windowsHide: true, encoding: "utf8", timeout: 10000 },
|
|
119
|
+
"background-agent:process-start-time",
|
|
108
120
|
);
|
|
109
121
|
if (!r.error && r.status === 0) {
|
|
110
122
|
const n = Number(String(r.stdout || "").trim());
|
|
@@ -118,10 +130,15 @@ function defaultReadProcessStartTimeMs(pid) {
|
|
|
118
130
|
// POSIX: `ps -o lstart=` gives an absolute start timestamp on Linux + macOS
|
|
119
131
|
// (procps and BSD ps both support it; busybox ps does not → null → open).
|
|
120
132
|
try {
|
|
121
|
-
const r =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
133
|
+
const r = runSupervisorCommand(
|
|
134
|
+
"ps",
|
|
135
|
+
["-o", "lstart=", "-p", String(target)],
|
|
136
|
+
{
|
|
137
|
+
encoding: "utf8",
|
|
138
|
+
timeout: 5000,
|
|
139
|
+
},
|
|
140
|
+
"background-agent:process-start-time",
|
|
141
|
+
);
|
|
125
142
|
if (!r.error && r.status === 0) {
|
|
126
143
|
const t = Date.parse(String(r.stdout || "").trim());
|
|
127
144
|
if (Number.isFinite(t) && t > 0) return t;
|
|
@@ -147,13 +164,14 @@ function defaultKillProcessTree(pid, signal = "SIGKILL") {
|
|
|
147
164
|
if (target === process.pid) return false;
|
|
148
165
|
try {
|
|
149
166
|
if (process.platform === "win32") {
|
|
150
|
-
const r =
|
|
167
|
+
const r = runSupervisorCommand(
|
|
151
168
|
"taskkill",
|
|
152
169
|
["/PID", String(target), "/T", "/F"],
|
|
153
170
|
{
|
|
154
171
|
windowsHide: true,
|
|
155
172
|
encoding: "utf8",
|
|
156
173
|
},
|
|
174
|
+
"background-agent:process-tree-kill",
|
|
157
175
|
);
|
|
158
176
|
return !r.error && r.status === 0;
|
|
159
177
|
}
|
|
@@ -170,8 +188,8 @@ function defaultKillProcessTree(pid, signal = "SIGKILL") {
|
|
|
170
188
|
}
|
|
171
189
|
|
|
172
190
|
export const _deps = {
|
|
173
|
-
spawn,
|
|
174
|
-
spawnSync,
|
|
191
|
+
spawn: executionBroker.spawn.bind(executionBroker),
|
|
192
|
+
spawnSync: executionBroker.spawnSync.bind(executionBroker),
|
|
175
193
|
// Single POSIX signal seam: every kill this module issues goes through here
|
|
176
194
|
// so tests can stub it — a bare `process.kill` is NOT interceptable and a
|
|
177
195
|
// fixture recording a live pid would eat a REAL signal (the shard-2/4
|
|
@@ -741,7 +759,7 @@ export function resumeBackgroundAgent(id, prompt, options = {}) {
|
|
|
741
759
|
}
|
|
742
760
|
|
|
743
761
|
/**
|
|
744
|
-
* Fail fast on an unusable cwd. Without this,
|
|
762
|
+
* Fail fast on an unusable cwd. Without this, process launch surfaces a bad cwd as
|
|
745
763
|
* an ASYNC 'error' event on the detached child — which nothing listened to
|
|
746
764
|
* (uncaught exception with no context) — and the pre-written state/job files
|
|
747
765
|
* stayed behind as a phantom "running" session. Deleted, file-replaced, and
|
|
@@ -826,6 +844,10 @@ export function launchBackgroundAgent({
|
|
|
826
844
|
detached: true,
|
|
827
845
|
stdio: "ignore",
|
|
828
846
|
windowsHide: true,
|
|
847
|
+
origin: "background-agent:worker",
|
|
848
|
+
policy: "allow",
|
|
849
|
+
scope: "background-agent",
|
|
850
|
+
shell: false,
|
|
829
851
|
});
|
|
830
852
|
} catch (error) {
|
|
831
853
|
rmSync(jobFile, { force: true });
|
|
@@ -922,13 +944,14 @@ export function stopBackgroundAgent(id) {
|
|
|
922
944
|
return { ...lost, stopped: false };
|
|
923
945
|
}
|
|
924
946
|
if (process.platform === "win32") {
|
|
925
|
-
const killed =
|
|
947
|
+
const killed = runSupervisorCommand(
|
|
926
948
|
"taskkill",
|
|
927
949
|
["/PID", String(state.pid), "/T", "/F"],
|
|
928
950
|
{
|
|
929
951
|
windowsHide: true,
|
|
930
952
|
encoding: "utf8",
|
|
931
953
|
},
|
|
954
|
+
"background-agent:stop-tree",
|
|
932
955
|
);
|
|
933
956
|
if (killed.error || (killed.status !== 0 && isProcessAlive(state.pid))) {
|
|
934
957
|
throw new Error(
|