chainlesschain 0.166.106 → 0.166.108

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.
Files changed (225) hide show
  1. package/README.md +187 -8
  2. package/package.json +2 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CKwEku2e.js → AIOps-B5HWUFaS.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-BSUOuTpW.js → ActionButton-DCIKpxoQ.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-CGxvL_FI.js → Analytics-dsgvjCEQ.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-bCPwz-5w.js → AppLayout-DWDH5Qbm.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-2_BOWo6e.js → Artifacts-BD8S8kzU.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CBOruzgW.js → Audit-CDXv4Aoj.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-lg0IU5HN.js → BackgroundAgents-BLAQ5Uy0.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-OspCi452.js → Backup-moPac6tF.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-BMkliqlz.js → BaseInput-C_6nzsLU.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-BfoiUZwp.js → Chat-cYuslkFG.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BjnfMwep.js → ChatBubbleRenderer-Ceh3MG6M.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-jTMlkNQZ.js → Checkbox-Qjb-XOX_.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-CycyJcnU.js → Codegen-IYRWXlMA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-BVWlReQj.js → Col-CsQ9jv8M.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CKRHl4xK.js → Community-BbNmfTwe.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BtpfMdhT.js → Compact-SShDx-nr.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-DtHB1Ct1.js → Compliance-CLWhKIJp.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-D_8X7-RK.js → Cowork-D4tK9_s3.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-DMCOyvEa.js → Cron-D7GnfQ1z.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-CeHdsu7m.js → Crosschain-TG86SH3X.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CL6mR6zX.js → DID-6pue0NCO.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-oz9n6DC7.js → Dashboard-BwkJ29du.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CbWm8mWu.js → Dropdown-DEvpYDof.js} +1 -1
  28. package/src/assets/web-panel/assets/EmailListRenderer-CQj7UlKJ.js +1 -0
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DPwqgRYm.js → EvolutionSettings-tpvPMM9W.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DkV4YMFj.js → FamilyGuardDashboard-CWYFW75O.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-CpUKHIOH.js → Federation-gRIi96rM.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-C6KXRgjR.js → FormItemContext-B7Nr3YkV.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-C5Y4L5E3.js → GenericCardRenderer-b1BgGgLT.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CBwKdF8s.js → Git-Dis1jjO7.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-Dt-OR7Aa.js → Governance-C4Yg99Am.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-Czkl-Lhl.js → Inference-D4UQRbGu.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-C7NE4949.js → KnowledgeGraph-Co_kLMAq.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-CoAuZiMG.js → Logs-D4BRp7bg.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-DTkjTwGI.js → MarkdownRenderer-Dgy8arQI.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-IzrV-7zH.js → Marketplace-ys0j1vr9.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DYEea7aS.js → McpTools-B3ZvRZe_.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-Uqe7ZrV6.js → Memory-BOa0jbr-.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-D092EGyM.js → MobileBridge-CWJRmUbj.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-7ty8vTpj.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-gg4jzfB-.js → Mtc-CCcOk5m5.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-BibGfs71.js → MtcAudit-vlrrScbQ.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-BmB5yRXP.js → Multisig-C8K59S_8.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BBSlPDyY.js → NLProgramming-oTpFYVme.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-Bui3-KiC.js → Notes-BhqAJWiz.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-ovXtbHe5.js → NotificationSettings-DCnV1CJM.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-Bq-qD7eG.js → OrderTableRenderer-CZGnsrVW.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DacIY9oJ.js → Organization-DX1LuQlJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CX8osheZ.js → Overflow-CbfKrFdT.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-1lnikqVp.js → P2P-BEwYZuHL.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DCrU-V6A.js → PdhVaultBrowser-YNmWbwd7.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-Dfcb6kM2.js → Permissions-DyZ18LiA.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-dvgai4hf.js → PersonalDataHub-B2J3aw2g.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-nymAEtnK.js → Pipeline-CXl2ZlhQ.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-D0Vd91oM.js → Privacy-I5SDmgAp.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-BpUBcu7o.js → ProjectInit-Crl9tXw3.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DIzwTT-M.js → ProjectSettings-DCFtFlSK.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-Den4RUw6.js → Projects-Do5BQq1i.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-Cq8p-M0d.js → Providers-Cb7OWa3y.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-DSmqOfYk.js → QrScannerModal-CJmhAU-s.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BDHCeSnA.js → QuickAsk-Cu6lEWou.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-B_9M8oF4.js → Recommend-Crip3jLB.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-5ot4leHy.js → RemoteSession-KxYY-2CB.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-B3F013PY.js → Reputation-D0vN-htI.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-BMyBJnZw.js → Row-wqzd_xCD.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-WmV0l52g.js → RssFeed-8lsPfb0a.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-Wl80yXnR.js → Search-C-e8qAeU.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-gbDMKb5m.js → Security-CMM9WgFy.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-Bx2Bjhah.js → Services-CZdxjN2B.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-BvJNybjV.js → Skeleton-BI3XNk35.js} +1 -1
  75. package/src/assets/web-panel/assets/Skills-DMlsh9It.js +1 -0
  76. package/src/assets/web-panel/assets/{Sla-BM9gyZwc.js → Sla-HQruznKY.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Bu9FL9Tz.js → SpeechSettings-Dl-MFq3w.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-D8ICJsMt.js → SyncSettings-BU224vDm.js} +2 -2
  79. package/src/assets/web-panel/assets/Tasks-DESg3yCs.js +1 -0
  80. package/src/assets/web-panel/assets/{Templates-BJzpTD0W.js → Templates-Jb3TPz4Q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-BN8eX4R2.js → Tenant-CQ-GTrfa.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CjtP9bpq.js → Terminal-BbMl3Rue.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CpNRa4XW.js → TimelineRenderer-CS_vstKF.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-2lNNvNAH.js → Tokens-BaopVl1f.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DxtxXyPg.js → Trigger-DtnD4WUN.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-CakzGeF9.js → Trust-CsvG4Tmf.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CvJeRXwV.js → UkeySign-C1-A-cOV.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-D80pMzcO.js → VideoEditing-CNgJPdSL.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BF-VOBmZ.js → Wallet-CdF41501.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DXyoAzE_.js → WebAuthn-D-JmxD5g.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-X6CDxzrF.js → WorkflowEditor-C0XunR13.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BcUhqjeA.js → chat-BBAZpD_G.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-Dw4bKaCm.js → colors-BxSxO5BX.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BWhu5Eri.js → compact-item-BoxL8pg5.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BLJ9JKoN.js → createContext-W5JAyZmY.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BI5TZ7EX.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DIkCiJbt.js → hasIn-HpiKDPVC.js} +1 -1
  98. package/src/assets/web-panel/assets/index-9-JLDK5n.js +1 -0
  99. package/src/assets/web-panel/assets/{index-BAwcMKaD.js → index-9caMEwQ-.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-0mHbawfQ.js → index-B05_YRHZ.js} +1 -1
  101. package/src/assets/web-panel/assets/index-B7m8ioaQ.js +1 -0
  102. package/src/assets/web-panel/assets/{index-D3wp_jgy.js → index-B9VxE1C-.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BotMuGS2.js → index-BA3WWQAT.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-LOsZYbic.js → index-BSJ0cAle.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C5qms36i.js → index-BW4PP5GN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CDfB6hWf.js → index-BZAbaY64.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BipG-tDs.js → index-Ba4usRFM.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CgsVg5Up.js → index-BgMViZIY.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CTPoBbIR.js → index-BtFAEG08.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DKzG3kBM.js → index-Bwn6k_qw.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-PRYboDFm.js → index-C4uI7WCB.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DQbWGvE4.js → index-C5kqii-G.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B1fufz1A.js → index-C7GIUWWF.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DjEP26Te.js → index-CM_gdohF.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BcTch6Fp.js → index-CRg3aOoj.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-04SKBH8l.js → index-CcyzZloJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DHLW27Je.js → index-CehxfRUR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-5vzPcr1g.js → index-D6m6B4Wy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DV4FSjmI.js → index-DSyfxxQS.js} +3 -3
  120. package/src/assets/web-panel/assets/{index-D5vFJmmX.js → index-DaJk9U9V.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BxLDNxEQ.js → index-DcmAiq_Y.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D-Erv8A9.js → index-DdEcQ1rp.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CqGqoID5.js → index-DinY7IQa.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BGMzh2oj.js → index-DkSnlgK_.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BxfimJOH.js → index-DlPvZgv8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DOjQi7oU.js → index-DuM9I1If.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uMtx6e3D.js → index-DwidpDEE.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CXJ8t1hK.js → index-IO2I7nzu.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Cmc7qH2C.js → index-JrMBRi62.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BaStonJm.js → index-QzlEbtRL.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cr05twNa.js → index-V6VIJe2N.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BGFqk1-E.js → index-_38IJqoP.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-u0tqS0iq.js → index-_p4e3KfB.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-D1r2R4a-.js → index-gvfIRZxJ.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CFGOV-YT.js → index-ooP1pQCt.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BUC4TZWg.js → index-p6rNtYud.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Bx6Hj_FG.js → initDefaultProps-Dfn6M05J.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BSWivB70.js → motion-BRRwFqGO.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Dv1Pg9R7.js → move-DpDPN6zR.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-Bqtl8fsk.js → mtc-parser-BHlSE87F.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DpOBjOSQ.js → omit-CEOri_L5.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-D-M-dz48.js → pickAttrs-DqICh-ad.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DsTLAifk.js → placementArrow-DQizFFiV.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-BVTetMpc.js → responsiveObserve-DmFHPdvC.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-abEcz-Cv.js → slide-s2s1XS3T.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-CBhrdU2G.js → statusUtils-IwEIbBan.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-CFq8ZCKa.js → styleChecker-CIFLlbXH.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-o4eE7fDV.js → useFlexGapSupport-CFkN2Cgh.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Hs9W8ihi.js → useFs-BSY6O48s.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-Bnet5Jho.js → usePersonalDataHub-iJl3VnU0.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-DJfN4kWs.js → vnode-vu8ReMs7.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-BzV-2e7X.js → zoom-CeSrYAHp.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +2 -2
  155. package/src/commands/agent.js +20 -20
  156. package/src/commands/goal.js +299 -1
  157. package/src/commands/plugin.js +129 -68
  158. package/src/constants.js +2 -2
  159. package/src/data/changelog.json +29 -3
  160. package/src/harness/jsonl-session-store.js +128 -5
  161. package/src/harness/prompt-compressor.js +18 -10
  162. package/src/harness/structured-handoff.js +151 -13
  163. package/src/lib/agent-session-export.js +20 -0
  164. package/src/lib/background-agent-supervisor.js +54 -0
  165. package/src/lib/cli-goal-catalog.js +129 -0
  166. package/src/lib/cli-goal-source.js +119 -0
  167. package/src/lib/coding-task-guidance.js +2 -1
  168. package/src/lib/config-schema.js +1 -1
  169. package/src/lib/context-memory-kernel/live-compaction.js +75 -12
  170. package/src/lib/eval/stream-terminal.js +27 -2
  171. package/src/lib/evolution/evolution-artifact-ports.js +22 -11
  172. package/src/lib/evolution/evolution-file-witness.js +86 -63
  173. package/src/lib/evolution/evolution-ledger-file-backend.js +22 -0
  174. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +34 -35
  175. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +32 -39
  176. package/src/lib/evolution/evolution-ledger.js +367 -169
  177. package/src/lib/evolution/evolution-manifest-state-reader.js +58 -0
  178. package/src/lib/evolution/evolution-physical-state-reader.js +308 -0
  179. package/src/lib/evolution/evolution-witness-segments.js +12 -13
  180. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +82 -56
  181. package/src/lib/evolution/rrsi-observed-text-index.js +17 -1
  182. package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +5 -0
  183. package/src/lib/execution-location-failure-site.js +20 -3
  184. package/src/lib/goal-store.js +8 -1
  185. package/src/lib/image-input.js +43 -14
  186. package/src/lib/llm-providers.js +1 -0
  187. package/src/lib/plugin-runtime/capabilities.js +10 -0
  188. package/src/lib/plugin-runtime/cli-goal-draft-request.js +138 -0
  189. package/src/lib/plugin-runtime/cli-goal-drafts.js +413 -0
  190. package/src/lib/plugin-runtime/cli-goal-extension-host.js +234 -0
  191. package/src/lib/plugin-runtime/examples/goal-description-drafter/plugin.json +17 -0
  192. package/src/lib/plugin-runtime/examples/goal-evidence-viewer/plugin.json +25 -0
  193. package/src/lib/plugin-runtime/examples/goal-progress-viewer/plugin.json +21 -0
  194. package/src/lib/plugin-runtime/examples/project-delivery-assistant/plugin.json +38 -0
  195. package/src/lib/plugin-runtime/goal-extension-contract.js +190 -0
  196. package/src/lib/plugin-runtime/goal-extensions.js +277 -0
  197. package/src/lib/plugin-runtime/install.js +40 -40
  198. package/src/lib/plugin-runtime/manifest.js +12 -0
  199. package/src/lib/plugin-runtime/policy.js +1 -0
  200. package/src/lib/project-goal-connection.js +225 -0
  201. package/src/lib/project-goal-draft-connection.js +217 -0
  202. package/src/lib/read-file-loop-guard.js +124 -8
  203. package/src/lib/session-host-snapshot.js +3 -0
  204. package/src/lib/session-message-provenance.js +24 -5
  205. package/src/lib/session-tool-round.js +39 -0
  206. package/src/lib/session-transcript-history.js +2 -0
  207. package/src/lib/session-transcript-page.js +4 -1
  208. package/src/lib/session-transcript-structure.js +4 -0
  209. package/src/lib/task-model-selector.js +1 -1
  210. package/src/repl/agent-repl.js +14 -7
  211. package/src/repl/config-summary.js +1 -1
  212. package/src/runtime/__tests__/message-roles.test.js +29 -0
  213. package/src/runtime/agent-core.js +116 -44
  214. package/src/runtime/headless-runner.js +191 -34
  215. package/src/runtime/headless-stream.js +144 -48
  216. package/src/runtime/message-roles.js +43 -0
  217. package/src/runtime/policies/agent-policy.js +1 -0
  218. package/src/workers/background-agent-worker.js +146 -47
  219. package/src/assets/web-panel/assets/EmailListRenderer-DXlmbC45.js +0 -1
  220. package/src/assets/web-panel/assets/MobileProjects-CwA1VoVJ.js +0 -1
  221. package/src/assets/web-panel/assets/Skills-Tz4rQcDp.js +0 -1
  222. package/src/assets/web-panel/assets/Tasks-B6MowBDo.js +0 -1
  223. package/src/assets/web-panel/assets/devWarning-D_MJgDGJ.js +0 -1
  224. package/src/assets/web-panel/assets/index-BP8log78.js +0 -1
  225. package/src/assets/web-panel/assets/index-PexF9zYf.js +0 -1
@@ -23,6 +23,7 @@
23
23
  */
24
24
 
25
25
  import { randomUUID } from "node:crypto";
26
+ import { isProxy } from "node:util/types";
26
27
  import { transportErrorDetails } from "../lib/transport-error-details.js";
27
28
  import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
28
29
  import { HERMETIC_CODING_SYSTEM_PROMPT } from "../lib/coding-task-guidance.js";
@@ -55,6 +56,8 @@ import {
55
56
  appendToolCallCompact as jsonlAppendToolCallCompact,
56
57
  appendLlmRetryCompact as jsonlAppendLlmRetryCompact,
57
58
  appendCompactEvent as jsonlAppendCompactEvent,
59
+ appendCompactEventIfMessagesMatch as jsonlAppendCompactEventIfMessagesMatch,
60
+ appendToolRoundsIfMessagesMatch as jsonlAppendToolRoundsIfMessagesMatch,
58
61
  appendEvent as jsonlAppendEvent,
59
62
  appendAuthorityEvent as jsonlAppendAuthorityEvent,
60
63
  readEvents as jsonlReadEvents,
@@ -68,6 +71,10 @@ import {
68
71
  getLastSessionId as jsonlGetLastSessionId,
69
72
  verifySession as jsonlVerifySession,
70
73
  } from "../harness/jsonl-session-store.js";
74
+ import {
75
+ markRuntimeOnlySessionMessage,
76
+ projectCanonicalResumeMessages,
77
+ } from "../lib/session-message-provenance.js";
71
78
  import { classifyStreamRetryReason } from "../lib/stream-retry.js";
72
79
  import {
73
80
  SideEffectLedger,
@@ -106,7 +113,7 @@ import { CLISkillLoader } from "../lib/skill-loader.js";
106
113
  import { expandFileRefsAsync } from "./file-ref-expander.js";
107
114
  import { composeSystemPrompt } from "./system-prompt.js";
108
115
  import { buildUserContent } from "../lib/image-input.js";
109
- import { mergeConsecutiveMessages } from "./message-roles.js";
116
+ import { createResumeRoleProjection } from "./message-roles.js";
110
117
  import { isHeadlessConfigCommand } from "../lib/headless-config-command.js";
111
118
  import {
112
119
  STREAM_PROTOCOL_VERSION,
@@ -1356,6 +1363,21 @@ async function runAgentHeadlessInWorkspace(
1356
1363
  ? () => null
1357
1364
  : jsonlFindLatestEvent);
1358
1365
  const store = {
1366
+ appendToolRoundsIfMessagesMatch:
1367
+ deps.appendToolRoundsIfMessagesMatch ||
1368
+ (hasInjectedSessionStore
1369
+ ? unavailableAuthorityCapability("appendToolRoundsIfMessagesMatch")
1370
+ : jsonlAppendToolRoundsIfMessagesMatch),
1371
+ appendCompactEventIfMessagesMatch:
1372
+ deps.appendCompactEventIfMessagesMatch ||
1373
+ (hasInjectedSessionStore
1374
+ ? unavailableAuthorityCapability("appendCompactEventIfMessagesMatch")
1375
+ : jsonlAppendCompactEventIfMessagesMatch),
1376
+ readVerifiedProjection:
1377
+ deps.readVerifiedProjection ||
1378
+ (hasInjectedSessionStore
1379
+ ? unavailableAuthorityCapability("readVerifiedProjection")
1380
+ : jsonlReadVerifiedProjection),
1359
1381
  sessionExists: deps.sessionExists || jsonlSessionExists,
1360
1382
  rebuildMessages: deps.rebuildMessages || jsonlRebuildMessages,
1361
1383
  startSession: deps.startSession || jsonlStartSession,
@@ -2150,12 +2172,14 @@ async function runAgentHeadlessInWorkspace(
2150
2172
  // content array (agent-core converts it per-provider for ollama/anthropic).
2151
2173
  const userMessageContent = buildUserContent(userContent, options.images);
2152
2174
 
2153
- // Merge consecutive same-role turns so a resumed session whose previous run
2175
+ // Project consecutive same-role turns only at the provider boundary. A
2176
+ // resumed session whose previous run
2154
2177
  // produced NO assistant response (history ends with a bare `user` turn) does
2155
2178
  // not yield two adjacent `user` messages — which Anthropic/Bedrock reject as
2156
2179
  // "roles must alternate", failing the resume (Claude Code 2.1.187 parity).
2157
2180
  // No-op on a healthy alternating transcript.
2158
- const messages = mergeConsecutiveMessages([
2181
+ // Keep the authority array identical to the durable transcript for CAS.
2182
+ const messages = [
2159
2183
  { role: "system", content: systemContent },
2160
2184
  ...(instructionsLoadedContext
2161
2185
  ? [{ role: "system", content: instructionsLoadedContext }]
@@ -2174,7 +2198,7 @@ async function runAgentHeadlessInWorkspace(
2174
2198
  : []),
2175
2199
  ...history,
2176
2200
  { role: "user", content: userMessageContent },
2177
- ]);
2201
+ ];
2178
2202
 
2179
2203
  // Persist the user turn before model/tool side effects. A full or read-only
2180
2204
  // session disk is a recoverability contract failure, so it fails closed
@@ -2199,7 +2223,7 @@ async function runAgentHeadlessInWorkspace(
2199
2223
  }
2200
2224
  // Persist the expanded content so a resumed session faithfully replays
2201
2225
  // what the model actually saw (the file snapshot, not just the @token).
2202
- store.appendUserMessage(sessionId, userContent);
2226
+ store.appendUserMessage(sessionId, userMessageContent);
2203
2227
  } catch (error) {
2204
2228
  const persistenceError = createSessionPersistenceFailure(error, {
2205
2229
  sessionId,
@@ -2393,19 +2417,20 @@ async function runAgentHeadlessInWorkspace(
2393
2417
 
2394
2418
  // IDE live context (Claude-Code parity): when an IDE bridge is connected,
2395
2419
  // share the editor's selection/active file/open tabs with this turn. Appended
2396
- // to the in-flight user message only — AFTER persistence — so a resumed
2420
+ // as private live context only — AFTER persistence — so a resumed
2397
2421
  // session replays the prompt, not a stale editor snapshot. Best-effort with
2398
2422
  // a short timeout; CC_IDE_CONTEXT=0 disables.
2399
2423
  if (!hermeticExecution) {
2400
2424
  try {
2401
- const { buildIdePromptContext, appendTextToContent, expandIdeMentions } =
2402
- await import("../lib/ide-context.js");
2403
- const last = messages[messages.length - 1];
2425
+ const { buildIdePromptContext, expandIdeMentions } = await import(
2426
+ "../lib/ide-context.js"
2427
+ );
2428
+ const ideBlocks = [];
2404
2429
  const ideCtx = await (
2405
2430
  deps.buildIdePromptContext || buildIdePromptContext
2406
2431
  )(hostMcp);
2407
2432
  if (ideCtx) {
2408
- last.content = appendTextToContent(last.content, ideCtx);
2433
+ ideBlocks.push(ideCtx);
2409
2434
  }
2410
2435
  // Explicit @selection / @diagnostics mentions in the user's prompt
2411
2436
  // (Claude-Code parity). Scan the ORIGINAL prompt so injected file-ref
@@ -2414,7 +2439,15 @@ async function runAgentHeadlessInWorkspace(
2414
2439
  const mentioned = await expandIdeMentions(prompt, hostMcp);
2415
2440
  for (const w of mentioned.warnings) writeErr(` @ide: ${w}\n`);
2416
2441
  if (mentioned.block) {
2417
- last.content = appendTextToContent(last.content, mentioned.block);
2442
+ ideBlocks.push(mentioned.block);
2443
+ }
2444
+ if (ideBlocks.length) {
2445
+ messages.push(
2446
+ markRuntimeOnlySessionMessage({
2447
+ role: "user",
2448
+ content: ideBlocks.join("\n\n"),
2449
+ }),
2450
+ );
2418
2451
  }
2419
2452
  } catch {
2420
2453
  // IDE context is optional polish — never fail the run over it.
@@ -2811,10 +2844,65 @@ async function runAgentHeadlessInWorkspace(
2811
2844
  }
2812
2845
 
2813
2846
  const childToolExecs = new Map();
2847
+ const synchronousAuthorityResult = (value, capability) => {
2848
+ if (isProxy(value)) {
2849
+ throw Object.assign(
2850
+ new Error(`${capability} must return non-Proxy authority`),
2851
+ {
2852
+ code: "SESSION_AUTHORITY_CAPABILITY_INVALID",
2853
+ },
2854
+ );
2855
+ }
2856
+ if (value && typeof value.then === "function") {
2857
+ void Promise.resolve(value).catch(() => {});
2858
+ throw Object.assign(
2859
+ new Error(`${capability} must settle synchronously`),
2860
+ {
2861
+ code: "SESSION_AUTHORITY_CAPABILITY_INVALID",
2862
+ },
2863
+ );
2864
+ }
2865
+ return value;
2866
+ };
2867
+ const settleToolRounds = () => {
2868
+ if (
2869
+ !persist ||
2870
+ !messages.some(
2871
+ (message) => message.role === "assistant" && message.tool_calls?.length,
2872
+ )
2873
+ )
2874
+ return;
2875
+ return persistRuntimeLedgerWrite(() => {
2876
+ sessionHostLease?.assert?.();
2877
+ const expected = synchronousAuthorityResult(
2878
+ store.readVerifiedProjection(sessionId, () => ({
2879
+ accept() {},
2880
+ finish(authority) {
2881
+ return authority.readMessages();
2882
+ },
2883
+ })),
2884
+ "readVerifiedProjection",
2885
+ );
2886
+ const appended = synchronousAuthorityResult(
2887
+ store.appendToolRoundsIfMessagesMatch(sessionId, messages, expected),
2888
+ "appendToolRoundsIfMessagesMatch",
2889
+ );
2890
+ if (typeof appended?.hash !== "string" || !appended.hash) {
2891
+ throw Object.assign(
2892
+ new Error("Tool round settlement did not return its durable head"),
2893
+ {
2894
+ code: "CC_SESSION_TOOL_ROUND_SETTLEMENT_HEAD_UNKNOWN",
2895
+ },
2896
+ );
2897
+ }
2898
+ return appended;
2899
+ });
2900
+ };
2814
2901
  const loopOptions = {
2815
2902
  ...(evolutionIngress === null ? {} : { evolutionIngress }),
2816
2903
  model,
2817
2904
  provider,
2905
+ projectProviderMessages: createResumeRoleProjection(messages),
2818
2906
  recorder: _otlpRecorder,
2819
2907
  // --otlp-content: opt in to stamping prompt CONTENT onto --otlp spans. Off by
2820
2908
  // default → content stays redacted (agent-core omits it entirely, so default
@@ -2916,6 +3004,28 @@ async function runAgentHeadlessInWorkspace(
2916
3004
  mcpDispatchAdmission: hermeticExecution
2917
3005
  ? null
2918
3006
  : sessionHostLease?.admitMcpDispatch || null,
3007
+ persistCompaction: persist,
3008
+ onBeforeCompaction: settleToolRounds,
3009
+ onCompaction: persist
3010
+ ? (stats, compacted, settlement = {}) =>
3011
+ persistRuntimeLedgerWrite(() => {
3012
+ sessionHostLease?.assert?.();
3013
+ return synchronousAuthorityResult(
3014
+ store.appendCompactEventIfMessagesMatch(
3015
+ sessionId,
3016
+ {
3017
+ ...stats,
3018
+ trigger: settlement.trigger || "auto",
3019
+ messages: projectCanonicalResumeMessages(compacted, {
3020
+ strict: true,
3021
+ }),
3022
+ },
3023
+ settlement.expectedMessages,
3024
+ ),
3025
+ "appendCompactEventIfMessagesMatch",
3026
+ );
3027
+ })
3028
+ : undefined,
2919
3029
  // chatFn passthrough lets tests drive the loop deterministically.
2920
3030
  chatFn: deps.chatFn || options.chatFn || undefined,
2921
3031
  signal: options.signal || undefined,
@@ -3870,12 +3980,14 @@ async function runAgentHeadlessInWorkspace(
3870
3980
  `${rw.error ? `: ${rw.error}` : ""}`,
3871
3981
  )
3872
3982
  .join("\n");
3873
- messages.push({
3874
- role: "user",
3875
- content:
3876
- `A background check flagged a problem after your last turn:\n${detail}\n` +
3877
- `Investigate and fix it, then confirm it passes.`,
3878
- });
3983
+ messages.push(
3984
+ markRuntimeOnlySessionMessage({
3985
+ role: "user",
3986
+ content:
3987
+ `A background check flagged a problem after your last turn:\n${detail}\n` +
3988
+ `Investigate and fix it, then confirm it passes.`,
3989
+ }),
3990
+ );
3879
3991
  if (isText)
3880
3992
  writeErr(
3881
3993
  ` ↻ async-hook rewake — re-engaging agent (${rewakeBudget} re-drive(s) left)\n`,
@@ -3983,13 +4095,15 @@ async function runAgentHeadlessInWorkspace(
3983
4095
  // and the next turn still resumes at the right point.
3984
4096
  persistGoalSnapshot();
3985
4097
  if (decision === _goalHelpers.GOAL_DECISION.CONTINUE) {
3986
- messages.push({
3987
- role: "user",
3988
- content:
3989
- `The completion condition is not yet met: ${evaluation.reason}.\n` +
3990
- `Keep working toward: "${cond.source}". When you believe it is ` +
3991
- `satisfied, make sure it actually passes.`,
3992
- });
4098
+ messages.push(
4099
+ markRuntimeOnlySessionMessage({
4100
+ role: "user",
4101
+ content:
4102
+ `The completion condition is not yet met: ${evaluation.reason}.\n` +
4103
+ `Keep working toward: "${cond.source}". When you believe it is ` +
4104
+ `satisfied, make sure it actually passes.`,
4105
+ }),
4106
+ );
3993
4107
  finalText = "";
3994
4108
  endReason = "complete";
3995
4109
  if (isText)
@@ -4005,6 +4119,22 @@ async function runAgentHeadlessInWorkspace(
4005
4119
  } catch (err) {
4006
4120
  const runtimeLedgerPersistenceFailed =
4007
4121
  err?.runtimeLedgerPersistence === true;
4122
+ const persistence = runtimeLedgerPersistenceFailed
4123
+ ? projectSessionPersistenceFailure(
4124
+ createSessionPersistenceFailure(err, {
4125
+ sessionId,
4126
+ operation: "append-event",
4127
+ }),
4128
+ { phase: "after-model" },
4129
+ )
4130
+ : null;
4131
+ if (persistence) {
4132
+ try {
4133
+ deps.onPersistenceFailure?.(persistence);
4134
+ } catch {
4135
+ // Observability cannot change persistence semantics.
4136
+ }
4137
+ }
4008
4138
  const sessionBudgetFailed =
4009
4139
  err?.code === "CC_SESSION_BUDGET_EXHAUSTED" ||
4010
4140
  err?.code === "CC_SESSION_BUDGET_USAGE_UNKNOWN" ||
@@ -4028,7 +4158,12 @@ async function runAgentHeadlessInWorkspace(
4028
4158
  errorSubtype === "error" ? transportErrorDetails(err) : undefined;
4029
4159
  const diagnosticFields = transportDetails
4030
4160
  ? { error_details: transportDetails }
4031
- : {};
4161
+ : {
4162
+ ...(runtimeLedgerPersistenceFailed && err.code
4163
+ ? { code: err.code }
4164
+ : {}),
4165
+ ...(persistence ? { persistence } : {}),
4166
+ };
4032
4167
  if (isStream) {
4033
4168
  emitStream({
4034
4169
  type: "result",
@@ -4067,6 +4202,8 @@ async function runAgentHeadlessInWorkspace(
4067
4202
  : classifyLoopError(err),
4068
4203
  result: message,
4069
4204
  isError: true,
4205
+ ...(persistence ? { persistence } : {}),
4206
+ ...(runtimeLedgerPersistenceFailed && err.code ? { code: err.code } : {}),
4070
4207
  };
4071
4208
  } finally {
4072
4209
  // Capture body-cache hits/misses caused by list_skills/run_skill during the
@@ -4250,16 +4387,21 @@ async function runAgentHeadlessInWorkspace(
4250
4387
  : "success";
4251
4388
  const durationMs = (deps.now ? deps.now() : Date.now()) - startedAt;
4252
4389
  let persistenceFailure = null;
4390
+ let sessionPersistenceCode = null;
4253
4391
 
4254
- // Persist the assistant turn so a later --resume / --continue replays it.
4255
- // The user turn was already recorded up front; only append on a clean run.
4256
- if (persist && !isError) {
4392
+ // Complete tool evidence survives a clean budget stop. Only a successful
4393
+ // run appends a final assistant answer; settlement failure is always terminal.
4394
+ if (persist) {
4395
+ let persistenceOperation = "append-event";
4257
4396
  try {
4258
- if (finalText) store.appendAssistantMessage(sessionId, finalText);
4397
+ settleToolRounds();
4398
+ persistenceOperation = "assistant-turn-append";
4399
+ if (!isError && finalText)
4400
+ store.appendAssistantMessage(sessionId, finalText);
4259
4401
  } catch (error) {
4260
4402
  const persistenceError = createSessionPersistenceFailure(error, {
4261
4403
  sessionId,
4262
- operation: "assistant-turn-append",
4404
+ operation: persistenceOperation,
4263
4405
  });
4264
4406
  persistenceFailure = projectSessionPersistenceFailure(persistenceError, {
4265
4407
  phase: "after-model",
@@ -4277,6 +4419,15 @@ async function runAgentHeadlessInWorkspace(
4277
4419
  `CC_SESSION_PERSISTENCE_FAILED: assistant turn durability is ${persistenceFailure.commit_state} (${persistenceFailure.fs_code})\n`,
4278
4420
  );
4279
4421
  }
4422
+ } else if (error?.runtimeLedgerPersistence === true) {
4423
+ isError = true;
4424
+ subtype = "error_session_persistence";
4425
+ sessionPersistenceCode =
4426
+ error.code || "CC_SESSION_TOOL_ROUND_PERSISTENCE_FAILED";
4427
+ if (isText)
4428
+ writeErr(
4429
+ `${sessionPersistenceCode}: completed tool rounds could not be settled; refresh the session before continuing\n`,
4430
+ );
4280
4431
  }
4281
4432
  // Preserve legacy best-effort handling for errors outside the explicit
4282
4433
  // ENOSPC/EROFS durability contract.
@@ -4416,11 +4567,12 @@ async function runAgentHeadlessInWorkspace(
4416
4567
  ? { compaction_degradations: compactionDegradations }
4417
4568
  : {}),
4418
4569
  ...(persistenceFailure ? { persistence: persistenceFailure } : {}),
4570
+ ...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
4419
4571
  });
4420
4572
  } else if (isJson) {
4421
4573
  writeOut(
4422
- JSON.stringify(
4423
- buildResultEnvelope({
4574
+ JSON.stringify({
4575
+ ...buildResultEnvelope({
4424
4576
  subtype,
4425
4577
  isError,
4426
4578
  result: finalText,
@@ -4434,7 +4586,8 @@ async function runAgentHeadlessInWorkspace(
4434
4586
  compactionDegradations,
4435
4587
  persistence: persistenceFailure,
4436
4588
  }),
4437
- ) + "\n",
4589
+ ...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
4590
+ }) + "\n",
4438
4591
  );
4439
4592
  } else {
4440
4593
  // text: just the final answer on stdout.
@@ -4475,10 +4628,14 @@ async function runAgentHeadlessInWorkspace(
4475
4628
  // Exit-code taxonomy: max-turns → 3, cost cap → 4 (both still non-zero, so
4476
4629
  // "any failure" checks keep working; scripts can now tell exhaustion apart).
4477
4630
  return {
4478
- exitCode: exitCodeForEndReason(endReason, isError),
4631
+ exitCode:
4632
+ persistenceFailure || sessionPersistenceCode
4633
+ ? 1
4634
+ : exitCodeForEndReason(endReason, isError),
4479
4635
  result: finalText,
4480
4636
  isError,
4481
4637
  ...(persistenceFailure ? { persistence: persistenceFailure } : {}),
4638
+ ...(sessionPersistenceCode ? { code: sessionPersistenceCode } : {}),
4482
4639
  };
4483
4640
  }
4484
4641