@goondocks/myco 0.20.2 → 0.21.1

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 (216) hide show
  1. package/bin/myco-run +68 -7
  2. package/dist/agent-eval-YK2VP2S4.js +356 -0
  3. package/dist/agent-eval-YK2VP2S4.js.map +1 -0
  4. package/dist/{agent-run-X25Q2A6T.js → agent-run-GEJBD2YD.js} +10 -8
  5. package/dist/{agent-run-X25Q2A6T.js.map → agent-run-GEJBD2YD.js.map} +1 -1
  6. package/dist/{agent-tasks-7B6OFERB.js → agent-tasks-5XSRGTRX.js} +10 -8
  7. package/dist/{agent-tasks-7B6OFERB.js.map → agent-tasks-5XSRGTRX.js.map} +1 -1
  8. package/dist/{chunk-OD4AA7PV.js → chunk-53RPGOEN.js} +56 -8
  9. package/dist/chunk-53RPGOEN.js.map +1 -0
  10. package/dist/chunk-54SXG5HF.js +26 -0
  11. package/dist/chunk-54SXG5HF.js.map +1 -0
  12. package/dist/{chunk-XATDZX7U.js → chunk-6ALVMIB4.js} +19 -5
  13. package/dist/{chunk-XATDZX7U.js.map → chunk-6ALVMIB4.js.map} +1 -1
  14. package/dist/{chunk-FLLBJLHM.js → chunk-6C6QZ4PM.js} +9 -5
  15. package/dist/chunk-6C6QZ4PM.js.map +1 -0
  16. package/dist/{chunk-CCRGY3QW.js → chunk-AUIXX33A.js} +24 -95
  17. package/dist/chunk-AUIXX33A.js.map +1 -0
  18. package/dist/chunk-CISWUP5W.js +101 -0
  19. package/dist/chunk-CISWUP5W.js.map +1 -0
  20. package/dist/{chunk-MYOZLMB2.js → chunk-DTWUHHFI.js} +576 -20
  21. package/dist/chunk-DTWUHHFI.js.map +1 -0
  22. package/dist/chunk-EEOJWLMP.js +582 -0
  23. package/dist/chunk-EEOJWLMP.js.map +1 -0
  24. package/dist/{chunk-XG5RRUYF.js → chunk-ENZR5NG7.js} +2 -2
  25. package/dist/{chunk-6RFZWV4R.js → chunk-FCJ5JV54.js} +1 -1
  26. package/dist/{chunk-6RFZWV4R.js.map → chunk-FCJ5JV54.js.map} +1 -1
  27. package/dist/{chunk-US4LNCAT.js → chunk-IPPMYQ2Y.js} +5 -1
  28. package/dist/chunk-IPPMYQ2Y.js.map +1 -0
  29. package/dist/{chunk-VVNL26WX.js → chunk-KTTSXYEK.js} +22 -10
  30. package/dist/chunk-KTTSXYEK.js.map +1 -0
  31. package/dist/chunk-LQIPXVDH.js +17 -0
  32. package/dist/chunk-LQIPXVDH.js.map +1 -0
  33. package/dist/{chunk-DCSGJ7W4.js → chunk-N2DGFACQ.js} +3 -3
  34. package/dist/chunk-N7Z3LUEZ.js +858 -0
  35. package/dist/chunk-N7Z3LUEZ.js.map +1 -0
  36. package/dist/{chunk-2PDWCDKY.js → chunk-NFO7BRCO.js} +10 -7
  37. package/dist/{chunk-2PDWCDKY.js.map → chunk-NFO7BRCO.js.map} +1 -1
  38. package/dist/{chunk-Q36VMZST.js → chunk-OTQH5KZW.js} +89 -38
  39. package/dist/chunk-OTQH5KZW.js.map +1 -0
  40. package/dist/chunk-OUJSQSKE.js +113 -0
  41. package/dist/chunk-OUJSQSKE.js.map +1 -0
  42. package/dist/chunk-OZ3FBAK5.js +50 -0
  43. package/dist/chunk-OZ3FBAK5.js.map +1 -0
  44. package/dist/chunk-QATYARI5.js +408 -0
  45. package/dist/chunk-QATYARI5.js.map +1 -0
  46. package/dist/{chunk-KESLPBKV.js → chunk-QDLVIW2O.js} +4 -4
  47. package/dist/{chunk-5XIVBO25.js → chunk-QLLBJEM7.js} +6 -2
  48. package/dist/chunk-QLLBJEM7.js.map +1 -0
  49. package/dist/{chunk-EVDQKYCG.js → chunk-RQSJLWP4.js} +13 -2
  50. package/dist/chunk-RQSJLWP4.js.map +1 -0
  51. package/dist/{chunk-BPRIYNLE.js → chunk-TKAJ3JVF.js} +3 -3
  52. package/dist/chunk-TSM6VESW.js +25 -0
  53. package/dist/chunk-TSM6VESW.js.map +1 -0
  54. package/dist/{chunk-6X2ERTQV.js → chunk-USVFEWYL.js} +6 -4
  55. package/dist/{chunk-6X2ERTQV.js.map → chunk-USVFEWYL.js.map} +1 -1
  56. package/dist/{chunk-JZGN33AY.js → chunk-VRI56337.js} +4 -4
  57. package/dist/chunk-X2IRGXGF.js +14103 -0
  58. package/dist/chunk-X2IRGXGF.js.map +1 -0
  59. package/dist/{chunk-FMRZ26U5.js → chunk-X3IGT5RV.js} +5 -2
  60. package/dist/{chunk-FMRZ26U5.js.map → chunk-X3IGT5RV.js.map} +1 -1
  61. package/dist/{chunk-KHT24OWC.js → chunk-YDUOSRGD.js} +8 -94
  62. package/dist/{chunk-KHT24OWC.js.map → chunk-YDUOSRGD.js.map} +1 -1
  63. package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
  64. package/dist/chunk-Z66IT5KL.js.map +1 -0
  65. package/dist/{cli-GGPWH4UO.js → cli-HSLIG7EX.js} +50 -43
  66. package/dist/cli-HSLIG7EX.js.map +1 -0
  67. package/dist/{client-YXQUTXVZ.js → client-Z43DNLJH.js} +4 -4
  68. package/dist/{config-OMCYHG2S.js → config-VC4ACP42.js} +6 -4
  69. package/dist/{config-OMCYHG2S.js.map → config-VC4ACP42.js.map} +1 -1
  70. package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
  71. package/dist/{detect-providers-5KOPZ7J2.js → detect-providers-ILLQZROY.js} +4 -4
  72. package/dist/{doctor-5JXJ36KA.js → doctor-HJCWHAU4.js} +49 -16
  73. package/dist/doctor-HJCWHAU4.js.map +1 -0
  74. package/dist/executor-DO6QFC6G.js +45 -0
  75. package/dist/{init-LMYOVZAV.js → init-4KVK7W2E.js} +16 -14
  76. package/dist/{init-LMYOVZAV.js.map → init-4KVK7W2E.js.map} +1 -1
  77. package/dist/{installer-FS257JRZ.js → installer-N4UTEACX.js} +6 -4
  78. package/dist/{llm-TH4NLIRM.js → llm-AGVEF5XD.js} +5 -4
  79. package/dist/{loader-CQYTFHEW.js → loader-LX7TFRM6.js} +5 -3
  80. package/dist/{loader-NOMBJUPW.js → loader-UDNUMEDA.js} +5 -3
  81. package/dist/{main-YTBVRTBI.js → main-4J4QZZTZ.js} +2518 -656
  82. package/dist/main-4J4QZZTZ.js.map +1 -0
  83. package/dist/{open-HG2DX6RN.js → open-7TXJQM3H.js} +10 -8
  84. package/dist/{open-HG2DX6RN.js.map → open-7TXJQM3H.js.map} +1 -1
  85. package/dist/{post-compact-JSECI44W.js → post-compact-7AEFVCZS.js} +8 -8
  86. package/dist/{post-tool-use-POGPTJBA.js → post-tool-use-TZINWWDH.js} +11 -9
  87. package/dist/post-tool-use-TZINWWDH.js.map +1 -0
  88. package/dist/{post-tool-use-failure-OT7BFWQW.js → post-tool-use-failure-TCFEU2GI.js} +8 -8
  89. package/dist/{pre-compact-OXVODKH4.js → pre-compact-LO2VZCGR.js} +8 -8
  90. package/dist/{provider-check-43LAMSMH.js → provider-check-ZEV5P4KM.js} +4 -4
  91. package/dist/{registry-U4CHXK6R.js → registry-F3THYC5M.js} +6 -4
  92. package/dist/{remove-N7ZPELFU.js → remove-F77AAALE.js} +12 -10
  93. package/dist/{remove-N7ZPELFU.js.map → remove-F77AAALE.js.map} +1 -1
  94. package/dist/{restart-ADG5GBTB.js → restart-UEFDPMLT.js} +11 -9
  95. package/dist/{restart-ADG5GBTB.js.map → restart-UEFDPMLT.js.map} +1 -1
  96. package/dist/{search-AHZEUNRR.js → search-NHNVUAQQ.js} +11 -9
  97. package/dist/{search-AHZEUNRR.js.map → search-NHNVUAQQ.js.map} +1 -1
  98. package/dist/{server-AGVYZVP5.js → server-AZJSTQEK.js} +369 -270
  99. package/dist/server-AZJSTQEK.js.map +1 -0
  100. package/dist/{session-6IU4AXYP.js → session-3HLC5KOD.js} +11 -9
  101. package/dist/{session-6IU4AXYP.js.map → session-3HLC5KOD.js.map} +1 -1
  102. package/dist/{session-end-FT27DWYZ.js → session-end-FS46UARX.js} +7 -7
  103. package/dist/session-start-46KPFV2H.js +134 -0
  104. package/dist/session-start-46KPFV2H.js.map +1 -0
  105. package/dist/{setup-llm-77MP4I2G.js → setup-llm-JMWSNQ2C.js} +11 -9
  106. package/dist/{setup-llm-77MP4I2G.js.map → setup-llm-JMWSNQ2C.js.map} +1 -1
  107. package/dist/src/agent/definitions/agent.yaml +9 -5
  108. package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +115 -0
  109. package/dist/src/agent/definitions/tasks/cortex-prompt-builder.yaml +67 -0
  110. package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -1
  111. package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
  112. package/dist/src/agent/definitions/tasks/review-session.yaml +10 -39
  113. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +181 -25
  114. package/dist/src/agent/definitions/tasks/skill-generate.yaml +21 -7
  115. package/dist/src/agent/definitions/tasks/skill-survey.yaml +2 -6
  116. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
  117. package/dist/src/agent/definitions/tasks/title-summary.yaml +12 -19
  118. package/dist/src/agent/definitions/tasks/{full-intelligence.yaml → vault-evolve.yaml} +74 -129
  119. package/dist/src/agent/definitions/tasks/vault-seed.yaml +370 -0
  120. package/dist/src/agent/prompts/agent.md +12 -38
  121. package/dist/src/cli.js +1 -1
  122. package/dist/src/daemon/main.js +1 -1
  123. package/dist/src/hooks/post-tool-use.js +1 -1
  124. package/dist/src/hooks/session-end.js +1 -1
  125. package/dist/src/hooks/session-start.js +1 -1
  126. package/dist/src/hooks/stop.js +1 -1
  127. package/dist/src/hooks/user-prompt-submit.js +1 -1
  128. package/dist/src/mcp/server.js +1 -1
  129. package/dist/src/symbionts/manifests/claude-code.yaml +4 -0
  130. package/dist/src/symbionts/manifests/opencode.yaml +7 -0
  131. package/dist/src/symbionts/manifests/pi.yaml +22 -0
  132. package/dist/src/symbionts/templates/agents-starter.md +1 -1
  133. package/dist/src/symbionts/templates/pi/package.json +6 -0
  134. package/dist/src/symbionts/templates/pi/plugin.ts +559 -0
  135. package/dist/{stats-NVPWOYTE.js → stats-MKMETHMA.js} +11 -9
  136. package/dist/{stats-NVPWOYTE.js.map → stats-MKMETHMA.js.map} +1 -1
  137. package/dist/{stop-ZPIKVLH4.js → stop-OUEX6KA4.js} +7 -7
  138. package/dist/{stop-failure-2PX67YJC.js → stop-failure-2BWVNZEG.js} +8 -8
  139. package/dist/{subagent-start-UUE6EHQD.js → subagent-start-J4VV6DEE.js} +8 -8
  140. package/dist/{subagent-stop-KQWWWPE6.js → subagent-stop-JMLVEPIA.js} +8 -8
  141. package/dist/{task-completed-WMHOFQ7B.js → task-completed-65CHMMKA.js} +8 -8
  142. package/dist/{team-LRZ6GTQK.js → team-U2LDKIS4.js} +7 -5
  143. package/dist/{turns-YFNI5CQC.js → turns-HU2CTZAP.js} +2 -2
  144. package/dist/ui/assets/index-BUGor9dk.js +842 -0
  145. package/dist/ui/assets/index-_OP4ifzH.css +1 -0
  146. package/dist/ui/index.html +2 -2
  147. package/dist/{update-O6V4RC4W.js → update-ZSHVXWSQ.js} +12 -10
  148. package/dist/{update-O6V4RC4W.js.map → update-ZSHVXWSQ.js.map} +1 -1
  149. package/dist/{user-prompt-submit-N36KUPHI.js → user-prompt-submit-APMO6FVU.js} +10 -9
  150. package/dist/{user-prompt-submit-N36KUPHI.js.map → user-prompt-submit-APMO6FVU.js.map} +1 -1
  151. package/dist/{verify-LXPV7NYG.js → verify-R76ZFJSZ.js} +8 -5
  152. package/dist/{verify-LXPV7NYG.js.map → verify-R76ZFJSZ.js.map} +1 -1
  153. package/dist/{version-XMPPJQHR.js → version-TXPPS3L5.js} +2 -2
  154. package/dist/version-TXPPS3L5.js.map +1 -0
  155. package/package.json +3 -1
  156. package/skills/myco/SKILL.md +16 -1
  157. package/skills/myco/references/cli-usage.md +1 -1
  158. package/skills/myco-rules/SKILL.md +94 -0
  159. package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
  160. package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
  161. package/dist/chunk-4YFKBL3F.js +0 -195
  162. package/dist/chunk-4YFKBL3F.js.map +0 -1
  163. package/dist/chunk-5XIVBO25.js.map +0 -1
  164. package/dist/chunk-CCRGY3QW.js.map +0 -1
  165. package/dist/chunk-CUDIZJY7.js +0 -36
  166. package/dist/chunk-CUDIZJY7.js.map +0 -1
  167. package/dist/chunk-EVDQKYCG.js.map +0 -1
  168. package/dist/chunk-FLLBJLHM.js.map +0 -1
  169. package/dist/chunk-MYOZLMB2.js.map +0 -1
  170. package/dist/chunk-NGROSFOH.js.map +0 -1
  171. package/dist/chunk-OD4AA7PV.js.map +0 -1
  172. package/dist/chunk-Q36VMZST.js.map +0 -1
  173. package/dist/chunk-US4LNCAT.js.map +0 -1
  174. package/dist/chunk-UYMFCYBF.js +0 -2326
  175. package/dist/chunk-UYMFCYBF.js.map +0 -1
  176. package/dist/chunk-VVNL26WX.js.map +0 -1
  177. package/dist/cli-GGPWH4UO.js.map +0 -1
  178. package/dist/doctor-5JXJ36KA.js.map +0 -1
  179. package/dist/executor-HWW2QNZQ.js +0 -2472
  180. package/dist/executor-HWW2QNZQ.js.map +0 -1
  181. package/dist/main-YTBVRTBI.js.map +0 -1
  182. package/dist/post-tool-use-POGPTJBA.js.map +0 -1
  183. package/dist/server-AGVYZVP5.js.map +0 -1
  184. package/dist/session-start-LAFICHII.js +0 -189
  185. package/dist/session-start-LAFICHII.js.map +0 -1
  186. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +0 -93
  187. package/dist/ui/assets/index-C2JuNtRB.css +0 -1
  188. package/dist/ui/assets/index-JLVaQKV2.js +0 -832
  189. package/skills/myco-curate/SKILL.md +0 -86
  190. package/skills/rules/SKILL.md +0 -214
  191. /package/dist/{chunk-XG5RRUYF.js.map → chunk-ENZR5NG7.js.map} +0 -0
  192. /package/dist/{chunk-DCSGJ7W4.js.map → chunk-N2DGFACQ.js.map} +0 -0
  193. /package/dist/{chunk-KESLPBKV.js.map → chunk-QDLVIW2O.js.map} +0 -0
  194. /package/dist/{chunk-BPRIYNLE.js.map → chunk-TKAJ3JVF.js.map} +0 -0
  195. /package/dist/{chunk-JZGN33AY.js.map → chunk-VRI56337.js.map} +0 -0
  196. /package/dist/{client-YXQUTXVZ.js.map → client-Z43DNLJH.js.map} +0 -0
  197. /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
  198. /package/dist/{detect-providers-5KOPZ7J2.js.map → detect-providers-ILLQZROY.js.map} +0 -0
  199. /package/dist/{installer-FS257JRZ.js.map → executor-DO6QFC6G.js.map} +0 -0
  200. /package/dist/{llm-TH4NLIRM.js.map → installer-N4UTEACX.js.map} +0 -0
  201. /package/dist/{loader-CQYTFHEW.js.map → llm-AGVEF5XD.js.map} +0 -0
  202. /package/dist/{loader-NOMBJUPW.js.map → loader-LX7TFRM6.js.map} +0 -0
  203. /package/dist/{provider-check-43LAMSMH.js.map → loader-UDNUMEDA.js.map} +0 -0
  204. /package/dist/{post-compact-JSECI44W.js.map → post-compact-7AEFVCZS.js.map} +0 -0
  205. /package/dist/{post-tool-use-failure-OT7BFWQW.js.map → post-tool-use-failure-TCFEU2GI.js.map} +0 -0
  206. /package/dist/{pre-compact-OXVODKH4.js.map → pre-compact-LO2VZCGR.js.map} +0 -0
  207. /package/dist/{registry-U4CHXK6R.js.map → provider-check-ZEV5P4KM.js.map} +0 -0
  208. /package/dist/{team-LRZ6GTQK.js.map → registry-F3THYC5M.js.map} +0 -0
  209. /package/dist/{session-end-FT27DWYZ.js.map → session-end-FS46UARX.js.map} +0 -0
  210. /package/dist/{stop-ZPIKVLH4.js.map → stop-OUEX6KA4.js.map} +0 -0
  211. /package/dist/{stop-failure-2PX67YJC.js.map → stop-failure-2BWVNZEG.js.map} +0 -0
  212. /package/dist/{subagent-start-UUE6EHQD.js.map → subagent-start-J4VV6DEE.js.map} +0 -0
  213. /package/dist/{subagent-stop-KQWWWPE6.js.map → subagent-stop-JMLVEPIA.js.map} +0 -0
  214. /package/dist/{task-completed-WMHOFQ7B.js.map → task-completed-65CHMMKA.js.map} +0 -0
  215. /package/dist/{turns-YFNI5CQC.js.map → team-U2LDKIS4.js.map} +0 -0
  216. /package/dist/{version-XMPPJQHR.js.map → turns-HU2CTZAP.js.map} +0 -0
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  DEFAULT_MACHINE_ID,
4
4
  epochSeconds
5
- } from "./chunk-FLLBJLHM.js";
5
+ } from "./chunk-6C6QZ4PM.js";
6
6
 
7
7
  // src/db/schema-ddl.ts
8
8
  var SCHEMA_VERSION_TABLE = `
@@ -73,6 +73,7 @@ var ACTIVITIES_TABLE = `
73
73
  var PLANS_TABLE = `
74
74
  CREATE TABLE IF NOT EXISTS plans (
75
75
  id TEXT PRIMARY KEY,
76
+ logical_key TEXT NOT NULL,
76
77
  status TEXT DEFAULT 'active',
77
78
  author TEXT,
78
79
  title TEXT,
@@ -229,19 +230,48 @@ var DIGEST_EXTRACTS_TABLE = `
229
230
  synced_at INTEGER,
230
231
  UNIQUE (agent_id, tier)
231
232
  )`;
233
+ var CORTEX_INSTRUCTIONS_TABLE = `
234
+ CREATE TABLE IF NOT EXISTS cortex_instructions (
235
+ id TEXT PRIMARY KEY,
236
+ agent_id TEXT NOT NULL,
237
+ content TEXT NOT NULL,
238
+ input_hash TEXT NOT NULL,
239
+ source_run_id TEXT,
240
+ generated_at INTEGER NOT NULL,
241
+ machine_id TEXT NOT NULL DEFAULT 'local',
242
+ synced_at INTEGER
243
+ )`;
232
244
  var AGENT_RUNS_TABLE = `
233
245
  CREATE TABLE IF NOT EXISTS agent_runs (
234
- id TEXT PRIMARY KEY,
235
- agent_id TEXT NOT NULL REFERENCES agents(id),
236
- task TEXT,
237
- instruction TEXT,
238
- status TEXT DEFAULT 'pending',
239
- started_at INTEGER,
240
- completed_at INTEGER,
241
- tokens_used INTEGER,
242
- cost_usd REAL,
243
- actions_taken TEXT,
244
- error TEXT
246
+ id TEXT PRIMARY KEY,
247
+ agent_id TEXT NOT NULL REFERENCES agents(id),
248
+ task TEXT,
249
+ instruction TEXT,
250
+ status TEXT DEFAULT 'pending',
251
+ runtime TEXT,
252
+ provider TEXT,
253
+ model TEXT,
254
+ session_ref TEXT,
255
+ resumable INTEGER DEFAULT 0,
256
+ resume_status TEXT,
257
+ resume_mode TEXT,
258
+ resumed_at INTEGER,
259
+ checkpoints TEXT,
260
+ usage_data TEXT,
261
+ started_at INTEGER,
262
+ completed_at INTEGER,
263
+ tokens_used INTEGER,
264
+ cost_usd REAL,
265
+ actual_cost_usd REAL,
266
+ estimated_cost_usd REAL,
267
+ cost_source TEXT,
268
+ cost_data TEXT,
269
+ actions_taken TEXT,
270
+ error TEXT,
271
+ dry_run INTEGER NOT NULL DEFAULT 0,
272
+ evaluation_id TEXT,
273
+ reasoning_level TEXT,
274
+ execution_overrides TEXT
245
275
  )`;
246
276
  var AGENT_REPORTS_TABLE = `
247
277
  CREATE TABLE IF NOT EXISTS agent_reports (
@@ -383,6 +413,38 @@ var NOTIFICATIONS_TABLE = `
383
413
  metadata TEXT,
384
414
  created_at INTEGER NOT NULL
385
415
  )`;
416
+ var AGENT_RUN_WRITE_INTENTS_TABLE = `
417
+ CREATE TABLE IF NOT EXISTS agent_run_write_intents (
418
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
419
+ run_id TEXT NOT NULL REFERENCES agent_runs(id) ON DELETE CASCADE,
420
+ phase_id TEXT,
421
+ tool_name TEXT NOT NULL,
422
+ tool_input TEXT NOT NULL,
423
+ synthetic_output TEXT NOT NULL,
424
+ stub_id TEXT,
425
+ recorded_at INTEGER NOT NULL
426
+ )`;
427
+ var DIGEST_EXTRACT_REVISIONS_TABLE = `
428
+ CREATE TABLE IF NOT EXISTS digest_extract_revisions (
429
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
430
+ agent_id TEXT NOT NULL,
431
+ tier INTEGER NOT NULL,
432
+ content TEXT NOT NULL,
433
+ metadata TEXT,
434
+ run_id TEXT REFERENCES agent_runs(id) ON DELETE SET NULL,
435
+ parent_revision_id INTEGER REFERENCES digest_extract_revisions(id),
436
+ created_at INTEGER NOT NULL
437
+ )`;
438
+ var AGENT_RUN_EVALUATIONS_TABLE = `
439
+ CREATE TABLE IF NOT EXISTS agent_run_evaluations (
440
+ id TEXT PRIMARY KEY,
441
+ task_id TEXT NOT NULL,
442
+ matrix_json TEXT NOT NULL,
443
+ notes TEXT,
444
+ status TEXT NOT NULL DEFAULT 'pending',
445
+ created_at INTEGER NOT NULL,
446
+ completed_at INTEGER
447
+ )`;
386
448
  var FTS_TABLES = [
387
449
  `CREATE VIRTUAL TABLE IF NOT EXISTS prompt_batches_fts
388
450
  USING fts5(user_prompt, response_summary, content='prompt_batches', content_rowid='id')`,
@@ -475,11 +537,14 @@ var SECONDARY_INDEXES = [
475
537
  "CREATE INDEX IF NOT EXISTS idx_resolution_events_agent_id ON resolution_events (agent_id)",
476
538
  // Digest extracts
477
539
  "CREATE INDEX IF NOT EXISTS idx_digest_extracts_agent_id ON digest_extracts (agent_id)",
540
+ "CREATE INDEX IF NOT EXISTS idx_cortex_instructions_agent_id ON cortex_instructions (agent_id)",
478
541
  // Agent runs
479
542
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_id ON agent_runs (agent_id)",
480
543
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs (status)",
481
544
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_status ON agent_runs (agent_id, status)",
482
545
  "CREATE INDEX IF NOT EXISTS idx_agent_runs_task_completed ON agent_runs (task, status, completed_at)",
546
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_task_status_started_at ON agent_runs (task, status, started_at)",
547
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_resumable_task ON agent_runs (task, resumable, completed_at)",
483
548
  // Agent reports
484
549
  "CREATE INDEX IF NOT EXISTS idx_agent_reports_run_id ON agent_reports (run_id)",
485
550
  // Agent turns
@@ -487,6 +552,7 @@ var SECONDARY_INDEXES = [
487
552
  // Agent tasks
488
553
  "CREATE INDEX IF NOT EXISTS idx_agent_tasks_agent_id ON agent_tasks (agent_id)",
489
554
  // Plans
555
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_plans_logical_key ON plans (logical_key)",
490
556
  "CREATE INDEX IF NOT EXISTS idx_plans_session_id ON plans (session_id)",
491
557
  "CREATE INDEX IF NOT EXISTS idx_plans_source_path ON plans (source_path)",
492
558
  "CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)",
@@ -527,7 +593,12 @@ var SECONDARY_INDEXES = [
527
593
  "CREATE INDEX IF NOT EXISTS idx_notifications_status ON notifications (status)",
528
594
  "CREATE INDEX IF NOT EXISTS idx_notifications_domain ON notifications (domain)",
529
595
  "CREATE INDEX IF NOT EXISTS idx_notifications_created_at ON notifications (created_at)",
530
- "CREATE INDEX IF NOT EXISTS idx_notifications_status_created ON notifications (status, created_at)"
596
+ "CREATE INDEX IF NOT EXISTS idx_notifications_status_created ON notifications (status, created_at)",
597
+ // Eval harness
598
+ "CREATE INDEX IF NOT EXISTS idx_write_intents_run_id ON agent_run_write_intents (run_id)",
599
+ "CREATE INDEX IF NOT EXISTS idx_write_intents_run_id_tool ON agent_run_write_intents (run_id, tool_name)",
600
+ "CREATE INDEX IF NOT EXISTS idx_digest_revisions_agent_tier ON digest_extract_revisions (agent_id, tier, created_at DESC)",
601
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_evaluation_id ON agent_runs (evaluation_id)"
531
602
  ];
532
603
  var TABLE_DDLS = [
533
604
  SCHEMA_VERSION_TABLE,
@@ -547,6 +618,7 @@ var TABLE_DDLS = [
547
618
  ENTITY_MENTIONS_TABLE,
548
619
  RESOLUTION_EVENTS_TABLE,
549
620
  DIGEST_EXTRACTS_TABLE,
621
+ CORTEX_INSTRUCTIONS_TABLE,
550
622
  // Agent state layer
551
623
  AGENT_RUNS_TABLE,
552
624
  AGENT_REPORTS_TABLE,
@@ -563,7 +635,11 @@ var TABLE_DDLS = [
563
635
  // Logging layer
564
636
  LOG_ENTRIES_TABLE,
565
637
  // Notifications layer
566
- NOTIFICATIONS_TABLE
638
+ NOTIFICATIONS_TABLE,
639
+ // Eval harness layer
640
+ AGENT_RUN_WRITE_INTENTS_TABLE,
641
+ DIGEST_EXTRACT_REVISIONS_TABLE,
642
+ AGENT_RUN_EVALUATIONS_TABLE
567
643
  ];
568
644
 
569
645
  // src/constants/skill-candidate-status.ts
@@ -584,6 +660,74 @@ var REST_SETTABLE_STATUSES = [
584
660
  ];
585
661
  var PIPELINE_FILTER_VALUE = `${CANDIDATE_STATUS.APPROVED},${CANDIDATE_STATUS.GENERATED}`;
586
662
 
663
+ // src/plans/identity.ts
664
+ import { createHash } from "crypto";
665
+ import path from "path";
666
+ var TRANSCRIPT_SOURCE_PREFIX = "transcript:";
667
+ var PLAN_ID_HASH_LENGTH = 16;
668
+ var PLAN_PATH_KEY_PREFIX = "path:";
669
+ var PLAN_SESSION_KEY_PREFIX = "session:";
670
+ var PLAN_TAG_KEY_SEGMENT = ":tag:";
671
+ var PLAN_PLAN_KEY_SEGMENT = ":key:";
672
+ var PLAN_LEGACY_KEY_PREFIX = "legacy:";
673
+ var PLAN_SESSION_LEGACY_KEY_SEGMENT = ":legacy:";
674
+ var WINDOWS_SEPARATOR = "\\";
675
+ var POSIX_SEPARATOR = "/";
676
+ var ABSOLUTE_PATH_PREFIXES = ["..", `..${path.sep}`];
677
+ function normalizePathSeparators(value) {
678
+ return value.replaceAll(WINDOWS_SEPARATOR, POSIX_SEPARATOR);
679
+ }
680
+ function isInsideRoot(relativePath) {
681
+ if (relativePath === "") return true;
682
+ return !ABSOLUTE_PATH_PREFIXES.some((prefix) => relativePath === prefix || relativePath.startsWith(prefix)) && !path.isAbsolute(relativePath);
683
+ }
684
+ function normalizePlanSourcePath(sourcePath, projectRoot) {
685
+ if (sourcePath.startsWith(TRANSCRIPT_SOURCE_PREFIX)) return sourcePath;
686
+ const normalizedProjectRoot = projectRoot ? path.resolve(projectRoot) : null;
687
+ const resolvedSourcePath = normalizedProjectRoot ? path.resolve(normalizedProjectRoot, sourcePath) : path.resolve(sourcePath);
688
+ if (normalizedProjectRoot) {
689
+ const relativePath = path.relative(normalizedProjectRoot, resolvedSourcePath);
690
+ if (isInsideRoot(relativePath)) {
691
+ return normalizePathSeparators(path.normalize(relativePath));
692
+ }
693
+ }
694
+ if (path.isAbsolute(sourcePath)) {
695
+ return normalizePathSeparators(path.normalize(resolvedSourcePath));
696
+ }
697
+ return normalizePathSeparators(path.normalize(sourcePath));
698
+ }
699
+ function buildPathPlanLogicalKey(sourcePath, projectRoot) {
700
+ return `${PLAN_PATH_KEY_PREFIX}${normalizePlanSourcePath(sourcePath, projectRoot)}`;
701
+ }
702
+ function buildSessionTagPlanLogicalKey(sessionId, tag) {
703
+ return `${PLAN_SESSION_KEY_PREFIX}${sessionId}${PLAN_TAG_KEY_SEGMENT}${tag}`;
704
+ }
705
+ function buildSessionPlanLogicalKey(sessionId, planKey) {
706
+ return `${PLAN_SESSION_KEY_PREFIX}${sessionId}${PLAN_PLAN_KEY_SEGMENT}${planKey}`;
707
+ }
708
+ function buildLegacyPlanLogicalKey(id, sessionId) {
709
+ return sessionId ? `${PLAN_SESSION_KEY_PREFIX}${sessionId}${PLAN_SESSION_LEGACY_KEY_SEGMENT}${id}` : `${PLAN_LEGACY_KEY_PREFIX}${id}`;
710
+ }
711
+ function deriveStoredPlanLogicalKey(row) {
712
+ const sourcePath = row.source_path ?? null;
713
+ if (sourcePath) {
714
+ if (sourcePath.startsWith(TRANSCRIPT_SOURCE_PREFIX) && row.session_id) {
715
+ return buildSessionTagPlanLogicalKey(
716
+ row.session_id,
717
+ sourcePath.slice(TRANSCRIPT_SOURCE_PREFIX.length)
718
+ );
719
+ }
720
+ return buildPathPlanLogicalKey(sourcePath);
721
+ }
722
+ return buildLegacyPlanLogicalKey(row.id, row.session_id);
723
+ }
724
+ function buildPlanId(logicalKey) {
725
+ return createHash("md5").update(logicalKey).digest("hex").slice(0, PLAN_ID_HASH_LENGTH);
726
+ }
727
+ function humanizePlanToken(value) {
728
+ return value.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[-_]+/g, " ").trim().replace(/\b\w/g, (char) => char.toUpperCase());
729
+ }
730
+
587
731
  // src/db/migrations.ts
588
732
  var MIGRATIONS = [
589
733
  { version: 2, migrate: (db) => migrateV1ToV2(db) },
@@ -596,8 +740,21 @@ var MIGRATIONS = [
596
740
  { version: 9, migrate: (db) => migrateV8ToV9(db) },
597
741
  { version: 10, migrate: (db) => migrateV9ToV10(db) },
598
742
  { version: 11, migrate: (db) => migrateV10ToV11(db) },
599
- { version: 12, migrate: (db) => migrateV11ToV12(db) }
743
+ { version: 12, migrate: (db) => migrateV11ToV12(db) },
744
+ { version: 13, migrate: (db) => migrateV12ToV13(db) },
745
+ { version: 14, migrate: (db) => migrateV13ToV14(db) },
746
+ { version: 15, migrate: (db) => migrateV14ToV15(db) },
747
+ { version: 16, migrate: (db) => migrateV15ToV16(db) },
748
+ { version: 17, migrate: (db) => migrateV16ToV17(db) },
749
+ { version: 18, migrate: (db) => migrateV17ToV18(db) },
750
+ { version: 19, migrate: (db) => migrateV18ToV19(db) },
751
+ { version: 20, migrate: (db, machineId) => migrateV19ToV20(db, machineId) },
752
+ { version: 21, migrate: (db) => migrateV20ToV21(db) }
600
753
  ];
754
+ function getTableColumnSet(db, tableName) {
755
+ const rows = db.prepare(`PRAGMA table_info(${tableName})`).all();
756
+ return new Set(rows.map((r) => r.name));
757
+ }
601
758
  function migrateV1ToV2(db) {
602
759
  db.exec("BEGIN");
603
760
  try {
@@ -725,6 +882,249 @@ function migrateV3ToV4(db, machineId) {
725
882
  throw err;
726
883
  }
727
884
  }
885
+ function migrateV17ToV18(db) {
886
+ db.exec("BEGIN");
887
+ try {
888
+ db.exec(CORTEX_INSTRUCTIONS_TABLE);
889
+ db.exec(
890
+ "CREATE INDEX IF NOT EXISTS idx_cortex_instructions_agent_id ON cortex_instructions (agent_id)"
891
+ );
892
+ db.prepare(
893
+ `INSERT INTO schema_version (version, applied_at)
894
+ VALUES (?, ?)
895
+ ON CONFLICT (version) DO NOTHING`
896
+ ).run(18, epochSeconds());
897
+ db.exec("COMMIT");
898
+ } catch (err) {
899
+ db.exec("ROLLBACK");
900
+ throw err;
901
+ }
902
+ }
903
+ function migrateV18ToV19(db) {
904
+ db.exec("BEGIN");
905
+ try {
906
+ db.prepare(
907
+ "DELETE FROM team_outbox WHERE table_name = ?"
908
+ ).run("cortex_instructions");
909
+ db.prepare(
910
+ `INSERT INTO schema_version (version, applied_at)
911
+ VALUES (?, ?)
912
+ ON CONFLICT (version) DO NOTHING`
913
+ ).run(19, epochSeconds());
914
+ db.exec("COMMIT");
915
+ } catch (err) {
916
+ db.exec("ROLLBACK");
917
+ throw err;
918
+ }
919
+ }
920
+ function migrateV12ToV13(db) {
921
+ const existing = getTableColumnSet(db, "agent_runs");
922
+ const columnAdds = [
923
+ ["runtime", "TEXT"],
924
+ ["provider", "TEXT"],
925
+ ["model", "TEXT"],
926
+ ["session_ref", "TEXT"],
927
+ ["resumable", "INTEGER DEFAULT 0"],
928
+ ["resume_status", "TEXT"],
929
+ ["resume_mode", "TEXT"],
930
+ ["resumed_at", "INTEGER"],
931
+ ["checkpoints", "TEXT"],
932
+ ["usage_data", "TEXT"]
933
+ ];
934
+ const pendingAdds = columnAdds.filter(([name]) => !existing.has(name));
935
+ db.exec("BEGIN");
936
+ try {
937
+ for (const [name, decl] of pendingAdds) {
938
+ db.exec(`ALTER TABLE agent_runs ADD COLUMN ${name} ${decl}`);
939
+ }
940
+ const newIndexes = [
941
+ `CREATE INDEX IF NOT EXISTS idx_agent_runs_task_status_started_at ON agent_runs (task, status, started_at)`,
942
+ `CREATE INDEX IF NOT EXISTS idx_agent_runs_resumable_task ON agent_runs (task, resumable, completed_at)`
943
+ ];
944
+ for (const idx of newIndexes) {
945
+ db.exec(idx);
946
+ }
947
+ db.prepare(
948
+ `INSERT INTO schema_version (version, applied_at)
949
+ VALUES (?, ?)
950
+ ON CONFLICT (version) DO NOTHING`
951
+ ).run(13, epochSeconds());
952
+ db.exec("COMMIT");
953
+ } catch (err) {
954
+ db.exec("ROLLBACK");
955
+ throw err;
956
+ }
957
+ }
958
+ function migrateV13ToV14(db) {
959
+ const existing = getTableColumnSet(db, "agent_runs");
960
+ const columnAdds = [
961
+ ["actual_cost_usd", "REAL"],
962
+ ["estimated_cost_usd", "REAL"],
963
+ ["cost_source", "TEXT"],
964
+ ["cost_data", "TEXT"]
965
+ ];
966
+ const pendingAdds = columnAdds.filter(([name]) => !existing.has(name));
967
+ db.exec("BEGIN");
968
+ try {
969
+ for (const [name, decl] of pendingAdds) {
970
+ db.exec(`ALTER TABLE agent_runs ADD COLUMN ${name} ${decl}`);
971
+ }
972
+ db.prepare(
973
+ `INSERT INTO schema_version (version, applied_at)
974
+ VALUES (?, ?)
975
+ ON CONFLICT (version) DO NOTHING`
976
+ ).run(14, epochSeconds());
977
+ db.exec("COMMIT");
978
+ } catch (err) {
979
+ db.exec("ROLLBACK");
980
+ throw err;
981
+ }
982
+ }
983
+ function resolveV20PlanIdentityCollisions(db) {
984
+ const dupes = db.prepare(
985
+ `SELECT logical_key_next, COUNT(*) AS n
986
+ FROM plans
987
+ WHERE logical_key_next <> ''
988
+ GROUP BY logical_key_next
989
+ HAVING n > 1`
990
+ ).all();
991
+ if (dupes.length > 0) {
992
+ const rowsForKey = db.prepare(
993
+ `SELECT id, session_id
994
+ FROM plans
995
+ WHERE logical_key_next = ?
996
+ ORDER BY created_at ASC, id ASC`
997
+ );
998
+ const updateStaging = db.prepare(
999
+ `UPDATE plans
1000
+ SET logical_key_next = ?, id_next = ?
1001
+ WHERE id = ?`
1002
+ );
1003
+ for (const dupe of dupes) {
1004
+ const conflicting = rowsForKey.all(dupe.logical_key_next);
1005
+ for (let i = 1; i < conflicting.length; i += 1) {
1006
+ const row = conflicting[i];
1007
+ const legacyKey = row.session_id ? `session:${row.session_id}:legacy:${row.id}` : `legacy:${row.id}`;
1008
+ updateStaging.run(legacyKey, buildPlanId(legacyKey), row.id);
1009
+ }
1010
+ }
1011
+ }
1012
+ const remaining = db.prepare(
1013
+ `SELECT id_next, GROUP_CONCAT(id, ',') AS ids
1014
+ FROM plans
1015
+ WHERE id_next IS NOT NULL
1016
+ GROUP BY id_next
1017
+ HAVING COUNT(*) > 1`
1018
+ ).all();
1019
+ if (remaining.length > 0) {
1020
+ const detail = remaining.map((r) => `${r.id_next} <= [${r.ids}]`).join("; ");
1021
+ throw new Error(
1022
+ `v20 plan migration: plan id collisions after legacy fallback: ${detail}`
1023
+ );
1024
+ }
1025
+ }
1026
+ function migrateV19ToV20(db, machineId) {
1027
+ db.exec("BEGIN");
1028
+ try {
1029
+ const planColumns = getTableColumnSet(db, "plans");
1030
+ if (!planColumns.has("logical_key")) {
1031
+ db.exec(`ALTER TABLE plans ADD COLUMN logical_key TEXT NOT NULL DEFAULT ''`);
1032
+ }
1033
+ if (!planColumns.has("id_next")) {
1034
+ db.exec(`ALTER TABLE plans ADD COLUMN id_next TEXT`);
1035
+ }
1036
+ if (!planColumns.has("logical_key_next")) {
1037
+ db.exec(`ALTER TABLE plans ADD COLUMN logical_key_next TEXT NOT NULL DEFAULT ''`);
1038
+ }
1039
+ const rows = db.prepare(
1040
+ `SELECT *
1041
+ FROM plans
1042
+ ORDER BY created_at ASC, id ASC`
1043
+ ).all();
1044
+ const writeStaging = db.prepare(
1045
+ `UPDATE plans
1046
+ SET id_next = ?, logical_key_next = ?
1047
+ WHERE id = ?`
1048
+ );
1049
+ for (const row of rows) {
1050
+ const derivedLogicalKey = deriveStoredPlanLogicalKey(row);
1051
+ writeStaging.run(buildPlanId(derivedLogicalKey), derivedLogicalKey, row.id);
1052
+ }
1053
+ resolveV20PlanIdentityCollisions(db);
1054
+ const previousLogicalKeyByOldId = /* @__PURE__ */ new Map();
1055
+ const previousIdNextByOldId = /* @__PURE__ */ new Map();
1056
+ const staged = db.prepare(
1057
+ `SELECT id, id_next, logical_key, logical_key_next FROM plans`
1058
+ ).all();
1059
+ for (const row of staged) {
1060
+ previousLogicalKeyByOldId.set(row.id, row.logical_key ?? "");
1061
+ if (row.id_next) previousIdNextByOldId.set(row.id, row.id_next);
1062
+ }
1063
+ db.prepare(
1064
+ `UPDATE plans
1065
+ SET embedded = CASE WHEN id = id_next THEN embedded ELSE 0 END,
1066
+ synced_at = CASE WHEN id = id_next THEN synced_at ELSE NULL END
1067
+ WHERE id_next IS NOT NULL`
1068
+ ).run();
1069
+ db.prepare(
1070
+ `UPDATE plans
1071
+ SET id = id_next,
1072
+ logical_key = logical_key_next
1073
+ WHERE id_next IS NOT NULL`
1074
+ ).run();
1075
+ const deleteOutboxEntries = db.prepare(
1076
+ `DELETE FROM team_outbox
1077
+ WHERE table_name = 'plans' AND row_id IN (?, ?)`
1078
+ );
1079
+ const enqueueOutbox = db.prepare(
1080
+ `INSERT INTO team_outbox (table_name, row_id, operation, payload, machine_id, created_at)
1081
+ VALUES ('plans', ?, ?, ?, ?, ?)`
1082
+ );
1083
+ const now = epochSeconds();
1084
+ for (const row of rows) {
1085
+ const nextId = previousIdNextByOldId.get(row.id) ?? row.id;
1086
+ const fresh = db.prepare(`SELECT * FROM plans WHERE id = ?`).get(nextId);
1087
+ const identityChanged = nextId !== row.id;
1088
+ const previousLogicalKey = previousLogicalKeyByOldId.get(row.id) ?? "";
1089
+ const currentLogicalKey = fresh?.logical_key ?? "";
1090
+ const logicalKeyChanged = previousLogicalKey !== currentLogicalKey;
1091
+ const needsResync = identityChanged || logicalKeyChanged;
1092
+ if (!needsResync) continue;
1093
+ deleteOutboxEntries.run(row.id, nextId);
1094
+ if (identityChanged) {
1095
+ enqueueOutbox.run(
1096
+ row.id,
1097
+ "delete",
1098
+ JSON.stringify({ id: row.id }),
1099
+ row.machine_id ?? machineId,
1100
+ now
1101
+ );
1102
+ }
1103
+ if (fresh) {
1104
+ const { id_next: _idNext, logical_key_next: _lkNext, ...publishable } = fresh;
1105
+ enqueueOutbox.run(
1106
+ nextId,
1107
+ "upsert",
1108
+ JSON.stringify(publishable),
1109
+ fresh.machine_id ?? machineId,
1110
+ now
1111
+ );
1112
+ }
1113
+ }
1114
+ db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_plans_logical_key ON plans (logical_key)`);
1115
+ db.exec(`ALTER TABLE plans DROP COLUMN id_next`);
1116
+ db.exec(`ALTER TABLE plans DROP COLUMN logical_key_next`);
1117
+ db.prepare(
1118
+ `INSERT INTO schema_version (version, applied_at)
1119
+ VALUES (?, ?)
1120
+ ON CONFLICT (version) DO NOTHING`
1121
+ ).run(20, epochSeconds());
1122
+ db.exec("COMMIT");
1123
+ } catch (err) {
1124
+ db.exec("ROLLBACK");
1125
+ throw err;
1126
+ }
1127
+ }
728
1128
  function migrateV4ToV5(db) {
729
1129
  db.exec("BEGIN");
730
1130
  try {
@@ -1008,9 +1408,114 @@ function migrateV11ToV12(db) {
1008
1408
  throw err;
1009
1409
  }
1010
1410
  }
1411
+ function migrateV15ToV16(db) {
1412
+ const existing = getTableColumnSet(db, "agent_runs");
1413
+ const columnAdds = [
1414
+ ["reasoning_level", "TEXT"],
1415
+ ["execution_overrides", "TEXT"]
1416
+ ];
1417
+ const pendingAdds = columnAdds.filter(([name]) => !existing.has(name));
1418
+ db.exec("BEGIN");
1419
+ try {
1420
+ for (const [name, decl] of pendingAdds) {
1421
+ db.exec(`ALTER TABLE agent_runs ADD COLUMN ${name} ${decl}`);
1422
+ }
1423
+ db.prepare(
1424
+ `INSERT INTO schema_version (version, applied_at)
1425
+ VALUES (?, ?)
1426
+ ON CONFLICT (version) DO NOTHING`
1427
+ ).run(16, epochSeconds());
1428
+ db.exec("COMMIT");
1429
+ } catch (err) {
1430
+ db.exec("ROLLBACK");
1431
+ throw err;
1432
+ }
1433
+ }
1434
+ function migrateV16ToV17(db) {
1435
+ db.exec("BEGIN");
1436
+ try {
1437
+ db.exec(
1438
+ "CREATE INDEX IF NOT EXISTS idx_write_intents_run_id_tool ON agent_run_write_intents (run_id, tool_name)"
1439
+ );
1440
+ db.prepare(
1441
+ `INSERT INTO schema_version (version, applied_at)
1442
+ VALUES (?, ?)
1443
+ ON CONFLICT (version) DO NOTHING`
1444
+ ).run(17, epochSeconds());
1445
+ db.exec("COMMIT");
1446
+ } catch (err) {
1447
+ db.exec("ROLLBACK");
1448
+ throw err;
1449
+ }
1450
+ }
1451
+ function migrateV14ToV15(db) {
1452
+ const existing = getTableColumnSet(db, "agent_runs");
1453
+ const columnAdds = [
1454
+ ["dry_run", "INTEGER NOT NULL DEFAULT 0"],
1455
+ ["evaluation_id", "TEXT"]
1456
+ ];
1457
+ const pendingAdds = columnAdds.filter(([name]) => !existing.has(name));
1458
+ db.exec("BEGIN");
1459
+ try {
1460
+ db.exec(AGENT_RUN_WRITE_INTENTS_TABLE);
1461
+ db.exec(DIGEST_EXTRACT_REVISIONS_TABLE);
1462
+ db.exec(AGENT_RUN_EVALUATIONS_TABLE);
1463
+ for (const [name, decl] of pendingAdds) {
1464
+ db.exec(`ALTER TABLE agent_runs ADD COLUMN ${name} ${decl}`);
1465
+ }
1466
+ const newIndexes = [
1467
+ "CREATE INDEX IF NOT EXISTS idx_write_intents_run_id ON agent_run_write_intents (run_id)",
1468
+ "CREATE INDEX IF NOT EXISTS idx_digest_revisions_agent_tier ON digest_extract_revisions (agent_id, tier, created_at DESC)",
1469
+ "CREATE INDEX IF NOT EXISTS idx_agent_runs_evaluation_id ON agent_runs (evaluation_id)"
1470
+ ];
1471
+ for (const idx of newIndexes) {
1472
+ db.exec(idx);
1473
+ }
1474
+ db.prepare(
1475
+ `INSERT INTO schema_version (version, applied_at)
1476
+ VALUES (?, ?)
1477
+ ON CONFLICT (version) DO NOTHING`
1478
+ ).run(15, epochSeconds());
1479
+ db.exec("COMMIT");
1480
+ } catch (err) {
1481
+ db.exec("ROLLBACK");
1482
+ throw err;
1483
+ }
1484
+ }
1485
+ function migrateV20ToV21(db) {
1486
+ db.prepare("BEGIN").run();
1487
+ try {
1488
+ if (tableExists(db, "graph_edges")) {
1489
+ db.prepare(
1490
+ `DELETE FROM graph_edges WHERE type IN ('REFERENCES', 'AFFECTS', 'DEPENDS_ON', 'RELATES_TO')`
1491
+ ).run();
1492
+ }
1493
+ if (tableExists(db, "entity_mentions")) {
1494
+ db.prepare(`DELETE FROM entity_mentions`).run();
1495
+ }
1496
+ if (tableExists(db, "entities")) {
1497
+ db.prepare(`DELETE FROM entities`).run();
1498
+ }
1499
+ db.prepare(
1500
+ `INSERT INTO schema_version (version, applied_at)
1501
+ VALUES (?, ?)
1502
+ ON CONFLICT (version) DO NOTHING`
1503
+ ).run(21, epochSeconds());
1504
+ db.prepare("COMMIT").run();
1505
+ } catch (err) {
1506
+ db.prepare("ROLLBACK").run();
1507
+ throw err;
1508
+ }
1509
+ }
1510
+ function tableExists(db, name) {
1511
+ const row = db.prepare(
1512
+ `SELECT count(*) AS c FROM sqlite_master WHERE type = 'table' AND name = ?`
1513
+ ).get(name);
1514
+ return row.c > 0;
1515
+ }
1011
1516
 
1012
1517
  // src/db/schema.ts
1013
- var SCHEMA_VERSION = 12;
1518
+ var SCHEMA_VERSION = 21;
1014
1519
  var EMBEDDING_DIMENSIONS = 1024;
1015
1520
  function getCurrentVersion(db) {
1016
1521
  const row = db.prepare(
@@ -1018,18 +1523,29 @@ function getCurrentVersion(db) {
1018
1523
  ).get();
1019
1524
  return row?.version ?? 0;
1020
1525
  }
1526
+ function hasSchemaVersionTable(db) {
1527
+ const row = db.prepare(
1528
+ `SELECT 1 AS present FROM sqlite_master
1529
+ WHERE type = 'table' AND name = 'schema_version'
1530
+ LIMIT 1`
1531
+ ).get();
1532
+ return row?.present === 1;
1533
+ }
1021
1534
  function createSchema(db, machineId = DEFAULT_MACHINE_ID) {
1022
- try {
1535
+ if (hasSchemaVersionTable(db)) {
1023
1536
  const currentVersion = getCurrentVersion(db);
1024
- if (currentVersion === SCHEMA_VERSION) return;
1537
+ if (currentVersion === SCHEMA_VERSION) {
1538
+ reapplyCurrentSchemaDdl(db);
1539
+ return;
1540
+ }
1025
1541
  for (const migration of MIGRATIONS) {
1026
1542
  const version = getCurrentVersion(db);
1027
1543
  if (version < migration.version) {
1028
1544
  migration.migrate(db, machineId);
1029
1545
  }
1030
1546
  }
1547
+ reapplyCurrentSchemaDdl(db);
1031
1548
  return;
1032
- } catch {
1033
1549
  }
1034
1550
  for (const ddl of TABLE_DDLS) {
1035
1551
  db.exec(ddl);
@@ -1046,13 +1562,53 @@ function createSchema(db, machineId = DEFAULT_MACHINE_ID) {
1046
1562
  ON CONFLICT (version) DO NOTHING`
1047
1563
  ).run(SCHEMA_VERSION, epochSeconds());
1048
1564
  }
1565
+ var FTS_TRIGGER_GROUPS = [
1566
+ { ftsTable: "log_entries_fts", baseTable: "log_entries", triggers: ["log_entries_ai", "log_entries_ad"] },
1567
+ { ftsTable: "prompt_batches_fts", baseTable: "prompt_batches", triggers: ["prompt_batches_fts_ai", "prompt_batches_fts_au", "prompt_batches_fts_ad"] },
1568
+ { ftsTable: "activities_fts", baseTable: "activities", triggers: ["activities_fts_ai", "activities_fts_au", "activities_fts_ad"] },
1569
+ { ftsTable: "spores_fts", baseTable: "spores", triggers: ["spores_fts_ai", "spores_fts_au", "spores_fts_ad"] },
1570
+ { ftsTable: "sessions_fts", baseTable: "sessions", triggers: ["sessions_fts_ai", "sessions_fts_au", "sessions_fts_ad"] }
1571
+ ];
1572
+ function reapplyCurrentSchemaDdl(db) {
1573
+ const triggersBefore = new Set(
1574
+ db.prepare("SELECT name FROM sqlite_master WHERE type = 'trigger'").all().map((row) => row.name)
1575
+ );
1576
+ for (const ddl of TABLE_DDLS) {
1577
+ db.exec(ddl);
1578
+ }
1579
+ for (const ddl of FTS_TABLES) {
1580
+ db.exec(ddl);
1581
+ }
1582
+ for (const idx of SECONDARY_INDEXES) {
1583
+ db.exec(idx);
1584
+ }
1585
+ let rebuiltAny = false;
1586
+ for (const group of FTS_TRIGGER_GROUPS) {
1587
+ const wasMissing = group.triggers.some((name) => !triggersBefore.has(name));
1588
+ if (!wasMissing) continue;
1589
+ const baseCount = db.prepare(`SELECT COUNT(*) AS n FROM ${group.baseTable}`).get().n;
1590
+ if (baseCount === 0) continue;
1591
+ db.prepare(`INSERT INTO ${group.ftsTable}(${group.ftsTable}) VALUES('rebuild')`).run();
1592
+ rebuiltAny = true;
1593
+ }
1594
+ if (rebuiltAny) {
1595
+ process.stderr.write("[schema] Rebuilt one or more FTS indexes after detecting missing sync triggers\n");
1596
+ }
1597
+ }
1049
1598
 
1050
1599
  export {
1051
1600
  CANDIDATE_STATUS,
1052
1601
  AGENT_SETTABLE_STATUSES,
1053
1602
  REST_SETTABLE_STATUSES,
1603
+ TRANSCRIPT_SOURCE_PREFIX,
1604
+ normalizePlanSourcePath,
1605
+ buildPathPlanLogicalKey,
1606
+ buildSessionTagPlanLogicalKey,
1607
+ buildSessionPlanLogicalKey,
1608
+ buildPlanId,
1609
+ humanizePlanToken,
1054
1610
  SCHEMA_VERSION,
1055
1611
  EMBEDDING_DIMENSIONS,
1056
1612
  createSchema
1057
1613
  };
1058
- //# sourceMappingURL=chunk-MYOZLMB2.js.map
1614
+ //# sourceMappingURL=chunk-DTWUHHFI.js.map