chainlesschain 0.162.161 → 0.162.163

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 (209) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DMn528q-.js → AIOps-BQ0kgfA1.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-D9ZcDCJL.js → ActionButton-Dr1MDANe.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-A_K-8PX0.js → Analytics-CZ5vsaXW.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D4pFW3X6.js → AppLayout-BIBga881.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-Dz46COAd.js → Artifacts-vpXHRU3u.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-cbMjbyg0.js → Audit-B8exuoub.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-Dtf88GAj.js → BackgroundAgents-923evRRN.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-C5KRxn52.js → Backup-sr_sswlQ.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Dd2UK3BN.js → BaseInput-CnW-4XKT.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-lptKTFdG.js → Chat-FZCsTZIL.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-DDPd9qT0.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-_yspG6rG.js → Checkbox-DFrxB59H.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-BGq_GAha.js → Codegen-_b6WEel8.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CePor71g.js → Col-CkbnnZ-K.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CLOWhIT7.js → Community-BxM_82zW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CivJt2vT.js → Compact-DYinP45R.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Btmo1GGE.js → Compliance-DyXp3sSP.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Ct35OlG4.js → Cowork-BEr2DhW7.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CTc2GmhB.js → Cron-B-Vwo1hN.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-ZtiBETk1.js → Crosschain-DbLxKddd.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BNqMQQXw.js → DID-BsQ_LFw9.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-BmzZd-9V.js → Dashboard-lVlXQHu5.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CMVgvP2M.js → Dropdown-Beo_foO7.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CcqQFAfT.js → EmailListRenderer-DszHIXED.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CTqB1_4V.js → FamilyGuardDashboard-DcAwoh81.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CiKOOzlb.js → Federation-CuJLa2eb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Wk-OT0gr.js → FormItemContext-Cxd1lxhc.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DbEQT6ue.js → GenericCardRenderer-BBvq5Jsw.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-0ZvCPSD9.js → Git-WqPKetx6.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CmVuKkPb.js → Governance-CWYtY3ke.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CTWE3Jwg.js → Inference-BnX1iiNV.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CBEIF00L.js → KnowledgeGraph-BJuM8GN5.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DLhxDwVG.js → Logs-DqLMNntm.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-BqYwEYou.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-BgsCBrnc.js → Marketplace-_vGfmhNl.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-ClBUGDS2.js → McpTools-BeJDOkDj.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CnG_ZnYw.js → Memory-Da0EEZDO.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BUOAbR1Z.js → MobileBridge-DSuzcCCy.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-Dnt_9-WB.js → MobileProjects-D0RAk4e8.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-CLjt4kCD.js → Mtc-BE9YgdA0.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-f24U9Aes.js → MtcAudit-fC2BpO5S.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-GrmGQbSq.js → Multisig-D24Xxqw3.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-DADaWn-n.js → NLProgramming-Bs3oGvS8.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-xtf5RX6C.js → Notes-BFjmAA-3.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-Cd27Rgtx.js → NotificationSettings-BX_9Bhv0.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-fXRxlDjl.js → OrderTableRenderer-wjkZwJXI.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-joCFlNB0.js → Organization-DBcdsVEP.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-B1HoURq0.js → Overflow-DDyaF9vC.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DiwsKbT7.js → P2P-BB78L4he.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Xe-BsW6S.js → PdhVaultBrowser-DqTiZFum.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-C23qi8kl.js → Permissions-INbnWv4j.js} +3 -3
  53. package/src/assets/web-panel/assets/{PersonalDataHub-BS1syX2f.js → PersonalDataHub-BST-VmTq.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-DRYwwDyh.js → Pipeline-CE7_tS2k.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-BQKaDHPH.js → Privacy-hK5L8dOB.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BC6F9xiG.js → ProjectInit-BvkkUoDn.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-ClFPc1Nd.js → ProjectSettings-u7_EUtkm.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-5Fmt_8Nw.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-CLWuOUNt.js → Providers-B9eanarR.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DiqULTxb.js → QrScannerModal-C0dX5N2f.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-9A03P-E_.js → QuickAsk-CKTpG-PZ.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CJZAnbq_.js → Recommend-Px_w_XQM.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C9A1R77h.js → RemoteSession-Di0fnYkM.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BIZc6Rky.js → Reputation-vesnWjXt.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DfIPNtuG.js → Row-exbY6LkT.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C5znFcQ1.js → RssFeed-B3O3x70t.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-DSs2z3OX.js → Search-uRA0DhNz.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CV6LcrLY.js → Security-CViqdH6K.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-cmhoX0Xj.js → Services-CkXS97WN.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-tCsg2po7.js → Skeleton-DxW5WYnE.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BK1KUDiy.js → Skills-CLxmGFse.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-yRgyeA82.js → Sla-Cr5fziXq.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-c1mo1mlp.js → SpeechSettings-H0JSb3cp.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-koIAfuT3.js → SyncSettings-DMYWMae7.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DkkreAaB.js → Tasks-CbYyDdF4.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-fy5Ctf9M.js → Templates-Cpc8JjiK.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-Bw70Jf6S.js → Tenant-CRh77Jda.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BKh6Rx-4.js → Terminal-4D8tNBO5.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Dg54WP0c.js → TimelineRenderer-D41jzzbG.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-BvvD5SxJ.js → Tokens-C_jWEy6b.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-B7Ug9x4e.js → Trigger-Dk1ZUhsy.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BjvuMORY.js → Trust-CLVy4l7m.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CZqhkx8p.js → UkeySign-C-FeqFDj.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-ClR50lhX.js → VideoEditing-CqVZzyMm.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DlfppYjx.js → Wallet-DX9BW9pu.js} +2 -2
  86. package/src/assets/web-panel/assets/{WebAuthn-BirgVr8B.js → WebAuthn-7hQDpWw_.js} +2 -2
  87. package/src/assets/web-panel/assets/{WorkflowEditor-B8DP_bax.js → WorkflowEditor-6XqUAO0j.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-DA8AUZzL.js → chat-5R_vkaJG.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-C38pLGp1.js → colors-huUPZdC-.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-81rtr98o.js → compact-item-CfJlgisE.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-D34ixq8t.js → createContext-jO8heofr.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DeIrCfH-.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-D4bzqTrZ.js → hasIn-DY8Vxqx7.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-E1OJRXs4.js → index-A48PtXw9.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-D3zCCZRS.js → index-B300RPnT.js} +3 -3
  96. package/src/assets/web-panel/assets/{index-Cd3KuNK5.js → index-B74OXFxC.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Dmo3dFHb.js → index-BAON7TzU.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Ddk0e_Pi.js → index-BCqxyvqp.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-9qoVpPt6.js → index-BHE8OIls.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DBFSo1NF.js → index-BQS-uPOK.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DUQLXLQM.js → index-BRXOP09X.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-D6GfvEQG.js → index-BYLBPpt8.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DFyWKOBD.js → index-BfCx4pFT.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BP-zkXK8.js → index-BliaT02i.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DMgnRwrK.js → index-BmqGerpC.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BIP62a6r.js → index-BsBtRWbA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DkHqMnn3.js → index-BtEXSoPL.js} +1 -1
  108. package/src/assets/web-panel/assets/index-BxUKMRpP.js +1 -0
  109. package/src/assets/web-panel/assets/{index-B8mkLM4x.js → index-Bxax9vQ6.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-ZRJRItm0.js → index-C2iVSFpy.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CP5alL4t.js → index-CA6sO5VD.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BS3M5H9V.js → index-CA90TZxG.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DvfCEJG-.js → index-CLhBh-qE.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-tKiC8T-4.js → index-CRElRhyS.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-B0QArPQt.js → index-Cbe9G0V4.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-COe_cOLJ.js → index-ChvHubX3.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BvL_3J_n.js → index-Cis_Ip7H.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-F76w1NiL.js → index-Cjxbu68P.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BlxEphl7.js → index-CzKmteNS.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CuS-UPoj.js → index-D0pet5Uy.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CbhE3j5j.js → index-D1VLuww0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D_2VYPr1.js → index-DXBcvUnf.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DakfFZ-k.js → index-Db1cLWir.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-fI5sXMLg.js → index-DoI2sZm7.js} +1 -1
  125. package/src/assets/web-panel/assets/index-DscU9iPI.js +1 -0
  126. package/src/assets/web-panel/assets/{index-CoVgZw_b.js → index-KRHroryI.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BvD7b2IK.js → index-d1xkbtNz.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BtGxuQrO.js → index-dKx57io7.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BqIhLAbA.js → index-j3O2EEJe.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BXd2_LmH.js → index-p85YaaKw.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DFHa1HIg.js → index-v3pTaEQm.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D0Ih7Hwn.js → index-vXs3B8GJ.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-ByyvflIR.js → initDefaultProps-MCB7-raZ.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-B3FQm2By.js → motion-UWDF9swV.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BSfns6Ef.js → move-CsTmgXZU.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CTG1Ieri.js → mtc-parser-fQy6KGLg.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-DObM_2j6.js → omit-woPnEjd1.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-DOfelQ1t.js → pickAttrs-Bs2dZ1gf.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CHZILds_.js → placementArrow-C7EVgPkg.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-REbucKSx.js → responsiveObserve-BH2kYCTN.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-C6EZzD7o.js → slide-BFBP2V_e.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BxkWS-g3.js → statusUtils-xdDxDYse.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-Chklyoq6.js → styleChecker-aAWgPPQf.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-CRVwKrrI.js → useFlexGapSupport-DkGSAWoO.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DV24ik_J.js → useFs-BrOih40N.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-C7vIo4Pg.js → usePersonalDataHub-eIYrgMqO.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-By-v5GlF.js → vnode-B8lutNSE.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B1w9Am3r.js → zoom-CffNre7V.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agenda.js +254 -23
  151. package/src/commands/agent.js +105 -11
  152. package/src/commands/context.js +125 -14
  153. package/src/commands/hook.js +181 -7
  154. package/src/commands/plugin.js +239 -1
  155. package/src/commands/review.js +352 -2
  156. package/src/data/changelog.json +14 -4
  157. package/src/gateways/ws/remote-session-protocol.js +39 -0
  158. package/src/gateways/ws/session-protocol.js +5 -2
  159. package/src/lib/agent-schedule-store.js +289 -10
  160. package/src/lib/agents.js +19 -0
  161. package/src/lib/background-agent-supervisor.js +34 -7
  162. package/src/lib/channels/channel-manager.js +54 -2
  163. package/src/lib/cli-context-engineering.js +9 -2
  164. package/src/lib/context-breakdown.js +116 -0
  165. package/src/lib/docs-drift.js +166 -0
  166. package/src/lib/doctor-checkup.js +128 -0
  167. package/src/lib/hook-event-bus.cjs +0 -0
  168. package/src/lib/hook-event-log.cjs +193 -0
  169. package/src/lib/interaction-adapter.js +34 -4
  170. package/src/lib/json-schema-output.js +75 -12
  171. package/src/lib/json-schema-validate.js +831 -0
  172. package/src/lib/lsp/__tests__/diagnostics-scheduler.test.js +93 -0
  173. package/src/lib/lsp/diagnostics-scheduler.js +127 -0
  174. package/src/lib/operation-fingerprint.js +95 -0
  175. package/src/lib/plugin-runtime/capabilities.js +371 -0
  176. package/src/lib/plugin-runtime/capability-consent.js +175 -0
  177. package/src/lib/plugin-runtime/manifest.js +30 -0
  178. package/src/lib/plugin-runtime/policy.js +62 -0
  179. package/src/lib/plugin-runtime/scopes.js +20 -4
  180. package/src/lib/project-instructions.js +128 -0
  181. package/src/lib/remote-approval-bridge.js +16 -0
  182. package/src/lib/repl-goal.js +132 -0
  183. package/src/lib/repl-rewind.js +52 -0
  184. package/src/lib/review-pipeline.js +227 -0
  185. package/src/lib/runtime-checkup.js +318 -0
  186. package/src/lib/schedule-planner.js +17 -1
  187. package/src/lib/session-lifecycle.js +305 -0
  188. package/src/lib/settings-hook-events.cjs +52 -13
  189. package/src/lib/settings-loader.cjs +42 -0
  190. package/src/lib/side-effect-ledger-store.js +88 -0
  191. package/src/lib/side-effect-ledger.js +296 -0
  192. package/src/lib/sub-agent-context.js +74 -5
  193. package/src/lib/subagent-contract.js +383 -0
  194. package/src/lib/subagent-inheritance.js +112 -0
  195. package/src/lib/telemetry-ids.js +190 -0
  196. package/src/lib/turn-binding-store.js +119 -0
  197. package/src/lib/turn-binding.js +397 -0
  198. package/src/repl/agent-repl.js +136 -0
  199. package/src/repl/permission-tier.js +28 -0
  200. package/src/runtime/agent-core.js +387 -14
  201. package/src/runtime/coding-agent-contract-shared.cjs +60 -1
  202. package/src/runtime/headless-runner.js +267 -0
  203. package/src/runtime/headless-stream.js +60 -1
  204. package/src/assets/web-panel/assets/ChatBubbleRenderer-C2KLtwHz.js +0 -1
  205. package/src/assets/web-panel/assets/MarkdownRenderer-DxywvhTU.js +0 -1
  206. package/src/assets/web-panel/assets/Projects-Dn-f5aYe.js +0 -1
  207. package/src/assets/web-panel/assets/devWarning-CHDIEOeN.js +0 -1
  208. package/src/assets/web-panel/assets/index-CY1NURWZ.js +0 -1
  209. package/src/assets/web-panel/assets/index-DokUYqpq.js +0 -1
@@ -116,6 +116,7 @@ import { describeAskContext, raceLocalAndRemote } from "./remote-approval.js";
116
116
  import {
117
117
  parsePermissionTier,
118
118
  parsePermissionModeArg,
119
+ permissionModeForTier,
119
120
  describeTier,
120
121
  nextTier,
121
122
  } from "./permission-tier.js";
@@ -460,6 +461,10 @@ export async function startAgentRepl(options = {}) {
460
461
  // tier but additionally activates the autoMode.decisions classifier wrapper
461
462
  // (when settings customize it) — gateTierFor() maps mode → real gate tier.
462
463
  let _sessionTier = "strict";
464
+ // `/goal <condition>`: an optional SESSION completion condition. When set, the
465
+ // condition is evaluated + reported after each turn (interactive — no auto
466
+ // re-drive; that autonomous loop is headless-only). null = no session goal.
467
+ let _sessionGoal = null;
463
468
  const gateTierFor = (mode) =>
464
469
  mode === "auto" ? "trusted" : mode === "dontAsk" ? "strict" : mode;
465
470
  // dontAsk (headless parity, interactive form): anything that would prompt
@@ -1581,6 +1586,7 @@ export async function startAgentRepl(options = {}) {
1581
1586
  "/exit",
1582
1587
  "/export",
1583
1588
  "/fast",
1589
+ "/goal",
1584
1590
  "/help",
1585
1591
  "/hooks",
1586
1592
  "/ide",
@@ -2184,6 +2190,9 @@ export async function startAgentRepl(options = {}) {
2184
2190
  logger.log(
2185
2191
  ` ${chalk.cyan("/rewind")} Rewind to an earlier turn (double-Esc lists); ${chalk.cyan("/rewind clear")} restores a /clear`,
2186
2192
  );
2193
+ logger.log(
2194
+ ` ${chalk.cyan("/goal <cond>")} Set a session goal checked after each turn (exit-zero:/file-exists:/contains:/regex:/text); ${chalk.cyan("/goal")} shows, ${chalk.cyan("/goal clear")} drops`,
2195
+ );
2187
2196
  logger.log(
2188
2197
  ` ${chalk.cyan("/cd <dir>")} Change working directory mid-session (completion/memory follow)`,
2189
2198
  );
@@ -3009,6 +3018,8 @@ export async function startAgentRepl(options = {}) {
3009
3018
  pickCheckpointForTurn,
3010
3019
  pruneMarksAfter,
3011
3020
  restoreClearedConversation,
3021
+ buildRewindPlan,
3022
+ renderRewindWarnings,
3012
3023
  } = await import("../lib/repl-rewind.js");
3013
3024
  const arg = trimmed.slice("/rewind".length).trim();
3014
3025
  if (arg === "clear" || arg === "undo-clear") {
@@ -3049,6 +3060,9 @@ export async function startAgentRepl(options = {}) {
3049
3060
  );
3050
3061
  }
3051
3062
  } else {
3063
+ // Snapshot BEFORE rewindToTurn truncates `messages`: buildRewindPlan
3064
+ // needs the target turn still present to bind it to its checkpoint.
3065
+ const preRewind = messages.slice();
3052
3066
  const res = rewindToTurn(messages, arg);
3053
3067
  if (!res) {
3054
3068
  logger.error(`No such turn: ${arg} — run /rewind to list.`);
@@ -3058,6 +3072,23 @@ export async function startAgentRepl(options = {}) {
3058
3072
  `⎌ rewound — dropped ${res.removed} message(s); edit and resend below`,
3059
3073
  ),
3060
3074
  );
3075
+ // Coverage-aware honesty (P1 turn/checkpoint binding): print what a
3076
+ // restore can and cannot promise for this turn BEFORE offering the
3077
+ // file restore — a shell/external side-effect → PARTIAL, no
3078
+ // checkpoint → files can't be restored, conversation/files drift.
3079
+ // Derived from the REPL's existing marks (no new agent-loop events);
3080
+ // best-effort so the advisory never blocks the rewind itself.
3081
+ try {
3082
+ const plan = buildRewindPlan(
3083
+ preRewind,
3084
+ _checkpointMarks,
3085
+ res.index,
3086
+ );
3087
+ for (const line of renderRewindWarnings(plan))
3088
+ logger.log(chalk.yellow(line));
3089
+ } catch {
3090
+ /* advisory only — a rewind must never fail over its own warning */
3091
+ }
3061
3092
  // Claude-Code parity: rewind restores files too. Match the dropped
3062
3093
  // turn to the snapshot taken just before it first mutated the tree,
3063
3094
  // then offer to roll the working tree back to it (undoable — the
@@ -3533,6 +3564,35 @@ export async function startAgentRepl(options = {}) {
3533
3564
  }
3534
3565
 
3535
3566
  // Stats
3567
+ if (trimmed === "/goal" || trimmed.startsWith("/goal ")) {
3568
+ // Session completion condition (distinct from `cc goal` OKR): set / show /
3569
+ // clear a condition that is evaluated + reported after each turn.
3570
+ try {
3571
+ const rg = await import("../lib/repl-goal.js");
3572
+ const cmd = rg.parseGoalCommand(trimmed.slice("/goal".length));
3573
+ if (cmd.action === "clear") {
3574
+ if (_sessionGoal) {
3575
+ _sessionGoal = null;
3576
+ logger.log(chalk.gray("◎ session goal cleared."));
3577
+ } else {
3578
+ logger.log(chalk.gray("No session goal to clear."));
3579
+ }
3580
+ } else if (cmd.action === "status") {
3581
+ for (const l of rg.renderGoalStatus(_sessionGoal))
3582
+ logger.log(chalk.gray(l));
3583
+ } else {
3584
+ // set — createReplGoal throws on a malformed spec (caught below).
3585
+ _sessionGoal = rg.createReplGoal(cmd.spec, { now: () => Date.now() });
3586
+ for (const l of rg.renderGoalStart(_sessionGoal))
3587
+ logger.log(chalk.cyan(l));
3588
+ }
3589
+ } catch (err) {
3590
+ logger.error(`/goal: ${err.message}`);
3591
+ }
3592
+ prompt();
3593
+ return;
3594
+ }
3595
+
3536
3596
  if (trimmed === "/stats") {
3537
3597
  if (contextEngine) {
3538
3598
  const stats = contextEngine.getStats();
@@ -5102,6 +5162,17 @@ export async function startAgentRepl(options = {}) {
5102
5162
  denialLog: _recentDenials,
5103
5163
  persistRecentDenials: true,
5104
5164
  permissionMode: _sessionTier,
5165
+ // Seed the subagent-contract CEILING with the interactive session's
5166
+ // CURRENT approval tier (mapped back to a permission mode) so a spawned
5167
+ // sub-agent inherits/tightens from it (tighten-only), mirroring the
5168
+ // headless runner. An autopilot session hands children bypassPermissions
5169
+ // (→ allow confirmer); a mid-session Shift+Tab / `/permissions` change is
5170
+ // reflected because `_sessionTier` is read per turn. A strict session
5171
+ // resolves children to "default" exactly as before (byte-identical — the
5172
+ // previous absent ceiling also yielded "default").
5173
+ subAgentContract: {
5174
+ permissionMode: permissionModeForTier(_sessionTier),
5175
+ },
5105
5176
  prepareCall,
5106
5177
  approvalGate: _approvalGate,
5107
5178
  permissionRules: _permissionRules,
@@ -5161,6 +5232,71 @@ export async function startAgentRepl(options = {}) {
5161
5232
  if (used > 0) _ctxUsedTokens = used;
5162
5233
  }
5163
5234
 
5235
+ // /goal (session completion condition): evaluate this turn's answer and
5236
+ // report met / not-yet / dropped. Deterministic conditions (exit-zero /
5237
+ // file-exists / contains / regex) run inline; a model condition reuses the
5238
+ // session model as an independent judge. Interactive → REPORT only, never
5239
+ // auto re-drive (that autonomous loop is headless-only). Best-effort — an
5240
+ // eval failure never disturbs the turn.
5241
+ if (_sessionGoal && !_sessionGoal.done) {
5242
+ try {
5243
+ const rg = await import("../lib/repl-goal.js");
5244
+ const fsMod = await import("node:fs");
5245
+ const cpMod = await import("node:child_process");
5246
+ const judge = async (cond, { finalText }) => {
5247
+ const { chatWithTools } = await import("../runtime/agent-core.js");
5248
+ const { firstBalancedJson } =
5249
+ await import("../lib/json-schema-output.js");
5250
+ const p =
5251
+ `Judge whether this coding session met a completion condition.\n` +
5252
+ `Condition: ${cond.text || cond.source}\n\n` +
5253
+ `Latest assistant output:\n${String(finalText || "").slice(0, 2000)}\n\n` +
5254
+ `Reply with STRICT JSON only: {"met": true|false, "reason": "<short>"}.`;
5255
+ const jr = await chatWithTools([{ role: "user", content: p }], {
5256
+ model: activeModel,
5257
+ provider,
5258
+ baseUrl,
5259
+ apiKey,
5260
+ enabledToolNames: [],
5261
+ });
5262
+ const text = jr?.message?.content || "";
5263
+ let met = false;
5264
+ let reason = "model judge returned no verdict";
5265
+ const block = firstBalancedJson(text, "{");
5266
+ if (block) {
5267
+ try {
5268
+ const parsed = JSON.parse(block);
5269
+ met = parsed.met === true;
5270
+ reason =
5271
+ typeof parsed.reason === "string" && parsed.reason.trim()
5272
+ ? parsed.reason.trim()
5273
+ : met
5274
+ ? "condition met"
5275
+ : "condition not met";
5276
+ } catch {
5277
+ /* a non-JSON verdict stays unmet */
5278
+ }
5279
+ }
5280
+ return { met, reason, evidence: { kind: "model" } };
5281
+ };
5282
+ const { decision, events, done } = await rg.evaluateReplGoalTurn(
5283
+ _sessionGoal,
5284
+ response || "",
5285
+ {
5286
+ cwd: process.cwd(),
5287
+ spawnSync: cpMod.spawnSync,
5288
+ existsSync: fsMod.existsSync,
5289
+ judge,
5290
+ },
5291
+ );
5292
+ for (const l of rg.renderGoalVerdict(decision, events))
5293
+ logger.log(chalk.cyan(l));
5294
+ if (done) _sessionGoal = null; // completed or exhausted → drop
5295
+ } catch (err) {
5296
+ logger.verbose(`/goal eval skipped: ${err.message}`);
5297
+ }
5298
+ }
5299
+
5164
5300
  // Fire AssistantResponse hook with rewrite/suppress support
5165
5301
  const responseDirective = await fireAssistantResponse(
5166
5302
  _hookDb,
@@ -72,6 +72,34 @@ export function parsePermissionModeArg(arg) {
72
72
  return tier ? { tier, auto: false, dontAsk: false } : null;
73
73
  }
74
74
 
75
+ /**
76
+ * Inverse of the tier mapping: turn a live REPL session tier back into a
77
+ * subagent-contract permission MODE, so a spawned sub-agent inherits/tightens
78
+ * from the interactive session's CURRENT approval tier (its run-mode ceiling).
79
+ * Lossy on the restrictive end (strict ← default/manual/plan) — "default" is the
80
+ * safe representative and resolves identically for a child — but the PERMISSIVE
81
+ * end (autopilot → bypassPermissions) is exact, which is what lets a bypass
82
+ * session hand its children the allow confirmer. `auto`/`dontAsk` carry through.
83
+ *
84
+ * @param {string} tier strict | trusted | autopilot | auto | dontAsk
85
+ * @returns {"default"|"acceptEdits"|"bypassPermissions"|"auto"|"dontAsk"}
86
+ */
87
+ export function permissionModeForTier(tier) {
88
+ switch (tier) {
89
+ case "autopilot":
90
+ return "bypassPermissions";
91
+ case "trusted":
92
+ return "acceptEdits";
93
+ case "auto":
94
+ return "auto";
95
+ case "dontAsk":
96
+ return "dontAsk";
97
+ case "strict":
98
+ default:
99
+ return "default";
100
+ }
101
+ }
102
+
75
103
  /** One-line description of what a tier auto-approves. */
76
104
  export function describeTier(tier) {
77
105
  switch (tier) {