chainlesschain 0.166.10 → 0.166.14
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 +33 -0
- package/bin/chainlesschain.js +5 -0
- package/package.json +4 -2
- package/src/assets/web-panel/assets/{AIOps-CLYBDAGv.js → AIOps-C8SyFhOo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CpeSttcu.js → ActionButton-Dup5gFK0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Ba1TNLG0.js → Analytics-8FyOWA7V.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-xBy8EOeg.js → AppLayout-DBzdU9dg.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-CJ_3TFb8.js → Artifacts-C_0Z8gNy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DUATFCG3.js → Audit-Cf2a-58m.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BRXYPIGp.js → BackgroundAgents-M7w-2zgB.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D8auLx7y.js → Backup-CCTHQXoL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CBgdslQ3.js → BaseInput-DjXpeFwJ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B32LvAiE.js → Chat-cAvchsJU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVfvAy-n.js → ChatBubbleRenderer-DvEvxlZv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BwzBxOpC.js → Checkbox-DKs6qvOn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-0U5vrg1H.js → Codegen-DlkA7b9X.js} +1 -1
- package/src/assets/web-panel/assets/{Col-dZ2i4aAj.js → Col-CkfdKhyJ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-UVvpLr8c.js → Community-iNXMHzj6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BDNEb1Bd.js → Compact-DQxPEd09.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BrzQPxyS.js → Compliance-CSKvMCjs.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BbgGsu-9.js → Cowork-CkWqazpD.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-G321XPhp.js → Cron-k6W8IzhB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgLNUyMn.js → Crosschain-C8MS1OuY.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BAfRj18q.js → DID-DJuCcgiQ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BNIxA4TK.js → Dashboard-LeThKzp3.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BLAUmCAN.js → Dropdown-BvxwgpE4.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsnhTW22.js → EmailListRenderer-n3e_a1M3.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-zcQ7Ip1n.js → FamilyGuardDashboard-509W6W6v.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-KFwxodNU.js → Federation-xgZReQm0.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-3CYRLEHG.js → FormItemContext-jZOhKcQx.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D3d9D8L9.js → GenericCardRenderer-Jo0ULzHv.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BJ202nJY.js → Git-BsRcyWQP.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-ClnnXVQ-.js → Governance-JlpMYTAk.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DNU-PTkc.js → Inference-CUEz872-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DJuinbuY.js → KnowledgeGraph-DgrvvEDU.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D4No-46s.js → Logs-Df-KY4U3.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Ba-KqRN3.js → Marketplace-kPZDTOeI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DVoxnPgE.js → McpTools-CRRzPqNX.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-D_C8gzAZ.js → Memory-D6pNSkg9.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DnzTPcDH.js → MobileBridge-g-pvtwRC.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bzayfrfe.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-CvEHmHId.js → Mtc-B7S3W-XL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-VNJmWqmv.js → MtcAudit-B8OMEWVb.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BO0x_Vsa.js → Multisig-CowRp7GH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CM2gI1UY.js → NLProgramming-BkQNyi4c.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CMc1HsML.js → Notes-Cm7gtkKz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DGNmSKGM.js → NotificationSettings-CbPTVh9m.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Du-Kct3p.js → OrderTableRenderer-Dswi26mJ.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DRtRZjas.js → Organization-BkjQ9yy7.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dp4OeWsn.js → Overflow-DmRFXP7Y.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DXMJVls8.js → P2P-DQE1toAu.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BujyoDRG.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D1Hbb51o.js → Permissions-xSjfOaiU.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BridiDhr.js → PersonalDataHub-B9ICLqVP.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-B4bUNCm1.js → Pipeline-CUNwyN9E.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BTu_HEqK.js → Privacy-SOoCricX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-SVtL2hnt.js → ProjectInit-CSaFul0F.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B2Sh7JZ2.js → ProjectSettings-CueiB_oe.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BwU1xalW.js → Projects-BOeXvU7y.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BWdWQSDw.js → Providers-CTqf_31h.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brzc-Sxb.js → QrScannerModal-C8ZP31E9.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DIBz7FCe.js → QuickAsk-CPgn4713.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CZ8RriIJ.js → Recommend-8_e0zw0i.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-CM0KJQ3t.js → RemoteSession-iT7lbGqw.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-D_wo8H0O.js → Reputation-B4q9SUOz.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D1G1fD7N.js → Row-CA_nASyL.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-dKCVtA0K.js → RssFeed-Cwb0E3yv.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Be1D61xo.js → Search-D9iVsOxJ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-IbNiR6OC.js → Security-DPLbYchG.js} +3 -3
- package/src/assets/web-panel/assets/{Services-nuHK8y8p.js → Services-DGMVL_LF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DnM5jdnC.js → Skeleton-B_6kym0D.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DCTdoq_q.js → Skills-Ds6r0dXB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DlWun-Ui.js → Sla-BLHAbBhb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C19kv2sd.js → SpeechSettings-CZuddd14.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CkQIR_Hu.js → SyncSettings-CdBq7oSl.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DdbqOEbs.js → Tasks-DfT60Nyl.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-B7GpIXeo.js → Templates-RLfsKy2V.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-ByEstFhY.js → Tenant-Cw8xCNLE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BKRVID1a.js → Terminal-BOUkNu4f.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CNS3dHNv.js → TimelineRenderer-CgGZWaRm.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BykqylCL.js → Tokens-CpwjVyir.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ByNxq51W.js → Trigger-DL21H-eb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BlrFsdaS.js → Trust-B3ffFclW.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Dg26A-sd.js → UkeySign-CkBeb5aI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C1wUxNn0.js → VideoEditing-U2iVaE3r.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-OphEUzI4.js → Wallet-CQk2wzYd.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-_8lL08hF.js → WebAuthn-DYIuIYzT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BnTuIvnP.js → WorkflowEditor-tg1c2mZQ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-3N3VLQYr.js → chat-CtL61spq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Bo_G96gg.js → colors-DKpbeo8s.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DjubfjI_.js → compact-item-gPZsrswt.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Cx_HSLCk.js → createContext-CfHlwzVr.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D5OjAOlA.js → hasIn-MV47g_6X.js} +1 -1
- package/src/assets/web-panel/assets/{index-x7o-2T3S.js → index-6G0ETFTW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqZq3zWr.js → index-BBw52sEl.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-4sfa0l.js → index-BN-wxSQ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-uAcJUJkx.js → index-BOyGUuBE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CC7RnaPP.js → index-BQp5M0s1.js} +1 -1
- package/src/assets/web-panel/assets/index-BcK8o4ke.js +1 -0
- package/src/assets/web-panel/assets/{index-CNmsP0Xf.js → index-BjlPD7GO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVPDhmVH.js → index-C4lF-f_z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRKk1JPX.js → index-C6nC_DyY.js} +1 -1
- package/src/assets/web-panel/assets/{index-B905-Mcs.js → index-C9RF4ieu.js} +1 -1
- package/src/assets/web-panel/assets/{index-3_CEBEEf.js → index-C9gtY4nG.js} +3 -3
- package/src/assets/web-panel/assets/{index-Y-H7j25u.js → index-CB1HnbNK.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5IwN9q3.js → index-CRv_uMLV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Q_vn0t8d.js → index-C_B9LiKs.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz5tQ5PY.js → index-Cjv0kKCU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgPb37tI.js → index-CmM9jqwe.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbdr8tVi.js → index-CmPJpLoD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrVjatPe.js → index-CzfxTSPW.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-_Cy0k_.js → index-D1XB5-t5.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8dPFFhy.js → index-DGtEBodr.js} +1 -1
- package/src/assets/web-panel/assets/{index-UnpsQ6A0.js → index-DIeJmlAA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxgIE4PD.js → index-DMMvlLp9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlcbE0sX.js → index-DU4rZpiK.js} +1 -1
- package/src/assets/web-panel/assets/{index-EZr3bvz2.js → index-D_Pl1GnW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BScGr1BY.js → index-Dd19vRwy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ce8EWU6r.js → index-Ddcpj1El.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCjq3g32.js → index-Df9sWKpl.js} +1 -1
- package/src/assets/web-panel/assets/{index-ydnEPOzZ.js → index-DfLyHCWi.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4MAnkl5.js → index-DnZ_zS1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXJqa1-I.js → index-DsH-i_3d.js} +1 -1
- package/src/assets/web-panel/assets/index-DvbAjyYI.js +1 -0
- package/src/assets/web-panel/assets/{index-DBvZhdCb.js → index-ExAGPAnX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD1zSPZH.js → index-Rb7CRMw9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE4XtzMl.js → index-Zvkt9xqi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmLwI-Y8.js → index-bSFrAszw.js} +1 -1
- package/src/assets/web-panel/assets/{index-HioDjvUF.js → index-fYcS7NS0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvYo09C0.js → index-srBc9U_s.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bj7S5IJw.js → index-xUlgG0Xe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaU60K3A.js → index-yxxXlqBA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DurpENJY.js → initDefaultProps-BeOZoSZ4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CIh-z-gR.js → motion-BXE8VMKx.js} +1 -1
- package/src/assets/web-panel/assets/{move-Uc_yI2NA.js → move-I9sdvPGX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DUevj5wz.js → mtc-parser-d25zrJd0.js} +1 -1
- package/src/assets/web-panel/assets/{omit-85eMYyur.js → omit-D71V_T4e.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-AuxDD20F.js → pickAttrs-BNZKpIAR.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DOWn8dd1.js → placementArrow-jOcgxTTz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CPxTWodH.js → responsiveObserve-pta_O8AU.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BqvbGPjx.js → slide-Dlq6om7z.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BzXKkV8d.js → statusUtils-BnkO_yRv.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2O7yRk3.js → styleChecker-p8NfWmcG.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DRWp7px1.js → useFlexGapSupport-KcjZZ5U7.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Dp0V7sjM.js → useFs-gqonDMWB.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CyCrG3ql.js → usePersonalDataHub-jIIfE4go.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CXhoFpFo.js → vnode-Dyo7fBrM.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-0z3mtwEg.js → zoom-6l8BMg9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +5 -5
- package/src/commands/agent.js +76 -23
- package/src/commands/compact.js +349 -3
- package/src/commands/context.js +72 -1
- package/src/commands/graph.js +26 -15
- package/src/commands/hmemory.js +21 -0
- package/src/commands/hook.js +256 -28
- package/src/commands/memory.js +209 -42
- package/src/commands/promcomp.js +17 -0
- package/src/commands/record-replay.js +772 -0
- package/src/commands/serve.js +94 -10
- package/src/commands/session.js +2 -3
- package/src/commands/skill.js +3 -0
- package/src/commands/team.js +7 -1
- package/src/data/changelog.json +41 -2
- package/src/gateways/ws/session-core-protocol.js +62 -3
- package/src/gateways/ws/session-protocol.js +123 -15
- package/src/gateways/ws/ws-agent-handler.js +157 -9
- package/src/gateways/ws/ws-session-gateway.js +204 -30
- package/src/generated/cc-agent-protocol.schema.json +2094 -4
- package/src/harness/prompt-compressor.js +5 -55
- package/src/lib/agent-sandbox.js +8 -2
- package/src/lib/agent-team/team-distributed-graph-bridge.js +3 -3
- package/src/lib/agent-team/team-message-tools.js +23 -5
- package/src/lib/app-server/context-memory-notifications.js +54 -0
- package/src/lib/app-server/rollout-store-factory.js +115 -0
- package/src/lib/app-server/rollout-store.js +310 -23
- package/src/lib/app-server/server.js +184 -7
- package/src/lib/app-server/sqlite-rollout-store.js +59 -16
- package/src/lib/auto-mode-config.js +26 -0
- package/src/lib/causal-observability.js +13 -1
- package/src/lib/context-memory-kernel/authority.js +95 -0
- package/src/lib/context-memory-kernel/durable-memory-port.js +296 -0
- package/src/lib/context-memory-kernel/index.js +8 -0
- package/src/lib/context-memory-kernel/jsonl-session-context-port.js +232 -0
- package/src/lib/context-memory-kernel/live-compaction.js +375 -0
- package/src/lib/context-memory-kernel/memory-service.js +667 -0
- package/src/lib/context-memory-kernel/message-adapter.js +451 -0
- package/src/lib/context-memory-kernel/privacy-purge-port.js +244 -0
- package/src/lib/context-memory-kernel/provider-context.js +192 -0
- package/src/lib/context-memory-kernel/runtime.js +61 -0
- package/src/lib/direct-model-usage.js +22 -18
- package/src/lib/graph-kernel/cutover-authority-resolver.js +4 -5
- package/src/lib/graph-kernel/cutover-ledger.js +2 -2
- package/src/lib/graph-kernel/event-store.js +3 -5
- package/src/lib/graph-kernel/migration-saga.js +2 -2
- package/src/lib/graph-kernel/production-cutover-evidence.js +8 -1
- package/src/lib/hierarchical-memory.js +22 -0
- package/src/lib/hook-audit-store.js +170 -0
- package/src/lib/hook-event-bus.cjs +0 -0
- package/src/lib/hook-manager.js +25 -83
- package/src/lib/hook-runtime-adapters.js +233 -0
- package/src/lib/hook-runtime-contract.cjs +291 -0
- package/src/lib/hook-runtime-contract.js +21 -0
- package/src/lib/hook-trust.js +210 -0
- package/src/lib/hooks-v2-producers.js +52 -6
- package/src/lib/hooks-v2-runtime.js +443 -178
- package/src/lib/llm-pricing.js +10 -0
- package/src/lib/memory-manager.js +29 -4
- package/src/lib/model-context-window.js +52 -0
- package/src/lib/permanent-memory.js +17 -0
- package/src/lib/plan-mode.js +8 -4
- package/src/lib/process-execution-broker/credential-transport.js +31 -0
- package/src/lib/process-execution-broker/index.js +282 -16
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +7 -3
- package/src/lib/record-replay/browser-target-policy.js +406 -0
- package/src/lib/record-replay/index.js +4 -0
- package/src/lib/record-replay/playwright-ui-driver.js +83 -20
- package/src/lib/record-replay/playwright-ui-recorder.js +611 -0
- package/src/lib/record-replay/recorded-skill-package.js +486 -0
- package/src/lib/record-replay/recorded-skill-store.js +1166 -0
- package/src/lib/record-replay/skill-recorder.js +634 -64
- package/src/lib/runtime-usage-ledger.js +20 -0
- package/src/lib/session-consolidator.js +59 -0
- package/src/lib/session-core-singletons.js +17 -4
- package/src/lib/session-hooks.js +29 -2
- package/src/lib/session-transcript-migration.js +188 -0
- package/src/lib/settings-hook-events.cjs +37 -401
- package/src/lib/settings-hook-events.js +210 -8
- package/src/lib/settings-hooks.cjs +42 -83
- package/src/lib/ws-session-manager.js +4 -1
- package/src/repl/agent-repl.js +186 -53
- package/src/runtime/agent-core.js +376 -350
- package/src/runtime/headless-runner.js +112 -84
- package/src/runtime/headless-stream.js +131 -30
- package/src/assets/web-panel/assets/MarkdownRenderer-Dt8hH_qA.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Jg2dVUc-.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-0jYeVmyY.js +0 -7
- package/src/assets/web-panel/assets/devWarning-BX944k9E.js +0 -1
- package/src/assets/web-panel/assets/index-C_9Jt_SR.js +0 -1
- package/src/assets/web-panel/assets/index-DL2EFx7m.js +0 -1
|
@@ -29,6 +29,7 @@ import path from "node:path";
|
|
|
29
29
|
import * as fs from "node:fs";
|
|
30
30
|
import * as tty from "node:tty";
|
|
31
31
|
import { createRequire } from "node:module";
|
|
32
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
32
33
|
|
|
33
34
|
const require = createRequire(import.meta.url);
|
|
34
35
|
|
|
@@ -964,12 +965,19 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
964
965
|
sandboxed: 0,
|
|
965
966
|
credFiltered: 0,
|
|
966
967
|
};
|
|
967
|
-
this._logPath =
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
968
|
+
this._logPath =
|
|
969
|
+
process.env.NODE_ENV === "test"
|
|
970
|
+
? path.join(
|
|
971
|
+
os.tmpdir(),
|
|
972
|
+
"chainlesschain-process-audit-tests",
|
|
973
|
+
`${process.pid}.log`,
|
|
974
|
+
)
|
|
975
|
+
: path.join(
|
|
976
|
+
os.homedir(),
|
|
977
|
+
".chainlesschain",
|
|
978
|
+
"logs",
|
|
979
|
+
"process-audit.log",
|
|
980
|
+
);
|
|
973
981
|
|
|
974
982
|
// P0-1: Platform sandbox functions (applySandbox/postSpawnSandbox imported above)
|
|
975
983
|
// No instance needed — stateless functional API per platform
|
|
@@ -989,6 +997,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
989
997
|
this._ptyAdapter = createNativePtyAdapter();
|
|
990
998
|
this._hooksEventSink = null;
|
|
991
999
|
this._workspaceTransactionManagers = new Map();
|
|
1000
|
+
this._ambientProcessContext = new AsyncLocalStorage();
|
|
992
1001
|
|
|
993
1002
|
this._ensureLogDir();
|
|
994
1003
|
this._loadPermissions();
|
|
@@ -998,7 +1007,8 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
998
1007
|
try {
|
|
999
1008
|
fs.mkdirSync(path.dirname(this._logPath), { recursive: true });
|
|
1000
1009
|
} catch {
|
|
1001
|
-
//
|
|
1010
|
+
// Legacy callers may retain in-memory audit. Required-audit executions
|
|
1011
|
+
// independently prove appendability before native spawn and fail closed.
|
|
1002
1012
|
}
|
|
1003
1013
|
}
|
|
1004
1014
|
|
|
@@ -1021,6 +1031,76 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1021
1031
|
return "prompt";
|
|
1022
1032
|
}
|
|
1023
1033
|
|
|
1034
|
+
_withAmbientProcessContext(command, options = {}) {
|
|
1035
|
+
const context = this._ambientProcessContext.getStore();
|
|
1036
|
+
if (!context) return options;
|
|
1037
|
+
const commandIdentity = (() => {
|
|
1038
|
+
if (typeof command !== "string" || !command) return "";
|
|
1039
|
+
const normalized = path.isAbsolute(command)
|
|
1040
|
+
? path.resolve(command)
|
|
1041
|
+
: command;
|
|
1042
|
+
return process.platform === "win32"
|
|
1043
|
+
? normalized.toLowerCase()
|
|
1044
|
+
: normalized;
|
|
1045
|
+
})();
|
|
1046
|
+
const allowed = context.allowedCommands.includes(commandIdentity);
|
|
1047
|
+
return {
|
|
1048
|
+
...options,
|
|
1049
|
+
origin: context.origin,
|
|
1050
|
+
scope: context.scope,
|
|
1051
|
+
policy: allowed ? context.policy : "deny",
|
|
1052
|
+
auditContext: context.auditContext,
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
runWithProcessContext(
|
|
1057
|
+
{
|
|
1058
|
+
origin,
|
|
1059
|
+
policy = "allow",
|
|
1060
|
+
scope = "default",
|
|
1061
|
+
allowedCommands = [],
|
|
1062
|
+
auditContext,
|
|
1063
|
+
} = {},
|
|
1064
|
+
operation,
|
|
1065
|
+
) {
|
|
1066
|
+
const safeOrigin = String(origin || "");
|
|
1067
|
+
if (
|
|
1068
|
+
!/^[A-Za-z][A-Za-z0-9:._-]{0,127}$/u.test(safeOrigin) ||
|
|
1069
|
+
!["allow", "deny", "prompt"].includes(policy) ||
|
|
1070
|
+
typeof operation !== "function" ||
|
|
1071
|
+
!Array.isArray(allowedCommands) ||
|
|
1072
|
+
allowedCommands.length < 1 ||
|
|
1073
|
+
allowedCommands.length > 16
|
|
1074
|
+
) {
|
|
1075
|
+
const error = new Error("Process execution context is invalid");
|
|
1076
|
+
error.code = "PROCESS_CONTEXT_INVALID";
|
|
1077
|
+
throw error;
|
|
1078
|
+
}
|
|
1079
|
+
const normalizedCommands = allowedCommands.map((command) => {
|
|
1080
|
+
if (typeof command !== "string" || !path.isAbsolute(command)) {
|
|
1081
|
+
const error = new Error(
|
|
1082
|
+
"Process execution context commands must be absolute paths",
|
|
1083
|
+
);
|
|
1084
|
+
error.code = "PROCESS_CONTEXT_INVALID";
|
|
1085
|
+
throw error;
|
|
1086
|
+
}
|
|
1087
|
+
const normalized = path.resolve(command);
|
|
1088
|
+
return process.platform === "win32"
|
|
1089
|
+
? normalized.toLowerCase()
|
|
1090
|
+
: normalized;
|
|
1091
|
+
});
|
|
1092
|
+
return this._ambientProcessContext.run(
|
|
1093
|
+
Object.freeze({
|
|
1094
|
+
origin: safeOrigin,
|
|
1095
|
+
policy,
|
|
1096
|
+
scope: String(scope || "default").slice(0, 128),
|
|
1097
|
+
allowedCommands: Object.freeze([...new Set(normalizedCommands)]),
|
|
1098
|
+
auditContext,
|
|
1099
|
+
}),
|
|
1100
|
+
operation,
|
|
1101
|
+
);
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1024
1104
|
_isDangerousCommand(command) {
|
|
1025
1105
|
if (typeof command !== "string") return false;
|
|
1026
1106
|
const lower = command.toLowerCase();
|
|
@@ -1033,6 +1113,14 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1033
1113
|
}
|
|
1034
1114
|
|
|
1035
1115
|
_recordAudit(entry) {
|
|
1116
|
+
try {
|
|
1117
|
+
fs.appendFileSync(this._logPath, JSON.stringify(entry) + "\n");
|
|
1118
|
+
} catch (cause) {
|
|
1119
|
+
if (entry.persistentAuditRequired === true) {
|
|
1120
|
+
throw this._persistentAuditError(cause, entry);
|
|
1121
|
+
}
|
|
1122
|
+
// Non-sensitive legacy callers retain best-effort persistence.
|
|
1123
|
+
}
|
|
1036
1124
|
this._auditLog.push(entry);
|
|
1037
1125
|
if (this._auditLog.length > 10000) this._auditLog.shift();
|
|
1038
1126
|
this._stats.totalSpawned++;
|
|
@@ -1046,12 +1134,54 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1046
1134
|
}
|
|
1047
1135
|
this._stats.byOrigin[entry.origin] =
|
|
1048
1136
|
(this._stats.byOrigin[entry.origin] || 0) + 1;
|
|
1137
|
+
this.emit("spawn", entry);
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
_persistentAuditError(cause, entry) {
|
|
1141
|
+
const error = new Error(
|
|
1142
|
+
`Persistent process audit is unavailable: ${cause.message}`,
|
|
1143
|
+
);
|
|
1144
|
+
error.code = "ERR_PROCESS_AUDIT_UNAVAILABLE";
|
|
1145
|
+
error.auditFailClosed = true;
|
|
1146
|
+
error.cause = cause;
|
|
1147
|
+
error.auditEntry = entry;
|
|
1148
|
+
return error;
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
_requirePersistentAuditAdmission(entry) {
|
|
1152
|
+
const admission = {
|
|
1153
|
+
...entry,
|
|
1154
|
+
auditPhase: "admission",
|
|
1155
|
+
persistentAuditRequired: true,
|
|
1156
|
+
admittedAt: Date.now(),
|
|
1157
|
+
};
|
|
1049
1158
|
try {
|
|
1050
|
-
fs.appendFileSync(this._logPath, JSON.stringify(
|
|
1051
|
-
} catch {
|
|
1052
|
-
|
|
1159
|
+
fs.appendFileSync(this._logPath, JSON.stringify(admission) + "\n");
|
|
1160
|
+
} catch (cause) {
|
|
1161
|
+
throw this._persistentAuditError(cause, entry);
|
|
1162
|
+
}
|
|
1163
|
+
entry.persistentAuditRequired = true;
|
|
1164
|
+
entry.persistentAuditAdmitted = true;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
_recordRequiredAuditOutcome(entry, auditPhase) {
|
|
1168
|
+
if (entry.persistentAuditRequired !== true) return;
|
|
1169
|
+
try {
|
|
1170
|
+
fs.appendFileSync(
|
|
1171
|
+
this._logPath,
|
|
1172
|
+
JSON.stringify({ ...entry, auditPhase }) + "\n",
|
|
1173
|
+
);
|
|
1174
|
+
} catch (cause) {
|
|
1175
|
+
const error = this._persistentAuditError(cause, entry);
|
|
1176
|
+
entry.persistentAuditFailure = error.message;
|
|
1177
|
+
if (this.listenerCount("audit-error") > 0) {
|
|
1178
|
+
this.emit("audit-error", { auditEntry: entry, error });
|
|
1179
|
+
}
|
|
1180
|
+
process.emitWarning(error.message, {
|
|
1181
|
+
code: error.code,
|
|
1182
|
+
detail: `executionId=${entry.executionId}`,
|
|
1183
|
+
});
|
|
1053
1184
|
}
|
|
1054
|
-
this.emit("spawn", entry);
|
|
1055
1185
|
}
|
|
1056
1186
|
|
|
1057
1187
|
_sanitizeOptions(options) {
|
|
@@ -3965,8 +4095,68 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3965
4095
|
return sanitized;
|
|
3966
4096
|
}
|
|
3967
4097
|
|
|
4098
|
+
_auditCommand(command, redact = false) {
|
|
4099
|
+
if (!redact) return command;
|
|
4100
|
+
const digest = crypto
|
|
4101
|
+
.createHash("sha256")
|
|
4102
|
+
.update(String(command ?? ""), "utf8")
|
|
4103
|
+
.digest("hex");
|
|
4104
|
+
return `[REDACTED sha256:${digest}]`;
|
|
4105
|
+
}
|
|
4106
|
+
|
|
4107
|
+
_normalizeAuditContext(value, origin) {
|
|
4108
|
+
if (value === undefined || value === null) {
|
|
4109
|
+
return {
|
|
4110
|
+
actor: origin,
|
|
4111
|
+
sessionId: null,
|
|
4112
|
+
authorization: null,
|
|
4113
|
+
policyDigest: null,
|
|
4114
|
+
};
|
|
4115
|
+
}
|
|
4116
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
4117
|
+
throw new TypeError("auditContext must be an object");
|
|
4118
|
+
}
|
|
4119
|
+
const snapshot = ownDataObjectSnapshot(value);
|
|
4120
|
+
if (!snapshot)
|
|
4121
|
+
throw new TypeError("auditContext must contain data properties");
|
|
4122
|
+
const authorization = snapshot.authorization;
|
|
4123
|
+
if (
|
|
4124
|
+
authorization !== undefined &&
|
|
4125
|
+
authorization !== null &&
|
|
4126
|
+
(typeof authorization !== "object" || Array.isArray(authorization))
|
|
4127
|
+
) {
|
|
4128
|
+
throw new TypeError("auditContext.authorization must be an object");
|
|
4129
|
+
}
|
|
4130
|
+
const authorizationSnapshot = authorization
|
|
4131
|
+
? ownDataObjectSnapshot(authorization)
|
|
4132
|
+
: null;
|
|
4133
|
+
if (authorization && !authorizationSnapshot) {
|
|
4134
|
+
throw new TypeError(
|
|
4135
|
+
"auditContext.authorization must contain data properties",
|
|
4136
|
+
);
|
|
4137
|
+
}
|
|
4138
|
+
const text = (input, fallback = null) =>
|
|
4139
|
+
typeof input === "string" && input ? input.slice(0, 512) : fallback;
|
|
4140
|
+
return {
|
|
4141
|
+
actor: text(snapshot.actor, origin),
|
|
4142
|
+
sessionId: text(snapshot.sessionId),
|
|
4143
|
+
authorization: authorizationSnapshot
|
|
4144
|
+
? {
|
|
4145
|
+
decision: text(authorizationSnapshot.decision, "unknown"),
|
|
4146
|
+
via: text(authorizationSnapshot.via, "unknown"),
|
|
4147
|
+
riskLevel: text(authorizationSnapshot.riskLevel),
|
|
4148
|
+
policy: text(authorizationSnapshot.policy),
|
|
4149
|
+
}
|
|
4150
|
+
: null,
|
|
4151
|
+
policyDigest: text(snapshot.policyDigest),
|
|
4152
|
+
};
|
|
4153
|
+
}
|
|
4154
|
+
|
|
3968
4155
|
_stripAuditControlOptions(options) {
|
|
3969
4156
|
delete options.auditRedactArgIndexes;
|
|
4157
|
+
delete options.auditRedactCommand;
|
|
4158
|
+
delete options.auditContext;
|
|
4159
|
+
delete options.requirePersistentAudit;
|
|
3970
4160
|
}
|
|
3971
4161
|
|
|
3972
4162
|
_applyCredentialBoundary(command, args, spawnOptions, origin) {
|
|
@@ -4352,6 +4542,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4352
4542
|
}
|
|
4353
4543
|
|
|
4354
4544
|
spawn(command, args, options = {}) {
|
|
4545
|
+
options = this._withAmbientProcessContext(command, options);
|
|
4355
4546
|
const executionId = crypto.randomUUID();
|
|
4356
4547
|
const startTime = Date.now();
|
|
4357
4548
|
const origin = options.origin || "unknown";
|
|
@@ -4380,12 +4571,20 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4380
4571
|
);
|
|
4381
4572
|
|
|
4382
4573
|
const traceCtx = this._getTraceContext();
|
|
4574
|
+
const auditContext = this._normalizeAuditContext(
|
|
4575
|
+
options.auditContext,
|
|
4576
|
+
origin,
|
|
4577
|
+
);
|
|
4383
4578
|
const auditEntry = {
|
|
4384
4579
|
executionId,
|
|
4385
4580
|
traceId: traceCtx?.traceId || null,
|
|
4386
4581
|
origin,
|
|
4387
4582
|
scope,
|
|
4388
|
-
|
|
4583
|
+
actor: auditContext.actor,
|
|
4584
|
+
sessionId: auditContext.sessionId,
|
|
4585
|
+
authorization: auditContext.authorization,
|
|
4586
|
+
approvalPolicyDigest: auditContext.policyDigest,
|
|
4587
|
+
command: this._auditCommand(command, options.auditRedactCommand === true),
|
|
4389
4588
|
args: this._auditArgs(args, auditRedactArgIndexes),
|
|
4390
4589
|
cwd,
|
|
4391
4590
|
startTime,
|
|
@@ -4533,6 +4732,16 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4533
4732
|
throw transactionError;
|
|
4534
4733
|
}
|
|
4535
4734
|
|
|
4735
|
+
if (options.requirePersistentAudit === true) {
|
|
4736
|
+
try {
|
|
4737
|
+
this._requirePersistentAuditAdmission(auditEntry);
|
|
4738
|
+
} catch (auditError) {
|
|
4739
|
+
sandboxPlan.cleanup?.();
|
|
4740
|
+
auditError.auditEntry = auditEntry;
|
|
4741
|
+
throw auditError;
|
|
4742
|
+
}
|
|
4743
|
+
}
|
|
4744
|
+
|
|
4536
4745
|
// Use native spawn from _native (set by patch-child-process.js)
|
|
4537
4746
|
const nativeSpawnFn = this._native?.spawn || nativeSpawn;
|
|
4538
4747
|
let proc;
|
|
@@ -4680,6 +4889,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4680
4889
|
auditEntry.signal = signal;
|
|
4681
4890
|
auditEntry.endTime = endTime;
|
|
4682
4891
|
auditEntry.durationMs = endTime - startTime;
|
|
4892
|
+
this._recordRequiredAuditOutcome(auditEntry, "completed");
|
|
4683
4893
|
this._writeRplEntry(auditEntry, "completed");
|
|
4684
4894
|
this._emitHooksEvent("tool:end", {
|
|
4685
4895
|
executionId,
|
|
@@ -4695,6 +4905,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4695
4905
|
auditEntry.error = err.message;
|
|
4696
4906
|
auditEntry.endTime = Date.now();
|
|
4697
4907
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
4908
|
+
this._recordRequiredAuditOutcome(auditEntry, "error");
|
|
4698
4909
|
this._writeRplEntry(auditEntry, "error", err);
|
|
4699
4910
|
this._emitHooksEvent("tool:end", {
|
|
4700
4911
|
executionId,
|
|
@@ -4719,6 +4930,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4719
4930
|
}
|
|
4720
4931
|
|
|
4721
4932
|
spawnSync(command, args, options = {}) {
|
|
4933
|
+
options = this._withAmbientProcessContext(command, options);
|
|
4722
4934
|
const executionId = crypto.randomUUID();
|
|
4723
4935
|
const startTime = Date.now();
|
|
4724
4936
|
const origin = options.origin || "unknown";
|
|
@@ -4743,12 +4955,20 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4743
4955
|
);
|
|
4744
4956
|
|
|
4745
4957
|
const traceCtx = this._getTraceContext();
|
|
4958
|
+
const auditContext = this._normalizeAuditContext(
|
|
4959
|
+
options.auditContext,
|
|
4960
|
+
origin,
|
|
4961
|
+
);
|
|
4746
4962
|
const auditEntry = {
|
|
4747
4963
|
executionId,
|
|
4748
4964
|
traceId: traceCtx?.traceId || null,
|
|
4749
4965
|
origin,
|
|
4750
4966
|
scope,
|
|
4751
|
-
|
|
4967
|
+
actor: auditContext.actor,
|
|
4968
|
+
sessionId: auditContext.sessionId,
|
|
4969
|
+
authorization: auditContext.authorization,
|
|
4970
|
+
approvalPolicyDigest: auditContext.policyDigest,
|
|
4971
|
+
command: this._auditCommand(command, options.auditRedactCommand === true),
|
|
4752
4972
|
args: this._auditArgs(args, auditRedactArgIndexes),
|
|
4753
4973
|
cwd,
|
|
4754
4974
|
startTime,
|
|
@@ -4880,6 +5100,16 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4880
5100
|
throw transactionError;
|
|
4881
5101
|
}
|
|
4882
5102
|
|
|
5103
|
+
if (options.requirePersistentAudit === true) {
|
|
5104
|
+
try {
|
|
5105
|
+
this._requirePersistentAuditAdmission(auditEntry);
|
|
5106
|
+
} catch (auditError) {
|
|
5107
|
+
sandboxPlan.cleanup?.();
|
|
5108
|
+
auditError.auditEntry = auditEntry;
|
|
5109
|
+
throw auditError;
|
|
5110
|
+
}
|
|
5111
|
+
}
|
|
5112
|
+
|
|
4883
5113
|
const nativeSpawnSyncFn = this._native?.spawnSync || nativeSpawnSync;
|
|
4884
5114
|
try {
|
|
4885
5115
|
const macPlanBindingDeclared =
|
|
@@ -4957,12 +5187,20 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4957
5187
|
options.auditRedactArgIndexes,
|
|
4958
5188
|
Array.isArray(args) ? args.length : 0,
|
|
4959
5189
|
);
|
|
5190
|
+
const auditContext = this._normalizeAuditContext(
|
|
5191
|
+
options.auditContext,
|
|
5192
|
+
origin,
|
|
5193
|
+
);
|
|
4960
5194
|
const auditEntry = {
|
|
4961
5195
|
executionId,
|
|
4962
5196
|
traceId: this._getTraceContext()?.traceId || null,
|
|
4963
5197
|
origin,
|
|
4964
5198
|
scope,
|
|
4965
|
-
|
|
5199
|
+
actor: auditContext.actor,
|
|
5200
|
+
sessionId: auditContext.sessionId,
|
|
5201
|
+
authorization: auditContext.authorization,
|
|
5202
|
+
approvalPolicyDigest: auditContext.policyDigest,
|
|
5203
|
+
command: this._auditCommand(command, options.auditRedactCommand === true),
|
|
4966
5204
|
args: this._auditArgs(args, auditRedactArgIndexes),
|
|
4967
5205
|
cwd: options.cwd || process.cwd(),
|
|
4968
5206
|
startTime,
|
|
@@ -5051,6 +5289,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5051
5289
|
const filteredArgs = spawnOptions.args || [];
|
|
5052
5290
|
delete spawnOptions.args;
|
|
5053
5291
|
this._prepareWorkspaceTransactionAudit(auditEntry);
|
|
5292
|
+
if (options.requirePersistentAudit === true) {
|
|
5293
|
+
this._requirePersistentAuditAdmission(auditEntry);
|
|
5294
|
+
}
|
|
5054
5295
|
|
|
5055
5296
|
if (sandboxPolicy.requiredBoundaries.length === 0) {
|
|
5056
5297
|
delete spawnOptions.origin;
|
|
@@ -5070,7 +5311,18 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5070
5311
|
auditEntry.pid = proc?.pid ?? null;
|
|
5071
5312
|
auditEntry.endTime = Date.now();
|
|
5072
5313
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
5073
|
-
|
|
5314
|
+
try {
|
|
5315
|
+
this._recordAudit(auditEntry);
|
|
5316
|
+
} catch (auditError) {
|
|
5317
|
+
try {
|
|
5318
|
+
proc.kill?.();
|
|
5319
|
+
} catch {
|
|
5320
|
+
// Preserve the required-audit failure after requesting teardown.
|
|
5321
|
+
}
|
|
5322
|
+
auditError.spawnedProcess = proc;
|
|
5323
|
+
auditError.processTerminationRequested = true;
|
|
5324
|
+
throw auditError;
|
|
5325
|
+
}
|
|
5074
5326
|
this._writeRplEntry(auditEntry, "started");
|
|
5075
5327
|
return proc;
|
|
5076
5328
|
}
|
|
@@ -5216,6 +5468,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5216
5468
|
auditEntry.signal = signal;
|
|
5217
5469
|
auditEntry.endTime = Date.now();
|
|
5218
5470
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
5471
|
+
this._recordRequiredAuditOutcome(auditEntry, "completed");
|
|
5219
5472
|
this._writeRplEntry(auditEntry, "completed");
|
|
5220
5473
|
this.emit("exit", auditEntry);
|
|
5221
5474
|
});
|
|
@@ -5224,13 +5477,26 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
5224
5477
|
auditEntry.error = error.message;
|
|
5225
5478
|
auditEntry.endTime = Date.now();
|
|
5226
5479
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
5480
|
+
this._recordRequiredAuditOutcome(auditEntry, "error");
|
|
5227
5481
|
this._writeRplEntry(auditEntry, "error", error);
|
|
5228
5482
|
if (this.listenerCount("error") > 0) this.emit("error", auditEntry);
|
|
5229
5483
|
});
|
|
5230
5484
|
auditEntry.pid = proc?.pid ?? null;
|
|
5231
5485
|
auditEntry.endTime = Date.now();
|
|
5232
5486
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|
|
5233
|
-
|
|
5487
|
+
try {
|
|
5488
|
+
this._recordAudit(auditEntry);
|
|
5489
|
+
} catch (auditError) {
|
|
5490
|
+
try {
|
|
5491
|
+
child.kill?.();
|
|
5492
|
+
} catch {
|
|
5493
|
+
// Preserve the required-audit failure after requesting teardown.
|
|
5494
|
+
}
|
|
5495
|
+
releaseTerminal();
|
|
5496
|
+
auditError.spawnedProcess = proc;
|
|
5497
|
+
auditError.processTerminationRequested = true;
|
|
5498
|
+
throw auditError;
|
|
5499
|
+
}
|
|
5234
5500
|
this._writeRplEntry(auditEntry, "started");
|
|
5235
5501
|
return proc;
|
|
5236
5502
|
} catch (error) {
|
|
Binary file
|
|
Binary file
|
|
@@ -1683,8 +1683,12 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
1683
1683
|
string[] configured = pathExt.Split(
|
|
1684
1684
|
new[] { ';' },
|
|
1685
1685
|
StringSplitOptions.RemoveEmptyEntries);
|
|
1686
|
-
|
|
1687
|
-
|
|
1686
|
+
// Match Windows command lookup: a bare command name is
|
|
1687
|
+
// resolved through PATHEXT. Trying an extensionless file first
|
|
1688
|
+
// can select Docker's adjacent POSIX `docker` shell script
|
|
1689
|
+
// instead of docker.exe, which CreateProcessAsUser rejects
|
|
1690
|
+
// with ERROR_BAD_EXE_FORMAT (193).
|
|
1691
|
+
extensions = new string[configured.Length];
|
|
1688
1692
|
for (int index = 0; index < configured.Length; index++)
|
|
1689
1693
|
{
|
|
1690
1694
|
string extension = configured[index].Trim();
|
|
@@ -1697,7 +1701,7 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
1697
1701
|
throw new InvalidDataException(
|
|
1698
1702
|
"Target PATHEXT contains an invalid extension");
|
|
1699
1703
|
}
|
|
1700
|
-
extensions[index
|
|
1704
|
+
extensions[index] = extension;
|
|
1701
1705
|
}
|
|
1702
1706
|
}
|
|
1703
1707
|
|