@sema-agent/client-core 0.100.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 (335) hide show
  1. package/CHANGELOG.md +395 -0
  2. package/README.md +164 -117
  3. package/dist/adapt/arms.js +51 -16
  4. package/dist/adapt/textStream.js +7 -4
  5. package/dist/adapt/toolCards.js +9 -8
  6. package/dist/adapt.js +7 -1
  7. package/dist/adapter/activeRunSelfHeal.d.ts +24 -2
  8. package/dist/adapter/activeRunSelfHeal.js +108 -6
  9. package/dist/adapter/downstream/eventToSdkMessage.js +33 -12
  10. package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
  11. package/dist/adapter/downstream/terminalToSdkResult.js +209 -39
  12. package/dist/adapter/runStream.d.ts +4 -4
  13. package/dist/adapter/runStream.js +158 -43
  14. package/dist/agentsWireCaps.d.ts +2 -7
  15. package/dist/agentsWireCaps.js +1 -2
  16. package/dist/approvalDecidedByCapability.js +2 -2
  17. package/dist/approvalFrameFamilies.d.ts +33 -0
  18. package/dist/approvalFrameFamilies.js +120 -0
  19. package/dist/approvalsStreamLiveCapability.js +2 -2
  20. package/dist/attachmentsWireCaps.js +41 -13
  21. package/dist/callerCwdCapability.js +2 -2
  22. package/dist/centerWiringCapability.js +2 -2
  23. package/dist/clockReading.d.ts +2 -0
  24. package/dist/clockReading.js +4 -0
  25. package/dist/cloudConfigWireCaps.d.ts +19 -5
  26. package/dist/cloudConfigWireCaps.js +193 -56
  27. package/dist/coreValuePorts.d.ts +12 -2
  28. package/dist/coreValuePorts.js +9 -0
  29. package/dist/decideFailureNote.js +5 -3
  30. package/dist/decideReceipt.js +2 -2
  31. package/dist/deviceExecutorManagementCapability.js +2 -2
  32. package/dist/deviceFlowPolling.js +1 -1
  33. package/dist/disableSkillsWire.d.ts +1 -1
  34. package/dist/disableSkillsWire.js +4 -3
  35. package/dist/displayUntrusted.d.ts +1 -0
  36. package/dist/displayUntrusted.js +65 -8
  37. package/dist/engineCapReader.js +1 -1
  38. package/dist/engineConfigDrift.js +1 -1
  39. package/dist/engineErrorCodes.d.ts +14 -5
  40. package/dist/engineErrorCodes.js +27 -6
  41. package/dist/engineGenerationConvergence.d.ts +39 -0
  42. package/dist/engineGenerationConvergence.js +95 -0
  43. package/dist/engineGenerationPort.d.ts +61 -0
  44. package/dist/engineGenerationPort.js +144 -0
  45. package/dist/engineHealthFacts.d.ts +23 -0
  46. package/dist/engineHealthFacts.js +92 -0
  47. package/dist/engineIdentity.d.ts +4 -0
  48. package/dist/engineIdentity.js +11 -0
  49. package/dist/engineNoticeCodes.d.ts +2 -5
  50. package/dist/engineRowRef.js +3 -0
  51. package/dist/engineSessionMessages.js +2 -2
  52. package/dist/engineToolDirectory.js +2 -2
  53. package/dist/engineWireFor.d.ts +99 -0
  54. package/dist/engineWireFor.js +248 -6
  55. package/dist/engineWireTarget.d.ts +1 -0
  56. package/dist/engineWireTarget.js +8 -0
  57. package/dist/env/uiLanguage.js +1 -1
  58. package/dist/errorSupplementRoles.d.ts +3 -0
  59. package/dist/errorSupplementRoles.js +37 -0
  60. package/dist/executionLaneCapability.js +2 -2
  61. package/dist/fileHistoryCaptureCapability.js +3 -3
  62. package/dist/finalVerifyWire.d.ts +6 -3
  63. package/dist/finalVerifyWire.js +6 -23
  64. package/dist/flagInput.d.ts +4 -0
  65. package/dist/flagInput.js +24 -0
  66. package/dist/fleet/fleetLedger.js +5 -2
  67. package/dist/fleet/fleetProjection.d.ts +1 -0
  68. package/dist/fleet/fleetProjection.js +15 -2
  69. package/dist/gateVocabulary.js +3 -0
  70. package/dist/generated/engineFactTables.d.ts +7 -3
  71. package/dist/generated/engineFactTables.js +52 -0
  72. package/dist/generated/engineNoticeTables.js +12 -0
  73. package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
  74. package/dist/generated/settingsSchemaActiveTiers.js +14 -0
  75. package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
  76. package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
  77. package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
  78. package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
  79. package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
  80. package/dist/generated/settingsSchemaDefaultModel.js +25 -0
  81. package/dist/generated/settingsSchemaFns.d.ts +54 -0
  82. package/dist/generated/settingsSchemaFns.js +26 -1
  83. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
  84. package/dist/generated/settingsSchemaMcpRequestEntry.js +1 -7
  85. package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
  86. package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
  87. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
  88. package/dist/generated/settingsSchemaSettingsSources.js +58 -0
  89. package/dist/generated/settingsSchemaTables.d.ts +2 -0
  90. package/dist/generated/settingsSchemaTables.js +13 -0
  91. package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
  92. package/dist/generated/settingsSchemaUrlPattern.js +183 -0
  93. package/dist/headlessPermissionModeWire.d.ts +18 -2
  94. package/dist/headlessPermissionModeWire.js +30 -19
  95. package/dist/hitl/allowRuleShadow.js +7 -5
  96. package/dist/hitl/approvalCardReading.d.ts +3 -0
  97. package/dist/hitl/approvalCardReading.js +17 -0
  98. package/dist/hitl/approvalCompleteParked.js +1 -1
  99. package/dist/hitl/approvalDelivery.d.ts +87 -0
  100. package/dist/hitl/approvalDelivery.js +193 -0
  101. package/dist/hitl/approvalResolution.d.ts +11 -0
  102. package/dist/hitl/approvalResolution.js +50 -11
  103. package/dist/hitl/askClassPair.d.ts +6 -0
  104. package/dist/hitl/askClassPair.js +30 -3
  105. package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
  106. package/dist/hitl/askParkAutoReopenBlock.js +117 -0
  107. package/dist/hitl/askParkRowRouting.js +4 -1
  108. package/dist/hitl/attributionLadder.d.ts +42 -3
  109. package/dist/hitl/attributionLadder.js +79 -8
  110. package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
  111. package/dist/hitl/automaticAnswerVerdict.js +46 -11
  112. package/dist/hitl/crashConverged.js +2 -2
  113. package/dist/hitl/decisionConflict.d.ts +6 -2
  114. package/dist/hitl/decisionConflict.js +24 -9
  115. package/dist/hitl/decisionRefusal.d.ts +20 -10
  116. package/dist/hitl/decisionRefusal.js +99 -54
  117. package/dist/hitl/decisionSend.d.ts +3 -0
  118. package/dist/hitl/decisionSend.js +87 -103
  119. package/dist/hitl/frameRouter.d.ts +1 -0
  120. package/dist/hitl/frameRouter.js +9 -2
  121. package/dist/hitl/hitlBridge.d.ts +18 -6
  122. package/dist/hitl/hitlBridge.js +41 -37
  123. package/dist/hitl/livePendingAsk.js +4 -3
  124. package/dist/hitl/noAllowCause.js +1 -1
  125. package/dist/hitl/parkResolver.js +3 -2
  126. package/dist/hitl/persistedRulesWire.js +1 -0
  127. package/dist/hitl/planReviewWire.d.ts +4 -0
  128. package/dist/hitl/planReviewWire.js +59 -30
  129. package/dist/hitl/resumeRunningCard.d.ts +3 -2
  130. package/dist/hitl/resumeRunningCard.js +17 -11
  131. package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
  132. package/dist/hitl/sessionPolicyDeliverable.js +62 -29
  133. package/dist/hitl/sessionPolicyWire.d.ts +13 -3
  134. package/dist/hitl/sessionPolicyWire.js +81 -16
  135. package/dist/hitl/standingRows.js +1 -1
  136. package/dist/hitl/toolApprovalWire.d.ts +9 -10
  137. package/dist/hitl/toolApprovalWire.js +72 -54
  138. package/dist/hookMatcherVerdict.d.ts +2 -0
  139. package/dist/hookMatcherVerdict.js +12 -0
  140. package/dist/hooksCompactTransition.d.ts +19 -0
  141. package/dist/hooksCompactTransition.js +41 -0
  142. package/dist/hooksWireCaps.d.ts +1 -1
  143. package/dist/hooksWireCaps.js +202 -203
  144. package/dist/host.d.ts +1 -14
  145. package/dist/host.js +0 -8
  146. package/dist/hostCallbackGuard.d.ts +1 -0
  147. package/dist/hostCallbackGuard.js +1 -1
  148. package/dist/hostSettingsSource.d.ts +172 -0
  149. package/dist/hostSettingsSource.js +675 -0
  150. package/dist/hostTurnSettings.d.ts +73 -17
  151. package/dist/hostTurnSettings.js +594 -97
  152. package/dist/httpHookPolicy.d.ts +37 -0
  153. package/dist/httpHookPolicy.js +176 -0
  154. package/dist/humanTurn.d.ts +2 -1
  155. package/dist/humanTurn.js +37 -7
  156. package/dist/humanTurnRead.js +4 -3
  157. package/dist/humanTurnSentences.d.ts +10 -0
  158. package/dist/humanTurnSentences.js +74 -0
  159. package/dist/i18n/messages.en.d.ts +184 -2
  160. package/dist/i18n/messages.en.js +187 -5
  161. package/dist/i18n/messages.zh.js +197 -5
  162. package/dist/i18n/translate.js +3 -3
  163. package/dist/index.d.ts +69 -15
  164. package/dist/index.js +45 -13
  165. package/dist/inheritEnvCapability.d.ts +3 -1
  166. package/dist/inheritEnvCapability.js +31 -17
  167. package/dist/inheritEnvWire.d.ts +2 -1
  168. package/dist/inheritEnvWire.js +11 -5
  169. package/dist/interactiveToolsWire.d.ts +4 -2
  170. package/dist/interactiveToolsWire.js +5 -5
  171. package/dist/jsonFaithful.d.ts +20 -0
  172. package/dist/jsonFaithful.js +152 -0
  173. package/dist/limitsWire.d.ts +7 -2
  174. package/dist/limitsWire.js +19 -13
  175. package/dist/liveInitToolFace.d.ts +6 -1
  176. package/dist/liveInitToolFace.js +5 -3
  177. package/dist/liveModelCatalog.d.ts +22 -0
  178. package/dist/liveModelCatalog.js +132 -18
  179. package/dist/mcpPanel.js +1 -1
  180. package/dist/mcpProbeCapability.js +2 -2
  181. package/dist/mcpStatusSupersetKeys.d.ts +24 -0
  182. package/dist/mcpStatusSupersetKeys.js +45 -0
  183. package/dist/mcpToolToggles.js +2 -1
  184. package/dist/mcpWireCaps.d.ts +39 -1
  185. package/dist/mcpWireCaps.js +254 -50
  186. package/dist/memoryComplianceCapability.js +2 -2
  187. package/dist/memoryOriginCapability.js +2 -2
  188. package/dist/model/catalogDefault.d.ts +24 -0
  189. package/dist/model/catalogDefault.js +4 -0
  190. package/dist/model/liveCatalogShape.js +5 -4
  191. package/dist/model/modelsPolicy.js +4 -3
  192. package/dist/model/onboardJudgement.d.ts +1 -0
  193. package/dist/model/onboardJudgement.js +1 -1
  194. package/dist/model/subagentModelWord.js +2 -2
  195. package/dist/modelCapabilityProbe.js +6 -6
  196. package/dist/modelIdentityResolvability.d.ts +10 -1
  197. package/dist/modelIdentityResolvability.js +62 -39
  198. package/dist/modsKernelIdentity.d.ts +10 -0
  199. package/dist/modsKernelIdentity.js +103 -0
  200. package/dist/modsKernelTransit.d.ts +8 -0
  201. package/dist/modsKernelTransit.js +6 -0
  202. package/dist/notifications.d.ts +30 -12
  203. package/dist/notifications.js +241 -53
  204. package/dist/outputStyleSeatCapability.js +2 -2
  205. package/dist/ownKey.d.ts +11 -0
  206. package/dist/ownKey.js +164 -3
  207. package/dist/panelReduce.js +1 -1
  208. package/dist/peerFrames.d.ts +1 -1
  209. package/dist/peerFrames.js +6 -2
  210. package/dist/peerLaneCapability.js +2 -2
  211. package/dist/permissionModesCapability.js +4 -4
  212. package/dist/permissionRuleIssue.js +2 -0
  213. package/dist/permissionRulesWriteCapability.js +2 -2
  214. package/dist/permissionsAllowGrantCapability.js +2 -2
  215. package/dist/permissionsDeclaration.d.ts +43 -4
  216. package/dist/permissionsDeclaration.js +102 -35
  217. package/dist/pluginHooksWire.d.ts +20 -4
  218. package/dist/pluginHooksWire.js +92 -53
  219. package/dist/prepareRefusal.d.ts +3 -2
  220. package/dist/prepareRefusal.js +27 -9
  221. package/dist/printInitToolFace.js +2 -2
  222. package/dist/printModelStatus.js +1 -1
  223. package/dist/projectMemory.d.ts +32 -0
  224. package/dist/projectMemory.js +70 -0
  225. package/dist/promptBlockedCopy.d.ts +2 -1
  226. package/dist/promptBlockedCopy.js +2 -1
  227. package/dist/promptDelivery.d.ts +23 -3
  228. package/dist/promptDelivery.js +169 -30
  229. package/dist/providerRejection.d.ts +19 -1
  230. package/dist/providerRejection.js +75 -4
  231. package/dist/queuedDelivery.d.ts +48 -0
  232. package/dist/queuedDelivery.js +233 -0
  233. package/dist/reattachWindow.d.ts +94 -0
  234. package/dist/reattachWindow.js +127 -0
  235. package/dist/request/printNotification.d.ts +1 -1
  236. package/dist/request/printNotification.js +5 -1
  237. package/dist/request/submissionIdentity.d.ts +37 -0
  238. package/dist/request/submissionIdentity.js +65 -0
  239. package/dist/request/taskRequest.d.ts +12 -4
  240. package/dist/request/taskRequest.js +221 -152
  241. package/dist/resultFrameKeys.d.ts +1 -0
  242. package/dist/resultFrameKeys.js +4 -1
  243. package/dist/retryStatus.d.ts +8 -0
  244. package/dist/retryStatus.js +57 -9
  245. package/dist/rewindArchiveCapability.js +2 -2
  246. package/dist/rewindEngineAction.d.ts +2 -0
  247. package/dist/rewindEngineAction.js +23 -1
  248. package/dist/rowKind.d.ts +36 -0
  249. package/dist/rowKind.js +97 -0
  250. package/dist/ruleCompileVerdict.d.ts +18 -0
  251. package/dist/ruleCompileVerdict.js +67 -2
  252. package/dist/ruleReadings.d.ts +58 -0
  253. package/dist/ruleReadings.js +132 -0
  254. package/dist/ruleRefusalSentence.d.ts +4 -0
  255. package/dist/ruleRefusalSentence.js +9 -3
  256. package/dist/runCancelContext.d.ts +0 -1
  257. package/dist/runCancelContext.js +1 -2
  258. package/dist/runTerminal.d.ts +5 -0
  259. package/dist/runTerminal.js +52 -17
  260. package/dist/sandboxWire.d.ts +1 -1
  261. package/dist/sandboxWire.js +4 -6
  262. package/dist/scenarioRefusal.js +1 -1
  263. package/dist/scenarioSkills.d.ts +20 -0
  264. package/dist/scenarioSkills.js +72 -0
  265. package/dist/scenarioWire.d.ts +5 -2
  266. package/dist/scenarioWire.js +9 -9
  267. package/dist/sealedKeyCapability.js +2 -2
  268. package/dist/seam.d.ts +2 -0
  269. package/dist/seam.js +2 -2
  270. package/dist/seatContract.d.ts +46 -1
  271. package/dist/seatContract.js +49 -19
  272. package/dist/selfOrchestrationDenial.js +1 -1
  273. package/dist/sessionPolicyCapability.js +2 -2
  274. package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
  275. package/dist/sessionRulesChildrenReadLive.js +5 -0
  276. package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
  277. package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
  278. package/dist/sessionSyncFileHistoryCapability.js +2 -2
  279. package/dist/settingsCredentialKeyPaths.js +60 -5
  280. package/dist/settingsHooksSalvage.d.ts +1 -0
  281. package/dist/settingsHooksSalvage.js +7 -1
  282. package/dist/settingsLayerAdmission.d.ts +4 -0
  283. package/dist/settingsLayerAdmission.js +16 -0
  284. package/dist/skillToolListsCapability.js +6 -5
  285. package/dist/skillsWireCaps.d.ts +14 -0
  286. package/dist/skillsWireCaps.js +47 -16
  287. package/dist/slashCommandGate.d.ts +24 -0
  288. package/dist/slashCommandGate.js +74 -0
  289. package/dist/slashCommandTable.d.ts +14 -0
  290. package/dist/slashCommandTable.js +99 -0
  291. package/dist/sqlEngineCapability.js +2 -2
  292. package/dist/steerPriorityCapability.js +2 -2
  293. package/dist/storePostureCapability.js +2 -2
  294. package/dist/subagent/agentStateDetail.js +1 -1
  295. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
  296. package/dist/subagent/engineDelegatedPrompt.js +38 -7
  297. package/dist/subagent/engineRowStopGate.js +2 -2
  298. package/dist/subagent/engineSubagentResume.js +3 -3
  299. package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
  300. package/dist/subagent/engineTaskHandleWire.js +10 -0
  301. package/dist/submitFailure.d.ts +8 -0
  302. package/dist/submitFailure.js +17 -0
  303. package/dist/supportFloor.d.ts +1 -0
  304. package/dist/supportFloor.js +7 -0
  305. package/dist/terminationIntent.d.ts +55 -0
  306. package/dist/terminationIntent.js +352 -0
  307. package/dist/toolHistoryMismatch.d.ts +8 -0
  308. package/dist/toolHistoryMismatch.js +37 -6
  309. package/dist/toolResult.d.ts +13 -3
  310. package/dist/toolResult.js +158 -9
  311. package/dist/toolResultContent.d.ts +13 -0
  312. package/dist/toolResultContent.js +82 -7
  313. package/dist/toolRoster.d.ts +18 -0
  314. package/dist/toolRoster.js +64 -0
  315. package/dist/turnFailurePresentation.js +27 -90
  316. package/dist/usageLimitAutoResume.d.ts +74 -0
  317. package/dist/usageLimitAutoResume.js +227 -0
  318. package/dist/userAttachmentEnvelope.js +1 -1
  319. package/dist/userAttachmentSeat.js +5 -5
  320. package/dist/userInvokedSkillsCapability.js +2 -2
  321. package/dist/webSearchBackendCapability.js +2 -2
  322. package/dist/wireErrorTriage.js +99 -50
  323. package/dist/wireFailureShape.d.ts +25 -1
  324. package/dist/wireFailureShape.js +92 -5
  325. package/dist/wireRefusalCopy.d.ts +24 -1
  326. package/dist/wireRefusalCopy.js +253 -32
  327. package/dist/wiringFleetDoctor.d.ts +3 -0
  328. package/dist/wiringFleetDoctor.js +21 -0
  329. package/dist/workflow.d.ts +2 -1
  330. package/dist/workflow.js +38 -1
  331. package/dist/workflowClient.d.ts +2 -7
  332. package/dist/workflowsJournalCapability.js +2 -2
  333. package/dist/writeProtectionCapability.js +2 -2
  334. package/docs/INTEGRATION-CLIENTS.md +607 -181
  335. package/package.json +14 -3
@@ -0,0 +1,29 @@
1
+ import { engineCapValue } from './engineCapsCache.js';
2
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
3
+ const SESSION_RULES_NAMESPACE_FORMS_KEY = 'sessionRulesNamespaceForms';
4
+ const CONFIRMED = Object.freeze({ kind: 'confirmed' });
5
+ const ABSENT = Object.freeze({ kind: 'absent' });
6
+ const DECLINED = Object.freeze({ kind: 'declined' });
7
+ const UNREADABLE = Object.freeze({ kind: 'unreadable' });
8
+ const UNOBSERVED = Object.freeze({ kind: 'unobserved' });
9
+ export function observedSessionRulesNamespaceForms(baseUrl) {
10
+ try {
11
+ const base = baseUrl === undefined ? engineWireTargetBaseUrl() : baseUrl;
12
+ const slot = engineCapValue(typeof base === 'string' ? base : undefined, SESSION_RULES_NAMESPACE_FORMS_KEY);
13
+ switch (slot.kind) {
14
+ case 'unobserved':
15
+ return UNOBSERVED;
16
+ case 'not_reported':
17
+ return ABSENT;
18
+ case 'unreadable':
19
+ return UNREADABLE;
20
+ case 'null':
21
+ return DECLINED;
22
+ case 'value':
23
+ return slot.value === true ? CONFIRMED : DECLINED;
24
+ }
25
+ }
26
+ catch {
27
+ return UNOBSERVED;
28
+ }
29
+ }
@@ -1,4 +1,4 @@
1
- import { engineWireTarget } from './engineWireTarget.js';
1
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
2
2
  import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
3
3
  import { ownDataField } from './ownKey.js';
4
4
  export function projectSessionSyncFileHistoryCapability(caps) {
@@ -20,7 +20,7 @@ const reader = createEngineCapReader({
20
20
  name: 'sessionSyncFileHistory',
21
21
  project: projectSessionSyncFileHistoryCapability,
22
22
  });
23
- export function observedSessionSyncFileHistory(baseUrl = engineWireTarget()?.baseUrl) {
23
+ export function observedSessionSyncFileHistory(baseUrl = engineWireTargetBaseUrl()) {
24
24
  return reader.observed(baseUrl);
25
25
  }
26
26
  export function sessionSyncFileHistoryAvailable(reading) {
@@ -1,4 +1,4 @@
1
- import { looksLikeKnownSecret, queryCarriesCredential } from './displayUntrusted.js';
1
+ import { looksLikeKnownSecret, percentBoundaryReadingOf, queryCarriesCredential } from './displayUntrusted.js';
2
2
  const CREDENTIAL_WORDS = new Set([
3
3
  'key', 'keys', 'apikey', 'token', 'tokens', 'secret', 'secrets', 'password', 'passwd', 'pass', 'pwd', 'pin', 'otp',
4
4
  'auth', 'authorization', 'credential', 'credentials', 'cookie', 'cookies', 'session', 'private', 'cert', 'signature', 'salt',
@@ -6,6 +6,9 @@ const CREDENTIAL_WORDS = new Set([
6
6
  const CREDENTIAL_STEMS = ['PASSWORD', 'PASSWD', 'SECRET', 'TOKEN', 'APIKEY', 'CREDENTIAL', 'COOKIE', 'PRIVATE'];
7
7
  const CREDENTIAL_SUFFIXES = ['PASS', 'PWD', 'KEY', 'AUTH'];
8
8
  const SECRET_CONFIG_NAME = /(?:^|[-_.])(?:token|key|secret|password|authorization|credential|cookie)s?$/i;
9
+ const FLATTENED_CREDENTIAL_TAILS = [
10
+ 'apikey', 'token', 'tokens', 'secret', 'secrets', 'password', 'passwd', 'credential', 'credentials', 'cookie', 'cookies', 'authorization',
11
+ ];
9
12
  export function credentialNameWords(name) {
10
13
  if (typeof name !== 'string')
11
14
  return [];
@@ -24,17 +27,54 @@ export function isCredentialEnvName(name) {
24
27
  const upper = name.toUpperCase();
25
28
  return CREDENTIAL_STEMS.some((stem) => upper.includes(stem)) || CREDENTIAL_SUFFIXES.some((suffix) => upper.endsWith(suffix));
26
29
  }
30
+ function legacyNameWords(name) {
31
+ return name
32
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
33
+ .split(/[_\-.\s]+/)
34
+ .filter((w) => w.length > 0)
35
+ .map((w) => w.toLowerCase());
36
+ }
27
37
  export function isCredentialConfigKey(name) {
28
38
  if (typeof name !== 'string')
29
39
  return false;
30
40
  const words = credentialNameWords(name);
31
41
  const last = words[words.length - 1];
32
- return SECRET_CONFIG_NAME.test(name) || (last !== undefined && CREDENTIAL_WORDS.has(last));
42
+ if (SECRET_CONFIG_NAME.test(name) || (last !== undefined && CREDENTIAL_WORDS.has(last)))
43
+ return true;
44
+ const legacy = legacyNameWords(name);
45
+ const legacyLast = legacy[legacy.length - 1];
46
+ if (legacyLast !== undefined && CREDENTIAL_WORDS.has(legacyLast))
47
+ return true;
48
+ const flattened = name.replace(/[_\-.\s]+/g, '').toLowerCase();
49
+ return FLATTENED_CREDENTIAL_TAILS.some((tail) => flattened.endsWith(tail));
33
50
  }
34
51
  const DECIMAL_INTEGER_RE = /^\s*\d+\s*$/;
35
- function stringCarriesCredential(value) {
36
- if (looksLikeKnownSecret(value))
37
- return true;
52
+ function percentDecodeOnce(s) {
53
+ return s.indexOf('%') === -1 ? s : s.replace(/%([0-7][0-9A-Fa-f])/g, (_m, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
54
+ }
55
+ const SCHEME_THEN_ENCODED_SPACE = /(?:^|[^A-Za-z0-9])(?:bearer|basic)(?:\+|%20)[^\s+%]{1,4096}/i;
56
+ const FORM_READING_MAX_LAYERS = 3;
57
+ function formEncodedCarriesCredential(value) {
58
+ if (value.indexOf('+') === -1 && value.indexOf('%') === -1)
59
+ return false;
60
+ let layer = value;
61
+ for (let depth = 0;; depth++) {
62
+ const boundary = percentBoundaryReadingOf(layer);
63
+ for (const reading of boundary === layer ? [layer] : [layer, boundary]) {
64
+ if (SCHEME_THEN_ENCODED_SPACE.test(reading))
65
+ return true;
66
+ if (reading.indexOf('+') !== -1 && looksLikeKnownSecret(reading.replace(/\+/g, ' ')))
67
+ return true;
68
+ }
69
+ const next = percentDecodeOnce(layer);
70
+ if (next === layer)
71
+ return false;
72
+ if (depth === FORM_READING_MAX_LAYERS)
73
+ return true;
74
+ layer = next;
75
+ }
76
+ }
77
+ function urlCarriesCredential(value) {
38
78
  const text = value.trim();
39
79
  if (!text.includes('://'))
40
80
  return false;
@@ -49,6 +89,21 @@ function stringCarriesCredential(value) {
49
89
  return true;
50
90
  return url.search.length > 1 && queryCarriesCredential(url.search.slice(1));
51
91
  }
92
+ function stringCarriesCredential(value) {
93
+ if (looksLikeKnownSecret(value) || formEncodedCarriesCredential(value))
94
+ return true;
95
+ let layer = value;
96
+ for (let depth = 0;; depth++) {
97
+ if (urlCarriesCredential(layer))
98
+ return true;
99
+ if (depth === FORM_READING_MAX_LAYERS)
100
+ return false;
101
+ const next = percentDecodeOnce(layer);
102
+ if (next === layer)
103
+ return false;
104
+ layer = next;
105
+ }
106
+ }
52
107
  const ENV_ASSIGNMENT_RE = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/s;
53
108
  const LONG_OPTION_RE = /^--?([A-Za-z][A-Za-z0-9_-]*)(?:=(.*))?$/s;
54
109
  const HEADER_FORM_RE = /^\s*([A-Za-z][A-Za-z0-9_-]*)\s*:\s*\S/;
@@ -41,4 +41,5 @@ export declare function hooksSalvageMaskOf(dropped: readonly {
41
41
  }[]): HooksSalvageMask;
42
42
  export declare function salvageSettingsHooksEntries(doc: SettingsDocument | null | undefined): HooksSalvage;
43
43
  export declare const HOOK_SETTINGS_SOURCE_TEXT: Readonly<Record<HookSettingsSource, string>>;
44
+ export declare function layerNotAppliedRefusesTurn(source: HookSettingsSource): boolean;
44
45
  export declare function settingsHooksSalvageNotice(salvage: HooksSalvage, source: HookSettingsSource, doc?: SettingsDocument | null): string | undefined;
@@ -1,4 +1,5 @@
1
1
  import { displayUntrusted } from './displayUntrusted.js';
2
+ import { msg, renderMessage } from './i18n/translate.js';
2
3
  import { SETTINGS_CLASSIFY_HOOKS_CONFIG, } from './generated/settingsSchemaFns.js';
3
4
  const _tuplePins = [true, true, true, true, true, true];
4
5
  void _tuplePins;
@@ -116,6 +117,9 @@ export const HOOK_SETTINGS_SOURCE_TEXT = Object.freeze({
116
117
  localSettings: 'Local settings',
117
118
  flagSettings: 'Flag settings',
118
119
  });
120
+ export function layerNotAppliedRefusesTurn(source) {
121
+ return source === 'policySettings';
122
+ }
119
123
  const SALVAGE_LABEL_MAX = 80;
120
124
  const SALVAGE_PIECES_SHOWN = 3;
121
125
  const labelOf = (s) => (typeof s === 'number' ? String(s) : displayUntrusted(s, { max: SALVAGE_LABEL_MAX }));
@@ -194,11 +198,13 @@ export function settingsHooksSalvageNotice(salvage, source, doc) {
194
198
  try {
195
199
  if (salvage.outcome === 'loaded-partial') {
196
200
  const what = joinPhrases(salvage.dropped.map((d) => ({ key: d.path.join('\u0000'), text: dropPhrase(d, doc) })));
201
+ if (layerNotAppliedRefusesTurn(source))
202
+ return renderMessage(msg('config.hooks.salvage.managedPartial', { layer, what }));
197
203
  return `${layer}: ${what}. The rest of this file's hooks are applied.`;
198
204
  }
199
205
  if (salvage.outcome === 'rejected') {
200
206
  const why = joinPhrases(salvage.rejections.map((r) => ({ key: r.path.join('\u0000'), text: rejectionPhrase(r) })));
201
- if (source === 'policySettings') {
207
+ if (layerNotAppliedRefusesTurn(source)) {
202
208
  return `${layer}: hooks could not be loaded — ${why}. Requests are not sent while the managed hooks cannot be applied; ask your administrator to fix the managed settings.`;
203
209
  }
204
210
  return `${layer}: hooks were not loaded — ${why}; ${GUARD_RISK_TAIL}.`;
@@ -0,0 +1,4 @@
1
+ import type { HostSettingsLayer, WorkspaceTrustState } from './hostSettingsSource.js';
2
+ export declare function layerAdmissionWord(layer: HostSettingsLayer, trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): string;
3
+ export declare function layerAdmitted(layer: HostSettingsLayer, trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): boolean;
4
+ export declare function admittedLayers<L extends HostSettingsLayer>(layers: readonly L[], trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): readonly L[];
@@ -0,0 +1,16 @@
1
+ import { SETTINGS_LAYER_ADMISSION } from './generated/settingsSchemaFns.js';
2
+ const TRUST_UNREADABLE_READING = 'declined';
3
+ const ADMITTED = 'admitted';
4
+ function layerAdmissionOf(layer, trust, category, member) {
5
+ const reading = trust === 'unreadable' ? TRUST_UNREADABLE_READING : trust;
6
+ return member === undefined ? SETTINGS_LAYER_ADMISSION(layer, reading, category) : SETTINGS_LAYER_ADMISSION(layer, reading, category, member);
7
+ }
8
+ export function layerAdmissionWord(layer, trust, category, member) {
9
+ return layerAdmissionOf(layer, trust, category, member);
10
+ }
11
+ export function layerAdmitted(layer, trust, category, member) {
12
+ return layerAdmissionOf(layer, trust, category, member) === ADMITTED;
13
+ }
14
+ export function admittedLayers(layers, trust, category, member) {
15
+ return layers.filter((layer) => layerAdmitted(layer, trust, category, member));
16
+ }
@@ -1,7 +1,7 @@
1
- import { engineWireTarget } from './engineWireTarget.js';
1
+ import { engineWireTargetBaseUrl } from './engineWireTarget.js';
2
2
  import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
3
3
  import { msg, renderMessage } from './i18n/translate.js';
4
- import { ownDataField } from './ownKey.js';
4
+ import { guardedRead, ownDataField, readOwnDataValue } from './ownKey.js';
5
5
  export function projectSkillToolListsCapability(caps) {
6
6
  try {
7
7
  if (caps === null || typeof caps !== 'object' || Array.isArray(caps))
@@ -21,13 +21,14 @@ const reader = createEngineCapReader({
21
21
  name: 'skillToolLists',
22
22
  project: projectSkillToolListsCapability,
23
23
  });
24
- export function observedSkillToolLists(baseUrl = engineWireTarget()?.baseUrl) {
24
+ export function observedSkillToolLists(baseUrl = engineWireTargetBaseUrl()) {
25
25
  return reader.observed(baseUrl);
26
26
  }
27
27
  export function skillToolListsAvailable(reading) {
28
- if (reading.kind === 'present')
28
+ const kind = guardedRead(() => readOwnDataValue(reading, 'kind'));
29
+ if (kind === 'present')
29
30
  return 'yes';
30
- if (reading.kind === 'absent' || reading.kind === 'not_reported')
31
+ if (kind === 'absent' || kind === 'not_reported')
31
32
  return 'no';
32
33
  return 'unknown';
33
34
  }
@@ -21,4 +21,18 @@ export interface SkillSpecsOptions {
21
21
  skillToolLists?: SkillToolListsReading;
22
22
  }
23
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;
24
38
  export declare function skillCommandsToSpecs(cmds: SkillCmdLike[], resolveBody: (cmd: SkillCmdLike) => string | null, opts?: SkillSpecsOptions): SkillSpecOnWire[];
@@ -1,4 +1,6 @@
1
1
  import { skillToolListsAvailable } from './skillToolListsCapability.js';
2
+ import { msg, renderMessage } from './i18n/translate.js';
3
+ import { appendOwnElement } from './ownKey.js';
2
4
  export function toCappedSpec(name, description, whenToUse, body) {
3
5
  const n = name.trim();
4
6
  const c = body.trim();
@@ -27,14 +29,14 @@ export function skillBaseDirOf(skillRoot, platform = 'posix') {
27
29
  return undefined;
28
30
  return skillRoot;
29
31
  }
30
- function readSkillToolList(skillName, key, cmd) {
31
- 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) {
32
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), ' +
33
35
  'so a value that is not a list of strings is refused instead of being silently reduced.';
34
- 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}`);
35
37
  let v;
36
38
  try {
37
- v = cmd[key];
39
+ v = source[key];
38
40
  }
39
41
  catch {
40
42
  throw unreadable();
@@ -49,7 +51,7 @@ function readSkillToolList(skillName, key, cmd) {
49
51
  throw unreadable();
50
52
  }
51
53
  if (!isArray) {
52
- 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}`);
53
55
  }
54
56
  const list = v;
55
57
  let lengthRead;
@@ -60,7 +62,10 @@ function readSkillToolList(skillName, key, cmd) {
60
62
  throw unreadable();
61
63
  }
62
64
  if (typeof lengthRead !== 'number' || !Number.isSafeInteger(lengthRead) || lengthRead < 0 || lengthRead > 4_294_967_295) {
63
- 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) })));
64
69
  }
65
70
  const n = lengthRead;
66
71
  const out = [];
@@ -73,18 +78,45 @@ function readSkillToolList(skillName, key, cmd) {
73
78
  throw unreadable();
74
79
  }
75
80
  if (typeof e !== 'string') {
76
- 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 });
77
82
  }
78
- out.push(e);
83
+ appendOwnElement(out, e);
79
84
  }
80
85
  return out;
81
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
+ }
82
116
  export function skillCommandsToSpecs(cmds, resolveBody, opts) {
83
117
  const specs = [];
84
118
  const seen = new Set();
85
119
  const reading = opts?.skillToolLists;
86
- const wired = reading !== undefined;
87
- const toolListsOn = wired && skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
88
120
  for (const cmd of cmds) {
89
121
  if (cmd.type !== 'prompt' || cmd.disableModelInvocation)
90
122
  continue;
@@ -96,15 +128,14 @@ export function skillCommandsToSpecs(cmds, resolveBody, opts) {
96
128
  continue;
97
129
  seen.add(spec.name);
98
130
  const baseDir = opts?.toolsRunHere === true ? skillBaseDirOf(cmd.skillRoot, opts.platform ?? 'posix') : undefined;
99
- const allowedTools = wired ? readSkillToolList(spec.name, 'allowedTools', cmd) : undefined;
100
- 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
+ }
101
135
  let wire = spec;
102
136
  if (baseDir !== undefined)
103
137
  wire = { ...wire, baseDir };
104
- if (toolListsOn && allowedTools !== undefined)
105
- wire = { ...wire, allowedTools };
106
- if (toolListsOn && disallowedTools !== undefined)
107
- wire = { ...wire, disallowedTools };
138
+ wire = { ...wire, ...verdict.lists };
108
139
  specs.push(wire);
109
140
  }
110
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;