@straiffi/archon 1.4.10 → 1.5.0

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 (105) hide show
  1. package/dist/client/assets/GitHubActionsDialog-CQMqcAiI.js +1 -0
  2. package/dist/client/assets/{TestsDialog-Cp3Da2W0.js → TestsDialog-iGukzvw2.js} +2 -2
  3. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CFEtd9pl.js → architectureDiagram-3BPJPVTR-BG4rc0pD.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-GPEHLZMM-9UsBOlSn.js → blockDiagram-GPEHLZMM-BifkewDx.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-AAUBKEIU--TsvWn6X.js → c4Diagram-AAUBKEIU-DEYVUDCs.js} +1 -1
  6. package/dist/client/assets/channel-gy-JdvF3.js +1 -0
  7. package/dist/client/assets/{chunk-2J33WTMH-B3FphDWz.js → chunk-2J33WTMH-DD50YIcA.js} +1 -1
  8. package/dist/client/assets/{chunk-3OPIFGDE-CLbUIPKK.js → chunk-3OPIFGDE-DLbwwbdv.js} +1 -1
  9. package/dist/client/assets/{chunk-5ZQYHXKU-CUHKY5eH.js → chunk-5ZQYHXKU-BW-r3gXJ.js} +1 -1
  10. package/dist/client/assets/{chunk-727SXJPM-DfKJ4Ud0.js → chunk-727SXJPM-B5C_ENX7.js} +1 -1
  11. package/dist/client/assets/{chunk-AQP2D5EJ-B0oLVoZs.js → chunk-AQP2D5EJ-BUT3wmDg.js} +1 -1
  12. package/dist/client/assets/{chunk-CSCIHK7Q-Czl8GWBW.js → chunk-CSCIHK7Q-BO7wWVh_.js} +1 -1
  13. package/dist/client/assets/{chunk-KSCS5N6A-pOOnuun_.js → chunk-KSCS5N6A-DUNFfKB2.js} +1 -1
  14. package/dist/client/assets/{chunk-L5ZTLDWV-DzRVeTqf.js → chunk-L5ZTLDWV-SYJQkU8_.js} +1 -1
  15. package/dist/client/assets/{chunk-LZXEDZCA-MVhzvLVp.js → chunk-LZXEDZCA-DSVJIylK.js} +2 -2
  16. package/dist/client/assets/{chunk-ND2GUHAM-BeNiy3nE.js → chunk-ND2GUHAM-CxL5ue9A.js} +1 -1
  17. package/dist/client/assets/{chunk-NZK2D7GU-CnENvQ9d.js → chunk-NZK2D7GU-BwxeYeqR.js} +1 -1
  18. package/dist/client/assets/{chunk-O5CBEL6O-CkqDMX_f.js → chunk-O5CBEL6O-Covi8YcB.js} +1 -1
  19. package/dist/client/assets/{chunk-WU5MYG2G-sJ18xVVM.js → chunk-WU5MYG2G-DlQoHSB3.js} +1 -1
  20. package/dist/client/assets/classDiagram-4FO5ZUOK-B1Xs78Ge.js +1 -0
  21. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BU_Soq1k.js +1 -0
  22. package/dist/client/assets/{dagre-BM42HDAG-BWnmF2aL.js → dagre-BM42HDAG-CuNExSrh.js} +1 -1
  23. package/dist/client/assets/{diagram-2AECGRRQ-CASRQI5Y.js → diagram-2AECGRRQ-Bk7EYe6Z.js} +1 -1
  24. package/dist/client/assets/{diagram-5GNKFQAL-CY8fXRrV.js → diagram-5GNKFQAL-koHJCfAk.js} +1 -1
  25. package/dist/client/assets/{diagram-KO2AKTUF-vtm-gqIm.js → diagram-KO2AKTUF-DI1Ecx54.js} +1 -1
  26. package/dist/client/assets/{diagram-LMA3HP47-Ck-iA5q1.js → diagram-LMA3HP47-CmFk1MNf.js} +1 -1
  27. package/dist/client/assets/{diagram-OG6HWLK6-ALBEY2Nn.js → diagram-OG6HWLK6-YTiDn39n.js} +1 -1
  28. package/dist/client/assets/{erDiagram-TEJ5UH35-BAHPzYR7.js → erDiagram-TEJ5UH35-DyWU43DX.js} +1 -1
  29. package/dist/client/assets/{flowDiagram-I6XJVG4X-pUYj1KCo.js → flowDiagram-I6XJVG4X-DgbU15ZJ.js} +1 -1
  30. package/dist/client/assets/{ganttDiagram-6RSMTGT7-zw-EKZcX.js → ganttDiagram-6RSMTGT7-CT39xvdk.js} +1 -1
  31. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DmPxQKXO.js → gitGraphDiagram-PVQCEYII-DfK_1xRj.js} +1 -1
  32. package/dist/client/assets/index-BCqJfUGA.css +2 -0
  33. package/dist/client/assets/index-C_XaTJyb.js +261 -0
  34. package/dist/client/assets/{infoDiagram-5YYISTIA-D0zuFK8l.js → infoDiagram-5YYISTIA-C7z_7194.js} +1 -1
  35. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BoNe_Ie6.js → ishikawaDiagram-YF4QCWOH-DhJ7h17n.js} +1 -1
  36. package/dist/client/assets/{journeyDiagram-JHISSGLW-ByAP1uL0.js → journeyDiagram-JHISSGLW-CtkhoMAA.js} +1 -1
  37. package/dist/client/assets/{kanban-definition-UN3LZRKU-CGXOqdl0.js → kanban-definition-UN3LZRKU-Bcas7cg9.js} +1 -1
  38. package/dist/client/assets/{line-BZ3JWBtG.js → line-WO_ReaCl.js} +1 -1
  39. package/dist/client/assets/{mermaid-parser.core-DuHIifHL.js → mermaid-parser.core-WmRuf19A.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-Co8EqKSU.js → mermaid.core-BMdju4xN.js} +3 -3
  41. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Cv3-5Q_b.js → mindmap-definition-RKZ34NQL-DLxsUQmn.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-4H26LBE5-DziVyTJT.js → pieDiagram-4H26LBE5-D-oaWpEg.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DjNtV4An.js → quadrantDiagram-W4KKPZXB-B9krq8I-.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-4Y6WPE33-Cs3npD-z.js → requirementDiagram-4Y6WPE33-m2VnH3vv.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DxepDJwc.js → sankeyDiagram-5OEKKPKP-bCF9Ot9-.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DIPg-NEj.js → sequenceDiagram-3UESZ5HK-C-4zDJcn.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-AJRCARHV-DUA-Ko9b.js → stateDiagram-AJRCARHV-CksbJK59.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BvbN4CmJ.js +1 -0
  49. package/dist/client/assets/{timeline-definition-PNZ67QCA-wvi8pREg.js → timeline-definition-PNZ67QCA-DDxpdMfo.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-CIIHVFJN-CabtIweB.js → vennDiagram-CIIHVFJN-BfQM7_zD.js} +1 -1
  51. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BiOWydTY.js → wardleyDiagram-YWT4CUSO-CuixXlAX.js} +1 -1
  52. package/dist/client/assets/{xychartDiagram-2RQKCTM6-sWfRgDRl.js → xychartDiagram-2RQKCTM6-53YB-tf6.js} +1 -1
  53. package/dist/client/index.html +2 -2
  54. package/dist/server/db.js +14 -3
  55. package/dist/server/db.js.map +1 -1
  56. package/dist/server/index.js +34 -1
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/server/lib/agent.js +853 -161
  59. package/dist/server/lib/agent.js.map +1 -1
  60. package/dist/server/lib/agentRuns.js +22 -0
  61. package/dist/server/lib/agentRuns.js.map +1 -1
  62. package/dist/server/lib/chatMessages.js +24 -8
  63. package/dist/server/lib/chatMessages.js.map +1 -1
  64. package/dist/server/lib/genericToolCall.js +151 -0
  65. package/dist/server/lib/genericToolCall.js.map +1 -0
  66. package/dist/server/lib/mobileAccess.js +45 -2
  67. package/dist/server/lib/mobileAccess.js.map +1 -1
  68. package/dist/server/lib/models.js +89 -36
  69. package/dist/server/lib/models.js.map +1 -1
  70. package/dist/server/lib/opencodeTaskSessions.js +216 -0
  71. package/dist/server/lib/opencodeTaskSessions.js.map +1 -0
  72. package/dist/server/lib/projectMemory.js +38 -8
  73. package/dist/server/lib/projectMemory.js.map +1 -1
  74. package/dist/server/lib/promptSkills.js +5 -0
  75. package/dist/server/lib/promptSkills.js.map +1 -1
  76. package/dist/server/lib/specMessages.js +9 -6
  77. package/dist/server/lib/specMessages.js.map +1 -1
  78. package/dist/server/lib/specs.js +9 -0
  79. package/dist/server/lib/specs.js.map +1 -1
  80. package/dist/server/lib/ticketMessages.js +22 -7
  81. package/dist/server/lib/ticketMessages.js.map +1 -1
  82. package/dist/server/lib/transcriptRuns.js +85 -0
  83. package/dist/server/lib/transcriptRuns.js.map +1 -0
  84. package/dist/server/workers/build.js +12 -2
  85. package/dist/server/workers/build.js.map +1 -1
  86. package/dist/server/workers/chat.js +15 -1
  87. package/dist/server/workers/chat.js.map +1 -1
  88. package/dist/server/workers/followUp.js +12 -2
  89. package/dist/server/workers/followUp.js.map +1 -1
  90. package/dist/server/workers/plan.js +346 -60
  91. package/dist/server/workers/plan.js.map +1 -1
  92. package/dist/server/workers/planFollowUp.js +27 -7
  93. package/dist/server/workers/planFollowUp.js.map +1 -1
  94. package/dist/server/workers/review.js +50 -9
  95. package/dist/server/workers/review.js.map +1 -1
  96. package/dist/server/workers/specSession.js +36 -1
  97. package/dist/server/workers/specSession.js.map +1 -1
  98. package/package.json +1 -1
  99. package/dist/client/assets/GitHubActionsDialog-ln1X9xDf.js +0 -1
  100. package/dist/client/assets/channel-BjRPoR7Z.js +0 -1
  101. package/dist/client/assets/classDiagram-4FO5ZUOK-BjzBLL5f.js +0 -1
  102. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BDLW6NLv.js +0 -1
  103. package/dist/client/assets/index-BokL1E46.css +0 -2
  104. package/dist/client/assets/index-WeECH1eZ.js +0 -260
  105. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D6OlcyEp.js +0 -1
@@ -1,5 +1,8 @@
1
- import { execFile } from 'child_process';
1
+ import { spawn } from 'child_process';
2
+ import { createHash } from 'crypto';
2
3
  const CACHE_TTL_MS = 30_000;
4
+ const MODEL_DISCOVERY_SAMPLE_COUNT = 3;
5
+ const MODEL_DISCOVERY_TIMEOUT_MS = 30_000;
3
6
  const modelCache = new Map();
4
7
  const inFlightModelDiscovery = new Map();
5
8
  const ANSI_ESCAPE_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
@@ -41,30 +44,36 @@ const CLAUDE_MODEL_ALIASES = new Set(CLAUDE_MODELS.map(model => model.id));
41
44
  const toProviderSummary = (models) => {
42
45
  return Array.from(new Set(models.map(model => model.provider).filter(Boolean))).sort();
43
46
  };
44
- const getMissingProviders = (previousModels, nextModels) => {
45
- const nextProviders = new Set(nextModels.map(model => model.provider).filter(Boolean));
46
- return toProviderSummary(previousModels).filter(provider => !nextProviders.has(provider));
47
+ const toModelIdHash = (models) => {
48
+ const modelIds = models.map(model => model.id).sort();
49
+ return createHash('sha256').update(modelIds.join('\n')).digest('hex').slice(0, 12);
47
50
  };
48
- const shouldPreserveCachedModels = (cachedModels, discoveredModels) => {
49
- if (cachedModels.length === 0) {
50
- return false;
51
- }
52
- if (discoveredModels.length === 0) {
53
- return true;
51
+ const getMissingModelIds = (previousModels, nextModels) => {
52
+ const nextModelIds = new Set(nextModels.map(model => model.id));
53
+ return previousModels.map(model => model.id).filter(modelId => !nextModelIds.has(modelId));
54
+ };
55
+ const mergeModelLists = (...modelLists) => {
56
+ const modelsById = new Map();
57
+ for (const models of modelLists) {
58
+ for (const model of models) {
59
+ modelsById.set(model.id, model);
60
+ }
54
61
  }
55
- return getMissingProviders(cachedModels, discoveredModels).length > 0;
62
+ return Array.from(modelsById.values());
56
63
  };
57
- const logPreservedCache = (reason, cachedModels, discoveredModels) => {
58
- const missingProviders = getMissingProviders(cachedModels, discoveredModels);
64
+ const logMergedDiscovery = (cachedModels, discoveredModels) => {
65
+ const missingModelIds = getMissingModelIds(cachedModels, discoveredModels);
66
+ const addedModelIds = getMissingModelIds(discoveredModels, cachedModels);
59
67
  const details = [
60
- `reason=${reason}`,
61
68
  `cached=${cachedModels.length}`,
62
69
  `discovered=${discoveredModels.length}`,
70
+ `added=${addedModelIds.length}`,
71
+ `preserved=${missingModelIds.length}`,
63
72
  ];
64
- if (missingProviders.length > 0) {
65
- details.push(`missing_providers=${missingProviders.join(',')}`);
73
+ if (missingModelIds.length > 0) {
74
+ details.push(`missing_preview=${missingModelIds.slice(0, 5).join(',')}`);
66
75
  }
67
- console.warn(`[models] preserving cached OpenCode models (${details.join(' ')})`);
76
+ console.warn(`[models] merged OpenCode discovery with high-water cache (${details.join(' ')})`);
68
77
  };
69
78
  const stripFormatting = (value) => {
70
79
  return String(value ?? '')
@@ -147,6 +156,7 @@ const parseVerboseModels = (rawOutput) => {
147
156
  const models = [];
148
157
  let currentModelId = '';
149
158
  let currentJsonLines = [];
159
+ let rawModelIdCount = 0;
150
160
  const flushCurrentModel = () => {
151
161
  if (!currentModelId || currentJsonLines.length === 0) {
152
162
  currentModelId = '';
@@ -157,6 +167,7 @@ const parseVerboseModels = (rawOutput) => {
157
167
  const parsed = JSON.parse(currentJsonLines.join('\n'));
158
168
  const normalizedId = normalizeModelId(currentModelId);
159
169
  if (!normalizedId) {
170
+ console.warn(`[models] dropped model ID="${currentModelId}", reason=invalid_id`);
160
171
  return;
161
172
  }
162
173
  models.push({
@@ -173,7 +184,7 @@ const parseVerboseModels = (rawOutput) => {
173
184
  });
174
185
  }
175
186
  catch {
176
- // Ignore malformed entries and keep the remaining discovered models.
187
+ console.warn(`[models] dropped model ID="${currentModelId}", reason=json_parse_error, json_preview="${currentJsonLines.slice(0, 3).join(' ').slice(0, 120)}"`);
177
188
  }
178
189
  finally {
179
190
  currentModelId = '';
@@ -184,6 +195,7 @@ const parseVerboseModels = (rawOutput) => {
184
195
  const trimmedLine = line.trim();
185
196
  const normalizedModelId = normalizeModelId(trimmedLine);
186
197
  if (normalizedModelId && !trimmedLine.startsWith('{') && !trimmedLine.startsWith('"')) {
198
+ rawModelIdCount++;
187
199
  flushCurrentModel();
188
200
  currentModelId = normalizedModelId;
189
201
  continue;
@@ -194,34 +206,75 @@ const parseVerboseModels = (rawOutput) => {
194
206
  currentJsonLines.push(line);
195
207
  }
196
208
  flushCurrentModel();
209
+ console.warn(`[models] parsed ${models.length} models from ${rawModelIdCount} raw model ID lines`);
197
210
  return models;
198
211
  };
199
- const runModelDiscovery = () => new Promise((resolve, reject) => {
200
- execFile('opencode', ['models', '--verbose'], { encoding: 'utf8' }, (err, stdout) => {
201
- if (err) {
202
- reject(err);
212
+ const runModelDiscoveryOnce = () => new Promise((resolve, reject) => {
213
+ const child = spawn('opencode', ['models', '--verbose'], {
214
+ stdio: ['ignore', 'pipe', 'pipe'],
215
+ });
216
+ let stdout = '';
217
+ let stderr = '';
218
+ let settled = false;
219
+ const timer = setTimeout(() => {
220
+ if (settled) {
221
+ return;
222
+ }
223
+ settled = true;
224
+ child.kill('SIGKILL');
225
+ reject(new Error(`opencode models timed out after ${MODEL_DISCOVERY_TIMEOUT_MS}ms`));
226
+ }, MODEL_DISCOVERY_TIMEOUT_MS);
227
+ child.stdout?.on('data', (chunk) => { stdout += chunk.toString('utf8'); });
228
+ child.stderr?.on('data', (chunk) => { stderr += chunk.toString('utf8'); });
229
+ child.on('close', (code) => {
230
+ if (settled) {
231
+ return;
232
+ }
233
+ settled = true;
234
+ clearTimeout(timer);
235
+ if (code !== 0) {
236
+ reject(new Error(`opencode models exited with code ${code}: ${stderr.slice(0, 500)}`));
203
237
  return;
204
238
  }
205
239
  resolve(parseVerboseModels(stdout));
206
240
  });
241
+ child.on('error', (error) => {
242
+ if (settled) {
243
+ return;
244
+ }
245
+ settled = true;
246
+ clearTimeout(timer);
247
+ reject(error);
248
+ });
207
249
  });
250
+ const runModelDiscovery = async () => {
251
+ const samples = [];
252
+ let lastError;
253
+ for (let attempt = 1; attempt <= MODEL_DISCOVERY_SAMPLE_COUNT; attempt++) {
254
+ try {
255
+ const models = await runModelDiscoveryOnce();
256
+ samples.push(models);
257
+ console.warn(`[models] discovery sample ${attempt}/${MODEL_DISCOVERY_SAMPLE_COUNT}: ${models.length} models, hash=${toModelIdHash(models)}, providers=[${toProviderSummary(models).join(',')}]`);
258
+ }
259
+ catch (error) {
260
+ lastError = error;
261
+ console.warn(`[models] discovery sample ${attempt}/${MODEL_DISCOVERY_SAMPLE_COUNT} failed`, error);
262
+ }
263
+ }
264
+ if (samples.length === 0) {
265
+ throw lastError;
266
+ }
267
+ const discoveredModels = mergeModelLists(...samples);
268
+ console.warn(`[models] stabilized discovery: ${discoveredModels.length} models from ${samples.length} successful samples, hash=${toModelIdHash(discoveredModels)}, providers=[${toProviderSummary(discoveredModels).join(',')}]`);
269
+ return discoveredModels;
270
+ };
208
271
  const discoverModelsWithCacheFallback = async (cachedModels) => {
209
272
  const discoveredModels = await runModelDiscovery();
210
- if (!cachedModels || !shouldPreserveCachedModels(cachedModels, discoveredModels)) {
273
+ if (!cachedModels) {
211
274
  return discoveredModels;
212
275
  }
213
- try {
214
- const retriedModels = await runModelDiscovery();
215
- if (!shouldPreserveCachedModels(cachedModels, retriedModels)) {
216
- return retriedModels;
217
- }
218
- logPreservedCache('provider-regression', cachedModels, retriedModels);
219
- return cachedModels;
220
- }
221
- catch (error) {
222
- console.warn('[models] retrying OpenCode model discovery failed; preserving cached models', error);
223
- return cachedModels;
224
- }
276
+ logMergedDiscovery(cachedModels, discoveredModels);
277
+ return mergeModelLists(cachedModels, discoveredModels);
225
278
  };
226
279
  export const getDiscoveredModels = async (tool) => {
227
280
  if (tool === 'claude') {
@@ -232,6 +285,7 @@ export const getDiscoveredModels = async (tool) => {
232
285
  }
233
286
  const cached = modelCache.get(tool);
234
287
  if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
288
+ console.warn(`[models] cache hit, age=${Math.round((Date.now() - cached.timestamp) / 1000)}s, ${cached.models.length} models, providers=[${toProviderSummary(cached.models).join(',')}]`);
235
289
  return cached.models;
236
290
  }
237
291
  const inFlightDiscovery = inFlightModelDiscovery.get(tool);
@@ -263,6 +317,5 @@ export const getDiscoveredModels = async (tool) => {
263
317
  };
264
318
  export const clearModelCache = () => {
265
319
  modelCache.clear();
266
- inFlightModelDiscovery.clear();
267
320
  };
268
321
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../server/lib/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../server/lib/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import Database from 'better-sqlite3';
2
+ import { resolveOpencodeDbPath } from './runtimePaths.js';
3
+ const normalizeToolName = (value) => {
4
+ return typeof value === 'string' ? value.toLowerCase().replace(/[^a-z0-9]/g, '') : '';
5
+ };
6
+ const isTaskTool = (value) => {
7
+ const normalized = normalizeToolName(value);
8
+ return normalized === 'task' || normalized === 'subagent' || normalized === 'agent';
9
+ };
10
+ const parseJsonObject = (value) => {
11
+ if (!value) {
12
+ return null;
13
+ }
14
+ try {
15
+ const parsed = JSON.parse(value);
16
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
17
+ ? parsed
18
+ : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ };
24
+ const getString = (value) => {
25
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
26
+ };
27
+ const getNestedString = (value, paths) => {
28
+ for (const path of paths) {
29
+ let current = value;
30
+ for (const segment of path) {
31
+ if (!current || typeof current !== 'object' || !(segment in current)) {
32
+ current = null;
33
+ break;
34
+ }
35
+ current = current[segment];
36
+ }
37
+ const resolved = getString(current);
38
+ if (resolved) {
39
+ return resolved;
40
+ }
41
+ }
42
+ return null;
43
+ };
44
+ const getTaskLabel = (part) => {
45
+ const description = getNestedString(part, [
46
+ ['state', 'input', 'description'],
47
+ ['state', 'input', 'title'],
48
+ ['state', 'input', 'task'],
49
+ ['state', 'input', 'subagent_type'],
50
+ ['state', 'input', 'prompt'],
51
+ ]) ?? 'Subagent';
52
+ const firstLine = description.split('\n')[0] ?? description;
53
+ const clipped = firstLine.length > 120 ? `${firstLine.slice(0, 117)}...` : firstLine;
54
+ return clipped.startsWith('Subagent:') ? clipped : `Subagent: ${clipped}`;
55
+ };
56
+ export const parseOpencodeTaskEnvelope = (value) => {
57
+ if (!value) {
58
+ return null;
59
+ }
60
+ const taskStart = value.match(/<task\b([^>]*)>/i);
61
+ if (!taskStart) {
62
+ return null;
63
+ }
64
+ const attributes = taskStart[1] ?? '';
65
+ const childSessionId = attributes.match(/\bid=["']([^"']+)["']/i)?.[1]?.trim() || null;
66
+ const state = attributes.match(/\bstate=["']([^"']+)["']/i)?.[1]?.trim() || null;
67
+ const taskContent = value.slice((taskStart.index ?? 0) + taskStart[0].length);
68
+ const resultStart = taskContent.match(/<task_result>/i);
69
+ if (!resultStart) {
70
+ return { childSessionId, state, result: null };
71
+ }
72
+ const resultContent = taskContent.slice((resultStart.index ?? 0) + resultStart[0].length);
73
+ const resultEndIndex = resultContent.search(/<\/task_result>|<\/task>/i);
74
+ const result = (resultEndIndex >= 0 ? resultContent.slice(0, resultEndIndex) : resultContent).trim() || null;
75
+ return { childSessionId, state, result };
76
+ };
77
+ const mapTaskStatus = (value) => {
78
+ const normalized = value?.toLowerCase();
79
+ if (normalized === 'error' || normalized === 'failed') {
80
+ return 'error';
81
+ }
82
+ if (normalized === 'completed' || normalized === 'complete' || normalized === 'done') {
83
+ return 'done';
84
+ }
85
+ return 'running';
86
+ };
87
+ const getColumns = (database, table) => {
88
+ return new Set(database.prepare(`PRAGMA table_info(${table})`).all()
89
+ .map(row => row.name)
90
+ .filter((name) => Boolean(name)));
91
+ };
92
+ export const createOpencodeTaskSessionReader = () => {
93
+ let database = null;
94
+ try {
95
+ database = new Database(resolveOpencodeDbPath(), { readonly: true });
96
+ const sessionColumns = getColumns(database, 'session');
97
+ const messageColumns = getColumns(database, 'message');
98
+ const partColumns = getColumns(database, 'part');
99
+ const canReadTasks = ['id', 'session_id', 'time_created', 'data'].every(column => partColumns.has(column));
100
+ const canFindChildren = ['id', 'parent_id', 'time_created'].every(column => sessionColumns.has(column));
101
+ const canReadTranscript = canReadTasks
102
+ && ['id', 'session_id', 'data'].every(column => messageColumns.has(column))
103
+ && partColumns.has('message_id');
104
+ if (!canReadTasks) {
105
+ database.close();
106
+ return null;
107
+ }
108
+ const listTaskInvocations = (parentSessionId, since) => {
109
+ if (!database) {
110
+ return [];
111
+ }
112
+ const rows = database.prepare(`
113
+ SELECT id, data, time_created
114
+ FROM part
115
+ WHERE session_id = ? AND time_created >= ?
116
+ ORDER BY time_created ASC, id ASC
117
+ `).all(parentSessionId, since);
118
+ return rows.flatMap(row => {
119
+ const part = parseJsonObject(row.data);
120
+ if (!part || part.type !== 'tool' || !isTaskTool(part.tool)) {
121
+ return [];
122
+ }
123
+ const callId = getNestedString(part, [['callID'], ['callId'], ['id']]);
124
+ if (!callId) {
125
+ return [];
126
+ }
127
+ const rawOutput = getNestedString(part, [['state', 'output']]);
128
+ const envelope = parseOpencodeTaskEnvelope(rawOutput);
129
+ const childSessionId = getNestedString(part, [
130
+ ['state', 'metadata', 'sessionID'],
131
+ ['state', 'metadata', 'sessionId'],
132
+ ['state', 'metadata', 'session_id'],
133
+ ]) ?? envelope?.childSessionId ?? null;
134
+ const rawStatus = getNestedString(part, [['state', 'status']]) ?? envelope?.state ?? null;
135
+ return [{
136
+ callId,
137
+ label: getTaskLabel(part),
138
+ status: mapTaskStatus(rawStatus),
139
+ output: envelope ? envelope.result : rawOutput,
140
+ childSessionId,
141
+ timeCreated: Number(row.time_created ?? 0),
142
+ }];
143
+ });
144
+ };
145
+ const findParentSessionSince = (since) => {
146
+ if (!database) {
147
+ return null;
148
+ }
149
+ const parentFilter = canFindChildren ? 'AND parent_id IS NULL' : '';
150
+ const row = database.prepare(`
151
+ SELECT id, title, time_created
152
+ FROM session
153
+ WHERE time_created >= ? ${parentFilter}
154
+ ORDER BY time_created ASC
155
+ LIMIT 1
156
+ `).get(since);
157
+ return getString(row?.id);
158
+ };
159
+ const listChildSessions = (parentSessionId, since) => {
160
+ if (!database || !canFindChildren) {
161
+ return [];
162
+ }
163
+ const titleColumn = sessionColumns.has('title') ? 'title' : 'NULL AS title';
164
+ const rows = database.prepare(`
165
+ SELECT id, ${titleColumn}, time_created
166
+ FROM session
167
+ WHERE parent_id = ? AND time_created >= ?
168
+ ORDER BY time_created ASC, id ASC
169
+ `).all(parentSessionId, since);
170
+ return rows.flatMap(row => {
171
+ const id = getString(row.id);
172
+ return id ? [{ id, title: getString(row.title), timeCreated: Number(row.time_created ?? 0) }] : [];
173
+ });
174
+ };
175
+ const listSessionParts = (sessionId) => {
176
+ if (!database || !canReadTranscript) {
177
+ return [];
178
+ }
179
+ const rows = database.prepare(`
180
+ SELECT p.id, p.data, p.time_created, m.data AS message_data
181
+ FROM part p
182
+ INNER JOIN message m ON m.id = p.message_id
183
+ WHERE p.session_id = ?
184
+ ORDER BY p.time_created ASC, p.id ASC
185
+ `).all(sessionId);
186
+ return rows.flatMap(row => {
187
+ const part = parseJsonObject(row.data);
188
+ const message = parseJsonObject(row.message_data);
189
+ if (!part) {
190
+ return [];
191
+ }
192
+ return [{
193
+ id: getString(row.id) ?? `${row.time_created ?? 0}`,
194
+ role: getString(message?.role),
195
+ timeCreated: Number(row.time_created ?? 0),
196
+ data: part,
197
+ }];
198
+ });
199
+ };
200
+ return {
201
+ findParentSessionSince,
202
+ listTaskInvocations,
203
+ listChildSessions,
204
+ listSessionParts,
205
+ close: () => {
206
+ database?.close();
207
+ database = null;
208
+ },
209
+ };
210
+ }
211
+ catch {
212
+ database?.close();
213
+ return null;
214
+ }
215
+ };
216
+ //# sourceMappingURL=opencodeTaskSessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodeTaskSessions.js","sourceRoot":"","sources":["../../../server/lib/opencodeTaskSessions.ts"],"names":[],"mappings":"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"}
@@ -288,6 +288,7 @@ export const serializeProjectMemoryFromConventionValue = (convention) => {
288
288
  source_stage: null,
289
289
  ticket_id: null,
290
290
  chat_session_id: null,
291
+ spec_session_id: null,
291
292
  duplicate_match: null,
292
293
  created_at: convention.created_at,
293
294
  updated_at: convention.updated_at,
@@ -314,6 +315,7 @@ export const serializeProjectMemoryFromDecisionValue = (decision) => {
314
315
  source_stage: null,
315
316
  ticket_id: null,
316
317
  chat_session_id: null,
318
+ spec_session_id: null,
317
319
  duplicate_match: null,
318
320
  created_at: decision.created_at,
319
321
  updated_at: decision.updated_at,
@@ -458,6 +460,7 @@ const serializeProjectMemorySuggestion = (row) => {
458
460
  project_id: row.project_id,
459
461
  ticket_id: row.ticket_id,
460
462
  chat_session_id: row.chat_session_id,
463
+ spec_session_id: row.spec_session_id,
461
464
  source_stage: row.source_stage,
462
465
  kind: 'decision',
463
466
  title: values.title,
@@ -484,6 +487,7 @@ const serializeProjectMemorySuggestion = (row) => {
484
487
  project_id: row.project_id,
485
488
  ticket_id: row.ticket_id,
486
489
  chat_session_id: row.chat_session_id,
490
+ spec_session_id: row.spec_session_id,
487
491
  source_stage: row.source_stage,
488
492
  kind: 'convention',
489
493
  title: values.title,
@@ -531,6 +535,7 @@ export const serializeProjectMemoryFromSuggestionValue = (suggestion) => {
531
535
  source_stage: suggestion.source_stage,
532
536
  ticket_id: suggestion.ticket_id,
533
537
  chat_session_id: suggestion.chat_session_id,
538
+ spec_session_id: suggestion.spec_session_id,
534
539
  duplicate_match: suggestion.duplicate_match?.decision
535
540
  ? {
536
541
  type: 'near_duplicate',
@@ -561,6 +566,7 @@ export const serializeProjectMemoryFromSuggestionValue = (suggestion) => {
561
566
  source_stage: suggestion.source_stage,
562
567
  ticket_id: suggestion.ticket_id,
563
568
  chat_session_id: suggestion.chat_session_id,
569
+ spec_session_id: suggestion.spec_session_id,
564
570
  duplicate_match: suggestion.duplicate_match?.convention
565
571
  ? {
566
572
  type: 'near_duplicate',
@@ -1117,13 +1123,14 @@ const getProjectMemorySuggestionRowById = (projectId, suggestionId) => {
1117
1123
  AND project_id = ?
1118
1124
  `).get(suggestionId, projectId);
1119
1125
  };
1120
- const listProjectMemorySuggestionRows = (projectId, { ticketId, chatSessionId, status = 'pending', } = {}) => {
1126
+ const listProjectMemorySuggestionRows = (projectId, { ticketId, chatSessionId, specSessionId, status = 'pending', } = {}) => {
1121
1127
  const rows = db.prepare(`
1122
1128
  SELECT *
1123
1129
  FROM project_memory_suggestions
1124
- WHERE project_id = ?
1130
+ WHERE project_id = ?
1125
1131
  ${ticketId ? 'AND ticket_id = ?' : ''}
1126
1132
  ${chatSessionId ? 'AND chat_session_id = ?' : ''}
1133
+ ${specSessionId ? 'AND spec_session_id = ?' : ''}
1127
1134
  ${status ? 'AND status = ?' : ''}
1128
1135
  ORDER BY
1129
1136
  updated_at DESC,
@@ -1133,6 +1140,7 @@ const listProjectMemorySuggestionRows = (projectId, { ticketId, chatSessionId, s
1133
1140
  projectId,
1134
1141
  ...(ticketId ? [ticketId] : []),
1135
1142
  ...(chatSessionId ? [chatSessionId] : []),
1143
+ ...(specSessionId ? [specSessionId] : []),
1136
1144
  ...(status ? [status] : []),
1137
1145
  ]));
1138
1146
  return rows.filter(row => PROJECT_MEMORY_SUGGESTION_STATUSES.includes(row.status));
@@ -1146,6 +1154,15 @@ const listResolvedProjectMemoryIdsForChatSession = (projectId, chatSessionId) =>
1146
1154
  })
1147
1155
  .map(row => row.resolved_memory_id));
1148
1156
  };
1157
+ const listResolvedProjectMemoryIdsForSpecSession = (projectId, specSessionId) => {
1158
+ return new Set(listProjectMemorySuggestionRows(projectId, { specSessionId, status: null })
1159
+ .filter(row => {
1160
+ return (row.status === 'accepted' || row.status === 'applied_to_existing')
1161
+ && typeof row.resolved_memory_id === 'string'
1162
+ && row.resolved_memory_id.trim().length > 0;
1163
+ })
1164
+ .map(row => row.resolved_memory_id));
1165
+ };
1149
1166
  const toProjectMemorySuggestionCandidate = (row) => {
1150
1167
  const values = parseProjectMemorySuggestionValues(row);
1151
1168
  if (!values) {
@@ -1156,12 +1173,12 @@ const toProjectMemorySuggestionCandidate = (row) => {
1156
1173
  ...values,
1157
1174
  };
1158
1175
  };
1159
- export const listProjectMemorySuggestions = (projectId, { ticketId, chatSessionId, status = 'pending', } = {}) => {
1160
- return listProjectMemorySuggestionRows(projectId, { ticketId, chatSessionId, status })
1176
+ export const listProjectMemorySuggestions = (projectId, { ticketId, chatSessionId, specSessionId, status = 'pending', } = {}) => {
1177
+ return listProjectMemorySuggestionRows(projectId, { ticketId, chatSessionId, specSessionId, status })
1161
1178
  .map(serializeProjectMemorySuggestion)
1162
1179
  .filter((suggestion) => suggestion !== null);
1163
1180
  };
1164
- export const listProjectMemories = (projectId, { states, kinds, sources, ticketId, chatSessionId, } = {}) => {
1181
+ export const listProjectMemories = (projectId, { states, kinds, sources, ticketId, chatSessionId, specSessionId, } = {}) => {
1165
1182
  const allowedStates = (states ?? []).filter(state => PROJECT_MEMORY_STATES.includes(state));
1166
1183
  const allowedKinds = (kinds ?? []).filter(kind => PROJECT_MEMORY_KINDS.includes(kind));
1167
1184
  const allowedSources = (sources ?? []).filter(source => PROJECT_MEMORY_SOURCES.includes(source));
@@ -1195,6 +1212,7 @@ export const listProjectMemories = (projectId, { states, kinds, sources, ticketI
1195
1212
  ...listProjectMemorySuggestionRows(projectId, {
1196
1213
  ticketId,
1197
1214
  chatSessionId,
1215
+ specSessionId,
1198
1216
  status: null,
1199
1217
  })
1200
1218
  .map(serializeProjectMemoryFromSuggestion)
@@ -1236,7 +1254,7 @@ export const getProjectMemoryById = (projectId, memoryId) => {
1236
1254
  return suggestion ? serializeProjectMemoryFromSuggestionValue(suggestion) : null;
1237
1255
  };
1238
1256
  const persistProjectMemorySuggestionsForSource = (projectId, source, sourceStage, suggestions) => {
1239
- if (!source.ticketId && !source.chatSessionId) {
1257
+ if (!source.ticketId && !source.chatSessionId && !source.specSessionId) {
1240
1258
  return [];
1241
1259
  }
1242
1260
  if (suggestions.length === 0) {
@@ -1250,6 +1268,9 @@ const persistProjectMemorySuggestionsForSource = (projectId, source, sourceStage
1250
1268
  const resolvedChatSessionMemoryIds = source.chatSessionId
1251
1269
  ? listResolvedProjectMemoryIdsForChatSession(projectId, source.chatSessionId)
1252
1270
  : new Set();
1271
+ const resolvedSpecSessionMemoryIds = source.specSessionId
1272
+ ? listResolvedProjectMemoryIdsForSpecSession(projectId, source.specSessionId)
1273
+ : new Set();
1253
1274
  const createdIds = [];
1254
1275
  for (const suggestion of suggestions) {
1255
1276
  const duplicate = classifyProjectMemorySuggestionDuplicate({
@@ -1266,6 +1287,11 @@ const persistProjectMemorySuggestionsForSource = (projectId, source, sourceStage
1266
1287
  && resolvedChatSessionMemoryIds.has(duplicate.targetMemoryId)) {
1267
1288
  continue;
1268
1289
  }
1290
+ if (duplicate?.action === 'mark_near_duplicate'
1291
+ && source.specSessionId
1292
+ && resolvedSpecSessionMemoryIds.has(duplicate.targetMemoryId)) {
1293
+ continue;
1294
+ }
1269
1295
  const id = randomUUID();
1270
1296
  db.prepare(`
1271
1297
  INSERT INTO project_memory_suggestions (
@@ -1273,6 +1299,7 @@ const persistProjectMemorySuggestionsForSource = (projectId, source, sourceStage
1273
1299
  project_id,
1274
1300
  ticket_id,
1275
1301
  chat_session_id,
1302
+ spec_session_id,
1276
1303
  source_stage,
1277
1304
  kind,
1278
1305
  title,
@@ -1285,8 +1312,8 @@ const persistProjectMemorySuggestionsForSource = (projectId, source, sourceStage
1285
1312
  status,
1286
1313
  resolved_memory_id
1287
1314
  )
1288
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', NULL)
1289
- `).run(id, projectId, source.ticketId ?? null, source.chatSessionId ?? null, sourceStage, suggestion.kind, suggestion.title, suggestion.scope, getProjectMemorySuggestionContent(suggestion), suggestion.rationale, JSON.stringify(suggestion.kind === 'decision'
1315
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', NULL)
1316
+ `).run(id, projectId, source.ticketId ?? null, source.chatSessionId ?? null, source.specSessionId ?? null, sourceStage, suggestion.kind, suggestion.title, suggestion.scope, getProjectMemorySuggestionContent(suggestion), suggestion.rationale, JSON.stringify(suggestion.kind === 'decision'
1290
1317
  ? { implications: suggestion.implications }
1291
1318
  : { stages: suggestion.stages, priority: suggestion.priority, injection_mode: suggestion.injection_mode }), duplicate?.action === 'mark_near_duplicate' ? 'near_duplicate' : 'none', duplicate?.action === 'mark_near_duplicate' ? duplicate.targetMemoryId : null);
1292
1319
  createdIds.push(id);
@@ -1302,6 +1329,9 @@ export const persistProjectMemorySuggestions = (projectId, ticketId, sourceStage
1302
1329
  export const persistChatSessionProjectMemorySuggestions = (projectId, chatSessionId, suggestions) => {
1303
1330
  return persistProjectMemorySuggestionsForSource(projectId, { chatSessionId }, 'chat', suggestions);
1304
1331
  };
1332
+ export const persistSpecSessionProjectMemorySuggestions = (projectId, specSessionId, suggestions) => {
1333
+ return persistProjectMemorySuggestionsForSource(projectId, { specSessionId }, 'plan', suggestions);
1334
+ };
1305
1335
  const updateProjectMemorySuggestionStatus = (projectId, suggestionId, status, resolvedMemoryId) => {
1306
1336
  db.prepare(`
1307
1337
  UPDATE project_memory_suggestions