@pentoshi/clai 3.8.49 → 3.8.51

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 (59) hide show
  1. package/dist/agent/responder-context.js +1 -1
  2. package/dist/agent/responder-context.js.map +1 -1
  3. package/dist/agent/runner.js +1 -1
  4. package/dist/agent/runner.js.map +1 -1
  5. package/dist/agent/tool-call-parser.js +2 -1
  6. package/dist/agent/tool-call-parser.js.map +1 -1
  7. package/dist/app/adapters/current-jobs-adapter.js +4 -0
  8. package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
  9. package/dist/app/controllers/job-controller.d.ts +4 -0
  10. package/dist/app/controllers/job-controller.js +12 -0
  11. package/dist/app/controllers/job-controller.js.map +1 -1
  12. package/dist/app/controllers/plan-controller.d.ts +1 -0
  13. package/dist/app/controllers/plan-controller.js +15 -0
  14. package/dist/app/controllers/plan-controller.js.map +1 -1
  15. package/dist/app/controllers/session-controller.d.ts +2 -0
  16. package/dist/app/controllers/session-controller.js +32 -10
  17. package/dist/app/controllers/session-controller.js.map +1 -1
  18. package/dist/app/controllers/session-responder.d.ts +19 -23
  19. package/dist/app/controllers/session-responder.js +157 -262
  20. package/dist/app/controllers/session-responder.js.map +1 -1
  21. package/dist/app/ports/jobs-port.d.ts +4 -0
  22. package/dist/index.js +3 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/repl.js +14 -68
  25. package/dist/repl.js.map +1 -1
  26. package/dist/store/history-index.d.ts +43 -0
  27. package/dist/store/history-index.js +197 -0
  28. package/dist/store/history-index.js.map +1 -0
  29. package/dist/store/history.d.ts +6 -5
  30. package/dist/store/history.js +246 -205
  31. package/dist/store/history.js.map +1 -1
  32. package/dist/store/plan.d.ts +1 -1
  33. package/dist/store/plan.js +17 -8
  34. package/dist/store/plan.js.map +1 -1
  35. package/dist/store/responder-settlement.d.ts +3 -0
  36. package/dist/store/responder-settlement.js +60 -0
  37. package/dist/store/responder-settlement.js.map +1 -0
  38. package/dist/tools/definitions.js +16 -20
  39. package/dist/tools/definitions.js.map +1 -1
  40. package/dist/tools/jobs.d.ts +25 -6
  41. package/dist/tools/jobs.js +251 -51
  42. package/dist/tools/jobs.js.map +1 -1
  43. package/dist/tools/registry.js +18 -23
  44. package/dist/tools/registry.js.map +1 -1
  45. package/dist/tui-v2/app/commands/picker-commands.js +9 -10
  46. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  47. package/dist/tui-v2/bootstrap/composition-root.js +9 -0
  48. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
  49. package/dist/tui-v2/components/jobs/jobs-panel.js +49 -26
  50. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  51. package/dist/tui-v2/components/status/status-line.d.ts +2 -0
  52. package/dist/tui-v2/components/status/status-line.js +23 -2
  53. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  54. package/dist/tui-v2/state/transcript-hydrate.d.ts +8 -2
  55. package/dist/tui-v2/state/transcript-hydrate.js +99 -9
  56. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  57. package/dist/version.generated.d.ts +2 -2
  58. package/dist/version.generated.js +2 -2
  59. package/package.json +1 -1
@@ -0,0 +1,197 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { open, readFile, rename, stat, writeFile } from "node:fs/promises";
3
+ export function historySummary(record) {
4
+ const messages = Array.isArray(record.messages) ? record.messages : [];
5
+ const transcript = Array.isArray(record.transcript) ? record.transcript : [];
6
+ return {
7
+ id: record.id,
8
+ ...(record.writerGeneration
9
+ ? { writerGeneration: record.writerGeneration }
10
+ : {}),
11
+ ...(typeof record.revision === "number"
12
+ ? { revision: record.revision }
13
+ : {}),
14
+ ...(record.name ? { name: record.name } : {}),
15
+ createdAt: record.createdAt,
16
+ updatedAt: record.updatedAt,
17
+ cwd: record.cwd,
18
+ messageCount: messages.length,
19
+ itemCount: transcript.length > 0 ? transcript.length : messages.length,
20
+ hasImages: messages.some((message) => Array.isArray(message.images) && message.images.length > 0),
21
+ ...(record.workspaceFolder
22
+ ? { workspaceFolder: record.workspaceFolder }
23
+ : {}),
24
+ ...(record.workspaceCode ? { workspaceCode: record.workspaceCode } : {}),
25
+ };
26
+ }
27
+ export async function writeIndexedJsonl(jsonlPath, indexPath, records) {
28
+ const entries = [];
29
+ const lines = [];
30
+ let offset = 0;
31
+ for (const record of records) {
32
+ const line = Buffer.from(`${JSON.stringify(record)}\n`, "utf8");
33
+ entries.push({
34
+ id: record.id,
35
+ offset,
36
+ length: line.length,
37
+ summary: historySummary(record),
38
+ });
39
+ lines.push(line);
40
+ offset += line.length;
41
+ }
42
+ const token = `${process.pid}.${randomUUID()}`;
43
+ const jsonlTemp = `${jsonlPath}.${token}.tmp`;
44
+ const indexTemp = `${indexPath}.${token}.tmp`;
45
+ await writeFile(jsonlTemp, Buffer.concat(lines), { mode: 0o600 });
46
+ await rename(jsonlTemp, jsonlPath);
47
+ const source = await stat(jsonlPath);
48
+ const index = {
49
+ schemaVersion: 1,
50
+ source: { size: source.size, mtimeMs: source.mtimeMs },
51
+ entries,
52
+ };
53
+ await writeFile(indexTemp, `${JSON.stringify(index)}\n`, { mode: 0o600 });
54
+ await rename(indexTemp, indexPath);
55
+ }
56
+ export async function readValidatedHistoryIndex(jsonlPath, indexPath) {
57
+ try {
58
+ const [source, raw] = await Promise.all([
59
+ stat(jsonlPath),
60
+ readFile(indexPath, "utf8"),
61
+ ]);
62
+ const parsed = JSON.parse(raw);
63
+ if (parsed.schemaVersion !== 1 ||
64
+ !Array.isArray(parsed.entries) ||
65
+ parsed.source.size !== source.size ||
66
+ Math.abs(parsed.source.mtimeMs - source.mtimeMs) > 1) {
67
+ return undefined;
68
+ }
69
+ for (const entry of parsed.entries) {
70
+ if (!entry ||
71
+ typeof entry.id !== "string" ||
72
+ !Number.isSafeInteger(entry.offset) ||
73
+ !Number.isSafeInteger(entry.length) ||
74
+ entry.offset < 0 ||
75
+ entry.length <= 0 ||
76
+ entry.offset + entry.length > source.size ||
77
+ entry.summary?.id !== entry.id) {
78
+ return undefined;
79
+ }
80
+ }
81
+ return parsed.entries;
82
+ }
83
+ catch {
84
+ return undefined;
85
+ }
86
+ }
87
+ export async function readIndexedHistoryRecord(jsonlPath, entry) {
88
+ const handle = await open(jsonlPath, "r").catch(() => undefined);
89
+ if (!handle)
90
+ return undefined;
91
+ try {
92
+ const bytes = Buffer.alloc(entry.length);
93
+ const { bytesRead } = await handle.read(bytes, 0, entry.length, entry.offset);
94
+ if (bytesRead !== entry.length)
95
+ return undefined;
96
+ const record = JSON.parse(bytes.toString("utf8").trim());
97
+ if (record.id !== entry.id)
98
+ return undefined;
99
+ if (entry.summary.revision !== undefined &&
100
+ record.revision !== entry.summary.revision) {
101
+ return undefined;
102
+ }
103
+ return record;
104
+ }
105
+ catch {
106
+ return undefined;
107
+ }
108
+ finally {
109
+ await handle.close();
110
+ }
111
+ }
112
+ export async function scanHistoryJsonl(jsonlPath, visit) {
113
+ const handle = await open(jsonlPath, "r").catch(() => undefined);
114
+ if (!handle)
115
+ return;
116
+ const chunk = Buffer.allocUnsafe(64 * 1024);
117
+ let carry = Buffer.alloc(0);
118
+ let fileOffset = 0;
119
+ try {
120
+ while (true) {
121
+ const { bytesRead } = await handle.read(chunk, 0, chunk.length, null);
122
+ if (bytesRead === 0)
123
+ break;
124
+ const data = carry.length
125
+ ? Buffer.concat([carry, chunk.subarray(0, bytesRead)])
126
+ : Buffer.from(chunk.subarray(0, bytesRead));
127
+ let start = 0;
128
+ while (true) {
129
+ const newline = data.indexOf(0x0a, start);
130
+ if (newline < 0)
131
+ break;
132
+ const line = data.subarray(start, newline);
133
+ const length = newline - start + 1;
134
+ if (line.length > 0) {
135
+ try {
136
+ visit(JSON.parse(line.toString("utf8")), fileOffset + start - carry.length, length);
137
+ }
138
+ catch {
139
+ // Malformed lines are skipped; callers can rebuild from valid rows.
140
+ }
141
+ }
142
+ start = newline + 1;
143
+ }
144
+ fileOffset += bytesRead;
145
+ carry = Buffer.from(data.subarray(start));
146
+ }
147
+ if (carry.length > 0) {
148
+ try {
149
+ visit(JSON.parse(carry.toString("utf8")), fileOffset - carry.length, carry.length);
150
+ }
151
+ catch {
152
+ // Ignore a truncated final line.
153
+ }
154
+ }
155
+ }
156
+ finally {
157
+ await handle.close();
158
+ }
159
+ }
160
+ export async function rebuildHistoryIndex(jsonlPath, indexPath) {
161
+ const byId = new Map();
162
+ await scanHistoryJsonl(jsonlPath, (record, offset, length) => {
163
+ if (!record?.id)
164
+ return;
165
+ byId.set(record.id, {
166
+ id: record.id,
167
+ offset,
168
+ length,
169
+ summary: historySummary(record),
170
+ });
171
+ });
172
+ const entries = [...byId.values()];
173
+ try {
174
+ const source = await stat(jsonlPath);
175
+ const index = {
176
+ schemaVersion: 1,
177
+ source: { size: source.size, mtimeMs: source.mtimeMs },
178
+ entries,
179
+ };
180
+ const temp = `${indexPath}.${process.pid}.${randomUUID()}.tmp`;
181
+ await writeFile(temp, `${JSON.stringify(index)}\n`, { mode: 0o600 });
182
+ await rename(temp, indexPath);
183
+ }
184
+ catch {
185
+ // Listing remains usable from the in-memory streaming result.
186
+ }
187
+ return entries;
188
+ }
189
+ export async function findHistoryRecordStreaming(jsonlPath, id) {
190
+ let found;
191
+ await scanHistoryJsonl(jsonlPath, (record) => {
192
+ if (record.id === id)
193
+ found = record;
194
+ });
195
+ return found;
196
+ }
197
+ //# sourceMappingURL=history-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-index.js","sourceRoot":"","sources":["../../src/store/history-index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { type ChatMessage, type ToolCall, type ToolResult } from "../types.js";
2
2
  import type { TranscriptItem } from "../tui/state.js";
3
+ import { type HistorySummary } from "./history-index.js";
4
+ export type { HistorySummary } from "./history-index.js";
3
5
  /** Persisted token/context footer snapshot (survives /history resume). */
4
6
  export interface PersistedContextUsage {
5
7
  contextTokens: number;
@@ -52,6 +54,7 @@ export interface ToolCallRecord {
52
54
  exitCode?: number | undefined;
53
55
  output: string;
54
56
  }
57
+ export declare function materializeHistoryImages(messages: readonly ChatMessage[]): ChatMessage[];
55
58
  /**
56
59
  * Compare snapshots by writer generation, then capture revision. Legacy rows
57
60
  * without a generation retain revision/timestamp fallback for compatibility.
@@ -69,11 +72,6 @@ export declare function partitionByRetention(records: readonly HistoryRecord[],
69
72
  kept: HistoryRecord[];
70
73
  pruned: HistoryRecord[];
71
74
  };
72
- /**
73
- * Scan leftover write temps + the archive for sessions missing from the
74
- * active file and merge them back. Fixes history that was pruned by the old
75
- * slice(-200) retention or left in .tmp after a crashed rename.
76
- */
77
75
  export declare function recoverOrphanedHistory(): Promise<{
78
76
  recovered: number;
79
77
  sources: string[];
@@ -81,6 +79,9 @@ export declare function recoverOrphanedHistory(): Promise<{
81
79
  export declare function saveSession(messages: ChatMessage[], name?: string | undefined, transcript?: TranscriptItem[] | undefined, contextUsage?: PersistedContextUsage | undefined, revision?: number | undefined, writerGeneration?: string | undefined): Promise<HistoryRecord>;
82
80
  export declare function upsertSession(id: string, messages: ChatMessage[], name?: string | undefined, transcript?: TranscriptItem[] | undefined, contextUsage?: PersistedContextUsage | undefined, revision?: number | undefined, writerGeneration?: string | undefined): Promise<HistoryRecord>;
83
81
  export declare function saveToolCall(sessionId: string, call: ToolCall, result: ToolResult): Promise<ToolCallRecord>;
82
+ export declare function listSessionSummaries(limit?: number, options?: {
83
+ recovery?: "blocking" | "background";
84
+ }): Promise<HistorySummary[]>;
84
85
  export declare function listSessions(limit?: number, options?: {
85
86
  recovery?: "blocking" | "background";
86
87
  }): Promise<HistoryRecord[]>;