chainlesschain 0.162.170 → 0.162.172
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/bin/chainlesschain.js +8 -0
- package/package.json +6 -1
- package/src/assets/web-panel/assets/{AIOps-BTXN24I3.js → AIOps-oKCWU-LK.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BBB1VF4j.js → ActionButton-4CBfc5E4.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BVCXq0k6.js → Analytics-BEmR-k_b.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-C3EOo2s5.js → AppLayout-D6a4ZnrC.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CsJTZSMv.js → Artifacts-BRWIHCPl.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CP0AllJ_.js → Audit-CzGKlkTc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BCAjs08m.js → BackgroundAgents-CmMYN10o.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BxQI5XH4.js → Backup-CJ6e0ukD.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bu-PNzC5.js → BaseInput-BpEvDrNt.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DjPQynup.js → Chat-wWuwwjKu.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CygkRopu.js → ChatBubbleRenderer-CJLyGo_u.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BxL6xm7Z.js → Checkbox-C6pW60Br.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CcyB7h_6.js → Codegen-DF-nP22Y.js} +1 -1
- package/src/assets/web-panel/assets/{Col-8NQiKJJx.js → Col-BuueEwZW.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B31qy5OS.js → Community-DuE0Yzwr.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C-5fAsZ4.js → Compact-BrHim8EB.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BTSccvF0.js → Compliance-DgAet8f_.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BXctU9IK.js → Cowork-B9wY05lx.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CxVFX9NG.js → Cron-CvNBxfJX.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DEF3dq8M.js → Crosschain-BnZRENa0.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BmKcE9he.js → DID-DiqYLHTI.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CECBq_wG.js → Dashboard-t3SsRzZL.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-U-iuPB0n.js → Dropdown-BCjMLam9.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D8BIlSPL.js → EmailListRenderer-D2v9-IHJ.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BzQGfUH-.js → FamilyGuardDashboard-_iQu35qa.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-4_WlOqLZ.js → Federation-Bkty8VqB.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-gtrW-DdF.js → FormItemContext-DdPW81BY.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BLcvJJB6.js → GenericCardRenderer-DrNYM4Zj.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Bk0janGD.js → Git-BjF-B2h0.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CcfyMlV8.js → Governance-DPhGdJ1v.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CBLrAf4M.js → Inference--PPksOVj.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-ClguhteZ.js → KnowledgeGraph-y5WdV_JV.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Dp_oeKfJ.js → Logs-B6_x7zba.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-Bg8zSyF8.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BHk50smM.js → Marketplace-CHpfMu1A.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BAY3CV6J.js → McpTools-qqjtX3Cf.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-w0pG2AKx.js → Memory-hASSgxbw.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0VkDUE3.js → MobileBridge-Dwh7Bhcf.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BCvQ80I9.js → MobileProjects-D09voh7W.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DSIl41Tt.js → Mtc-9G1dXeId.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-D1mzUlIr.js → MtcAudit-CWtYXj6f.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CeJz4VSS.js → Multisig-bDI0EnDk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-_O3aweu8.js → NLProgramming-CTanRaBP.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Dt7_pO86.js → Notes-BdQENJFv.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Dhg3Nktv.js → NotificationSettings-JvnQdStO.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-QsAPcTb2.js → OrderTableRenderer-BMGL9RPJ.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BuiaUPkv.js → Organization-sBZnIb2D.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C3jb6knl.js → Overflow-CzOhNGE6.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BOMyrLkb.js → P2P-D_D2yqda.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-UvLStCgS.js → PdhVaultBrowser-D5lKd_Kx.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B9cN0dJH.js → Permissions-L5s-wENg.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DNjW5qro.js → PersonalDataHub-iI49x6cH.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CFLyZ6Sh.js → Pipeline-DPHqyk09.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-D3w6vOxf.js → Privacy-B-ZL9360.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-cwcVsn8K.js → ProjectInit-f05YzsN2.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-aUoAroc-.js → ProjectSettings-DZLKS6ex.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CrzQv7Zv.js → Projects-ButF3DyM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-jZaPizKR.js → Providers-CFDSXnkR.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DNzmwcfg.js → QrScannerModal-1N6Sdxdm.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-m-5Gwt70.js → QuickAsk-tEqRwRSR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CrrAjNxP.js → Recommend-D4ZVHIwz.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BDCMjRFe.js → RemoteSession-Cqm32lhm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CPCt1Jc8.js → Reputation-BnjVsU_a.js} +1 -1
- package/src/assets/web-panel/assets/{Row-C-RorxHs.js → Row-DzpHyTuz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CnQs4TuY.js → RssFeed-Du5-ouwx.js} +3 -3
- package/src/assets/web-panel/assets/{Search-B1jkeFZY.js → Search-CYztyf2o.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CGKI3vvd.js → Security-C1hVxy8Z.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DQjesYF8.js → Services-BscEbAZ2.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-C9Ipj0A6.js → Skeleton-B2sMLqKQ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D2j54i9O.js → Skills-CoHKax06.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-xhrVjTeb.js → Sla-Bpie5KO6.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-C6KMOUCa.js → SpeechSettings-BX63ijn5.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CmIPU5wR.js → SyncSettings-Bf72so5A.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-B-T1J42r.js → Tasks-CVB2PZk4.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Aq669sjw.js → Templates-q0qyclJx.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BKWUWNXB.js → Tenant-CW-W-i0k.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DEeAvA8L.js → Terminal-D7QoPiXQ.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C465ySdn.js → TimelineRenderer-BaRDAbyA.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BgVqF-bX.js → Tokens-D6U4PRW8.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BMNHmxwH.js → Trigger-ClBDWdLo.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B_adk89L.js → Trust-C_M6rWPq.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Biw38mog.js → UkeySign-bXHx8s4C.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-AC-eaw5k.js → VideoEditing-BcIt_ieI.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-8lQ5_t0X.js → Wallet-Dd-4jcLs.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-JDmH_-DF.js → WebAuthn-B4F6yxQK.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-DHQAdITG.js → WorkflowEditor-BEHkpfJq.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C3qauUVv.js → chat-D7hhRpIO.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DLP70JGe.js → colors-AMRhrRzS.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DjsoqA5t.js → compact-item-BYpsOET5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CfEdl1in.js → createContext-CoUkR4LQ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BRylvxzY.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DWwHHlBG.js → hasIn-CJKJMKki.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dfka-vzJ.js → index-8pmZHnQU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgQ92xdO.js → index-BBJFiZ9Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-VtCz3A64.js → index-BP69Ul3S.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8wrUFzY.js → index-BTFHYauX.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5VL0NYy.js → index-BUJt2ar4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-rD2rhi.js → index-Bj30Aq6h.js} +1 -1
- package/src/assets/web-panel/assets/{index-gu8zBhtp.js → index-BlpuqGt5.js} +1 -1
- package/src/assets/web-panel/assets/index-Bzvxvzlk.js +1 -0
- package/src/assets/web-panel/assets/{index-CgruUvB3.js → index-C19xZKIP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTEcPJGf.js → index-C6bg22vc.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4k6JGm_.js → index-CH6XEWdj.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0xMzvk8.js → index-CK1Kknpl.js} +1 -1
- package/src/assets/web-panel/assets/{index-UEbYl2pu.js → index-CNyLbBGj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmt1HDWZ.js → index-COg__P6M.js} +19 -19
- package/src/assets/web-panel/assets/{index-ArZCi1rK.js → index-CRlJOWsf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqPuyN4p.js → index-CScG8TAY.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4gCFHtB.js → index-CdL9cQIE.js} +1 -1
- package/src/assets/web-panel/assets/{index-C47EiQ7d.js → index-Ck35u_0v.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn2rNMmv.js → index-CkLZQtsh.js} +1 -1
- package/src/assets/web-panel/assets/{index-T5emAyFT.js → index-DFoujkWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbFnfyKh.js → index-DFwh0R9h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsEk9s04.js → index-DStN9E7o.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTDpF8MS.js → index-DcozYrXV.js} +1 -1
- package/src/assets/web-panel/assets/{index-_g5q2hF3.js → index-De5mYp86.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bp_WNm2_.js → index-DfEVOzNb.js} +1 -1
- package/src/assets/web-panel/assets/{index-OfMwkFIo.js → index-Dfna8sKa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcDeMCUK.js → index-DjbMaBLf.js} +1 -1
- package/src/assets/web-panel/assets/index-Dl6H3dxS.js +1 -0
- package/src/assets/web-panel/assets/{index-D-te-S9f.js → index-Dpl_SJuk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKsWujXP.js → index-DyF9uYzB.js} +1 -1
- package/src/assets/web-panel/assets/{index-BydBh7oT.js → index-HF3GvATm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAcBi6F-.js → index-OJmXGn8n.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNeLedtU.js → index-ZPdNPhUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds1BfT_C.js → index-djikyGz3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbF27GqZ.js → index-gQWWnP3_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnhJbWsl.js → index-owVbLJnH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Lh0e2afo.js → index-tWEDZHzj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbjUePgq.js → index-ttTl376q.js} +1 -1
- package/src/assets/web-panel/assets/{index-nuZaMsMy.js → index-z5rYvstM.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C_pMmi75.js → initDefaultProps-B_Uk-wzg.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BvKgS96o.js → motion-ez7H8y8b.js} +1 -1
- package/src/assets/web-panel/assets/{move-C-1U4R1I.js → move-CKWUhhhX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-D6BC968-.js → mtc-parser-DkNl7ocj.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DxOZvcGQ.js → omit-C0uA2ytw.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-LpzmHdkw.js → pickAttrs-CySaWMPl.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bm--qom1.js → placementArrow-BWL3-3xo.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CVZZlhJf.js → responsiveObserve-BRy_wJog.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DD1xINGx.js → slide-DmmvSaBD.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-LrjHAy63.js → statusUtils-C_7SYY0K.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BqknYxTe.js → styleChecker-DYgBJGDh.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Dljy3diT.js → useFlexGapSupport-nPkoZkT6.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-OedUtPLc.js → useFs-CzpsfP4_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Cz-kxbP_.js → usePersonalDataHub-Bo2vvMWl.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C8ZuTk8W.js → vnode-D-hXAnHb.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CjbgJYXQ.js → zoom-DW7seTGG.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +39 -14
- package/src/commands/background-session.js +12 -1
- package/src/commands/permissions.js +24 -1
- package/src/gateways/ws/ws-agent-handler.js +26 -1
- package/src/gateways/ws/ws-approval-gate.js +131 -0
- package/src/index.js +63 -845
- package/src/lib/agent-ipc-bus.js +331 -0
- package/src/lib/agent-worktree.js +173 -5
- package/src/lib/background-agent-supervisor.js +193 -4
- package/src/lib/context-source-ledger.js +164 -0
- package/src/lib/execution-trace/index.js +10 -0
- package/src/lib/execution-trace/metrics-collector.js +218 -0
- package/src/lib/execution-trace/trace-context.js +182 -0
- package/src/lib/hook-manager.js +17 -0
- package/src/lib/hooks-v2-runtime.js +278 -0
- package/src/lib/interaction-adapter.js +26 -5
- package/src/lib/metrics-collector.js +127 -0
- package/src/lib/observability/index.js +33 -0
- package/src/lib/observability/otlp-exporter.js +260 -0
- package/src/lib/otlp-exporter.js +45 -0
- package/src/lib/process-execution-broker/SPAWN_AUDIT_REPORT.md +117 -0
- package/src/lib/process-execution-broker/index.js +450 -0
- package/src/lib/process-execution-broker/patch-child-process.js +50 -0
- package/src/lib/process-execution-broker/spawn-audit.json +3814 -0
- package/src/lib/repl-rewind.js +62 -14
- package/src/lib/runtime-provenance-ledger.js +190 -0
- package/src/lib/session-hooks.js +41 -0
- package/src/lib/turn-binding.js +134 -0
- package/src/program-base.js +4 -1
- package/src/repl/agent-repl.js +77 -3
- package/src/repl/repl-turn-binding.js +91 -0
- package/src/runtime/headless-runner.js +59 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-RQ1HbTY5.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Cwuuqc_f.js +0 -1
- package/src/assets/web-panel/assets/index-BkTk-zJK.js +0 -1
- package/src/assets/web-panel/assets/index-C-BSTEhe.js +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REPL turn-binding PRODUCER — closes the incremental-gap 仍欠 item "REPL 自身
|
|
3
|
+
* 作为显式表生产者(交互 turn 实时喂+持久化,镜像 headless 接线;现 REPL 只消费)".
|
|
4
|
+
*
|
|
5
|
+
* Wraps the SHARED feeder core ([[turn-binding.js]] `createTurnBindingFeed` —
|
|
6
|
+
* the exact mapping the headless runner uses, so the two producers can never
|
|
7
|
+
* drift) with the three REPL-specific concerns:
|
|
8
|
+
*
|
|
9
|
+
* 1. Rehydrate: the first turn loads the session's persisted table
|
|
10
|
+
* (`loadTurnBindingLog`) so an interactive continuation of a headless (or
|
|
11
|
+
* earlier REPL) run APPENDS to the existing table instead of clobbering it.
|
|
12
|
+
* 2. Timeline supersede: the live REPL can shrink its conversation
|
|
13
|
+
* (`/rewind`, `/clear`, auto-compaction), so each new turn prunes records
|
|
14
|
+
* anchored at/after its own offset — under `pickPersistedTurn`'s
|
|
15
|
+
* exact-offset matching a stale record from the discarded timeline would
|
|
16
|
+
* otherwise shadow the new turn and could offer the wrong checkpoint.
|
|
17
|
+
* 3. Per-settle persistence: dirty-gated `persistTurnBinding` after each turn
|
|
18
|
+
* (a tool-free Q&A turn writes nothing), best-effort — the producer is
|
|
19
|
+
* advisory and must NEVER disturb the turn itself, so every method
|
|
20
|
+
* swallows its own failures.
|
|
21
|
+
*
|
|
22
|
+
* I/O goes through `_deps` so tests drive the producer hermetically.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
26
|
+
import {
|
|
27
|
+
loadTurnBindingLog,
|
|
28
|
+
persistTurnBinding,
|
|
29
|
+
} from "../lib/turn-binding-store.js";
|
|
30
|
+
|
|
31
|
+
// Injected so tests can seed the persisted table / capture snapshots without
|
|
32
|
+
// touching the real sessions directory.
|
|
33
|
+
export const _deps = {
|
|
34
|
+
loadTurnBindingLog,
|
|
35
|
+
persistTurnBinding,
|
|
36
|
+
now: () => Date.now(),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {{sessionId?: string, nonce?: string}} [opts]
|
|
41
|
+
* @returns {object|null} null when the session cannot persist (no sessionId)
|
|
42
|
+
*/
|
|
43
|
+
export function createReplTurnBindingProducer({ sessionId, nonce } = {}) {
|
|
44
|
+
if (!sessionId) return null;
|
|
45
|
+
// Per-process nonce (mirrors the headless runner's per-run nonce): restored
|
|
46
|
+
// turn ids keep their original nonce, new ids can't collide across resumes.
|
|
47
|
+
const runNonce = nonce || String(_deps.now());
|
|
48
|
+
let feed = null;
|
|
49
|
+
return {
|
|
50
|
+
/**
|
|
51
|
+
* Anchor a new interactive turn. Call just AFTER the user message was
|
|
52
|
+
* appended, with `conversationOffset = messages.length` — the exact-match
|
|
53
|
+
* contract `pickPersistedTurn` relies on.
|
|
54
|
+
*/
|
|
55
|
+
beginTurn(conversationOffset) {
|
|
56
|
+
try {
|
|
57
|
+
if (!feed) {
|
|
58
|
+
feed = createTurnBindingFeed({
|
|
59
|
+
log: _deps.loadTurnBindingLog(sessionId),
|
|
60
|
+
nonce: runNonce,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return feed.beginTurn(conversationOffset, { supersede: true });
|
|
64
|
+
} catch {
|
|
65
|
+
return null; // advisory — never disturb the turn
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
/** Fold one agent-loop event into the current turn (fed by agentLoop). */
|
|
69
|
+
handleEvent(event) {
|
|
70
|
+
if (!feed) return false;
|
|
71
|
+
try {
|
|
72
|
+
return feed.handleEvent(event);
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
/** Persist the table after a settled turn (dirty-gated, best-effort). */
|
|
78
|
+
persistIfDirty() {
|
|
79
|
+
if (!feed || !feed.isDirty()) return false;
|
|
80
|
+
try {
|
|
81
|
+
const ok = _deps.persistTurnBinding(sessionId, feed.log);
|
|
82
|
+
if (ok) feed.clearDirty();
|
|
83
|
+
return ok;
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
/** The live table (for tests / future in-process consumers). */
|
|
89
|
+
log: () => (feed ? feed.log : null),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -57,6 +57,8 @@ import {
|
|
|
57
57
|
classifyToolSideEffect,
|
|
58
58
|
} from "../lib/side-effect-ledger.js";
|
|
59
59
|
import { SIDE_EFFECT_LEDGER_EVENT } from "../lib/side-effect-ledger-store.js";
|
|
60
|
+
import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
|
|
61
|
+
import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
|
|
60
62
|
import { operationIdempotencyKey } from "../lib/idempotency.js";
|
|
61
63
|
import { expandFileRefsAsync } from "./file-ref-expander.js";
|
|
62
64
|
import { composeSystemPrompt } from "./system-prompt.js";
|
|
@@ -730,6 +732,50 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
730
732
|
// best-effort — never fail the run over ledger persistence
|
|
731
733
|
}
|
|
732
734
|
};
|
|
735
|
+
// P1 explicit turn→checkpoint binding: feed the TurnBindingLog in real time
|
|
736
|
+
// off the yielded agent-loop events (checkpoint / tool / policy / child-agent)
|
|
737
|
+
// and persist the table as a hash-chained `turn_checkpoint_binding` session
|
|
738
|
+
// event at each turn boundary. Provider tool_use ids are not runner-visible,
|
|
739
|
+
// so tool-call ids are synthesized `<nonce>:c<seq>` (mirrors the side-effect
|
|
740
|
+
// ledger's op-id scheme — stable within a run, unique across resumes).
|
|
741
|
+
// rebuildMessages ignores this event type, so it never pollutes model
|
|
742
|
+
// context. Only writes when a turn actually recorded something, and only for
|
|
743
|
+
// persisted runs — a tool-free Q&A or ephemeral run stays byte-identical.
|
|
744
|
+
let turnBindingLog = new TurnBindingLog();
|
|
745
|
+
if (persist) {
|
|
746
|
+
try {
|
|
747
|
+
const events = store.readEvents(sessionId) || [];
|
|
748
|
+
for (let i = events.length - 1; i >= 0; i--) {
|
|
749
|
+
const e = events[i];
|
|
750
|
+
if (
|
|
751
|
+
e &&
|
|
752
|
+
e.type === TURN_BINDING_EVENT &&
|
|
753
|
+
e.data &&
|
|
754
|
+
Array.isArray(e.data.turns)
|
|
755
|
+
) {
|
|
756
|
+
turnBindingLog = TurnBindingLog.fromJSON(e.data);
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
} catch {
|
|
761
|
+
// fresh log — best effort
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
// Event→table folding + id synthesis live in the SHARED feeder core
|
|
765
|
+
// (createTurnBindingFeed) so the interactive REPL producer can never drift
|
|
766
|
+
// from this runner's mapping. No feed at all for non-persisted runs.
|
|
767
|
+
const turnBindingFeed = persist
|
|
768
|
+
? createTurnBindingFeed({ log: turnBindingLog, nonce: sideEffectRunNonce })
|
|
769
|
+
: null;
|
|
770
|
+
const persistTurnBindingLog = () => {
|
|
771
|
+
if (!turnBindingFeed || !turnBindingFeed.isDirty()) return;
|
|
772
|
+
try {
|
|
773
|
+
store.appendEvent(sessionId, TURN_BINDING_EVENT, turnBindingLog.toJSON());
|
|
774
|
+
turnBindingFeed.clearDirty();
|
|
775
|
+
} catch {
|
|
776
|
+
// best-effort — never fail the run over binding persistence
|
|
777
|
+
}
|
|
778
|
+
};
|
|
733
779
|
if (persist) {
|
|
734
780
|
try {
|
|
735
781
|
const events = store.readEvents(sessionId) || [];
|
|
@@ -1703,7 +1749,17 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1703
1749
|
try {
|
|
1704
1750
|
// eslint-disable-next-line no-constant-condition
|
|
1705
1751
|
while (true) {
|
|
1752
|
+
// P1 turn→checkpoint binding: one drain of the loop = one turn. Anchor
|
|
1753
|
+
// the conversation offset before the model sees the new user turn. A
|
|
1754
|
+
// `--worktree` run stamps its isolation worktree (branch name, threaded
|
|
1755
|
+
// from the command layer) onto each turn record.
|
|
1756
|
+
if (turnBindingFeed) {
|
|
1757
|
+
turnBindingFeed.beginTurn(messages.length, {
|
|
1758
|
+
worktreeId: options.worktreeId ?? null,
|
|
1759
|
+
});
|
|
1760
|
+
}
|
|
1706
1761
|
for await (const event of runLoop(messages, loopOptions)) {
|
|
1762
|
+
if (turnBindingFeed) turnBindingFeed.handleEvent(event);
|
|
1707
1763
|
switch (event.type) {
|
|
1708
1764
|
case "checkpoint": {
|
|
1709
1765
|
if (isText)
|
|
@@ -1876,6 +1932,9 @@ export async function runAgentHeadless(options = {}, deps = {}) {
|
|
|
1876
1932
|
// call is made (break out of the for-await, not just the switch).
|
|
1877
1933
|
if (stopForCost) break;
|
|
1878
1934
|
}
|
|
1935
|
+
// P1 turn→checkpoint binding: the turn settled — persist the explicit
|
|
1936
|
+
// table (latest snapshot wins on load; no-op when nothing was recorded).
|
|
1937
|
+
persistTurnBindingLog();
|
|
1879
1938
|
// ── auto-rewake re-drive (opt-in via --auto-rewake) ─────────────────
|
|
1880
1939
|
// Under auto-rewake, settle the async Stop hooks after EVERY turn (so the
|
|
1881
1940
|
// final turn's background check still runs). If an asyncRewake check
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-Dmt1HDWZ.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-i8wW4v/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Q as r}from"./index-Dmt1HDWZ.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-8NQiKJJx.js";import{a0 as t}from"./index-Dmt1HDWZ.js";import"./vendor-Bn1JzzAn.js";import"./index-BqPuyN4p.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-C-RorxHs.js";import{a0 as t}from"./index-Dmt1HDWZ.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CVZZlhJf.js";import"./useFlexGapSupport-Dljy3diT.js";import"./styleChecker-BqknYxTe.js";import"./index-BqPuyN4p.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
|