@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.
- package/dist/agent/responder-context.js +1 -1
- package/dist/agent/responder-context.js.map +1 -1
- package/dist/agent/runner.js +1 -1
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/tool-call-parser.js +2 -1
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/app/adapters/current-jobs-adapter.js +4 -0
- package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
- package/dist/app/controllers/job-controller.d.ts +4 -0
- package/dist/app/controllers/job-controller.js +12 -0
- package/dist/app/controllers/job-controller.js.map +1 -1
- package/dist/app/controllers/plan-controller.d.ts +1 -0
- package/dist/app/controllers/plan-controller.js +15 -0
- package/dist/app/controllers/plan-controller.js.map +1 -1
- package/dist/app/controllers/session-controller.d.ts +2 -0
- package/dist/app/controllers/session-controller.js +32 -10
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-responder.d.ts +19 -23
- package/dist/app/controllers/session-responder.js +157 -262
- package/dist/app/controllers/session-responder.js.map +1 -1
- package/dist/app/ports/jobs-port.d.ts +4 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/repl.js +14 -68
- package/dist/repl.js.map +1 -1
- package/dist/store/history-index.d.ts +43 -0
- package/dist/store/history-index.js +197 -0
- package/dist/store/history-index.js.map +1 -0
- package/dist/store/history.d.ts +6 -5
- package/dist/store/history.js +246 -205
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.d.ts +1 -1
- package/dist/store/plan.js +17 -8
- package/dist/store/plan.js.map +1 -1
- package/dist/store/responder-settlement.d.ts +3 -0
- package/dist/store/responder-settlement.js +60 -0
- package/dist/store/responder-settlement.js.map +1 -0
- package/dist/tools/definitions.js +16 -20
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/jobs.d.ts +25 -6
- package/dist/tools/jobs.js +251 -51
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/registry.js +18 -23
- package/dist/tools/registry.js.map +1 -1
- package/dist/tui-v2/app/commands/picker-commands.js +9 -10
- package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
- package/dist/tui-v2/bootstrap/composition-root.js +9 -0
- package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
- package/dist/tui-v2/components/jobs/jobs-panel.js +49 -26
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.d.ts +2 -0
- package/dist/tui-v2/components/status/status-line.js +23 -2
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/state/transcript-hydrate.d.ts +8 -2
- package/dist/tui-v2/state/transcript-hydrate.js +99 -9
- package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- 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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"}
|
package/dist/store/history.d.ts
CHANGED
|
@@ -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[]>;
|