@roackb2/heddle 0.0.26 → 0.0.28
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 +20 -0
- package/dist/src/cli/ask.d.ts +5 -0
- package/dist/src/cli/ask.d.ts.map +1 -1
- package/dist/src/cli/ask.js +165 -2
- package/dist/src/cli/ask.js.map +1 -1
- package/dist/src/cli/chat/App.d.ts.map +1 -1
- package/dist/src/cli/chat/App.js +114 -8
- package/dist/src/cli/chat/App.js.map +1 -1
- package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts +7 -0
- package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts.map +1 -0
- package/dist/src/cli/chat/components/RuntimeHostInterstitial.js +22 -0
- package/dist/src/cli/chat/components/RuntimeHostInterstitial.js.map +1 -0
- package/dist/src/cli/chat/components/index.d.ts +1 -0
- package/dist/src/cli/chat/components/index.d.ts.map +1 -1
- package/dist/src/cli/chat/components/index.js +1 -0
- package/dist/src/cli/chat/components/index.js.map +1 -1
- package/dist/src/cli/chat/debug/tui-debug-snapshot.d.ts +49 -0
- package/dist/src/cli/chat/debug/tui-debug-snapshot.d.ts.map +1 -0
- package/dist/src/cli/chat/debug/tui-debug-snapshot.js +103 -0
- package/dist/src/cli/chat/debug/tui-debug-snapshot.js.map +1 -0
- package/dist/src/cli/chat/debug/tui-frame-recorder.d.ts +20 -0
- package/dist/src/cli/chat/debug/tui-frame-recorder.d.ts.map +1 -0
- package/dist/src/cli/chat/debug/tui-frame-recorder.js +75 -0
- package/dist/src/cli/chat/debug/tui-frame-recorder.js.map +1 -0
- package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/useAgentRun.js +138 -23
- package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
- package/dist/src/cli/chat/hooks/useChatSessions.d.ts +3 -1
- package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/useChatSessions.js +7 -2
- package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -1
- package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts +2 -1
- package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/usePromptSubmission.js +11 -1
- package/dist/src/cli/chat/hooks/usePromptSubmission.js.map +1 -1
- package/dist/src/cli/chat/index.d.ts.map +1 -1
- package/dist/src/cli/chat/index.js +15 -1
- package/dist/src/cli/chat/index.js.map +1 -1
- package/dist/src/cli/chat/state/compaction.d.ts +1 -1
- package/dist/src/cli/chat/state/compaction.d.ts.map +1 -1
- package/dist/src/cli/chat/state/compaction.js +1 -1
- package/dist/src/cli/chat/state/compaction.js.map +1 -1
- package/dist/src/cli/chat/state/local-commands.d.ts +3 -1
- package/dist/src/cli/chat/state/local-commands.d.ts.map +1 -1
- package/dist/src/cli/chat/state/local-commands.js +49 -1
- package/dist/src/cli/chat/state/local-commands.js.map +1 -1
- package/dist/src/cli/chat/submit.d.ts +1 -0
- package/dist/src/cli/chat/submit.d.ts.map +1 -1
- package/dist/src/cli/chat/submit.js +39 -16
- package/dist/src/cli/chat/submit.js.map +1 -1
- package/dist/src/cli/chat/utils/runtime.d.ts +14 -0
- package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
- package/dist/src/cli/chat/utils/runtime.js +1 -0
- package/dist/src/cli/chat/utils/runtime.js.map +1 -1
- package/dist/src/cli/daemon.d.ts +1 -0
- package/dist/src/cli/daemon.d.ts.map +1 -1
- package/dist/src/cli/daemon.js +6 -1
- package/dist/src/cli/daemon.js.map +1 -1
- package/dist/src/cli/heartbeat/task-commands.d.ts.map +1 -1
- package/dist/src/cli/heartbeat/task-commands.js +10 -1
- package/dist/src/cli/heartbeat/task-commands.js.map +1 -1
- package/dist/src/cli/heartbeat/worker.d.ts.map +1 -1
- package/dist/src/cli/heartbeat/worker.js +9 -1
- package/dist/src/cli/heartbeat/worker.js.map +1 -1
- package/dist/src/cli/main.js +92 -7
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/remote/control-plane-client.d.ts +247 -0
- package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -0
- package/dist/src/cli/remote/control-plane-client.js +11 -0
- package/dist/src/cli/remote/control-plane-client.js.map +1 -0
- package/dist/src/core/chat/archive.d.ts +19 -0
- package/dist/src/core/chat/archive.d.ts.map +1 -0
- package/dist/src/core/chat/archive.js +129 -0
- package/dist/src/core/chat/archive.js.map +1 -0
- package/dist/src/core/chat/compaction.d.ts +39 -2
- package/dist/src/core/chat/compaction.d.ts.map +1 -1
- package/dist/src/core/chat/compaction.js +309 -19
- package/dist/src/core/chat/compaction.js.map +1 -1
- package/dist/src/core/chat/conversation-lines.d.ts.map +1 -1
- package/dist/src/core/chat/conversation-lines.js +4 -1
- package/dist/src/core/chat/conversation-lines.js.map +1 -1
- package/dist/src/core/chat/session-lease.d.ts +19 -0
- package/dist/src/core/chat/session-lease.d.ts.map +1 -0
- package/dist/src/core/chat/session-lease.js +44 -0
- package/dist/src/core/chat/session-lease.js.map +1 -0
- package/dist/src/core/chat/session-submit.d.ts +10 -0
- package/dist/src/core/chat/session-submit.d.ts.map +1 -1
- package/dist/src/core/chat/session-submit.js +140 -54
- package/dist/src/core/chat/session-submit.js.map +1 -1
- package/dist/src/core/chat/storage.d.ts +5 -1
- package/dist/src/core/chat/storage.d.ts.map +1 -1
- package/dist/src/core/chat/storage.js +65 -1
- package/dist/src/core/chat/storage.js.map +1 -1
- package/dist/src/core/chat/types.d.ts +30 -0
- package/dist/src/core/chat/types.d.ts.map +1 -1
- package/dist/src/core/runtime/daemon-registry.d.ts +39 -0
- package/dist/src/core/runtime/daemon-registry.d.ts.map +1 -0
- package/dist/src/core/runtime/daemon-registry.js +120 -0
- package/dist/src/core/runtime/daemon-registry.js.map +1 -0
- package/dist/src/core/runtime/heartbeat-task-store.d.ts +2 -0
- package/dist/src/core/runtime/heartbeat-task-store.d.ts.map +1 -1
- package/dist/src/core/runtime/heartbeat-task-store.js +1 -0
- package/dist/src/core/runtime/heartbeat-task-store.js.map +1 -1
- package/dist/src/core/runtime/heartbeat-views.d.ts +2 -0
- package/dist/src/core/runtime/heartbeat-views.d.ts.map +1 -1
- package/dist/src/core/runtime/heartbeat-views.js +2 -0
- package/dist/src/core/runtime/heartbeat-views.js.map +1 -1
- package/dist/src/core/runtime/runtime-hosts.d.ts +30 -0
- package/dist/src/core/runtime/runtime-hosts.d.ts.map +1 -0
- package/dist/src/core/runtime/runtime-hosts.js +95 -0
- package/dist/src/core/runtime/runtime-hosts.js.map +1 -0
- package/dist/src/core/runtime/workspaces.d.ts +48 -0
- package/dist/src/core/runtime/workspaces.d.ts.map +1 -0
- package/dist/src/core/runtime/workspaces.js +139 -0
- package/dist/src/core/runtime/workspaces.js.map +1 -0
- package/dist/src/core/tools/file-edit-core.js +0 -4
- package/dist/src/core/tools/file-edit-core.js.map +1 -1
- package/dist/src/server/app.d.ts +5 -2
- package/dist/src/server/app.d.ts.map +1 -1
- package/dist/src/server/app.js +31 -7
- package/dist/src/server/app.js.map +1 -1
- package/dist/src/server/features/control-plane/router.d.ts +72 -0
- package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/router.js +111 -16
- package/dist/src/server/features/control-plane/router.js.map +1 -1
- package/dist/src/server/features/control-plane/services/ask.d.ts +17 -0
- package/dist/src/server/features/control-plane/services/ask.d.ts.map +1 -0
- package/dist/src/server/features/control-plane/services/ask.js +45 -0
- package/dist/src/server/features/control-plane/services/ask.js.map +1 -0
- package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +6 -0
- package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/chat-sessions.js +63 -11
- package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
- package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/control-plane-state.js +11 -5
- package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
- package/dist/src/server/features/control-plane/services/heartbeat.d.ts +2 -0
- package/dist/src/server/features/control-plane/services/heartbeat.d.ts.map +1 -1
- package/dist/src/server/features/control-plane/services/heartbeat.js +46 -1
- package/dist/src/server/features/control-plane/services/heartbeat.js.map +1 -1
- package/dist/src/server/features/control-plane/types.d.ts +39 -1
- package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +114 -6
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/router.d.ts +76 -0
- package/dist/src/server/router.d.ts.map +1 -1
- package/dist/src/server/router.js +4 -0
- package/dist/src/server/router.js.map +1 -1
- package/dist/src/server/static.d.ts.map +1 -1
- package/dist/src/server/static.js +7 -5
- package/dist/src/server/static.js.map +1 -1
- package/dist/src/server/types.d.ts +22 -0
- package/dist/src/server/types.d.ts.map +1 -1
- package/dist/src/web/assets/index-COAJyPuH.css +2 -0
- package/dist/src/web/assets/index-DxGlp0Wk.js +52 -0
- package/dist/src/web/index.html +2 -2
- package/package.json +4 -1
- package/dist/src/web/assets/index-C9sFoCL6.css +0 -2
- package/dist/src/web/assets/index-CY-VX1fa.js +0 -12
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ChatSession, ConversationLine, PendingApproval } from '../state/types.js';
|
|
2
|
+
type ActiveTurnSnapshot = {
|
|
3
|
+
title: string;
|
|
4
|
+
lines: string[];
|
|
5
|
+
error?: string;
|
|
6
|
+
currentAssistantText?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function buildTuiDebugSnapshot(args: {
|
|
9
|
+
sessionName: string;
|
|
10
|
+
activeModel: string;
|
|
11
|
+
maxSteps: number;
|
|
12
|
+
status: string;
|
|
13
|
+
hint: string;
|
|
14
|
+
contextStatus: string;
|
|
15
|
+
sessionFooter: string;
|
|
16
|
+
activeSessionId: string;
|
|
17
|
+
sessions: ChatSession[];
|
|
18
|
+
messages: ConversationLine[];
|
|
19
|
+
activeTurn?: ActiveTurnSnapshot;
|
|
20
|
+
pendingApproval?: PendingApproval;
|
|
21
|
+
approvalChoice?: 'approve' | 'allow_project' | 'deny';
|
|
22
|
+
draft: string;
|
|
23
|
+
draftCursor: number;
|
|
24
|
+
showSlashHints: boolean;
|
|
25
|
+
showCommandHint: boolean;
|
|
26
|
+
modelPicker?: {
|
|
27
|
+
visible: boolean;
|
|
28
|
+
query?: string;
|
|
29
|
+
items: string[];
|
|
30
|
+
highlightedIndex: number;
|
|
31
|
+
};
|
|
32
|
+
sessionPicker?: {
|
|
33
|
+
visible: boolean;
|
|
34
|
+
query?: string;
|
|
35
|
+
items: Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
}>;
|
|
39
|
+
highlightedIndex: number;
|
|
40
|
+
};
|
|
41
|
+
fileMentionPicker?: {
|
|
42
|
+
visible: boolean;
|
|
43
|
+
query?: string;
|
|
44
|
+
items: string[];
|
|
45
|
+
highlightedIndex: number;
|
|
46
|
+
};
|
|
47
|
+
}): string;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=tui-debug-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-debug-snapshot.d.ts","sourceRoot":"","sources":["../../../../../src/cli/chat/debug/tui-debug-snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGxF,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,MAAM,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3C,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB,CAAC,EAAE;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,GAAG,MAAM,CAuGT"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { buildPromptRenderLines } from '../components/PromptInput.js';
|
|
2
|
+
import { getLocalCommandHints } from '../state/local-commands.js';
|
|
3
|
+
import { formatApprovalHint, summarizePendingApproval, truncate } from '../utils/format.js';
|
|
4
|
+
export function buildTuiDebugSnapshot(args) {
|
|
5
|
+
const lines = [
|
|
6
|
+
`Heddle • ${args.sessionName} • model=${args.activeModel} • steps=${args.maxSteps}`,
|
|
7
|
+
`status=${args.status}`,
|
|
8
|
+
args.hint,
|
|
9
|
+
'',
|
|
10
|
+
'Conversation',
|
|
11
|
+
];
|
|
12
|
+
for (const message of args.messages.slice(-8)) {
|
|
13
|
+
lines.push(message.role === 'user' ? `┌ You${message.isPending ? ' (queued)' : ''}` : '┌ Heddle');
|
|
14
|
+
lines.push(...indentLines(renderMessageText(message.text)));
|
|
15
|
+
lines.push('└');
|
|
16
|
+
lines.push('');
|
|
17
|
+
}
|
|
18
|
+
if (args.activeTurn) {
|
|
19
|
+
lines.push('┌ Heddle');
|
|
20
|
+
lines.push(...indentLines([args.activeTurn.title, ...args.activeTurn.lines]));
|
|
21
|
+
if (args.activeTurn.currentAssistantText) {
|
|
22
|
+
lines.push(...indentLines(renderMessageText(args.activeTurn.currentAssistantText)));
|
|
23
|
+
}
|
|
24
|
+
if (args.activeTurn.error) {
|
|
25
|
+
lines.push(...indentLines([`Error: ${args.activeTurn.error}`]));
|
|
26
|
+
}
|
|
27
|
+
lines.push('└');
|
|
28
|
+
lines.push('');
|
|
29
|
+
}
|
|
30
|
+
if (args.pendingApproval) {
|
|
31
|
+
const summary = summarizePendingApproval(args.pendingApproval);
|
|
32
|
+
lines.push('Approval');
|
|
33
|
+
lines.push(`Title: ${summary.title}`);
|
|
34
|
+
if (summary.command) {
|
|
35
|
+
lines.push(`Command: ${summary.command}`);
|
|
36
|
+
}
|
|
37
|
+
lines.push(`Scope: ${summary.scope}`);
|
|
38
|
+
lines.push(`Capability: ${summary.capability}`);
|
|
39
|
+
if (summary.risk) {
|
|
40
|
+
lines.push(`Risk: ${summary.risk}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push(`Why: ${summary.why}`);
|
|
43
|
+
lines.push(`Hint: ${formatApprovalHint(args.pendingApproval)}`);
|
|
44
|
+
lines.push(`Choice: ${args.approvalChoice ?? 'approve'}`);
|
|
45
|
+
lines.push('');
|
|
46
|
+
}
|
|
47
|
+
if (args.showSlashHints) {
|
|
48
|
+
lines.push('Slash commands');
|
|
49
|
+
for (const hint of getLocalCommandHints(args.draft, args.activeSessionId, args.sessions).slice(0, 10)) {
|
|
50
|
+
lines.push(`${hint.command} ${hint.description}`);
|
|
51
|
+
}
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
if (args.showCommandHint) {
|
|
55
|
+
const command = args.draft.trim().slice(1).trim();
|
|
56
|
+
lines.push('Direct shell');
|
|
57
|
+
lines.push(command ?
|
|
58
|
+
`Run ${truncate(command, 100)} directly in chat. Read-oriented commands stay in inspect mode; other commands fall back to approval-gated execution.`
|
|
59
|
+
: 'Start with ! to run a shell command directly in chat.');
|
|
60
|
+
lines.push('');
|
|
61
|
+
}
|
|
62
|
+
if (args.modelPicker?.visible) {
|
|
63
|
+
lines.push('Model picker');
|
|
64
|
+
lines.push(args.modelPicker.query ? `Search: ${args.modelPicker.query}` : 'Type after /model set to filter. Use ↑/↓ or Tab to choose.');
|
|
65
|
+
lines.push(...renderPickerLines(args.modelPicker.items, args.modelPicker.highlightedIndex));
|
|
66
|
+
lines.push('');
|
|
67
|
+
}
|
|
68
|
+
if (args.sessionPicker?.visible) {
|
|
69
|
+
lines.push('Session picker');
|
|
70
|
+
lines.push(args.sessionPicker.query ? `Search: ${args.sessionPicker.query}` : 'Type after /session choose to filter. Use ↑/↓ or Tab to choose.');
|
|
71
|
+
lines.push(...renderPickerLines(args.sessionPicker.items.map((item, index) => `${index + 1}. ${item.name} [${item.id}]`), args.sessionPicker.highlightedIndex));
|
|
72
|
+
lines.push('');
|
|
73
|
+
}
|
|
74
|
+
if (args.fileMentionPicker?.visible) {
|
|
75
|
+
lines.push('File mentions');
|
|
76
|
+
lines.push(args.fileMentionPicker.query ? `Search: ${args.fileMentionPicker.query}` : 'Type after @ to mention a file. Use ↑/↓ or Tab to choose.');
|
|
77
|
+
lines.push(...renderPickerLines(args.fileMentionPicker.items, args.fileMentionPicker.highlightedIndex));
|
|
78
|
+
lines.push('');
|
|
79
|
+
}
|
|
80
|
+
lines.push('Prompt');
|
|
81
|
+
const promptLines = args.draft.length > 0 ?
|
|
82
|
+
buildPromptRenderLines(args.draft, args.draftCursor, 8, 80).map((line) => `${line.before}${line.hasCursor ? `[${line.cursor}]` : ''}${line.after}` || ' ')
|
|
83
|
+
: ['Ask Heddle about this project'];
|
|
84
|
+
lines.push(...promptLines.map((line) => `> ${line}`));
|
|
85
|
+
lines.push(args.draft.length > 0 ? `${args.draft.length} chars` : 'Enter to send');
|
|
86
|
+
lines.push('');
|
|
87
|
+
lines.push(`${args.contextStatus} • ${args.sessionFooter}`);
|
|
88
|
+
return `${lines.join('\n').trimEnd()}\n`;
|
|
89
|
+
}
|
|
90
|
+
function renderMessageText(text) {
|
|
91
|
+
const normalized = text.split(/\r?\n/);
|
|
92
|
+
return normalized.length > 0 ? normalized : [''];
|
|
93
|
+
}
|
|
94
|
+
function renderPickerLines(items, highlightedIndex) {
|
|
95
|
+
if (items.length === 0) {
|
|
96
|
+
return ['No matching entries.'];
|
|
97
|
+
}
|
|
98
|
+
return items.slice(0, 8).map((item, index) => `${index === highlightedIndex ? '◉' : '○'} ${item}`);
|
|
99
|
+
}
|
|
100
|
+
function indentLines(lines) {
|
|
101
|
+
return lines.map((line) => ` ${line || ' '}`);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=tui-debug-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-debug-snapshot.js","sourceRoot":"","sources":["../../../../../src/cli/chat/debug/tui-debug-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SavedTuiSnapshot = {
|
|
2
|
+
capturedAt: string;
|
|
3
|
+
txtPath: string;
|
|
4
|
+
ansiPath: string;
|
|
5
|
+
jsonPath: string;
|
|
6
|
+
};
|
|
7
|
+
export type TuiSnapshotMetadata = {
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
status?: string;
|
|
11
|
+
terminalColumns?: number;
|
|
12
|
+
terminalRows?: number;
|
|
13
|
+
textSnapshot?: string;
|
|
14
|
+
};
|
|
15
|
+
export type TuiFrameRecorder = {
|
|
16
|
+
record: (chunk: string) => void;
|
|
17
|
+
saveSnapshot: (metadata?: TuiSnapshotMetadata) => SavedTuiSnapshot;
|
|
18
|
+
};
|
|
19
|
+
export declare function createTuiFrameRecorder(stateRoot: string): TuiFrameRecorder;
|
|
20
|
+
//# sourceMappingURL=tui-frame-recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-frame-recorder.d.ts","sourceRoot":"","sources":["../../../../../src/cli/chat/debug/tui-frame-recorder.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,mBAAmB,KAAK,gBAAgB,CAAC;CACpE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CA8C1E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const TUI_SNAPSHOT_DIR = 'debug/tui-snapshots';
|
|
4
|
+
const MAX_CAPTURE_CHARS = 200_000;
|
|
5
|
+
const ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])`, 'g');
|
|
6
|
+
export function createTuiFrameRecorder(stateRoot) {
|
|
7
|
+
let latestChunk = '';
|
|
8
|
+
let streamTail = '';
|
|
9
|
+
return {
|
|
10
|
+
record(chunk) {
|
|
11
|
+
if (!chunk) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
latestChunk = chunk;
|
|
15
|
+
streamTail = truncateTail(`${streamTail}${chunk}`);
|
|
16
|
+
},
|
|
17
|
+
saveSnapshot(metadata = {}) {
|
|
18
|
+
const capturedAt = new Date().toISOString();
|
|
19
|
+
const outputDir = join(stateRoot, TUI_SNAPSHOT_DIR);
|
|
20
|
+
mkdirSync(outputDir, { recursive: true });
|
|
21
|
+
const basename = capturedAt.replaceAll(':', '-');
|
|
22
|
+
const bestCapture = selectBestCapture(latestChunk, streamTail);
|
|
23
|
+
const ansiOutput = bestCapture.ansiOutput;
|
|
24
|
+
const textOutput = normalizeTerminalText(metadata.textSnapshot ?? bestCapture.textOutput);
|
|
25
|
+
const txtPath = join(outputDir, `${basename}.txt`);
|
|
26
|
+
const ansiPath = join(outputDir, `${basename}.ansi`);
|
|
27
|
+
const jsonPath = join(outputDir, `${basename}.json`);
|
|
28
|
+
writeFileSync(txtPath, textOutput.endsWith('\n') ? textOutput : `${textOutput}\n`, 'utf8');
|
|
29
|
+
writeFileSync(ansiPath, ansiOutput, 'utf8');
|
|
30
|
+
writeFileSync(jsonPath, `${JSON.stringify({
|
|
31
|
+
capturedAt,
|
|
32
|
+
txtPath,
|
|
33
|
+
ansiPath,
|
|
34
|
+
latestChunkLength: latestChunk.length,
|
|
35
|
+
streamTailLength: streamTail.length,
|
|
36
|
+
...metadata,
|
|
37
|
+
textSnapshot: undefined,
|
|
38
|
+
}, null, 2)}\n`, 'utf8');
|
|
39
|
+
return {
|
|
40
|
+
capturedAt,
|
|
41
|
+
txtPath,
|
|
42
|
+
ansiPath,
|
|
43
|
+
jsonPath,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function truncateTail(value) {
|
|
49
|
+
return value.length <= MAX_CAPTURE_CHARS ? value : value.slice(-MAX_CAPTURE_CHARS);
|
|
50
|
+
}
|
|
51
|
+
function stripAnsi(value) {
|
|
52
|
+
return value.replaceAll(ANSI_PATTERN, '');
|
|
53
|
+
}
|
|
54
|
+
function normalizeTerminalText(value) {
|
|
55
|
+
return value
|
|
56
|
+
.replaceAll('\r\n', '\n')
|
|
57
|
+
.replaceAll('\r', '\n')
|
|
58
|
+
.replaceAll('\u0007', '')
|
|
59
|
+
.replaceAll('\u001B]8;;', '')
|
|
60
|
+
.trimEnd();
|
|
61
|
+
}
|
|
62
|
+
function selectBestCapture(latestChunk, streamTail) {
|
|
63
|
+
const latestText = normalizeTerminalText(stripAnsi(latestChunk));
|
|
64
|
+
if (latestText.length > 0) {
|
|
65
|
+
return {
|
|
66
|
+
ansiOutput: latestChunk,
|
|
67
|
+
textOutput: latestText,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
ansiOutput: streamTail || latestChunk,
|
|
72
|
+
textOutput: normalizeTerminalText(stripAnsi(streamTail || latestChunk)),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=tui-frame-recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-frame-recorder.js","sourceRoot":"","sources":["../../../../../src/cli/chat/debug/tui-frame-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,YAAY,GAAG,IAAI,MAAM,CAC7B,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,sCAAsC,EAChE,GAAG,CACJ,CAAC;AAuBF,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,OAAO;QACL,MAAM,CAAC,KAAK;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,WAAW,GAAG,KAAK,CAAC;YACpB,UAAU,GAAG,YAAY,CAAC,GAAG,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,YAAY,CAAC,QAAQ,GAAG,EAAE;YACxB,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;YAC1C,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,YAAY,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YAErD,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3F,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YAC5C,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;gBACxC,UAAU;gBACV,OAAO;gBACP,QAAQ;gBACR,iBAAiB,EAAE,WAAW,CAAC,MAAM;gBACrC,gBAAgB,EAAE,UAAU,CAAC,MAAM;gBACnC,GAAG,QAAQ;gBACX,YAAY,EAAE,SAAS;aACxB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEzB,OAAO;gBACL,UAAU;gBACV,OAAO;gBACP,QAAQ;gBACR,QAAQ;aACT,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;SACxB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC;SAC5B,OAAO,EAAE,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,WAAmB,EACnB,UAAkB;IAElB,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,UAAU;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,UAAU,IAAI,WAAW;QACrC,UAAU,EAAE,qBAAqB,CAAC,SAAS,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgentRun.d.ts","sourceRoot":"","sources":["../../../../../src/cli/chat/hooks/useAgentRun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAQlH,OAAO,KAAK,EAA+B,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGlG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"useAgentRun.d.ts","sourceRoot":"","sources":["../../../../../src/cli/chat/hooks/useAgentRun.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ import { previewEditFileInput } from '../../../core/tools/edit-file.js';
|
|
|
5
5
|
import { appendDirectShellHistory, buildConversationMessages, countAssistantSteps, formatChatFailureMessage, formatEditPreviewHistoryMessage, formatPlanHistoryMessage, formatDirectShellResponse, shouldFallbackToMutate, summarizeTrace, summarizeToolCall, toLiveEvent, } from '../utils/format.js';
|
|
6
6
|
import { saveTrace } from '../utils/runtime.js';
|
|
7
7
|
import { resolveApiKeyForModel } from '../utils/runtime.js';
|
|
8
|
+
import { acquireSessionLease, getSessionLeaseConflict, releaseSessionLease } from '../../../core/chat/session-lease.js';
|
|
8
9
|
import { createProjectApprovalRuleForCall, describeProjectApprovalRule } from '../state/approval-rules.js';
|
|
9
|
-
import {
|
|
10
|
-
import { isGenericSessionName } from '../state/storage.js';
|
|
10
|
+
import { buildCompactionRunningContext, compactChatHistoryWithArchive, estimateChatHistoryTokens } from '../state/compaction.js';
|
|
11
|
+
import { isGenericSessionName, readChatSession, touchSession } from '../state/storage.js';
|
|
11
12
|
import { normalizeSessionTitle } from '../utils/format.js';
|
|
12
13
|
import { useProjectApprovals } from './useProjectApprovals.js';
|
|
13
14
|
const PLAN_ITEM_STATUSES = new Set(['pending', 'in_progress', 'completed']);
|
|
@@ -87,6 +88,7 @@ export function useAgentRun(args) {
|
|
|
87
88
|
rawCommand,
|
|
88
89
|
model: activeModel,
|
|
89
90
|
activeSessionId,
|
|
91
|
+
activeSession: sessions.find((candidate) => candidate.id === activeSessionId),
|
|
90
92
|
runtime,
|
|
91
93
|
tools,
|
|
92
94
|
state,
|
|
@@ -126,6 +128,74 @@ export async function executeAgentTurn(args) {
|
|
|
126
128
|
const appendedPlanSteps = new Set();
|
|
127
129
|
const streamingBuffers = new Map();
|
|
128
130
|
drift?.onRunStart?.();
|
|
131
|
+
let historyForRun = sessionHistory;
|
|
132
|
+
const leaseOwner = {
|
|
133
|
+
ownerKind: 'tui',
|
|
134
|
+
ownerId: `tui-${process.pid}`,
|
|
135
|
+
clientLabel: 'terminal chat',
|
|
136
|
+
};
|
|
137
|
+
const persistedSession = readChatSession(runtime.sessionCatalogFile, sessionId, true);
|
|
138
|
+
const leaseConflict = persistedSession ? getSessionLeaseConflict(persistedSession, leaseOwner) : undefined;
|
|
139
|
+
if (leaseConflict) {
|
|
140
|
+
state.setError(leaseConflict);
|
|
141
|
+
state.setStatus('Blocked');
|
|
142
|
+
updateSessionById(sessionId, (sessionToUpdate) => ({
|
|
143
|
+
...sessionToUpdate,
|
|
144
|
+
messages: [
|
|
145
|
+
...sessionToUpdate.messages,
|
|
146
|
+
{ id: state.nextLocalId(), role: 'assistant', text: leaseConflict },
|
|
147
|
+
],
|
|
148
|
+
}));
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
if (persistedSession) {
|
|
152
|
+
const leasedSession = touchSession(acquireSessionLease(persistedSession, leaseOwner));
|
|
153
|
+
historyForRun = leasedSession.history;
|
|
154
|
+
updateSessionById(sessionId, () => leasedSession);
|
|
155
|
+
}
|
|
156
|
+
const toolNames = tools.map((tool) => tool.name);
|
|
157
|
+
const emitCompactionStatus = (event, sourceHistory) => {
|
|
158
|
+
if (event.status === 'running') {
|
|
159
|
+
state.setStatus('Compacting');
|
|
160
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: 'Compacting earlier conversation history…' }].slice(-8));
|
|
161
|
+
updateSessionById(sessionId, (sessionToUpdate) => ({
|
|
162
|
+
...sessionToUpdate,
|
|
163
|
+
history: sourceHistory,
|
|
164
|
+
context: buildCompactionRunningContext({
|
|
165
|
+
history: sourceHistory,
|
|
166
|
+
previous: sessionToUpdate.context,
|
|
167
|
+
archiveCount: sessionToUpdate.archives?.length,
|
|
168
|
+
currentSummaryPath: sessionToUpdate.context?.currentSummaryPath,
|
|
169
|
+
lastArchivePath: event.archivePath,
|
|
170
|
+
}),
|
|
171
|
+
}));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (event.status === 'failed') {
|
|
175
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: `Compaction failed: ${event.error ?? 'unknown error'}` }].slice(-8));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: 'Compaction finished.' }].slice(-8));
|
|
179
|
+
};
|
|
180
|
+
const preflightCompacted = await compactChatHistoryWithArchive({
|
|
181
|
+
history: historyForRun,
|
|
182
|
+
model: llm.info?.model ?? runtime.model,
|
|
183
|
+
sessionId,
|
|
184
|
+
stateRoot: runtime.stateRoot,
|
|
185
|
+
systemContext: runtime.systemContext,
|
|
186
|
+
toolNames,
|
|
187
|
+
goal: prompt,
|
|
188
|
+
onStatusChange: (event) => emitCompactionStatus(event, historyForRun),
|
|
189
|
+
});
|
|
190
|
+
historyForRun = preflightCompacted.history;
|
|
191
|
+
updateSessionById(sessionId, (sessionToUpdate) => ({
|
|
192
|
+
...sessionToUpdate,
|
|
193
|
+
history: preflightCompacted.history,
|
|
194
|
+
context: preflightCompacted.context,
|
|
195
|
+
archives: preflightCompacted.archives,
|
|
196
|
+
messages: buildConversationMessages(preflightCompacted.history),
|
|
197
|
+
}));
|
|
198
|
+
state.setStatus('Running');
|
|
129
199
|
const driftObserver = await createChatDriftObserver({
|
|
130
200
|
prompt,
|
|
131
201
|
referenceAssistantText,
|
|
@@ -152,7 +222,7 @@ export async function executeAgentTurn(args) {
|
|
|
152
222
|
includeDefaultTools: false,
|
|
153
223
|
maxSteps: runtime.maxSteps,
|
|
154
224
|
logger,
|
|
155
|
-
history:
|
|
225
|
+
history: historyForRun,
|
|
156
226
|
systemContext: runtime.systemContext,
|
|
157
227
|
onAssistantStream: (update) => {
|
|
158
228
|
streamingBuffers.set(update.step, update.text);
|
|
@@ -249,18 +319,22 @@ export async function executeAgentTurn(args) {
|
|
|
249
319
|
if (driftObserver?.annotations.length) {
|
|
250
320
|
result.trace.push(...driftObserver.annotations);
|
|
251
321
|
}
|
|
252
|
-
const compacted =
|
|
322
|
+
const compacted = await compactChatHistoryWithArchive({
|
|
253
323
|
history: result.transcript,
|
|
254
324
|
model: llm.info?.model ?? runtime.model,
|
|
325
|
+
sessionId,
|
|
326
|
+
stateRoot: runtime.stateRoot,
|
|
255
327
|
usage: result.usage,
|
|
256
328
|
systemContext: runtime.systemContext,
|
|
257
|
-
toolNames
|
|
329
|
+
toolNames,
|
|
258
330
|
goal: prompt,
|
|
331
|
+
onStatusChange: (event) => emitCompactionStatus(event, result.transcript),
|
|
259
332
|
});
|
|
260
333
|
updateSessionById(sessionId, (sessionToUpdate) => ({
|
|
261
334
|
...sessionToUpdate,
|
|
262
335
|
history: compacted.history,
|
|
263
336
|
context: compacted.context,
|
|
337
|
+
archives: compacted.archives,
|
|
264
338
|
}));
|
|
265
339
|
const traceFile = saveTrace(runtime.traceDir, result.trace);
|
|
266
340
|
const nextTurn = {
|
|
@@ -279,7 +353,7 @@ export async function executeAgentTurn(args) {
|
|
|
279
353
|
const formattedSummary = result.outcome === 'error' ?
|
|
280
354
|
formatChatFailureMessage(result.summary, {
|
|
281
355
|
model: llm.info?.model ?? runtime.model,
|
|
282
|
-
estimatedHistoryTokens: estimateChatHistoryTokens(
|
|
356
|
+
estimatedHistoryTokens: estimateChatHistoryTokens(historyForRun),
|
|
283
357
|
})
|
|
284
358
|
: result.summary;
|
|
285
359
|
state.setCurrentAssistantText(undefined);
|
|
@@ -307,7 +381,7 @@ export async function executeAgentTurn(args) {
|
|
|
307
381
|
const message = runError instanceof Error ? runError.message : String(runError);
|
|
308
382
|
const formattedMessage = formatChatFailureMessage(message, {
|
|
309
383
|
model: llm.info?.model ?? runtime.model,
|
|
310
|
-
estimatedHistoryTokens: estimateChatHistoryTokens(
|
|
384
|
+
estimatedHistoryTokens: estimateChatHistoryTokens(historyForRun),
|
|
311
385
|
});
|
|
312
386
|
state.setError(formattedMessage);
|
|
313
387
|
state.setStatus('Error');
|
|
@@ -321,6 +395,7 @@ export async function executeAgentTurn(args) {
|
|
|
321
395
|
return undefined;
|
|
322
396
|
}
|
|
323
397
|
finally {
|
|
398
|
+
updateSessionById(sessionId, (sessionToUpdate) => releaseSessionLease(sessionToUpdate, leaseOwner));
|
|
324
399
|
state.setIsRunning(false);
|
|
325
400
|
state.interruptRequestedRef.current = false;
|
|
326
401
|
state.setInterruptRequested(false);
|
|
@@ -402,12 +477,29 @@ function parsePlanStateFromToolResult(output) {
|
|
|
402
477
|
};
|
|
403
478
|
}
|
|
404
479
|
async function runDirectShellAction(args) {
|
|
405
|
-
const { rawCommand, model, activeSessionId, runtime, tools, state, updateActiveSession, maybeAutoNameSession, isProjectApproved, rememberProjectApproval, } = args;
|
|
480
|
+
const { rawCommand, model, activeSessionId, activeSession, runtime, tools, state, updateActiveSession, maybeAutoNameSession, isProjectApproved, rememberProjectApproval, } = args;
|
|
406
481
|
const command = rawCommand.trim();
|
|
407
|
-
if (!command || state.isRunning) {
|
|
482
|
+
if (!command || state.isRunning || !activeSession) {
|
|
408
483
|
return;
|
|
409
484
|
}
|
|
410
485
|
const shellDisplay = `!${command}`;
|
|
486
|
+
const leaseOwner = {
|
|
487
|
+
ownerKind: 'tui',
|
|
488
|
+
ownerId: `tui-${process.pid}`,
|
|
489
|
+
clientLabel: 'terminal chat',
|
|
490
|
+
};
|
|
491
|
+
const persistedSession = readChatSession(runtime.sessionCatalogFile, activeSessionId, true) ?? activeSession;
|
|
492
|
+
const leaseConflict = getSessionLeaseConflict(persistedSession, leaseOwner);
|
|
493
|
+
if (leaseConflict) {
|
|
494
|
+
state.setError(leaseConflict);
|
|
495
|
+
state.setStatus('Blocked');
|
|
496
|
+
updateActiveSession((session) => ({
|
|
497
|
+
...session,
|
|
498
|
+
messages: [...session.messages, { id: state.nextLocalId(), role: 'assistant', text: leaseConflict }],
|
|
499
|
+
}));
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
updateActiveSession(() => touchSession(acquireSessionLease(persistedSession, leaseOwner)));
|
|
411
503
|
state.setError(undefined);
|
|
412
504
|
state.setIsRunning(true);
|
|
413
505
|
state.setStatus('Running');
|
|
@@ -480,22 +572,44 @@ async function runDirectShellAction(args) {
|
|
|
480
572
|
}, state.abortControllerRef.current.signal);
|
|
481
573
|
}
|
|
482
574
|
const responseText = formatDirectShellResponse(chosenCall.tool, command, chosenResult);
|
|
575
|
+
const directShellHistory = appendDirectShellHistory(activeSession.history, shellDisplay, chosenCall.tool, chosenResult);
|
|
576
|
+
const compacted = await compactChatHistoryWithArchive({
|
|
577
|
+
history: directShellHistory,
|
|
578
|
+
model,
|
|
579
|
+
sessionId: activeSessionId,
|
|
580
|
+
stateRoot: runtime.stateRoot,
|
|
581
|
+
systemContext: runtime.systemContext,
|
|
582
|
+
toolNames: tools.map((tool) => tool.name),
|
|
583
|
+
goal: shellDisplay,
|
|
584
|
+
onStatusChange: (event) => {
|
|
585
|
+
if (event.status === 'running') {
|
|
586
|
+
state.setStatus('Compacting');
|
|
587
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: 'Compacting earlier conversation history…' }].slice(-8));
|
|
588
|
+
updateActiveSession((session) => ({
|
|
589
|
+
...session,
|
|
590
|
+
context: buildCompactionRunningContext({
|
|
591
|
+
history: directShellHistory,
|
|
592
|
+
previous: session.context,
|
|
593
|
+
archiveCount: session.archives?.length,
|
|
594
|
+
currentSummaryPath: session.context?.currentSummaryPath,
|
|
595
|
+
lastArchivePath: event.archivePath,
|
|
596
|
+
}),
|
|
597
|
+
}));
|
|
598
|
+
}
|
|
599
|
+
else if (event.status === 'failed') {
|
|
600
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: `Compaction failed: ${event.error ?? 'unknown error'}` }].slice(-8));
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
state.setLiveEvents((current) => [...current, { id: state.nextLocalId(), text: 'Compaction finished.' }].slice(-8));
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
});
|
|
483
607
|
updateActiveSession((session) => ({
|
|
484
608
|
...session,
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
systemContext: runtime.systemContext,
|
|
490
|
-
toolNames: tools.map((tool) => tool.name),
|
|
491
|
-
goal: shellDisplay,
|
|
492
|
-
});
|
|
493
|
-
return {
|
|
494
|
-
history: compacted.history,
|
|
495
|
-
context: compacted.context,
|
|
496
|
-
messages: buildConversationMessages(compacted.history),
|
|
497
|
-
};
|
|
498
|
-
})(),
|
|
609
|
+
history: compacted.history,
|
|
610
|
+
context: compacted.context,
|
|
611
|
+
archives: compacted.archives,
|
|
612
|
+
messages: buildConversationMessages(compacted.history),
|
|
499
613
|
}));
|
|
500
614
|
state.setLiveEvents([
|
|
501
615
|
{
|
|
@@ -524,6 +638,7 @@ async function runDirectShellAction(args) {
|
|
|
524
638
|
}));
|
|
525
639
|
}
|
|
526
640
|
finally {
|
|
641
|
+
updateActiveSession((session) => releaseSessionLease(session, leaseOwner));
|
|
527
642
|
state.setPendingApproval(undefined);
|
|
528
643
|
state.setApprovalChoice('approve');
|
|
529
644
|
state.interruptRequestedRef.current = false;
|