@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.
- package/bin/myco-run +68 -7
- package/dist/agent-eval-YK2VP2S4.js +356 -0
- package/dist/agent-eval-YK2VP2S4.js.map +1 -0
- package/dist/{agent-run-X25Q2A6T.js → agent-run-GEJBD2YD.js} +10 -8
- package/dist/{agent-run-X25Q2A6T.js.map → agent-run-GEJBD2YD.js.map} +1 -1
- package/dist/{agent-tasks-7B6OFERB.js → agent-tasks-5XSRGTRX.js} +10 -8
- package/dist/{agent-tasks-7B6OFERB.js.map → agent-tasks-5XSRGTRX.js.map} +1 -1
- package/dist/{chunk-OD4AA7PV.js → chunk-53RPGOEN.js} +56 -8
- package/dist/chunk-53RPGOEN.js.map +1 -0
- package/dist/chunk-54SXG5HF.js +26 -0
- package/dist/chunk-54SXG5HF.js.map +1 -0
- package/dist/{chunk-XATDZX7U.js → chunk-6ALVMIB4.js} +19 -5
- package/dist/{chunk-XATDZX7U.js.map → chunk-6ALVMIB4.js.map} +1 -1
- package/dist/{chunk-FLLBJLHM.js → chunk-6C6QZ4PM.js} +9 -5
- package/dist/chunk-6C6QZ4PM.js.map +1 -0
- package/dist/{chunk-CCRGY3QW.js → chunk-AUIXX33A.js} +24 -95
- package/dist/chunk-AUIXX33A.js.map +1 -0
- package/dist/chunk-CISWUP5W.js +101 -0
- package/dist/chunk-CISWUP5W.js.map +1 -0
- package/dist/{chunk-MYOZLMB2.js → chunk-DTWUHHFI.js} +576 -20
- package/dist/chunk-DTWUHHFI.js.map +1 -0
- package/dist/chunk-EEOJWLMP.js +582 -0
- package/dist/chunk-EEOJWLMP.js.map +1 -0
- package/dist/{chunk-XG5RRUYF.js → chunk-ENZR5NG7.js} +2 -2
- package/dist/{chunk-6RFZWV4R.js → chunk-FCJ5JV54.js} +1 -1
- package/dist/{chunk-6RFZWV4R.js.map → chunk-FCJ5JV54.js.map} +1 -1
- package/dist/{chunk-US4LNCAT.js → chunk-IPPMYQ2Y.js} +5 -1
- package/dist/chunk-IPPMYQ2Y.js.map +1 -0
- package/dist/{chunk-VVNL26WX.js → chunk-KTTSXYEK.js} +22 -10
- package/dist/chunk-KTTSXYEK.js.map +1 -0
- package/dist/chunk-LQIPXVDH.js +17 -0
- package/dist/chunk-LQIPXVDH.js.map +1 -0
- package/dist/{chunk-DCSGJ7W4.js → chunk-N2DGFACQ.js} +3 -3
- package/dist/chunk-N7Z3LUEZ.js +858 -0
- package/dist/chunk-N7Z3LUEZ.js.map +1 -0
- package/dist/{chunk-2PDWCDKY.js → chunk-NFO7BRCO.js} +10 -7
- package/dist/{chunk-2PDWCDKY.js.map → chunk-NFO7BRCO.js.map} +1 -1
- package/dist/{chunk-Q36VMZST.js → chunk-OTQH5KZW.js} +89 -38
- package/dist/chunk-OTQH5KZW.js.map +1 -0
- package/dist/chunk-OUJSQSKE.js +113 -0
- package/dist/chunk-OUJSQSKE.js.map +1 -0
- package/dist/chunk-OZ3FBAK5.js +50 -0
- package/dist/chunk-OZ3FBAK5.js.map +1 -0
- package/dist/chunk-QATYARI5.js +408 -0
- package/dist/chunk-QATYARI5.js.map +1 -0
- package/dist/{chunk-KESLPBKV.js → chunk-QDLVIW2O.js} +4 -4
- package/dist/{chunk-5XIVBO25.js → chunk-QLLBJEM7.js} +6 -2
- package/dist/chunk-QLLBJEM7.js.map +1 -0
- package/dist/{chunk-EVDQKYCG.js → chunk-RQSJLWP4.js} +13 -2
- package/dist/chunk-RQSJLWP4.js.map +1 -0
- package/dist/{chunk-BPRIYNLE.js → chunk-TKAJ3JVF.js} +3 -3
- package/dist/chunk-TSM6VESW.js +25 -0
- package/dist/chunk-TSM6VESW.js.map +1 -0
- package/dist/{chunk-6X2ERTQV.js → chunk-USVFEWYL.js} +6 -4
- package/dist/{chunk-6X2ERTQV.js.map → chunk-USVFEWYL.js.map} +1 -1
- package/dist/{chunk-JZGN33AY.js → chunk-VRI56337.js} +4 -4
- package/dist/chunk-X2IRGXGF.js +14103 -0
- package/dist/chunk-X2IRGXGF.js.map +1 -0
- package/dist/{chunk-FMRZ26U5.js → chunk-X3IGT5RV.js} +5 -2
- package/dist/{chunk-FMRZ26U5.js.map → chunk-X3IGT5RV.js.map} +1 -1
- package/dist/{chunk-KHT24OWC.js → chunk-YDUOSRGD.js} +8 -94
- package/dist/{chunk-KHT24OWC.js.map → chunk-YDUOSRGD.js.map} +1 -1
- package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
- package/dist/chunk-Z66IT5KL.js.map +1 -0
- package/dist/{cli-GGPWH4UO.js → cli-HSLIG7EX.js} +50 -43
- package/dist/cli-HSLIG7EX.js.map +1 -0
- package/dist/{client-YXQUTXVZ.js → client-Z43DNLJH.js} +4 -4
- package/dist/{config-OMCYHG2S.js → config-VC4ACP42.js} +6 -4
- package/dist/{config-OMCYHG2S.js.map → config-VC4ACP42.js.map} +1 -1
- package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
- package/dist/{detect-providers-5KOPZ7J2.js → detect-providers-ILLQZROY.js} +4 -4
- package/dist/{doctor-5JXJ36KA.js → doctor-HJCWHAU4.js} +49 -16
- package/dist/doctor-HJCWHAU4.js.map +1 -0
- package/dist/executor-DO6QFC6G.js +45 -0
- package/dist/{init-LMYOVZAV.js → init-4KVK7W2E.js} +16 -14
- package/dist/{init-LMYOVZAV.js.map → init-4KVK7W2E.js.map} +1 -1
- package/dist/{installer-FS257JRZ.js → installer-N4UTEACX.js} +6 -4
- package/dist/{llm-TH4NLIRM.js → llm-AGVEF5XD.js} +5 -4
- package/dist/{loader-CQYTFHEW.js → loader-LX7TFRM6.js} +5 -3
- package/dist/{loader-NOMBJUPW.js → loader-UDNUMEDA.js} +5 -3
- package/dist/{main-YTBVRTBI.js → main-4J4QZZTZ.js} +2518 -656
- package/dist/main-4J4QZZTZ.js.map +1 -0
- package/dist/{open-HG2DX6RN.js → open-7TXJQM3H.js} +10 -8
- package/dist/{open-HG2DX6RN.js.map → open-7TXJQM3H.js.map} +1 -1
- package/dist/{post-compact-JSECI44W.js → post-compact-7AEFVCZS.js} +8 -8
- package/dist/{post-tool-use-POGPTJBA.js → post-tool-use-TZINWWDH.js} +11 -9
- package/dist/post-tool-use-TZINWWDH.js.map +1 -0
- package/dist/{post-tool-use-failure-OT7BFWQW.js → post-tool-use-failure-TCFEU2GI.js} +8 -8
- package/dist/{pre-compact-OXVODKH4.js → pre-compact-LO2VZCGR.js} +8 -8
- package/dist/{provider-check-43LAMSMH.js → provider-check-ZEV5P4KM.js} +4 -4
- package/dist/{registry-U4CHXK6R.js → registry-F3THYC5M.js} +6 -4
- package/dist/{remove-N7ZPELFU.js → remove-F77AAALE.js} +12 -10
- package/dist/{remove-N7ZPELFU.js.map → remove-F77AAALE.js.map} +1 -1
- package/dist/{restart-ADG5GBTB.js → restart-UEFDPMLT.js} +11 -9
- package/dist/{restart-ADG5GBTB.js.map → restart-UEFDPMLT.js.map} +1 -1
- package/dist/{search-AHZEUNRR.js → search-NHNVUAQQ.js} +11 -9
- package/dist/{search-AHZEUNRR.js.map → search-NHNVUAQQ.js.map} +1 -1
- package/dist/{server-AGVYZVP5.js → server-AZJSTQEK.js} +369 -270
- package/dist/server-AZJSTQEK.js.map +1 -0
- package/dist/{session-6IU4AXYP.js → session-3HLC5KOD.js} +11 -9
- package/dist/{session-6IU4AXYP.js.map → session-3HLC5KOD.js.map} +1 -1
- package/dist/{session-end-FT27DWYZ.js → session-end-FS46UARX.js} +7 -7
- package/dist/session-start-46KPFV2H.js +134 -0
- package/dist/session-start-46KPFV2H.js.map +1 -0
- package/dist/{setup-llm-77MP4I2G.js → setup-llm-JMWSNQ2C.js} +11 -9
- package/dist/{setup-llm-77MP4I2G.js.map → setup-llm-JMWSNQ2C.js.map} +1 -1
- package/dist/src/agent/definitions/agent.yaml +9 -5
- package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +115 -0
- package/dist/src/agent/definitions/tasks/cortex-prompt-builder.yaml +67 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -1
- package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
- package/dist/src/agent/definitions/tasks/review-session.yaml +10 -39
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +181 -25
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +21 -7
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +2 -6
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
- package/dist/src/agent/definitions/tasks/title-summary.yaml +12 -19
- package/dist/src/agent/definitions/tasks/{full-intelligence.yaml → vault-evolve.yaml} +74 -129
- package/dist/src/agent/definitions/tasks/vault-seed.yaml +370 -0
- package/dist/src/agent/prompts/agent.md +12 -38
- package/dist/src/cli.js +1 -1
- package/dist/src/daemon/main.js +1 -1
- package/dist/src/hooks/post-tool-use.js +1 -1
- package/dist/src/hooks/session-end.js +1 -1
- package/dist/src/hooks/session-start.js +1 -1
- package/dist/src/hooks/stop.js +1 -1
- package/dist/src/hooks/user-prompt-submit.js +1 -1
- package/dist/src/mcp/server.js +1 -1
- package/dist/src/symbionts/manifests/claude-code.yaml +4 -0
- package/dist/src/symbionts/manifests/opencode.yaml +7 -0
- package/dist/src/symbionts/manifests/pi.yaml +22 -0
- package/dist/src/symbionts/templates/agents-starter.md +1 -1
- package/dist/src/symbionts/templates/pi/package.json +6 -0
- package/dist/src/symbionts/templates/pi/plugin.ts +559 -0
- package/dist/{stats-NVPWOYTE.js → stats-MKMETHMA.js} +11 -9
- package/dist/{stats-NVPWOYTE.js.map → stats-MKMETHMA.js.map} +1 -1
- package/dist/{stop-ZPIKVLH4.js → stop-OUEX6KA4.js} +7 -7
- package/dist/{stop-failure-2PX67YJC.js → stop-failure-2BWVNZEG.js} +8 -8
- package/dist/{subagent-start-UUE6EHQD.js → subagent-start-J4VV6DEE.js} +8 -8
- package/dist/{subagent-stop-KQWWWPE6.js → subagent-stop-JMLVEPIA.js} +8 -8
- package/dist/{task-completed-WMHOFQ7B.js → task-completed-65CHMMKA.js} +8 -8
- package/dist/{team-LRZ6GTQK.js → team-U2LDKIS4.js} +7 -5
- package/dist/{turns-YFNI5CQC.js → turns-HU2CTZAP.js} +2 -2
- package/dist/ui/assets/index-BUGor9dk.js +842 -0
- package/dist/ui/assets/index-_OP4ifzH.css +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-O6V4RC4W.js → update-ZSHVXWSQ.js} +12 -10
- package/dist/{update-O6V4RC4W.js.map → update-ZSHVXWSQ.js.map} +1 -1
- package/dist/{user-prompt-submit-N36KUPHI.js → user-prompt-submit-APMO6FVU.js} +10 -9
- package/dist/{user-prompt-submit-N36KUPHI.js.map → user-prompt-submit-APMO6FVU.js.map} +1 -1
- package/dist/{verify-LXPV7NYG.js → verify-R76ZFJSZ.js} +8 -5
- package/dist/{verify-LXPV7NYG.js.map → verify-R76ZFJSZ.js.map} +1 -1
- package/dist/{version-XMPPJQHR.js → version-TXPPS3L5.js} +2 -2
- package/dist/version-TXPPS3L5.js.map +1 -0
- package/package.json +3 -1
- package/skills/myco/SKILL.md +16 -1
- package/skills/myco/references/cli-usage.md +1 -1
- package/skills/myco-rules/SKILL.md +94 -0
- package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
- package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
- package/dist/chunk-4YFKBL3F.js +0 -195
- package/dist/chunk-4YFKBL3F.js.map +0 -1
- package/dist/chunk-5XIVBO25.js.map +0 -1
- package/dist/chunk-CCRGY3QW.js.map +0 -1
- package/dist/chunk-CUDIZJY7.js +0 -36
- package/dist/chunk-CUDIZJY7.js.map +0 -1
- package/dist/chunk-EVDQKYCG.js.map +0 -1
- package/dist/chunk-FLLBJLHM.js.map +0 -1
- package/dist/chunk-MYOZLMB2.js.map +0 -1
- package/dist/chunk-NGROSFOH.js.map +0 -1
- package/dist/chunk-OD4AA7PV.js.map +0 -1
- package/dist/chunk-Q36VMZST.js.map +0 -1
- package/dist/chunk-US4LNCAT.js.map +0 -1
- package/dist/chunk-UYMFCYBF.js +0 -2326
- package/dist/chunk-UYMFCYBF.js.map +0 -1
- package/dist/chunk-VVNL26WX.js.map +0 -1
- package/dist/cli-GGPWH4UO.js.map +0 -1
- package/dist/doctor-5JXJ36KA.js.map +0 -1
- package/dist/executor-HWW2QNZQ.js +0 -2472
- package/dist/executor-HWW2QNZQ.js.map +0 -1
- package/dist/main-YTBVRTBI.js.map +0 -1
- package/dist/post-tool-use-POGPTJBA.js.map +0 -1
- package/dist/server-AGVYZVP5.js.map +0 -1
- package/dist/session-start-LAFICHII.js +0 -189
- package/dist/session-start-LAFICHII.js.map +0 -1
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +0 -93
- package/dist/ui/assets/index-C2JuNtRB.css +0 -1
- package/dist/ui/assets/index-JLVaQKV2.js +0 -832
- package/skills/myco-curate/SKILL.md +0 -86
- package/skills/rules/SKILL.md +0 -214
- /package/dist/{chunk-XG5RRUYF.js.map → chunk-ENZR5NG7.js.map} +0 -0
- /package/dist/{chunk-DCSGJ7W4.js.map → chunk-N2DGFACQ.js.map} +0 -0
- /package/dist/{chunk-KESLPBKV.js.map → chunk-QDLVIW2O.js.map} +0 -0
- /package/dist/{chunk-BPRIYNLE.js.map → chunk-TKAJ3JVF.js.map} +0 -0
- /package/dist/{chunk-JZGN33AY.js.map → chunk-VRI56337.js.map} +0 -0
- /package/dist/{client-YXQUTXVZ.js.map → client-Z43DNLJH.js.map} +0 -0
- /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
- /package/dist/{detect-providers-5KOPZ7J2.js.map → detect-providers-ILLQZROY.js.map} +0 -0
- /package/dist/{installer-FS257JRZ.js.map → executor-DO6QFC6G.js.map} +0 -0
- /package/dist/{llm-TH4NLIRM.js.map → installer-N4UTEACX.js.map} +0 -0
- /package/dist/{loader-CQYTFHEW.js.map → llm-AGVEF5XD.js.map} +0 -0
- /package/dist/{loader-NOMBJUPW.js.map → loader-LX7TFRM6.js.map} +0 -0
- /package/dist/{provider-check-43LAMSMH.js.map → loader-UDNUMEDA.js.map} +0 -0
- /package/dist/{post-compact-JSECI44W.js.map → post-compact-7AEFVCZS.js.map} +0 -0
- /package/dist/{post-tool-use-failure-OT7BFWQW.js.map → post-tool-use-failure-TCFEU2GI.js.map} +0 -0
- /package/dist/{pre-compact-OXVODKH4.js.map → pre-compact-LO2VZCGR.js.map} +0 -0
- /package/dist/{registry-U4CHXK6R.js.map → provider-check-ZEV5P4KM.js.map} +0 -0
- /package/dist/{team-LRZ6GTQK.js.map → registry-F3THYC5M.js.map} +0 -0
- /package/dist/{session-end-FT27DWYZ.js.map → session-end-FS46UARX.js.map} +0 -0
- /package/dist/{stop-ZPIKVLH4.js.map → stop-OUEX6KA4.js.map} +0 -0
- /package/dist/{stop-failure-2PX67YJC.js.map → stop-failure-2BWVNZEG.js.map} +0 -0
- /package/dist/{subagent-start-UUE6EHQD.js.map → subagent-start-J4VV6DEE.js.map} +0 -0
- /package/dist/{subagent-stop-KQWWWPE6.js.map → subagent-stop-JMLVEPIA.js.map} +0 -0
- /package/dist/{task-completed-WMHOFQ7B.js.map → task-completed-65CHMMKA.js.map} +0 -0
- /package/dist/{turns-YFNI5CQC.js.map → team-U2LDKIS4.js.map} +0 -0
- /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-
|
|
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
|
|
235
|
-
agent_id
|
|
236
|
-
task
|
|
237
|
-
instruction
|
|
238
|
-
status
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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 =
|
|
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
|
-
|
|
1535
|
+
if (hasSchemaVersionTable(db)) {
|
|
1023
1536
|
const currentVersion = getCurrentVersion(db);
|
|
1024
|
-
if (currentVersion === SCHEMA_VERSION)
|
|
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-
|
|
1614
|
+
//# sourceMappingURL=chunk-DTWUHHFI.js.map
|