@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
@@ -0,0 +1,156 @@
1
+ export const SETTINGS_MCP_REQUEST_ENTRY_CLOSURE = (MCP_CONTENT_ORIGINS, startsWithHttpScheme, echoCallerText) => {
2
+ function describeValueShape(v) {
3
+ if (v === undefined)
4
+ return "nothing (the key is absent)";
5
+ if (v === null)
6
+ return "null";
7
+ if (Array.isArray(v))
8
+ return "an array";
9
+ if (typeof v === "string")
10
+ return v.length === 0 ? "an empty string" : `a string of ${v.length} characters`;
11
+ if (typeof v === "object")
12
+ return "an object";
13
+ return `a ${typeof v}`;
14
+ }
15
+ function describeNotStringArray(v) {
16
+ return Array.isArray(v) ? "an array with a non-string element" : describeValueShape(v);
17
+ }
18
+ function isStringArray(v) {
19
+ return Array.isArray(v) && v.every((a) => typeof a === "string");
20
+ }
21
+ function quotedCallerText(text) {
22
+ return `"${echoCallerText(text)}"`;
23
+ }
24
+ const TOOL_WIRE_NAME_MAX_CHARS = 128;
25
+ const hasEdgeWhitespace = (v) => v.trim() !== v;
26
+ function isUsableWireName(v) {
27
+ return typeof v === "string" && v.length > 0 && v.length <= TOOL_WIRE_NAME_MAX_CHARS && !hasEdgeWhitespace(v);
28
+ }
29
+ function describeBadWireName(v) {
30
+ if (typeof v !== "string")
31
+ return v === null ? "null" : Array.isArray(v) ? "array" : typeof v;
32
+ if (v.length === 0)
33
+ return "empty";
34
+ const head = quotedCallerText(v);
35
+ const tooLong = `${v.length} chars > ${TOOL_WIRE_NAME_MAX_CHARS}`;
36
+ if (!hasEdgeWhitespace(v))
37
+ return `${head} (${tooLong})`;
38
+ return `${head} (${v.length > TOOL_WIRE_NAME_MAX_CHARS ? `${tooLong}, ` : ""}leading or trailing whitespace)`;
39
+ }
40
+ const CONTENT_ORIGIN_WORDS = new Set(MCP_CONTENT_ORIGINS);
41
+ function isContentOriginWord(v) {
42
+ return typeof v === "string" && CONTENT_ORIGIN_WORDS.has(v);
43
+ }
44
+ function describeBadContentOrigin(v) {
45
+ return typeof v === "string" ? quotedCallerText(v) : v === null ? "null" : Array.isArray(v) ? "array" : typeof v;
46
+ }
47
+ function readMcpIdentityHeaders(transport) {
48
+ return {
49
+ ...(typeof transport.principalHeader === "string" ? { principalHeader: transport.principalHeader } : {}),
50
+ ...(transport.principalHeader === undefined && typeof transport.assertionHeader === "string" ? { assertionHeader: transport.assertionHeader } : {}),
51
+ };
52
+ }
53
+ const transportBad = (path, reason) => ({ ok: false, issue: { path, reason } });
54
+ function readRequestMcpTransport(t) {
55
+ if (!t || typeof t !== "object")
56
+ return transportBad("transport", `must be an object with a "kind" of "stdio" or "http" — got ${describeValueShape(t)}`);
57
+ const tr = t;
58
+ const lost = [];
59
+ if (tr.kind === "stdio") {
60
+ if (typeof tr.command !== "string" || tr.command.length === 0)
61
+ return transportBad("transport.command", `must be a non-empty string (the command to run) — got ${describeValueShape(tr.command)}`);
62
+ if (tr.args !== undefined && !isStringArray(tr.args))
63
+ lost.push({ path: "transport.args", reason: `must be an array of strings — got ${describeNotStringArray(tr.args)}` });
64
+ const env = readTransportRecord("transport.env", tr.env, lost);
65
+ return {
66
+ ok: true,
67
+ transport: {
68
+ kind: "stdio",
69
+ command: tr.command,
70
+ ...(isStringArray(tr.args) ? { args: tr.args } : {}),
71
+ ...(env !== undefined ? { env } : {}),
72
+ },
73
+ lost,
74
+ };
75
+ }
76
+ if (tr.kind === "http") {
77
+ if (typeof tr.url !== "string" || !startsWithHttpScheme(tr.url))
78
+ return transportBad("transport.url", "must be an absolute http(s) URL (put credentials in transport.headers, never in the URL)");
79
+ const ids = readMcpIdentityHeaders(tr);
80
+ const headers = readTransportRecord("transport.headers", tr.headers, lost);
81
+ if (tr.principalHeader !== undefined && ids.principalHeader === undefined) {
82
+ lost.push({ path: "transport.principalHeader", reason: `must be a string (the HTTP header NAME the end-user principal is injected into) — got ${describeValueShape(tr.principalHeader)}` });
83
+ }
84
+ return {
85
+ ok: true,
86
+ transport: {
87
+ kind: "http",
88
+ url: tr.url,
89
+ ...(headers !== undefined ? { headers } : {}),
90
+ ...ids,
91
+ },
92
+ lost,
93
+ };
94
+ }
95
+ return transportBad("transport.kind", `must be "stdio" or "http" — got ${describeValueShape(tr.kind)}`);
96
+ }
97
+ const RESERVED_MEMBER_NAME = "__proto__";
98
+ const RESERVED_MEMBER_FAULT = `no member of a declaration may be named "${RESERVED_MEMBER_NAME}"`;
99
+ function readPlainStringRecord(v) {
100
+ if (v === null || typeof v !== "object" || Array.isArray(v))
101
+ return { ok: false, fault: "not_plain_record", detail: v === null ? "got null" : Array.isArray(v) ? "got an array" : `got a ${typeof v}` };
102
+ let proto;
103
+ let names;
104
+ try {
105
+ proto = Object.getPrototypeOf(v);
106
+ names = Object.getOwnPropertyNames(v);
107
+ }
108
+ catch {
109
+ return { ok: false, fault: "not_plain_record", detail: "got an object that could not be inspected (a proxy trap threw)" };
110
+ }
111
+ if (proto !== Object.prototype && proto !== null) {
112
+ return { ok: false, fault: "not_plain_record", detail: "got an object that is not plain data (a class instance, a Map, process.env, or a record built on a prototype; copy it into a plain object)" };
113
+ }
114
+ const record = {};
115
+ let reservedMember = false;
116
+ for (const name of names) {
117
+ let value;
118
+ let unreadable = false;
119
+ try {
120
+ const d = Object.getOwnPropertyDescriptor(v, name);
121
+ value = d === undefined ? undefined : Object.hasOwn(d, "value") ? d.value : d.get === undefined ? undefined : Reflect.apply(d.get, v, []);
122
+ }
123
+ catch {
124
+ unreadable = true;
125
+ }
126
+ if (unreadable || typeof value !== "string") {
127
+ const valueFault = unreadable ? "could not be read (its getter threw)" : `must be a string — got ${describeValueShape(value)}`;
128
+ const reserved = name === RESERVED_MEMBER_NAME;
129
+ return {
130
+ ok: false,
131
+ fault: reserved ? "member_name_reserved" : "member_not_string",
132
+ member: echoCallerText(name),
133
+ detail: `its member "${echoCallerText(name)}" ${reserved ? `is not allowed (${RESERVED_MEMBER_FAULT}) and its value ${valueFault}` : valueFault}`,
134
+ };
135
+ }
136
+ if (name === RESERVED_MEMBER_NAME)
137
+ reservedMember = true;
138
+ else
139
+ record[name] = value;
140
+ }
141
+ return { ok: true, record, reservedMember };
142
+ }
143
+ function readTransportRecord(path, raw, lost) {
144
+ if (raw === undefined)
145
+ return undefined;
146
+ const read = readPlainStringRecord(raw);
147
+ if (!read.ok) {
148
+ lost.push({ path, reason: `must be a plain object of string values — ${read.detail}`, ...(read.member !== undefined ? { member: read.member } : {}), fault: read.fault });
149
+ return undefined;
150
+ }
151
+ if (read.reservedMember)
152
+ lost.push({ path: `${path}.${RESERVED_MEMBER_NAME}`, reason: RESERVED_MEMBER_FAULT, member: RESERVED_MEMBER_NAME, fault: "member_name_reserved" });
153
+ return read.record;
154
+ }
155
+ return { readRequestMcpTransport, readMcpIdentityHeaders, isUsableWireName, describeBadWireName, isContentOriginWord, describeBadContentOrigin, TOOL_WIRE_NAME_MAX_CHARS };
156
+ };
@@ -0,0 +1 @@
1
+ export declare const SETTINGS_SAFETY_MERGE_CLOSURE: (MIN_TRUST_WORDS: readonly ["local", "session", "project", "global", "managed", "task"]) => any;
@@ -0,0 +1,95 @@
1
+ export const SETTINGS_SAFETY_MERGE_CLOSURE = (MIN_TRUST_WORDS) => {
2
+ function trustRank(layer) {
3
+ switch (layer) {
4
+ case "managed": return 6;
5
+ case "global": return 5;
6
+ case "project": return 4;
7
+ case "local": return 3;
8
+ case "session": return 2;
9
+ case "task": return 1;
10
+ default: {
11
+ const unknown = layer;
12
+ throw new RangeError(`MinTrust: unknown trust word '${String(unknown)}' (words: ${MIN_TRUST_WORDS.join(", ")})`);
13
+ }
14
+ }
15
+ }
16
+ function isAtLeast(layer, minTrust) {
17
+ return trustRank(layer) >= trustRank(minTrust);
18
+ }
19
+ const SAFETY_MERGE_SPEC = {
20
+ permissions: {
21
+ mergeShape: "denyFirst", minTrust: "global", tighten: { rule: "policyDenyWins" }, enforcement: "gate", fail: "closed",
22
+ seam: "toolPolicy + deny-narrowing (SessionPolicyStore)", coreAxis: "permissionDecision",
23
+ members: {
24
+ allow: { direction: "loosen", minTrust: "global" },
25
+ deny: { direction: "tighten", minTrust: "local" },
26
+ ask: { direction: "tighten", minTrust: "local" },
27
+ },
28
+ },
29
+ permissionMode: { mergeShape: "replace", minTrust: "global", tighten: { rule: "enumRank", order: ["bypassPermissions", "auto", "acceptEdits", "default", "dontAsk", "plan"] }, enforcement: "gate", fail: "closed", seam: "derive → toolPolicy / onAsk / handsReadOnly (§6.4); bypass = launch-flag only; the kill-switches are the killSwitches row" },
30
+ handsReadOnly: { mergeShape: "replace", minTrust: "global", tighten: { rule: "boolStricter", strict: true }, enforcement: "gate", fail: "closed", seam: "handsReadOnly" },
31
+ shellGate: { mergeShape: "replace", minTrust: "global", tighten: { rule: "enumRank", order: ["always"] }, enforcement: "gate", fail: "closed", seam: "shellGate", coreAxis: "shellGate" },
32
+ approver: { mergeShape: "replace", minTrust: "global", tighten: { rule: "none" }, enforcement: "gate", fail: "closed", seam: "onAsk (conflict → reject)" },
33
+ sandboxNetwork: {
34
+ mergeShape: "denyFirst", minTrust: "global", tighten: { rule: "setNarrower" }, enforcement: "gate", fail: "closed",
35
+ seam: "ExecutionEnv (fs+net) + sensitive-path", coreAxis: "egress",
36
+ members: {
37
+ enabled: { direction: "tighten", minTrust: "global", boolPole: { strict: true, minTrust: "local" } },
38
+ allowUnsandboxedCommands: { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
39
+ autoAllowBashIfSandboxed: { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
40
+ enableWeakerNestedSandbox: { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
41
+ enableWeakerNetworkIsolation: { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
42
+ "network.allowManagedDomainsOnly": { direction: "tighten", minTrust: "global", boolPole: { strict: true, minTrust: "local" } },
43
+ "network.allowAllUnixSockets": { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
44
+ "network.allowLocalBinding": { direction: "tighten", minTrust: "global", boolPole: { strict: false, minTrust: "local" } },
45
+ "filesystem.allowManagedReadPathsOnly": { direction: "tighten", minTrust: "global", boolPole: { strict: true, minTrust: "local" } },
46
+ "filesystem.denyWrite": { direction: "tighten", minTrust: "local" },
47
+ "filesystem.denyRead": { direction: "tighten", minTrust: "local" },
48
+ },
49
+ },
50
+ hooks: { mergeShape: "runAll", minTrust: "project", tighten: { rule: "none" }, enforcement: "gate", fail: "closed", seam: "hooks (single source or adapter-composed)" },
51
+ mcpServers: { mergeShape: "overrideByName", minTrust: "project", tighten: { rule: "none" }, enforcement: "resolver", fail: "open", seam: "spec.mcp + allowTools" },
52
+ rulesInstructions: { mergeShape: "concat", minTrust: "project", tighten: { rule: "none" }, enforcement: "resolver", fail: "open", seam: "appendSystemPrompt / memory (GLOBAL→PROJECT→SESSION)" },
53
+ model: { mergeShape: "replace", minTrust: "session", tighten: { rule: "none" }, enforcement: "client", fail: "open", seam: "RoleSpec / TaskSpec.{model,thinking}" },
54
+ env: { mergeShape: "concat", minTrust: "project", tighten: { rule: "none" }, enforcement: "resolver", fail: "open", seam: "NodeExecutionEnv.shellEnv (later layer overrides same name)" },
55
+ envSecret: { mergeShape: "replace", minTrust: "global", tighten: { rule: "none" }, enforcement: "resolver", fail: "closed", seam: "§7 secret-ref resolution" },
56
+ memoryScopes: { mergeShape: "concat", minTrust: "global", tighten: { rule: "none" }, enforcement: "client", fail: "open", seam: "MemoryStore" },
57
+ autoCompaction: { mergeShape: "replace", minTrust: "session", tighten: { rule: "none" }, enforcement: "client", fail: "open", seam: "compaction config" },
58
+ ui: { mergeShape: "replace", minTrust: "local", tighten: { rule: "none" }, enforcement: "client", fail: "open", seam: "shell-only (theme/keybindings/statusLine) — never touches the engine" },
59
+ org: { mergeShape: "replace", minTrust: "managed", tighten: { rule: "none" }, enforcement: "server", fail: "closed", seam: "web-admin → governanceBaseline (SSO/SCIM/audit/budget, TOB-only)" },
60
+ httpHookAllowlists: { mergeShape: "denyFirst", minTrust: "global", tighten: { rule: "setNarrower" }, enforcement: "resolver", fail: "closed", seam: "http hook URL / header-env allowlists (httpHookUrlVerdict / httpHookEnvVarsAllowed)" },
61
+ killSwitches: {
62
+ mergeShape: "replace", minTrust: "global", tighten: { rule: "boolStricter", strict: true }, enforcement: "gate", fail: "closed",
63
+ seam: "permission-mode kill-switches (a switch ON removes bypassPermissions / auto from every layer's mode choice)",
64
+ members: {
65
+ disableBypassPermissionsMode: { direction: "tighten", minTrust: "global", boolPole: { strict: true, minTrust: "local" } },
66
+ disableAutoMode: { direction: "tighten", minTrust: "global", boolPole: { strict: true, minTrust: "local" } },
67
+ },
68
+ },
69
+ };
70
+ function categorySpec(category) {
71
+ if (!Object.hasOwn(SAFETY_MERGE_SPEC, category)) {
72
+ throw new RangeError(`SAFETY_MERGE_SPEC: unknown category '${category}' (categories: ${Object.keys(SAFETY_MERGE_SPEC).join(", ")})`);
73
+ }
74
+ return SAFETY_MERGE_SPEC[category];
75
+ }
76
+ function resolveMemberAdmission(spec, member, categoryLabel = "(unnamed category)", value) {
77
+ if (spec.members === undefined) {
78
+ throw new RangeError(`SAFETY_MERGE_SPEC: category '${categoryLabel}' has no member-level admission — its minTrust applies to the whole key`);
79
+ }
80
+ if (!Object.hasOwn(spec.members, member)) {
81
+ throw new RangeError(`SAFETY_MERGE_SPEC: unknown member '${member}' of category '${categoryLabel}' (members: ${Object.keys(spec.members).join(", ")})`);
82
+ }
83
+ const row = spec.members[member];
84
+ const rowFloor = row.minTrust ?? spec.minTrust;
85
+ if (row.boolPole !== undefined) {
86
+ const floor = value === row.boolPole.strict ? row.boolPole.minTrust : rowFloor;
87
+ return { direction: row.direction, minTrust: floor, boolPole: row.boolPole };
88
+ }
89
+ return { direction: row.direction, minTrust: rowFloor };
90
+ }
91
+ function memberAdmission(category, member, value) {
92
+ return resolveMemberAdmission(categorySpec(category), member, category, value);
93
+ }
94
+ return { isAtLeast, memberAdmission, SAFETY_MERGE_SPEC };
95
+ };
@@ -0,0 +1 @@
1
+ export declare const SETTINGS_LAYER_SOURCES_CLOSURE: (SAFETY_MERGE_SPEC: object, isAtLeast: (layer: string, minTrust: string) => boolean, memberAdmission: (category: string, member: string) => object) => any;
@@ -0,0 +1,58 @@
1
+ export const SETTINGS_LAYER_SOURCES_CLOSURE = (SAFETY_MERGE_SPEC, isAtLeast, memberAdmission) => {
2
+ const SETTINGS_SOURCES = ["userSettings", "projectSettings", "localSettings", "flagSettings", "policySettings", "foreignProjectSettings"];
3
+ const SETTINGS_SOURCE_CONTRACT = {
4
+ userSettings: { trust: "global", repoControllable: false },
5
+ projectSettings: { trust: "project", repoControllable: true },
6
+ localSettings: { trust: "project", repoControllable: true },
7
+ flagSettings: { trust: "global", repoControllable: false },
8
+ policySettings: { trust: "managed", repoControllable: false },
9
+ foreignProjectSettings: { trust: "project", repoControllable: true, tightenOnly: true },
10
+ };
11
+ function settingsSourceContract(source) {
12
+ if (!Object.hasOwn(SETTINGS_SOURCE_CONTRACT, source)) {
13
+ throw new RangeError(`SETTINGS_SOURCE_CONTRACT: unknown settings source '${String(source)}' (sources: ${SETTINGS_SOURCES.join(", ")})`);
14
+ }
15
+ return SETTINGS_SOURCE_CONTRACT[source];
16
+ }
17
+ const WORKSPACE_TRUST_STATES = ["accepted", "declined", "no_trust_step"];
18
+ function layerAdmission(source, workspace, category, member, value) {
19
+ const layer = settingsSourceContract(source);
20
+ const tightenOnlyLayer = readsTightenOnly(layer, workspace);
21
+ let floor;
22
+ let direction;
23
+ if (member === undefined) {
24
+ if (!Object.hasOwn(SAFETY_MERGE_SPEC, category)) {
25
+ throw new RangeError(`SAFETY_MERGE_SPEC: unknown category '${String(category)}' (categories: ${Object.keys(SAFETY_MERGE_SPEC).join(", ")})`);
26
+ }
27
+ floor = SAFETY_MERGE_SPEC[category].minTrust;
28
+ }
29
+ else {
30
+ const resolved = memberAdmission(category, member, value);
31
+ floor = resolved.minTrust;
32
+ direction = resolved.direction;
33
+ }
34
+ if (!isAtLeast(layer.trust, floor))
35
+ return "below_trust_floor";
36
+ if (direction === "tighten" || !tightenOnlyLayer)
37
+ return "admitted";
38
+ return layer.tightenOnly === true ? "tighten_only" : "trust_withheld";
39
+ }
40
+ function readsTightenOnly(layer, workspace) {
41
+ const accepted = workspaceAccepted(workspace);
42
+ return layer.tightenOnly === true || (layer.repoControllable && !accepted);
43
+ }
44
+ function workspaceAccepted(workspace) {
45
+ switch (workspace) {
46
+ case "accepted":
47
+ return true;
48
+ case "declined":
49
+ case "no_trust_step":
50
+ return false;
51
+ default: {
52
+ const unknown = workspace;
53
+ throw new RangeError(`WORKSPACE_TRUST_STATES: unknown workspace trust reading '${String(unknown)}' (readings: ${WORKSPACE_TRUST_STATES.join(", ")})`);
54
+ }
55
+ }
56
+ }
57
+ return { layerAdmission };
58
+ };
@@ -10,3 +10,6 @@ export declare const SETTINGS_BUDGET_PER_MODEL_NUMBER_KEYS: readonly ["maxBudget
10
10
  export declare const SETTINGS_MODEL_API_WORDS: readonly ["openai-completions", "anthropic-messages"];
11
11
  export declare const SETTINGS_TOOL_NAME_MATCHER_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure"];
12
12
  export declare const SETTINGS_UI_LANGUAGE_VALUES: readonly ["en", "zh"];
13
+ export declare const SETTINGS_MCP_CONTENT_ORIGINS: readonly ["local", "execution", "external"];
14
+ export declare const SETTINGS_MIN_TRUST_WORDS: readonly ["local", "session", "project", "global", "managed", "task"];
15
+ export declare const SETTINGS_WORKSPACE_TRUST_STATES: readonly ["accepted", "declined", "no_trust_step"];
@@ -45,3 +45,21 @@ export const SETTINGS_UI_LANGUAGE_VALUES = Object.freeze([
45
45
  "en",
46
46
  "zh",
47
47
  ]);
48
+ export const SETTINGS_MCP_CONTENT_ORIGINS = Object.freeze([
49
+ "local",
50
+ "execution",
51
+ "external",
52
+ ]);
53
+ export const SETTINGS_MIN_TRUST_WORDS = Object.freeze([
54
+ "local",
55
+ "session",
56
+ "project",
57
+ "global",
58
+ "managed",
59
+ "task",
60
+ ]);
61
+ export const SETTINGS_WORKSPACE_TRUST_STATES = Object.freeze([
62
+ "accepted",
63
+ "declined",
64
+ "no_trust_step",
65
+ ]);
@@ -102,4 +102,32 @@ export type HooksClassification = {
102
102
  readonly dropped: readonly [];
103
103
  readonly rejections: readonly HooksRejection[];
104
104
  };
105
+ export type RequestMcpTransport = {
106
+ kind: "stdio";
107
+ command: string;
108
+ args?: string[];
109
+ env?: Record<string, string>;
110
+ } | {
111
+ kind: "http";
112
+ url: string;
113
+ headers?: Record<string, string>;
114
+ principalHeader?: string;
115
+ assertionHeader?: string;
116
+ };
117
+ export interface McpEntryKeyIssue {
118
+ readonly path: string;
119
+ readonly reason: string;
120
+ readonly member?: string;
121
+ readonly fault?: "not_plain_record" | "member_not_string" | "member_name_reserved";
122
+ }
123
+ export type RequestMcpTransportRead = {
124
+ ok: true;
125
+ transport: RequestMcpTransport;
126
+ lost: readonly McpEntryKeyIssue[];
127
+ } | {
128
+ ok: false;
129
+ issue: McpEntryKeyIssue;
130
+ };
131
+ declare const MCP_CONTENT_ORIGINS: readonly ["local", "execution", "external"];
132
+ export type McpContentOrigin = (typeof MCP_CONTENT_ORIGINS)[number];
105
133
  export {};
@@ -0,0 +1 @@
1
+ export declare const SETTINGS_URL_ALLOW_PATTERN_MATCHES_CLOSURE: () => (url: string, pattern: string) => boolean;
@@ -0,0 +1,183 @@
1
+ export const SETTINGS_URL_ALLOW_PATTERN_MATCHES_CLOSURE = () => {
2
+ const SPECIAL_SCHEMES = new Set(["http:", "https:", "ws:", "wss:", "ftp:", "file:"]);
3
+ const HOST_ROUTED_SCHEMES = new Set(["http:", "https:", "ws:", "wss:"]);
4
+ const OTHER_DEFAULT_PORT_SCHEME = { "http:": "https", "https:": "http", "ws:": "wss", "wss:": "ws", "ftp:": "http" };
5
+ const SOCKET_PATH_SCHEME = "ws+unix:";
6
+ function parseUrl(s) {
7
+ try {
8
+ return new URL(s);
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ function occurrences(haystack, needle) {
15
+ return haystack.split(needle).length - 1;
16
+ }
17
+ function parserReadings(s) {
18
+ const fold = (x) => x.replace(/\p{Default_Ignorable_Code_Point}/gu, "").normalize("NFKC").toLowerCase().normalize("NFKC");
19
+ const seen = asParserSees(s);
20
+ const decoded = seen.replace(/(?:%[0-9a-f]{2})+/gi, (run) => {
21
+ try {
22
+ return decodeURIComponent(run);
23
+ }
24
+ catch {
25
+ return run;
26
+ }
27
+ });
28
+ return [fold(seen), fold(decoded)];
29
+ }
30
+ function freeToken(stem, avoid, build) {
31
+ const taken = new Set();
32
+ const shape = new RegExp(`zz${stem}(\\d+)qq`, "g");
33
+ for (const reading of parserReadings(avoid))
34
+ for (const m of reading.matchAll(shape))
35
+ taken.add(m[1]);
36
+ for (let i = 0;; i++) {
37
+ if (taken.has(String(i)))
38
+ continue;
39
+ const token = `zz${stem}${i}qq`;
40
+ const { built, inserted } = build(token);
41
+ if (parserReadings(built).every((r) => occurrences(r, token) === inserted))
42
+ return { token, built };
43
+ taken.add(String(i));
44
+ }
45
+ }
46
+ function asParserSees(s) {
47
+ let start = 0;
48
+ let end = s.length;
49
+ while (start < end && s.charCodeAt(start) <= 0x20)
50
+ start++;
51
+ while (end > start && s.charCodeAt(end - 1) <= 0x20)
52
+ end--;
53
+ return s.slice(start, end).replace(/[\t\n\r]/g, "");
54
+ }
55
+ function defaultPortWritten(marked, pat) {
56
+ if (pat.port !== "")
57
+ return false;
58
+ const other = OTHER_DEFAULT_PORT_SCHEME[pat.protocol];
59
+ if (other === undefined)
60
+ return false;
61
+ const seen = asParserSees(marked);
62
+ const colon = seen.indexOf(":");
63
+ if (colon === -1)
64
+ return false;
65
+ const alt = parseUrl(other + seen.slice(colon));
66
+ return alt !== undefined && alt.port !== "";
67
+ }
68
+ function namesScheme(pattern, protocol) {
69
+ return asParserSees(pattern).toLowerCase().startsWith(protocol);
70
+ }
71
+ function socketPart(path) {
72
+ const i = path.indexOf(":");
73
+ return i === -1 ? path : path.slice(0, i);
74
+ }
75
+ function globMatches(pattern, value) {
76
+ const parts = pattern.split("*");
77
+ const head = parts[0] ?? "";
78
+ if (parts.length === 1)
79
+ return head === value;
80
+ const tail = parts[parts.length - 1] ?? "";
81
+ const end = value.length - tail.length;
82
+ if (end < head.length || !value.startsWith(head) || !value.endsWith(tail))
83
+ return false;
84
+ let at = head.length;
85
+ for (const mid of parts.slice(1, -1)) {
86
+ if (mid === "")
87
+ continue;
88
+ const found = value.indexOf(mid, at);
89
+ if (found === -1 || found + mid.length > end)
90
+ return false;
91
+ at = found + mid.length;
92
+ }
93
+ return true;
94
+ }
95
+ function nextSeparator(s, separators, from) {
96
+ let i = from;
97
+ while (i < s.length && !separators.includes(s.charAt(i)))
98
+ i++;
99
+ return i;
100
+ }
101
+ function segmentedGlobMatches(pattern, value, separators) {
102
+ let p = 0;
103
+ let v = 0;
104
+ for (;;) {
105
+ const pe = nextSeparator(pattern, separators, p);
106
+ const ve = nextSeparator(value, separators, v);
107
+ if (pattern.charAt(pe) !== value.charAt(ve) || !globMatches(pattern.slice(p, pe), value.slice(v, ve)))
108
+ return false;
109
+ if (pe === pattern.length)
110
+ return true;
111
+ p = pe + 1;
112
+ v = ve + 1;
113
+ }
114
+ }
115
+ function componentMatches(url, pattern, reading) {
116
+ if (pattern === "*")
117
+ return true;
118
+ const target = parseUrl(url);
119
+ if (target === undefined)
120
+ return false;
121
+ const strict = reading === "allow";
122
+ if (strict && !HOST_ROUTED_SCHEMES.has(target.protocol) && !namesScheme(pattern, target.protocol))
123
+ return false;
124
+ const socketTarget = strict && target.protocol === SOCKET_PATH_SCHEME;
125
+ if (socketTarget) {
126
+ const socket = socketPart(target.pathname + target.search);
127
+ if (socket === "" || socket.split("/").includes(".."))
128
+ return false;
129
+ }
130
+ const { token: WILDCARD, built: starred } = freeToken("wildcard", `${pattern}\n${url}`, (t) => ({ built: pattern.replaceAll("*", t), inserted: occurrences(pattern, "*") }));
131
+ const { token: SHIELD, built: marked } = freeToken("punycode", `${starred}\n${url}`, (t) => {
132
+ let inserted = 0;
133
+ const built = starred.replace(/[a-z0-9-]+/gi, (run) => {
134
+ if (!/^xn--/i.test(run) || !run.includes(WILDCARD))
135
+ return run;
136
+ inserted++;
137
+ return t + run;
138
+ });
139
+ return { built, inserted };
140
+ });
141
+ const unshield = (s) => s.replaceAll(SHIELD, "");
142
+ let portAny = false;
143
+ let pat = parseUrl(marked);
144
+ if (pat === undefined) {
145
+ const zeroPort = marked.replace(new RegExp(`:${WILDCARD}(?=[/?#]|$)`), ":0");
146
+ if (zeroPort !== marked) {
147
+ pat = parseUrl(zeroPort);
148
+ portAny = pat !== undefined;
149
+ }
150
+ }
151
+ if (pat !== undefined && (occurrences(pat.href, WILDCARD) > occurrences(pattern, "*") || occurrences(pat.href, SHIELD) > occurrences(marked, SHIELD)))
152
+ pat = undefined;
153
+ if (pat === undefined || (SPECIAL_SCHEMES.has(pat.protocol) && pat.hostname.split(".").some((l) => l.startsWith("xn--") && l.includes(WILDCARD)))) {
154
+ return !strict && segmentedGlobMatches(pattern, `${target.protocol}//${target.host}${target.pathname}${target.search}`, "/");
155
+ }
156
+ if (pat.protocol !== `${WILDCARD}:` && pat.protocol !== target.protocol)
157
+ return false;
158
+ if (strict && unshield(pat.hostname).includes("*"))
159
+ return false;
160
+ const host = target.hostname.replace(/\.$/, "").toLowerCase();
161
+ const hostPattern = unshield(pat.hostname).replace(/\.$/, "").toLowerCase().replaceAll(WILDCARD, "*");
162
+ if (!globMatches(hostPattern, host))
163
+ return false;
164
+ if (pat.port === "" && pat.hostname.includes(WILDCARD) && !(strict && defaultPortWritten(marked, pat)))
165
+ portAny = true;
166
+ if (!portAny && pat.port !== target.port)
167
+ return false;
168
+ if ((pat.pathname === "/" || pat.pathname === "") && pat.search === "" && !marked.endsWith("/"))
169
+ return !socketTarget;
170
+ const pathPattern = unshield(pat.pathname + pat.search).replaceAll(WILDCARD, "*");
171
+ const targetPath = target.pathname + target.search;
172
+ if (!globMatches(pathPattern, targetPath))
173
+ return false;
174
+ if (!socketTarget)
175
+ return true;
176
+ const socketPattern = socketPart(pathPattern);
177
+ return !socketPattern.includes("*") && socketPattern === socketPart(targetPath);
178
+ }
179
+ function urlAllowPatternMatches(url, pattern) {
180
+ return componentMatches(url, pattern, "allow");
181
+ }
182
+ return urlAllowPatternMatches;
183
+ };
@@ -4,11 +4,27 @@ import { type EnvLike } from './hostEnv.js';
4
4
  export declare const HEADLESS_PERMISSION_MODE_ENV = "SEMA_HEADLESS_PERMISSION_MODE";
5
5
  export declare const HEADLESS_PERMISSION_WIRE_MODES: readonly PermissionMode[];
6
6
  export declare function normalizeShellPermissionModeForWire(mode: string | undefined): string | undefined;
7
+ export interface HeadlessPermissionFlags {
8
+ readonly flag?: string;
9
+ readonly missing?: true;
10
+ readonly dangerouslySkipPermissions?: boolean;
11
+ }
7
12
  export type HeadlessPermissionResolution = {
8
13
  fields: PermissionModeField;
9
14
  source: 'flag' | 'env' | 'default';
10
15
  warning?: string;
11
16
  };
12
- export declare function permissionModeFromArgv(argv: readonly string[]): string | undefined;
13
- export declare function resolveHeadlessPermissionMode(argv: readonly string[], env?: EnvLike, permissionModes?: PermissionModesReading): HeadlessPermissionResolution;
17
+ export declare function resolveHeadlessPermissionMode(flags: HeadlessPermissionFlags | undefined, env?: EnvLike, permissionModes?: PermissionModesReading): HeadlessPermissionResolution;
18
+ export type HeadlessPermissionModeKnob = {
19
+ readonly kind: 'absent';
20
+ } | {
21
+ readonly kind: 'word';
22
+ readonly word: PermissionMode;
23
+ } | {
24
+ readonly kind: 'invalid';
25
+ readonly raw: string;
26
+ readonly warning: string;
27
+ };
28
+ export declare function readHeadlessPermissionModeKnob(env?: EnvLike): HeadlessPermissionModeKnob;
29
+ export declare function headlessDontAskDowngradeWarning(permissionModes?: PermissionModesReading): string;
14
30
  export declare function _resetHeadlessPermissionModeWireForTest(): void;