chainlesschain 0.162.175 → 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 +10 -10
- package/src/assets/web-panel/assets/{AIOps-DherW0Rh.js → AIOps-DT-VPWuN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CDGfqt2Y.js → ActionButton-DyOreOVN.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BYhkzdgD.js → Analytics-DslNsKux.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-cEKk1cpb.js → AppLayout-BNJJAYME.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-_aXR3WWc.js → Artifacts-DoaAtEcY.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CYAf-gY7.js → Audit-DPG3WdJ9.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D4Q20phR.js → BackgroundAgents-C_JO6R5G.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-Cq0Tyk58.js → Backup-Cv3BooyX.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CPj_CdAv.js → BaseInput-D2uQXWu-.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BQ-Qq0es.js → Chat-B4Vczyf3.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DE6reP99.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-rke6l3yg.js → Checkbox-qTgk4VeP.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DiacrIPq.js → Codegen-DlLWcIzj.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Cx3BY-Up.js → Col-DNO73qp7.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DfmWiQy8.js → Community-vRDNpc4j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DdQnpxy5.js → Compact-CEWtIXni.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-lzliOH_r.js → Compliance-KgYC9Fxi.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CYx4Un5k.js → Cowork-zj5wvkpT.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BGDcPFlo.js → Cron-BLDoCozU.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-0_X5g2ri.js → Crosschain-BYnff4VY.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C0PEf3Eu.js → DID-C75VFsVm.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DULQjQ58.js → Dashboard-C4Gutni2.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DGRHRbW6.js → Dropdown-B5dbO4Kx.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ChX8XPwB.js → EmailListRenderer-BDipZtHJ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dyq6IBNu.js → FamilyGuardDashboard-DmIzt8jj.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DH1NfAL2.js → Federation-D9QOS-uW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BN1I_uNi.js → FormItemContext-B47HRwAm.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Dq_2UYpe.js → GenericCardRenderer-3R4mXmgV.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BAy1yvI2.js → Git-DrNXZf1C.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Db6Q2iSy.js → Governance-BGd7JR98.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-0ub6yHcr.js → Inference-D-2he1ed.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DtLetM36.js → KnowledgeGraph-C0sHIbK5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Bcoy7CUd.js → Logs-DiBQO-jL.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BfEMFAXf.js → MarkdownRenderer-DL_5eV2D.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-tt2rzwRR.js → Marketplace-VR59OdrC.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BhOgX-MU.js → McpTools-DrPzwSd3.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BJUxeWBL.js → Memory-CBgKALwQ.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BwUY2G9w.js → MobileBridge-pQ9Tn-Mn.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BLRfHhqi.js → MobileProjects-mASB6jyj.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B2WMboOm.js → Mtc-DTMgE7HC.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-8pNEXO63.js → MtcAudit-CwTnCtiL.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C1wm5a_1.js → Multisig-ngm6WU8f.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C1QpKF7g.js → NLProgramming-4YO4Qww9.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CiQUcxFu.js → Notes-DP1k45mF.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BblDPJ_x.js → NotificationSettings-r2H8yPKb.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DRjYcPtb.js → OrderTableRenderer-CoM_Zw0J.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dp3VKB0X.js → Organization-DrO7jRWS.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Czx161m9.js → Overflow-Cnwu4i4t.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-ClFi6wOs.js → P2P-zi-cDwA_.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CRweW0lz.js → PdhVaultBrowser-DBEryDv7.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BzcRoqTn.js → Permissions-lqXK2C3x.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-ChGTpNMd.js → PersonalDataHub-b63T3HJM.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BMOOpKWA.js → Pipeline-Kep5KAGW.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D0AZHObH.js → Privacy-CHdvOAh1.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-yYFlZ6Ja.js → ProjectInit-BhKfdwe9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DJNVuMQs.js → ProjectSettings-Yavk9K8A.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Br0rBWH1.js → Projects-CN8E_5Mq.js} +1 -1
- package/src/assets/web-panel/assets/Providers-Bfym6SQn.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-81NZOitV.js → QrScannerModal-CLSQcrlR.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Dic2lCbJ.js → QuickAsk-VPa2WKQN.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Dh9iwViE.js → Recommend-CGXR8jVU.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Bq9VYEFy.js → RemoteSession-C_20YfMB.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CxFZ-NbJ.js → Reputation-awZh68UV.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BVSLcaX2.js → Row-Ctb4oiYN.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BbC-5DOH.js → RssFeed-D3sdjvUV.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BfjZ1GCr.js → Search-C-zfA4kT.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CVjhOV5r.js → Security-D9XlmHA3.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D45u-Aqe.js → Services-C3UKnr41.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-WkGoK4he.js → Skeleton-BQxagZfF.js} +1 -1
- package/src/assets/web-panel/assets/Skills-q6eb6KPZ.js +1 -0
- package/src/assets/web-panel/assets/{Sla-Bf4QTF3E.js → Sla-DveENvek.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DVpZdbMN.js → SpeechSettings-BFjXLNgF.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DEEojoMS.js → SyncSettings-BpHgbaP9.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DvepRb8-.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Bzl-9wY5.js → Templates-DEiaoyve.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-0khxUOB8.js → Tenant-ITg774nY.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DWGYhAYU.js → Terminal-D3ZBcvnb.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-B0Y4LONc.js → TimelineRenderer-BsLU6JjU.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DEE07SFh.js → Tokens-Cb5Pquc9.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BM7xvA5z.js → Trigger-Dwfy-m9N.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-Dv3ijvvZ.js → Trust-CnlSRGG0.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B1-enmMt.js → UkeySign-Y4TlvKVo.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DYiIPByd.js → VideoEditing-BpKLtTTO.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D-y374BQ.js → Wallet-LLBzIq8x.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-HBDjcUhi.js → WebAuthn-BeSRiusP.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-sKn4qTID.js → WorkflowEditor-BK_l1tXO.js} +1 -1
- package/src/assets/web-panel/assets/{chat-TVYhaBXj.js → chat-DYd-X7Wg.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DMADxY9v.js → colors-C9uip71j.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-OftcHpO_.js → compact-item-JBrfjUP6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DW1zVUSN.js → createContext-D03fbuiq.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B8LQ8leS.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CaUathNp.js → hasIn-DLQOR6l-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cmdv6Dev.js → index-5YN7F5bO.js} +1 -1
- package/src/assets/web-panel/assets/{index-iDmgT2Dg.js → index-6GuLRpBQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-77kgkUgY.js → index-B0X76LjX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CM8W07sc.js → index-B46YcgsV.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9JoaYSs.js → index-BNCdRmWf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpDtN0dl.js → index-BYv-LWdy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZXYI5LU.js → index-Ba-Ps_AJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWVZ3T0t.js → index-BcBZwlnG.js} +1 -1
- package/src/assets/web-panel/assets/{index--5UvwqH_.js → index-BdH9l8wl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBNg08cD.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-s-EnkUCn.js → index-BnQgRjsm.js} +1 -1
- package/src/assets/web-panel/assets/{index-Lr0MO-GU.js → index-BpYKLrUT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-19mFhn.js → index-BuNFCZCx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeCIYYG7.js → index-ByHO3SqZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-hXq7QRA_.js → index-C2zmOsyD.js} +1 -1
- package/src/assets/web-panel/assets/{index-8YelceUU.js → index-CChQBM1d.js} +1 -1
- package/src/assets/web-panel/assets/{index-B52Ztt8Q.js → index-CChaISMb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKjqFpYa.js → index-CILVyK3b.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAfT3EMd.js → index-CL0ixCxk.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm1sGIxW.js → index-CS63r8h3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHi634g9.js → index-CVZWiUE_.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEzLLVYd.js → index-Ce0Bf1YF.js} +1 -1
- package/src/assets/web-panel/assets/index-CeVrHLzZ.js +1 -0
- package/src/assets/web-panel/assets/{index-pSVCBsG4.js → index-Ck17i0OD.js} +1 -1
- package/src/assets/web-panel/assets/{index-GUKz4Pv9.js → index-Cpn19c9k.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKNdnJRo.js → index-CqWk1FLG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bg-7FpaL.js → index-CwoDpKzW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYwwUKDg.js → index-D-1SqEpQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZdT8nio.js → index-D4UY5Z60.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvRw4Fna.js → index-D8KvuDz0.js} +1 -1
- package/src/assets/web-panel/assets/{index-kdMl_0zL.js → index-DNMAAUVk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CK-p7Hji.js → index-DYLZY4uh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXcqvWBp.js → index-DaokIHt3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFVbDpqg.js → index-Q7mmL6w4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ1PjRY3.js → index-SO6lgMg0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSp1Ofvx.js → index-iahNhZwm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BupSWDcl.js → index-l08afIbV.js} +1 -1
- package/src/assets/web-panel/assets/{index-D63QVAiJ.js → index-rIxxfdTN.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DdcKTlQR.js → initDefaultProps-CG9z1c6w.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CL-hTBQj.js → motion-B1Ky7Zff.js} +1 -1
- package/src/assets/web-panel/assets/{move-qYSAkxNG.js → move-DME8X2P1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-ZwRSZtRP.js → mtc-parser-cuJYSWB7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Bld-8ftI.js → omit-UI_EE0uZ.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DGHs-a9Z.js → pickAttrs-BIoE_Z_V.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DRQPMyI5.js → placementArrow-B48-9HKN.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-C5MJG_Yo.js → responsiveObserve-D7x_GDgD.js} +1 -1
- package/src/assets/web-panel/assets/{slide-VZ-fpZCD.js → slide-DjzC5_7m.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9ocfCyHk.js → statusUtils-C6BIymhh.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B6QAwAN5.js → styleChecker-B4dGrdD9.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Bq1twor3.js → useFlexGapSupport-Bken4aNE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DKZq96tz.js → useFs-BMlqECqv.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D0RmRVXf.js → usePersonalDataHub-DLdrfmMa.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D6kEj_tt.js → vnode-CKJQmxa0.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-2yfasoQf.js → zoom-CaZunuau.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/auth/npm-auth.js +30 -5
- package/src/commands/agenda.js +83 -5
- package/src/commands/agent.js +42 -4
- 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/config.js +70 -5
- package/src/commands/context.js +36 -2
- package/src/commands/eval.js +21 -6
- package/src/commands/hook.js +2 -2
- package/src/commands/hub.js +19 -1
- package/src/commands/loop.js +9 -2
- package/src/commands/memory.js +21 -6
- package/src/commands/permissions.js +57 -1
- package/src/commands/plugin.js +2 -0
- package/src/commands/review.js +23 -11
- package/src/commands/routine.js +31 -8
- package/src/commands/session.js +11 -3
- package/src/commands/skill.js +2 -0
- package/src/commands/statusline.js +3 -3
- package/src/commands/team.js +20 -7
- package/src/commands/update.js +65 -10
- package/src/data/changelog.json +293 -51
- package/src/gateways/terminal/PtyManager.js +8 -1
- package/src/gateways/ws/message-dispatcher.js +3 -0
- package/src/gateways/ws/session-protocol.js +26 -0
- package/src/gateways/ws/ws-agent-handler.js +107 -69
- package/src/gateways/ws/ws-server.js +74 -2
- package/src/harness/background-task-manager.js +18 -6
- package/src/harness/background-task-worker.js +11 -18
- package/src/harness/jsonl-session-store.js +13 -6
- package/src/harness/mcp-client.js +195 -2
- package/src/harness/worktree-isolator.js +18 -21
- package/src/lib/__tests__/personal-data-hub-aichat-wizard.test.js +15 -0
- package/src/lib/agent-coordinator.js +4 -0
- package/src/lib/agent-core.js +5 -0
- package/src/lib/agent-ipc-bus.js +44 -5
- package/src/lib/agent-sandbox.js +16 -2
- package/src/lib/agent-schedule-store.js +55 -0
- package/src/lib/agent-team/team-worktree.js +28 -6
- package/src/lib/agent-tool-admission.js +104 -0
- package/src/lib/agent-worktree.js +20 -19
- package/src/lib/api-key-helper.js +10 -2
- package/src/lib/async-hook-supervisor.cjs +135 -15
- 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 +76 -11
- package/src/lib/channels/channel-manager.js +6 -0
- package/src/lib/channels/telegram-channel.js +11 -1
- package/src/lib/channels/webhook-channel.js +15 -3
- package/src/lib/checkpoint-store.js +10 -2
- 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/cloud/bundle.js +12 -2
- package/src/lib/code-review.js +32 -8
- package/src/lib/computer-use/control-backend.js +18 -3
- package/src/lib/context-breakdown.js +46 -0
- package/src/lib/context-source-ledger.js +43 -0
- package/src/lib/diff-review-follow-up.js +154 -0
- package/src/lib/doctor-checkup.js +18 -6
- package/src/lib/downloader.js +17 -3
- package/src/lib/ensure-utf8.js +11 -3
- package/src/lib/eval/tasks.js +25 -31
- package/src/lib/event-runtime-producer.js +58 -0
- package/src/lib/event-runtime-store.js +354 -0
- package/src/lib/event-runtime-worker.js +109 -0
- package/src/lib/execution-backend.js +72 -21
- package/src/lib/git-integration.js +19 -4
- package/src/lib/hook-manager.js +6 -15
- package/src/lib/hook-runner.cjs +88 -8
- package/src/lib/hook-runner.js +55 -0
- package/src/lib/hooks-v2-producers.js +15 -0
- package/src/lib/hooks-v2-runtime.js +70 -21
- package/src/lib/host-adb-bridge.js +129 -24
- package/src/lib/ide-context.js +128 -1
- package/src/lib/interaction-adapter.js +39 -0
- package/src/lib/json-schema-validate.js +190 -36
- package/src/lib/lan-pairing-preflight.js +13 -2
- 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/__tests__/lsp-server-registry.test.js +18 -0
- package/src/lib/lsp/benchmark.js +20 -4
- package/src/lib/lsp/lsp-client.js +22 -3
- package/src/lib/lsp/lsp-manager.js +4 -0
- package/src/lib/lsp/lsp-server-registry.js +11 -2
- package/src/lib/mcp-oauth.js +8 -2
- package/src/lib/npm-invocation.js +29 -0
- package/src/lib/orchestrator.js +8 -2
- package/src/lib/packer/pack-update-applier.js +14 -2
- package/src/lib/packer/pkg-runner.js +13 -2
- package/src/lib/packer/precheck.js +33 -16
- package/src/lib/packer/smoke-runner.js +18 -5
- package/src/lib/packer/web-panel-builder.js +16 -2
- package/src/lib/paths.js +1 -1
- package/src/lib/permission-rules.cjs +5 -1
- package/src/lib/personal-data-hub-aichat-wizard.js +22 -6
- package/src/lib/personal-data-hub-wiring.js +27 -3
- package/src/lib/plan-mode.js +204 -11
- package/src/lib/plugin-monitor-supervisor.js +48 -6
- package/src/lib/plugin-runtime/bin.js +45 -0
- package/src/lib/plugin-runtime/hooks.js +14 -1
- package/src/lib/plugin-runtime/install.js +11 -3
- package/src/lib/plugin-runtime/lsp.js +3 -0
- package/src/lib/plugin-runtime/mcp.js +8 -1
- package/src/lib/plugin-runtime/monitors.js +4 -0
- package/src/lib/plugin-runtime/plugin-options.js +74 -7
- package/src/lib/plugin-runtime/signature.js +45 -0
- package/src/lib/pr-create.js +21 -8
- package/src/lib/pr-link-ledger.js +15 -3
- package/src/lib/process-execution-broker/credential-agent.js +23 -3
- package/src/lib/process-execution-broker/index.js +315 -38
- package/src/lib/process-execution-broker/patch-child-process.js +2 -3
- package/src/lib/process-manager.js +18 -3
- package/src/lib/publish-workspace.js +14 -6
- package/src/lib/repl-bang-memorize.js +10 -2
- package/src/lib/repl-goal.js +19 -2
- package/src/lib/secret-store.js +159 -0
- package/src/lib/service-manager.js +64 -29
- package/src/lib/settings-hook-events.cjs +74 -9
- package/src/lib/settings-hook-events.js +20 -0
- package/src/lib/settings-hooks.cjs +4 -0
- package/src/lib/side-effect-ledger.js +22 -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/lib/sub-agent-context.js +5 -0
- package/src/lib/sub-agent-profiles.js +4 -0
- package/src/lib/turn-context.js +14 -8
- package/src/lib/unattended-action-policy.js +83 -0
- package/src/lib/update-notice.js +6 -2
- package/src/lib/with-file-lock.js +7 -0
- package/src/lib/ws-server.js +1 -0
- package/src/repl/agent-repl.js +60 -23
- package/src/repl/clipboard-copy.js +8 -2
- package/src/repl/pr-comments.js +30 -7
- package/src/runtime/agent-core.js +554 -118
- package/src/runtime/agent-runtime.js +1 -0
- package/src/runtime/coding-agent-contract-shared.cjs +52 -0
- package/src/runtime/coding-agent-policy.cjs +20 -0
- package/src/runtime/diagnostics.js +73 -8
- package/src/runtime/headless-runner.js +88 -10
- package/src/runtime/headless-stream.js +343 -21
- package/src/runtime/mcp-config.js +16 -1
- 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-Ci97vNTs.js +0 -1
- package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +0 -1
- package/src/assets/web-panel/assets/Skills-D_jvQZcj.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DFwxpLIk.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +0 -1
- package/src/assets/web-panel/assets/index-CSgUfMTM.js +0 -1
- package/src/assets/web-panel/assets/index-DliSZvAP.js +0 -1
|
@@ -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 };
|
|
@@ -83,6 +83,10 @@ export class SubAgentContext {
|
|
|
83
83
|
// nested spawns (threaded into the loop options so a nested spawn_sub_agent
|
|
84
84
|
// reads it as ctx.subAgentContract).
|
|
85
85
|
this.subAgentContract = options.subAgentContract || null;
|
|
86
|
+
// Optional session-level Extension Tier admission policy. Keep it as an
|
|
87
|
+
// explicit inherited capability so child loops cannot silently bypass the
|
|
88
|
+
// parent's admission decision.
|
|
89
|
+
this.toolAdmission = options.toolAdmission || null;
|
|
86
90
|
// Skill capability INTERSECT: null = unrestricted; a list (possibly empty)
|
|
87
91
|
// restricts run_skill/list_skills in this context's loop to those skills.
|
|
88
92
|
this.skillAllowlist =
|
|
@@ -335,6 +339,7 @@ export class SubAgentContext {
|
|
|
335
339
|
subAgentBudget: this.subAgentBudget,
|
|
336
340
|
// This context's effective contract = the ceiling for its nested spawns.
|
|
337
341
|
subAgentContract: this.subAgentContract,
|
|
342
|
+
toolAdmission: this.toolAdmission,
|
|
338
343
|
// Skill allow-list restricting run_skill/list_skills in this loop.
|
|
339
344
|
skillAllowlist: this.skillAllowlist,
|
|
340
345
|
// Parent trace for hook envelopes (absent → key omitted, no parent_id).
|
|
@@ -30,6 +30,8 @@ const FULL_TOOLS = Object.freeze([
|
|
|
30
30
|
"write_file",
|
|
31
31
|
"edit_file",
|
|
32
32
|
"edit_file_hashed",
|
|
33
|
+
"delete_file",
|
|
34
|
+
"move_file",
|
|
33
35
|
"list_dir",
|
|
34
36
|
"search_files",
|
|
35
37
|
"search_sessions",
|
|
@@ -49,6 +51,8 @@ const DESIGN_TOOLS = Object.freeze([
|
|
|
49
51
|
"write_file",
|
|
50
52
|
"edit_file",
|
|
51
53
|
"edit_file_hashed",
|
|
54
|
+
"delete_file",
|
|
55
|
+
"move_file",
|
|
52
56
|
"list_dir",
|
|
53
57
|
"search_files",
|
|
54
58
|
"web_fetch",
|
package/src/lib/turn-context.js
CHANGED
|
@@ -11,21 +11,23 @@
|
|
|
11
11
|
* @module turn-context
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { execSync } from "child_process";
|
|
15
14
|
import path from "path";
|
|
15
|
+
import { executionBroker } from "./process-execution-broker/index.js";
|
|
16
16
|
|
|
17
|
-
const _deps = {
|
|
17
|
+
const _deps = {
|
|
18
|
+
execFileSync: (...args) => executionBroker.execFileSync(...args),
|
|
19
|
+
};
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* Run a git command with stdio pipe and return stdout or null.
|
|
21
|
-
* @param {string}
|
|
23
|
+
* @param {string[]} args
|
|
22
24
|
* @param {string} cwd
|
|
23
25
|
* @returns {string|null}
|
|
24
26
|
*/
|
|
25
|
-
function _git(
|
|
27
|
+
function _git(args, cwd) {
|
|
26
28
|
try {
|
|
27
29
|
return _deps
|
|
28
|
-
.
|
|
30
|
+
.execFileSync("git", args, {
|
|
29
31
|
cwd,
|
|
30
32
|
encoding: "utf-8",
|
|
31
33
|
stdio: ["ignore", "pipe", "ignore"],
|
|
@@ -33,6 +35,10 @@ function _git(cmd, cwd) {
|
|
|
33
35
|
// `status --porcelain` on a dirty repo with many files can exceed the
|
|
34
36
|
// 1 MB execSync default → ENOBUFS → null → "(clean)" misreport below.
|
|
35
37
|
maxBuffer: 16 * 1024 * 1024,
|
|
38
|
+
origin: "context:git",
|
|
39
|
+
policy: "allow",
|
|
40
|
+
scope: "context",
|
|
41
|
+
shell: false,
|
|
36
42
|
})
|
|
37
43
|
.trim();
|
|
38
44
|
} catch (_e) {
|
|
@@ -60,10 +66,10 @@ export function buildTurnContext({
|
|
|
60
66
|
lines.push(`## Turn context (iteration ${iteration})`);
|
|
61
67
|
lines.push(`- cwd: ${path.resolve(cwd)}`);
|
|
62
68
|
|
|
63
|
-
const branch = _git("rev-parse --abbrev-ref HEAD", cwd);
|
|
69
|
+
const branch = _git(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
64
70
|
if (branch) {
|
|
65
|
-
const head = _git("rev-parse --short HEAD", cwd);
|
|
66
|
-
const status = _git("status --porcelain", cwd);
|
|
71
|
+
const head = _git(["rev-parse", "--short", "HEAD"], cwd);
|
|
72
|
+
const status = _git(["status", "--porcelain"], cwd);
|
|
67
73
|
// Distinguish "command failed" (null — timeout / huge output) from "" (truly
|
|
68
74
|
// clean): the old `status && …` reported a repo as "(clean)" whenever status
|
|
69
75
|
// couldn't be determined, which is a wrong signal to the model.
|
|
@@ -121,6 +121,89 @@ export function classifyActionRisk(actionClass) {
|
|
|
121
121
|
return "conditional"; // push — depends on branch protection
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Classify a shell command before it reaches the process broker. This is a
|
|
126
|
+
* deliberately conservative, token-free classifier: compound commands use
|
|
127
|
+
* the highest-risk segment and unknown commands remain unknown so an
|
|
128
|
+
* unattended caller can fail closed.
|
|
129
|
+
*/
|
|
130
|
+
export function classifyShellAction(command) {
|
|
131
|
+
if (typeof command !== "string" || !command.trim()) return null;
|
|
132
|
+
const segments = command
|
|
133
|
+
.split(/&&|\|\||[;\n]|\|/)
|
|
134
|
+
.map((part) =>
|
|
135
|
+
part
|
|
136
|
+
.trim()
|
|
137
|
+
.replace(/^(?:env\s+)?(?:sudo\s+)?(?:command\s+)?/i, "")
|
|
138
|
+
.toLowerCase(),
|
|
139
|
+
)
|
|
140
|
+
.filter(Boolean);
|
|
141
|
+
const classifySegment = (segment) => {
|
|
142
|
+
if (/^git\s+push\b/.test(segment)) return ACTION_CLASS.PUSH;
|
|
143
|
+
if (/^git\s+(?:merge|rebase|cherry-pick)\b/.test(segment)) {
|
|
144
|
+
return ACTION_CLASS.MERGE;
|
|
145
|
+
}
|
|
146
|
+
if (/^(?:npm|pnpm|yarn|bun)\s+publish\b/.test(segment)) {
|
|
147
|
+
return ACTION_CLASS.PUBLISH;
|
|
148
|
+
}
|
|
149
|
+
if (
|
|
150
|
+
/^(?:terraform\s+(?:apply|destroy)|pulumi\s+up|kubectl\s+(?:apply|delete|rollout)|helm\s+(?:install|upgrade)|docker\s+push)\b/.test(
|
|
151
|
+
segment,
|
|
152
|
+
)
|
|
153
|
+
) {
|
|
154
|
+
return segment.startsWith("docker push")
|
|
155
|
+
? ACTION_CLASS.DEPLOY
|
|
156
|
+
: ACTION_CLASS.INFRA_MUTATION;
|
|
157
|
+
}
|
|
158
|
+
if (/\b(?:deploy|rollout)\b/.test(segment)) return ACTION_CLASS.DEPLOY;
|
|
159
|
+
if (/^(?:git\s+(?:status|diff|log|show|branch)|ls\b|dir\b|pwd\b|cat\b|type\b|rg\b|grep\b|find\b|where\b)/.test(segment)) {
|
|
160
|
+
return ACTION_CLASS.READ;
|
|
161
|
+
}
|
|
162
|
+
if (/^(?:npm|pnpm|yarn|bun)\s+(?:test|run\s+(?:test|lint|build)|install\b)/.test(segment) || /^(?:pytest|vitest|jest|cargo\s+test|go\s+test)\b/.test(segment)) {
|
|
163
|
+
return ACTION_CLASS.LOCAL_WRITE;
|
|
164
|
+
}
|
|
165
|
+
if (/^echo\b/.test(segment) && />/.test(segment)) {
|
|
166
|
+
return ACTION_CLASS.LOCAL_WRITE;
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
};
|
|
170
|
+
const rank = [
|
|
171
|
+
ACTION_CLASS.READ,
|
|
172
|
+
ACTION_CLASS.LOCAL_WRITE,
|
|
173
|
+
ACTION_CLASS.COMMIT,
|
|
174
|
+
ACTION_CLASS.PUSH,
|
|
175
|
+
ACTION_CLASS.PUBLISH,
|
|
176
|
+
ACTION_CLASS.MERGE,
|
|
177
|
+
ACTION_CLASS.DEPLOY,
|
|
178
|
+
ACTION_CLASS.INFRA_MUTATION,
|
|
179
|
+
ACTION_CLASS.EXTERNAL_MESSAGE,
|
|
180
|
+
];
|
|
181
|
+
const classified = segments.map(classifySegment);
|
|
182
|
+
return classified.reduce((highest, current) => {
|
|
183
|
+
if (!current) return null;
|
|
184
|
+
if (!highest) return current;
|
|
185
|
+
return rank.indexOf(current) > rank.indexOf(highest) ? current : highest;
|
|
186
|
+
}, null);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Apply the unattended policy to a shell command, including protected push targets. */
|
|
190
|
+
export function evaluateUnattendedShellAction(command, params = {}) {
|
|
191
|
+
const actionClass = classifyShellAction(command);
|
|
192
|
+
const protectedBranch =
|
|
193
|
+
params.protectedBranch === true ||
|
|
194
|
+
/\bgit\s+push\b[^\n]*(?:^|\s)(?:main|master|develop|production)(?:\s|$)/i.test(
|
|
195
|
+
command || "",
|
|
196
|
+
);
|
|
197
|
+
return {
|
|
198
|
+
actionClass,
|
|
199
|
+
...evaluateUnattendedAction({
|
|
200
|
+
...params,
|
|
201
|
+
actionClass,
|
|
202
|
+
protectedBranch,
|
|
203
|
+
}),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
124
207
|
/**
|
|
125
208
|
* Decide whether a fired task may perform one action. Fail-closed.
|
|
126
209
|
*
|
package/src/lib/update-notice.js
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
import fsDefault from "fs";
|
|
6
6
|
import pathDefault from "path";
|
|
7
7
|
import osDefault from "os";
|
|
8
|
-
import { spawn as spawnDefault } from "child_process";
|
|
9
8
|
import { fileURLToPath } from "url";
|
|
10
9
|
import chalk from "chalk";
|
|
11
10
|
import semver from "semver";
|
|
12
11
|
import { VERSION } from "../constants.js";
|
|
13
12
|
import { readDiskVersion } from "./version-skew.js";
|
|
13
|
+
import { executionBroker } from "./process-execution-broker/index.js";
|
|
14
14
|
|
|
15
15
|
export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
16
16
|
export const NPM_LATEST_URL =
|
|
@@ -19,7 +19,7 @@ export const _deps = {
|
|
|
19
19
|
fs: fsDefault,
|
|
20
20
|
path: pathDefault,
|
|
21
21
|
os: osDefault,
|
|
22
|
-
spawn:
|
|
22
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
export function cachePath(deps = _deps) {
|
|
@@ -95,6 +95,10 @@ export function maybeNotifyUpdate(opts = {}) {
|
|
|
95
95
|
detached: true,
|
|
96
96
|
stdio: "ignore",
|
|
97
97
|
windowsHide: true,
|
|
98
|
+
origin: "update:notice-refresh",
|
|
99
|
+
policy: "allow",
|
|
100
|
+
scope: "update",
|
|
101
|
+
shell: false,
|
|
98
102
|
});
|
|
99
103
|
if (child && typeof child.unref === "function") child.unref();
|
|
100
104
|
out.spawned = true;
|
|
@@ -26,6 +26,7 @@ export function withFileLock(targetPath, fn, opts = {}) {
|
|
|
26
26
|
_fs = defaultFs,
|
|
27
27
|
_now = () => Date.now(),
|
|
28
28
|
_sleep = sleepSync,
|
|
29
|
+
failIfUnavailable = false,
|
|
29
30
|
} = opts;
|
|
30
31
|
|
|
31
32
|
const lockDir = `${targetPath}.lock`;
|
|
@@ -54,6 +55,12 @@ export function withFileLock(targetPath, fn, opts = {}) {
|
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
57
|
|
|
58
|
+
if (!held && failIfUnavailable) {
|
|
59
|
+
const error = new Error(`Could not acquire state lock: ${targetPath}`);
|
|
60
|
+
error.code = "STATE_LOCK_UNAVAILABLE";
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
|
|
57
64
|
try {
|
|
58
65
|
return fn({ locked: held });
|
|
59
66
|
} finally {
|