@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.
Files changed (160) hide show
  1. package/README.md +20 -0
  2. package/dist/src/cli/ask.d.ts +5 -0
  3. package/dist/src/cli/ask.d.ts.map +1 -1
  4. package/dist/src/cli/ask.js +165 -2
  5. package/dist/src/cli/ask.js.map +1 -1
  6. package/dist/src/cli/chat/App.d.ts.map +1 -1
  7. package/dist/src/cli/chat/App.js +114 -8
  8. package/dist/src/cli/chat/App.js.map +1 -1
  9. package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts +7 -0
  10. package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts.map +1 -0
  11. package/dist/src/cli/chat/components/RuntimeHostInterstitial.js +22 -0
  12. package/dist/src/cli/chat/components/RuntimeHostInterstitial.js.map +1 -0
  13. package/dist/src/cli/chat/components/index.d.ts +1 -0
  14. package/dist/src/cli/chat/components/index.d.ts.map +1 -1
  15. package/dist/src/cli/chat/components/index.js +1 -0
  16. package/dist/src/cli/chat/components/index.js.map +1 -1
  17. package/dist/src/cli/chat/debug/tui-debug-snapshot.d.ts +49 -0
  18. package/dist/src/cli/chat/debug/tui-debug-snapshot.d.ts.map +1 -0
  19. package/dist/src/cli/chat/debug/tui-debug-snapshot.js +103 -0
  20. package/dist/src/cli/chat/debug/tui-debug-snapshot.js.map +1 -0
  21. package/dist/src/cli/chat/debug/tui-frame-recorder.d.ts +20 -0
  22. package/dist/src/cli/chat/debug/tui-frame-recorder.d.ts.map +1 -0
  23. package/dist/src/cli/chat/debug/tui-frame-recorder.js +75 -0
  24. package/dist/src/cli/chat/debug/tui-frame-recorder.js.map +1 -0
  25. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
  26. package/dist/src/cli/chat/hooks/useAgentRun.js +138 -23
  27. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
  28. package/dist/src/cli/chat/hooks/useChatSessions.d.ts +3 -1
  29. package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -1
  30. package/dist/src/cli/chat/hooks/useChatSessions.js +7 -2
  31. package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -1
  32. package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts +2 -1
  33. package/dist/src/cli/chat/hooks/usePromptSubmission.d.ts.map +1 -1
  34. package/dist/src/cli/chat/hooks/usePromptSubmission.js +11 -1
  35. package/dist/src/cli/chat/hooks/usePromptSubmission.js.map +1 -1
  36. package/dist/src/cli/chat/index.d.ts.map +1 -1
  37. package/dist/src/cli/chat/index.js +15 -1
  38. package/dist/src/cli/chat/index.js.map +1 -1
  39. package/dist/src/cli/chat/state/compaction.d.ts +1 -1
  40. package/dist/src/cli/chat/state/compaction.d.ts.map +1 -1
  41. package/dist/src/cli/chat/state/compaction.js +1 -1
  42. package/dist/src/cli/chat/state/compaction.js.map +1 -1
  43. package/dist/src/cli/chat/state/local-commands.d.ts +3 -1
  44. package/dist/src/cli/chat/state/local-commands.d.ts.map +1 -1
  45. package/dist/src/cli/chat/state/local-commands.js +49 -1
  46. package/dist/src/cli/chat/state/local-commands.js.map +1 -1
  47. package/dist/src/cli/chat/submit.d.ts +1 -0
  48. package/dist/src/cli/chat/submit.d.ts.map +1 -1
  49. package/dist/src/cli/chat/submit.js +39 -16
  50. package/dist/src/cli/chat/submit.js.map +1 -1
  51. package/dist/src/cli/chat/utils/runtime.d.ts +14 -0
  52. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  53. package/dist/src/cli/chat/utils/runtime.js +1 -0
  54. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  55. package/dist/src/cli/daemon.d.ts +1 -0
  56. package/dist/src/cli/daemon.d.ts.map +1 -1
  57. package/dist/src/cli/daemon.js +6 -1
  58. package/dist/src/cli/daemon.js.map +1 -1
  59. package/dist/src/cli/heartbeat/task-commands.d.ts.map +1 -1
  60. package/dist/src/cli/heartbeat/task-commands.js +10 -1
  61. package/dist/src/cli/heartbeat/task-commands.js.map +1 -1
  62. package/dist/src/cli/heartbeat/worker.d.ts.map +1 -1
  63. package/dist/src/cli/heartbeat/worker.js +9 -1
  64. package/dist/src/cli/heartbeat/worker.js.map +1 -1
  65. package/dist/src/cli/main.js +92 -7
  66. package/dist/src/cli/main.js.map +1 -1
  67. package/dist/src/cli/remote/control-plane-client.d.ts +247 -0
  68. package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -0
  69. package/dist/src/cli/remote/control-plane-client.js +11 -0
  70. package/dist/src/cli/remote/control-plane-client.js.map +1 -0
  71. package/dist/src/core/chat/archive.d.ts +19 -0
  72. package/dist/src/core/chat/archive.d.ts.map +1 -0
  73. package/dist/src/core/chat/archive.js +129 -0
  74. package/dist/src/core/chat/archive.js.map +1 -0
  75. package/dist/src/core/chat/compaction.d.ts +39 -2
  76. package/dist/src/core/chat/compaction.d.ts.map +1 -1
  77. package/dist/src/core/chat/compaction.js +309 -19
  78. package/dist/src/core/chat/compaction.js.map +1 -1
  79. package/dist/src/core/chat/conversation-lines.d.ts.map +1 -1
  80. package/dist/src/core/chat/conversation-lines.js +4 -1
  81. package/dist/src/core/chat/conversation-lines.js.map +1 -1
  82. package/dist/src/core/chat/session-lease.d.ts +19 -0
  83. package/dist/src/core/chat/session-lease.d.ts.map +1 -0
  84. package/dist/src/core/chat/session-lease.js +44 -0
  85. package/dist/src/core/chat/session-lease.js.map +1 -0
  86. package/dist/src/core/chat/session-submit.d.ts +10 -0
  87. package/dist/src/core/chat/session-submit.d.ts.map +1 -1
  88. package/dist/src/core/chat/session-submit.js +140 -54
  89. package/dist/src/core/chat/session-submit.js.map +1 -1
  90. package/dist/src/core/chat/storage.d.ts +5 -1
  91. package/dist/src/core/chat/storage.d.ts.map +1 -1
  92. package/dist/src/core/chat/storage.js +65 -1
  93. package/dist/src/core/chat/storage.js.map +1 -1
  94. package/dist/src/core/chat/types.d.ts +30 -0
  95. package/dist/src/core/chat/types.d.ts.map +1 -1
  96. package/dist/src/core/runtime/daemon-registry.d.ts +39 -0
  97. package/dist/src/core/runtime/daemon-registry.d.ts.map +1 -0
  98. package/dist/src/core/runtime/daemon-registry.js +120 -0
  99. package/dist/src/core/runtime/daemon-registry.js.map +1 -0
  100. package/dist/src/core/runtime/heartbeat-task-store.d.ts +2 -0
  101. package/dist/src/core/runtime/heartbeat-task-store.d.ts.map +1 -1
  102. package/dist/src/core/runtime/heartbeat-task-store.js +1 -0
  103. package/dist/src/core/runtime/heartbeat-task-store.js.map +1 -1
  104. package/dist/src/core/runtime/heartbeat-views.d.ts +2 -0
  105. package/dist/src/core/runtime/heartbeat-views.d.ts.map +1 -1
  106. package/dist/src/core/runtime/heartbeat-views.js +2 -0
  107. package/dist/src/core/runtime/heartbeat-views.js.map +1 -1
  108. package/dist/src/core/runtime/runtime-hosts.d.ts +30 -0
  109. package/dist/src/core/runtime/runtime-hosts.d.ts.map +1 -0
  110. package/dist/src/core/runtime/runtime-hosts.js +95 -0
  111. package/dist/src/core/runtime/runtime-hosts.js.map +1 -0
  112. package/dist/src/core/runtime/workspaces.d.ts +48 -0
  113. package/dist/src/core/runtime/workspaces.d.ts.map +1 -0
  114. package/dist/src/core/runtime/workspaces.js +139 -0
  115. package/dist/src/core/runtime/workspaces.js.map +1 -0
  116. package/dist/src/core/tools/file-edit-core.js +0 -4
  117. package/dist/src/core/tools/file-edit-core.js.map +1 -1
  118. package/dist/src/server/app.d.ts +5 -2
  119. package/dist/src/server/app.d.ts.map +1 -1
  120. package/dist/src/server/app.js +31 -7
  121. package/dist/src/server/app.js.map +1 -1
  122. package/dist/src/server/features/control-plane/router.d.ts +72 -0
  123. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  124. package/dist/src/server/features/control-plane/router.js +111 -16
  125. package/dist/src/server/features/control-plane/router.js.map +1 -1
  126. package/dist/src/server/features/control-plane/services/ask.d.ts +17 -0
  127. package/dist/src/server/features/control-plane/services/ask.d.ts.map +1 -0
  128. package/dist/src/server/features/control-plane/services/ask.js +45 -0
  129. package/dist/src/server/features/control-plane/services/ask.js.map +1 -0
  130. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +6 -0
  131. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
  132. package/dist/src/server/features/control-plane/services/chat-sessions.js +63 -11
  133. package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
  134. package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +1 -1
  135. package/dist/src/server/features/control-plane/services/control-plane-state.js +11 -5
  136. package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
  137. package/dist/src/server/features/control-plane/services/heartbeat.d.ts +2 -0
  138. package/dist/src/server/features/control-plane/services/heartbeat.d.ts.map +1 -1
  139. package/dist/src/server/features/control-plane/services/heartbeat.js +46 -1
  140. package/dist/src/server/features/control-plane/services/heartbeat.js.map +1 -1
  141. package/dist/src/server/features/control-plane/types.d.ts +39 -1
  142. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  143. package/dist/src/server/index.d.ts.map +1 -1
  144. package/dist/src/server/index.js +114 -6
  145. package/dist/src/server/index.js.map +1 -1
  146. package/dist/src/server/router.d.ts +76 -0
  147. package/dist/src/server/router.d.ts.map +1 -1
  148. package/dist/src/server/router.js +4 -0
  149. package/dist/src/server/router.js.map +1 -1
  150. package/dist/src/server/static.d.ts.map +1 -1
  151. package/dist/src/server/static.js +7 -5
  152. package/dist/src/server/static.js.map +1 -1
  153. package/dist/src/server/types.d.ts +22 -0
  154. package/dist/src/server/types.d.ts.map +1 -1
  155. package/dist/src/web/assets/index-COAJyPuH.css +2 -0
  156. package/dist/src/web/assets/index-DxGlp0Wk.js +52 -0
  157. package/dist/src/web/index.html +2 -2
  158. package/package.json +4 -1
  159. package/dist/src/web/assets/index-C9sFoCL6.css +0 -2
  160. 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAgentRun.d.ts","sourceRoot":"","sources":["../../../../../src/cli/chat/hooks/useAgentRun.ts"],"names":[],"mappings":"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"}
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 { compactChatHistory, estimateChatHistoryTokens } from '../state/compaction.js';
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: sessionHistory,
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 = compactChatHistory({
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: tools.map((tool) => tool.name),
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(sessionHistory),
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(sessionHistory),
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
- const compacted = compactChatHistory({
487
- history: appendDirectShellHistory(session.history, shellDisplay, chosenCall.tool, chosenResult),
488
- model,
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;