chainlesschain 0.166.74 → 0.166.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +4 -2
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-BlIvP3k1.js → AIOps-CpiCBhRh.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DYF7atSV.js → ActionButton-CnU-Xvx-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-LZYaYek6.js → Analytics-BJW-CNtf.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BJxrjNbj.js → AppLayout-UFQJL3G9.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-gEDhxhmE.js → Artifacts-Dr_IUDoY.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-B0MR950Q.js → Audit-aglWo6rr.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-3e6Os_Kl.js → BackgroundAgents-Dm_TCiXC.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DB_X8KUg.js → Backup-DUdX4-gA.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DTNcvNeG.js → BaseInput-BTcLjy1o.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-SnqdA62j.js → Chat-Bhy9qZrl.js} +5 -5
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BaiWNH_V.js → ChatBubbleRenderer-D0WrJQaQ.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-Dj0O4dyP.js → Checkbox-CblrPa21.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BeelW3dx.js → Codegen-SEAHzOlr.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-BmstiyBM.js → Col-DJz8iFOR.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CrbmFk3f.js → Community-RufKhcQt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DCg5ZPIw.js → Compact-Dlifx08U.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-B3sajhq7.js → Compliance-DdhQWcHh.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DWcdvrDK.js → Cowork-BLNn6oOm.js} +4 -4
  21. package/src/assets/web-panel/assets/{Cron-Bjwp_NDf.js → Cron-Dv-JWY2d.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BXTLC9o8.js → Crosschain-k7Pz7O-b.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-Di62M46b.js → DID-C_10syUW.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-BQED8Rkt.js → Dashboard-CMyH6Szx.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DEf9VYaj.js → Dropdown-DjmD2Saa.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DhFpPMAM.js → EmailListRenderer-36_IRUSo.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-BOqmzkpS.js → EvolutionSettings-CmtU0XmM.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BxBnJ4fe.js → FamilyGuardDashboard-DEgf9kyP.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BN9Q8nsZ.js → Federation-DGO1wQls.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CGeqFEd-.js → FormItemContext-Doj1FmKW.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DElmWQTc.js → GenericCardRenderer-GzOU27iT.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BHBSgKck.js → Git-Dd7D1EDK.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-Breo3NTU.js → Governance-6IY8LcjI.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-CCABy4E0.js → Inference-BB9gl8q1.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-B6_ryn-X.js → KnowledgeGraph-CeCed5wd.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-CkmJjJok.js → Logs-CYOeHuaI.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-DQEQBaRu.js → MarkdownRenderer-Bk8Zqc2R.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-iip65jxv.js → Marketplace-D-_xgHgM.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DDwp_QLb.js → McpTools-NnaUTF5t.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-2ZmNDRkC.js → Memory-CndN9pMt.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-C6HilwZl.js → MobileBridge-BXblFmhY.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-BeMtYRhx.js → MobileProjects-CC26Dm2k.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-Bp-FEcoo.js → Mtc-BhaqWCiW.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-DNdkTCe5.js → MtcAudit-D6fktM2w.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-PnKg2_Eo.js → Multisig-CFvahz7s.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DDp4lZeG.js → NLProgramming-Co73Ivya.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-DEjFktcO.js → Notes-B4g33L1o.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-FR8fJDAn.js → NotificationSettings-lXd17EbN.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Cyc-XI0L.js → OrderTableRenderer-BiOB0GIi.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-DNW2E_JU.js → Organization-JQ7_wQIA.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BHfd6wk6.js → Overflow-gwgJgozQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-COIkaXH4.js → P2P-D9L_0gie.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DuRP0UeX.js → PdhVaultBrowser-CbOPsFE9.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BfVRGMy8.js → Permissions-Cz42HNQf.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BWYjO6Aa.js → PersonalDataHub-DjorYtrF.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-C0e0fPBW.js → Pipeline-DyWPhmm5.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CnId4Jv-.js → Privacy-DyfLMl2j.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CYf1grXg.js → ProjectInit-CyqDx1OE.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-HsXgJdiH.js → ProjectSettings-DsBw0Csy.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Bi0r9QcC.js → Projects-CRaSI25Z.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-B-Tu_-_4.js → Providers-CCI_klN-.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-CPDqYT2F.js → QrScannerModal-DNsnlDdS.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Df6qcjXy.js → QuickAsk-B9r2iaee.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-dP6sfGSY.js → Recommend-BJDe03GR.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-VAt9-tM3.js → RemoteSession-J7JR3rRo.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-DtRVRiLI.js → Reputation-DR39AJeV.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-B6Ukqvli.js → Row-Dh77m3NZ.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DfVRQMrZ.js → RssFeed-BUdg28nJ.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-CyncAiqQ.js → Search-BNC7sGhj.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DEO7nrkb.js → Security-DISENGI7.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-CkusQEhN.js → Services-BBBGpJ1-.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CbGtO3kc.js → Skeleton-DMcIoIv2.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-diOh0gAr.js → Skills-QAyFbI3r.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-CIu9Ahak.js → Sla-CSg5wLH7.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-_Nzyi4K9.js → SpeechSettings-DMPxTc5x.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-BAOLFlRq.js → SyncSettings-CPG7l30y.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-BpmvL1Eq.js → Tasks-Y1kOVvVL.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-Dkr_vRdJ.js → Templates-jt9NagL0.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-kM7lHUFR.js → Tenant-DauuJICx.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-9zfc41aU.js → Terminal-E9rnKeGq.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-Cg_7j6cj.js → TimelineRenderer-Cc7z2APG.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-Cs1aikaM.js → Tokens-CV0UthRA.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-DKYPJ9gl.js → Trigger-BFcJJGfu.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BFy1Sm8B.js → Trust-BAydbNJA.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-B31L9NBH.js → UkeySign-DcOS6sqL.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-OMmUYdIC.js → VideoEditing-BLHJZvif.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-y3aE7oru.js → Wallet-4QFLKHwW.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-C0ICKvpu.js → WebAuthn-BocEOOSj.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-Cq5UYbr5.js → WorkflowEditor-DCfF7D0B.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-B1ijaKFv.js → chat-CxvfsYGr.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-CHkI8PDg.js → colors-KtQB9DmQ.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-1BYvgWEs.js → compact-item-Dx4J6arN.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BGti56u4.js → createContext-Cq0olgzo.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-Cr87Fph1.js → hasIn-Bf9-h3D-.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CS0MIE2C.js → index-0fi8DIVQ.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DJjnXDAD.js → index-6dDDSCHD.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-tY479EoQ.js → index-B3xfiItB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BjgtiMdY.js → index-B8WuPI-h.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CQWMHlY7.js → index-BHmdMKYl.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Bdkrut2A.js → index-BKtQyb2o.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-6Ta8Pg47.js → index-BMcC4cbj.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BA0FMuDX.js → index-BO6XvO-C.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B4BSM3BK.js → index-B_8UcDan.js} +1 -1
  105. package/src/assets/web-panel/assets/index-BpIZ2S01.js +1 -0
  106. package/src/assets/web-panel/assets/{index-BkFXPrdx.js → index-Br1mDMfO.js} +1 -1
  107. package/src/assets/web-panel/assets/index-C-VmKuyv.js +1 -0
  108. package/src/assets/web-panel/assets/{index-CkcWhgLB.js → index-C9yaUHm9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DzevrmLK.js → index-CK2U_AHi.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D6g4jxdE.js → index-CaIclw-E.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CmmSJBNi.js → index-CeYP_kT9.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BKb16YKp.js → index-Cfsn7N18.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B1yur8MU.js → index-ClUfSChI.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-1WxCzqYq.js → index-CmQuG0fr.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BYpqBWlt.js → index-CpO6DKuu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DcoI3ENn.js → index-CqnggDos.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bni5GodE.js → index-Cy865Hhq.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CbkGda_k.js → index-Cz7f4Jaq.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Dam-LB_J.js → index-D2BfSIrn.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-fhpMyq0u.js → index-DBRlZdZj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CevUJTXd.js → index-DDAe1UmZ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Cvu95WPI.js → index-DFdEDvFn.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CDTNnQDz.js → index-DI5bRqNG.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B8Jb_cGt.js → index-DMR-keCL.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DCkvhzaY.js → index-DQDR-_ai.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-rVnXNFST.js → index-DZWjYfWt.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Dnp-4yPc.js → index-DfrFNMvz.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CjBkVrq9.js → index-DnU-dUWd.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Duv0TfJa.js → index-DsCdl2Od.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-rO6VKJv5.js → index-_FIz-0tp.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DHJtAEx8.js → index-gt5N6VM_.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BOjTRSHE.js → index-hSzyoXri.js} +3 -3
  133. package/src/assets/web-panel/assets/{index-CvcpesEZ.js → index-iE9tqEN5.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-C_lEztok.js → index-nmyDOh_b.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DAGtnwoX.js → initDefaultProps-DvzKJ6o5.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-02FXBi5C.js → motion-D1yTvmxW.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-BLf7rhzJ.js → move-DxtSIF8K.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Ct6i1vqQ.js → mtc-parser-BDsQgIHY.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DKvTU8IT.js → omit-UVBJW8kh.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DqDsKoMe.js → pickAttrs-D4QqtTyX.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-kae6Cnwx.js → placementArrow-QXmu6vBf.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DzFM_TQf.js → responsiveObserve-D-PmXO9M.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-qDjNFPuM.js → slide-CKbGxEZJ.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BihSr7G3.js → statusUtils-BbgXPkXm.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BzoT0TfJ.js → styleChecker-DOr9rk68.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-CjXXcU1j.js → useFlexGapSupport-B2wO2r36.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-DrWcbDJ1.js → useFs-SeVGBK34.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DO1oBNTE.js → usePersonalDataHub-DUJBCxjD.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-BR6crWko.js → vnode-CF4EYsig.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-DmKLfw6W.js → zoom-pRUs5pqI.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +39 -0
  153. package/src/lib/decision-layer/providers.js +84 -9
  154. package/src/lib/decision-layer/runtime.js +86 -49
  155. package/src/lib/direct-model-usage.js +14 -3
  156. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +2 -0
  157. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +770 -0
  158. package/src/lib/evolution/evolution-eval-contracts.js +86 -0
  159. package/src/lib/evolution/evolution-eval-gate.js +136 -85
  160. package/src/lib/evolution/evolution-eval-launch-admission.js +505 -0
  161. package/src/lib/evolution/skill-target-matrix-eval.js +84 -3
  162. package/src/lib/with-file-lock.js +81 -16
  163. package/src/runtime/headless-runner.js +8 -0
  164. package/src/assets/web-panel/assets/devWarning-Isft1nEX.js +0 -1
  165. package/src/assets/web-panel/assets/index-B_T9NUk7.js +0 -1
  166. package/src/assets/web-panel/assets/index-DBqUxaat.js +0 -1
@@ -38,12 +38,28 @@ function timeoutSignal(signal, timeoutMs) {
38
38
 
39
39
  function projectUnavailable(error) {
40
40
  if (error?.name === "TimeoutError") return "provider-timeout";
41
+ if (error?.code === "CC_DECISION_USAGE_UNKNOWN_BLOCKED") {
42
+ return "provider-usage-unknown-blocked";
43
+ }
41
44
  if (error?.code === "CC_DECISION_PROVIDER_HTTP_ERROR") {
42
45
  return "provider-http-error";
43
46
  }
44
47
  return "provider-unavailable";
45
48
  }
46
49
 
50
+ function unavailableOutcome(reasonCode) {
51
+ return {
52
+ status: "unavailable",
53
+ reasonCode,
54
+ selectedCandidateId: null,
55
+ selectedDigest: null,
56
+ selectedSkillId: null,
57
+ needsSkillProbability: null,
58
+ choiceConfidence: null,
59
+ resultDigest: null,
60
+ };
61
+ }
62
+
47
63
  function asPersistenceError(error) {
48
64
  if (error?.runtimeLedgerPersistence === true) return error;
49
65
  try {
@@ -63,6 +79,7 @@ export function createSkillDecisionRuntime({
63
79
  persist = null,
64
80
  observe = null,
65
81
  sessionBudget = null,
82
+ initialUsageUnknown = false,
66
83
  thresholds = {},
67
84
  timeoutMs = DEFAULT_TIMEOUT_MS,
68
85
  idGenerator = () => randomUUID(),
@@ -84,6 +101,7 @@ export function createSkillDecisionRuntime({
84
101
  let providerAuthority = null;
85
102
  let boundTenantId = null;
86
103
  let boundSessionId = null;
104
+ let unknownUsageSeen = initialUsageUnknown === true;
87
105
  if (normalizedMode !== "off") {
88
106
  providerAuthority = captureDecisionProviderAuthority(provider);
89
107
  boundTenantId = requiredText(tenantId, "tenantId");
@@ -104,6 +122,11 @@ export function createSkillDecisionRuntime({
104
122
  }
105
123
  };
106
124
 
125
+ const persistDecisionUsage = async (type, event) => {
126
+ await persist(type, event);
127
+ if (type === "model_usage_unknown") unknownUsageSeen = true;
128
+ };
129
+
107
130
  const runtime = Object.freeze({
108
131
  schema: SKILL_DECISION_RUNTIME_SCHEMA,
109
132
  mode: normalizedMode,
@@ -144,56 +167,70 @@ export function createSkillDecisionRuntime({
144
167
  }
145
168
  let outcome;
146
169
  let requestSignal = null;
147
- try {
148
- const raw = await runMeteredDirectModelCall({
149
- sessionId: boundSessionId,
150
- persist,
151
- provider: providerAuthority.provider,
152
- model: providerAuthority.model,
153
- source: "model",
154
- operationId: `decision:${decisionId}`,
155
- sessionBudget,
156
- call: () => {
157
- requestSignal = timeoutSignal(signal, timeoutMs);
158
- return providerAuthority.decide(request, {
159
- signal: requestSignal,
160
- });
161
- },
162
- });
163
- const normalized = normalizeSkillDecisionProviderResult(request, raw);
164
- const resolved = resolveSkillDecision(request, normalized, thresholds);
165
- outcome = {
166
- status: resolved.status,
167
- reasonCode: resolved.reasonCode,
168
- selectedCandidateId: resolved.selectedCandidateId,
169
- selectedDigest: resolved.selectedDigest,
170
- selectedSkillId: resolved.selectedSkillId,
171
- needsSkillProbability: resolved.needsSkillProbability,
172
- choiceConfidence: resolved.choiceConfidence,
173
- resultDigest: resolved.resultDigest,
174
- };
175
- } catch (error) {
176
- const localTimeout =
177
- !signal?.aborted &&
178
- requestSignal?.aborted &&
179
- requestSignal.reason === error &&
180
- error?.name === "TimeoutError";
181
- if (
182
- signal?.aborted ||
183
- (isTerminalModelFailure(error) && !localTimeout)
184
- ) {
185
- throw error;
170
+ if (unknownUsageSeen) {
171
+ outcome = unavailableOutcome("provider-usage-unknown-blocked");
172
+ } else {
173
+ try {
174
+ const { result: raw, settlement } = await runMeteredDirectModelCall({
175
+ sessionId: boundSessionId,
176
+ persist: persistDecisionUsage,
177
+ provider: providerAuthority.provider,
178
+ model: providerAuthority.model,
179
+ source: "model",
180
+ operationId: `decision:${decisionId}`,
181
+ sessionBudget,
182
+ includeSettlement: true,
183
+ call: () => {
184
+ if (unknownUsageSeen) {
185
+ const error = new Error("decision usage recovery is required");
186
+ error.code = "CC_DECISION_USAGE_UNKNOWN_BLOCKED";
187
+ throw error;
188
+ }
189
+ requestSignal = timeoutSignal(signal, timeoutMs);
190
+ return providerAuthority.decide(request, {
191
+ signal: requestSignal,
192
+ });
193
+ },
194
+ });
195
+ if (settlement !== "known") {
196
+ // The metered call already persisted model_usage_unknown. Without a
197
+ // budget root it may return the answer; never expose that answer.
198
+ outcome = unavailableOutcome("provider-usage-unknown");
199
+ } else {
200
+ const normalized = normalizeSkillDecisionProviderResult(
201
+ request,
202
+ raw,
203
+ );
204
+ const resolved = resolveSkillDecision(
205
+ request,
206
+ normalized,
207
+ thresholds,
208
+ );
209
+ outcome = {
210
+ status: resolved.status,
211
+ reasonCode: resolved.reasonCode,
212
+ selectedCandidateId: resolved.selectedCandidateId,
213
+ selectedDigest: resolved.selectedDigest,
214
+ selectedSkillId: resolved.selectedSkillId,
215
+ needsSkillProbability: resolved.needsSkillProbability,
216
+ choiceConfidence: resolved.choiceConfidence,
217
+ resultDigest: resolved.resultDigest,
218
+ };
219
+ }
220
+ } catch (error) {
221
+ const localTimeout =
222
+ !signal?.aborted &&
223
+ requestSignal?.aborted &&
224
+ requestSignal.reason === error &&
225
+ error?.name === "TimeoutError";
226
+ if (
227
+ signal?.aborted ||
228
+ (isTerminalModelFailure(error) && !localTimeout)
229
+ ) {
230
+ throw error;
231
+ }
232
+ outcome = unavailableOutcome(projectUnavailable(error));
186
233
  }
187
- outcome = {
188
- status: "unavailable",
189
- reasonCode: projectUnavailable(error),
190
- selectedCandidateId: null,
191
- selectedDigest: null,
192
- selectedSkillId: null,
193
- needsSkillProbability: null,
194
- choiceConfidence: null,
195
- resultDigest: null,
196
- };
197
234
  }
198
235
  const finishedAt = now();
199
236
  if (
@@ -54,6 +54,7 @@ function unknownUsageEvent({
54
54
  * Meter one direct provider call that runs outside agentLoop. The started row is
55
55
  * durable before the callback resumes into provider work; every outcome then
56
56
  * settles known or unknown without persisting prompts, responses, or errors.
57
+ * Opt-in includeSettlement returns that persisted status with the raw result.
57
58
  */
58
59
  export async function runMeteredDirectModelCall({
59
60
  sessionId,
@@ -63,6 +64,7 @@ export async function runMeteredDirectModelCall({
63
64
  source = "model",
64
65
  operationId = undefined,
65
66
  sessionBudget = null,
67
+ includeSettlement = false,
66
68
  call,
67
69
  }) {
68
70
  if (typeof call !== "function") {
@@ -78,7 +80,12 @@ export async function runMeteredDirectModelCall({
78
80
  );
79
81
  }
80
82
  }
81
- if (!sessionId) return call();
83
+ if (!sessionId) {
84
+ if (includeSettlement) {
85
+ throw new TypeError("direct model settlement requires a session");
86
+ }
87
+ return call();
88
+ }
82
89
  if (typeof persist !== "function") {
83
90
  throw new TypeError("metered direct model call requires persistence");
84
91
  }
@@ -96,6 +103,9 @@ export async function runMeteredDirectModelCall({
96
103
  `direct model call ${source}`,
97
104
  );
98
105
  let result;
106
+ let settlement = "unknown";
107
+ const returnSettled = (status) =>
108
+ includeSettlement ? Object.freeze({ result, settlement: status }) : result;
99
109
  try {
100
110
  result = await call();
101
111
  } catch (error) {
@@ -139,7 +149,7 @@ export async function runMeteredDirectModelCall({
139
149
  if (markSessionBudgetUsageUnknown(sessionBudget, unknown)) {
140
150
  rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
141
151
  }
142
- return result;
152
+ return returnSettled("unknown");
143
153
  }
144
154
  await persistUsageEvent(persist, "token_usage", event);
145
155
  recordSessionBudgetUsage(
@@ -147,6 +157,7 @@ export async function runMeteredDirectModelCall({
147
157
  event,
148
158
  `direct model call ${source} usage settlement`,
149
159
  );
160
+ settlement = "known";
150
161
  } else {
151
162
  const unknown = unknownUsageEvent({
152
163
  callId,
@@ -161,5 +172,5 @@ export async function runMeteredDirectModelCall({
161
172
  rejectSessionBudgetUsageUnknown(unknown, `direct model call ${source}`);
162
173
  }
163
174
  }
164
- return result;
175
+ return returnSettled(settlement);
165
176
  }
@@ -8,6 +8,8 @@ import {
8
8
  EVOLUTION_EVAL_SUPERVISION_SCHEMA,
9
9
  EVOLUTION_EVAL_TARGET_INVOCATION_SCHEMA,
10
10
  EVOLUTION_EVAL_TARGET_REVOCATION_SCHEMA,
11
+ } from "./evolution-eval-contracts.js";
12
+ import {
11
13
  computeEvolutionEvalReceiptDigest,
12
14
  computeEvolutionEvalSignedEvidenceDigest,
13
15
  } from "./evolution-eval-gate.js";