chainlesschain 0.166.86 → 0.166.87
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/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DZwiXAIh.js → AIOps-DdQjhXg9.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-aNzXoIJP.js → ActionButton-CuwA3hPA.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-ETQk4ZXt.js → Analytics-DTVXJSAC.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D5oEbeEC.js → AppLayout-j06JBfEQ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-ja48FAne.js → Artifacts-BFAK8LEW.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DlN0YnDt.js → Audit-BiGxRpOf.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CzvyNsRg.js → BackgroundAgents-B6uHaPkZ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DXgEC2MQ.js → Backup-BNAesB8q.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D9XqejLx.js → BaseInput-BOuetfCd.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BTwuYUlN.js → Chat-cVzo3m_D.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-0anIC2Wn.js → ChatBubbleRenderer-DZ2Ys-CI.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CLuaQbDt.js → Checkbox-BaCTS-H8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-KwQUZs8A.js → Codegen-CBE8NiYh.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BCmROkzc.js → Col-C9wLiUTN.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CXlUEHR4.js → Community-jdClBSIp.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-Dzx-lWI2.js → Compact-BIjauIlM.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CfXW82FF.js → Compliance-CZ-AoaNj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DIISTRm2.js → Cowork-BbTKtDS4.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-nyJ-KcFE.js → Cron-ImKdtwNi.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dtv1E4cV.js → Crosschain-B54GSHf5.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BCTpektS.js → DID-BQt5WUzs.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C1Q_m0So.js → Dashboard--gNOffif.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BrQ5_PPL.js → Dropdown-342A5YJw.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DjoNlONP.js → EmailListRenderer-CtIZ3ZHd.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DaGaE6bX.js → EvolutionSettings-CyZPoTio.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-nJDWBECt.js → FamilyGuardDashboard-B1MCkFEu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DhMUY_wG.js → Federation-DZWoERUy.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CbONJPuc.js → FormItemContext-Onmb0mp3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CDdX4dX-.js → GenericCardRenderer-u1qhNNc7.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DXbDVJdR.js → Git-BEowR1C5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DbAfAvs1.js → Governance-BiYd3AAg.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dy-fGea2.js → Inference-CsC4Vjh5.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DAxRpGUF.js → KnowledgeGraph-BXA7ikPM.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-5L1UCR8X.js → Logs-C9WoplQm.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-u0FPafvT.js → MarkdownRenderer-DecEsXsy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DUk_McDG.js → Marketplace-CCoJBfRL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-B6PNsZ_p.js → McpTools-CzaOWBoA.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BUUs8j5F.js → Memory-BPwh7u1-.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-pXRsgyuO.js → MobileBridge-Bk47v6z2.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D7v-2Hwm.js → MobileProjects-D-CY--Sb.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Deaj4faB.js → Mtc-ExVyAGlW.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-wUV0VUH1.js → MtcAudit-Rrw10csE.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-C67IIkts.js → Multisig-8TxxwxZZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BCA_CWrW.js → NLProgramming-CNckjtnY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D9eu14hQ.js → Notes-C4j6cZTu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Cnd-J4LM.js → NotificationSettings-CchU8rWd.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C4pHUuyZ.js → OrderTableRenderer-ZJBoyJ16.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-4YExAbnp.js → Organization-F0Je7EdZ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BF-wFuZz.js → Overflow-B2k-JA3u.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CdiajqCT.js → P2P-yui9Xxe6.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BkjfS6Th.js → PdhVaultBrowser-CegM7hT6.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DrZ4D78_.js → Permissions-CSFL0uvh.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-lDc6OXjz.js → PersonalDataHub-BrMcd-vr.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-DqDS9ON1.js → Pipeline-fzrliaVP.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BMekZRZu.js → Privacy-BrkUjJ_g.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-LYS7NFvJ.js → ProjectInit-CF_QCsW9.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CcJNHk9A.js → ProjectSettings-Duwrd8aC.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DrfAHgdF.js → Projects-B0dLVXzU.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-aqsly9SR.js → Providers-Db8iS1xQ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-ZWvR3zqg.js → QrScannerModal-CHbNzEQs.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BT5CgsvW.js → QuickAsk-CIESMfeR.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cz8Dz2RN.js → Recommend-BTMbCMtR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BlxPVbtQ.js → RemoteSession-DavyK6J-.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-B3VGBE-1.js → Reputation-BFKtMelA.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bwv7vSEA.js → Row-BI9AZUvw.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DHI085r_.js → RssFeed-1nwXt8NY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-DBler5T0.js → Search-Ck8PDYbk.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BZdw43NW.js → Security-BgDqpCbq.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Cslk5lUj.js → Services-DF8anXm4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Bur-C-25.js → Skeleton-CoHyY4ZX.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-v0zgLy0X.js → Skills-dOaD4Ztl.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-B1OWgQ51.js → Sla-XuOawvQY.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CaBcEaV4.js → SpeechSettings-DFJ7nAiu.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CBbG8L6J.js → SyncSettings-B2xYj-Pi.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-C7EjXrnN.js → Tasks-D_SzNTLi.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-VBBOZ1H5.js → Templates-BXFmKh7W.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CtQTj7IF.js → Tenant-CRg2AXbd.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DXVTQjnl.js → Terminal-DQgxnuep.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BRIno0aN.js → TimelineRenderer-BrPQhQVc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-uiiAfkYN.js → Tokens-RByy4USy.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CPApN8o6.js → Trigger-pE3y8u73.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-T2jKVwCE.js → Trust-DhID9C33.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C2U_gbzP.js → UkeySign-CPxEPNBH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BCdlr3Kj.js → VideoEditing-ZD8DUxeQ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CWnjoSc1.js → Wallet-Br9JREEd.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CqSbYqHq.js → WebAuthn-Cn-YacJg.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Dr_I3jcr.js → WorkflowEditor-BTu0oqMp.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Cg21FKdE.js → chat-CEjws_QF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CK85tY9e.js → colors-Bv2RNebW.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-m-XYPC7W.js → compact-item-gSc3EofP.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BmiEeNvs.js → createContext-kyFDaqWC.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CCw4KAoc.js → hasIn-BuMWcjhx.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByVvAXdl.js → index--nrQmk8X.js} +1 -1
- package/src/assets/web-panel/assets/index-05NB95_V.js +1 -0
- package/src/assets/web-panel/assets/{index-BIOTRzaF.js → index-42PTBO7a.js} +1 -1
- package/src/assets/web-panel/assets/{index-8KzhlvJ9.js → index-BCS5j4SQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-lhoexBDH.js → index-BSSIJ-rv.js} +1 -1
- package/src/assets/web-panel/assets/{index-6jXf-Lln.js → index-BUOCcXou.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7gS_TJl.js → index-Bg5jis0q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtvVupUL.js → index-C-LPpwe9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGb1j2z9.js → index-C56Drzol.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpIy2HzE.js → index-C7Jo20JB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf5arJie.js → index-C9U9SjcT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBcgIWOe.js → index-CF3TjDNz.js} +1 -1
- package/src/assets/web-panel/assets/{index-J81uvUMN.js → index-CMS3Mk93.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGUYgc96.js → index-CNt2X-aK.js} +1 -1
- package/src/assets/web-panel/assets/index-Cb6q8wlI.js +1 -0
- package/src/assets/web-panel/assets/{index-CN2xbLGz.js → index-Cj4RA7oA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1sU5-XA.js → index-CkfvP2dN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmSgfXuz.js → index-Cm8K8Evn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMbrl43d.js → index-CvSuM_CB.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7xJkhtJ.js → index-Czo_hw97.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvjC3t35.js → index-D3m3EXbL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAlGVix-.js → index-DR561Sqc.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8IC9ZeZ.js → index-DRa4R7vv.js} +1 -1
- package/src/assets/web-panel/assets/{index-yYmjkf38.js → index-DYKSuD02.js} +3 -3
- package/src/assets/web-panel/assets/{index-Br9t_I1X.js → index-DYcPWVN9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv90WEWa.js → index-DbVUA5l3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiVPFsat.js → index-DbkyTMj-.js} +1 -1
- package/src/assets/web-panel/assets/{index-IskAKXhx.js → index-Dej4AGOz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYEzWoyZ.js → index-EpxWlmip.js} +1 -1
- package/src/assets/web-panel/assets/{index-Br0ZNdu1.js → index-GpvWtvw3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIlGxS2W.js → index-NQ0c4hJ1.js} +1 -1
- package/src/assets/web-panel/assets/{index-sWUmvT8H.js → index-OjZUHz5z.js} +1 -1
- package/src/assets/web-panel/assets/{index-OIbfsi-o.js → index-U-ytt84A.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUYyhYP6.js → index-_0bfDTDu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxRhnsEC.js → index-jmMAqBAm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI9GJFcn.js → index-nLemnBZ2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BStyjmLG.js → index-q65c1kp8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHsiSoGY.js → index-sJ1F5Txa.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcfVHmFK.js → index-xfS_WO9b.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Cc1XOmNe.js → initDefaultProps-B-wqiSu7.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BehsX88u.js → motion-BK4_B4MD.js} +1 -1
- package/src/assets/web-panel/assets/{move-BPx2YsqY.js → move-BU2TgDDO.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BSFJgFQA.js → mtc-parser-DA3E4_EX.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DBN5KUeo.js → omit-CaHz1e_q.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BDK1yZ-9.js → pickAttrs-NXZ19amf.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C4rMmKNJ.js → placementArrow-BCXI9AHO.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BoeoOnxX.js → responsiveObserve-DdlZ9tLk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BKlr1bl9.js → slide-DCZm_Vc4.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ky1apWPI.js → statusUtils-CuEULKQr.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DxxR7uXk.js → styleChecker-Bo_UXG8x.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DmsUqVe9.js → useFlexGapSupport-B9PaTcFH.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CwkG7sOg.js → useFs-DwSTGdVR.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CddgeEfF.js → usePersonalDataHub-FswSxnDC.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C_-H8i4Y.js → vnode-EUztvYTj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-aAsHUMNE.js → zoom-D41MAgV-.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/eval.js +118 -18
- package/src/commands/memory.js +34 -15
- package/src/commands/sandbox.js +9 -0
- package/src/data/changelog.json +13 -0
- package/src/lib/causal-observability.js +6 -45
- package/src/lib/context-memory-kernel/durable-memory-port.js +49 -10
- package/src/lib/context-memory-kernel/memory-query-index.js +278 -0
- package/src/lib/context-memory-kernel/memory-service.js +17 -2
- package/src/lib/context-memory-kernel/segmented-memory-port.js +277 -9
- package/src/lib/eval/outcomes.js +20 -10
- package/src/lib/eval/runner.js +49 -5
- package/src/lib/eval/tasks.js +8 -3
- package/src/lib/eval/verify01-contracts.js +349 -0
- package/src/lib/eval/verify01-execution.js +605 -0
- package/src/lib/execution-support.js +58 -0
- package/src/lib/llm-pricing.js +98 -11
- package/src/lib/model-catalog-review.js +116 -0
- package/src/lib/model-context-catalog.js +23 -1
- package/src/lib/openai-responses.js +39 -0
- package/src/lib/process-execution-broker/index.js +8 -0
- package/src/lib/process-execution-broker/linux-subreaper-process.js +24 -2
- package/src/lib/process-execution-broker/process-ownership-journal.js +168 -7
- package/src/lib/process-execution-broker/process-ownership-quarantine.js +56 -1
- package/src/lib/process-execution-broker/process-recovery-cgroup.js +272 -0
- package/src/runtime/agent-core.js +9 -24
- package/src/runtime/permission-authority-host.js +14 -0
- package/src/assets/web-panel/assets/devWarning-CkMEODFC.js +0 -1
- package/src/assets/web-panel/assets/index-BjE5qaKn.js +0 -1
- package/src/assets/web-panel/assets/index-CsFH-2Zk.js +0 -1
package/src/lib/llm-pricing.js
CHANGED
|
@@ -40,6 +40,7 @@ export const PRICE_TABLE = Object.freeze({
|
|
|
40
40
|
match,
|
|
41
41
|
...model.pricing,
|
|
42
42
|
exact: true,
|
|
43
|
+
...(model.pricingTerms ? { terms: model.pricingTerms } : {}),
|
|
43
44
|
})),
|
|
44
45
|
// Current Anthropic list prices (USD per 1M tokens), verified 2026-06-21
|
|
45
46
|
// against the claude-api reference. The Opus tier dropped to $5/$25 with
|
|
@@ -64,7 +65,12 @@ export const PRICE_TABLE = Object.freeze({
|
|
|
64
65
|
match,
|
|
65
66
|
...model.pricing,
|
|
66
67
|
exact: true,
|
|
67
|
-
terms:
|
|
68
|
+
terms: Object.freeze({
|
|
69
|
+
...GPT6_PRICING_TERMS,
|
|
70
|
+
...(model.cacheReadMultiplier == null
|
|
71
|
+
? {}
|
|
72
|
+
: { cacheReadMultiplier: model.cacheReadMultiplier }),
|
|
73
|
+
}),
|
|
68
74
|
})),
|
|
69
75
|
// GPT-5 family (2026). Matching is longest-pattern-first, so dated/variant
|
|
70
76
|
// ids (gpt-5.5, gpt-5.5-pro, gpt-5.5-instant, …) resolve to the most
|
|
@@ -120,14 +126,16 @@ export const PRICE_TABLE = Object.freeze({
|
|
|
120
126
|
/**
|
|
121
127
|
* Merge user-supplied price overrides (typically `config.llm.pricing`) onto the
|
|
122
128
|
* built-in table. Override shape mirrors PRICE_TABLE:
|
|
123
|
-
* { "<provider>": [ { match: "<
|
|
129
|
+
* { "<provider>": [ { match: "<model>", in: <num>, out: <num>, exact?, terms? }, ... ] }
|
|
124
130
|
*
|
|
125
131
|
* Per provider, a user entry whose `match` equals a built-in pattern REPLACES
|
|
126
132
|
* it; brand-new patterns are prepended so they win ties; unknown providers are
|
|
127
133
|
* added. Malformed entries (missing match / non-numeric / negative / Infinity
|
|
128
134
|
* rate) are skipped so a bad config line can't crash cost reporting or produce a
|
|
129
135
|
* negative cost that undercounts spend. Returns a new table; never mutates
|
|
130
|
-
* PRICE_TABLE or the input.
|
|
136
|
+
* PRICE_TABLE or the input. Explicit terms replace (rather than partly inherit)
|
|
137
|
+
* the matched terms. Invalid terms throw: silently ignoring a requested tier
|
|
138
|
+
* or cache policy can materially misstate a hard budget.
|
|
131
139
|
*
|
|
132
140
|
* @param {object} [overrides]
|
|
133
141
|
* @param {object} [base=PRICE_TABLE]
|
|
@@ -168,6 +176,12 @@ export function mergePricing(overrides, base = PRICE_TABLE) {
|
|
|
168
176
|
match: e.match.toLowerCase(),
|
|
169
177
|
in: Number(e.in),
|
|
170
178
|
out: Number(e.out),
|
|
179
|
+
...(Object.hasOwn(e, "exact")
|
|
180
|
+
? { exact: validateExactMatch(e.exact) }
|
|
181
|
+
: {}),
|
|
182
|
+
...(Object.hasOwn(e, "terms")
|
|
183
|
+
? { terms: normalizePricingTerms(e.terms) }
|
|
184
|
+
: {}),
|
|
171
185
|
explicitOverride: true,
|
|
172
186
|
}));
|
|
173
187
|
if (valid.length === 0) continue;
|
|
@@ -180,6 +194,79 @@ export function mergePricing(overrides, base = PRICE_TABLE) {
|
|
|
180
194
|
return merged;
|
|
181
195
|
}
|
|
182
196
|
|
|
197
|
+
function validateExactMatch(value) {
|
|
198
|
+
if (typeof value !== "boolean")
|
|
199
|
+
throw new TypeError("pricing exact must be a boolean");
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** Validate and copy the documented request-level override schema. */
|
|
204
|
+
export function normalizePricingTerms(value) {
|
|
205
|
+
const object = (v) =>
|
|
206
|
+
v !== null &&
|
|
207
|
+
typeof v === "object" &&
|
|
208
|
+
(Object.getPrototypeOf(v) === Object.prototype ||
|
|
209
|
+
Object.getPrototypeOf(v) === null);
|
|
210
|
+
const finite = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0;
|
|
211
|
+
const fail = () => {
|
|
212
|
+
throw new TypeError(
|
|
213
|
+
"Invalid pricing terms: expected finite non-negative multipliers and a positive long-context threshold",
|
|
214
|
+
);
|
|
215
|
+
};
|
|
216
|
+
const allowed = new Set([
|
|
217
|
+
"cacheReadMultiplier",
|
|
218
|
+
"cacheWriteMultiplier",
|
|
219
|
+
"longContext",
|
|
220
|
+
"serviceMultipliers",
|
|
221
|
+
]);
|
|
222
|
+
if (!object(value) || Reflect.ownKeys(value).some((key) => !allowed.has(key)))
|
|
223
|
+
fail();
|
|
224
|
+
const result = {};
|
|
225
|
+
for (const key of ["cacheReadMultiplier", "cacheWriteMultiplier"]) {
|
|
226
|
+
if (!Object.hasOwn(value, key)) continue;
|
|
227
|
+
if (!finite(value[key])) fail();
|
|
228
|
+
result[key] = value[key];
|
|
229
|
+
}
|
|
230
|
+
if (Object.hasOwn(value, "longContext")) {
|
|
231
|
+
const tier = value.longContext;
|
|
232
|
+
if (
|
|
233
|
+
!object(tier) ||
|
|
234
|
+
Reflect.ownKeys(tier).some(
|
|
235
|
+
(key) =>
|
|
236
|
+
!["threshold", "inputMultiplier", "outputMultiplier"].includes(key),
|
|
237
|
+
) ||
|
|
238
|
+
!Number.isSafeInteger(tier.threshold) ||
|
|
239
|
+
tier.threshold <= 0 ||
|
|
240
|
+
!finite(tier.inputMultiplier) ||
|
|
241
|
+
!finite(tier.outputMultiplier)
|
|
242
|
+
)
|
|
243
|
+
fail();
|
|
244
|
+
result.longContext = Object.freeze({
|
|
245
|
+
threshold: tier.threshold,
|
|
246
|
+
inputMultiplier: tier.inputMultiplier,
|
|
247
|
+
outputMultiplier: tier.outputMultiplier,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (Object.hasOwn(value, "serviceMultipliers")) {
|
|
251
|
+
const tiers = value.serviceMultipliers;
|
|
252
|
+
if (
|
|
253
|
+
!object(tiers) ||
|
|
254
|
+
Reflect.ownKeys(tiers).length === 0 ||
|
|
255
|
+
Reflect.ownKeys(tiers).some(
|
|
256
|
+
(key) =>
|
|
257
|
+
!["standard", "default", "auto", "batch", "flex", "fast"].includes(
|
|
258
|
+
key,
|
|
259
|
+
) || !finite(tiers[key]),
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
fail();
|
|
263
|
+
result.serviceMultipliers = Object.freeze(
|
|
264
|
+
Object.fromEntries(Object.entries(tiers)),
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
return Object.freeze(result);
|
|
268
|
+
}
|
|
269
|
+
|
|
183
270
|
/**
|
|
184
271
|
* Look up the rate for a provider/model, or null if unpriced.
|
|
185
272
|
* @param {string} provider
|
|
@@ -199,14 +286,12 @@ export function lookupRate(provider, model, table = PRICE_TABLE) {
|
|
|
199
286
|
const sorted = [...entries].sort((a, b) => b.match.length - a.match.length);
|
|
200
287
|
for (const e of sorted) {
|
|
201
288
|
if (e.exact ? m === e.match : m.includes(e.match)) {
|
|
202
|
-
// An unrecognized new
|
|
289
|
+
// An unrecognized new generation must not inherit an older family price.
|
|
203
290
|
// Explicit operator overrides remain authoritative.
|
|
204
291
|
if (
|
|
205
|
-
e.match
|
|
206
|
-
Number(/^claude-opus-(\d+)(?:[.-]|$)/u.exec(m)?.[1]) >= 5 &&
|
|
207
|
-
!e.explicitOverride
|
|
208
|
-
e.in === 5 &&
|
|
209
|
-
e.out === 25
|
|
292
|
+
["opus", "sonnet"].includes(e.match) &&
|
|
293
|
+
Number(/^claude-(?:opus|sonnet)-(\d+)(?:[.-]|$)/u.exec(m)?.[1]) >= 5 &&
|
|
294
|
+
!e.explicitOverride
|
|
210
295
|
)
|
|
211
296
|
continue;
|
|
212
297
|
return {
|
|
@@ -258,7 +343,7 @@ export function estimateCost({
|
|
|
258
343
|
table,
|
|
259
344
|
} = {}) {
|
|
260
345
|
const rate = lookupRate(provider, model, table);
|
|
261
|
-
const tierMultiplier = rate?.terms
|
|
346
|
+
const tierMultiplier = rate?.terms?.serviceMultipliers
|
|
262
347
|
? Object.hasOwn(rate.terms.serviceMultipliers, serviceTier)
|
|
263
348
|
? rate.terms.serviceMultipliers[serviceTier]
|
|
264
349
|
: null
|
|
@@ -359,7 +444,9 @@ export function priceRollup(aggregate, { table } = {}) {
|
|
|
359
444
|
est[field] = estimates.reduce((sum, entry) => sum + entry[field], 0);
|
|
360
445
|
}
|
|
361
446
|
} else if (
|
|
362
|
-
lookupRate(row.provider, row.model, table)?.terms
|
|
447
|
+
(lookupRate(row.provider, row.model, table)?.terms?.longContext ||
|
|
448
|
+
lookupRate(row.provider, row.model, table)?.terms
|
|
449
|
+
?.serviceMultipliers) &&
|
|
363
450
|
row.calls > 1
|
|
364
451
|
) {
|
|
365
452
|
// A legacy aggregate cannot establish which individual requests crossed
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { resolveModelCapabilityProfile } from "./model-capabilities.js";
|
|
2
|
+
import { lookupRate } from "./llm-pricing.js";
|
|
3
|
+
import { isDeepStrictEqual } from "node:util";
|
|
4
|
+
|
|
5
|
+
/** Compare reviewed release facts with local behavior; never change a catalog. */
|
|
6
|
+
export function reviewModelCatalog(review, snapshots = {}) {
|
|
7
|
+
if (
|
|
8
|
+
review?.schema !== "chainlesschain.model-catalog-review/v1" ||
|
|
9
|
+
!Array.isArray(review.models) ||
|
|
10
|
+
!review.models.length
|
|
11
|
+
) {
|
|
12
|
+
throw new TypeError("Invalid reviewed model catalog");
|
|
13
|
+
}
|
|
14
|
+
const mismatches = [];
|
|
15
|
+
for (const expected of review.models) {
|
|
16
|
+
const actual = resolveModelCapabilityProfile(expected);
|
|
17
|
+
const rate = lookupRate(expected.provider, expected.model);
|
|
18
|
+
for (const field of [
|
|
19
|
+
"runtimeProtocol",
|
|
20
|
+
"contextWindowTokens",
|
|
21
|
+
"advertisedMaxOutputTokens",
|
|
22
|
+
]) {
|
|
23
|
+
if (Object.hasOwn(expected, field) && actual[field] !== expected[field])
|
|
24
|
+
mismatches.push({
|
|
25
|
+
model: expected.model,
|
|
26
|
+
field,
|
|
27
|
+
expected: expected[field],
|
|
28
|
+
actual: actual[field],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (!actual.sources.length)
|
|
32
|
+
mismatches.push({
|
|
33
|
+
model: expected.model,
|
|
34
|
+
field: "official-source",
|
|
35
|
+
actual: null,
|
|
36
|
+
});
|
|
37
|
+
for (const field of ["in", "out"]) {
|
|
38
|
+
if (rate?.[field] !== expected.pricing[field])
|
|
39
|
+
mismatches.push({
|
|
40
|
+
model: expected.model,
|
|
41
|
+
field,
|
|
42
|
+
expected: expected.pricing[field],
|
|
43
|
+
actual: rate?.[field] ?? null,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
for (const field of [
|
|
47
|
+
"cacheReadMultiplier",
|
|
48
|
+
"cacheWriteMultiplier",
|
|
49
|
+
"longContext",
|
|
50
|
+
"serviceMultipliers",
|
|
51
|
+
]) {
|
|
52
|
+
if (
|
|
53
|
+
Object.hasOwn(expected.pricing, field) &&
|
|
54
|
+
!isDeepStrictEqual(
|
|
55
|
+
rate?.terms?.[field] ?? null,
|
|
56
|
+
expected.pricing[field],
|
|
57
|
+
)
|
|
58
|
+
) {
|
|
59
|
+
mismatches.push({
|
|
60
|
+
model: expected.model,
|
|
61
|
+
field,
|
|
62
|
+
expected: expected.pricing[field],
|
|
63
|
+
actual: rate?.terms?.[field] ?? null,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (
|
|
68
|
+
expected.reasoningEfforts &&
|
|
69
|
+
JSON.stringify(actual.reasoningEfforts) !==
|
|
70
|
+
JSON.stringify(expected.reasoningEfforts)
|
|
71
|
+
)
|
|
72
|
+
mismatches.push({
|
|
73
|
+
model: expected.model,
|
|
74
|
+
field: "reasoningEfforts",
|
|
75
|
+
expected: expected.reasoningEfforts,
|
|
76
|
+
actual: actual.reasoningEfforts ?? null,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const upstream = [];
|
|
80
|
+
for (const [name, source] of Object.entries(snapshots)) {
|
|
81
|
+
if (
|
|
82
|
+
!["codex", "claude"].includes(name) ||
|
|
83
|
+
typeof source !== "string" ||
|
|
84
|
+
source.length > 16 * 1024 * 1024
|
|
85
|
+
)
|
|
86
|
+
throw new TypeError("Invalid upstream release snapshot");
|
|
87
|
+
const text = source
|
|
88
|
+
.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, "")
|
|
89
|
+
.replace(/<[^>]+>/g, " ");
|
|
90
|
+
const version =
|
|
91
|
+
name === "codex"
|
|
92
|
+
? /Codex CLI\s+(\d+\.\d+\.\d+)/.exec(text)?.[1]
|
|
93
|
+
: /<Update\s+label="(\d+\.\d+\.\d+)"/u.exec(source)?.[1] ||
|
|
94
|
+
/^##\s+(\d+\.\d+\.\d+)/m.exec(text)?.[1];
|
|
95
|
+
if (!version)
|
|
96
|
+
throw new Error(
|
|
97
|
+
`Cannot identify the ${name} release in the official snapshot`,
|
|
98
|
+
);
|
|
99
|
+
upstream.push({
|
|
100
|
+
name,
|
|
101
|
+
reviewedVersion: review.upstream[name],
|
|
102
|
+
observedVersion: version,
|
|
103
|
+
reviewRequired: version !== review.upstream[name],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
schema: "chainlesschain.model-catalog-review-result/v1",
|
|
108
|
+
reviewedAt: review.reviewedAt,
|
|
109
|
+
localContractPassed: mismatches.length === 0,
|
|
110
|
+
mismatches,
|
|
111
|
+
upstream,
|
|
112
|
+
reviewRequired:
|
|
113
|
+
mismatches.length > 0 || upstream.some((row) => row.reviewRequired),
|
|
114
|
+
automaticEnablement: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -45,7 +45,7 @@ export const CONTEXT_WINDOWS = Object.freeze({
|
|
|
45
45
|
}),
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
export const MODEL_CAPABILITY_CATALOG_VERSION = "2026-
|
|
48
|
+
export const MODEL_CAPABILITY_CATALOG_VERSION = "2026-10-05";
|
|
49
49
|
|
|
50
50
|
// Explicit ownership prevents a model name served by an unrelated provider
|
|
51
51
|
// from silently inheriting another provider's catalog window.
|
|
@@ -85,6 +85,18 @@ export const LEGACY_MODEL_PROVIDERS = Object.freeze({
|
|
|
85
85
|
// Official pages reviewed on the catalog version date. These describe the
|
|
86
86
|
// named models, not endpoint access, account entitlement, or a live CLI run.
|
|
87
87
|
export const DOCUMENTED_OPENAI_MODELS = Object.freeze({
|
|
88
|
+
"gpt-6.1-sol": Object.freeze({
|
|
89
|
+
contextWindowTokens: 1050000,
|
|
90
|
+
advertisedMaxOutputTokens: 128000,
|
|
91
|
+
requiresResponsesForTools: true,
|
|
92
|
+
reasoningEfforts: Object.freeze(["low", "medium", "high", "xhigh", "max"]),
|
|
93
|
+
pricing: Object.freeze({ in: 2, out: 10 }),
|
|
94
|
+
// This generation has a 5% cache-read rate, unlike GPT-6 Sol's 10%.
|
|
95
|
+
cacheReadMultiplier: 0.05,
|
|
96
|
+
sources: Object.freeze([
|
|
97
|
+
"https://developers.openai.com/api/docs/models/gpt-6.1-sol",
|
|
98
|
+
]),
|
|
99
|
+
}),
|
|
88
100
|
"gpt-4o": Object.freeze({
|
|
89
101
|
contextWindowTokens: 128000,
|
|
90
102
|
advertisedMaxOutputTokens: 16384,
|
|
@@ -132,11 +144,21 @@ export const DOCUMENTED_OPENAI_MODELS = Object.freeze({
|
|
|
132
144
|
});
|
|
133
145
|
|
|
134
146
|
export const DOCUMENTED_ANTHROPIC_MODELS = Object.freeze({
|
|
147
|
+
"claude-sonnet-5-5": Object.freeze({
|
|
148
|
+
contextWindowTokens: 1000000,
|
|
149
|
+
advertisedMaxOutputTokens: null,
|
|
150
|
+
pricing: Object.freeze({ in: 2, out: 10 }),
|
|
151
|
+
pricingTerms: Object.freeze({ cacheReadMultiplier: 0.1 }),
|
|
152
|
+
sources: Object.freeze([
|
|
153
|
+
"https://code.claude.com/docs/en/changelog#2-1-284",
|
|
154
|
+
]),
|
|
155
|
+
}),
|
|
135
156
|
"claude-opus-5-5": Object.freeze({
|
|
136
157
|
contextWindowTokens: 1000000,
|
|
137
158
|
// The release notes establish the window and pricing, not an output cap.
|
|
138
159
|
advertisedMaxOutputTokens: null,
|
|
139
160
|
pricing: Object.freeze({ in: 4, out: 20 }),
|
|
161
|
+
pricingTerms: Object.freeze({ cacheReadMultiplier: 0.05 }),
|
|
140
162
|
sources: Object.freeze([
|
|
141
163
|
"https://code.claude.com/docs/en/changelog#2-1-280",
|
|
142
164
|
]),
|
|
@@ -176,7 +176,16 @@ export function createOpenAIResponsesBody({
|
|
|
176
176
|
maxOutputTokens = null,
|
|
177
177
|
reasoning = null,
|
|
178
178
|
stream = false,
|
|
179
|
+
modelProfile = null,
|
|
179
180
|
}) {
|
|
181
|
+
if (
|
|
182
|
+
modelProfile?.advertisedMaxOutputTokens != null &&
|
|
183
|
+
maxOutputTokens > modelProfile.advertisedMaxOutputTokens
|
|
184
|
+
) {
|
|
185
|
+
throw new RangeError(
|
|
186
|
+
`maxOutputTokens exceeds the documented limit (${modelProfile.advertisedMaxOutputTokens}) for ${model}`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
180
189
|
return {
|
|
181
190
|
model,
|
|
182
191
|
input: toOpenAIResponsesInput(messages),
|
|
@@ -189,6 +198,36 @@ export function createOpenAIResponsesBody({
|
|
|
189
198
|
};
|
|
190
199
|
}
|
|
191
200
|
|
|
201
|
+
/** Translate UI intensity without sending an effort rejected by the model. */
|
|
202
|
+
export function createOpenAIResponsesReasoning(
|
|
203
|
+
options = {},
|
|
204
|
+
modelProfile = null,
|
|
205
|
+
) {
|
|
206
|
+
const want = options.thinking;
|
|
207
|
+
if (!want || want === "off" || want === "none") return null;
|
|
208
|
+
const requested =
|
|
209
|
+
typeof options.thinkingEffort === "string"
|
|
210
|
+
? options.thinkingEffort.toLowerCase()
|
|
211
|
+
: null;
|
|
212
|
+
const fallback = ["ultra", "ultrathink"].includes(String(want))
|
|
213
|
+
? "xhigh"
|
|
214
|
+
: want === "think"
|
|
215
|
+
? "medium"
|
|
216
|
+
: "high";
|
|
217
|
+
const generic = ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
218
|
+
const effort =
|
|
219
|
+
requested && generic.includes(requested) ? requested : fallback;
|
|
220
|
+
if (
|
|
221
|
+
modelProfile?.reasoningEfforts &&
|
|
222
|
+
!modelProfile.reasoningEfforts.includes(requested || effort)
|
|
223
|
+
) {
|
|
224
|
+
throw new RangeError(
|
|
225
|
+
`Unsupported reasoning effort for ${modelProfile.model}; allowed: ${modelProfile.reasoningEfforts.join(", ")}`,
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
return { effort, summary: "auto" };
|
|
229
|
+
}
|
|
230
|
+
|
|
192
231
|
export function normalizeOpenAIResponsesUsage(usage) {
|
|
193
232
|
if (!usage || typeof usage !== "object" || Array.isArray(usage)) return null;
|
|
194
233
|
const input = nonNegativeInteger(usage.input_tokens);
|
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
getProcessOwnershipStatus,
|
|
54
54
|
observeProcessOwnership,
|
|
55
55
|
prepareProcessOwnership,
|
|
56
|
+
recoverProcessOwnership,
|
|
56
57
|
} from "./process-ownership-quarantine.js";
|
|
57
58
|
import {
|
|
58
59
|
MACOS_MCP_LAUNCHER_INPUTS,
|
|
@@ -4525,6 +4526,10 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4525
4526
|
return getProcessOwnershipStatus();
|
|
4526
4527
|
}
|
|
4527
4528
|
|
|
4529
|
+
recoverProcessOwnership(executionId, options) {
|
|
4530
|
+
return recoverProcessOwnership(executionId, options);
|
|
4531
|
+
}
|
|
4532
|
+
|
|
4528
4533
|
listWorkspaceTransactions(options = {}) {
|
|
4529
4534
|
return this._workspaceTransactionManager(
|
|
4530
4535
|
options.stateDir,
|
|
@@ -4873,6 +4878,9 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
4873
4878
|
cwd: path.resolve(optsForSpawn.cwd || cwd),
|
|
4874
4879
|
env: optsForSpawn.env || process.env,
|
|
4875
4880
|
graceMs: request.graceMs,
|
|
4881
|
+
...(ownershipLease?.beforeLaunch
|
|
4882
|
+
? { beforeLaunch: ownershipLease.beforeLaunch }
|
|
4883
|
+
: {}),
|
|
4876
4884
|
helper,
|
|
4877
4885
|
},
|
|
4878
4886
|
{
|
|
@@ -96,10 +96,22 @@ export function spawnLinuxSubreaper(command, args, options, native) {
|
|
|
96
96
|
if (
|
|
97
97
|
Object.keys(options).some(
|
|
98
98
|
(key) =>
|
|
99
|
-
![
|
|
99
|
+
![
|
|
100
|
+
"cwd",
|
|
101
|
+
"env",
|
|
102
|
+
"graceMs",
|
|
103
|
+
"helperPath",
|
|
104
|
+
"helper",
|
|
105
|
+
"beforeLaunch",
|
|
106
|
+
].includes(key),
|
|
100
107
|
)
|
|
101
108
|
)
|
|
102
109
|
throw new TypeError("Unsupported Linux subreaper option");
|
|
110
|
+
if (
|
|
111
|
+
options.beforeLaunch !== undefined &&
|
|
112
|
+
typeof options.beforeLaunch !== "function"
|
|
113
|
+
)
|
|
114
|
+
throw new TypeError("Invalid trusted before-launch hook");
|
|
103
115
|
launch = encodeLinuxSubreaperLaunch(command, args, options);
|
|
104
116
|
child = native.spawn(helper ? "/proc/self/fd/4" : options.helperPath, [], {
|
|
105
117
|
cwd: options.cwd,
|
|
@@ -249,7 +261,17 @@ export function spawnLinuxSubreaper(command, args, options, native) {
|
|
|
249
261
|
});
|
|
250
262
|
});
|
|
251
263
|
});
|
|
252
|
-
|
|
264
|
+
try {
|
|
265
|
+
const result = options.beforeLaunch?.(child);
|
|
266
|
+
if (result && typeof result.then === "function")
|
|
267
|
+
throw new TypeError("Before-launch hook must be synchronous");
|
|
268
|
+
control.write(launch);
|
|
269
|
+
} catch (error) {
|
|
270
|
+
// No launch frame was sent. Closing the private control channel releases
|
|
271
|
+
// the blocked supervisor without executing the target.
|
|
272
|
+
control.destroy();
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
253
275
|
return Object.freeze({ child, terminate, completion });
|
|
254
276
|
}
|
|
255
277
|
|