@sema-agent/client-core 0.107.0 → 0.109.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 (165) hide show
  1. package/CHANGELOG.md +239 -0
  2. package/README.md +54 -36
  3. package/dist/adapt/arms.js +23 -8
  4. package/dist/adapt/textStream.d.ts +2 -0
  5. package/dist/adapt/textStream.js +37 -16
  6. package/dist/adapter/activeRunSelfHeal.d.ts +2 -0
  7. package/dist/adapter/activeRunSelfHeal.js +21 -4
  8. package/dist/adapter/downstream/eventToSdkMessage.js +2 -1
  9. package/dist/agentSession/engineAgentRegistryRead.js +2 -0
  10. package/dist/bashExitReading.d.ts +12 -0
  11. package/dist/bashExitReading.js +44 -0
  12. package/dist/checkpointRowVerdict.d.ts +6 -1
  13. package/dist/checkpointRowVerdict.js +30 -2
  14. package/dist/cloudConfigWireCaps.d.ts +10 -0
  15. package/dist/cloudConfigWireCaps.js +33 -0
  16. package/dist/compensations.js +1 -1
  17. package/dist/coreValuePorts.d.ts +17 -1
  18. package/dist/coreValuePorts.js +5 -0
  19. package/dist/decideReceipt.js +2 -1
  20. package/dist/engineAgentAbsence.d.ts +2 -0
  21. package/dist/engineAgentAbsence.js +28 -0
  22. package/dist/engineErrorCodes.d.ts +9 -0
  23. package/dist/engineErrorCodes.js +9 -0
  24. package/dist/engineHealthFacts.d.ts +17 -0
  25. package/dist/engineHealthFacts.js +42 -3
  26. package/dist/engineNoticeCodes.d.ts +147 -1
  27. package/dist/engineNoticeCodes.js +694 -57
  28. package/dist/engineTargetSeat.js +1 -0
  29. package/dist/errorSupplementRoles.js +6 -1
  30. package/dist/eventLeg.js +1 -1
  31. package/dist/executionLaneWords.js +2 -1
  32. package/dist/fleetTaskDesc.js +3 -3
  33. package/dist/gateOutcome.d.ts +10 -1
  34. package/dist/gateOutcome.js +48 -1
  35. package/dist/generated/engineFactTables.d.ts +2 -0
  36. package/dist/generated/engineFactTables.js +11 -0
  37. package/dist/generated/engineNoticeTables.js +6 -0
  38. package/dist/generated/settingsSchemaFns.d.ts +4 -2
  39. package/dist/generated/settingsSchemaFns.js +9 -3
  40. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
  41. package/dist/generated/settingsSchemaMcpRequestEntry.js +9 -18
  42. package/dist/generated/settingsSchemaReservedMemberName.d.ts +1 -0
  43. package/dist/generated/settingsSchemaReservedMemberName.js +7 -0
  44. package/dist/generated/settingsSchemaTables.d.ts +2 -0
  45. package/dist/generated/settingsSchemaTables.js +10 -0
  46. package/dist/generated/settingsSchemaWireName.d.ts +1 -0
  47. package/dist/generated/settingsSchemaWireName.js +8 -0
  48. package/dist/headlessReconnectWire.js +12 -7
  49. package/dist/hitl/approvalAskers.d.ts +13 -0
  50. package/dist/hitl/approvalAskers.js +79 -0
  51. package/dist/hitl/approvalCardReasons.js +22 -4
  52. package/dist/hitl/approvalRequestFrameReading.d.ts +14 -0
  53. package/dist/hitl/approvalRequestFrameReading.js +79 -0
  54. package/dist/hitl/approvalResolution.d.ts +3 -0
  55. package/dist/hitl/approvalResolution.js +22 -4
  56. package/dist/hitl/approvalsFeed.js +4 -13
  57. package/dist/hitl/askParkRowRouting.js +10 -3
  58. package/dist/hitl/automaticAnswerVerdict.d.ts +5 -2
  59. package/dist/hitl/automaticAnswerVerdict.js +16 -2
  60. package/dist/hitl/decisionConflict.d.ts +2 -1
  61. package/dist/hitl/decisionConflict.js +4 -1
  62. package/dist/hitl/decisionRefusal.d.ts +1 -0
  63. package/dist/hitl/decisionRefusal.js +5 -2
  64. package/dist/hitl/decisionSend.js +2 -6
  65. package/dist/hitl/frameRouter.d.ts +3 -2
  66. package/dist/hitl/frameRouter.js +37 -7
  67. package/dist/hitl/gateLedger.d.ts +2 -0
  68. package/dist/hitl/gateLedger.js +3 -1
  69. package/dist/hitl/hitlBridge.d.ts +4 -0
  70. package/dist/hitl/hitlBridge.js +11 -8
  71. package/dist/hitl/livePendingAsk.js +17 -16
  72. package/dist/hitl/localAllowRule.js +2 -1
  73. package/dist/hitl/noAllowCause.d.ts +1 -1
  74. package/dist/hitl/noAllowCause.js +4 -2
  75. package/dist/hitl/parkExpiryJudgements.js +26 -1
  76. package/dist/hitl/parkOwnership.d.ts +2 -0
  77. package/dist/hitl/parkOwnership.js +48 -8
  78. package/dist/hitl/parkResolver.js +39 -30
  79. package/dist/hitl/parkRowBirthWait.d.ts +2 -0
  80. package/dist/hitl/parkRowBirthWait.js +8 -1
  81. package/dist/hitl/parkedUnresumable.d.ts +13 -0
  82. package/dist/hitl/parkedUnresumable.js +80 -0
  83. package/dist/hitl/permissionRuleScope.d.ts +4 -0
  84. package/dist/hitl/permissionRuleScope.js +31 -0
  85. package/dist/hitl/persistedRulesWire.d.ts +7 -1
  86. package/dist/hitl/persistedRulesWire.js +25 -8
  87. package/dist/hitl/planReviewWire.js +12 -16
  88. package/dist/hitl/policyDenyCause.d.ts +3 -0
  89. package/dist/hitl/policyDenyCause.js +16 -0
  90. package/dist/hitl/sessionAllowRoute.js +5 -4
  91. package/dist/hitl/sessionPolicyDeliverable.js +1 -1
  92. package/dist/hitl/standingRows.d.ts +1 -5
  93. package/dist/hitl/standingRows.js +15 -14
  94. package/dist/hitl/toolApprovalWire.d.ts +16 -4
  95. package/dist/hitl/toolApprovalWire.js +57 -17
  96. package/dist/hooksReaderGenerations.d.ts +1 -0
  97. package/dist/hooksReaderGenerations.js +12 -0
  98. package/dist/hooksWireCaps.js +12 -7
  99. package/dist/hostSettingsSource.js +2 -0
  100. package/dist/i18n/messages.en.d.ts +206 -1
  101. package/dist/i18n/messages.en.js +209 -4
  102. package/dist/i18n/messages.zh.js +214 -4
  103. package/dist/index.d.ts +35 -8
  104. package/dist/index.js +20 -5
  105. package/dist/liveModelCatalog.d.ts +4 -2
  106. package/dist/liveModelCatalog.js +164 -26
  107. package/dist/localEngineJudge.d.ts +75 -0
  108. package/dist/localEngineJudge.js +242 -0
  109. package/dist/localEngineOccupancy.d.ts +88 -0
  110. package/dist/localEngineOccupancy.js +269 -0
  111. package/dist/localEngineSeatReading.d.ts +29 -0
  112. package/dist/localEngineSeatReading.js +294 -0
  113. package/dist/localEngineSpawn.d.ts +113 -0
  114. package/dist/localEngineSpawn.js +486 -0
  115. package/dist/localEngineStep.d.ts +286 -0
  116. package/dist/localEngineStep.js +1086 -0
  117. package/dist/localEngineStopLadder.d.ts +29 -0
  118. package/dist/localEngineStopLadder.js +139 -0
  119. package/dist/localEngineSwapCard.d.ts +43 -0
  120. package/dist/localEngineSwapCard.js +205 -0
  121. package/dist/localEngineTiming.d.ts +8 -0
  122. package/dist/localEngineTiming.js +8 -0
  123. package/dist/mcpReconnect.js +12 -5
  124. package/dist/mcpWireCaps.js +2 -2
  125. package/dist/memoryEntriesWire.d.ts +1 -1
  126. package/dist/memoryEntriesWire.js +5 -0
  127. package/dist/model/catalogDefault.d.ts +25 -0
  128. package/dist/model/catalogDefault.js +44 -0
  129. package/dist/noticePresentation.d.ts +2 -0
  130. package/dist/noticePresentation.js +79 -1
  131. package/dist/ownKey.d.ts +10 -0
  132. package/dist/ownKey.js +15 -1
  133. package/dist/permissionWireCaps.d.ts +1 -0
  134. package/dist/permissionWireCaps.js +11 -0
  135. package/dist/pluginHooksWire.d.ts +5 -3
  136. package/dist/pluginHooksWire.js +116 -7
  137. package/dist/queuedDelivery.d.ts +1 -0
  138. package/dist/queuedDelivery.js +12 -0
  139. package/dist/resultFrameKeys.js +4 -2
  140. package/dist/resumeRefusalCopy.js +15 -8
  141. package/dist/ruleReadings.js +1 -1
  142. package/dist/runPermissionModeSwitch.d.ts +2 -1
  143. package/dist/runPermissionModeSwitch.js +16 -6
  144. package/dist/seam.d.ts +13 -2
  145. package/dist/seam.js +8 -1
  146. package/dist/seatContract.d.ts +103 -12
  147. package/dist/seatContract.js +344 -14
  148. package/dist/sessionBackground.js +2 -0
  149. package/dist/sessionEngine.d.ts +2 -1
  150. package/dist/sessionEngine.js +5 -0
  151. package/dist/settingsHooksSalvage.d.ts +5 -0
  152. package/dist/settingsHooksSalvage.js +54 -0
  153. package/dist/subagentContentStore.d.ts +12 -0
  154. package/dist/subagentContentStore.js +73 -12
  155. package/dist/supportFloor.js +2 -0
  156. package/dist/taskNotificationAdmission.d.ts +19 -0
  157. package/dist/taskNotificationAdmission.js +84 -0
  158. package/dist/toolResult.js +20 -6
  159. package/dist/webSearchWireCaps.js +9 -4
  160. package/dist/wireFailureShape.d.ts +20 -0
  161. package/dist/wireFailureShape.js +37 -6
  162. package/dist/wireRefusalCopy.d.ts +23 -2
  163. package/dist/wireRefusalCopy.js +93 -4
  164. package/docs/INTEGRATION-CLIENTS.md +1959 -15
  165. package/package.json +4 -4
@@ -0,0 +1,294 @@
1
+ import { localEngineCurrentCard } from './localEngineStep.js';
2
+ import { msg, renderMessage } from './i18n/translate.js';
3
+ import { displayUntrusted } from './displayUntrusted.js';
4
+ import { ownSnapshotTyped, readOwnDataValue } from './ownKey.js';
5
+ import { engineIdentityVerdict } from './engineIdentity.js';
6
+ function own(v, key) {
7
+ if (typeof v !== 'object' || v === null)
8
+ return undefined;
9
+ try {
10
+ return readOwnDataValue(v, key);
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ function deepFreeze(v) {
17
+ if (typeof v === 'object' && v !== null && !Object.isFrozen(v)) {
18
+ for (const k of Object.keys(v))
19
+ deepFreeze(v[k]);
20
+ Object.freeze(v);
21
+ }
22
+ return v;
23
+ }
24
+ function say(key, lang, params) {
25
+ return renderMessage(msg(key, params), lang);
26
+ }
27
+ function principalUnknownLine(lang) {
28
+ return say('localEngine.principalUnknown', lang, { layer: msg('localEngine.settingsLayer.unspecified') });
29
+ }
30
+ export function localEngineSeatReadingOf(state, host) {
31
+ try {
32
+ const snap = ownSnapshotTyped(state);
33
+ if (snap === undefined)
34
+ return undefined;
35
+ const kind = own(snap, 'kind');
36
+ const ctx = own(snap, 'ctx');
37
+ let r;
38
+ switch (kind) {
39
+ case 'unbound':
40
+ if (own(ctx, 'demand') === true)
41
+ r = { phase: 'waiting', why: 'starting' };
42
+ else
43
+ r = own(own(host, 'principal'), 'kind') === 'unknown' ? { phase: 'down', reason: 'principal-unknown' } : { phase: 'waiting', why: 'dormant' };
44
+ break;
45
+ case 'attached':
46
+ r = { phase: 'attached' };
47
+ break;
48
+ case 'pending': {
49
+ const card = own(snap, 'card') === 'shown' ? localEngineCurrentCard(snap) : undefined;
50
+ r = { phase: 'pending', serving: own(snap, 'serving') === true, ...(card !== undefined ? { card } : {}) };
51
+ break;
52
+ }
53
+ case 'draining-wait':
54
+ r = { phase: 'waiting', why: 'draining' };
55
+ break;
56
+ case 'unanswered':
57
+ r = own(snap, 'reason') === 'unverifiable' ? { phase: 'waiting', why: 'unanswered', unverifiable: true } : { phase: 'waiting', why: 'unanswered' };
58
+ break;
59
+ case 'down': {
60
+ const reason = own(snap, 'reason');
61
+ if (reason === 'lock-unavailable' && own(ctx, 'lockRetry') === 0)
62
+ r = { phase: 'waiting', why: 'starting' };
63
+ else if (typeof reason === 'string' && STATE_DOWN.includes(reason))
64
+ r = { phase: 'down', reason: reason };
65
+ break;
66
+ }
67
+ case 'locking': {
68
+ const intent = own(snap, 'intent');
69
+ if (own(intent, 'kind') === 'stop')
70
+ r = { phase: 'swapping', mode: own(intent, 'mode') === 'forced' ? 'forced' : 'idle' };
71
+ else
72
+ r = own(snap, 'held') === true ? { phase: 'waiting', why: 'starting' } : { phase: 'waiting', why: 'peer' };
73
+ break;
74
+ }
75
+ case 'stopping':
76
+ r = { phase: 'swapping', mode: own(snap, 'mode') === 'forced' ? 'forced' : 'idle' };
77
+ break;
78
+ case 'spawning':
79
+ r = { phase: 'waiting', why: 'starting' };
80
+ break;
81
+ case 'behind': {
82
+ const running = own(snap, 'running');
83
+ const mine = own(snap, 'own');
84
+ if (typeof running === 'string' && running.length > 0 && typeof mine === 'string' && mine.length > 0) {
85
+ r = { phase: 'behind', running, own: mine, upgrade: own(host, 'upgrade') === 'available' ? 'available' : 'unavailable' };
86
+ }
87
+ break;
88
+ }
89
+ default:
90
+ r = undefined;
91
+ }
92
+ return r === undefined ? undefined : deepFreeze(r);
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ }
98
+ const STATE_DOWN = Object.freeze(['lock-unavailable', 'spawn-failed', 'spawn-refused', 'stop-failed', 'crash-loop', 'high-water-unreadable']);
99
+ const DOWN_KEYS = Object.freeze({
100
+ 'lock-unavailable': 'localEngine.down.lockUnavailable',
101
+ 'spawn-failed': 'localEngine.down.spawnFailed',
102
+ 'spawn-refused': 'localEngine.down.spawnRefused',
103
+ 'stop-failed': 'localEngine.down.stopFailed',
104
+ 'crash-loop': 'localEngine.down.crashLoop',
105
+ 'high-water-unreadable': 'localEngine.down.highWaterUnreadable',
106
+ });
107
+ function downSentence(reason, lang) {
108
+ if (reason === 'principal-unknown')
109
+ return principalUnknownLine(lang);
110
+ return typeof reason === 'string' && Object.hasOwn(DOWN_KEYS, reason) ? say(DOWN_KEYS[reason], lang) : undefined;
111
+ }
112
+ export function localEngineSeatSentence(reading, upgrade, lang) {
113
+ try {
114
+ const phase = own(reading, 'phase');
115
+ switch (phase) {
116
+ case 'waiting': {
117
+ const why = own(reading, 'why');
118
+ if (why === 'starting')
119
+ return say('localEngine.phase.starting', lang);
120
+ if (why === 'dormant')
121
+ return say('localEngine.phase.dormant', lang);
122
+ if (why === 'draining')
123
+ return say('localEngine.phase.draining', lang);
124
+ if (why === 'peer')
125
+ return say('localEngine.waitingPeer', lang);
126
+ if (why === 'unanswered')
127
+ return say(own(reading, 'unverifiable') === true ? 'localEngine.phase.unverifiable' : 'localEngine.phase.unanswered', lang);
128
+ return undefined;
129
+ }
130
+ case 'pending':
131
+ return say(own(reading, 'serving') === true ? 'localEngine.banner.pending' : 'localEngine.phase.pendingBlocked', lang);
132
+ case 'swapping':
133
+ return say(own(reading, 'mode') === 'forced' ? 'localEngine.phase.swappingForced' : 'localEngine.phase.swappingIdle', lang);
134
+ case 'down':
135
+ return downSentence(own(reading, 'reason'), lang);
136
+ case 'behind': {
137
+ const running = own(reading, 'running');
138
+ const mine = own(reading, 'own');
139
+ if (typeof running !== 'string' || typeof mine !== 'string')
140
+ return undefined;
141
+ const params = { running: displayUntrusted(running, { max: 64 }), own: displayUntrusted(mine, { max: 64 }) };
142
+ return say(upgrade === 'cli-update' ? 'localEngine.behind.cliUpdate' : 'localEngine.behind.appUpdate', lang, params);
143
+ }
144
+ default:
145
+ return undefined;
146
+ }
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ export function localEngineNoticeText(notice, lang) {
153
+ try {
154
+ switch (own(notice, 'key')) {
155
+ case 'versionUnknown':
156
+ return say('localEngine.versionUnknown', lang);
157
+ case 'highWaterUnreadable':
158
+ return say('localEngine.down.highWaterUnreadable', lang);
159
+ case 'crashLoop': {
160
+ const ms = own(notice, 'retryInMs');
161
+ return typeof ms === 'number' && Number.isFinite(ms) && ms >= 0 ? say('localEngine.crashLoop.retry', lang, { seconds: Math.ceil(ms / 1000) }) : say('localEngine.crashLoop.stopped', lang);
162
+ }
163
+ case 'crashLoopRetry':
164
+ return say('localEngine.crashLoop.retrying', lang);
165
+ case 'drainOverdue':
166
+ return say('localEngine.drainOverdue', lang);
167
+ case 'engineExited':
168
+ if (own(notice, 'crashLoopNext') === true)
169
+ return say('localEngine.engineExited.crashLoop', lang);
170
+ return say(own(notice, 'counted') === true ? 'localEngine.engineExited.unexpected' : 'localEngine.engineExited.quiet', lang);
171
+ case 'cannotVerifyEngine':
172
+ return say('localEngine.cannotVerifyEngine', lang);
173
+ case 'lockUnavailable':
174
+ return say('localEngine.lockUnavailable', lang);
175
+ case 'prepareFailed': {
176
+ const reason = own(notice, 'reason');
177
+ if (reason === 'timeout')
178
+ return say('localEngine.prepareFailed.timeout', lang);
179
+ return say('localEngine.prepareFailed.reason', lang, { reason: displayUntrusted(typeof reason === 'string' ? reason : '', { max: 200 }) });
180
+ }
181
+ case 'stopFailed':
182
+ return say('localEngine.down.stopFailed', lang);
183
+ case 'spawnFailed':
184
+ return say(own(notice, 'timeout') === true ? 'localEngine.spawnFailed.timeout' : 'localEngine.down.spawnFailed', lang);
185
+ case 'lockLost':
186
+ return say('localEngine.lockLost', lang);
187
+ case 'forcedLine':
188
+ return say('localEngine.forcedLine', lang);
189
+ default:
190
+ return undefined;
191
+ }
192
+ }
193
+ catch {
194
+ return undefined;
195
+ }
196
+ }
197
+ const FAIL_KEYS = Object.freeze({
198
+ 'local_engine.behind': 'localEngine.headless.behind',
199
+ 'local_engine.legacy_below_floor': 'localEngine.headless.legacyBelowFloor',
200
+ 'local_engine.unresponsive': 'localEngine.headless.unresponsive',
201
+ 'local_engine.swap_pending': 'localEngine.headless.swapPending',
202
+ 'local_engine.drain_overdue': 'localEngine.headless.drainOverdue',
203
+ 'local_engine.unanswered_unverifiable': 'localEngine.headless.unverifiable',
204
+ 'local_engine.lock_unavailable': 'localEngine.down.lockUnavailable',
205
+ 'local_engine.spawn_failed': 'localEngine.down.spawnFailed',
206
+ 'local_engine.spawn_refused': 'localEngine.down.spawnRefused',
207
+ 'local_engine.stop_failed': 'localEngine.down.stopFailed',
208
+ 'local_engine.crash_loop': 'localEngine.down.crashLoop',
209
+ 'local_engine.high_water_unreadable': 'localEngine.down.highWaterUnreadable',
210
+ });
211
+ export function localEngineFailText(code, lang) {
212
+ try {
213
+ if (code === 'local_engine.principal_unknown')
214
+ return principalUnknownLine(lang);
215
+ return typeof code === 'string' && Object.hasOwn(FAIL_KEYS, code) ? say(FAIL_KEYS[code], lang) : undefined;
216
+ }
217
+ catch {
218
+ return undefined;
219
+ }
220
+ }
221
+ export function engineTargetLocalOf(input, lang) {
222
+ try {
223
+ const raw = own(input, 'lifecycle');
224
+ const lifecycle = raw === undefined ? undefined : ownSnapshotTyped(raw);
225
+ const phase = own(lifecycle, 'phase');
226
+ if (lifecycle === undefined || typeof phase !== 'string')
227
+ return Object.freeze({});
228
+ const out = { lifecycle };
229
+ if (phase === 'down') {
230
+ const line = downSentence(own(lifecycle, 'reason'), lang);
231
+ if (line !== undefined)
232
+ out.lastBootError = line;
233
+ }
234
+ const mcpRaw = own(input, 'mcp');
235
+ const mcp = mcpRaw === undefined ? undefined : ownSnapshotTyped(mcpRaw);
236
+ if ((phase === 'attached' || phase === 'pending') && mcp !== undefined)
237
+ out.mcp = mcp;
238
+ return deepFreeze(out);
239
+ }
240
+ catch {
241
+ return Object.freeze({});
242
+ }
243
+ }
244
+ function attachedId(s) {
245
+ const kind = own(s, 'kind');
246
+ if (kind === 'attached')
247
+ return own(own(s, 'engine'), 'identity');
248
+ if (kind === 'pending' && own(s, 'serving') === true)
249
+ return own(own(s, 'target'), 'identity');
250
+ return undefined;
251
+ }
252
+ export function engineRestartOutcomeOf(r) {
253
+ const lang = own(r, 'lang');
254
+ try {
255
+ const before = own(r, 'before');
256
+ const after = own(r, 'after');
257
+ const effectsRaw = own(r, 'effects');
258
+ const effects = Array.isArray(effectsRaw) ? effectsRaw : [];
259
+ const has = (pred) => effects.some((e) => pred(e));
260
+ const modelRaw = own(r, 'model');
261
+ const model = typeof modelRaw === 'string' && modelRaw.length > 0 ? modelRaw : null;
262
+ const afterKind = own(after, 'kind');
263
+ if (has((e) => own(e, 'kind') === 'notice' && own(own(e, 'notice'), 'key') === 'prepareFailed')) {
264
+ return Object.freeze({ state: 'failed', reason: say('localEngine.restartOutcome.failedPrepare', lang) });
265
+ }
266
+ if (afterKind === 'down') {
267
+ const detail = downSentence(own(after, 'reason'), lang) ?? '';
268
+ return Object.freeze({ state: 'failed', reason: say('localEngine.restartOutcome.failedDown', lang, { detail }) });
269
+ }
270
+ const beforeAttached = attachedId(before);
271
+ if (own(r, 'cause') === 'config' && beforeAttached === undefined && own(r, 'demand') !== 'spawn') {
272
+ return Object.freeze({ state: 'skipped', reason: say('localEngine.restartOutcome.skippedNoDemand', lang) });
273
+ }
274
+ if (afterKind === 'unbound' && own(own(after, 'ctx'), 'demand') !== true) {
275
+ return Object.freeze({ state: 'skipped', reason: say('localEngine.restartOutcome.skippedNoDemand', lang) });
276
+ }
277
+ const afterAttached = attachedId(after);
278
+ if (afterAttached !== undefined) {
279
+ const spawned = has((e) => own(e, 'kind') === 'spawn');
280
+ const changed = beforeAttached === undefined || engineIdentityVerdict(beforeAttached, afterAttached) === 'changed';
281
+ if (own(after, 'kind') === 'attached' && (spawned || changed)) {
282
+ return Object.freeze({ state: beforeAttached !== undefined ? 'restarted' : 'started', model });
283
+ }
284
+ }
285
+ if (afterKind === 'pending') {
286
+ const card = own(after, 'card') === 'shown' || has((e) => own(e, 'kind') === 'card' && own(e, 'show') !== null && own(e, 'show') !== undefined);
287
+ return Object.freeze({ state: 'pending', reason: say(card ? 'localEngine.restartOutcome.pendingCard' : 'localEngine.restartOutcome.pendingBusy', lang) });
288
+ }
289
+ return Object.freeze({ state: 'pending', reason: say('localEngine.restartOutcome.pendingBusy', lang) });
290
+ }
291
+ catch {
292
+ return Object.freeze({ state: 'pending', reason: say('localEngine.restartOutcome.pendingBusy', lang) });
293
+ }
294
+ }
@@ -0,0 +1,113 @@
1
+ import type { HostSettingsLayer } from './hostSettingsSource.js';
2
+ import type { UiLanguage } from './env/uiLanguage.js';
3
+ export type LocalEngineSpawnPathSlot = 'configHome' | 'dataRoot' | 'configLocalDir';
4
+ export type LocalEngineSpawnDerived = 'agentDataDir' | 'drainPlusH' | 'operatorSingleUser';
5
+ export type LocalEngineSpawnValue = {
6
+ readonly kind: 'literal';
7
+ readonly value: string;
8
+ } | {
9
+ readonly kind: 'delete';
10
+ } | {
11
+ readonly kind: 'path';
12
+ readonly slot: LocalEngineSpawnPathSlot;
13
+ } | {
14
+ readonly kind: 'derived';
15
+ readonly from: LocalEngineSpawnDerived;
16
+ };
17
+ export interface LocalEngineSpawnEnvRow {
18
+ readonly key: string;
19
+ readonly value: LocalEngineSpawnValue;
20
+ readonly userOverridable: boolean;
21
+ }
22
+ export declare const LOCAL_ENGINE_SPAWN_ENV: readonly LocalEngineSpawnEnvRow[];
23
+ export declare const LOCAL_ENGINE_HOST_BITS: readonly string[];
24
+ export declare const LOCAL_ENGINE_SPAWN_SHAPE: Readonly<{
25
+ readonly detachedSession: true;
26
+ readonly stdio: "engine-log-file";
27
+ }>;
28
+ export declare function localEngineOperatorSingleUserOf(inherited: unknown): 'true' | undefined;
29
+ export interface LocalEngineBudgets {
30
+ readonly storeLockWaitMs: number;
31
+ readonly healthWaitBudgetMs: number;
32
+ readonly stopBoundMs: number;
33
+ readonly lockWaitMs: number;
34
+ }
35
+ export interface LocalEngineSpawnPaths {
36
+ readonly configHome: string;
37
+ readonly dataRoot: string;
38
+ readonly configLocalDir: string;
39
+ }
40
+ export interface LocalEngineSpawnEnvInput {
41
+ readonly inherited: unknown;
42
+ readonly paths: LocalEngineSpawnPaths;
43
+ readonly hostBits: unknown;
44
+ }
45
+ export interface LocalEngineSpawnApplied {
46
+ readonly key: string;
47
+ readonly from: 'table' | 'user' | 'host' | 'derived';
48
+ }
49
+ export interface LocalEngineSpawnEnv {
50
+ readonly env: Readonly<Record<string, string>>;
51
+ readonly applied: readonly LocalEngineSpawnApplied[];
52
+ readonly refusedHostBits: readonly string[];
53
+ readonly budgets: LocalEngineBudgets;
54
+ }
55
+ export declare function localEngineSpawnEnv(input: LocalEngineSpawnEnvInput): LocalEngineSpawnEnv;
56
+ export type LocalEngineSettingsLayerName = Extract<HostSettingsLayer, 'userSettings' | 'flagSettings' | 'policySettings'>;
57
+ export type LocalEngineSettingsLayers = readonly {
58
+ readonly layer: LocalEngineSettingsLayerName;
59
+ readonly read: {
60
+ readonly state: 'ok';
61
+ readonly env: unknown;
62
+ } | {
63
+ readonly state: 'absent';
64
+ } | {
65
+ readonly state: 'unreadable';
66
+ readonly lastHealthy?: unknown;
67
+ };
68
+ }[];
69
+ export interface LocalEngineSeedInput {
70
+ readonly baseline: unknown;
71
+ readonly external: unknown;
72
+ readonly layers: LocalEngineSettingsLayers;
73
+ readonly topLevel: unknown;
74
+ readonly platform: 'posix' | 'win32';
75
+ }
76
+ export interface LocalEngineSeedFrom {
77
+ readonly key: string;
78
+ readonly source: 'baseline' | 'external' | LocalEngineSettingsLayerName | 'top-level';
79
+ }
80
+ export interface LocalEngineSeedDropped {
81
+ readonly key: string;
82
+ readonly why: 'pinned-at-entry' | 'top-level-invalid' | 'layer-unreadable';
83
+ }
84
+ export interface LocalEngineSeed {
85
+ readonly env: Readonly<Record<string, string>>;
86
+ readonly from: readonly LocalEngineSeedFrom[];
87
+ readonly dropped: readonly LocalEngineSeedDropped[];
88
+ readonly refuse?: 'policy-unreadable';
89
+ }
90
+ export declare function localEngineSeedEnv(input: LocalEngineSeedInput): LocalEngineSeed;
91
+ export type LocalEnginePrincipal = {
92
+ readonly kind: 'principal';
93
+ readonly principal: string;
94
+ readonly source: 'settings' | 'default';
95
+ readonly ignoredProcessOverride?: true;
96
+ } | {
97
+ readonly kind: 'unknown';
98
+ readonly layer: LocalEngineSettingsLayerName;
99
+ };
100
+ export interface LocalEnginePrincipalView {
101
+ readonly layers: LocalEngineSettingsLayers;
102
+ readonly processEnv: unknown;
103
+ }
104
+ export declare function localEnginePrincipalOf(view: LocalEnginePrincipalView): LocalEnginePrincipal;
105
+ export declare function localEnginePrincipalSentence(p: LocalEnginePrincipal, lang?: UiLanguage): string | undefined;
106
+ export interface LocalEngineBootRefusal {
107
+ readonly code?: string;
108
+ readonly hint?: string;
109
+ readonly text: string;
110
+ }
111
+ export declare function engineBootRefusalOf(lines: readonly string[], scrub: (s: string) => string): LocalEngineBootRefusal | undefined;
112
+ export declare function engineBootRefusalSentence(refusal: LocalEngineBootRefusal, lang?: UiLanguage): string | undefined;
113
+ export declare function localEngineFirstShareSentence(lang?: UiLanguage): string;