chainlesschain 0.166.46 → 0.166.47
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/README.md +6 -4
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-Cp8KiMmv.js → AIOps-CDpT0WXV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-B4d9BGsm.js → ActionButton-BNfUljWx.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Cf9yXTkv.js → Analytics-C9323DEx.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-40UkmxtP.js → AppLayout-CRrjb2db.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Ckkb4oOA.js → Artifacts-Db-DGqJS.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Dnf569k5.js → Audit-CJdHRJ0W.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CA6bLem4.js → BackgroundAgents-_RSCnTYs.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-ChQU0I_Q.js → Backup-8GFQi-dM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BHeZXnNN.js → BaseInput-C87NtgUZ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DcFVYB2E.js → Chat-DcTMWS8G.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-5ZDPTW_H.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-2PDbejv2.js → Checkbox-DM9EmYee.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DJBn1RAu.js → Codegen-M2YqDRNN.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CPRq7n6y.js → Col-oB1LLxyf.js} +1 -1
- package/src/assets/web-panel/assets/{Community-axvINFMi.js → Community-TcVZK5tF.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-_OX4Qbe0.js → Compact-XKmq-3K_.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DWAkvzRL.js → Compliance-C6CBiDRy.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CUIJ25oj.js → Cowork-Dz9CGqXH.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-nR0m7H3_.js → Cron-CxJDgDVL.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CgTLXzh_.js → Crosschain-DMP0JsaQ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BllzRB6Q.js → DID-I5IQeogb.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C9f0IIBN.js → Dashboard-BfLW2MXj.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BkahetiO.js → Dropdown-BK8EjAlh.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-rartVC-k.js → EmailListRenderer-C3iqSv5I.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BJmBzpW6.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgUdFvw1.js → FamilyGuardDashboard-T19rnqm-.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-oFpIQU6g.js → Federation-CozrbPMy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUH5xlyP.js → FormItemContext-k1dCLNNJ.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-ilRa-ueg.js → GenericCardRenderer-DbaW_Jvt.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DlHHSF8j.js → Git-CQHRyEIt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-yQiiXIWe.js → Governance-BMJYZgMy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BUDRVGOP.js → Inference-B7mpNU7V.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BaGyIoN1.js → KnowledgeGraph-Br0Blg6B.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C1cO6zE0.js → Logs-HIdk0S6M.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-_z_Iaoes.js → MarkdownRenderer-HxeocBHy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CM8cGL0K.js → Marketplace-Bkfq69UP.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CDqAMU0U.js → McpTools-dtmx0bHO.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CfB0-Ofv.js → Memory-CrRlOuEf.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BL18ytvB.js → MobileBridge-D4ZIZiAH.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-PIyyxbuJ.js → MobileProjects-C90Rw7GE.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BTTrFCol.js → Mtc-CC6k_uh4.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-JHZn037c.js → MtcAudit-T_CUIYUy.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-CMf9NEdB.js → Multisig-N_e0RRWk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Dhk3qaus.js → NLProgramming-Iq3VzEv0.js} +1 -1
- package/src/assets/web-panel/assets/Notes-B5sKJUJt.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-gxdaVEit.js → NotificationSettings-K8UVp8qQ.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BWNyM-6m.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CzvHcDNO.js → Organization-DMO1NJxI.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Dclx30Vv.js → Overflow-BBY6b31Z.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CM0Wm9vZ.js → P2P-DmsL0y0v.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-fYmQzmTA.js → PdhVaultBrowser-C65AX_RY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B_oATenG.js → Permissions-CWcpRtWa.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CptiVBh5.js → PersonalDataHub--ZNDIdsn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DkHzgyyI.js → Pipeline-DCdj5NGb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DzZvwcKh.js → Privacy-BRKu7Q3E.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CzkCs-5G.js → ProjectInit-BJ7ozIAb.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BB8dcxRD.js → ProjectSettings-B2cVLiXW.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B7PW9CFY.js → Projects-Ce9r_W-p.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Tfx-ti1V.js → Providers-BDespvGZ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-EvWlNhfX.js → QrScannerModal-BUNO4fDU.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CUspgbNC.js → QuickAsk-D2TUqeBV.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-COY2g77J.js → Recommend-BNNQPHBH.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BzMBU6E6.js → RemoteSession-D2t1V_Cm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-RtYRF4YP.js → Reputation-DVK5hEqI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bva3l9Lc.js → Row-BB9RTwmE.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BhjzLvW3.js → RssFeed-DmEO7liZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-BYzT2PTR.js → Search-UwEYjnDB.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Bcl4-KTv.js → Security-DebqSsMp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BRRa4A0f.js → Services-CuuPts3C.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DYQ016qy.js → Skeleton-DbWpmbgf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CAUKL9JA.js → Skills-BaK7SxzT.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BTyUqfuD.js → Sla-BFHv51Jb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CUjMihrs.js → SpeechSettings-B9b1R6uK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CvfOSupr.js → SyncSettings-BnO0CN02.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-EvjNXrWH.js → Tasks-Dy01Vq49.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-wPAp0EoM.js → Templates-BCy2AMHc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CP0D-q9Q.js → Tenant-4Tx9y_Y1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CQ0f2iFg.js → Terminal-CPOoUH8J.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3JrGSPb.js → TimelineRenderer-C85GlJzu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-yXf2PPp9.js → Tokens-_xneFBGF.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DfmMOoZ2.js → Trigger-BizG4rTr.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BTCyMgf1.js → Trust-Dh8EIn3n.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DKCwIBHi.js → UkeySign-C5NWoHWQ.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CQpDSzLO.js → VideoEditing-0YfrySL6.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CyFrzC3K.js → Wallet-BZVH8Ags.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-D6Nr_1kd.js → WebAuthn-kNofa6vm.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-CgR9tNrB.js → WorkflowEditor-BNO34_j0.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CRG_IeyP.js → chat-ifQ2FlwD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-MdE3TStI.js → colors-1TL8H6EH.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-B0LRuiNV.js → compact-item-DBfRjs_T.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B_V5fjcX.js → createContext-Bs6V4iBf.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BHnbnuYL.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DSL-c_hr.js → hasIn-Bz6LMY_0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DE7bSYmW.js → index--WvT2Il3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBwBZwio.js → index-84mi5rsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsAEd-Do.js → index-B5SJCUZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdHMc9LQ.js → index-B6RClMZl.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3iW-mhn.js → index-BB1Af7Fv.js} +1 -1
- package/src/assets/web-panel/assets/{index-C67dPW0L.js → index-BQL_tldd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpwGsAA-.js → index-BXJXMaZe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZICtYJ0.js → index-BhPDhmvN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbZZ7P_c.js → index-BiZ7Nz5-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Didyuq2Z.js → index-BoCTDcn6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BNhWoD6d.js → index-BxqC3LiO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRRY44XP.js → index-C6c0j-Ki.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3pJBTvo.js → index-C7d6QlfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdplnAS9.js → index-C9QYxq61.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPYshcic.js → index-CBh48_Mh.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkN53KiJ.js → index-CNKHoXWI.js} +1 -1
- package/src/assets/web-panel/assets/{index-OBhlHSMN.js → index-CXVBQ82k.js} +3 -3
- package/src/assets/web-panel/assets/{index-DtOTppk8.js → index-CXtiLagi.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNytQuFq.js → index-Cn7EIWmI.js} +1 -1
- package/src/assets/web-panel/assets/index-CsRz9-ZH.js +1 -0
- package/src/assets/web-panel/assets/{index-BIDCNwy6.js → index-CtB45Hok.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQAsL19t.js → index-Cu_V6ZJH.js} +1 -1
- package/src/assets/web-panel/assets/{index-c8OqO3rq.js → index-Cykt9BbN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq8-2Ibv.js → index-DDhy4eCS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXMeisJK.js → index-DEPPzM8I.js} +1 -1
- package/src/assets/web-panel/assets/{index-BD0w-888.js → index-DMVktlxG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVDi4rS9.js → index-DOww5Qny.js} +1 -1
- package/src/assets/web-panel/assets/{index-Tg3yl8wc.js → index-DWPp-d07.js} +1 -1
- package/src/assets/web-panel/assets/index-DnjMFf3m.js +1 -0
- package/src/assets/web-panel/assets/{index-DVgTf7CZ.js → index-DvM2xBUA.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmQfEHjp.js → index-EK3XtMxA.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dqieYX.js → index-XJIV7HEw.js} +1 -1
- package/src/assets/web-panel/assets/{index-0200QxC4.js → index-cNwsev6n.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-aKWR2v.js → index-f_7L9GvP.js} +1 -1
- package/src/assets/web-panel/assets/{index-KaSejHjf.js → index-lUL3bD2z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CS3bOhV7.js → index-pOUFfRdN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CEOAZm5j.js → index-rGhS02f8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMm8tO2X.js → index-vHtnQsnV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHp1nSur.js → index-vb1XIxEB.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-P8SBN6Di.js → initDefaultProps-DpRIjwTt.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BubbjUT_.js → motion-CG4_9o-Z.js} +1 -1
- package/src/assets/web-panel/assets/{move-Chcykv0I.js → move-Dku1fXtf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DyiYuGDu.js → mtc-parser-BvAVeX-3.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Rdwb_Neb.js → omit-DFu0x78D.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CCr0MYHl.js → pickAttrs-CmI-FNcK.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B1ZXz3bb.js → placementArrow-CGERYewB.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BGEdwej6.js → responsiveObserve-D7G8bF5J.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CpnsUMaT.js → slide-B2sXwWXy.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-C7x-TVp_.js → statusUtils-DI5yh0n3.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CC5k_791.js → styleChecker-deGJ5dp_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpZFKsJW.js → useFlexGapSupport-OqHBXEmi.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CVq5HySy.js → useFs-Dqgx0Qv_.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BGkdLryu.js → usePersonalDataHub-Be-lveh2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-uLtOUEK-.js → vnode-CFxB876W.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BfVC9iUs.js → zoom-BFOYrl4e.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +8 -0
- package/src/commands/background-session.js +31 -3
- package/src/commands/chat.js +5 -1
- package/src/commands/eval.js +86 -28
- package/src/commands/llm.js +104 -1
- package/src/commands/plugin.js +130 -1
- package/src/commands/sandbox.js +121 -2
- package/src/commands/serve.js +11 -2
- package/src/commands/skill.js +29 -0
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/session-protocol.js +13 -0
- package/src/gateways/ws/ws-agent-handler.js +17 -0
- package/src/gateways/ws/ws-server.js +3 -0
- package/src/gateways/ws/ws-session-state.js +131 -0
- package/src/generated/cc-agent-protocol.schema.json +4 -0
- package/src/lazy-dispatch.js +8 -1
- package/src/lib/agent-sandbox.js +337 -53
- package/src/lib/app-server/cli-agent-kernel-adapter.js +28 -0
- package/src/lib/app-server/server.js +93 -0
- package/src/lib/background-agent-keeper-client.js +2 -0
- package/src/lib/background-agent-keeper-protocol.js +7 -0
- package/src/lib/background-agent-supervisor.js +194 -47
- package/src/lib/codex-app-server-adapter.js +81 -27
- package/src/lib/context-memory-kernel/durable-memory-port.js +31 -8
- package/src/lib/context-memory-kernel/provider-context.js +53 -19
- package/src/lib/deferred-question-context.js +122 -0
- package/src/lib/eval/evidence.js +202 -64
- package/src/lib/eval/plugin-suite.js +917 -0
- package/src/lib/eval/runner.js +10 -3
- package/src/lib/evolution/agent-evolution-runtime-composition.js +236 -1
- package/src/lib/evolution/agent-model-projection.js +97 -1
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +154 -1
- package/src/lib/evolution/evolution-artifact-ports.js +6 -0
- package/src/lib/evolution/evolution-deployment-loader.js +87 -3
- package/src/lib/evolution/evolution-eval-gate.js +8 -0
- package/src/lib/evolution/evolution-eval-runtime-composition.js +255 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +58 -2
- package/src/lib/evolution/evolution-ledger-file-backend.js +23 -2
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +223 -7
- package/src/lib/evolution/evolution-ledger-v2-journal.js +525 -0
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +46 -2
- package/src/lib/evolution/evolution-ledger.js +57 -1
- package/src/lib/evolution/evolution-run-ledger-adapter.js +93 -0
- package/src/lib/evolution/evolution-run-wiki-evidence-resolver.js +259 -0
- package/src/lib/evolution/governed-hub-llm.js +238 -5
- package/src/lib/evolution/governed-hub-resolver.js +82 -4
- package/src/lib/evolution/governed-hub-skill.js +11 -5
- package/src/lib/evolution/governed-skill-synthesis-provider-chat.js +10 -1
- package/src/lib/evolution/skill-runtime-revalidation-ledger-adapter.js +254 -0
- package/src/lib/evolution/skill-runtime-revalidation.js +530 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +4 -4
- package/src/lib/evolution/wiki-evidence-commit-guard.js +366 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +13 -1
- package/src/lib/goal-context.js +14 -5
- package/src/lib/interaction-adapter.js +166 -1
- package/src/lib/model-capabilities.js +271 -0
- package/src/lib/model-context-catalog.js +105 -0
- package/src/lib/model-context-window.js +4 -49
- package/src/lib/openai-responses.js +428 -0
- package/src/lib/plugin-runtime/scopes.js +7 -1
- package/src/lib/remote-read-loop-guard.js +2 -2
- package/src/lib/runtime-usage-ledger.js +16 -0
- package/src/lib/skill-loader.js +12 -0
- package/src/lib/with-file-lock.js +3 -1
- package/src/repl/agent-repl.js +5 -1
- package/src/runtime/agent-core.js +348 -23
- package/src/runtime/agent-runtime.js +7 -0
- package/src/runtime/coding-agent-contract-shared.cjs +13 -1
- package/src/runtime/headless-runner.js +4 -1
- package/src/runtime/headless-stream.js +133 -44
- package/src/runtime/runtime-factory.js +26 -2
- package/src/workers/background-agent-keeper.js +23 -13
- package/src/workers/background-agent-worker.js +27 -13
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bi2SY9E_.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-BqpG3XHV.js +0 -1
- package/src/assets/web-panel/assets/Notes-6F8EarNN.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-gVgXQWdc.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BtFLt3qI.js +0 -1
- package/src/assets/web-panel/assets/index-BhuWQHeG.js +0 -1
- package/src/assets/web-panel/assets/index-D-4tFek3.js +0 -1
|
@@ -42,6 +42,10 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
42
42
|
import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
|
|
43
43
|
import { isProxy } from "node:util/types";
|
|
44
44
|
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
45
|
+
import {
|
|
46
|
+
assertSkillRuntimeAdmission,
|
|
47
|
+
captureSkillRuntimeDependencies,
|
|
48
|
+
} from "../lib/evolution/skill-runtime-revalidation.js";
|
|
45
49
|
import { isEvolutionIngressFailure } from "../lib/model-failure-policy.js";
|
|
46
50
|
|
|
47
51
|
const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
|
|
@@ -50,7 +54,17 @@ import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
|
|
|
50
54
|
import sharedPermissionRules from "../lib/permission-rules.cjs";
|
|
51
55
|
import sharedSettingsHooks from "../lib/settings-hooks.cjs";
|
|
52
56
|
import sharedHookEvents from "../lib/settings-hook-events.js";
|
|
53
|
-
import {
|
|
57
|
+
import {
|
|
58
|
+
resolveAgentOutputBudget,
|
|
59
|
+
resolveModelCapabilityProfile,
|
|
60
|
+
} from "../lib/model-capabilities.js";
|
|
61
|
+
import {
|
|
62
|
+
createOpenAIResponsesBody,
|
|
63
|
+
createOpenAIResponsesStreamState,
|
|
64
|
+
finalizeOpenAIResponsesStream,
|
|
65
|
+
normalizeOpenAIResponsesResponse,
|
|
66
|
+
reduceOpenAIResponsesStreamLine,
|
|
67
|
+
} from "../lib/openai-responses.js";
|
|
54
68
|
import { applyCredentialProxy } from "../lib/credential-proxy.js";
|
|
55
69
|
import {
|
|
56
70
|
commitShellApprovalSideEffects,
|
|
@@ -1261,7 +1275,9 @@ export function buildSystemPrompt(cwd, opts = {}) {
|
|
|
1261
1275
|
|
|
1262
1276
|
// Append auto-activated persona skills
|
|
1263
1277
|
try {
|
|
1264
|
-
const loader =
|
|
1278
|
+
const loader =
|
|
1279
|
+
opts.skillLoader ||
|
|
1280
|
+
new CLISkillLoader(captureSkillRuntimeDependencies(opts));
|
|
1265
1281
|
const personaSkills = loader.getAutoActivatedPersonas({
|
|
1266
1282
|
sessionId: opts.sessionId,
|
|
1267
1283
|
turnId: opts.turnId,
|
|
@@ -2604,7 +2620,11 @@ export async function executeTool(name, args, context = {}) {
|
|
|
2604
2620
|
}
|
|
2605
2621
|
}
|
|
2606
2622
|
const hookDb = context.hookDb || null;
|
|
2607
|
-
const skillLoader =
|
|
2623
|
+
const skillLoader =
|
|
2624
|
+
context.skillLoader ||
|
|
2625
|
+
(context.skillRuntimeAdmission || context.skillRuntimeAdmissionRequired
|
|
2626
|
+
? new CLISkillLoader(captureSkillRuntimeDependencies(context))
|
|
2627
|
+
: _defaultSkillLoader);
|
|
2608
2628
|
// Keep the authority-bearing workspace root distinct from the command's
|
|
2609
2629
|
// requested cwd. A command may run in a nested directory, but Plugin policy
|
|
2610
2630
|
// discovery and strong-sandbox issuance must remain anchored to the host
|
|
@@ -3604,6 +3624,8 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3604
3624
|
skillAllowlist: context.skillAllowlist ?? null,
|
|
3605
3625
|
skillOutcomeIndex: context.skillOutcomeIndex,
|
|
3606
3626
|
skillVectorAuthority: context.skillVectorAuthority,
|
|
3627
|
+
skillRuntimeAdmission: context.skillRuntimeAdmission,
|
|
3628
|
+
skillRuntimeAdmissionRequired: context.skillRuntimeAdmissionRequired,
|
|
3607
3629
|
skillRetrievalRevocationReader: context.skillRetrievalRevocationReader,
|
|
3608
3630
|
cwd,
|
|
3609
3631
|
parentMessages: context.parentMessages,
|
|
@@ -5157,6 +5179,8 @@ async function executeToolInner(
|
|
|
5157
5179
|
skillAllowlist = null,
|
|
5158
5180
|
skillOutcomeIndex,
|
|
5159
5181
|
skillVectorAuthority,
|
|
5182
|
+
skillRuntimeAdmission,
|
|
5183
|
+
skillRuntimeAdmissionRequired = false,
|
|
5160
5184
|
skillRetrievalRevocationReader,
|
|
5161
5185
|
cwd,
|
|
5162
5186
|
parentMessages,
|
|
@@ -6652,6 +6676,7 @@ async function executeToolInner(
|
|
|
6652
6676
|
}
|
|
6653
6677
|
const common = {
|
|
6654
6678
|
sandbox: sandboxSummary(shellSandbox),
|
|
6679
|
+
sandboxCapabilities: result.sandboxCapabilities || null,
|
|
6655
6680
|
shellCommandPolicy: shellPolicy,
|
|
6656
6681
|
approval: approvalOutcome,
|
|
6657
6682
|
policyTrace: ["shell-policy", "approval", "sandbox"],
|
|
@@ -6907,6 +6932,7 @@ async function executeToolInner(
|
|
|
6907
6932
|
encoding: "utf8",
|
|
6908
6933
|
timeout: 60000,
|
|
6909
6934
|
maxBuffer: 1024 * 1024,
|
|
6935
|
+
shell: false,
|
|
6910
6936
|
windowsHide: true,
|
|
6911
6937
|
origin: "agent-core:git-command",
|
|
6912
6938
|
policy: "allow",
|
|
@@ -7035,6 +7061,8 @@ async function executeToolInner(
|
|
|
7035
7061
|
sessionId,
|
|
7036
7062
|
llmOptions,
|
|
7037
7063
|
evolutionIngress,
|
|
7064
|
+
skillRuntimeAdmission,
|
|
7065
|
+
skillRuntimeAdmissionRequired,
|
|
7038
7066
|
workflowEffectId,
|
|
7039
7067
|
workflowChildEffectId,
|
|
7040
7068
|
workflowChildSequence,
|
|
@@ -7241,6 +7269,62 @@ async function executeToolInner(
|
|
|
7241
7269
|
}
|
|
7242
7270
|
|
|
7243
7271
|
case "ask_user_question": {
|
|
7272
|
+
const questionMode = args.mode === "deferred" ? "deferred" : "blocking";
|
|
7273
|
+
const questionPurpose = [
|
|
7274
|
+
"decision",
|
|
7275
|
+
"authorization",
|
|
7276
|
+
"preference",
|
|
7277
|
+
"information",
|
|
7278
|
+
].includes(args.purpose)
|
|
7279
|
+
? args.purpose
|
|
7280
|
+
: "decision";
|
|
7281
|
+
if (questionMode === "deferred") {
|
|
7282
|
+
if (!["preference", "information"].includes(questionPurpose)) {
|
|
7283
|
+
return attachDescriptor({
|
|
7284
|
+
error: "deferred_question_requires_non_authoritative_purpose",
|
|
7285
|
+
hint: "Authorization and branch-dependent decisions must use mode=blocking. Deferred answers are informational and cannot grant permission.",
|
|
7286
|
+
});
|
|
7287
|
+
}
|
|
7288
|
+
if (
|
|
7289
|
+
!interaction ||
|
|
7290
|
+
typeof interaction.deferUserQuestion !== "function"
|
|
7291
|
+
) {
|
|
7292
|
+
return attachDescriptor({
|
|
7293
|
+
error: "deferred_questions_not_supported",
|
|
7294
|
+
hint: "This host cannot receive answers out of band. Use mode=blocking or continue autonomously.",
|
|
7295
|
+
});
|
|
7296
|
+
}
|
|
7297
|
+
try {
|
|
7298
|
+
const receipt = await interaction.deferUserQuestion({
|
|
7299
|
+
question: args.question,
|
|
7300
|
+
options: Array.isArray(args.options) ? args.options : null,
|
|
7301
|
+
multiSelect: args.multiSelect === true,
|
|
7302
|
+
timeoutMs:
|
|
7303
|
+
typeof args.timeoutMs === "number" ? args.timeoutMs : 60000,
|
|
7304
|
+
defaultValue: args.defaultValue,
|
|
7305
|
+
onTimeout: args.onTimeout || "error",
|
|
7306
|
+
onReject: args.onReject || "error",
|
|
7307
|
+
purpose: questionPurpose,
|
|
7308
|
+
sessionId,
|
|
7309
|
+
turnId,
|
|
7310
|
+
toolUseId: toolCallId,
|
|
7311
|
+
});
|
|
7312
|
+
return attachDescriptor({
|
|
7313
|
+
questionId: receipt.questionId || receipt.id,
|
|
7314
|
+
status: "pending",
|
|
7315
|
+
mode: "deferred",
|
|
7316
|
+
purpose: questionPurpose,
|
|
7317
|
+
authorization: false,
|
|
7318
|
+
...(receipt.binding ? { binding: receipt.binding } : {}),
|
|
7319
|
+
instructions:
|
|
7320
|
+
"Continue only work independent of this answer. A later answer is information, never authorization; use a blocking question for any dependent decision.",
|
|
7321
|
+
});
|
|
7322
|
+
} catch (err) {
|
|
7323
|
+
return attachDescriptor({
|
|
7324
|
+
error: `ask_user_question deferred registration failed: ${err.message}`,
|
|
7325
|
+
});
|
|
7326
|
+
}
|
|
7327
|
+
}
|
|
7244
7328
|
if (!interaction || typeof interaction.askUser !== "function") {
|
|
7245
7329
|
return attachDescriptor({
|
|
7246
7330
|
error: "user_not_reachable",
|
|
@@ -7984,11 +8068,36 @@ async function executeToolInner(
|
|
|
7984
8068
|
signal,
|
|
7985
8069
|
});
|
|
7986
8070
|
const skillExecutionSignal = skillExecutionLease?.signal || signal;
|
|
8071
|
+
const selectedSkillName = match.id || match.dirName;
|
|
8072
|
+
const runtimeAdmissionContext = {
|
|
8073
|
+
llmOptions,
|
|
8074
|
+
effectiveAllowedToolNames: [
|
|
8075
|
+
"read_file",
|
|
8076
|
+
"search_files",
|
|
8077
|
+
"list_dir",
|
|
8078
|
+
].filter(
|
|
8079
|
+
(tool) =>
|
|
8080
|
+
!Array.isArray(effectiveAllowedToolNames) ||
|
|
8081
|
+
effectiveAllowedToolNames.includes(tool),
|
|
8082
|
+
),
|
|
8083
|
+
};
|
|
8084
|
+
const assertRuntime = () =>
|
|
8085
|
+
assertSkillRuntimeAdmission({
|
|
8086
|
+
skill: match,
|
|
8087
|
+
loader: skillLoader,
|
|
8088
|
+
admission: skillRuntimeAdmission,
|
|
8089
|
+
required: skillRuntimeAdmissionRequired,
|
|
8090
|
+
expectedSkillName: selectedSkillName,
|
|
8091
|
+
context: runtimeAdmissionContext,
|
|
8092
|
+
});
|
|
8093
|
+
let runtimeEligibility;
|
|
7987
8094
|
try {
|
|
7988
8095
|
skillExecutionLease?.assertActive?.();
|
|
8096
|
+
runtimeEligibility = assertRuntime();
|
|
7989
8097
|
if (typeof skillLoader.materializeSkillForExecution === "function") {
|
|
7990
8098
|
match = await raceWithAbort(
|
|
7991
8099
|
skillLoader.materializeSkillForExecution(match, {
|
|
8100
|
+
...runtimeAdmissionContext,
|
|
7992
8101
|
sessionId,
|
|
7993
8102
|
turnId,
|
|
7994
8103
|
loadedBecause: "run_skill",
|
|
@@ -8000,6 +8109,7 @@ async function executeToolInner(
|
|
|
8000
8109
|
);
|
|
8001
8110
|
} else if (typeof skillLoader.materializeSkill === "function") {
|
|
8002
8111
|
match = skillLoader.materializeSkill(match, {
|
|
8112
|
+
...runtimeAdmissionContext,
|
|
8003
8113
|
sessionId,
|
|
8004
8114
|
turnId,
|
|
8005
8115
|
loadedBecause: "run_skill",
|
|
@@ -8008,6 +8118,7 @@ async function executeToolInner(
|
|
|
8008
8118
|
});
|
|
8009
8119
|
}
|
|
8010
8120
|
skillExecutionLease?.assertActive?.();
|
|
8121
|
+
runtimeEligibility = assertRuntime();
|
|
8011
8122
|
throwIfAborted(
|
|
8012
8123
|
skillExecutionSignal,
|
|
8013
8124
|
"run_skill interrupted during materialization",
|
|
@@ -8196,6 +8307,7 @@ async function executeToolInner(
|
|
|
8196
8307
|
let subCtx;
|
|
8197
8308
|
try {
|
|
8198
8309
|
skillExecutionLease?.assertActive?.();
|
|
8310
|
+
runtimeEligibility = assertRuntime();
|
|
8199
8311
|
subCtx = SubAgentContext.create({
|
|
8200
8312
|
role: `skill-${args.skill_name}`,
|
|
8201
8313
|
task:
|
|
@@ -8268,11 +8380,13 @@ async function executeToolInner(
|
|
|
8268
8380
|
}
|
|
8269
8381
|
skillSubRef = subCtx;
|
|
8270
8382
|
try {
|
|
8383
|
+
runtimeEligibility = assertRuntime();
|
|
8271
8384
|
const result = await raceWithAbort(
|
|
8272
8385
|
subCtx.run(args.input),
|
|
8273
8386
|
skillExecutionSignal,
|
|
8274
8387
|
"run_skill interrupted while the isolated child was running",
|
|
8275
8388
|
);
|
|
8389
|
+
runtimeEligibility = assertRuntime();
|
|
8276
8390
|
skillExecutionLease?.assertActive?.();
|
|
8277
8391
|
throwIfAborted(
|
|
8278
8392
|
skillExecutionSignal,
|
|
@@ -8302,6 +8416,7 @@ async function executeToolInner(
|
|
|
8302
8416
|
success: true,
|
|
8303
8417
|
isolated: true,
|
|
8304
8418
|
skill: args.skill_name,
|
|
8419
|
+
runtimeEligibility,
|
|
8305
8420
|
invocationReceipt: settleInvocation("completed", result),
|
|
8306
8421
|
summary: result.summary,
|
|
8307
8422
|
toolsUsed: result.toolsUsed,
|
|
@@ -10212,6 +10327,13 @@ async function _executeSpawnSubAgent(args, ctx) {
|
|
|
10212
10327
|
const parentLlm = ctx.llmOptions || {};
|
|
10213
10328
|
const subLlmOptions = {
|
|
10214
10329
|
...parentLlm,
|
|
10330
|
+
...(ctx.skillRuntimeAdmission
|
|
10331
|
+
? { skillRuntimeAdmission: ctx.skillRuntimeAdmission }
|
|
10332
|
+
: {}),
|
|
10333
|
+
...(ctx.skillRuntimeAdmissionRequired
|
|
10334
|
+
? { skillRuntimeAdmissionRequired: true }
|
|
10335
|
+
: {}),
|
|
10336
|
+
...(ctx.skillLoader ? { skillLoader: ctx.skillLoader } : {}),
|
|
10215
10337
|
...(ctx.evolutionIngress != null
|
|
10216
10338
|
? { evolutionIngress: ctx.evolutionIngress }
|
|
10217
10339
|
: {}),
|
|
@@ -11114,21 +11236,20 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11114
11236
|
};
|
|
11115
11237
|
}
|
|
11116
11238
|
|
|
11117
|
-
// Model-aware max_tokens (Opus → 16384, Haiku → 4096, else 8192)
|
|
11118
|
-
//
|
|
11119
|
-
// default is never forwarded (400s on Opus 4.7/4.8).
|
|
11239
|
+
// Model-aware max_tokens (Opus → 16384, Haiku → 4096, else 8192).
|
|
11240
|
+
// The shared budget resolver reads only provider maxTokens; its unrelated
|
|
11241
|
+
// temperature default is never forwarded (400s on Opus 4.7/4.8).
|
|
11120
11242
|
// Fallback to the CURRENT Sonnet, not a retired snapshot:
|
|
11121
11243
|
// claude-sonnet-4-20250514 was retired 2026-06-15 and would 404 here.
|
|
11122
11244
|
const effModel = model || "claude-sonnet-4-6";
|
|
11123
|
-
const
|
|
11124
|
-
"anthropic",
|
|
11125
|
-
effModel,
|
|
11126
|
-
|
|
11245
|
+
const anthropicOutputBudget = resolveAgentOutputBudget({
|
|
11246
|
+
provider: "anthropic",
|
|
11247
|
+
model: effModel,
|
|
11248
|
+
maxOutputTokens: options.maxOutputTokens,
|
|
11249
|
+
});
|
|
11127
11250
|
const body = {
|
|
11128
11251
|
model: effModel,
|
|
11129
|
-
max_tokens:
|
|
11130
|
-
? Math.min(anthropicMaxTokens || 8192, options.maxOutputTokens)
|
|
11131
|
-
: anthropicMaxTokens || 8192,
|
|
11252
|
+
max_tokens: anthropicOutputBudget.requestMaxOutputTokens,
|
|
11132
11253
|
// Convert cc's internal OpenAI-shaped history (role:"tool" results,
|
|
11133
11254
|
// assistant tool_calls[]) into Anthropic content blocks. Without this,
|
|
11134
11255
|
// multi-turn tool use 400s on turn 2 (Anthropic rejects role:"tool" and
|
|
@@ -11296,6 +11417,85 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11296
11417
|
gemini: "gemini-2.0-flash",
|
|
11297
11418
|
volcengine: "deepseek-v4-flash-ga-260731",
|
|
11298
11419
|
};
|
|
11420
|
+
const effectiveModel = model || defaultModels[provider] || "gpt-4o-mini";
|
|
11421
|
+
const modelProfile = resolveModelCapabilityProfile({
|
|
11422
|
+
provider,
|
|
11423
|
+
model: effectiveModel,
|
|
11424
|
+
baseUrl: url,
|
|
11425
|
+
maxOutputTokens: options.maxOutputTokens,
|
|
11426
|
+
});
|
|
11427
|
+
const useOpenAIResponses =
|
|
11428
|
+
provider === "openai" &&
|
|
11429
|
+
modelProfile.runtimeProtocol === "openai-responses";
|
|
11430
|
+
|
|
11431
|
+
if (useOpenAIResponses) {
|
|
11432
|
+
const responseBody = createOpenAIResponsesBody({
|
|
11433
|
+
model: effectiveModel,
|
|
11434
|
+
messages,
|
|
11435
|
+
tools,
|
|
11436
|
+
maxOutputTokens: options.maxOutputTokens,
|
|
11437
|
+
reasoning: _openAIResponsesReasoningParams(options),
|
|
11438
|
+
stream: typeof options.onToken === "function",
|
|
11439
|
+
});
|
|
11440
|
+
if (typeof options.onToken === "function") {
|
|
11441
|
+
return await _retryStreamingChat(
|
|
11442
|
+
(attempt = 0) =>
|
|
11443
|
+
_chatOpenAIResponsesStreaming(
|
|
11444
|
+
`${url}/responses`,
|
|
11445
|
+
responseBody,
|
|
11446
|
+
key,
|
|
11447
|
+
options.onToken,
|
|
11448
|
+
signal,
|
|
11449
|
+
options.onThinking,
|
|
11450
|
+
options.onStall,
|
|
11451
|
+
options.streamStallMs,
|
|
11452
|
+
options.streamStallTimeoutMs,
|
|
11453
|
+
supportsOpenAIRequestIdentity
|
|
11454
|
+
? _physicalProviderRequestId(providerRequestId, attempt)
|
|
11455
|
+
: null,
|
|
11456
|
+
),
|
|
11457
|
+
{
|
|
11458
|
+
signal,
|
|
11459
|
+
retries: options.workflowEffectId ? 0 : undefined,
|
|
11460
|
+
strictRetryObserver: options.strictUsageTelemetry === true,
|
|
11461
|
+
...(typeof options.onStreamRetry === "function"
|
|
11462
|
+
? {
|
|
11463
|
+
onRetry: (attempt, error, telemetry) =>
|
|
11464
|
+
options.onStreamRetry(attempt, error, {
|
|
11465
|
+
...telemetry,
|
|
11466
|
+
provider,
|
|
11467
|
+
model: effectiveModel,
|
|
11468
|
+
}),
|
|
11469
|
+
}
|
|
11470
|
+
: {}),
|
|
11471
|
+
},
|
|
11472
|
+
);
|
|
11473
|
+
}
|
|
11474
|
+
|
|
11475
|
+
const response = await fetch(`${url}/responses`, {
|
|
11476
|
+
method: "POST",
|
|
11477
|
+
headers: {
|
|
11478
|
+
"Content-Type": "application/json",
|
|
11479
|
+
Authorization: `Bearer ${key}`,
|
|
11480
|
+
...(supportsOpenAIRequestIdentity && providerRequestId
|
|
11481
|
+
? { "X-Client-Request-Id": providerRequestId }
|
|
11482
|
+
: {}),
|
|
11483
|
+
},
|
|
11484
|
+
signal,
|
|
11485
|
+
body: JSON.stringify(responseBody),
|
|
11486
|
+
});
|
|
11487
|
+
if (!response.ok) {
|
|
11488
|
+
throw new Error(await formatProviderResponseError(provider, response));
|
|
11489
|
+
}
|
|
11490
|
+
const data = await response.json();
|
|
11491
|
+
const out = normalizeOpenAIResponsesResponse(data);
|
|
11492
|
+
delete out.responseId;
|
|
11493
|
+
const providerReceipt = supportsOpenAIRequestIdentity
|
|
11494
|
+
? _openAIProviderRequestReceipt(response, data, providerRequestId)
|
|
11495
|
+
: null;
|
|
11496
|
+
if (providerReceipt) out.providerReceipt = providerReceipt;
|
|
11497
|
+
return out;
|
|
11498
|
+
}
|
|
11299
11499
|
|
|
11300
11500
|
// Real token streaming (--include-partial-messages) for every OpenAI-compatible
|
|
11301
11501
|
// provider (openai / deepseek / dashscope / mistral / gemini / volcengine):
|
|
@@ -11307,7 +11507,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11307
11507
|
_chatOpenAIStreaming(
|
|
11308
11508
|
`${url}/chat/completions`,
|
|
11309
11509
|
{
|
|
11310
|
-
model:
|
|
11510
|
+
model: effectiveModel,
|
|
11311
11511
|
messages,
|
|
11312
11512
|
tools,
|
|
11313
11513
|
stream: true,
|
|
@@ -11337,7 +11537,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11337
11537
|
options.onStreamRetry(attempt, error, {
|
|
11338
11538
|
...telemetry,
|
|
11339
11539
|
provider,
|
|
11340
|
-
model:
|
|
11540
|
+
model: effectiveModel,
|
|
11341
11541
|
}),
|
|
11342
11542
|
}
|
|
11343
11543
|
: {}),
|
|
@@ -11356,7 +11556,7 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
11356
11556
|
},
|
|
11357
11557
|
signal,
|
|
11358
11558
|
body: JSON.stringify({
|
|
11359
|
-
model:
|
|
11559
|
+
model: effectiveModel,
|
|
11360
11560
|
messages,
|
|
11361
11561
|
tools,
|
|
11362
11562
|
...(options.maxOutputTokens
|
|
@@ -12271,6 +12471,83 @@ async function _chatOpenAIStreaming(
|
|
|
12271
12471
|
return out;
|
|
12272
12472
|
}
|
|
12273
12473
|
|
|
12474
|
+
async function _chatOpenAIResponsesStreaming(
|
|
12475
|
+
apiUrl,
|
|
12476
|
+
body,
|
|
12477
|
+
apiKey,
|
|
12478
|
+
onToken,
|
|
12479
|
+
signal,
|
|
12480
|
+
onThinking,
|
|
12481
|
+
onStall,
|
|
12482
|
+
stallMs,
|
|
12483
|
+
stallTimeoutMs,
|
|
12484
|
+
providerRequestId = null,
|
|
12485
|
+
) {
|
|
12486
|
+
const response = await fetch(apiUrl, {
|
|
12487
|
+
method: "POST",
|
|
12488
|
+
headers: {
|
|
12489
|
+
"Content-Type": "application/json",
|
|
12490
|
+
Authorization: `Bearer ${apiKey}`,
|
|
12491
|
+
...(providerRequestId
|
|
12492
|
+
? { "X-Client-Request-Id": providerRequestId }
|
|
12493
|
+
: {}),
|
|
12494
|
+
},
|
|
12495
|
+
signal,
|
|
12496
|
+
body: JSON.stringify(body),
|
|
12497
|
+
});
|
|
12498
|
+
if (!response.ok) {
|
|
12499
|
+
throw new Error(await formatProviderResponseError("openai", response));
|
|
12500
|
+
}
|
|
12501
|
+
const state = createOpenAIResponsesStreamState();
|
|
12502
|
+
const ui = _streamUiCallbacks(onToken, onThinking);
|
|
12503
|
+
const reader = response.body.getReader();
|
|
12504
|
+
const decoder = new TextDecoder();
|
|
12505
|
+
let buf = "";
|
|
12506
|
+
try {
|
|
12507
|
+
for await (const value of _iterateStreamWithStall(reader, {
|
|
12508
|
+
onStall,
|
|
12509
|
+
stallMs,
|
|
12510
|
+
stallTimeoutMs,
|
|
12511
|
+
})) {
|
|
12512
|
+
buf += decoder.decode(value, { stream: true });
|
|
12513
|
+
const lines = buf.split("\n");
|
|
12514
|
+
buf = lines.pop() || "";
|
|
12515
|
+
for (const line of lines) {
|
|
12516
|
+
reduceOpenAIResponsesStreamLine(state, line, ui.onToken, ui.onThinking);
|
|
12517
|
+
await ui.settle();
|
|
12518
|
+
}
|
|
12519
|
+
}
|
|
12520
|
+
if (buf.trim()) {
|
|
12521
|
+
reduceOpenAIResponsesStreamLine(state, buf, ui.onToken, ui.onThinking);
|
|
12522
|
+
await ui.settle();
|
|
12523
|
+
}
|
|
12524
|
+
} catch (error) {
|
|
12525
|
+
if (_streamErrorDisposition(error, signal, state.text) === "rethrow") {
|
|
12526
|
+
throw error;
|
|
12527
|
+
}
|
|
12528
|
+
const out = _finalizeTruncatedStream(finalizeOpenAIResponsesStream, state);
|
|
12529
|
+
const responseId = out.responseId || state.responseId;
|
|
12530
|
+
delete out.responseId;
|
|
12531
|
+
const providerReceipt = _openAIProviderRequestReceipt(
|
|
12532
|
+
response,
|
|
12533
|
+
{ id: responseId },
|
|
12534
|
+
providerRequestId,
|
|
12535
|
+
);
|
|
12536
|
+
if (providerReceipt) out.providerReceipt = providerReceipt;
|
|
12537
|
+
return out;
|
|
12538
|
+
}
|
|
12539
|
+
const out = finalizeOpenAIResponsesStream(state);
|
|
12540
|
+
const responseId = out.responseId || state.responseId;
|
|
12541
|
+
delete out.responseId;
|
|
12542
|
+
const providerReceipt = _openAIProviderRequestReceipt(
|
|
12543
|
+
response,
|
|
12544
|
+
{ id: responseId },
|
|
12545
|
+
providerRequestId,
|
|
12546
|
+
);
|
|
12547
|
+
if (providerReceipt) out.providerReceipt = providerReceipt;
|
|
12548
|
+
return out;
|
|
12549
|
+
}
|
|
12550
|
+
|
|
12274
12551
|
/**
|
|
12275
12552
|
* Convert cc's internal OpenAI-shaped messages into Anthropic content-block
|
|
12276
12553
|
* messages. Internal shape: {role:"user"|"assistant"|"tool", content,
|
|
@@ -12371,6 +12648,31 @@ function _intensityToEffort(want) {
|
|
|
12371
12648
|
}
|
|
12372
12649
|
}
|
|
12373
12650
|
|
|
12651
|
+
/** Build an opt-in Responses reasoning request without changing default cost. */
|
|
12652
|
+
export function _openAIResponsesReasoningParams(options = {}) {
|
|
12653
|
+
const want = options?.thinking;
|
|
12654
|
+
if (!want || want === "off" || want === "none") return null;
|
|
12655
|
+
const allowed = new Set([
|
|
12656
|
+
"none",
|
|
12657
|
+
"minimal",
|
|
12658
|
+
"low",
|
|
12659
|
+
"medium",
|
|
12660
|
+
"high",
|
|
12661
|
+
"xhigh",
|
|
12662
|
+
]);
|
|
12663
|
+
const requested =
|
|
12664
|
+
typeof options.thinkingEffort === "string"
|
|
12665
|
+
? options.thinkingEffort.toLowerCase()
|
|
12666
|
+
: null;
|
|
12667
|
+
return {
|
|
12668
|
+
effort:
|
|
12669
|
+
requested && allowed.has(requested)
|
|
12670
|
+
? requested
|
|
12671
|
+
: _intensityToEffort(want),
|
|
12672
|
+
summary: "auto",
|
|
12673
|
+
};
|
|
12674
|
+
}
|
|
12675
|
+
|
|
12374
12676
|
/**
|
|
12375
12677
|
* Decide the Anthropic `thinking` request params for a model. Returns null
|
|
12376
12678
|
* (off) unless the caller opts in via options.thinking (true | "think" |
|
|
@@ -13608,9 +13910,15 @@ export async function* agentLoop(messages, options) {
|
|
|
13608
13910
|
const toolContext = {
|
|
13609
13911
|
readFileCache: new Map(),
|
|
13610
13912
|
hookDb: hermeticExecution ? null : options.hookDb || null,
|
|
13611
|
-
skillLoader:
|
|
13913
|
+
skillLoader:
|
|
13914
|
+
options.skillLoader ||
|
|
13915
|
+
(options.skillRuntimeAdmission || options.skillRuntimeAdmissionRequired
|
|
13916
|
+
? new CLISkillLoader(captureSkillRuntimeDependencies(options))
|
|
13917
|
+
: _defaultSkillLoader),
|
|
13612
13918
|
skillOutcomeIndex: options.skillOutcomeIndex,
|
|
13613
13919
|
skillVectorAuthority: options.skillVectorAuthority,
|
|
13920
|
+
skillRuntimeAdmission: options.skillRuntimeAdmission,
|
|
13921
|
+
skillRuntimeAdmissionRequired: options.skillRuntimeAdmissionRequired,
|
|
13614
13922
|
skillRetrievalRevocationReader: options.skillRetrievalRevocationReader,
|
|
13615
13923
|
// Hook-envelope tracing (P2 unified event bus): every settings-hook payload
|
|
13616
13924
|
// fired during this run carries trace_id = this run's id; a spawned child
|
|
@@ -14750,6 +15058,15 @@ export async function* agentLoop(messages, options) {
|
|
|
14750
15058
|
];
|
|
14751
15059
|
contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
|
|
14752
15060
|
}
|
|
15061
|
+
if (hook && typeof hook.userContext === "string" && hook.userContext) {
|
|
15062
|
+
// User-originated asynchronous context must remain user authority.
|
|
15063
|
+
// In particular, deferred question answers cannot become a trusted
|
|
15064
|
+
// system instruction merely because they arrive between iterations.
|
|
15065
|
+
callMessages = [
|
|
15066
|
+
...callMessages,
|
|
15067
|
+
{ role: "user", content: hook.userContext },
|
|
15068
|
+
];
|
|
15069
|
+
}
|
|
14753
15070
|
} catch (_e) {
|
|
14754
15071
|
// prepareCall failures are non-critical — proceed with original messages
|
|
14755
15072
|
}
|
|
@@ -15100,7 +15417,9 @@ export async function* agentLoop(messages, options) {
|
|
|
15100
15417
|
.map((b) => b.thinking || "")
|
|
15101
15418
|
.join("")
|
|
15102
15419
|
.trim()
|
|
15103
|
-
: ""
|
|
15420
|
+
: typeof msg._openaiReasoningSummary === "string"
|
|
15421
|
+
? msg._openaiReasoningSummary.trim()
|
|
15422
|
+
: "";
|
|
15104
15423
|
// Claude Code 2.1.183 parity: a turn that produced ONLY extended-thinking
|
|
15105
15424
|
// (no visible text, no tool calls) would otherwise complete silently with
|
|
15106
15425
|
// an empty answer — the user sees nothing. Re-prompt the model ONCE to
|
|
@@ -15197,11 +15516,17 @@ export async function* agentLoop(messages, options) {
|
|
|
15197
15516
|
// before it chose these tool calls. Streaming consumers already get it live
|
|
15198
15517
|
// via onThinking, so only surface it as an event for non-streaming consumers
|
|
15199
15518
|
// (the REPL) — keeps it out of the --include-partial-messages stream.
|
|
15200
|
-
if (
|
|
15201
|
-
|
|
15202
|
-
|
|
15203
|
-
.
|
|
15204
|
-
|
|
15519
|
+
if (
|
|
15520
|
+
!options.onThinking &&
|
|
15521
|
+
(Array.isArray(msg._thinkingBlocks) ||
|
|
15522
|
+
typeof msg._openaiReasoningSummary === "string")
|
|
15523
|
+
) {
|
|
15524
|
+
const _stepThinking = Array.isArray(msg._thinkingBlocks)
|
|
15525
|
+
? msg._thinkingBlocks
|
|
15526
|
+
.map((b) => b.thinking || "")
|
|
15527
|
+
.join("")
|
|
15528
|
+
.trim()
|
|
15529
|
+
: msg._openaiReasoningSummary.trim();
|
|
15205
15530
|
if (_stepThinking) yield { type: "thinking", text: _stepThinking };
|
|
15206
15531
|
}
|
|
15207
15532
|
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
} from "../lib/evolution/agent-evolution-session-lifecycle.js";
|
|
42
42
|
import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
43
43
|
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
44
|
+
import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
|
|
44
45
|
import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
|
|
45
46
|
|
|
46
47
|
const {
|
|
@@ -77,6 +78,10 @@ export class AgentRuntime {
|
|
|
77
78
|
deps.evolutionIngress == null
|
|
78
79
|
? null
|
|
79
80
|
: captureAgentEvolutionIngress(deps.evolutionIngress);
|
|
81
|
+
this.runtimeAdmissionDependencies = captureSkillRuntimeDependencies(
|
|
82
|
+
deps,
|
|
83
|
+
this.evolutionIngress?.tenantId,
|
|
84
|
+
);
|
|
80
85
|
this.skillOutcomeIndex =
|
|
81
86
|
deps.skillOutcomeIndex == null
|
|
82
87
|
? null
|
|
@@ -343,6 +348,7 @@ export class AgentRuntime {
|
|
|
343
348
|
});
|
|
344
349
|
const result = await this.deps.startAgentRepl({
|
|
345
350
|
...this.policy,
|
|
351
|
+
...this.runtimeAdmissionDependencies,
|
|
346
352
|
...(this.memoryPolicyReceiptWriter === null
|
|
347
353
|
? {}
|
|
348
354
|
: { memoryPolicyReceiptWriter: this.memoryPolicyReceiptWriter }),
|
|
@@ -551,6 +557,7 @@ export class AgentRuntime {
|
|
|
551
557
|
}
|
|
552
558
|
|
|
553
559
|
const server = this.deps.createServer({
|
|
560
|
+
...this.runtimeAdmissionDependencies,
|
|
554
561
|
port,
|
|
555
562
|
host,
|
|
556
563
|
token,
|
|
@@ -966,7 +966,7 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
966
966
|
kind: "interaction",
|
|
967
967
|
tier: "extension",
|
|
968
968
|
description:
|
|
969
|
-
"
|
|
969
|
+
"Ask the user a structured question. blocking (default) waits for a decision; deferred returns a pending receipt so independent work can continue and is restricted to non-authoritative preference/information collection. Deferred answers never grant permission or approve a branch.",
|
|
970
970
|
inputSchema: {
|
|
971
971
|
type: "object",
|
|
972
972
|
properties: {
|
|
@@ -984,6 +984,18 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
|
|
|
984
984
|
type: "boolean",
|
|
985
985
|
description: "Allow multiple selections (default: false)",
|
|
986
986
|
},
|
|
987
|
+
mode: {
|
|
988
|
+
type: "string",
|
|
989
|
+
enum: ["blocking", "deferred"],
|
|
990
|
+
description:
|
|
991
|
+
"blocking waits for the answer (default). deferred immediately returns a pending receipt and may only be used for independent preference/information collection",
|
|
992
|
+
},
|
|
993
|
+
purpose: {
|
|
994
|
+
type: "string",
|
|
995
|
+
enum: ["decision", "authorization", "preference", "information"],
|
|
996
|
+
description:
|
|
997
|
+
"Why the answer is needed. decision/authorization questions are always blocking; deferred requires preference or information",
|
|
998
|
+
},
|
|
987
999
|
timeoutMs: {
|
|
988
1000
|
type: "number",
|
|
989
1001
|
description: "Max wait for user reply in ms (default: 60000)",
|
|
@@ -123,6 +123,7 @@ import { withQuietStdout } from "./quiet-stdout.js";
|
|
|
123
123
|
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
124
124
|
import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
125
125
|
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
126
|
+
import { captureSkillRuntimeDependencies } from "../lib/evolution/skill-runtime-revalidation.js";
|
|
126
127
|
import { captureSkillRetrievalRevocationReader } from "../lib/evolution/skill-retrieval-revocation-authority.js";
|
|
127
128
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
128
129
|
import { estimateTokens } from "../harness/prompt-compressor.js";
|
|
@@ -1777,7 +1778,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
1777
1778
|
let _skillCacheLedger = null;
|
|
1778
1779
|
const _runtimeSkillLoader = hermeticExecution
|
|
1779
1780
|
? HERMETIC_SKILL_LOADER
|
|
1780
|
-
: options.skillLoader ||
|
|
1781
|
+
: options.skillLoader ||
|
|
1782
|
+
new CLISkillLoader(captureSkillRuntimeDependencies(options));
|
|
1781
1783
|
const systemContent = hermeticExecution
|
|
1782
1784
|
? composeSystemPrompt(
|
|
1783
1785
|
"You are a hermetic code fixer. The exposed file tools are the complete tool surface. Inspect and mutate only the exact paths authorized in the user request, then return a concise completion message.",
|
|
@@ -2511,6 +2513,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2511
2513
|
apiKey,
|
|
2512
2514
|
cwd,
|
|
2513
2515
|
skillLoader: _runtimeSkillLoader,
|
|
2516
|
+
...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
|
|
2514
2517
|
...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
|
|
2515
2518
|
...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
|
|
2516
2519
|
...(skillRetrievalRevocationReader === null
|