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.
Files changed (139) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{qt0TxNaY.js → -EMqkm_u.js} +1 -1
  3. package/.output/public/_nuxt/{N3ZxlKm3.js → BDd_kh9e.js} +1 -1
  4. package/.output/public/_nuxt/BJKzOiTU.js +1 -0
  5. package/.output/public/_nuxt/{DqNujSig.js → Bk4uZfKR.js} +1 -1
  6. package/.output/public/_nuxt/C9Qk2Hno.js +1 -0
  7. package/.output/public/_nuxt/CDLI67Cr.js +1 -0
  8. package/.output/public/_nuxt/CLPz4Oer.js +1 -0
  9. package/.output/public/_nuxt/CYVeOpC3.js +1 -0
  10. package/.output/public/_nuxt/CZbP5QXb.js +1 -0
  11. package/.output/public/_nuxt/DQtVbA-s.js +150 -0
  12. package/.output/public/_nuxt/DXWMFGmi.js +1 -0
  13. package/.output/public/_nuxt/DgiJut-o.js +1 -0
  14. package/.output/public/_nuxt/{DUodkQcr.js → FbKhJXKu.js} +3 -3
  15. package/.output/public/_nuxt/builds/latest.json +1 -1
  16. package/.output/public/_nuxt/builds/meta/53b5c409-86a8-4624-8a0f-5bf31ab82deb.json +1 -0
  17. package/.output/public/_nuxt/default.eSO6fRPf.css +1 -0
  18. package/.output/public/_nuxt/entry.BtencOYX.css +1 -0
  19. package/.output/public/_nuxt/useTheme.Dp77PlfC.css +1 -0
  20. package/.output/server/chunks/_/conversationStore.mjs +13 -1
  21. package/.output/server/chunks/_/conversationStore.mjs.map +1 -1
  22. package/.output/server/chunks/_/git.mjs +7 -6
  23. package/.output/server/chunks/_/git.mjs.map +1 -1
  24. package/.output/server/chunks/_/git2.mjs.map +1 -1
  25. package/.output/server/chunks/_/gitApiHelpers.mjs +43 -0
  26. package/.output/server/chunks/_/gitApiHelpers.mjs.map +1 -0
  27. package/.output/server/chunks/_/jobPersister.mjs +326 -0
  28. package/.output/server/chunks/_/jobPersister.mjs.map +1 -0
  29. package/.output/server/chunks/_/jobQueue.mjs +714 -0
  30. package/.output/server/chunks/_/jobQueue.mjs.map +1 -0
  31. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  32. package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
  33. package/.output/server/chunks/nitro/nitro.mjs +693 -657
  34. package/.output/server/chunks/routes/_ws.mjs +133 -527
  35. package/.output/server/chunks/routes/_ws.mjs.map +1 -1
  36. package/.output/server/chunks/routes/api/git/branch-rename.post.mjs +5 -18
  37. package/.output/server/chunks/routes/api/git/branch-rename.post.mjs.map +1 -1
  38. package/.output/server/chunks/routes/api/git/branch.delete.mjs +5 -18
  39. package/.output/server/chunks/routes/api/git/branch.delete.mjs.map +1 -1
  40. package/.output/server/chunks/routes/api/git/branches.get.mjs +5 -18
  41. package/.output/server/chunks/routes/api/git/branches.get.mjs.map +1 -1
  42. package/.output/server/chunks/routes/api/git/checkout.post.mjs +5 -19
  43. package/.output/server/chunks/routes/api/git/checkout.post.mjs.map +1 -1
  44. package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs +5 -18
  45. package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs.map +1 -1
  46. package/.output/server/chunks/routes/api/git/clean.post.mjs +5 -19
  47. package/.output/server/chunks/routes/api/git/clean.post.mjs.map +1 -1
  48. package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs +23 -26
  49. package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs.map +1 -1
  50. package/.output/server/chunks/routes/api/git/commit.post.mjs +5 -19
  51. package/.output/server/chunks/routes/api/git/commit.post.mjs.map +1 -1
  52. package/.output/server/chunks/routes/api/git/diff.get.mjs +5 -24
  53. package/.output/server/chunks/routes/api/git/diff.get.mjs.map +1 -1
  54. package/.output/server/chunks/routes/api/git/fetch.post.mjs +5 -18
  55. package/.output/server/chunks/routes/api/git/fetch.post.mjs.map +1 -1
  56. package/.output/server/chunks/routes/api/git/file-diff.get.mjs +5 -24
  57. package/.output/server/chunks/routes/api/git/file-diff.get.mjs.map +1 -1
  58. package/.output/server/chunks/routes/api/git/graph.get.mjs +9 -20
  59. package/.output/server/chunks/routes/api/git/graph.get.mjs.map +1 -1
  60. package/.output/server/chunks/routes/api/git/log.get.mjs +5 -24
  61. package/.output/server/chunks/routes/api/git/log.get.mjs.map +1 -1
  62. package/.output/server/chunks/routes/api/git/merge-base.get.mjs +5 -24
  63. package/.output/server/chunks/routes/api/git/merge-base.get.mjs.map +1 -1
  64. package/.output/server/chunks/routes/api/git/merge.post.mjs +5 -18
  65. package/.output/server/chunks/routes/api/git/merge.post.mjs.map +1 -1
  66. package/.output/server/chunks/routes/api/git/pull.post.mjs +14 -26
  67. package/.output/server/chunks/routes/api/git/pull.post.mjs.map +1 -1
  68. package/.output/server/chunks/routes/api/git/push.post.mjs +15 -27
  69. package/.output/server/chunks/routes/api/git/push.post.mjs.map +1 -1
  70. package/.output/server/chunks/routes/api/git/rebase.post.mjs +10 -22
  71. package/.output/server/chunks/routes/api/git/rebase.post.mjs.map +1 -1
  72. package/.output/server/chunks/routes/api/git/remote.delete.mjs +5 -18
  73. package/.output/server/chunks/routes/api/git/remote.delete.mjs.map +1 -1
  74. package/.output/server/chunks/routes/api/git/remote.post.mjs +10 -22
  75. package/.output/server/chunks/routes/api/git/remote.post.mjs.map +1 -1
  76. package/.output/server/chunks/routes/api/git/remote.put.mjs +5 -18
  77. package/.output/server/chunks/routes/api/git/remote.put.mjs.map +1 -1
  78. package/.output/server/chunks/routes/api/git/remotes.get.mjs +5 -18
  79. package/.output/server/chunks/routes/api/git/remotes.get.mjs.map +1 -1
  80. package/.output/server/chunks/routes/api/git/reset.post.mjs +12 -24
  81. package/.output/server/chunks/routes/api/git/reset.post.mjs.map +1 -1
  82. package/.output/server/chunks/routes/api/git/revert.post.mjs +5 -18
  83. package/.output/server/chunks/routes/api/git/revert.post.mjs.map +1 -1
  84. package/.output/server/chunks/routes/api/git/show.get.mjs +5 -24
  85. package/.output/server/chunks/routes/api/git/show.get.mjs.map +1 -1
  86. package/.output/server/chunks/routes/api/git/stage.post.mjs +9 -22
  87. package/.output/server/chunks/routes/api/git/stage.post.mjs.map +1 -1
  88. package/.output/server/chunks/routes/api/git/stash-apply.post.mjs +5 -19
  89. package/.output/server/chunks/routes/api/git/stash-apply.post.mjs.map +1 -1
  90. package/.output/server/chunks/routes/api/git/stash-branch.post.mjs +5 -19
  91. package/.output/server/chunks/routes/api/git/stash-branch.post.mjs.map +1 -1
  92. package/.output/server/chunks/routes/api/git/stash-drop.post.mjs +5 -19
  93. package/.output/server/chunks/routes/api/git/stash-drop.post.mjs.map +1 -1
  94. package/.output/server/chunks/routes/api/git/stash-pop.post.mjs +5 -19
  95. package/.output/server/chunks/routes/api/git/stash-pop.post.mjs.map +1 -1
  96. package/.output/server/chunks/routes/api/git/stash.get.mjs +5 -25
  97. package/.output/server/chunks/routes/api/git/stash.get.mjs.map +1 -1
  98. package/.output/server/chunks/routes/api/git/stash.post.mjs +5 -19
  99. package/.output/server/chunks/routes/api/git/stash.post.mjs.map +1 -1
  100. package/.output/server/chunks/routes/api/git/state.get.mjs +5 -25
  101. package/.output/server/chunks/routes/api/git/state.get.mjs.map +1 -1
  102. package/.output/server/chunks/routes/api/git/status.get.mjs +5 -25
  103. package/.output/server/chunks/routes/api/git/status.get.mjs.map +1 -1
  104. package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs +5 -18
  105. package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs.map +1 -1
  106. package/.output/server/chunks/routes/api/git/tag-push.post.mjs +10 -22
  107. package/.output/server/chunks/routes/api/git/tag-push.post.mjs.map +1 -1
  108. package/.output/server/chunks/routes/api/git/tag.delete.mjs +5 -18
  109. package/.output/server/chunks/routes/api/git/tag.delete.mjs.map +1 -1
  110. package/.output/server/chunks/routes/api/git/tag.post.mjs +17 -29
  111. package/.output/server/chunks/routes/api/git/tag.post.mjs.map +1 -1
  112. package/.output/server/chunks/routes/api/git/unstage.post.mjs +5 -19
  113. package/.output/server/chunks/routes/api/git/unstage.post.mjs.map +1 -1
  114. package/.output/server/chunks/routes/api/index.get.mjs +25 -14
  115. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  116. package/.output/server/chunks/routes/api/index.get2.mjs +14 -141
  117. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  118. package/.output/server/chunks/routes/api/index.get3.mjs +167 -0
  119. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -0
  120. package/.output/server/chunks/routes/api/index.post.mjs +77 -116
  121. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  122. package/.output/server/chunks/routes/api/index.post2.mjs +149 -0
  123. package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -0
  124. package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs +48 -0
  125. package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs.map +1 -0
  126. package/.output/server/chunks/routes/api/jobs/_id_.get.mjs +55 -0
  127. package/.output/server/chunks/routes/api/jobs/_id_.get.mjs.map +1 -0
  128. package/.output/server/chunks/routes/api/repository/status.get.mjs +1 -1
  129. package/.output/server/package.json +1 -1
  130. package/package.json +1 -1
  131. package/.output/public/_nuxt/BIw1AQHU.js +0 -150
  132. package/.output/public/_nuxt/DBtLi_wJ.js +0 -1
  133. package/.output/public/_nuxt/DSDWvT5-.js +0 -1
  134. package/.output/public/_nuxt/K5rMM4le.js +0 -1
  135. package/.output/public/_nuxt/builds/meta/c0768eef-2dd5-410c-8648-edbd9e6c218c.json +0 -1
  136. package/.output/public/_nuxt/ddKcAgQK.js +0 -1
  137. package/.output/public/_nuxt/default.CZoNL3P_.css +0 -1
  138. package/.output/public/_nuxt/entry.DLBgeD7S.css +0 -1
  139. 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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"}