@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,10 +1,8 @@
1
1
  import presetData from './searchProviderPresets.json' with { type: 'json' };
2
2
  const rawTable = presetData;
3
- /** wire 枚举守卫(与服务端 `web-search.ts` 的三值校验同一份口径)。 */
4
3
  function isWebSearchProvider(v) {
5
4
  return v === 'brave' || v === 'tavily' || v === 'searxng';
6
5
  }
7
- /** `null` = 诚实缺席 ⇒ 键整个不出现在对象上(而不是留一个 `undefined` 值位)。 */
8
6
  function optional(v, key) {
9
7
  return v === null ? {} : { [key]: v };
10
8
  }
@@ -23,15 +21,9 @@ function toPreset(row) {
23
21
  ...optional(row.note, 'note'),
24
22
  };
25
23
  }
26
- /** 搜索 provider 目录(表序即端的展示序)。 */
27
24
  export const SEARCH_PROVIDER_PRESETS = rawTable.presets
28
25
  .map(toPreset)
29
26
  .filter((p) => p !== undefined);
30
- /**
31
- * 数据表自检口(与 `compensationSplitViolations()` 同一个套路:表的不变量做成可执行判据,
32
- * 由门断言恒空)。上面 `toPreset` 对非法 provider 的行只能**丢掉**(类型化的表里放不下它),
33
- * 丢掉本身是静默的 —— 这个函数就是那份静默的账。
34
- */
35
27
  export function searchPresetTableViolations() {
36
28
  const out = [];
37
29
  const seen = new Set();
@@ -60,14 +52,12 @@ export function searchPresetTableViolations() {
60
52
  }
61
53
  return out;
62
54
  }
63
- /** 按 id 取一行(trim + 大小写不敏感,与 wire 侧 provider 归一同口径)。查不到 ⇒ undefined。 */
64
55
  export function findSearchPreset(id) {
65
56
  const key = typeof id === 'string' ? id.trim().toLowerCase() : '';
66
57
  if (!key)
67
58
  return undefined;
68
59
  return SEARCH_PROVIDER_PRESETS.find(p => p.id.toLowerCase() === key);
69
60
  }
70
- /** 引擎吃的五个 env 键(单一真源:端别再手写字面量)。 */
71
61
  export const WEB_SEARCH_ENV_KEYS = {
72
62
  provider: 'WEB_SEARCH_PROVIDER',
73
63
  apiKey: 'WEB_SEARCH_API_KEY',
@@ -77,9 +67,7 @@ export const WEB_SEARCH_ENV_KEYS = {
77
67
  };
78
68
  export const WEB_SEARCH_MAX_RESULTS_MIN = 1;
79
69
  export const WEB_SEARCH_MAX_RESULTS_MAX = 20;
80
- /** 引擎侧的默认值,**只供端显示**(「默认 10」)。🔴 绝不由本模块写进 env,理由见文件头纪律 2。 */
81
70
  export const WEB_SEARCH_ENGINE_DEFAULTS = { maxResults: 10, timeoutMs: 10000 };
82
- /** 绝对 http/https URL 形校验。相对地址/其它协议一律拒 —— 引擎会拿它去拨号。 */
83
71
  function isDialableUrl(raw) {
84
72
  try {
85
73
  const u = new URL(raw);
@@ -90,13 +78,6 @@ function isDialableUrl(raw) {
90
78
  }
91
79
  }
92
80
  const trimmed = (v) => (typeof v === 'string' ? v.trim() : '');
93
- /**
94
- * 判定一份选择能不能编译成可用的 env。**纯判定,不产出任何值** —— 端可以在用户还在输入时
95
- * 反复调它做即时提示,不必担心把半截配置漏给引擎。
96
- *
97
- * 🔴 越界的 `maxResults` 判红而不是 clamp:引擎那侧确实会 clamp,但客户端替用户把 50 改成 20
98
- * 是**替他改了他填的数**却不告诉他。宁可红一下让端说「1..20」。
99
- */
100
81
  export function validateWebSearchChoice(choice = {}) {
101
82
  const id = trimmed(choice.presetId);
102
83
  if (!id)
@@ -124,20 +105,12 @@ export function validateWebSearchChoice(choice = {}) {
124
105
  }
125
106
  return { ok: true, preset };
126
107
  }
127
- /**
128
- * 用户选择 → 引擎 env。**唯一**的编译口(端别自己拼字面量键)。
129
- *
130
- * 🔴 三条已在文件头写死的纪律在这里落地:配置不可用 ⇒ `{}`(fail-closed,理由去问
131
- * `validateWebSearchChoice`);用户没填的可选项不出键(不替引擎钉默认值);任何值都先 trim,
132
- * 空串一律当没填 —— 返回的对象里**不存在**值为空串的键。
133
- */
134
108
  export function buildWebSearchEnv(choice = {}) {
135
109
  const verdict = validateWebSearchChoice(choice);
136
110
  if (!verdict.ok)
137
111
  return {};
138
112
  const { preset } = verdict;
139
113
  const env = { [WEB_SEARCH_ENV_KEYS.provider]: preset.provider };
140
- // needsKey=false 的家不带 key:那家用不上它,把凭证多送一程没有收益只有暴露面。
141
114
  const apiKey = trimmed(choice.apiKey);
142
115
  if (preset.needsKey && apiKey)
143
116
  env[WEB_SEARCH_ENV_KEYS.apiKey] = apiKey;
@@ -1,190 +1,34 @@
1
- /**
2
- * 网络/传输层失败的词面基表(壳 seamQuery「件2c transport 收窄」的那条正则逐字)。
3
- * 判据变更义务:加词=各端跟批;删词/改形=先与消费端对表(web 叠加宿主词的半场见其
4
- * turn-error-classify 头注)。
5
- */
6
1
  export declare const WIRE_NETWORK_ERROR_PATTERN: RegExp;
7
- /** turn 错误的结构化分型判决(渲染/文案归端;门与遥测按 kind 对账)。 */
8
- export type TurnWireErrorVerdict =
9
- /** 引擎应答了非 2xx(reachable)。`errorCode` 只认活键([2055]);缺席=不带。 */
10
- {
2
+ export type TurnWireErrorVerdict = {
11
3
  kind: 'http';
12
4
  status: number;
13
5
  errorCode?: string;
14
6
  message: string;
15
- }
16
- /** SDK typed park 信号:流结束但 run 未达终态(多半 suspended 候人决断)—— 不是故障。 */
17
- | {
7
+ } | {
18
8
  kind: 'stream-ended-without-terminal';
19
- }
20
- /** 真网络/传输层失败(引擎压根没应答)。detail = cause 原话 > message > String(err)。 */
21
- | {
9
+ } | {
22
10
  kind: 'transport';
23
11
  detail: string;
24
- }
25
- /** 分类不明(多半是客户端自己的 bug)—— 如实报,绝不指去查引擎/网络。 */
26
- | {
12
+ } | {
27
13
  kind: 'internal';
28
14
  name: string;
29
15
  detail: string;
30
16
  };
31
- /**
32
- * turn 错误分型(模块头②节的四臂;臂序=壳 `semaApiErrorContent` 逐字:http → park 信号 →
33
- * transport/internal)。纯判定,永不抛。
34
- */
35
17
  export declare function classifyTurnWireError(err: unknown): TurnWireErrorVerdict;
36
- /**
37
- * 真·网络/传输层失败判(壳 `engineTarget.isEngineTransportError` 逐字语义):typed HTTP error
38
- * (numeric `status` 在场 = 引擎应答了)恒 false —— 死端点分诊绝不误挂在活引擎的业务错误上。
39
- * 消费面:headless `-p` 死 pin 提示 / 审批提交腿的重试判型(approvalSubmitRetry)。
40
- */
41
18
  export declare function isWireTransportError(err: unknown): boolean;
42
- /**
43
- * 判型:server drain 门的 pre-stream 拒收(503 + `errorCode:"draining"`)。结构判读不
44
- * instanceof(mock/包装错误同判);机器码单腿(sdk 4.0.0 起 message 腿退役)。
45
- * 消费面的重试铁律(严格限定 pre-stream、有界)归壳 seamQuery 的重试环。
46
- */
47
19
  export declare function isPreStreamDrainingReject(err: unknown): boolean;
48
- /**
49
- * #166 — `resume_at.*` 错误码族:提交带的 resumeAt 锚服务端不认(Esc 杀锚未持久化的典型形)。
50
- * 🔴 刻意**不**用 `isRewindFamilyCode`(那是含 `rewind_snapshot.` 的宽形):去锚自动重发的安全性
51
- * 论证只对 resume_at 族做过,放宽属行为变更(RESUME_AT_ERROR_CODE_PREFIX 头注)。
52
- *
53
- * ## #355 D1 —— 两条载体腿(2026-08-27)
54
- * 同一个语义在 wire 上有**两种形**,此前只认第一种:
55
- * · **机读形**(既有腿,一字未动):core prepare-throw 经 `resumeAtHttpStatus` 落 4xx,
56
- * `errorCode` **原样透传**真子码(`resume_at.not_found` / `resume_at.before_target_not_user` …)
57
- * ⇒ 前缀命中。
58
- * · **包装形**(本腿新增):server 的**预检腿**在 core 之前就 4xx —— `boot/resolve-spec.ts`
59
- * 抛 `HttpError(404, "resumeAt: no such message in this session (resume_at.unknown_event)")`
60
- * 且**不带** `code`,于是 `http/send.ts` 的 `httpErrorCode(404)` 盖上按状态码派生的粗码
61
- * `not_found.resource`,真子码**只活在人话里**。SDK `classifyApiError` 把 body 的 `error`
62
- * 原样搬进 `APIError.message`(scrub 只动 Bearer/presigned),所以壳收到的是
63
- * `{status:404, errorCode:'not_found.resource', message:'…(resume_at.unknown_event)'}`。
64
- * 旧判据 false ⇒ #166 去锚重发整臂跳过 ⇒ 会话每条消息秒死 404、永久死锁(1.0.93 现网案)。
65
- *
66
- * ## 放宽的论证(engineErrorCodes `RESUME_AT_ERROR_CODE_PREFIX` 头注要求「放宽须论证」)
67
- * 本腿放宽的是**载体**(码位 → 码位∪人话),不是**族**:
68
- * ① 三重合取收敛误触面:`status === 404`(引擎真应答了,不是网络/内部错)+ 人话里出现
69
- * **同一个族前缀**字面 + 调用点自己的 `req.resumeAt !== undefined`(seamQuery #166 臂)
70
- * —— 没带锚的提交压根进不来,与「404 里恰好出现 `resume_at.` 字样」撞车要三件同时成立。
71
- * ② 族边界一字未松,而且文本腿收成**闭集**:只认 `RESUME_AT_TEXT_COMPAT` 里那两对
72
- * 「状态 × 括号收尾子码」——`404 × (resume_at.unknown_event)` 与
73
- * `422 × (resume_at.no_session)`,正是 `boot/resolve-spec.ts` 两处**不带 `code`** 的 throw。
74
- * `rewind_snapshot.` / `rewind_files_to.` 邻族不入内(邻族的自动重发安全性没论证过);
75
- * 开集形与裸子串形都已被异源复审证伪(token 边界 + 回显注入两条,论证见
76
- * {@link RESUME_AT_TEXT_COMPAT})。带 code 的那一路(core prepare-throw 经 `resumeAtHttpStatus`
77
- * 落 4xx)`errorCode` 原样透传,早被 ① 接住,压根不经过这里。
78
- * ③ 422 那一支不是「顺手放宽」:它与 404 支同为预检腿的 codeless throw,处置也同款 —— 去锚重发在
79
- * `no_session` 上不但安全、而且**正是正解**(没有可分支的 session,新起一轮本来就是对的)。
80
- * 原形把它留在门外、负控还把「422 恒 false」钉成期望值 —— 那不是负控,是把残余固化成契约。
81
- * ④ 误触的代价上界很低而漏判的代价是死锁:误命中最多多发一次**去锚的**同一条提交(pre-stream
82
- * 零副作用,与 draining 同一铁律边界)+ 一行人话;漏判 = 会话再也发不出消息。
83
- * ⑤ 刻意**不**加「粗码必须等于 `request.unprocessable` / `not_found.resource`」这层收窄:那张
84
- * 状态码→粗码表是 server `http/send.ts` 的实现细节(会随版本增删),把判据押在它上面等于给自己
85
- * 种一颗静默失效的雷;判别力已由 ② 的闭集承担。
86
- *
87
- * 🔴 根治在发端、且**已经落地**:server 给那四条拒绝子码补上了结构化 `code` 参,新 worker 一律走
88
- * 机读腿 ①。本腿因此是**对已发布旧 server 的过渡垫片**(1.0.93 现网用户跑的正是那些),不是长期形;
89
- * 等最低 server 版本推过去之后可以整条退役。
90
- *
91
- * 🔴 只影响本函数的判定,`RESUME_AT_ERROR_CODE_PREFIX` 常量与它的另一个消费点
92
- * `isRewindFamilyCode`(rewind 可自解族的**码**判别)一字未动。
93
- */
94
20
  export declare function isResumeAtRejection(err: unknown): boolean;
95
- /**
96
- * 第 `attempt`(0-based)次 draining 重试前的等待:`err.retryAfterMs`(SDK 若带)封顶优先
97
- * (上限 15s = server drain 门现值,防把一个 turn park 到分钟级),缺席走退避梯
98
- * (默认 1s/2s/4s = 壳 S4-P0 实测值;超出梯长取末档)。`opts.ladder` = 端的测试钩子注入口
99
- * (壳 `setDrainingBackoffForTest` 经此透传)。纯函数,零模块状态(singleton 门口径)。
100
- */
101
21
  export declare function drainingRetryDelayMs(err: unknown, attempt: number, opts?: {
102
22
  ladder?: readonly number[];
103
23
  retryAfterCapMs?: number;
104
24
  }): number;
105
- /** 结构化拒绝字段(与 SDK `ScenarioNotAllowedError` 同形;判定层不依赖 SDK 类型面)。 */
106
25
  export interface ScenarioDenyDetail {
107
- /** The principal's allowed scenario names (defensively filtered; may be empty). */
108
26
  allowlist: string[];
109
27
  }
110
- /**
111
- * 从一个被 catch 的错误判定「场景不在指派列表」并提取结构化 detail。
112
- * duck-typed(不 instanceof — bundle 下跨包类标识可能双实例):`status===400 &&
113
- * errorCode===SCENARIO_NOT_ALLOWED_ERROR_CODE` 即命中;allowlist 缺席/非数组/畸形项 → 逐项
114
- * 防御过滤成空数组(兜底文案契约归端)。非该 code 的 400 / 其他错误 → null(绝不误吃普通 400)。
115
- * 🔴 键位([2055] 死键纪律):只认 `errorCode`,退役 `code` 键不做兼容(clean-cut)。
116
- */
117
28
  export declare function scenarioDenyFromError(err: unknown): ScenarioDenyDetail | null;
118
- /**
119
- * {@link resumeRetryLaterFromError} 的结构化读数。
120
- *
121
- * 判定层**不依赖 SDK 类型面**(与 {@link ScenarioDenyDetail} 同款):注入面可能是宿主的裸 fetch、
122
- * desktop 的 IPC 转投、web 跨 bundle 的 plain object,也可能是比本包新一版的 SDK ——
123
- * 这些形上 `instanceof ResumeRetryLaterError` 一律为假,而 `errorCode` 恒在。
124
- */
125
29
  export interface ResumeRetryLaterDetail {
126
- /**
127
- * 命中的那一个码({@link RESUME_RETRY_LATER_CODES} 的成员之一)。
128
- * 🔴 **两码不是同一个处置**:能不能等看 {@link waitable}(本码 ∧ 有没有窗),本位只回答「是哪一个
129
- * 成因」—— 治理窗满(与部署的账本配额有关)还是部署预检拒(与部署自己那只 `resumePreflight`
130
- * 有关)。排障要分得清,措辞也要分得清;**别拿本位反推可等性**。
131
- */
132
30
  code: string;
133
- /**
134
- * server 给的**等待秒数**。
135
- * 🔴 **缺席 = 服务端没给窗**,不是 0、不是「立刻」—— 绝不渲一个编出来的倒计时
136
- * ([honest-absence-not-fabricated-zero])。≤7.46 引擎、以及**把这条错误经 SDK ≤8.0 映射
137
- * 过来**的宿主(那些版本上本码落无字段的族基类 `SubagentResumeConflictError`)都恒缺席。
138
- * 🔴 **「缺席时该说什么」不由本位决定,由 {@link waitable} 决定**:`waitable === true` 而窗缺席
139
- * (治理窗满、或老 SDK 把窗吞了)⇒ 说「稍后重试」但不给数字;`waitable === false` ⇒ **不许**
140
- * 说「稍后重试」(见那一位顶注:那是不可判,不是可等)。
141
- */
142
31
  retryAfterSec?: number;
143
- /**
144
- * **等一会儿到底有没有用** —— 本口唯一的处置位,也是全包对这个问题的**单一判断点**。
145
- *
146
- * 🔴 **为什么不是「命中本族即可等」**(异源对抗复审 [medium] 真病修):`resume.preflight_rejected`
147
- * 在 core 侧有**两条臂** —— 缺省的 `retry_later`(行留 pending,同一 token 障碍清除后仍可赎)
148
- * 与显式 `terminal`(行已被这次拒绝的单发 expire CAS 结清,token **不可再赎**)——而**判别位
149
- * 在 message 散文里**,wire 上没有机读位。仅凭码就宣告「稍后重试」,会把一个终局说成暂时等待。
150
- * 本包**不按文案分臂**(按文案分支正是上游改一个词就静默空转的形),所以只认**正向证据**:
151
- * · `resume.usage_window_exhausted` ⇒ 恒 `true` —— core 铸文的不变量是「什么都没消费、
152
- * 什么都没解钉,同一 token 带同一决议在窗放开后可直兑」,这一码本身就是证据;
153
- * · `resume.preflight_rejected` ⇒ **只有** server 给了等待窗({@link retryAfterSec} 在场)才 `true`;
154
- * 窗缺席时是 `false` = **不可判**,不是「不可重试」。
155
- * 🔴 **「有窗 ⇒ 一定是 retry_later 臂」是直证不是推断**(core 7.3.1 fixture 直读
156
- * `@sema-agent/core/dist/core/runner/runtask.js` 的 `resumePreflight` 拒绝段):
157
- * · `terminal` 臂(`disposition === 'terminal'` ∧ 有可读 message ⇒ 单发 `store.expire` CAS 结清、
158
- * 文末逐字 "the token is not redeemable")抛的 `CheckpointError` **一个 detail 都不带** ⇒
159
- * `retryAfterMs` 结构上不存在 ⇒ server 那一侧无从铸 `retryAfterSec`;
160
- * · `retry_later` 臂(超时/崩溃/普通拒三支,文末逐字 "the checkpoint stays pending and the same
161
- * token is redeemable once the obstacle clears")**只在部署真给了 `retryAfterMs` 时**带 detail。
162
- * ⇒ 窗**在场**是 retry_later 的充分证据;窗**缺席**两臂都可能(retry_later 也常常没有建议),
163
- * 所以缺席只能读作「不知道」。
164
- * 🔴 `false` 的正确读法是「**我不知道还能不能再赎**,读引擎那行原文」——**不是**「一定不能」。
165
- * 两臂都成立的那句话仍可放心说:这一拒发生在提交之前,人的决定没被消费。
166
- */
167
32
  waitable: boolean;
168
33
  }
169
- /**
170
- * 被 catch 的错误 → resume **时间性拒绝**读数;不是那两个码 ⇒ `null`(绝不误吃这一族里别的 409)。
171
- *
172
- * 🔴 **判据只有 `errorCode`,不看 HTTP 数字**:与 `classifySubagentResumeFailure`(同包
173
- * `subagent/engineSubagentResume.ts`)的既有口径同律(`resume.*` 那一族成员全是 409,按数字分支
174
- * 等于把几种不同处置压成一种);而本口的
175
- * 处置是**告诉人等一会儿**——非破坏性,不需要 {@link scenarioDenyFromError} 那种「码 ∧ 状态」的
176
- * 合取闸(那一条守的是别让一个只是**引用**了该码的响应驱动一次真动作)。
177
- * 🔴 **结构读不 `instanceof`**:见 {@link ResumeRetryLaterDetail} 顶注(三端注入面 / 跨 bundle 同名类
178
- * 是两个实例)。键位只认 `errorCode`([2055] 死键纪律,退役 `code` 槽不做兼容)。
179
- * 🔴 **本口只报事实,处置位是 {@link ResumeRetryLaterDetail.waitable}**:命中本族 **≠** 一定可等 ——
180
- * `resume.preflight_rejected` 有一条 `terminal` 臂(token 不可再赎)而判别位只在 message 散文里。
181
- * 「等一会儿有没有用」的判断收在 `waitable` 这一位上(全包单一判断点),名字里的 RetryLater 是
182
- * 上游 SDK 的类名锚,**不是**本口对每一次命中的断言。
183
- * 🔴 **`retryAfterSec` 的窄读域 = server 的铸键域**(整数 ∧ ≥1),不更宽也不更窄:
184
- * · server 铸键逐字是「ms → 秒**向上取整**、**下限 1**」⇒ 真供给里不存在 0 / 负数 / 小数;
185
- * · 放行 0 就是对消费端说「立刻重试」,而 resume 是 AT-MOST-ONCE 的有副作用动作
186
- * (叫醒 = 真跑一轮)—— 一个 0 会把「等一会儿」变成热循环;
187
- * · 放行小数会让端渲出「等 0.4 秒」这种上游从未说过的量。
188
- * 坏值一律**降缺席**(不是降 0、不是取绝对值):没读到窗与读到一个假窗,前者诚实。
189
- */
190
34
  export declare function resumeRetryLaterFromError(err: unknown): ResumeRetryLaterDetail | null;
@@ -1,37 +1,5 @@
1
- /**
2
- * wireErrorTriage.ts — turn 错误分型的**判定半场**(A-028.11/.13,#244 族E,2026-08-15)。
3
- *
4
- * ## 收编前的形(census top-10 §1/§3)
5
- * 同一套「turn 失败 → 分型 → 处置类」判定跑着**两份半**:
6
- * · 壳 `seamQuery.semaApiErrorContent` 的判型内联(typed HTTP / 网络词面 / internal 三分支)
7
- * + `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs`;
8
- * · 壳 `engineTarget.isEngineTransportError`(注释自陈「两处判据变更须同步」的第二份 inline);
9
- * · web `turn-error-classify.ts`(580 行第二实现,靠跨仓逐 token 读壳源码的 parity 门硬撑)。
10
- * 本件把**纯判定**收成一份:错误对象 → 结构化分型判决。人话文案与渲染(Ink 行 / web 卡)
11
- * 按 §8-5 归各端 —— 本件绝不铸一句面向用户的话。
12
- *
13
- * ## 判定语义(壳侧逐字,行为面零变化)
14
- * ① `typeof err.status === 'number'` ⇒ **http**(引擎真的应答了):机器码只认 `errorCode`
15
- * ([2055] 死键纪律:退役 `code` 槽不作兼容);
16
- * ② `err.name === 'StreamEndedWithoutTerminalError'`(#156/[2669] SDK typed park 信号,name 判
17
- * 别 —— 跨包 instanceof 不可靠)⇒ **stream-ended-without-terminal**(run 多半 suspended
18
- * 候人决断,绝不谎报网络/壳 bug);
19
- * ③ 网络词面命中或 undici `cause` 在场 ⇒ **transport**(真网络层;detail 取 cause 原话优先);
20
- * ④ 其余 ⇒ **internal**(分类不明如实说,不编造网络原因 —— 编一个具体原因比说不知道坏得多)。
21
- *
22
- * ## 词面表的跨端义务
23
- * {@link WIRE_NETWORK_ERROR_PATTERN} 是壳/web 共用的**基表**(web 侧另有浏览器 fetch 的四种说法
24
- * `failed to fetch`/`networkerror`/`network error`/`load failed`,那是宿主词,由 web 在自己那半场
25
- * 叠加)。web 的 run-error-table-parity-test(逐 token 读壳源码)随本件退役为「共用同一 import」。
26
- */
27
1
  import { DRAINING_ERROR_CODE, RESUME_AT_ERROR_CODE_PREFIX, RESUME_RETRY_LATER_CODES, RESUME_USAGE_WINDOW_EXHAUSTED, SCENARIO_NOT_ALLOWED_ERROR_CODE, } from './engineErrorCodes.js';
28
- /**
29
- * 网络/传输层失败的词面基表(壳 seamQuery「件2c transport 收窄」的那条正则逐字)。
30
- * 判据变更义务:加词=各端跟批;删词/改形=先与消费端对表(web 叠加宿主词的半场见其
31
- * turn-error-classify 头注)。
32
- */
33
2
  export const WIRE_NETWORK_ERROR_PATTERN = /fetch failed|ECONNREFUSED|ECONNRESET|ETIMEDOUT|EAI_AGAIN|ENOTFOUND|EHOSTUNREACH|ENETUNREACH|EPIPE|socket hang up|UND_ERR|terminated|other side closed/i;
34
- /** 传输失败 detail 的取值序(undici `.cause` 的精确 host:port 优先)。包内共用,不出公面。 */
35
3
  function wireErrorDetail(err) {
36
4
  const e = err;
37
5
  const cause = e?.cause;
@@ -39,10 +7,6 @@ function wireErrorDetail(err) {
39
7
  (typeof e?.message === 'string' && e.message.length > 0 && e.message) ||
40
8
  String(err));
41
9
  }
42
- /**
43
- * turn 错误分型(模块头②节的四臂;臂序=壳 `semaApiErrorContent` 逐字:http → park 信号 →
44
- * transport/internal)。纯判定,永不抛。
45
- */
46
10
  export function classifyTurnWireError(err) {
47
11
  const e = err;
48
12
  if (typeof e?.status === 'number') {
@@ -50,11 +14,6 @@ export function classifyTurnWireError(err) {
50
14
  const message = typeof e.message === 'string' && e.message.length > 0 ? e.message : String(err);
51
15
  return { kind: 'http', status: e.status, ...(errorCode !== undefined ? { errorCode } : {}), message };
52
16
  }
53
- // park 判别按 `name` **结构读**,不附加 instanceof Error(复审 F3 [medium] 真病修):壳源形的
54
- // `err instanceof Error &&` 合取在单进程壳里恒真无害,但本件是三端共用面 —— desktop IPC 序列化 /
55
- // web 跨 bundle 的同名错误是 plain object,instanceof 合取会把「候人决断」误诊成「客户端 bug +
56
- // 建议重跑」(重跑=重复 turn,且掩盖真待决态)。壳注释自陈的意图本就是「name 判别(跨包
57
- // instanceof 不可靠)」—— 这里把实现对齐到意图(更强形,park 臂只宽不窄)。
58
17
  const errName = typeof err === 'object' && err !== null && typeof err.name === 'string'
59
18
  ? err.name
60
19
  : undefined;
@@ -67,128 +26,29 @@ export function classifyTurnWireError(err) {
67
26
  return { kind: 'transport', detail };
68
27
  return { kind: 'internal', name: err instanceof Error ? err.name : typeof err, detail };
69
28
  }
70
- /**
71
- * 真·网络/传输层失败判(壳 `engineTarget.isEngineTransportError` 逐字语义):typed HTTP error
72
- * (numeric `status` 在场 = 引擎应答了)恒 false —— 死端点分诊绝不误挂在活引擎的业务错误上。
73
- * 消费面:headless `-p` 死 pin 提示 / 审批提交腿的重试判型(approvalSubmitRetry)。
74
- */
75
29
  export function isWireTransportError(err) {
76
30
  const e = err;
77
31
  if (typeof e?.status === 'number')
78
32
  return false;
79
33
  return e?.cause !== undefined || WIRE_NETWORK_ERROR_PATTERN.test(wireErrorDetail(err));
80
34
  }
81
- /**
82
- * 判型:server drain 门的 pre-stream 拒收(503 + `errorCode:"draining"`)。结构判读不
83
- * instanceof(mock/包装错误同判);机器码单腿(sdk 4.0.0 起 message 腿退役)。
84
- * 消费面的重试铁律(严格限定 pre-stream、有界)归壳 seamQuery 的重试环。
85
- */
86
35
  export function isPreStreamDrainingReject(err) {
87
36
  const e = err;
88
37
  return typeof e?.status === 'number' && e.status === 503 && e.errorCode === DRAINING_ERROR_CODE;
89
38
  }
90
- /**
91
- * #355 D1 文本兼容腿认的**闭集**:server 预检腿两处 codeless throw 的「状态 × 子码」配对,
92
- * 且必须以 server 自己那种**括号收尾**的形出现(`…(resume_at.unknown_event)`)。
93
- *
94
- * 🔴 为什么是闭集而不是开集(异源复审第四轮 [medium] 真病修):这条腿的定位是「**已发布**的旧
95
- * server 的兼容垫片」——一个**历史封闭**的集合。新码一律带结构化 `errorCode`(server 已在发端补齐
96
- * 四条子码的 `code` 参),走前缀腿 ① 直接命中,根本不经过这里。开集在这里换不来任何前瞻性,却把
97
- * 判据暴露在**回显注入**下。
98
- *
99
- * 🔴 回显注入是真事(亲读 server `config.ts:formatUnmatchableToolNames`):它把**用户送来的**工具名
100
- * 逐字拼进错误文本(`… names tool(s) …: <用户的名字> → <guidance>`,多条以 `; ` 连接),再由
101
- * `resolve-spec` 翻成一个**普通 codeless 422**。于是「任意 422 + 文本里出现 resume_at.<任意成员>」
102
- * 这种开集判据,可以被一条名叫 `resume_at.foo` 的权限规则触发 —— 而那一拍用户的 `resumeAt` 锚是
103
- * **有效**的,后果是:壳把有效锚删掉、渲一行「恢复点失效」(与事实不符 = 编造归因)、再重发一次。
104
- *
105
- * 堵法是**闭集 + 串尾锚**两件一起:
106
- * · 闭集挡住 `resume_at.<任意成员>`;
107
- * · 串尾锚(消费点用 `endsWith`)挡住「用户把整串 `(resume_at.no_session)` 连括号写进权限名」——
108
- * 那一形里回显内容后面必然还跟着 ` → guidance`,永远到不了串尾。少了串尾锚,闭集单独是漏的
109
- * (异源复审第五轮实测反证)。
110
- * 串尾成立的依据是实证不是假设:7.42.0–7.50.0 七份已发布 server 产物里,这两句的码后面紧跟的就是
111
- * 字符串字面量的结束引号。
112
- *
113
- * 字面单源:两枚子码由 {@link RESUME_AT_ERROR_CODE_PREFIX} 拼出,常量改了这里自动跟。
114
- * 认不出 ⇒ 退化成「不自动去锚重发」= 修这一批之前的行为,绝不会更坏。
115
- */
116
39
  const RESUME_AT_TEXT_COMPAT = [
117
40
  { status: 404, marker: `(${RESUME_AT_ERROR_CODE_PREFIX}unknown_event)` },
118
41
  { status: 422, marker: `(${RESUME_AT_ERROR_CODE_PREFIX}no_session)` },
119
42
  ];
120
- /**
121
- * #166 — `resume_at.*` 错误码族:提交带的 resumeAt 锚服务端不认(Esc 杀锚未持久化的典型形)。
122
- * 🔴 刻意**不**用 `isRewindFamilyCode`(那是含 `rewind_snapshot.` 的宽形):去锚自动重发的安全性
123
- * 论证只对 resume_at 族做过,放宽属行为变更(RESUME_AT_ERROR_CODE_PREFIX 头注)。
124
- *
125
- * ## #355 D1 —— 两条载体腿(2026-08-27)
126
- * 同一个语义在 wire 上有**两种形**,此前只认第一种:
127
- * · **机读形**(既有腿,一字未动):core prepare-throw 经 `resumeAtHttpStatus` 落 4xx,
128
- * `errorCode` **原样透传**真子码(`resume_at.not_found` / `resume_at.before_target_not_user` …)
129
- * ⇒ 前缀命中。
130
- * · **包装形**(本腿新增):server 的**预检腿**在 core 之前就 4xx —— `boot/resolve-spec.ts`
131
- * 抛 `HttpError(404, "resumeAt: no such message in this session (resume_at.unknown_event)")`
132
- * 且**不带** `code`,于是 `http/send.ts` 的 `httpErrorCode(404)` 盖上按状态码派生的粗码
133
- * `not_found.resource`,真子码**只活在人话里**。SDK `classifyApiError` 把 body 的 `error`
134
- * 原样搬进 `APIError.message`(scrub 只动 Bearer/presigned),所以壳收到的是
135
- * `{status:404, errorCode:'not_found.resource', message:'…(resume_at.unknown_event)'}`。
136
- * 旧判据 false ⇒ #166 去锚重发整臂跳过 ⇒ 会话每条消息秒死 404、永久死锁(1.0.93 现网案)。
137
- *
138
- * ## 放宽的论证(engineErrorCodes `RESUME_AT_ERROR_CODE_PREFIX` 头注要求「放宽须论证」)
139
- * 本腿放宽的是**载体**(码位 → 码位∪人话),不是**族**:
140
- * ① 三重合取收敛误触面:`status === 404`(引擎真应答了,不是网络/内部错)+ 人话里出现
141
- * **同一个族前缀**字面 + 调用点自己的 `req.resumeAt !== undefined`(seamQuery #166 臂)
142
- * —— 没带锚的提交压根进不来,与「404 里恰好出现 `resume_at.` 字样」撞车要三件同时成立。
143
- * ② 族边界一字未松,而且文本腿收成**闭集**:只认 `RESUME_AT_TEXT_COMPAT` 里那两对
144
- * 「状态 × 括号收尾子码」——`404 × (resume_at.unknown_event)` 与
145
- * `422 × (resume_at.no_session)`,正是 `boot/resolve-spec.ts` 两处**不带 `code`** 的 throw。
146
- * `rewind_snapshot.` / `rewind_files_to.` 邻族不入内(邻族的自动重发安全性没论证过);
147
- * 开集形与裸子串形都已被异源复审证伪(token 边界 + 回显注入两条,论证见
148
- * {@link RESUME_AT_TEXT_COMPAT})。带 code 的那一路(core prepare-throw 经 `resumeAtHttpStatus`
149
- * 落 4xx)`errorCode` 原样透传,早被 ① 接住,压根不经过这里。
150
- * ③ 422 那一支不是「顺手放宽」:它与 404 支同为预检腿的 codeless throw,处置也同款 —— 去锚重发在
151
- * `no_session` 上不但安全、而且**正是正解**(没有可分支的 session,新起一轮本来就是对的)。
152
- * 原形把它留在门外、负控还把「422 恒 false」钉成期望值 —— 那不是负控,是把残余固化成契约。
153
- * ④ 误触的代价上界很低而漏判的代价是死锁:误命中最多多发一次**去锚的**同一条提交(pre-stream
154
- * 零副作用,与 draining 同一铁律边界)+ 一行人话;漏判 = 会话再也发不出消息。
155
- * ⑤ 刻意**不**加「粗码必须等于 `request.unprocessable` / `not_found.resource`」这层收窄:那张
156
- * 状态码→粗码表是 server `http/send.ts` 的实现细节(会随版本增删),把判据押在它上面等于给自己
157
- * 种一颗静默失效的雷;判别力已由 ② 的闭集承担。
158
- *
159
- * 🔴 根治在发端、且**已经落地**:server 给那四条拒绝子码补上了结构化 `code` 参,新 worker 一律走
160
- * 机读腿 ①。本腿因此是**对已发布旧 server 的过渡垫片**(1.0.93 现网用户跑的正是那些),不是长期形;
161
- * 等最低 server 版本推过去之后可以整条退役。
162
- *
163
- * 🔴 只影响本函数的判定,`RESUME_AT_ERROR_CODE_PREFIX` 常量与它的另一个消费点
164
- * `isRewindFamilyCode`(rewind 可自解族的**码**判别)一字未动。
165
- */
166
43
  export function isResumeAtRejection(err) {
167
44
  const e = err;
168
45
  if (typeof e?.errorCode === 'string' && e.errorCode.startsWith(RESUME_AT_ERROR_CODE_PREFIX))
169
46
  return true;
170
- // 文本兼容腿:只认闭集里那两对「状态 × 括号收尾子码」(见 {@link RESUME_AT_TEXT_COMPAT})。
171
47
  const marker = RESUME_AT_TEXT_COMPAT.find((c) => c.status === e?.status)?.marker;
172
48
  if (marker === undefined)
173
49
  return false;
174
- // 两个人话载体**各自独立判**(异源复审 [medium] 真病修:原形取「第一个非空」,而 SDK
175
- // `classifyApiError` 的 `message` 恒非空(缺席时回落 `HTTP <status>`)⇒ `errorMessage` 那条腿在
176
- // 「泛化 message + 细节在 errorMessage」的包装形下恒不可达 = 死腿)。
177
- // · `message` = SDK `APIError` 的正身(壳 seamQuery catch 到的就是它,生产真形);
178
- // · `errorMessage` = 同一句话在 wire 体 / `TaskResult` 上的键位(轮询腿把体直接当错误对象抛时的形)。
179
- // 结构读不 instanceof:三端共用面,desktop IPC / web 跨 bundle 的同名错误是 plain object。
180
- // 🔴 `endsWith` 而不是 `includes`(异源复审第五轮 [medium] 真病修):server 自己那两句**以码收尾**
181
- // (亲验 7.42.0–7.50.0 七份已发布产物,码后紧跟的就是字符串字面量的结束引号);而回显形里用户内容
182
- // 后面必然还跟着 ` → guidance`。只认串尾 ⇒ 用户就算把整串 `(resume_at.no_session)` 连括号一起
183
- // 写进权限名,它在错误文本里也永远不在串尾,注入这条路彻底堵死。
184
50
  return [e?.message, e?.errorMessage].some((t) => typeof t === 'string' && t.endsWith(marker));
185
51
  }
186
- /**
187
- * 第 `attempt`(0-based)次 draining 重试前的等待:`err.retryAfterMs`(SDK 若带)封顶优先
188
- * (上限 15s = server drain 门现值,防把一个 turn park 到分钟级),缺席走退避梯
189
- * (默认 1s/2s/4s = 壳 S4-P0 实测值;超出梯长取末档)。`opts.ladder` = 端的测试钩子注入口
190
- * (壳 `setDrainingBackoffForTest` 经此透传)。纯函数,零模块状态(singleton 门口径)。
191
- */
192
52
  export function drainingRetryDelayMs(err, attempt, opts) {
193
53
  const ra = err?.retryAfterMs;
194
54
  if (typeof ra === 'number' && Number.isFinite(ra) && ra >= 0) {
@@ -197,13 +57,6 @@ export function drainingRetryDelayMs(err, attempt, opts) {
197
57
  const ladder = opts?.ladder && opts.ladder.length > 0 ? opts.ladder : [1_000, 2_000, 4_000];
198
58
  return ladder[Math.min(attempt, ladder.length - 1)] ?? 1_000;
199
59
  }
200
- /**
201
- * 从一个被 catch 的错误判定「场景不在指派列表」并提取结构化 detail。
202
- * duck-typed(不 instanceof — bundle 下跨包类标识可能双实例):`status===400 &&
203
- * errorCode===SCENARIO_NOT_ALLOWED_ERROR_CODE` 即命中;allowlist 缺席/非数组/畸形项 → 逐项
204
- * 防御过滤成空数组(兜底文案契约归端)。非该 code 的 400 / 其他错误 → null(绝不误吃普通 400)。
205
- * 🔴 键位([2055] 死键纪律):只认 `errorCode`,退役 `code` 键不做兼容(clean-cut)。
206
- */
207
60
  export function scenarioDenyFromError(err) {
208
61
  if (typeof err !== 'object' || err === null)
209
62
  return null;
@@ -215,27 +68,6 @@ export function scenarioDenyFromError(err) {
215
68
  : [];
216
69
  return { allowlist };
217
70
  }
218
- /**
219
- * 被 catch 的错误 → resume **时间性拒绝**读数;不是那两个码 ⇒ `null`(绝不误吃这一族里别的 409)。
220
- *
221
- * 🔴 **判据只有 `errorCode`,不看 HTTP 数字**:与 `classifySubagentResumeFailure`(同包
222
- * `subagent/engineSubagentResume.ts`)的既有口径同律(`resume.*` 那一族成员全是 409,按数字分支
223
- * 等于把几种不同处置压成一种);而本口的
224
- * 处置是**告诉人等一会儿**——非破坏性,不需要 {@link scenarioDenyFromError} 那种「码 ∧ 状态」的
225
- * 合取闸(那一条守的是别让一个只是**引用**了该码的响应驱动一次真动作)。
226
- * 🔴 **结构读不 `instanceof`**:见 {@link ResumeRetryLaterDetail} 顶注(三端注入面 / 跨 bundle 同名类
227
- * 是两个实例)。键位只认 `errorCode`([2055] 死键纪律,退役 `code` 槽不做兼容)。
228
- * 🔴 **本口只报事实,处置位是 {@link ResumeRetryLaterDetail.waitable}**:命中本族 **≠** 一定可等 ——
229
- * `resume.preflight_rejected` 有一条 `terminal` 臂(token 不可再赎)而判别位只在 message 散文里。
230
- * 「等一会儿有没有用」的判断收在 `waitable` 这一位上(全包单一判断点),名字里的 RetryLater 是
231
- * 上游 SDK 的类名锚,**不是**本口对每一次命中的断言。
232
- * 🔴 **`retryAfterSec` 的窄读域 = server 的铸键域**(整数 ∧ ≥1),不更宽也不更窄:
233
- * · server 铸键逐字是「ms → 秒**向上取整**、**下限 1**」⇒ 真供给里不存在 0 / 负数 / 小数;
234
- * · 放行 0 就是对消费端说「立刻重试」,而 resume 是 AT-MOST-ONCE 的有副作用动作
235
- * (叫醒 = 真跑一轮)—— 一个 0 会把「等一会儿」变成热循环;
236
- * · 放行小数会让端渲出「等 0.4 秒」这种上游从未说过的量。
237
- * 坏值一律**降缺席**(不是降 0、不是取绝对值):没读到窗与读到一个假窗,前者诚实。
238
- */
239
71
  export function resumeRetryLaterFromError(err) {
240
72
  if (typeof err !== 'object' || err === null)
241
73
  return null;
@@ -244,12 +76,9 @@ export function resumeRetryLaterFromError(err) {
244
76
  if (typeof code !== 'string' || !RESUME_RETRY_LATER_CODES.includes(code))
245
77
  return null;
246
78
  const sec = e.retryAfterSec;
247
- // 局部名刻意不叫 `window`:本包出浏览器包(portability 门真跑 esbuild --platform=browser),
248
- // 一个遮蔽宿主全局的同名局部变量在阅读期就是噪音。
249
79
  const windowSec = typeof sec === 'number' && Number.isInteger(sec) && sec >= 1 ? sec : undefined;
250
80
  return {
251
81
  code,
252
- // 见 {@link ResumeRetryLaterDetail.waitable}:治理窗满这一码本身即证据;预检拒只认「server 真给了窗」。
253
82
  waitable: code === RESUME_USAGE_WINDOW_EXHAUSTED || windowSec !== undefined,
254
83
  ...(windowSec !== undefined ? { retryAfterSec: windowSec } : {}),
255
84
  };
@@ -1,44 +1,16 @@
1
- /**
2
- * wireRefusalCopy — 两条 wire 拒绝的三端共用读口与人话面(0.73.1)。
3
- *
4
- * ① `POST /v1/runs/:id/cancel` 的 **409 是两个码、两种相反的处置**:
5
- * · `conflict.approval_settled` —— park 臂:取消打在一条停驻的 run 上,而那扇审批门被并发的决断 / 回收抢先结算了。
6
- * 处置 = **重读决议结果**(别人已经替这条 run 做了决定),不是盲目重试。
7
- * · `conflict.run_not_running` —— running 臂:取消旗反复挂不上(行在 running 与 park 之间来回跳,有界重分类用尽)。
8
- * 处置 = **直接重试**。
9
- * 只看 409 状态码会把两者合成一句,其中一半人被指错路。码缺席 / 认不出 ⇒ `unrecognized`,不猜。
10
- *
11
- * ② 提交面 **429 `usage.window_exhausted`**:部署级用量窗耗尽,**可等待**的拒绝(窗滑动后原样重发即可)。
12
- * `retryAfterSec` 在场就说等多久,缺席就不编数。它与续跑面的 `resume.usage_window_exhausted` 是两个码、两句话 ——
13
- * 后者说的是一条已停驻的 run 续跑时撞窗(决定没被消费、token 仍可赎),套到提交面上每一个字都不对。
14
- *
15
- * 读口只认 `errorCode`(退役的 `code` 槽不做兼容),永不抛;措辞单源在这里,端只拼接不另写。
16
- */
17
1
  import { USAGE_WINDOW_EXHAUSTED } from './engineErrorCodes.js';
18
- /** cancel 的 409 · park 臂:审批门已被并发结算。 */
19
2
  export declare const CONFLICT_APPROVAL_SETTLED = "conflict.approval_settled";
20
- /** cancel 的 409 · running 臂:取消旗反复挂不上。 */
21
3
  export declare const CONFLICT_RUN_NOT_RUNNING = "conflict.run_not_running";
22
4
  export type CancelConflictKind = 'approval_settled' | 'run_not_running' | 'unrecognized';
23
- /** `code` 在场 = 引擎给的原码(`unrecognized` 时也原样带出,便于留痕);缺席 = 这条 409 没带机器码。 */
24
5
  export interface CancelConflictDetail {
25
6
  kind: CancelConflictKind;
26
7
  code?: string;
27
8
  }
28
- /** cancel 抛出的错误 → 409 三形;不是 409(状态不是 409 且不是 sdk 的 `ConflictError`)/ 非对象 ⇒ `null`。 */
29
9
  export declare function cancelConflictFromError(err: unknown): CancelConflictDetail | null;
30
- /** 三句人话(唯一措辞真源)。🔴 两种处置不许说反:settled 句不提重试取消,not_running 句不说已被决定。 */
31
10
  export declare function cancelConflictContent(detail: Pick<CancelConflictDetail, 'kind'>): string;
32
- /** 提交面用量窗耗尽的读数。`retryAfterSec` 缺席 = 引擎没说要等多久(绝不编一个数)。 */
33
11
  export interface UsageWindowExhaustedDetail {
34
12
  code: typeof USAGE_WINDOW_EXHAUSTED;
35
13
  retryAfterSec?: number;
36
14
  }
37
- /**
38
- * 只认 **HTTP 429 载体**上的 `errorCode === "usage.window_exhausted"`;同码落在终态 run 记录上的形(跑到 turn 边界才被停下)**不在本读面**
39
- * (那一形工作可能已经发生,处置相反 —— 先看结果再决定怎么续)。
40
- * 等待量两个来源:回体 `retryAfterSec`(秒)优先;缺席时读 `retryAfterMs`(sdk 从 `Retry-After` 头喂入)上取整换算。
41
- */
42
15
  export declare function usageWindowExhaustedFromError(err: unknown): UsageWindowExhaustedDetail | null;
43
- /** 一句人话(唯一措辞真源):有数带数,无数不编数;说清这是部署的用量窗、不是请求写错了。 */
44
16
  export declare function usageWindowExhaustedContent(detail: UsageWindowExhaustedDetail): string;
@@ -1,29 +1,10 @@
1
- /**
2
- * wireRefusalCopy — 两条 wire 拒绝的三端共用读口与人话面(0.73.1)。
3
- *
4
- * ① `POST /v1/runs/:id/cancel` 的 **409 是两个码、两种相反的处置**:
5
- * · `conflict.approval_settled` —— park 臂:取消打在一条停驻的 run 上,而那扇审批门被并发的决断 / 回收抢先结算了。
6
- * 处置 = **重读决议结果**(别人已经替这条 run 做了决定),不是盲目重试。
7
- * · `conflict.run_not_running` —— running 臂:取消旗反复挂不上(行在 running 与 park 之间来回跳,有界重分类用尽)。
8
- * 处置 = **直接重试**。
9
- * 只看 409 状态码会把两者合成一句,其中一半人被指错路。码缺席 / 认不出 ⇒ `unrecognized`,不猜。
10
- *
11
- * ② 提交面 **429 `usage.window_exhausted`**:部署级用量窗耗尽,**可等待**的拒绝(窗滑动后原样重发即可)。
12
- * `retryAfterSec` 在场就说等多久,缺席就不编数。它与续跑面的 `resume.usage_window_exhausted` 是两个码、两句话 ——
13
- * 后者说的是一条已停驻的 run 续跑时撞窗(决定没被消费、token 仍可赎),套到提交面上每一个字都不对。
14
- *
15
- * 读口只认 `errorCode`(退役的 `code` 槽不做兼容),永不抛;措辞单源在这里,端只拼接不另写。
16
- */
17
1
  import { USAGE_WINDOW_EXHAUSTED } from './engineErrorCodes.js';
18
- /** cancel 的 409 · park 臂:审批门已被并发结算。 */
19
2
  export const CONFLICT_APPROVAL_SETTLED = 'conflict.approval_settled';
20
- /** cancel 的 409 · running 臂:取消旗反复挂不上。 */
21
3
  export const CONFLICT_RUN_NOT_RUNNING = 'conflict.run_not_running';
22
4
  function readStringField(o, key) {
23
5
  const v = o[key];
24
6
  return typeof v === 'string' && v !== '' ? v : undefined;
25
7
  }
26
- /** cancel 抛出的错误 → 409 三形;不是 409(状态不是 409 且不是 sdk 的 `ConflictError`)/ 非对象 ⇒ `null`。 */
27
8
  export function cancelConflictFromError(err) {
28
9
  try {
29
10
  if (err === null || typeof err !== 'object')
@@ -44,7 +25,6 @@ export function cancelConflictFromError(err) {
44
25
  return null;
45
26
  }
46
27
  }
47
- /** 三句人话(唯一措辞真源)。🔴 两种处置不许说反:settled 句不提重试取消,not_running 句不说已被决定。 */
48
28
  export function cancelConflictContent(detail) {
49
29
  switch (detail.kind) {
50
30
  case 'approval_settled':
@@ -61,11 +41,6 @@ export function cancelConflictContent(detail) {
61
41
  function nonNegativeFinite(v) {
62
42
  return typeof v === 'number' && Number.isFinite(v) && v >= 0;
63
43
  }
64
- /**
65
- * 只认 **HTTP 429 载体**上的 `errorCode === "usage.window_exhausted"`;同码落在终态 run 记录上的形(跑到 turn 边界才被停下)**不在本读面**
66
- * (那一形工作可能已经发生,处置相反 —— 先看结果再决定怎么续)。
67
- * 等待量两个来源:回体 `retryAfterSec`(秒)优先;缺席时读 `retryAfterMs`(sdk 从 `Retry-After` 头喂入)上取整换算。
68
- */
69
44
  export function usageWindowExhaustedFromError(err) {
70
45
  try {
71
46
  if (err === null || typeof err !== 'object')
@@ -73,8 +48,6 @@ export function usageWindowExhaustedFromError(err) {
73
48
  const o = err;
74
49
  if (o.errorCode !== USAGE_WINDOW_EXHAUSTED)
75
50
  return null;
76
- // 🔴 只认 **HTTP 429 载体**(状态 429,或 sdk 的 UsageWindowExhaustedError / RateLimitedError 名):同一个码也会落在终态 run 记录上
77
- // (跑到 turn 边界才被用量窗停下,同样带 retryAfterMs)—— 那不是「提交未受理」,套这句话会把已经发生的工作说成没做。
78
51
  const rawStatus = o.status ?? o.statusCode;
79
52
  const is429 = rawStatus === 429 || (rawStatus === undefined && (o.name === 'UsageWindowExhaustedError' || o.name === 'RateLimitedError'));
80
53
  if (!is429)
@@ -101,7 +74,6 @@ function humanWait(sec) {
101
74
  const mm = m % 60;
102
75
  return mm === 0 ? `${h} h` : `${h} h ${mm} min`;
103
76
  }
104
- /** 一句人话(唯一措辞真源):有数带数,无数不编数;说清这是部署的用量窗、不是请求写错了。 */
105
77
  export function usageWindowExhaustedContent(detail) {
106
78
  const head = "The deployment's usage window is exhausted, so the engine did not accept this request · Nothing is wrong with the request itself";
107
79
  return detail.retryAfterSec !== undefined