spec-cat 0.1.21 → 0.1.23
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{qt0TxNaY.js → -EMqkm_u.js} +1 -1
- package/.output/public/_nuxt/{N3ZxlKm3.js → BDd_kh9e.js} +1 -1
- package/.output/public/_nuxt/BJKzOiTU.js +1 -0
- package/.output/public/_nuxt/{DqNujSig.js → Bk4uZfKR.js} +1 -1
- package/.output/public/_nuxt/C9Qk2Hno.js +1 -0
- package/.output/public/_nuxt/CDLI67Cr.js +1 -0
- package/.output/public/_nuxt/CLPz4Oer.js +1 -0
- package/.output/public/_nuxt/CYVeOpC3.js +1 -0
- package/.output/public/_nuxt/CZbP5QXb.js +1 -0
- package/.output/public/_nuxt/DQtVbA-s.js +150 -0
- package/.output/public/_nuxt/DXWMFGmi.js +1 -0
- package/.output/public/_nuxt/DgiJut-o.js +1 -0
- package/.output/public/_nuxt/{DUodkQcr.js → FbKhJXKu.js} +3 -3
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/53b5c409-86a8-4624-8a0f-5bf31ab82deb.json +1 -0
- package/.output/public/_nuxt/default.eSO6fRPf.css +1 -0
- package/.output/public/_nuxt/entry.BtencOYX.css +1 -0
- package/.output/public/_nuxt/useTheme.Dp77PlfC.css +1 -0
- package/.output/server/chunks/_/conversationStore.mjs +13 -1
- package/.output/server/chunks/_/conversationStore.mjs.map +1 -1
- package/.output/server/chunks/_/git.mjs +7 -6
- package/.output/server/chunks/_/git.mjs.map +1 -1
- package/.output/server/chunks/_/git2.mjs.map +1 -1
- package/.output/server/chunks/_/gitApiHelpers.mjs +43 -0
- package/.output/server/chunks/_/gitApiHelpers.mjs.map +1 -0
- package/.output/server/chunks/_/jobPersister.mjs +326 -0
- package/.output/server/chunks/_/jobPersister.mjs.map +1 -0
- package/.output/server/chunks/_/jobQueue.mjs +714 -0
- package/.output/server/chunks/_/jobQueue.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +693 -657
- package/.output/server/chunks/routes/_ws.mjs +133 -527
- package/.output/server/chunks/routes/_ws.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branch-rename.post.mjs +5 -18
- package/.output/server/chunks/routes/api/git/branch-rename.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branch.delete.mjs +5 -18
- package/.output/server/chunks/routes/api/git/branch.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branches.get.mjs +5 -18
- package/.output/server/chunks/routes/api/git/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/checkout.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/checkout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs +5 -18
- package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/clean.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/clean.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs +23 -26
- package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/commit.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/commit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/diff.get.mjs +5 -24
- package/.output/server/chunks/routes/api/git/diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/fetch.post.mjs +5 -18
- package/.output/server/chunks/routes/api/git/fetch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/file-diff.get.mjs +5 -24
- package/.output/server/chunks/routes/api/git/file-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/graph.get.mjs +9 -20
- package/.output/server/chunks/routes/api/git/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/log.get.mjs +5 -24
- package/.output/server/chunks/routes/api/git/log.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/merge-base.get.mjs +5 -24
- package/.output/server/chunks/routes/api/git/merge-base.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/merge.post.mjs +5 -18
- package/.output/server/chunks/routes/api/git/merge.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/pull.post.mjs +14 -26
- package/.output/server/chunks/routes/api/git/pull.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/push.post.mjs +15 -27
- package/.output/server/chunks/routes/api/git/push.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/rebase.post.mjs +10 -22
- package/.output/server/chunks/routes/api/git/rebase.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.delete.mjs +5 -18
- package/.output/server/chunks/routes/api/git/remote.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.post.mjs +10 -22
- package/.output/server/chunks/routes/api/git/remote.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.put.mjs +5 -18
- package/.output/server/chunks/routes/api/git/remote.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remotes.get.mjs +5 -18
- package/.output/server/chunks/routes/api/git/remotes.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/reset.post.mjs +12 -24
- package/.output/server/chunks/routes/api/git/reset.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/revert.post.mjs +5 -18
- package/.output/server/chunks/routes/api/git/revert.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/show.get.mjs +5 -24
- package/.output/server/chunks/routes/api/git/show.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stage.post.mjs +9 -22
- package/.output/server/chunks/routes/api/git/stage.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-apply.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/stash-apply.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-branch.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/stash-branch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-drop.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/stash-drop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-pop.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/stash-pop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash.get.mjs +5 -25
- package/.output/server/chunks/routes/api/git/stash.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/stash.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/state.get.mjs +5 -25
- package/.output/server/chunks/routes/api/git/state.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/status.get.mjs +5 -25
- package/.output/server/chunks/routes/api/git/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs +5 -18
- package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag-push.post.mjs +10 -22
- package/.output/server/chunks/routes/api/git/tag-push.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag.delete.mjs +5 -18
- package/.output/server/chunks/routes/api/git/tag.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag.post.mjs +17 -29
- package/.output/server/chunks/routes/api/git/tag.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/unstage.post.mjs +5 -19
- package/.output/server/chunks/routes/api/git/unstage.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +25 -14
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +14 -141
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +167 -0
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -0
- package/.output/server/chunks/routes/api/index.post.mjs +77 -116
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +149 -0
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -0
- package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs +48 -0
- package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/jobs/_id_.get.mjs +55 -0
- package/.output/server/chunks/routes/api/jobs/_id_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/repository/status.get.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/BIw1AQHU.js +0 -150
- package/.output/public/_nuxt/DBtLi_wJ.js +0 -1
- package/.output/public/_nuxt/DSDWvT5-.js +0 -1
- package/.output/public/_nuxt/K5rMM4le.js +0 -1
- package/.output/public/_nuxt/builds/meta/c0768eef-2dd5-410c-8648-edbd9e6c218c.json +0 -1
- package/.output/public/_nuxt/ddKcAgQK.js +0 -1
- package/.output/public/_nuxt/default.CZoNL3P_.css +0 -1
- package/.output/public/_nuxt/entry.DLBgeD7S.css +0 -1
- package/.output/public/_nuxt/sxXWehCn.js +0 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { e as eventBus, G as GLOBAL_CHANNEL } from './jobQueue.mjs';
|
|
5
|
+
import { c as generateMessageId, d as generateBlockId, u as upsertConversationInStorage, S as STORAGE_VERSION } from './conversationStore.mjs';
|
|
6
|
+
import { j as getSpecCatDataDir } from '../nitro/nitro.mjs';
|
|
7
|
+
|
|
8
|
+
const accumulators = /* @__PURE__ */ new Map();
|
|
9
|
+
function formatToolInputSummary(input) {
|
|
10
|
+
if (input.file_path) return String(input.file_path);
|
|
11
|
+
if (input.path) return String(input.path);
|
|
12
|
+
if (input.command) return String(input.command).slice(0, 50);
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
function startPersisting(conversationId, userMessage) {
|
|
16
|
+
const existing = accumulators.get(conversationId);
|
|
17
|
+
if (existing) {
|
|
18
|
+
existing.unsubscribe();
|
|
19
|
+
accumulators.delete(conversationId);
|
|
20
|
+
}
|
|
21
|
+
const assistantMessageId = generateMessageId();
|
|
22
|
+
const acc = {
|
|
23
|
+
conversationId,
|
|
24
|
+
userMessage,
|
|
25
|
+
assistantMessageId,
|
|
26
|
+
contentBlocks: [],
|
|
27
|
+
flatText: "",
|
|
28
|
+
currentTextBlockId: null,
|
|
29
|
+
currentThinkingBlockId: null,
|
|
30
|
+
activeTools: /* @__PURE__ */ new Map(),
|
|
31
|
+
providerSessionId: null,
|
|
32
|
+
unsubscribe: () => {
|
|
33
|
+
},
|
|
34
|
+
status: "streaming"
|
|
35
|
+
};
|
|
36
|
+
acc.unsubscribe = eventBus.subscribe(conversationId, (event) => {
|
|
37
|
+
handleEvent(acc, event);
|
|
38
|
+
});
|
|
39
|
+
accumulators.set(conversationId, acc);
|
|
40
|
+
console.log("[JobPersister] Started persisting for:", conversationId);
|
|
41
|
+
}
|
|
42
|
+
function handleEvent(acc, event) {
|
|
43
|
+
try {
|
|
44
|
+
if (event.type === "ui_event" && event.event) {
|
|
45
|
+
processUIEvent(acc, event.event);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (event.type === "done") {
|
|
49
|
+
if (event.denied) {
|
|
50
|
+
acc.status = "stopped";
|
|
51
|
+
} else {
|
|
52
|
+
markRemainingToolBlocks(acc, "complete");
|
|
53
|
+
acc.status = "complete";
|
|
54
|
+
}
|
|
55
|
+
finalize(acc);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (event.type === "error") {
|
|
59
|
+
markRemainingToolBlocks(acc, "error");
|
|
60
|
+
acc.status = "error";
|
|
61
|
+
const errorText = typeof event.error === "string" ? event.error : "Unknown error";
|
|
62
|
+
appendTextBlock(acc, `
|
|
63
|
+
|
|
64
|
+
**Error**: ${errorText}
|
|
65
|
+
`);
|
|
66
|
+
finalize(acc);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (event.type === "session_reset") {
|
|
70
|
+
const reason = typeof event.reason === "string" ? event.reason : "Session reset";
|
|
71
|
+
appendTextBlock(acc, `
|
|
72
|
+
|
|
73
|
+
> **Session Reset**: ${reason}
|
|
74
|
+
|
|
75
|
+
`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (event.type === "permission_request") {
|
|
79
|
+
markRemainingToolBlocks(acc, "error");
|
|
80
|
+
acc.status = "stopped";
|
|
81
|
+
const tool = typeof event.tool === "string" ? event.tool : "Permission";
|
|
82
|
+
appendTextBlock(acc, `
|
|
83
|
+
|
|
84
|
+
**Permission Required**: ${tool}
|
|
85
|
+
`);
|
|
86
|
+
finalize(acc);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
} catch (err) {
|
|
90
|
+
console.error("[JobPersister] Error handling event:", err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function finalize(acc) {
|
|
94
|
+
acc.unsubscribe();
|
|
95
|
+
accumulators.delete(acc.conversationId);
|
|
96
|
+
flush(acc);
|
|
97
|
+
}
|
|
98
|
+
function processUIEvent(acc, event) {
|
|
99
|
+
var _a, _b, _c, _d;
|
|
100
|
+
if (event.sessionId) {
|
|
101
|
+
acc.providerSessionId = event.sessionId;
|
|
102
|
+
}
|
|
103
|
+
switch (event.type) {
|
|
104
|
+
case "session_init": {
|
|
105
|
+
const block = {
|
|
106
|
+
id: generateBlockId(),
|
|
107
|
+
type: "session_init",
|
|
108
|
+
model: event.model,
|
|
109
|
+
tools: event.tools,
|
|
110
|
+
permissionMode: event.permissionMode,
|
|
111
|
+
cwd: event.cwd
|
|
112
|
+
};
|
|
113
|
+
acc.contentBlocks.push(block);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
case "block_start": {
|
|
117
|
+
const blockId = event.blockId || generateBlockId();
|
|
118
|
+
if (event.blockType === "text") {
|
|
119
|
+
const block = { id: blockId, type: "text", text: event.text || "" };
|
|
120
|
+
acc.contentBlocks.push(block);
|
|
121
|
+
acc.currentTextBlockId = blockId;
|
|
122
|
+
if (event.text) acc.flatText += event.text;
|
|
123
|
+
} else if (event.blockType === "thinking") {
|
|
124
|
+
const block = { id: blockId, type: "thinking", thinking: event.thinking || "" };
|
|
125
|
+
acc.contentBlocks.push(block);
|
|
126
|
+
acc.currentThinkingBlockId = blockId;
|
|
127
|
+
} else if (event.blockType === "tool_use" && event.toolUseId && event.name) {
|
|
128
|
+
const block = {
|
|
129
|
+
id: blockId,
|
|
130
|
+
type: "tool_use",
|
|
131
|
+
toolUseId: event.toolUseId,
|
|
132
|
+
name: event.name,
|
|
133
|
+
input: {},
|
|
134
|
+
inputSummary: "",
|
|
135
|
+
status: "running"
|
|
136
|
+
};
|
|
137
|
+
acc.contentBlocks.push(block);
|
|
138
|
+
acc.activeTools.set((_a = event.index) != null ? _a : 0, {
|
|
139
|
+
blockId,
|
|
140
|
+
toolUseId: event.toolUseId,
|
|
141
|
+
name: event.name,
|
|
142
|
+
inputJson: ""
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case "block_delta": {
|
|
148
|
+
if (event.text && acc.currentTextBlockId) {
|
|
149
|
+
const block = acc.contentBlocks.find((b) => b.id === acc.currentTextBlockId);
|
|
150
|
+
if (block && block.type === "text") {
|
|
151
|
+
block.text += event.text;
|
|
152
|
+
acc.flatText += event.text;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (event.thinking && acc.currentThinkingBlockId) {
|
|
156
|
+
const block = acc.contentBlocks.find((b) => b.id === acc.currentThinkingBlockId);
|
|
157
|
+
if (block && block.type === "thinking") {
|
|
158
|
+
block.thinking += event.thinking;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (event.partialJson && event.index !== void 0) {
|
|
162
|
+
const tool = acc.activeTools.get(event.index);
|
|
163
|
+
if (tool) {
|
|
164
|
+
tool.inputJson += event.partialJson;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case "block_end": {
|
|
170
|
+
if (acc.currentTextBlockId) {
|
|
171
|
+
acc.currentTextBlockId = null;
|
|
172
|
+
}
|
|
173
|
+
if (acc.currentThinkingBlockId) {
|
|
174
|
+
acc.currentThinkingBlockId = null;
|
|
175
|
+
}
|
|
176
|
+
if (event.index !== void 0) {
|
|
177
|
+
const tool = acc.activeTools.get(event.index);
|
|
178
|
+
if (tool) {
|
|
179
|
+
let input = {};
|
|
180
|
+
try {
|
|
181
|
+
input = JSON.parse(tool.inputJson);
|
|
182
|
+
} catch {
|
|
183
|
+
}
|
|
184
|
+
const block = acc.contentBlocks.find((b) => b.id === tool.blockId);
|
|
185
|
+
if (block && block.type === "tool_use") {
|
|
186
|
+
const tb = block;
|
|
187
|
+
tb.input = input;
|
|
188
|
+
tb.inputSummary = formatToolInputSummary(input);
|
|
189
|
+
tb.status = "pending";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case "tool_result": {
|
|
196
|
+
const toolBlock = acc.contentBlocks.find(
|
|
197
|
+
(b) => b.type === "tool_use" && b.toolUseId === event.toolUseId
|
|
198
|
+
);
|
|
199
|
+
if (toolBlock && toolBlock.type === "tool_use") {
|
|
200
|
+
toolBlock.status = event.isError ? "error" : "complete";
|
|
201
|
+
}
|
|
202
|
+
const block = {
|
|
203
|
+
id: generateBlockId(),
|
|
204
|
+
type: "tool_result",
|
|
205
|
+
toolUseId: event.toolUseId,
|
|
206
|
+
content: event.content || "",
|
|
207
|
+
isError: !!event.isError
|
|
208
|
+
};
|
|
209
|
+
acc.contentBlocks.push(block);
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case "turn_result": {
|
|
213
|
+
if (event.subtype !== "success") {
|
|
214
|
+
acc.status = "error";
|
|
215
|
+
}
|
|
216
|
+
if (event.subtype === "success" && event.usage) {
|
|
217
|
+
const block = {
|
|
218
|
+
id: generateBlockId(),
|
|
219
|
+
type: "result_summary",
|
|
220
|
+
totalCostUsd: (_b = event.totalCostUsd) != null ? _b : 0,
|
|
221
|
+
durationMs: (_c = event.durationMs) != null ? _c : 0,
|
|
222
|
+
numTurns: (_d = event.numTurns) != null ? _d : 0,
|
|
223
|
+
usage: event.usage
|
|
224
|
+
};
|
|
225
|
+
acc.contentBlocks.push(block);
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
case "error": {
|
|
230
|
+
acc.status = "error";
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function appendTextBlock(acc, text) {
|
|
236
|
+
const block = { id: generateBlockId(), type: "text", text };
|
|
237
|
+
acc.contentBlocks.push(block);
|
|
238
|
+
acc.flatText += text;
|
|
239
|
+
}
|
|
240
|
+
function markRemainingToolBlocks(acc, status) {
|
|
241
|
+
for (const block of acc.contentBlocks) {
|
|
242
|
+
if (block.type === "tool_use") {
|
|
243
|
+
const tb = block;
|
|
244
|
+
if (tb.status === "running" || tb.status === "pending") {
|
|
245
|
+
tb.status = status;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async function flush(acc) {
|
|
251
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
252
|
+
const finalStatus = acc.status === "streaming" ? "complete" : acc.status;
|
|
253
|
+
try {
|
|
254
|
+
const dataDir = getSpecCatDataDir();
|
|
255
|
+
const filePath = join(dataDir, "conversations", `${acc.conversationId}.json`);
|
|
256
|
+
let conversation;
|
|
257
|
+
if (existsSync(filePath)) {
|
|
258
|
+
const raw = await readFile(filePath, "utf-8");
|
|
259
|
+
conversation = JSON.parse(raw);
|
|
260
|
+
} else {
|
|
261
|
+
conversation = {
|
|
262
|
+
id: acc.conversationId,
|
|
263
|
+
title: acc.userMessage.slice(0, 50),
|
|
264
|
+
messages: [],
|
|
265
|
+
createdAt: now,
|
|
266
|
+
updatedAt: now,
|
|
267
|
+
cwd: process.cwd(),
|
|
268
|
+
source: "scheduler"
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
let updated = false;
|
|
272
|
+
for (let i = conversation.messages.length - 1; i >= 0; i--) {
|
|
273
|
+
const m = conversation.messages[i];
|
|
274
|
+
if (m.role === "assistant" && m.status === "streaming") {
|
|
275
|
+
conversation.messages[i] = {
|
|
276
|
+
...m,
|
|
277
|
+
content: acc.flatText,
|
|
278
|
+
contentBlocks: acc.contentBlocks,
|
|
279
|
+
status: finalStatus,
|
|
280
|
+
timestamp: now
|
|
281
|
+
};
|
|
282
|
+
updated = true;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (!updated) {
|
|
287
|
+
const userMsg = {
|
|
288
|
+
id: generateMessageId(),
|
|
289
|
+
role: "user",
|
|
290
|
+
content: acc.userMessage,
|
|
291
|
+
timestamp: now
|
|
292
|
+
};
|
|
293
|
+
const assistantMsg = {
|
|
294
|
+
id: acc.assistantMessageId,
|
|
295
|
+
role: "assistant",
|
|
296
|
+
content: acc.flatText,
|
|
297
|
+
contentBlocks: acc.contentBlocks,
|
|
298
|
+
timestamp: now,
|
|
299
|
+
status: finalStatus
|
|
300
|
+
};
|
|
301
|
+
conversation.messages.push(userMsg, assistantMsg);
|
|
302
|
+
}
|
|
303
|
+
conversation.updatedAt = now;
|
|
304
|
+
if (acc.providerSessionId) {
|
|
305
|
+
conversation.providerSessionId = acc.providerSessionId;
|
|
306
|
+
}
|
|
307
|
+
await upsertConversationInStorage(conversation, STORAGE_VERSION);
|
|
308
|
+
eventBus.emit(GLOBAL_CHANNEL, {
|
|
309
|
+
type: "notification",
|
|
310
|
+
notificationEvent: "job_persisted",
|
|
311
|
+
conversationId: acc.conversationId
|
|
312
|
+
});
|
|
313
|
+
console.log("[JobPersister] Flushed conversation:", {
|
|
314
|
+
conversationId: acc.conversationId,
|
|
315
|
+
status: acc.status,
|
|
316
|
+
blocks: acc.contentBlocks.length,
|
|
317
|
+
textLength: acc.flatText.length,
|
|
318
|
+
updatedExisting: updated
|
|
319
|
+
});
|
|
320
|
+
} catch (err) {
|
|
321
|
+
console.error("[JobPersister] Failed to flush conversation:", err);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export { startPersisting as s };
|
|
326
|
+
//# sourceMappingURL=jobPersister.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobPersister.mjs","sources":["../../../../server/utils/jobPersister.ts"],"names":[],"mappings":"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"}
|