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
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
LEGACY_TO_UNIFIED_TYPE,
|
|
15
15
|
} from "../runtime/runtime-events.js";
|
|
16
16
|
import { createAbortError } from "./abort-utils.js";
|
|
17
|
+
import { verifyApprovalBinding } from "./agent-authority.js";
|
|
17
18
|
import { createEnvelope } from "@chainlesschain/session-core";
|
|
18
19
|
|
|
19
20
|
// Phase 5: parallel service-envelope emission. Map WS agent-handler event
|
|
@@ -167,12 +168,21 @@ export class WebSocketInteractionAdapter extends InteractionAdapter {
|
|
|
167
168
|
reject,
|
|
168
169
|
timeoutId,
|
|
169
170
|
kind: options.kind || null,
|
|
171
|
+
// Approval binding (authority §"权限来源"): when a permission gate raises
|
|
172
|
+
// this request WITH a binding (tool_call_id + args + policy digest), an
|
|
173
|
+
// *approve* answer must echo the SAME binding or it is a stale / mis-
|
|
174
|
+
// routed / argument-tampered verdict and is rejected in _resolvePending.
|
|
175
|
+
// null (the default for plain questions) → no binding check, unchanged.
|
|
176
|
+
binding: options.binding || null,
|
|
170
177
|
});
|
|
171
178
|
|
|
172
179
|
this._sendWs({
|
|
173
180
|
...message,
|
|
174
181
|
sessionId: this.sessionId,
|
|
175
182
|
requestId,
|
|
183
|
+
// Ride the binding out so the remote UI/bridge can echo it back on the
|
|
184
|
+
// answer (only present when the caller supplied one).
|
|
185
|
+
...(options.binding ? { binding: options.binding } : {}),
|
|
176
186
|
});
|
|
177
187
|
});
|
|
178
188
|
}
|
|
@@ -210,8 +220,8 @@ export class WebSocketInteractionAdapter extends InteractionAdapter {
|
|
|
210
220
|
* Called by ws-server when a session-answer message arrives.
|
|
211
221
|
* Resolves the corresponding pending promise.
|
|
212
222
|
*/
|
|
213
|
-
resolveAnswer(requestId, answer) {
|
|
214
|
-
this._resolvePending(requestId, answer, "question");
|
|
223
|
+
resolveAnswer(requestId, answer, binding = null) {
|
|
224
|
+
this._resolvePending(requestId, answer, "question", binding);
|
|
215
225
|
}
|
|
216
226
|
|
|
217
227
|
async requestHostTool(toolName, args = {}, extra = {}) {
|
|
@@ -321,7 +331,12 @@ export class WebSocketInteractionAdapter extends InteractionAdapter {
|
|
|
321
331
|
}
|
|
322
332
|
}
|
|
323
333
|
|
|
324
|
-
_resolvePending(
|
|
334
|
+
_resolvePending(
|
|
335
|
+
requestId,
|
|
336
|
+
payload,
|
|
337
|
+
expectedKind = null,
|
|
338
|
+
incomingBinding = null,
|
|
339
|
+
) {
|
|
325
340
|
const pending = this._pending.get(requestId);
|
|
326
341
|
if (!pending) {
|
|
327
342
|
return;
|
|
@@ -337,11 +352,26 @@ export class WebSocketInteractionAdapter extends InteractionAdapter {
|
|
|
337
352
|
return;
|
|
338
353
|
}
|
|
339
354
|
|
|
355
|
+
// Approval-binding guard (authority §"权限来源"): if this request was raised
|
|
356
|
+
// with a binding AND the answer echoes a binding that does NOT match, the
|
|
357
|
+
// verdict is for a different / argument-tampered call — settle as a DENY
|
|
358
|
+
// (fail closed) instead of the approve it claims to be, mirroring the local
|
|
359
|
+
// headless approval gate. Backward-compatible: no request binding, or an
|
|
360
|
+
// answer with no echoed binding, resolves exactly as before.
|
|
361
|
+
let effective = payload;
|
|
362
|
+
if (
|
|
363
|
+
pending.binding &&
|
|
364
|
+
incomingBinding &&
|
|
365
|
+
!verifyApprovalBinding(pending.binding, incomingBinding)
|
|
366
|
+
) {
|
|
367
|
+
effective = false;
|
|
368
|
+
}
|
|
369
|
+
|
|
340
370
|
this._pending.delete(requestId);
|
|
341
371
|
if (pending.timeoutId) {
|
|
342
372
|
clearTimeout(pending.timeoutId);
|
|
343
373
|
}
|
|
344
|
-
pending.resolve(
|
|
374
|
+
pending.resolve(effective);
|
|
345
375
|
}
|
|
346
376
|
}
|
|
347
377
|
|
|
@@ -7,16 +7,36 @@
|
|
|
7
7
|
* `deps.writeOut` capture seam — the runner itself is untouched: each attempt
|
|
8
8
|
* runs with output captured, the validated JSON is the only thing printed.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Constrained validation delegates to the richer Draft-2020-12-subset validator
|
|
11
|
+
* in [[json-schema-validate.js]] (type, properties, required, items/prefixItems,
|
|
12
|
+
* enum/const, additionalProperties, min/max, pattern, format, allOf/anyOf/oneOf/
|
|
13
|
+
* not, if/then/else, local $ref) so retries get precise coded/pointered errors —
|
|
14
|
+
* the model is told exactly WHICH JSON Pointer failed and WHY. The legacy
|
|
15
|
+
* `validateAgainstSchema` (loose `$.a.b` strings) stays exported for callers.
|
|
13
16
|
*/
|
|
14
17
|
|
|
15
18
|
import fsDefault from "fs";
|
|
19
|
+
import {
|
|
20
|
+
validate,
|
|
21
|
+
validateSchema,
|
|
22
|
+
buildStructuredResultEvent,
|
|
23
|
+
computeSchemaDigest,
|
|
24
|
+
} from "./json-schema-validate.js";
|
|
16
25
|
|
|
17
26
|
export const MAX_ATTEMPTS = 3;
|
|
18
27
|
export const _deps = { fs: fsDefault };
|
|
19
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Build the terminal `structured_result` stream event for a value against a
|
|
31
|
+
* schema (P2). Delegates to the richer Draft-2020-12-subset validator so the
|
|
32
|
+
* event carries a schema digest + coded/pointered errors — never free text.
|
|
33
|
+
*/
|
|
34
|
+
export function buildStructuredResult(schema, value) {
|
|
35
|
+
return buildStructuredResultEvent({ schema, value });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { computeSchemaDigest };
|
|
39
|
+
|
|
20
40
|
/** Validate `value` against the schema subset. Returns error strings ([] = valid). */
|
|
21
41
|
export function validateAgainstSchema(value, schema, path = "$") {
|
|
22
42
|
const errors = [];
|
|
@@ -80,6 +100,20 @@ export function validateAgainstSchema(value, schema, path = "$") {
|
|
|
80
100
|
return errors;
|
|
81
101
|
}
|
|
82
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Render the richer validator's coded/pointered error objects as human-readable
|
|
105
|
+
* `<JSON Pointer>: <message>` strings for the corrective retry prompt and the
|
|
106
|
+
* final failure report. The empty root pointer is shown as `(root)`.
|
|
107
|
+
*
|
|
108
|
+
* @param {Array<{instancePath?:string, message:string}>} errors
|
|
109
|
+
* @returns {string[]}
|
|
110
|
+
*/
|
|
111
|
+
export function formatSchemaErrors(errors) {
|
|
112
|
+
return (errors || []).map(
|
|
113
|
+
(e) => `${e.instancePath || "(root)"}: ${e.message}`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
83
117
|
/**
|
|
84
118
|
* Return the first *balanced* JSON object/array substring in `text`, honoring
|
|
85
119
|
* string literals so braces inside strings don't throw off the depth count.
|
|
@@ -187,19 +221,45 @@ export function loadSchemaFile(fs, schemaFile) {
|
|
|
187
221
|
"No schema provided: pass --json-schema <file> or a schema object",
|
|
188
222
|
);
|
|
189
223
|
}
|
|
224
|
+
// Inline JSON support: a value that starts with `{` is treated as a literal
|
|
225
|
+
// schema object, never a path (a filesystem path can't start with `{`). This
|
|
226
|
+
// lets `--json-schema '{"type":"object",...}'` work without a temp file.
|
|
227
|
+
const trimmed = String(schemaFile).trim();
|
|
228
|
+
const isInline = trimmed.startsWith("{");
|
|
190
229
|
let raw;
|
|
191
|
-
|
|
192
|
-
raw =
|
|
193
|
-
}
|
|
194
|
-
|
|
230
|
+
if (isInline) {
|
|
231
|
+
raw = trimmed;
|
|
232
|
+
} else {
|
|
233
|
+
try {
|
|
234
|
+
raw = fs.readFileSync(schemaFile, "utf-8");
|
|
235
|
+
} catch (e) {
|
|
236
|
+
throw new Error(`Cannot read schema file "${schemaFile}": ${e.message}`);
|
|
237
|
+
}
|
|
195
238
|
}
|
|
239
|
+
let parsed;
|
|
196
240
|
try {
|
|
197
|
-
|
|
241
|
+
parsed = JSON.parse(raw);
|
|
198
242
|
} catch (e) {
|
|
199
243
|
throw new Error(
|
|
200
|
-
|
|
244
|
+
isInline
|
|
245
|
+
? `Invalid inline JSON schema: ${e.message}`
|
|
246
|
+
: `Invalid JSON in schema file "${schemaFile}": ${e.message}`,
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
// Startup schema meta-validation (P2): reject a malformed schema up front
|
|
250
|
+
// (bad type value, non-array required, invalid regex, …) instead of silently
|
|
251
|
+
// mis-validating every reply against a broken contract.
|
|
252
|
+
const meta = validateSchema(parsed);
|
|
253
|
+
if (!meta.valid) {
|
|
254
|
+
const detail = meta.errors
|
|
255
|
+
.slice(0, 5)
|
|
256
|
+
.map((e) => ` - ${e.schemaPath || "/"}: ${e.message}`)
|
|
257
|
+
.join("\n");
|
|
258
|
+
throw new Error(
|
|
259
|
+
`Invalid JSON Schema in ${isInline ? "inline schema" : `"${schemaFile}"`}:\n${detail}`,
|
|
201
260
|
);
|
|
202
261
|
}
|
|
262
|
+
return parsed;
|
|
203
263
|
}
|
|
204
264
|
|
|
205
265
|
/**
|
|
@@ -246,12 +306,15 @@ export async function runJsonSchemaConstrained(cfg = {}) {
|
|
|
246
306
|
lastRaw = raw;
|
|
247
307
|
const parsed = extractJsonPayload(raw);
|
|
248
308
|
if (parsed.ok) {
|
|
249
|
-
|
|
250
|
-
if
|
|
309
|
+
// Richer validator: enforces the full supported subset (format assertions,
|
|
310
|
+
// if/then/else, min/max, pattern, combinators, …) and yields coded/pointered
|
|
311
|
+
// errors so the retry prompt tells the model exactly which pointer failed.
|
|
312
|
+
const { valid, errors } = validate(parsed.value, schema);
|
|
313
|
+
if (valid) {
|
|
251
314
|
writeOut(`${JSON.stringify(parsed.value, null, 2)}\n`);
|
|
252
315
|
return 0;
|
|
253
316
|
}
|
|
254
|
-
lastErrors = errors;
|
|
317
|
+
lastErrors = formatSchemaErrors(errors);
|
|
255
318
|
} else {
|
|
256
319
|
lastErrors = [parsed.error];
|
|
257
320
|
}
|