@sema-agent/client-core 0.109.0 → 0.111.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 +342 -0
  2. package/README.md +88 -32
  3. package/dist/abortableSleep.d.ts +7 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +45 -11
  6. package/dist/adapt/toolCards.d.ts +3 -1
  7. package/dist/adapt/toolCards.js +4 -2
  8. package/dist/adapter/activeRunSelfHeal.d.ts +39 -0
  9. package/dist/adapter/activeRunSelfHeal.js +171 -3
  10. package/dist/adapter/downstream/eventToSdkMessage.js +20 -15
  11. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -0
  12. package/dist/adapter/downstream/terminalToSdkResult.js +11 -0
  13. package/dist/adapter/runStream.d.ts +5 -0
  14. package/dist/adapter/runStream.js +15 -3
  15. package/dist/attachmentRoute.d.ts +20 -0
  16. package/dist/attachmentRoute.js +39 -0
  17. package/dist/attachmentsWireCaps.js +1 -1
  18. package/dist/builtinOutputStyles.d.ts +12 -0
  19. package/dist/builtinOutputStyles.js +147 -0
  20. package/dist/compactionStatus.d.ts +9 -0
  21. package/dist/compactionStatus.js +29 -5
  22. package/dist/controlRouter.js +2 -1
  23. package/dist/coreValuePorts.d.ts +39 -1
  24. package/dist/coreValuePorts.js +10 -0
  25. package/dist/declared/supportFloorDeclared.js +1 -1
  26. package/dist/displayUntrusted.d.ts +1 -0
  27. package/dist/displayUntrusted.js +138 -14
  28. package/dist/engineErrorCodes.d.ts +3 -0
  29. package/dist/engineErrorCodes.js +3 -0
  30. package/dist/engineHealthFacts.d.ts +20 -0
  31. package/dist/engineHealthFacts.js +42 -1
  32. package/dist/engineHealthProbeVerdict.d.ts +23 -0
  33. package/dist/engineHealthProbeVerdict.js +115 -0
  34. package/dist/engineInlineTaskStats.d.ts +4 -3
  35. package/dist/engineInlineTaskStats.js +18 -2
  36. package/dist/engineNoticeCodes.d.ts +10 -0
  37. package/dist/engineNoticeCodes.js +36 -6
  38. package/dist/engineRepoint.d.ts +147 -0
  39. package/dist/engineRepoint.js +310 -0
  40. package/dist/engineRowRef.d.ts +3 -0
  41. package/dist/engineRowRef.js +13 -1
  42. package/dist/engineSessionMessages.d.ts +2 -1
  43. package/dist/engineSessionMessages.js +5 -0
  44. package/dist/engineSwapCrossing.d.ts +57 -0
  45. package/dist/engineSwapCrossing.js +297 -0
  46. package/dist/engineUnavailable.d.ts +44 -0
  47. package/dist/engineUnavailable.js +492 -0
  48. package/dist/errorSupplementRoles.js +2 -1
  49. package/dist/eventLeg.js +3 -3
  50. package/dist/fleet/fleetProjection.js +3 -2
  51. package/dist/generated/engineFactTables.d.ts +2 -0
  52. package/dist/generated/engineFactTables.js +12 -0
  53. package/dist/generated/sdkFactTables.d.ts +2 -1
  54. package/dist/generated/sdkFactTables.js +5 -0
  55. package/dist/generated/settingsSchemaTables.d.ts +4 -0
  56. package/dist/generated/settingsSchemaTables.js +1 -0
  57. package/dist/hitl/approvalAskers.d.ts +6 -0
  58. package/dist/hitl/approvalAskers.js +30 -0
  59. package/dist/hitl/approvalCardReasons.js +6 -3
  60. package/dist/hitl/approvalDelivery.d.ts +1 -0
  61. package/dist/hitl/approvalDelivery.js +1 -1
  62. package/dist/hitl/approvalRequestFrameReading.d.ts +7 -0
  63. package/dist/hitl/approvalRequestFrameReading.js +11 -0
  64. package/dist/hitl/approvalResolution.d.ts +9 -2
  65. package/dist/hitl/approvalResolution.js +6 -1
  66. package/dist/hitl/askGateWire.js +5 -8
  67. package/dist/hitl/automaticAnswerVerdict.js +2 -2
  68. package/dist/hitl/decisionConflict.js +6 -3
  69. package/dist/hitl/decisionRefusal.d.ts +2 -0
  70. package/dist/hitl/decisionRefusal.js +8 -8
  71. package/dist/hitl/decisionRefusalCarrier.d.ts +3 -0
  72. package/dist/hitl/decisionRefusalCarrier.js +348 -0
  73. package/dist/hitl/decisionSend.d.ts +10 -0
  74. package/dist/hitl/decisionSend.js +57 -17
  75. package/dist/hitl/editedApprovalAcceptance.d.ts +25 -0
  76. package/dist/hitl/editedApprovalAcceptance.js +26 -0
  77. package/dist/hitl/elicitationRefusal.d.ts +4 -0
  78. package/dist/hitl/elicitationRefusal.js +23 -0
  79. package/dist/hitl/frameRouter.d.ts +2 -2
  80. package/dist/hitl/frameRouter.js +12 -33
  81. package/dist/hitl/gateIdentity.d.ts +5 -0
  82. package/dist/hitl/gateIdentity.js +23 -0
  83. package/dist/hitl/gateLedger.d.ts +0 -4
  84. package/dist/hitl/gateLedger.js +0 -19
  85. package/dist/hitl/hitlBridge.d.ts +7 -0
  86. package/dist/hitl/hitlBridge.js +14 -8
  87. package/dist/hitl/hitlHostSurface.d.ts +3 -1
  88. package/dist/hitl/hitlHostSurface.js +14 -4
  89. package/dist/hitl/hostWithdrawal.d.ts +15 -0
  90. package/dist/hitl/hostWithdrawal.js +38 -0
  91. package/dist/hitl/localAllowRedemption.d.ts +67 -0
  92. package/dist/hitl/localAllowRedemption.js +256 -0
  93. package/dist/hitl/parkResolver.js +32 -13
  94. package/dist/hitl/persistedRulesWire.d.ts +16 -0
  95. package/dist/hitl/persistedRulesWire.js +72 -2
  96. package/dist/hitl/planReviewWire.d.ts +3 -0
  97. package/dist/hitl/planReviewWire.js +37 -10
  98. package/dist/hitl/policyDenyCause.d.ts +1 -1
  99. package/dist/hitl/policyDenyCause.js +1 -1
  100. package/dist/hitl/resumeRunningCard.d.ts +1 -0
  101. package/dist/hitl/resumeRunningCard.js +1 -0
  102. package/dist/hitl/screenCardCarriers.d.ts +15 -0
  103. package/dist/hitl/screenCardCarriers.js +41 -0
  104. package/dist/hitl/screenDecisionCards.d.ts +98 -0
  105. package/dist/hitl/screenDecisionCards.js +362 -0
  106. package/dist/hitl/sessionPolicyWire.js +6 -4
  107. package/dist/hitl/standingRows.d.ts +4 -1
  108. package/dist/hitl/standingRows.js +33 -1
  109. package/dist/hitl/toolApprovalWire.d.ts +64 -15
  110. package/dist/hitl/toolApprovalWire.js +470 -125
  111. package/dist/hooksWireCaps.js +31 -1
  112. package/dist/hostSettingNoticeArm.d.ts +3 -0
  113. package/dist/hostSettingNoticeArm.js +12 -0
  114. package/dist/hostTurnSettings.d.ts +13 -4
  115. package/dist/hostTurnSettings.js +150 -10
  116. package/dist/humanTurnRead.js +11 -1
  117. package/dist/i18n/messages.en.d.ts +212 -0
  118. package/dist/i18n/messages.en.js +217 -5
  119. package/dist/i18n/messages.zh.js +235 -5
  120. package/dist/i18n/translate.d.ts +3 -0
  121. package/dist/i18n/translate.js +78 -10
  122. package/dist/i18n/zh.d.ts +1 -0
  123. package/dist/i18n/zh.js +1 -0
  124. package/dist/index.d.ts +56 -16
  125. package/dist/index.js +40 -12
  126. package/dist/inheritEnvCapability.js +2 -0
  127. package/dist/inputAuthor.d.ts +16 -0
  128. package/dist/inputAuthor.js +44 -0
  129. package/dist/interactiveHalt.js +2 -1
  130. package/dist/interactiveInterrupt.js +20 -2
  131. package/dist/interruptRefusalNote.d.ts +2 -0
  132. package/dist/interruptRefusalNote.js +17 -0
  133. package/dist/liveModelCatalog.d.ts +2 -0
  134. package/dist/liveModelCatalog.js +23 -9
  135. package/dist/liveQuestionStore.d.ts +4 -1
  136. package/dist/liveQuestionStore.js +12 -3
  137. package/dist/localEngineSeatReading.d.ts +2 -2
  138. package/dist/localEngineSeatReading.js +5 -3
  139. package/dist/localEngineSpawn.d.ts +0 -7
  140. package/dist/localEngineSpawn.js +0 -92
  141. package/dist/localEngineStep.d.ts +2 -2
  142. package/dist/localEngineStep.js +2 -0
  143. package/dist/mcpEngineLeg.d.ts +3 -0
  144. package/dist/mcpEngineLeg.js +38 -1
  145. package/dist/mcpPanel.js +2 -0
  146. package/dist/mcpReconnect.d.ts +9 -1
  147. package/dist/mcpReconnect.js +124 -19
  148. package/dist/mcpWireCaps.js +1 -1
  149. package/dist/model/engineModelWords.d.ts +3 -0
  150. package/dist/model/engineModelWords.js +13 -0
  151. package/dist/model/subagentModelWord.d.ts +21 -2
  152. package/dist/model/subagentModelWord.js +100 -29
  153. package/dist/modelCapabilityProbe.js +7 -43
  154. package/dist/modsFace.d.ts +8 -1
  155. package/dist/modsFace.js +27 -0
  156. package/dist/notifications.d.ts +36 -6
  157. package/dist/notifications.js +170 -20
  158. package/dist/ownKey.d.ts +6 -5
  159. package/dist/ownKey.js +31 -7
  160. package/dist/peerFrames.d.ts +40 -2
  161. package/dist/peerFrames.js +158 -3
  162. package/dist/pendingUserRow.d.ts +4 -0
  163. package/dist/pendingUserRow.js +16 -0
  164. package/dist/permissionsDeclaration.d.ts +1 -0
  165. package/dist/permissionsDeclaration.js +11 -1
  166. package/dist/planReviewCardFacts.d.ts +3 -0
  167. package/dist/planReviewCardFacts.js +52 -2
  168. package/dist/pluginHooksWire.d.ts +10 -1
  169. package/dist/pluginHooksWire.js +96 -7
  170. package/dist/printToolResultFrame.js +4 -2
  171. package/dist/promptBlockedCopy.js +11 -6
  172. package/dist/promptSuggestionBatch.d.ts +7 -0
  173. package/dist/promptSuggestionBatch.js +9 -0
  174. package/dist/promptSuggestionsTail.d.ts +39 -0
  175. package/dist/promptSuggestionsTail.js +116 -0
  176. package/dist/replayBody.js +10 -2
  177. package/dist/request/taskRequest.d.ts +5 -0
  178. package/dist/request/taskRequest.js +142 -21
  179. package/dist/requestCoordinate.d.ts +1 -0
  180. package/dist/requestCoordinate.js +13 -0
  181. package/dist/resumeRefusalCopy.d.ts +1 -3
  182. package/dist/resumeRefusalCopy.js +2 -1
  183. package/dist/retryStatus.d.ts +2 -2
  184. package/dist/retryStatus.js +2 -0
  185. package/dist/rewindArchiveReading.js +4 -4
  186. package/dist/runCancelContext.d.ts +2 -1
  187. package/dist/runCancelContext.js +1 -0
  188. package/dist/runPermissionModeSwitch.js +2 -2
  189. package/dist/scenarioRefusal.js +11 -13
  190. package/dist/scenarioSkills.js +11 -6
  191. package/dist/seam.d.ts +27 -2
  192. package/dist/seam.js +17 -1
  193. package/dist/seatContract.d.ts +189 -12
  194. package/dist/seatContract.js +401 -9
  195. package/dist/sessionBackground.js +2 -1
  196. package/dist/sessionBackgroundHandoff.js +2 -1
  197. package/dist/sessionCostReading.d.ts +70 -0
  198. package/dist/sessionCostReading.js +150 -0
  199. package/dist/sessionEngine.d.ts +2 -0
  200. package/dist/sessionEngine.js +111 -0
  201. package/dist/sessionHooksRoster.d.ts +4 -0
  202. package/dist/sessionHooksRoster.js +158 -0
  203. package/dist/sessionMemoryStatus.d.ts +2 -1
  204. package/dist/sessionMemoryStatus.js +2 -2
  205. package/dist/sessionReadRedaction.d.ts +7 -0
  206. package/dist/sessionReadRedaction.js +26 -0
  207. package/dist/sessionSyncFileHistory.d.ts +4 -0
  208. package/dist/sessionSyncFileHistory.js +27 -0
  209. package/dist/settingsHooksSalvage.js +2 -1
  210. package/dist/sseIdleTriage.d.ts +13 -1
  211. package/dist/sseIdleTriage.js +25 -6
  212. package/dist/storeDurabilityWord.d.ts +15 -0
  213. package/dist/storeDurabilityWord.js +18 -0
  214. package/dist/storePostureCapability.d.ts +7 -3
  215. package/dist/storePostureCapability.js +69 -39
  216. package/dist/subagent/engineSubagentResume.js +2 -2
  217. package/dist/subagent/engineSubagentTail.js +8 -1
  218. package/dist/subagentContentStore.d.ts +11 -0
  219. package/dist/subagentContentStore.js +28 -2
  220. package/dist/terminalStatuses.d.ts +1 -0
  221. package/dist/terminalStatuses.js +4 -1
  222. package/dist/toolResult.d.ts +1 -0
  223. package/dist/toolResult.js +2 -0
  224. package/dist/turnFailurePresentation.js +9 -2
  225. package/dist/typePins.d.ts +11 -0
  226. package/dist/usageAnalytics.d.ts +17 -0
  227. package/dist/usageAnalytics.js +44 -2
  228. package/dist/userAttachmentEnvelope.d.ts +2 -1
  229. package/dist/userAttachmentEnvelope.js +10 -0
  230. package/dist/wireErrorTriage.js +2 -1
  231. package/dist/wireFailureShape.d.ts +6 -5
  232. package/dist/wireFailureShape.js +150 -38
  233. package/dist/wireRefusalCopy.d.ts +16 -5
  234. package/dist/wireRefusalCopy.js +119 -86
  235. package/docs/INTEGRATION-CLIENTS.md +4228 -21
  236. package/package.json +7 -3
@@ -0,0 +1,297 @@
1
+ import { checkpointQueueRowSortOf } from './hitl/approvalQueueRow.js';
2
+ import { durableDecideLegOf } from './adapter/activeRunSelfHeal.js';
3
+ import { checkpointRowVerdictOf } from './checkpointRowVerdict.js';
4
+ import { compareReleaseVersions } from './supportFloor.js';
5
+ import { engineIdentityOf } from './engineIdentity.js';
6
+ import { slotReadOf } from './wireFailureShape.js';
7
+ import { msg, renderMessage } from './i18n/translate.js';
8
+ export const ENGINE_DRAIN_CLASSES = Object.freeze(['parked_tool_approvals']);
9
+ function own(o, key) {
10
+ if (typeof o !== 'object' || o === null)
11
+ return undefined;
12
+ const r = slotReadOf(o, key);
13
+ return r.presence === 'present' ? r.value : undefined;
14
+ }
15
+ function isArray(v) {
16
+ try {
17
+ return Array.isArray(v);
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function isObject(v) {
24
+ return typeof v === 'object' && v !== null && !isArray(v);
25
+ }
26
+ function isCount(v) {
27
+ return typeof v === 'number' && Number.isSafeInteger(v) && v >= 0;
28
+ }
29
+ function nonEmpty(v) {
30
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
31
+ }
32
+ function elementsOf(v) {
33
+ if (!isArray(v))
34
+ return undefined;
35
+ const len = own(v, 'length');
36
+ if (!isCount(len))
37
+ return undefined;
38
+ const out = [];
39
+ for (let i = 0; i < len; i++) {
40
+ const r = slotReadOf(v, String(i));
41
+ if (r.presence !== 'present')
42
+ return undefined;
43
+ out.push(r.value);
44
+ }
45
+ return out;
46
+ }
47
+ function failedOf(c) {
48
+ return Object.freeze({ class: c, state: 'failed' });
49
+ }
50
+ function crossingOf(v) {
51
+ const kind = own(v, 'kind');
52
+ if (kind === 'none')
53
+ return { crossing: 'none' };
54
+ if (kind === 'attach')
55
+ return isObject(own(v, 'engine')) ? { crossing: 'same' } : { crossing: 'unknown' };
56
+ if (kind === 'ahead' || kind === 'behind') {
57
+ const running = own(v, 'running');
58
+ const mine = own(v, 'own');
59
+ if (typeof running !== 'string' || typeof mine !== 'string')
60
+ return { crossing: 'unknown' };
61
+ const cmp = compareReleaseVersions(running, mine);
62
+ if (kind === 'ahead')
63
+ return cmp === -1 && isObject(own(v, 'engine')) ? { crossing: 'older' } : { crossing: 'unknown' };
64
+ const source = own(v, 'source');
65
+ if (cmp !== 1 || (source !== 'running' && source !== 'high-water'))
66
+ return { crossing: 'unknown' };
67
+ return { crossing: 'newer', running, own: mine, source };
68
+ }
69
+ return { crossing: 'unknown' };
70
+ }
71
+ function targetOf(v) {
72
+ const engine = own(v, 'engine');
73
+ const anchored = own(v, 'anchored');
74
+ const src = isObject(engine) ? own(engine, 'identity') : isObject(anchored) ? anchored : v;
75
+ const id = engineIdentityOf({ pid: own(src, 'pid'), instanceId: own(src, 'instanceId'), startedAt: own(src, 'startedAt') });
76
+ return { ...(id.pid !== undefined ? { pid: id.pid } : {}), ...(id.instanceId !== undefined ? { instanceId: id.instanceId } : {}), ...(id.startedAt !== undefined ? { startedAt: id.startedAt } : {}) };
77
+ }
78
+ function drainEntryOf(e) {
79
+ if (!isObject(e))
80
+ return undefined;
81
+ const c = own(e, 'class');
82
+ if (!ENGINE_DRAIN_CLASSES.includes(c))
83
+ return undefined;
84
+ const cls = c;
85
+ const state = own(e, 'state');
86
+ if (state === 'failed')
87
+ return failedOf(cls);
88
+ if (state === 'unsupported')
89
+ return Object.freeze({ class: cls, state: 'unsupported' });
90
+ if (state !== 'count')
91
+ return undefined;
92
+ const count = own(e, 'count');
93
+ const rows = elementsOf(own(e, 'sessions'));
94
+ if (!isCount(count) || rows === undefined)
95
+ return undefined;
96
+ const sessions = [];
97
+ const seen = new Set();
98
+ let sum = 0;
99
+ for (const s of rows) {
100
+ const sessionId = nonEmpty(own(s, 'sessionId'));
101
+ const n = own(s, 'count');
102
+ if (sessionId === undefined || !isCount(n) || n === 0 || seen.has(sessionId))
103
+ return undefined;
104
+ seen.add(sessionId);
105
+ sum += n;
106
+ sessions.push(Object.freeze({ sessionId, count: n }));
107
+ }
108
+ if (sum !== count)
109
+ return undefined;
110
+ sessions.sort((a, b) => (a.sessionId < b.sessionId ? -1 : a.sessionId > b.sessionId ? 1 : 0));
111
+ return Object.freeze({ class: cls, state: 'count', count, sessions: Object.freeze(sessions) });
112
+ }
113
+ function drainOf(raw) {
114
+ const entries = elementsOf(raw);
115
+ const byClass = new Map();
116
+ let bad = entries === undefined;
117
+ for (const e of entries ?? []) {
118
+ const r = drainEntryOf(e);
119
+ if (r === undefined || byClass.has(r.class)) {
120
+ bad = true;
121
+ break;
122
+ }
123
+ byClass.set(r.class, r);
124
+ }
125
+ return Object.freeze(ENGINE_DRAIN_CLASSES.map(c => (bad ? undefined : byClass.get(c)) ?? failedOf(c)));
126
+ }
127
+ function fingerprintOf(crossing, v, drain) {
128
+ const running = own(v, 'running');
129
+ const mine = own(v, 'own');
130
+ return JSON.stringify([
131
+ 'engine-swap-crossing/1',
132
+ crossing,
133
+ targetOf(v),
134
+ typeof running === 'string' ? running : null,
135
+ typeof mine === 'string' ? mine : null,
136
+ drain.map(r => (r.state === 'count' ? [r.class, r.state, r.count, r.sessions.map(s => [s.sessionId, s.count])] : [r.class, r.state])),
137
+ ]);
138
+ }
139
+ function judge(facts) {
140
+ const engine = own(facts, 'engine');
141
+ const d = crossingOf(engine);
142
+ if (d.crossing === 'newer') {
143
+ return Object.freeze({ kind: 'hold', reason: 'newer_engine', crossing: 'newer', running: d.running, own: d.own, source: d.source });
144
+ }
145
+ if (d.crossing === 'none' || d.crossing === 'same')
146
+ return Object.freeze({ kind: 'clear', crossing: d.crossing });
147
+ const drain = drainOf(own(facts, 'drain'));
148
+ const classes = Object.freeze(drain.filter(r => !(r.state === 'count' && r.count === 0)));
149
+ const holding = drain.some(r => r.state === 'failed' || (r.state === 'count' && r.count > 0));
150
+ const fingerprint = fingerprintOf(d.crossing, engine, drain);
151
+ const informedRaw = own(facts, 'informed');
152
+ const informed = typeof informedRaw === 'string' && informedRaw === fingerprint;
153
+ if (d.crossing === 'older') {
154
+ if (!holding)
155
+ return Object.freeze({ kind: 'clear', crossing: 'older' });
156
+ if (informed)
157
+ return Object.freeze({ kind: 'swap_and_tell', crossing: 'older', classes });
158
+ return Object.freeze({ kind: 'hold', reason: 'drain_unconfirmed', crossing: 'older', classes, fingerprint });
159
+ }
160
+ if (informed) {
161
+ return holding
162
+ ? Object.freeze({ kind: 'swap_and_tell', crossing: 'unknown', classes })
163
+ : Object.freeze({ kind: 'clear', crossing: 'unknown' });
164
+ }
165
+ return Object.freeze({ kind: 'unknown', crossing: 'unknown', classes, fingerprint });
166
+ }
167
+ const UNKNOWN_ALL_FAILED = () => {
168
+ const drain = Object.freeze(ENGINE_DRAIN_CLASSES.map(failedOf));
169
+ return Object.freeze({ kind: 'unknown', crossing: 'unknown', classes: drain, fingerprint: fingerprintOf('unknown', undefined, drain) });
170
+ };
171
+ export function engineSwapCrossingVerdict(facts) {
172
+ try {
173
+ return judge(facts);
174
+ }
175
+ catch {
176
+ return UNKNOWN_ALL_FAILED();
177
+ }
178
+ }
179
+ const PARKED = 'parked_tool_approvals';
180
+ function parkedOf(emission) {
181
+ if (!isObject(emission) || own(emission, 'kind') !== 'snapshot')
182
+ return failedOf(PARKED);
183
+ const droppedSlot = slotReadOf(emission, 'pendingDropped');
184
+ if (droppedSlot.presence === 'unreadable')
185
+ return failedOf(PARKED);
186
+ if (droppedSlot.presence === 'present' && droppedSlot.value !== undefined && !(isCount(droppedSlot.value) && droppedSlot.value === 0))
187
+ return failedOf(PARKED);
188
+ const rows = elementsOf(own(emission, 'pending'));
189
+ if (rows === undefined)
190
+ return failedOf(PARKED);
191
+ const tally = new Map();
192
+ for (const row of rows) {
193
+ if (!isObject(row))
194
+ return failedOf(PARKED);
195
+ const sort = checkpointQueueRowSortOf(row);
196
+ if (sort === 'excluded')
197
+ continue;
198
+ if (sort === 'unreadable')
199
+ return failedOf(PARKED);
200
+ const gate = slotReadOf(row, 'gateKind');
201
+ const leg = gate.presence === 'unreadable' ? 'unreadable' : durableDecideLegOf({ gateKind: typeof gate.value === 'string' ? gate.value : null });
202
+ if (leg === 'plan_review' || leg === 'other_gate')
203
+ continue;
204
+ const verdict = checkpointRowVerdictOf(row);
205
+ if (verdict !== undefined && verdict.kind !== 'ok')
206
+ continue;
207
+ if (leg !== 'approval')
208
+ return failedOf(PARKED);
209
+ const sessionId = nonEmpty(own(row, 'sessionId'));
210
+ if (sessionId === undefined)
211
+ return failedOf(PARKED);
212
+ tally.set(sessionId, (tally.get(sessionId) ?? 0) + 1);
213
+ }
214
+ const sessions = [...tally.entries()]
215
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
216
+ .map(([sessionId, count]) => Object.freeze({ sessionId, count }));
217
+ const count = sessions.reduce((n, s) => n + s.count, 0);
218
+ return Object.freeze({ class: PARKED, state: 'count', count, sessions: Object.freeze(sessions) });
219
+ }
220
+ export function parkedToolApprovalsBySession(emission) {
221
+ try {
222
+ return parkedOf(emission);
223
+ }
224
+ catch {
225
+ return failedOf(PARKED);
226
+ }
227
+ }
228
+ function say(key, lang, params) {
229
+ return renderMessage(msg(key, params), lang);
230
+ }
231
+ function classLine(r, lang) {
232
+ const state = own(r, 'state');
233
+ if (state === 'failed')
234
+ return say('localEngine.swapGuard.parked.failed', lang);
235
+ if (state === 'unsupported')
236
+ return say('localEngine.swapGuard.parked.unsupported', lang);
237
+ const count = own(r, 'count');
238
+ if (state !== 'count' || !isCount(count) || count === 0)
239
+ return undefined;
240
+ if (count === 1)
241
+ return say('localEngine.swapGuard.parked.one', lang);
242
+ const sessions = elementsOf(own(r, 'sessions'));
243
+ if (sessions !== undefined && sessions.length > 1)
244
+ return say('localEngine.swapGuard.parked.manySessions', lang, { count, sessions: sessions.length });
245
+ return say('localEngine.swapGuard.parked.oneSession', lang, { count });
246
+ }
247
+ function toldLine(r, lang) {
248
+ const state = own(r, 'state');
249
+ if (state === 'failed' || state === 'unsupported')
250
+ return say('localEngine.swapGuard.told.unknown', lang);
251
+ const count = own(r, 'count');
252
+ if (state !== 'count' || !isCount(count) || count === 0)
253
+ return undefined;
254
+ return count === 1 ? say('localEngine.swapGuard.told.one', lang) : say('localEngine.swapGuard.told.other', lang, { count });
255
+ }
256
+ function classesOf(v) {
257
+ return elementsOf(own(v, 'classes')) ?? [];
258
+ }
259
+ function joined(parts, lang) {
260
+ const out = parts.filter((p) => typeof p === 'string' && p.length > 0);
261
+ return out.length > 0 ? out.join(lang === 'zh' ? '' : ' ') : undefined;
262
+ }
263
+ export function engineSwapCrossingText(verdict, lane, upgrade, lang) {
264
+ try {
265
+ const kind = own(verdict, 'kind');
266
+ const reason = own(verdict, 'reason');
267
+ if (kind === 'hold' && reason === 'newer_engine') {
268
+ const running = own(verdict, 'running');
269
+ const mine = own(verdict, 'own');
270
+ const source = own(verdict, 'source');
271
+ if (typeof running !== 'string' || typeof mine !== 'string' || compareReleaseVersions(running, mine) !== 1)
272
+ return undefined;
273
+ if (source !== 'running' && source !== 'high-water')
274
+ return undefined;
275
+ const head = say(source === 'high-water' ? 'localEngine.swapGuard.newer.highWater' : 'localEngine.swapGuard.newer', lang, { running, own: mine });
276
+ const way = upgrade === 'cli-update'
277
+ ? say('localEngine.swapGuard.newer.cliUpdate', lang)
278
+ : upgrade === 'app-update'
279
+ ? say('localEngine.swapGuard.newer.appUpdate', lang)
280
+ : undefined;
281
+ return joined([head, way], lang);
282
+ }
283
+ const wayOut = () => say(lane === 'interactive' ? 'localEngine.swapGuard.wayOut.interactive' : 'localEngine.swapGuard.wayOut.print', lang);
284
+ if (kind === 'hold' && reason === 'drain_unconfirmed') {
285
+ return joined([say('localEngine.swapGuard.hold', lang), ...classesOf(verdict).map(r => classLine(r, lang)), wayOut()], lang);
286
+ }
287
+ if (kind === 'unknown') {
288
+ return joined([say('localEngine.swapGuard.unknown', lang), ...classesOf(verdict).map(r => classLine(r, lang)), wayOut()], lang);
289
+ }
290
+ if (kind === 'swap_and_tell')
291
+ return joined(classesOf(verdict).map(r => toldLine(r, lang)), lang);
292
+ return undefined;
293
+ }
294
+ catch {
295
+ return undefined;
296
+ }
297
+ }
@@ -0,0 +1,44 @@
1
+ import type { RequestLane } from './request/taskRequest.js';
2
+ import type { UiLanguage } from './env/uiLanguage.js';
3
+ export declare const ENGINE_UNAVAILABLE_REASONS: readonly ["not_running", "not_answering", "address_refused", "version_refused", "model_setup", "credential_conflict", "credential_refused", "data_root_refused"];
4
+ export type EngineUnavailableReason = (typeof ENGINE_UNAVAILABLE_REASONS)[number];
5
+ export type EngineBootRefusalReason = Extract<EngineUnavailableReason, 'model_setup' | 'credential_conflict' | 'credential_refused' | 'data_root_refused'>;
6
+ export declare const ENGINE_INSTALL_SHAPES: readonly ["npm-global", "managed", "npm-local", "dev", "app", "unknown"];
7
+ export type EngineInstallShape = (typeof ENGINE_INSTALL_SHAPES)[number];
8
+ export type EngineBootRefusalForm = {
9
+ readonly kind: 'embedded';
10
+ readonly install: EngineInstallShape;
11
+ readonly dataDir?: string;
12
+ } | {
13
+ readonly kind: 'deployment';
14
+ };
15
+ export type EngineDataRootVariant = 'newer_root' | 'unreadable' | 'unknown';
16
+ export type EngineBootWayOut = 'newer_build' | 'separate_data_root' | 'restore_backup' | 'repair_access';
17
+ export declare const ENGINE_BOOT_REFUSAL_CODES: Readonly<Record<string, EngineBootRefusalReason>>;
18
+ export interface LocalEngineBootRefusal {
19
+ readonly code?: string;
20
+ readonly hint?: string;
21
+ readonly text: string;
22
+ readonly reason?: EngineBootRefusalReason;
23
+ readonly restartWouldHelp?: false;
24
+ readonly variant?: EngineDataRootVariant;
25
+ readonly findings?: readonly string[];
26
+ readonly highWater?: string;
27
+ readonly engineVersion?: string;
28
+ readonly markerPath?: string;
29
+ readonly waysOut?: readonly EngineBootWayOut[];
30
+ }
31
+ export declare function engineBootRefusalOf(lines: readonly string[], scrub: (s: string) => string): LocalEngineBootRefusal | undefined;
32
+ export declare function engineBootRefusalSentence(refusal: LocalEngineBootRefusal, lang?: UiLanguage, form?: EngineBootRefusalForm): string | undefined;
33
+ export interface EngineUnavailableFacts {
34
+ readonly reason?: EngineUnavailableReason;
35
+ readonly code?: string;
36
+ readonly detail?: string;
37
+ readonly refusal?: LocalEngineBootRefusal;
38
+ readonly engineExitCode?: number | null;
39
+ readonly engineSignal?: string | null;
40
+ readonly pid?: number;
41
+ readonly answer?: 'silent' | 'answered' | 'drain-stuck';
42
+ readonly form?: EngineBootRefusalForm;
43
+ }
44
+ export declare function engineUnavailableLine(facts: EngineUnavailableFacts, lane: RequestLane, lang?: UiLanguage): string | undefined;