@sema-agent/client-core 0.93.1 → 0.95.0

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 (321) hide show
  1. package/CHANGELOG.md +554 -0
  2. package/README.md +89 -55
  3. package/dist/adapt/arms.js +13 -11
  4. package/dist/adapt/panelTasks.js +4 -10
  5. package/dist/adapt/toolCards.js +2 -2
  6. package/dist/adapt/wireShapes.js +3 -8
  7. package/dist/adapter/activeRunSelfHeal.d.ts +8 -3
  8. package/dist/adapter/activeRunSelfHeal.js +20 -12
  9. package/dist/adapter/downstream/eventToSdkMessage.js +24 -17
  10. package/dist/adapter/downstream/terminalToSdkResult.js +13 -6
  11. package/dist/adapter/runStream.js +2 -1
  12. package/dist/adapter/types.d.ts +7 -0
  13. package/dist/adapter/types.js +15 -0
  14. package/dist/agentSession/backgroundView.js +5 -1
  15. package/dist/agentSession/engineAgentRegistryRead.js +2 -1
  16. package/dist/agentSession/engineSessionBackgroundStop.js +5 -3
  17. package/dist/agentsWireCaps.d.ts +17 -0
  18. package/dist/agentsWireCaps.js +111 -1
  19. package/dist/approvalDecidedByCapability.d.ts +0 -1
  20. package/dist/approvalDecidedByCapability.js +2 -7
  21. package/dist/approvalReachWire.d.ts +18 -0
  22. package/dist/approvalReachWire.js +58 -0
  23. package/dist/approvalsStreamLiveCapability.d.ts +0 -1
  24. package/dist/approvalsStreamLiveCapability.js +15 -14
  25. package/dist/atMostOnce.d.ts +8 -0
  26. package/dist/atMostOnce.js +36 -0
  27. package/dist/attachmentSeatCapability.d.ts +0 -1
  28. package/dist/attachmentSeatCapability.js +0 -3
  29. package/dist/attachmentsWireCaps.js +11 -6
  30. package/dist/bashExitReading.d.ts +10 -0
  31. package/dist/bashExitReading.js +12 -0
  32. package/dist/callerCwdCapability.d.ts +15 -0
  33. package/dist/callerCwdCapability.js +42 -0
  34. package/dist/centerWiringCapability.d.ts +1 -3
  35. package/dist/centerWiringCapability.js +18 -21
  36. package/dist/classifierStatus.js +4 -4
  37. package/dist/cloudConfigWireCaps.js +43 -21
  38. package/dist/compensations.js +1 -1
  39. package/dist/controlRouter.js +3 -10
  40. package/dist/coreValuePorts.d.ts +64 -1
  41. package/dist/coreValuePorts.js +30 -0
  42. package/dist/cycleOrder.d.ts +15 -0
  43. package/dist/cycleOrder.js +45 -0
  44. package/dist/decideFailureNote.js +4 -1
  45. package/dist/decideReceipt.d.ts +2 -1
  46. package/dist/decideReceipt.js +41 -13
  47. package/dist/declared/supportFloorDeclared.d.ts +1 -0
  48. package/dist/declared/supportFloorDeclared.js +5 -0
  49. package/dist/detachWire.d.ts +1 -4
  50. package/dist/detachWire.js +1 -1
  51. package/dist/deviceExecutorManagementCapability.d.ts +0 -1
  52. package/dist/deviceExecutorManagementCapability.js +36 -40
  53. package/dist/deviceFlowPolling.d.ts +5 -0
  54. package/dist/deviceFlowPolling.js +28 -0
  55. package/dist/deviceRebind.d.ts +88 -0
  56. package/dist/deviceRebind.js +242 -0
  57. package/dist/displayUntrusted.d.ts +1 -0
  58. package/dist/displayUntrusted.js +963 -30
  59. package/dist/engineAgentAbsence.d.ts +2 -2
  60. package/dist/engineAgentPanelStore.d.ts +8 -18
  61. package/dist/engineAgentPanelStore.js +19 -537
  62. package/dist/engineCapReader.d.ts +6 -6
  63. package/dist/engineCapReader.js +30 -43
  64. package/dist/engineCapsCache.d.ts +7 -2
  65. package/dist/engineCapsCache.js +64 -26
  66. package/dist/engineCredentialRequirement.d.ts +9 -0
  67. package/dist/engineCredentialRequirement.js +23 -0
  68. package/dist/engineEnvSourcing.d.ts +53 -0
  69. package/dist/engineEnvSourcing.js +81 -0
  70. package/dist/engineErrorCodes.d.ts +19 -4
  71. package/dist/engineErrorCodes.js +39 -21
  72. package/dist/engineIdentity.js +2 -0
  73. package/dist/engineNoticeCodes.d.ts +22 -2
  74. package/dist/engineNoticeCodes.js +73 -6
  75. package/dist/engineRefusedToolName.d.ts +1 -0
  76. package/dist/engineRefusedToolName.js +8 -0
  77. package/dist/engineWireSdk.js +2 -2
  78. package/dist/executionLaneCapability.d.ts +2 -3
  79. package/dist/executionLaneCapability.js +28 -28
  80. package/dist/fileHistoryCaptureCapability.d.ts +0 -1
  81. package/dist/fileHistoryCaptureCapability.js +13 -12
  82. package/dist/fileHistoryLegNotice.d.ts +14 -2
  83. package/dist/fileHistoryLegNotice.js +101 -15
  84. package/dist/fleet/fleetLedger.d.ts +2 -0
  85. package/dist/fleet/fleetLedger.js +74 -52
  86. package/dist/fleet/fleetProjection.d.ts +0 -3
  87. package/dist/fleet/fleetProjection.js +9 -16
  88. package/dist/fleetAgentPanelProjection.d.ts +4 -17
  89. package/dist/fleetAgentPanelProjection.js +7 -197
  90. package/dist/fleetAgentRowLike.d.ts +16 -0
  91. package/dist/fleetAgentRowLike.js +1 -0
  92. package/dist/gateOutcome.d.ts +2 -1
  93. package/dist/gateOutcome.js +33 -18
  94. package/dist/gateVocabulary.js +1 -1
  95. package/dist/generated/engineAskFaceTables.d.ts +3 -0
  96. package/dist/generated/engineAskFaceTables.js +12 -0
  97. package/dist/generated/engineFactTables.d.ts +4 -2
  98. package/dist/generated/engineFactTables.js +13 -0
  99. package/dist/generated/engineNoticeTables.d.ts +5 -0
  100. package/dist/generated/engineNoticeTables.js +7 -0
  101. package/dist/generated/sdkFactTables.d.ts +5 -0
  102. package/dist/generated/sdkFactTables.js +34 -0
  103. package/dist/generated/settingsSchemaFns.d.ts +10 -0
  104. package/dist/generated/settingsSchemaFns.js +22 -0
  105. package/dist/generated/settingsSchemaTables.d.ts +3 -0
  106. package/dist/generated/settingsSchemaTables.js +3 -0
  107. package/dist/headlessPermissionModeWire.d.ts +2 -2
  108. package/dist/headlessPermissionModeWire.js +11 -21
  109. package/dist/headlessReconnectWire.js +49 -20
  110. package/dist/hitl/allowRuleShadow.d.ts +1 -1
  111. package/dist/hitl/allowRuleShadow.js +49 -8
  112. package/dist/hitl/approvalCompleteParked.d.ts +1 -0
  113. package/dist/hitl/approvalCompleteParked.js +14 -0
  114. package/dist/hitl/approvalEndingCause.d.ts +5 -0
  115. package/dist/hitl/approvalEndingCause.js +61 -0
  116. package/dist/hitl/approvalHolds.d.ts +46 -0
  117. package/dist/hitl/approvalHolds.js +140 -0
  118. package/dist/hitl/approvalOutcomeNote.js +2 -1
  119. package/dist/hitl/approvalResolution.js +9 -1
  120. package/dist/hitl/approvalsFeed.js +23 -6
  121. package/dist/hitl/askGateWire.d.ts +2 -1
  122. package/dist/hitl/askGateWire.js +29 -1
  123. package/dist/hitl/automaticAnswerVerdict.d.ts +8 -2
  124. package/dist/hitl/automaticAnswerVerdict.js +71 -23
  125. package/dist/hitl/crashConverged.js +2 -0
  126. package/dist/hitl/decisionConflict.d.ts +3 -0
  127. package/dist/hitl/decisionConflict.js +43 -0
  128. package/dist/hitl/decisionRefusal.d.ts +23 -0
  129. package/dist/hitl/decisionRefusal.js +88 -0
  130. package/dist/hitl/frameRouter.d.ts +10 -0
  131. package/dist/hitl/frameRouter.js +71 -32
  132. package/dist/hitl/gateLedger.d.ts +8 -0
  133. package/dist/hitl/gateLedger.js +38 -0
  134. package/dist/hitl/hitlBridge.d.ts +14 -3
  135. package/dist/hitl/hitlBridge.js +75 -62
  136. package/dist/hitl/hitlHostSurface.d.ts +3 -0
  137. package/dist/hitl/hitlHostSurface.js +17 -15
  138. package/dist/hitl/livePendingAsk.d.ts +16 -6
  139. package/dist/hitl/livePendingAsk.js +36 -4
  140. package/dist/hitl/localAllowRule.js +2 -1
  141. package/dist/hitl/noAllowCause.d.ts +9 -0
  142. package/dist/hitl/noAllowCause.js +26 -0
  143. package/dist/hitl/parkExpiryJudgements.d.ts +19 -0
  144. package/dist/hitl/parkExpiryJudgements.js +46 -0
  145. package/dist/hitl/parkResolver.d.ts +3 -7
  146. package/dist/hitl/parkResolver.js +55 -28
  147. package/dist/hitl/parkRowBirthWait.js +2 -1
  148. package/dist/hitl/persistedRulesWire.d.ts +6 -1
  149. package/dist/hitl/persistedRulesWire.js +16 -4
  150. package/dist/hitl/planReviewWire.d.ts +2 -3
  151. package/dist/hitl/planReviewWire.js +86 -39
  152. package/dist/hitl/replayedApproval.d.ts +8 -0
  153. package/dist/hitl/replayedApproval.js +125 -10
  154. package/dist/hitl/resumeRunningCard.d.ts +2 -0
  155. package/dist/hitl/resumeRunningCard.js +15 -4
  156. package/dist/hitl/sessionPolicyDeliverable.d.ts +1 -1
  157. package/dist/hitl/sessionPolicyDeliverable.js +3 -8
  158. package/dist/hitl/sessionPolicyWire.js +1 -1
  159. package/dist/hitl/toolApprovalWire.d.ts +50 -5
  160. package/dist/hitl/toolApprovalWire.js +368 -56
  161. package/dist/hooksWireCaps.js +38 -6
  162. package/dist/host.d.ts +5 -0
  163. package/dist/host.js +3 -1
  164. package/dist/hostCallbackGuard.d.ts +1 -0
  165. package/dist/hostCallbackGuard.js +25 -0
  166. package/dist/humanTurnRead.d.ts +15 -1
  167. package/dist/humanTurnRead.js +28 -2
  168. package/dist/index.d.ts +45 -14
  169. package/dist/index.js +33 -12
  170. package/dist/interactiveInterrupt.d.ts +8 -0
  171. package/dist/interactiveInterrupt.js +54 -0
  172. package/dist/limitsWire.d.ts +5 -1
  173. package/dist/limitsWire.js +51 -13
  174. package/dist/liveModelCatalog.d.ts +109 -0
  175. package/dist/liveModelCatalog.js +344 -18
  176. package/dist/mcpEngineLeg.d.ts +25 -0
  177. package/dist/mcpEngineLeg.js +71 -15
  178. package/dist/mcpPanel.js +2 -1
  179. package/dist/mcpProbeCapability.d.ts +0 -1
  180. package/dist/mcpProbeCapability.js +13 -12
  181. package/dist/mcpReconnect.d.ts +1 -3
  182. package/dist/mcpReconnect.js +20 -10
  183. package/dist/memoryComplianceCapability.d.ts +0 -1
  184. package/dist/memoryComplianceCapability.js +14 -13
  185. package/dist/memoryOriginCapability.d.ts +0 -1
  186. package/dist/memoryOriginCapability.js +14 -13
  187. package/dist/memoryVerbsWire.d.ts +1 -1
  188. package/dist/memoryVerbsWire.js +4 -0
  189. package/dist/model/liveCatalogShape.d.ts +14 -0
  190. package/dist/model/liveCatalogShape.js +71 -0
  191. package/dist/model/modelSupplyRules.d.ts +1 -0
  192. package/dist/model/modelSupplyRules.js +30 -9
  193. package/dist/model/modelsPolicy.d.ts +21 -0
  194. package/dist/model/modelsPolicy.js +90 -0
  195. package/dist/modelIdentityResolvability.d.ts +4 -2
  196. package/dist/modelIdentityResolvability.js +25 -5
  197. package/dist/modelSwitchFallback.d.ts +69 -0
  198. package/dist/modelSwitchFallback.js +206 -0
  199. package/dist/notifications.js +12 -11
  200. package/dist/outputStyleSeatCapability.d.ts +15 -0
  201. package/dist/outputStyleSeatCapability.js +42 -0
  202. package/dist/ownKey.d.ts +7 -0
  203. package/dist/ownKey.js +58 -0
  204. package/dist/panelReduce.d.ts +114 -0
  205. package/dist/panelReduce.js +1135 -0
  206. package/dist/panelStateHolder.d.ts +17 -0
  207. package/dist/panelStateHolder.js +201 -0
  208. package/dist/peerLaneCapability.d.ts +0 -1
  209. package/dist/peerLaneCapability.js +15 -14
  210. package/dist/permissionModesCapability.d.ts +0 -1
  211. package/dist/permissionModesCapability.js +5 -10
  212. package/dist/permissionRuleIssue.js +1 -1
  213. package/dist/permissionRulesWriteCapability.d.ts +0 -1
  214. package/dist/permissionRulesWriteCapability.js +15 -14
  215. package/dist/permissionsAllowGrantCapability.d.ts +2 -1
  216. package/dist/permissionsAllowGrantCapability.js +35 -19
  217. package/dist/permissionsDeclaration.d.ts +16 -1
  218. package/dist/permissionsDeclaration.js +142 -15
  219. package/dist/printToolResultFrame.js +2 -10
  220. package/dist/promptDelivery.js +0 -8
  221. package/dist/protocolSegment.d.ts +1 -0
  222. package/dist/protocolSegment.js +13 -1
  223. package/dist/request/taskRequest.d.ts +11 -3
  224. package/dist/request/taskRequest.js +13 -1
  225. package/dist/resultFrameKeys.d.ts +4 -0
  226. package/dist/resultFrameKeys.js +13 -0
  227. package/dist/resumeRefusalCopy.d.ts +18 -1
  228. package/dist/resumeRefusalCopy.js +132 -31
  229. package/dist/retryStatus.js +6 -4
  230. package/dist/rewindArchiveCapability.d.ts +2 -1
  231. package/dist/rewindArchiveCapability.js +28 -15
  232. package/dist/rewindEngineAction.d.ts +21 -0
  233. package/dist/rewindEngineAction.js +36 -0
  234. package/dist/rewindWireCaps.d.ts +2 -1
  235. package/dist/rewindWireCaps.js +1 -0
  236. package/dist/{hitl/rosterMountedNames.d.ts → rosterMountedNames.d.ts} +1 -1
  237. package/dist/runCancelContext.js +2 -1
  238. package/dist/runTerminal.d.ts +0 -11
  239. package/dist/runTerminal.js +4 -27
  240. package/dist/sdkRegistryTransit.d.ts +2 -1
  241. package/dist/sdkRegistryTransit.js +1 -0
  242. package/dist/sealedKeyCapability.d.ts +0 -1
  243. package/dist/sealedKeyCapability.js +19 -20
  244. package/dist/seatContract.d.ts +85 -28
  245. package/dist/seatContract.js +512 -148
  246. package/dist/sessionIdSegment.d.ts +1 -0
  247. package/dist/sessionIdSegment.js +11 -0
  248. package/dist/sessionMemoryErase.d.ts +1 -1
  249. package/dist/sessionMemoryErase.js +6 -1
  250. package/dist/sessionMemoryStatus.js +3 -2
  251. package/dist/sessionPolicyCapability.d.ts +0 -1
  252. package/dist/sessionPolicyCapability.js +14 -13
  253. package/dist/sessionReadRedactionCapability.d.ts +15 -0
  254. package/dist/sessionReadRedactionCapability.js +42 -0
  255. package/dist/sessionSyncFileHistoryCapability.d.ts +0 -1
  256. package/dist/sessionSyncFileHistoryCapability.js +13 -12
  257. package/dist/skillToolListsCapability.d.ts +0 -1
  258. package/dist/skillToolListsCapability.js +13 -12
  259. package/dist/skillsWireCaps.d.ts +4 -0
  260. package/dist/skillsWireCaps.js +66 -1
  261. package/dist/sqlEngineCapability.d.ts +0 -1
  262. package/dist/sqlEngineCapability.js +21 -21
  263. package/dist/steerPriorityCapability.d.ts +0 -1
  264. package/dist/steerPriorityCapability.js +18 -19
  265. package/dist/storePostureCapability.d.ts +1 -1
  266. package/dist/storePostureCapability.js +16 -16
  267. package/dist/streamDrainingLegs.d.ts +6 -0
  268. package/dist/streamDrainingLegs.js +23 -0
  269. package/dist/subagent/agentStateDetail.d.ts +1 -0
  270. package/dist/subagent/agentStateDetail.js +41 -0
  271. package/dist/subagent/engineCompactWire.d.ts +15 -0
  272. package/dist/subagent/engineCompactWire.js +82 -45
  273. package/dist/subagent/engineDelegatedPrompt.js +10 -6
  274. package/dist/subagent/engineSubagentOutput.d.ts +0 -1
  275. package/dist/subagent/engineSubagentOutput.js +5 -20
  276. package/dist/subagent/engineSubagentTail.d.ts +0 -1
  277. package/dist/subagent/engineSubagentTail.js +7 -32
  278. package/dist/subagentContentStore.js +3 -3
  279. package/dist/supportFloor.js +2 -5
  280. package/dist/taskRequestWords.d.ts +2 -4
  281. package/dist/taskRequestWords.js +3 -2
  282. package/dist/terminalStatuses.d.ts +30 -0
  283. package/dist/terminalStatuses.js +67 -0
  284. package/dist/toolResult.d.ts +5 -0
  285. package/dist/toolResult.js +88 -36
  286. package/dist/types/engineState.d.ts +2 -1
  287. package/dist/usageAnalytics.d.ts +146 -0
  288. package/dist/usageAnalytics.js +311 -0
  289. package/dist/userAttachmentEnvelope.d.ts +22 -1
  290. package/dist/userAttachmentEnvelope.js +90 -2
  291. package/dist/userInvokedSkillsCapability.d.ts +0 -1
  292. package/dist/userInvokedSkillsCapability.js +13 -12
  293. package/dist/webSearchBackendCapability.d.ts +0 -1
  294. package/dist/webSearchBackendCapability.js +20 -19
  295. package/dist/webSearchWireCaps.js +3 -11
  296. package/dist/wireErrorTriage.d.ts +11 -0
  297. package/dist/wireErrorTriage.js +35 -0
  298. package/dist/wireFailureShape.d.ts +10 -0
  299. package/dist/wireFailureShape.js +72 -5
  300. package/dist/wireRefusalCopy.d.ts +6 -1
  301. package/dist/wireRefusalCopy.js +23 -25
  302. package/dist/wiringInstructionsAttribution.d.ts +10 -0
  303. package/dist/wiringInstructionsAttribution.js +67 -0
  304. package/dist/workflowClient.js +19 -2
  305. package/dist/workflowsJournalCapability.d.ts +0 -1
  306. package/dist/workflowsJournalCapability.js +13 -12
  307. package/dist/writeProtectionCapability.d.ts +0 -1
  308. package/dist/writeProtectionCapability.js +26 -26
  309. package/docs/INTEGRATION-CLIENTS.md +1733 -52
  310. package/package.json +5 -5
  311. package/dist/askSurvivesStandingAnswer.d.ts +0 -13
  312. package/dist/askSurvivesStandingAnswer.js +0 -53
  313. package/dist/engineCapsGenerationGuard.d.ts +0 -4
  314. package/dist/engineCapsGenerationGuard.js +0 -19
  315. package/dist/hitl/askSurvivesPosture.d.ts +0 -20
  316. package/dist/hitl/askSurvivesPosture.js +0 -48
  317. package/dist/panelRunningHistory.d.ts +0 -22
  318. package/dist/panelRunningHistory.js +0 -82
  319. package/dist/registryConflict.d.ts +0 -3
  320. package/dist/registryConflict.js +0 -44
  321. /package/dist/{hitl/rosterMountedNames.js → rosterMountedNames.js} +0 -0
@@ -16,12 +16,16 @@ export interface HeadlessLimits {
16
16
  export type LimitsParseResult = {
17
17
  ok: true;
18
18
  limits?: HeadlessLimits;
19
- flaggedFlags: string[];
20
19
  } | {
21
20
  ok: false;
22
21
  error: string;
23
22
  };
24
23
  export declare function parseLimitsArgv(argv: string[]): LimitsParseResult;
24
+ export declare function explicitLimitFlagNames(parsed: LimitsParseResult): string[];
25
+ export declare function limitsSupportNotice(reading: {
26
+ observed: boolean;
27
+ version?: unknown;
28
+ }, flags: readonly string[]): string | undefined;
25
29
  export type HeadlessEnvLimitsResult = {
26
30
  ok: true;
27
31
  limits: HeadlessLimits | undefined;
@@ -1,5 +1,7 @@
1
1
  import { hostEnv } from './hostEnv.js';
2
2
  import { lastFlagValue } from './argvFlagValue.js';
3
+ import { engineVersionTier, SUPPORT_FLOOR } from './supportFloor.js';
4
+ import { readThrownSlot } from './wireFailureShape.js';
3
5
  export const HEADLESS_DEADLINE_ENV = 'SEMA_HEADLESS_DEADLINE_SEC';
4
6
  export const HEADLESS_MAX_TURNS_ENV = 'SEMA_HEADLESS_MAX_TURNS';
5
7
  export const HEADLESS_MAX_TOKENS_ENV = 'SEMA_HEADLESS_MAX_TOKENS';
@@ -10,6 +12,11 @@ export const MAX_TURNS_MAX = Number.MAX_SAFE_INTEGER;
10
12
  export const MAX_TOKENS_MIN = 1;
11
13
  export const MAX_TOKENS_MAX = Number.MAX_SAFE_INTEGER;
12
14
  const SEC_TO_MS = 1_000;
15
+ const LIMIT_FLAG_OF_KEY = {
16
+ maxWalltimeMs: '--deadline',
17
+ maxTurns: '--max-turns',
18
+ maxOutputTokens: '--max-tokens',
19
+ };
13
20
  const DEADLINE_USAGE = `sema: --deadline expects a whole number of seconds between ${DEADLINE_SEC_MIN} and ${DEADLINE_SEC_MAX}.\n` +
14
21
  ' --deadline <sec> wall-clock budget for this run (sema superset — no upstream equivalent):\n' +
15
22
  ' reaching it ends the run LOUDLY (failed / limits.max_walltime_exceeded)\n' +
@@ -39,36 +46,67 @@ function hasAnyLimit(l) {
39
46
  }
40
47
  export function parseLimitsArgv(argv) {
41
48
  const limits = {};
42
- const flaggedFlags = [];
43
- const dl = lastFlagValue(argv, '--deadline');
49
+ const dl = lastFlagValue(argv, LIMIT_FLAG_OF_KEY.maxWalltimeMs);
44
50
  if (dl.present) {
45
51
  const n = dl.raw !== undefined ? parseIntInDomain(dl.raw, DEADLINE_SEC_MIN, DEADLINE_SEC_MAX) : null;
46
52
  if (n === null)
47
53
  return { ok: false, error: DEADLINE_USAGE };
48
54
  limits.maxWalltimeMs = n * SEC_TO_MS;
49
- flaggedFlags.push('--deadline');
50
55
  }
51
- const mt = lastFlagValue(argv, '--max-turns');
56
+ const mt = lastFlagValue(argv, LIMIT_FLAG_OF_KEY.maxTurns);
52
57
  if (mt.present) {
53
58
  const n = mt.raw !== undefined ? parseIntInDomain(mt.raw, MAX_TURNS_MIN, MAX_TURNS_MAX) : null;
54
59
  if (n === null)
55
60
  return { ok: false, error: MAX_TURNS_USAGE };
56
61
  limits.maxTurns = n;
57
- flaggedFlags.push('--max-turns');
58
62
  }
59
- const mk = lastFlagValue(argv, '--max-tokens');
63
+ const mk = lastFlagValue(argv, LIMIT_FLAG_OF_KEY.maxOutputTokens);
60
64
  if (mk.present) {
61
65
  const n = mk.raw !== undefined ? parseIntInDomain(mk.raw, MAX_TOKENS_MIN, MAX_TOKENS_MAX) : null;
62
66
  if (n === null)
63
67
  return { ok: false, error: MAX_TOKENS_USAGE };
64
68
  limits.maxOutputTokens = n;
65
- flaggedFlags.push('--max-tokens');
66
69
  }
67
- return {
68
- ok: true,
69
- ...(flaggedFlags.length > 0 ? { limits } : {}),
70
- flaggedFlags,
71
- };
70
+ return { ok: true, ...(hasAnyLimit(limits) ? { limits } : {}) };
71
+ }
72
+ export function explicitLimitFlagNames(parsed) {
73
+ if (typeof parsed !== 'object' || parsed === null || parsed.ok !== true)
74
+ return [];
75
+ const limits = parsed.limits;
76
+ if (typeof limits !== 'object' || limits === null)
77
+ return [];
78
+ return Object.keys(LIMIT_FLAG_OF_KEY).filter((k) => limits[k] !== undefined).map((k) => LIMIT_FLAG_OF_KEY[k]);
79
+ }
80
+ const LIMIT_FLAGS_READ_MAX = 64;
81
+ function limitFlagWordsIn(flags) {
82
+ const all = Object.values(LIMIT_FLAG_OF_KEY);
83
+ if (typeof flags !== 'object' || flags === null)
84
+ return all;
85
+ const length = readThrownSlot(flags, 'length');
86
+ if (typeof length !== 'number' || !Number.isInteger(length) || length <= 0)
87
+ return all;
88
+ const given = new Set();
89
+ for (let i = 0; i < Math.min(length, LIMIT_FLAGS_READ_MAX); i++)
90
+ given.add(readThrownSlot(flags, String(i)));
91
+ const shown = all.filter((w) => given.has(w));
92
+ return shown.length > 0 ? shown : all;
93
+ }
94
+ export function limitsSupportNotice(reading, flags) {
95
+ if (typeof reading !== 'object' || reading === null)
96
+ return undefined;
97
+ if (readThrownSlot(reading, 'observed') !== true)
98
+ return undefined;
99
+ const rawVersion = readThrownSlot(reading, 'version');
100
+ const version = typeof rawVersion === 'string' ? rawVersion : undefined;
101
+ const tier = engineVersionTier(version);
102
+ if (tier === 'engine')
103
+ return undefined;
104
+ const shown = limitFlagWordsIn(flags);
105
+ const text = shown.join(' / ');
106
+ if (tier === 'legacy') {
107
+ return `[sema] The engine reports version ${String(version)}, older than ${SUPPORT_FLOOR.server} (the oldest engine this client supports); it may ignore ${text}.`;
108
+ }
109
+ return `[sema] The engine did not report a version this client can read, so it cannot be confirmed that it honors ${text}; ${shown.length > 1 ? 'they were' : 'it was'} sent anyway.`;
72
110
  }
73
111
  export function headlessLimitsFromEnv(env = hostEnv()) {
74
112
  const out = {};
@@ -109,5 +147,5 @@ export function limitsForPrint(argv, env = hostEnv()) {
109
147
  if (!fromEnv.ok)
110
148
  return { ok: false, error: fromEnv.error };
111
149
  const merged = { ...(fromEnv.limits ?? {}), ...(parsed.limits ?? {}) };
112
- return { ok: true, ...(hasAnyLimit(merged) ? { limits: merged } : {}), flaggedFlags: parsed.flaggedFlags };
150
+ return { ok: true, ...(hasAnyLimit(merged) ? { limits: merged } : {}) };
113
151
  }
@@ -1,3 +1,4 @@
1
+ import type { AgentClient } from '@sema-agent/sdk';
1
2
  export interface LiveModelInfo {
2
3
  name: string;
3
4
  id?: string;
@@ -5,11 +6,21 @@ export interface LiveModelInfo {
5
6
  reasoning?: boolean;
6
7
  vision?: boolean;
7
8
  routePairing?: string;
9
+ supportedEffortLevels?: string[];
10
+ contextWindow?: number;
11
+ maxOutputTokens?: number;
12
+ atMentionable?: boolean;
13
+ compat?: LiveModelCompat;
8
14
  [k: string]: unknown;
9
15
  }
10
16
  export interface LiveModelCatalog {
11
17
  models: LiveModelInfo[];
12
18
  default: string;
19
+ defaultModel?: {
20
+ readonly id: string;
21
+ readonly name?: string;
22
+ };
23
+ droppedEntries?: readonly LiveModelDroppedEntry[];
13
24
  }
14
25
  export declare function setLiveModelCatalog(next: LiveModelCatalog | null): void;
15
26
  export declare function setLiveModelCatalogRefresher(fn: (() => Promise<LiveModelCatalog | null>) | null): void;
@@ -18,9 +29,107 @@ export declare function getLiveModelCatalog(): LiveModelCatalog | null;
18
29
  export declare function normalizeLiveModelRef(ref: string): string;
19
30
  export type ImageVision = 'yes' | 'no' | 'unknown';
20
31
  export declare function imageVisionOf(model: string | undefined, catalog?: LiveModelCatalog | null): ImageVision;
32
+ export type EffortLevelsReading = {
33
+ readonly kind: 'clamped';
34
+ readonly levels: readonly string[];
35
+ } | {
36
+ readonly kind: 'not_clamped';
37
+ } | {
38
+ readonly kind: 'not_applicable';
39
+ } | {
40
+ readonly kind: 'unknown';
41
+ readonly why: 'no_catalog' | 'model_not_listed' | 'reasoning_unreported' | 'levels_malformed' | 'unreadable';
42
+ };
43
+ export declare function effortLevelsOf(model: string | undefined, catalog?: LiveModelCatalog | null): EffortLevelsReading;
44
+ export declare function effortLevelHonored(reading: EffortLevelsReading, level: string): 'yes' | 'no' | 'unknown';
21
45
  export declare function liveDefaultModelName(): string | null;
46
+ type SdkModelsListResult = Awaited<ReturnType<AgentClient['models']['list']>>;
47
+ type SdkDroppedEntry = SdkModelsListResult extends {
48
+ droppedEntries?: ReadonlyArray<infer E>;
49
+ } ? E : never;
50
+ type SdkModelInfo = SdkModelsListResult extends {
51
+ models: ReadonlyArray<infer M>;
52
+ } ? M : never;
53
+ export type LiveModelCompat = NonNullable<SdkModelInfo extends {
54
+ compat?: infer C;
55
+ } ? C : never>;
56
+ export type LiveModelDroppedEntry = SdkDroppedEntry extends {
57
+ reasonCode: infer R;
58
+ } ? Omit<SdkDroppedEntry, 'reasonCode'> & {
59
+ readonly reasonCode: R | (string & {});
60
+ } : SdkDroppedEntry;
61
+ export type ModelDroppedEntriesReading = {
62
+ readonly kind: 'reported';
63
+ readonly entries: readonly LiveModelDroppedEntry[];
64
+ readonly unreadable: number;
65
+ } | {
66
+ readonly kind: 'not_reported';
67
+ } | {
68
+ readonly kind: 'unknown';
69
+ readonly why: 'no_catalog' | 'malformed' | 'unreadable';
70
+ };
71
+ export declare function droppedModelEntriesOf(catalog?: LiveModelCatalog | null): ModelDroppedEntriesReading;
22
72
  export interface RoutePairingVerdict {
23
73
  verdict: 'ok' | 'broken' | 'unknown';
24
74
  posture?: string;
25
75
  }
26
76
  export declare function routePairingVerdict(v: unknown): RoutePairingVerdict;
77
+ export type LiveModelCatalogReading = {
78
+ readonly kind: 'read';
79
+ readonly catalog: LiveModelCatalog;
80
+ readonly unreadableRows: number;
81
+ readonly defaultModelMalformed?: true;
82
+ } | {
83
+ readonly kind: 'unreadable';
84
+ readonly why: 'not_an_object' | 'models_not_array' | 'default_missing' | 'unreadable';
85
+ };
86
+ export declare function readLiveModelCatalog(body: unknown): LiveModelCatalogReading;
87
+ export type LiveDefaultModelReading = {
88
+ readonly kind: 'listed';
89
+ readonly name: string;
90
+ readonly from: 'defaultModel.name' | 'defaultModel.id';
91
+ } | {
92
+ readonly kind: 'not_listed';
93
+ readonly id: string;
94
+ } | {
95
+ readonly kind: 'unknown';
96
+ readonly why: 'no_catalog' | 'not_reported' | 'unreadable';
97
+ };
98
+ export declare function liveDefaultModelOf(catalog?: LiveModelCatalog | null): LiveDefaultModelReading;
99
+ export type AtMentionReading = {
100
+ readonly kind: 'allowed';
101
+ } | {
102
+ readonly kind: 'refused';
103
+ } | {
104
+ readonly kind: 'not_governed';
105
+ } | {
106
+ readonly kind: 'unknown';
107
+ readonly why: 'no_catalog' | 'model_not_listed' | 'malformed' | 'unreadable';
108
+ };
109
+ export declare function atMentionOf(model: string | undefined, catalog?: LiveModelCatalog | null): AtMentionReading;
110
+ export type ModelCompatReading = {
111
+ readonly kind: 'declared';
112
+ readonly compat: Readonly<LiveModelCompat>;
113
+ } | {
114
+ readonly kind: 'not_declared';
115
+ } | {
116
+ readonly kind: 'unknown';
117
+ readonly why: 'no_catalog' | 'model_not_listed' | 'malformed' | 'unreadable';
118
+ };
119
+ export declare function modelCompatOf(model: string | undefined, catalog?: LiveModelCatalog | null): ModelCompatReading;
120
+ export interface LiveModelRowView {
121
+ readonly name: string;
122
+ readonly id?: string;
123
+ readonly provider?: string;
124
+ readonly reasoning?: boolean;
125
+ readonly contextWindow?: number;
126
+ readonly maxOutputTokens?: number;
127
+ readonly isDefault: boolean;
128
+ readonly vision: ImageVision;
129
+ readonly effort: EffortLevelsReading;
130
+ readonly routePairing: RoutePairingVerdict;
131
+ readonly atMention: AtMentionReading;
132
+ readonly compat: ModelCompatReading;
133
+ }
134
+ export declare function liveModelRowsOf(catalog?: LiveModelCatalog | null): readonly LiveModelRowView[] | null;
135
+ export {};
@@ -1,3 +1,4 @@
1
+ import { frozenJsonCopyOf, liveDefaultModelCopy, liveModelRowCopy } from './model/liveCatalogShape.js';
1
2
  let catalog = null;
2
3
  let refresher = null;
3
4
  export function setLiveModelCatalog(next) {
@@ -42,6 +43,12 @@ function ownDataOf(o, key) {
42
43
  }
43
44
  }
44
45
  function liveModelRowOf(cat, ref) {
46
+ const rows = catalogRowsOf(cat);
47
+ if (rows === undefined)
48
+ return undefined;
49
+ return rows.find((row) => ownDataOf(row, 'name') === ref) ?? rows.find((row) => ownDataOf(row, 'id') === ref);
50
+ }
51
+ function catalogRowsOf(cat) {
45
52
  const models = ownDataOf(cat, 'models');
46
53
  if (!Array.isArray(models))
47
54
  return undefined;
@@ -54,35 +61,172 @@ function liveModelRowOf(cat, ref) {
54
61
  if (row !== null && typeof row === 'object')
55
62
  rows.push(row);
56
63
  }
57
- return rows.find((row) => ownDataOf(row, 'name') === ref) ?? rows.find((row) => ownDataOf(row, 'id') === ref);
64
+ return rows;
65
+ }
66
+ function targetRowOf(model, cat) {
67
+ if (model !== undefined && typeof model !== 'string')
68
+ return { kind: 'none', why: 'unreadable' };
69
+ if (cat === null || typeof cat !== 'object' || Array.isArray(cat))
70
+ return { kind: 'none', why: 'no_catalog' };
71
+ let target = model !== undefined && model.length > 0 ? model : undefined;
72
+ if (target === undefined) {
73
+ const d = liveDefaultModelOf(cat);
74
+ if (d.kind === 'unknown' && d.why === 'unreadable')
75
+ return { kind: 'none', why: 'unreadable' };
76
+ if (d.kind !== 'listed')
77
+ return { kind: 'none', why: 'model_not_listed' };
78
+ target = d.name;
79
+ }
80
+ const row = liveModelRowOf(cat, target);
81
+ return row === undefined ? { kind: 'none', why: 'model_not_listed' } : { kind: 'row', row };
58
82
  }
59
83
  export function imageVisionOf(model, catalog = getLiveModelCatalog()) {
60
84
  try {
61
- if (model !== undefined && typeof model !== 'string')
62
- return 'unknown';
63
- if (catalog === null || typeof catalog !== 'object' || Array.isArray(catalog))
64
- return 'unknown';
65
- let target = model !== undefined && model.length > 0 ? model : undefined;
66
- if (target === undefined) {
67
- const def = ownDataOf(catalog, 'default');
68
- target = typeof def === 'string' && def.length > 0 ? def : undefined;
69
- }
70
- if (target === undefined)
85
+ const target = targetRowOf(model, catalog);
86
+ if (target.kind !== 'row')
71
87
  return 'unknown';
72
- const row = liveModelRowOf(catalog, target);
73
- if (row === undefined)
74
- return 'unknown';
75
- const vision = ownDataOf(row, 'vision');
88
+ const vision = ownDataOf(target.row, 'vision');
76
89
  return vision === true ? 'yes' : vision === false ? 'no' : 'unknown';
77
90
  }
78
91
  catch {
79
92
  return 'unknown';
80
93
  }
81
94
  }
95
+ const NOT_CLAMPED = Object.freeze({ kind: 'not_clamped' });
96
+ const NOT_APPLICABLE = Object.freeze({ kind: 'not_applicable' });
97
+ const unknownEffort = (why) => Object.freeze({ kind: 'unknown', why });
98
+ export function effortLevelsOf(model, catalog = getLiveModelCatalog()) {
99
+ try {
100
+ const target = targetRowOf(model, catalog);
101
+ if (target.kind !== 'row')
102
+ return unknownEffort(target.why);
103
+ const row = target.row;
104
+ const levels = ownDataOf(row, 'supportedEffortLevels');
105
+ if (levels !== undefined) {
106
+ if (!Array.isArray(levels))
107
+ return unknownEffort('levels_malformed');
108
+ const n = ownDataOf(levels, 'length');
109
+ if (typeof n !== 'number' || !Number.isSafeInteger(n) || n <= 0)
110
+ return unknownEffort('levels_malformed');
111
+ const out = [];
112
+ for (let i = 0; i < n; i += 1) {
113
+ const w = ownDataOf(levels, String(i));
114
+ if (typeof w !== 'string' || w.length === 0)
115
+ return unknownEffort('levels_malformed');
116
+ if (!out.includes(w))
117
+ out.push(w);
118
+ }
119
+ return Object.freeze({ kind: 'clamped', levels: Object.freeze(out) });
120
+ }
121
+ const reasoning = ownDataOf(row, 'reasoning');
122
+ if (reasoning === true)
123
+ return NOT_CLAMPED;
124
+ if (reasoning === false)
125
+ return NOT_APPLICABLE;
126
+ return unknownEffort('reasoning_unreported');
127
+ }
128
+ catch {
129
+ return unknownEffort('unreadable');
130
+ }
131
+ }
132
+ export function effortLevelHonored(reading, level) {
133
+ if (typeof level !== 'string' || level.length === 0)
134
+ return 'unknown';
135
+ switch (reading?.kind) {
136
+ case 'clamped':
137
+ return Array.isArray(reading.levels) && reading.levels.includes(level) ? 'yes' : 'no';
138
+ case 'not_clamped':
139
+ return 'yes';
140
+ case 'not_applicable':
141
+ return 'no';
142
+ default:
143
+ return 'unknown';
144
+ }
145
+ }
82
146
  export function liveDefaultModelName() {
83
- if (!catalog?.default)
84
- return null;
85
- return normalizeLiveModelRef(catalog.default);
147
+ const d = liveDefaultModelOf(catalog);
148
+ return d.kind === 'listed' ? d.name : d.kind === 'not_listed' ? d.id : null;
149
+ }
150
+ const notReportedDropped = () => Object.freeze({ kind: 'not_reported' });
151
+ const unknownDropped = (why) => Object.freeze({ kind: 'unknown', why });
152
+ function ownDataCopy(o) {
153
+ const out = {};
154
+ for (const k of Object.keys(o)) {
155
+ const d = Object.getOwnPropertyDescriptor(o, k);
156
+ if (d === undefined || !('value' in d))
157
+ return undefined;
158
+ Object.defineProperty(out, k, { value: d.value, enumerable: true, writable: true, configurable: true });
159
+ }
160
+ return out;
161
+ }
162
+ function isDroppedRow(r) {
163
+ const index = r.index;
164
+ if (typeof index !== 'number' || !Number.isSafeInteger(index) || index < 0)
165
+ return false;
166
+ if (typeof r.reasonCode !== 'string' || r.reasonCode.length === 0)
167
+ return false;
168
+ if (!Object.hasOwn(r, 'identity'))
169
+ return true;
170
+ const id = r.identity;
171
+ if (id === null || typeof id !== 'object' || Array.isArray(id) || !Object.isFrozen(id))
172
+ return false;
173
+ const idr = id;
174
+ for (const k of ['name', 'id'])
175
+ if (Object.hasOwn(idr, k) && (typeof idr[k] !== 'string' || idr[k] === ''))
176
+ return false;
177
+ return !Object.hasOwn(idr, 'enabled') || typeof idr.enabled === 'boolean';
178
+ }
179
+ function droppedRowOf(row) {
180
+ if (row === null || typeof row !== 'object' || Array.isArray(row))
181
+ return undefined;
182
+ const copy = ownDataCopy(row);
183
+ if (copy === undefined)
184
+ return undefined;
185
+ if (Object.hasOwn(copy, 'identity')) {
186
+ const id = copy.identity;
187
+ if (id === null || typeof id !== 'object' || Array.isArray(id))
188
+ return undefined;
189
+ const idCopy = ownDataCopy(id);
190
+ if (idCopy === undefined)
191
+ return undefined;
192
+ copy.identity = Object.freeze(idCopy);
193
+ }
194
+ if (!isDroppedRow(copy))
195
+ return undefined;
196
+ return Object.freeze(copy);
197
+ }
198
+ export function droppedModelEntriesOf(catalog = getLiveModelCatalog()) {
199
+ try {
200
+ if (catalog === null || typeof catalog !== 'object' || Array.isArray(catalog))
201
+ return unknownDropped('no_catalog');
202
+ if (!Object.hasOwn(catalog, 'droppedEntries'))
203
+ return notReportedDropped();
204
+ const d = Object.getOwnPropertyDescriptor(catalog, 'droppedEntries');
205
+ if (d === undefined || !('value' in d))
206
+ return unknownDropped('unreadable');
207
+ const raw = d.value;
208
+ if (raw === undefined)
209
+ return notReportedDropped();
210
+ if (!Array.isArray(raw))
211
+ return unknownDropped('malformed');
212
+ const n = ownDataOf(raw, 'length');
213
+ if (typeof n !== 'number' || !Number.isSafeInteger(n) || n < 0)
214
+ return unknownDropped('unreadable');
215
+ const entries = [];
216
+ let unreadable = 0;
217
+ for (let i = 0; i < n; i += 1) {
218
+ const rd = Object.getOwnPropertyDescriptor(raw, String(i));
219
+ const row = rd !== undefined && 'value' in rd ? droppedRowOf(rd.value) : undefined;
220
+ if (row === undefined)
221
+ unreadable += 1;
222
+ else
223
+ entries.push(row);
224
+ }
225
+ return Object.freeze({ kind: 'reported', entries: Object.freeze(entries), unreadable });
226
+ }
227
+ catch {
228
+ return unknownDropped('unreadable');
229
+ }
86
230
  }
87
231
  const ROUTE_PAIRING_OK = new Set(['ok:per-model', 'ok:paired', 'ok:unpinned', 'ok:keyless']);
88
232
  const ROUTE_PAIRING_BROKEN = new Set(['broken:credential_mismatch', 'broken:credential_missing']);
@@ -95,3 +239,185 @@ export function routePairingVerdict(v) {
95
239
  return { verdict: 'broken', posture: v };
96
240
  return { verdict: 'unknown', posture: v };
97
241
  }
242
+ const unreadableCatalog = (why) => Object.freeze({ kind: 'unreadable', why });
243
+ function envelopeKey(o, key) {
244
+ const d = Object.getOwnPropertyDescriptor(o, key);
245
+ if (d === undefined)
246
+ return { present: false };
247
+ if (!('value' in d))
248
+ throw new Error('accessor');
249
+ return { present: true, value: d.value };
250
+ }
251
+ export function readLiveModelCatalog(body) {
252
+ try {
253
+ if (body === null || typeof body !== 'object' || Array.isArray(body))
254
+ return unreadableCatalog('not_an_object');
255
+ const modelsKey = envelopeKey(body, 'models');
256
+ const defaultKey = envelopeKey(body, 'default');
257
+ const defaultModelKey = envelopeKey(body, 'defaultModel');
258
+ const droppedKey = envelopeKey(body, 'droppedEntries');
259
+ const raw = modelsKey.present ? modelsKey.value : undefined;
260
+ if (!Array.isArray(raw))
261
+ return unreadableCatalog('models_not_array');
262
+ const def = defaultKey.present ? defaultKey.value : undefined;
263
+ if (typeof def !== 'string' || def.length === 0)
264
+ return unreadableCatalog('default_missing');
265
+ const n = envelopeKey(raw, 'length');
266
+ const len = n.present ? n.value : undefined;
267
+ if (typeof len !== 'number' || !Number.isSafeInteger(len) || len < 0)
268
+ return unreadableCatalog('unreadable');
269
+ const models = [];
270
+ const names = new Set();
271
+ let unreadableRows = 0;
272
+ for (let i = 0; i < len; i += 1) {
273
+ const d = Object.getOwnPropertyDescriptor(raw, String(i));
274
+ const row = d !== undefined && 'value' in d ? liveModelRowCopy(d.value) : undefined;
275
+ if (row === undefined || names.has(row.name)) {
276
+ unreadableRows += 1;
277
+ continue;
278
+ }
279
+ names.add(row.name);
280
+ models.push(row);
281
+ }
282
+ const out = { models: Object.freeze(models), default: def };
283
+ let defaultModelMalformed = false;
284
+ if (defaultModelKey.present && defaultModelKey.value !== undefined) {
285
+ const dm = liveDefaultModelCopy(defaultModelKey.value);
286
+ if (dm === undefined)
287
+ defaultModelMalformed = true;
288
+ else
289
+ out.defaultModel = dm;
290
+ }
291
+ if (droppedKey.present && droppedKey.value !== undefined) {
292
+ const dropped = droppedEntriesCopy(droppedKey.value);
293
+ out.droppedEntries = dropped;
294
+ }
295
+ return Object.freeze({ kind: 'read', catalog: Object.freeze(out), unreadableRows, ...(defaultModelMalformed ? { defaultModelMalformed: true } : {}) });
296
+ }
297
+ catch {
298
+ return unreadableCatalog('unreadable');
299
+ }
300
+ }
301
+ function droppedEntriesCopy(v) {
302
+ if (!Array.isArray(v))
303
+ return frozenJsonCopyOf(v) ?? null;
304
+ const n = Object.getOwnPropertyDescriptor(v, 'length')?.value;
305
+ if (typeof n !== 'number' || !Number.isSafeInteger(n) || n < 0)
306
+ return null;
307
+ const out = [];
308
+ for (let i = 0; i < n; i += 1) {
309
+ const d = Object.getOwnPropertyDescriptor(v, String(i));
310
+ out.push((d !== undefined && 'value' in d ? frozenJsonCopyOf(d.value) : undefined) ?? null);
311
+ }
312
+ return Object.freeze(out);
313
+ }
314
+ const nonEmptyString = (v) => (typeof v === 'string' && v.length > 0 ? v : undefined);
315
+ export function liveDefaultModelOf(catalog = getLiveModelCatalog()) {
316
+ try {
317
+ if (catalog === null || typeof catalog !== 'object' || Array.isArray(catalog))
318
+ return Object.freeze({ kind: 'unknown', why: 'no_catalog' });
319
+ const dm = liveDefaultModelCopy(ownDataOf(catalog, 'defaultModel'));
320
+ if (dm === undefined)
321
+ return Object.freeze({ kind: 'unknown', why: 'not_reported' });
322
+ const dmName = dm.name;
323
+ const dmId = dm.id;
324
+ if (dmName !== undefined && catalogRowsOf(catalog)?.some((row) => ownDataOf(row, 'name') === dmName) === true) {
325
+ return Object.freeze({ kind: 'listed', name: dmName, from: 'defaultModel.name' });
326
+ }
327
+ const row = catalogRowsOf(catalog)?.find((r) => ownDataOf(r, 'id') === dmId);
328
+ const name = row !== undefined ? nonEmptyString(ownDataOf(row, 'name')) : undefined;
329
+ return name !== undefined ? Object.freeze({ kind: 'listed', name, from: 'defaultModel.id' }) : Object.freeze({ kind: 'not_listed', id: dmId });
330
+ }
331
+ catch {
332
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
333
+ }
334
+ }
335
+ export function atMentionOf(model, catalog = getLiveModelCatalog()) {
336
+ try {
337
+ const target = targetRowOf(model, catalog);
338
+ if (target.kind !== 'row')
339
+ return Object.freeze({ kind: 'unknown', why: target.why });
340
+ const d = Object.getOwnPropertyDescriptor(target.row, 'atMentionable');
341
+ if (d === undefined)
342
+ return Object.freeze({ kind: 'not_governed' });
343
+ if (!('value' in d))
344
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
345
+ if (d.value === undefined)
346
+ return Object.freeze({ kind: 'not_governed' });
347
+ if (d.value === true)
348
+ return Object.freeze({ kind: 'allowed' });
349
+ if (d.value === false)
350
+ return Object.freeze({ kind: 'refused' });
351
+ return Object.freeze({ kind: 'unknown', why: 'malformed' });
352
+ }
353
+ catch {
354
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
355
+ }
356
+ }
357
+ export function modelCompatOf(model, catalog = getLiveModelCatalog()) {
358
+ try {
359
+ const target = targetRowOf(model, catalog);
360
+ if (target.kind !== 'row')
361
+ return Object.freeze({ kind: 'unknown', why: target.why });
362
+ const d = Object.getOwnPropertyDescriptor(target.row, 'compat');
363
+ if (d === undefined)
364
+ return Object.freeze({ kind: 'not_declared' });
365
+ if (!('value' in d))
366
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
367
+ if (d.value === undefined)
368
+ return Object.freeze({ kind: 'not_declared' });
369
+ if (d.value === null || typeof d.value !== 'object' || Array.isArray(d.value))
370
+ return Object.freeze({ kind: 'unknown', why: 'malformed' });
371
+ const copy = frozenJsonCopyOf(d.value);
372
+ if (copy === undefined || copy === null || typeof copy !== 'object')
373
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
374
+ if (Object.keys(copy).length === 0)
375
+ return Object.freeze({ kind: 'unknown', why: 'malformed' });
376
+ return Object.freeze({ kind: 'declared', compat: copy });
377
+ }
378
+ catch {
379
+ return Object.freeze({ kind: 'unknown', why: 'unreadable' });
380
+ }
381
+ }
382
+ const positiveFinite = (v) => (typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined);
383
+ export function liveModelRowsOf(catalog = getLiveModelCatalog()) {
384
+ try {
385
+ if (catalog === null || typeof catalog !== 'object' || Array.isArray(catalog))
386
+ return null;
387
+ const rows = catalogRowsOf(catalog);
388
+ if (rows === undefined)
389
+ return null;
390
+ const def = liveDefaultModelOf(catalog);
391
+ const seen = new Set();
392
+ const out = [];
393
+ for (const row of rows) {
394
+ const name = nonEmptyString(ownDataOf(row, 'name'));
395
+ if (name === undefined || seen.has(name))
396
+ continue;
397
+ seen.add(name);
398
+ const id = nonEmptyString(ownDataOf(row, 'id'));
399
+ const provider = nonEmptyString(ownDataOf(row, 'provider'));
400
+ const reasoning = ownDataOf(row, 'reasoning');
401
+ const contextWindow = positiveFinite(ownDataOf(row, 'contextWindow'));
402
+ const maxOutputTokens = positiveFinite(ownDataOf(row, 'maxOutputTokens'));
403
+ out.push(Object.freeze({
404
+ name,
405
+ ...(id !== undefined ? { id } : {}),
406
+ ...(provider !== undefined ? { provider } : {}),
407
+ ...(typeof reasoning === 'boolean' ? { reasoning } : {}),
408
+ ...(contextWindow !== undefined ? { contextWindow } : {}),
409
+ ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),
410
+ isDefault: def.kind === 'listed' && def.name === name,
411
+ vision: imageVisionOf(name, catalog),
412
+ effort: effortLevelsOf(name, catalog),
413
+ routePairing: Object.freeze(routePairingVerdict(ownDataOf(row, 'routePairing'))),
414
+ atMention: atMentionOf(name, catalog),
415
+ compat: modelCompatOf(name, catalog),
416
+ }));
417
+ }
418
+ return Object.freeze(out);
419
+ }
420
+ catch {
421
+ return null;
422
+ }
423
+ }
@@ -15,6 +15,31 @@ export type McpEngineLegLiveness = {
15
15
  state: string;
16
16
  };
17
17
  export declare function mcpEngineLegLivenessOf(serverName: string, rows: readonly WiringManifestMcpEntryView[] | null | undefined): McpEngineLegLiveness;
18
+ export type McpEngineLegConnection = {
19
+ state: 'connected';
20
+ toolCount?: number;
21
+ } | {
22
+ state: 'not_connected';
23
+ cause: 'failed';
24
+ errorCode?: string;
25
+ delivered?: string;
26
+ httpStatus?: number;
27
+ } | {
28
+ state: 'not_connected';
29
+ cause: 'skipped' | 'not_listed';
30
+ } | {
31
+ state: 'unknown';
32
+ cause: 'unobserved' | 'unreadable';
33
+ } | {
34
+ state: 'unknown';
35
+ cause: 'ambiguous';
36
+ rows: number;
37
+ } | {
38
+ state: 'unknown';
39
+ cause: 'unrecognized_status';
40
+ status: string;
41
+ };
42
+ export declare function mcpEngineLegConnectionOf(serverName: string, rows: readonly WiringManifestMcpEntryView[] | null | undefined): McpEngineLegConnection;
18
43
  export interface McpDetailLegNoteInput {
19
44
  localClientFailed: boolean;
20
45
  engineHostedToolCount: number | undefined;