@sema-agent/client-core 0.99.0 → 0.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/CHANGELOG.md +572 -0
  2. package/README.md +174 -114
  3. package/dist/adapt/arms.js +109 -50
  4. package/dist/adapt/panelTasks.d.ts +2 -1
  5. package/dist/adapt/panelTasks.js +32 -9
  6. package/dist/adapt/textStream.d.ts +1 -1
  7. package/dist/adapt/textStream.js +58 -32
  8. package/dist/adapt/toolCards.js +9 -8
  9. package/dist/adapt.js +7 -1
  10. package/dist/adapter/activeRunSelfHeal.d.ts +31 -2
  11. package/dist/adapter/activeRunSelfHeal.js +162 -13
  12. package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
  13. package/dist/adapter/downstream/eventToSdkMessage.js +157 -20
  14. package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
  15. package/dist/adapter/downstream/terminalToSdkResult.js +219 -39
  16. package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
  17. package/dist/adapter/downstream/wiringManifestView.js +1 -0
  18. package/dist/adapter/runStream.d.ts +4 -4
  19. package/dist/adapter/runStream.js +184 -42
  20. package/dist/adapter/types.d.ts +2 -0
  21. package/dist/agentsWireCaps.d.ts +9 -7
  22. package/dist/agentsWireCaps.js +101 -17
  23. package/dist/approvalDecidedByCapability.js +2 -2
  24. package/dist/approvalFrameFamilies.d.ts +33 -0
  25. package/dist/approvalFrameFamilies.js +120 -0
  26. package/dist/approvalsStreamLiveCapability.js +2 -2
  27. package/dist/attachmentsWireCaps.js +41 -13
  28. package/dist/callerCwdCapability.js +2 -2
  29. package/dist/centerWiringCapability.js +2 -2
  30. package/dist/clockReading.d.ts +2 -0
  31. package/dist/clockReading.js +4 -0
  32. package/dist/cloudConfigWireCaps.d.ts +28 -5
  33. package/dist/cloudConfigWireCaps.js +334 -103
  34. package/dist/compactionStatus.d.ts +34 -0
  35. package/dist/compactionStatus.js +196 -0
  36. package/dist/coreValuePorts.d.ts +12 -2
  37. package/dist/coreValuePorts.js +9 -0
  38. package/dist/decideFailureNote.js +8 -6
  39. package/dist/decideReceipt.js +2 -2
  40. package/dist/deviceExecutorManagementCapability.js +2 -2
  41. package/dist/deviceFlowPolling.js +1 -1
  42. package/dist/disableSkillsWire.d.ts +1 -1
  43. package/dist/disableSkillsWire.js +4 -3
  44. package/dist/displayUntrusted.d.ts +1 -0
  45. package/dist/displayUntrusted.js +215 -13
  46. package/dist/engineAgentPanelStore.d.ts +7 -4
  47. package/dist/engineCapReader.js +1 -1
  48. package/dist/engineConfigDrift.js +1 -1
  49. package/dist/engineErrorCodes.d.ts +23 -6
  50. package/dist/engineErrorCodes.js +36 -11
  51. package/dist/engineGenerationConvergence.d.ts +39 -0
  52. package/dist/engineGenerationConvergence.js +95 -0
  53. package/dist/engineGenerationPort.d.ts +61 -0
  54. package/dist/engineGenerationPort.js +144 -0
  55. package/dist/engineHealthFacts.d.ts +23 -0
  56. package/dist/engineHealthFacts.js +92 -0
  57. package/dist/engineIdentity.d.ts +4 -0
  58. package/dist/engineIdentity.js +11 -0
  59. package/dist/engineNoticeCodes.d.ts +2 -5
  60. package/dist/engineRowRef.js +4 -0
  61. package/dist/engineSessionMessages.js +2 -2
  62. package/dist/engineToolDirectory.d.ts +3 -0
  63. package/dist/engineToolDirectory.js +6 -4
  64. package/dist/engineWireFor.d.ts +99 -0
  65. package/dist/engineWireFor.js +248 -6
  66. package/dist/engineWireTarget.d.ts +1 -0
  67. package/dist/engineWireTarget.js +8 -0
  68. package/dist/env/uiLanguage.js +1 -1
  69. package/dist/errorSupplementRoles.d.ts +3 -0
  70. package/dist/errorSupplementRoles.js +37 -0
  71. package/dist/eventLeg.d.ts +1 -7
  72. package/dist/eventLeg.js +7 -8
  73. package/dist/executionLaneCapability.js +2 -2
  74. package/dist/fileHistoryCaptureCapability.d.ts +0 -3
  75. package/dist/fileHistoryCaptureCapability.js +3 -7
  76. package/dist/finalVerifyWire.d.ts +6 -3
  77. package/dist/finalVerifyWire.js +6 -23
  78. package/dist/flagInput.d.ts +4 -0
  79. package/dist/flagInput.js +24 -0
  80. package/dist/fleet/fleetLedger.js +5 -2
  81. package/dist/fleet/fleetProjection.d.ts +1 -0
  82. package/dist/fleet/fleetProjection.js +15 -2
  83. package/dist/gateVocabulary.js +3 -0
  84. package/dist/generated/engineFactTables.d.ts +7 -2
  85. package/dist/generated/engineFactTables.js +79 -0
  86. package/dist/generated/engineNoticeTables.js +15 -0
  87. package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
  88. package/dist/generated/settingsSchemaActiveTiers.js +14 -0
  89. package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
  90. package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
  91. package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
  92. package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
  93. package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
  94. package/dist/generated/settingsSchemaDefaultModel.js +25 -0
  95. package/dist/generated/settingsSchemaFns.d.ts +66 -0
  96. package/dist/generated/settingsSchemaFns.js +38 -0
  97. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
  98. package/dist/generated/settingsSchemaMcpRequestEntry.js +156 -0
  99. package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
  100. package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
  101. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
  102. package/dist/generated/settingsSchemaSettingsSources.js +58 -0
  103. package/dist/generated/settingsSchemaTables.d.ts +3 -0
  104. package/dist/generated/settingsSchemaTables.js +18 -0
  105. package/dist/generated/settingsSchemaTypes.d.ts +28 -0
  106. package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
  107. package/dist/generated/settingsSchemaUrlPattern.js +183 -0
  108. package/dist/headlessPermissionModeWire.d.ts +18 -2
  109. package/dist/headlessPermissionModeWire.js +30 -19
  110. package/dist/hitl/allowRuleShadow.js +9 -7
  111. package/dist/hitl/approvalCardReading.d.ts +3 -0
  112. package/dist/hitl/approvalCardReading.js +17 -0
  113. package/dist/hitl/approvalCardReasons.js +2 -2
  114. package/dist/hitl/approvalCompleteParked.js +1 -1
  115. package/dist/hitl/approvalDelivery.d.ts +87 -0
  116. package/dist/hitl/approvalDelivery.js +193 -0
  117. package/dist/hitl/approvalHolds.d.ts +14 -0
  118. package/dist/hitl/approvalHolds.js +41 -0
  119. package/dist/hitl/approvalResolution.d.ts +11 -0
  120. package/dist/hitl/approvalResolution.js +50 -11
  121. package/dist/hitl/askClassPair.d.ts +8 -2
  122. package/dist/hitl/askClassPair.js +31 -4
  123. package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
  124. package/dist/hitl/askParkAutoReopenBlock.js +117 -0
  125. package/dist/hitl/askParkRowRouting.js +4 -1
  126. package/dist/hitl/attributionLadder.d.ts +62 -0
  127. package/dist/hitl/attributionLadder.js +138 -0
  128. package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
  129. package/dist/hitl/automaticAnswerVerdict.js +46 -11
  130. package/dist/hitl/crashConverged.js +2 -2
  131. package/dist/hitl/decisionConflict.d.ts +6 -2
  132. package/dist/hitl/decisionConflict.js +24 -9
  133. package/dist/hitl/decisionLedger.d.ts +55 -0
  134. package/dist/hitl/decisionLedger.js +156 -0
  135. package/dist/hitl/decisionRefusal.d.ts +21 -10
  136. package/dist/hitl/decisionRefusal.js +100 -55
  137. package/dist/hitl/decisionSend.d.ts +116 -0
  138. package/dist/hitl/decisionSend.js +563 -0
  139. package/dist/hitl/frameRouter.d.ts +1 -0
  140. package/dist/hitl/frameRouter.js +9 -2
  141. package/dist/hitl/hitlBridge.d.ts +18 -6
  142. package/dist/hitl/hitlBridge.js +59 -43
  143. package/dist/hitl/livePendingAsk.js +4 -3
  144. package/dist/hitl/noAllowCause.js +1 -1
  145. package/dist/hitl/parkResolver.js +3 -2
  146. package/dist/hitl/persistedRulesWire.js +1 -0
  147. package/dist/hitl/planReviewWire.d.ts +4 -0
  148. package/dist/hitl/planReviewWire.js +104 -106
  149. package/dist/hitl/resumeRunningCard.d.ts +3 -2
  150. package/dist/hitl/resumeRunningCard.js +17 -11
  151. package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
  152. package/dist/hitl/sessionPolicyDeliverable.js +65 -35
  153. package/dist/hitl/sessionPolicyWire.d.ts +13 -3
  154. package/dist/hitl/sessionPolicyWire.js +81 -16
  155. package/dist/hitl/standingRows.js +1 -1
  156. package/dist/hitl/toolApprovalWire.d.ts +9 -10
  157. package/dist/hitl/toolApprovalWire.js +103 -151
  158. package/dist/hookMatcherVerdict.d.ts +2 -0
  159. package/dist/hookMatcherVerdict.js +12 -0
  160. package/dist/hooksCompactTransition.d.ts +19 -0
  161. package/dist/hooksCompactTransition.js +41 -0
  162. package/dist/hooksWireCaps.d.ts +1 -1
  163. package/dist/hooksWireCaps.js +202 -203
  164. package/dist/host.d.ts +1 -14
  165. package/dist/host.js +0 -8
  166. package/dist/hostCallbackGuard.d.ts +1 -0
  167. package/dist/hostCallbackGuard.js +1 -1
  168. package/dist/hostSettingsSource.d.ts +172 -0
  169. package/dist/hostSettingsSource.js +675 -0
  170. package/dist/hostTurnSettings.d.ts +114 -19
  171. package/dist/hostTurnSettings.js +966 -68
  172. package/dist/httpHookPolicy.d.ts +37 -0
  173. package/dist/httpHookPolicy.js +176 -0
  174. package/dist/humanTurn.d.ts +4 -2
  175. package/dist/humanTurn.js +40 -10
  176. package/dist/humanTurnRead.js +4 -3
  177. package/dist/humanTurnSentences.d.ts +10 -0
  178. package/dist/humanTurnSentences.js +74 -0
  179. package/dist/i18n/messages.en.d.ts +313 -0
  180. package/dist/i18n/messages.en.js +326 -13
  181. package/dist/i18n/messages.zh.js +341 -13
  182. package/dist/i18n/translate.js +3 -3
  183. package/dist/index.d.ts +85 -15
  184. package/dist/index.js +53 -12
  185. package/dist/inheritEnvCapability.d.ts +4 -1
  186. package/dist/inheritEnvCapability.js +38 -17
  187. package/dist/inheritEnvWire.d.ts +2 -1
  188. package/dist/inheritEnvWire.js +11 -5
  189. package/dist/injectionLaneNotice.d.ts +5 -0
  190. package/dist/injectionLaneNotice.js +46 -0
  191. package/dist/interactiveToolsWire.d.ts +4 -2
  192. package/dist/interactiveToolsWire.js +5 -5
  193. package/dist/jsonFaithful.d.ts +20 -0
  194. package/dist/jsonFaithful.js +152 -0
  195. package/dist/limitsWire.d.ts +7 -2
  196. package/dist/limitsWire.js +19 -13
  197. package/dist/liveInitToolFace.d.ts +6 -1
  198. package/dist/liveInitToolFace.js +5 -3
  199. package/dist/liveModelCatalog.d.ts +22 -0
  200. package/dist/liveModelCatalog.js +132 -18
  201. package/dist/mcpPanel.js +3 -1
  202. package/dist/mcpProbeCapability.js +2 -2
  203. package/dist/mcpReconnect.js +2 -2
  204. package/dist/mcpStatusSupersetKeys.d.ts +24 -0
  205. package/dist/mcpStatusSupersetKeys.js +45 -0
  206. package/dist/mcpToolToggles.d.ts +6 -0
  207. package/dist/mcpToolToggles.js +47 -0
  208. package/dist/mcpWireCaps.d.ts +48 -4
  209. package/dist/mcpWireCaps.js +338 -99
  210. package/dist/mcpWireTransport.d.ts +4 -0
  211. package/dist/mcpWireTransport.js +18 -0
  212. package/dist/memoryComplianceCapability.js +2 -2
  213. package/dist/memoryOriginCapability.js +2 -2
  214. package/dist/model/catalogDefault.d.ts +24 -0
  215. package/dist/model/catalogDefault.js +4 -0
  216. package/dist/model/liveCatalogShape.js +5 -4
  217. package/dist/model/modelsPolicy.js +4 -3
  218. package/dist/model/onboardJudgement.d.ts +1 -0
  219. package/dist/model/onboardJudgement.js +1 -1
  220. package/dist/model/subagentModelWord.js +2 -2
  221. package/dist/modelCapabilityProbe.d.ts +2 -1
  222. package/dist/modelCapabilityProbe.js +16 -15
  223. package/dist/modelIdentityResolvability.d.ts +12 -1
  224. package/dist/modelIdentityResolvability.js +69 -28
  225. package/dist/modsKernelIdentity.d.ts +10 -0
  226. package/dist/modsKernelIdentity.js +103 -0
  227. package/dist/modsKernelTransit.d.ts +8 -0
  228. package/dist/modsKernelTransit.js +6 -0
  229. package/dist/notifications.d.ts +30 -12
  230. package/dist/notifications.js +241 -53
  231. package/dist/outputStyleSeatCapability.js +2 -2
  232. package/dist/ownKey.d.ts +37 -0
  233. package/dist/ownKey.js +238 -2
  234. package/dist/panelReduce.d.ts +5 -0
  235. package/dist/panelReduce.js +45 -13
  236. package/dist/panelStateHolder.d.ts +1 -0
  237. package/dist/panelStateHolder.js +10 -1
  238. package/dist/peerFrames.d.ts +1 -1
  239. package/dist/peerFrames.js +6 -2
  240. package/dist/peerLaneCapability.js +2 -2
  241. package/dist/permissionModesCapability.js +4 -4
  242. package/dist/permissionRuleIssue.d.ts +2 -1
  243. package/dist/permissionRuleIssue.js +24 -21
  244. package/dist/permissionRulesWriteCapability.js +2 -2
  245. package/dist/permissionsAllowGrantCapability.js +2 -2
  246. package/dist/permissionsDeclaration.d.ts +43 -4
  247. package/dist/permissionsDeclaration.js +102 -35
  248. package/dist/pluginHooksWire.d.ts +20 -4
  249. package/dist/pluginHooksWire.js +101 -60
  250. package/dist/prepareRefusal.d.ts +9 -0
  251. package/dist/prepareRefusal.js +90 -0
  252. package/dist/printInitToolFace.js +2 -2
  253. package/dist/printModelStatus.js +1 -1
  254. package/dist/projectMemory.d.ts +32 -0
  255. package/dist/projectMemory.js +70 -0
  256. package/dist/promptBlockedCopy.d.ts +2 -1
  257. package/dist/promptBlockedCopy.js +2 -1
  258. package/dist/promptDelivery.d.ts +23 -3
  259. package/dist/promptDelivery.js +169 -30
  260. package/dist/providerRejection.d.ts +19 -1
  261. package/dist/providerRejection.js +75 -4
  262. package/dist/queuedDelivery.d.ts +48 -0
  263. package/dist/queuedDelivery.js +233 -0
  264. package/dist/reattachWindow.d.ts +94 -0
  265. package/dist/reattachWindow.js +127 -0
  266. package/dist/request/printNotification.d.ts +1 -1
  267. package/dist/request/printNotification.js +5 -1
  268. package/dist/request/submissionIdentity.d.ts +37 -0
  269. package/dist/request/submissionIdentity.js +65 -0
  270. package/dist/request/taskRequest.d.ts +22 -14
  271. package/dist/request/taskRequest.js +312 -202
  272. package/dist/resultFrameKeys.d.ts +1 -0
  273. package/dist/resultFrameKeys.js +4 -1
  274. package/dist/resumeRefusalCopy.d.ts +3 -1
  275. package/dist/resumeRefusalCopy.js +22 -4
  276. package/dist/retryStatus.d.ts +26 -0
  277. package/dist/retryStatus.js +133 -28
  278. package/dist/rewindArchiveCapability.js +2 -2
  279. package/dist/rewindEngineAction.d.ts +2 -0
  280. package/dist/rewindEngineAction.js +23 -1
  281. package/dist/rowKind.d.ts +36 -0
  282. package/dist/rowKind.js +97 -0
  283. package/dist/ruleCompileVerdict.d.ts +18 -0
  284. package/dist/ruleCompileVerdict.js +67 -2
  285. package/dist/ruleReadings.d.ts +58 -0
  286. package/dist/ruleReadings.js +132 -0
  287. package/dist/ruleRefusalSentence.d.ts +8 -0
  288. package/dist/ruleRefusalSentence.js +64 -0
  289. package/dist/runCancelContext.d.ts +0 -1
  290. package/dist/runCancelContext.js +1 -2
  291. package/dist/runTerminal.d.ts +5 -0
  292. package/dist/runTerminal.js +52 -17
  293. package/dist/sandboxWire.d.ts +3 -2
  294. package/dist/sandboxWire.js +59 -27
  295. package/dist/scenarioRefusal.d.ts +2 -1
  296. package/dist/scenarioRefusal.js +6 -6
  297. package/dist/scenarioSkills.d.ts +20 -0
  298. package/dist/scenarioSkills.js +72 -0
  299. package/dist/scenarioWire.d.ts +5 -2
  300. package/dist/scenarioWire.js +9 -9
  301. package/dist/sealedKeyCapability.js +2 -2
  302. package/dist/seam.d.ts +26 -9
  303. package/dist/seam.js +44 -4
  304. package/dist/seatContract.d.ts +62 -9
  305. package/dist/seatContract.js +70 -25
  306. package/dist/selfOrchestrationDenial.js +1 -1
  307. package/dist/sessionPolicyCapability.js +2 -2
  308. package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
  309. package/dist/sessionRulesChildrenReadLive.js +5 -0
  310. package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
  311. package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
  312. package/dist/sessionSyncFileHistoryCapability.js +2 -2
  313. package/dist/settingsCredentialKeyPaths.d.ts +8 -0
  314. package/dist/settingsCredentialKeyPaths.js +274 -0
  315. package/dist/settingsHooksSalvage.d.ts +1 -0
  316. package/dist/settingsHooksSalvage.js +7 -1
  317. package/dist/settingsLayerAdmission.d.ts +4 -0
  318. package/dist/settingsLayerAdmission.js +16 -0
  319. package/dist/skillToolListsCapability.js +6 -5
  320. package/dist/skillsWireCaps.d.ts +14 -3
  321. package/dist/skillsWireCaps.js +48 -18
  322. package/dist/slashCommandGate.d.ts +24 -0
  323. package/dist/slashCommandGate.js +74 -0
  324. package/dist/slashCommandTable.d.ts +14 -0
  325. package/dist/slashCommandTable.js +99 -0
  326. package/dist/sqlEngineCapability.js +2 -2
  327. package/dist/steerPriorityCapability.js +2 -2
  328. package/dist/storePostureCapability.js +2 -2
  329. package/dist/subagent/agentStateDetail.js +1 -1
  330. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
  331. package/dist/subagent/engineDelegatedPrompt.js +38 -7
  332. package/dist/subagent/engineRowStopGate.js +2 -2
  333. package/dist/subagent/engineSubagentResume.js +3 -3
  334. package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
  335. package/dist/subagent/engineTaskHandleWire.js +10 -0
  336. package/dist/subagentContentStore.d.ts +1 -0
  337. package/dist/subagentContentStore.js +135 -27
  338. package/dist/submitFailure.d.ts +8 -0
  339. package/dist/submitFailure.js +17 -0
  340. package/dist/supportFloor.d.ts +1 -0
  341. package/dist/supportFloor.js +7 -0
  342. package/dist/terminationIntent.d.ts +55 -0
  343. package/dist/terminationIntent.js +352 -0
  344. package/dist/toolHistoryMismatch.d.ts +8 -0
  345. package/dist/toolHistoryMismatch.js +37 -6
  346. package/dist/toolResult.d.ts +13 -3
  347. package/dist/toolResult.js +158 -9
  348. package/dist/toolResultContent.d.ts +13 -0
  349. package/dist/toolResultContent.js +82 -7
  350. package/dist/toolRoster.d.ts +18 -0
  351. package/dist/toolRoster.js +64 -0
  352. package/dist/toolsFlagNames.d.ts +8 -0
  353. package/dist/toolsFlagNames.js +110 -0
  354. package/dist/turnFailurePresentation.js +41 -96
  355. package/dist/usageLimitAutoResume.d.ts +74 -0
  356. package/dist/usageLimitAutoResume.js +227 -0
  357. package/dist/userAttachmentEnvelope.js +1 -1
  358. package/dist/userAttachmentSeat.js +5 -5
  359. package/dist/userInvokedSkillsCapability.js +2 -2
  360. package/dist/webSearchBackendCapability.js +2 -2
  361. package/dist/wireErrorTriage.js +99 -50
  362. package/dist/wireFailureShape.d.ts +25 -1
  363. package/dist/wireFailureShape.js +92 -5
  364. package/dist/wireRefusalCopy.d.ts +75 -18
  365. package/dist/wireRefusalCopy.js +532 -148
  366. package/dist/wiringFleetDoctor.d.ts +3 -0
  367. package/dist/wiringFleetDoctor.js +21 -0
  368. package/dist/workflow.d.ts +2 -1
  369. package/dist/workflow.js +38 -1
  370. package/dist/workflowClient.d.ts +2 -7
  371. package/dist/workflowsJournalCapability.js +2 -2
  372. package/dist/writeProtectionCapability.js +2 -2
  373. package/docs/INTEGRATION-CLIENTS.md +1013 -190
  374. package/package.json +15 -4
@@ -1,8 +1,5 @@
1
1
  import type { SkillSpec } from '@sema-agent/sdk';
2
2
  import { type SkillToolListsReading } from './skillToolListsCapability.js';
3
- export declare const SKILL_CAPS: {
4
- readonly content: 1048576;
5
- };
6
3
  export interface SkillCmdLike {
7
4
  type?: string;
8
5
  name?: string;
@@ -24,4 +21,18 @@ export interface SkillSpecsOptions {
24
21
  skillToolLists?: SkillToolListsReading;
25
22
  }
26
23
  export declare function skillBaseDirOf(skillRoot: string | undefined, platform?: 'posix' | 'win32'): string | undefined;
24
+ export type SkillToolListKey = 'allowedTools' | 'disallowedTools';
25
+ export type SkillToolListsVerdict = {
26
+ readonly kind: 'ok';
27
+ readonly lists: {
28
+ allowedTools?: string[];
29
+ disallowedTools?: string[];
30
+ };
31
+ } | {
32
+ readonly kind: 'bad';
33
+ readonly key: SkillToolListKey;
34
+ readonly index?: number;
35
+ readonly detail: string;
36
+ };
37
+ export declare function skillToolListsVerdict(source: object, reading: SkillToolListsReading | undefined): SkillToolListsVerdict;
27
38
  export declare function skillCommandsToSpecs(cmds: SkillCmdLike[], resolveBody: (cmd: SkillCmdLike) => string | null, opts?: SkillSpecsOptions): SkillSpecOnWire[];
@@ -1,8 +1,9 @@
1
1
  import { skillToolListsAvailable } from './skillToolListsCapability.js';
2
- export const SKILL_CAPS = { content: 1_048_576 };
2
+ import { msg, renderMessage } from './i18n/translate.js';
3
+ import { appendOwnElement } from './ownKey.js';
3
4
  export function toCappedSpec(name, description, whenToUse, body) {
4
5
  const n = name.trim();
5
- const c = body.trim().slice(0, SKILL_CAPS.content);
6
+ const c = body.trim();
6
7
  if (!n || !c)
7
8
  return null;
8
9
  const desc = [description.trim(), whenToUse.trim()]
@@ -28,14 +29,14 @@ export function skillBaseDirOf(skillRoot, platform = 'posix') {
28
29
  return undefined;
29
30
  return skillRoot;
30
31
  }
31
- function readSkillToolList(skillName, key, cmd) {
32
- const who = `skillCommandsToSpecs: skill ${JSON.stringify(skillName.slice(0, 80))} ${key}`;
32
+ const SKILL_TOOL_LIST_READ_BUDGET = 100_000;
33
+ function readSkillToolList(key, source) {
33
34
  const hint = 'The list is the skill’s own tool rule list and is sent exactly as given (entries are never dropped, repaired, reordered or truncated here), ' +
34
35
  'so a value that is not a list of strings is refused instead of being silently reduced.';
35
- const unreadable = () => new TypeError(`${who} could not be read — reading it (the property, the array length or an entry) threw. ${hint}`);
36
+ const unreadable = () => new TypeError(`could not be read — reading it (the property, the array length or an entry) threw. ${hint}`);
36
37
  let v;
37
38
  try {
38
- v = cmd[key];
39
+ v = source[key];
39
40
  }
40
41
  catch {
41
42
  throw unreadable();
@@ -50,7 +51,7 @@ function readSkillToolList(skillName, key, cmd) {
50
51
  throw unreadable();
51
52
  }
52
53
  if (!isArray) {
53
- throw new TypeError(`${who} must be an array of strings or absent — got ${v === null ? 'null' : typeof v === 'object' ? 'a non-array object' : `typeof ${typeof v}`}. ${hint}`);
54
+ throw new TypeError(`must be an array of strings or absent — got ${v === null ? 'null' : typeof v === 'object' ? 'a non-array object' : `typeof ${typeof v}`}. ${hint}`);
54
55
  }
55
56
  const list = v;
56
57
  let lengthRead;
@@ -61,7 +62,10 @@ function readSkillToolList(skillName, key, cmd) {
61
62
  throw unreadable();
62
63
  }
63
64
  if (typeof lengthRead !== 'number' || !Number.isSafeInteger(lengthRead) || lengthRead < 0 || lengthRead > 4_294_967_295) {
64
- throw new TypeError(`${who} must be an array of strings or absent — its length is not a valid array length. ${hint}`);
65
+ throw new TypeError(`must be an array of strings or absent — its length is not a valid array length. ${hint}`);
66
+ }
67
+ if (lengthRead > SKILL_TOOL_LIST_READ_BUDGET) {
68
+ throw new TypeError(renderMessage(msg('config.skills.toolListTooMany', { got: String(SKILL_TOOL_LIST_READ_BUDGET) })));
65
69
  }
66
70
  const n = lengthRead;
67
71
  const out = [];
@@ -74,18 +78,45 @@ function readSkillToolList(skillName, key, cmd) {
74
78
  throw unreadable();
75
79
  }
76
80
  if (typeof e !== 'string') {
77
- throw new TypeError(`${who} must be an array of strings or absent — the entry at index ${i} is ${e === null ? 'null' : `typeof ${typeof e}`}. ${hint}`);
81
+ throw Object.assign(new TypeError(`must be an array of strings or absent — the entry at index ${i} is ${e === null ? 'null' : `typeof ${typeof e}`}. ${hint}`), { index: i });
78
82
  }
79
- out.push(e);
83
+ appendOwnElement(out, e);
80
84
  }
81
85
  return out;
82
86
  }
87
+ function refusalOf(e, key) {
88
+ const index = e.index;
89
+ return { kind: 'bad', key, ...(typeof index === 'number' ? { index } : {}), detail: e.message };
90
+ }
91
+ export function skillToolListsVerdict(source, reading) {
92
+ if (reading === undefined)
93
+ return { kind: 'ok', lists: {} };
94
+ let allowedTools;
95
+ let disallowedTools;
96
+ try {
97
+ allowedTools = readSkillToolList('allowedTools', source);
98
+ }
99
+ catch (e) {
100
+ return refusalOf(e, 'allowedTools');
101
+ }
102
+ try {
103
+ disallowedTools = readSkillToolList('disallowedTools', source);
104
+ }
105
+ catch (e) {
106
+ return refusalOf(e, 'disallowedTools');
107
+ }
108
+ const toolListsOn = skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
109
+ const lists = {};
110
+ if (toolListsOn && allowedTools !== undefined)
111
+ lists.allowedTools = allowedTools;
112
+ if (toolListsOn && disallowedTools !== undefined)
113
+ lists.disallowedTools = disallowedTools;
114
+ return { kind: 'ok', lists };
115
+ }
83
116
  export function skillCommandsToSpecs(cmds, resolveBody, opts) {
84
117
  const specs = [];
85
118
  const seen = new Set();
86
119
  const reading = opts?.skillToolLists;
87
- const wired = reading !== undefined;
88
- const toolListsOn = wired && skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
89
120
  for (const cmd of cmds) {
90
121
  if (cmd.type !== 'prompt' || cmd.disableModelInvocation)
91
122
  continue;
@@ -97,15 +128,14 @@ export function skillCommandsToSpecs(cmds, resolveBody, opts) {
97
128
  continue;
98
129
  seen.add(spec.name);
99
130
  const baseDir = opts?.toolsRunHere === true ? skillBaseDirOf(cmd.skillRoot, opts.platform ?? 'posix') : undefined;
100
- const allowedTools = wired ? readSkillToolList(spec.name, 'allowedTools', cmd) : undefined;
101
- const disallowedTools = wired ? readSkillToolList(spec.name, 'disallowedTools', cmd) : undefined;
131
+ const verdict = skillToolListsVerdict(cmd, reading);
132
+ if (verdict.kind === 'bad') {
133
+ throw new TypeError(`skillCommandsToSpecs: skill ${JSON.stringify(spec.name.slice(0, 80))} ${verdict.key} ${verdict.detail}`);
134
+ }
102
135
  let wire = spec;
103
136
  if (baseDir !== undefined)
104
137
  wire = { ...wire, baseDir };
105
- if (toolListsOn && allowedTools !== undefined)
106
- wire = { ...wire, allowedTools };
107
- if (toolListsOn && disallowedTools !== undefined)
108
- wire = { ...wire, disallowedTools };
138
+ wire = { ...wire, ...verdict.lists };
109
139
  specs.push(wire);
110
140
  }
111
141
  return specs;
@@ -0,0 +1,24 @@
1
+ import type { Capabilities } from '@sema-agent/sdk';
2
+ import { SLASH_COMMAND_ROSTER_PIN, type SlashCommandBucket, type SlashCommandOverride, type SlashCommandPosture } from './slashCommandTable.js';
3
+ export { SLASH_COMMAND_ROSTER_PIN };
4
+ export type { SlashCommandBucket, SlashCommandOverride, SlashCommandPosture };
5
+ export declare const SLASH_COMMAND_BUCKETS: Readonly<Record<SlashCommandBucket, readonly string[]>>;
6
+ export type SlashCommandGateReason = 'cc-availability' | 'cc-isEnabled' | 'config-deny' | 'capability-absent' | 'capability-degraded' | 'hidden-from-help' | 'allowed';
7
+ export type SlashCommandGateState = 'allowed' | 'degraded' | 'denied';
8
+ export interface SlashCommandGateInput {
9
+ readonly name: string;
10
+ readonly source?: string;
11
+ readonly ccAvailable?: boolean;
12
+ readonly ccEnabled?: boolean;
13
+ }
14
+ export interface SlashCommandVerdict {
15
+ readonly state: SlashCommandGateState;
16
+ readonly visible: boolean;
17
+ readonly degraded: boolean;
18
+ readonly hidden: boolean;
19
+ readonly reason: SlashCommandGateReason;
20
+ readonly requiredCapability?: string;
21
+ }
22
+ export declare function slashCommandBucketOf(name: string): SlashCommandBucket | undefined;
23
+ export declare function slashCommandOverrideOf(name: string): SlashCommandOverride | undefined;
24
+ export declare function judgeSlashCommand(command: SlashCommandGateInput, capabilities: Capabilities | undefined): SlashCommandVerdict;
@@ -0,0 +1,74 @@
1
+ import { guardedRead, readOwnDataValue } from './ownKey.js';
2
+ import { SLASH_COMMAND_BUCKET_FLEET_NA, SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK, SLASH_COMMAND_BUCKET_POSTURE_TABLE, SLASH_COMMAND_BUCKET_PURE_UI, SLASH_COMMAND_OVERRIDE_ROWS, SLASH_COMMAND_ROSTER_PIN, } from './slashCommandTable.js';
3
+ export { SLASH_COMMAND_ROSTER_PIN };
4
+ export const SLASH_COMMAND_BUCKETS = Object.freeze({
5
+ pureUI: SLASH_COMMAND_BUCKET_PURE_UI,
6
+ mappableToSdk: SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK,
7
+ fleetNA: SLASH_COMMAND_BUCKET_FLEET_NA,
8
+ });
9
+ const BUCKET_INDEX = new Map([
10
+ ...SLASH_COMMAND_BUCKET_PURE_UI.map((n) => [n, 'pureUI']),
11
+ ...SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK.map((n) => [n, 'mappableToSdk']),
12
+ ...SLASH_COMMAND_BUCKET_FLEET_NA.map((n) => [n, 'fleetNA']),
13
+ ]);
14
+ const OVERRIDE_INDEX = new Map(SLASH_COMMAND_OVERRIDE_ROWS);
15
+ export function slashCommandBucketOf(name) {
16
+ return typeof name === 'string' ? BUCKET_INDEX.get(name) : undefined;
17
+ }
18
+ export function slashCommandOverrideOf(name) {
19
+ return typeof name === 'string' ? OVERRIDE_INDEX.get(name) : undefined;
20
+ }
21
+ function capabilityPresent(capabilities, key) {
22
+ try {
23
+ const v = guardedRead(() => readOwnDataValue(capabilities, key));
24
+ if (typeof v === 'boolean')
25
+ return v;
26
+ if (typeof v === 'string')
27
+ return v.length > 0;
28
+ if (Array.isArray(v))
29
+ return v.length > 0;
30
+ return Boolean(v);
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ function slot(input, key) {
37
+ return guardedRead(() => readOwnDataValue(input, key));
38
+ }
39
+ function verdict(state, hidden, reason, requiredCapability) {
40
+ return Object.freeze({
41
+ state,
42
+ visible: state !== 'denied',
43
+ degraded: state === 'degraded',
44
+ hidden,
45
+ reason,
46
+ ...(requiredCapability !== undefined ? { requiredCapability } : {}),
47
+ });
48
+ }
49
+ export function judgeSlashCommand(command, capabilities) {
50
+ const rawName = slot(command, 'name');
51
+ const name = typeof rawName === 'string' ? rawName : '';
52
+ if (slot(command, 'ccAvailable') === false)
53
+ return verdict('denied', false, 'cc-availability');
54
+ if (slot(command, 'ccEnabled') === false)
55
+ return verdict('denied', false, 'cc-isEnabled');
56
+ const override = OVERRIDE_INDEX.get(name);
57
+ const bucket = BUCKET_INDEX.get(name);
58
+ const bucketPosture = (bucket !== undefined ? SLASH_COMMAND_BUCKET_POSTURE_TABLE[bucket] : undefined) ?? 'allow';
59
+ const explicit = override?.mode;
60
+ const mode = explicit === 'allow' || explicit === 'deny' ? explicit : bucketPosture;
61
+ if (mode === 'deny')
62
+ return verdict('denied', false, 'config-deny');
63
+ const source = slot(command, 'source');
64
+ const builtin = source === undefined || source === 'builtin';
65
+ const unbucketedFallthrough = builtin && bucket === undefined && explicit !== 'allow' && explicit !== 'deny';
66
+ const hidden = override?.hidden === true || unbucketedFallthrough;
67
+ const required = override?.requiredCapability;
68
+ if (required !== undefined && required !== '' && !capabilityPresent(capabilities, required)) {
69
+ if (override?.degradeWhenAbsent === true)
70
+ return verdict('degraded', hidden, 'capability-degraded', required);
71
+ return verdict('denied', false, 'capability-absent', required);
72
+ }
73
+ return verdict('allowed', hidden, hidden ? 'hidden-from-help' : 'allowed', required !== undefined && required !== '' ? required : undefined);
74
+ }
@@ -0,0 +1,14 @@
1
+ export declare const SLASH_COMMAND_ROSTER_PIN = "CC 2.1.187";
2
+ export type SlashCommandBucket = 'pureUI' | 'mappableToSdk' | 'fleetNA';
3
+ export type SlashCommandPosture = 'allow' | 'deny';
4
+ export interface SlashCommandOverride {
5
+ readonly mode: 'allow' | 'deny' | 'auto';
6
+ readonly requiredCapability?: string;
7
+ readonly degradeWhenAbsent?: boolean;
8
+ readonly hidden?: boolean;
9
+ }
10
+ export declare const SLASH_COMMAND_BUCKET_POSTURE_TABLE: Readonly<Record<SlashCommandBucket, SlashCommandPosture>>;
11
+ export declare const SLASH_COMMAND_BUCKET_PURE_UI: readonly string[];
12
+ export declare const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK: readonly string[];
13
+ export declare const SLASH_COMMAND_BUCKET_FLEET_NA: readonly string[];
14
+ export declare const SLASH_COMMAND_OVERRIDE_ROWS: readonly (readonly [string, SlashCommandOverride])[];
@@ -0,0 +1,99 @@
1
+ export const SLASH_COMMAND_ROSTER_PIN = 'CC 2.1.187';
2
+ export const SLASH_COMMAND_BUCKET_POSTURE_TABLE = Object.freeze({
3
+ pureUI: 'allow',
4
+ mappableToSdk: 'allow',
5
+ fleetNA: 'deny',
6
+ });
7
+ export const SLASH_COMMAND_BUCKET_PURE_UI = Object.freeze([
8
+ 'color', 'theme', 'tui', 'brief', 'scroll-speed', 'terminal-setup',
9
+ 'help', 'exit', 'copy', 'export', 'diff', 'config',
10
+ 'ide', 'add-dir', 'cd', 'powerup', 'feedback', 'btw',
11
+ 'advisor', 'fast', 'effort', 'heapdump', 'version', 'stickers',
12
+ 'keybindings', 'statusline', 'vim', 'install', 'passes', 'clear',
13
+ 'recap',
14
+ ]);
15
+ export const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK = Object.freeze([
16
+ 'init', 'init-verifiers', 'review', 'insights', 'team-onboarding', 'compact',
17
+ 'context', 'resume', 'model', 'usage', 'cost', 'permissions',
18
+ 'hooks', 'plan', 'memory', 'tasks', 'stop', 'workflows',
19
+ 'skills', 'mcp', 'agents', 'plugin', 'reload-plugins', 'rename',
20
+ 'branch', 'goal', 'commit-push-pr', 'import', 'explain-usage',
21
+ ]);
22
+ export const SLASH_COMMAND_BUCKET_FLEET_NA = Object.freeze([
23
+ 'files', 'think-back', 'thinkback-play', 'commit', 'login', 'logout',
24
+ 'setup-bedrock', 'setup-vertex', 'upgrade', 'usage-credits', 'extra-usage', 'rate-limit-options',
25
+ 'pro-trial-expired', 'desktop', 'session', 'teleport', 'remote-control', 'remote-env',
26
+ 'web-setup', 'ultraplan', 'ultrareview', 'install-github-app', 'install-slack-app', 'design-login',
27
+ 'autofix-pr', 'mobile', 'tag', 'privacy-settings',
28
+ ]);
29
+ export const SLASH_COMMAND_OVERRIDE_ROWS = Object.freeze([
30
+ ['status', { mode: 'allow' }],
31
+ ['doctor', { mode: 'allow' }],
32
+ ['rewind', { mode: 'allow' }],
33
+ ['skill-doctor', { mode: 'allow' }],
34
+ ['memory-capture', { mode: 'allow' }],
35
+ ['init', { mode: 'auto' }],
36
+ ['init-verifiers', { mode: 'auto' }],
37
+ ['review', { mode: 'auto' }],
38
+ ['insights', { mode: 'auto' }],
39
+ ['team-onboarding', { mode: 'auto' }],
40
+ ['compact', { mode: 'auto', degradeWhenAbsent: true }],
41
+ ['context', { mode: 'auto', degradeWhenAbsent: true }],
42
+ ['resume', { mode: 'auto', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
43
+ ['tasks', { mode: 'auto', requiredCapability: 'asyncRuns' }],
44
+ ['stop', { mode: 'auto', requiredCapability: 'asyncRuns' }],
45
+ ['workflows', { mode: 'auto', requiredCapability: 'asyncRuns' }],
46
+ ['usage', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
47
+ ['cost', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
48
+ ['stats', { mode: 'allow' }],
49
+ ['vim', { mode: 'auto', hidden: true }],
50
+ ['statusline', { mode: 'auto', hidden: true }],
51
+ ['permissions', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
52
+ ['plan', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
53
+ ['goal', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
54
+ ['hooks', { mode: 'auto', degradeWhenAbsent: true }],
55
+ ['memory', { mode: 'auto', requiredCapability: 'memory' }],
56
+ ['model', { mode: 'auto' }],
57
+ ['skills', { mode: 'auto', degradeWhenAbsent: true }],
58
+ ['mcp', { mode: 'auto', degradeWhenAbsent: true }],
59
+ ['agents', { mode: 'auto', degradeWhenAbsent: true }],
60
+ ['plugin', { mode: 'auto', degradeWhenAbsent: true }],
61
+ ['reload-plugins', { mode: 'auto', degradeWhenAbsent: true }],
62
+ ['rename', { mode: 'auto', degradeWhenAbsent: true }],
63
+ ['branch', { mode: 'auto', degradeWhenAbsent: true }],
64
+ ['loops', { mode: 'deny' }],
65
+ ['update', { mode: 'deny' }],
66
+ ['collab', { mode: 'allow' }],
67
+ ['websearch', { mode: 'allow' }],
68
+ ['import', { mode: 'auto' }],
69
+ ['explain-usage', { mode: 'auto' }],
70
+ ['mobile', { mode: 'deny' }],
71
+ ['tag', { mode: 'deny' }],
72
+ ['files', { mode: 'deny' }],
73
+ ['privacy-settings', { mode: 'deny' }],
74
+ ['think-back', { mode: 'deny' }],
75
+ ['thinkback-play', { mode: 'deny' }],
76
+ ['commit', { mode: 'deny' }],
77
+ ['login', { mode: 'deny' }],
78
+ ['logout', { mode: 'deny' }],
79
+ ['setup-bedrock', { mode: 'deny' }],
80
+ ['setup-vertex', { mode: 'deny' }],
81
+ ['upgrade', { mode: 'deny' }],
82
+ ['usage-credits', { mode: 'deny' }],
83
+ ['extra-usage', { mode: 'deny' }],
84
+ ['rate-limit-options', { mode: 'allow' }],
85
+ ['pro-trial-expired', { mode: 'deny' }],
86
+ ['desktop', { mode: 'deny' }],
87
+ ['session', { mode: 'deny' }],
88
+ ['teleport', { mode: 'deny' }],
89
+ ['remote-control', { mode: 'deny' }],
90
+ ['remote-env', { mode: 'deny' }],
91
+ ['web-setup', { mode: 'deny' }],
92
+ ['ultraplan', { mode: 'deny' }],
93
+ ['ultrareview', { mode: 'deny' }],
94
+ ['install-github-app', { mode: 'deny' }],
95
+ ['install-slack-app', { mode: 'deny' }],
96
+ ['design-login', { mode: 'deny' }],
97
+ ['autofix-pr', { mode: 'deny' }],
98
+ ['daemon', { mode: 'allow', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
99
+ ]);
@@ -1,5 +1,5 @@
1
1
  import { capForDisplay } from './fleetTaskDesc.js';
2
- import { engineWireTarget } from './engineWireTarget.js';
2
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
3
3
  import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
4
4
  import { ownDataField } from './ownKey.js';
5
5
  export function projectSqlEngineCapability(caps) {
@@ -40,7 +40,7 @@ const reader = createEngineCapReader({
40
40
  name: 'sql',
41
41
  project: projectSqlEngineCapability,
42
42
  });
43
- export function observedSqlEngine(baseUrl = engineWireTarget()?.baseUrl) {
43
+ export function observedSqlEngine(baseUrl = engineWireTargetBaseUrl()) {
44
44
  return reader.observed(baseUrl);
45
45
  }
46
46
  const SQL_DETAIL_MAX = 40;
@@ -1,5 +1,5 @@
1
1
  import { capForDisplay } from './fleetTaskDesc.js';
2
- import { engineWireTarget } from './engineWireTarget.js';
2
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
3
3
  import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
4
4
  import { ownDataField } from './ownKey.js';
5
5
  export function projectSteerPriorityCapability(caps) {
@@ -26,7 +26,7 @@ const reader = createEngineCapReader({
26
26
  name: 'fleet.steerPriority',
27
27
  project: projectSteerPriorityCapability,
28
28
  });
29
- export function observedSteerPriority(baseUrl = engineWireTarget()?.baseUrl) {
29
+ export function observedSteerPriority(baseUrl = engineWireTargetBaseUrl()) {
30
30
  return reader.observed(baseUrl);
31
31
  }
32
32
  export function steerPriorityMode(reading) {
@@ -1,5 +1,5 @@
1
1
  import { capForDisplay } from './fleetTaskDesc.js';
2
- import { engineWireTarget } from './engineWireTarget.js';
2
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
3
3
  import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
4
4
  import { projectSqlEngineCapability } from './sqlEngineCapability.js';
5
5
  import { ownDataField } from './ownKey.js';
@@ -45,7 +45,7 @@ const reader = createEngineCapReader({
45
45
  name: 'store',
46
46
  project: projectStorePostureCapability,
47
47
  });
48
- export function observedStorePosture(baseUrl = engineWireTarget()?.baseUrl) {
48
+ export function observedStorePosture(baseUrl = engineWireTargetBaseUrl()) {
49
49
  return reader.observed(baseUrl);
50
50
  }
51
51
  function presentView(reading) {
@@ -4,7 +4,7 @@ function own(v, key) {
4
4
  return undefined;
5
5
  try {
6
6
  const d = Object.getOwnPropertyDescriptor(v, key);
7
- return d !== undefined && 'value' in d ? d.value : undefined;
7
+ return d !== undefined && Object.hasOwn(d, 'value') ? d.value : undefined;
8
8
  }
9
9
  catch {
10
10
  return undefined;
@@ -1,4 +1,5 @@
1
1
  import type { AgentClient } from '@sema-agent/sdk';
2
+ import type { UiLanguage } from '../env/uiLanguage.js';
2
3
  import type { EngineWireInjection } from '../engineWireSdk.js';
3
4
  export type DelegatedPromptWireClient = {
4
5
  sessions: Pick<AgentClient['sessions'], 'get'>;
@@ -11,9 +12,17 @@ export declare function delegatedPromptText(content: unknown): string | undefine
11
12
  export declare function pickDelegatedPrompt(messages: readonly unknown[]): string | undefined;
12
13
  type TranscriptWindowReader = (transcriptId: string) => Promise<readonly unknown[] | null>;
13
14
  export declare function __setTranscriptWindowReaderForTests(r: TranscriptWindowReader | null): void;
15
+ export declare const DELEGATED_PROMPT_ABSENCE_CAUSES: readonly ["not_owned_after_restart", "not_in_store", "forbidden", "prompt_absent", "unknown"];
16
+ export type DelegatedPromptAbsenceCause = (typeof DELEGATED_PROMPT_ABSENCE_CAUSES)[number];
17
+ export interface DelegatedPromptAbsence {
18
+ readonly cause: DelegatedPromptAbsenceCause;
19
+ readonly text: string;
20
+ }
21
+ export declare function delegatedPromptAbsenceSentence(cause: DelegatedPromptAbsenceCause | string, lang?: UiLanguage): string;
14
22
  export interface DelegatedPromptFetch {
15
23
  prompt?: string;
16
24
  outcome: 'hit' | 'skipped' | 'unreadable' | 'absent';
25
+ absence?: DelegatedPromptAbsence;
17
26
  }
18
27
  export declare function fetchDelegatedPrompt(taskId: string, opts?: {
19
28
  wire?: DelegatedPromptWire;
@@ -1,6 +1,8 @@
1
1
  import { stripSystemReminderBlocks } from '../systemReminderTag.js';
2
2
  import { hostLog } from '../host.js';
3
3
  import { isSessionIdPathSegment } from '../sessionIdSegment.js';
4
+ import { msg, renderMessage } from '../i18n/translate.js';
5
+ import { readThrownSlot } from '../wireFailureShape.js';
4
6
  import { clientHasVerbs, engineWireFor, INJECTED_WIRE_SETTLE_MS, settleInjected } from '../engineWireFor.js';
5
7
  import { resolveOwnerContext } from './engineSubagentResume.js';
6
8
  import { panelAnchorOf } from '../panelReduce.js';
@@ -22,7 +24,7 @@ export function __resetEngineDelegatedPromptForTests() {
22
24
  clearEnginePanelAnchors();
23
25
  promptHydrateInFlight.clear();
24
26
  }
25
- const promptHydrateInFlight = new Set();
27
+ const promptHydrateInFlight = new Map();
26
28
  function roleOf(entry) {
27
29
  if (typeof entry !== 'object' || entry === null)
28
30
  return undefined;
@@ -113,13 +115,38 @@ async function readTranscriptWindow(transcriptId, sessionKey, injectedWire) {
113
115
  const msgs = rec.messages;
114
116
  return Array.isArray(msgs) ? msgs : null;
115
117
  }
118
+ export const DELEGATED_PROMPT_ABSENCE_CAUSES = Object.freeze(['not_owned_after_restart', 'not_in_store', 'forbidden', 'prompt_absent', 'unknown']);
119
+ const ABSENCE_KEY = {
120
+ not_owned_after_restart: 'session.subagent.delegatedPrompt.absence.notOwnedAfterRestart',
121
+ not_in_store: 'session.subagent.delegatedPrompt.absence.notInStore',
122
+ forbidden: 'session.subagent.delegatedPrompt.absence.forbidden',
123
+ prompt_absent: 'session.subagent.delegatedPrompt.absence.promptAbsent',
124
+ unknown: 'session.subagent.delegatedPrompt.absence.unknown',
125
+ };
126
+ export function delegatedPromptAbsenceSentence(cause, lang) {
127
+ const known = typeof cause === 'string' && Object.hasOwn(ABSENCE_KEY, cause);
128
+ return renderMessage(msg(known ? ABSENCE_KEY[cause] : ABSENCE_KEY.unknown), lang);
129
+ }
130
+ function absenceOf(cause) {
131
+ return Object.freeze({ cause, text: delegatedPromptAbsenceSentence(cause) });
132
+ }
133
+ function absenceOfThrown(e) {
134
+ const status = readThrownSlot(e, 'status');
135
+ if (status === 404)
136
+ return absenceOf('not_in_store');
137
+ if (status === 401 || status === 403)
138
+ return absenceOf('forbidden');
139
+ return absenceOf('unknown');
140
+ }
116
141
  export async function fetchDelegatedPrompt(taskId, opts) {
117
- if (promptHydrateInFlight.has(taskId))
118
- return { outcome: 'skipped' };
142
+ if (promptHydrateInFlight.has(taskId)) {
143
+ const settled = promptHydrateInFlight.get(taskId);
144
+ return settled ? { outcome: 'skipped', absence: settled } : { outcome: 'skipped' };
145
+ }
119
146
  const transcriptId = getEngineTranscriptId(taskId);
120
147
  if (!isSessionIdPathSegment(transcriptId))
121
- return { outcome: 'skipped' };
122
- promptHydrateInFlight.add(taskId);
148
+ return { outcome: 'skipped', absence: absenceOf(transcriptId === undefined ? 'not_owned_after_restart' : 'unknown') };
149
+ promptHydrateInFlight.set(taskId, null);
123
150
  let msgs = null;
124
151
  try {
125
152
  msgs = await readTranscriptWindow(transcriptId, resolveOwnerContext(taskId).key, opts?.wire);
@@ -127,14 +154,18 @@ export async function fetchDelegatedPrompt(taskId, opts) {
127
154
  catch (e) {
128
155
  promptHydrateInFlight.delete(taskId);
129
156
  hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId} read failed: ${String(e).slice(0, 160)}`);
130
- return { outcome: 'unreadable' };
157
+ return { outcome: 'unreadable', absence: absenceOfThrown(e) };
131
158
  }
132
159
  const prompt = msgs ? pickDelegatedPrompt(msgs) : undefined;
133
160
  if (!prompt) {
134
161
  if (msgs === null)
135
162
  promptHydrateInFlight.delete(taskId);
136
163
  hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId}: ${msgs === null ? 'transcript unreadable (retryable)' : 'no delegated user message (final)'}`);
137
- return { outcome: msgs === null ? 'unreadable' : 'absent' };
164
+ if (msgs === null)
165
+ return { outcome: 'unreadable', absence: absenceOf('unknown') };
166
+ const settled = absenceOf('prompt_absent');
167
+ promptHydrateInFlight.set(taskId, settled);
168
+ return { outcome: 'absent', absence: settled };
138
169
  }
139
170
  hostLog('debug', `[delegated-prompt] ${taskId} <- transcript ${transcriptId} (${prompt.length} chars) head=${JSON.stringify(prompt.slice(0, 60))}`);
140
171
  return { prompt, outcome: 'hit' };
@@ -1,5 +1,5 @@
1
1
  import { engineCapTrue } from '../engineCapsCache.js';
2
- import { engineWireTargetFor } from '../engineWireTarget.js';
2
+ import { engineWireTargetBaseUrl } from '../engineWireTarget.js';
3
3
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
4
4
  export const engineOwnedRowIds = new Set();
5
5
  export const fleetViewStubRowIds = new Set();
@@ -7,7 +7,7 @@ export function isEngineViewRow(taskId) {
7
7
  return engineOwnedRowIds.has(taskId) || fleetViewStubRowIds.has(taskId);
8
8
  }
9
9
  export function engineTaskHandlesCapable(sessionKey = DEFAULT_SESSION_KEY, capsBaseUrl) {
10
- return engineCapTrue(capsBaseUrl ?? engineWireTargetFor(sessionKey)?.baseUrl, 'taskHandles');
10
+ return engineCapTrue(capsBaseUrl ?? engineWireTargetBaseUrl(sessionKey), 'taskHandles');
11
11
  }
12
12
  export function engineRowNeedsStopConfirm(taskId, sessionKey, capsBaseUrl) {
13
13
  return isEngineViewRow(taskId) && engineTaskHandlesCapable(sessionKey ?? DEFAULT_SESSION_KEY, capsBaseUrl);
@@ -5,13 +5,13 @@ import { RESUME_SESSION_NOT_FOUND } from '../engineErrorCodes.js';
5
5
  import { displayUntrusted } from '../displayUntrusted.js';
6
6
  import { engineCapTrue } from '../engineCapsCache.js';
7
7
  import { clientHasVerbs, engineWireFor, INJECTED_WIRE_SETTLE_MS, noAnswerDetailFrom, sendOnce, settleInjected } from '../engineWireFor.js';
8
- import { engineWireTargetFor } from '../engineWireTarget.js';
8
+ import { engineWireTargetBaseUrl } from '../engineWireTarget.js';
9
9
  import { activeEngineRunId, engineSessionParamFor } from '../engineSessionParam.js';
10
10
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
11
11
  import { getBgParentRunOwner, parentToolCallIdOf, } from '../subagentContentStore.js';
12
12
  export const SUBAGENT_RESUME_CAP = 'subagentResume';
13
13
  export function subagentResumeAvailable(baseUrl, sessionKey = DEFAULT_SESSION_KEY) {
14
- return engineCapTrue(baseUrl ?? engineWireTargetFor(sessionKey)?.baseUrl, SUBAGENT_RESUME_CAP);
14
+ return engineCapTrue(baseUrl ?? engineWireTargetBaseUrl(sessionKey), SUBAGENT_RESUME_CAP);
15
15
  }
16
16
  export function resolveSubagentContinueTarget(rowId, displayName) {
17
17
  const precise = parentToolCallIdOf(rowId);
@@ -149,7 +149,7 @@ export async function resumeSettledSubagent(facade, runId, target, content, opts
149
149
  }
150
150
  const warnedRetainWithoutWake = new Set();
151
151
  export function auditRetainWithoutWake(input) {
152
- const baseUrl = input.baseUrl ?? engineWireTargetFor(input.sessionKey ?? DEFAULT_SESSION_KEY)?.baseUrl;
152
+ const baseUrl = input.baseUrl ?? engineWireTargetBaseUrl(input.sessionKey ?? DEFAULT_SESSION_KEY);
153
153
  if (!engineCapTrue(baseUrl, SUBAGENT_RESUME_CAP))
154
154
  return undefined;
155
155
  if (input.retainRequested === false)
@@ -13,6 +13,7 @@ export interface EngineTaskOutputResult {
13
13
  status?: string;
14
14
  stoppedBy?: string;
15
15
  partialResult?: boolean;
16
+ exitCode?: number;
16
17
  }
17
18
  export declare function __resetTaskHandleWireForTests(): void;
18
19
  export declare function fetchEngineTaskOutput(handle: string, opts?: {
@@ -6,6 +6,7 @@ import { engineSessionParamFor } from '../engineSessionParam.js';
6
6
  import { resolveOwnerContext } from './engineSubagentResume.js';
7
7
  import { engineTaskHandlesCapable } from './engineRowStopGate.js';
8
8
  import { noteBgOwnerAbsence } from './subagentOwnerAbsence.js';
9
+ import { guardedRead, readOwnDataValue } from '../ownKey.js';
9
10
  function usableTaskOutputClient(client) {
10
11
  return clientHasVerbs(client, [['runs', 'taskOutput']]);
11
12
  }
@@ -27,6 +28,13 @@ function sessionOf(ctx) {
27
28
  const s = ctx.record?.sessionId ?? engineSessionParamFor(ctx.key);
28
29
  return s !== undefined ? { session: s } : {};
29
30
  }
31
+ function exitCodeOfTaskOutput(output) {
32
+ const details = guardedRead(() => readOwnDataValue(output, 'details'));
33
+ if (typeof details !== 'object' || details === null)
34
+ return undefined;
35
+ const code = guardedRead(() => readOwnDataValue(details, 'exitCode'));
36
+ return typeof code === 'number' && Number.isInteger(code) ? code : undefined;
37
+ }
30
38
  const accumulated = new Map();
31
39
  export function __resetTaskHandleWireForTests() {
32
40
  accumulated.clear();
@@ -67,11 +75,13 @@ export async function fetchEngineTaskOutput(handle, opts) {
67
75
  if (engineWireDebugEnabled()) {
68
76
  hostLog('debug', `[task-handle] output ${handle} via run ${runId}: ok fresh=${fresh.length}b merged=${merged.length}b status=${typeof out.status === 'string' ? out.status : '-'}`);
69
77
  }
78
+ const exitCode = exitCodeOfTaskOutput(out);
70
79
  return {
71
80
  content: merged,
72
81
  ...(typeof out.status === 'string' ? { status: out.status } : {}),
73
82
  ...(typeof out.stoppedBy === 'string' ? { stoppedBy: out.stoppedBy } : {}),
74
83
  ...(out.partial_result === true ? { partialResult: true } : {}),
84
+ ...(exitCode !== undefined ? { exitCode } : {}),
75
85
  };
76
86
  }
77
87
  catch (e) {
@@ -44,6 +44,7 @@ export declare const SUBAGENT_CONTENT_STORE_DEFAULTS: Readonly<SubagentContentSt
44
44
  export declare function configureSubagentContentStore(next: Partial<SubagentContentStoreConfig>): void;
45
45
  export declare function subagentContentStoreConfig(): SubagentContentStoreConfig;
46
46
  export declare function __resetSubagentContentStoreConfigForTests(): void;
47
+ export declare function bindSubagentIdentityReader(fn: (id: string) => readonly string[] | undefined): void;
47
48
  export declare function registerSubagentContentAlias(parentToolCallId: string, taskId: string): void;
48
49
  export declare function registerSubagentAlias(parentToolCallId: string, taskId: string): void;
49
50
  export declare function publishSubagentContentEvent(ev: SubagentContentEvent): void;