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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DMn528q-.js → AIOps-BQ0kgfA1.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D9ZcDCJL.js → ActionButton-Dr1MDANe.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-A_K-8PX0.js → Analytics-CZ5vsaXW.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D4pFW3X6.js → AppLayout-BIBga881.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Dz46COAd.js → Artifacts-vpXHRU3u.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-cbMjbyg0.js → Audit-B8exuoub.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Dtf88GAj.js → BackgroundAgents-923evRRN.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C5KRxn52.js → Backup-sr_sswlQ.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Dd2UK3BN.js → BaseInput-CnW-4XKT.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-lptKTFdG.js → Chat-FZCsTZIL.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DDPd9qT0.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-_yspG6rG.js → Checkbox-DFrxB59H.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BGq_GAha.js → Codegen-_b6WEel8.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CePor71g.js → Col-CkbnnZ-K.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CLOWhIT7.js → Community-BxM_82zW.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CivJt2vT.js → Compact-DYinP45R.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Btmo1GGE.js → Compliance-DyXp3sSP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ct35OlG4.js → Cowork-BEr2DhW7.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CTc2GmhB.js → Cron-B-Vwo1hN.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-ZtiBETk1.js → Crosschain-DbLxKddd.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BNqMQQXw.js → DID-BsQ_LFw9.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-BmzZd-9V.js → Dashboard-lVlXQHu5.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CMVgvP2M.js → Dropdown-Beo_foO7.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CcqQFAfT.js → EmailListRenderer-DszHIXED.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CTqB1_4V.js → FamilyGuardDashboard-DcAwoh81.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CiKOOzlb.js → Federation-CuJLa2eb.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Wk-OT0gr.js → FormItemContext-Cxd1lxhc.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DbEQT6ue.js → GenericCardRenderer-BBvq5Jsw.js} +1 -1
- package/src/assets/web-panel/assets/{Git-0ZvCPSD9.js → Git-WqPKetx6.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CmVuKkPb.js → Governance-CWYtY3ke.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CTWE3Jwg.js → Inference-BnX1iiNV.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CBEIF00L.js → KnowledgeGraph-BJuM8GN5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DLhxDwVG.js → Logs-DqLMNntm.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BqYwEYou.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BgsCBrnc.js → Marketplace-_vGfmhNl.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-ClBUGDS2.js → McpTools-BeJDOkDj.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CnG_ZnYw.js → Memory-Da0EEZDO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BUOAbR1Z.js → MobileBridge-DSuzcCCy.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-Dnt_9-WB.js → MobileProjects-D0RAk4e8.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CLjt4kCD.js → Mtc-BE9YgdA0.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-f24U9Aes.js → MtcAudit-fC2BpO5S.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-GrmGQbSq.js → Multisig-D24Xxqw3.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DADaWn-n.js → NLProgramming-Bs3oGvS8.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-xtf5RX6C.js → Notes-BFjmAA-3.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Cd27Rgtx.js → NotificationSettings-BX_9Bhv0.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-fXRxlDjl.js → OrderTableRenderer-wjkZwJXI.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-joCFlNB0.js → Organization-DBcdsVEP.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B1HoURq0.js → Overflow-DDyaF9vC.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DiwsKbT7.js → P2P-BB78L4he.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Xe-BsW6S.js → PdhVaultBrowser-DqTiZFum.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C23qi8kl.js → Permissions-INbnWv4j.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BS1syX2f.js → PersonalDataHub-BST-VmTq.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-DRYwwDyh.js → Pipeline-CE7_tS2k.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BQKaDHPH.js → Privacy-hK5L8dOB.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BC6F9xiG.js → ProjectInit-BvkkUoDn.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-ClFPc1Nd.js → ProjectSettings-u7_EUtkm.js} +2 -2
- package/src/assets/web-panel/assets/Projects-5Fmt_8Nw.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CLWuOUNt.js → Providers-B9eanarR.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DiqULTxb.js → QrScannerModal-C0dX5N2f.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-9A03P-E_.js → QuickAsk-CKTpG-PZ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CJZAnbq_.js → Recommend-Px_w_XQM.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C9A1R77h.js → RemoteSession-Di0fnYkM.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BIZc6Rky.js → Reputation-vesnWjXt.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DfIPNtuG.js → Row-exbY6LkT.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C5znFcQ1.js → RssFeed-B3O3x70t.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DSs2z3OX.js → Search-uRA0DhNz.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CV6LcrLY.js → Security-CViqdH6K.js} +4 -4
- package/src/assets/web-panel/assets/{Services-cmhoX0Xj.js → Services-CkXS97WN.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-tCsg2po7.js → Skeleton-DxW5WYnE.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BK1KUDiy.js → Skills-CLxmGFse.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-yRgyeA82.js → Sla-Cr5fziXq.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-c1mo1mlp.js → SpeechSettings-H0JSb3cp.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-koIAfuT3.js → SyncSettings-DMYWMae7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DkkreAaB.js → Tasks-CbYyDdF4.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-fy5Ctf9M.js → Templates-Cpc8JjiK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-Bw70Jf6S.js → Tenant-CRh77Jda.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BKh6Rx-4.js → Terminal-4D8tNBO5.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Dg54WP0c.js → TimelineRenderer-D41jzzbG.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BvvD5SxJ.js → Tokens-C_jWEy6b.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B7Ug9x4e.js → Trigger-Dk1ZUhsy.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BjvuMORY.js → Trust-CLVy4l7m.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CZqhkx8p.js → UkeySign-C-FeqFDj.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-ClR50lhX.js → VideoEditing-CqVZzyMm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DlfppYjx.js → Wallet-DX9BW9pu.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-BirgVr8B.js → WebAuthn-7hQDpWw_.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-B8DP_bax.js → WorkflowEditor-6XqUAO0j.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DA8AUZzL.js → chat-5R_vkaJG.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C38pLGp1.js → colors-huUPZdC-.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-81rtr98o.js → compact-item-CfJlgisE.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D34ixq8t.js → createContext-jO8heofr.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DeIrCfH-.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D4bzqTrZ.js → hasIn-DY8Vxqx7.js} +1 -1
- package/src/assets/web-panel/assets/{index-E1OJRXs4.js → index-A48PtXw9.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3zCCZRS.js → index-B300RPnT.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cd3KuNK5.js → index-B74OXFxC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dmo3dFHb.js → index-BAON7TzU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ddk0e_Pi.js → index-BCqxyvqp.js} +1 -1
- package/src/assets/web-panel/assets/{index-9qoVpPt6.js → index-BHE8OIls.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBFSo1NF.js → index-BQS-uPOK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUQLXLQM.js → index-BRXOP09X.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6GfvEQG.js → index-BYLBPpt8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFyWKOBD.js → index-BfCx4pFT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BP-zkXK8.js → index-BliaT02i.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMgnRwrK.js → index-BmqGerpC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIP62a6r.js → index-BsBtRWbA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkHqMnn3.js → index-BtEXSoPL.js} +1 -1
- package/src/assets/web-panel/assets/index-BxUKMRpP.js +1 -0
- package/src/assets/web-panel/assets/{index-B8mkLM4x.js → index-Bxax9vQ6.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZRJRItm0.js → index-C2iVSFpy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CP5alL4t.js → index-CA6sO5VD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BS3M5H9V.js → index-CA90TZxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvfCEJG-.js → index-CLhBh-qE.js} +1 -1
- package/src/assets/web-panel/assets/{index-tKiC8T-4.js → index-CRElRhyS.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0QArPQt.js → index-Cbe9G0V4.js} +1 -1
- package/src/assets/web-panel/assets/{index-COe_cOLJ.js → index-ChvHubX3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvL_3J_n.js → index-Cis_Ip7H.js} +1 -1
- package/src/assets/web-panel/assets/{index-F76w1NiL.js → index-Cjxbu68P.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlxEphl7.js → index-CzKmteNS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuS-UPoj.js → index-D0pet5Uy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbhE3j5j.js → index-D1VLuww0.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_2VYPr1.js → index-DXBcvUnf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DakfFZ-k.js → index-Db1cLWir.js} +1 -1
- package/src/assets/web-panel/assets/{index-fI5sXMLg.js → index-DoI2sZm7.js} +1 -1
- package/src/assets/web-panel/assets/index-DscU9iPI.js +1 -0
- package/src/assets/web-panel/assets/{index-CoVgZw_b.js → index-KRHroryI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvD7b2IK.js → index-d1xkbtNz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtGxuQrO.js → index-dKx57io7.js} +1 -1
- package/src/assets/web-panel/assets/{index-BqIhLAbA.js → index-j3O2EEJe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXd2_LmH.js → index-p85YaaKw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFHa1HIg.js → index-v3pTaEQm.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0Ih7Hwn.js → index-vXs3B8GJ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-ByyvflIR.js → initDefaultProps-MCB7-raZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B3FQm2By.js → motion-UWDF9swV.js} +1 -1
- package/src/assets/web-panel/assets/{move-BSfns6Ef.js → move-CsTmgXZU.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CTG1Ieri.js → mtc-parser-fQy6KGLg.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DObM_2j6.js → omit-woPnEjd1.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DOfelQ1t.js → pickAttrs-Bs2dZ1gf.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CHZILds_.js → placementArrow-C7EVgPkg.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-REbucKSx.js → responsiveObserve-BH2kYCTN.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C6EZzD7o.js → slide-BFBP2V_e.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BxkWS-g3.js → statusUtils-xdDxDYse.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Chklyoq6.js → styleChecker-aAWgPPQf.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CRVwKrrI.js → useFlexGapSupport-DkGSAWoO.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DV24ik_J.js → useFs-BrOih40N.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-C7vIo4Pg.js → usePersonalDataHub-eIYrgMqO.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-By-v5GlF.js → vnode-B8lutNSE.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B1w9Am3r.js → zoom-CffNre7V.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +254 -23
- package/src/commands/agent.js +105 -11
- package/src/commands/context.js +125 -14
- package/src/commands/hook.js +181 -7
- package/src/commands/plugin.js +239 -1
- package/src/commands/review.js +352 -2
- package/src/data/changelog.json +14 -4
- package/src/gateways/ws/remote-session-protocol.js +39 -0
- package/src/gateways/ws/session-protocol.js +5 -2
- package/src/lib/agent-schedule-store.js +289 -10
- package/src/lib/agents.js +19 -0
- package/src/lib/background-agent-supervisor.js +34 -7
- package/src/lib/channels/channel-manager.js +54 -2
- package/src/lib/cli-context-engineering.js +9 -2
- package/src/lib/context-breakdown.js +116 -0
- package/src/lib/docs-drift.js +166 -0
- package/src/lib/doctor-checkup.js +128 -0
- package/src/lib/hook-event-bus.cjs +0 -0
- package/src/lib/hook-event-log.cjs +193 -0
- package/src/lib/interaction-adapter.js +34 -4
- package/src/lib/json-schema-output.js +75 -12
- package/src/lib/json-schema-validate.js +831 -0
- package/src/lib/lsp/__tests__/diagnostics-scheduler.test.js +93 -0
- package/src/lib/lsp/diagnostics-scheduler.js +127 -0
- package/src/lib/operation-fingerprint.js +95 -0
- package/src/lib/plugin-runtime/capabilities.js +371 -0
- package/src/lib/plugin-runtime/capability-consent.js +175 -0
- package/src/lib/plugin-runtime/manifest.js +30 -0
- package/src/lib/plugin-runtime/policy.js +62 -0
- package/src/lib/plugin-runtime/scopes.js +20 -4
- package/src/lib/project-instructions.js +128 -0
- package/src/lib/remote-approval-bridge.js +16 -0
- package/src/lib/repl-goal.js +132 -0
- package/src/lib/repl-rewind.js +52 -0
- package/src/lib/review-pipeline.js +227 -0
- package/src/lib/runtime-checkup.js +318 -0
- package/src/lib/schedule-planner.js +17 -1
- package/src/lib/session-lifecycle.js +305 -0
- package/src/lib/settings-hook-events.cjs +52 -13
- package/src/lib/settings-loader.cjs +42 -0
- package/src/lib/side-effect-ledger-store.js +88 -0
- package/src/lib/side-effect-ledger.js +296 -0
- package/src/lib/sub-agent-context.js +74 -5
- package/src/lib/subagent-contract.js +383 -0
- package/src/lib/subagent-inheritance.js +112 -0
- package/src/lib/telemetry-ids.js +190 -0
- package/src/lib/turn-binding-store.js +119 -0
- package/src/lib/turn-binding.js +397 -0
- package/src/repl/agent-repl.js +136 -0
- package/src/repl/permission-tier.js +28 -0
- package/src/runtime/agent-core.js +387 -14
- package/src/runtime/coding-agent-contract-shared.cjs +60 -1
- package/src/runtime/headless-runner.js +267 -0
- package/src/runtime/headless-stream.js +60 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C2KLtwHz.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DxywvhTU.js +0 -1
- package/src/assets/web-panel/assets/Projects-Dn-f5aYe.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CHDIEOeN.js +0 -1
- package/src/assets/web-panel/assets/index-CY1NURWZ.js +0 -1
- package/src/assets/web-panel/assets/index-DokUYqpq.js +0 -1
package/src/repl/agent-repl.js
CHANGED
|
@@ -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) {
|