@goondocks/myco 0.18.0 → 0.19.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/README.md +17 -130
- package/dist/{agent-run-2NFYMQXW.js → agent-run-EADUYYAS.js} +6 -6
- package/dist/{agent-tasks-MEIYLXGN.js → agent-tasks-GC77JXQB.js} +6 -6
- package/dist/{chunk-EO2RQW4S.js → chunk-2CKDAFSX.js} +2 -2
- package/dist/{chunk-NZI7WBZI.js → chunk-2DF4OZ2D.js} +22 -2
- package/dist/chunk-2DF4OZ2D.js.map +1 -0
- package/dist/{chunk-OW433Q4C.js → chunk-2LN2BBKA.js} +45 -4
- package/dist/chunk-2LN2BBKA.js.map +1 -0
- package/dist/{chunk-U7GJTVSX.js → chunk-2OO3BRFK.js} +21 -7
- package/dist/chunk-2OO3BRFK.js.map +1 -0
- package/dist/{chunk-RAV5YMRU.js → chunk-3TPD6HEF.js} +4 -4
- package/dist/{chunk-JMOUFG6Y.js → chunk-44PZCAYS.js} +47 -5
- package/dist/chunk-44PZCAYS.js.map +1 -0
- package/dist/{chunk-D7TYRPRM.js → chunk-6LQIMRTC.js} +145 -145
- package/dist/chunk-6LQIMRTC.js.map +1 -0
- package/dist/{chunk-NI23QCHB.js → chunk-AELJ4PS5.js} +5 -5
- package/dist/{chunk-BUIR3JWM.js → chunk-CYBC2HZ3.js} +3 -3
- package/dist/chunk-EM63ZFKA.js +166 -0
- package/dist/chunk-EM63ZFKA.js.map +1 -0
- package/dist/{chunk-O3TRN3RC.js → chunk-INWD6AIQ.js} +2 -2
- package/dist/{chunk-CML4MCYF.js → chunk-KSXTNYXO.js} +2 -2
- package/dist/{chunk-KWTOCJLB.js → chunk-LLJMDXO2.js} +1176 -241
- package/dist/chunk-LLJMDXO2.js.map +1 -0
- package/dist/{chunk-2V7HR7HB.js → chunk-MDEUXYJG.js} +4 -4
- package/dist/{chunk-PFWIPRF6.js → chunk-MS6FDV45.js} +3 -3
- package/dist/{chunk-55QEICRO.js → chunk-N77K772N.js} +3 -3
- package/dist/{chunk-E4VLWIJC.js → chunk-ODXLRR4U.js} +1 -1
- package/dist/{chunk-DLFDBKEV.js → chunk-OZF5EURR.js} +19 -16
- package/dist/chunk-OZF5EURR.js.map +1 -0
- package/dist/{chunk-IB76KGBY.js → chunk-POEPHBQK.js} +1 -1
- package/dist/{chunk-7OYXB2NM.js → chunk-REN37KYI.js} +6 -2
- package/dist/chunk-REN37KYI.js.map +1 -0
- package/dist/{chunk-JDI4DPWD.js → chunk-RXROZBSK.js} +637 -150
- package/dist/chunk-RXROZBSK.js.map +1 -0
- package/dist/{chunk-U3J2DDSR.js → chunk-SCI55NKY.js} +2 -2
- package/dist/{chunk-GDY63YAW.js → chunk-U6PF3YII.js} +79 -79
- package/dist/chunk-U6PF3YII.js.map +1 -0
- package/dist/{chunk-FABWUX5G.js → chunk-UVKQ62II.js} +18 -4
- package/dist/chunk-UVKQ62II.js.map +1 -0
- package/dist/{chunk-VOCGURV7.js → chunk-UW6DGPSV.js} +3 -3
- package/dist/{chunk-CKJAWZQE.js → chunk-W4VHC2ES.js} +11 -3
- package/dist/chunk-W4VHC2ES.js.map +1 -0
- package/dist/{chunk-75AZFBFW.js → chunk-YPWF322W.js} +3 -3
- package/dist/{cli-IIMBALPV.js → cli-X7CFP4YD.js} +39 -39
- package/dist/{client-VZCUISHZ.js → client-YA33HUFY.js} +4 -4
- package/dist/{config-DA4IUVFL.js → config-RFB2DJC6.js} +6 -6
- package/dist/{detect-GEM3NVK6.js → detect-BEOIHGBC.js} +5 -5
- package/dist/{detect-providers-PSVKXTWE.js → detect-providers-2OQBU4VX.js} +4 -4
- package/dist/{doctor-QYD34X7Q.js → doctor-FAH7N66M.js} +11 -11
- package/dist/{executor-NSPRTH4M.js → executor-ICTRRUBY.js} +93 -285
- package/dist/executor-ICTRRUBY.js.map +1 -0
- package/dist/{init-WYYL44KZ.js → init-PTJEOTJV.js} +15 -15
- package/dist/{llm-KEDHK3TQ.js → llm-7D2OGDEK.js} +4 -4
- package/dist/{loader-Q3P3R4UP.js → loader-O2JFO2UC.js} +6 -6
- package/dist/{loader-SKKUMT5C.js → loader-VPE4RCIF.js} +6 -6
- package/dist/{main-6PY3ITQ5.js → main-EIKBLOUL.js} +752 -264
- package/dist/main-EIKBLOUL.js.map +1 -0
- package/dist/{open-HRFMJDQX.js → open-2JCSOLZS.js} +6 -6
- package/dist/{post-compact-HT24YMAN.js → post-compact-2HPPWPBI.js} +10 -10
- package/dist/{post-tool-use-DENRI5WB.js → post-tool-use-TWBBBABS.js} +9 -9
- package/dist/{post-tool-use-failure-A6SNJX42.js → post-tool-use-failure-LIJYR4KL.js} +10 -10
- package/dist/{pre-compact-3Q4BALCL.js → pre-compact-II2CMNTG.js} +10 -10
- package/dist/{provider-check-AE3L5Z6R.js → provider-check-KEQNQ6LO.js} +4 -4
- package/dist/{registry-O2NZLO3V.js → registry-X5FDGYXT.js} +7 -7
- package/dist/{remove-YB5A6HY2.js → remove-L5MVYBOY.js} +11 -11
- package/dist/{resolution-events-XWYLLDRK.js → resolution-events-MVIZMONR.js} +4 -4
- package/dist/{restart-RGDVHELZ.js → restart-VIT3JBD6.js} +7 -7
- package/dist/{search-WOHT3G55.js → search-O6BB5MTO.js} +7 -7
- package/dist/{server-6SUNYDV7.js → server-O3UPJVBR.js} +258 -173
- package/dist/server-O3UPJVBR.js.map +1 -0
- package/dist/{session-W3SKRFRV.js → session-5JV3DQIK.js} +8 -8
- package/dist/{session-end-OUTY7AFF.js → session-end-PZ2OXBGG.js} +9 -9
- package/dist/{session-start-5MB3LFOA.js → session-start-FDGM56BX.js} +22 -17
- package/dist/{session-start-5MB3LFOA.js.map → session-start-FDGM56BX.js.map} +1 -1
- package/dist/{setup-llm-ZMYGIQX5.js → setup-llm-MQK557BB.js} +10 -10
- package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -1
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +10 -0
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +163 -49
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +44 -27
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +132 -138
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -1
- 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/codex.yaml +45 -7
- package/dist/{stats-DGI6B3HX.js → stats-2STTARTC.js} +11 -11
- package/dist/{stop-YGHODSP7.js → stop-WNKCMCGO.js} +9 -9
- package/dist/{stop-failure-7IJTPJ6W.js → stop-failure-6GTOBVTN.js} +10 -10
- package/dist/{subagent-start-ZBQ5PJB5.js → subagent-start-VJF5YKVX.js} +10 -10
- package/dist/{subagent-stop-N2TDQU2D.js → subagent-stop-UW6HMICY.js} +10 -10
- package/dist/{task-completed-BDLMRSBB.js → task-completed-U4Q3XXLX.js} +10 -10
- package/dist/{team-2ZFGTSIN.js → team-N6TXS2PF.js} +148 -103
- package/dist/team-N6TXS2PF.js.map +1 -0
- package/dist/ui/assets/{index-DtT9_nlT.js → index-CHIm98OP.js} +48 -48
- package/dist/ui/index.html +1 -1
- package/dist/{update-STLAN7LR.js → update-ZYCOWKMD.js} +11 -11
- package/dist/{user-prompt-submit-4IBFUYQ3.js → user-prompt-submit-SOYL4OWF.js} +15 -12
- package/dist/user-prompt-submit-SOYL4OWF.js.map +1 -0
- package/dist/{verify-EJYPO7QA.js → verify-P37PQ4YM.js} +8 -8
- package/dist/{version-YPBIKH77.js → version-XAWC277D.js} +2 -2
- package/package.json +25 -8
- package/CONTRIBUTING.md +0 -132
- package/dist/chunk-7OYXB2NM.js.map +0 -1
- package/dist/chunk-CKJAWZQE.js.map +0 -1
- package/dist/chunk-D7TYRPRM.js.map +0 -1
- package/dist/chunk-DLFDBKEV.js.map +0 -1
- package/dist/chunk-FABWUX5G.js.map +0 -1
- package/dist/chunk-GDY63YAW.js.map +0 -1
- package/dist/chunk-JDI4DPWD.js.map +0 -1
- package/dist/chunk-JMOUFG6Y.js.map +0 -1
- package/dist/chunk-KWTOCJLB.js.map +0 -1
- package/dist/chunk-NZI7WBZI.js.map +0 -1
- package/dist/chunk-OW433Q4C.js.map +0 -1
- package/dist/chunk-RJMXDUMA.js +0 -40
- package/dist/chunk-RJMXDUMA.js.map +0 -1
- package/dist/chunk-U7GJTVSX.js.map +0 -1
- package/dist/executor-NSPRTH4M.js.map +0 -1
- package/dist/main-6PY3ITQ5.js.map +0 -1
- package/dist/server-6SUNYDV7.js.map +0 -1
- package/dist/src/worker/package-lock.json +0 -4338
- package/dist/src/worker/package.json +0 -22
- package/dist/src/worker/src/auth.ts +0 -31
- package/dist/src/worker/src/index.ts +0 -470
- package/dist/src/worker/src/mcp/auth.ts +0 -65
- package/dist/src/worker/src/mcp/server.ts +0 -53
- package/dist/src/worker/src/mcp/tools/context.ts +0 -13
- package/dist/src/worker/src/mcp/tools/get.ts +0 -15
- package/dist/src/worker/src/mcp/tools/graph.ts +0 -35
- package/dist/src/worker/src/mcp/tools/search.ts +0 -32
- package/dist/src/worker/src/mcp/tools/sessions.ts +0 -24
- package/dist/src/worker/src/mcp/tools/skills.ts +0 -16
- package/dist/src/worker/src/mcp/tools/team.ts +0 -9
- package/dist/src/worker/src/schema.ts +0 -324
- package/dist/src/worker/src/search-helpers.ts +0 -70
- package/dist/src/worker/tsconfig.json +0 -16
- package/dist/src/worker/wrangler.toml +0 -30
- package/dist/team-2ZFGTSIN.js.map +0 -1
- package/dist/user-prompt-submit-4IBFUYQ3.js.map +0 -1
- /package/dist/{agent-run-2NFYMQXW.js.map → agent-run-EADUYYAS.js.map} +0 -0
- /package/dist/{agent-tasks-MEIYLXGN.js.map → agent-tasks-GC77JXQB.js.map} +0 -0
- /package/dist/{chunk-EO2RQW4S.js.map → chunk-2CKDAFSX.js.map} +0 -0
- /package/dist/{chunk-RAV5YMRU.js.map → chunk-3TPD6HEF.js.map} +0 -0
- /package/dist/{chunk-NI23QCHB.js.map → chunk-AELJ4PS5.js.map} +0 -0
- /package/dist/{chunk-BUIR3JWM.js.map → chunk-CYBC2HZ3.js.map} +0 -0
- /package/dist/{chunk-O3TRN3RC.js.map → chunk-INWD6AIQ.js.map} +0 -0
- /package/dist/{chunk-CML4MCYF.js.map → chunk-KSXTNYXO.js.map} +0 -0
- /package/dist/{chunk-2V7HR7HB.js.map → chunk-MDEUXYJG.js.map} +0 -0
- /package/dist/{chunk-PFWIPRF6.js.map → chunk-MS6FDV45.js.map} +0 -0
- /package/dist/{chunk-55QEICRO.js.map → chunk-N77K772N.js.map} +0 -0
- /package/dist/{chunk-E4VLWIJC.js.map → chunk-ODXLRR4U.js.map} +0 -0
- /package/dist/{chunk-IB76KGBY.js.map → chunk-POEPHBQK.js.map} +0 -0
- /package/dist/{chunk-U3J2DDSR.js.map → chunk-SCI55NKY.js.map} +0 -0
- /package/dist/{chunk-VOCGURV7.js.map → chunk-UW6DGPSV.js.map} +0 -0
- /package/dist/{chunk-75AZFBFW.js.map → chunk-YPWF322W.js.map} +0 -0
- /package/dist/{cli-IIMBALPV.js.map → cli-X7CFP4YD.js.map} +0 -0
- /package/dist/{client-VZCUISHZ.js.map → client-YA33HUFY.js.map} +0 -0
- /package/dist/{config-DA4IUVFL.js.map → config-RFB2DJC6.js.map} +0 -0
- /package/dist/{detect-GEM3NVK6.js.map → detect-BEOIHGBC.js.map} +0 -0
- /package/dist/{detect-providers-PSVKXTWE.js.map → detect-providers-2OQBU4VX.js.map} +0 -0
- /package/dist/{doctor-QYD34X7Q.js.map → doctor-FAH7N66M.js.map} +0 -0
- /package/dist/{init-WYYL44KZ.js.map → init-PTJEOTJV.js.map} +0 -0
- /package/dist/{llm-KEDHK3TQ.js.map → llm-7D2OGDEK.js.map} +0 -0
- /package/dist/{loader-Q3P3R4UP.js.map → loader-O2JFO2UC.js.map} +0 -0
- /package/dist/{loader-SKKUMT5C.js.map → loader-VPE4RCIF.js.map} +0 -0
- /package/dist/{open-HRFMJDQX.js.map → open-2JCSOLZS.js.map} +0 -0
- /package/dist/{post-compact-HT24YMAN.js.map → post-compact-2HPPWPBI.js.map} +0 -0
- /package/dist/{post-tool-use-DENRI5WB.js.map → post-tool-use-TWBBBABS.js.map} +0 -0
- /package/dist/{post-tool-use-failure-A6SNJX42.js.map → post-tool-use-failure-LIJYR4KL.js.map} +0 -0
- /package/dist/{pre-compact-3Q4BALCL.js.map → pre-compact-II2CMNTG.js.map} +0 -0
- /package/dist/{provider-check-AE3L5Z6R.js.map → provider-check-KEQNQ6LO.js.map} +0 -0
- /package/dist/{registry-O2NZLO3V.js.map → registry-X5FDGYXT.js.map} +0 -0
- /package/dist/{remove-YB5A6HY2.js.map → remove-L5MVYBOY.js.map} +0 -0
- /package/dist/{resolution-events-XWYLLDRK.js.map → resolution-events-MVIZMONR.js.map} +0 -0
- /package/dist/{restart-RGDVHELZ.js.map → restart-VIT3JBD6.js.map} +0 -0
- /package/dist/{search-WOHT3G55.js.map → search-O6BB5MTO.js.map} +0 -0
- /package/dist/{session-W3SKRFRV.js.map → session-5JV3DQIK.js.map} +0 -0
- /package/dist/{session-end-OUTY7AFF.js.map → session-end-PZ2OXBGG.js.map} +0 -0
- /package/dist/{setup-llm-ZMYGIQX5.js.map → setup-llm-MQK557BB.js.map} +0 -0
- /package/dist/{stats-DGI6B3HX.js.map → stats-2STTARTC.js.map} +0 -0
- /package/dist/{stop-YGHODSP7.js.map → stop-WNKCMCGO.js.map} +0 -0
- /package/dist/{stop-failure-7IJTPJ6W.js.map → stop-failure-6GTOBVTN.js.map} +0 -0
- /package/dist/{subagent-start-ZBQ5PJB5.js.map → subagent-start-VJF5YKVX.js.map} +0 -0
- /package/dist/{subagent-stop-N2TDQU2D.js.map → subagent-stop-UW6HMICY.js.map} +0 -0
- /package/dist/{task-completed-BDLMRSBB.js.map → task-completed-U4Q3XXLX.js.map} +0 -0
- /package/dist/{update-STLAN7LR.js.map → update-ZYCOWKMD.js.map} +0 -0
- /package/dist/{verify-EJYPO7QA.js.map → verify-P37PQ4YM.js.map} +0 -0
- /package/dist/{version-YPBIKH77.js.map → version-XAWC277D.js.map} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
SCHEDULABLE_POWER_STATES
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-W4VHC2ES.js";
|
|
5
5
|
import {
|
|
6
6
|
require_dist
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6LQIMRTC.js";
|
|
8
8
|
import {
|
|
9
9
|
external_exports
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-U6PF3YII.js";
|
|
11
11
|
import {
|
|
12
12
|
__toESM
|
|
13
13
|
} from "./chunk-PZUWP5VK.js";
|
|
@@ -430,4 +430,4 @@ export {
|
|
|
430
430
|
getEnabledSymbiontNames,
|
|
431
431
|
updateTeamConfig
|
|
432
432
|
};
|
|
433
|
-
//# sourceMappingURL=chunk-
|
|
433
|
+
//# sourceMappingURL=chunk-MDEUXYJG.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
loadManifests
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UVKQ62II.js";
|
|
5
5
|
import {
|
|
6
6
|
STDIN_TIMEOUT_MS
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-W4VHC2ES.js";
|
|
8
8
|
|
|
9
9
|
// src/hooks/read-stdin.ts
|
|
10
10
|
function readStdin() {
|
|
@@ -114,4 +114,4 @@ export {
|
|
|
114
114
|
readStdin,
|
|
115
115
|
normalizeHookInput
|
|
116
116
|
};
|
|
117
|
-
//# sourceMappingURL=chunk-
|
|
117
|
+
//# sourceMappingURL=chunk-MS6FDV45.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
LmStudioBackend,
|
|
7
7
|
OllamaBackend
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-KSXTNYXO.js";
|
|
9
9
|
import {
|
|
10
10
|
closeDatabase,
|
|
11
11
|
initDatabase,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-MYX5NCRH.js";
|
|
14
14
|
import {
|
|
15
15
|
DaemonClient
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-CYBC2HZ3.js";
|
|
17
17
|
|
|
18
18
|
// src/cli/shared.ts
|
|
19
19
|
import fs from "fs";
|
|
@@ -120,4 +120,4 @@ export {
|
|
|
120
120
|
VAULT_GITIGNORE,
|
|
121
121
|
registerSymbionts
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-N77K772N.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
//# sourceMappingURL=chunk-ODXLRR4U.js.map
|
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
isProcessAlive
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-N77K772N.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-MDEUXYJG.js";
|
|
8
8
|
import {
|
|
9
9
|
getDatabase
|
|
10
10
|
} from "./chunk-MYX5NCRH.js";
|
|
11
11
|
import {
|
|
12
12
|
DIGEST_TIERS
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-W4VHC2ES.js";
|
|
14
14
|
|
|
15
15
|
// src/db/queries/embeddings.ts
|
|
16
|
-
var EMBEDDABLE_TABLES = ["sessions", "spores", "plans", "artifacts"];
|
|
16
|
+
var EMBEDDABLE_TABLES = ["sessions", "spores", "plans", "artifacts", "skill_records"];
|
|
17
17
|
var EMBEDDABLE_TEXT_COLUMNS = {
|
|
18
18
|
sessions: "summary",
|
|
19
19
|
spores: "content",
|
|
20
20
|
plans: "content",
|
|
21
|
-
artifacts: "content"
|
|
21
|
+
artifacts: "content",
|
|
22
|
+
skill_records: "description"
|
|
22
23
|
};
|
|
23
|
-
var INVALID_TABLE_MSG = "Invalid table name \u2014 must be one of: sessions, spores, plans, artifacts";
|
|
24
|
+
var INVALID_TABLE_MSG = "Invalid table name \u2014 must be one of: sessions, spores, plans, artifacts, skill_records";
|
|
24
25
|
var DEFAULT_UNEMBEDDED_LIMIT = 100;
|
|
25
26
|
function assertValidTable(table) {
|
|
26
27
|
if (!EMBEDDABLE_TABLES.includes(table)) {
|
|
@@ -42,7 +43,7 @@ function getUnembedded(table, limit = DEFAULT_UNEMBEDDED_LIMIT) {
|
|
|
42
43
|
const db = getDatabase();
|
|
43
44
|
const textCol = EMBEDDABLE_TEXT_COLUMNS[table];
|
|
44
45
|
const contentFilter = table === "sessions" ? " AND summary IS NOT NULL" : "";
|
|
45
|
-
const statusFilter = table === "spores" ? " AND status = 'active'" : "";
|
|
46
|
+
const statusFilter = table === "spores" || table === "skill_records" ? " AND status = 'active'" : "";
|
|
46
47
|
return db.prepare(
|
|
47
48
|
`SELECT id, created_at, ${textCol} AS text
|
|
48
49
|
FROM ${table}
|
|
@@ -55,18 +56,20 @@ function getEmbeddingQueueDepth() {
|
|
|
55
56
|
const db = getDatabase();
|
|
56
57
|
const queueRow = db.prepare(`
|
|
57
58
|
SELECT
|
|
58
|
-
(SELECT COUNT(*) FROM sessions
|
|
59
|
-
(SELECT COUNT(*) FROM spores
|
|
60
|
-
(SELECT COUNT(*) FROM plans
|
|
61
|
-
(SELECT COUNT(*) FROM artifacts
|
|
59
|
+
(SELECT COUNT(*) FROM sessions WHERE embedded = 0 AND summary IS NOT NULL) +
|
|
60
|
+
(SELECT COUNT(*) FROM spores WHERE embedded = 0 AND status = 'active') +
|
|
61
|
+
(SELECT COUNT(*) FROM plans WHERE embedded = 0 AND content IS NOT NULL) +
|
|
62
|
+
(SELECT COUNT(*) FROM artifacts WHERE embedded = 0 AND content IS NOT NULL) +
|
|
63
|
+
(SELECT COUNT(*) FROM skill_records WHERE embedded = 0 AND status = 'active')
|
|
62
64
|
AS cnt
|
|
63
65
|
`).get();
|
|
64
66
|
const embeddedRow = db.prepare(`
|
|
65
67
|
SELECT
|
|
66
|
-
(SELECT COUNT(*) FROM sessions
|
|
67
|
-
(SELECT COUNT(*) FROM spores
|
|
68
|
-
(SELECT COUNT(*) FROM plans
|
|
69
|
-
(SELECT COUNT(*) FROM artifacts
|
|
68
|
+
(SELECT COUNT(*) FROM sessions WHERE embedded = 1) +
|
|
69
|
+
(SELECT COUNT(*) FROM spores WHERE embedded = 1) +
|
|
70
|
+
(SELECT COUNT(*) FROM plans WHERE embedded = 1) +
|
|
71
|
+
(SELECT COUNT(*) FROM artifacts WHERE embedded = 1) +
|
|
72
|
+
(SELECT COUNT(*) FROM skill_records WHERE embedded = 1)
|
|
70
73
|
AS cnt
|
|
71
74
|
`).get();
|
|
72
75
|
const queue_depth = Number(queueRow.cnt ?? 0);
|
|
@@ -184,4 +187,4 @@ export {
|
|
|
184
187
|
getEmbeddingQueueDepth,
|
|
185
188
|
gatherStats
|
|
186
189
|
};
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
190
|
+
//# sourceMappingURL=chunk-OZF5EURR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/queries/embeddings.ts","../src/services/stats.ts"],"sourcesContent":["/**\n * Embedded flag management — tracks which rows have been indexed in the external vector store.\n *\n * All vector storage and similarity search is handled by the external VectorStore.\n * This module only manages the `embedded` flag on relational tables.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Tables that participate in vector embedding. */\nexport const EMBEDDABLE_TABLES = ['sessions', 'spores', 'plans', 'artifacts', 'skill_records'] as const;\n\n/** TypeScript type for valid embeddable table names. */\nexport type EmbeddableTable = (typeof EMBEDDABLE_TABLES)[number];\n\n/** Per-table column that holds the text content used for embedding. */\nexport const EMBEDDABLE_TEXT_COLUMNS: Record<EmbeddableTable, string> = {\n sessions: 'summary',\n spores: 'content',\n plans: 'content',\n artifacts: 'content',\n skill_records: 'description',\n};\n\n/** Error message for invalid table names. */\nconst INVALID_TABLE_MSG = 'Invalid table name — must be one of: sessions, spores, plans, artifacts, skill_records';\n\n/** Default number of rows returned by getUnembedded. */\nconst DEFAULT_UNEMBEDDED_LIMIT = 100;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Validate that a table name is in the allowlist.\n *\n * @throws if the table name is not one of the embeddable tables.\n */\nexport function assertValidTable(table: string): asserts table is EmbeddableTable {\n if (!(EMBEDDABLE_TABLES as readonly string[]).includes(table)) {\n throw new Error(INVALID_TABLE_MSG);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Mark a row as embedded in the external vector store. */\nexport function markEmbedded(table: string, id: string | number): void {\n assertValidTable(table);\n const db = getDatabase();\n db.prepare(`UPDATE ${table} SET embedded = 1 WHERE id = ?`).run(id);\n}\n\n/** Clear the embedded flag (e.g., when vector is removed or needs re-embedding). */\nexport function clearEmbedded(table: string, id: string | number): void {\n assertValidTable(table);\n const db = getDatabase();\n db.prepare(`UPDATE ${table} SET embedded = 0 WHERE id = ?`).run(id);\n}\n\n/** Find rows that have not yet been embedded, oldest first. */\nexport function getUnembedded(\n table: string,\n limit: number = DEFAULT_UNEMBEDDED_LIMIT,\n): Array<{ id: string | number; created_at: number; text: string }> {\n assertValidTable(table);\n const db = getDatabase();\n const textCol = EMBEDDABLE_TEXT_COLUMNS[table as EmbeddableTable];\n const contentFilter = table === 'sessions' ? ' AND summary IS NOT NULL' : '';\n const statusFilter = (table === 'spores' || table === 'skill_records') ? \" AND status = 'active'\" : '';\n\n return db.prepare(\n `SELECT id, created_at, ${textCol} AS text\n FROM ${table}\n WHERE embedded = 0${contentFilter}${statusFilter}\n ORDER BY created_at ASC\n LIMIT ?`\n ).all(limit) as Array<{ id: string | number; created_at: number; text: string }>;\n}\n\n/** Get aggregated embedding queue depth across all embeddable tables. */\nexport function getEmbeddingQueueDepth(): {\n queue_depth: number;\n embedded_count: number;\n total: number;\n} {\n const db = getDatabase();\n\n const queueRow = db.prepare(`\n SELECT\n (SELECT COUNT(*) FROM sessions WHERE embedded = 0 AND summary IS NOT NULL) +\n (SELECT COUNT(*) FROM spores WHERE embedded = 0 AND status = 'active') +\n (SELECT COUNT(*) FROM plans WHERE embedded = 0 AND content IS NOT NULL) +\n (SELECT COUNT(*) FROM artifacts WHERE embedded = 0 AND content IS NOT NULL) +\n (SELECT COUNT(*) FROM skill_records WHERE embedded = 0 AND status = 'active')\n AS cnt\n `).get() as { cnt: number };\n\n const embeddedRow = db.prepare(`\n SELECT\n (SELECT COUNT(*) FROM sessions WHERE embedded = 1) +\n (SELECT COUNT(*) FROM spores WHERE embedded = 1) +\n (SELECT COUNT(*) FROM plans WHERE embedded = 1) +\n (SELECT COUNT(*) FROM artifacts WHERE embedded = 1) +\n (SELECT COUNT(*) FROM skill_records WHERE embedded = 1)\n AS cnt\n `).get() as { cnt: number };\n\n const queue_depth = Number(queueRow.cnt ?? 0);\n const embedded_count = Number(embeddedRow.cnt ?? 0);\n return { queue_depth, embedded_count, total: queue_depth + embedded_count };\n}\n","/**\n * Vault statistics — gathered from SQLite.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getEmbeddingQueueDepth } from '@myco/db/queries/embeddings.js';\nimport { loadConfig } from '@myco/config/loader.js';\nimport { isProcessAlive } from '@myco/cli/shared.js';\nimport { DIGEST_TIERS } from '@myco/constants.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Process uptime is available directly from the daemon process via process.uptime(). */\nconst DAEMON_JSON_FILENAME = 'daemon.json';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface V2Stats {\n daemon: {\n pid: number;\n port: number;\n version: string;\n uptime_seconds: number;\n active_sessions: string[];\n };\n vault: {\n path: string;\n name: string;\n session_count: number;\n batch_count: number;\n spore_count: number;\n plan_count: number;\n artifact_count: number;\n entity_count: number;\n edge_count: number;\n };\n embedding: {\n provider: string;\n model: string;\n queue_depth: number;\n embedded_count: number;\n total_embeddable: number;\n };\n agent: {\n last_run_at: number | null;\n last_run_status: string | null;\n total_runs: number;\n };\n digest: {\n freshest_tier: number | null;\n generated_at: number | null;\n tiers_available: number[];\n };\n unprocessed_batches: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Count rows in a table (sync). */\nfunction countTable(db: ReturnType<typeof getDatabase>, table: string): number {\n const row = db.prepare(`SELECT COUNT(*) AS cnt FROM ${table}`).get() as { cnt: number };\n return Number(row.cnt);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function gatherStats(vaultDir: string, options?: { active_sessions?: string[] }): V2Stats {\n const db = getDatabase();\n\n // Load config for embedding provider info (sync — already on disk)\n const config = loadConfig(vaultDir);\n\n // All queries are synchronous — no Promise.all needed\n const session_count = countTable(db, 'sessions');\n const batch_count = countTable(db, 'prompt_batches');\n const spore_count = countTable(db, 'spores');\n const plan_count = countTable(db, 'plans');\n const artifact_count = countTable(db, 'artifacts');\n const entity_count = countTable(db, 'entities');\n const edge_count = countTable(db, 'graph_edges');\n\n // Shared embedding queue depth helper (consistent filter logic)\n const embeddingStats = getEmbeddingQueueDepth();\n const { queue_depth, embedded_count, total: total_embeddable } = embeddingStats;\n\n // Unprocessed batches\n const unprocessedRow = db.prepare(\n 'SELECT COUNT(*) AS cnt FROM prompt_batches WHERE processed = 0',\n ).get() as { cnt: number };\n const unprocessed_batches = Number(unprocessedRow.cnt ?? 0);\n\n // Agent: most recent run\n const lastRun = db.prepare(\n 'SELECT started_at, status FROM agent_runs ORDER BY started_at DESC LIMIT 1',\n ).get() as { started_at: number; status: string } | undefined;\n const last_run_at = lastRun ? lastRun.started_at : null;\n const last_run_status = lastRun ? lastRun.status : null;\n\n // Total agent runs\n const agentTotalRow = db.prepare(\n 'SELECT COUNT(*) AS cnt FROM agent_runs',\n ).get() as { cnt: number };\n const total_runs = Number(agentTotalRow.cnt ?? 0);\n\n // Digest extracts: only report tiers that are currently configured\n const digestRows = db.prepare(\n 'SELECT tier, generated_at FROM digest_extracts ORDER BY tier ASC',\n ).all() as Array<{ tier: number; generated_at: number }>;\n const configuredTiers = new Set<number>(DIGEST_TIERS);\n const activeDigestRows = digestRows.filter((r) => configuredTiers.has(r.tier));\n const tiers_available = activeDigestRows.map((r) => r.tier);\n const freshest_tier = tiers_available.length > 0 ? Math.max(...tiers_available) : null;\n const freshestRow = activeDigestRows.find((r) => r.tier === freshest_tier);\n const generated_at = freshestRow ? freshestRow.generated_at : null;\n\n // Daemon info from daemon.json\n let daemonPid = 0;\n let daemonPort = 0;\n let daemonVersion = '';\n let daemonUptimeSeconds = 0;\n const daemonPath = path.join(vaultDir, DAEMON_JSON_FILENAME);\n if (fs.existsSync(daemonPath)) {\n try {\n const info = JSON.parse(fs.readFileSync(daemonPath, 'utf-8')) as Record<string, unknown>;\n daemonPid = (info.pid as number) ?? 0;\n daemonPort = (info.port as number) ?? 0;\n daemonVersion = (info.version as string) ?? '';\n // uptime: if daemon is alive, compute from started timestamp\n if (typeof info.started === 'string' && isProcessAlive(daemonPid)) {\n const startedMs = new Date(info.started as string).getTime();\n daemonUptimeSeconds = Math.floor((Date.now() - startedMs) / 1000);\n }\n } catch { /* ignore corrupt daemon.json */ }\n }\n\n return {\n daemon: {\n pid: daemonPid,\n port: daemonPort,\n version: daemonVersion,\n uptime_seconds: daemonUptimeSeconds,\n active_sessions: options?.active_sessions ?? [],\n },\n vault: {\n path: vaultDir,\n name: path.basename(path.dirname(vaultDir)),\n session_count,\n batch_count,\n spore_count,\n plan_count,\n artifact_count,\n entity_count,\n edge_count,\n },\n embedding: {\n provider: config.embedding.provider,\n model: config.embedding.model,\n queue_depth,\n embedded_count,\n total_embeddable,\n },\n agent: {\n last_run_at,\n last_run_status,\n total_runs,\n },\n digest: {\n freshest_tier,\n generated_at,\n tiers_available,\n },\n unprocessed_batches,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
//# sourceMappingURL=chunk-POEPHBQK.js.map
|
|
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
|
|
|
2
2
|
import {
|
|
3
3
|
getTeamMachineId,
|
|
4
4
|
syncRow
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-INWD6AIQ.js";
|
|
6
6
|
import {
|
|
7
7
|
getDatabase
|
|
8
8
|
} from "./chunk-MYX5NCRH.js";
|
|
@@ -124,6 +124,10 @@ function buildSporeWhere(options) {
|
|
|
124
124
|
const pattern = `%${options.search}%`;
|
|
125
125
|
params.push(pattern, pattern);
|
|
126
126
|
}
|
|
127
|
+
if (options.since !== void 0) {
|
|
128
|
+
conditions.push("created_at > ?");
|
|
129
|
+
params.push(options.since);
|
|
130
|
+
}
|
|
127
131
|
return {
|
|
128
132
|
where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
|
|
129
133
|
params
|
|
@@ -183,4 +187,4 @@ export {
|
|
|
183
187
|
listSporeIdsSince,
|
|
184
188
|
updateSporeStatus
|
|
185
189
|
};
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
190
|
+
//# sourceMappingURL=chunk-REN37KYI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/queries/spores.ts"],"sourcesContent":["/**\n * Spore CRUD query helpers.\n *\n * All functions obtain the SQLite instance internally via `getDatabase()`.\n * Queries use positional `?` placeholders throughout (better-sqlite3).\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getTeamMachineId } from '@myco/daemon/team-context.js';\nimport { syncRow } from '@myco/db/queries/team-outbox.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Default number of spores returned by listSpores when no limit given. */\nconst DEFAULT_LIST_LIMIT = 100;\n\n/** Default spore status for new spores. */\nconst DEFAULT_STATUS = 'active';\n\n/** Default importance score for new spores. */\nexport const DEFAULT_IMPORTANCE = 5;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Fields required (or optional) when inserting a spore. */\nexport interface SporeInsert {\n id: string;\n agent_id: string;\n observation_type: string;\n content: string;\n created_at: number;\n session_id?: string | null;\n prompt_batch_id?: number | null;\n status?: string;\n context?: string | null;\n importance?: number;\n file_path?: string | null;\n tags?: string | null;\n content_hash?: string | null;\n properties?: string | null;\n updated_at?: number | null;\n machine_id?: string;\n}\n\n/** Row shape returned from spore queries (all columns). */\nexport interface SporeRow {\n id: string;\n agent_id: string;\n session_id: string | null;\n prompt_batch_id: number | null;\n observation_type: string;\n status: string;\n content: string;\n context: string | null;\n importance: number;\n file_path: string | null;\n tags: string | null;\n content_hash: string | null;\n properties: string | null;\n embedded: number;\n created_at: number;\n updated_at: number | null;\n machine_id: string;\n synced_at: number | null;\n}\n\n/** Filter options for `listSpores`. */\nexport interface ListSporesOptions {\n agent_id?: string;\n observation_type?: string;\n status?: string;\n session_id?: string;\n search?: string;\n /** Only return spores created after this epoch-seconds timestamp. */\n since?: number;\n limit?: number;\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Column list\n// ---------------------------------------------------------------------------\n\nconst SPORE_COLUMNS = [\n 'id',\n 'agent_id',\n 'session_id',\n 'prompt_batch_id',\n 'observation_type',\n 'status',\n 'content',\n 'context',\n 'importance',\n 'file_path',\n 'tags',\n 'content_hash',\n 'properties',\n 'embedded',\n 'created_at',\n 'updated_at',\n 'machine_id',\n 'synced_at',\n] as const;\n\nconst SELECT_COLUMNS = SPORE_COLUMNS.join(', ');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Normalize a SQLite result row into a typed SporeRow. */\nfunction toSporeRow(row: Record<string, unknown>): SporeRow {\n return {\n id: row.id as string,\n agent_id: row.agent_id as string,\n session_id: (row.session_id as string) ?? null,\n prompt_batch_id: (row.prompt_batch_id as number) ?? null,\n observation_type: row.observation_type as string,\n status: row.status as string,\n content: row.content as string,\n context: (row.context as string) ?? null,\n importance: row.importance as number,\n file_path: (row.file_path as string) ?? null,\n tags: (row.tags as string) ?? null,\n content_hash: (row.content_hash as string) ?? null,\n properties: (row.properties as string) ?? null,\n embedded: (row.embedded as number) ?? 0,\n created_at: row.created_at as number,\n updated_at: (row.updated_at as number) ?? null,\n machine_id: (row.machine_id as string) ?? 'local',\n synced_at: (row.synced_at as number) ?? null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Insert a new spore.\n *\n * Requires a valid `agent_id` (foreign key to agents table).\n */\nexport function insertSpore(data: SporeInsert): SporeRow {\n const db = getDatabase();\n\n db.prepare(\n `INSERT INTO spores (\n id, agent_id, session_id, prompt_batch_id,\n observation_type, status, content, context,\n importance, file_path, tags, content_hash,\n properties, created_at, updated_at, machine_id\n ) VALUES (\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?\n )`,\n ).run(\n data.id,\n data.agent_id,\n data.session_id ?? null,\n data.prompt_batch_id ?? null,\n data.observation_type,\n data.status ?? DEFAULT_STATUS,\n data.content,\n data.context ?? null,\n data.importance ?? DEFAULT_IMPORTANCE,\n data.file_path ?? null,\n data.tags ?? null,\n data.content_hash ?? null,\n data.properties ?? null,\n data.created_at,\n data.updated_at ?? null,\n data.machine_id ?? getTeamMachineId(),\n );\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(data.id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n\n/**\n * Retrieve a single spore by id.\n *\n * @returns the spore row, or null if not found.\n */\nexport function getSpore(id: string): SporeRow | null {\n const db = getDatabase();\n\n const row = db.prepare(\n `SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`,\n ).get(id) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return toSporeRow(row);\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\n/** Build WHERE clause and bound params from spore filter options. */\nfunction buildSporeWhere(\n options: Omit<ListSporesOptions, 'limit' | 'offset'>,\n): { where: string; params: unknown[] } {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.agent_id !== undefined) {\n conditions.push(`agent_id = ?`);\n params.push(options.agent_id);\n }\n if (options.observation_type !== undefined) {\n conditions.push(`observation_type = ?`);\n params.push(options.observation_type);\n }\n if (options.status !== undefined) {\n conditions.push(`status = ?`);\n params.push(options.status);\n }\n if (options.session_id !== undefined) {\n conditions.push(`session_id = ?`);\n params.push(options.session_id);\n }\n if (options.search !== undefined && options.search.length > 0) {\n conditions.push(`(content LIKE ? OR observation_type LIKE ?)`);\n const pattern = `%${options.search}%`;\n params.push(pattern, pattern);\n }\n if (options.since !== undefined) {\n conditions.push('created_at > ?');\n params.push(options.since);\n }\n\n return {\n where: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n };\n}\n\n/**\n * List spores with optional filters, ordered by created_at DESC.\n */\nexport function listSpores(\n options: ListSporesOptions = {},\n): SporeRow[] {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n const limit = options.limit ?? DEFAULT_LIST_LIMIT;\n const offset = options.offset ?? 0;\n\n const rows = db.prepare(\n `SELECT ${SELECT_COLUMNS}\n FROM spores\n ${where}\n ORDER BY created_at DESC\n LIMIT ?\n OFFSET ?`,\n ).all(...params, limit, offset) as Record<string, unknown>[];\n\n return rows.map(toSporeRow);\n}\n\n/**\n * Count spores matching optional filters (for pagination totals).\n */\nexport function countSpores(\n options: Omit<ListSporesOptions, 'limit' | 'offset'> = {},\n): number {\n const db = getDatabase();\n const { where, params } = buildSporeWhere(options);\n\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores ${where}`,\n ).get(...params) as { count: number };\n\n return row.count;\n}\n\n/**\n * Count active spores created after a given timestamp.\n * Used by skill-evolve to detect new knowledge since last assessment.\n */\nexport function countSporesSince(sinceEpoch: number): number {\n const db = getDatabase();\n const row = db.prepare(\n `SELECT COUNT(*) as count FROM spores WHERE created_at > ? AND status = 'active'`,\n ).get(sinceEpoch) as { count: number };\n return row.count;\n}\n\n/**\n * List active spore IDs created after a given timestamp, ordered newest first.\n */\nexport function listSporeIdsSince(sinceEpoch: number, limit = 20): string[] {\n const db = getDatabase();\n const rows = db.prepare(\n `SELECT id FROM spores WHERE created_at > ? AND status = 'active' ORDER BY created_at DESC LIMIT ?`,\n ).all(sinceEpoch, limit) as Array<{ id: string }>;\n return rows.map(r => r.id);\n}\n\n/**\n * Update the status and updated_at timestamp of a spore.\n *\n * @returns the updated row, or null if the spore does not exist.\n */\nexport function updateSporeStatus(\n id: string,\n status: string,\n updatedAt: number,\n): SporeRow | null {\n const db = getDatabase();\n\n const info = db.prepare(\n `UPDATE spores\n SET status = ?, updated_at = ?\n WHERE id = ?`,\n ).run(status, updatedAt, id);\n\n if (info.changes === 0) return null;\n\n const row = toSporeRow(\n db.prepare(`SELECT ${SELECT_COLUMNS} FROM spores WHERE id = ?`).get(id) as Record<string, unknown>,\n );\n\n syncRow('spores', row);\n\n return row;\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,qBAAqB;AAG3B,IAAM,iBAAiB;AAGhB,IAAM,qBAAqB;AAiElC,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,cAAc,KAAK,IAAI;AAO9C,SAAS,WAAW,KAAwC;AAC1D,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,UAAU,IAAI;AAAA,IACd,YAAa,IAAI,cAAyB;AAAA,IAC1C,iBAAkB,IAAI,mBAA8B;AAAA,IACpD,kBAAkB,IAAI;AAAA,IACtB,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,SAAU,IAAI,WAAsB;AAAA,IACpC,YAAY,IAAI;AAAA,IAChB,WAAY,IAAI,aAAwB;AAAA,IACxC,MAAO,IAAI,QAAmB;AAAA,IAC9B,cAAe,IAAI,gBAA2B;AAAA,IAC9C,YAAa,IAAI,cAAyB;AAAA,IAC1C,UAAW,IAAI,YAAuB;AAAA,IACtC,YAAY,IAAI;AAAA,IAChB,YAAa,IAAI,cAAyB;AAAA,IAC1C,YAAa,IAAI,cAAyB;AAAA,IAC1C,WAAY,IAAI,aAAwB;AAAA,EAC1C;AACF;AAWO,SAAS,YAAY,MAA6B;AACvD,QAAM,KAAK,YAAY;AAEvB,KAAG;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EAAE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,cAAc;AAAA,IACnB,KAAK,mBAAmB;AAAA,IACxB,KAAK;AAAA,IACL,KAAK,UAAU;AAAA,IACf,KAAK;AAAA,IACL,KAAK,WAAW;AAAA,IAChB,KAAK,cAAc;AAAA,IACnB,KAAK,aAAa;AAAA,IAClB,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA,IACrB,KAAK,cAAc;AAAA,IACnB,KAAK;AAAA,IACL,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc,iBAAiB;AAAA,EACtC;AAEA,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ,UAAU,cAAc,2BAA2B,EAAE,IAAI,KAAK,EAAE;AAAA,EAC7E;AAEA,UAAQ,UAAU,GAAG;AAErB,SAAO;AACT;AAOO,SAAS,SAAS,IAA6B;AACpD,QAAM,KAAK,YAAY;AAEvB,QAAM,MAAM,GAAG;AAAA,IACb,UAAU,cAAc;AAAA,EAC1B,EAAE,IAAI,EAAE;AAER,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,WAAW,GAAG;AACvB;AAMA,SAAS,gBACP,SACsC;AACtC,QAAM,aAAuB,CAAC;AAC9B,QAAM,SAAoB,CAAC;AAE3B,MAAI,QAAQ,aAAa,QAAW;AAClC,eAAW,KAAK,cAAc;AAC9B,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,qBAAqB,QAAW;AAC1C,eAAW,KAAK,sBAAsB;AACtC,WAAO,KAAK,QAAQ,gBAAgB;AAAA,EACtC;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,eAAW,KAAK,YAAY;AAC5B,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AACA,MAAI,QAAQ,eAAe,QAAW;AACpC,eAAW,KAAK,gBAAgB;AAChC,WAAO,KAAK,QAAQ,UAAU;AAAA,EAChC;AACA,MAAI,QAAQ,WAAW,UAAa,QAAQ,OAAO,SAAS,GAAG;AAC7D,eAAW,KAAK,6CAA6C;AAC7D,UAAM,UAAU,IAAI,QAAQ,MAAM;AAClC,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AACA,MAAI,QAAQ,UAAU,QAAW;AAC/B,eAAW,KAAK,gBAAgB;AAChC,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,OAAO,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,CAAC,KAAK;AAAA,IACrE;AAAA,EACF;AACF;AAKO,SAAS,WACd,UAA6B,CAAC,GAClB;AACZ,QAAM,KAAK,YAAY;AACvB,QAAM,EAAE,OAAO,OAAO,IAAI,gBAAgB,OAAO;AACjD,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AAEjC,QAAM,OAAO,GAAG;AAAA,IACd,UAAU,cAAc;AAAA;AAAA,OAErB,KAAK;AAAA;AAAA;AAAA;AAAA,EAIV,EAAE,IAAI,GAAG,QAAQ,OAAO,MAAM;AAE9B,SAAO,KAAK,IAAI,UAAU;AAC5B;AAKO,SAAS,YACd,UAAuD,CAAC,GAChD;AACR,QAAM,KAAK,YAAY;AACvB,QAAM,EAAE,OAAO,OAAO,IAAI,gBAAgB,OAAO;AAEjD,QAAM,MAAM,GAAG;AAAA,IACb,wCAAwC,KAAK;AAAA,EAC/C,EAAE,IAAI,GAAG,MAAM;AAEf,SAAO,IAAI;AACb;AAiBO,SAAS,kBAAkB,YAAoB,QAAQ,IAAc;AAC1E,QAAM,KAAK,YAAY;AACvB,QAAM,OAAO,GAAG;AAAA,IACd;AAAA,EACF,EAAE,IAAI,YAAY,KAAK;AACvB,SAAO,KAAK,IAAI,OAAK,EAAE,EAAE;AAC3B;AAOO,SAAS,kBACd,IACA,QACA,WACiB;AACjB,QAAM,KAAK,YAAY;AAEvB,QAAM,OAAO,GAAG;AAAA,IACd;AAAA;AAAA;AAAA,EAGF,EAAE,IAAI,QAAQ,WAAW,EAAE;AAE3B,MAAI,KAAK,YAAY,EAAG,QAAO;AAE/B,QAAM,MAAM;AAAA,IACV,GAAG,QAAQ,UAAU,cAAc,2BAA2B,EAAE,IAAI,EAAE;AAAA,EACxE;AAEA,UAAQ,UAAU,GAAG;AAErB,SAAO;AACT;","names":[]}
|