@sema-agent/client-core 0.98.0 → 0.100.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 (236) hide show
  1. package/CHANGELOG.md +376 -0
  2. package/README.md +61 -35
  3. package/dist/adapt/arms.js +120 -55
  4. package/dist/adapt/panelTasks.d.ts +3 -2
  5. package/dist/adapt/panelTasks.js +34 -11
  6. package/dist/adapt/textStream.d.ts +1 -1
  7. package/dist/adapt/textStream.js +51 -28
  8. package/dist/adapter/activeRunSelfHeal.d.ts +11 -3
  9. package/dist/adapter/activeRunSelfHeal.js +210 -294
  10. package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
  11. package/dist/adapter/downstream/eventToSdkMessage.js +176 -12
  12. package/dist/adapter/downstream/terminalToSdkResult.js +10 -0
  13. package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
  14. package/dist/adapter/downstream/wiringManifestView.js +1 -0
  15. package/dist/adapter/runStream.js +82 -40
  16. package/dist/adapter/types.d.ts +2 -0
  17. package/dist/adapter/types.js +2 -1
  18. package/dist/agentSession/engineSessionBackgroundStop.js +16 -8
  19. package/dist/agentsWireCaps.d.ts +7 -3
  20. package/dist/agentsWireCaps.js +133 -39
  21. package/dist/cloudConfigWireCaps.d.ts +10 -1
  22. package/dist/cloudConfigWireCaps.js +181 -65
  23. package/dist/compactionStatus.d.ts +34 -0
  24. package/dist/compactionStatus.js +196 -0
  25. package/dist/controlRouter.d.ts +4 -2
  26. package/dist/controlRouter.js +39 -51
  27. package/dist/coreValuePorts.d.ts +26 -1
  28. package/dist/coreValuePorts.js +10 -0
  29. package/dist/corruptSessionCopy.d.ts +2 -1
  30. package/dist/corruptSessionCopy.js +3 -3
  31. package/dist/decideFailureNote.js +3 -3
  32. package/dist/declared/supportFloorDeclared.js +1 -1
  33. package/dist/detachWire.js +3 -2
  34. package/dist/devicesFace.d.ts +34 -0
  35. package/dist/devicesFace.js +90 -0
  36. package/dist/displayUntrusted.d.ts +1 -0
  37. package/dist/displayUntrusted.js +153 -5
  38. package/dist/engineAgentPanelStore.d.ts +14 -4
  39. package/dist/engineAgentPanelStore.js +14 -0
  40. package/dist/engineCapReader.d.ts +2 -1
  41. package/dist/engineCapReader.js +7 -5
  42. package/dist/engineCapsCache.d.ts +8 -0
  43. package/dist/engineCapsCache.js +59 -6
  44. package/dist/engineCapsChange.d.ts +2 -0
  45. package/dist/engineCapsChange.js +9 -0
  46. package/dist/engineErrorCodes.d.ts +11 -2
  47. package/dist/engineErrorCodes.js +11 -12
  48. package/dist/engineRowRef.js +4 -0
  49. package/dist/engineSessionMessages.d.ts +1 -0
  50. package/dist/engineSessionMessages.js +7 -1
  51. package/dist/engineTargetSeat.d.ts +27 -0
  52. package/dist/engineTargetSeat.js +199 -0
  53. package/dist/engineToolDirectory.d.ts +3 -0
  54. package/dist/engineToolDirectory.js +4 -2
  55. package/dist/engineWireFor.js +3 -8
  56. package/dist/env/uiLanguage.d.ts +2 -1
  57. package/dist/env/uiLanguage.js +3 -2
  58. package/dist/eventLeg.d.ts +7 -5
  59. package/dist/eventLeg.js +68 -49
  60. package/dist/fileHistoryCaptureCapability.d.ts +2 -4
  61. package/dist/fileHistoryCaptureCapability.js +12 -22
  62. package/dist/fileHistoryLegNotice.d.ts +2 -1
  63. package/dist/fileHistoryLegNotice.js +3 -3
  64. package/dist/frameBinding.d.ts +3 -0
  65. package/dist/frameBinding.js +12 -0
  66. package/dist/gateOutcome.js +16 -2
  67. package/dist/gateVocabulary.d.ts +8 -7
  68. package/dist/gateVocabulary.js +71 -73
  69. package/dist/generated/engineFactTables.d.ts +18 -1
  70. package/dist/generated/engineFactTables.js +56 -0
  71. package/dist/generated/engineNoticeTables.js +12 -3
  72. package/dist/generated/settingsSchemaFns.d.ts +18 -0
  73. package/dist/generated/settingsSchemaFns.js +70 -0
  74. package/dist/generated/settingsSchemaHooksClassifier.d.ts +2 -0
  75. package/dist/generated/settingsSchemaHooksClassifier.js +254 -0
  76. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
  77. package/dist/generated/settingsSchemaMcpRequestEntry.js +162 -0
  78. package/dist/generated/settingsSchemaTables.d.ts +2 -0
  79. package/dist/generated/settingsSchemaTables.js +9 -0
  80. package/dist/generated/settingsSchemaTypes.d.ts +133 -0
  81. package/dist/generated/settingsSchemaTypes.js +1 -0
  82. package/dist/hitl/allowRuleShadow.d.ts +2 -1
  83. package/dist/hitl/allowRuleShadow.js +18 -15
  84. package/dist/hitl/approvalCardReasons.d.ts +3 -2
  85. package/dist/hitl/approvalCardReasons.js +29 -30
  86. package/dist/hitl/approvalHolds.d.ts +17 -0
  87. package/dist/hitl/approvalHolds.js +114 -29
  88. package/dist/hitl/askClassPair.d.ts +2 -2
  89. package/dist/hitl/askClassPair.js +16 -0
  90. package/dist/hitl/askGateWire.js +2 -1
  91. package/dist/hitl/askSettlementLine.d.ts +14 -4
  92. package/dist/hitl/askSettlementLine.js +67 -47
  93. package/dist/hitl/attributionLadder.d.ts +23 -0
  94. package/dist/hitl/attributionLadder.js +67 -0
  95. package/dist/hitl/automaticAnswerVerdict.d.ts +2 -1
  96. package/dist/hitl/automaticAnswerVerdict.js +8 -8
  97. package/dist/hitl/crashConvergedNotice.d.ts +5 -4
  98. package/dist/hitl/crashConvergedNotice.js +28 -41
  99. package/dist/hitl/decisionLedger.d.ts +55 -0
  100. package/dist/hitl/decisionLedger.js +156 -0
  101. package/dist/hitl/decisionRefusal.d.ts +1 -0
  102. package/dist/hitl/decisionRefusal.js +1 -1
  103. package/dist/hitl/decisionSend.d.ts +113 -0
  104. package/dist/hitl/decisionSend.js +579 -0
  105. package/dist/hitl/frameRouter.js +7 -8
  106. package/dist/hitl/hitlBridge.d.ts +1 -0
  107. package/dist/hitl/hitlBridge.js +21 -9
  108. package/dist/hitl/persistedRulesWire.d.ts +6 -5
  109. package/dist/hitl/persistedRulesWire.js +55 -73
  110. package/dist/hitl/planReviewWire.d.ts +5 -0
  111. package/dist/hitl/planReviewWire.js +53 -76
  112. package/dist/hitl/sessionPolicyDeliverable.d.ts +2 -0
  113. package/dist/hitl/sessionPolicyDeliverable.js +49 -9
  114. package/dist/hitl/sessionPolicyWire.d.ts +2 -1
  115. package/dist/hitl/sessionPolicyWire.js +23 -24
  116. package/dist/hitl/suspendedReopen.d.ts +2 -1
  117. package/dist/hitl/suspendedReopen.js +7 -10
  118. package/dist/hitl/toolApprovalWire.d.ts +17 -5
  119. package/dist/hitl/toolApprovalWire.js +120 -147
  120. package/dist/hooksWireCaps.js +145 -56
  121. package/dist/host.d.ts +21 -0
  122. package/dist/hostTurnSettings.d.ts +110 -0
  123. package/dist/hostTurnSettings.js +692 -0
  124. package/dist/humanTurn.d.ts +15 -1
  125. package/dist/humanTurn.js +100 -12
  126. package/dist/humanTurnRead.d.ts +2 -0
  127. package/dist/humanTurnRead.js +22 -1
  128. package/dist/i18n/messages.en.d.ts +713 -0
  129. package/dist/i18n/messages.en.js +713 -0
  130. package/dist/i18n/messages.zh.js +854 -1
  131. package/dist/index.d.ts +45 -13
  132. package/dist/index.js +27 -9
  133. package/dist/inheritEnvCapability.d.ts +4 -2
  134. package/dist/inheritEnvCapability.js +12 -5
  135. package/dist/inheritEnvWire.d.ts +3 -2
  136. package/dist/inheritEnvWire.js +14 -16
  137. package/dist/injectionLaneNotice.d.ts +5 -0
  138. package/dist/injectionLaneNotice.js +46 -0
  139. package/dist/interactiveHalt.js +17 -6
  140. package/dist/liveModelCatalog.d.ts +2 -1
  141. package/dist/liveModelCatalog.js +14 -8
  142. package/dist/mcpPanel.d.ts +10 -1
  143. package/dist/mcpPanel.js +42 -13
  144. package/dist/mcpProbeCapability.d.ts +2 -1
  145. package/dist/mcpProbeCapability.js +7 -11
  146. package/dist/mcpProbeWire.d.ts +3 -1
  147. package/dist/mcpProbeWire.js +5 -0
  148. package/dist/mcpReconnect.js +2 -2
  149. package/dist/mcpToolToggles.d.ts +6 -0
  150. package/dist/mcpToolToggles.js +46 -0
  151. package/dist/mcpWireCaps.d.ts +43 -3
  152. package/dist/mcpWireCaps.js +194 -59
  153. package/dist/mcpWireTransport.d.ts +4 -0
  154. package/dist/mcpWireTransport.js +18 -0
  155. package/dist/memoryEntriesWire.js +5 -10
  156. package/dist/model/onboardJudgement.d.ts +93 -0
  157. package/dist/model/onboardJudgement.js +415 -0
  158. package/dist/model/tierVocabulary.d.ts +2 -0
  159. package/dist/model/tierVocabulary.js +17 -5
  160. package/dist/modelCapabilityProbe.d.ts +65 -0
  161. package/dist/modelCapabilityProbe.js +601 -0
  162. package/dist/modelIdentityResolvability.d.ts +5 -0
  163. package/dist/modelIdentityResolvability.js +49 -22
  164. package/dist/ownKey.d.ts +33 -0
  165. package/dist/ownKey.js +109 -0
  166. package/dist/panelReduce.d.ts +11 -1
  167. package/dist/panelReduce.js +95 -16
  168. package/dist/panelStateHolder.d.ts +1 -0
  169. package/dist/panelStateHolder.js +10 -1
  170. package/dist/permissionRuleIssue.d.ts +2 -1
  171. package/dist/permissionRuleIssue.js +23 -20
  172. package/dist/permissionRulesWriteCapability.d.ts +2 -1
  173. package/dist/permissionRulesWriteCapability.js +8 -6
  174. package/dist/pluginHooksWire.d.ts +46 -3
  175. package/dist/pluginHooksWire.js +220 -12
  176. package/dist/prepareRefusal.d.ts +8 -0
  177. package/dist/prepareRefusal.js +72 -0
  178. package/dist/printModelStatus.d.ts +63 -0
  179. package/dist/printModelStatus.js +155 -0
  180. package/dist/request/taskRequest.d.ts +16 -10
  181. package/dist/request/taskRequest.js +195 -58
  182. package/dist/resumeRefusalCopy.d.ts +14 -9
  183. package/dist/resumeRefusalCopy.js +89 -144
  184. package/dist/retryStatus.d.ts +55 -0
  185. package/dist/retryStatus.js +155 -19
  186. package/dist/ruleRefusalSentence.d.ts +4 -0
  187. package/dist/ruleRefusalSentence.js +58 -0
  188. package/dist/sandboxWire.d.ts +2 -1
  189. package/dist/sandboxWire.js +55 -21
  190. package/dist/scenarioRefusal.d.ts +10 -0
  191. package/dist/scenarioRefusal.js +111 -0
  192. package/dist/seam.d.ts +48 -9
  193. package/dist/seam.js +54 -5
  194. package/dist/seatContract.d.ts +272 -14
  195. package/dist/seatContract.js +711 -23
  196. package/dist/selfOrchestrationDenial.js +7 -19
  197. package/dist/sessionIdSegment.d.ts +6 -0
  198. package/dist/sessionIdSegment.js +24 -0
  199. package/dist/sessionMemoryStatus.js +6 -11
  200. package/dist/sessionPolicyCapability.d.ts +2 -1
  201. package/dist/sessionPolicyCapability.js +8 -6
  202. package/dist/settingsCredentialKeyPaths.d.ts +8 -0
  203. package/dist/settingsCredentialKeyPaths.js +219 -0
  204. package/dist/settingsHooksSalvage.d.ts +44 -0
  205. package/dist/settingsHooksSalvage.js +211 -0
  206. package/dist/skillToolListsCapability.d.ts +2 -1
  207. package/dist/skillToolListsCapability.js +8 -6
  208. package/dist/skillsWireCaps.d.ts +0 -3
  209. package/dist/skillsWireCaps.js +1 -2
  210. package/dist/sseIdleTriage.js +3 -2
  211. package/dist/subagent/engineSubagentResume.js +15 -9
  212. package/dist/subagentContentStore.d.ts +4 -0
  213. package/dist/subagentContentStore.js +157 -27
  214. package/dist/toolHistoryMismatch.js +3 -2
  215. package/dist/toolRoster.d.ts +3 -2
  216. package/dist/toolRoster.js +21 -20
  217. package/dist/toolsFlagNames.d.ts +8 -0
  218. package/dist/toolsFlagNames.js +110 -0
  219. package/dist/turnFailurePresentation.d.ts +12 -1
  220. package/dist/turnFailurePresentation.js +220 -15
  221. package/dist/usageAnalytics.js +6 -11
  222. package/dist/userAttachmentEnvelope.d.ts +1 -0
  223. package/dist/userAttachmentEnvelope.js +37 -7
  224. package/dist/userAttachmentSeat.d.ts +21 -0
  225. package/dist/userAttachmentSeat.js +75 -0
  226. package/dist/userInvokedSkillsCapability.d.ts +11 -1
  227. package/dist/userInvokedSkillsCapability.js +31 -7
  228. package/dist/wireErrorTriage.d.ts +7 -0
  229. package/dist/wireErrorTriage.js +23 -1
  230. package/dist/wireFailureShape.js +2 -1
  231. package/dist/wireRefusalCopy.d.ts +62 -16
  232. package/dist/wireRefusalCopy.js +307 -148
  233. package/dist/workflowsJournalCapability.d.ts +2 -1
  234. package/dist/workflowsJournalCapability.js +8 -6
  235. package/docs/INTEGRATION-CLIENTS.md +951 -42
  236. package/package.json +5 -5
@@ -1,5 +1,6 @@
1
1
  import { CORE_DENIED_BY_VALUES, CORE_PERSISTED_RULE_MANDATES } from './generated/engineFactTables.js';
2
2
  import { guardedRead, readOwnDataValue } from './ownKey.js';
3
+ import { msg, renderMessage } from './i18n/translate.js';
3
4
  export const CC_TOOL_DENIAL_KINDS = Object.freeze([
4
5
  'user-rejected',
5
6
  'permission-rule',
@@ -25,53 +26,53 @@ export function ccToolDenialKindForSettledBy(settledBy) {
25
26
  export const GATE_DENIED_BY_WORDS = Object.freeze([...CORE_DENIED_BY_VALUES]);
26
27
  const _deniedByWordsPin = true;
27
28
  void _deniedByWordsPin;
28
- const DENIED_BY_SENTENCES = Object.freeze({
29
- policy: "denied by this deployment's permission policy",
30
- hook: 'denied by a PreToolUse hook',
31
- org: 'denied by an organization rule',
32
- persisted_rule: 'denied by a persisted rule',
33
- classifier: 'denied by the auto-mode classifier',
34
- compliance: 'denied by a compliance lock',
35
- write_protection: 'denied because the write landed on a write-protected path',
36
- ask_resolution: 'denied when the approval was resolved',
37
- read_boundary: 'denied by the read boundary',
38
- mode: "denied by this session's permission mode",
29
+ const DENIED_BY_KEYS = Object.freeze({
30
+ policy: 'approval.deniedBy.policy',
31
+ hook: 'approval.deniedBy.hook',
32
+ org: 'approval.deniedBy.org',
33
+ persisted_rule: 'approval.deniedBy.persistedRule',
34
+ classifier: 'approval.deniedBy.classifier',
35
+ compliance: 'approval.deniedBy.compliance',
36
+ write_protection: 'approval.deniedBy.writeProtection',
37
+ ask_resolution: 'approval.deniedBy.askResolution',
38
+ read_boundary: 'approval.deniedBy.readBoundary',
39
+ mode: 'approval.deniedBy.mode',
39
40
  });
40
41
  export function isGateDeniedByWord(v) {
41
42
  return typeof v === 'string' && GATE_DENIED_BY_WORDS.includes(v);
42
43
  }
43
- export function gateDeniedByDetail(deniedBy) {
44
- if (typeof deniedBy === 'string' && Object.hasOwn(DENIED_BY_SENTENCES, deniedBy)) {
45
- return DENIED_BY_SENTENCES[deniedBy];
44
+ export function gateDeniedByDetail(deniedBy, lang) {
45
+ if (typeof deniedBy === 'string' && Object.hasOwn(DENIED_BY_KEYS, deniedBy)) {
46
+ return renderMessage(msg(DENIED_BY_KEYS[deniedBy]), lang);
46
47
  }
47
- const word = typeof deniedBy === 'string' && deniedBy.length > 0 ? deniedBy : '(none)';
48
- return `denied by a layer this build does not know (${word}) — this build does not know this layer name, so it cannot say which layer refused this call or why`;
48
+ const word = typeof deniedBy === 'string' && deniedBy.length > 0 ? deniedBy : msg('approval.card.noWord');
49
+ return renderMessage(msg('approval.deniedBy.unknown', { word }), lang);
49
50
  }
50
- const ASK_ORIGIN_SENTENCES = Object.freeze({
51
- content_question: 'the tool itself asked you a question',
52
- plan_review: 'the model paused its run for your verdict on the plan it proposed',
53
- ancestor_marked: 'an ancestor marked this call (an inherited approver-unavailable float, or a durable mandate; this client cannot tell which from the origin alone): it must reach the park with no synchronous decision-maker in between',
54
- org_unavailable: 'the organization policy was unavailable, so this call asks',
55
- org_rule: 'an organization rule asks about this call',
56
- rule_store_unavailable: 'this call could not be checked against your standing deny/ask rules, so it asks',
57
- hook: 'a PreToolUse hook asked about this call',
58
- ask_rule: 'a persisted ask rule matches this call',
59
- denial_limit_fallback: 'the auto-mode classifier hit its denial limit and handed this call back to you',
60
- shell_gate_tighten: 'the coarse shell check rates this command above the tier it lets through, so it asks',
61
- safety_tighten: 'the gate tightened on this call’s own facts (network egress, irreversibility, or a protected write; this client cannot tell which from the origin alone)',
62
- policy: 'this deployment’s permission policy, or the permission mode’s default, asks about this call',
51
+ const ASK_ORIGIN_KEYS = Object.freeze({
52
+ content_question: 'approval.origin.contentQuestion',
53
+ plan_review: 'approval.origin.planReview',
54
+ ancestor_marked: 'approval.origin.ancestorMarked',
55
+ org_unavailable: 'approval.origin.orgUnavailable',
56
+ org_rule: 'approval.origin.orgRule',
57
+ rule_store_unavailable: 'approval.origin.ruleStoreUnavailable',
58
+ hook: 'approval.origin.hook',
59
+ ask_rule: 'approval.origin.askRule',
60
+ denial_limit_fallback: 'approval.origin.denialLimitFallback',
61
+ shell_gate_tighten: 'approval.origin.shellGateTighten',
62
+ safety_tighten: 'approval.origin.safetyTighten',
63
+ policy: 'approval.origin.policy',
63
64
  });
64
- export function askOriginDetail(origin) {
65
- const known = typeof origin === 'string' && Object.hasOwn(ASK_ORIGIN_SENTENCES, origin)
66
- ? ASK_ORIGIN_SENTENCES[origin]
65
+ export function askOriginDetail(origin, lang) {
66
+ const known = typeof origin === 'string' && Object.hasOwn(ASK_ORIGIN_KEYS, origin)
67
+ ? ASK_ORIGIN_KEYS[origin]
67
68
  : undefined;
68
69
  if (known !== undefined)
69
- return known;
70
- const word = typeof origin === 'string' && origin.length > 0 ? origin : '(none)';
71
- return unknownAskOriginSentence(word);
70
+ return renderMessage(msg(known), lang);
71
+ const word = typeof origin === 'string' && origin.length > 0 ? origin : msg('approval.card.noWord');
72
+ return renderMessage(unknownAskOriginSentence(word), lang);
72
73
  }
73
74
  function unknownAskOriginSentence(word) {
74
- return `this call asks; its origin ${word === undefined ? '' : `${word} `}is a word newer than this client, so answer it as usual`;
75
+ return word === undefined ? msg('approval.origin.unknownNoWord') : msg('approval.origin.unknownWithWord', { word });
75
76
  }
76
77
  const ASK_ORIGIN_QUIET = Object.freeze({
77
78
  content_question: true,
@@ -87,51 +88,48 @@ const ASK_ORIGIN_QUIET = Object.freeze({
87
88
  safety_tighten: false,
88
89
  policy: true,
89
90
  });
90
- export function askOriginNoteOf(origin) {
91
+ export function askOriginNoteOf(origin, lang) {
91
92
  if (typeof origin !== 'string' || origin === '')
92
93
  return undefined;
93
94
  if (Object.hasOwn(ASK_ORIGIN_QUIET, origin)) {
94
- return ASK_ORIGIN_QUIET[origin] === true ? undefined : askOriginDetail(origin);
95
+ return ASK_ORIGIN_QUIET[origin] === true ? undefined : askOriginDetail(origin, lang);
95
96
  }
96
- return unknownAskOriginSentence(undefined);
97
+ return renderMessage(unknownAskOriginSentence(undefined), lang);
97
98
  }
98
- const NO_REMEMBER_HEAD = 'no "don\'t ask again" option here';
99
- const RULE_OFFERS_ABSENCE_LINES = Object.freeze({
99
+ const RULE_OFFERS_ABSENCE_KEYS = Object.freeze({
100
100
  mandated: { line: null },
101
- allow_outranked: {
102
- line: `${NO_REMEMBER_HEAD}: an allow rule already matches this call, but this question outranks it — another allow rule would be outranked the same way`,
103
- },
101
+ allow_outranked: { line: 'approval.ruleOffer.absence.allowOutranked' },
104
102
  ask_rule_matched: {
105
- line: `${NO_REMEMBER_HEAD}: an ask rule matches this call and keeps asking — an allow rule changes nothing while it stands; to stop being asked, review your ask rules`,
106
- deploymentList: `${NO_REMEMBER_HEAD}: this deployment asks about every call to this tool and your own rules cannot switch that off — the "in this session" option stops it asking again until the session ends`,
103
+ line: 'approval.ruleOffer.absence.askRuleMatched',
104
+ deploymentList: 'approval.ruleOffer.absence.askRuleMatchedDeploymentList',
107
105
  },
108
- lane_cannot_speak: { line: `${NO_REMEMBER_HEAD}: this approval lane cannot persist rules` },
106
+ lane_cannot_speak: { line: 'approval.ruleOffer.absence.laneCannotSpeak' },
109
107
  });
110
- export function ruleOffersAbsenceDetail(reason, opts) {
108
+ export function ruleOffersAbsenceDetail(reason, opts, lang) {
111
109
  if (typeof reason !== 'string' || reason === '')
112
110
  return undefined;
113
- if (Object.hasOwn(RULE_OFFERS_ABSENCE_LINES, reason)) {
114
- const entry = RULE_OFFERS_ABSENCE_LINES[reason];
111
+ if (Object.hasOwn(RULE_OFFERS_ABSENCE_KEYS, reason)) {
112
+ const entry = RULE_OFFERS_ABSENCE_KEYS[reason];
115
113
  if (entry.line === null)
116
114
  return undefined;
117
115
  const onList = guardedRead(() => readOwnDataValue(opts, 'deploymentListSessionRow')) === true;
118
- return onList && entry.deploymentList !== undefined ? entry.deploymentList : entry.line;
116
+ return renderMessage(msg(onList && entry.deploymentList !== undefined ? entry.deploymentList : entry.line), lang);
119
117
  }
120
- return `${NO_REMEMBER_HEAD} (the reason is one this build does not know yet)`;
118
+ return renderMessage(msg('approval.ruleOffer.absence.unknown'), lang);
121
119
  }
122
- const RULE_OFFER_UNCOVERED_LINES = Object.freeze({
123
- redirection: 'always asks (shell redirection)',
124
- no_rule_form: 'no coverable rule form',
125
- cap_overflow: 'trimmed by the offer cap',
120
+ const RULE_OFFER_UNCOVERED_KEYS = Object.freeze({
121
+ redirection: 'approval.ruleOffer.uncovered.redirection',
122
+ no_rule_form: 'approval.ruleOffer.uncovered.noRuleForm',
123
+ cap_overflow: 'approval.ruleOffer.uncovered.capOverflow',
126
124
  });
127
- export function ruleOfferUncoveredDetail(reason) {
128
- if (typeof reason === 'string' && Object.hasOwn(RULE_OFFER_UNCOVERED_LINES, reason)) {
129
- return RULE_OFFER_UNCOVERED_LINES[reason];
125
+ export function ruleOfferUncoveredDetail(reason, lang) {
126
+ if (typeof reason === 'string' && Object.hasOwn(RULE_OFFER_UNCOVERED_KEYS, reason)) {
127
+ return renderMessage(msg(RULE_OFFER_UNCOVERED_KEYS[reason]), lang);
130
128
  }
131
- return 'a reason this build does not know yet';
129
+ return renderMessage(msg('approval.ruleOffer.uncovered.unknown'), lang);
132
130
  }
133
- export function mandatedApprovalDetail() {
134
- return 'no saved allow rule and no remembered answer can retire this question; each call is settled on its own — by you here or by an automatic check the deployment runs — and an answer covers only that call';
131
+ export function mandatedApprovalDetail(lang) {
132
+ return renderMessage(msg('approval.mandate.generic'), lang);
135
133
  }
136
134
  export const APPROVAL_MANDATE_WORDS = Object.freeze([...CORE_PERSISTED_RULE_MANDATES]);
137
135
  const _mandateWordsPin = true;
@@ -139,18 +137,18 @@ void _mandateWordsPin;
139
137
  export function isApprovalMandateWord(v) {
140
138
  return APPROVAL_MANDATE_SET.has(v);
141
139
  }
142
- const APPROVAL_MANDATE_SENTENCES = Object.freeze({
143
- operator_always: 'this deployment requires a separate confirmation for each shell command, and this call is one of them',
144
- tool_marks: 'this tool declares that it reaches outside this machine or makes changes that cannot be undone',
145
- probe_mandate: 'the check run on this call marked it as needing its own confirmation (the built-in shell check does so for a read outside the directories allowed for this session)',
146
- probe_unanswered: 'the check run on this call did not answer (it timed out or failed; this client cannot tell which), so whether the call stays inside the directories allowed for this session is unknown',
147
- write_protection: "this change lands on a protected location (the agent's own configuration), which is confirmed one change at a time",
148
- target_unresolved: 'where this change lands on disk could not be determined (a link on the way could not be examined, or the target could not be resolved), so whether it lands on a guarded location is unknown',
140
+ const APPROVAL_MANDATE_KEYS = Object.freeze({
141
+ operator_always: 'approval.mandate.word.operatorAlways',
142
+ tool_marks: 'approval.mandate.word.toolMarks',
143
+ probe_mandate: 'approval.mandate.word.probeMandate',
144
+ probe_unanswered: 'approval.mandate.word.probeUnanswered',
145
+ write_protection: 'approval.mandate.word.writeProtection',
146
+ target_unresolved: 'approval.mandate.word.targetUnresolved',
149
147
  });
150
148
  const APPROVAL_MANDATE_SET = new Set(APPROVAL_MANDATE_WORDS);
151
- export function approvalMandateDetail(word) {
152
- if (typeof word === 'string' && Object.hasOwn(APPROVAL_MANDATE_SENTENCES, word)) {
153
- return APPROVAL_MANDATE_SENTENCES[word];
149
+ export function approvalMandateDetail(word, lang) {
150
+ if (typeof word === 'string' && Object.hasOwn(APPROVAL_MANDATE_KEYS, word)) {
151
+ return renderMessage(msg(APPROVAL_MANDATE_KEYS[word]), lang);
154
152
  }
155
- return 'the reason reported for this confirmation is not one this client recognises, so it shows no reason';
153
+ return renderMessage(msg('approval.mandate.unknownWord'), lang);
156
154
  }
@@ -14,6 +14,7 @@ export declare const CORE_ASK_EVIDENCE_ABSENCE_VALUES: readonly ["not_wired", "n
14
14
  export declare const CORE_SYSTEM_INJECTION_PRIORITIES: readonly ["now", "next", "later"];
15
15
  export declare const CORE_READ_DENY_BUILTIN_TIERS: readonly ["credentials", "shell-history", "browser", "wallet", "agent-config"];
16
16
  export declare const CORE_READ_DENY_DEFAULT_TIERS: readonly ["credentials", "agent-config"];
17
+ export declare const CORE_ASK_CLASSES: readonly ["content_question", "hook", "ancestor", "dangerous_delete", "unverifiable_delete", "unverifiable_shell_text", "transcript_write", "org_rule", "rule_unreadable", "ask_rule", "denial_limit_fallback", "classifier_no_ruling", "requires_user_interaction", "operator_forced", "shell_floor", "target_unresolved", "probe", "write_protection", "tool_marks_mcp", "tool_marks_a2a", "policy_rra", "artifact_shared_read", "mode", "unstated", "ordinary"];
17
18
  export interface CoreModeArbitrationRow {
18
19
  readonly bypassImmune: boolean;
19
20
  readonly classifierEligible: boolean;
@@ -43,5 +44,21 @@ export declare const CORE_PERMISSION_MODES: readonly ["default", "acceptEdits",
43
44
  export declare const CORE_APPROVAL_REACH: readonly ["none"];
44
45
  export declare const CORE_PERSISTED_RULE_MANDATES: readonly ["operator_always", "tool_marks", "probe_mandate", "probe_unanswered", "write_protection", "target_unresolved"];
45
46
  export declare const CORE_TASK_NOTIFICATION_TERMINAL_STATUSES: readonly ["completed", "failed", "killed", "cancelled"];
46
- export declare const CORE_RESUME_STARTUP_CAUSES: readonly ["environment", "session_gone", "tool_unavailable", "configuration", "decision_rejected"];
47
+ export declare const CORE_RESUME_STARTUP_CAUSES: readonly ["environment", "session_gone", "transcript_corrupt", "tool_unavailable", "configuration", "decision_rejected"];
47
48
  export declare const CORE_BUILTIN_SUBAGENT_TYPES: readonly ["Explore", "Plan", "fork", "general-purpose"];
49
+ export declare const CORE_USER_ATTACHMENT_KINDS: readonly ["text", "notebook", "image", "pdf", "directory", "client_text", "client_image"];
50
+ export declare const CORE_USER_ATTACHMENT_SUPPLIES: readonly ["path", "content_text", "content_image"];
51
+ export declare const CORE_USER_ATTACHMENT_OUTCOMES: readonly ["attached", "partial", "unchanged", "not_attached"];
52
+ export interface CoreUserAttachmentSeatLimits {
53
+ readonly maxEntries: number;
54
+ readonly maxRenderedTextChars: number;
55
+ }
56
+ export interface CoreUserAttachmentSeat {
57
+ readonly entries: readonly string[];
58
+ readonly kinds: readonly (typeof CORE_USER_ATTACHMENT_KINDS)[number][];
59
+ readonly supplies: readonly (typeof CORE_USER_ATTACHMENT_SUPPLIES)[number][];
60
+ readonly limits: CoreUserAttachmentSeatLimits;
61
+ }
62
+ export declare const CORE_USER_ATTACHMENT_SEAT: CoreUserAttachmentSeat;
63
+ export declare const CORE_USER_ATTACHMENTS_MAX: number;
64
+ export declare const CORE_USER_ATTACHMENT_LABEL_MAX: number;
@@ -140,6 +140,33 @@ export const CORE_READ_DENY_DEFAULT_TIERS = Object.freeze([
140
140
  "credentials",
141
141
  "agent-config",
142
142
  ]);
143
+ export const CORE_ASK_CLASSES = Object.freeze([
144
+ "content_question",
145
+ "hook",
146
+ "ancestor",
147
+ "dangerous_delete",
148
+ "unverifiable_delete",
149
+ "unverifiable_shell_text",
150
+ "transcript_write",
151
+ "org_rule",
152
+ "rule_unreadable",
153
+ "ask_rule",
154
+ "denial_limit_fallback",
155
+ "classifier_no_ruling",
156
+ "requires_user_interaction",
157
+ "operator_forced",
158
+ "shell_floor",
159
+ "target_unresolved",
160
+ "probe",
161
+ "write_protection",
162
+ "tool_marks_mcp",
163
+ "tool_marks_a2a",
164
+ "policy_rra",
165
+ "artifact_shared_read",
166
+ "mode",
167
+ "unstated",
168
+ "ordinary",
169
+ ]);
143
170
  export const CORE_MODE_ARBITRATION = Object.freeze({
144
171
  "content_question": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: true }),
145
172
  "hook": Object.freeze({ bypassImmune: true, classifierEligible: false, sandboxAdmission: false, ruleMayClear: false, hookAskFloor: false }),
@@ -289,6 +316,7 @@ export const CORE_TASK_NOTIFICATION_TERMINAL_STATUSES = Object.freeze([
289
316
  export const CORE_RESUME_STARTUP_CAUSES = Object.freeze([
290
317
  "environment",
291
318
  "session_gone",
319
+ "transcript_corrupt",
292
320
  "tool_unavailable",
293
321
  "configuration",
294
322
  "decision_rejected",
@@ -299,3 +327,31 @@ export const CORE_BUILTIN_SUBAGENT_TYPES = Object.freeze([
299
327
  "fork",
300
328
  "general-purpose",
301
329
  ]);
330
+ export const CORE_USER_ATTACHMENT_KINDS = Object.freeze([
331
+ "text",
332
+ "notebook",
333
+ "image",
334
+ "pdf",
335
+ "directory",
336
+ "client_text",
337
+ "client_image",
338
+ ]);
339
+ export const CORE_USER_ATTACHMENT_SUPPLIES = Object.freeze([
340
+ "path",
341
+ "content_text",
342
+ "content_image",
343
+ ]);
344
+ export const CORE_USER_ATTACHMENT_OUTCOMES = Object.freeze([
345
+ "attached",
346
+ "partial",
347
+ "unchanged",
348
+ "not_attached",
349
+ ]);
350
+ export const CORE_USER_ATTACHMENT_SEAT = Object.freeze({
351
+ entries: Object.freeze(["objective"]),
352
+ kinds: CORE_USER_ATTACHMENT_KINDS,
353
+ supplies: CORE_USER_ATTACHMENT_SUPPLIES,
354
+ limits: Object.freeze({ maxEntries: 20, maxRenderedTextChars: 100000 }),
355
+ });
356
+ export const CORE_USER_ATTACHMENTS_MAX = 20;
357
+ export const CORE_USER_ATTACHMENT_LABEL_MAX = 4096;
@@ -25,12 +25,15 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
25
25
  "config.peer_admission_out_of_range",
26
26
  "config.peer_lane_unmounted",
27
27
  "config.secret_env_scrubbed",
28
+ "config.credential_not_withheld",
28
29
  "config.permission_mode_unavailable",
29
30
  "permission.ask_released_by_mode",
30
31
  "permission.read_deny_unapplied",
31
32
  "permission.rule_store_unavailable",
32
33
  "permission.rule_row_dropped",
34
+ "config.session_rules_earlier_grammar",
33
35
  "permission.allowed_tool_not_granted",
36
+ "mods.registration_refused",
34
37
  "peer.inbound_disposition",
35
38
  "peer.held_settled",
36
39
  "peer.idle_subscription",
@@ -64,7 +67,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
64
67
  "memory.project_scope_absent",
65
68
  "route.fallback_to_primary",
66
69
  "route.classifier_unroutable",
67
- "route.base_url_changed_key_unchanged",
70
+ "route.credential_origin_mismatch",
68
71
  "route.response_model_mismatch",
69
72
  "route.tool_call_id_folded",
70
73
  "route.finish_reason_unknown",
@@ -120,12 +123,15 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
120
123
  "config.peer_admission_out_of_range": "operator",
121
124
  "config.peer_lane_unmounted": "operator",
122
125
  "config.secret_env_scrubbed": "operator",
126
+ "config.credential_not_withheld": "operator",
123
127
  "config.permission_mode_unavailable": "user",
124
128
  "permission.ask_released_by_mode": "user",
125
129
  "permission.read_deny_unapplied": "user",
126
130
  "permission.rule_store_unavailable": "user",
127
131
  "permission.rule_row_dropped": "user",
132
+ "config.session_rules_earlier_grammar": "user",
128
133
  "permission.allowed_tool_not_granted": "user",
134
+ "mods.registration_refused": "user",
129
135
  "peer.inbound_disposition": "user",
130
136
  "peer.held_settled": "user",
131
137
  "peer.idle_subscription": "user",
@@ -159,7 +165,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
159
165
  "memory.project_scope_absent": "operator",
160
166
  "route.fallback_to_primary": "operator",
161
167
  "route.classifier_unroutable": "operator",
162
- "route.base_url_changed_key_unchanged": "operator",
168
+ "route.credential_origin_mismatch": "user",
163
169
  "route.response_model_mismatch": "operator",
164
170
  "route.tool_call_id_folded": "operator",
165
171
  "route.finish_reason_unknown": "user",
@@ -221,12 +227,15 @@ export const CORE_NOTICE_MINTER = Object.freeze({
221
227
  "config.peer_admission_out_of_range": "engine",
222
228
  "config.peer_lane_unmounted": "engine",
223
229
  "config.secret_env_scrubbed": "engine",
230
+ "config.credential_not_withheld": "engine",
224
231
  "config.permission_mode_unavailable": "engine",
225
232
  "permission.ask_released_by_mode": "engine",
226
233
  "permission.read_deny_unapplied": "engine",
227
234
  "permission.rule_store_unavailable": "engine",
228
235
  "permission.rule_row_dropped": "engine",
236
+ "config.session_rules_earlier_grammar": "engine",
229
237
  "permission.allowed_tool_not_granted": "engine",
238
+ "mods.registration_refused": "engine",
230
239
  "peer.inbound_disposition": "engine",
231
240
  "peer.held_settled": "engine",
232
241
  "peer.idle_subscription": "engine",
@@ -260,7 +269,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
260
269
  "memory.project_scope_absent": "engine",
261
270
  "route.fallback_to_primary": "engine",
262
271
  "route.classifier_unroutable": "engine",
263
- "route.base_url_changed_key_unchanged": "engine",
272
+ "route.credential_origin_mismatch": "engine",
264
273
  "route.response_model_mismatch": "engine",
265
274
  "route.tool_call_id_folded": "engine",
266
275
  "route.finish_reason_unknown": "engine",
@@ -1,3 +1,5 @@
1
+ import type { HooksClassification } from './settingsSchemaTypes.js';
2
+ import type { McpContentOrigin, RequestMcpTransportRead } from './settingsSchemaTypes.js';
1
3
  export declare const SETTINGS_AT_MENTION_MODES: readonly ["all", "none", "only"];
2
4
  export type SettingsAtMention = {
3
5
  readonly mode: Exclude<(typeof SETTINGS_AT_MENTION_MODES)[number], 'only'>;
@@ -11,3 +13,19 @@ export declare const SETTINGS_IS_HIERARCHICAL_URL: (raw: string) => boolean;
11
13
  export declare const SETTINGS_NARROW_AT_MENTION: (atMention: SettingsAtMention, available: ReadonlySet<string>) => SettingsAtMention;
12
14
  export declare const SETTINGS_HOOK_MATCHER_SELECTS: (matcher: string | undefined, name: string) => boolean | 'invalid';
13
15
  export declare const SETTINGS_HOOK_MATCHER_FORM: (matcher: string | undefined) => SettingsHookMatcherForm;
16
+ export declare const SETTINGS_STARTS_WITH_HTTP_SCHEME: (raw: string) => boolean;
17
+ export declare const SETTINGS_HOOK_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "PostToolBatch", "Notification", "UserPromptSubmit", "UserPromptExpansion", "SessionStart", "SessionEnd", "Stop", "StopFailure", "SubagentStart", "SubagentStop", "PreCompact", "PostCompact", "PermissionRequest", "PermissionDenied", "Setup", "TeammateIdle", "TaskCreated", "TaskCompleted", "Elicitation", "ElicitationResult", "ConfigChange", "WorktreeCreate", "WorktreeRemove", "InstructionsLoaded", "CwdChanged", "FileChanged", "MessageDisplay", "DirectoryAdded", "PreModelSwitch", "PostModelSwitch"];
18
+ export declare const SETTINGS_HOOKS_CLASSIFICATION_OUTCOMES: readonly ["loaded", "loaded-partial", "rejected"];
19
+ export declare const SETTINGS_HOOKS_DROPPED_PIECE_CODES: readonly ["hooks-not-object", "unknown-event", "event-not-array", "matcher-invalid", "entry-invalid"];
20
+ export declare const SETTINGS_HOOKS_REJECTION_CODES: readonly ["guard-outside-hooks", "hooks-is-matcher", "guard-under-unknown-event", "guard-event-not-array", "guard-matcher-invalid", "guard-entry-invalid"];
21
+ export declare const SETTINGS_CLASSIFY_HOOKS_CONFIG: (settingsDoc: unknown) => HooksClassification;
22
+ export declare const SETTINGS_READ_REQUEST_MCP_TRANSPORT: (t: unknown) => RequestMcpTransportRead;
23
+ export declare const SETTINGS_READ_MCP_IDENTITY_HEADERS: (transport: Record<string, unknown>) => {
24
+ principalHeader?: string;
25
+ assertionHeader?: string;
26
+ };
27
+ export declare const SETTINGS_IS_USABLE_WIRE_NAME: (v: unknown) => v is string;
28
+ export declare const SETTINGS_DESCRIBE_BAD_WIRE_NAME: (v: unknown) => string;
29
+ export declare const SETTINGS_IS_CONTENT_ORIGIN_WORD: (v: unknown) => v is McpContentOrigin;
30
+ export declare const SETTINGS_DESCRIBE_BAD_CONTENT_ORIGIN: (v: unknown) => string;
31
+ export declare const SETTINGS_TOOL_WIRE_NAME_MAX_CHARS: 128;
@@ -1,3 +1,6 @@
1
+ import { SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE } from './settingsSchemaHooksClassifier.js';
2
+ import { SETTINGS_MCP_REQUEST_ENTRY_CLOSURE } from './settingsSchemaMcpRequestEntry.js';
3
+ import { SETTINGS_MCP_CONTENT_ORIGINS } from './settingsSchemaTables.js';
1
4
  export const SETTINGS_AT_MENTION_MODES = Object.freeze([
2
5
  "all",
3
6
  "none",
@@ -73,3 +76,70 @@ export const SETTINGS_HOOK_MATCHER_FORM = function hookMatcherForm(matcher) {
73
76
  }
74
77
  }
75
78
  };
79
+ export const SETTINGS_STARTS_WITH_HTTP_SCHEME = function startsWithHttpScheme(raw) {
80
+ return /^https?:\/\//i.test(raw);
81
+ };
82
+ export const SETTINGS_HOOK_EVENTS = Object.freeze([
83
+ "PreToolUse",
84
+ "PostToolUse",
85
+ "PostToolUseFailure",
86
+ "PostToolBatch",
87
+ "Notification",
88
+ "UserPromptSubmit",
89
+ "UserPromptExpansion",
90
+ "SessionStart",
91
+ "SessionEnd",
92
+ "Stop",
93
+ "StopFailure",
94
+ "SubagentStart",
95
+ "SubagentStop",
96
+ "PreCompact",
97
+ "PostCompact",
98
+ "PermissionRequest",
99
+ "PermissionDenied",
100
+ "Setup",
101
+ "TeammateIdle",
102
+ "TaskCreated",
103
+ "TaskCompleted",
104
+ "Elicitation",
105
+ "ElicitationResult",
106
+ "ConfigChange",
107
+ "WorktreeCreate",
108
+ "WorktreeRemove",
109
+ "InstructionsLoaded",
110
+ "CwdChanged",
111
+ "FileChanged",
112
+ "MessageDisplay",
113
+ "DirectoryAdded",
114
+ "PreModelSwitch",
115
+ "PostModelSwitch",
116
+ ]);
117
+ export const SETTINGS_HOOKS_CLASSIFICATION_OUTCOMES = Object.freeze([
118
+ "loaded",
119
+ "loaded-partial",
120
+ "rejected",
121
+ ]);
122
+ export const SETTINGS_HOOKS_DROPPED_PIECE_CODES = Object.freeze([
123
+ "hooks-not-object",
124
+ "unknown-event",
125
+ "event-not-array",
126
+ "matcher-invalid",
127
+ "entry-invalid",
128
+ ]);
129
+ export const SETTINGS_HOOKS_REJECTION_CODES = Object.freeze([
130
+ "guard-outside-hooks",
131
+ "hooks-is-matcher",
132
+ "guard-under-unknown-event",
133
+ "guard-event-not-array",
134
+ "guard-matcher-invalid",
135
+ "guard-entry-invalid",
136
+ ]);
137
+ export const SETTINGS_CLASSIFY_HOOKS_CONFIG = SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE(SETTINGS_HOOK_EVENTS);
138
+ const SETTINGS_MCP_REQUEST_ENTRY = SETTINGS_MCP_REQUEST_ENTRY_CLOSURE(SETTINGS_MCP_CONTENT_ORIGINS, SETTINGS_STARTS_WITH_HTTP_SCHEME);
139
+ export const SETTINGS_READ_REQUEST_MCP_TRANSPORT = SETTINGS_MCP_REQUEST_ENTRY.readRequestMcpTransport;
140
+ export const SETTINGS_READ_MCP_IDENTITY_HEADERS = SETTINGS_MCP_REQUEST_ENTRY.readMcpIdentityHeaders;
141
+ export const SETTINGS_IS_USABLE_WIRE_NAME = SETTINGS_MCP_REQUEST_ENTRY.isUsableWireName;
142
+ export const SETTINGS_DESCRIBE_BAD_WIRE_NAME = SETTINGS_MCP_REQUEST_ENTRY.describeBadWireName;
143
+ export const SETTINGS_IS_CONTENT_ORIGIN_WORD = SETTINGS_MCP_REQUEST_ENTRY.isContentOriginWord;
144
+ export const SETTINGS_DESCRIBE_BAD_CONTENT_ORIGIN = SETTINGS_MCP_REQUEST_ENTRY.describeBadContentOrigin;
145
+ export const SETTINGS_TOOL_WIRE_NAME_MAX_CHARS = SETTINGS_MCP_REQUEST_ENTRY.TOOL_WIRE_NAME_MAX_CHARS;
@@ -0,0 +1,2 @@
1
+ import type { HooksClassification } from './settingsSchemaTypes.js';
2
+ export declare const SETTINGS_CLASSIFY_HOOKS_CONFIG_CLOSURE: (HOOK_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "PostToolBatch", "Notification", "UserPromptSubmit", "UserPromptExpansion", "SessionStart", "SessionEnd", "Stop", "StopFailure", "SubagentStart", "SubagentStop", "PreCompact", "PostCompact", "PermissionRequest", "PermissionDenied", "Setup", "TeammateIdle", "TaskCreated", "TaskCompleted", "Elicitation", "ElicitationResult", "ConfigChange", "WorktreeCreate", "WorktreeRemove", "InstructionsLoaded", "CwdChanged", "FileChanged", "MessageDisplay", "DirectoryAdded", "PreModelSwitch", "PostModelSwitch"]) => (settingsDoc: unknown) => HooksClassification;