@goondocks/myco 0.12.10 → 0.14.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 +6 -0
- package/dist/{agent-run-GUHXRNZB.js → agent-run-3WLMSLMJ.js} +8 -7
- package/dist/{agent-run-GUHXRNZB.js.map → agent-run-3WLMSLMJ.js.map} +1 -1
- package/dist/{agent-tasks-GWZI5WSB.js → agent-tasks-BQE2GEVS.js} +8 -7
- package/dist/{agent-tasks-GWZI5WSB.js.map → agent-tasks-BQE2GEVS.js.map} +1 -1
- package/dist/{chunk-PW5QVY44.js → chunk-4VF6KQ2Z.js} +371 -6
- package/dist/chunk-4VF6KQ2Z.js.map +1 -0
- package/dist/{chunk-QL2RBFIC.js → chunk-5YQ6VOFZ.js} +2 -2
- package/dist/{chunk-MCARJFBA.js → chunk-745SWTQX.js} +4 -4
- package/dist/{chunk-D4M2AV65.js → chunk-DTE3SHYK.js} +46 -3
- package/dist/chunk-DTE3SHYK.js.map +1 -0
- package/dist/{chunk-HLGPGHT7.js → chunk-EVPG26CR.js} +3 -3
- package/dist/{chunk-YRUJ5KGV.js → chunk-GDCSPMH4.js} +3 -3
- package/dist/{chunk-LUQBT2Y4.js → chunk-HHZ3RTEI.js} +2 -2
- package/dist/{chunk-TCGOSLW6.js → chunk-JJXVDCEX.js} +613 -98
- package/dist/chunk-JJXVDCEX.js.map +1 -0
- package/dist/{chunk-D4ESHOOJ.js → chunk-KNTJOMWY.js} +3 -3
- package/dist/{chunk-JHLALJPB.js → chunk-LD6U3L6O.js} +8 -8
- package/dist/{chunk-7NBDELZB.js → chunk-NVCGF2DS.js} +26 -8
- package/dist/{chunk-7NBDELZB.js.map → chunk-NVCGF2DS.js.map} +1 -1
- package/dist/{chunk-SW62AX75.js → chunk-OKCSSDFC.js} +2 -2
- package/dist/{chunk-RR75ZKEV.js → chunk-OQVKLTQY.js} +4 -4
- package/dist/{chunk-OAGY5APE.js → chunk-PSYLKCWQ.js} +83 -7
- package/dist/chunk-PSYLKCWQ.js.map +1 -0
- package/dist/{chunk-Q2AYS2QE.js → chunk-PX5KIOKY.js} +5 -7
- package/dist/chunk-PX5KIOKY.js.map +1 -0
- package/dist/chunk-QLCD77AN.js +93 -0
- package/dist/chunk-QLCD77AN.js.map +1 -0
- package/dist/{chunk-J3L2RTYK.js → chunk-RBFECYNA.js} +2 -2
- package/dist/{chunk-4VSNNMEU.js → chunk-S66YG6QK.js} +26 -3
- package/dist/{chunk-4VSNNMEU.js.map → chunk-S66YG6QK.js.map} +1 -1
- package/dist/chunk-SBVDG5JP.js +112 -0
- package/dist/chunk-SBVDG5JP.js.map +1 -0
- package/dist/{chunk-M5XWW7UI.js → chunk-SODRR3HE.js} +8 -1
- package/dist/chunk-SODRR3HE.js.map +1 -0
- package/dist/{chunk-SFC4GXEN.js → chunk-TNCBMGWB.js} +39 -104
- package/dist/chunk-TNCBMGWB.js.map +1 -0
- package/dist/{chunk-PIRWYDOH.js → chunk-TRA3R4EC.js} +7 -1
- package/dist/chunk-TRA3R4EC.js.map +1 -0
- package/dist/{chunk-LGPBVBFY.js → chunk-TVV6PZOC.js} +5 -7
- package/dist/chunk-TVV6PZOC.js.map +1 -0
- package/dist/{chunk-SVQAPEYH.js → chunk-UWXJCLCK.js} +22 -5
- package/dist/chunk-UWXJCLCK.js.map +1 -0
- package/dist/{chunk-JROOQQH6.js → chunk-X34OFKYU.js} +12 -7
- package/dist/chunk-X34OFKYU.js.map +1 -0
- package/dist/{chunk-FYGFMIS6.js → chunk-ZKXW46HZ.js} +2 -2
- package/dist/{cli-CFOIDXOY.js → cli-SKCINMJI.js} +41 -40
- package/dist/{cli-CFOIDXOY.js.map → cli-SKCINMJI.js.map} +1 -1
- package/dist/{client-ZBCGODTS.js → client-KZGZHHXT.js} +5 -5
- package/dist/{config-6RQ7FAEV.js → config-H657SF6B.js} +5 -3
- package/dist/{config-6RQ7FAEV.js.map → config-H657SF6B.js.map} +1 -1
- package/dist/{detect-providers-JFE3QLJI.js → detect-providers-PAVE2X6O.js} +4 -4
- package/dist/{doctor-W3I7RVU4.js → doctor-6FKSHJRU.js} +13 -11
- package/dist/{doctor-W3I7RVU4.js.map → doctor-6FKSHJRU.js.map} +1 -1
- package/dist/{executor-LKDWMGC7.js → executor-W5MKZH7B.js} +407 -46
- package/dist/executor-W5MKZH7B.js.map +1 -0
- package/dist/{init-M3HYJGHE.js → init-5QHCXBLF.js} +16 -15
- package/dist/{init-M3HYJGHE.js.map → init-5QHCXBLF.js.map} +1 -1
- package/dist/{init-wizard-C4WQA47U.js → init-wizard-HEY4HMG3.js} +12 -12
- package/dist/installer-25TSX4SR.js +13 -0
- package/dist/{llm-O46QYWEM.js → llm-T3QVHC3Y.js} +7 -7
- package/dist/{loader-4FMGOVWF.js → loader-JQLO6K44.js} +4 -2
- package/dist/{loader-BQ4X4K3F.js → loader-WQKVWL5D.js} +4 -4
- package/dist/{main-CMWNMCW2.js → main-IZ277SHB.js} +689 -124
- package/dist/main-IZ277SHB.js.map +1 -0
- package/dist/{open-4N7T37XV.js → open-S7YUWON4.js} +8 -7
- package/dist/{open-4N7T37XV.js.map → open-S7YUWON4.js.map} +1 -1
- package/dist/{openai-embeddings-HWAKOGUM.js → openai-embeddings-5T5ZP7LO.js} +4 -4
- package/dist/{openrouter-GXZK7JXR.js → openrouter-RD2COFC7.js} +4 -4
- package/dist/{post-compact-BPICHUPV.js → post-compact-EFKFT7TM.js} +7 -7
- package/dist/{post-tool-use-OHJ2EH7I.js → post-tool-use-624YC6ZH.js} +7 -7
- package/dist/{post-tool-use-failure-CBPY2TSN.js → post-tool-use-failure-QCHZAWQH.js} +7 -7
- package/dist/{pre-compact-ULAA4XIB.js → pre-compact-7DWH2EM3.js} +7 -7
- package/dist/{provider-check-CKZW3GQX.js → provider-check-QN7OGXZA.js} +4 -4
- package/dist/{registry-ZHUVXGPO.js → registry-2XQMCPA6.js} +5 -5
- package/dist/{remove-52PTVOCJ.js → remove-ESVIET5C.js} +10 -8
- package/dist/{remove-52PTVOCJ.js.map → remove-ESVIET5C.js.map} +1 -1
- package/dist/{resolution-events-WZHPQQMN.js → resolution-events-5EVUEWHS.js} +4 -4
- package/dist/{restart-O37BUPLH.js → restart-AZHV6OKM.js} +9 -8
- package/dist/{restart-O37BUPLH.js.map → restart-AZHV6OKM.js.map} +1 -1
- package/dist/{search-52YK2ZWU.js → search-JS4HXYGS.js} +9 -8
- package/dist/{search-52YK2ZWU.js.map → search-JS4HXYGS.js.map} +1 -1
- package/dist/{server-7OKRAJCM.js → server-KT5GW333.js} +115 -14
- package/dist/server-KT5GW333.js.map +1 -0
- package/dist/{session-57IAZYRK.js → session-JSI67FEM.js} +10 -9
- package/dist/{session-57IAZYRK.js.map → session-JSI67FEM.js.map} +1 -1
- package/dist/{session-end-WRKDJEWM.js → session-end-4CM462MC.js} +6 -6
- package/dist/{session-start-7VWGEVOX.js → session-start-ZGF7F6DE.js} +12 -12
- package/dist/{setup-llm-IDQPX22O.js → setup-llm-S2UYJYIS.js} +10 -9
- package/dist/{setup-llm-IDQPX22O.js.map → setup-llm-S2UYJYIS.js.map} +1 -1
- package/dist/src/agent/definitions/agent.yaml +2 -0
- package/dist/src/agent/definitions/tasks/digest-only.yaml +1 -0
- package/dist/src/agent/definitions/tasks/extract-only.yaml +1 -0
- package/dist/src/agent/definitions/tasks/full-intelligence.yaml +8 -0
- package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +1 -0
- package/dist/src/agent/definitions/tasks/review-session.yaml +1 -0
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +155 -0
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +210 -0
- package/dist/src/agent/definitions/tasks/skill-survey.yaml +149 -0
- package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +1 -0
- package/dist/src/agent/definitions/tasks/title-summary.yaml +1 -0
- package/dist/src/agent/prompts/agent.md +29 -0
- 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/worker/src/index.ts +3 -0
- package/dist/src/worker/src/schema.ts +56 -0
- package/dist/{stats-D7U5HQ3L.js → stats-D2FM6ZXO.js} +10 -9
- package/dist/{stats-D7U5HQ3L.js.map → stats-D2FM6ZXO.js.map} +1 -1
- package/dist/{stop-VJU4AAOQ.js → stop-DQEKVNST.js} +6 -6
- package/dist/{stop-failure-ILPHO26U.js → stop-failure-EHH7AN5E.js} +7 -7
- package/dist/{subagent-start-77MY4UMP.js → subagent-start-6R52PAFA.js} +7 -7
- package/dist/{subagent-stop-DABERMXZ.js → subagent-stop-CLDFJKYQ.js} +7 -7
- package/dist/{task-completed-TBWBOAJ6.js → task-completed-V47JA3OV.js} +7 -7
- package/dist/{team-K6H4B3ZD.js → team-SJPDXELY.js} +45 -19
- package/dist/team-SJPDXELY.js.map +1 -0
- package/dist/turns-3ZQAF6HF.js +16 -0
- package/dist/turns-3ZQAF6HF.js.map +1 -0
- package/dist/ui/assets/index-BmsHIwjl.css +1 -0
- package/dist/ui/assets/index-Cn6cQwJy.js +842 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-GW774ZMW.js → update-ZNIYDQHJ.js} +8 -7
- package/dist/{update-GW774ZMW.js.map → update-ZNIYDQHJ.js.map} +1 -1
- package/dist/{user-prompt-submit-C47Y5Y5I.js → user-prompt-submit-6TX6VECI.js} +6 -6
- package/dist/{verify-MQAANTUR.js → verify-JHIMXTY5.js} +8 -8
- package/dist/{version-42DQW43N.js → version-UMEN7OJU.js} +2 -2
- package/dist/version-UMEN7OJU.js.map +1 -0
- package/package.json +6 -6
- package/dist/chunk-D4M2AV65.js.map +0 -1
- package/dist/chunk-JROOQQH6.js.map +0 -1
- package/dist/chunk-LGPBVBFY.js.map +0 -1
- package/dist/chunk-M5XWW7UI.js.map +0 -1
- package/dist/chunk-OAGY5APE.js.map +0 -1
- package/dist/chunk-PIRWYDOH.js.map +0 -1
- package/dist/chunk-PW5QVY44.js.map +0 -1
- package/dist/chunk-Q2AYS2QE.js.map +0 -1
- package/dist/chunk-SFC4GXEN.js.map +0 -1
- package/dist/chunk-SVQAPEYH.js.map +0 -1
- package/dist/chunk-TCGOSLW6.js.map +0 -1
- package/dist/executor-LKDWMGC7.js.map +0 -1
- package/dist/main-CMWNMCW2.js.map +0 -1
- package/dist/server-7OKRAJCM.js.map +0 -1
- package/dist/team-K6H4B3ZD.js.map +0 -1
- package/dist/ui/assets/index-BGbil7f1.css +0 -1
- package/dist/ui/assets/index-ZSGlKT25.js +0 -804
- /package/dist/{chunk-QL2RBFIC.js.map → chunk-5YQ6VOFZ.js.map} +0 -0
- /package/dist/{chunk-MCARJFBA.js.map → chunk-745SWTQX.js.map} +0 -0
- /package/dist/{chunk-HLGPGHT7.js.map → chunk-EVPG26CR.js.map} +0 -0
- /package/dist/{chunk-YRUJ5KGV.js.map → chunk-GDCSPMH4.js.map} +0 -0
- /package/dist/{chunk-LUQBT2Y4.js.map → chunk-HHZ3RTEI.js.map} +0 -0
- /package/dist/{chunk-D4ESHOOJ.js.map → chunk-KNTJOMWY.js.map} +0 -0
- /package/dist/{chunk-JHLALJPB.js.map → chunk-LD6U3L6O.js.map} +0 -0
- /package/dist/{chunk-SW62AX75.js.map → chunk-OKCSSDFC.js.map} +0 -0
- /package/dist/{chunk-RR75ZKEV.js.map → chunk-OQVKLTQY.js.map} +0 -0
- /package/dist/{chunk-J3L2RTYK.js.map → chunk-RBFECYNA.js.map} +0 -0
- /package/dist/{chunk-FYGFMIS6.js.map → chunk-ZKXW46HZ.js.map} +0 -0
- /package/dist/{client-ZBCGODTS.js.map → client-KZGZHHXT.js.map} +0 -0
- /package/dist/{detect-providers-JFE3QLJI.js.map → detect-providers-PAVE2X6O.js.map} +0 -0
- /package/dist/{init-wizard-C4WQA47U.js.map → init-wizard-HEY4HMG3.js.map} +0 -0
- /package/dist/{llm-O46QYWEM.js.map → installer-25TSX4SR.js.map} +0 -0
- /package/dist/{loader-4FMGOVWF.js.map → llm-T3QVHC3Y.js.map} +0 -0
- /package/dist/{loader-BQ4X4K3F.js.map → loader-JQLO6K44.js.map} +0 -0
- /package/dist/{openai-embeddings-HWAKOGUM.js.map → loader-WQKVWL5D.js.map} +0 -0
- /package/dist/{openrouter-GXZK7JXR.js.map → openai-embeddings-5T5ZP7LO.js.map} +0 -0
- /package/dist/{provider-check-CKZW3GQX.js.map → openrouter-RD2COFC7.js.map} +0 -0
- /package/dist/{post-compact-BPICHUPV.js.map → post-compact-EFKFT7TM.js.map} +0 -0
- /package/dist/{post-tool-use-OHJ2EH7I.js.map → post-tool-use-624YC6ZH.js.map} +0 -0
- /package/dist/{post-tool-use-failure-CBPY2TSN.js.map → post-tool-use-failure-QCHZAWQH.js.map} +0 -0
- /package/dist/{pre-compact-ULAA4XIB.js.map → pre-compact-7DWH2EM3.js.map} +0 -0
- /package/dist/{registry-ZHUVXGPO.js.map → provider-check-QN7OGXZA.js.map} +0 -0
- /package/dist/{resolution-events-WZHPQQMN.js.map → registry-2XQMCPA6.js.map} +0 -0
- /package/dist/{version-42DQW43N.js.map → resolution-events-5EVUEWHS.js.map} +0 -0
- /package/dist/{session-end-WRKDJEWM.js.map → session-end-4CM462MC.js.map} +0 -0
- /package/dist/{session-start-7VWGEVOX.js.map → session-start-ZGF7F6DE.js.map} +0 -0
- /package/dist/{stop-VJU4AAOQ.js.map → stop-DQEKVNST.js.map} +0 -0
- /package/dist/{stop-failure-ILPHO26U.js.map → stop-failure-EHH7AN5E.js.map} +0 -0
- /package/dist/{subagent-start-77MY4UMP.js.map → subagent-start-6R52PAFA.js.map} +0 -0
- /package/dist/{subagent-stop-DABERMXZ.js.map → subagent-stop-CLDFJKYQ.js.map} +0 -0
- /package/dist/{task-completed-TBWBOAJ6.js.map → task-completed-V47JA3OV.js.map} +0 -0
- /package/dist/{user-prompt-submit-C47Y5Y5I.js.map → user-prompt-submit-6TX6VECI.js.map} +0 -0
- /package/dist/{verify-MQAANTUR.js.map → verify-JHIMXTY5.js.map} +0 -0
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
+
getTeamMachineId,
|
|
3
4
|
syncRow
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-S66YG6QK.js";
|
|
6
|
+
import {
|
|
7
|
+
loadConfig
|
|
8
|
+
} from "./chunk-PSYLKCWQ.js";
|
|
5
9
|
import {
|
|
6
10
|
getDatabase
|
|
7
11
|
} from "./chunk-MYX5NCRH.js";
|
|
8
12
|
import {
|
|
9
|
-
|
|
13
|
+
DEFAULT_LIST_LIMIT,
|
|
10
14
|
DIGEST_TIERS,
|
|
11
15
|
EDGE_TYPE_DERIVED_FROM,
|
|
12
16
|
EDGE_TYPE_EXTRACTED_FROM,
|
|
13
17
|
EDGE_TYPE_FROM_SESSION,
|
|
14
18
|
EDGE_TYPE_HAS_BATCH,
|
|
15
19
|
GRAPH_EDGE_DEFAULT_CONFIDENCE,
|
|
16
|
-
QUERY_DEFAULT_LIST_LIMIT
|
|
17
|
-
|
|
20
|
+
QUERY_DEFAULT_LIST_LIMIT,
|
|
21
|
+
epochSeconds
|
|
22
|
+
} from "./chunk-TRA3R4EC.js";
|
|
18
23
|
|
|
19
24
|
// src/db/queries/batches.ts
|
|
20
25
|
var DEFAULT_UNPROCESSED_LIMIT = 100;
|
|
@@ -58,7 +63,7 @@ function toBatchRow(row) {
|
|
|
58
63
|
processed: row.processed,
|
|
59
64
|
content_hash: row.content_hash ?? null,
|
|
60
65
|
created_at: row.created_at,
|
|
61
|
-
machine_id: row.machine_id ??
|
|
66
|
+
machine_id: row.machine_id ?? "local",
|
|
62
67
|
synced_at: row.synced_at ?? null
|
|
63
68
|
};
|
|
64
69
|
}
|
|
@@ -154,13 +159,9 @@ function insertBatchStateless(data) {
|
|
|
154
159
|
DEFAULT_ACTIVITY_COUNT,
|
|
155
160
|
DEFAULT_PROCESSED,
|
|
156
161
|
data.created_at,
|
|
157
|
-
|
|
162
|
+
data.machine_id ?? getTeamMachineId()
|
|
158
163
|
);
|
|
159
164
|
const batchId = Number(info.lastInsertRowid);
|
|
160
|
-
const userPrompt = data.user_prompt ?? null;
|
|
161
|
-
if (userPrompt) {
|
|
162
|
-
db.prepare("INSERT INTO prompt_batches_fts(rowid, user_prompt) VALUES (?, ?)").run(batchId, userPrompt);
|
|
163
|
-
}
|
|
164
165
|
return toBatchRow(
|
|
165
166
|
db.prepare(`SELECT ${SELECT_COLUMNS} FROM prompt_batches WHERE id = ?`).get(batchId)
|
|
166
167
|
);
|
|
@@ -204,6 +205,132 @@ function listBatchesBySession(sessionId, options = {}) {
|
|
|
204
205
|
).all(sessionId, limit, offset);
|
|
205
206
|
return rows.map(toBatchRow);
|
|
206
207
|
}
|
|
208
|
+
function countBatchesBySession(sessionId) {
|
|
209
|
+
const db = getDatabase();
|
|
210
|
+
const row = db.prepare(
|
|
211
|
+
`SELECT COUNT(*) as count FROM prompt_batches WHERE session_id = ?`
|
|
212
|
+
).get(sessionId);
|
|
213
|
+
return row.count;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/notifications/notify.ts
|
|
217
|
+
import crypto from "crypto";
|
|
218
|
+
|
|
219
|
+
// src/db/queries/notifications.ts
|
|
220
|
+
var DEFAULT_LIMIT = 50;
|
|
221
|
+
var NOTIFICATION_PRUNE_AGE_SECONDS = 30 * 24 * 60 * 60;
|
|
222
|
+
function insertNotification(n) {
|
|
223
|
+
const db = getDatabase();
|
|
224
|
+
db.prepare(
|
|
225
|
+
`INSERT INTO notifications (id, domain, type, level, title, message, mode, status, link, metadata, created_at)
|
|
226
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 'unread', ?, ?, ?)`
|
|
227
|
+
).run(n.id, n.domain, n.type, n.level, n.title, n.message, n.mode, n.link, n.metadata, epochSeconds());
|
|
228
|
+
}
|
|
229
|
+
function listNotifications(opts = {}) {
|
|
230
|
+
const db = getDatabase();
|
|
231
|
+
const conditions = [];
|
|
232
|
+
const params = [];
|
|
233
|
+
if (opts.status) {
|
|
234
|
+
conditions.push("status = ?");
|
|
235
|
+
params.push(opts.status);
|
|
236
|
+
}
|
|
237
|
+
if (opts.domain) {
|
|
238
|
+
conditions.push("domain = ?");
|
|
239
|
+
params.push(opts.domain);
|
|
240
|
+
}
|
|
241
|
+
if (opts.mode) {
|
|
242
|
+
conditions.push("mode = ?");
|
|
243
|
+
params.push(opts.mode);
|
|
244
|
+
}
|
|
245
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
246
|
+
const limit = opts.limit ?? DEFAULT_LIMIT;
|
|
247
|
+
const offset = opts.offset ?? 0;
|
|
248
|
+
return db.prepare(
|
|
249
|
+
`SELECT * FROM notifications ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
|
250
|
+
).all(...params, limit, offset);
|
|
251
|
+
}
|
|
252
|
+
function countNotifications(status) {
|
|
253
|
+
const db = getDatabase();
|
|
254
|
+
if (status) {
|
|
255
|
+
const row2 = db.prepare("SELECT COUNT(*) as count FROM notifications WHERE status = ?").get(status);
|
|
256
|
+
return row2.count;
|
|
257
|
+
}
|
|
258
|
+
const row = db.prepare("SELECT COUNT(*) as count FROM notifications").get();
|
|
259
|
+
return row.count;
|
|
260
|
+
}
|
|
261
|
+
function getNotification(id) {
|
|
262
|
+
const db = getDatabase();
|
|
263
|
+
return db.prepare("SELECT * FROM notifications WHERE id = ?").get(id);
|
|
264
|
+
}
|
|
265
|
+
function updateNotificationStatus(id, status) {
|
|
266
|
+
const db = getDatabase();
|
|
267
|
+
const result = db.prepare("UPDATE notifications SET status = ? WHERE id = ?").run(status, id);
|
|
268
|
+
return result.changes > 0;
|
|
269
|
+
}
|
|
270
|
+
function dismissAllNotifications(domain) {
|
|
271
|
+
const db = getDatabase();
|
|
272
|
+
if (domain) {
|
|
273
|
+
const result2 = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE domain = ? AND status != 'dismissed'").run(domain);
|
|
274
|
+
return result2.changes;
|
|
275
|
+
}
|
|
276
|
+
const result = db.prepare("UPDATE notifications SET status = 'dismissed' WHERE status != 'dismissed'").run();
|
|
277
|
+
return result.changes;
|
|
278
|
+
}
|
|
279
|
+
function markAllRead(domain) {
|
|
280
|
+
const db = getDatabase();
|
|
281
|
+
if (domain) {
|
|
282
|
+
const result2 = db.prepare("UPDATE notifications SET status = 'read' WHERE domain = ? AND status = 'unread'").run(domain);
|
|
283
|
+
return result2.changes;
|
|
284
|
+
}
|
|
285
|
+
const result = db.prepare("UPDATE notifications SET status = 'read' WHERE status = 'unread'").run();
|
|
286
|
+
return result.changes;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// src/notifications/registry.ts
|
|
290
|
+
var domains = /* @__PURE__ */ new Map();
|
|
291
|
+
function register(descriptor) {
|
|
292
|
+
domains.set(descriptor.domain, descriptor);
|
|
293
|
+
}
|
|
294
|
+
function getAllDomains() {
|
|
295
|
+
return [...domains.values()].sort((a, b) => a.domain.localeCompare(b.domain));
|
|
296
|
+
}
|
|
297
|
+
function getType(typeId) {
|
|
298
|
+
for (const descriptor of domains.values()) {
|
|
299
|
+
const match = descriptor.types.find((t) => t.id === typeId);
|
|
300
|
+
if (match) return { domain: descriptor, type: match };
|
|
301
|
+
}
|
|
302
|
+
return void 0;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/notifications/notify.ts
|
|
306
|
+
function notify(vaultDir, payload, config) {
|
|
307
|
+
if (!vaultDir) return null;
|
|
308
|
+
try {
|
|
309
|
+
const cfg = config ?? loadConfig(vaultDir);
|
|
310
|
+
if (!cfg.notifications.enabled) return null;
|
|
311
|
+
const domainConfig = cfg.notifications.domains[payload.domain];
|
|
312
|
+
if (domainConfig && !domainConfig.enabled) return null;
|
|
313
|
+
const registeredType = getType(payload.type);
|
|
314
|
+
const mode = payload.mode ?? domainConfig?.mode ?? registeredType?.type.defaultMode ?? cfg.notifications.default_mode;
|
|
315
|
+
const level = payload.level ?? registeredType?.type.defaultLevel ?? "info";
|
|
316
|
+
const id = crypto.randomUUID();
|
|
317
|
+
insertNotification({
|
|
318
|
+
id,
|
|
319
|
+
domain: payload.domain,
|
|
320
|
+
type: payload.type,
|
|
321
|
+
level,
|
|
322
|
+
title: payload.title,
|
|
323
|
+
message: payload.message ?? null,
|
|
324
|
+
mode,
|
|
325
|
+
link: payload.link ?? null,
|
|
326
|
+
metadata: payload.metadata ? JSON.stringify(payload.metadata) : null
|
|
327
|
+
});
|
|
328
|
+
return id;
|
|
329
|
+
} catch (err) {
|
|
330
|
+
console.warn("[notify] Failed to emit notification:", err instanceof Error ? err.message : err);
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
207
334
|
|
|
208
335
|
// src/utils/error-message.ts
|
|
209
336
|
function errorMessage(err) {
|
|
@@ -216,74 +343,359 @@ function errorMessage(err) {
|
|
|
216
343
|
}
|
|
217
344
|
}
|
|
218
345
|
|
|
219
|
-
// src/db/queries/
|
|
220
|
-
var
|
|
346
|
+
// src/db/queries/skill-candidates.ts
|
|
347
|
+
var DEFAULT_CONFIDENCE = 0;
|
|
348
|
+
var DEFAULT_STATUS2 = "identified";
|
|
349
|
+
var CANDIDATE_COLUMNS = [
|
|
221
350
|
"id",
|
|
222
|
-
"run_id",
|
|
223
351
|
"agent_id",
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
"
|
|
228
|
-
"
|
|
229
|
-
"
|
|
352
|
+
"machine_id",
|
|
353
|
+
"topic",
|
|
354
|
+
"rationale",
|
|
355
|
+
"confidence",
|
|
356
|
+
"status",
|
|
357
|
+
"source_ids",
|
|
358
|
+
"skill_id",
|
|
359
|
+
"created_at",
|
|
360
|
+
"updated_at",
|
|
361
|
+
"synced_at"
|
|
230
362
|
];
|
|
231
|
-
var SELECT_COLUMNS2 =
|
|
232
|
-
function
|
|
363
|
+
var SELECT_COLUMNS2 = CANDIDATE_COLUMNS.join(", ");
|
|
364
|
+
function toCandidateRow(row) {
|
|
233
365
|
return {
|
|
234
366
|
id: row.id,
|
|
235
|
-
run_id: row.run_id,
|
|
236
367
|
agent_id: row.agent_id,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
368
|
+
machine_id: row.machine_id ?? getTeamMachineId(),
|
|
369
|
+
topic: row.topic,
|
|
370
|
+
rationale: row.rationale,
|
|
371
|
+
confidence: row.confidence,
|
|
372
|
+
status: row.status,
|
|
373
|
+
source_ids: row.source_ids ?? "[]",
|
|
374
|
+
skill_id: row.skill_id ?? null,
|
|
375
|
+
created_at: row.created_at,
|
|
376
|
+
updated_at: row.updated_at,
|
|
377
|
+
synced_at: row.synced_at ?? null
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
function buildWhere(options) {
|
|
381
|
+
const conditions = [];
|
|
382
|
+
const params = [];
|
|
383
|
+
if (options.agent_id !== void 0) {
|
|
384
|
+
conditions.push(`agent_id = ?`);
|
|
385
|
+
params.push(options.agent_id);
|
|
386
|
+
}
|
|
387
|
+
if (options.status !== void 0) {
|
|
388
|
+
conditions.push(`status = ?`);
|
|
389
|
+
params.push(options.status);
|
|
390
|
+
}
|
|
391
|
+
return {
|
|
392
|
+
where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
|
|
393
|
+
params
|
|
243
394
|
};
|
|
244
395
|
}
|
|
245
|
-
function
|
|
396
|
+
function insertCandidate(data) {
|
|
246
397
|
const db = getDatabase();
|
|
247
|
-
|
|
248
|
-
`INSERT INTO
|
|
249
|
-
|
|
250
|
-
|
|
398
|
+
db.prepare(
|
|
399
|
+
`INSERT INTO skill_candidates (
|
|
400
|
+
id, agent_id, machine_id, topic, rationale,
|
|
401
|
+
confidence, status, source_ids, skill_id,
|
|
402
|
+
created_at, updated_at
|
|
251
403
|
) VALUES (
|
|
404
|
+
?, ?, ?, ?, ?,
|
|
252
405
|
?, ?, ?, ?,
|
|
253
|
-
?,
|
|
406
|
+
?, ?
|
|
254
407
|
)`
|
|
255
408
|
).run(
|
|
256
|
-
data.
|
|
409
|
+
data.id,
|
|
257
410
|
data.agent_id,
|
|
258
|
-
data.
|
|
259
|
-
data.
|
|
260
|
-
data.
|
|
261
|
-
data.
|
|
262
|
-
data.
|
|
263
|
-
data.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
db.prepare(`SELECT ${SELECT_COLUMNS2} FROM agent_turns WHERE id = ?`).get(turnId)
|
|
411
|
+
data.machine_id ?? getTeamMachineId(),
|
|
412
|
+
data.topic,
|
|
413
|
+
data.rationale,
|
|
414
|
+
data.confidence ?? DEFAULT_CONFIDENCE,
|
|
415
|
+
data.status ?? DEFAULT_STATUS2,
|
|
416
|
+
data.source_ids ?? "[]",
|
|
417
|
+
data.skill_id ?? null,
|
|
418
|
+
data.created_at,
|
|
419
|
+
data.updated_at
|
|
268
420
|
);
|
|
421
|
+
const raw = db.prepare(`SELECT ${SELECT_COLUMNS2} FROM skill_candidates WHERE id = ?`).get(data.id);
|
|
422
|
+
if (!raw) throw new Error(`Failed to insert skill candidate: ${data.id}`);
|
|
423
|
+
const row = toCandidateRow(raw);
|
|
424
|
+
syncRow("skill_candidates", row);
|
|
425
|
+
return row;
|
|
426
|
+
}
|
|
427
|
+
function getCandidate(id) {
|
|
428
|
+
const db = getDatabase();
|
|
429
|
+
const row = db.prepare(
|
|
430
|
+
`SELECT ${SELECT_COLUMNS2} FROM skill_candidates WHERE id = ?`
|
|
431
|
+
).get(id);
|
|
432
|
+
if (!row) return null;
|
|
433
|
+
return toCandidateRow(row);
|
|
269
434
|
}
|
|
270
|
-
function
|
|
435
|
+
function listCandidates(options = {}) {
|
|
271
436
|
const db = getDatabase();
|
|
437
|
+
const { where, params } = buildWhere(options);
|
|
438
|
+
const limit = options.limit ?? DEFAULT_LIST_LIMIT;
|
|
439
|
+
const offset = options.offset ?? 0;
|
|
272
440
|
const rows = db.prepare(
|
|
273
441
|
`SELECT ${SELECT_COLUMNS2}
|
|
274
|
-
FROM
|
|
275
|
-
|
|
276
|
-
ORDER BY
|
|
277
|
-
|
|
278
|
-
|
|
442
|
+
FROM skill_candidates
|
|
443
|
+
${where}
|
|
444
|
+
ORDER BY confidence DESC, created_at DESC
|
|
445
|
+
LIMIT ?
|
|
446
|
+
OFFSET ?`
|
|
447
|
+
).all(...params, limit, offset);
|
|
448
|
+
return rows.map(toCandidateRow);
|
|
449
|
+
}
|
|
450
|
+
function updateCandidate(id, updates) {
|
|
451
|
+
const db = getDatabase();
|
|
452
|
+
const setClauses = [];
|
|
453
|
+
const params = [];
|
|
454
|
+
const fieldMap = {
|
|
455
|
+
topic: "topic",
|
|
456
|
+
rationale: "rationale",
|
|
457
|
+
confidence: "confidence",
|
|
458
|
+
status: "status",
|
|
459
|
+
source_ids: "source_ids",
|
|
460
|
+
skill_id: "skill_id",
|
|
461
|
+
updated_at: "updated_at"
|
|
462
|
+
};
|
|
463
|
+
for (const [key, column] of Object.entries(fieldMap)) {
|
|
464
|
+
if (key in updates) {
|
|
465
|
+
setClauses.push(`${column} = ?`);
|
|
466
|
+
params.push(updates[key] ?? null);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
if (setClauses.length === 0) return getCandidate(id);
|
|
470
|
+
params.push(id);
|
|
471
|
+
db.prepare(
|
|
472
|
+
`UPDATE skill_candidates
|
|
473
|
+
SET ${setClauses.join(", ")}
|
|
474
|
+
WHERE id = ?`
|
|
475
|
+
).run(...params);
|
|
476
|
+
const updated = getCandidate(id);
|
|
477
|
+
if (updated) syncRow("skill_candidates", updated);
|
|
478
|
+
return updated;
|
|
479
|
+
}
|
|
480
|
+
function listCandidatesWithCount(options = {}) {
|
|
481
|
+
const items = listCandidates(options);
|
|
482
|
+
const total = countCandidates(options);
|
|
483
|
+
return { items, total };
|
|
484
|
+
}
|
|
485
|
+
function countCandidates(options = {}) {
|
|
486
|
+
const db = getDatabase();
|
|
487
|
+
const { where, params } = buildWhere(options);
|
|
488
|
+
const row = db.prepare(
|
|
489
|
+
`SELECT COUNT(*) as count FROM skill_candidates ${where}`
|
|
490
|
+
).get(...params);
|
|
491
|
+
return row.count;
|
|
492
|
+
}
|
|
493
|
+
function deleteCandidate(id) {
|
|
494
|
+
const db = getDatabase();
|
|
495
|
+
const info = db.prepare("DELETE FROM skill_candidates WHERE id = ?").run(id);
|
|
496
|
+
return info.changes > 0;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// src/db/queries/skill-records.ts
|
|
500
|
+
var DEFAULT_STATUS3 = "active";
|
|
501
|
+
var DEFAULT_GENERATION = 1;
|
|
502
|
+
var RECORD_COLUMNS = [
|
|
503
|
+
"id",
|
|
504
|
+
"agent_id",
|
|
505
|
+
"machine_id",
|
|
506
|
+
"name",
|
|
507
|
+
"display_name",
|
|
508
|
+
"description",
|
|
509
|
+
"status",
|
|
510
|
+
"generation",
|
|
511
|
+
"candidate_id",
|
|
512
|
+
"source_ids",
|
|
513
|
+
"path",
|
|
514
|
+
"usage_count",
|
|
515
|
+
"last_used_at",
|
|
516
|
+
"created_at",
|
|
517
|
+
"updated_at",
|
|
518
|
+
"properties",
|
|
519
|
+
"synced_at"
|
|
520
|
+
];
|
|
521
|
+
var SELECT_COLUMNS3 = RECORD_COLUMNS.join(", ");
|
|
522
|
+
function toSkillRecordRow(row) {
|
|
523
|
+
return {
|
|
524
|
+
id: row.id,
|
|
525
|
+
agent_id: row.agent_id,
|
|
526
|
+
machine_id: row.machine_id ?? getTeamMachineId(),
|
|
527
|
+
name: row.name,
|
|
528
|
+
display_name: row.display_name,
|
|
529
|
+
description: row.description,
|
|
530
|
+
status: row.status,
|
|
531
|
+
generation: row.generation,
|
|
532
|
+
candidate_id: row.candidate_id ?? null,
|
|
533
|
+
source_ids: row.source_ids ?? "[]",
|
|
534
|
+
path: row.path,
|
|
535
|
+
usage_count: row.usage_count,
|
|
536
|
+
last_used_at: row.last_used_at ?? null,
|
|
537
|
+
created_at: row.created_at,
|
|
538
|
+
updated_at: row.updated_at,
|
|
539
|
+
properties: row.properties ?? "{}",
|
|
540
|
+
synced_at: row.synced_at ?? null
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
function buildWhere2(options) {
|
|
544
|
+
const conditions = [];
|
|
545
|
+
const params = [];
|
|
546
|
+
if (options.agent_id !== void 0) {
|
|
547
|
+
conditions.push(`agent_id = ?`);
|
|
548
|
+
params.push(options.agent_id);
|
|
549
|
+
}
|
|
550
|
+
if (options.status !== void 0) {
|
|
551
|
+
conditions.push(`status = ?`);
|
|
552
|
+
params.push(options.status);
|
|
553
|
+
}
|
|
554
|
+
return {
|
|
555
|
+
where: conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "",
|
|
556
|
+
params
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
function insertSkillRecord(data) {
|
|
560
|
+
const db = getDatabase();
|
|
561
|
+
db.prepare(
|
|
562
|
+
`INSERT INTO skill_records (
|
|
563
|
+
id, agent_id, machine_id, name, display_name,
|
|
564
|
+
description, status, generation, candidate_id,
|
|
565
|
+
source_ids, path, created_at, updated_at, properties
|
|
566
|
+
) VALUES (
|
|
567
|
+
?, ?, ?, ?, ?,
|
|
568
|
+
?, ?, ?, ?,
|
|
569
|
+
?, ?, ?, ?, ?
|
|
570
|
+
)`
|
|
571
|
+
).run(
|
|
572
|
+
data.id,
|
|
573
|
+
data.agent_id,
|
|
574
|
+
data.machine_id ?? getTeamMachineId(),
|
|
575
|
+
data.name,
|
|
576
|
+
data.display_name,
|
|
577
|
+
data.description,
|
|
578
|
+
data.status ?? DEFAULT_STATUS3,
|
|
579
|
+
data.generation ?? DEFAULT_GENERATION,
|
|
580
|
+
data.candidate_id ?? null,
|
|
581
|
+
data.source_ids ?? "[]",
|
|
582
|
+
data.path,
|
|
583
|
+
data.created_at,
|
|
584
|
+
data.updated_at,
|
|
585
|
+
data.properties ?? "{}"
|
|
586
|
+
);
|
|
587
|
+
const raw = db.prepare(`SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE id = ?`).get(data.id);
|
|
588
|
+
if (!raw) throw new Error(`Failed to insert skill record: ${data.id}`);
|
|
589
|
+
const row = toSkillRecordRow(raw);
|
|
590
|
+
syncRow("skill_records", row);
|
|
591
|
+
return row;
|
|
592
|
+
}
|
|
593
|
+
function getSkillRecord(id) {
|
|
594
|
+
const db = getDatabase();
|
|
595
|
+
const row = db.prepare(
|
|
596
|
+
`SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE id = ?`
|
|
597
|
+
).get(id);
|
|
598
|
+
if (!row) return null;
|
|
599
|
+
return toSkillRecordRow(row);
|
|
600
|
+
}
|
|
601
|
+
function getSkillRecordByName(name) {
|
|
602
|
+
const db = getDatabase();
|
|
603
|
+
const row = db.prepare(
|
|
604
|
+
`SELECT ${SELECT_COLUMNS3} FROM skill_records WHERE name = ?`
|
|
605
|
+
).get(name);
|
|
606
|
+
if (!row) return null;
|
|
607
|
+
return toSkillRecordRow(row);
|
|
608
|
+
}
|
|
609
|
+
function listSkillRecords(options = {}) {
|
|
610
|
+
const db = getDatabase();
|
|
611
|
+
const { where, params } = buildWhere2(options);
|
|
612
|
+
const limit = options.limit ?? DEFAULT_LIST_LIMIT;
|
|
613
|
+
const offset = options.offset ?? 0;
|
|
614
|
+
const rows = db.prepare(
|
|
615
|
+
`SELECT ${SELECT_COLUMNS3}
|
|
616
|
+
FROM skill_records
|
|
617
|
+
${where}
|
|
618
|
+
ORDER BY updated_at DESC
|
|
619
|
+
LIMIT ?
|
|
620
|
+
OFFSET ?`
|
|
621
|
+
).all(...params, limit, offset);
|
|
622
|
+
return rows.map(toSkillRecordRow);
|
|
623
|
+
}
|
|
624
|
+
function updateSkillRecord(id, updates) {
|
|
625
|
+
const db = getDatabase();
|
|
626
|
+
const setClauses = [];
|
|
627
|
+
const params = [];
|
|
628
|
+
const fieldMap = {
|
|
629
|
+
display_name: "display_name",
|
|
630
|
+
description: "description",
|
|
631
|
+
status: "status",
|
|
632
|
+
generation: "generation",
|
|
633
|
+
source_ids: "source_ids",
|
|
634
|
+
path: "path",
|
|
635
|
+
usage_count: "usage_count",
|
|
636
|
+
last_used_at: "last_used_at",
|
|
637
|
+
updated_at: "updated_at",
|
|
638
|
+
properties: "properties"
|
|
639
|
+
};
|
|
640
|
+
for (const [key, column] of Object.entries(fieldMap)) {
|
|
641
|
+
if (key in updates) {
|
|
642
|
+
setClauses.push(`${column} = ?`);
|
|
643
|
+
params.push(updates[key] ?? null);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
if (setClauses.length === 0) return getSkillRecord(id);
|
|
647
|
+
params.push(id);
|
|
648
|
+
db.prepare(
|
|
649
|
+
`UPDATE skill_records
|
|
650
|
+
SET ${setClauses.join(", ")}
|
|
651
|
+
WHERE id = ?`
|
|
652
|
+
).run(...params);
|
|
653
|
+
const updated = getSkillRecord(id);
|
|
654
|
+
if (updated) syncRow("skill_records", updated);
|
|
655
|
+
return updated;
|
|
279
656
|
}
|
|
280
|
-
function
|
|
281
|
-
|
|
657
|
+
function incrementSkillUsageCount(id, now) {
|
|
658
|
+
const db = getDatabase();
|
|
659
|
+
db.prepare(
|
|
660
|
+
`UPDATE skill_records SET usage_count = usage_count + 1, last_used_at = ?, updated_at = ? WHERE id = ?`
|
|
661
|
+
).run(now, now, id);
|
|
662
|
+
}
|
|
663
|
+
function listSkillRecordsWithCount(options = {}) {
|
|
664
|
+
const items = listSkillRecords(options);
|
|
665
|
+
const total = countSkillRecords(options);
|
|
666
|
+
return { items, total };
|
|
667
|
+
}
|
|
668
|
+
function countSkillRecords(options = {}) {
|
|
669
|
+
const db = getDatabase();
|
|
670
|
+
const { where, params } = buildWhere2(options);
|
|
671
|
+
const row = db.prepare(
|
|
672
|
+
`SELECT COUNT(*) as count FROM skill_records ${where}`
|
|
673
|
+
).get(...params);
|
|
674
|
+
return row.count;
|
|
675
|
+
}
|
|
676
|
+
function deleteSkillRecordCascade(idOrName) {
|
|
677
|
+
const db = getDatabase();
|
|
678
|
+
const record = getSkillRecord(idOrName) ?? getSkillRecordByName(idOrName);
|
|
679
|
+
if (!record) return null;
|
|
680
|
+
db.transaction(() => {
|
|
681
|
+
db.prepare("DELETE FROM skill_lineage WHERE skill_id = ?").run(record.id);
|
|
682
|
+
db.prepare("DELETE FROM skill_usage WHERE skill_id = ?").run(record.id);
|
|
683
|
+
if (record.candidate_id) {
|
|
684
|
+
db.prepare(
|
|
685
|
+
`UPDATE skill_candidates SET status = 'dismissed', skill_id = NULL, updated_at = ? WHERE id = ?`
|
|
686
|
+
).run(Math.floor(Date.now() / 1e3), record.candidate_id);
|
|
687
|
+
}
|
|
688
|
+
db.prepare(
|
|
689
|
+
`UPDATE skill_candidates SET status = 'dismissed', skill_id = NULL, updated_at = ? WHERE skill_id = ?`
|
|
690
|
+
).run(Math.floor(Date.now() / 1e3), record.id);
|
|
691
|
+
db.prepare("DELETE FROM skill_records WHERE id = ?").run(record.id);
|
|
692
|
+
})();
|
|
693
|
+
return { id: record.id, name: record.name };
|
|
282
694
|
}
|
|
283
695
|
|
|
284
696
|
// src/db/queries/runs.ts
|
|
285
|
-
var
|
|
286
|
-
var
|
|
697
|
+
var DEFAULT_LIST_LIMIT2 = 100;
|
|
698
|
+
var DEFAULT_STATUS4 = "pending";
|
|
287
699
|
var STATUS_RUNNING = "running";
|
|
288
700
|
var STATUS_COMPLETED2 = "completed";
|
|
289
701
|
var STATUS_FAILED = "failed";
|
|
@@ -300,7 +712,7 @@ var RUN_COLUMNS = [
|
|
|
300
712
|
"actions_taken",
|
|
301
713
|
"error"
|
|
302
714
|
];
|
|
303
|
-
var
|
|
715
|
+
var SELECT_COLUMNS4 = RUN_COLUMNS.join(", ");
|
|
304
716
|
function toRunRow(row) {
|
|
305
717
|
return {
|
|
306
718
|
id: row.id,
|
|
@@ -333,7 +745,7 @@ function insertRun(data) {
|
|
|
333
745
|
data.agent_id,
|
|
334
746
|
data.task ?? null,
|
|
335
747
|
data.instruction ?? null,
|
|
336
|
-
data.status ??
|
|
748
|
+
data.status ?? DEFAULT_STATUS4,
|
|
337
749
|
data.started_at ?? null,
|
|
338
750
|
data.completed_at ?? null,
|
|
339
751
|
data.tokens_used ?? null,
|
|
@@ -342,13 +754,13 @@ function insertRun(data) {
|
|
|
342
754
|
data.error ?? null
|
|
343
755
|
);
|
|
344
756
|
return toRunRow(
|
|
345
|
-
db.prepare(`SELECT ${
|
|
757
|
+
db.prepare(`SELECT ${SELECT_COLUMNS4} FROM agent_runs WHERE id = ?`).get(data.id)
|
|
346
758
|
);
|
|
347
759
|
}
|
|
348
760
|
function getRun(id) {
|
|
349
761
|
const db = getDatabase();
|
|
350
762
|
const row = db.prepare(
|
|
351
|
-
`SELECT ${
|
|
763
|
+
`SELECT ${SELECT_COLUMNS4} FROM agent_runs WHERE id = ?`
|
|
352
764
|
).get(id);
|
|
353
765
|
if (!row) return null;
|
|
354
766
|
return toRunRow(row);
|
|
@@ -380,10 +792,10 @@ function buildRunsWhere(options) {
|
|
|
380
792
|
function listRuns(options = {}) {
|
|
381
793
|
const db = getDatabase();
|
|
382
794
|
const { where, params } = buildRunsWhere(options);
|
|
383
|
-
const limit = options.limit ??
|
|
795
|
+
const limit = options.limit ?? DEFAULT_LIST_LIMIT2;
|
|
384
796
|
const offset = options.offset ?? 0;
|
|
385
797
|
const rows = db.prepare(
|
|
386
|
-
`SELECT ${
|
|
798
|
+
`SELECT ${SELECT_COLUMNS4}
|
|
387
799
|
FROM agent_runs
|
|
388
800
|
${where}
|
|
389
801
|
ORDER BY started_at DESC NULLS LAST
|
|
@@ -432,20 +844,36 @@ function updateRunStatus(id, status, completion) {
|
|
|
432
844
|
).run(...params);
|
|
433
845
|
if (info.changes === 0) return null;
|
|
434
846
|
return toRunRow(
|
|
435
|
-
db.prepare(`SELECT ${
|
|
847
|
+
db.prepare(`SELECT ${SELECT_COLUMNS4} FROM agent_runs WHERE id = ?`).get(id)
|
|
436
848
|
);
|
|
437
849
|
}
|
|
438
|
-
function
|
|
850
|
+
function getRunningRunForTask(agentId, taskName) {
|
|
439
851
|
const db = getDatabase();
|
|
440
852
|
const row = db.prepare(
|
|
441
|
-
`SELECT
|
|
442
|
-
|
|
443
|
-
WHERE agent_id = ? AND status = ?
|
|
444
|
-
ORDER BY started_at DESC NULLS LAST
|
|
853
|
+
`SELECT id FROM agent_runs
|
|
854
|
+
WHERE agent_id = ? AND task = ? AND status = ?
|
|
445
855
|
LIMIT 1`
|
|
446
|
-
).get(agentId, STATUS_RUNNING);
|
|
447
|
-
|
|
448
|
-
|
|
856
|
+
).get(agentId, taskName, STATUS_RUNNING);
|
|
857
|
+
return row?.id ?? null;
|
|
858
|
+
}
|
|
859
|
+
function getLatestRunId(agentId, taskName) {
|
|
860
|
+
const db = getDatabase();
|
|
861
|
+
if (taskName) {
|
|
862
|
+
const row2 = db.prepare(
|
|
863
|
+
`SELECT id FROM agent_runs
|
|
864
|
+
WHERE agent_id = ? AND task = ?
|
|
865
|
+
ORDER BY started_at DESC
|
|
866
|
+
LIMIT 1`
|
|
867
|
+
).get(agentId, taskName);
|
|
868
|
+
return row2?.id ?? null;
|
|
869
|
+
}
|
|
870
|
+
const row = db.prepare(
|
|
871
|
+
`SELECT id FROM agent_runs
|
|
872
|
+
WHERE agent_id = ?
|
|
873
|
+
ORDER BY started_at DESC
|
|
874
|
+
LIMIT 1`
|
|
875
|
+
).get(agentId);
|
|
876
|
+
return row?.id ?? null;
|
|
449
877
|
}
|
|
450
878
|
|
|
451
879
|
// src/db/queries/reports.ts
|
|
@@ -458,7 +886,7 @@ var REPORT_COLUMNS = [
|
|
|
458
886
|
"details",
|
|
459
887
|
"created_at"
|
|
460
888
|
];
|
|
461
|
-
var
|
|
889
|
+
var SELECT_COLUMNS5 = REPORT_COLUMNS.join(", ");
|
|
462
890
|
function toReportRow(row) {
|
|
463
891
|
return {
|
|
464
892
|
id: row.id,
|
|
@@ -488,13 +916,13 @@ function insertReport(data) {
|
|
|
488
916
|
);
|
|
489
917
|
const reportId = Number(info.lastInsertRowid);
|
|
490
918
|
return toReportRow(
|
|
491
|
-
db.prepare(`SELECT ${
|
|
919
|
+
db.prepare(`SELECT ${SELECT_COLUMNS5} FROM agent_reports WHERE id = ?`).get(reportId)
|
|
492
920
|
);
|
|
493
921
|
}
|
|
494
922
|
function listReports(runId) {
|
|
495
923
|
const db = getDatabase();
|
|
496
924
|
const rows = db.prepare(
|
|
497
|
-
`SELECT ${
|
|
925
|
+
`SELECT ${SELECT_COLUMNS5}
|
|
498
926
|
FROM agent_reports
|
|
499
927
|
WHERE run_id = ?
|
|
500
928
|
ORDER BY created_at ASC`
|
|
@@ -503,7 +931,7 @@ function listReports(runId) {
|
|
|
503
931
|
}
|
|
504
932
|
|
|
505
933
|
// src/db/queries/graph-edges.ts
|
|
506
|
-
import
|
|
934
|
+
import crypto2 from "crypto";
|
|
507
935
|
var DEFAULT_BFS_DEPTH = 2;
|
|
508
936
|
var MAX_BFS_DEPTH = 5;
|
|
509
937
|
var GRAPH_EDGE_COLUMNS = [
|
|
@@ -521,7 +949,7 @@ var GRAPH_EDGE_COLUMNS = [
|
|
|
521
949
|
"machine_id",
|
|
522
950
|
"synced_at"
|
|
523
951
|
];
|
|
524
|
-
var
|
|
952
|
+
var SELECT_COLUMNS6 = GRAPH_EDGE_COLUMNS.join(", ");
|
|
525
953
|
function toGraphEdgeRow(row) {
|
|
526
954
|
return {
|
|
527
955
|
id: row.id,
|
|
@@ -535,13 +963,13 @@ function toGraphEdgeRow(row) {
|
|
|
535
963
|
confidence: row.confidence,
|
|
536
964
|
properties: row.properties ?? null,
|
|
537
965
|
created_at: row.created_at,
|
|
538
|
-
machine_id: row.machine_id ??
|
|
966
|
+
machine_id: row.machine_id ?? getTeamMachineId(),
|
|
539
967
|
synced_at: row.synced_at ?? null
|
|
540
968
|
};
|
|
541
969
|
}
|
|
542
970
|
function insertGraphEdge(data) {
|
|
543
971
|
const db = getDatabase();
|
|
544
|
-
const id =
|
|
972
|
+
const id = crypto2.randomUUID();
|
|
545
973
|
db.prepare(
|
|
546
974
|
`INSERT INTO graph_edges (
|
|
547
975
|
id, agent_id, source_id, source_type, target_id, target_type,
|
|
@@ -559,10 +987,10 @@ function insertGraphEdge(data) {
|
|
|
559
987
|
data.confidence ?? GRAPH_EDGE_DEFAULT_CONFIDENCE,
|
|
560
988
|
data.properties ?? null,
|
|
561
989
|
data.created_at,
|
|
562
|
-
data.machine_id ??
|
|
990
|
+
data.machine_id ?? getTeamMachineId()
|
|
563
991
|
);
|
|
564
992
|
const row = toGraphEdgeRow(
|
|
565
|
-
db.prepare(`SELECT ${
|
|
993
|
+
db.prepare(`SELECT ${SELECT_COLUMNS6} FROM graph_edges WHERE id = ?`).get(id)
|
|
566
994
|
);
|
|
567
995
|
syncRow("graph_edges", row);
|
|
568
996
|
return row;
|
|
@@ -591,7 +1019,7 @@ function listGraphEdges(options = {}) {
|
|
|
591
1019
|
const limit = options.limit ?? QUERY_DEFAULT_LIST_LIMIT;
|
|
592
1020
|
params.push(limit);
|
|
593
1021
|
const rows = db.prepare(
|
|
594
|
-
`SELECT ${
|
|
1022
|
+
`SELECT ${SELECT_COLUMNS6}
|
|
595
1023
|
FROM graph_edges
|
|
596
1024
|
${where}
|
|
597
1025
|
ORDER BY created_at DESC
|
|
@@ -611,7 +1039,7 @@ function getGraphForNode(nodeId, nodeType, options) {
|
|
|
611
1039
|
const frontierArray = Array.from(frontier);
|
|
612
1040
|
const placeholders = frontierArray.map(() => `?`).join(", ");
|
|
613
1041
|
const rows = db.prepare(
|
|
614
|
-
`SELECT ${
|
|
1042
|
+
`SELECT ${SELECT_COLUMNS6}
|
|
615
1043
|
FROM graph_edges
|
|
616
1044
|
WHERE source_id IN (${placeholders}) OR target_id IN (${placeholders})`
|
|
617
1045
|
).all(...frontierArray, ...frontierArray);
|
|
@@ -695,7 +1123,7 @@ function createBatchLineage(agentId, sessionId, batchId, createdAt) {
|
|
|
695
1123
|
}
|
|
696
1124
|
|
|
697
1125
|
// src/db/queries/entities.ts
|
|
698
|
-
var
|
|
1126
|
+
var DEFAULT_LIST_LIMIT3 = 100;
|
|
699
1127
|
var ENTITY_COLUMNS = [
|
|
700
1128
|
"id",
|
|
701
1129
|
"agent_id",
|
|
@@ -708,7 +1136,7 @@ var ENTITY_COLUMNS = [
|
|
|
708
1136
|
"machine_id",
|
|
709
1137
|
"synced_at"
|
|
710
1138
|
];
|
|
711
|
-
var
|
|
1139
|
+
var SELECT_COLUMNS7 = ENTITY_COLUMNS.join(", ");
|
|
712
1140
|
function toEntityRow(row) {
|
|
713
1141
|
return {
|
|
714
1142
|
id: row.id,
|
|
@@ -719,7 +1147,7 @@ function toEntityRow(row) {
|
|
|
719
1147
|
first_seen: row.first_seen,
|
|
720
1148
|
last_seen: row.last_seen,
|
|
721
1149
|
status: row.status ?? "active",
|
|
722
|
-
machine_id: row.machine_id ??
|
|
1150
|
+
machine_id: row.machine_id ?? "local",
|
|
723
1151
|
synced_at: row.synced_at ?? null
|
|
724
1152
|
};
|
|
725
1153
|
}
|
|
@@ -739,10 +1167,10 @@ function insertEntity(data) {
|
|
|
739
1167
|
data.properties ?? null,
|
|
740
1168
|
data.first_seen,
|
|
741
1169
|
data.last_seen,
|
|
742
|
-
data.machine_id ??
|
|
1170
|
+
data.machine_id ?? getTeamMachineId()
|
|
743
1171
|
);
|
|
744
1172
|
const row = toEntityRow(
|
|
745
|
-
db.prepare(`SELECT ${
|
|
1173
|
+
db.prepare(`SELECT ${SELECT_COLUMNS7} FROM entities WHERE agent_id = ? AND type = ? AND name = ?`).get(
|
|
746
1174
|
data.agent_id,
|
|
747
1175
|
data.type,
|
|
748
1176
|
data.name
|
|
@@ -754,7 +1182,7 @@ function insertEntity(data) {
|
|
|
754
1182
|
function getEntity(id) {
|
|
755
1183
|
const db = getDatabase();
|
|
756
1184
|
const row = db.prepare(
|
|
757
|
-
`SELECT ${
|
|
1185
|
+
`SELECT ${SELECT_COLUMNS7} FROM entities WHERE id = ?`
|
|
758
1186
|
).get(id);
|
|
759
1187
|
if (!row) return null;
|
|
760
1188
|
return toEntityRow(row);
|
|
@@ -790,12 +1218,12 @@ function listEntities(options = {}) {
|
|
|
790
1218
|
params.push(options.note_type);
|
|
791
1219
|
}
|
|
792
1220
|
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
793
|
-
const limit = options.limit ??
|
|
1221
|
+
const limit = options.limit ?? DEFAULT_LIST_LIMIT3;
|
|
794
1222
|
const offset = options.offset ?? 0;
|
|
795
1223
|
params.push(limit);
|
|
796
1224
|
params.push(offset);
|
|
797
1225
|
const rows = db.prepare(
|
|
798
|
-
`SELECT ${
|
|
1226
|
+
`SELECT ${SELECT_COLUMNS7}
|
|
799
1227
|
FROM entities
|
|
800
1228
|
${where}
|
|
801
1229
|
ORDER BY last_seen DESC
|
|
@@ -816,7 +1244,7 @@ var EXTRACT_COLUMNS = [
|
|
|
816
1244
|
"machine_id",
|
|
817
1245
|
"synced_at"
|
|
818
1246
|
];
|
|
819
|
-
var
|
|
1247
|
+
var SELECT_COLUMNS8 = EXTRACT_COLUMNS.join(", ");
|
|
820
1248
|
function toDigestExtractRow(row) {
|
|
821
1249
|
return {
|
|
822
1250
|
id: row.id,
|
|
@@ -825,7 +1253,7 @@ function toDigestExtractRow(row) {
|
|
|
825
1253
|
content: row.content,
|
|
826
1254
|
substrate_hash: row.substrate_hash ?? null,
|
|
827
1255
|
generated_at: row.generated_at,
|
|
828
|
-
machine_id: row.machine_id ??
|
|
1256
|
+
machine_id: row.machine_id ?? "local",
|
|
829
1257
|
synced_at: row.synced_at ?? null
|
|
830
1258
|
};
|
|
831
1259
|
}
|
|
@@ -839,14 +1267,14 @@ function upsertDigestExtract(data) {
|
|
|
839
1267
|
generated_at = EXCLUDED.generated_at`
|
|
840
1268
|
).run(data.agent_id, data.tier, data.content, data.generated_at);
|
|
841
1269
|
const row = db.prepare(
|
|
842
|
-
`SELECT ${
|
|
1270
|
+
`SELECT ${SELECT_COLUMNS8} FROM digest_extracts WHERE agent_id = ? AND tier = ?`
|
|
843
1271
|
).get(data.agent_id, data.tier);
|
|
844
1272
|
return toDigestExtractRow(row);
|
|
845
1273
|
}
|
|
846
1274
|
function getDigestExtract(agentId, tier) {
|
|
847
1275
|
const db = getDatabase();
|
|
848
1276
|
const row = db.prepare(
|
|
849
|
-
`SELECT ${
|
|
1277
|
+
`SELECT ${SELECT_COLUMNS8} FROM digest_extracts
|
|
850
1278
|
WHERE agent_id = ? AND tier = ?`
|
|
851
1279
|
).get(agentId, tier);
|
|
852
1280
|
if (!row) return null;
|
|
@@ -856,7 +1284,7 @@ function listDigestExtracts(agentId) {
|
|
|
856
1284
|
const db = getDatabase();
|
|
857
1285
|
const tierPlaceholders = DIGEST_TIERS.map(() => "?").join(", ");
|
|
858
1286
|
const rows = db.prepare(
|
|
859
|
-
`SELECT ${
|
|
1287
|
+
`SELECT ${SELECT_COLUMNS8}
|
|
860
1288
|
FROM digest_extracts
|
|
861
1289
|
WHERE agent_id = ? AND tier IN (${tierPlaceholders})
|
|
862
1290
|
ORDER BY tier ASC`
|
|
@@ -864,6 +1292,66 @@ function listDigestExtracts(agentId) {
|
|
|
864
1292
|
return rows.map(toDigestExtractRow);
|
|
865
1293
|
}
|
|
866
1294
|
|
|
1295
|
+
// src/db/queries/skill-lineage.ts
|
|
1296
|
+
var LINEAGE_COLUMNS = [
|
|
1297
|
+
"id",
|
|
1298
|
+
"skill_id",
|
|
1299
|
+
"generation",
|
|
1300
|
+
"action",
|
|
1301
|
+
"rationale",
|
|
1302
|
+
"source_ids_added",
|
|
1303
|
+
"content_snapshot",
|
|
1304
|
+
"created_at"
|
|
1305
|
+
];
|
|
1306
|
+
var SELECT_COLUMNS9 = LINEAGE_COLUMNS.join(", ");
|
|
1307
|
+
function toLineageRow(row) {
|
|
1308
|
+
return {
|
|
1309
|
+
id: row.id,
|
|
1310
|
+
skill_id: row.skill_id,
|
|
1311
|
+
generation: row.generation,
|
|
1312
|
+
action: row.action,
|
|
1313
|
+
rationale: row.rationale,
|
|
1314
|
+
source_ids_added: row.source_ids_added ?? "[]",
|
|
1315
|
+
content_snapshot: row.content_snapshot,
|
|
1316
|
+
created_at: row.created_at
|
|
1317
|
+
};
|
|
1318
|
+
}
|
|
1319
|
+
function insertLineage(data) {
|
|
1320
|
+
const db = getDatabase();
|
|
1321
|
+
db.prepare(
|
|
1322
|
+
`INSERT INTO skill_lineage (
|
|
1323
|
+
id, skill_id, generation, action, rationale,
|
|
1324
|
+
source_ids_added, content_snapshot, created_at
|
|
1325
|
+
) VALUES (
|
|
1326
|
+
?, ?, ?, ?, ?,
|
|
1327
|
+
?, ?, ?
|
|
1328
|
+
)`
|
|
1329
|
+
).run(
|
|
1330
|
+
data.id,
|
|
1331
|
+
data.skill_id,
|
|
1332
|
+
data.generation,
|
|
1333
|
+
data.action,
|
|
1334
|
+
data.rationale,
|
|
1335
|
+
data.source_ids_added ?? "[]",
|
|
1336
|
+
data.content_snapshot,
|
|
1337
|
+
data.created_at
|
|
1338
|
+
);
|
|
1339
|
+
return toLineageRow(
|
|
1340
|
+
db.prepare(`SELECT ${SELECT_COLUMNS9} FROM skill_lineage WHERE id = ?`).get(data.id)
|
|
1341
|
+
);
|
|
1342
|
+
}
|
|
1343
|
+
function listLineageForSkill(skillId, limit = 50) {
|
|
1344
|
+
const db = getDatabase();
|
|
1345
|
+
const rows = db.prepare(
|
|
1346
|
+
`SELECT ${SELECT_COLUMNS9}
|
|
1347
|
+
FROM skill_lineage
|
|
1348
|
+
WHERE skill_id = ?
|
|
1349
|
+
ORDER BY generation DESC
|
|
1350
|
+
LIMIT ?`
|
|
1351
|
+
).all(skillId, limit);
|
|
1352
|
+
return rows.map(toLineageRow);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
867
1355
|
export {
|
|
868
1356
|
populateBatchResponses,
|
|
869
1357
|
getUnprocessedBatches,
|
|
@@ -875,6 +1363,7 @@ export {
|
|
|
875
1363
|
setResponseSummary,
|
|
876
1364
|
getLatestBatch,
|
|
877
1365
|
listBatchesBySession,
|
|
1366
|
+
countBatchesBySession,
|
|
878
1367
|
insertGraphEdge,
|
|
879
1368
|
listGraphEdges,
|
|
880
1369
|
getGraphForNode,
|
|
@@ -884,9 +1373,34 @@ export {
|
|
|
884
1373
|
upsertDigestExtract,
|
|
885
1374
|
getDigestExtract,
|
|
886
1375
|
listDigestExtracts,
|
|
1376
|
+
register,
|
|
1377
|
+
getAllDomains,
|
|
1378
|
+
listNotifications,
|
|
1379
|
+
countNotifications,
|
|
1380
|
+
getNotification,
|
|
1381
|
+
updateNotificationStatus,
|
|
1382
|
+
dismissAllNotifications,
|
|
1383
|
+
markAllRead,
|
|
1384
|
+
notify,
|
|
887
1385
|
errorMessage,
|
|
888
|
-
|
|
889
|
-
|
|
1386
|
+
insertCandidate,
|
|
1387
|
+
getCandidate,
|
|
1388
|
+
listCandidates,
|
|
1389
|
+
updateCandidate,
|
|
1390
|
+
listCandidatesWithCount,
|
|
1391
|
+
countCandidates,
|
|
1392
|
+
deleteCandidate,
|
|
1393
|
+
insertSkillRecord,
|
|
1394
|
+
getSkillRecord,
|
|
1395
|
+
getSkillRecordByName,
|
|
1396
|
+
listSkillRecords,
|
|
1397
|
+
updateSkillRecord,
|
|
1398
|
+
incrementSkillUsageCount,
|
|
1399
|
+
listSkillRecordsWithCount,
|
|
1400
|
+
countSkillRecords,
|
|
1401
|
+
deleteSkillRecordCascade,
|
|
1402
|
+
insertLineage,
|
|
1403
|
+
listLineageForSkill,
|
|
890
1404
|
STATUS_RUNNING,
|
|
891
1405
|
STATUS_COMPLETED2 as STATUS_COMPLETED,
|
|
892
1406
|
STATUS_FAILED,
|
|
@@ -895,10 +1409,11 @@ export {
|
|
|
895
1409
|
listRuns,
|
|
896
1410
|
countRuns,
|
|
897
1411
|
updateRunStatus,
|
|
898
|
-
|
|
1412
|
+
getRunningRunForTask,
|
|
1413
|
+
getLatestRunId,
|
|
899
1414
|
insertReport,
|
|
900
1415
|
listReports,
|
|
901
1416
|
createSporeLineage,
|
|
902
1417
|
createBatchLineage
|
|
903
1418
|
};
|
|
904
|
-
//# sourceMappingURL=chunk-
|
|
1419
|
+
//# sourceMappingURL=chunk-JJXVDCEX.js.map
|