@goondocks/myco 0.21.0 → 0.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/myco-run +68 -7
- package/dist/{agent-eval-RJSQI5S2.js → agent-eval-2MQKTXX3.js} +7 -6
- package/dist/{agent-eval-RJSQI5S2.js.map → agent-eval-2MQKTXX3.js.map} +1 -1
- package/dist/{agent-run-2JSYFOKU.js → agent-run-XJBTSVJR.js} +5 -5
- package/dist/{agent-tasks-APFJIM2T.js → agent-tasks-7MWBZOC7.js} +5 -5
- package/dist/{chunk-75Z7UKDY.js → chunk-4D22KTXY.js} +2 -2
- package/dist/{chunk-P66DLD6G.js → chunk-6FBLL7MD.js} +8 -2
- package/dist/chunk-6FBLL7MD.js.map +1 -0
- package/dist/{chunk-JZS6GZ6T.js → chunk-AUIXX33A.js} +10 -3
- package/dist/chunk-AUIXX33A.js.map +1 -0
- package/dist/{chunk-F3OEQYLS.js → chunk-DBBO6FHE.js} +33 -30
- package/dist/{chunk-F3OEQYLS.js.map → chunk-DBBO6FHE.js.map} +1 -1
- package/dist/{chunk-CESKJD44.js → chunk-DMPCC7V6.js} +19 -11
- package/dist/chunk-DMPCC7V6.js.map +1 -0
- package/dist/{chunk-RL5R4CQU.js → chunk-DTWUHHFI.js} +39 -2
- package/dist/{chunk-RL5R4CQU.js.map → chunk-DTWUHHFI.js.map} +1 -1
- package/dist/{chunk-XL75KZGI.js → chunk-EKZG2MCD.js} +7 -3
- package/dist/chunk-EKZG2MCD.js.map +1 -0
- package/dist/{chunk-NGH7U6A3.js → chunk-HCT7RMM2.js} +487 -98
- package/dist/chunk-HCT7RMM2.js.map +1 -0
- package/dist/{chunk-G6QIBNZM.js → chunk-IMW5TJ3O.js} +7 -6
- package/dist/chunk-IMW5TJ3O.js.map +1 -0
- package/dist/chunk-LQIPXVDH.js +17 -0
- package/dist/chunk-LQIPXVDH.js.map +1 -0
- package/dist/{chunk-5ZG4RMUH.js → chunk-N2DGFACQ.js} +2 -2
- package/dist/{chunk-VHNRMM4O.js → chunk-OTQH5KZW.js} +87 -37
- package/dist/chunk-OTQH5KZW.js.map +1 -0
- package/dist/{chunk-6LB7XELY.js → chunk-QATYARI5.js} +15 -13
- package/dist/chunk-QATYARI5.js.map +1 -0
- package/dist/{chunk-LVIY7P35.js → chunk-QLLBJEM7.js} +5 -1
- package/dist/chunk-QLLBJEM7.js.map +1 -0
- package/dist/{chunk-DJ3IHNYO.js → chunk-TFRUDNLI.js} +2 -2
- package/dist/{chunk-R2JIJBCL.js → chunk-TMAXWERS.js} +87 -4
- package/dist/chunk-TMAXWERS.js.map +1 -0
- package/dist/chunk-TSM6VESW.js +25 -0
- package/dist/chunk-TSM6VESW.js.map +1 -0
- package/dist/{chunk-ILJPRYES.js → chunk-USVFEWYL.js} +2 -2
- package/dist/{chunk-JR54LTPP.js → chunk-W5L5IHP5.js} +3 -3
- package/dist/{chunk-BUTL6IFS.js → chunk-Z55WGA2J.js} +2 -2
- package/dist/{chunk-NGROSFOH.js → chunk-Z66IT5KL.js} +14 -9
- package/dist/chunk-Z66IT5KL.js.map +1 -0
- package/dist/{cli-LNYSTDQM.js → cli-DDHTHU2J.js} +37 -37
- package/dist/{client-NWE4TCNO.js → client-PQU53UQU.js} +5 -3
- package/dist/{detect-PXNM6TA7.js → detect-7NUD5B5R.js} +2 -2
- package/dist/{doctor-TI7EZ3RW.js → doctor-QK6KFY6H.js} +6 -6
- package/dist/{executor-F2YU7HXJ.js → executor-FJCMNSXM.js} +11 -10
- package/dist/{init-KG3TYVGE.js → init-GQPD6HHX.js} +9 -9
- package/dist/{installer-UMH7OJ5A.js → installer-N4UTEACX.js} +2 -2
- package/dist/{loader-NAVVZK63.js → loader-UDNUMEDA.js} +3 -2
- package/dist/{main-5PRQNEEE.js → main-4HKTZFIM.js} +469 -187
- package/dist/main-4HKTZFIM.js.map +1 -0
- package/dist/{open-5A27BCSB.js → open-3P3DDAOA.js} +5 -5
- package/dist/{post-compact-USAODKPQ.js → post-compact-QA5LME2J.js} +7 -7
- package/dist/{post-tool-use-GMMSYBII.js → post-tool-use-QRZMPNYL.js} +6 -6
- package/dist/{post-tool-use-failure-NZVSL2PO.js → post-tool-use-failure-XNHIKBZG.js} +7 -7
- package/dist/{pre-compact-LZ57DLUS.js → pre-compact-HDV6X5QM.js} +7 -7
- package/dist/{registry-M2Z5QBWH.js → registry-F3THYC5M.js} +4 -3
- package/dist/{remove-T3KE6C5N.js → remove-USQDLGTJ.js} +7 -7
- package/dist/{restart-YWDEVZUJ.js → restart-FQLZE2TW.js} +6 -6
- package/dist/{search-GKFDGELR.js → search-5COKV6TD.js} +6 -6
- package/dist/{server-AHUR6CWF.js → server-KRMBRW4T.js} +23 -7
- package/dist/{server-AHUR6CWF.js.map → server-KRMBRW4T.js.map} +1 -1
- package/dist/{session-2ZEPLWW6.js → session-NJCUW3OX.js} +5 -5
- package/dist/{session-end-LWJYQAXX.js → session-end-XD27GRYF.js} +6 -6
- package/dist/{session-start-WTA6GCOQ.js → session-start-RDTXUSYL.js} +11 -11
- package/dist/{setup-llm-E7UU5IO7.js → setup-llm-FYPPJI6W.js} +5 -5
- package/dist/src/agent/definitions/tasks/cortex-instructions.yaml +63 -41
- package/dist/src/agent/definitions/tasks/skill-evolve.yaml +178 -22
- package/dist/src/agent/definitions/tasks/skill-generate.yaml +20 -6
- package/dist/src/agent/definitions/tasks/vault-evolve.yaml +65 -55
- 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/opencode.yaml +7 -0
- package/dist/src/symbionts/templates/agents-starter.md +1 -1
- package/dist/src/symbionts/templates/opencode/plugin.ts +41 -1
- package/dist/src/symbionts/templates/pi/plugin.ts +12 -1
- package/dist/{stats-DFG6S23S.js → stats-JCLZLA5G.js} +6 -6
- package/dist/{stop-WRBTXEVT.js → stop-B7XCXEM5.js} +6 -6
- package/dist/{stop-failure-32MGIG2Q.js → stop-failure-R6QZCUOZ.js} +7 -7
- package/dist/{subagent-start-VFGHQFVL.js → subagent-start-N7A622F3.js} +7 -7
- package/dist/{subagent-stop-663FXG3P.js → subagent-stop-SVOG5MZJ.js} +7 -7
- package/dist/{task-completed-ZCQYEFMZ.js → task-completed-3DL5LJXF.js} +7 -7
- package/dist/{team-JTI5CDUO.js → team-VJ3M263F.js} +3 -3
- package/dist/ui/assets/{index-DGf1h-Ha.js → index-O1kNWlWM.js} +119 -119
- package/dist/ui/assets/index-z2Jm8i4A.css +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/{update-3NBQTG32.js → update-TVXAUJMZ.js} +45 -11
- package/dist/update-TVXAUJMZ.js.map +1 -0
- package/dist/{user-prompt-submit-ME2TBKOS.js → user-prompt-submit-KYO2VGLB.js} +10 -9
- package/dist/user-prompt-submit-KYO2VGLB.js.map +1 -0
- package/dist/{version-GQAFBBPX.js → version-LDFEALUJ.js} +2 -2
- package/package.json +1 -1
- package/skills/myco-rules/SKILL.md +94 -0
- package/skills/{rules → myco-rules}/references/rules-bad-example.md +1 -1
- package/skills/{rules → myco-rules}/references/rules-good-example.md +1 -1
- package/dist/chunk-6LB7XELY.js.map +0 -1
- package/dist/chunk-CESKJD44.js.map +0 -1
- package/dist/chunk-CUDIZJY7.js +0 -36
- package/dist/chunk-CUDIZJY7.js.map +0 -1
- package/dist/chunk-G6QIBNZM.js.map +0 -1
- package/dist/chunk-JZS6GZ6T.js.map +0 -1
- package/dist/chunk-LVIY7P35.js.map +0 -1
- package/dist/chunk-NGH7U6A3.js.map +0 -1
- package/dist/chunk-NGROSFOH.js.map +0 -1
- package/dist/chunk-P66DLD6G.js.map +0 -1
- package/dist/chunk-R2JIJBCL.js.map +0 -1
- package/dist/chunk-VHNRMM4O.js.map +0 -1
- package/dist/chunk-XL75KZGI.js.map +0 -1
- package/dist/main-5PRQNEEE.js.map +0 -1
- package/dist/ui/assets/index-_OP4ifzH.css +0 -1
- package/dist/update-3NBQTG32.js.map +0 -1
- package/dist/user-prompt-submit-ME2TBKOS.js.map +0 -1
- package/skills/myco-curate/SKILL.md +0 -86
- package/skills/rules/SKILL.md +0 -214
- /package/dist/{agent-run-2JSYFOKU.js.map → agent-run-XJBTSVJR.js.map} +0 -0
- /package/dist/{agent-tasks-APFJIM2T.js.map → agent-tasks-7MWBZOC7.js.map} +0 -0
- /package/dist/{chunk-75Z7UKDY.js.map → chunk-4D22KTXY.js.map} +0 -0
- /package/dist/{chunk-5ZG4RMUH.js.map → chunk-N2DGFACQ.js.map} +0 -0
- /package/dist/{chunk-DJ3IHNYO.js.map → chunk-TFRUDNLI.js.map} +0 -0
- /package/dist/{chunk-ILJPRYES.js.map → chunk-USVFEWYL.js.map} +0 -0
- /package/dist/{chunk-JR54LTPP.js.map → chunk-W5L5IHP5.js.map} +0 -0
- /package/dist/{chunk-BUTL6IFS.js.map → chunk-Z55WGA2J.js.map} +0 -0
- /package/dist/{cli-LNYSTDQM.js.map → cli-DDHTHU2J.js.map} +0 -0
- /package/dist/{client-NWE4TCNO.js.map → client-PQU53UQU.js.map} +0 -0
- /package/dist/{detect-PXNM6TA7.js.map → detect-7NUD5B5R.js.map} +0 -0
- /package/dist/{doctor-TI7EZ3RW.js.map → doctor-QK6KFY6H.js.map} +0 -0
- /package/dist/{executor-F2YU7HXJ.js.map → executor-FJCMNSXM.js.map} +0 -0
- /package/dist/{init-KG3TYVGE.js.map → init-GQPD6HHX.js.map} +0 -0
- /package/dist/{installer-UMH7OJ5A.js.map → installer-N4UTEACX.js.map} +0 -0
- /package/dist/{loader-NAVVZK63.js.map → loader-UDNUMEDA.js.map} +0 -0
- /package/dist/{open-5A27BCSB.js.map → open-3P3DDAOA.js.map} +0 -0
- /package/dist/{post-compact-USAODKPQ.js.map → post-compact-QA5LME2J.js.map} +0 -0
- /package/dist/{post-tool-use-GMMSYBII.js.map → post-tool-use-QRZMPNYL.js.map} +0 -0
- /package/dist/{post-tool-use-failure-NZVSL2PO.js.map → post-tool-use-failure-XNHIKBZG.js.map} +0 -0
- /package/dist/{pre-compact-LZ57DLUS.js.map → pre-compact-HDV6X5QM.js.map} +0 -0
- /package/dist/{registry-M2Z5QBWH.js.map → registry-F3THYC5M.js.map} +0 -0
- /package/dist/{remove-T3KE6C5N.js.map → remove-USQDLGTJ.js.map} +0 -0
- /package/dist/{restart-YWDEVZUJ.js.map → restart-FQLZE2TW.js.map} +0 -0
- /package/dist/{search-GKFDGELR.js.map → search-5COKV6TD.js.map} +0 -0
- /package/dist/{session-2ZEPLWW6.js.map → session-NJCUW3OX.js.map} +0 -0
- /package/dist/{session-end-LWJYQAXX.js.map → session-end-XD27GRYF.js.map} +0 -0
- /package/dist/{session-start-WTA6GCOQ.js.map → session-start-RDTXUSYL.js.map} +0 -0
- /package/dist/{setup-llm-E7UU5IO7.js.map → setup-llm-FYPPJI6W.js.map} +0 -0
- /package/dist/{stats-DFG6S23S.js.map → stats-JCLZLA5G.js.map} +0 -0
- /package/dist/{stop-WRBTXEVT.js.map → stop-B7XCXEM5.js.map} +0 -0
- /package/dist/{stop-failure-32MGIG2Q.js.map → stop-failure-R6QZCUOZ.js.map} +0 -0
- /package/dist/{subagent-start-VFGHQFVL.js.map → subagent-start-N7A622F3.js.map} +0 -0
- /package/dist/{subagent-stop-663FXG3P.js.map → subagent-stop-SVOG5MZJ.js.map} +0 -0
- /package/dist/{task-completed-ZCQYEFMZ.js.map → task-completed-3DL5LJXF.js.map} +0 -0
- /package/dist/{team-JTI5CDUO.js.map → team-VJ3M263F.js.map} +0 -0
- /package/dist/{version-GQAFBBPX.js.map → version-LDFEALUJ.js.map} +0 -0
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
getEmbeddingQueueDepth,
|
|
19
19
|
getUnembedded,
|
|
20
20
|
markEmbedded
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4D22KTXY.js";
|
|
22
22
|
import {
|
|
23
23
|
deleteSecrets,
|
|
24
24
|
getTeamPackageVersion,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
readSecrets,
|
|
28
28
|
resolveVaultConfigPath,
|
|
29
29
|
writeSecret
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-TMAXWERS.js";
|
|
31
31
|
import {
|
|
32
32
|
DEFAULT_OPENAI_URL,
|
|
33
33
|
DEFAULT_OPENROUTER_URL,
|
|
@@ -63,6 +63,7 @@ import {
|
|
|
63
63
|
getSkillRecordByName,
|
|
64
64
|
getSkillSurveyEligibility,
|
|
65
65
|
hasConfiguredProvider,
|
|
66
|
+
hasSemanticSearchFilters,
|
|
66
67
|
incrementActivityCount,
|
|
67
68
|
incrementSkillUsageCount,
|
|
68
69
|
inferLocalOpenAIBackendKind,
|
|
@@ -82,6 +83,7 @@ import {
|
|
|
82
83
|
listWriteIntents,
|
|
83
84
|
markAllRead,
|
|
84
85
|
markRunningRunsInterrupted,
|
|
86
|
+
matchesSemanticSearchFilters,
|
|
85
87
|
notify,
|
|
86
88
|
populateBatchResponses,
|
|
87
89
|
register,
|
|
@@ -90,28 +92,31 @@ import {
|
|
|
90
92
|
tryParseJson,
|
|
91
93
|
updateCandidate,
|
|
92
94
|
updateNotificationStatus
|
|
93
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-HCT7RMM2.js";
|
|
94
96
|
import {
|
|
95
|
-
errorMessage,
|
|
96
97
|
parseCheckpointState,
|
|
97
98
|
runDurationMs
|
|
98
|
-
} from "./chunk-
|
|
99
|
+
} from "./chunk-QATYARI5.js";
|
|
99
100
|
import {
|
|
100
101
|
fullTextSearch,
|
|
101
|
-
hydrateSearchResults
|
|
102
|
-
|
|
102
|
+
hydrateSearchResults,
|
|
103
|
+
sanitizeFtsQuery
|
|
104
|
+
} from "./chunk-QLLBJEM7.js";
|
|
103
105
|
import {
|
|
104
106
|
copyTaskToUser,
|
|
105
107
|
deleteUserTask,
|
|
106
108
|
loadAllTasks,
|
|
107
109
|
validateTaskName,
|
|
108
110
|
writeUserTask
|
|
109
|
-
} from "./chunk-
|
|
111
|
+
} from "./chunk-USVFEWYL.js";
|
|
110
112
|
import {
|
|
111
113
|
registerAgent,
|
|
112
114
|
resolveDefinitionsDir,
|
|
113
115
|
taskFromParsed
|
|
114
|
-
} from "./chunk-
|
|
116
|
+
} from "./chunk-AUIXX33A.js";
|
|
117
|
+
import {
|
|
118
|
+
errorMessage
|
|
119
|
+
} from "./chunk-LQIPXVDH.js";
|
|
115
120
|
import {
|
|
116
121
|
listTurnsByRun
|
|
117
122
|
} from "./chunk-FCJ5JV54.js";
|
|
@@ -135,11 +140,11 @@ import {
|
|
|
135
140
|
cleanStaleBuffers,
|
|
136
141
|
listBufferSessionIds
|
|
137
142
|
} from "./chunk-V7XG6V6C.js";
|
|
138
|
-
import "./chunk-
|
|
143
|
+
import "./chunk-W5L5IHP5.js";
|
|
139
144
|
import "./chunk-SAKJMNSR.js";
|
|
140
145
|
import {
|
|
141
146
|
SymbiontInstaller
|
|
142
|
-
} from "./chunk-
|
|
147
|
+
} from "./chunk-OTQH5KZW.js";
|
|
143
148
|
import {
|
|
144
149
|
checkLocalProvider
|
|
145
150
|
} from "./chunk-TKAJ3JVF.js";
|
|
@@ -150,7 +155,7 @@ import {
|
|
|
150
155
|
import {
|
|
151
156
|
composeSessionStartContext,
|
|
152
157
|
shouldInjectSessionStartDigest
|
|
153
|
-
} from "./chunk-
|
|
158
|
+
} from "./chunk-TFRUDNLI.js";
|
|
154
159
|
import {
|
|
155
160
|
buildCortexInstructionsInput,
|
|
156
161
|
countSpores,
|
|
@@ -170,7 +175,7 @@ import {
|
|
|
170
175
|
shouldInjectCortex,
|
|
171
176
|
updateSporeStatus,
|
|
172
177
|
upsertPlan
|
|
173
|
-
} from "./chunk-
|
|
178
|
+
} from "./chunk-DBBO6FHE.js";
|
|
174
179
|
import {
|
|
175
180
|
backfillUnsynced,
|
|
176
181
|
closeSession,
|
|
@@ -199,10 +204,10 @@ import {
|
|
|
199
204
|
import {
|
|
200
205
|
evaluateSessionCaptureRules,
|
|
201
206
|
readTranscriptMeta
|
|
202
|
-
} from "./chunk-
|
|
207
|
+
} from "./chunk-EKZG2MCD.js";
|
|
203
208
|
import {
|
|
204
209
|
PLAN_STATUSES
|
|
205
|
-
} from "./chunk-
|
|
210
|
+
} from "./chunk-DMPCC7V6.js";
|
|
206
211
|
import {
|
|
207
212
|
EMBEDDING_DIMENSIONS,
|
|
208
213
|
REST_SETTABLE_STATUSES,
|
|
@@ -215,7 +220,7 @@ import {
|
|
|
215
220
|
createSchema,
|
|
216
221
|
humanizePlanToken,
|
|
217
222
|
normalizePlanSourcePath
|
|
218
|
-
} from "./chunk-
|
|
223
|
+
} from "./chunk-DTWUHHFI.js";
|
|
219
224
|
import {
|
|
220
225
|
CONFIG_FILENAME,
|
|
221
226
|
MycoConfigSchema,
|
|
@@ -244,14 +249,14 @@ import {
|
|
|
244
249
|
} from "./chunk-ZXZPJJN3.js";
|
|
245
250
|
import {
|
|
246
251
|
resolveCliEntryPath
|
|
247
|
-
} from "./chunk-
|
|
252
|
+
} from "./chunk-6FBLL7MD.js";
|
|
248
253
|
import {
|
|
249
254
|
getPluginVersion
|
|
250
|
-
} from "./chunk-
|
|
255
|
+
} from "./chunk-Z55WGA2J.js";
|
|
251
256
|
import {
|
|
252
257
|
loadManifests,
|
|
253
258
|
resolvePackageRoot
|
|
254
|
-
} from "./chunk-
|
|
259
|
+
} from "./chunk-Z66IT5KL.js";
|
|
255
260
|
import {
|
|
256
261
|
findPackageRoot
|
|
257
262
|
} from "./chunk-LPUQPDC2.js";
|
|
@@ -2712,6 +2717,13 @@ var TeamSyncClient = class _TeamSyncClient {
|
|
|
2712
2717
|
const params = new URLSearchParams({ q: query });
|
|
2713
2718
|
if (options.limit) params.set("limit", String(options.limit));
|
|
2714
2719
|
if (options.tables) params.set("tables", options.tables.join(","));
|
|
2720
|
+
if (options.status) params.set("status", options.status);
|
|
2721
|
+
if (options.observation_type) params.set("observation_type", options.observation_type);
|
|
2722
|
+
if (options.since !== void 0) params.set("since", String(options.since));
|
|
2723
|
+
if (options.until !== void 0) params.set("until", String(options.until));
|
|
2724
|
+
if (options.session_id) params.set("session_id", options.session_id);
|
|
2725
|
+
if (options.source_path) params.set("source_path", options.source_path);
|
|
2726
|
+
if (options.name) params.set("name", options.name);
|
|
2715
2727
|
const res = await this.fetchFn(`${this.workerUrl}/search?${params}`, {
|
|
2716
2728
|
method: "GET",
|
|
2717
2729
|
headers: this.headers(),
|
|
@@ -2896,16 +2908,33 @@ function createTeamHandlers(deps) {
|
|
|
2896
2908
|
try {
|
|
2897
2909
|
pendingCount = countPending();
|
|
2898
2910
|
deadLetterCount = countDeadLettered();
|
|
2899
|
-
} catch {
|
|
2911
|
+
} catch (err) {
|
|
2912
|
+
const detail = errorMessage(err);
|
|
2913
|
+
logger.warn("team-sync.outbox.count-failed", "team-outbox counts unavailable", { error: detail });
|
|
2900
2914
|
}
|
|
2901
2915
|
let collectiveStatus = null;
|
|
2916
|
+
let teamConfig = null;
|
|
2902
2917
|
if (client && config.team.enabled) {
|
|
2903
2918
|
try {
|
|
2904
2919
|
collectiveStatus = await client.getCollectiveStatus();
|
|
2905
|
-
} catch {
|
|
2920
|
+
} catch (err) {
|
|
2921
|
+
const detail = errorMessage(err);
|
|
2922
|
+
logger.warn("team-sync.collective.status-failed", "Collective status unavailable", { error: detail });
|
|
2906
2923
|
collectiveStatus = null;
|
|
2907
2924
|
}
|
|
2925
|
+
try {
|
|
2926
|
+
teamConfig = await client.getConfig();
|
|
2927
|
+
} catch (err) {
|
|
2928
|
+
const detail = errorMessage(err);
|
|
2929
|
+
logger.warn("team-sync.config.status-failed", "Team config unavailable", { error: detail });
|
|
2930
|
+
teamConfig = null;
|
|
2931
|
+
}
|
|
2908
2932
|
}
|
|
2933
|
+
const remoteConfig = teamConfig?.config ?? {};
|
|
2934
|
+
const vectorReindexLastRun = typeof remoteConfig.vector_reindex_last_run_at === "string" ? Number(remoteConfig.vector_reindex_last_run_at) : null;
|
|
2935
|
+
const vectorReindexLastProcessed = typeof remoteConfig.vector_reindex_last_processed === "string" ? Number(remoteConfig.vector_reindex_last_processed) : null;
|
|
2936
|
+
const vectorReindexLastReindexed = typeof remoteConfig.vector_reindex_last_reindexed === "string" ? Number(remoteConfig.vector_reindex_last_reindexed) : null;
|
|
2937
|
+
const vectorReindexLastDeleted = typeof remoteConfig.vector_reindex_last_deleted === "string" ? Number(remoteConfig.vector_reindex_last_deleted) : null;
|
|
2909
2938
|
return {
|
|
2910
2939
|
body: {
|
|
2911
2940
|
enabled: config.team.enabled,
|
|
@@ -2929,6 +2958,13 @@ function createTeamHandlers(deps) {
|
|
|
2929
2958
|
collective_last_heartbeat: collectiveStatus?.last_heartbeat ?? null,
|
|
2930
2959
|
collective_capabilities: collectiveStatus?.capabilities ?? [],
|
|
2931
2960
|
collective_settings: collectiveStatus?.settings ?? {},
|
|
2961
|
+
vector_reindex_status: typeof remoteConfig.vector_reindex_status === "string" ? remoteConfig.vector_reindex_status : null,
|
|
2962
|
+
vector_reindex_last_table: typeof remoteConfig.vector_reindex_last_table === "string" ? remoteConfig.vector_reindex_last_table : null,
|
|
2963
|
+
vector_reindex_last_error: typeof remoteConfig.vector_reindex_last_error === "string" && remoteConfig.vector_reindex_last_error.length > 0 ? remoteConfig.vector_reindex_last_error : null,
|
|
2964
|
+
vector_reindex_last_run_at: Number.isFinite(vectorReindexLastRun) ? vectorReindexLastRun : null,
|
|
2965
|
+
vector_reindex_last_processed: Number.isFinite(vectorReindexLastProcessed) ? vectorReindexLastProcessed : null,
|
|
2966
|
+
vector_reindex_last_reindexed: Number.isFinite(vectorReindexLastReindexed) ? vectorReindexLastReindexed : null,
|
|
2967
|
+
vector_reindex_last_deleted: Number.isFinite(vectorReindexLastDeleted) ? vectorReindexLastDeleted : null,
|
|
2932
2968
|
schema_version: SCHEMA_VERSION,
|
|
2933
2969
|
sync_protocol_version: SYNC_PROTOCOL_VERSION,
|
|
2934
2970
|
mcp_token: client?.getMcpToken() ?? null,
|
|
@@ -2945,7 +2981,7 @@ function createTeamHandlers(deps) {
|
|
|
2945
2981
|
return { body: { retried: count } };
|
|
2946
2982
|
}
|
|
2947
2983
|
async function handleUpgradeWorker(_req) {
|
|
2948
|
-
const { upgradeWorker } = await import("./team-
|
|
2984
|
+
const { upgradeWorker } = await import("./team-VJ3M263F.js");
|
|
2949
2985
|
logger.info("team-sync.upgrade.start", "Starting worker upgrade");
|
|
2950
2986
|
const result = upgradeWorker(vaultDir);
|
|
2951
2987
|
if (!result.success) {
|
|
@@ -2983,7 +3019,7 @@ function createTeamHandlers(deps) {
|
|
|
2983
3019
|
logger.info("team-sync.mcp-token.rotated", "MCP access token rotated");
|
|
2984
3020
|
return { body: { token } };
|
|
2985
3021
|
} catch (err) {
|
|
2986
|
-
const message =
|
|
3022
|
+
const message = errorMessage(err);
|
|
2987
3023
|
logger.error("team-sync.mcp-token.rotate-failed", "MCP token rotation failed", { error: message });
|
|
2988
3024
|
return {
|
|
2989
3025
|
status: 500,
|
|
@@ -3024,7 +3060,19 @@ function createCollectiveHandlers(deps) {
|
|
|
3024
3060
|
const project = req.query.project;
|
|
3025
3061
|
const limit = req.query.limit ? Number(req.query.limit) : void 0;
|
|
3026
3062
|
return {
|
|
3027
|
-
body: await client.collectiveQuery("collective_search", {
|
|
3063
|
+
body: await client.collectiveQuery("collective_search", {
|
|
3064
|
+
query,
|
|
3065
|
+
project,
|
|
3066
|
+
limit,
|
|
3067
|
+
types: req.query.types ? req.query.types.split(",").map((value) => value.trim()).filter(Boolean) : void 0,
|
|
3068
|
+
status: req.query.status || void 0,
|
|
3069
|
+
observation_type: req.query.observation_type || void 0,
|
|
3070
|
+
since: req.query.since ? Number(req.query.since) : void 0,
|
|
3071
|
+
until: req.query.until ? Number(req.query.until) : void 0,
|
|
3072
|
+
session_id: req.query.session_id || void 0,
|
|
3073
|
+
source_path: req.query.source_path || void 0,
|
|
3074
|
+
name: req.query.name || void 0
|
|
3075
|
+
})
|
|
3028
3076
|
};
|
|
3029
3077
|
} catch (error) {
|
|
3030
3078
|
return {
|
|
@@ -3337,7 +3385,7 @@ function createSkillRecordDeleteHandler(deps) {
|
|
|
3337
3385
|
logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill directory", { name: record.name, error: String(err) });
|
|
3338
3386
|
}
|
|
3339
3387
|
try {
|
|
3340
|
-
const { syncSkillSymlinks } = await import("./installer-
|
|
3388
|
+
const { syncSkillSymlinks } = await import("./installer-N4UTEACX.js");
|
|
3341
3389
|
syncSkillSymlinks(projectRoot, record.name, { remove: true });
|
|
3342
3390
|
} catch (err) {
|
|
3343
3391
|
logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill symlinks", { name: record.name, error: String(err) });
|
|
@@ -3618,7 +3666,7 @@ async function fetchRemoteProviderModels(provider, _baseUrl, timeoutMs = REMOTE_
|
|
|
3618
3666
|
const modelIds = (data.data ?? []).map((entry) => entry.id).filter((id) => typeof id === "string" && id.length > 0);
|
|
3619
3667
|
return filterLlmModels(modelIds);
|
|
3620
3668
|
}
|
|
3621
|
-
async function handleGetModels(req) {
|
|
3669
|
+
async function handleGetModels(req, logger) {
|
|
3622
3670
|
const provider = req.query.provider;
|
|
3623
3671
|
const type = req.query.type;
|
|
3624
3672
|
const localBackend = req.query.local_backend;
|
|
@@ -3626,6 +3674,7 @@ async function handleGetModels(req) {
|
|
|
3626
3674
|
return { status: 400, body: { error: "provider query parameter required" } };
|
|
3627
3675
|
}
|
|
3628
3676
|
let models = [];
|
|
3677
|
+
let fetchError;
|
|
3629
3678
|
try {
|
|
3630
3679
|
const localBackendKind = inferLocalOpenAIBackendKind({
|
|
3631
3680
|
type: provider === "lm-studio" ? "lmstudio" : provider,
|
|
@@ -3640,14 +3689,22 @@ async function handleGetModels(req) {
|
|
|
3640
3689
|
} else if (provider === "openai" || provider === "openrouter") {
|
|
3641
3690
|
models = await fetchRemoteProviderModels(provider, void 0, MODEL_LIST_TIMEOUT_MS);
|
|
3642
3691
|
}
|
|
3643
|
-
} catch {
|
|
3692
|
+
} catch (err) {
|
|
3693
|
+
fetchError = errorMessage(err);
|
|
3694
|
+
logger?.warn(`models.${provider}.list-unavailable`, `${provider} model list unavailable`, { error: fetchError });
|
|
3644
3695
|
}
|
|
3645
3696
|
if (type === "embedding") {
|
|
3646
3697
|
models = filterEmbeddingModels(models);
|
|
3647
3698
|
} else if (type === "llm") {
|
|
3648
3699
|
models = filterLlmModels(models);
|
|
3649
3700
|
}
|
|
3650
|
-
return {
|
|
3701
|
+
return {
|
|
3702
|
+
body: {
|
|
3703
|
+
provider,
|
|
3704
|
+
models,
|
|
3705
|
+
...fetchError ? { error: fetchError } : {}
|
|
3706
|
+
}
|
|
3707
|
+
};
|
|
3651
3708
|
}
|
|
3652
3709
|
|
|
3653
3710
|
// src/daemon/api/stats.ts
|
|
@@ -3900,11 +3957,12 @@ async function triggerTitleSummary(sessionId, deps) {
|
|
|
3900
3957
|
if (config.agent.summary_batch_interval <= 0) return;
|
|
3901
3958
|
if (config.agent.event_tasks_enabled === false) return;
|
|
3902
3959
|
try {
|
|
3903
|
-
const { runAgent: runAgent2 } = await import("./executor-
|
|
3960
|
+
const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
|
|
3904
3961
|
runAgent2(vaultDir, {
|
|
3905
3962
|
task: "title-summary",
|
|
3906
3963
|
instruction: `Process session ${sessionId} only`,
|
|
3907
|
-
embeddingManager
|
|
3964
|
+
embeddingManager,
|
|
3965
|
+
logger
|
|
3908
3966
|
}).catch((err) => {
|
|
3909
3967
|
logger.warn(LOG_KINDS.AGENT_ERROR, "Title-summary task failed", {
|
|
3910
3968
|
session_id: sessionId,
|
|
@@ -4441,15 +4499,48 @@ function createSearchHandler(deps) {
|
|
|
4441
4499
|
const type = req.query.type;
|
|
4442
4500
|
const limit = Number(req.query.limit) || SEARCH_RESULTS_DEFAULT_LIMIT;
|
|
4443
4501
|
const namespace = req.query.namespace;
|
|
4502
|
+
const metadataFilters = {
|
|
4503
|
+
...req.query.status ? { status: req.query.status } : {},
|
|
4504
|
+
...req.query.session_id ? { session_id: req.query.session_id } : {},
|
|
4505
|
+
...req.query.observation_type ? { observation_type: req.query.observation_type } : {},
|
|
4506
|
+
...req.query.since ? { created_at_gte: Number(req.query.since) } : {},
|
|
4507
|
+
...req.query.until ? { created_at_lte: Number(req.query.until) } : {}
|
|
4508
|
+
};
|
|
4509
|
+
const vectorFilters = hasSemanticSearchFilters(metadataFilters) ? metadataFilters : void 0;
|
|
4510
|
+
const sanitized = sanitizeFtsQuery(query);
|
|
4444
4511
|
if (mode === "fts") {
|
|
4445
|
-
|
|
4446
|
-
|
|
4512
|
+
try {
|
|
4513
|
+
const results = fullTextSearch(sanitized, { type, limit });
|
|
4514
|
+
return { body: { mode: "fts", results } };
|
|
4515
|
+
} catch (err) {
|
|
4516
|
+
return {
|
|
4517
|
+
status: 500,
|
|
4518
|
+
body: {
|
|
4519
|
+
error: "fts_query_failed",
|
|
4520
|
+
message: errorMessage(err),
|
|
4521
|
+
query,
|
|
4522
|
+
sanitized_query: sanitized !== query ? sanitized : void 0
|
|
4523
|
+
}
|
|
4524
|
+
};
|
|
4525
|
+
}
|
|
4447
4526
|
}
|
|
4448
4527
|
const queryVector = await deps.embeddingManager.embedQuery(query);
|
|
4449
4528
|
if (queryVector === null) {
|
|
4450
4529
|
if (mode === "auto") {
|
|
4451
|
-
|
|
4452
|
-
|
|
4530
|
+
try {
|
|
4531
|
+
const results = fullTextSearch(sanitized, { type, limit });
|
|
4532
|
+
return { body: { mode: "fts", results, fallback: true } };
|
|
4533
|
+
} catch (err) {
|
|
4534
|
+
return {
|
|
4535
|
+
status: 500,
|
|
4536
|
+
body: {
|
|
4537
|
+
error: "fts_fallback_failed",
|
|
4538
|
+
message: errorMessage(err),
|
|
4539
|
+
query,
|
|
4540
|
+
sanitized_query: sanitized !== query ? sanitized : void 0
|
|
4541
|
+
}
|
|
4542
|
+
};
|
|
4543
|
+
}
|
|
4453
4544
|
}
|
|
4454
4545
|
return { body: { mode: "semantic", results: [], provider_unavailable: true } };
|
|
4455
4546
|
}
|
|
@@ -4457,9 +4548,11 @@ function createSearchHandler(deps) {
|
|
|
4457
4548
|
const vectorResults = deps.embeddingManager.searchVectors(queryVector, {
|
|
4458
4549
|
namespace: searchNamespace,
|
|
4459
4550
|
limit,
|
|
4460
|
-
threshold: SEARCH_SIMILARITY_THRESHOLD
|
|
4551
|
+
threshold: SEARCH_SIMILARITY_THRESHOLD,
|
|
4552
|
+
filters: vectorFilters
|
|
4461
4553
|
});
|
|
4462
|
-
const
|
|
4554
|
+
const filteredVectorResults = vectorFilters ? vectorResults.filter((result) => matchesSemanticSearchFilters(result.metadata, metadataFilters)) : vectorResults;
|
|
4555
|
+
const localResults = hydrateSearchResults(filteredVectorResults).map((r) => ({
|
|
4463
4556
|
...r,
|
|
4464
4557
|
source: "local"
|
|
4465
4558
|
}));
|
|
@@ -4467,7 +4560,15 @@ function createSearchHandler(deps) {
|
|
|
4467
4560
|
let teamResults = [];
|
|
4468
4561
|
if (teamClient) {
|
|
4469
4562
|
try {
|
|
4470
|
-
const teamResponse = await teamClient.search(query, {
|
|
4563
|
+
const teamResponse = await teamClient.search(query, {
|
|
4564
|
+
limit,
|
|
4565
|
+
tables: searchNamespace ? [searchNamespace] : void 0,
|
|
4566
|
+
status: req.query.status || void 0,
|
|
4567
|
+
observation_type: req.query.observation_type || void 0,
|
|
4568
|
+
since: req.query.since ? Number(req.query.since) : void 0,
|
|
4569
|
+
until: req.query.until ? Number(req.query.until) : void 0,
|
|
4570
|
+
session_id: req.query.session_id || void 0
|
|
4571
|
+
});
|
|
4471
4572
|
teamResults = teamResponse.results.map((r) => ({
|
|
4472
4573
|
...r,
|
|
4473
4574
|
source: `${TEAM_SOURCE_PREFIX}${r.machine_id}`
|
|
@@ -4476,7 +4577,11 @@ function createSearchHandler(deps) {
|
|
|
4476
4577
|
}
|
|
4477
4578
|
}
|
|
4478
4579
|
const dedupedTeam = deps.machineId ? teamResults.filter((r) => r.machine_id !== deps.machineId) : teamResults;
|
|
4479
|
-
const
|
|
4580
|
+
const filteredTeam = vectorFilters ? dedupedTeam.filter((r) => matchesSemanticSearchFilters(
|
|
4581
|
+
r.metadata,
|
|
4582
|
+
metadataFilters
|
|
4583
|
+
)) : dedupedTeam;
|
|
4584
|
+
const merged = [...localResults, ...filteredTeam].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)).slice(0, limit);
|
|
4480
4585
|
return { body: { mode: "semantic", results: merged } };
|
|
4481
4586
|
};
|
|
4482
4587
|
}
|
|
@@ -4604,7 +4709,8 @@ ${goal.trim()}`,
|
|
|
4604
4709
|
task: CORTEX_PROMPT_BUILDER_TASK,
|
|
4605
4710
|
agentId: DEFAULT_AGENT_ID,
|
|
4606
4711
|
instruction: builderInstruction,
|
|
4607
|
-
embeddingManager: deps.embeddingManager
|
|
4712
|
+
embeddingManager: deps.embeddingManager,
|
|
4713
|
+
logger: deps.logger
|
|
4608
4714
|
});
|
|
4609
4715
|
const runId = getLatestRunId(DEFAULT_AGENT_ID, CORTEX_PROMPT_BUILDER_TASK);
|
|
4610
4716
|
const tracked = resultPromise.catch((err) => {
|
|
@@ -4642,7 +4748,7 @@ function getCortexPromptResult(runId) {
|
|
|
4642
4748
|
}
|
|
4643
4749
|
async function triggerCortexInstructions(deps) {
|
|
4644
4750
|
const { vaultDir, embeddingManager, liveConfig, logger, getTeamClient } = deps;
|
|
4645
|
-
const loadExecutor = deps.loadExecutor ?? (() => import("./executor-
|
|
4751
|
+
const loadExecutor = deps.loadExecutor ?? (() => import("./executor-FJCMNSXM.js"));
|
|
4646
4752
|
const config = liveConfig.current;
|
|
4647
4753
|
if (config.agent.event_tasks_enabled === false) {
|
|
4648
4754
|
return { started: false, reason: "event-tasks-disabled" };
|
|
@@ -4868,7 +4974,10 @@ function createPromptContextHandler(deps) {
|
|
|
4868
4974
|
const vectorResults = embeddingManager.searchVectors(queryVector, {
|
|
4869
4975
|
namespace: "spores",
|
|
4870
4976
|
limit: maxSpores * PROMPT_VECTOR_OVER_FETCH,
|
|
4871
|
-
threshold: PROMPT_CONTEXT_MIN_SIMILARITY
|
|
4977
|
+
threshold: PROMPT_CONTEXT_MIN_SIMILARITY,
|
|
4978
|
+
filters: {
|
|
4979
|
+
status: "active"
|
|
4980
|
+
}
|
|
4872
4981
|
});
|
|
4873
4982
|
logger.debug(LOG_KINDS.CONTEXT_SEARCH, "Prompt vector search completed", {
|
|
4874
4983
|
session_id,
|
|
@@ -5030,6 +5139,68 @@ async function handleGetFeed(req) {
|
|
|
5030
5139
|
// src/daemon/api/embedding.ts
|
|
5031
5140
|
var EMBEDDING_STATUS_IDLE = "idle";
|
|
5032
5141
|
var EMBEDDING_STATUS_PENDING = "pending";
|
|
5142
|
+
var FOREGROUND_EMBEDDING_BATCH_SIZE = 50;
|
|
5143
|
+
var FOREGROUND_RECONCILE_MAX_PASSES = 25;
|
|
5144
|
+
var FOREGROUND_REEMBED_MAX_PASSES = 25;
|
|
5145
|
+
function readQueueDepthSafely() {
|
|
5146
|
+
try {
|
|
5147
|
+
return getEmbeddingQueueDepth().queue_depth;
|
|
5148
|
+
} catch {
|
|
5149
|
+
return 0;
|
|
5150
|
+
}
|
|
5151
|
+
}
|
|
5152
|
+
async function drainForegroundReconcile(manager) {
|
|
5153
|
+
const startedAt = Date.now();
|
|
5154
|
+
let embedded = 0;
|
|
5155
|
+
let stale_reembedded = 0;
|
|
5156
|
+
let orphans_cleaned = 0;
|
|
5157
|
+
let passes = 0;
|
|
5158
|
+
for (; passes < FOREGROUND_RECONCILE_MAX_PASSES; passes++) {
|
|
5159
|
+
const result = await manager.reconcile(FOREGROUND_EMBEDDING_BATCH_SIZE);
|
|
5160
|
+
embedded += result.embedded;
|
|
5161
|
+
stale_reembedded += result.stale_reembedded;
|
|
5162
|
+
orphans_cleaned += result.orphans_cleaned;
|
|
5163
|
+
const queueDepth = readQueueDepthSafely();
|
|
5164
|
+
if (queueDepth === 0) {
|
|
5165
|
+
return {
|
|
5166
|
+
embedded,
|
|
5167
|
+
stale_reembedded,
|
|
5168
|
+
orphans_cleaned,
|
|
5169
|
+
duration_ms: Date.now() - startedAt,
|
|
5170
|
+
passes: passes + 1,
|
|
5171
|
+
remaining_queue_depth: 0
|
|
5172
|
+
};
|
|
5173
|
+
}
|
|
5174
|
+
if (result.embedded === 0 && result.stale_reembedded === 0 && result.orphans_cleaned === 0) {
|
|
5175
|
+
return {
|
|
5176
|
+
embedded,
|
|
5177
|
+
stale_reembedded,
|
|
5178
|
+
orphans_cleaned,
|
|
5179
|
+
duration_ms: Date.now() - startedAt,
|
|
5180
|
+
passes: passes + 1,
|
|
5181
|
+
remaining_queue_depth: queueDepth
|
|
5182
|
+
};
|
|
5183
|
+
}
|
|
5184
|
+
}
|
|
5185
|
+
return {
|
|
5186
|
+
embedded,
|
|
5187
|
+
stale_reembedded,
|
|
5188
|
+
orphans_cleaned,
|
|
5189
|
+
duration_ms: Date.now() - startedAt,
|
|
5190
|
+
passes,
|
|
5191
|
+
remaining_queue_depth: readQueueDepthSafely()
|
|
5192
|
+
};
|
|
5193
|
+
}
|
|
5194
|
+
async function drainForegroundReembedStale(manager) {
|
|
5195
|
+
let reembedded = 0;
|
|
5196
|
+
let passes = 0;
|
|
5197
|
+
for (; passes < FOREGROUND_REEMBED_MAX_PASSES; passes++) {
|
|
5198
|
+
const result = await manager.reembedStale(FOREGROUND_EMBEDDING_BATCH_SIZE);
|
|
5199
|
+
reembedded += result.reembedded;
|
|
5200
|
+
if (result.reembedded === 0) break;
|
|
5201
|
+
}
|
|
5202
|
+
return { reembedded, passes };
|
|
5203
|
+
}
|
|
5033
5204
|
async function handleGetEmbeddingStatus(vaultDir) {
|
|
5034
5205
|
const config = loadMergedConfig(vaultDir);
|
|
5035
5206
|
const { queue_depth, embedded_count } = getEmbeddingQueueDepth();
|
|
@@ -5048,21 +5219,28 @@ function handleEmbeddingDetails(manager) {
|
|
|
5048
5219
|
const details = manager.getDetails();
|
|
5049
5220
|
return { body: details };
|
|
5050
5221
|
}
|
|
5051
|
-
function handleEmbeddingRebuild(manager) {
|
|
5222
|
+
async function handleEmbeddingRebuild(manager) {
|
|
5052
5223
|
const result = manager.rebuildAll();
|
|
5053
|
-
|
|
5224
|
+
const drained = await drainForegroundReconcile(manager);
|
|
5225
|
+
return {
|
|
5226
|
+
body: {
|
|
5227
|
+
...result,
|
|
5228
|
+
...drained,
|
|
5229
|
+
batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE
|
|
5230
|
+
}
|
|
5231
|
+
};
|
|
5054
5232
|
}
|
|
5055
5233
|
async function handleEmbeddingReconcile(manager) {
|
|
5056
|
-
const result = await manager.reconcile(
|
|
5057
|
-
return { body: result };
|
|
5234
|
+
const result = await manager.reconcile(FOREGROUND_EMBEDDING_BATCH_SIZE);
|
|
5235
|
+
return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
|
|
5058
5236
|
}
|
|
5059
5237
|
function handleEmbeddingCleanOrphans(manager) {
|
|
5060
5238
|
const result = manager.cleanOrphans();
|
|
5061
5239
|
return { body: result };
|
|
5062
5240
|
}
|
|
5063
5241
|
async function handleEmbeddingReembedStale(manager) {
|
|
5064
|
-
const result = await manager
|
|
5065
|
-
return { body: result };
|
|
5242
|
+
const result = await drainForegroundReembedStale(manager);
|
|
5243
|
+
return { body: { ...result, batch_size: FOREGROUND_EMBEDDING_BATCH_SIZE } };
|
|
5066
5244
|
}
|
|
5067
5245
|
|
|
5068
5246
|
// src/daemon/database/types.ts
|
|
@@ -5114,7 +5292,33 @@ async function handleDatabaseIntegrityCheck(manager) {
|
|
|
5114
5292
|
|
|
5115
5293
|
// src/daemon/embedding/manager.ts
|
|
5116
5294
|
import { createHash as createHash3 } from "crypto";
|
|
5295
|
+
|
|
5296
|
+
// src/intelligence/batch.ts
|
|
5297
|
+
async function batchExecute(items, fn, options) {
|
|
5298
|
+
const { concurrency, onProgress } = options;
|
|
5299
|
+
let succeeded = 0;
|
|
5300
|
+
let failed = 0;
|
|
5301
|
+
const results = [];
|
|
5302
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
5303
|
+
const batch = items.slice(i, i + concurrency);
|
|
5304
|
+
const settled = await Promise.allSettled(batch.map(fn));
|
|
5305
|
+
for (const result of settled) {
|
|
5306
|
+
if (result.status === "fulfilled") {
|
|
5307
|
+
succeeded++;
|
|
5308
|
+
results.push({ status: "fulfilled", value: result.value });
|
|
5309
|
+
} else {
|
|
5310
|
+
failed++;
|
|
5311
|
+
results.push({ status: "rejected", reason: result.reason?.message ?? String(result.reason) });
|
|
5312
|
+
}
|
|
5313
|
+
}
|
|
5314
|
+
onProgress?.(succeeded + failed, items.length);
|
|
5315
|
+
}
|
|
5316
|
+
return { succeeded, failed, results };
|
|
5317
|
+
}
|
|
5318
|
+
|
|
5319
|
+
// src/daemon/embedding/manager.ts
|
|
5117
5320
|
var ACTIVE_STATUS = "active";
|
|
5321
|
+
var EMBEDDING_MANAGER_CONCURRENCY = 2;
|
|
5118
5322
|
var EmbeddingManager = class {
|
|
5119
5323
|
constructor(vectorStore, embeddingProvider, recordSource, logger) {
|
|
5120
5324
|
this.vectorStore = vectorStore;
|
|
@@ -5128,6 +5332,43 @@ var EmbeddingManager = class {
|
|
|
5128
5332
|
contentHash(text) {
|
|
5129
5333
|
return createHash3(CONTENT_HASH_ALGORITHM).update(text).digest("hex");
|
|
5130
5334
|
}
|
|
5335
|
+
totalPendingCount() {
|
|
5336
|
+
return EMBEDDABLE_TABLES.reduce(
|
|
5337
|
+
(sum, namespace) => sum + this.recordSource.getPendingCount(namespace),
|
|
5338
|
+
0
|
|
5339
|
+
);
|
|
5340
|
+
}
|
|
5341
|
+
async embedRecords(namespace, records, options) {
|
|
5342
|
+
if (records.length === 0) return { processed: 0, unavailable: false };
|
|
5343
|
+
const result = await batchExecute(
|
|
5344
|
+
records,
|
|
5345
|
+
async (record) => {
|
|
5346
|
+
const embedding = await this.embeddingProvider.embed(record.text);
|
|
5347
|
+
if (embedding === null) return { unavailable: true };
|
|
5348
|
+
this.vectorStore.upsert(namespace, record.id, embedding, {
|
|
5349
|
+
model: this.embeddingProvider.model,
|
|
5350
|
+
provider: this.embeddingProvider.providerName,
|
|
5351
|
+
dimensions: this.embeddingProvider.dimensions,
|
|
5352
|
+
content_hash: this.contentHash(record.text),
|
|
5353
|
+
embedded_at: epochSeconds(),
|
|
5354
|
+
domain_metadata: record.metadata
|
|
5355
|
+
});
|
|
5356
|
+
if (options.markEmbedded) {
|
|
5357
|
+
this.recordSource.markEmbedded(namespace, record.id);
|
|
5358
|
+
}
|
|
5359
|
+
return { unavailable: false };
|
|
5360
|
+
},
|
|
5361
|
+
{ concurrency: EMBEDDING_MANAGER_CONCURRENCY }
|
|
5362
|
+
);
|
|
5363
|
+
let processed = 0;
|
|
5364
|
+
let unavailable = false;
|
|
5365
|
+
for (const entry of result.results) {
|
|
5366
|
+
if (entry.status !== "fulfilled") continue;
|
|
5367
|
+
if (entry.value.unavailable) unavailable = true;
|
|
5368
|
+
else processed++;
|
|
5369
|
+
}
|
|
5370
|
+
return { processed, unavailable };
|
|
5371
|
+
}
|
|
5131
5372
|
// -------------------------------------------------------------------------
|
|
5132
5373
|
// Write-path event handlers
|
|
5133
5374
|
// -------------------------------------------------------------------------
|
|
@@ -5222,12 +5463,30 @@ var EmbeddingManager = class {
|
|
|
5222
5463
|
const currentModel = this.embeddingProvider.model;
|
|
5223
5464
|
for (const namespace of EMBEDDABLE_TABLES) {
|
|
5224
5465
|
const rows = this.recordSource.getEmbeddableRows(namespace, batchSize);
|
|
5225
|
-
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5466
|
+
const embeddedBatch = await this.embedRecords(namespace, rows, { markEmbedded: true });
|
|
5467
|
+
embedded += embeddedBatch.processed;
|
|
5468
|
+
if (embeddedBatch.unavailable) {
|
|
5469
|
+
this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during reconcile, returning partial progress", {
|
|
5470
|
+
namespace,
|
|
5471
|
+
embedded
|
|
5472
|
+
});
|
|
5473
|
+
return {
|
|
5474
|
+
embedded,
|
|
5475
|
+
stale_reembedded,
|
|
5476
|
+
orphans_cleaned,
|
|
5477
|
+
duration_ms: Date.now() - start
|
|
5478
|
+
};
|
|
5479
|
+
}
|
|
5480
|
+
const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
|
|
5481
|
+
if (staleIds.length > 0) {
|
|
5482
|
+
const records = this.recordSource.getRecordContent(namespace, staleIds);
|
|
5483
|
+
const foundIds = new Set(records.map((r) => r.id));
|
|
5484
|
+
const staleBatch = await this.embedRecords(namespace, records, { markEmbedded: false });
|
|
5485
|
+
stale_reembedded += staleBatch.processed;
|
|
5486
|
+
if (staleBatch.unavailable) {
|
|
5487
|
+
this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during stale re-embed, returning partial progress", {
|
|
5229
5488
|
namespace,
|
|
5230
|
-
|
|
5489
|
+
stale_reembedded
|
|
5231
5490
|
});
|
|
5232
5491
|
return {
|
|
5233
5492
|
embedded,
|
|
@@ -5236,46 +5495,6 @@ var EmbeddingManager = class {
|
|
|
5236
5495
|
duration_ms: Date.now() - start
|
|
5237
5496
|
};
|
|
5238
5497
|
}
|
|
5239
|
-
const hash = this.contentHash(row.text);
|
|
5240
|
-
this.vectorStore.upsert(namespace, row.id, embedding, {
|
|
5241
|
-
model: currentModel,
|
|
5242
|
-
provider: this.embeddingProvider.providerName,
|
|
5243
|
-
dimensions: this.embeddingProvider.dimensions,
|
|
5244
|
-
content_hash: hash,
|
|
5245
|
-
embedded_at: epochSeconds(),
|
|
5246
|
-
domain_metadata: row.metadata
|
|
5247
|
-
});
|
|
5248
|
-
this.recordSource.markEmbedded(namespace, row.id);
|
|
5249
|
-
embedded++;
|
|
5250
|
-
}
|
|
5251
|
-
const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
|
|
5252
|
-
if (staleIds.length > 0) {
|
|
5253
|
-
const records = this.recordSource.getRecordContent(namespace, staleIds);
|
|
5254
|
-
const foundIds = new Set(records.map((r) => r.id));
|
|
5255
|
-
for (const record of records) {
|
|
5256
|
-
const embedding = await this.embeddingProvider.embed(record.text);
|
|
5257
|
-
if (embedding === null) {
|
|
5258
|
-
this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during stale re-embed, returning partial progress", {
|
|
5259
|
-
namespace,
|
|
5260
|
-
stale_reembedded
|
|
5261
|
-
});
|
|
5262
|
-
return {
|
|
5263
|
-
embedded,
|
|
5264
|
-
stale_reembedded,
|
|
5265
|
-
orphans_cleaned,
|
|
5266
|
-
duration_ms: Date.now() - start
|
|
5267
|
-
};
|
|
5268
|
-
}
|
|
5269
|
-
this.vectorStore.upsert(namespace, record.id, embedding, {
|
|
5270
|
-
model: currentModel,
|
|
5271
|
-
provider: this.embeddingProvider.providerName,
|
|
5272
|
-
dimensions: this.embeddingProvider.dimensions,
|
|
5273
|
-
content_hash: this.contentHash(record.text),
|
|
5274
|
-
embedded_at: epochSeconds(),
|
|
5275
|
-
domain_metadata: record.metadata
|
|
5276
|
-
});
|
|
5277
|
-
stale_reembedded++;
|
|
5278
|
-
}
|
|
5279
5498
|
for (const staleId of staleIds) {
|
|
5280
5499
|
if (!foundIds.has(staleId)) {
|
|
5281
5500
|
this.vectorStore.remove(namespace, staleId);
|
|
@@ -5291,12 +5510,18 @@ var EmbeddingManager = class {
|
|
|
5291
5510
|
}
|
|
5292
5511
|
const duration_ms = Date.now() - start;
|
|
5293
5512
|
if (embedded > 0 || stale_reembedded > 0 || orphans_cleaned > 0) {
|
|
5294
|
-
this.logger.info(
|
|
5295
|
-
|
|
5296
|
-
stale_reembedded,
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5513
|
+
this.logger.info(
|
|
5514
|
+
LOG_KINDS.EMBEDDING_RECONCILE,
|
|
5515
|
+
`Reconcile cycle completed: ${embedded} embedded, ${stale_reembedded} stale re-embedded, ${orphans_cleaned} orphan vectors cleaned in ${duration_ms}ms (batch=${batchSize}, concurrency=${EMBEDDING_MANAGER_CONCURRENCY})`,
|
|
5516
|
+
{
|
|
5517
|
+
batch_size: batchSize,
|
|
5518
|
+
concurrency: EMBEDDING_MANAGER_CONCURRENCY,
|
|
5519
|
+
embedded,
|
|
5520
|
+
stale_reembedded,
|
|
5521
|
+
orphans_cleaned,
|
|
5522
|
+
duration_ms
|
|
5523
|
+
}
|
|
5524
|
+
);
|
|
5300
5525
|
}
|
|
5301
5526
|
return { embedded, stale_reembedded, orphans_cleaned, duration_ms };
|
|
5302
5527
|
}
|
|
@@ -5320,7 +5545,12 @@ var EmbeddingManager = class {
|
|
|
5320
5545
|
rebuildAll() {
|
|
5321
5546
|
const { cleared } = this.vectorStore.clear();
|
|
5322
5547
|
this.recordSource.clearAllEmbedded();
|
|
5323
|
-
this.
|
|
5548
|
+
const pending = this.totalPendingCount();
|
|
5549
|
+
this.logger.info(
|
|
5550
|
+
LOG_KINDS.EMBEDDING_REBUILD,
|
|
5551
|
+
`Rebuild started: cleared ${cleared} vectors, ${pending} records pending re-embed`,
|
|
5552
|
+
{ cleared, pending, concurrency: EMBEDDING_MANAGER_CONCURRENCY }
|
|
5553
|
+
);
|
|
5324
5554
|
return { queued: cleared };
|
|
5325
5555
|
}
|
|
5326
5556
|
/**
|
|
@@ -5333,25 +5563,14 @@ var EmbeddingManager = class {
|
|
|
5333
5563
|
const staleIds = this.vectorStore.getStaleIds(namespace, currentModel, batchSize);
|
|
5334
5564
|
if (staleIds.length === 0) continue;
|
|
5335
5565
|
const records = this.recordSource.getRecordContent(namespace, staleIds);
|
|
5336
|
-
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
});
|
|
5343
|
-
return { reembedded };
|
|
5344
|
-
}
|
|
5345
|
-
const hash = this.contentHash(record.text);
|
|
5346
|
-
this.vectorStore.upsert(namespace, record.id, embedding, {
|
|
5347
|
-
model: currentModel,
|
|
5348
|
-
provider: this.embeddingProvider.providerName,
|
|
5349
|
-
dimensions: this.embeddingProvider.dimensions,
|
|
5350
|
-
content_hash: hash,
|
|
5351
|
-
embedded_at: epochSeconds(),
|
|
5352
|
-
domain_metadata: record.metadata
|
|
5566
|
+
const staleBatch = await this.embedRecords(namespace, records, { markEmbedded: false });
|
|
5567
|
+
reembedded += staleBatch.processed;
|
|
5568
|
+
if (staleBatch.unavailable) {
|
|
5569
|
+
this.logger.warn(LOG_KINDS.EMBEDDING_PROVIDER, "Provider unavailable during re-embed", {
|
|
5570
|
+
namespace,
|
|
5571
|
+
reembedded
|
|
5353
5572
|
});
|
|
5354
|
-
reembedded
|
|
5573
|
+
return { reembedded };
|
|
5355
5574
|
}
|
|
5356
5575
|
}
|
|
5357
5576
|
return { reembedded };
|
|
@@ -5436,6 +5655,21 @@ var DEFAULT_META_MODEL = "unknown";
|
|
|
5436
5655
|
var DEFAULT_META_PROVIDER = "unknown";
|
|
5437
5656
|
var DEFAULT_META_CONTENT_HASH = "";
|
|
5438
5657
|
var FILTERABLE_COLUMNS = /* @__PURE__ */ new Set(["model", "provider", "namespace"]);
|
|
5658
|
+
var FILTERABLE_DOMAIN_METADATA_KEYS = /* @__PURE__ */ new Set([
|
|
5659
|
+
"status",
|
|
5660
|
+
"session_id",
|
|
5661
|
+
"observation_type",
|
|
5662
|
+
"project_root",
|
|
5663
|
+
"name",
|
|
5664
|
+
"source_path",
|
|
5665
|
+
"created_at"
|
|
5666
|
+
]);
|
|
5667
|
+
var FILTER_SUFFIX_TO_OPERATOR = {
|
|
5668
|
+
_gte: ">=",
|
|
5669
|
+
_lte: "<=",
|
|
5670
|
+
_gt: ">",
|
|
5671
|
+
_lt: "<"
|
|
5672
|
+
};
|
|
5439
5673
|
function cosineDistanceToSimilarity(distance) {
|
|
5440
5674
|
return 1 - distance;
|
|
5441
5675
|
}
|
|
@@ -5739,6 +5973,20 @@ var SqliteVecVectorStore = class {
|
|
|
5739
5973
|
if (FILTERABLE_COLUMNS.has(key)) {
|
|
5740
5974
|
conditions.push(`em.${key} = ?`);
|
|
5741
5975
|
params.push(value);
|
|
5976
|
+
continue;
|
|
5977
|
+
}
|
|
5978
|
+
let metadataKey = key;
|
|
5979
|
+
let operator = "=";
|
|
5980
|
+
for (const [suffix, sqlOperator] of Object.entries(FILTER_SUFFIX_TO_OPERATOR)) {
|
|
5981
|
+
if (key.endsWith(suffix)) {
|
|
5982
|
+
metadataKey = key.slice(0, -suffix.length);
|
|
5983
|
+
operator = sqlOperator;
|
|
5984
|
+
break;
|
|
5985
|
+
}
|
|
5986
|
+
}
|
|
5987
|
+
if (FILTERABLE_DOMAIN_METADATA_KEYS.has(metadataKey)) {
|
|
5988
|
+
conditions.push(`json_extract(em.domain_metadata, '$.${metadataKey}') ${operator} ?`);
|
|
5989
|
+
params.push(value);
|
|
5742
5990
|
}
|
|
5743
5991
|
}
|
|
5744
5992
|
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
@@ -5826,14 +6074,16 @@ var EmbeddingProviderAdapter = class {
|
|
|
5826
6074
|
var ACTIVE_STATUS2 = "active";
|
|
5827
6075
|
function sessionMetadata(row) {
|
|
5828
6076
|
return {
|
|
5829
|
-
...row.project_root != null ? { project_root: row.project_root } : {}
|
|
6077
|
+
...row.project_root != null ? { project_root: row.project_root } : {},
|
|
6078
|
+
...row.created_at != null ? { created_at: row.created_at } : {}
|
|
5830
6079
|
};
|
|
5831
6080
|
}
|
|
5832
6081
|
function sporeMetadata(row) {
|
|
5833
6082
|
return {
|
|
5834
6083
|
...row.status != null ? { status: row.status } : {},
|
|
5835
6084
|
...row.session_id != null ? { session_id: row.session_id } : {},
|
|
5836
|
-
...row.observation_type != null ? { observation_type: row.observation_type } : {}
|
|
6085
|
+
...row.observation_type != null ? { observation_type: row.observation_type } : {},
|
|
6086
|
+
...row.created_at != null ? { created_at: row.created_at } : {}
|
|
5837
6087
|
};
|
|
5838
6088
|
}
|
|
5839
6089
|
function emptyMetadata() {
|
|
@@ -5842,13 +6092,15 @@ function emptyMetadata() {
|
|
|
5842
6092
|
function planMetadata(row) {
|
|
5843
6093
|
return {
|
|
5844
6094
|
...row.session_id != null ? { session_id: row.session_id } : {},
|
|
5845
|
-
...row.source_path != null ? { source_path: row.source_path } : {}
|
|
6095
|
+
...row.source_path != null ? { source_path: row.source_path } : {},
|
|
6096
|
+
...row.created_at != null ? { created_at: row.created_at } : {}
|
|
5846
6097
|
};
|
|
5847
6098
|
}
|
|
5848
6099
|
function skillRecordMetadata(row) {
|
|
5849
6100
|
return {
|
|
5850
6101
|
...row.status != null ? { status: row.status } : {},
|
|
5851
|
-
...row.name != null ? { name: row.name } : {}
|
|
6102
|
+
...row.name != null ? { name: row.name } : {},
|
|
6103
|
+
...row.created_at != null ? { created_at: row.created_at } : {}
|
|
5852
6104
|
};
|
|
5853
6105
|
}
|
|
5854
6106
|
function metadataFor(namespace, row) {
|
|
@@ -6693,10 +6945,10 @@ var ANTHROPIC_MODELS_CACHE_TTL_MS = 10 * 60 * 1e3;
|
|
|
6693
6945
|
var anthropicModelsCache = null;
|
|
6694
6946
|
var HTTP_OK2 = 200;
|
|
6695
6947
|
var HTTP_BAD_REQUEST2 = 400;
|
|
6696
|
-
async function handleGetProviders() {
|
|
6948
|
+
async function handleGetProviders(logger) {
|
|
6697
6949
|
const detectionPlan = [
|
|
6698
6950
|
{
|
|
6699
|
-
detect: () => detectAnthropic(),
|
|
6951
|
+
detect: () => detectAnthropic(logger),
|
|
6700
6952
|
fallback: { type: "anthropic", runtime: "claude-sdk", available: false, models: [] }
|
|
6701
6953
|
},
|
|
6702
6954
|
{
|
|
@@ -6708,11 +6960,11 @@ async function handleGetProviders() {
|
|
|
6708
6960
|
fallback: { type: "lmstudio", runtime: "claude-sdk", available: false, baseUrl: LmStudioBackend.DEFAULT_BASE_URL, models: [] }
|
|
6709
6961
|
},
|
|
6710
6962
|
{
|
|
6711
|
-
detect: () => detectRemoteProviderInfo("openai", DEFAULT_OPENAI_URL),
|
|
6963
|
+
detect: () => detectRemoteProviderInfo("openai", DEFAULT_OPENAI_URL, logger),
|
|
6712
6964
|
fallback: { type: "openai", runtime: "openai-agents", available: false, authConfigured: false, baseUrl: DEFAULT_OPENAI_URL, models: [] }
|
|
6713
6965
|
},
|
|
6714
6966
|
{
|
|
6715
|
-
detect: () => detectRemoteProviderInfo("openrouter", DEFAULT_OPENROUTER_URL),
|
|
6967
|
+
detect: () => detectRemoteProviderInfo("openrouter", DEFAULT_OPENROUTER_URL, logger),
|
|
6716
6968
|
fallback: { type: "openrouter", runtime: "openai-agents", available: false, authConfigured: false, baseUrl: DEFAULT_OPENROUTER_URL, models: [] }
|
|
6717
6969
|
},
|
|
6718
6970
|
{
|
|
@@ -6771,7 +7023,10 @@ async function handleTestProvider(req) {
|
|
|
6771
7023
|
result = testAnthropic();
|
|
6772
7024
|
}
|
|
6773
7025
|
} catch (err) {
|
|
6774
|
-
result = {
|
|
7026
|
+
result = {
|
|
7027
|
+
ok: false,
|
|
7028
|
+
error: errorMessage(err)
|
|
7029
|
+
};
|
|
6775
7030
|
}
|
|
6776
7031
|
if (result.ok) {
|
|
6777
7032
|
result.latency_ms = Math.round(performance.now() - start);
|
|
@@ -6790,7 +7045,7 @@ async function detectLocalProviderInfo(type, defaultBaseUrl) {
|
|
|
6790
7045
|
models
|
|
6791
7046
|
};
|
|
6792
7047
|
}
|
|
6793
|
-
async function detectAnthropic() {
|
|
7048
|
+
async function detectAnthropic(logger) {
|
|
6794
7049
|
const now = Date.now();
|
|
6795
7050
|
if (anthropicModelsCache && now - anthropicModelsCache.ts < ANTHROPIC_MODELS_CACHE_TTL_MS) {
|
|
6796
7051
|
return { type: "anthropic", runtime: "claude-sdk", available: true, models: anthropicModelsCache.models };
|
|
@@ -6806,12 +7061,14 @@ async function detectAnthropic() {
|
|
|
6806
7061
|
if (liveModels.length > 0) {
|
|
6807
7062
|
models = liveModels;
|
|
6808
7063
|
}
|
|
6809
|
-
} catch {
|
|
7064
|
+
} catch (err) {
|
|
7065
|
+
const detail = errorMessage(err);
|
|
7066
|
+
logger?.warn("providers.anthropic.models-unavailable", "Anthropic model list unavailable", { error: detail });
|
|
6810
7067
|
}
|
|
6811
7068
|
anthropicModelsCache = { ts: now, models };
|
|
6812
7069
|
return { type: "anthropic", runtime: "claude-sdk", available: true, models };
|
|
6813
7070
|
}
|
|
6814
|
-
async function detectRemoteProviderInfo(type, baseUrl) {
|
|
7071
|
+
async function detectRemoteProviderInfo(type, baseUrl, logger) {
|
|
6815
7072
|
const authConfigured = Boolean(getRemoteProviderApiKey(type));
|
|
6816
7073
|
let models = [];
|
|
6817
7074
|
let available = false;
|
|
@@ -6819,8 +7076,10 @@ async function detectRemoteProviderInfo(type, baseUrl) {
|
|
|
6819
7076
|
try {
|
|
6820
7077
|
models = await fetchRemoteProviderModels(type, void 0, ANTHROPIC_MODELS_TIMEOUT_MS);
|
|
6821
7078
|
available = true;
|
|
6822
|
-
} catch {
|
|
7079
|
+
} catch (err) {
|
|
6823
7080
|
available = false;
|
|
7081
|
+
const detail = errorMessage(err);
|
|
7082
|
+
logger?.warn(`providers.${type}.models-unavailable`, `${type} model list unavailable`, { error: detail });
|
|
6824
7083
|
}
|
|
6825
7084
|
}
|
|
6826
7085
|
return {
|
|
@@ -7009,7 +7268,7 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
7009
7268
|
if (!lastEnabled) {
|
|
7010
7269
|
logger.info(LOG_KINDS.AGENT_RUN, "Scheduled agent tasks disabled (agent.scheduled_tasks_enabled: false) \u2014 jobs registered but will no-op until enabled");
|
|
7011
7270
|
}
|
|
7012
|
-
const { loadAllTasks: loadAllTasks2 } = await import("./registry-
|
|
7271
|
+
const { loadAllTasks: loadAllTasks2 } = await import("./registry-F3THYC5M.js");
|
|
7013
7272
|
const allTasks = Array.from(loadAllTasks2(definitionsDir, vaultDir).values());
|
|
7014
7273
|
const taskAgentMap = /* @__PURE__ */ new Map();
|
|
7015
7274
|
for (const task of allTasks) {
|
|
@@ -7045,7 +7304,7 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
7045
7304
|
lastEnabled = enabled;
|
|
7046
7305
|
}
|
|
7047
7306
|
if (!enabled) return;
|
|
7048
|
-
const { runAgent: runAgent2 } = await import("./executor-
|
|
7307
|
+
const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
|
|
7049
7308
|
const resumableRun = getLatestResumableRunForTask(DEFAULT_AGENT_ID, taskName);
|
|
7050
7309
|
if (resumableRun) {
|
|
7051
7310
|
const resumed = await runAgent2(vaultDir, {
|
|
@@ -7053,7 +7312,8 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
7053
7312
|
task: taskName,
|
|
7054
7313
|
resumeRunId: resumableRun.id,
|
|
7055
7314
|
resumeMode: "scheduled",
|
|
7056
|
-
embeddingManager
|
|
7315
|
+
embeddingManager,
|
|
7316
|
+
logger
|
|
7057
7317
|
});
|
|
7058
7318
|
logger.info(LOG_KINDS.AGENT_RUN, `Scheduled task ${taskName} resumed`, {
|
|
7059
7319
|
status: resumed.status,
|
|
@@ -7084,7 +7344,8 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
7084
7344
|
task: taskName,
|
|
7085
7345
|
instruction: built?.instruction,
|
|
7086
7346
|
runContext: built?.context,
|
|
7087
|
-
embeddingManager
|
|
7347
|
+
embeddingManager,
|
|
7348
|
+
logger
|
|
7088
7349
|
});
|
|
7089
7350
|
logger.info(LOG_KINDS.AGENT_RUN, `Scheduled task ${taskName} completed`, {
|
|
7090
7351
|
status: result.status,
|
|
@@ -7405,7 +7666,8 @@ function createMcpProxyHandlers(deps) {
|
|
|
7405
7666
|
});
|
|
7406
7667
|
embeddingManager.onContentWritten("spores", spore.id, content, {
|
|
7407
7668
|
status: "active",
|
|
7408
|
-
observation_type: observationType
|
|
7669
|
+
observation_type: observationType,
|
|
7670
|
+
created_at: now
|
|
7409
7671
|
}).catch(() => {
|
|
7410
7672
|
});
|
|
7411
7673
|
return {
|
|
@@ -7482,7 +7744,8 @@ function createMcpProxyHandlers(deps) {
|
|
|
7482
7744
|
})();
|
|
7483
7745
|
embeddingManager.onContentWritten("spores", wisdom.id, consolidated_content, {
|
|
7484
7746
|
status: "active",
|
|
7485
|
-
observation_type
|
|
7747
|
+
observation_type,
|
|
7748
|
+
created_at: now
|
|
7486
7749
|
}).catch(() => {
|
|
7487
7750
|
});
|
|
7488
7751
|
for (const sourceId of sourcesSuperseded) {
|
|
@@ -7873,7 +8136,7 @@ function isPlainObject(value) {
|
|
|
7873
8136
|
}
|
|
7874
8137
|
|
|
7875
8138
|
// src/daemon/api/run-serializer.ts
|
|
7876
|
-
function buildPhaseCheckpointSummary(checkpointsRaw) {
|
|
8139
|
+
function buildPhaseCheckpointSummary(checkpointsRaw, logger) {
|
|
7877
8140
|
if (!checkpointsRaw) return [];
|
|
7878
8141
|
try {
|
|
7879
8142
|
const parsed = JSON.parse(checkpointsRaw);
|
|
@@ -7885,7 +8148,9 @@ function buildPhaseCheckpointSummary(checkpointsRaw) {
|
|
|
7885
8148
|
...phase.costUsd !== void 0 ? { costUsd: phase.costUsd } : {},
|
|
7886
8149
|
...phase.costSource !== void 0 ? { costSource: phase.costSource } : {}
|
|
7887
8150
|
}));
|
|
7888
|
-
} catch {
|
|
8151
|
+
} catch (err) {
|
|
8152
|
+
const detail = errorMessage(err);
|
|
8153
|
+
logger?.warn("run-serializer.checkpoints-parse-failed", "checkpoints JSON parse failed", { error: detail });
|
|
7889
8154
|
return [];
|
|
7890
8155
|
}
|
|
7891
8156
|
}
|
|
@@ -7905,7 +8170,8 @@ function serializeRun(run, opts = {}) {
|
|
|
7905
8170
|
includeResumeFields = true,
|
|
7906
8171
|
includePhaseCheckpoints = true,
|
|
7907
8172
|
writeIntents,
|
|
7908
|
-
duration_ms
|
|
8173
|
+
duration_ms,
|
|
8174
|
+
logger
|
|
7909
8175
|
} = opts;
|
|
7910
8176
|
const base = {
|
|
7911
8177
|
id: run.id,
|
|
@@ -7944,7 +8210,7 @@ function serializeRun(run, opts = {}) {
|
|
|
7944
8210
|
resumed_at: run.resumed_at,
|
|
7945
8211
|
checkpoints: run.checkpoints
|
|
7946
8212
|
} : {},
|
|
7947
|
-
...includePhaseCheckpoints ? { phase_checkpoints: buildPhaseCheckpointSummary(run.checkpoints) } : {},
|
|
8213
|
+
...includePhaseCheckpoints ? { phase_checkpoints: buildPhaseCheckpointSummary(run.checkpoints, logger) } : {},
|
|
7948
8214
|
...writeIntents !== void 0 && writeIntents !== null ? { write_intents: writeIntents } : {},
|
|
7949
8215
|
...duration_ms !== void 0 ? { duration_ms } : {}
|
|
7950
8216
|
};
|
|
@@ -8033,7 +8299,7 @@ function createAgentRunHandlers(deps) {
|
|
|
8033
8299
|
};
|
|
8034
8300
|
}
|
|
8035
8301
|
}
|
|
8036
|
-
const { runAgent: runAgent2 } = await import("./executor-
|
|
8302
|
+
const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
|
|
8037
8303
|
const resultPromise = runAgent2(vaultDir, {
|
|
8038
8304
|
task,
|
|
8039
8305
|
instruction,
|
|
@@ -8042,7 +8308,8 @@ function createAgentRunHandlers(deps) {
|
|
|
8042
8308
|
runContext,
|
|
8043
8309
|
dryRun,
|
|
8044
8310
|
evaluationId,
|
|
8045
|
-
executionOverrides
|
|
8311
|
+
executionOverrides,
|
|
8312
|
+
logger
|
|
8046
8313
|
});
|
|
8047
8314
|
const effectiveAgentId = agentId ?? "myco-agent";
|
|
8048
8315
|
const runId = getLatestRunId(effectiveAgentId, task);
|
|
@@ -8094,7 +8361,7 @@ function createAgentRunHandlers(deps) {
|
|
|
8094
8361
|
const filterOpts = { agent_id: agentId, status, task, search };
|
|
8095
8362
|
const runs = listRuns({ ...filterOpts, limit, offset });
|
|
8096
8363
|
const total = countRuns(filterOpts);
|
|
8097
|
-
return { body: { runs: runs.map((run) => serializeRun(run)), total, offset, limit } };
|
|
8364
|
+
return { body: { runs: runs.map((run) => serializeRun(run, { logger })), total, offset, limit } };
|
|
8098
8365
|
}
|
|
8099
8366
|
async function handleGetRun(req) {
|
|
8100
8367
|
const run = getRun(req.params.id);
|
|
@@ -8107,7 +8374,8 @@ function createAgentRunHandlers(deps) {
|
|
|
8107
8374
|
body: {
|
|
8108
8375
|
run: serializeRun(run, {
|
|
8109
8376
|
writeIntents: { total, by_tool: byTool },
|
|
8110
|
-
duration_ms: runDurationMs(run)
|
|
8377
|
+
duration_ms: runDurationMs(run),
|
|
8378
|
+
logger
|
|
8111
8379
|
})
|
|
8112
8380
|
}
|
|
8113
8381
|
};
|
|
@@ -8121,14 +8389,15 @@ function createAgentRunHandlers(deps) {
|
|
|
8121
8389
|
return { status: 400, body: { error: "Run is not resumable" } };
|
|
8122
8390
|
}
|
|
8123
8391
|
const { mode } = ResumeRunBody.parse(req.body ?? {});
|
|
8124
|
-
const { runAgent: runAgent2 } = await import("./executor-
|
|
8392
|
+
const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
|
|
8125
8393
|
const resultPromise = runAgent2(vaultDir, {
|
|
8126
8394
|
agentId: run.agent_id,
|
|
8127
8395
|
task: run.task ?? void 0,
|
|
8128
8396
|
instruction: run.instruction ?? void 0,
|
|
8129
8397
|
resumeRunId: run.id,
|
|
8130
8398
|
resumeMode: mode ?? "manual",
|
|
8131
|
-
embeddingManager
|
|
8399
|
+
embeddingManager,
|
|
8400
|
+
logger
|
|
8132
8401
|
});
|
|
8133
8402
|
resultPromise.then((result) => {
|
|
8134
8403
|
logger.info(LOG_KINDS.AGENT_RUN, "Agent run resumed", {
|
|
@@ -8351,7 +8620,7 @@ function createAgentEvaluationHandlers(deps) {
|
|
|
8351
8620
|
});
|
|
8352
8621
|
const dryRun = body.matrix.dryRun ?? false;
|
|
8353
8622
|
void (async () => {
|
|
8354
|
-
const { runAgent: runAgent2 } = await import("./executor-
|
|
8623
|
+
const { runAgent: runAgent2 } = await import("./executor-FJCMNSXM.js");
|
|
8355
8624
|
let anyCompleted = false;
|
|
8356
8625
|
let transitionedToRunning = false;
|
|
8357
8626
|
const sharedPhases = body.matrix.phases;
|
|
@@ -8361,6 +8630,7 @@ function createAgentEvaluationHandlers(deps) {
|
|
|
8361
8630
|
evaluationId: evalId,
|
|
8362
8631
|
dryRun,
|
|
8363
8632
|
embeddingManager,
|
|
8633
|
+
logger,
|
|
8364
8634
|
executionOverrides: {
|
|
8365
8635
|
...cell.runtime ? { runtime: cell.runtime } : {},
|
|
8366
8636
|
...cell.reasoningLevel ? { reasoningLevel: cell.reasoningLevel } : {},
|
|
@@ -9776,7 +10046,8 @@ function createStopProcessor(deps) {
|
|
|
9776
10046
|
}
|
|
9777
10047
|
}
|
|
9778
10048
|
const existingSessionMeta = registry.getSession(sessionId);
|
|
9779
|
-
|
|
10049
|
+
const dbSession = existingSessionMeta ? void 0 : getSession(sessionId);
|
|
10050
|
+
if (!hookTranscriptPath && !existingSessionMeta && !dbSession) {
|
|
9780
10051
|
logger.info(LOG_KINDS.HOOKS_STOP, "Stop ignored \u2014 ephemeral sub-invocation", {
|
|
9781
10052
|
session_id: sessionId
|
|
9782
10053
|
});
|
|
@@ -9784,7 +10055,7 @@ function createStopProcessor(deps) {
|
|
|
9784
10055
|
}
|
|
9785
10056
|
if (!existingSessionMeta) {
|
|
9786
10057
|
registry.register(sessionId, { started_at: (/* @__PURE__ */ new Date()).toISOString() });
|
|
9787
|
-
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from stop event", { session_id: sessionId });
|
|
10058
|
+
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, dbSession ? "Rehydrated registry from DB on stop event" : "Auto-registered session from stop event", { session_id: sessionId });
|
|
9788
10059
|
}
|
|
9789
10060
|
const sessionMeta = existingSessionMeta ?? registry.getSession(sessionId);
|
|
9790
10061
|
logger.info(LOG_KINDS.HOOKS_STOP, "Stop received", {
|
|
@@ -9878,44 +10149,55 @@ function createEventDispatcher(deps) {
|
|
|
9878
10149
|
};
|
|
9879
10150
|
logger.debug(LOG_KINDS.HOOKS_EVENT, "Event received", { type: event.type, session_id: event.session_id });
|
|
9880
10151
|
if (!registry.getSession(event.session_id)) {
|
|
9881
|
-
const
|
|
9882
|
-
|
|
9883
|
-
|
|
9884
|
-
|
|
9885
|
-
const reason = cached.reason ?? "rule";
|
|
9886
|
-
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event for previously-dropped session", {
|
|
10152
|
+
const existingRow = getSession(event.session_id);
|
|
10153
|
+
if (existingRow) {
|
|
10154
|
+
registry.register(event.session_id, { started_at: event.timestamp });
|
|
10155
|
+
logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Rehydrated registry from DB", {
|
|
9887
10156
|
session_id: event.session_id,
|
|
9888
|
-
|
|
9889
|
-
|
|
10157
|
+
agent: existingRow.agent,
|
|
10158
|
+
type: event.type
|
|
9890
10159
|
});
|
|
9891
|
-
|
|
9892
|
-
}
|
|
9893
|
-
|
|
9894
|
-
|
|
9895
|
-
|
|
9896
|
-
|
|
9897
|
-
|
|
9898
|
-
|
|
9899
|
-
|
|
9900
|
-
|
|
9901
|
-
|
|
9902
|
-
|
|
10160
|
+
reconcileSession(event.session_id);
|
|
10161
|
+
} else {
|
|
10162
|
+
const cached = droppedSessions.get(event.session_id);
|
|
10163
|
+
const hasTranscriptNow = typeof event.transcript_path === "string" && event.transcript_path.length > 0;
|
|
10164
|
+
const shouldReevaluate = cached && !cached.hadTranscriptMeta && hasTranscriptNow;
|
|
10165
|
+
if (cached && !shouldReevaluate) {
|
|
10166
|
+
const reason = cached.reason ?? "rule";
|
|
10167
|
+
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event for previously-dropped session", {
|
|
10168
|
+
session_id: event.session_id,
|
|
10169
|
+
type: event.type,
|
|
10170
|
+
reason
|
|
10171
|
+
});
|
|
10172
|
+
return { body: { ok: true, ignored: reason } };
|
|
10173
|
+
}
|
|
10174
|
+
if (shouldReevaluate) {
|
|
10175
|
+
droppedSessions.delete(event.session_id);
|
|
10176
|
+
}
|
|
10177
|
+
const { decision, hadTranscriptMeta } = evaluateAutoRegistration(event);
|
|
10178
|
+
if (decision.action === "drop") {
|
|
10179
|
+
rememberDropped(event.session_id, decision.reason, hadTranscriptMeta);
|
|
10180
|
+
logger.info(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Ignored event that failed session capture rules", {
|
|
10181
|
+
session_id: event.session_id,
|
|
10182
|
+
type: event.type,
|
|
10183
|
+
reason: decision.reason ?? "rule"
|
|
10184
|
+
});
|
|
10185
|
+
return { body: { ok: true, ignored: decision.reason ?? "rule" } };
|
|
10186
|
+
}
|
|
10187
|
+
registry.register(event.session_id, { started_at: event.timestamp });
|
|
10188
|
+
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from event", { session_id: event.session_id });
|
|
10189
|
+
const now = epochSeconds();
|
|
10190
|
+
const startedEpoch = Math.floor(new Date(event.timestamp).getTime() / 1e3);
|
|
10191
|
+
upsertSession({
|
|
10192
|
+
id: event.session_id,
|
|
10193
|
+
agent: event.agent ?? DEFAULT_SYMBIONT_NAME,
|
|
10194
|
+
status: "active",
|
|
10195
|
+
started_at: startedEpoch,
|
|
10196
|
+
created_at: now,
|
|
10197
|
+
machine_id: machineId
|
|
9903
10198
|
});
|
|
9904
|
-
|
|
10199
|
+
reconcileSession(event.session_id);
|
|
9905
10200
|
}
|
|
9906
|
-
registry.register(event.session_id, { started_at: event.timestamp });
|
|
9907
|
-
logger.debug(LOG_KINDS.LIFECYCLE_AUTO_REGISTER, "Auto-registered session from event", { session_id: event.session_id });
|
|
9908
|
-
const now = epochSeconds();
|
|
9909
|
-
const startedEpoch = Math.floor(new Date(event.timestamp).getTime() / 1e3);
|
|
9910
|
-
upsertSession({
|
|
9911
|
-
id: event.session_id,
|
|
9912
|
-
agent: event.agent ?? DEFAULT_SYMBIONT_NAME,
|
|
9913
|
-
status: "active",
|
|
9914
|
-
started_at: startedEpoch,
|
|
9915
|
-
created_at: now,
|
|
9916
|
-
machine_id: machineId
|
|
9917
|
-
});
|
|
9918
|
-
reconcileSession(event.session_id);
|
|
9919
10201
|
}
|
|
9920
10202
|
if (!sessionBuffers.has(event.session_id)) {
|
|
9921
10203
|
const bufferDir = path23.join(vaultDir, "buffer");
|
|
@@ -10352,7 +10634,7 @@ async function main() {
|
|
|
10352
10634
|
const databaseManager = new DatabaseMaintenanceManager(vaultDbPath(vaultDir), vaultDir, logger);
|
|
10353
10635
|
let definitionsDir;
|
|
10354
10636
|
try {
|
|
10355
|
-
const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-
|
|
10637
|
+
const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-UDNUMEDA.js");
|
|
10356
10638
|
definitionsDir = resolveDefinitionsDir2();
|
|
10357
10639
|
await registerBuiltInAgentsAndTasks(definitionsDir, vaultDir);
|
|
10358
10640
|
logger.info(LOG_KINDS.AGENT_TASK, "Built-in agents and tasks registered");
|
|
@@ -10584,7 +10866,7 @@ async function main() {
|
|
|
10584
10866
|
server.registerRoute("GET", "/api/logs/stream", handleLogStream);
|
|
10585
10867
|
server.registerRoute("GET", "/api/logs/:id", handleLogDetail);
|
|
10586
10868
|
server.registerRoute("POST", "/api/log", createLogIngestionHandler(logger));
|
|
10587
|
-
server.registerRoute("GET", "/api/models", async (req) => handleGetModels(req));
|
|
10869
|
+
server.registerRoute("GET", "/api/models", async (req) => handleGetModels(req, logger));
|
|
10588
10870
|
server.registerRoute("POST", "/api/restart", async (req) => handleRestart({ vaultDir, progressTracker }, req.body));
|
|
10589
10871
|
const updateProjectRoot = path24.dirname(vaultDir);
|
|
10590
10872
|
const updateHandlers = createUpdateHandlers({
|
|
@@ -10690,7 +10972,7 @@ async function main() {
|
|
|
10690
10972
|
}
|
|
10691
10973
|
return result;
|
|
10692
10974
|
});
|
|
10693
|
-
server.registerRoute("GET", "/api/providers", async () => handleGetProviders());
|
|
10975
|
+
server.registerRoute("GET", "/api/providers", async () => handleGetProviders(logger));
|
|
10694
10976
|
server.registerRoute("POST", "/api/providers/test", async (req) => handleTestProvider(req));
|
|
10695
10977
|
server.registerRoute("GET", "/api/providers/secrets", async () => handleGetProviderSecrets(vaultDir));
|
|
10696
10978
|
server.registerRoute("PUT", "/api/providers/secrets/:provider", async (req) => handlePutProviderSecret(vaultDir, req));
|
|
@@ -10855,4 +11137,4 @@ export {
|
|
|
10855
11137
|
handleUserPrompt,
|
|
10856
11138
|
main
|
|
10857
11139
|
};
|
|
10858
|
-
//# sourceMappingURL=main-
|
|
11140
|
+
//# sourceMappingURL=main-4HKTZFIM.js.map
|