@goondocks/myco 0.6.4 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -3
- package/.claude-plugin/plugin.json +3 -3
- package/CONTRIBUTING.md +37 -30
- package/README.md +64 -28
- package/bin/myco-run +2 -0
- package/dist/agent-run-EFICNTAU.js +34 -0
- package/dist/agent-run-EFICNTAU.js.map +1 -0
- package/dist/agent-tasks-RXJ7Z5NG.js +180 -0
- package/dist/agent-tasks-RXJ7Z5NG.js.map +1 -0
- package/dist/chunk-2T7RPVPP.js +116 -0
- package/dist/chunk-2T7RPVPP.js.map +1 -0
- package/dist/chunk-3K5WGSJ4.js +165 -0
- package/dist/chunk-3K5WGSJ4.js.map +1 -0
- package/dist/chunk-46PWOKSI.js +26 -0
- package/dist/chunk-46PWOKSI.js.map +1 -0
- package/dist/chunk-4LPQ26CK.js +277 -0
- package/dist/chunk-4LPQ26CK.js.map +1 -0
- package/dist/chunk-5PEUFJ6U.js +92 -0
- package/dist/chunk-5PEUFJ6U.js.map +1 -0
- package/dist/chunk-5VZ52A4T.js +136 -0
- package/dist/chunk-5VZ52A4T.js.map +1 -0
- package/dist/chunk-BUSP3OJB.js +103 -0
- package/dist/chunk-BUSP3OJB.js.map +1 -0
- package/dist/chunk-D7TYRPRM.js +7312 -0
- package/dist/chunk-D7TYRPRM.js.map +1 -0
- package/dist/chunk-DCXRSSBP.js +22 -0
- package/dist/chunk-DCXRSSBP.js.map +1 -0
- package/dist/chunk-E4VLWIJC.js +2 -0
- package/dist/chunk-FFAYUQ5N.js +39 -0
- package/dist/chunk-FFAYUQ5N.js.map +1 -0
- package/dist/chunk-IB76KGBY.js +2 -0
- package/dist/chunk-JMJJEQ3P.js +486 -0
- package/dist/chunk-JMJJEQ3P.js.map +1 -0
- package/dist/{chunk-N33KUCFP.js → chunk-JTYZRPX5.js} +1 -9
- package/dist/chunk-JTYZRPX5.js.map +1 -0
- package/dist/{chunk-NLUE6CYG.js → chunk-JYOOJCPQ.js} +33 -17
- package/dist/chunk-JYOOJCPQ.js.map +1 -0
- package/dist/{chunk-Z74SDEKE.js → chunk-KB4DGYIY.js} +91 -9
- package/dist/chunk-KB4DGYIY.js.map +1 -0
- package/dist/{chunk-ERG2IEWX.js → chunk-KH64DHOY.js} +3 -7413
- package/dist/chunk-KH64DHOY.js.map +1 -0
- package/dist/chunk-KV4OC4H3.js +498 -0
- package/dist/chunk-KV4OC4H3.js.map +1 -0
- package/dist/chunk-KYLDNM7H.js +66 -0
- package/dist/chunk-KYLDNM7H.js.map +1 -0
- package/dist/chunk-LPUQPDC2.js +19 -0
- package/dist/chunk-LPUQPDC2.js.map +1 -0
- package/dist/chunk-M5XWW7UI.js +97 -0
- package/dist/chunk-M5XWW7UI.js.map +1 -0
- package/dist/chunk-MHSCMET3.js +275 -0
- package/dist/chunk-MHSCMET3.js.map +1 -0
- package/dist/chunk-MYX5NCRH.js +45 -0
- package/dist/chunk-MYX5NCRH.js.map +1 -0
- package/dist/chunk-OXZSXYAT.js +877 -0
- package/dist/chunk-OXZSXYAT.js.map +1 -0
- package/dist/chunk-PB6TOLRQ.js +35 -0
- package/dist/chunk-PB6TOLRQ.js.map +1 -0
- package/dist/chunk-PT5IC642.js +162 -0
- package/dist/chunk-PT5IC642.js.map +1 -0
- package/dist/chunk-QIK2XSDQ.js +187 -0
- package/dist/chunk-QIK2XSDQ.js.map +1 -0
- package/dist/chunk-RJ6ZQKG5.js +26 -0
- package/dist/chunk-RJ6ZQKG5.js.map +1 -0
- package/dist/{chunk-YIQLYIHW.js → chunk-TRUJLI6K.js} +29 -43
- package/dist/chunk-TRUJLI6K.js.map +1 -0
- package/dist/chunk-U3IBO3O3.js +41 -0
- package/dist/chunk-U3IBO3O3.js.map +1 -0
- package/dist/{chunk-7WHF2OIZ.js → chunk-UBZPD4HN.js} +25 -7
- package/dist/chunk-UBZPD4HN.js.map +1 -0
- package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
- package/dist/chunk-V7XG6V6C.js.map +1 -0
- package/dist/chunk-WGTCA2NU.js +84 -0
- package/dist/chunk-WGTCA2NU.js.map +1 -0
- package/dist/{chunk-O6PERU7U.js → chunk-XNOCTDHF.js} +2 -2
- package/dist/chunk-YDN4OM33.js +80 -0
- package/dist/chunk-YDN4OM33.js.map +1 -0
- package/dist/cli-ODLFRIYS.js +128 -0
- package/dist/cli-ODLFRIYS.js.map +1 -0
- package/dist/client-EYOTW3JU.js +19 -0
- package/dist/client-MXRNQ5FI.js +13 -0
- package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
- package/dist/config-UR5BSGVX.js.map +1 -0
- package/dist/detect-H5OPI7GD.js +17 -0
- package/dist/detect-H5OPI7GD.js.map +1 -0
- package/dist/detect-providers-Q42OD4OS.js +26 -0
- package/dist/detect-providers-Q42OD4OS.js.map +1 -0
- package/dist/doctor-JLKTXDEH.js +258 -0
- package/dist/doctor-JLKTXDEH.js.map +1 -0
- package/dist/executor-ONSDHPGX.js +1441 -0
- package/dist/executor-ONSDHPGX.js.map +1 -0
- package/dist/init-6GWY345B.js +198 -0
- package/dist/init-6GWY345B.js.map +1 -0
- package/dist/init-wizard-UONLDYLI.js +294 -0
- package/dist/init-wizard-UONLDYLI.js.map +1 -0
- package/dist/llm-BV3QNVRD.js +17 -0
- package/dist/llm-BV3QNVRD.js.map +1 -0
- package/dist/loader-SH67XD54.js +28 -0
- package/dist/loader-SH67XD54.js.map +1 -0
- package/dist/loader-XVXKZZDH.js +18 -0
- package/dist/loader-XVXKZZDH.js.map +1 -0
- package/dist/{chunk-H7PRCVGQ.js → logs-QZVYF6FP.js} +74 -5
- package/dist/logs-QZVYF6FP.js.map +1 -0
- package/dist/main-BMCL7CPO.js +4393 -0
- package/dist/main-BMCL7CPO.js.map +1 -0
- package/dist/openai-embeddings-C265WRNK.js +14 -0
- package/dist/openai-embeddings-C265WRNK.js.map +1 -0
- package/dist/openrouter-U6VFCRX2.js +14 -0
- package/dist/openrouter-U6VFCRX2.js.map +1 -0
- package/dist/post-compact-OWFSOITU.js +26 -0
- package/dist/post-compact-OWFSOITU.js.map +1 -0
- package/dist/post-tool-use-DOUM7CGQ.js +56 -0
- package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
- package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
- package/dist/pre-compact-3J33CHXQ.js +25 -0
- package/dist/pre-compact-3J33CHXQ.js.map +1 -0
- package/dist/provider-check-3WBPZADE.js +12 -0
- package/dist/provider-check-3WBPZADE.js.map +1 -0
- package/dist/registry-J4XTWARS.js +25 -0
- package/dist/registry-J4XTWARS.js.map +1 -0
- package/dist/resolution-events-TFEQPVKS.js +12 -0
- package/dist/resolution-events-TFEQPVKS.js.map +1 -0
- package/dist/resolve-3FEUV462.js +9 -0
- package/dist/resolve-3FEUV462.js.map +1 -0
- package/dist/{restart-XCMILOL5.js → restart-2VM33WOB.js} +10 -6
- package/dist/{restart-XCMILOL5.js.map → restart-2VM33WOB.js.map} +1 -1
- package/dist/search-ZGQR5MDE.js +91 -0
- package/dist/search-ZGQR5MDE.js.map +1 -0
- package/dist/{server-6UDN35QN.js → server-6KMBJCHZ.js} +308 -517
- package/dist/server-6KMBJCHZ.js.map +1 -0
- package/dist/session-Z2FXDDG6.js +68 -0
- package/dist/session-Z2FXDDG6.js.map +1 -0
- package/dist/session-end-FLVX32LE.js +38 -0
- package/dist/session-end-FLVX32LE.js.map +1 -0
- package/dist/session-start-UCLK7PXE.js +169 -0
- package/dist/session-start-UCLK7PXE.js.map +1 -0
- package/dist/setup-digest-4KDSXAIV.js +15 -0
- package/dist/setup-digest-4KDSXAIV.js.map +1 -0
- package/dist/setup-llm-GKMCHURK.js +81 -0
- package/dist/setup-llm-GKMCHURK.js.map +1 -0
- package/dist/src/agent/definitions/agent.yaml +35 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
- package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
- package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
- package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
- package/dist/src/agent/prompts/agent.md +121 -0
- package/dist/src/agent/prompts/orchestrator.md +91 -0
- package/dist/src/cli.js +1 -8
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon/main.js +1 -8
- package/dist/src/daemon/main.js.map +1 -1
- package/dist/src/hooks/post-tool-use.js +3 -50
- package/dist/src/hooks/post-tool-use.js.map +1 -1
- package/dist/src/hooks/session-end.js +3 -32
- package/dist/src/hooks/session-end.js.map +1 -1
- package/dist/src/hooks/session-start.js +2 -8
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/stop.js +3 -42
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/hooks/user-prompt-submit.js +3 -53
- package/dist/src/hooks/user-prompt-submit.js.map +1 -1
- package/dist/src/mcp/server.js +1 -8
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/prompts/digest-system.md +1 -1
- package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
- package/dist/src/symbionts/manifests/cursor.yaml +14 -0
- package/dist/stats-IUJPZSVZ.js +94 -0
- package/dist/stats-IUJPZSVZ.js.map +1 -0
- package/dist/stop-XRQLLXST.js +42 -0
- package/dist/stop-XRQLLXST.js.map +1 -0
- package/dist/stop-failure-2CAJJKRG.js +26 -0
- package/dist/stop-failure-2CAJJKRG.js.map +1 -0
- package/dist/subagent-start-MWWQTZMQ.js +26 -0
- package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
- package/dist/subagent-stop-PJXYGRXB.js +28 -0
- package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
- package/dist/task-completed-4LFRJVGI.js +27 -0
- package/dist/task-completed-4LFRJVGI.js.map +1 -0
- package/dist/ui/assets/index-DZrElonz.js +744 -0
- package/dist/ui/assets/index-TkeiYbZB.css +1 -0
- package/dist/ui/favicon.svg +7 -7
- package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
- package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
- package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
- package/dist/ui/index.html +2 -2
- package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
- package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
- package/dist/{verify-TOWQHPBX.js → verify-UDAYVX37.js} +17 -22
- package/dist/verify-UDAYVX37.js.map +1 -0
- package/dist/{version-36RVCQA6.js → version-KLBN4HZT.js} +3 -4
- package/dist/version-KLBN4HZT.js.map +1 -0
- package/hooks/hooks.json +82 -5
- package/package.json +6 -3
- package/skills/myco/SKILL.md +10 -10
- package/skills/myco/references/cli-usage.md +15 -13
- package/skills/myco/references/vault-status.md +3 -3
- package/skills/myco/references/wisdom.md +4 -4
- package/skills/myco-curate/SKILL.md +86 -0
- package/dist/chunk-2ZIBCEYO.js +0 -113
- package/dist/chunk-2ZIBCEYO.js.map +0 -1
- package/dist/chunk-4RMSHZE4.js +0 -107
- package/dist/chunk-4RMSHZE4.js.map +0 -1
- package/dist/chunk-4XVKZ3WA.js +0 -1078
- package/dist/chunk-4XVKZ3WA.js.map +0 -1
- package/dist/chunk-6FQISQNA.js +0 -61
- package/dist/chunk-6FQISQNA.js.map +0 -1
- package/dist/chunk-7WHF2OIZ.js.map +0 -1
- package/dist/chunk-ERG2IEWX.js.map +0 -1
- package/dist/chunk-FPRXMJLT.js +0 -56
- package/dist/chunk-FPRXMJLT.js.map +0 -1
- package/dist/chunk-GENQ5QGP.js +0 -37
- package/dist/chunk-GENQ5QGP.js.map +0 -1
- package/dist/chunk-H7PRCVGQ.js.map +0 -1
- package/dist/chunk-HIN3UVOG.js.map +0 -1
- package/dist/chunk-HYVT345Y.js +0 -159
- package/dist/chunk-HYVT345Y.js.map +0 -1
- package/dist/chunk-J4D4CROB.js +0 -143
- package/dist/chunk-J4D4CROB.js.map +0 -1
- package/dist/chunk-MDLSAFPP.js +0 -99
- package/dist/chunk-MDLSAFPP.js.map +0 -1
- package/dist/chunk-N33KUCFP.js.map +0 -1
- package/dist/chunk-NL6WQO56.js +0 -65
- package/dist/chunk-NL6WQO56.js.map +0 -1
- package/dist/chunk-NLUE6CYG.js.map +0 -1
- package/dist/chunk-P723N2LP.js +0 -147
- package/dist/chunk-P723N2LP.js.map +0 -1
- package/dist/chunk-QLUE3BUL.js +0 -161
- package/dist/chunk-QLUE3BUL.js.map +0 -1
- package/dist/chunk-QN4W3JUA.js +0 -43
- package/dist/chunk-QN4W3JUA.js.map +0 -1
- package/dist/chunk-RGVBGTD6.js +0 -21
- package/dist/chunk-RGVBGTD6.js.map +0 -1
- package/dist/chunk-TWSTAVLO.js +0 -132
- package/dist/chunk-TWSTAVLO.js.map +0 -1
- package/dist/chunk-UP4P4OAA.js +0 -4423
- package/dist/chunk-UP4P4OAA.js.map +0 -1
- package/dist/chunk-YIQLYIHW.js.map +0 -1
- package/dist/chunk-YTFXA4RX.js +0 -86
- package/dist/chunk-YTFXA4RX.js.map +0 -1
- package/dist/chunk-Z74SDEKE.js.map +0 -1
- package/dist/cli-IHILSS6N.js +0 -97
- package/dist/cli-IHILSS6N.js.map +0 -1
- package/dist/client-AGFNR2S4.js +0 -12
- package/dist/config-IBS6KOLQ.js.map +0 -1
- package/dist/curate-3D4GHKJH.js +0 -78
- package/dist/curate-3D4GHKJH.js.map +0 -1
- package/dist/detect-providers-XEP4QA3R.js +0 -35
- package/dist/detect-providers-XEP4QA3R.js.map +0 -1
- package/dist/digest-7HLJXL77.js +0 -85
- package/dist/digest-7HLJXL77.js.map +0 -1
- package/dist/init-ARQ53JOR.js +0 -109
- package/dist/init-ARQ53JOR.js.map +0 -1
- package/dist/logs-IENORIYR.js +0 -84
- package/dist/logs-IENORIYR.js.map +0 -1
- package/dist/main-6AGPIMH2.js +0 -5715
- package/dist/main-6AGPIMH2.js.map +0 -1
- package/dist/rebuild-Q2ACEB6F.js +0 -64
- package/dist/rebuild-Q2ACEB6F.js.map +0 -1
- package/dist/reprocess-CDEFGQOV.js +0 -79
- package/dist/reprocess-CDEFGQOV.js.map +0 -1
- package/dist/search-7W25SKCB.js +0 -120
- package/dist/search-7W25SKCB.js.map +0 -1
- package/dist/server-6UDN35QN.js.map +0 -1
- package/dist/session-F326AWCH.js +0 -44
- package/dist/session-F326AWCH.js.map +0 -1
- package/dist/session-start-K6IGAC7H.js +0 -192
- package/dist/session-start-K6IGAC7H.js.map +0 -1
- package/dist/setup-digest-X5PN27F4.js +0 -15
- package/dist/setup-llm-S5OHQJXK.js +0 -15
- package/dist/src/prompts/classification.md +0 -43
- package/dist/stats-TTSDXGJV.js +0 -58
- package/dist/stats-TTSDXGJV.js.map +0 -1
- package/dist/templates-XPRBOWCE.js +0 -38
- package/dist/templates-XPRBOWCE.js.map +0 -1
- package/dist/ui/assets/index-08wKT7wS.css +0 -1
- package/dist/ui/assets/index-CMSMi4Jb.js +0 -369
- package/dist/verify-TOWQHPBX.js.map +0 -1
- package/skills/setup/SKILL.md +0 -174
- package/skills/setup/references/model-recommendations.md +0 -83
- /package/dist/{client-AGFNR2S4.js.map → chunk-E4VLWIJC.js.map} +0 -0
- /package/dist/{setup-digest-X5PN27F4.js.map → chunk-IB76KGBY.js.map} +0 -0
- /package/dist/{chunk-O6PERU7U.js.map → chunk-XNOCTDHF.js.map} +0 -0
- /package/dist/{setup-llm-S5OHQJXK.js.map → client-EYOTW3JU.js.map} +0 -0
- /package/dist/{version-36RVCQA6.js.map → client-MXRNQ5FI.js.map} +0 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
epochSeconds
|
|
4
|
+
} from "./chunk-5VZ52A4T.js";
|
|
5
|
+
|
|
6
|
+
// src/db/schema.ts
|
|
7
|
+
var SCHEMA_VERSION = 3;
|
|
8
|
+
var EMBEDDING_DIMENSIONS = 1024;
|
|
9
|
+
var SCHEMA_VERSION_TABLE = `
|
|
10
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
11
|
+
version INTEGER PRIMARY KEY,
|
|
12
|
+
applied_at INTEGER NOT NULL
|
|
13
|
+
)`;
|
|
14
|
+
var SESSIONS_TABLE = `
|
|
15
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
16
|
+
id TEXT PRIMARY KEY,
|
|
17
|
+
agent TEXT NOT NULL,
|
|
18
|
+
"user" TEXT,
|
|
19
|
+
project_root TEXT,
|
|
20
|
+
branch TEXT,
|
|
21
|
+
started_at INTEGER NOT NULL,
|
|
22
|
+
ended_at INTEGER,
|
|
23
|
+
status TEXT DEFAULT 'active',
|
|
24
|
+
prompt_count INTEGER DEFAULT 0,
|
|
25
|
+
tool_count INTEGER DEFAULT 0,
|
|
26
|
+
title TEXT,
|
|
27
|
+
summary TEXT,
|
|
28
|
+
transcript_path TEXT,
|
|
29
|
+
parent_session_id TEXT,
|
|
30
|
+
parent_session_reason TEXT,
|
|
31
|
+
processed INTEGER DEFAULT 0,
|
|
32
|
+
content_hash TEXT UNIQUE,
|
|
33
|
+
created_at INTEGER NOT NULL,
|
|
34
|
+
embedded INTEGER DEFAULT 0
|
|
35
|
+
)`;
|
|
36
|
+
var PROMPT_BATCHES_TABLE = `
|
|
37
|
+
CREATE TABLE IF NOT EXISTS prompt_batches (
|
|
38
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
39
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
40
|
+
prompt_number INTEGER,
|
|
41
|
+
user_prompt TEXT,
|
|
42
|
+
response_summary TEXT,
|
|
43
|
+
classification TEXT,
|
|
44
|
+
started_at INTEGER,
|
|
45
|
+
ended_at INTEGER,
|
|
46
|
+
status TEXT DEFAULT 'active',
|
|
47
|
+
activity_count INTEGER DEFAULT 0,
|
|
48
|
+
processed INTEGER DEFAULT 0,
|
|
49
|
+
content_hash TEXT UNIQUE,
|
|
50
|
+
created_at INTEGER NOT NULL
|
|
51
|
+
)`;
|
|
52
|
+
var ACTIVITIES_TABLE = `
|
|
53
|
+
CREATE TABLE IF NOT EXISTS activities (
|
|
54
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
55
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
56
|
+
prompt_batch_id INTEGER REFERENCES prompt_batches(id),
|
|
57
|
+
tool_name TEXT NOT NULL,
|
|
58
|
+
tool_input TEXT,
|
|
59
|
+
tool_output_summary TEXT,
|
|
60
|
+
file_path TEXT,
|
|
61
|
+
files_affected TEXT,
|
|
62
|
+
duration_ms INTEGER,
|
|
63
|
+
success INTEGER DEFAULT 1,
|
|
64
|
+
error_message TEXT,
|
|
65
|
+
timestamp INTEGER NOT NULL,
|
|
66
|
+
processed INTEGER DEFAULT 0,
|
|
67
|
+
content_hash TEXT UNIQUE,
|
|
68
|
+
created_at INTEGER NOT NULL
|
|
69
|
+
)`;
|
|
70
|
+
var PLANS_TABLE = `
|
|
71
|
+
CREATE TABLE IF NOT EXISTS plans (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
status TEXT DEFAULT 'active',
|
|
74
|
+
author TEXT,
|
|
75
|
+
title TEXT,
|
|
76
|
+
content TEXT,
|
|
77
|
+
source_path TEXT,
|
|
78
|
+
tags TEXT,
|
|
79
|
+
session_id TEXT REFERENCES sessions(id),
|
|
80
|
+
prompt_batch_id INTEGER REFERENCES prompt_batches(id),
|
|
81
|
+
content_hash TEXT,
|
|
82
|
+
processed INTEGER DEFAULT 0,
|
|
83
|
+
created_at INTEGER NOT NULL,
|
|
84
|
+
updated_at INTEGER,
|
|
85
|
+
embedded INTEGER DEFAULT 0
|
|
86
|
+
)`;
|
|
87
|
+
var ARTIFACTS_TABLE = `
|
|
88
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
artifact_type TEXT,
|
|
91
|
+
source_path TEXT NOT NULL,
|
|
92
|
+
title TEXT NOT NULL,
|
|
93
|
+
content TEXT,
|
|
94
|
+
last_captured_by TEXT,
|
|
95
|
+
tags TEXT,
|
|
96
|
+
created_at INTEGER NOT NULL,
|
|
97
|
+
updated_at INTEGER,
|
|
98
|
+
embedded INTEGER DEFAULT 0
|
|
99
|
+
)`;
|
|
100
|
+
var TEAM_MEMBERS_TABLE = `
|
|
101
|
+
CREATE TABLE IF NOT EXISTS team_members (
|
|
102
|
+
id TEXT PRIMARY KEY,
|
|
103
|
+
"user" TEXT NOT NULL,
|
|
104
|
+
role TEXT,
|
|
105
|
+
joined TEXT,
|
|
106
|
+
tags TEXT
|
|
107
|
+
)`;
|
|
108
|
+
var ATTACHMENTS_TABLE = `
|
|
109
|
+
CREATE TABLE IF NOT EXISTS attachments (
|
|
110
|
+
id TEXT PRIMARY KEY,
|
|
111
|
+
session_id TEXT REFERENCES sessions(id),
|
|
112
|
+
prompt_batch_id INTEGER REFERENCES prompt_batches(id),
|
|
113
|
+
file_path TEXT NOT NULL,
|
|
114
|
+
media_type TEXT,
|
|
115
|
+
description TEXT,
|
|
116
|
+
data BLOB,
|
|
117
|
+
content_hash TEXT,
|
|
118
|
+
created_at INTEGER NOT NULL
|
|
119
|
+
)`;
|
|
120
|
+
var AGENTS_TABLE = `
|
|
121
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
122
|
+
id TEXT PRIMARY KEY,
|
|
123
|
+
name TEXT NOT NULL,
|
|
124
|
+
provider TEXT,
|
|
125
|
+
model TEXT,
|
|
126
|
+
system_prompt_hash TEXT,
|
|
127
|
+
config TEXT,
|
|
128
|
+
source TEXT NOT NULL DEFAULT 'built-in',
|
|
129
|
+
system_prompt TEXT,
|
|
130
|
+
max_turns INTEGER,
|
|
131
|
+
timeout_seconds INTEGER,
|
|
132
|
+
tool_access TEXT,
|
|
133
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
134
|
+
created_at INTEGER NOT NULL,
|
|
135
|
+
updated_at INTEGER
|
|
136
|
+
)`;
|
|
137
|
+
var SPORES_TABLE = `
|
|
138
|
+
CREATE TABLE IF NOT EXISTS spores (
|
|
139
|
+
id TEXT PRIMARY KEY,
|
|
140
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
141
|
+
session_id TEXT REFERENCES sessions(id),
|
|
142
|
+
prompt_batch_id INTEGER REFERENCES prompt_batches(id),
|
|
143
|
+
observation_type TEXT NOT NULL,
|
|
144
|
+
status TEXT DEFAULT 'active',
|
|
145
|
+
content TEXT NOT NULL,
|
|
146
|
+
context TEXT,
|
|
147
|
+
importance INTEGER DEFAULT 5,
|
|
148
|
+
file_path TEXT,
|
|
149
|
+
tags TEXT,
|
|
150
|
+
content_hash TEXT UNIQUE,
|
|
151
|
+
properties TEXT,
|
|
152
|
+
created_at INTEGER NOT NULL,
|
|
153
|
+
updated_at INTEGER,
|
|
154
|
+
embedded INTEGER DEFAULT 0
|
|
155
|
+
)`;
|
|
156
|
+
var ENTITIES_TABLE = `
|
|
157
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
158
|
+
id TEXT PRIMARY KEY,
|
|
159
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
160
|
+
type TEXT NOT NULL,
|
|
161
|
+
name TEXT NOT NULL,
|
|
162
|
+
properties TEXT,
|
|
163
|
+
first_seen INTEGER NOT NULL,
|
|
164
|
+
last_seen INTEGER NOT NULL,
|
|
165
|
+
status TEXT DEFAULT 'active',
|
|
166
|
+
UNIQUE (agent_id, type, name)
|
|
167
|
+
)`;
|
|
168
|
+
var GRAPH_EDGES_TABLE = `
|
|
169
|
+
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
170
|
+
id TEXT PRIMARY KEY,
|
|
171
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
172
|
+
source_id TEXT NOT NULL,
|
|
173
|
+
source_type TEXT NOT NULL,
|
|
174
|
+
target_id TEXT NOT NULL,
|
|
175
|
+
target_type TEXT NOT NULL,
|
|
176
|
+
type TEXT NOT NULL,
|
|
177
|
+
session_id TEXT,
|
|
178
|
+
confidence REAL DEFAULT 1.0,
|
|
179
|
+
properties TEXT,
|
|
180
|
+
created_at INTEGER NOT NULL
|
|
181
|
+
)`;
|
|
182
|
+
var ENTITY_MENTIONS_TABLE = `
|
|
183
|
+
CREATE TABLE IF NOT EXISTS entity_mentions (
|
|
184
|
+
entity_id TEXT NOT NULL REFERENCES entities(id),
|
|
185
|
+
note_id TEXT NOT NULL,
|
|
186
|
+
note_type TEXT NOT NULL,
|
|
187
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
188
|
+
UNIQUE (entity_id, note_id, note_type, agent_id)
|
|
189
|
+
)`;
|
|
190
|
+
var RESOLUTION_EVENTS_TABLE = `
|
|
191
|
+
CREATE TABLE IF NOT EXISTS resolution_events (
|
|
192
|
+
id TEXT PRIMARY KEY,
|
|
193
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
194
|
+
spore_id TEXT NOT NULL REFERENCES spores(id),
|
|
195
|
+
action TEXT NOT NULL,
|
|
196
|
+
new_spore_id TEXT,
|
|
197
|
+
reason TEXT,
|
|
198
|
+
session_id TEXT,
|
|
199
|
+
created_at INTEGER NOT NULL
|
|
200
|
+
)`;
|
|
201
|
+
var DIGEST_EXTRACTS_TABLE = `
|
|
202
|
+
CREATE TABLE IF NOT EXISTS digest_extracts (
|
|
203
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
204
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
205
|
+
tier INTEGER NOT NULL,
|
|
206
|
+
content TEXT NOT NULL,
|
|
207
|
+
substrate_hash TEXT,
|
|
208
|
+
generated_at INTEGER NOT NULL,
|
|
209
|
+
UNIQUE (agent_id, tier)
|
|
210
|
+
)`;
|
|
211
|
+
var AGENT_RUNS_TABLE = `
|
|
212
|
+
CREATE TABLE IF NOT EXISTS agent_runs (
|
|
213
|
+
id TEXT PRIMARY KEY,
|
|
214
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
215
|
+
task TEXT,
|
|
216
|
+
instruction TEXT,
|
|
217
|
+
status TEXT DEFAULT 'pending',
|
|
218
|
+
started_at INTEGER,
|
|
219
|
+
completed_at INTEGER,
|
|
220
|
+
tokens_used INTEGER,
|
|
221
|
+
cost_usd REAL,
|
|
222
|
+
actions_taken TEXT,
|
|
223
|
+
error TEXT
|
|
224
|
+
)`;
|
|
225
|
+
var AGENT_REPORTS_TABLE = `
|
|
226
|
+
CREATE TABLE IF NOT EXISTS agent_reports (
|
|
227
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
228
|
+
run_id TEXT NOT NULL REFERENCES agent_runs(id),
|
|
229
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
230
|
+
action TEXT NOT NULL,
|
|
231
|
+
summary TEXT NOT NULL,
|
|
232
|
+
details TEXT,
|
|
233
|
+
created_at INTEGER NOT NULL
|
|
234
|
+
)`;
|
|
235
|
+
var AGENT_TURNS_TABLE = `
|
|
236
|
+
CREATE TABLE IF NOT EXISTS agent_turns (
|
|
237
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
238
|
+
run_id TEXT NOT NULL REFERENCES agent_runs(id),
|
|
239
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
240
|
+
turn_number INTEGER NOT NULL,
|
|
241
|
+
tool_name TEXT NOT NULL,
|
|
242
|
+
tool_input TEXT,
|
|
243
|
+
tool_output_summary TEXT,
|
|
244
|
+
started_at INTEGER,
|
|
245
|
+
completed_at INTEGER
|
|
246
|
+
)`;
|
|
247
|
+
var AGENT_TASKS_TABLE = `
|
|
248
|
+
CREATE TABLE IF NOT EXISTS agent_tasks (
|
|
249
|
+
id TEXT PRIMARY KEY,
|
|
250
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
251
|
+
source TEXT NOT NULL DEFAULT 'built-in',
|
|
252
|
+
display_name TEXT,
|
|
253
|
+
description TEXT,
|
|
254
|
+
prompt TEXT NOT NULL,
|
|
255
|
+
is_default INTEGER DEFAULT 0,
|
|
256
|
+
tool_overrides TEXT,
|
|
257
|
+
model TEXT,
|
|
258
|
+
config TEXT,
|
|
259
|
+
created_at INTEGER NOT NULL,
|
|
260
|
+
updated_at INTEGER
|
|
261
|
+
)`;
|
|
262
|
+
var AGENT_STATE_TABLE = `
|
|
263
|
+
CREATE TABLE IF NOT EXISTS agent_state (
|
|
264
|
+
agent_id TEXT NOT NULL REFERENCES agents(id),
|
|
265
|
+
key TEXT NOT NULL,
|
|
266
|
+
value TEXT NOT NULL,
|
|
267
|
+
updated_at INTEGER NOT NULL,
|
|
268
|
+
PRIMARY KEY (agent_id, key)
|
|
269
|
+
)`;
|
|
270
|
+
var LOG_ENTRIES_TABLE = `
|
|
271
|
+
CREATE TABLE IF NOT EXISTS log_entries (
|
|
272
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
273
|
+
timestamp TEXT NOT NULL,
|
|
274
|
+
level TEXT NOT NULL,
|
|
275
|
+
component TEXT NOT NULL,
|
|
276
|
+
kind TEXT NOT NULL,
|
|
277
|
+
message TEXT NOT NULL,
|
|
278
|
+
data TEXT,
|
|
279
|
+
session_id TEXT
|
|
280
|
+
)`;
|
|
281
|
+
var FTS_TABLES = [
|
|
282
|
+
`CREATE VIRTUAL TABLE IF NOT EXISTS prompt_batches_fts
|
|
283
|
+
USING fts5(user_prompt, content='prompt_batches', content_rowid='id')`,
|
|
284
|
+
`CREATE VIRTUAL TABLE IF NOT EXISTS activities_fts
|
|
285
|
+
USING fts5(tool_name, tool_input, file_path, content='activities', content_rowid='id')`,
|
|
286
|
+
`CREATE VIRTUAL TABLE IF NOT EXISTS log_entries_fts
|
|
287
|
+
USING fts5(message, content='log_entries', content_rowid='id')`,
|
|
288
|
+
// FTS5 sync triggers for log_entries (external-content table)
|
|
289
|
+
`CREATE TRIGGER IF NOT EXISTS log_entries_ai AFTER INSERT ON log_entries BEGIN
|
|
290
|
+
INSERT INTO log_entries_fts(rowid, message) VALUES (new.id, new.message);
|
|
291
|
+
END`,
|
|
292
|
+
`CREATE TRIGGER IF NOT EXISTS log_entries_ad AFTER DELETE ON log_entries BEGIN
|
|
293
|
+
INSERT INTO log_entries_fts(log_entries_fts, rowid, message) VALUES('delete', old.id, old.message);
|
|
294
|
+
END`
|
|
295
|
+
];
|
|
296
|
+
var SECONDARY_INDEXES = [
|
|
297
|
+
// Sessions
|
|
298
|
+
"CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions (status)",
|
|
299
|
+
"CREATE INDEX IF NOT EXISTS idx_sessions_processed ON sessions (processed)",
|
|
300
|
+
"CREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions (started_at)",
|
|
301
|
+
"CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions (agent)",
|
|
302
|
+
// Prompt batches
|
|
303
|
+
"CREATE INDEX IF NOT EXISTS idx_prompt_batches_session_id ON prompt_batches (session_id)",
|
|
304
|
+
"CREATE INDEX IF NOT EXISTS idx_prompt_batches_processed ON prompt_batches (processed)",
|
|
305
|
+
"CREATE INDEX IF NOT EXISTS idx_prompt_batches_status ON prompt_batches (status)",
|
|
306
|
+
// Activities
|
|
307
|
+
"CREATE INDEX IF NOT EXISTS idx_activities_session_id ON activities (session_id)",
|
|
308
|
+
"CREATE INDEX IF NOT EXISTS idx_activities_prompt_batch_id ON activities (prompt_batch_id)",
|
|
309
|
+
"CREATE INDEX IF NOT EXISTS idx_activities_tool_name ON activities (tool_name)",
|
|
310
|
+
"CREATE INDEX IF NOT EXISTS idx_activities_timestamp ON activities (timestamp)",
|
|
311
|
+
"CREATE INDEX IF NOT EXISTS idx_activities_processed ON activities (processed)",
|
|
312
|
+
// Spores
|
|
313
|
+
"CREATE INDEX IF NOT EXISTS idx_spores_agent_id ON spores (agent_id)",
|
|
314
|
+
"CREATE INDEX IF NOT EXISTS idx_spores_session_id ON spores (session_id)",
|
|
315
|
+
"CREATE INDEX IF NOT EXISTS idx_spores_status ON spores (status)",
|
|
316
|
+
"CREATE INDEX IF NOT EXISTS idx_spores_observation_type ON spores (observation_type)",
|
|
317
|
+
"CREATE INDEX IF NOT EXISTS idx_spores_created_at ON spores (created_at)",
|
|
318
|
+
// Entities
|
|
319
|
+
"CREATE INDEX IF NOT EXISTS idx_entities_agent_id ON entities (agent_id)",
|
|
320
|
+
"CREATE INDEX IF NOT EXISTS idx_entities_type ON entities (type)",
|
|
321
|
+
// Graph edges
|
|
322
|
+
"CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id, source_type)",
|
|
323
|
+
"CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id, target_type)",
|
|
324
|
+
"CREATE INDEX IF NOT EXISTS idx_graph_edges_type ON graph_edges (type)",
|
|
325
|
+
"CREATE INDEX IF NOT EXISTS idx_graph_edges_agent ON graph_edges (agent_id)",
|
|
326
|
+
"CREATE INDEX IF NOT EXISTS idx_graph_edges_source_type ON graph_edges (source_id, type)",
|
|
327
|
+
// Entity mentions
|
|
328
|
+
"CREATE INDEX IF NOT EXISTS idx_entity_mentions_entity_id ON entity_mentions (entity_id)",
|
|
329
|
+
"CREATE INDEX IF NOT EXISTS idx_entity_mentions_agent_id ON entity_mentions (agent_id)",
|
|
330
|
+
// Resolution events
|
|
331
|
+
"CREATE INDEX IF NOT EXISTS idx_resolution_events_spore_id ON resolution_events (spore_id)",
|
|
332
|
+
"CREATE INDEX IF NOT EXISTS idx_resolution_events_agent_id ON resolution_events (agent_id)",
|
|
333
|
+
// Digest extracts
|
|
334
|
+
"CREATE INDEX IF NOT EXISTS idx_digest_extracts_agent_id ON digest_extracts (agent_id)",
|
|
335
|
+
// Agent runs
|
|
336
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_id ON agent_runs (agent_id)",
|
|
337
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs (status)",
|
|
338
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_status ON agent_runs (agent_id, status)",
|
|
339
|
+
// Agent reports
|
|
340
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_reports_run_id ON agent_reports (run_id)",
|
|
341
|
+
// Agent turns
|
|
342
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_turns_run_id ON agent_turns (run_id)",
|
|
343
|
+
// Agent tasks
|
|
344
|
+
"CREATE INDEX IF NOT EXISTS idx_agent_tasks_agent_id ON agent_tasks (agent_id)",
|
|
345
|
+
// Plans
|
|
346
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_session_id ON plans (session_id)",
|
|
347
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_source_path ON plans (source_path)",
|
|
348
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)",
|
|
349
|
+
// Attachments
|
|
350
|
+
"CREATE INDEX IF NOT EXISTS idx_attachments_file_path ON attachments (file_path)",
|
|
351
|
+
// Log entries
|
|
352
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_timestamp ON log_entries (timestamp)",
|
|
353
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_level ON log_entries (level)",
|
|
354
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_component ON log_entries (component)",
|
|
355
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_kind ON log_entries (kind)",
|
|
356
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)"
|
|
357
|
+
];
|
|
358
|
+
var TABLE_DDLS = [
|
|
359
|
+
SCHEMA_VERSION_TABLE,
|
|
360
|
+
// Capture layer (order matters for FK references)
|
|
361
|
+
SESSIONS_TABLE,
|
|
362
|
+
PROMPT_BATCHES_TABLE,
|
|
363
|
+
ACTIVITIES_TABLE,
|
|
364
|
+
PLANS_TABLE,
|
|
365
|
+
ARTIFACTS_TABLE,
|
|
366
|
+
TEAM_MEMBERS_TABLE,
|
|
367
|
+
ATTACHMENTS_TABLE,
|
|
368
|
+
// Intelligence layer
|
|
369
|
+
AGENTS_TABLE,
|
|
370
|
+
SPORES_TABLE,
|
|
371
|
+
ENTITIES_TABLE,
|
|
372
|
+
GRAPH_EDGES_TABLE,
|
|
373
|
+
ENTITY_MENTIONS_TABLE,
|
|
374
|
+
RESOLUTION_EVENTS_TABLE,
|
|
375
|
+
DIGEST_EXTRACTS_TABLE,
|
|
376
|
+
// Agent state layer
|
|
377
|
+
AGENT_RUNS_TABLE,
|
|
378
|
+
AGENT_REPORTS_TABLE,
|
|
379
|
+
AGENT_TURNS_TABLE,
|
|
380
|
+
AGENT_TASKS_TABLE,
|
|
381
|
+
AGENT_STATE_TABLE,
|
|
382
|
+
// Logging layer
|
|
383
|
+
LOG_ENTRIES_TABLE
|
|
384
|
+
];
|
|
385
|
+
function migrateV1ToV2(db) {
|
|
386
|
+
db.exec("BEGIN");
|
|
387
|
+
try {
|
|
388
|
+
const alterStatements = [
|
|
389
|
+
"ALTER TABLE plans ADD COLUMN session_id TEXT REFERENCES sessions(id)",
|
|
390
|
+
"ALTER TABLE plans ADD COLUMN prompt_batch_id INTEGER REFERENCES prompt_batches(id)",
|
|
391
|
+
"ALTER TABLE plans ADD COLUMN content_hash TEXT",
|
|
392
|
+
"ALTER TABLE attachments ADD COLUMN data BLOB",
|
|
393
|
+
"ALTER TABLE attachments ADD COLUMN content_hash TEXT"
|
|
394
|
+
];
|
|
395
|
+
for (const stmt of alterStatements) {
|
|
396
|
+
try {
|
|
397
|
+
db.exec(stmt);
|
|
398
|
+
} catch {
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
const newIndexes = [
|
|
402
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_session_id ON plans (session_id)",
|
|
403
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_source_path ON plans (source_path)",
|
|
404
|
+
"CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)",
|
|
405
|
+
"CREATE INDEX IF NOT EXISTS idx_attachments_file_path ON attachments (file_path)"
|
|
406
|
+
];
|
|
407
|
+
for (const idx of newIndexes) {
|
|
408
|
+
db.exec(idx);
|
|
409
|
+
}
|
|
410
|
+
db.prepare(
|
|
411
|
+
`INSERT INTO schema_version (version, applied_at)
|
|
412
|
+
VALUES (?, ?)
|
|
413
|
+
ON CONFLICT (version) DO NOTHING`
|
|
414
|
+
).run(2, epochSeconds());
|
|
415
|
+
db.exec("COMMIT");
|
|
416
|
+
} catch (err) {
|
|
417
|
+
db.exec("ROLLBACK");
|
|
418
|
+
throw err;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function migrateV2ToV3(db) {
|
|
422
|
+
db.exec("BEGIN");
|
|
423
|
+
try {
|
|
424
|
+
db.exec(LOG_ENTRIES_TABLE);
|
|
425
|
+
db.exec(
|
|
426
|
+
`CREATE VIRTUAL TABLE IF NOT EXISTS log_entries_fts
|
|
427
|
+
USING fts5(message, content='log_entries', content_rowid='id')`
|
|
428
|
+
);
|
|
429
|
+
db.exec(
|
|
430
|
+
`CREATE TRIGGER IF NOT EXISTS log_entries_ai AFTER INSERT ON log_entries BEGIN
|
|
431
|
+
INSERT INTO log_entries_fts(rowid, message) VALUES (new.id, new.message);
|
|
432
|
+
END`
|
|
433
|
+
);
|
|
434
|
+
db.exec(
|
|
435
|
+
`CREATE TRIGGER IF NOT EXISTS log_entries_ad AFTER DELETE ON log_entries BEGIN
|
|
436
|
+
INSERT INTO log_entries_fts(log_entries_fts, rowid, message) VALUES('delete', old.id, old.message);
|
|
437
|
+
END`
|
|
438
|
+
);
|
|
439
|
+
const newIndexes = [
|
|
440
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_timestamp ON log_entries (timestamp)",
|
|
441
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_level ON log_entries (level)",
|
|
442
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_component ON log_entries (component)",
|
|
443
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_kind ON log_entries (kind)",
|
|
444
|
+
"CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)"
|
|
445
|
+
];
|
|
446
|
+
for (const idx of newIndexes) {
|
|
447
|
+
db.exec(idx);
|
|
448
|
+
}
|
|
449
|
+
db.prepare(
|
|
450
|
+
`INSERT INTO schema_version (version, applied_at)
|
|
451
|
+
VALUES (?, ?)
|
|
452
|
+
ON CONFLICT (version) DO NOTHING`
|
|
453
|
+
).run(3, epochSeconds());
|
|
454
|
+
db.exec("COMMIT");
|
|
455
|
+
} catch (err) {
|
|
456
|
+
db.exec("ROLLBACK");
|
|
457
|
+
throw err;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
function createSchema(db) {
|
|
461
|
+
try {
|
|
462
|
+
const row = db.prepare(
|
|
463
|
+
"SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
|
|
464
|
+
).get();
|
|
465
|
+
if (row?.version === SCHEMA_VERSION) return;
|
|
466
|
+
if (row?.version === 1) {
|
|
467
|
+
migrateV1ToV2(db);
|
|
468
|
+
}
|
|
469
|
+
const afterV1Migration = db.prepare(
|
|
470
|
+
"SELECT version FROM schema_version ORDER BY version DESC LIMIT 1"
|
|
471
|
+
).get()?.version ?? 0;
|
|
472
|
+
if (afterV1Migration < 3) {
|
|
473
|
+
migrateV2ToV3(db);
|
|
474
|
+
}
|
|
475
|
+
return;
|
|
476
|
+
} catch {
|
|
477
|
+
}
|
|
478
|
+
for (const ddl of TABLE_DDLS) {
|
|
479
|
+
db.exec(ddl);
|
|
480
|
+
}
|
|
481
|
+
for (const ddl of FTS_TABLES) {
|
|
482
|
+
db.exec(ddl);
|
|
483
|
+
}
|
|
484
|
+
for (const idx of SECONDARY_INDEXES) {
|
|
485
|
+
db.exec(idx);
|
|
486
|
+
}
|
|
487
|
+
db.prepare(
|
|
488
|
+
`INSERT INTO schema_version (version, applied_at)
|
|
489
|
+
VALUES (?, ?)
|
|
490
|
+
ON CONFLICT (version) DO NOTHING`
|
|
491
|
+
).run(SCHEMA_VERSION, epochSeconds());
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
export {
|
|
495
|
+
EMBEDDING_DIMENSIONS,
|
|
496
|
+
createSchema
|
|
497
|
+
};
|
|
498
|
+
//# sourceMappingURL=chunk-KV4OC4H3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/schema.ts"],"sourcesContent":["/**\n * SQLite database schema -- all capture, intelligence, and agent state tables.\n *\n * Uses `CREATE TABLE IF NOT EXISTS` and `CREATE INDEX IF NOT EXISTS` throughout\n * for idempotency. Running `createSchema()` multiple times is always safe.\n *\n * Timestamp convention: all timestamps are INTEGER (Unix epoch seconds).\n * Content hashing: all `content_hash` columns are TEXT with UNIQUE constraint.\n * Embedding dimensions: 1024 (bge-m3 default) -- used by external sqlite-vec store.\n *\n * Vector columns live in a separate sqlite-vec virtual table, not inline.\n * Tables that participate in vector search carry an `embedded INTEGER DEFAULT 0`\n * flag so the embedder knows which rows still need vectors.\n */\n\nimport type { Database } from 'better-sqlite3';\nimport { epochSeconds } from '@myco/constants.js';\n\n/** Current schema version -- fresh start for the SQLite era. */\nexport const SCHEMA_VERSION = 3;\n\n/** Embedding vector dimensions (bge-m3 default). */\nexport const EMBEDDING_DIMENSIONS = 1024;\n\n// ---------------------------------------------------------------------------\n// DDL statements\n// ---------------------------------------------------------------------------\n\nconst SCHEMA_VERSION_TABLE = `\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )`;\n\n// -- Capture Layer ----------------------------------------------------------\n\nconst SESSIONS_TABLE = `\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n agent TEXT NOT NULL,\n \"user\" TEXT,\n project_root TEXT,\n branch TEXT,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n status TEXT DEFAULT 'active',\n prompt_count INTEGER DEFAULT 0,\n tool_count INTEGER DEFAULT 0,\n title TEXT,\n summary TEXT,\n transcript_path TEXT,\n parent_session_id TEXT,\n parent_session_reason TEXT,\n processed INTEGER DEFAULT 0,\n content_hash TEXT UNIQUE,\n created_at INTEGER NOT NULL,\n embedded INTEGER DEFAULT 0\n )`;\n\nconst PROMPT_BATCHES_TABLE = `\n CREATE TABLE IF NOT EXISTS prompt_batches (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n prompt_number INTEGER,\n user_prompt TEXT,\n response_summary TEXT,\n classification TEXT,\n started_at INTEGER,\n ended_at INTEGER,\n status TEXT DEFAULT 'active',\n activity_count INTEGER DEFAULT 0,\n processed INTEGER DEFAULT 0,\n content_hash TEXT UNIQUE,\n created_at INTEGER NOT NULL\n )`;\n\nconst ACTIVITIES_TABLE = `\n CREATE TABLE IF NOT EXISTS activities (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n prompt_batch_id INTEGER REFERENCES prompt_batches(id),\n tool_name TEXT NOT NULL,\n tool_input TEXT,\n tool_output_summary TEXT,\n file_path TEXT,\n files_affected TEXT,\n duration_ms INTEGER,\n success INTEGER DEFAULT 1,\n error_message TEXT,\n timestamp INTEGER NOT NULL,\n processed INTEGER DEFAULT 0,\n content_hash TEXT UNIQUE,\n created_at INTEGER NOT NULL\n )`;\n\nconst PLANS_TABLE = `\n CREATE TABLE IF NOT EXISTS plans (\n id TEXT PRIMARY KEY,\n status TEXT DEFAULT 'active',\n author TEXT,\n title TEXT,\n content TEXT,\n source_path TEXT,\n tags TEXT,\n session_id TEXT REFERENCES sessions(id),\n prompt_batch_id INTEGER REFERENCES prompt_batches(id),\n content_hash TEXT,\n processed INTEGER DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER,\n embedded INTEGER DEFAULT 0\n )`;\n\nconst ARTIFACTS_TABLE = `\n CREATE TABLE IF NOT EXISTS artifacts (\n id TEXT PRIMARY KEY,\n artifact_type TEXT,\n source_path TEXT NOT NULL,\n title TEXT NOT NULL,\n content TEXT,\n last_captured_by TEXT,\n tags TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER,\n embedded INTEGER DEFAULT 0\n )`;\n\nconst TEAM_MEMBERS_TABLE = `\n CREATE TABLE IF NOT EXISTS team_members (\n id TEXT PRIMARY KEY,\n \"user\" TEXT NOT NULL,\n role TEXT,\n joined TEXT,\n tags TEXT\n )`;\n\nconst ATTACHMENTS_TABLE = `\n CREATE TABLE IF NOT EXISTS attachments (\n id TEXT PRIMARY KEY,\n session_id TEXT REFERENCES sessions(id),\n prompt_batch_id INTEGER REFERENCES prompt_batches(id),\n file_path TEXT NOT NULL,\n media_type TEXT,\n description TEXT,\n data BLOB,\n content_hash TEXT,\n created_at INTEGER NOT NULL\n )`;\n\n// -- Intelligence Layer -----------------------------------------------------\n\nconst AGENTS_TABLE = `\n CREATE TABLE IF NOT EXISTS agents (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n provider TEXT,\n model TEXT,\n system_prompt_hash TEXT,\n config TEXT,\n source TEXT NOT NULL DEFAULT 'built-in',\n system_prompt TEXT,\n max_turns INTEGER,\n timeout_seconds INTEGER,\n tool_access TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL,\n updated_at INTEGER\n )`;\n\nconst SPORES_TABLE = `\n CREATE TABLE IF NOT EXISTS spores (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n session_id TEXT REFERENCES sessions(id),\n prompt_batch_id INTEGER REFERENCES prompt_batches(id),\n observation_type TEXT NOT NULL,\n status TEXT DEFAULT 'active',\n content TEXT NOT NULL,\n context TEXT,\n importance INTEGER DEFAULT 5,\n file_path TEXT,\n tags TEXT,\n content_hash TEXT UNIQUE,\n properties TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER,\n embedded INTEGER DEFAULT 0\n )`;\n\nconst ENTITIES_TABLE = `\n CREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n type TEXT NOT NULL,\n name TEXT NOT NULL,\n properties TEXT,\n first_seen INTEGER NOT NULL,\n last_seen INTEGER NOT NULL,\n status TEXT DEFAULT 'active',\n UNIQUE (agent_id, type, name)\n )`;\n\nconst GRAPH_EDGES_TABLE = `\n CREATE TABLE IF NOT EXISTS graph_edges (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n source_id TEXT NOT NULL,\n source_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n target_type TEXT NOT NULL,\n type TEXT NOT NULL,\n session_id TEXT,\n confidence REAL DEFAULT 1.0,\n properties TEXT,\n created_at INTEGER NOT NULL\n )`;\n\nconst ENTITY_MENTIONS_TABLE = `\n CREATE TABLE IF NOT EXISTS entity_mentions (\n entity_id TEXT NOT NULL REFERENCES entities(id),\n note_id TEXT NOT NULL,\n note_type TEXT NOT NULL,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n UNIQUE (entity_id, note_id, note_type, agent_id)\n )`;\n\nconst RESOLUTION_EVENTS_TABLE = `\n CREATE TABLE IF NOT EXISTS resolution_events (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n spore_id TEXT NOT NULL REFERENCES spores(id),\n action TEXT NOT NULL,\n new_spore_id TEXT,\n reason TEXT,\n session_id TEXT,\n created_at INTEGER NOT NULL\n )`;\n\nconst DIGEST_EXTRACTS_TABLE = `\n CREATE TABLE IF NOT EXISTS digest_extracts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n tier INTEGER NOT NULL,\n content TEXT NOT NULL,\n substrate_hash TEXT,\n generated_at INTEGER NOT NULL,\n UNIQUE (agent_id, tier)\n )`;\n\n// -- Agent State Layer ------------------------------------------------------\n\nconst AGENT_RUNS_TABLE = `\n CREATE TABLE IF NOT EXISTS agent_runs (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n task TEXT,\n instruction TEXT,\n status TEXT DEFAULT 'pending',\n started_at INTEGER,\n completed_at INTEGER,\n tokens_used INTEGER,\n cost_usd REAL,\n actions_taken TEXT,\n error TEXT\n )`;\n\nconst AGENT_REPORTS_TABLE = `\n CREATE TABLE IF NOT EXISTS agent_reports (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL REFERENCES agent_runs(id),\n agent_id TEXT NOT NULL REFERENCES agents(id),\n action TEXT NOT NULL,\n summary TEXT NOT NULL,\n details TEXT,\n created_at INTEGER NOT NULL\n )`;\n\nconst AGENT_TURNS_TABLE = `\n CREATE TABLE IF NOT EXISTS agent_turns (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL REFERENCES agent_runs(id),\n agent_id TEXT NOT NULL REFERENCES agents(id),\n turn_number INTEGER NOT NULL,\n tool_name TEXT NOT NULL,\n tool_input TEXT,\n tool_output_summary TEXT,\n started_at INTEGER,\n completed_at INTEGER\n )`;\n\nconst AGENT_TASKS_TABLE = `\n CREATE TABLE IF NOT EXISTS agent_tasks (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL REFERENCES agents(id),\n source TEXT NOT NULL DEFAULT 'built-in',\n display_name TEXT,\n description TEXT,\n prompt TEXT NOT NULL,\n is_default INTEGER DEFAULT 0,\n tool_overrides TEXT,\n model TEXT,\n config TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER\n )`;\n\nconst AGENT_STATE_TABLE = `\n CREATE TABLE IF NOT EXISTS agent_state (\n agent_id TEXT NOT NULL REFERENCES agents(id),\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (agent_id, key)\n )`;\n\n// -- Logging Layer ----------------------------------------------------------\n\nconst LOG_ENTRIES_TABLE = `\n CREATE TABLE IF NOT EXISTS log_entries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n component TEXT NOT NULL,\n kind TEXT NOT NULL,\n message TEXT NOT NULL,\n data TEXT,\n session_id TEXT\n )`;\n\n// -- FTS5 Virtual Tables ----------------------------------------------------\n\nconst FTS_TABLES = [\n `CREATE VIRTUAL TABLE IF NOT EXISTS prompt_batches_fts\n USING fts5(user_prompt, content='prompt_batches', content_rowid='id')`,\n\n `CREATE VIRTUAL TABLE IF NOT EXISTS activities_fts\n USING fts5(tool_name, tool_input, file_path, content='activities', content_rowid='id')`,\n\n `CREATE VIRTUAL TABLE IF NOT EXISTS log_entries_fts\n USING fts5(message, content='log_entries', content_rowid='id')`,\n\n // FTS5 sync triggers for log_entries (external-content table)\n `CREATE TRIGGER IF NOT EXISTS log_entries_ai AFTER INSERT ON log_entries BEGIN\n INSERT INTO log_entries_fts(rowid, message) VALUES (new.id, new.message);\n END`,\n\n `CREATE TRIGGER IF NOT EXISTS log_entries_ad AFTER DELETE ON log_entries BEGIN\n INSERT INTO log_entries_fts(log_entries_fts, rowid, message) VALUES('delete', old.id, old.message);\n END`,\n];\n\n// -- Indexes ----------------------------------------------------------------\n\nconst SECONDARY_INDEXES = [\n // Sessions\n 'CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions (status)',\n 'CREATE INDEX IF NOT EXISTS idx_sessions_processed ON sessions (processed)',\n 'CREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions (started_at)',\n 'CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions (agent)',\n\n // Prompt batches\n 'CREATE INDEX IF NOT EXISTS idx_prompt_batches_session_id ON prompt_batches (session_id)',\n 'CREATE INDEX IF NOT EXISTS idx_prompt_batches_processed ON prompt_batches (processed)',\n 'CREATE INDEX IF NOT EXISTS idx_prompt_batches_status ON prompt_batches (status)',\n\n // Activities\n 'CREATE INDEX IF NOT EXISTS idx_activities_session_id ON activities (session_id)',\n 'CREATE INDEX IF NOT EXISTS idx_activities_prompt_batch_id ON activities (prompt_batch_id)',\n 'CREATE INDEX IF NOT EXISTS idx_activities_tool_name ON activities (tool_name)',\n 'CREATE INDEX IF NOT EXISTS idx_activities_timestamp ON activities (timestamp)',\n 'CREATE INDEX IF NOT EXISTS idx_activities_processed ON activities (processed)',\n\n // Spores\n 'CREATE INDEX IF NOT EXISTS idx_spores_agent_id ON spores (agent_id)',\n 'CREATE INDEX IF NOT EXISTS idx_spores_session_id ON spores (session_id)',\n 'CREATE INDEX IF NOT EXISTS idx_spores_status ON spores (status)',\n 'CREATE INDEX IF NOT EXISTS idx_spores_observation_type ON spores (observation_type)',\n 'CREATE INDEX IF NOT EXISTS idx_spores_created_at ON spores (created_at)',\n\n // Entities\n 'CREATE INDEX IF NOT EXISTS idx_entities_agent_id ON entities (agent_id)',\n 'CREATE INDEX IF NOT EXISTS idx_entities_type ON entities (type)',\n\n // Graph edges\n 'CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges (source_id, source_type)',\n 'CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges (target_id, target_type)',\n 'CREATE INDEX IF NOT EXISTS idx_graph_edges_type ON graph_edges (type)',\n 'CREATE INDEX IF NOT EXISTS idx_graph_edges_agent ON graph_edges (agent_id)',\n 'CREATE INDEX IF NOT EXISTS idx_graph_edges_source_type ON graph_edges (source_id, type)',\n\n // Entity mentions\n 'CREATE INDEX IF NOT EXISTS idx_entity_mentions_entity_id ON entity_mentions (entity_id)',\n 'CREATE INDEX IF NOT EXISTS idx_entity_mentions_agent_id ON entity_mentions (agent_id)',\n\n // Resolution events\n 'CREATE INDEX IF NOT EXISTS idx_resolution_events_spore_id ON resolution_events (spore_id)',\n 'CREATE INDEX IF NOT EXISTS idx_resolution_events_agent_id ON resolution_events (agent_id)',\n\n // Digest extracts\n 'CREATE INDEX IF NOT EXISTS idx_digest_extracts_agent_id ON digest_extracts (agent_id)',\n\n // Agent runs\n 'CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_id ON agent_runs (agent_id)',\n 'CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs (status)',\n 'CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_status ON agent_runs (agent_id, status)',\n\n // Agent reports\n 'CREATE INDEX IF NOT EXISTS idx_agent_reports_run_id ON agent_reports (run_id)',\n\n // Agent turns\n 'CREATE INDEX IF NOT EXISTS idx_agent_turns_run_id ON agent_turns (run_id)',\n\n // Agent tasks\n 'CREATE INDEX IF NOT EXISTS idx_agent_tasks_agent_id ON agent_tasks (agent_id)',\n\n // Plans\n 'CREATE INDEX IF NOT EXISTS idx_plans_session_id ON plans (session_id)',\n 'CREATE INDEX IF NOT EXISTS idx_plans_source_path ON plans (source_path)',\n 'CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)',\n // Attachments\n 'CREATE INDEX IF NOT EXISTS idx_attachments_file_path ON attachments (file_path)',\n\n // Log entries\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_timestamp ON log_entries (timestamp)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_level ON log_entries (level)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_component ON log_entries (component)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_kind ON log_entries (kind)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)',\n];\n\n// -- Ordered table creation -------------------------------------------------\n\nconst TABLE_DDLS = [\n SCHEMA_VERSION_TABLE,\n // Capture layer (order matters for FK references)\n SESSIONS_TABLE,\n PROMPT_BATCHES_TABLE,\n ACTIVITIES_TABLE,\n PLANS_TABLE,\n ARTIFACTS_TABLE,\n TEAM_MEMBERS_TABLE,\n ATTACHMENTS_TABLE,\n // Intelligence layer\n AGENTS_TABLE,\n SPORES_TABLE,\n ENTITIES_TABLE,\n GRAPH_EDGES_TABLE,\n ENTITY_MENTIONS_TABLE,\n RESOLUTION_EVENTS_TABLE,\n DIGEST_EXTRACTS_TABLE,\n // Agent state layer\n AGENT_RUNS_TABLE,\n AGENT_REPORTS_TABLE,\n AGENT_TURNS_TABLE,\n AGENT_TASKS_TABLE,\n AGENT_STATE_TABLE,\n // Logging layer\n LOG_ENTRIES_TABLE,\n];\n\n// ---------------------------------------------------------------------------\n// Migrations\n// ---------------------------------------------------------------------------\n\n/**\n * Migrate a version-1 database to version-2.\n *\n * Version 2 adds:\n * - plans.session_id, plans.prompt_batch_id, plans.content_hash\n * - attachments.data, attachments.content_hash\n * - indexes: idx_plans_session_id, idx_plans_source_path, idx_plans_content_hash\n *\n * Each ALTER TABLE is wrapped in try/catch so re-running is safe -- SQLite\n * throws \"duplicate column name\" if the column already exists, which we ignore.\n */\nfunction migrateV1ToV2(db: Database): void {\n db.exec('BEGIN');\n try {\n const alterStatements = [\n 'ALTER TABLE plans ADD COLUMN session_id TEXT REFERENCES sessions(id)',\n 'ALTER TABLE plans ADD COLUMN prompt_batch_id INTEGER REFERENCES prompt_batches(id)',\n 'ALTER TABLE plans ADD COLUMN content_hash TEXT',\n 'ALTER TABLE attachments ADD COLUMN data BLOB',\n 'ALTER TABLE attachments ADD COLUMN content_hash TEXT',\n ];\n\n for (const stmt of alterStatements) {\n try {\n db.exec(stmt);\n } catch {\n // Column already exists -- safe to ignore on re-run\n }\n }\n\n // Indexes use IF NOT EXISTS so they are idempotent\n const newIndexes = [\n 'CREATE INDEX IF NOT EXISTS idx_plans_session_id ON plans (session_id)',\n 'CREATE INDEX IF NOT EXISTS idx_plans_source_path ON plans (source_path)',\n 'CREATE INDEX IF NOT EXISTS idx_plans_content_hash ON plans (content_hash)',\n 'CREATE INDEX IF NOT EXISTS idx_attachments_file_path ON attachments (file_path)',\n ];\n\n for (const idx of newIndexes) {\n db.exec(idx);\n }\n\n db.prepare(\n `INSERT INTO schema_version (version, applied_at)\n VALUES (?, ?)\n ON CONFLICT (version) DO NOTHING`\n ).run(2, epochSeconds());\n\n db.exec('COMMIT');\n } catch (err) {\n db.exec('ROLLBACK');\n throw err;\n }\n}\n\n/**\n * Migrate a version-2 database to version-3.\n *\n * Version 3 adds:\n * - log_entries table\n * - log_entries_fts virtual table (FTS5)\n * - indexes: idx_log_entries_timestamp, _level, _component, _kind, _session_id\n *\n * Uses `CREATE ... IF NOT EXISTS` throughout for idempotency.\n */\nfunction migrateV2ToV3(db: Database): void {\n db.exec('BEGIN');\n try {\n db.exec(LOG_ENTRIES_TABLE);\n\n db.exec(\n `CREATE VIRTUAL TABLE IF NOT EXISTS log_entries_fts\n USING fts5(message, content='log_entries', content_rowid='id')`\n );\n\n // FTS5 sync triggers for log_entries\n db.exec(\n `CREATE TRIGGER IF NOT EXISTS log_entries_ai AFTER INSERT ON log_entries BEGIN\n INSERT INTO log_entries_fts(rowid, message) VALUES (new.id, new.message);\n END`\n );\n db.exec(\n `CREATE TRIGGER IF NOT EXISTS log_entries_ad AFTER DELETE ON log_entries BEGIN\n INSERT INTO log_entries_fts(log_entries_fts, rowid, message) VALUES('delete', old.id, old.message);\n END`\n );\n\n const newIndexes = [\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_timestamp ON log_entries (timestamp)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_level ON log_entries (level)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_component ON log_entries (component)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_kind ON log_entries (kind)',\n 'CREATE INDEX IF NOT EXISTS idx_log_entries_session_id ON log_entries (session_id)',\n ];\n\n for (const idx of newIndexes) {\n db.exec(idx);\n }\n\n db.prepare(\n `INSERT INTO schema_version (version, applied_at)\n VALUES (?, ?)\n ON CONFLICT (version) DO NOTHING`\n ).run(3, epochSeconds());\n\n db.exec('COMMIT');\n } catch (err) {\n db.exec('ROLLBACK');\n throw err;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create all database tables, indexes, and record the schema version.\n *\n * Fully idempotent -- safe to call on every startup. Uses `IF NOT EXISTS`\n * for all DDL and `ON CONFLICT DO NOTHING` for the version row.\n */\nexport function createSchema(db: Database): void {\n // Fast-path: skip if already at current version\n try {\n const row = db.prepare(\n 'SELECT version FROM schema_version ORDER BY version DESC LIMIT 1'\n ).get() as { version: number } | undefined;\n if (row?.version === SCHEMA_VERSION) return;\n // Migration path: version 1 → 2 (then fall through to check for 2 → 3)\n if (row?.version === 1) {\n migrateV1ToV2(db);\n }\n // Migration path: version 2 → 3\n const afterV1Migration = (db.prepare(\n 'SELECT version FROM schema_version ORDER BY version DESC LIMIT 1'\n ).get() as { version: number } | undefined)?.version ?? 0;\n if (afterV1Migration < 3) {\n migrateV2ToV3(db);\n }\n return;\n } catch {\n // Table doesn't exist yet -- first run\n }\n\n for (const ddl of TABLE_DDLS) {\n db.exec(ddl);\n }\n\n for (const ddl of FTS_TABLES) {\n db.exec(ddl);\n }\n\n for (const idx of SECONDARY_INDEXES) {\n db.exec(idx);\n }\n\n db.prepare(\n `INSERT INTO schema_version (version, applied_at)\n VALUES (?, ?)\n ON CONFLICT (version) DO NOTHING`\n ).run(SCHEMA_VERSION, epochSeconds());\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
EMBEDDING_REQUEST_TIMEOUT_MS,
|
|
4
|
+
PROVIDER_DETECT_TIMEOUT_MS
|
|
5
|
+
} from "./chunk-5VZ52A4T.js";
|
|
6
|
+
|
|
7
|
+
// src/cli/providers/cloud-embedding-base.ts
|
|
8
|
+
var ERROR_BODY_PREVIEW_CHARS = 500;
|
|
9
|
+
var CloudEmbeddingBase = class {
|
|
10
|
+
name;
|
|
11
|
+
apiKey;
|
|
12
|
+
model;
|
|
13
|
+
config;
|
|
14
|
+
constructor(config, opts) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.name = config.providerName;
|
|
17
|
+
this.apiKey = opts?.api_key ?? process.env[config.apiKeyEnvVar] ?? "";
|
|
18
|
+
this.model = opts?.model ?? config.defaultModel;
|
|
19
|
+
}
|
|
20
|
+
async embed(text) {
|
|
21
|
+
const response = await fetch(`${this.config.apiBase}${this.config.embeddingsEndpoint}`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
"Authorization": `Bearer ${this.apiKey}`
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({ model: this.model, input: text }),
|
|
28
|
+
signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS)
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
const body = await response.text().catch(() => "");
|
|
32
|
+
throw new Error(`${this.name} embed failed: ${response.status} ${body.slice(0, ERROR_BODY_PREVIEW_CHARS)}`);
|
|
33
|
+
}
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
const embedding = data.data[0].embedding;
|
|
36
|
+
return { embedding, model: data.model, dimensions: embedding.length };
|
|
37
|
+
}
|
|
38
|
+
async isAvailable() {
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(`${this.config.apiBase}${this.config.modelsEndpoint}`, {
|
|
41
|
+
headers: { "Authorization": `Bearer ${this.apiKey}` },
|
|
42
|
+
signal: AbortSignal.timeout(PROVIDER_DETECT_TIMEOUT_MS)
|
|
43
|
+
});
|
|
44
|
+
return response.ok;
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async listModels(timeoutMs) {
|
|
50
|
+
try {
|
|
51
|
+
const response = await fetch(`${this.config.apiBase}${this.config.modelsEndpoint}`, {
|
|
52
|
+
headers: { "Authorization": `Bearer ${this.apiKey}` },
|
|
53
|
+
signal: AbortSignal.timeout(timeoutMs ?? PROVIDER_DETECT_TIMEOUT_MS)
|
|
54
|
+
});
|
|
55
|
+
const data = await response.json();
|
|
56
|
+
return data.data.filter((m) => this.config.modelFilter(m.id)).map((m) => m.id);
|
|
57
|
+
} catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export {
|
|
64
|
+
CloudEmbeddingBase
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=chunk-KYLDNM7H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/providers/cloud-embedding-base.ts"],"sourcesContent":["import type { EmbeddingProvider, EmbeddingResponse } from '../../intelligence/llm.js';\nimport { EMBEDDING_REQUEST_TIMEOUT_MS, PROVIDER_DETECT_TIMEOUT_MS } from '../../constants.js';\n\n/** Max characters of error response body to include in error messages. */\nconst ERROR_BODY_PREVIEW_CHARS = 500;\n\ninterface CloudEmbeddingConfig {\n apiBase: string;\n modelsEndpoint: string;\n embeddingsEndpoint: string;\n apiKeyEnvVar: string;\n defaultModel: string;\n providerName: string;\n /** Filter predicate for model listing — only models matching this are returned. */\n modelFilter: (modelId: string) => boolean;\n}\n\nexport abstract class CloudEmbeddingBase implements EmbeddingProvider {\n readonly name: string;\n protected apiKey: string;\n protected model: string;\n private config: CloudEmbeddingConfig;\n\n constructor(\n config: CloudEmbeddingConfig,\n opts?: { api_key?: string; model?: string },\n ) {\n this.config = config;\n this.name = config.providerName;\n this.apiKey = opts?.api_key ?? process.env[config.apiKeyEnvVar] ?? '';\n this.model = opts?.model ?? config.defaultModel;\n }\n\n async embed(text: string): Promise<EmbeddingResponse> {\n const response = await fetch(`${this.config.apiBase}${this.config.embeddingsEndpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ model: this.model, input: text }),\n signal: AbortSignal.timeout(EMBEDDING_REQUEST_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n throw new Error(`${this.name} embed failed: ${response.status} ${body.slice(0, ERROR_BODY_PREVIEW_CHARS)}`);\n }\n\n const data = await response.json() as { data: Array<{ embedding: number[] }>; model: string };\n const embedding = data.data[0].embedding;\n return { embedding, model: data.model, dimensions: embedding.length };\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n const response = await fetch(`${this.config.apiBase}${this.config.modelsEndpoint}`, {\n headers: { 'Authorization': `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(PROVIDER_DETECT_TIMEOUT_MS),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(timeoutMs?: number): Promise<string[]> {\n try {\n const response = await fetch(`${this.config.apiBase}${this.config.modelsEndpoint}`, {\n headers: { 'Authorization': `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(timeoutMs ?? PROVIDER_DETECT_TIMEOUT_MS),\n });\n const data = await response.json() as { data: Array<{ id: string }> };\n return data.data\n .filter((m) => this.config.modelFilter(m.id))\n .map((m) => m.id);\n } catch {\n return [];\n }\n }\n}\n"],"mappings":";;;;;;;AAIA,IAAM,2BAA2B;AAa1B,IAAe,qBAAf,MAA+D;AAAA,EAC3D;AAAA,EACC;AAAA,EACA;AAAA,EACF;AAAA,EAER,YACE,QACA,MACA;AACA,SAAK,SAAS;AACd,SAAK,OAAO,OAAO;AACnB,SAAK,SAAS,MAAM,WAAW,QAAQ,IAAI,OAAO,YAAY,KAAK;AACnE,SAAK,QAAQ,MAAM,SAAS,OAAO;AAAA,EACrC;AAAA,EAEA,MAAM,MAAM,MAA0C;AACpD,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,kBAAkB,IAAI;AAAA,MACtF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,MACvD,QAAQ,YAAY,QAAQ,4BAA4B;AAAA,IAC1D,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAM,IAAI,MAAM,GAAG,KAAK,IAAI,kBAAkB,SAAS,MAAM,IAAI,KAAK,MAAM,GAAG,wBAAwB,CAAC,EAAE;AAAA,IAC5G;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,YAAY,KAAK,KAAK,CAAC,EAAE;AAC/B,WAAO,EAAE,WAAW,OAAO,KAAK,OAAO,YAAY,UAAU,OAAO;AAAA,EACtE;AAAA,EAEA,MAAM,cAAgC;AACpC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,cAAc,IAAI;AAAA,QAClF,SAAS,EAAE,iBAAiB,UAAU,KAAK,MAAM,GAAG;AAAA,QACpD,QAAQ,YAAY,QAAQ,0BAA0B;AAAA,MACxD,CAAC;AACD,aAAO,SAAS;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,WAAuC;AACtD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,cAAc,IAAI;AAAA,QAClF,SAAS,EAAE,iBAAiB,UAAU,KAAK,MAAM,GAAG;AAAA,QACpD,QAAQ,YAAY,QAAQ,aAAa,0BAA0B;AAAA,MACrE,CAAC;AACD,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,aAAO,KAAK,KACT,OAAO,CAAC,MAAM,KAAK,OAAO,YAAY,EAAE,EAAE,CAAC,EAC3C,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpB,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/utils/find-package-root.ts
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
var ANCESTOR_WALK_LIMIT = 5;
|
|
7
|
+
function findPackageRoot(startDir) {
|
|
8
|
+
let dir = startDir;
|
|
9
|
+
for (let i = 0; i < ANCESTOR_WALK_LIMIT; i++) {
|
|
10
|
+
if (fs.existsSync(path.join(dir, "package.json"))) return dir;
|
|
11
|
+
dir = path.dirname(dir);
|
|
12
|
+
}
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
findPackageRoot
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=chunk-LPUQPDC2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/find-package-root.ts"],"sourcesContent":["/**\n * Walk up from a starting directory to find the nearest ancestor\n * containing package.json. Used by multiple modules that need to\n * locate the package root after tsup code-splitting moves chunks\n * to unpredictable locations within dist/.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst ANCESTOR_WALK_LIMIT = 5;\n\n/**\n * Find the nearest ancestor directory containing package.json.\n * Returns undefined if no package.json is found within ANCESTOR_WALK_LIMIT levels.\n */\nexport function findPackageRoot(startDir: string): string | undefined {\n let dir = startDir;\n for (let i = 0; i < ANCESTOR_WALK_LIMIT; i++) {\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n dir = path.dirname(dir);\n }\n return undefined;\n}\n"],"mappings":";;;AAMA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,IAAM,sBAAsB;AAMrB,SAAS,gBAAgB,UAAsC;AACpE,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,qBAAqB,KAAK;AAC5C,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,EAAG,QAAO;AAC1D,UAAM,KAAK,QAAQ,GAAG;AAAA,EACxB;AACA,SAAO;AACT;","names":[]}
|