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.
- package/README.md +16 -0
- package/dist/src/agent/aside-catalog.js +339 -0
- package/dist/src/agent/aside-catalog.js.map +1 -0
- package/dist/src/agent/aside-cli.js +208 -0
- package/dist/src/agent/aside-cli.js.map +1 -0
- package/dist/src/agent/aside-replay.js +120 -0
- package/dist/src/agent/aside-replay.js.map +1 -0
- package/dist/src/agent/aside-runtime.js +175 -0
- package/dist/src/agent/aside-runtime.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +26 -18
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +3 -0
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/prompt-context.js +2 -2
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/session-persistence.js +2 -0
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/backend-aside.js +314 -0
- package/dist/src/agent/spawn/backend-aside.js.map +1 -0
- package/dist/src/agent/spawn/resume.js +3 -0
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn-env.js +5 -0
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +60 -6
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/cli-status-worker.js +2 -1
- package/dist/src/cli/cli-status-worker.js.map +1 -1
- package/dist/src/cli/employee-handler.js +2 -0
- package/dist/src/cli/employee-handler.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +20 -8
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +2 -0
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/readiness.js +7 -3
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +47 -0
- package/dist/src/cli/registry-live.js.map +1 -1
- package/dist/src/cli/registry.js +5 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/config.js +10 -3
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/employees.js +5 -3
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/settings-merge.js +35 -0
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +10 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +2 -0
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/routes/employees.js +8 -0
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +4 -0
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/orchestrate.js +22 -3
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +23 -0
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/shared/aside-contract.js +2 -0
- package/dist/src/shared/aside-contract.js.map +1 -0
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +186 -175
- package/public/dist/assets/{Activity-DPLlOJ46.js → Activity-DsBgOkCP.js} +1 -1
- package/public/dist/assets/{AdvancedExport-BgOgGvc5.js → AdvancedExport-COGQ7vbK.js} +1 -1
- package/public/dist/assets/Agent-6qGQN7lY.js +1 -0
- package/public/dist/assets/AsideSelectionFields-DvU5xWAP.js +1 -0
- package/public/dist/assets/{Browser-m6VynQXV.js → Browser-r09vOsR1.js} +1 -1
- package/public/dist/assets/ChannelEnablementControl-ooOkdd-Q.js +85 -0
- package/public/dist/assets/{ChannelSetupEntry-DHLoZEzJ.js → ChannelSetupEntry-B0b4TdhH.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-B-G8vsYy.js → ChannelsDiscord-9EMLt5b3.js} +1 -1
- package/public/dist/assets/{ChannelsSlack-oPuh922z.js → ChannelsSlack-B8ETzWFt.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-PmTv43KQ.js → ChannelsTelegram-CflLUsQw.js} +1 -1
- package/public/dist/assets/{DashboardMeta-BqEiJrvr.js → DashboardMeta-wjEuh9-E.js} +1 -1
- package/public/dist/assets/{Developer-CbySB7_Z.js → Developer-B3cDkldo.js} +1 -1
- package/public/dist/assets/{Display-DU4_76cS.js → Display-BXQxpv6-.js} +1 -1
- package/public/dist/assets/{Display-C0Zdamcb.js → Display-Cl4DD334.js} +1 -1
- package/public/dist/assets/{Embedding-CCFMOB_2.js → Embedding-D-T92-En.js} +1 -1
- package/public/dist/assets/{Employees-BanvF58d.js → Employees-Cf4IeF0N.js} +1 -1
- package/public/dist/assets/{Heartbeat-uyi_MpUd.js → Heartbeat-Bj8V_bUM.js} +1 -1
- package/public/dist/assets/{Mcp-rjPoL_Zo.js → Mcp-jAcut_fw.js} +1 -1
- package/public/dist/assets/Memory-BOXkBFKg.js +1 -0
- package/public/dist/assets/ModelProvider-DIDQ37z-.js +1 -0
- package/public/dist/assets/{Network-CuqFrOvR.js → Network-I5eOe2hf.js} +1 -1
- package/public/dist/assets/{Permissions-BltXiZnz.js → Permissions-B7PthH01.js} +1 -1
- package/public/dist/assets/{Permissions-DcCbFMIq.js → Permissions-BCYUfJg1.js} +1 -1
- package/public/dist/assets/Profile-CYPMVhQM.js +1 -0
- package/public/dist/assets/{Prompts-C9vY8ivQ.js → Prompts-BRAgZLNQ.js} +1 -1
- package/public/dist/assets/{SpeechKeys-BJ8V7U5E.js → SpeechKeys-UlXNSFoe.js} +1 -1
- package/public/dist/assets/{TelegramHub-DtyjLGFR.js → TelegramHub-BhUFhIcv.js} +1 -1
- package/public/dist/assets/agent-meta-v4jNRAbX.js +1 -0
- package/public/dist/assets/app-SVIyP1TT.js +59 -0
- package/public/dist/assets/bgtask-badge-HIrvpcr_.js +1 -0
- package/public/dist/assets/{bgtask-badge-oPvZyylH.js → bgtask-badge-tYRnplEV.js} +1 -1
- package/public/dist/assets/constants-_iw-lnKY.js +1 -0
- package/public/dist/assets/{employees-BchFBkDz.js → employees-DNTPcxtZ.js} +2 -2
- package/public/dist/assets/{error-normalize-clOi-AAA.js → error-normalize-jnjrKZDu.js} +1 -1
- package/public/dist/assets/{iframe-renderer-CcGzEi0v.js → iframe-renderer--lHbKTDh.js} +2 -2
- package/public/dist/assets/iframe-renderer-DigNC5FU.js +1 -0
- package/public/dist/assets/{manager-nquYZ7_x.js → manager-qGH-xUZ7.js} +1 -1
- package/public/dist/assets/{memory-DTpD4see.js → memory-BAdRkBdk.js} +1 -1
- package/public/dist/assets/memory-DA8x5314.js +1 -0
- package/public/dist/assets/message-history-CGOgZH4l.js +1 -0
- package/public/dist/assets/{message-history-DSvflaZ9.js → message-history-PAYeKmia.js} +1 -1
- package/public/dist/assets/page-shell-Cz2ylri8.js +1 -0
- package/public/dist/assets/{render-D8dVQ_bm.js → render-F6xF6w6c.js} +1 -1
- package/public/dist/assets/settings-DMbNzuTm.js +1 -0
- package/public/dist/assets/{settings-DMiQe469.js → settings-DZ2-ca8T.js} +1 -1
- package/public/dist/assets/{settings-Bp0sgQ2a.js → settings-W0WFhBf2.js} +1 -1
- package/public/dist/assets/settings-core-2vZXNf6n.js +2 -0
- package/public/dist/assets/settings-core-BofMyzL9.js +1 -0
- package/public/dist/assets/{settings-embedding-BRW0WZvh.js → settings-embedding-Bjwpe8xu.js} +2 -2
- package/public/dist/assets/{shared-D1begqvi.js → shared-CftvKNY9.js} +1 -1
- package/public/dist/assets/{sidebar-CrpBbYFg.js → sidebar-Clkqd78q.js} +3 -3
- package/public/dist/assets/{skills-Bx8U-gJa.js → skills-0aA-RuN9.js} +1 -1
- package/public/dist/assets/skills-SqmQXndw.js +1 -0
- package/public/dist/assets/{slash-commands-DkrGUOnC.js → slash-commands-4zHHXEeU.js} +1 -1
- package/public/dist/assets/slash-commands-D5LqONzL.js +1 -0
- package/public/dist/assets/{trace-drawer-Dbe5pTbf.js → trace-drawer-B4O0Tl1M.js} +1 -1
- package/public/dist/assets/{ui-rnVAM91F.js → ui-CVtGpivr.js} +1 -1
- package/public/dist/assets/ui-_cqgseFX.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/js/constants.ts +5 -0
- package/public/js/features/employees.ts +3 -3
- package/public/js/features/heartbeat.ts +14 -1
- package/public/js/features/settings-core.ts +39 -13
- package/public/js/features/settings-types.ts +1 -1
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/settings/SettingsShell.tsx +1 -1
- package/public/manager/src/settings/pages/Agent.tsx +137 -52
- package/public/manager/src/settings/pages/Heartbeat.tsx +6 -0
- package/public/manager/src/settings/pages/Memory.tsx +8 -6
- package/public/manager/src/settings/pages/ModelProvider.tsx +31 -6
- package/public/manager/src/settings/pages/Profile.tsx +2 -2
- package/public/manager/src/settings/pages/components/AsideSelectionFields.tsx +33 -0
- package/public/manager/src/settings/pages/components/AvatarCard.tsx +22 -34
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +29 -1
- package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +7 -6
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +4 -4
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +5 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -0
- package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +3 -2
- package/public/manager/src/settings/pages/components/aside-models.ts +104 -0
- package/public/manager/src/settings/settings-client.ts +3 -1
- package/public/manager/src/settings/types.ts +1 -0
- package/public/dist/assets/Agent-O_U8ny90.js +0 -1
- package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +0 -85
- package/public/dist/assets/Memory-C9I33pIi.js +0 -1
- package/public/dist/assets/ModelProvider-fiUktMaO.js +0 -1
- package/public/dist/assets/Profile-DUL7-RE_.js +0 -1
- package/public/dist/assets/agent-meta-94LMwZZK.js +0 -1
- package/public/dist/assets/app-Iu76iEiU.js +0 -59
- package/public/dist/assets/bgtask-badge-DHo2mkMI.js +0 -1
- package/public/dist/assets/constants-DmZ9Rjym.js +0 -1
- package/public/dist/assets/iframe-renderer-DSLsfZq8.js +0 -1
- package/public/dist/assets/memory-BgUF3M9l.js +0 -1
- package/public/dist/assets/message-history-DkB768L3.js +0 -1
- package/public/dist/assets/page-shell-DfinU3mb.js +0 -1
- package/public/dist/assets/settings-DxjoyiIM.js +0 -1
- package/public/dist/assets/settings-core-CXWmPKUE.js +0 -1
- package/public/dist/assets/settings-core-D4zGy72z.js +0 -2
- package/public/dist/assets/skills-BY-hQnqM.js +0 -1
- package/public/dist/assets/slash-commands-C53T9J3g.js +0 -1
- 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":"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"}
|
|
@@ -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),
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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),
|
|
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,
|
|
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,
|
|
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"],
|
|
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:
|
|
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,
|
|
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:
|
|
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();
|