@sema-agent/client-core 0.77.0 → 0.77.2

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 (382) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/README.md +5 -4
  3. package/dist/abortableSleep.d.ts +0 -28
  4. package/dist/abortableSleep.js +0 -28
  5. package/dist/adapt/arms.d.ts +0 -46
  6. package/dist/adapt/arms.js +9 -544
  7. package/dist/adapt/ids.d.ts +0 -58
  8. package/dist/adapt/ids.js +0 -63
  9. package/dist/adapt/instanceLedger.d.ts +0 -25
  10. package/dist/adapt/instanceLedger.js +0 -20
  11. package/dist/adapt/panelTasks.d.ts +0 -69
  12. package/dist/adapt/panelTasks.js +0 -95
  13. package/dist/adapt/textSegmentAuthority.d.ts +1 -137
  14. package/dist/adapt/textSegmentAuthority.js +0 -54
  15. package/dist/adapt/textStream.d.ts +0 -252
  16. package/dist/adapt/textStream.js +2 -281
  17. package/dist/adapt/toolCards.d.ts +0 -46
  18. package/dist/adapt/toolCards.js +0 -23
  19. package/dist/adapt/turnFlags.d.ts +0 -54
  20. package/dist/adapt/turnFlags.js +1 -17
  21. package/dist/adapt/wireShapes.d.ts +0 -92
  22. package/dist/adapt/wireShapes.js +0 -83
  23. package/dist/adapt.d.ts +0 -55
  24. package/dist/adapt.js +1 -120
  25. package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
  26. package/dist/adapter/activeRunSelfHeal.js +10 -625
  27. package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
  28. package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
  29. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
  30. package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
  31. package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
  32. package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
  33. package/dist/adapter/runStream.d.ts +0 -206
  34. package/dist/adapter/runStream.js +6 -596
  35. package/dist/adapter/types.d.ts +0 -111
  36. package/dist/adapter/types.js +0 -29
  37. package/dist/agentSession/backgroundView.d.ts +0 -106
  38. package/dist/agentSession/backgroundView.js +3 -49
  39. package/dist/agentSession/contract.d.ts +0 -98
  40. package/dist/agentSession/contract.js +0 -12
  41. package/dist/agentsWireCaps.d.ts +0 -72
  42. package/dist/agentsWireCaps.js +4 -72
  43. package/dist/approvalsStreamLiveCapability.d.ts +0 -25
  44. package/dist/approvalsStreamLiveCapability.js +0 -31
  45. package/dist/argvFlagValue.d.ts +0 -33
  46. package/dist/argvFlagValue.js +3 -35
  47. package/dist/attachmentsWireCaps.d.ts +0 -127
  48. package/dist/attachmentsWireCaps.js +0 -144
  49. package/dist/autoModeUnavailable.d.ts +0 -120
  50. package/dist/autoModeUnavailable.js +0 -144
  51. package/dist/classifierStatus.d.ts +0 -72
  52. package/dist/classifierStatus.js +0 -167
  53. package/dist/classifierVerdictWire.d.ts +0 -54
  54. package/dist/classifierVerdictWire.js +0 -133
  55. package/dist/clientContextWireCaps.d.ts +0 -37
  56. package/dist/clientContextWireCaps.js +0 -36
  57. package/dist/clientSlice.d.ts +0 -63
  58. package/dist/clientSlice.js +0 -45
  59. package/dist/cloudConfigWireCaps.d.ts +0 -86
  60. package/dist/cloudConfigWireCaps.js +2 -65
  61. package/dist/compensations.d.ts +0 -52
  62. package/dist/compensations.js +2 -63
  63. package/dist/controlRouter.d.ts +2 -208
  64. package/dist/controlRouter.js +1 -129
  65. package/dist/coreValuePorts.d.ts +0 -84
  66. package/dist/coreValuePorts.js +0 -29
  67. package/dist/decideReceipt.d.ts +0 -110
  68. package/dist/decideReceipt.js +0 -84
  69. package/dist/detachWire.d.ts +0 -130
  70. package/dist/detachWire.js +1 -130
  71. package/dist/deviceExecutorManagementCapability.d.ts +2 -35
  72. package/dist/deviceExecutorManagementCapability.js +1 -37
  73. package/dist/diagnostics.d.ts +0 -8
  74. package/dist/diagnostics.js +0 -8
  75. package/dist/diff/patch.d.ts +0 -17
  76. package/dist/diff/patch.js +0 -19
  77. package/dist/effectiveFacts.d.ts +0 -40
  78. package/dist/effectiveFacts.js +0 -22
  79. package/dist/effortWire.d.ts +0 -11
  80. package/dist/effortWire.js +0 -12
  81. package/dist/engineAgentPanelStore.d.ts +0 -169
  82. package/dist/engineAgentPanelStore.js +13 -293
  83. package/dist/engineCapReader.d.ts +0 -62
  84. package/dist/engineCapReader.js +1 -43
  85. package/dist/engineCapsCache.d.ts +0 -177
  86. package/dist/engineCapsCache.js +0 -199
  87. package/dist/engineCapsGenerationGuard.d.ts +0 -2
  88. package/dist/engineCapsGenerationGuard.js +0 -11
  89. package/dist/engineErrorCodes.d.ts +1 -316
  90. package/dist/engineErrorCodes.js +0 -427
  91. package/dist/engineHttpTools.d.ts +0 -29
  92. package/dist/engineHttpTools.js +0 -29
  93. package/dist/engineIdentity.d.ts +0 -83
  94. package/dist/engineIdentity.js +0 -88
  95. package/dist/engineInlineTaskStats.d.ts +0 -57
  96. package/dist/engineInlineTaskStats.js +1 -42
  97. package/dist/engineNoticeCodes.d.ts +0 -190
  98. package/dist/engineNoticeCodes.js +0 -182
  99. package/dist/engineSessionParam.d.ts +0 -30
  100. package/dist/engineSessionParam.js +0 -52
  101. package/dist/engineToolLabelStore.d.ts +0 -29
  102. package/dist/engineToolLabelStore.js +0 -31
  103. package/dist/engineWireSdk.d.ts +0 -90
  104. package/dist/engineWireSdk.js +0 -74
  105. package/dist/engineWireTarget.d.ts +0 -14
  106. package/dist/engineWireTarget.js +0 -39
  107. package/dist/env/localeGeo.d.ts +0 -12
  108. package/dist/env/localeGeo.js +2 -77
  109. package/dist/env/localeTag.d.ts +0 -34
  110. package/dist/env/localeTag.js +0 -32
  111. package/dist/env/uiLanguage.d.ts +0 -13
  112. package/dist/env/uiLanguage.js +0 -25
  113. package/dist/envFlag.d.ts +0 -37
  114. package/dist/envFlag.js +0 -40
  115. package/dist/executionLaneCapability.d.ts +0 -48
  116. package/dist/executionLaneCapability.js +0 -54
  117. package/dist/finalVerifyWire.d.ts +0 -67
  118. package/dist/finalVerifyWire.js +3 -43
  119. package/dist/fleet/fleetLedger.d.ts +0 -308
  120. package/dist/fleet/fleetLedger.js +10 -429
  121. package/dist/fleet/fleetProjection.d.ts +0 -240
  122. package/dist/fleet/fleetProjection.js +0 -189
  123. package/dist/fleet/fleetRowAgentType.d.ts +0 -6
  124. package/dist/fleet/fleetRowAgentType.js +1 -32
  125. package/dist/fleet/workflowSizeWarning.d.ts +0 -47
  126. package/dist/fleet/workflowSizeWarning.js +1 -46
  127. package/dist/fleetAgentPanelProjection.d.ts +0 -48
  128. package/dist/fleetAgentPanelProjection.js +8 -173
  129. package/dist/fleetTaskDesc.d.ts +0 -39
  130. package/dist/fleetTaskDesc.js +0 -69
  131. package/dist/forkWireCaps.d.ts +0 -23
  132. package/dist/forkWireCaps.js +1 -24
  133. package/dist/gateOutcome.d.ts +0 -140
  134. package/dist/gateOutcome.js +0 -85
  135. package/dist/gateVocabulary.d.ts +0 -114
  136. package/dist/gateVocabulary.js +1 -161
  137. package/dist/goalStopHook.d.ts +0 -127
  138. package/dist/goalStopHook.js +0 -178
  139. package/dist/headlessPermissionModeWire.d.ts +0 -76
  140. package/dist/headlessPermissionModeWire.js +1 -155
  141. package/dist/headlessReconnectWire.d.ts +0 -84
  142. package/dist/headlessReconnectWire.js +13 -67
  143. package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
  144. package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
  145. package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
  146. package/dist/hitl/approvalOutcomeNote.js +0 -20
  147. package/dist/hitl/approvalResolution.d.ts +0 -113
  148. package/dist/hitl/approvalResolution.js +0 -66
  149. package/dist/hitl/approvalsFeed.d.ts +0 -183
  150. package/dist/hitl/approvalsFeed.js +12 -243
  151. package/dist/hitl/armedGateRegistry.d.ts +0 -55
  152. package/dist/hitl/armedGateRegistry.js +0 -146
  153. package/dist/hitl/askGateWire.d.ts +0 -86
  154. package/dist/hitl/askGateWire.js +1 -95
  155. package/dist/hitl/askParkRowRouting.d.ts +0 -123
  156. package/dist/hitl/askParkRowRouting.js +1 -89
  157. package/dist/hitl/crashConverged.d.ts +0 -148
  158. package/dist/hitl/crashConverged.js +0 -214
  159. package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
  160. package/dist/hitl/editedRuleTextPrecheck.js +0 -71
  161. package/dist/hitl/frameRouter.d.ts +0 -134
  162. package/dist/hitl/frameRouter.js +6 -378
  163. package/dist/hitl/gateIdentity.d.ts +0 -39
  164. package/dist/hitl/gateIdentity.js +0 -41
  165. package/dist/hitl/gateLedger.d.ts +0 -267
  166. package/dist/hitl/gateLedger.js +0 -121
  167. package/dist/hitl/hitlBridge.d.ts +7 -431
  168. package/dist/hitl/hitlBridge.js +7 -476
  169. package/dist/hitl/hitlHostSurface.d.ts +0 -150
  170. package/dist/hitl/hitlHostSurface.js +0 -169
  171. package/dist/hitl/livePendingAsk.d.ts +0 -91
  172. package/dist/hitl/livePendingAsk.js +0 -74
  173. package/dist/hitl/localAllowRule.d.ts +0 -62
  174. package/dist/hitl/localAllowRule.js +1 -33
  175. package/dist/hitl/parkOwnership.d.ts +0 -56
  176. package/dist/hitl/parkOwnership.js +0 -22
  177. package/dist/hitl/parkResolver.d.ts +3 -88
  178. package/dist/hitl/parkResolver.js +8 -349
  179. package/dist/hitl/parkRowBirthWait.d.ts +2 -26
  180. package/dist/hitl/parkRowBirthWait.js +3 -93
  181. package/dist/hitl/persistedRulesWire.d.ts +13 -358
  182. package/dist/hitl/persistedRulesWire.js +0 -310
  183. package/dist/hitl/planReviewWire.d.ts +4 -176
  184. package/dist/hitl/planReviewWire.js +9 -312
  185. package/dist/hitl/resumeRunningCard.d.ts +0 -105
  186. package/dist/hitl/resumeRunningCard.js +0 -105
  187. package/dist/hitl/sessionPolicyWire.d.ts +11 -191
  188. package/dist/hitl/sessionPolicyWire.js +0 -149
  189. package/dist/hitl/suspendedReopen.d.ts +3 -24
  190. package/dist/hitl/suspendedReopen.js +0 -14
  191. package/dist/hitl/toolApprovalWire.d.ts +5 -1308
  192. package/dist/hitl/toolApprovalWire.js +5 -945
  193. package/dist/hooksWireCaps.d.ts +0 -38
  194. package/dist/hooksWireCaps.js +0 -190
  195. package/dist/host.d.ts +0 -105
  196. package/dist/host.js +0 -33
  197. package/dist/hostEnv.d.ts +0 -14
  198. package/dist/hostEnv.js +0 -13
  199. package/dist/imagesWireCaps.d.ts +0 -21
  200. package/dist/imagesWireCaps.js +0 -22
  201. package/dist/index.d.ts +0 -134
  202. package/dist/index.js +0 -476
  203. package/dist/interactiveHalt.d.ts +5 -153
  204. package/dist/interactiveHalt.js +0 -111
  205. package/dist/interactiveToolsWire.d.ts +0 -62
  206. package/dist/interactiveToolsWire.js +1 -67
  207. package/dist/leaderConflict.d.ts +0 -59
  208. package/dist/leaderConflict.js +0 -48
  209. package/dist/limitsWire.d.ts +0 -125
  210. package/dist/limitsWire.js +2 -120
  211. package/dist/liveInitToolFace.d.ts +0 -77
  212. package/dist/liveInitToolFace.js +1 -109
  213. package/dist/liveModelCatalog.d.ts +0 -52
  214. package/dist/liveModelCatalog.js +0 -48
  215. package/dist/liveQuestionStore.d.ts +0 -87
  216. package/dist/liveQuestionStore.js +1 -56
  217. package/dist/mcpLiveness.d.ts +0 -151
  218. package/dist/mcpLiveness.js +0 -122
  219. package/dist/mcpPanel.d.ts +0 -104
  220. package/dist/mcpPanel.js +0 -49
  221. package/dist/mcpReconnect.d.ts +0 -58
  222. package/dist/mcpReconnect.js +1 -69
  223. package/dist/mcpWireCaps.d.ts +0 -55
  224. package/dist/mcpWireCaps.js +1 -13
  225. package/dist/memoryComplianceCapability.d.ts +3 -57
  226. package/dist/memoryComplianceCapability.js +0 -57
  227. package/dist/memoryEntriesWire.d.ts +6 -198
  228. package/dist/memoryEntriesWire.js +0 -144
  229. package/dist/memoryOriginCapability.d.ts +3 -53
  230. package/dist/memoryOriginCapability.js +0 -50
  231. package/dist/memorySpecWire.d.ts +0 -116
  232. package/dist/memorySpecWire.js +0 -150
  233. package/dist/model/catalog.d.ts +0 -111
  234. package/dist/model/catalog.js +0 -87
  235. package/dist/model/catalogLoader.d.ts +0 -114
  236. package/dist/model/catalogLoader.js +2 -139
  237. package/dist/model/modelSupplyRules.d.ts +1 -55
  238. package/dist/model/modelSupplyRules.js +0 -62
  239. package/dist/model/providerAuth.d.ts +0 -103
  240. package/dist/model/providerAuth.js +2 -38
  241. package/dist/model/providerCatalog.d.ts +0 -45
  242. package/dist/model/providerCatalog.js +0 -37
  243. package/dist/model/providerPresets.d.ts +0 -33
  244. package/dist/model/providerPresets.js +2 -91
  245. package/dist/model/tierVocabulary.d.ts +0 -31
  246. package/dist/model/tierVocabulary.js +0 -27
  247. package/dist/modelBudgetRule.d.ts +0 -39
  248. package/dist/modelBudgetRule.js +0 -39
  249. package/dist/modelCapabilityProbe.d.ts +0 -175
  250. package/dist/modelCapabilityProbe.js +0 -147
  251. package/dist/modelWireCaps.d.ts +0 -13
  252. package/dist/modelWireCaps.js +0 -13
  253. package/dist/notifications.d.ts +0 -233
  254. package/dist/notifications.js +14 -492
  255. package/dist/oneShotWireCaps.d.ts +0 -34
  256. package/dist/oneShotWireCaps.js +0 -35
  257. package/dist/ownKey.d.ts +0 -33
  258. package/dist/ownKey.js +0 -33
  259. package/dist/panelRunningHistory.d.ts +0 -28
  260. package/dist/panelRunningHistory.js +0 -43
  261. package/dist/peerFrames.d.ts +0 -71
  262. package/dist/peerFrames.js +0 -168
  263. package/dist/peerLaneCapability.d.ts +0 -44
  264. package/dist/peerLaneCapability.js +0 -52
  265. package/dist/permissionRuleIssue.d.ts +0 -30
  266. package/dist/permissionRuleIssue.js +0 -78
  267. package/dist/permissionRulesWriteCapability.d.ts +0 -46
  268. package/dist/permissionRulesWriteCapability.js +0 -54
  269. package/dist/permissionWireCaps.d.ts +0 -37
  270. package/dist/permissionWireCaps.js +0 -37
  271. package/dist/postureKnob.d.ts +0 -71
  272. package/dist/postureKnob.js +0 -86
  273. package/dist/principalWire.d.ts +0 -17
  274. package/dist/principalWire.js +0 -17
  275. package/dist/printToolResultFrame.d.ts +0 -100
  276. package/dist/printToolResultFrame.js +0 -33
  277. package/dist/promptProfileWireCaps.d.ts +0 -13
  278. package/dist/promptProfileWireCaps.js +0 -13
  279. package/dist/readFacePosture.d.ts +0 -43
  280. package/dist/readFacePosture.js +0 -46
  281. package/dist/request/printNotification.d.ts +0 -20
  282. package/dist/request/printNotification.js +0 -55
  283. package/dist/request/taskRequest.d.ts +0 -249
  284. package/dist/request/taskRequest.js +10 -496
  285. package/dist/resumeRefusalCopy.d.ts +0 -136
  286. package/dist/resumeRefusalCopy.js +1 -117
  287. package/dist/retainBackgroundWireCaps.d.ts +0 -48
  288. package/dist/retainBackgroundWireCaps.js +0 -48
  289. package/dist/retryStatus.d.ts +2 -221
  290. package/dist/retryStatus.js +0 -107
  291. package/dist/rewindWireCaps.d.ts +0 -27
  292. package/dist/rewindWireCaps.js +0 -24
  293. package/dist/runCancelContext.d.ts +1 -20
  294. package/dist/runCancelContext.js +0 -34
  295. package/dist/runTerminal.d.ts +0 -273
  296. package/dist/runTerminal.js +0 -177
  297. package/dist/sandboxWire.d.ts +0 -38
  298. package/dist/sandboxWire.js +0 -82
  299. package/dist/scenarioWire.d.ts +0 -60
  300. package/dist/scenarioWire.js +0 -68
  301. package/dist/scratchpadWireCaps.d.ts +0 -11
  302. package/dist/scratchpadWireCaps.js +0 -32
  303. package/dist/sdkWireTransit.d.ts +0 -38
  304. package/dist/sdkWireTransit.js +0 -30
  305. package/dist/seam.d.ts +18 -853
  306. package/dist/seam.js +0 -52
  307. package/dist/seatContract.d.ts +0 -555
  308. package/dist/seatContract.js +5 -304
  309. package/dist/selfOrchestrationDenial.d.ts +0 -189
  310. package/dist/selfOrchestrationDenial.js +0 -162
  311. package/dist/selfOrchestrationWireCaps.d.ts +0 -38
  312. package/dist/selfOrchestrationWireCaps.js +0 -38
  313. package/dist/sessionMap.d.ts +0 -60
  314. package/dist/sessionMap.js +0 -37
  315. package/dist/sessionMemoryStatus.d.ts +11 -114
  316. package/dist/sessionMemoryStatus.js +0 -112
  317. package/dist/sessionModelLatch.d.ts +0 -29
  318. package/dist/sessionModelLatch.js +0 -40
  319. package/dist/sessionPolicyCapability.d.ts +3 -53
  320. package/dist/sessionPolicyCapability.js +0 -52
  321. package/dist/sessionSlot.d.ts +0 -26
  322. package/dist/sessionSlot.js +0 -17
  323. package/dist/skillsWireCaps.d.ts +0 -87
  324. package/dist/skillsWireCaps.js +0 -38
  325. package/dist/sqlEngineCapability.d.ts +0 -118
  326. package/dist/sqlEngineCapability.js +0 -134
  327. package/dist/sseIdleTriage.d.ts +0 -79
  328. package/dist/sseIdleTriage.js +1 -80
  329. package/dist/steering.d.ts +0 -54
  330. package/dist/steering.js +0 -63
  331. package/dist/subagent/engineCompactWire.d.ts +0 -34
  332. package/dist/subagent/engineCompactWire.js +4 -134
  333. package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
  334. package/dist/subagent/engineDelegatedPrompt.js +1 -103
  335. package/dist/subagent/engineRowStopGate.d.ts +0 -20
  336. package/dist/subagent/engineRowStopGate.js +0 -49
  337. package/dist/subagent/engineSubagentOutput.d.ts +0 -7
  338. package/dist/subagent/engineSubagentOutput.js +1 -51
  339. package/dist/subagent/engineSubagentResume.d.ts +2 -279
  340. package/dist/subagent/engineSubagentResume.js +2 -129
  341. package/dist/subagent/engineSubagentSteer.d.ts +0 -26
  342. package/dist/subagent/engineSubagentSteer.js +0 -63
  343. package/dist/subagent/engineSubagentTail.d.ts +0 -38
  344. package/dist/subagent/engineSubagentTail.js +2 -110
  345. package/dist/subagent/engineTaskHandleWire.d.ts +11 -65
  346. package/dist/subagent/engineTaskHandleWire.js +20 -131
  347. package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
  348. package/dist/subagent/subagentOwnerAbsence.js +0 -25
  349. package/dist/subagentContentStore.d.ts +3 -260
  350. package/dist/subagentContentStore.js +7 -540
  351. package/dist/systemReminderTag.d.ts +0 -49
  352. package/dist/systemReminderTag.js +0 -61
  353. package/dist/toolResult.d.ts +1 -211
  354. package/dist/toolResult.js +1 -358
  355. package/dist/toolRoster.d.ts +0 -140
  356. package/dist/toolRoster.js +0 -66
  357. package/dist/typePins.d.ts +0 -46
  358. package/dist/types/engineState.d.ts +0 -71
  359. package/dist/types/engineState.js +0 -16
  360. package/dist/ultracodeWireCaps.d.ts +0 -75
  361. package/dist/ultracodeWireCaps.js +0 -92
  362. package/dist/unrefTimer.d.ts +0 -27
  363. package/dist/webSearchBackendCapability.d.ts +0 -72
  364. package/dist/webSearchBackendCapability.js +0 -79
  365. package/dist/webSearchWireCaps.d.ts +0 -37
  366. package/dist/webSearchWireCaps.js +0 -34
  367. package/dist/websearch/searchProviderPresets.d.ts +0 -81
  368. package/dist/websearch/searchProviderPresets.js +0 -27
  369. package/dist/wireErrorTriage.d.ts +4 -160
  370. package/dist/wireErrorTriage.js +0 -171
  371. package/dist/wireRefusalCopy.d.ts +0 -28
  372. package/dist/wireRefusalCopy.js +0 -28
  373. package/dist/workflow.d.ts +0 -40
  374. package/dist/workflow.js +0 -52
  375. package/dist/workflowClient.d.ts +0 -122
  376. package/dist/workflowClient.js +8 -360
  377. package/dist/workflowMonitor.d.ts +2 -72
  378. package/dist/workflowMonitor.js +0 -26
  379. package/dist/writeProtectionCapability.d.ts +0 -112
  380. package/dist/writeProtectionCapability.js +0 -109
  381. package/docs/INTEGRATION-CLIENTS.md +62 -1
  382. package/package.json +1 -1
@@ -1,25 +1,12 @@
1
- /**
2
- * 包内实现的设备码 provider 表。
3
- * 🔴 **今天是空的,理由见文件头**(宁空勿假:没有我们自己名下的 client_id 之前,填一行 = 冒用)。
4
- * 加一家 = 加一行;端点必须 https(门 ④a 逐行校)。
5
- */
6
1
  export const DEVICE_AUTH_PROVIDERS = [];
7
- /** 包内是否实现了这一家(能力真值的一半)。 */
8
2
  export function deviceAuthProviderFor(providerId) {
9
3
  return DEVICE_AUTH_PROVIDERS.find((p) => p.providerId === providerId);
10
4
  }
11
- /**
12
- * UI 是否显示「设备码登录」= **目录说有** ∧ **包里有实现**。
13
- * 任一缺席 ⇒ false(见文件头「能力真值」段)。
14
- */
15
5
  export function supportsDeviceCodeAuth(providerId, catalogHint) {
16
6
  if (catalogHint?.kind !== 'device_code')
17
7
  return false;
18
8
  return deviceAuthProviderFor(providerId) !== undefined;
19
9
  }
20
- /**
21
- * 一家 provider 摆给用户的轨(顺序 = UI 呈现序)。`api_key` 恒在;`device_code` 只在能力真值成立时出。
22
- */
23
10
  export function providerAuthMethods(preset) {
24
11
  const out = [{ kind: 'api_key', env: preset.authEnv }];
25
12
  if (supportsDeviceCodeAuth(preset.id, preset.deviceAuth)) {
@@ -27,19 +14,13 @@ export function providerAuthMethods(preset) {
27
14
  }
28
15
  return out;
29
16
  }
30
- /** 轮询间隔下限(RFC 8628 建议 5s;服务端给更大的值时听服务端的)。 */
31
17
  const DEVICE_CODE_MIN_INTERVAL_MS = 5000;
32
- /** 会话墙钟上限(design/166 §5:15min)。服务端 `expires_in` 更短时听服务端的。 */
33
18
  const DEVICE_CODE_MAX_LIFETIME_MS = 15 * 60 * 1000;
34
- /** 429 / slow_down 的退避增量(RFC 8628 §3.5 就是「加 5 秒」)。 */
35
19
  const DEVICE_CODE_BACKOFF_STEP_MS = 5000;
36
- /** 单次 HTTP 预算。 */
37
20
  const DEVICE_CODE_HTTP_TIMEOUT_MS = 10_000;
38
- /** 异常 → 短 detail(绝不带栈、绝不带响应体)。 */
39
21
  function shortError(e) {
40
22
  return (e instanceof Error ? e.message : String(e)).slice(0, 160);
41
23
  }
42
- /** POST application/x-www-form-urlencoded,收 JSON。返回 {status, body}(body 解析不动 ⇒ null)。 */
43
24
  async function postForm(url, form, fetchImpl, timeoutMs, signal) {
44
25
  const controller = new AbortController();
45
26
  const onAbort = () => controller.abort();
@@ -61,7 +42,7 @@ async function postForm(url, form, fetchImpl, timeoutMs, signal) {
61
42
  body = JSON.parse(text);
62
43
  }
63
44
  catch {
64
- body = null; // 非 JSON 响应 ⇒ 当作「说不出所以然」,由调用方按 status 判(绝不回显正文)
45
+ body = null;
65
46
  }
66
47
  return { status: res.status, body };
67
48
  }
@@ -70,14 +51,6 @@ async function postForm(url, form, fetchImpl, timeoutMs, signal) {
70
51
  signal.removeEventListener('abort', onAbort);
71
52
  }
72
53
  }
73
- /**
74
- * 开一次设备码会话 —— **端点由调用方给**(包内表里那一行,或门的合成 descriptor)。
75
- * 🔴 端点是**编译进包的常量**,不是远端数据,所以本函数不对它再做白名单;真正的门是
76
- * 「client_id/端点绝不目录化下发」(design/165 §2 红线)+ 表内每行必须 https(门 ④a)。
77
- *
78
- * 失败(网络 / 非 2xx / 缺 user_code)⇒ **throw**(§C1 三选一里的 throw):开不出会话就是开不出,
79
- * 绝不返回一个永远 pending 的假会话。
80
- */
81
54
  export async function openDeviceCodeSession(endpoints, opts) {
82
55
  const fetchImpl = opts.fetchImpl ?? fetch;
83
56
  const timeoutMs = opts.timeoutMs ?? DEVICE_CODE_HTTP_TIMEOUT_MS;
@@ -113,16 +86,13 @@ export async function openDeviceCodeSession(endpoints, opts) {
113
86
  abort.abort();
114
87
  },
115
88
  };
116
- /** 终态一旦落定就恒定(拿到 key 之后再 poll 不重复拨号)。 */
117
89
  let terminal = null;
118
- /** 下一次允许真正拨号的墙钟时刻(间隔是硬的,不靠调用方自律)。 */
119
90
  let nextDialAtMs = started;
120
91
  async function poll() {
121
92
  if (terminal !== null)
122
93
  return terminal;
123
94
  const now = opts.nowMs();
124
95
  if (now >= session.expiresAtMs) {
125
- // 本地上限先于服务端判:上限是我们对用户的承诺,不该靠服务端良心。
126
96
  terminal = { status: 'expired', detail: 'device code session exceeded its lifetime — start a new one' };
127
97
  return terminal;
128
98
  }
@@ -139,8 +109,7 @@ export async function openDeviceCodeSession(endpoints, opts) {
139
109
  }
140
110
  catch (e) {
141
111
  if (terminal !== null)
142
- return terminal; // cancel() 把在飞请求打断了 —— 终态已落定
143
- // 单次网络失败不是终态:设备码流本就是长轮询,下一拍再试(退避一格避免打点)。
112
+ return terminal;
144
113
  nextDialAtMs = opts.nowMs() + session.intervalMs;
145
114
  return { status: 'pending', detail: `poll failed, will retry: ${shortError(e)}` };
146
115
  }
@@ -171,15 +140,10 @@ export async function openDeviceCodeSession(endpoints, opts) {
171
140
  if (res.status < 200 || res.status >= 300) {
172
141
  return { status: 'pending', detail: `poll got HTTP ${res.status}, will retry` };
173
142
  }
174
- // 认不出的 error 码:不冒充终态(别把一个我们没见过的码说成「过期了」),下一拍再试。
175
143
  return { status: 'pending', detail: err === '' ? 'unrecognised token response' : `unrecognised error: ${err}` };
176
144
  }
177
145
  return session;
178
146
  }
179
- /**
180
- * 按 providerId 开设备码会话(UI 入口)。
181
- * 包内没有这一家 ⇒ **throw**(UI 本就不该显示这个选项;走到这里说明能力判据被绕过了)。
182
- */
183
147
  export async function beginDeviceCodeAuth(providerId, opts) {
184
148
  const provider = deviceAuthProviderFor(providerId);
185
149
  if (provider === undefined) {
@@ -1,63 +1,18 @@
1
- /**
2
- * providerCatalog.ts — F4 族D(A-028.17,2026-08-15):46 家 provider 表的**规范折表层**
3
- * (canonical fold)。纯派生、零 IO、零宿主依赖 —— 表本体在 `providerPresets.json`,
4
- * 本件只做「表 → 目录行」的那一次投影与行级文案判定。
5
- *
6
- * ## 为什么折表要进包
7
- *
8
- * 搬迁前这张表被折了三次:cli `src/sema/config/providerDirectory.ts`(Model Hub 目录行)、
9
- * web `src/lib/providers/catalog.ts`(向导折表)、web `provider-catalog.ts`(降级表二次映射)。
10
- * 三份折表各自持有「host 怎么取 / 零模型家怎么说 / 顺序动不动」这些**判定**,两侧常驻全表门
11
- * 只能靠人工对齐 —— 判定漂了没有任何编译器会响。折表进包后:cli 换装 re-export(单一真源),
12
- * web 侧第二份折表退役是 web 半场的事(发布帖点名)。
13
- *
14
- * ## 三条继承自 cli #175 的设计约束(逐字保留语义)
15
- *
16
- * ① **单一真源**:每个量都从 `PROVIDER_PRESETS` 现算,本文件里没有第二张表 —— 没有硬编码的
17
- * 家名/baseUrl/模型清单。表更新一次,所有端的目录跟着变。
18
- * ② **全表不重排**:顺序 = 表序,一行不筛、不重排、不分组(clay 令 2026-08-01:模型 provider
19
- * 完全用户选择,走全表)。本件不导出任何排序/过滤函数。
20
- * ③ **诚实缺席**:表里没登记模型列表的家(ollama / vllm / litellm / 聚合网关等)`modelIds`
21
- * 就是空数组,行文案说「model id typed in」,**不写「0 models」**——「0 个模型」是编造
22
- * 出来的量:表没登记 ≠ 这家没有模型。consoleUrl / signupUrl 缺席同样原样缺席,不回落编造。
23
- *
24
- * 行形是 cli DirectoryRow 与 web 折表两侧字段的**严格超集**(字段名与 cli 侧逐字一致,cli 直接
25
- * re-export 零改动;web 侧的 label/keyEnvSuggestion/suggestedModels 对应 name/authEnv/modelIds)。
26
- */
27
1
  import { type ProviderPreset } from './providerPresets.js';
28
- /** 目录/向导的一行(表的一次纯投影;字段全部现算,invariant:modelCount === modelIds.length)。 */
29
2
  export interface ProviderCatalogRow {
30
- /** preset 表里的 id(行 key + 回查用) */
31
3
  presetId: string;
32
4
  name: string;
33
5
  baseUrl: string;
34
- /** baseUrl 的 host(含端口);解析不出时给空串(诚实缺席,不猜) */
35
6
  host: string;
36
7
  api: ProviderPreset['api'];
37
- /** 领 key 的环境变量**名**(绝不是值;web 侧的 keyEnvSuggestion) */
38
8
  authEnv: string;
39
- /** 表里登记了的模型 id(原序原样;空数组 = 这家的 model id 由用户手填,见约束③) */
40
9
  modelIds: string[];
41
- /** 表里**登记了**的模型条数(0 = model id 手填,不是「这家没有模型」) */
42
10
  modelCount: number;
43
- /** 聚合网关/本地引擎:模型 id 手填,ctx/maxTokens 走家族表 */
44
11
  modelViaFamily: boolean;
45
- /** 去哪拿 key 的控制台页(纯 URL);缺席 = 上游没有确证地址,不编 */
46
12
  consoleUrl?: string;
47
- /** 没账号时的注册入口;缺席 = 用 consoleUrl 那条 */
48
13
  signupUrl?: string;
49
14
  }
50
- /**
51
- * 全表 → 目录行。**顺序 = 表序**(约束②):这里没有 filter,也没有 sort。
52
- * `presets` 入参只给测试用(注入一张小表),产品路径恒走 `PROVIDER_PRESETS`。
53
- */
54
15
  export declare function providerCatalogRows(presets?: readonly ProviderPreset[]): ProviderCatalogRow[];
55
- /** 目录规模。端上「家数」与目录行数同源 —— 两处不会各报一个数。 */
56
16
  export declare function providerCatalogCount(): number;
57
- /** 按 preset id 回查整条 preset(目录选中之后要拿 baseUrl / models / consoleUrl)。 */
58
17
  export declare function providerPresetById(presetId: string): ProviderPreset | undefined;
59
- /**
60
- * 一行的 dim 说明:`host · api · 模型情况`。
61
- * 约束③:`modelCount === 0` 说「model id typed in」,绝不写「0 models」。
62
- */
63
18
  export declare function providerCatalogRowDetail(row: Pick<ProviderCatalogRow, 'host' | 'baseUrl' | 'api' | 'modelCount' | 'modelViaFamily'>): string;
@@ -1,29 +1,3 @@
1
- /**
2
- * providerCatalog.ts — F4 族D(A-028.17,2026-08-15):46 家 provider 表的**规范折表层**
3
- * (canonical fold)。纯派生、零 IO、零宿主依赖 —— 表本体在 `providerPresets.json`,
4
- * 本件只做「表 → 目录行」的那一次投影与行级文案判定。
5
- *
6
- * ## 为什么折表要进包
7
- *
8
- * 搬迁前这张表被折了三次:cli `src/sema/config/providerDirectory.ts`(Model Hub 目录行)、
9
- * web `src/lib/providers/catalog.ts`(向导折表)、web `provider-catalog.ts`(降级表二次映射)。
10
- * 三份折表各自持有「host 怎么取 / 零模型家怎么说 / 顺序动不动」这些**判定**,两侧常驻全表门
11
- * 只能靠人工对齐 —— 判定漂了没有任何编译器会响。折表进包后:cli 换装 re-export(单一真源),
12
- * web 侧第二份折表退役是 web 半场的事(发布帖点名)。
13
- *
14
- * ## 三条继承自 cli #175 的设计约束(逐字保留语义)
15
- *
16
- * ① **单一真源**:每个量都从 `PROVIDER_PRESETS` 现算,本文件里没有第二张表 —— 没有硬编码的
17
- * 家名/baseUrl/模型清单。表更新一次,所有端的目录跟着变。
18
- * ② **全表不重排**:顺序 = 表序,一行不筛、不重排、不分组(clay 令 2026-08-01:模型 provider
19
- * 完全用户选择,走全表)。本件不导出任何排序/过滤函数。
20
- * ③ **诚实缺席**:表里没登记模型列表的家(ollama / vllm / litellm / 聚合网关等)`modelIds`
21
- * 就是空数组,行文案说「model id typed in」,**不写「0 models」**——「0 个模型」是编造
22
- * 出来的量:表没登记 ≠ 这家没有模型。consoleUrl / signupUrl 缺席同样原样缺席,不回落编造。
23
- *
24
- * 行形是 cli DirectoryRow 与 web 折表两侧字段的**严格超集**(字段名与 cli 侧逐字一致,cli 直接
25
- * re-export 零改动;web 侧的 label/keyEnvSuggestion/suggestedModels 对应 name/authEnv/modelIds)。
26
- */
27
1
  import { PROVIDER_PRESETS } from './providerPresets.js';
28
2
  const hostOf = (u) => {
29
3
  try {
@@ -33,12 +7,7 @@ const hostOf = (u) => {
33
7
  return '';
34
8
  }
35
9
  };
36
- /** api 家族的行内短名(目录行/芯片行两端同一个词,不各自缩写)。 */
37
10
  const providerApiShortName = (api) => api === 'anthropic-messages' ? 'anthropic' : 'openai';
38
- /**
39
- * 全表 → 目录行。**顺序 = 表序**(约束②):这里没有 filter,也没有 sort。
40
- * `presets` 入参只给测试用(注入一张小表),产品路径恒走 `PROVIDER_PRESETS`。
41
- */
42
11
  export function providerCatalogRows(presets = PROVIDER_PRESETS) {
43
12
  return presets.map(p => ({
44
13
  presetId: p.id,
@@ -54,18 +23,12 @@ export function providerCatalogRows(presets = PROVIDER_PRESETS) {
54
23
  ...(p.signupUrl === undefined ? {} : { signupUrl: p.signupUrl }),
55
24
  }));
56
25
  }
57
- /** 目录规模。端上「家数」与目录行数同源 —— 两处不会各报一个数。 */
58
26
  export function providerCatalogCount() {
59
27
  return providerCatalogRows().length;
60
28
  }
61
- /** 按 preset id 回查整条 preset(目录选中之后要拿 baseUrl / models / consoleUrl)。 */
62
29
  export function providerPresetById(presetId) {
63
30
  return PROVIDER_PRESETS.find(p => p.id === presetId);
64
31
  }
65
- /**
66
- * 一行的 dim 说明:`host · api · 模型情况`。
67
- * 约束③:`modelCount === 0` 说「model id typed in」,绝不写「0 models」。
68
- */
69
32
  export function providerCatalogRowDetail(row) {
70
33
  const models = row.modelCount === 0
71
34
  ? 'model id typed in'
@@ -2,7 +2,6 @@ export type PresetModel = {
2
2
  id: string;
3
3
  contextWindow: number;
4
4
  maxTokens: number;
5
- /** Marks the provider's cheap sibling — screen-4 execution-slot recommendation. */
6
5
  cheapHint?: boolean;
7
6
  };
8
7
  export type ProviderPreset = {
@@ -12,61 +11,29 @@ export type ProviderPreset = {
12
11
  api: 'anthropic-messages' | 'openai-completions';
13
12
  authEnv: string;
14
13
  models: PresetModel[];
15
- /** Aggregator gateways (OpenRouter): model id is hand-typed, ctx/maxtok via family table. */
16
14
  modelViaFamily?: boolean;
17
- /**
18
- * 🆕 design/160 需求②-B(2026-07-31):**去哪拿 key** 的控制台页(纯链接,离线也能显示)。
19
- *
20
- * 🔴 **诚实缺席**:只填能可靠确认的官网控制台地址;拿不准的家**不填**,绝不编 URL —— 这个字段
21
- * 会被 onboard 直接拿去开浏览器,编一个 = 把用户送到错误的地方。本地/自建家(ollama /
22
- * lmstudio / vllm / sglang / litellm)按定义没有控制台页,缺席是正确答案不是遗漏。
23
- * 设计档待裁点 3b:`oauth` / `subscribe` 两类**本批不加**(授权码流/设备码流单独排)。
24
- */
25
15
  consoleUrl?: string;
26
- /** 没账号时的注册入口。与 `consoleUrl` 同页的家不重复填(缺席 = 用 consoleUrl 那条)。 */
27
16
  signupUrl?: string;
28
- /**
29
- * 🆕 design/165 §2 + design/166 §5(2026-08-04):**设备码能力开关**(B 档)。
30
- *
31
- * 🔴 它只是**开关**,不携带 client_id / token 端点 / authorize 端点 —— 那些编译进
32
- * `model/providerAuth.ts` 的 `DEVICE_AUTH_PROVIDERS`。理由:目录是远端可改的数据,
33
- * 让它决定鉴权端点 = 把钓鱼面下发给客户端(design/165 §2 红线④,CI 的 validate.mjs
34
- * 里有对应的机械不变式)。
35
- * 🔴 能力真值 = **本键在场 ∧ 包内有实现**(`supportsDeviceCodeAuth`)——目录先行不造 affordance。
36
- */
37
17
  deviceAuth?: ProviderDeviceAuthHint;
38
18
  };
39
- /** 目录里的设备码能力开关(只有 kind 与文档链接;凭证参数一律不进目录)。 */
40
19
  export interface ProviderDeviceAuthHint {
41
20
  kind: 'device_code';
42
- /** 该家自己的设备码说明页(纯链接;拿不准就不填,绝不编 URL)。 */
43
21
  docsUrl?: string;
44
22
  }
45
23
  export type ModelFamily = {
46
24
  id: string;
47
25
  name: string;
48
- /** Regex source matched against a model id to PRE-SELECT the family. '' = fallback. */
49
26
  match: string;
50
27
  contextWindow: number;
51
28
  maxTokens: number;
52
- /** 图像输入能力(确信才标:false=确认无 vision,true=确认有;缺省=未知不 stamp)。 */
53
29
  vision?: boolean;
54
- /**
55
- * per-model 已知输出上限 —— 仅 inferFamily 第①层(providerPresets.json 精确表)命中时携带
56
- * (=该行 maxTokens)。F2 裁决(clay 2026-07-15)封顶① 的证据位:家族正则/主干层的 maxTokens
57
- * 是家族参考值,不是该模型的确证 cap,不带此位。
58
- */
59
30
  perModelCap?: number;
60
31
  };
61
32
  export declare const PROVIDER_PRESETS: ProviderPreset[];
62
33
  export declare const MODEL_FAMILIES: ModelFamily[];
63
- /** Infer context/max from a model id — four evidence tiers, strongest first. */
64
34
  export declare function inferFamily(modelId: string): ModelFamily | undefined;
65
- /** Format token counts like "1m" / "384k". */
66
35
  export declare function fmtTokens(n: number): string;
67
- /** "1m ctx / 384k out" style short metric text. */
68
36
  export declare function fmtCtxOut(ctx: number, out: number): string;
69
- /** Screen-4 execution-slot recommendation: cheapHint first, else a cheap-sounding sibling. */
70
37
  export declare function pickCheapCandidate<T extends {
71
38
  id: string;
72
39
  cheapHint?: boolean;
@@ -1,44 +1,7 @@
1
- /**
2
- * ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6 · B4「四残件」之 model 数据表):cli
3
- * `src/sema/onboard/providerPresets.{ts,json}` + `modelFamilies.json` 整搬(零依赖、纯查表)。
4
- *
5
- * 🔴 **为什么数据表必须进包**:`modelBudgetRule.defaultMaxTokensFor()`(B2 已搬)的封顶① 参数
6
- * `perModelCap` 只有一个来源 —— `inferFamily()` 第①层精确命中。表留在壳里 ⇒ 库里那条中央规则
7
- * 在 web/桌面上**永远拿不到 cap**,`defaultMaxTokensFor(ctx)` 恒走 min(base, ctx/4),
8
- * 对 deepseek-chat(cap 8192)这类模型直接超发 ⇒ 网关 400。这不是「少个装饰」。
9
- *
10
- * 🔴 **搬迁期的双份漂移锁已退役(0.11.10)**:搬迁期壳树那两个 JSON 还在,pure 门当时有一条
11
- * **byte-identity 断言**(本包 `src/model/*.json` 与壳树 `src/sema/onboard/*.json` 逐字节相等)。
12
- * 壳侧 shim 落地(那两个 JSON 删除、`providerPresets.ts` 改 re-export 本包)之后,那条断言的
13
- * **前提消失**了 —— 它从此每跑必打 DEGRADED 且**永远不会再跑**(校一个已经不存在的物,再自我
14
- * 降级放过 = 僵尸腿)。继任不变量不是「两份一致」,是「**只有一份、而且用户拿到的就是它**」:
15
- * · pure 门:`dist/model/*.json` 与 src **语义**等同(tsc emit 会重排缩进,跨 emit 边界只能校
16
- * 语义)+ 运行时表的 id 序列 === 表本身 + src 树里各恰好一份 + 壳树零副本/shim 仍 re-export;
17
- * · public-surface 门:`npm pack` 的**真实发布清单**里必须有这两个 JSON(换 bundler / 一行
18
- * .npmignore 就能让数据表静悄悄不进 tarball,而类型与单测照样全绿)。
19
- *
20
- * ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
21
- *
22
- * providerPresets.ts — typed accessors over the static preset data tables for
23
- * `sema onboard` (GUIDE-ONBOARD-DESIGN §3a/§3b, clay 拍板 2026-07-03).
24
- *
25
- * DATA lives in the sibling JSON files (providerPresets.json /
26
- * modelFamilies.json) — adding a provider or family is a table row, no code
27
- * change (维护性原则: new source = one module + one table row). Shapes align
28
- * with openclaw's plugin-manifest `modelCatalog.providers` / CenterModel so
29
- * translators stay ~free, but centralized (sema has no plugin system).
30
- *
31
- * All numbers are best-effort defaults (待核 official docs); qwen/glm values
32
- * were read from clay's real ~/.openclaw catalog.
33
- */
34
1
  import presetData from './providerPresets.json' with { type: 'json' };
35
2
  import familyData from './modelFamilies.json' with { type: 'json' };
36
3
  export const PROVIDER_PRESETS = presetData.presets;
37
4
  export const MODEL_FAMILIES = familyData.families;
38
- // ── 模型自动匹配 v2(clay 07-06:预填要"较为准确的推荐",真实测例驱动,verify/_infer-family-test)──
39
- // 四层:①preset 大表精确命中(46 provider 的真实 models,最强证据)②容量后缀/名内提示([1m]、-128k)
40
- // ③家族主干匹配(部署前缀/参数量/量化后缀容忍)④family 表前缀兜底。
41
- /** 尾部变体词(主干提取时剥):不承载 ctx 信息的营销/角色/量化/参数量后缀。 */
42
5
  const VARIANT_TAIL = /(-(plus|pro|max|flash|turbo|mini|lite|chat|coder?|code|instruct|thinking|reasoner|next|preview|latest|fp8|fp16|awq|int[48]|gptq|\d+b))+$/;
43
6
  let presetIndexCache = null;
44
7
  function presetIndex() {
@@ -64,13 +27,6 @@ function presetIndex() {
64
27
  presetIndexCache = { exact, stems };
65
28
  return presetIndexCache;
66
29
  }
67
- /**
68
- * family 表(第④层)的**唯一**匹配器 —— anchored 优先、再 unanchored 兜底。
69
- *
70
- * 提出来的理由不是整洁,是**单源**:`vision` 位只住在这张表上,而第①/②/③ 层命中时也要能读到它
71
- * (见 {@link visionFromFamilyTable})。若两处各写一遍两趟正则,「这个 id 属哪个家族」在同一个函数
72
- * 里就会有两个答案。
73
- */
74
30
  function familyFromTable(id) {
75
31
  for (const fam of MODEL_FAMILIES) {
76
32
  if (fam.match && new RegExp(fam.match, 'i').test(id))
@@ -82,25 +38,6 @@ function familyFromTable(id) {
82
38
  }
83
39
  return undefined;
84
40
  }
85
- /**
86
- * 🔴 **#318 件③(cli [4752] 自领缺口1)—— `vision` 的分层遮蔽修**。
87
- *
88
- * 病(修前的真行为,不是假设):`vision` 位只写在 `modelFamilies.json` 上,而那张表只有**第④层**
89
- * 读。可是任何真实的 `deepseek-*` id 在**第①层**(preset 大表精确)或**第③层**(家族主干包含)
90
- * 就已经命中并 return 了,而这两层的构造器 `hitOf` **不带 vision 位** ⇒ 第④层对它们**结构性不可达**
91
- * ⇒ `deepseek4` 行的 `vision: false` **永远读不出来**,壳的 `MODEL_VISION=false` stamp 恒不发生
92
- * (下游两处注释自述的行为是死的)。
93
- *
94
- * 修的形:把 `vision` 从「第④层的一个字段」提成**与 ctx/maxTokens 证据层正交的一次独立查表**。
95
- * 判据分工从此是两条轴,各自单源:
96
- * · **容量轴**(contextWindow / maxTokens / perModelCap)= 四层证据,强者先赢 —— 一字不动;
97
- * · **vision 轴** = 恒查 family 表(本函数),与哪一层命中**无关**。
98
- * 为什么正交是对的:preset 大表(第①层)根本没有 vision 列,主干匹配(第③层)拿的是**别的模型**
99
- * 的行 —— 两者都不是「这个 id 能不能看图」的证据。唯一有这个事实的地方就是 family 表。
100
- *
101
- * 🔴 **诚实缺席**:表上没标(键缺席)⇒ 返回 `undefined` ⇒ 调用方**不 stamp 这个键**。
102
- * 「没人说过这个模型能不能看图」与「确认它不能看图」是两件事,后者会永久封死一个真能力。
103
- */
104
41
  function visionFromFamilyTable(id) {
105
42
  const fam = familyFromTable(id);
106
43
  return typeof fam?.vision === 'boolean' ? fam.vision : undefined;
@@ -109,25 +46,20 @@ function normalizeId(raw) {
109
46
  let id = raw.trim().toLowerCase();
110
47
  const slash = id.lastIndexOf('/');
111
48
  if (slash >= 0)
112
- id = id.slice(slash + 1); // org/model → model
113
- id = id.replace(/\[[0-9]+[km]\]$/, ''); // [1m] 容量后缀在第②层单独消费
49
+ id = id.slice(slash + 1);
50
+ id = id.replace(/\[[0-9]+[km]\]$/, '');
114
51
  return id;
115
52
  }
116
- /** Infer context/max from a model id — four evidence tiers, strongest first. */
117
53
  export function inferFamily(modelId) {
118
54
  const raw = modelId.trim().toLowerCase();
119
55
  if (!raw)
120
56
  return undefined;
121
57
  const idx = presetIndex();
122
- // ② 前置:显式容量标注恒赢([1m]/[200k] CC 惯例后缀)——用户/工具已声明,别猜。
123
58
  const capSuffix = raw.match(/\[(\d+)([km])\]$/);
124
59
  if (capSuffix) {
125
60
  const n = Number(capSuffix[1]);
126
61
  const ctx = capSuffix[2] === 'm' ? n * 1000000 : n * 1024;
127
62
  const base = inferFamily(raw.replace(/\[[0-9]+[km]\]$/, ''));
128
- // perModelCap 透传:后缀只声明 ctx,不改该模型的确证输出 cap(deepseek-chat[1m] 仍 cap 8192)
129
- // eopt:vision/perModelCap 是「缺省=未知不 stamp」的条件展开位(与 taskId/status 那种「键恒在」
130
- // 公面契约不同义——那两位没有「已确认为未知」这个第三态,这两位有),诚实透传 base 的键在场与否。
131
63
  return {
132
64
  id: base?.id ?? 'cap-suffix',
133
65
  name: base?.name ?? 'capacity suffix',
@@ -139,20 +71,13 @@ export function inferFamily(modelId) {
139
71
  };
140
72
  }
141
73
  const id = normalizeId(raw);
142
- // vision 轴:与容量证据层**正交**的一次独立查表(#318 件③ 分层遮蔽修,推导见 visionFromFamilyTable)。
143
- // 恒按**完整归一 id** 查(不按主干):family 的 match 是锚在 id 上的前缀正则,拿主干去查会把
144
- // `deepseek-chat` 的证据换成 `deepseek` 的证据 —— 同族时同解,不同族时是另一个答案。
145
74
  const vision = visionFromFamilyTable(id);
146
- // ① preset 大表精确(含剥变体尾巴后再试)——精确命中才带 perModelCap(F2 裁决封顶① 证据位;
147
- // ③ 层主干匹配拿的是家族参考行,不是该模型的确证 cap)
148
75
  const hitOf = (m, exact = false) => ({
149
76
  id: m.famId,
150
77
  name: m.famId,
151
78
  match: '',
152
79
  contextWindow: m.contextWindow,
153
80
  maxTokens: m.maxTokens,
154
- // 🔴 诚实缺席:表上没标就**不 stamp 键**(`exactOptionalPropertyTypes` 下 `vision: undefined`
155
- // 与键缺席不是一回事,消费方读的正是「键在不在」这个三态)。
156
81
  ...(vision !== undefined ? { vision } : {}),
157
82
  ...(exact ? { perModelCap: m.maxTokens } : {}),
158
83
  });
@@ -165,14 +90,11 @@ export function inferFamily(modelId) {
165
90
  if (e2)
166
91
  return hitOf(e2, true);
167
92
  }
168
- // ② 名内容量提示(moonshot-v1-128k / *-32k):k=×1024
169
93
  const inline = id.match(/-(\d+)([km])\b/);
170
94
  if (inline) {
171
95
  const n = Number(inline[1]);
172
96
  if ((inline[2] === 'k' && n >= 8) || inline[2] === 'm') {
173
97
  const ctx = inline[2] === 'm' ? n * 1000000 : n * 1024;
174
- // vision 轴同样正交透出(`deepseek-v3-128k` 这类 id 在这一层就 return,不透 = 同一个遮蔽病
175
- // 换个层复发)。
176
98
  return {
177
99
  id: 'inline-cap',
178
100
  name: 'capacity in id',
@@ -183,14 +105,11 @@ export function inferFamily(modelId) {
183
105
  };
184
106
  }
185
107
  }
186
- // ③ 家族主干:候选主干=preset model id 剥变体尾;主干出现在待匹配 id 中,取最长主干
187
108
  let best = null;
188
109
  let bestLen = 0;
189
110
  for (const m of idx.stems) {
190
111
  const stem = m.id.replace(VARIANT_TAIL, '');
191
112
  if (stem.length >= 6 && id.includes(stem)) {
192
- // 同长命中取 ctx 最小=家族原生保守值(服务档扩展如 DashScope 1M 让用户在档位里升,
193
- // 预填错大比错小危险——超发请求直接被网关拒)
194
113
  if (stem.length > bestLen || (stem.length === bestLen && best && m.contextWindow < best.contextWindow)) {
195
114
  best = m;
196
115
  bestLen = stem.length;
@@ -199,15 +118,9 @@ export function inferFamily(modelId) {
199
118
  }
200
119
  if (best)
201
120
  return hitOf(best);
202
- // ④ family 表前缀(anchored → unanchored)—— 与 vision 轴共用同一个匹配器(单源,见 familyFromTable)
203
121
  return familyFromTable(id);
204
122
  }
205
- /** Format token counts like "1m" / "384k". */
206
123
  export function fmtTokens(n) {
207
- // token 界惯例=二进制 K(clay 07-06:32768 显示 33K 是错的,就是 32K;262144=256K)。
208
- // 1024 整除走二进制;否则十进制圆整(200000→200k、202800→203k);M 档十进制(1000000→1m)。
209
- // #29⑤(prelaunch audit):十进制整千先判 —— 128000 是十进制圆数,必须渲 128k,不是 125k
210
- // (128000%1024==0 曾把它劫进二进制档;其它入口全都叫 128K)。32768/262144/393216 不整除 1000,不受影响。
211
124
  if (n >= 1000000 && n % 100000 === 0)
212
125
  return `${n / 1000000}m`;
213
126
  if (n >= 1000 && n % 1000 === 0)
@@ -218,11 +131,9 @@ export function fmtTokens(n) {
218
131
  return `${Math.round(n / 1000)}k`;
219
132
  return String(n);
220
133
  }
221
- /** "1m ctx / 384k out" style short metric text. */
222
134
  export function fmtCtxOut(ctx, out) {
223
135
  return `${fmtTokens(ctx)} ctx / ${fmtTokens(out)} out`;
224
136
  }
225
- /** Screen-4 execution-slot recommendation: cheapHint first, else a cheap-sounding sibling. */
226
137
  export function pickCheapCandidate(models, defaultId) {
227
138
  const others = models.filter(m => m.id !== defaultId);
228
139
  return (others.find(m => m.cheapHint) ??
@@ -1,43 +1,12 @@
1
- /**
2
- * tierVocabulary.ts — F4 族D(A-028.18,2026-08-15):档位(tier)的**词表 + 派生 + 校验**单源。
3
- * 纯数据 + 纯函数,零 IO、零宿主依赖。
4
- *
5
- * ## 为什么进包
6
- *
7
- * 搬迁前这套词表跨两仓共三份:cli `src/sema/config/tierCore.ts`(词表 + isTier 校验 +
8
- * resolveTierBinding 派生)、web `tiers-page.tsx`(词表)、web `chat/wording.ts`(词表 + 按
9
- * 模型名 token 化的派生)。五档顺序/别名映射漂了没有任何编译器会响。词表进包后:cli 的
10
- * tierCore 换装 re-export(settings 读写那半场留在壳里 —— 那是宿主存储,不是词表);web 侧
11
- * 两份的退役是 web 半场的事(发布帖点名)。
12
- *
13
- * ## 与引擎侧的对齐
14
- *
15
- * 五档序镜像 core `DEFAULT_TIER_ORDER`、CC 别名镜像 core `CC_MODEL_TIER_ALIASES`(cli 侧
16
- * tierStore.test.ts 有对 core 导出的运行时 drift-lock);`ultra` 预留在 max 之上(core 已排位,
17
- * UI 今天不面)。缺省默认档 pro(clay [599])。
18
- */
19
- /** sema 档位(用户/模型可寻址的命名档)。`ultra` 预留(core 已排位,UI 今天不面)。 */
20
1
  export type Tier = 'ultra' | 'max' | 'pro' | 'flash' | 'lite';
21
- /** 降档链(强→弱)——镜像 core DEFAULT_TIER_ORDER;解析某档无绑定时沿链向后取第一个有绑定的档。 */
22
2
  export declare const TIER_ORDER: readonly Tier[];
23
- /** UI 呈现的四档(ultra 预留不面)。 */
24
3
  export declare const SURFACED_TIERS: readonly Tier[];
25
- /** CC 档位词 → sema 档位(内置固定映射,镜像 core CC_MODEL_TIER_ALIASES;兼容层不可配)。 */
26
4
  export declare const CC_TIER_ALIASES: Readonly<Record<string, Tier>>;
27
- /** 缺省默认档(clay [599]:默认档缺省 pro)。 */
28
5
  export declare const DEFAULT_TIER: Tier;
29
- /** 各档一句话职责(档位 Hub/onboard 行描述共用;无 roster/role 词)。 */
30
6
  export declare const TIER_BLURBS: Readonly<Record<Tier, string>>;
31
- /** 一个命名档位组的绑定形(纯类型:绑定值 = 端侧模型目录的 entry id)。 */
32
7
  export type TierGroupDef = {
33
- /** tier → 模型 entry id。未绑档沿 TIER_ORDER 向下 fail-open(见 resolveTierBinding)。 */
34
8
  tiers: Partial<Record<Tier, string>>;
35
- /** 组内默认档(缺省 DEFAULT_TIER=pro)。 */
36
9
  defaultTier?: Tier;
37
10
  };
38
11
  export declare const isTier: (v: unknown) => v is Tier;
39
- /**
40
- * 组内解析某档 → 绑定 entry id(该档未绑则沿 TIER_ORDER 向下取第一个有绑定的档;全空
41
- * undefined)。fail-open 沿链向下,镜像 core expandTiers 语义。
42
- */
43
12
  export declare function resolveTierBinding(def: TierGroupDef, tier: Tier): string | undefined;
@@ -1,26 +1,5 @@
1
- /**
2
- * tierVocabulary.ts — F4 族D(A-028.18,2026-08-15):档位(tier)的**词表 + 派生 + 校验**单源。
3
- * 纯数据 + 纯函数,零 IO、零宿主依赖。
4
- *
5
- * ## 为什么进包
6
- *
7
- * 搬迁前这套词表跨两仓共三份:cli `src/sema/config/tierCore.ts`(词表 + isTier 校验 +
8
- * resolveTierBinding 派生)、web `tiers-page.tsx`(词表)、web `chat/wording.ts`(词表 + 按
9
- * 模型名 token 化的派生)。五档顺序/别名映射漂了没有任何编译器会响。词表进包后:cli 的
10
- * tierCore 换装 re-export(settings 读写那半场留在壳里 —— 那是宿主存储,不是词表);web 侧
11
- * 两份的退役是 web 半场的事(发布帖点名)。
12
- *
13
- * ## 与引擎侧的对齐
14
- *
15
- * 五档序镜像 core `DEFAULT_TIER_ORDER`、CC 别名镜像 core `CC_MODEL_TIER_ALIASES`(cli 侧
16
- * tierStore.test.ts 有对 core 导出的运行时 drift-lock);`ultra` 预留在 max 之上(core 已排位,
17
- * UI 今天不面)。缺省默认档 pro(clay [599])。
18
- */
19
- /** 降档链(强→弱)——镜像 core DEFAULT_TIER_ORDER;解析某档无绑定时沿链向后取第一个有绑定的档。 */
20
1
  export const TIER_ORDER = ['ultra', 'max', 'pro', 'flash', 'lite'];
21
- /** UI 呈现的四档(ultra 预留不面)。 */
22
2
  export const SURFACED_TIERS = ['max', 'pro', 'flash', 'lite'];
23
- /** CC 档位词 → sema 档位(内置固定映射,镜像 core CC_MODEL_TIER_ALIASES;兼容层不可配)。 */
24
3
  export const CC_TIER_ALIASES = {
25
4
  fable: 'max',
26
5
  mythos: 'max',
@@ -28,9 +7,7 @@ export const CC_TIER_ALIASES = {
28
7
  sonnet: 'flash',
29
8
  haiku: 'lite',
30
9
  };
31
- /** 缺省默认档(clay [599]:默认档缺省 pro)。 */
32
10
  export const DEFAULT_TIER = 'pro';
33
- /** 各档一句话职责(档位 Hub/onboard 行描述共用;无 roster/role 词)。 */
34
11
  export const TIER_BLURBS = {
35
12
  ultra: 'reserved above max — binds when a stronger model lands',
36
13
  max: 'hardest problems — deep reasoning, big refactors',
@@ -39,10 +16,6 @@ export const TIER_BLURBS = {
39
16
  lite: 'cheapest — bulk classification, simple lookups',
40
17
  };
41
18
  export const isTier = (v) => typeof v === 'string' && TIER_ORDER.includes(v);
42
- /**
43
- * 组内解析某档 → 绑定 entry id(该档未绑则沿 TIER_ORDER 向下取第一个有绑定的档;全空
44
- * undefined)。fail-open 沿链向下,镜像 core expandTiers 语义。
45
- */
46
19
  export function resolveTierBinding(def, tier) {
47
20
  const direct = def.tiers[tier];
48
21
  if (direct)
@@ -1,44 +1,5 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/modelBudgetRule.ts 逐字搬入(零依赖,纯规则)。
3
- */
4
- /**
5
- * modelBudgetRule.ts — max-output-tokens 中央规则(clay 2026-07-15 拍板,F2 maxTokens 裁决批)。
6
- *
7
- * 裁决(逐字):
8
- * · 上下文窗口:预设/家族表能匹配用匹配值;匹配不上默认 200000(FALLBACK_CONTEXT_WINDOW)。
9
- * · maxTokens 默认:32000;上下文窗口 ≥500000 → 64000;恒受两道封顶:
10
- * ① per-model 已知 cap(providerPresets 精确表,inferFamily 第①层命中带 perModelCap);
11
- * ② 上下文窗口 ÷ 4(向下取整)。
12
- * · UI 四档(超集):16K / 32K(默认)/ 64K / 128K;档位 > 上下文窗口÷4 的禁用/跳过
13
- * (例:128K 上下文 → 顶 32K;1M → 全档可用)。
14
- * · env 显式值恒赢:CLAUDE_CODE_MAX_OUTPUT_TOKENS 映射与显式 MODEL_MAX_TOKENS 既有行为不动
15
- * (本模块只算默认,不碰覆盖层 —— 见 ccConfigFallback.applyModelEnvFamilyFallback)。
16
- *
17
- * CC 对照锚(有意偏离,记忆档 max-tokens-ruling-deviate-cc):CC 2.1.207 per-model 表
18
- * `max_output_tokens:{default:32000,upper:64000}`(源 13760)+ CLAUDE_CODE_MAX_OUTPUT_TOKENS env
19
- * 钳制(源 529278),无 UI 档位、无 ÷4 封顶。sema 面对任意三方模型/网关,家族表大数直接当默认会
20
- * 超供应商 cap(400)或单轮吃穿预算 —— 故默认收敛到 CC 口径 32K/64K,并加 ÷4 与 per-model 封顶;
21
- * UI 档位是超集便利面。
22
- *
23
- * 注意:providerPresets.json 精确表 / modelFamilies.json 家族表的 maxTokens 字段【保留】——
24
- * 只作 cap 参考(perModelCap / 显示),不再直接当默认 stamp 值。
25
- */
26
- /** 裁决:预设/家族都匹配不上时的上下文窗口默认(=CC 的 200k 口径)。 */
27
1
  export declare const FALLBACK_CONTEXT_WINDOW = 200000;
28
- /** UI 四档(超集):16K / 32K(默认)/ 64K / 128K。十进制(与 CC 32000/64000 同基)。 */
29
2
  export declare const MAXTOK_TIERS: readonly [16000, 32000, 64000, 128000];
30
- /**
31
- * 默认 max tokens = min( ctx>=500000 ? 64000 : 32000 , floor(ctx/4) , perModelCap ?? ∞ )。
32
- * contextWindow 传 null/undefined/非法 = 匹配不上 → 按 200000 算(→ 32000)。
33
- */
34
3
  export declare function defaultMaxTokensFor(contextWindow: number | null | undefined, perModelCap?: number | null): number;
35
- /**
36
- * 该上下文窗口下可用的 UI 档位(> ctx÷4 的禁用/跳过)。可能为空(ctx < 64000,如 32K 上下文
37
- * 连 16K 档都超 ÷4)—— UI 调用方对空列表降级(提示用 M 自由输入),规则函数不瞎补。
38
- */
39
4
  export declare function tierChoicesFor(contextWindow: number | null | undefined): number[];
40
- /**
41
- * 档位循环:当前值在档内 → 下一档(循环);不在档内(自由输入/家族值)→ 大于当前的最小档,
42
- * 都不大于则回第一档(与 modelCtxOverride.nextStep 同语义)。无可用档 → null(调用方降级)。
43
- */
44
5
  export declare function nextMaxTokTier(current: number | null | undefined, contextWindow: number | null | undefined): number | null;