@goondocks/myco 0.19.0 → 0.19.2

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 (151) hide show
  1. package/dist/{agent-run-EADUYYAS.js → agent-run-4QUP3G4V.js} +7 -7
  2. package/dist/{agent-tasks-GC77JXQB.js → agent-tasks-NVOWYBLB.js} +7 -7
  3. package/dist/{chunk-MDEUXYJG.js → chunk-3C4LT4BW.js} +11 -6
  4. package/dist/chunk-3C4LT4BW.js.map +1 -0
  5. package/dist/{chunk-LLJMDXO2.js → chunk-3J6TUJSV.js} +3 -3
  6. package/dist/{chunk-2LN2BBKA.js → chunk-6DDRJQ4X.js} +2 -2
  7. package/dist/{chunk-YPWF322W.js → chunk-6ZDJXSEO.js} +3 -3
  8. package/dist/{chunk-2DF4OZ2D.js → chunk-7ONVLO43.js} +11 -6
  9. package/dist/chunk-7ONVLO43.js.map +1 -0
  10. package/dist/{chunk-INWD6AIQ.js → chunk-AULBWINA.js} +2 -2
  11. package/dist/{chunk-UW6DGPSV.js → chunk-D5X4MMKR.js} +3 -3
  12. package/dist/{chunk-2CKDAFSX.js → chunk-DDOPAV5O.js} +2 -2
  13. package/dist/{chunk-MVBCON4D.js → chunk-DURKJTVO.js} +2 -2
  14. package/dist/{chunk-REN37KYI.js → chunk-FGKCE5AE.js} +7 -2
  15. package/dist/chunk-FGKCE5AE.js.map +1 -0
  16. package/dist/{chunk-W4VHC2ES.js → chunk-I54KLC6H.js} +3 -1
  17. package/dist/{chunk-W4VHC2ES.js.map → chunk-I54KLC6H.js.map} +1 -1
  18. package/dist/{chunk-OZF5EURR.js → chunk-IXVAYN3P.js} +4 -4
  19. package/dist/{chunk-3TPD6HEF.js → chunk-KYH4V4ML.js} +3 -3
  20. package/dist/{team-N6TXS2PF.js → chunk-PLYWR5D7.js} +246 -61
  21. package/dist/chunk-PLYWR5D7.js.map +1 -0
  22. package/dist/{chunk-KSXTNYXO.js → chunk-PMT2LSTQ.js} +2 -2
  23. package/dist/{chunk-AELJ4PS5.js → chunk-Q4QD6LJT.js} +5 -5
  24. package/dist/{chunk-2OO3BRFK.js → chunk-Q6OEZM3S.js} +26 -2
  25. package/dist/chunk-Q6OEZM3S.js.map +1 -0
  26. package/dist/{chunk-CYBC2HZ3.js → chunk-QMTXVFA7.js} +3 -3
  27. package/dist/{chunk-RXROZBSK.js → chunk-THZKOZ4M.js} +419 -410
  28. package/dist/chunk-THZKOZ4M.js.map +1 -0
  29. package/dist/{chunk-E7NUADTQ.js → chunk-UUHLLQXO.js} +2 -1
  30. package/dist/{chunk-E7NUADTQ.js.map → chunk-UUHLLQXO.js.map} +1 -1
  31. package/dist/{chunk-SCI55NKY.js → chunk-VQF5E4ZX.js} +2 -2
  32. package/dist/{chunk-MS6FDV45.js → chunk-WKNAKQKA.js} +2 -2
  33. package/dist/{chunk-N77K772N.js → chunk-XMPCB2P2.js} +5 -5
  34. package/dist/chunk-XMPCB2P2.js.map +1 -0
  35. package/dist/{cli-X7CFP4YD.js → cli-GDHPLWS7.js} +41 -41
  36. package/dist/{client-YA33HUFY.js → client-UCELFVZF.js} +5 -5
  37. package/dist/{config-RFB2DJC6.js → config-2KQ45OC5.js} +4 -4
  38. package/dist/{detect-providers-2OQBU4VX.js → detect-providers-2EY55EHK.js} +5 -5
  39. package/dist/{doctor-FAH7N66M.js → doctor-7ATZHQIY.js} +11 -11
  40. package/dist/{executor-ICTRRUBY.js → executor-YO4RIKJQ.js} +55 -35
  41. package/dist/executor-YO4RIKJQ.js.map +1 -0
  42. package/dist/{init-PTJEOTJV.js → init-OK5QJISX.js} +12 -12
  43. package/dist/{llm-7D2OGDEK.js → llm-SWDDQQWY.js} +5 -5
  44. package/dist/{loader-VPE4RCIF.js → loader-AAZ6VUIA.js} +4 -4
  45. package/dist/{loader-O2JFO2UC.js → loader-JG5OBPB6.js} +4 -4
  46. package/dist/{logs-TMKNLSJY.js → logs-KNKPQE5A.js} +3 -3
  47. package/dist/{main-EIKBLOUL.js → main-XWJGDDMZ.js} +115 -72
  48. package/dist/main-XWJGDDMZ.js.map +1 -0
  49. package/dist/{open-2JCSOLZS.js → open-5WOOLDUZ.js} +7 -7
  50. package/dist/{post-compact-2HPPWPBI.js → post-compact-TLIJUMKZ.js} +7 -7
  51. package/dist/{post-tool-use-TWBBBABS.js → post-tool-use-TMYBAFL6.js} +6 -6
  52. package/dist/{post-tool-use-failure-LIJYR4KL.js → post-tool-use-failure-P7YHR3EO.js} +7 -7
  53. package/dist/{pre-compact-II2CMNTG.js → pre-compact-7RUNVXOE.js} +7 -7
  54. package/dist/{provider-check-KEQNQ6LO.js → provider-check-WCM3SDTM.js} +5 -5
  55. package/dist/{registry-X5FDGYXT.js → registry-OCM4WAPJ.js} +5 -5
  56. package/dist/{remove-L5MVYBOY.js → remove-ISEIHY5H.js} +8 -8
  57. package/dist/{resolution-events-MVIZMONR.js → resolution-events-PYLSI6QT.js} +5 -5
  58. package/dist/{restart-VIT3JBD6.js → restart-AK24G2ME.js} +8 -8
  59. package/dist/{search-O6BB5MTO.js → search-RVRUKLEH.js} +8 -8
  60. package/dist/{server-O3UPJVBR.js → server-GBWW5MBT.js} +5 -5
  61. package/dist/{session-5JV3DQIK.js → session-L7PGGZTO.js} +9 -9
  62. package/dist/{session-end-PZ2OXBGG.js → session-end-YURB7CFB.js} +6 -6
  63. package/dist/{session-start-FDGM56BX.js → session-start-4AMHWOBP.js} +11 -11
  64. package/dist/{setup-llm-MQK557BB.js → setup-llm-2UOSVGAY.js} +8 -8
  65. package/dist/src/agent/definitions/tasks/title-summary.yaml +9 -8
  66. package/dist/src/cli.js +1 -1
  67. package/dist/src/daemon/main.js +1 -1
  68. package/dist/src/hooks/post-tool-use.js +1 -1
  69. package/dist/src/hooks/session-end.js +1 -1
  70. package/dist/src/hooks/session-start.js +1 -1
  71. package/dist/src/hooks/stop.js +1 -1
  72. package/dist/src/hooks/user-prompt-submit.js +1 -1
  73. package/dist/src/mcp/server.js +1 -1
  74. package/dist/{stats-2STTARTC.js → stats-5IEO4KWT.js} +9 -9
  75. package/dist/{stop-WNKCMCGO.js → stop-KRR3EBB2.js} +6 -6
  76. package/dist/{stop-failure-6GTOBVTN.js → stop-failure-6RZAWIDM.js} +7 -7
  77. package/dist/{subagent-start-VJF5YKVX.js → subagent-start-R62O6YPW.js} +7 -7
  78. package/dist/{subagent-stop-UW6HMICY.js → subagent-stop-MP2YDF6D.js} +7 -7
  79. package/dist/{task-completed-U4Q3XXLX.js → task-completed-KCMJYZT7.js} +7 -7
  80. package/dist/team-M6TC4TFC.js +22 -0
  81. package/dist/ui/assets/{index-CHIm98OP.js → index-CwPuGRsJ.js} +102 -102
  82. package/dist/ui/index.html +1 -1
  83. package/dist/{update-ZYCOWKMD.js → update-L5JXTKPL.js} +8 -8
  84. package/dist/{user-prompt-submit-SOYL4OWF.js → user-prompt-submit-L6JNZ7QY.js} +6 -6
  85. package/dist/{verify-P37PQ4YM.js → verify-CJHF23QH.js} +6 -6
  86. package/dist/{version-XAWC277D.js → version-PFOYY6HT.js} +2 -2
  87. package/dist/version-PFOYY6HT.js.map +1 -0
  88. package/package.json +1 -1
  89. package/dist/chunk-2DF4OZ2D.js.map +0 -1
  90. package/dist/chunk-2OO3BRFK.js.map +0 -1
  91. package/dist/chunk-EM63ZFKA.js +0 -166
  92. package/dist/chunk-EM63ZFKA.js.map +0 -1
  93. package/dist/chunk-MDEUXYJG.js.map +0 -1
  94. package/dist/chunk-N77K772N.js.map +0 -1
  95. package/dist/chunk-REN37KYI.js.map +0 -1
  96. package/dist/chunk-RXROZBSK.js.map +0 -1
  97. package/dist/executor-ICTRRUBY.js.map +0 -1
  98. package/dist/main-EIKBLOUL.js.map +0 -1
  99. package/dist/team-N6TXS2PF.js.map +0 -1
  100. /package/dist/{agent-run-EADUYYAS.js.map → agent-run-4QUP3G4V.js.map} +0 -0
  101. /package/dist/{agent-tasks-GC77JXQB.js.map → agent-tasks-NVOWYBLB.js.map} +0 -0
  102. /package/dist/{chunk-LLJMDXO2.js.map → chunk-3J6TUJSV.js.map} +0 -0
  103. /package/dist/{chunk-2LN2BBKA.js.map → chunk-6DDRJQ4X.js.map} +0 -0
  104. /package/dist/{chunk-YPWF322W.js.map → chunk-6ZDJXSEO.js.map} +0 -0
  105. /package/dist/{chunk-INWD6AIQ.js.map → chunk-AULBWINA.js.map} +0 -0
  106. /package/dist/{chunk-UW6DGPSV.js.map → chunk-D5X4MMKR.js.map} +0 -0
  107. /package/dist/{chunk-2CKDAFSX.js.map → chunk-DDOPAV5O.js.map} +0 -0
  108. /package/dist/{chunk-MVBCON4D.js.map → chunk-DURKJTVO.js.map} +0 -0
  109. /package/dist/{chunk-OZF5EURR.js.map → chunk-IXVAYN3P.js.map} +0 -0
  110. /package/dist/{chunk-3TPD6HEF.js.map → chunk-KYH4V4ML.js.map} +0 -0
  111. /package/dist/{chunk-KSXTNYXO.js.map → chunk-PMT2LSTQ.js.map} +0 -0
  112. /package/dist/{chunk-AELJ4PS5.js.map → chunk-Q4QD6LJT.js.map} +0 -0
  113. /package/dist/{chunk-CYBC2HZ3.js.map → chunk-QMTXVFA7.js.map} +0 -0
  114. /package/dist/{chunk-SCI55NKY.js.map → chunk-VQF5E4ZX.js.map} +0 -0
  115. /package/dist/{chunk-MS6FDV45.js.map → chunk-WKNAKQKA.js.map} +0 -0
  116. /package/dist/{cli-X7CFP4YD.js.map → cli-GDHPLWS7.js.map} +0 -0
  117. /package/dist/{client-YA33HUFY.js.map → client-UCELFVZF.js.map} +0 -0
  118. /package/dist/{config-RFB2DJC6.js.map → config-2KQ45OC5.js.map} +0 -0
  119. /package/dist/{detect-providers-2OQBU4VX.js.map → detect-providers-2EY55EHK.js.map} +0 -0
  120. /package/dist/{doctor-FAH7N66M.js.map → doctor-7ATZHQIY.js.map} +0 -0
  121. /package/dist/{init-PTJEOTJV.js.map → init-OK5QJISX.js.map} +0 -0
  122. /package/dist/{llm-7D2OGDEK.js.map → llm-SWDDQQWY.js.map} +0 -0
  123. /package/dist/{loader-O2JFO2UC.js.map → loader-AAZ6VUIA.js.map} +0 -0
  124. /package/dist/{loader-VPE4RCIF.js.map → loader-JG5OBPB6.js.map} +0 -0
  125. /package/dist/{logs-TMKNLSJY.js.map → logs-KNKPQE5A.js.map} +0 -0
  126. /package/dist/{open-2JCSOLZS.js.map → open-5WOOLDUZ.js.map} +0 -0
  127. /package/dist/{post-compact-2HPPWPBI.js.map → post-compact-TLIJUMKZ.js.map} +0 -0
  128. /package/dist/{post-tool-use-TWBBBABS.js.map → post-tool-use-TMYBAFL6.js.map} +0 -0
  129. /package/dist/{post-tool-use-failure-LIJYR4KL.js.map → post-tool-use-failure-P7YHR3EO.js.map} +0 -0
  130. /package/dist/{pre-compact-II2CMNTG.js.map → pre-compact-7RUNVXOE.js.map} +0 -0
  131. /package/dist/{provider-check-KEQNQ6LO.js.map → provider-check-WCM3SDTM.js.map} +0 -0
  132. /package/dist/{registry-X5FDGYXT.js.map → registry-OCM4WAPJ.js.map} +0 -0
  133. /package/dist/{remove-L5MVYBOY.js.map → remove-ISEIHY5H.js.map} +0 -0
  134. /package/dist/{resolution-events-MVIZMONR.js.map → resolution-events-PYLSI6QT.js.map} +0 -0
  135. /package/dist/{restart-VIT3JBD6.js.map → restart-AK24G2ME.js.map} +0 -0
  136. /package/dist/{search-O6BB5MTO.js.map → search-RVRUKLEH.js.map} +0 -0
  137. /package/dist/{server-O3UPJVBR.js.map → server-GBWW5MBT.js.map} +0 -0
  138. /package/dist/{session-5JV3DQIK.js.map → session-L7PGGZTO.js.map} +0 -0
  139. /package/dist/{session-end-PZ2OXBGG.js.map → session-end-YURB7CFB.js.map} +0 -0
  140. /package/dist/{session-start-FDGM56BX.js.map → session-start-4AMHWOBP.js.map} +0 -0
  141. /package/dist/{setup-llm-MQK557BB.js.map → setup-llm-2UOSVGAY.js.map} +0 -0
  142. /package/dist/{stats-2STTARTC.js.map → stats-5IEO4KWT.js.map} +0 -0
  143. /package/dist/{stop-WNKCMCGO.js.map → stop-KRR3EBB2.js.map} +0 -0
  144. /package/dist/{stop-failure-6GTOBVTN.js.map → stop-failure-6RZAWIDM.js.map} +0 -0
  145. /package/dist/{subagent-start-VJF5YKVX.js.map → subagent-start-R62O6YPW.js.map} +0 -0
  146. /package/dist/{subagent-stop-UW6HMICY.js.map → subagent-stop-MP2YDF6D.js.map} +0 -0
  147. /package/dist/{task-completed-U4Q3XXLX.js.map → task-completed-KCMJYZT7.js.map} +0 -0
  148. /package/dist/{version-XAWC277D.js.map → team-M6TC4TFC.js.map} +0 -0
  149. /package/dist/{update-ZYCOWKMD.js.map → update-L5JXTKPL.js.map} +0 -0
  150. /package/dist/{user-prompt-submit-SOYL4OWF.js.map → user-prompt-submit-L6JNZ7QY.js.map} +0 -0
  151. /package/dist/{verify-P37PQ4YM.js.map → verify-CJHF23QH.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  loadAllTasks
4
- } from "./chunk-3TPD6HEF.js";
4
+ } from "./chunk-KYH4V4ML.js";
5
5
  import {
6
6
  getAgent,
7
7
  getDefaultTask,
@@ -9,23 +9,23 @@ import {
9
9
  loadAgentDefinition,
10
10
  resolveDefinitionsDir,
11
11
  resolveEffectiveConfig
12
- } from "./chunk-AELJ4PS5.js";
12
+ } from "./chunk-Q4QD6LJT.js";
13
13
  import {
14
14
  getSpore,
15
15
  listSporeIdsSince,
16
16
  listSpores
17
- } from "./chunk-REN37KYI.js";
17
+ } from "./chunk-FGKCE5AE.js";
18
18
  import {
19
19
  getSession,
20
20
  listSessions
21
- } from "./chunk-2OO3BRFK.js";
21
+ } from "./chunk-Q6OEZM3S.js";
22
22
  import {
23
23
  getTeamMachineId,
24
24
  syncRow
25
- } from "./chunk-INWD6AIQ.js";
25
+ } from "./chunk-AULBWINA.js";
26
26
  import {
27
27
  loadConfig
28
- } from "./chunk-MDEUXYJG.js";
28
+ } from "./chunk-3C4LT4BW.js";
29
29
  import {
30
30
  getDatabase
31
31
  } from "./chunk-MYX5NCRH.js";
@@ -39,7 +39,7 @@ import {
39
39
  GRAPH_EDGE_DEFAULT_CONFIDENCE,
40
40
  QUERY_DEFAULT_LIST_LIMIT,
41
41
  epochSeconds
42
- } from "./chunk-W4VHC2ES.js";
42
+ } from "./chunk-I54KLC6H.js";
43
43
 
44
44
  // src/notifications/notify.ts
45
45
  import crypto from "crypto";
@@ -171,13 +171,273 @@ function errorMessage(err) {
171
171
  }
172
172
  }
173
173
 
174
+ // src/db/queries/runs.ts
175
+ var DEFAULT_LIST_LIMIT2 = 100;
176
+ var DEFAULT_STATUS = "pending";
177
+ var STATUS_RUNNING = "running";
178
+ var STATUS_COMPLETED = "completed";
179
+ var STATUS_FAILED = "failed";
180
+ var RUN_COLUMNS = [
181
+ "id",
182
+ "agent_id",
183
+ "task",
184
+ "instruction",
185
+ "status",
186
+ "started_at",
187
+ "completed_at",
188
+ "tokens_used",
189
+ "cost_usd",
190
+ "actions_taken",
191
+ "error"
192
+ ];
193
+ var SELECT_COLUMNS = RUN_COLUMNS.join(", ");
194
+ function toRunRow(row) {
195
+ return {
196
+ id: row.id,
197
+ agent_id: row.agent_id,
198
+ task: row.task ?? null,
199
+ instruction: row.instruction ?? null,
200
+ status: row.status,
201
+ started_at: row.started_at ?? null,
202
+ completed_at: row.completed_at ?? null,
203
+ tokens_used: row.tokens_used ?? null,
204
+ cost_usd: row.cost_usd ?? null,
205
+ actions_taken: row.actions_taken ?? null,
206
+ error: row.error ?? null
207
+ };
208
+ }
209
+ function insertRun(data) {
210
+ const db = getDatabase();
211
+ db.prepare(
212
+ `INSERT INTO agent_runs (
213
+ id, agent_id, task, instruction, status,
214
+ started_at, completed_at, tokens_used, cost_usd,
215
+ actions_taken, error
216
+ ) VALUES (
217
+ ?, ?, ?, ?, ?,
218
+ ?, ?, ?, ?,
219
+ ?, ?
220
+ )`
221
+ ).run(
222
+ data.id,
223
+ data.agent_id,
224
+ data.task ?? null,
225
+ data.instruction ?? null,
226
+ data.status ?? DEFAULT_STATUS,
227
+ data.started_at ?? null,
228
+ data.completed_at ?? null,
229
+ data.tokens_used ?? null,
230
+ data.cost_usd ?? null,
231
+ data.actions_taken ?? null,
232
+ data.error ?? null
233
+ );
234
+ return toRunRow(
235
+ db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_runs WHERE id = ?`).get(data.id)
236
+ );
237
+ }
238
+ function getRun(id) {
239
+ const db = getDatabase();
240
+ const row = db.prepare(
241
+ `SELECT ${SELECT_COLUMNS} FROM agent_runs WHERE id = ?`
242
+ ).get(id);
243
+ if (!row) return null;
244
+ return toRunRow(row);
245
+ }
246
+ function buildRunsWhere(options) {
247
+ const conditions = [];
248
+ const params = [];
249
+ if (options.agent_id !== void 0) {
250
+ conditions.push(`agent_id = ?`);
251
+ params.push(options.agent_id);
252
+ }
253
+ if (options.status !== void 0) {
254
+ conditions.push(`status = ?`);
255
+ params.push(options.status);
256
+ }
257
+ if (options.task !== void 0) {
258
+ conditions.push(`task = ?`);
259
+ params.push(options.task);
260
+ }
261
+ if (options.search !== void 0 && options.search.length > 0) {
262
+ conditions.push(`task LIKE ?`);
263
+ params.push(`%${options.search}%`);
264
+ }
265
+ return {
266
+ where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
267
+ params
268
+ };
269
+ }
270
+ function listRuns(options = {}) {
271
+ const db = getDatabase();
272
+ const { where, params } = buildRunsWhere(options);
273
+ const limit = options.limit ?? DEFAULT_LIST_LIMIT2;
274
+ const offset = options.offset ?? 0;
275
+ const rows = db.prepare(
276
+ `SELECT ${SELECT_COLUMNS}
277
+ FROM agent_runs
278
+ ${where}
279
+ ORDER BY started_at DESC NULLS LAST
280
+ LIMIT ?
281
+ OFFSET ?`
282
+ ).all(...params, limit, offset);
283
+ return rows.map(toRunRow);
284
+ }
285
+ function countRuns(options = {}) {
286
+ const db = getDatabase();
287
+ const { where, params } = buildRunsWhere(options);
288
+ const row = db.prepare(
289
+ `SELECT COUNT(*) as count FROM agent_runs ${where}`
290
+ ).get(...params);
291
+ return row.count;
292
+ }
293
+ function updateRunStatus(id, status, completion) {
294
+ const db = getDatabase();
295
+ const setClauses = ["status = ?"];
296
+ const params = [status];
297
+ if (completion?.completed_at !== void 0) {
298
+ setClauses.push(`completed_at = ?`);
299
+ params.push(completion.completed_at);
300
+ }
301
+ if (completion?.tokens_used !== void 0) {
302
+ setClauses.push(`tokens_used = ?`);
303
+ params.push(completion.tokens_used);
304
+ }
305
+ if (completion?.cost_usd !== void 0) {
306
+ setClauses.push(`cost_usd = ?`);
307
+ params.push(completion.cost_usd);
308
+ }
309
+ if (completion?.actions_taken !== void 0) {
310
+ setClauses.push(`actions_taken = ?`);
311
+ params.push(completion.actions_taken);
312
+ }
313
+ if (completion?.error !== void 0) {
314
+ setClauses.push(`error = ?`);
315
+ params.push(completion.error);
316
+ }
317
+ params.push(id);
318
+ const info = db.prepare(
319
+ `UPDATE agent_runs
320
+ SET ${setClauses.join(", ")}
321
+ WHERE id = ?`
322
+ ).run(...params);
323
+ if (info.changes === 0) return null;
324
+ return toRunRow(
325
+ db.prepare(`SELECT ${SELECT_COLUMNS} FROM agent_runs WHERE id = ?`).get(id)
326
+ );
327
+ }
328
+ function getRunningRunForTask(agentId, taskName) {
329
+ const db = getDatabase();
330
+ const row = db.prepare(
331
+ `SELECT id FROM agent_runs
332
+ WHERE agent_id = ? AND task = ? AND status = ?
333
+ LIMIT 1`
334
+ ).get(agentId, taskName, STATUS_RUNNING);
335
+ return row?.id ?? null;
336
+ }
337
+ function getLatestRunId(agentId, taskName) {
338
+ const db = getDatabase();
339
+ if (taskName) {
340
+ const row2 = db.prepare(
341
+ `SELECT id FROM agent_runs
342
+ WHERE agent_id = ? AND task = ?
343
+ ORDER BY started_at DESC
344
+ LIMIT 1`
345
+ ).get(agentId, taskName);
346
+ return row2?.id ?? null;
347
+ }
348
+ const row = db.prepare(
349
+ `SELECT id FROM agent_runs
350
+ WHERE agent_id = ?
351
+ ORDER BY started_at DESC
352
+ LIMIT 1`
353
+ ).get(agentId);
354
+ return row?.id ?? null;
355
+ }
356
+
357
+ // src/agent/config-resolver.ts
358
+ function hasConfiguredProvider(mycoConfig, taskName) {
359
+ const taskProvider = taskName ? mycoConfig.agent.tasks?.[taskName]?.provider : void 0;
360
+ return !!(taskProvider ?? mycoConfig.agent.provider);
361
+ }
362
+ function toProviderConfig(p) {
363
+ return {
364
+ type: p.type,
365
+ baseUrl: p.base_url,
366
+ model: p.model,
367
+ contextLength: p.context_length
368
+ };
369
+ }
370
+ function resolveRunConfig(agentId, requestedTask, vaultDir) {
371
+ const definitionsDir = resolveDefinitionsDir();
372
+ const definition = loadAgentDefinition(definitionsDir);
373
+ const agentRow = getAgent(agentId);
374
+ const taskRow = requestedTask ? getTask(requestedTask) : getDefaultTask(agentId);
375
+ const allTasks = loadAllTasks(definitionsDir, vaultDir);
376
+ const taskName = taskRow?.id ?? requestedTask;
377
+ const yamlTask = taskName ? allTasks.get(taskName) : void 0;
378
+ const taskOverrides = taskRow ? {
379
+ name: taskRow.id,
380
+ displayName: taskRow.display_name ?? taskRow.id,
381
+ description: taskRow.description ?? "",
382
+ agent: taskRow.agent_id,
383
+ prompt: taskRow.prompt,
384
+ isDefault: taskRow.is_default === 1,
385
+ ...taskRow.tool_overrides ? { toolOverrides: JSON.parse(taskRow.tool_overrides) } : {},
386
+ // Scalar config from YAML (model, turns, timeout) — DB doesn't store these
387
+ ...yamlTask?.model ? { model: yamlTask.model } : {},
388
+ ...yamlTask?.maxTurns ? { maxTurns: yamlTask.maxTurns } : {},
389
+ ...yamlTask?.timeoutSeconds ? { timeoutSeconds: yamlTask.timeoutSeconds } : {},
390
+ // Structural config from YAML
391
+ ...yamlTask?.phases ? { phases: yamlTask.phases } : {},
392
+ ...yamlTask?.execution ? { execution: yamlTask.execution } : {},
393
+ ...yamlTask?.contextQueries ? { contextQueries: yamlTask.contextQueries } : {},
394
+ ...yamlTask?.orchestrator ? { orchestrator: yamlTask.orchestrator } : {}
395
+ } : void 0;
396
+ const config = resolveEffectiveConfig(definition, agentRow, taskOverrides);
397
+ let taskProviderOverride;
398
+ let phaseProviderOverrides = {};
399
+ let taskParams;
400
+ try {
401
+ const mycoConfig = loadConfig(vaultDir);
402
+ const taskConfig = taskName ? mycoConfig.agent.tasks?.[taskName] : void 0;
403
+ const globalProvider = mycoConfig.agent.provider;
404
+ if (taskConfig?.provider) {
405
+ taskProviderOverride = toProviderConfig(taskConfig.provider);
406
+ } else if (globalProvider) {
407
+ taskProviderOverride = toProviderConfig(globalProvider);
408
+ }
409
+ if (taskConfig?.phases) {
410
+ for (const [phaseName, phaseConfig] of Object.entries(taskConfig.phases)) {
411
+ phaseProviderOverrides[phaseName] = {
412
+ ...phaseConfig.provider ? { provider: toProviderConfig(phaseConfig.provider) } : {},
413
+ ...phaseConfig.maxTurns != null ? { maxTurns: phaseConfig.maxTurns } : {}
414
+ };
415
+ }
416
+ }
417
+ const yamlParams = yamlTask?.params;
418
+ const configParams = taskConfig?.params;
419
+ if (yamlParams || configParams) {
420
+ taskParams = { ...yamlParams, ...configParams };
421
+ }
422
+ } catch {
423
+ }
424
+ return {
425
+ config,
426
+ definitionsDir,
427
+ taskProviderOverride,
428
+ phaseProviderOverrides,
429
+ taskName,
430
+ taskParams
431
+ };
432
+ }
433
+
174
434
  // src/agent/instruction-builders.ts
175
435
  import { readFileSync } from "fs";
176
436
  import { resolve } from "path";
177
437
 
178
438
  // src/db/queries/skill-candidates.ts
179
439
  var DEFAULT_CONFIDENCE = 0;
180
- var DEFAULT_STATUS = "identified";
440
+ var DEFAULT_STATUS2 = "identified";
181
441
  var CANDIDATE_COLUMNS = [
182
442
  "id",
183
443
  "agent_id",
@@ -194,7 +454,7 @@ var CANDIDATE_COLUMNS = [
194
454
  "updated_at",
195
455
  "synced_at"
196
456
  ];
197
- var SELECT_COLUMNS = CANDIDATE_COLUMNS.join(", ");
457
+ var SELECT_COLUMNS2 = CANDIDATE_COLUMNS.join(", ");
198
458
  function toCandidateRow(row) {
199
459
  return {
200
460
  id: row.id,
@@ -252,7 +512,7 @@ function insertCandidate(data) {
252
512
  data.topic,
253
513
  data.rationale,
254
514
  data.confidence ?? DEFAULT_CONFIDENCE,
255
- data.status ?? DEFAULT_STATUS,
515
+ data.status ?? DEFAULT_STATUS2,
256
516
  data.source_ids ?? "[]",
257
517
  data.skill_id ?? null,
258
518
  data.supersedes ?? null,
@@ -260,7 +520,7 @@ function insertCandidate(data) {
260
520
  data.created_at,
261
521
  data.updated_at
262
522
  );
263
- const raw = db.prepare(`SELECT ${SELECT_COLUMNS} FROM skill_candidates WHERE id = ?`).get(data.id);
523
+ const raw = db.prepare(`SELECT ${SELECT_COLUMNS2} FROM skill_candidates WHERE id = ?`).get(data.id);
264
524
  if (!raw) throw new Error(`Failed to insert skill candidate: ${data.id}`);
265
525
  const row = toCandidateRow(raw);
266
526
  syncRow("skill_candidates", row);
@@ -269,7 +529,7 @@ function insertCandidate(data) {
269
529
  function getCandidate(id) {
270
530
  const db = getDatabase();
271
531
  const row = db.prepare(
272
- `SELECT ${SELECT_COLUMNS} FROM skill_candidates WHERE id = ?`
532
+ `SELECT ${SELECT_COLUMNS2} FROM skill_candidates WHERE id = ?`
273
533
  ).get(id);
274
534
  if (!row) return null;
275
535
  return toCandidateRow(row);
@@ -280,7 +540,7 @@ function listCandidates(options = {}) {
280
540
  const limit = options.limit ?? DEFAULT_LIST_LIMIT;
281
541
  const offset = options.offset ?? 0;
282
542
  const rows = db.prepare(
283
- `SELECT ${SELECT_COLUMNS}
543
+ `SELECT ${SELECT_COLUMNS2}
284
544
  FROM skill_candidates
285
545
  ${where}
286
546
  ORDER BY confidence DESC, created_at DESC
@@ -338,7 +598,7 @@ function listCandidatesWithCount(options = {}) {
338
598
  const limit = options.limit ?? DEFAULT_LIST_LIMIT;
339
599
  const offset = options.offset ?? 0;
340
600
  const rows = db.prepare(
341
- `SELECT ${SELECT_COLUMNS}, COUNT(*) OVER () AS __total
601
+ `SELECT ${SELECT_COLUMNS2}, COUNT(*) OVER () AS __total
342
602
  FROM skill_candidates
343
603
  ${where}
344
604
  ORDER BY confidence DESC, created_at DESC
@@ -370,7 +630,7 @@ function deleteCandidate(id) {
370
630
  }
371
631
 
372
632
  // src/db/queries/skill-records.ts
373
- var DEFAULT_STATUS2 = "active";
633
+ var DEFAULT_STATUS3 = "active";
374
634
  var DEFAULT_GENERATION = 1;
375
635
  var RECORD_COLUMNS = [
376
636
  "id",
@@ -391,7 +651,7 @@ var RECORD_COLUMNS = [
391
651
  "properties",
392
652
  "synced_at"
393
653
  ];
394
- var SELECT_COLUMNS2 = RECORD_COLUMNS.join(", ");
654
+ var SELECT_COLUMNS3 = RECORD_COLUMNS.join(", ");
395
655
  function toSkillRecordRow(row) {
396
656
  return {
397
657
  id: row.id,
@@ -448,7 +708,7 @@ function insertSkillRecord(data) {
448
708
  data.name,
449
709
  data.display_name,
450
710
  data.description,
451
- data.status ?? DEFAULT_STATUS2,
711
+ data.status ?? DEFAULT_STATUS3,
452
712
  data.generation ?? DEFAULT_GENERATION,
453
713
  data.candidate_id ?? null,
454
714
  data.source_ids ?? "[]",
@@ -457,7 +717,7 @@ function insertSkillRecord(data) {
457
717
  data.updated_at,
458
718
  data.properties ?? "{}"
459
719
  );
460
- const raw = db.prepare(`SELECT ${SELECT_COLUMNS2} FROM skill_records WHERE id = ?`).get(data.id);
720
+ const raw = db.prepare(`SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE id = ?`).get(data.id);
461
721
  if (!raw) throw new Error(`Failed to insert skill record: ${data.id}`);
462
722
  const row = toSkillRecordRow(raw);
463
723
  syncRow("skill_records", row);
@@ -466,7 +726,7 @@ function insertSkillRecord(data) {
466
726
  function getSkillRecord(id) {
467
727
  const db = getDatabase();
468
728
  const row = db.prepare(
469
- `SELECT ${SELECT_COLUMNS2} FROM skill_records WHERE id = ?`
729
+ `SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE id = ?`
470
730
  ).get(id);
471
731
  if (!row) return null;
472
732
  return toSkillRecordRow(row);
@@ -474,7 +734,7 @@ function getSkillRecord(id) {
474
734
  function getSkillRecordByName(name) {
475
735
  const db = getDatabase();
476
736
  const row = db.prepare(
477
- `SELECT ${SELECT_COLUMNS2} FROM skill_records WHERE name = ?`
737
+ `SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE name = ?`
478
738
  ).get(name);
479
739
  if (!row) return null;
480
740
  return toSkillRecordRow(row);
@@ -485,7 +745,7 @@ function listSkillRecords(options = {}) {
485
745
  const limit = options.limit ?? DEFAULT_LIST_LIMIT;
486
746
  const offset = options.offset ?? 0;
487
747
  const rows = db.prepare(
488
- `SELECT ${SELECT_COLUMNS2}
748
+ `SELECT ${SELECT_COLUMNS3}
489
749
  FROM skill_records
490
750
  ${where}
491
751
  ORDER BY updated_at DESC
@@ -577,7 +837,7 @@ var EXTRACT_COLUMNS = [
577
837
  "machine_id",
578
838
  "synced_at"
579
839
  ];
580
- var SELECT_COLUMNS3 = EXTRACT_COLUMNS.join(", ");
840
+ var SELECT_COLUMNS4 = EXTRACT_COLUMNS.join(", ");
581
841
  function toDigestExtractRow(row) {
582
842
  return {
583
843
  id: row.id,
@@ -600,14 +860,14 @@ function upsertDigestExtract(data) {
600
860
  generated_at = EXCLUDED.generated_at`
601
861
  ).run(data.agent_id, data.tier, data.content, data.generated_at);
602
862
  const row = db.prepare(
603
- `SELECT ${SELECT_COLUMNS3} FROM digest_extracts WHERE agent_id = ? AND tier = ?`
863
+ `SELECT ${SELECT_COLUMNS4} FROM digest_extracts WHERE agent_id = ? AND tier = ?`
604
864
  ).get(data.agent_id, data.tier);
605
865
  return toDigestExtractRow(row);
606
866
  }
607
867
  function getDigestExtract(agentId, tier) {
608
868
  const db = getDatabase();
609
869
  const row = db.prepare(
610
- `SELECT ${SELECT_COLUMNS3} FROM digest_extracts
870
+ `SELECT ${SELECT_COLUMNS4} FROM digest_extracts
611
871
  WHERE agent_id = ? AND tier = ?`
612
872
  ).get(agentId, tier);
613
873
  if (!row) return null;
@@ -617,7 +877,7 @@ function listDigestExtracts(agentId) {
617
877
  const db = getDatabase();
618
878
  const tierPlaceholders = DIGEST_TIERS.map(() => "?").join(", ");
619
879
  const rows = db.prepare(
620
- `SELECT ${SELECT_COLUMNS3}
880
+ `SELECT ${SELECT_COLUMNS4}
621
881
  FROM digest_extracts
622
882
  WHERE agent_id = ? AND tier IN (${tierPlaceholders})
623
883
  ORDER BY tier ASC`
@@ -632,7 +892,7 @@ var STATE_COLUMNS = [
632
892
  "value",
633
893
  "updated_at"
634
894
  ];
635
- var SELECT_COLUMNS4 = STATE_COLUMNS.join(", ");
895
+ var SELECT_COLUMNS5 = STATE_COLUMNS.join(", ");
636
896
  function toAgentStateRow(row) {
637
897
  return {
638
898
  agent_id: row.agent_id,
@@ -644,7 +904,7 @@ function toAgentStateRow(row) {
644
904
  function getState(agentId, key) {
645
905
  const db = getDatabase();
646
906
  const row = db.prepare(
647
- `SELECT ${SELECT_COLUMNS4} FROM agent_state WHERE agent_id = ? AND key = ?`
907
+ `SELECT ${SELECT_COLUMNS5} FROM agent_state WHERE agent_id = ? AND key = ?`
648
908
  ).get(agentId, key);
649
909
  if (!row) return null;
650
910
  return toAgentStateRow(row);
@@ -659,13 +919,13 @@ function setState(agentId, key, value, updatedAt) {
659
919
  updated_at = EXCLUDED.updated_at`
660
920
  ).run(agentId, key, value, updatedAt);
661
921
  return toAgentStateRow(
662
- db.prepare(`SELECT ${SELECT_COLUMNS4} FROM agent_state WHERE agent_id = ? AND key = ?`).get(agentId, key)
922
+ db.prepare(`SELECT ${SELECT_COLUMNS5} FROM agent_state WHERE agent_id = ? AND key = ?`).get(agentId, key)
663
923
  );
664
924
  }
665
925
  function getStatesForAgent(agentId) {
666
926
  const db = getDatabase();
667
927
  const rows = db.prepare(
668
- `SELECT ${SELECT_COLUMNS4}
928
+ `SELECT ${SELECT_COLUMNS5}
669
929
  FROM agent_state
670
930
  WHERE agent_id = ?
671
931
  ORDER BY key ASC`
@@ -981,6 +1241,7 @@ function buildSkillSurveyInstruction(agentId) {
981
1241
  const wisdomSpores = listSpores({
982
1242
  observation_type: "wisdom",
983
1243
  limit: SURVEY_MAX_WISDOM_SPORES,
1244
+ includeActive: false,
984
1245
  ...sinceFilter
985
1246
  });
986
1247
  if (wisdomSpores.length > 0) {
@@ -993,11 +1254,13 @@ function buildSkillSurveyInstruction(agentId) {
993
1254
  const decisions = listSpores({
994
1255
  observation_type: "decision",
995
1256
  limit: 20,
1257
+ includeActive: false,
996
1258
  ...sinceFilter
997
1259
  });
998
1260
  const gotchas = listSpores({
999
1261
  observation_type: "gotcha",
1000
1262
  limit: 10,
1263
+ includeActive: false,
1001
1264
  ...sinceFilter
1002
1265
  });
1003
1266
  if (decisions.length > 0 || gotchas.length > 0) {
@@ -1009,6 +1272,7 @@ function buildSkillSurveyInstruction(agentId) {
1009
1272
  }
1010
1273
  const sessions = listSessions({
1011
1274
  limit: SURVEY_MAX_SESSIONS,
1275
+ includeActive: false,
1012
1276
  ...sinceFilter
1013
1277
  });
1014
1278
  if (sessions.length > 0) {
@@ -1100,376 +1364,116 @@ function buildSkillEvolveInstruction(params, projectRoot, similarityProvider) {
1100
1364
  }
1101
1365
  const headings = extractHeadings(content);
1102
1366
  skillHeadings.set(skill.name, headings);
1103
- structures.push({
1104
- name: skill.name,
1105
- sectionCount: headings.length,
1106
- headings,
1107
- narrow: headings.length < MIN_SECTIONS_FOR_STANDALONE
1108
- });
1109
- }
1110
- const overlaps = [];
1111
- for (let i = 0; i < allSkills.length; i++) {
1112
- for (let j = i + 1; j < allSkills.length; j++) {
1113
- const a = allSkills[i];
1114
- const b = allSkills[j];
1115
- const descJaccard = descriptionSimilarity(a.description, b.description);
1116
- const aHeadings = skillHeadings.get(a.name) ?? [];
1117
- const bHeadings = skillHeadings.get(b.name) ?? [];
1118
- const ho = headingOverlap(aHeadings, bHeadings);
1119
- const descFlag = descJaccard >= DESCRIPTION_DUPLICATE_THRESHOLD * 0.75;
1120
- const headingFlag = ho.score >= 0.4;
1121
- if (!descFlag && !headingFlag) continue;
1122
- const verdict = descJaccard >= DESCRIPTION_DUPLICATE_THRESHOLD || ho.score >= 0.5 ? "potential-merge" : "potential-narrow";
1123
- overlaps.push({
1124
- skillA: a.name,
1125
- skillB: b.name,
1126
- descriptionJaccard: Math.round(descJaccard * 100) / 100,
1127
- headingOverlap: Math.round(ho.score * 100) / 100,
1128
- sharedHeadings: ho.shared,
1129
- verdict
1130
- });
1131
- }
1132
- }
1133
- const parts = [
1134
- `${needsAssessment.length} skill(s) need assessment.`,
1135
- `assess_interval_hours: ${assessIntervalHours}`,
1136
- `max_skills_per_run: ${maxSkillsPerRun}`
1137
- ];
1138
- for (const skill of needsAssessment) {
1139
- parts.push("");
1140
- parts.push("---");
1141
- parts.push(`## Skill: ${skill.name} (gen ${skill.generation})`);
1142
- parts.push(`id: ${skill.id}`);
1143
- parts.push(`description: ${skill.description}`);
1144
- parts.push(`new_spore_ids: ${JSON.stringify(skill.newSporeIds)}`);
1145
- }
1146
- parts.push("");
1147
- parts.push("## All Active Skills (for inventory analysis)");
1148
- for (const s of structures) {
1149
- const skill = allSkills.find((sk) => sk.name === s.name);
1150
- const narrowTag = s.narrow ? " **[NARROW \u2014 <2 sections]**" : "";
1151
- parts.push(`- **${skill.name}** (gen ${skill.generation}, ${s.sectionCount} sections${narrowTag}): ${skill.description.slice(0, 200)}`);
1152
- if (s.headings.length > 0) {
1153
- parts.push(` Headings: ${s.headings.join(" | ")}`);
1154
- }
1155
- }
1156
- const narrowSkills = structures.filter((s) => s.narrow);
1157
- if (narrowSkills.length > 0) {
1158
- parts.push("");
1159
- parts.push("## Mechanically Narrow Skills (<2 H2 sections)");
1160
- parts.push("These skills have insufficient section breadth for domain-level standalone status.");
1161
- parts.push("Determine which broader skill each should be absorbed into.");
1162
- for (const s of narrowSkills) {
1163
- parts.push(`- **${s.name}**: ${s.sectionCount} section(s). Headings: ${s.headings.length > 0 ? s.headings.join(" | ") : "(none)"}`);
1164
- }
1165
- }
1166
- if (overlaps.length > 0) {
1167
- parts.push("");
1168
- parts.push("## Pre-computed Token Overlap");
1169
- parts.push("Pairs flagged by description token similarity AND/OR heading overlap:");
1170
- for (const o of overlaps) {
1171
- parts.push(`- **${o.skillA}** <-> **${o.skillB}**: desc=${o.descriptionJaccard}, headings=${o.headingOverlap} (${o.verdict})`);
1172
- if (o.sharedHeadings.length > 0) {
1173
- parts.push(` Shared headings: ${o.sharedHeadings.join("; ")}`);
1174
- }
1175
- }
1176
- }
1177
- if (similarityProvider) {
1178
- const idToName = new Map(allSkills.map((s) => [s.id, s.name]));
1179
- try {
1180
- const semanticPairs = similarityProvider.pairwiseSimilarity("skill_records", 0.65);
1181
- if (semanticPairs.length > 0) {
1182
- parts.push("");
1183
- parts.push("## Semantic Similarity (embedding cosine distance)");
1184
- parts.push("Pairs with cosine similarity >= 0.65. This is the STRONGEST overlap signal.");
1185
- parts.push("High similarity (>0.8) means the skills describe nearly identical procedures.");
1186
- for (const p of semanticPairs) {
1187
- const nameA = idToName.get(p.idA) ?? p.idA;
1188
- const nameB = idToName.get(p.idB) ?? p.idB;
1189
- parts.push(`- **${nameA}** <-> **${nameB}**: cosine=${p.similarity}`);
1190
- }
1191
- }
1192
- } catch {
1193
- }
1194
- }
1195
- return parts.join("\n");
1196
- }
1197
- function buildTaskInstruction(taskName, taskParams, agentId, projectRoot, similarityProvider) {
1198
- switch (taskName) {
1199
- case SKILL_GENERATE_TASK:
1200
- return buildSkillGenerateInstruction();
1201
- case SKILL_SURVEY_TASK:
1202
- return agentId ? buildSkillSurveyInstruction(agentId) : void 0;
1203
- case SKILL_EVOLVE_TASK: {
1204
- const instruction = buildSkillEvolveInstruction(taskParams, projectRoot, similarityProvider);
1205
- return instruction ? { instruction } : void 0;
1206
- }
1207
- default:
1208
- return void 0;
1209
- }
1210
- }
1211
- function isInstructionRequiredTask(taskName) {
1212
- return taskName === SKILL_GENERATE_TASK || taskName === SKILL_EVOLVE_TASK || taskName === SKILL_SURVEY_TASK;
1213
- }
1214
-
1215
- // src/db/queries/runs.ts
1216
- var DEFAULT_LIST_LIMIT2 = 100;
1217
- var DEFAULT_STATUS3 = "pending";
1218
- var STATUS_RUNNING = "running";
1219
- var STATUS_COMPLETED = "completed";
1220
- var STATUS_FAILED = "failed";
1221
- var RUN_COLUMNS = [
1222
- "id",
1223
- "agent_id",
1224
- "task",
1225
- "instruction",
1226
- "status",
1227
- "started_at",
1228
- "completed_at",
1229
- "tokens_used",
1230
- "cost_usd",
1231
- "actions_taken",
1232
- "error"
1233
- ];
1234
- var SELECT_COLUMNS5 = RUN_COLUMNS.join(", ");
1235
- function toRunRow(row) {
1236
- return {
1237
- id: row.id,
1238
- agent_id: row.agent_id,
1239
- task: row.task ?? null,
1240
- instruction: row.instruction ?? null,
1241
- status: row.status,
1242
- started_at: row.started_at ?? null,
1243
- completed_at: row.completed_at ?? null,
1244
- tokens_used: row.tokens_used ?? null,
1245
- cost_usd: row.cost_usd ?? null,
1246
- actions_taken: row.actions_taken ?? null,
1247
- error: row.error ?? null
1248
- };
1249
- }
1250
- function insertRun(data) {
1251
- const db = getDatabase();
1252
- db.prepare(
1253
- `INSERT INTO agent_runs (
1254
- id, agent_id, task, instruction, status,
1255
- started_at, completed_at, tokens_used, cost_usd,
1256
- actions_taken, error
1257
- ) VALUES (
1258
- ?, ?, ?, ?, ?,
1259
- ?, ?, ?, ?,
1260
- ?, ?
1261
- )`
1262
- ).run(
1263
- data.id,
1264
- data.agent_id,
1265
- data.task ?? null,
1266
- data.instruction ?? null,
1267
- data.status ?? DEFAULT_STATUS3,
1268
- data.started_at ?? null,
1269
- data.completed_at ?? null,
1270
- data.tokens_used ?? null,
1271
- data.cost_usd ?? null,
1272
- data.actions_taken ?? null,
1273
- data.error ?? null
1274
- );
1275
- return toRunRow(
1276
- db.prepare(`SELECT ${SELECT_COLUMNS5} FROM agent_runs WHERE id = ?`).get(data.id)
1277
- );
1278
- }
1279
- function getRun(id) {
1280
- const db = getDatabase();
1281
- const row = db.prepare(
1282
- `SELECT ${SELECT_COLUMNS5} FROM agent_runs WHERE id = ?`
1283
- ).get(id);
1284
- if (!row) return null;
1285
- return toRunRow(row);
1286
- }
1287
- function buildRunsWhere(options) {
1288
- const conditions = [];
1289
- const params = [];
1290
- if (options.agent_id !== void 0) {
1291
- conditions.push(`agent_id = ?`);
1292
- params.push(options.agent_id);
1293
- }
1294
- if (options.status !== void 0) {
1295
- conditions.push(`status = ?`);
1296
- params.push(options.status);
1297
- }
1298
- if (options.task !== void 0) {
1299
- conditions.push(`task = ?`);
1300
- params.push(options.task);
1301
- }
1302
- if (options.search !== void 0 && options.search.length > 0) {
1303
- conditions.push(`task LIKE ?`);
1304
- params.push(`%${options.search}%`);
1305
- }
1306
- return {
1307
- where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
1308
- params
1309
- };
1310
- }
1311
- function listRuns(options = {}) {
1312
- const db = getDatabase();
1313
- const { where, params } = buildRunsWhere(options);
1314
- const limit = options.limit ?? DEFAULT_LIST_LIMIT2;
1315
- const offset = options.offset ?? 0;
1316
- const rows = db.prepare(
1317
- `SELECT ${SELECT_COLUMNS5}
1318
- FROM agent_runs
1319
- ${where}
1320
- ORDER BY started_at DESC NULLS LAST
1321
- LIMIT ?
1322
- OFFSET ?`
1323
- ).all(...params, limit, offset);
1324
- return rows.map(toRunRow);
1325
- }
1326
- function countRuns(options = {}) {
1327
- const db = getDatabase();
1328
- const { where, params } = buildRunsWhere(options);
1329
- const row = db.prepare(
1330
- `SELECT COUNT(*) as count FROM agent_runs ${where}`
1331
- ).get(...params);
1332
- return row.count;
1333
- }
1334
- function updateRunStatus(id, status, completion) {
1335
- const db = getDatabase();
1336
- const setClauses = ["status = ?"];
1337
- const params = [status];
1338
- if (completion?.completed_at !== void 0) {
1339
- setClauses.push(`completed_at = ?`);
1340
- params.push(completion.completed_at);
1341
- }
1342
- if (completion?.tokens_used !== void 0) {
1343
- setClauses.push(`tokens_used = ?`);
1344
- params.push(completion.tokens_used);
1367
+ structures.push({
1368
+ name: skill.name,
1369
+ sectionCount: headings.length,
1370
+ headings,
1371
+ narrow: headings.length < MIN_SECTIONS_FOR_STANDALONE
1372
+ });
1345
1373
  }
1346
- if (completion?.cost_usd !== void 0) {
1347
- setClauses.push(`cost_usd = ?`);
1348
- params.push(completion.cost_usd);
1374
+ const overlaps = [];
1375
+ for (let i = 0; i < allSkills.length; i++) {
1376
+ for (let j = i + 1; j < allSkills.length; j++) {
1377
+ const a = allSkills[i];
1378
+ const b = allSkills[j];
1379
+ const descJaccard = descriptionSimilarity(a.description, b.description);
1380
+ const aHeadings = skillHeadings.get(a.name) ?? [];
1381
+ const bHeadings = skillHeadings.get(b.name) ?? [];
1382
+ const ho = headingOverlap(aHeadings, bHeadings);
1383
+ const descFlag = descJaccard >= DESCRIPTION_DUPLICATE_THRESHOLD * 0.75;
1384
+ const headingFlag = ho.score >= 0.4;
1385
+ if (!descFlag && !headingFlag) continue;
1386
+ const verdict = descJaccard >= DESCRIPTION_DUPLICATE_THRESHOLD || ho.score >= 0.5 ? "potential-merge" : "potential-narrow";
1387
+ overlaps.push({
1388
+ skillA: a.name,
1389
+ skillB: b.name,
1390
+ descriptionJaccard: Math.round(descJaccard * 100) / 100,
1391
+ headingOverlap: Math.round(ho.score * 100) / 100,
1392
+ sharedHeadings: ho.shared,
1393
+ verdict
1394
+ });
1395
+ }
1349
1396
  }
1350
- if (completion?.actions_taken !== void 0) {
1351
- setClauses.push(`actions_taken = ?`);
1352
- params.push(completion.actions_taken);
1397
+ const parts = [
1398
+ `${needsAssessment.length} skill(s) need assessment.`,
1399
+ `assess_interval_hours: ${assessIntervalHours}`,
1400
+ `max_skills_per_run: ${maxSkillsPerRun}`
1401
+ ];
1402
+ for (const skill of needsAssessment) {
1403
+ parts.push("");
1404
+ parts.push("---");
1405
+ parts.push(`## Skill: ${skill.name} (gen ${skill.generation})`);
1406
+ parts.push(`id: ${skill.id}`);
1407
+ parts.push(`description: ${skill.description}`);
1408
+ parts.push(`new_spore_ids: ${JSON.stringify(skill.newSporeIds)}`);
1353
1409
  }
1354
- if (completion?.error !== void 0) {
1355
- setClauses.push(`error = ?`);
1356
- params.push(completion.error);
1410
+ parts.push("");
1411
+ parts.push("## All Active Skills (for inventory analysis)");
1412
+ for (const s of structures) {
1413
+ const skill = allSkills.find((sk) => sk.name === s.name);
1414
+ const narrowTag = s.narrow ? " **[NARROW \u2014 <2 sections]**" : "";
1415
+ parts.push(`- **${skill.name}** (gen ${skill.generation}, ${s.sectionCount} sections${narrowTag}): ${skill.description.slice(0, 200)}`);
1416
+ if (s.headings.length > 0) {
1417
+ parts.push(` Headings: ${s.headings.join(" | ")}`);
1418
+ }
1357
1419
  }
1358
- params.push(id);
1359
- const info = db.prepare(
1360
- `UPDATE agent_runs
1361
- SET ${setClauses.join(", ")}
1362
- WHERE id = ?`
1363
- ).run(...params);
1364
- if (info.changes === 0) return null;
1365
- return toRunRow(
1366
- db.prepare(`SELECT ${SELECT_COLUMNS5} FROM agent_runs WHERE id = ?`).get(id)
1367
- );
1368
- }
1369
- function getRunningRunForTask(agentId, taskName) {
1370
- const db = getDatabase();
1371
- const row = db.prepare(
1372
- `SELECT id FROM agent_runs
1373
- WHERE agent_id = ? AND task = ? AND status = ?
1374
- LIMIT 1`
1375
- ).get(agentId, taskName, STATUS_RUNNING);
1376
- return row?.id ?? null;
1377
- }
1378
- function getLatestRunId(agentId, taskName) {
1379
- const db = getDatabase();
1380
- if (taskName) {
1381
- const row2 = db.prepare(
1382
- `SELECT id FROM agent_runs
1383
- WHERE agent_id = ? AND task = ?
1384
- ORDER BY started_at DESC
1385
- LIMIT 1`
1386
- ).get(agentId, taskName);
1387
- return row2?.id ?? null;
1420
+ const narrowSkills = structures.filter((s) => s.narrow);
1421
+ if (narrowSkills.length > 0) {
1422
+ parts.push("");
1423
+ parts.push("## Mechanically Narrow Skills (<2 H2 sections)");
1424
+ parts.push("These skills have insufficient section breadth for domain-level standalone status.");
1425
+ parts.push("Determine which broader skill each should be absorbed into.");
1426
+ for (const s of narrowSkills) {
1427
+ parts.push(`- **${s.name}**: ${s.sectionCount} section(s). Headings: ${s.headings.length > 0 ? s.headings.join(" | ") : "(none)"}`);
1428
+ }
1388
1429
  }
1389
- const row = db.prepare(
1390
- `SELECT id FROM agent_runs
1391
- WHERE agent_id = ?
1392
- ORDER BY started_at DESC
1393
- LIMIT 1`
1394
- ).get(agentId);
1395
- return row?.id ?? null;
1396
- }
1397
-
1398
- // src/agent/config-resolver.ts
1399
- function hasConfiguredProvider(mycoConfig, taskName) {
1400
- const taskProvider = taskName ? mycoConfig.agent.tasks?.[taskName]?.provider : void 0;
1401
- return !!(taskProvider ?? mycoConfig.agent.provider);
1402
- }
1403
- function toProviderConfig(p) {
1404
- return {
1405
- type: p.type,
1406
- baseUrl: p.base_url,
1407
- model: p.model,
1408
- contextLength: p.context_length
1409
- };
1410
- }
1411
- function resolveRunConfig(agentId, requestedTask, vaultDir) {
1412
- const definitionsDir = resolveDefinitionsDir();
1413
- const definition = loadAgentDefinition(definitionsDir);
1414
- const agentRow = getAgent(agentId);
1415
- const taskRow = requestedTask ? getTask(requestedTask) : getDefaultTask(agentId);
1416
- const allTasks = loadAllTasks(definitionsDir, vaultDir);
1417
- const taskName = taskRow?.id ?? requestedTask;
1418
- const yamlTask = taskName ? allTasks.get(taskName) : void 0;
1419
- const taskOverrides = taskRow ? {
1420
- name: taskRow.id,
1421
- displayName: taskRow.display_name ?? taskRow.id,
1422
- description: taskRow.description ?? "",
1423
- agent: taskRow.agent_id,
1424
- prompt: taskRow.prompt,
1425
- isDefault: taskRow.is_default === 1,
1426
- ...taskRow.tool_overrides ? { toolOverrides: JSON.parse(taskRow.tool_overrides) } : {},
1427
- // Scalar config from YAML (model, turns, timeout) — DB doesn't store these
1428
- ...yamlTask?.model ? { model: yamlTask.model } : {},
1429
- ...yamlTask?.maxTurns ? { maxTurns: yamlTask.maxTurns } : {},
1430
- ...yamlTask?.timeoutSeconds ? { timeoutSeconds: yamlTask.timeoutSeconds } : {},
1431
- // Structural config from YAML
1432
- ...yamlTask?.phases ? { phases: yamlTask.phases } : {},
1433
- ...yamlTask?.execution ? { execution: yamlTask.execution } : {},
1434
- ...yamlTask?.contextQueries ? { contextQueries: yamlTask.contextQueries } : {},
1435
- ...yamlTask?.orchestrator ? { orchestrator: yamlTask.orchestrator } : {}
1436
- } : void 0;
1437
- const config = resolveEffectiveConfig(definition, agentRow, taskOverrides);
1438
- let taskProviderOverride;
1439
- let phaseProviderOverrides = {};
1440
- let taskParams;
1441
- try {
1442
- const mycoConfig = loadConfig(vaultDir);
1443
- const taskConfig = taskName ? mycoConfig.agent.tasks?.[taskName] : void 0;
1444
- const globalProvider = mycoConfig.agent.provider;
1445
- if (taskConfig?.provider) {
1446
- taskProviderOverride = toProviderConfig(taskConfig.provider);
1447
- } else if (globalProvider) {
1448
- taskProviderOverride = toProviderConfig(globalProvider);
1430
+ if (overlaps.length > 0) {
1431
+ parts.push("");
1432
+ parts.push("## Pre-computed Token Overlap");
1433
+ parts.push("Pairs flagged by description token similarity AND/OR heading overlap:");
1434
+ for (const o of overlaps) {
1435
+ parts.push(`- **${o.skillA}** <-> **${o.skillB}**: desc=${o.descriptionJaccard}, headings=${o.headingOverlap} (${o.verdict})`);
1436
+ if (o.sharedHeadings.length > 0) {
1437
+ parts.push(` Shared headings: ${o.sharedHeadings.join("; ")}`);
1438
+ }
1449
1439
  }
1450
- if (taskConfig?.phases) {
1451
- for (const [phaseName, phaseConfig] of Object.entries(taskConfig.phases)) {
1452
- phaseProviderOverrides[phaseName] = {
1453
- ...phaseConfig.provider ? { provider: toProviderConfig(phaseConfig.provider) } : {},
1454
- ...phaseConfig.maxTurns != null ? { maxTurns: phaseConfig.maxTurns } : {}
1455
- };
1440
+ }
1441
+ if (similarityProvider) {
1442
+ const idToName = new Map(allSkills.map((s) => [s.id, s.name]));
1443
+ try {
1444
+ const semanticPairs = similarityProvider.pairwiseSimilarity("skill_records", 0.65);
1445
+ if (semanticPairs.length > 0) {
1446
+ parts.push("");
1447
+ parts.push("## Semantic Similarity (embedding cosine distance)");
1448
+ parts.push("Pairs with cosine similarity >= 0.65. This is the STRONGEST overlap signal.");
1449
+ parts.push("High similarity (>0.8) means the skills describe nearly identical procedures.");
1450
+ for (const p of semanticPairs) {
1451
+ const nameA = idToName.get(p.idA) ?? p.idA;
1452
+ const nameB = idToName.get(p.idB) ?? p.idB;
1453
+ parts.push(`- **${nameA}** <-> **${nameB}**: cosine=${p.similarity}`);
1454
+ }
1456
1455
  }
1456
+ } catch {
1457
1457
  }
1458
- const yamlParams = yamlTask?.params;
1459
- const configParams = taskConfig?.params;
1460
- if (yamlParams || configParams) {
1461
- taskParams = { ...yamlParams, ...configParams };
1458
+ }
1459
+ return parts.join("\n");
1460
+ }
1461
+ function buildTaskInstruction(taskName, taskParams, agentId, projectRoot, similarityProvider) {
1462
+ switch (taskName) {
1463
+ case SKILL_GENERATE_TASK:
1464
+ return buildSkillGenerateInstruction();
1465
+ case SKILL_SURVEY_TASK:
1466
+ return agentId ? buildSkillSurveyInstruction(agentId) : void 0;
1467
+ case SKILL_EVOLVE_TASK: {
1468
+ const instruction = buildSkillEvolveInstruction(taskParams, projectRoot, similarityProvider);
1469
+ return instruction ? { instruction } : void 0;
1462
1470
  }
1463
- } catch {
1471
+ default:
1472
+ return void 0;
1464
1473
  }
1465
- return {
1466
- config,
1467
- definitionsDir,
1468
- taskProviderOverride,
1469
- phaseProviderOverrides,
1470
- taskName,
1471
- taskParams
1472
- };
1474
+ }
1475
+ function isInstructionRequiredTask(taskName) {
1476
+ return taskName === SKILL_GENERATE_TASK || taskName === SKILL_EVOLVE_TASK || taskName === SKILL_SURVEY_TASK;
1473
1477
  }
1474
1478
 
1475
1479
  // src/db/queries/skill-lineage.ts
@@ -1601,6 +1605,11 @@ function getUnprocessedBatches(options = {}) {
1601
1605
  conditions.push(`id > ?`);
1602
1606
  params.push(options.after_id);
1603
1607
  }
1608
+ if (options.includeActive === false) {
1609
+ conditions.push(
1610
+ `EXISTS (SELECT 1 FROM sessions s WHERE s.id = prompt_batches.session_id AND s.status != 'active')`
1611
+ );
1612
+ }
1604
1613
  const limit = options.limit ?? DEFAULT_UNPROCESSED_LIMIT;
1605
1614
  params.push(limit);
1606
1615
  const where = conditions.join(" AND ");
@@ -2120,42 +2129,42 @@ export {
2120
2129
  getLatestBatch,
2121
2130
  listBatchesBySession,
2122
2131
  countBatchesBySession,
2132
+ errorMessage,
2133
+ STATUS_RUNNING,
2134
+ STATUS_COMPLETED,
2135
+ STATUS_FAILED,
2136
+ insertRun,
2137
+ getRun,
2138
+ listRuns,
2139
+ countRuns,
2140
+ updateRunStatus,
2141
+ getRunningRunForTask,
2142
+ getLatestRunId,
2143
+ setState,
2144
+ getStatesForAgent,
2123
2145
  insertGraphEdge,
2124
2146
  listGraphEdges,
2125
2147
  getGraphForNode,
2126
2148
  insertEntity,
2127
2149
  getEntity,
2128
2150
  listEntities,
2151
+ createSporeLineage,
2152
+ createBatchLineage,
2129
2153
  upsertDigestExtract,
2130
2154
  getDigestExtract,
2131
2155
  listDigestExtracts,
2132
- errorMessage,
2133
- setState,
2134
- getStatesForAgent,
2156
+ insertReport,
2157
+ listReports,
2135
2158
  descriptionSimilarity,
2136
2159
  topicOverlapSimilarity,
2137
2160
  DESCRIPTION_DUPLICATE_THRESHOLD,
2138
2161
  TOPIC_OVERLAP_THRESHOLD,
2139
2162
  checkFrontmatterPreservation,
2140
2163
  validateSkillContent,
2164
+ hasConfiguredProvider,
2165
+ resolveRunConfig,
2141
2166
  SKILL_GENERATE_TASK,
2142
2167
  buildTaskInstruction,
2143
- isInstructionRequiredTask,
2144
- STATUS_RUNNING,
2145
- STATUS_COMPLETED,
2146
- STATUS_FAILED,
2147
- insertRun,
2148
- getRun,
2149
- listRuns,
2150
- countRuns,
2151
- updateRunStatus,
2152
- getRunningRunForTask,
2153
- getLatestRunId,
2154
- createSporeLineage,
2155
- createBatchLineage,
2156
- insertReport,
2157
- listReports,
2158
- hasConfiguredProvider,
2159
- resolveRunConfig
2168
+ isInstructionRequiredTask
2160
2169
  };
2161
- //# sourceMappingURL=chunk-RXROZBSK.js.map
2170
+ //# sourceMappingURL=chunk-THZKOZ4M.js.map