@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,109 +1,30 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/ultracodeWireCaps.ts 逐字搬入(零依赖;🔴 模块级 ultracodePreset 是 sticky 单实例态,写口 setUltracodePreset 与读口 ultracodeForWire 必须同实例)。
3
- */
4
- /**
5
- * src/sema/ultracodeWireCaps.ts — the shell's TWO opt-in sources for the CC-parity `settings.ultracode` PRESET,
6
- * projected onto `TaskRequest.settings.ultracode` (a typed boolean the SERVICE — ai-agent-service 1.48.0 — reads
7
- * and EXPANDS to `thinking:"max"` + `selfOrchestration:true`; both core's existing orthogonal axes, fail-closed
8
- * gates unchanged). design/111 (core/search AI 2026-06-30): ultracode is a STANDALONE settings boolean folding
9
- * "max thinking × workflow orchestration", surfaced in sema as the top notch of the `/effort` dial.
10
- *
11
- * Two sources, ONE structured-spec output (`settings.ultracode:true` — never prompt text):
12
- *
13
- * ① L2 dial preset (STICKY): the `/effort ultracode` pick. The effort dial COERCES the reasoning axis to `xhigh`
14
- * (overrides/effort.tsx executeEffortSema — "ultracode runs at xhigh effort"), which would LOSE the
15
- * orchestration axis. So the dial separately latches this module-level preset: ON when `ultracode` is picked,
16
- * OFF when any OTHER effort level is picked (a sticky session setting, like CC's settings.ultracode boolean).
17
- *
18
- * ② L3 keyword (PER-TURN): a client-side scan of the REAL human turn input for the literal word "ultracode".
19
- * 🔴 RED LINE (design/111 L3, the ONLY injection risk): scan ONLY the human's current-turn submission, BEFORE
20
- * any untrusted content (tool results / file reads / web / subagent / MCP) is concatenated. NEVER scan the
21
- * assembled prompt server-side — a malicious file containing "ultracode" would be a privilege-escalation
22
- * injection. The keyword is a UX convenience switch, NOT a security decision point: privilege STILL passes the
23
- * service's fail-closed per-principal `allowWorkflows` gate (core deliberately refuses prompt scanning,
24
- * prepare-task.ts:1612 — that boundary is correct). The output is a STRUCTURED spec (the boolean), never
25
- * injected prompt text.
26
- *
27
- * Both sources are OR'd live-side by `toTaskRequest`; the SAME `SEMA_LIVE_BASEURL` gate the other capability wires
28
- * use keeps the mock request shape unchanged (the stamp IS the opt-in; absent ⇒ the engine never expands ultracode).
29
- *
30
- * The PRESET state is module-level (mirrors seamQuery's seam* injectors): the dial (a React override) latches it,
31
- * the seam reads it. The KEYWORD scan is a PURE function (caller passes the human input) so it bundles + unit-tests
32
- * without React/AppState.
33
- */
34
1
  import { hostEnv } from './hostEnv.js';
35
2
  import { envFlagOff } from './envFlag.js';
36
- /** STICKY L2 preset: latched ON by the `/effort ultracode` dial pick, OFF by any other effort pick. Module-level
37
- * (one shell process = one session) — the same single-namespace assumption seamQuery's session state uses. */
38
3
  let ultracodePreset = false;
39
- /** Latch the dial preset. `effort.tsx` calls this whenever an effort level is APPLIED: `true` for the `ultracode`
40
- * notch, `false` for every other level (so switching the dial OFF ultracode clears the workflow-orchestration axis
41
- * while the reasoning axis follows the picked level). */
42
4
  export function setUltracodePreset(on) {
43
5
  ultracodePreset = on === true;
44
6
  }
45
- /** Read the sticky dial preset (the L2 source). */
46
7
  export function getUltracodePreset() {
47
8
  return ultracodePreset;
48
9
  }
49
- /** Test/boot reset — clears the latched preset (e.g. a fresh session). */
50
10
  export function _resetUltracodePreset() {
51
11
  ultracodePreset = false;
52
12
  }
53
- /** Word-boundary, case-insensitive scan for the literal keyword. A bare mention ("ultracode") anywhere in the
54
- * human's own turn text counts (CC-style UX toggle); the server's `allowWorkflows` gate is the real guard, so a
55
- * false-positive (the user discussing the word) only requests the preset — it cannot escalate past the gate. */
56
13
  const ULTRACODE_KEYWORD = /\bultracode\b/i;
57
- /**
58
- * L3 keyword source: `true` iff the REAL human turn input contains the "ultracode" keyword, else `undefined`.
59
- * 🔴 The caller MUST pass ONLY the human's current-turn submission (seamQuery's `objective`, derived from the
60
- * projectable user message) — NOT any assembled/untrusted content. Returns `true | undefined` (never `false`) to
61
- * mirror the strict additive-stamp discipline of the other wire caps (a stamped `false` would needlessly change
62
- * the default request shape).
63
- */
64
14
  export function ultracodeFromInput(humanInput) {
65
15
  return typeof humanInput === 'string' && ULTRACODE_KEYWORD.test(humanInput) ? true : undefined;
66
16
  }
67
- /**
68
- * Combine the two sources into the structured spec the seam stamps. `true` when EITHER the sticky dial preset is on
69
- * OR the human's current-turn input contains the keyword; otherwise `undefined` (⇒ no stamp ⇒ default behaviour).
70
- * Returns `true | undefined` so the seam can spread `...(ultracode ? { ultracode } : {})` without changing the
71
- * default request shape. The CALLER gates this to LIVE mode (mock parity).
72
- */
73
17
  export function ultracodeForRequest(humanInput) {
74
18
  return getUltracodePreset() || ultracodeFromInput(humanInput) ? true : undefined;
75
19
  }
76
- /** [1044]②裁 B 激活源 a(clay 拍):用户当轮说 "workflow"(词边界、大小写不敏感)⇒ 该 turn 激活
77
- * Workflow 暴露。与 ultracode 线同一注入红线:只扫真人当轮输入(objective),绝不扫组装后内容。
78
- * 消费接线=[1052]① 收官形(workflowDeferForRequest,core 1.314 deferTools 首班到货后点亮)。
79
- * [1486] 词表扩(2026-07-21,「启动 Agent Team 走成三 fork」白盒定谳):多 agent 语义族也激活——
80
- * run_workflow 描述里的路由映射句(multi-agent orchestration…fan out agents)defer 后模型读不到,
81
- * 「agent team/multi-agent/swarm/多agent/编排」类输入落进可见工具面的理性变通(三 fork)。命中即
82
- * 当轮全量上 wire(翻转只发生在激活当轮,前缀缓存语义不变)。终态=Agent Team 真入口(案A,
83
- * [1484]/[1485])落地后此词有真归宿,本词表是过渡补丁。 */
84
20
  const WORKFLOW_KEYWORD = /\bworkflows?\b|\bagent[ -]?teams?\b|\bmulti[ -]?agent\b|\bswarms?\b|多\s?agent|多智能体|编排/i;
85
21
  export function workflowFromInput(humanInput) {
86
22
  return typeof humanInput === 'string' && WORKFLOW_KEYWORD.test(humanInput) ? true : undefined;
87
23
  }
88
- /** Env escape hatch for the deferred-Workflow factory default: `SEMA_WORKFLOW_DEFER=0/false/no/off` restores the
89
- * pre-[1052] always-exposed shape (schema bytes back in the prefix). Anything else (incl. unset) = defer ON. */
90
24
  const WORKFLOW_DEFER_ENV = 'SEMA_WORKFLOW_DEFER';
91
- /** 拼写集 = {@link envFlagOff}(REF-CC-141 dup-02 单源)。 */
92
25
  function deferOptedOut(env) {
93
26
  return envFlagOff(env[WORKFLOW_DEFER_ENV]);
94
27
  }
95
- /**
96
- * [1052]① 收官形(clay 裁 B 的 core deferred 机制件,cli 接线半场):Workflow「全局默认开但不暴露」——
97
- * 未命中激活源的 TaskRequest 带 `deferTools:["Workflow"]`(core 1.314 对已挂载工具做 design/36 延迟披露:
98
- * 占位符上 wire、schema 字节撤出缓存前缀、ToolSearch 可激活=中途激活通路);命中任一激活源 ⇒ `undefined`
99
- * (不 defer=名字+schema 全量上 wire):
100
- * a) 用户当轮说 "workflow"(workflowFromInput,只扫真人输入);
101
- * b) "ultracode" 关键词(L3,同一红线);
102
- * c) `/effort ultracode` sticky dial(L2 preset)。
103
- * CALLER 前置两门:live 门(mock 形不变)+ selfOrchestration stamp 存在(opt-out 时 Workflow 根本不挂载,
104
- * defer 无意义)。前缀缓存注记:defer↔不 defer 的翻转只发生在真人激活当轮,与 CC 209 ToolSearch materialize
105
- * 同一形——非激活轮的前缀指纹稳定([1044]② clay 硬约束 ii 的解)。
106
- */
107
28
  export function workflowDeferForRequest(humanInput, env = hostEnv()) {
108
29
  if (deferOptedOut(env))
109
30
  return undefined;
@@ -111,13 +32,8 @@ export function workflowDeferForRequest(humanInput, env = hostEnv()) {
111
32
  return undefined;
112
33
  return ['Workflow'];
113
34
  }
114
- /** [1077]④ 低频工具惰性注入:`SEMA_DEFER_TOOLS=<csv>`(wire 名)追加进 deferTools(core 1.314
115
- * 延迟披露腿)。**缺省翻转已裁(clay [1212]⑤,2026-07-19)**:九件低频工具缺省 defer——判决数=
116
- * -2,484 tok/首调用+多轮 gate 零行为退化;defer≠禁用(占位符在,模型 ToolSearch 随取)。
117
- * 逃生门:`SEMA_DEFER_LOWFREQ=0/false/no/off` 关缺省名单(九件恢复全量上前缀)。 */
118
35
  export const DEFER_TOOLS_ENV = 'SEMA_DEFER_TOOLS';
119
36
  export const DEFER_LOWFREQ_ENV = 'SEMA_DEFER_LOWFREQ';
120
- /** clay 裁定的缺省惰性名单([1076]④ 评测九件原单,[1090]② 判决数)。 */
121
37
  export const DEFAULT_LOWFREQ_DEFER = [
122
38
  'Glob',
123
39
  'Grep',
@@ -138,17 +54,9 @@ function extraDeferFromEnv(env) {
138
54
  .map((s) => s.trim())
139
55
  .filter((s) => s.length > 0);
140
56
  }
141
- /** 拼写集 = {@link envFlagOff}(REF-CC-141 dup-02 单源)。 */
142
57
  function lowFreqOptedOut(env) {
143
58
  return envFlagOff(env[DEFER_LOWFREQ_ENV]);
144
59
  }
145
- /**
146
- * The FULL deferTools list for a request: the Workflow default-defer lane (activation sources, see
147
- * {@link workflowDeferForRequest}) + the DEFAULT low-frequency list (clay [1212]⑤, opt-out via
148
- * SEMA_DEFER_LOWFREQ) + the SEMA_DEFER_TOOLS extra list, deduped. An activation hit removes ONLY
149
- * Workflow (the user asked for it by name); the other lanes are source-independent. Empty ⇒
150
- * `undefined` (no stamp, request shape unchanged).
151
- */
152
60
  export function deferToolsForRequest(humanInput, env = hostEnv()) {
153
61
  const workflowLane = workflowDeferForRequest(humanInput, env) ?? [];
154
62
  const lowFreqLane = lowFreqOptedOut(env) ? [] : DEFAULT_LOWFREQ_DEFER;
@@ -1,30 +1,3 @@
1
- /**
2
- * unrefTimer — 域词表-14 收编:「在没有 unref 的宿主(浏览器/桌面渲染进程)上不炸,在 Node 上
3
- * 不阻止进程退出」这条可移植性不变量此前有 5 份各写各的手抄(三种写法:直接可选调用 /
4
- * 先 `as unknown` 再可选调用 / 先 `typeof … === 'function'` 判断再可选调用)。本函数统一成一份。
5
- *
6
- * 🔴 这是**低层原语**,不是策略:本函数只统一「怎么调 unref」,不统一「该不该 unref」——
7
- * 该不该 unref 是调用点的控制流判断,必须留在各处决定。域词表-13 定谳:被 await 的 race/budget
8
- * 臂上的定时器绝不能 unref(会让进程在它 settle 前提前退出,RB-447 同形)——
9
- * `agentsWireCaps.ts` 的 `awaitTaskAgentsWire` 那处是控制流臂而非后台保活豁免,**不调用本函数**。
10
- *
11
- * 泛型约束到定时器句柄型(`setTimeout`/`setInterval` 的回传值):本包 `"types": []` + 默认 DOM
12
- * lib 下两者都是 `number`,Node 运行时实际回传 `Timeout` 对象——真身与编译期类型不一致正是
13
- * `unref?.()` 需要可选调用的原因。约束此前是无约束 `<T>`,任何东西都能传进来。
14
- *
15
- * 🔴 这条约束**挡得住哪一半、挡不住哪一半**(实测,不是承诺 —— [2393] F-3 纠正:此前这里写的是
16
- * 「`unrefTimer(42)` / `unrefTimer(aPromise)` 收窄后编译期就报」,而上一段自己写明的前提
17
- * 「本包下句柄型就是 `number`」直接推翻了它的前半句):
18
- * · `unrefTimer('x')` / `unrefTimer(aPromise)` —— **编译期红**(TS2345,非 number 挡得住);
19
- * · `unrefTimer(42)` —— **编译期绿**。`42` 与真句柄在本包的类型系统里不可分辨,挡不住;
20
- * 运行时也无害(可选调用在 number 上是 no-op),但别指望编译器替你抓这一类打错。
21
- * 这四条判决由 `scripts/run-client-core-typeshape-test.mjs` 的 D 腿每跑机械核一次:实测与
22
- * 这段措辞一旦分叉即红。⚠️ 别为了兑现前半句去拧类型 —— 能挡住数字字面量的写法在**装了
23
- * @types/node 的下游**会把句柄型解成 `Timeout` 对象,五个真调用点全线编译红(用一个假承诺
24
- * 换一个真的可移植性回归)。
25
- *
26
- * 五个既有调用点(均传 `setTimeout`/`setInterval` 的返回值)不受约束影响。
27
- */
28
1
  type TimerLikeHandle = ReturnType<typeof setTimeout> | ReturnType<typeof setInterval>;
29
2
  export declare function unrefTimer<T extends TimerLikeHandle>(t: T): T;
30
3
  export {};
@@ -1,48 +1,7 @@
1
- /**
2
- * webSearchBackendCapability — **部署默认 WebSearch 后端**的三端共用读面(0.72.5;server ≥7.82.1 / S-382
3
- * 的 `GET /v1/capabilities.webSearch`,契约附录 B.1;sdk 9.6.0 的 `Capabilities` 尚未声明该键)。
4
- *
5
- * ── 这一格答的是哪一个问题 ────────────────────────────────────────────────────────────────
6
- * 「我的工具面里为什么只有 WebFetch、没有 WebSearch?」装不装 WebSearch 工具由两个互不相干的旋钮决定:
7
- * ① 引擎**部署**自己的默认后端(`WEB_SEARCH_PROVIDER`;是 provider 词表之一才装配);
8
- * ② 调用方盖在请求上的 `settings.webSearch`(本包 `webSearchWireCaps` 投影;单用户车道上压过 ①)。
9
- * 本格只广告 **①**:server 逐字「广告的是部署默认,不是这次调用有没有搜索」—— 每请求覆盖**刻意不回显**
10
- * (回显等于让能力面随调用方漂)。所以 `none` 与「这次任务没有 WebSearch 工具」**不等价**:单用户车道上调用方
11
- * 自带 `settings.webSearch` 时工具照常装配,而本格仍读 `none`。消费端渲这一行时两段各渲各的,绝不互推。
12
- *
13
- * ── 🔴 四态,不是两态([honest-absence-not-fabricated-zero])──────────────────────────────────
14
- * 与 `sqlEngineCapability` / `writeProtectionCapability` 逐字同一套词汇(通用读口 `engineCapValue` 答「这一格
15
- * 上有没有值」,窄读器答「值成不成形」):
16
- * ① `unobserved` —— **本进程一次 caps 响应都没观测到**(一次性 doctor 就是这一档)。
17
- * ② `not_reported` —— caps 观测到了,而回体上**没有** `webSearch` 这个键 ⇒ 老引擎(<7.82.1)。
18
- * 🔴 契约逐字:**不许读作「本部署没有后端」** —— 那是 `"none"` 在说的话;两者的处置相反(一个渲
19
- * 「不可用」,一个渲「判不了」)。老引擎上只能按改前的办法判(跑一个真任务 / 读引擎启动日志)。
20
- * ③ `none` —— 引擎**明确说** `backend: "none"`:本部署没有默认搜索后端(`WEB_SEARCH_PROVIDER`
21
- * 未设 / 拼错)。**正面事实**,不是缺席;调用方没自带配置时默认场景**不装配** WebSearch 工具。
22
- * ④ `present` —— 一个 provider 词,原样渲。
23
- *
24
- * ── 🔴 窄读域只许等于或宽于铸点域 ────────────────────────────────────────────────────────────
25
- * server 的闭集**取型**自它的 provider 元组(加一只后端那一位自动跟着长)。本包**不**手抄那三个词当判据:
26
- * 抄一份就是给自己立第二个判官 —— 上游哪天加一只后端,手抄的那份会把新词判成畸形、把一台配好了的部署
27
- * 渲成「读不出」(消费域比铸点域更窄的病形,S-131 那一格已经付过一次代价)。`backend` 按**非空串**读,
28
- * 只有 `"none"` 这一个词带独立语义;别的词一律 `present` 并按 UNTRUSTED-for-display 消毒封长后上屏。
29
- *
30
- * ── 🔴 与 SQL 那一格的一处刻意不同:`webSearch: null` 是畸形 ────────────────────────────────
31
- * SQL 位的铸点会铸 `null`(「没有 SQL 后端」),所以那边 `null ⇒ none`。本位的铸点**永远铸一个对象**
32
- * (provider 缺席时铸 `{ backend: "none" }`,不铸 `null`)⇒ wire 上出现 `null` 不是任何一种已知读数,
33
- * 按畸形处置(删格 ⇒ `unobserved`),不替它编一个「none」。
34
- *
35
- * ── 与能力位台账门的关系 ───────────────────────────────────────────────────────────────────
36
- * `run-engine-caps-ledger-test.mjs` 的台账按 sdk `Capabilities` 键集对表;sdk 今天还没声明 `webSearch`,
37
- * 所以台账**刻意没有**这一行。sdk 出键当天该门自动红,逼一次显式处置(登 `read` 行指向本文件)。
38
- */
39
- /** `backend: "none"` —— 唯一带独立语义的词(见文件头);其余词按开集读。 */
40
1
  export declare const WEB_SEARCH_BACKEND_NONE = "none";
41
- /** `present` 时的读数:部署默认后端的 provider 词(开集;`"none"` 不会出现在这里 —— 它是 `none` 档)。 */
42
2
  export interface WebSearchBackendCapabilityView {
43
3
  backend: string;
44
4
  }
45
- /** 四态读数(见文件头)。`unobserved` 由**读口**在这一格空缺时铸,不由投影铸。 */
46
5
  export type WebSearchBackendReading = {
47
6
  kind: 'unobserved';
48
7
  } | {
@@ -53,42 +12,11 @@ export type WebSearchBackendReading = {
53
12
  kind: 'present';
54
13
  view: WebSearchBackendCapabilityView;
55
14
  };
56
- /**
57
- * caps 回体 → 本格读数;**畸形一律 `undefined`**(= 这一格不写 ⇒ 读口答 `unobserved`)。
58
- *
59
- * 🔴 键不在(`undefined`)⇒ `not_reported`(老引擎);`null` ⇒ 畸形(本位铸点从不铸 `null`,见文件头)。
60
- * 🔴 `backend` 不是非空串 ⇒ 整条畸形;`"none"` ⇒ `none`;其余词 ⇒ `present`(开集,不手抄闭集)。
61
- * 🔴 对象上的**多余成员不过境**(本包只读 `backend`;端点 / 密钥 / 配额契约上一个字都不上 wire,
62
- * 真出现了也不是本读面该带出去的东西)。
63
- */
64
15
  export declare function projectWebSearchBackendCapability(caps: unknown): WebSearchBackendReading | undefined;
65
- /**
66
- * 宿主 caps probe 的**读面 tee** 落点(与 `noteEngineCapsForSqlEngine` / `noteEngineCapsForWriteProtection`
67
- * 并列;宿主在同一处按序调三只)。绝不 throw —— 读面腿不许反噬 caps 探测链。
68
- *
69
- * 🔴 投影 `undefined`(caps 畸形)⇒ 这一格**被删**而不是留着上一台引擎的旧值。
70
- * 🔴 **不按 principal 分域**:部署默认后端是**这台 worker 的 boot 产物**,与调用者是谁无关。
71
- * 🔴 `opts.generation` = 关掉「旧探测覆盖新读数」竞态的唯一正确供给(与两只兄弟逐字同律):宿主在起探测
72
- * 那一刻 `engineCapsGeneration(baseUrl)` 抓号、在这里原样交回,陈旧那一发整只丢掉;不传 ⇒ 照写。
73
- */
74
16
  export declare function noteEngineCapsForWebSearchBackend(baseUrl: string, caps: unknown, opts?: {
75
17
  generation?: number;
76
18
  }): void;
77
- /** 本进程观测到的部署默认后端;这一格空缺 ⇒ `{kind:'unobserved'}`(**绝不**折成 `none`)。 */
78
19
  export declare function observedWebSearchBackend(baseUrl?: string | undefined): WebSearchBackendReading;
79
- /**
80
- * 四态 → doctor 那一行「部署默认后端」这一段的 detail 串。**唯一措辞真源**(三端共用;端只拼接不另写)。
81
- *
82
- * 🔴 四句话刻意**互不相同、也互不蕴含**:「未观测」「老引擎不报」两种「读不出」都**不等于**「没有后端」;
83
- * `none` 那一句必须同时说出两件事 —— 部署默认场景不装配这只工具,**以及**调用方自带配置仍可装配
84
- * (契约 🔴 蕴含只对「没自带配置」那一形成立)。少说后半句,用户会在 `/websearch` 配好之后仍以为没用。
85
- * 🔴 `present` 只渲 provider 一个词(消毒 + 封长);每请求覆盖不在此回显 —— 那是请求方自己送进来的。
86
- */
87
20
  export declare function webSearchBackendDoctorDetail(reading: WebSearchBackendReading): string;
88
- /**
89
- * **换代失效口**(与 `forgetSqlEngineReading` / `forgetWriteProtectionReading` 并列,由宿主在引擎温切成功后调)。
90
- * 处置是**清成未观测**,不是留旧值也不是铸一个 `none`。空串 ⇒ no-op;绝不 throw。
91
- */
92
21
  export declare function forgetWebSearchBackendReading(baseUrl: string | undefined): void;
93
- /** 测试钩子。 */
94
22
  export declare function __resetWebSearchBackendReadingsForTests(): void;
@@ -1,59 +1,10 @@
1
- /**
2
- * webSearchBackendCapability — **部署默认 WebSearch 后端**的三端共用读面(0.72.5;server ≥7.82.1 / S-382
3
- * 的 `GET /v1/capabilities.webSearch`,契约附录 B.1;sdk 9.6.0 的 `Capabilities` 尚未声明该键)。
4
- *
5
- * ── 这一格答的是哪一个问题 ────────────────────────────────────────────────────────────────
6
- * 「我的工具面里为什么只有 WebFetch、没有 WebSearch?」装不装 WebSearch 工具由两个互不相干的旋钮决定:
7
- * ① 引擎**部署**自己的默认后端(`WEB_SEARCH_PROVIDER`;是 provider 词表之一才装配);
8
- * ② 调用方盖在请求上的 `settings.webSearch`(本包 `webSearchWireCaps` 投影;单用户车道上压过 ①)。
9
- * 本格只广告 **①**:server 逐字「广告的是部署默认,不是这次调用有没有搜索」—— 每请求覆盖**刻意不回显**
10
- * (回显等于让能力面随调用方漂)。所以 `none` 与「这次任务没有 WebSearch 工具」**不等价**:单用户车道上调用方
11
- * 自带 `settings.webSearch` 时工具照常装配,而本格仍读 `none`。消费端渲这一行时两段各渲各的,绝不互推。
12
- *
13
- * ── 🔴 四态,不是两态([honest-absence-not-fabricated-zero])──────────────────────────────────
14
- * 与 `sqlEngineCapability` / `writeProtectionCapability` 逐字同一套词汇(通用读口 `engineCapValue` 答「这一格
15
- * 上有没有值」,窄读器答「值成不成形」):
16
- * ① `unobserved` —— **本进程一次 caps 响应都没观测到**(一次性 doctor 就是这一档)。
17
- * ② `not_reported` —— caps 观测到了,而回体上**没有** `webSearch` 这个键 ⇒ 老引擎(<7.82.1)。
18
- * 🔴 契约逐字:**不许读作「本部署没有后端」** —— 那是 `"none"` 在说的话;两者的处置相反(一个渲
19
- * 「不可用」,一个渲「判不了」)。老引擎上只能按改前的办法判(跑一个真任务 / 读引擎启动日志)。
20
- * ③ `none` —— 引擎**明确说** `backend: "none"`:本部署没有默认搜索后端(`WEB_SEARCH_PROVIDER`
21
- * 未设 / 拼错)。**正面事实**,不是缺席;调用方没自带配置时默认场景**不装配** WebSearch 工具。
22
- * ④ `present` —— 一个 provider 词,原样渲。
23
- *
24
- * ── 🔴 窄读域只许等于或宽于铸点域 ────────────────────────────────────────────────────────────
25
- * server 的闭集**取型**自它的 provider 元组(加一只后端那一位自动跟着长)。本包**不**手抄那三个词当判据:
26
- * 抄一份就是给自己立第二个判官 —— 上游哪天加一只后端,手抄的那份会把新词判成畸形、把一台配好了的部署
27
- * 渲成「读不出」(消费域比铸点域更窄的病形,S-131 那一格已经付过一次代价)。`backend` 按**非空串**读,
28
- * 只有 `"none"` 这一个词带独立语义;别的词一律 `present` 并按 UNTRUSTED-for-display 消毒封长后上屏。
29
- *
30
- * ── 🔴 与 SQL 那一格的一处刻意不同:`webSearch: null` 是畸形 ────────────────────────────────
31
- * SQL 位的铸点会铸 `null`(「没有 SQL 后端」),所以那边 `null ⇒ none`。本位的铸点**永远铸一个对象**
32
- * (provider 缺席时铸 `{ backend: "none" }`,不铸 `null`)⇒ wire 上出现 `null` 不是任何一种已知读数,
33
- * 按畸形处置(删格 ⇒ `unobserved`),不替它编一个「none」。
34
- *
35
- * ── 与能力位台账门的关系 ───────────────────────────────────────────────────────────────────
36
- * `run-engine-caps-ledger-test.mjs` 的台账按 sdk `Capabilities` 键集对表;sdk 今天还没声明 `webSearch`,
37
- * 所以台账**刻意没有**这一行。sdk 出键当天该门自动红,逼一次显式处置(登 `read` 行指向本文件)。
38
- */
39
1
  import { capForDisplay } from './fleetTaskDesc.js';
40
2
  import { engineWireTarget } from './engineWireTarget.js';
41
3
  import { createEngineCapReader } from './engineCapReader.js';
42
- /** `backend: "none"` —— 唯一带独立语义的词(见文件头);其余词按开集读。 */
43
4
  export const WEB_SEARCH_BACKEND_NONE = 'none';
44
- /**
45
- * caps 回体 → 本格读数;**畸形一律 `undefined`**(= 这一格不写 ⇒ 读口答 `unobserved`)。
46
- *
47
- * 🔴 键不在(`undefined`)⇒ `not_reported`(老引擎);`null` ⇒ 畸形(本位铸点从不铸 `null`,见文件头)。
48
- * 🔴 `backend` 不是非空串 ⇒ 整条畸形;`"none"` ⇒ `none`;其余词 ⇒ `present`(开集,不手抄闭集)。
49
- * 🔴 对象上的**多余成员不过境**(本包只读 `backend`;端点 / 密钥 / 配额契约上一个字都不上 wire,
50
- * 真出现了也不是本读面该带出去的东西)。
51
- */
52
5
  export function projectWebSearchBackendCapability(caps) {
53
6
  if (caps === null || typeof caps !== 'object')
54
7
  return undefined;
55
- // 0.77.0 整族改齐:① 非对象 / 数组 caps 不是能力表 ⇒ 畸形(投影答 undefined ⇒ 删格 ⇒ 读口答 unobserved),不再答 not_reported
56
- // (那是把「取不到」冒充「报了但没提」);② 在场判据改 hasOwn —— 原型链上的同名键永远不会被序列化上 wire,读成在场 = 凭空造一格。
57
8
  if (caps === null || typeof caps !== 'object' || Array.isArray(caps))
58
9
  return undefined;
59
10
  if (!Object.hasOwn(caps, 'webSearch'))
@@ -70,44 +21,19 @@ export function projectWebSearchBackendCapability(caps) {
70
21
  return { kind: 'none' };
71
22
  return { kind: 'present', view: { backend } };
72
23
  }
73
- /**
74
- * 本格的 per-baseUrl 读账 + tee / 读口 / 失效口 / 测试钩四口 —— 各只能力位读器**共用同一份实现**
75
- * ({@link createEngineCapReader});本文件只留这一格真正不同的部分:投影函数 {@link projectWebSearchBackendCapability}、doctor 措辞表,以及本位自己的判据助手(如有)。
76
- * 🔴 Map 在工厂闭包里,**一只读器一张**:收到读不懂的回体只删自己这一格,绝不连坐别的能力面。
77
- */
78
24
  const reader = createEngineCapReader({
79
25
  name: 'webSearch.backend',
80
26
  project: projectWebSearchBackendCapability,
81
27
  makeUnobserved: () => ({ kind: 'unobserved' }),
82
28
  });
83
- /**
84
- * 宿主 caps probe 的**读面 tee** 落点(与 `noteEngineCapsForSqlEngine` / `noteEngineCapsForWriteProtection`
85
- * 并列;宿主在同一处按序调三只)。绝不 throw —— 读面腿不许反噬 caps 探测链。
86
- *
87
- * 🔴 投影 `undefined`(caps 畸形)⇒ 这一格**被删**而不是留着上一台引擎的旧值。
88
- * 🔴 **不按 principal 分域**:部署默认后端是**这台 worker 的 boot 产物**,与调用者是谁无关。
89
- * 🔴 `opts.generation` = 关掉「旧探测覆盖新读数」竞态的唯一正确供给(与两只兄弟逐字同律):宿主在起探测
90
- * 那一刻 `engineCapsGeneration(baseUrl)` 抓号、在这里原样交回,陈旧那一发整只丢掉;不传 ⇒ 照写。
91
- */
92
29
  export function noteEngineCapsForWebSearchBackend(baseUrl, caps, opts) {
93
30
  reader.note(baseUrl, caps, opts);
94
31
  }
95
- /** 本进程观测到的部署默认后端;这一格空缺 ⇒ `{kind:'unobserved'}`(**绝不**折成 `none`)。 */
96
32
  export function observedWebSearchBackend(baseUrl = engineWireTarget()?.baseUrl) {
97
33
  return reader.observed(baseUrl);
98
34
  }
99
- /** provider 词的展示上限(UTF-16 单元;与两只兄弟同值同理由 —— 开集词按 UNTRUSTED-for-display 处置)。 */
100
35
  const WS_DETAIL_MAX = 40;
101
- /** 部署侧那个旋钮的名字 —— 用户要去改的就是它,所以逐字写出来而不是说「部署配置」。 */
102
36
  const DEPLOY_ENV = 'WEB_SEARCH_PROVIDER';
103
- /**
104
- * 四态 → doctor 那一行「部署默认后端」这一段的 detail 串。**唯一措辞真源**(三端共用;端只拼接不另写)。
105
- *
106
- * 🔴 四句话刻意**互不相同、也互不蕴含**:「未观测」「老引擎不报」两种「读不出」都**不等于**「没有后端」;
107
- * `none` 那一句必须同时说出两件事 —— 部署默认场景不装配这只工具,**以及**调用方自带配置仍可装配
108
- * (契约 🔴 蕴含只对「没自带配置」那一形成立)。少说后半句,用户会在 `/websearch` 配好之后仍以为没用。
109
- * 🔴 `present` 只渲 provider 一个词(消毒 + 封长);每请求覆盖不在此回显 —— 那是请求方自己送进来的。
110
- */
111
37
  export function webSearchBackendDoctorDetail(reading) {
112
38
  switch (reading.kind) {
113
39
  case 'unobserved':
@@ -125,14 +51,9 @@ export function webSearchBackendDoctorDetail(reading) {
125
51
  '(per-request overrides are not echoed here)');
126
52
  }
127
53
  }
128
- /**
129
- * **换代失效口**(与 `forgetSqlEngineReading` / `forgetWriteProtectionReading` 并列,由宿主在引擎温切成功后调)。
130
- * 处置是**清成未观测**,不是留旧值也不是铸一个 `none`。空串 ⇒ no-op;绝不 throw。
131
- */
132
54
  export function forgetWebSearchBackendReading(baseUrl) {
133
55
  reader.forget(baseUrl);
134
56
  }
135
- /** 测试钩子。 */
136
57
  export function __resetWebSearchBackendReadingsForTests() {
137
58
  reader.__resetForTests();
138
59
  }
@@ -1,54 +1,17 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/webSearchWireCaps.ts 逐字搬入(零依赖)。
3
- */
4
- /**
5
- * src/sema/webSearchWireCaps.ts — PURE projection: the shell's WebSearch backend config → the @sema-ai
6
- * `SemaSettings.webSearch` wire shape carried on `TaskRequest.settings.webSearch`.
7
- *
8
- * The SERVICE consumes `body.settings.webSearch` — ai-agent-service `src/plugins/web-search.ts`
9
- * `webSearchConfigFromSettings(raw)` reads a per-request `{ provider, apiKey?, endpoint?, maxResults? }` that
10
- * WINS over the deployment-env backend, gated to the single-user host lane (a per-request endpoint/apiKey is a
11
- * capability config; on multi-tenant it would be SSRF, so multi-tenant uses ONLY the deploy-env backend —
12
- * design/107). The service validates `provider ∈ brave | tavily | searxng` and DROPS a missing/invalid provider
13
- * (it never throws — a bad config falls back to the deploy-env backend). We mirror that exact validation here so
14
- * the shell never stamps a config the service would reject.
15
- *
16
- * Two config sources, ENV wins (the primary / verify lane):
17
- * - ENV: `SEMA_WEBSEARCH_PROVIDER` / `_ENDPOINT` / `_API_KEY` / `_MAX_RESULTS` (SEMA_-namespaced, distinct from
18
- * the SERVICE's own deploy `WEB_SEARCH_*` env so the shell config never collides with the worker's).
19
- * - settings.json: a CC-parity `webSearch` section (the SettingsSchema outer `.passthrough()` preserves it).
20
- *
21
- * PURE — no env/file IO of its OWN (callers pass `env` / `raw`), so it bundles + unit-tests without the heavy
22
- * settings graph, exactly like mcpWireCaps. The CALLER (seamQuery / seamQueryEngine) gates the env read to LIVE
23
- * mode so the mock request shape never changes; webSearch presence IS the opt-in (no extra flag needed).
24
- */
25
1
  import { type EnvLike } from './hostEnv.js';
26
- /** The search providers the service backend speaks (web-search.ts `WebSearchProvider`). */
27
2
  export type WebSearchProvider = 'brave' | 'tavily' | 'searxng';
28
- /** The `SemaSettings.webSearch` wire shape — mirrors the service's per-request parser input
29
- * (web-search.ts `webSearchConfigFromSettings`: `{ provider, apiKey?, endpoint?, maxResults? }`). */
30
3
  export interface WebSearchSettings {
31
4
  provider: WebSearchProvider;
32
- /** API key (brave/tavily). The service keeps it in a closure — it never reaches the model or the tool args. */
33
5
  apiKey?: string;
34
- /** SearXNG base URL (REQUIRED for searxng); for brave/tavily an optional base-URL override. */
35
6
  endpoint?: string;
36
- /** Max results returned to the model (the service clamps 1..20; default 10). */
37
7
  maxResults?: number;
38
8
  }
39
- /** The four env keys the shell reads. SEMA_-namespaced so they never collide with the worker's deploy
40
- * `WEB_SEARCH_*` env (the service reads BOTH — a per-request body.settings.webSearch WINS over its env). */
41
9
  export declare const WEBSEARCH_ENV: {
42
10
  readonly provider: "SEMA_WEBSEARCH_PROVIDER";
43
11
  readonly endpoint: "SEMA_WEBSEARCH_ENDPOINT";
44
12
  readonly apiKey: "SEMA_WEBSEARCH_API_KEY";
45
13
  readonly maxResults: "SEMA_WEBSEARCH_MAX_RESULTS";
46
14
  };
47
- /** ENV source → WebSearchSettings, or undefined when no/invalid provider (⇒ no stamp; service uses its env/none). */
48
15
  export declare function webSearchFromEnv(env?: EnvLike): WebSearchSettings | undefined;
49
- /** settings.json `webSearch` section (UNTRUSTED passthrough value) → WebSearchSettings, mirroring the service's
50
- * `webSearchConfigFromSettings`. Missing/invalid provider ⇒ undefined (omit). NEVER throws. */
51
16
  export declare function webSearchFromSettings(raw: unknown): WebSearchSettings | undefined;
52
- /** Resolve the effective WebSearch config: ENV wins (the primary lane), else the settings.json section.
53
- * Undefined ⇒ no stamp (the service falls back to its deploy-env backend, or ships no WebSearch tool). */
54
17
  export declare function resolveWebSearch(env?: EnvLike, settingsRaw?: unknown): WebSearchSettings | undefined;
@@ -1,47 +1,18 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/webSearchWireCaps.ts 逐字搬入(零依赖)。
3
- */
4
- /**
5
- * src/sema/webSearchWireCaps.ts — PURE projection: the shell's WebSearch backend config → the @sema-ai
6
- * `SemaSettings.webSearch` wire shape carried on `TaskRequest.settings.webSearch`.
7
- *
8
- * The SERVICE consumes `body.settings.webSearch` — ai-agent-service `src/plugins/web-search.ts`
9
- * `webSearchConfigFromSettings(raw)` reads a per-request `{ provider, apiKey?, endpoint?, maxResults? }` that
10
- * WINS over the deployment-env backend, gated to the single-user host lane (a per-request endpoint/apiKey is a
11
- * capability config; on multi-tenant it would be SSRF, so multi-tenant uses ONLY the deploy-env backend —
12
- * design/107). The service validates `provider ∈ brave | tavily | searxng` and DROPS a missing/invalid provider
13
- * (it never throws — a bad config falls back to the deploy-env backend). We mirror that exact validation here so
14
- * the shell never stamps a config the service would reject.
15
- *
16
- * Two config sources, ENV wins (the primary / verify lane):
17
- * - ENV: `SEMA_WEBSEARCH_PROVIDER` / `_ENDPOINT` / `_API_KEY` / `_MAX_RESULTS` (SEMA_-namespaced, distinct from
18
- * the SERVICE's own deploy `WEB_SEARCH_*` env so the shell config never collides with the worker's).
19
- * - settings.json: a CC-parity `webSearch` section (the SettingsSchema outer `.passthrough()` preserves it).
20
- *
21
- * PURE — no env/file IO of its OWN (callers pass `env` / `raw`), so it bundles + unit-tests without the heavy
22
- * settings graph, exactly like mcpWireCaps. The CALLER (seamQuery / seamQueryEngine) gates the env read to LIVE
23
- * mode so the mock request shape never changes; webSearch presence IS the opt-in (no extra flag needed).
24
- */
25
1
  import { hostEnv } from './hostEnv.js';
26
- /** The four env keys the shell reads. SEMA_-namespaced so they never collide with the worker's deploy
27
- * `WEB_SEARCH_*` env (the service reads BOTH — a per-request body.settings.webSearch WINS over its env). */
28
2
  export const WEBSEARCH_ENV = {
29
3
  provider: 'SEMA_WEBSEARCH_PROVIDER',
30
4
  endpoint: 'SEMA_WEBSEARCH_ENDPOINT',
31
5
  apiKey: 'SEMA_WEBSEARCH_API_KEY',
32
6
  maxResults: 'SEMA_WEBSEARCH_MAX_RESULTS',
33
7
  };
34
- /** Validate a provider EXACTLY as the service does (trim + lowercase; only the three known providers). */
35
8
  function normProvider(v) {
36
9
  const p = typeof v === 'string' ? v.trim().toLowerCase() : '';
37
10
  return p === 'brave' || p === 'tavily' || p === 'searxng' ? p : undefined;
38
11
  }
39
- /** Parse a positive integer maxResults (string env or number); undefined when absent/invalid (service clamps). */
40
12
  function normMax(v) {
41
13
  const n = typeof v === 'number' ? v : Number(v);
42
14
  return Number.isFinite(n) && n > 0 ? Math.floor(n) : undefined;
43
15
  }
44
- /** Assemble a `WebSearchSettings`, omitting empty optionals (never stamp `apiKey:''`/`endpoint:''`/`maxResults:0`). */
45
16
  function build(provider, apiKey, endpoint, maxResults) {
46
17
  const max = normMax(maxResults);
47
18
  return {
@@ -51,15 +22,12 @@ function build(provider, apiKey, endpoint, maxResults) {
51
22
  ...(max ? { maxResults: max } : {}),
52
23
  };
53
24
  }
54
- /** ENV source → WebSearchSettings, or undefined when no/invalid provider (⇒ no stamp; service uses its env/none). */
55
25
  export function webSearchFromEnv(env = hostEnv()) {
56
26
  const provider = normProvider(env[WEBSEARCH_ENV.provider]);
57
27
  if (!provider)
58
28
  return undefined;
59
29
  return build(provider, env[WEBSEARCH_ENV.apiKey], env[WEBSEARCH_ENV.endpoint], env[WEBSEARCH_ENV.maxResults]);
60
30
  }
61
- /** settings.json `webSearch` section (UNTRUSTED passthrough value) → WebSearchSettings, mirroring the service's
62
- * `webSearchConfigFromSettings`. Missing/invalid provider ⇒ undefined (omit). NEVER throws. */
63
31
  export function webSearchFromSettings(raw) {
64
32
  if (!raw || typeof raw !== 'object')
65
33
  return undefined;
@@ -69,8 +37,6 @@ export function webSearchFromSettings(raw) {
69
37
  return undefined;
70
38
  return build(provider, s.apiKey, s.endpoint, s.maxResults);
71
39
  }
72
- /** Resolve the effective WebSearch config: ENV wins (the primary lane), else the settings.json section.
73
- * Undefined ⇒ no stamp (the service falls back to its deploy-env backend, or ships no WebSearch tool). */
74
40
  export function resolveWebSearch(env = hostEnv(), settingsRaw) {
75
41
  return webSearchFromEnv(env) ?? webSearchFromSettings(settingsRaw);
76
42
  }
@@ -1,81 +1,18 @@
1
- /**
2
- * searchProviderPresets.ts — **搜索 provider 目录**(三端复用:CLI / web / 桌面同吃一份)。
3
- *
4
- * ## 它是什么、不是什么
5
- *
6
- * 与 `model/providerPresets.{ts,json}` **同形不同表**:数据在同名 `.json`(加一家 = 加一行,不改码),
7
- * 类型与查询函数在本文件。区别在于它编译出来的不是「模型目录」而是**引擎的部署 env**:
8
- *
9
- * | env 键 | 取值 | 缺席时 |
10
- * |---|---|---|
11
- * | `WEB_SEARCH_PROVIDER` | `brave` / `tavily` / `searxng` | 🔴 **引擎根本不挂 WebSearch 工具** |
12
- * | `WEB_SEARCH_API_KEY` | brave/tavily 必填;searxng 不需要 | — |
13
- * | `WEB_SEARCH_ENDPOINT` | searxng 必填;brave/tavily 是可选 base-URL 覆盖 | 用厂商默认地址 |
14
- * | `WEB_SEARCH_MAX_RESULTS` | 1..20 | 引擎默认 10 |
15
- * | `WEB_SEARCH_TIMEOUT_MS` | 正整数毫秒 | 引擎默认 10000 |
16
- *
17
- * 🔴 `WEB_SEARCH_ENDPOINT` 的语义是「**引擎**可达的地址」,不是用户机器可达 —— 云端引擎 + 用户
18
- * 内网的 SearXNG(`http://searxng.lan:8080`)是配得上但**跑不通**的组合,端在这一格要提醒用户
19
- * 按引擎所在网络填。本模块只做形校验,拨不拨得通是引擎那一侧的事(本包零网络)。
20
- *
21
- * ## 与 `webSearchWireCaps.ts` 的分工(两条不同的车道,别混)
22
- *
23
- * · `webSearchWireCaps` = **每请求**的 `TaskRequest.settings.webSearch`(单用户宿主车道,
24
- * 服务端 `web-search.ts` 读它、且它压过部署 env);
25
- * · 本文件 = **部署 env** 那一侧的编译器(引擎进程启动时吃的 `WEB_SEARCH_*`)。
26
- * provider 枚举是**同一个**类型(`WebSearchProvider` 从 wireCaps 单向 import),绝不在这里
27
- * 再声明一份 —— 两份枚举漂了编译器永远不会告诉你([多端 wire 契约单一真源])。
28
- *
29
- * ## 三条硬纪律(pure 门 WS 段逐条有断言)
30
- *
31
- * 1. 🔴 **用户没配 ⇒ 一个键都不产出**。`buildWebSearchEnv({})` 恒返回 `{}`,尤其**绝不**产出
32
- * `WEB_SEARCH_PROVIDER: ''` 这类空串键 —— 引擎读到「键在场」就会当作配了,一个空串能把
33
- * 「没开搜索」变成「开了一个必然失败的搜索」。空串比缺席更坏,因为它撒谎。
34
- * 2. 🔴 **不替用户填默认值**。`maxResults`/`timeoutMs` 用户没选就不出键,让引擎用自己的默认
35
- * (`WEB_SEARCH_ENGINE_DEFAULTS` 只供端**显示**「默认 10」)。客户端把当下的引擎默认值钉进
36
- * env,等于引擎哪天改默认值,所有老客户端都在静默压制它。
37
- * 3. 🔴 **不可用的配置一律 fail-closed 且可观测**:缺 key / 缺 endpoint / 数值越界 ⇒
38
- * `buildWebSearchEnv` 返回 `{}`(宁可不挂工具,也不挂一个必然报错的工具),同时
39
- * `validateWebSearchChoice` 给出**具体** reason 供端渲提示 —— 「静默什么都不做」在本层
40
- * 必须是可解释的([honest-absence-not-fabricated-zero])。
41
- *
42
- * ## URL 位的诚实缺席
43
- *
44
- * `consoleUrl`/`signupUrl` 会被端直接拿去开浏览器,编一个 = 把用户送到错误的地方。故只填能可靠
45
- * 确认的官方位;拿不准就**留 null**。JSON 里用显式 `null` 而不是省略键:那是一条「查过、确实没有」
46
- * 的记录,而省略键读起来像是漏了(SearXNG 按定义没有厂商控制台,与 model 表里 ollama/lmstudio
47
- * 那几家同一个道理)。
48
- */
49
1
  import type { WebSearchProvider } from '../webSearchWireCaps.js';
50
- /** 目录一行。`id` 是表行主键、`provider` 是 wire 值 —— 两者刻意分开:日后同一个 provider 可以有
51
- * 多行(比如几个公共 SearXNG 实例各一行),那时 id 才是唯一的那个。 */
52
2
  export interface SearchProviderPreset {
53
3
  id: string;
54
4
  name: string;
55
5
  provider: WebSearchProvider;
56
- /** brave/tavily 为 true。为 false 时本模块**不会**把 apiKey 写进 env(见 buildWebSearchEnv)。 */
57
6
  needsKey: boolean;
58
- /** searxng 为 true —— 没有 endpoint 这家根本无从谈起,故缺席时整份配置 fail-closed。 */
59
7
  endpointRequired: boolean;
60
- /** 端拿去做输入框 placeholder 的**示例**地址。🔴 它不是默认值:本模块绝不自动把它写进 env。 */
61
8
  endpointTemplate?: string;
62
- /** 去哪拿 key 的官方控制台页(纯链接,离线也能显示)。拿不准的家缺席,绝不编。 */
63
9
  consoleUrl?: string;
64
- /** 没账号时的注册入口。与 `consoleUrl` 同页的家不重复填(缺席 = 用 consoleUrl 那条)。 */
65
10
  signupUrl?: string;
66
11
  note?: string;
67
12
  }
68
- /** 搜索 provider 目录(表序即端的展示序)。 */
69
13
  export declare const SEARCH_PROVIDER_PRESETS: SearchProviderPreset[];
70
- /**
71
- * 数据表自检口(与 `compensationSplitViolations()` 同一个套路:表的不变量做成可执行判据,
72
- * 由门断言恒空)。上面 `toPreset` 对非法 provider 的行只能**丢掉**(类型化的表里放不下它),
73
- * 丢掉本身是静默的 —— 这个函数就是那份静默的账。
74
- */
75
14
  export declare function searchPresetTableViolations(): string[];
76
- /** 按 id 取一行(trim + 大小写不敏感,与 wire 侧 provider 归一同口径)。查不到 ⇒ undefined。 */
77
15
  export declare function findSearchPreset(id: string | undefined): SearchProviderPreset | undefined;
78
- /** 引擎吃的五个 env 键(单一真源:端别再手写字面量)。 */
79
16
  export declare const WEB_SEARCH_ENV_KEYS: {
80
17
  readonly provider: "WEB_SEARCH_PROVIDER";
81
18
  readonly apiKey: "WEB_SEARCH_API_KEY";
@@ -85,21 +22,17 @@ export declare const WEB_SEARCH_ENV_KEYS: {
85
22
  };
86
23
  export declare const WEB_SEARCH_MAX_RESULTS_MIN = 1;
87
24
  export declare const WEB_SEARCH_MAX_RESULTS_MAX = 20;
88
- /** 引擎侧的默认值,**只供端显示**(「默认 10」)。🔴 绝不由本模块写进 env,理由见文件头纪律 2。 */
89
25
  export declare const WEB_SEARCH_ENGINE_DEFAULTS: {
90
26
  readonly maxResults: 10;
91
27
  readonly timeoutMs: 10000;
92
28
  };
93
- /** 用户在端上做出的选择。全可选 —— 「什么都没选」是合法输入,答案是空 env。 */
94
29
  export interface WebSearchChoice {
95
30
  presetId?: string;
96
31
  apiKey?: string;
97
- /** 🔴 语义 = **引擎**可达的地址。http 与 https 都收(内网自建 SearXNG 常是明文口)。 */
98
32
  endpoint?: string;
99
33
  maxResults?: number;
100
34
  timeoutMs?: number;
101
35
  }
102
- /** 配置不可用的**具体**理由(端据此渲提示;「就是没生效」不算交代)。 */
103
36
  export type WebSearchChoiceReason = 'no-preset' | 'unknown-preset' | 'missing-api-key' | 'missing-endpoint' | 'invalid-endpoint' | 'max-results-out-of-range' | 'invalid-timeout';
104
37
  export type WebSearchChoiceVerdict = {
105
38
  ok: true;
@@ -108,19 +41,5 @@ export type WebSearchChoiceVerdict = {
108
41
  ok: false;
109
42
  reason: WebSearchChoiceReason;
110
43
  };
111
- /**
112
- * 判定一份选择能不能编译成可用的 env。**纯判定,不产出任何值** —— 端可以在用户还在输入时
113
- * 反复调它做即时提示,不必担心把半截配置漏给引擎。
114
- *
115
- * 🔴 越界的 `maxResults` 判红而不是 clamp:引擎那侧确实会 clamp,但客户端替用户把 50 改成 20
116
- * 是**替他改了他填的数**却不告诉他。宁可红一下让端说「1..20」。
117
- */
118
44
  export declare function validateWebSearchChoice(choice?: WebSearchChoice): WebSearchChoiceVerdict;
119
- /**
120
- * 用户选择 → 引擎 env。**唯一**的编译口(端别自己拼字面量键)。
121
- *
122
- * 🔴 三条已在文件头写死的纪律在这里落地:配置不可用 ⇒ `{}`(fail-closed,理由去问
123
- * `validateWebSearchChoice`);用户没填的可选项不出键(不替引擎钉默认值);任何值都先 trim,
124
- * 空串一律当没填 —— 返回的对象里**不存在**值为空串的键。
125
- */
126
45
  export declare function buildWebSearchEnv(choice?: WebSearchChoice): Record<string, string>;