cli-jaw 2.17.72 → 2.17.73

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 (169) hide show
  1. package/README.md +16 -0
  2. package/dist/src/agent/aside-catalog.js +339 -0
  3. package/dist/src/agent/aside-catalog.js.map +1 -0
  4. package/dist/src/agent/aside-cli.js +208 -0
  5. package/dist/src/agent/aside-cli.js.map +1 -0
  6. package/dist/src/agent/aside-replay.js +120 -0
  7. package/dist/src/agent/aside-replay.js.map +1 -0
  8. package/dist/src/agent/aside-runtime.js +175 -0
  9. package/dist/src/agent/aside-runtime.js.map +1 -0
  10. package/dist/src/agent/lifecycle-handler.js +26 -18
  11. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  12. package/dist/src/agent/memory-flush-controller.js +3 -0
  13. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  14. package/dist/src/agent/prompt-context.js +2 -2
  15. package/dist/src/agent/prompt-context.js.map +1 -1
  16. package/dist/src/agent/session-persistence.js +2 -0
  17. package/dist/src/agent/session-persistence.js.map +1 -1
  18. package/dist/src/agent/spawn/backend-aside.js +314 -0
  19. package/dist/src/agent/spawn/backend-aside.js.map +1 -0
  20. package/dist/src/agent/spawn/resume.js +3 -0
  21. package/dist/src/agent/spawn/resume.js.map +1 -1
  22. package/dist/src/agent/spawn-env.js +5 -0
  23. package/dist/src/agent/spawn-env.js.map +1 -1
  24. package/dist/src/agent/spawn.js +60 -6
  25. package/dist/src/agent/spawn.js.map +1 -1
  26. package/dist/src/cli/cli-status-worker.js +2 -1
  27. package/dist/src/cli/cli-status-worker.js.map +1 -1
  28. package/dist/src/cli/employee-handler.js +2 -0
  29. package/dist/src/cli/employee-handler.js.map +1 -1
  30. package/dist/src/cli/handlers-completions.js +20 -8
  31. package/dist/src/cli/handlers-completions.js.map +1 -1
  32. package/dist/src/cli/handlers-runtime.js +2 -0
  33. package/dist/src/cli/handlers-runtime.js.map +1 -1
  34. package/dist/src/cli/readiness.js +7 -3
  35. package/dist/src/cli/readiness.js.map +1 -1
  36. package/dist/src/cli/registry-live.js +47 -0
  37. package/dist/src/cli/registry-live.js.map +1 -1
  38. package/dist/src/cli/registry.js +5 -0
  39. package/dist/src/cli/registry.js.map +1 -1
  40. package/dist/src/core/config.js +10 -3
  41. package/dist/src/core/config.js.map +1 -1
  42. package/dist/src/core/employees.js +5 -3
  43. package/dist/src/core/employees.js.map +1 -1
  44. package/dist/src/core/settings-merge.js +35 -0
  45. package/dist/src/core/settings-merge.js.map +1 -1
  46. package/dist/src/core/settings-watch.js +10 -1
  47. package/dist/src/core/settings-watch.js.map +1 -1
  48. package/dist/src/orchestrator/gateway.js +2 -0
  49. package/dist/src/orchestrator/gateway.js.map +1 -1
  50. package/dist/src/routes/employees.js +8 -0
  51. package/dist/src/routes/employees.js.map +1 -1
  52. package/dist/src/routes/jaw-memory.js +4 -0
  53. package/dist/src/routes/jaw-memory.js.map +1 -1
  54. package/dist/src/routes/orchestrate.js +22 -3
  55. package/dist/src/routes/orchestrate.js.map +1 -1
  56. package/dist/src/routes/settings.js +23 -0
  57. package/dist/src/routes/settings.js.map +1 -1
  58. package/dist/src/shared/aside-contract.js +2 -0
  59. package/dist/src/shared/aside-contract.js.map +1 -0
  60. package/dist/src/types/cli-engine.js +1 -0
  61. package/dist/src/types/cli-engine.js.map +1 -1
  62. package/package.json +1 -1
  63. package/public/dist/.vite/manifest.json +186 -175
  64. package/public/dist/assets/{Activity-DPLlOJ46.js → Activity-DsBgOkCP.js} +1 -1
  65. package/public/dist/assets/{AdvancedExport-BgOgGvc5.js → AdvancedExport-COGQ7vbK.js} +1 -1
  66. package/public/dist/assets/Agent-6qGQN7lY.js +1 -0
  67. package/public/dist/assets/AsideSelectionFields-DvU5xWAP.js +1 -0
  68. package/public/dist/assets/{Browser-m6VynQXV.js → Browser-r09vOsR1.js} +1 -1
  69. package/public/dist/assets/ChannelEnablementControl-ooOkdd-Q.js +85 -0
  70. package/public/dist/assets/{ChannelSetupEntry-DHLoZEzJ.js → ChannelSetupEntry-B0b4TdhH.js} +1 -1
  71. package/public/dist/assets/{ChannelsDiscord-B-G8vsYy.js → ChannelsDiscord-9EMLt5b3.js} +1 -1
  72. package/public/dist/assets/{ChannelsSlack-oPuh922z.js → ChannelsSlack-B8ETzWFt.js} +1 -1
  73. package/public/dist/assets/{ChannelsTelegram-PmTv43KQ.js → ChannelsTelegram-CflLUsQw.js} +1 -1
  74. package/public/dist/assets/{DashboardMeta-BqEiJrvr.js → DashboardMeta-wjEuh9-E.js} +1 -1
  75. package/public/dist/assets/{Developer-CbySB7_Z.js → Developer-B3cDkldo.js} +1 -1
  76. package/public/dist/assets/{Display-DU4_76cS.js → Display-BXQxpv6-.js} +1 -1
  77. package/public/dist/assets/{Display-C0Zdamcb.js → Display-Cl4DD334.js} +1 -1
  78. package/public/dist/assets/{Embedding-CCFMOB_2.js → Embedding-D-T92-En.js} +1 -1
  79. package/public/dist/assets/{Employees-BanvF58d.js → Employees-Cf4IeF0N.js} +1 -1
  80. package/public/dist/assets/{Heartbeat-uyi_MpUd.js → Heartbeat-Bj8V_bUM.js} +1 -1
  81. package/public/dist/assets/{Mcp-rjPoL_Zo.js → Mcp-jAcut_fw.js} +1 -1
  82. package/public/dist/assets/Memory-BOXkBFKg.js +1 -0
  83. package/public/dist/assets/ModelProvider-DIDQ37z-.js +1 -0
  84. package/public/dist/assets/{Network-CuqFrOvR.js → Network-I5eOe2hf.js} +1 -1
  85. package/public/dist/assets/{Permissions-BltXiZnz.js → Permissions-B7PthH01.js} +1 -1
  86. package/public/dist/assets/{Permissions-DcCbFMIq.js → Permissions-BCYUfJg1.js} +1 -1
  87. package/public/dist/assets/Profile-CYPMVhQM.js +1 -0
  88. package/public/dist/assets/{Prompts-C9vY8ivQ.js → Prompts-BRAgZLNQ.js} +1 -1
  89. package/public/dist/assets/{SpeechKeys-BJ8V7U5E.js → SpeechKeys-UlXNSFoe.js} +1 -1
  90. package/public/dist/assets/{TelegramHub-DtyjLGFR.js → TelegramHub-BhUFhIcv.js} +1 -1
  91. package/public/dist/assets/agent-meta-v4jNRAbX.js +1 -0
  92. package/public/dist/assets/app-SVIyP1TT.js +59 -0
  93. package/public/dist/assets/bgtask-badge-HIrvpcr_.js +1 -0
  94. package/public/dist/assets/{bgtask-badge-oPvZyylH.js → bgtask-badge-tYRnplEV.js} +1 -1
  95. package/public/dist/assets/constants-_iw-lnKY.js +1 -0
  96. package/public/dist/assets/{employees-BchFBkDz.js → employees-DNTPcxtZ.js} +2 -2
  97. package/public/dist/assets/{error-normalize-clOi-AAA.js → error-normalize-jnjrKZDu.js} +1 -1
  98. package/public/dist/assets/{iframe-renderer-CcGzEi0v.js → iframe-renderer--lHbKTDh.js} +2 -2
  99. package/public/dist/assets/iframe-renderer-DigNC5FU.js +1 -0
  100. package/public/dist/assets/{manager-nquYZ7_x.js → manager-qGH-xUZ7.js} +1 -1
  101. package/public/dist/assets/{memory-DTpD4see.js → memory-BAdRkBdk.js} +1 -1
  102. package/public/dist/assets/memory-DA8x5314.js +1 -0
  103. package/public/dist/assets/message-history-CGOgZH4l.js +1 -0
  104. package/public/dist/assets/{message-history-DSvflaZ9.js → message-history-PAYeKmia.js} +1 -1
  105. package/public/dist/assets/page-shell-Cz2ylri8.js +1 -0
  106. package/public/dist/assets/{render-D8dVQ_bm.js → render-F6xF6w6c.js} +1 -1
  107. package/public/dist/assets/settings-DMbNzuTm.js +1 -0
  108. package/public/dist/assets/{settings-DMiQe469.js → settings-DZ2-ca8T.js} +1 -1
  109. package/public/dist/assets/{settings-Bp0sgQ2a.js → settings-W0WFhBf2.js} +1 -1
  110. package/public/dist/assets/settings-core-2vZXNf6n.js +2 -0
  111. package/public/dist/assets/settings-core-BofMyzL9.js +1 -0
  112. package/public/dist/assets/{settings-embedding-BRW0WZvh.js → settings-embedding-Bjwpe8xu.js} +2 -2
  113. package/public/dist/assets/{shared-D1begqvi.js → shared-CftvKNY9.js} +1 -1
  114. package/public/dist/assets/{sidebar-CrpBbYFg.js → sidebar-Clkqd78q.js} +3 -3
  115. package/public/dist/assets/{skills-Bx8U-gJa.js → skills-0aA-RuN9.js} +1 -1
  116. package/public/dist/assets/skills-SqmQXndw.js +1 -0
  117. package/public/dist/assets/{slash-commands-DkrGUOnC.js → slash-commands-4zHHXEeU.js} +1 -1
  118. package/public/dist/assets/slash-commands-D5LqONzL.js +1 -0
  119. package/public/dist/assets/{trace-drawer-Dbe5pTbf.js → trace-drawer-B4O0Tl1M.js} +1 -1
  120. package/public/dist/assets/{ui-rnVAM91F.js → ui-CVtGpivr.js} +1 -1
  121. package/public/dist/assets/ui-_cqgseFX.js +1 -0
  122. package/public/dist/index.html +1 -1
  123. package/public/dist/manager/index.html +1 -1
  124. package/public/dist/settings/index.html +1 -1
  125. package/public/js/constants.ts +5 -0
  126. package/public/js/features/employees.ts +3 -3
  127. package/public/js/features/heartbeat.ts +14 -1
  128. package/public/js/features/settings-core.ts +39 -13
  129. package/public/js/features/settings-types.ts +1 -1
  130. package/public/locales/en.json +2 -0
  131. package/public/locales/ja.json +2 -0
  132. package/public/locales/ko.json +2 -0
  133. package/public/locales/zh.json +2 -0
  134. package/public/manager/src/settings/SettingsShell.tsx +1 -1
  135. package/public/manager/src/settings/pages/Agent.tsx +137 -52
  136. package/public/manager/src/settings/pages/Heartbeat.tsx +6 -0
  137. package/public/manager/src/settings/pages/Memory.tsx +8 -6
  138. package/public/manager/src/settings/pages/ModelProvider.tsx +31 -6
  139. package/public/manager/src/settings/pages/Profile.tsx +2 -2
  140. package/public/manager/src/settings/pages/components/AsideSelectionFields.tsx +33 -0
  141. package/public/manager/src/settings/pages/components/AvatarCard.tsx +22 -34
  142. package/public/manager/src/settings/pages/components/PerCliRow.tsx +29 -1
  143. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +7 -6
  144. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +4 -4
  145. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +5 -0
  146. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -0
  147. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +3 -2
  148. package/public/manager/src/settings/pages/components/aside-models.ts +104 -0
  149. package/public/manager/src/settings/settings-client.ts +3 -1
  150. package/public/manager/src/settings/types.ts +1 -0
  151. package/public/dist/assets/Agent-O_U8ny90.js +0 -1
  152. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +0 -85
  153. package/public/dist/assets/Memory-C9I33pIi.js +0 -1
  154. package/public/dist/assets/ModelProvider-fiUktMaO.js +0 -1
  155. package/public/dist/assets/Profile-DUL7-RE_.js +0 -1
  156. package/public/dist/assets/agent-meta-94LMwZZK.js +0 -1
  157. package/public/dist/assets/app-Iu76iEiU.js +0 -59
  158. package/public/dist/assets/bgtask-badge-DHo2mkMI.js +0 -1
  159. package/public/dist/assets/constants-DmZ9Rjym.js +0 -1
  160. package/public/dist/assets/iframe-renderer-DSLsfZq8.js +0 -1
  161. package/public/dist/assets/memory-BgUF3M9l.js +0 -1
  162. package/public/dist/assets/message-history-DkB768L3.js +0 -1
  163. package/public/dist/assets/page-shell-DfinU3mb.js +0 -1
  164. package/public/dist/assets/settings-DxjoyiIM.js +0 -1
  165. package/public/dist/assets/settings-core-CXWmPKUE.js +0 -1
  166. package/public/dist/assets/settings-core-D4zGy72z.js +0 -2
  167. package/public/dist/assets/skills-BY-hQnqM.js +0 -1
  168. package/public/dist/assets/slash-commands-C53T9J3g.js +0 -1
  169. package/public/dist/assets/ui-C0o427q6.js +0 -1
@@ -0,0 +1,120 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { ASIDE_HISTORY_LIMIT, ASIDE_REPL_BYTES, AsideTransportError } from './aside-cli.js';
3
+ function malformed() { throw new AsideTransportError('invalid_replay'); }
4
+ function record(value) {
5
+ if (!value || typeof value !== 'object' || Array.isArray(value))
6
+ return malformed();
7
+ return value;
8
+ }
9
+ function string(value) { if (typeof value !== 'string')
10
+ return malformed(); return value; }
11
+ function contentText(value) {
12
+ if (typeof value === 'string')
13
+ return value;
14
+ if (value === undefined || value === null)
15
+ return null;
16
+ if (!Array.isArray(value) || value.length > 512)
17
+ return malformed();
18
+ const texts = [];
19
+ for (const block of value) {
20
+ const row = record(block);
21
+ if (row['type'] === 'text')
22
+ texts.push(string(row['text']));
23
+ }
24
+ return texts.length ? texts.join('') : null;
25
+ }
26
+ /** Parse once at the structured process boundary. Preserve storage order, never timestamps. */
27
+ export function parseAsideReplay(value, sessionId) {
28
+ if (Buffer.byteLength(JSON.stringify(value) ?? '') > ASIDE_REPL_BYTES)
29
+ throw new AsideTransportError('replay_limit');
30
+ const root = record(value), session = record(root['session']), before = record(root['before']);
31
+ if (session['id'] !== sessionId || before['id'] !== sessionId || session['status'] !== before['status']
32
+ || root['order'] !== 'desc' || root['limit'] !== ASIDE_HISTORY_LIMIT || root['truncated'] === true)
33
+ return malformed();
34
+ const status = string(session['status']);
35
+ const raw = root['messages'];
36
+ if (!Array.isArray(raw) || raw.length > ASIDE_HISTORY_LIMIT)
37
+ return malformed();
38
+ const messages = [...raw].reverse().map(value => {
39
+ const row = record(value), role = string(row['role']);
40
+ const message = { role, text: contentText(row['content']), receipt: createHash('sha256').update(JSON.stringify(row)).digest('hex') };
41
+ if (role === 'turn-lifecycle') {
42
+ message.event = string(row['event']);
43
+ message.turnId = string(row['turnId']);
44
+ if (!message.turnId || message.turnId.length > 128 || !['started', 'finished', 'aborted', 'error'].includes(message.event))
45
+ return malformed();
46
+ }
47
+ if (row['stopReason'] !== undefined)
48
+ message.stopReason = string(row['stopReason']);
49
+ if (row['completedAt'] !== undefined) {
50
+ if (typeof row['completedAt'] !== 'number' || !Number.isFinite(row['completedAt']) || row['completedAt'] <= 0)
51
+ return malformed();
52
+ message.completedAt = row['completedAt'];
53
+ }
54
+ return Object.freeze(message);
55
+ });
56
+ return Object.freeze({ sessionId, status, messages: Object.freeze(messages), full: raw.length < ASIDE_HISTORY_LIMIT });
57
+ }
58
+ export function captureAsideBaseline(replay) {
59
+ if (!replay)
60
+ return Object.freeze({ sessionId: null, anchor: null, turnIds: Object.freeze([]) });
61
+ const last = replay.messages.at(-1);
62
+ if (replay.status !== 'idle' || (last && (last.role !== 'turn-lifecycle' || last.event !== 'finished'))
63
+ || (!last && !replay.full))
64
+ throw new AsideTransportError('resume_not_idle');
65
+ return Object.freeze({ sessionId: replay.sessionId, anchor: last?.receipt ?? null,
66
+ turnIds: Object.freeze(replay.messages.filter(m => m.role === 'turn-lifecycle').map(m => m.turnId)) });
67
+ }
68
+ function newMessages(replay, baseline) {
69
+ if (baseline.sessionId !== null && baseline.sessionId !== replay.sessionId)
70
+ throw new AsideTransportError('replay_owner_mismatch');
71
+ if (baseline.anchor === null) {
72
+ if (!replay.full)
73
+ throw new AsideTransportError('replay_truncated');
74
+ return replay.messages;
75
+ }
76
+ const matches = replay.messages.map((m, i) => m.receipt === baseline.anchor ? i : -1).filter(i => i >= 0);
77
+ if (matches.length !== 1)
78
+ throw new AsideTransportError('baseline_missing');
79
+ return replay.messages.slice(matches[0] + 1);
80
+ }
81
+ export function inspectAsideInterval(replay, baseline, capturedTurnId) {
82
+ const messages = newMessages(replay, baseline);
83
+ const lifecycle = messages.filter(m => m.role === 'turn-lifecycle');
84
+ const starts = lifecycle.filter(m => m.event === 'started');
85
+ if (starts.length !== 1 || !starts[0]?.turnId || baseline.turnIds.includes(starts[0].turnId)
86
+ || (capturedTurnId !== undefined && capturedTurnId !== starts[0].turnId))
87
+ throw new AsideTransportError('ambiguous_turn');
88
+ const start = starts[0], turnId = start.turnId;
89
+ const startIndex = messages.indexOf(start);
90
+ // System metadata may precede creation; user/assistant/tool rows cannot precede the owned start.
91
+ if (messages.slice(0, startIndex).some(m => m.role !== 'system-message'))
92
+ throw new AsideTransportError('unowned_messages');
93
+ const terminals = lifecycle.filter(m => m.event !== 'started');
94
+ if (terminals.length > 1 || terminals.some(m => m.turnId !== turnId))
95
+ throw new AsideTransportError('ambiguous_terminal');
96
+ const terminal = terminals[0];
97
+ const body = messages.slice(startIndex + 1, terminal ? messages.indexOf(terminal) : undefined);
98
+ if (body.filter(m => m.role === 'user').length !== 1)
99
+ throw new AsideTransportError('ambiguous_input');
100
+ if (terminal && messages.at(-1) !== terminal)
101
+ throw new AsideTransportError('trailing_messages');
102
+ if (!terminal) {
103
+ return { turnId, outcome: null, interrupted: replay.status === 'interrupted' };
104
+ }
105
+ if (body.some(m => m.role === 'error' || m.stopReason === 'error')) {
106
+ return { turnId, outcome: { status: 'error', finalText: null, partialText: '' }, interrupted: false };
107
+ }
108
+ if (terminal.event === 'aborted')
109
+ return { turnId, outcome: { status: 'stopped', finalText: null, partialText: '' }, interrupted: false };
110
+ if (terminal.event === 'error')
111
+ return { turnId, outcome: { status: 'error', finalText: null, partialText: '' }, interrupted: false };
112
+ const finals = body.filter(m => m.role === 'assistant' && m.stopReason === 'stop');
113
+ const final = finals[0];
114
+ if (replay.status !== 'idle' || finals.length !== 1 || !final || final.text === null || final.completedAt === undefined
115
+ || body.at(-1) !== final || body.some(m => m.stopReason === 'aborted' || m.stopReason === 'length')) {
116
+ throw new AsideTransportError('incomplete_final');
117
+ }
118
+ return { turnId, outcome: { status: 'done', finalText: final.text, partialText: '' }, interrupted: false };
119
+ }
120
+ //# sourceMappingURL=aside-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aside-replay.js","sourceRoot":"","sources":["../../../src/agent/aside-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import { ASIDE_CLOSE_TIMEOUT_MS, ASIDE_KILL_TIMEOUT_MS, ASIDE_PROBE_TIMEOUT_MS, AsideTransportError, asideWithin, buildAsideRunArgs, buildAsideStopArgs, closeAsideCommand, createAsideHeaderReader, launchAsideCommand, observeAsideCallback, readAsideSession, safeAsideDiagnostic, } from './aside-cli.js';
2
+ import { captureAsideBaseline, inspectAsideInterval, parseAsideReplay } from './aside-replay.js';
3
+ export const ASIDE_TURN_TIMEOUT_MS = 10 * 60 * 1000;
4
+ const INTERRUPTED = 'Aside session interruption verified and local CLI closed. External tool physical completion is not proved; session cannot be reused.';
5
+ const UNCERTAIN = 'Aside cancellation is unresolved. Session cannot be reused; external tool physical completion is not proved.';
6
+ const CLOSE_UNCERTAIN = 'Aside local CLI closure is unconfirmed. Session cannot be reused.';
7
+ /** All dependencies are captured per owner; production has no test-mode switches. */
8
+ export function createAsideRuntime(dependencies = {}) {
9
+ const deps = { ...dependencies };
10
+ return function start(input, callbacks = {}) {
11
+ // Capture selectors, process environment and observers synchronously, before any read.
12
+ const captured = { ...input, selection: Object.freeze({ ...input.selection }), env: { ...input.env } };
13
+ const observers = { ...callbacks };
14
+ let cancelled = false, sealed = false;
15
+ let wakeCancel;
16
+ const cancellation = new Promise(resolve => { wakeCancel = resolve; });
17
+ let command;
18
+ const commands = new Set();
19
+ const captureCommand = (launched) => { commands.add(launched); return launched; };
20
+ const commandsClosed = () => [...commands].every(capturedCommand => capturedCommand.closed);
21
+ let sessionId = input.sessionId ?? null;
22
+ let receiptSeen = false;
23
+ let resolveReceipt;
24
+ const receipt = new Promise(resolve => { resolveReceipt = resolve; });
25
+ const probeMs = deps.probeMs ?? ASIDE_PROBE_TIMEOUT_MS;
26
+ const closeMs = deps.closeMs ?? ASIDE_CLOSE_TIMEOUT_MS;
27
+ const killMs = deps.killMs ?? ASIDE_KILL_TIMEOUT_MS;
28
+ let baseline = captureAsideBaseline();
29
+ const read = async (id) => {
30
+ const value = deps.read
31
+ ? await asideWithin(deps.read(captured, id), probeMs)
32
+ : await readAsideSession(captured, captured.selection, id, { ...deps, onCommand: captureCommand });
33
+ if (value === undefined)
34
+ throw new AsideTransportError('replay_timeout');
35
+ return parseAsideReplay(value, id);
36
+ };
37
+ function result(status, finalText, exitCode, diagnostic, cleanup = 'confirmed') {
38
+ if (!commandsClosed())
39
+ cleanup = 'uncertain';
40
+ return { status, finalText, partialText: '', sessionId, reusable: status === 'done' && cleanup === 'confirmed', exitCode, cleanup,
41
+ ...(diagnostic ? { diagnostic } : {}) };
42
+ }
43
+ async function cleanup() {
44
+ await Promise.all([...commands].map(capturedCommand => closeAsideCommand(capturedCommand, closeMs, killMs)));
45
+ return commandsClosed();
46
+ }
47
+ async function stopOwned(status = 'stopped', failure) {
48
+ let verified = false, terminal = false;
49
+ try {
50
+ if (!receiptSeen && command) {
51
+ await asideWithin(Promise.race([receipt, command.completion.then(() => null)]), probeMs);
52
+ }
53
+ if (receiptSeen && sessionId && command) {
54
+ // Capture the only new start before issuing control. No current-session lookup.
55
+ const before = await read(sessionId);
56
+ const interval = inspectAsideInterval(before, baseline);
57
+ if (interval.outcome === null && !interval.interrupted) {
58
+ const control = captureCommand(launchAsideCommand(captured, buildAsideStopArgs(captured.selection, sessionId), { ...(deps.spawn ? { spawn: deps.spawn } : {}) }));
59
+ const stopped = await asideWithin(control.completion, probeMs);
60
+ if (!stopped)
61
+ await closeAsideCommand(control, closeMs, killMs);
62
+ if (stopped && stopped.exitCode === 0 && !stopped.failed && !stopped.overflow
63
+ && safeAsideDiagnostic(stopped.stdout).trim() === 'interrupted' && !stopped.stderr.trim()) {
64
+ const after = inspectAsideInterval(await read(sessionId), baseline, interval.turnId);
65
+ terminal = after.outcome !== null;
66
+ verified = (after.interrupted && after.outcome === null) || terminal;
67
+ }
68
+ }
69
+ else if (interval.outcome !== null) {
70
+ terminal = true;
71
+ verified = true;
72
+ }
73
+ else if (interval.interrupted && interval.outcome === null) {
74
+ // Existing exact owned interruption still needs local child closure.
75
+ verified = true;
76
+ }
77
+ }
78
+ }
79
+ catch { /* A safe unresolved diagnostic is the control result, never a guessed stop. */ }
80
+ const closed = await cleanup();
81
+ const exit = command?.closed ? (await command.completion).exitCode : null;
82
+ const confirmed = closed && verified;
83
+ const diagnostic = confirmed
84
+ ? terminal ? 'Aside owned terminal verified and local CLI closed; final withheld.' : INTERRUPTED
85
+ : `${UNCERTAIN}${closed ? '' : ` ${CLOSE_UNCERTAIN}`}`;
86
+ return result(status, null, exit, failure ? `${failure} ${diagnostic}` : diagnostic, confirmed ? 'confirmed' : 'uncertain');
87
+ }
88
+ async function execute() {
89
+ try {
90
+ const args = buildAsideRunArgs(captured);
91
+ if (captured.sessionId !== undefined) {
92
+ baseline = captureAsideBaseline(await read(captured.sessionId));
93
+ }
94
+ if (cancelled)
95
+ return result('stopped', null, null, 'Aside run cancelled before dispatch.');
96
+ const header = createAsideHeaderReader(captured.sessionId);
97
+ const report = (text) => {
98
+ if (!cancelled && !sealed)
99
+ observeAsideCallback(observers.onOutput, safeAsideDiagnostic(text));
100
+ };
101
+ command = captureCommand(launchAsideCommand(captured, args, {
102
+ ...(deps.spawn ? { spawn: deps.spawn } : {}),
103
+ onStdout: report,
104
+ onStderr: text => {
105
+ const id = header(text);
106
+ if (id && !receiptSeen) {
107
+ sessionId = id;
108
+ receiptSeen = true;
109
+ resolveReceipt(id);
110
+ observeAsideCallback(observers.onSession, id);
111
+ }
112
+ report(text);
113
+ },
114
+ }));
115
+ observeAsideCallback(observers.onChild, command.child);
116
+ const admitted = await asideWithin(Promise.race([
117
+ receipt.then(() => 'receipt'), command.completion.then(() => 'closed'),
118
+ cancellation.then(() => 'cancel'),
119
+ ]), probeMs);
120
+ if (!admitted || cancelled) {
121
+ cancelled = true;
122
+ return await stopOwned();
123
+ }
124
+ const completion = await asideWithin(Promise.race([
125
+ command.completion.then(value => ({ kind: 'closed', value })),
126
+ cancellation.then(() => ({ kind: 'cancel' })),
127
+ ]), deps.turnMs ?? ASIDE_TURN_TIMEOUT_MS);
128
+ if (cancelled || completion?.kind === 'cancel' || !completion) {
129
+ cancelled = true;
130
+ return await stopOwned();
131
+ }
132
+ if (!receiptSeen || !sessionId)
133
+ throw new AsideTransportError('session_receipt_missing');
134
+ if (completion.value.failed || completion.value.overflow || completion.value.exitCode !== 0)
135
+ throw new AsideTransportError('agent_transport_failed');
136
+ const replay = await read(sessionId);
137
+ if (cancelled)
138
+ return await stopOwned();
139
+ const interval = inspectAsideInterval(replay, baseline);
140
+ if (!interval.outcome)
141
+ throw new AsideTransportError('terminal_missing');
142
+ // No callbacks after authoritative selection, so observers cannot trigger re-selection.
143
+ sealed = true;
144
+ return result(interval.outcome.status, interval.outcome.finalText, completion.value.exitCode, interval.outcome.status === 'done' ? undefined : 'Aside owned turn did not complete successfully.');
145
+ }
146
+ catch (error) {
147
+ const diagnostic = error instanceof AsideTransportError ? error.message : 'Aside runtime boundary failed.';
148
+ if (command)
149
+ return await stopOwned(cancelled ? 'stopped' : 'error', cancelled ? undefined : diagnostic);
150
+ // Baseline preparation can launch a probe even before main admission.
151
+ const closed = await cleanup();
152
+ return result(cancelled ? 'stopped' : 'error', null, null, diagnostic, closed ? 'confirmed' : 'uncertain');
153
+ }
154
+ finally {
155
+ sealed = true;
156
+ }
157
+ }
158
+ const pending = execute();
159
+ return {
160
+ result: pending,
161
+ commandsClosed,
162
+ closeCommands: cleanup,
163
+ cancel() {
164
+ // Synchronous latch precedes every await and is idempotent after terminal selection.
165
+ if (!sealed) {
166
+ cancelled = true;
167
+ wakeCancel();
168
+ }
169
+ return pending.then(() => undefined);
170
+ },
171
+ };
172
+ };
173
+ }
174
+ export const startAsideRun = createAsideRuntime();
175
+ //# sourceMappingURL=aside-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aside-runtime.js","sourceRoot":"","sources":["../../../src/agent/aside-runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EACrE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EACvE,iBAAiB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,oBAAoB,EACpF,gBAAgB,EAAE,mBAAmB,GACxC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAsB,MAAM,mBAAmB,CAAC;AAuBrH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACpD,MAAM,WAAW,GAAG,sIAAsI,CAAC;AAC3J,MAAM,SAAS,GAAG,8GAA8G,CAAC;AACjI,MAAM,eAAe,GAAG,mEAAmE,CAAC;AAE5F,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,eAAyC,EAAE;IAC1E,MAAM,IAAI,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO,SAAS,KAAK,CAAC,KAAoB,EAAE,YAA+B,EAAE;QACzE,uFAAuF;QACvF,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QACvG,MAAM,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACnC,IAAI,SAAS,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QACtC,IAAI,UAAuB,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAiC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;QACzC,MAAM,cAAc,GAAG,CAAC,QAAsB,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChG,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5F,IAAI,SAAS,GAAkB,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC;QACvD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,cAAqC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC;QACpD,IAAI,QAAQ,GAAkB,oBAAoB,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,EAAE,EAAU,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;gBACnB,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC;gBACrD,CAAC,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;YACvG,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;YACzE,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,SAAS,MAAM,CAAC,MAAoC,EAAE,SAAwB,EAAE,QAAuB,EAAE,UAAmB,EAAE,UAAqC,WAAW;YAC1K,IAAI,CAAC,cAAc,EAAE;gBAAE,OAAO,GAAG,WAAW,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW,EAAE,QAAQ,EAAE,OAAO;gBAC7H,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAChD,CAAC;QACD,KAAK,UAAU,OAAO;YAClB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,iBAAiB,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7G,OAAO,cAAc,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,UAAU,SAAS,CAAC,SAA8B,SAAS,EAAE,OAAgB;YAC9E,IAAI,QAAQ,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;YACvC,IAAI,CAAC;gBACD,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;oBAC1B,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7F,CAAC;gBACD,IAAI,WAAW,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;oBACtC,gFAAgF;oBAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;oBACrC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACxD,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBACrD,MAAM,OAAO,GAAG,cAAc,CAAC,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBAClK,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBAC/D,IAAI,CAAC,OAAO;4BAAE,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;wBAChE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ;+BACtE,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;4BAC5F,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;4BACrF,QAAQ,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;4BAClC,QAAQ,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC;wBACzE,CAAC;oBACL,CAAC;yBAAM,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;wBACnC,QAAQ,GAAG,IAAI,CAAC;wBAAC,QAAQ,GAAG,IAAI,CAAC;oBACrC,CAAC;yBAAM,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;wBAC3D,qEAAqE;wBACrE,QAAQ,GAAG,IAAI,CAAC;oBACpB,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,MAAM,CAAC,CAAC,+EAA+E,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,MAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,CAAC;YACrC,MAAM,UAAU,GAAG,SAAS;gBACxB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qEAAqE,CAAC,CAAC,CAAC,WAAW;gBAChG,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAChI,CAAC;QACD,KAAK,UAAU,OAAO;YAClB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACnC,QAAQ,GAAG,oBAAoB,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,IAAI,SAAS;oBAAE,OAAO,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,sCAAsC,CAAC,CAAC;gBAC5F,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;oBAC5B,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;wBAAE,oBAAoB,CAAC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnG,CAAC,CAAC;gBACF,OAAO,GAAG,cAAc,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE;oBACxD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,QAAQ,EAAE,MAAM;oBAChB,QAAQ,EAAE,IAAI,CAAC,EAAE;wBACb,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;wBACxB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;4BACrB,SAAS,GAAG,EAAE,CAAC;4BAAC,WAAW,GAAG,IAAI,CAAC;4BAAC,cAAc,CAAC,EAAE,CAAC,CAAC;4BACvD,oBAAoB,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;wBAClD,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,CAAC;oBACjB,CAAC;iBACJ,CAAC,CAAC,CAAC;gBACJ,oBAAoB,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAkB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAiB,CAAC;oBACxF,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAiB,CAAC;iBAC7C,CAAC,EAAE,OAAO,CAAC,CAAC;gBACb,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACzB,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO,MAAM,SAAS,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC9C,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;oBACtE,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAC;iBACzD,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC,CAAC;gBAC1C,IAAI,SAAS,IAAI,UAAU,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC5D,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO,MAAM,SAAS,EAAE,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;gBACzF,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC;oBAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;gBACrJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrC,IAAI,SAAS;oBAAE,OAAO,MAAM,SAAS,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACxD,IAAI,CAAC,QAAQ,CAAC,OAAO;oBAAE,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;gBACzE,wFAAwF;gBACxF,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,EACxF,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC;YAC5G,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;gBAC3G,IAAI,OAAO;oBAAE,OAAO,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACzG,sEAAsE;gBACtE,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC/G,CAAC;oBAAS,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC;YAAC,CAAC;QAChC,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QAC1B,OAAO;YACH,MAAM,EAAE,OAAO;YACf,cAAc;YACd,aAAa,EAAE,OAAO;YACtB,MAAM;gBACF,qFAAqF;gBACrF,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,SAAS,GAAG,IAAI,CAAC;oBAAC,UAAU,EAAE,CAAC;gBAAC,CAAC;gBAChD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;SACJ,CAAC;IACN,CAAC,CAAC;AACN,CAAC;AACD,MAAM,CAAC,MAAM,aAAa,GAGtB,kBAAkB,EAAE,CAAC"}
@@ -136,7 +136,7 @@ function performedSideEffects(ctx) {
136
136
  * ended in error has already stopped waiting (observed 2026-09-28: "You've hit
137
137
  * your session limit" ended every Claude turn while Cursor was idle). */
138
138
  export function pickNativeFallbackCli(cli, opts, toolLog) {
139
- if (opts.internal || opts._isFallback)
139
+ if (cli === 'aside' || opts.internal || opts._isFallback)
140
140
  return null;
141
141
  if (toolLog.some(tool => !REPEATABLE_TOOL_TYPES.has(tool.toolType)))
142
142
  return null;
@@ -158,7 +158,7 @@ export function setMainMetaHandler(fn) {
158
158
  * retirement check has to run before detection.
159
159
  */
160
160
  export function isLiveFallbackCandidate(fc, currentCli, detect, coolingDown) {
161
- return fc !== currentCli
161
+ return fc !== 'aside' && currentCli !== 'aside' && fc !== currentCli
162
162
  && !isRetiredCliSelection(fc)
163
163
  && detect(fc).available
164
164
  && !coolingDown(fc);
@@ -210,6 +210,7 @@ export async function handleAgentExit(params) {
210
210
  const nativeTraceRunId = ctx.traceRunId;
211
211
  const effectiveProvider = params.effectiveProvider;
212
212
  const runtimeCli = cli;
213
+ const workingDir = params.workingDir ?? settings['workingDir'];
213
214
  const effortVal = cfg.effort || effortDefault;
214
215
  // Every runtime now has a bucket of its own keyed by scope (073 §2.1), so the guard
215
216
  // 072 put here is gone: instead of refusing to touch shared state, each session
@@ -267,7 +268,7 @@ export async function handleAgentExit(params) {
267
268
  }
268
269
  };
269
270
  // ─── Smoke response auto-continuation ───
270
- if (nativeOutcome === undefined
271
+ if (cli !== 'aside' && nativeOutcome === undefined
271
272
  && smokeResult.isSmoke
272
273
  && smokeResult.confidence !== 'low'
273
274
  && !opts._isSmokeContinuation
@@ -287,6 +288,8 @@ export async function handleAgentExit(params) {
287
288
  sessionId: smokeSessionId, isFallback: opts._isFallback === true,
288
289
  code, cli, model, provider: effectiveProvider, resumeKey: params.resumeKey, effort: effortVal,
289
290
  skipSessionPersist: opts._skipSessionPersist === true,
291
+ ...(params.workingDir !== undefined ? { workingDir: params.workingDir } : {}),
292
+ ...(params.permissions !== undefined ? { permissions: params.permissions } : {}),
290
293
  outputLen: params.outputLen,
291
294
  ...(params.codexAppBucket ? { codexAppBucket: params.codexAppBucket } : {}),
292
295
  runtimeTransport: params.runtimeTransport,
@@ -344,7 +347,7 @@ export async function handleAgentExit(params) {
344
347
  // One row owns a run: when a final answer also exists, that row takes it below.
345
348
  const salvageRunId = nativeOutcome.finalText === null ? nativeTraceRunId || null : null;
346
349
  const salvageContent = '⏹️ [interrupted]\n\n' + nativeOutcome.partialText;
347
- const info = insertMessageWithTraceRun.run('assistant', salvageContent, cli, model, ctx.traceLog.join('\n') || null, serializeSanitizedToolLog(partialTools), settings['workingDir'] || null, salvageRunId, chatSessionId);
350
+ const info = insertMessageWithTraceRun.run('assistant', salvageContent, cli, model, ctx.traceLog.join('\n') || null, serializeSanitizedToolLog(partialTools), workingDir || null, salvageRunId, chatSessionId);
348
351
  const messageId = Number(info.lastInsertRowid);
349
352
  if (salvageRunId && Number.isSafeInteger(messageId) && messageId > 0) {
350
353
  try {
@@ -365,7 +368,7 @@ export async function handleAgentExit(params) {
365
368
  try {
366
369
  const { autoCompactRefresh } = await import('../core/compact.js');
367
370
  await autoCompactRefresh({
368
- workDir: settings["workingDir"] || '',
371
+ workDir: workingDir || '',
369
372
  instructions: prompt || '',
370
373
  cli,
371
374
  model,
@@ -386,6 +389,8 @@ export async function handleAgentExit(params) {
386
389
  sessionId: persistedSessionId, isFallback: opts._isFallback === true,
387
390
  code, wasKilled, cli, model, provider: effectiveProvider, resumeKey: params.resumeKey, effort: effortVal,
388
391
  skipSessionPersist: opts._skipSessionPersist === true,
392
+ ...(params.workingDir !== undefined ? { workingDir: params.workingDir } : {}),
393
+ ...(params.permissions !== undefined ? { permissions: params.permissions } : {}),
389
394
  outputLen: params.outputLen,
390
395
  ...(params.codexAppBucket ? { codexAppBucket: params.codexAppBucket } : {}),
391
396
  runtimeTransport: params.runtimeTransport,
@@ -398,7 +403,7 @@ export async function handleAgentExit(params) {
398
403
  const checkpointSeen = ctx.metadata?.['agyCheckpointSeen'] === true;
399
404
  const plannerOnly = ctx.metadata?.['agyPlannerOnly'] === true;
400
405
  const clean = code === 0 && !wasKilled && !ctx.stallReason && !plannerOnly && !checkpointSeen;
401
- updateSessionBucketLastRun.run(clean ? 1 : 0, settings['workingDir'] || '', JSON.stringify({ checkpointSeen, plannerOnly, exitCode: code, at: Date.now() }), runBucket);
406
+ updateSessionBucketLastRun.run(clean ? 1 : 0, workingDir || '', JSON.stringify({ checkpointSeen, plannerOnly, exitCode: code, at: Date.now() }), runBucket);
402
407
  }
403
408
  // ─── Phase 54-A: Proactive compact by turn count ───
404
409
  // CLIs without a reliable native compact/resume path get a conservative
@@ -412,7 +417,7 @@ export async function handleAgentExit(params) {
412
417
  if (getSessionBucket.get(runBucket)?.session_id === persistedSessionId) {
413
418
  console.log(`[jaw:compact] ${cli} reached ${turns} turns — forcing auto-refresh`);
414
419
  await autoCompactRefresh({
415
- workDir: settings["workingDir"] || '',
420
+ workDir: workingDir || '',
416
421
  instructions: prompt || '',
417
422
  cli,
418
423
  model,
@@ -501,7 +506,7 @@ export async function handleAgentExit(params) {
501
506
  if (!peekPendingBootstrapPrompt(scopeKey)) {
502
507
  const { autoCompactRefresh } = await import('../core/compact.js');
503
508
  await autoCompactRefresh({
504
- workDir: settings["workingDir"] || null, instructions: '', cli, model, scopeKey,
509
+ workDir: workingDir || null, instructions: '', cli, model, scopeKey,
505
510
  chatSessionId,
506
511
  sessionBucket: runBucket,
507
512
  });
@@ -582,7 +587,7 @@ export async function handleAgentExit(params) {
582
587
  }
583
588
  // trace_run_id is nullable TEXT, not a FK: missing journal rows
584
589
  // cannot suppress final delivery or this history pointer.
585
- const info = insertMessageWithTraceRun.run('assistant', finalContent, cli, model, ctx.traceLog.join('\n') || null, serializeSanitizedToolLog(safeTools), settings['workingDir'] || null, nativeTraceRunId || null, chatSessionId);
590
+ const info = insertMessageWithTraceRun.run('assistant', finalContent, cli, model, ctx.traceLog.join('\n') || null, serializeSanitizedToolLog(safeTools), workingDir || null, nativeTraceRunId || null, chatSessionId);
586
591
  const messageId = Number(info.lastInsertRowid);
587
592
  if (nativeTraceRunId && Number.isSafeInteger(messageId) && messageId > 0) {
588
593
  try {
@@ -618,8 +623,11 @@ export async function handleAgentExit(params) {
618
623
  // A turn being handed to a fallback runtime is not the answer yet: its
619
624
  // diagnostic and error tag would reach the Slack forwarder as an error
620
625
  // block in the user's thread, ahead of the answer that follows.
621
- const terminalText = nativeFallbackCli ? '' : compatibilityText || (nativeOutcome.status === 'error'
626
+ const terminalText = nativeFallbackCli ? '' : compatibilityText || ((nativeOutcome.status === 'error'
627
+ || (cli === 'aside' && ctx.metadata?.['asideCleanup'] === 'uncertain'))
622
628
  && ctx.runtimeDiagnostic?.trim() ? `❌ ${ctx.runtimeDiagnostic.trim()}` : '');
629
+ if (cli === 'aside')
630
+ ctx.runtimeTerminalAttempted = true;
623
631
  broadcast('agent_done', {
624
632
  ...donePin,
625
633
  ...(nativeTraceRunId ? { traceRunId: nativeTraceRunId } : {}),
@@ -727,7 +735,7 @@ export async function handleAgentExit(params) {
727
735
  const liveRun = getLiveRun(liveScope);
728
736
  const sanitizedToolLog = sanitizeToolLogForDurableStorage(mergeLatestTools(ctx.toolLog, liveRun.toolLog, ctx.traceRunId || ''));
729
737
  const toolLogJson = serializeSanitizedToolLog(sanitizedToolLog);
730
- const info = insertMessageWithTraceRun.run('assistant', finalContent, cli, model, traceText || null, toolLogJson, settings["workingDir"] || null, ctx.traceRunId || null, chatSessionId);
738
+ const info = insertMessageWithTraceRun.run('assistant', finalContent, cli, model, traceText || null, toolLogJson, workingDir || null, ctx.traceRunId || null, chatSessionId);
731
739
  const messageId = Number(info.lastInsertRowid || 0);
732
740
  if (ctx.traceRunId && Number.isInteger(messageId) && messageId > 0) {
733
741
  try {
@@ -768,7 +776,7 @@ export async function handleAgentExit(params) {
768
776
  // channel's generic "no response" message.
769
777
  const { message: errMsg, errorKind } = classifyExitError(runtimeCli, code, ctx.stderrBuf, ctx.stallReason, `${ctx.fullText}\n${ctx.traceLog.join('\n')}`);
770
778
  if (mainManaged && !opts.internal) {
771
- insertMessage.run('assistant', errMsg, cli, model, settings["workingDir"] || null, chatSessionId);
779
+ insertMessage.run('assistant', errMsg, cli, model, workingDir || null, chatSessionId);
772
780
  }
773
781
  broadcast('agent_done',
774
782
  // Classified like the retry-exhausted site below: a watchdog kill is
@@ -820,7 +828,7 @@ export async function handleAgentExit(params) {
820
828
  console.log(`[jaw:session] invalidated stale resume — ${cli}/${bucket} bucket cleared (scope ${scopeKey})`);
821
829
  }
822
830
  else {
823
- updateSession.run(cli, null, model, settings["permissions"], settings["workingDir"], effortVal);
831
+ updateSession.run(cli, null, model, settings["permissions"], workingDir, effortVal);
824
832
  const bucket = runBucket;
825
833
  if (bucket)
826
834
  clearSessionBucket.run(bucket);
@@ -862,14 +870,14 @@ export async function handleAgentExit(params) {
862
870
  try {
863
871
  const { autoCompactRefresh } = await import('../core/compact.js');
864
872
  await autoCompactRefresh({
865
- workDir: settings["workingDir"] || null, instructions: '', cli, model, scopeKey,
873
+ workDir: workingDir || null, instructions: '', cli, model, scopeKey,
866
874
  chatSessionId,
867
875
  sessionBucket: runBucket,
868
876
  });
869
877
  }
870
878
  catch { }
871
879
  }
872
- insertMessage.run('assistant', `⏱️ ${errMsg}`, cli, model, settings["workingDir"] || null, chatSessionId);
880
+ insertMessage.run('assistant', `⏱️ ${errMsg}`, cli, model, workingDir || null, chatSessionId);
873
881
  }
874
882
  broadcast('agent_done', { ...runTag(ctx), ...donePin, text: `❌ ${errMsg}`, error: true, errorKind, cli: runtimeCli, origin, ...empTag, ...(wasSteer ? { steered: true } : {}) }, isEmployee ? 'internal' : 'public');
875
883
  finalizeRun('error', errMsg);
@@ -951,7 +959,7 @@ export async function handleAgentExit(params) {
951
959
  if (!peekPendingBootstrapPrompt(scopeKey)) {
952
960
  const { autoCompactRefresh } = await import('../core/compact.js');
953
961
  await autoCompactRefresh({
954
- workDir: settings["workingDir"] || null, instructions: '', cli, model, scopeKey,
962
+ workDir: workingDir || null, instructions: '', cli, model, scopeKey,
955
963
  chatSessionId,
956
964
  sessionBucket: runBucket,
957
965
  });
@@ -1155,8 +1163,8 @@ export async function handleAgentExit(params) {
1155
1163
  // and execute it so the continuation loop stops.
1156
1164
  const controlText = resolvedOutcome === undefined ? ctx.fullText
1157
1165
  : resolvedOutcome.status === 'done' ? resolvedOutcome.finalText ?? '' : '';
1158
- const allowNativeContinuation = resolvedOutcome === undefined
1159
- || (resolvedOutcome.status === 'done' && resolvedOutcome.finalText !== null);
1166
+ const allowNativeContinuation = cli !== 'aside' && (resolvedOutcome === undefined
1167
+ || (resolvedOutcome.status === 'done' && resolvedOutcome.finalText !== null));
1160
1168
  let goalDoneRejected = false;
1161
1169
  if (mainManaged && !opts.internal && controlText) {
1162
1170
  const activeGoal = getActiveGoal();