@goondocks/myco 0.20.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-run-4HUXVRHW.js → agent-run-PQXC246Y.js} +5 -5
- package/dist/{agent-tasks-JF45ELB6.js → agent-tasks-323BZEBX.js} +5 -5
- package/dist/{chunk-P3DN5EWW.js → chunk-22JALAXN.js} +4 -4
- package/dist/chunk-22JALAXN.js.map +1 -0
- package/dist/{chunk-UOQQENDW.js → chunk-3WWJOTYG.js} +2 -2
- package/dist/{chunk-POR75WM6.js → chunk-63ZGP4Q2.js} +2 -2
- package/dist/{chunk-ACQ2AIEM.js → chunk-AIYFHQRX.js} +2 -2
- package/dist/{chunk-L6XFAJIF.js → chunk-FGY7J6EZ.js} +4 -4
- package/dist/chunk-FGY7J6EZ.js.map +1 -0
- package/dist/{chunk-4LCIKVDM.js → chunk-LZP4IJB3.js} +3 -3
- package/dist/chunk-LZP4IJB3.js.map +1 -0
- package/dist/{chunk-YSNIAJ5D.js → chunk-UEWMSIL3.js} +3 -3
- package/dist/{cli-AHTINAHY.js → cli-UWBAOHLL.js} +34 -34
- package/dist/{client-LHENCAV3.js → client-SLDDMSKN.js} +3 -3
- package/dist/{doctor-XPCF5HV5.js → doctor-UUUOVDZS.js} +7 -7
- package/dist/doctor-UUUOVDZS.js.map +1 -0
- package/dist/{executor-ACDHGTRH.js → executor-J4IBXSBY.js} +7 -7
- package/dist/{init-V3KCC36O.js → init-UDH3ZBDD.js} +11 -15
- package/dist/init-UDH3ZBDD.js.map +1 -0
- package/dist/{installer-ZNK4JSQA.js → installer-I6KRGJOO.js} +2 -2
- package/dist/{main-5S4MDCIO.js → main-E7HU4QYR.js} +222 -108
- package/dist/main-E7HU4QYR.js.map +1 -0
- package/dist/{open-AB5ULZIB.js → open-4UGDPBKN.js} +5 -5
- package/dist/{post-compact-P2B7C7FE.js → post-compact-BFU3WZSV.js} +4 -4
- package/dist/{post-tool-use-LXL6NXDS.js → post-tool-use-RYHXLCTC.js} +3 -3
- package/dist/{post-tool-use-failure-WAYVVKGR.js → post-tool-use-failure-DCVHK2P3.js} +4 -4
- package/dist/{pre-compact-BCXUCF4V.js → pre-compact-EZZCJ6AG.js} +4 -4
- package/dist/{remove-KAPX5NT2.js → remove-GBBQG3SJ.js} +5 -5
- package/dist/{restart-HQO36FTG.js → restart-RMIGKMA6.js} +6 -6
- package/dist/{search-YOMOKAAI.js → search-2A5AJVNG.js} +5 -5
- package/dist/{server-2N23P6F2.js → server-TSYZMFFK.js} +3 -3
- package/dist/{session-WW2JLHPX.js → session-NKREOTEO.js} +5 -5
- package/dist/{session-end-4WRTIBVQ.js → session-end-DQELLTGJ.js} +3 -3
- package/dist/{session-start-HRWTZXQR.js → session-start-5SUTR5GP.js} +5 -5
- package/dist/{session-start-HRWTZXQR.js.map → session-start-5SUTR5GP.js.map} +1 -1
- package/dist/{setup-llm-HFWSBUAF.js → setup-llm-SLX5764H.js} +5 -5
- 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/{stats-7A4CJ4MS.js → stats-ARBLNEE3.js} +6 -6
- package/dist/{stop-R2GDHMRA.js → stop-5AJXBKEE.js} +3 -3
- package/dist/{stop-failure-773KR4VZ.js → stop-failure-XGKTZPLR.js} +4 -4
- package/dist/{subagent-start-IDECNBHW.js → subagent-start-2JLIPGJN.js} +4 -4
- package/dist/{subagent-stop-3JH7DR2S.js → subagent-stop-FV4EOKWZ.js} +4 -4
- package/dist/{task-completed-AYVHPHDR.js → task-completed-XJKT366I.js} +4 -4
- package/dist/{update-YWYW55JM.js → update-XVSAMN4O.js} +5 -5
- package/dist/{user-prompt-submit-YELSR6XI.js → user-prompt-submit-TTBTHBBH.js} +3 -3
- package/dist/{verify-JS44DVKJ.js → verify-LMHNEYIP.js} +3 -3
- package/dist/verify-LMHNEYIP.js.map +1 -0
- package/dist/{version-K5NETYIL.js → version-HRVSEMUR.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-4LCIKVDM.js.map +0 -1
- package/dist/chunk-L6XFAJIF.js.map +0 -1
- package/dist/chunk-P3DN5EWW.js.map +0 -1
- package/dist/doctor-XPCF5HV5.js.map +0 -1
- package/dist/init-V3KCC36O.js.map +0 -1
- package/dist/main-5S4MDCIO.js.map +0 -1
- package/dist/verify-JS44DVKJ.js.map +0 -1
- /package/dist/{agent-run-4HUXVRHW.js.map → agent-run-PQXC246Y.js.map} +0 -0
- /package/dist/{agent-tasks-JF45ELB6.js.map → agent-tasks-323BZEBX.js.map} +0 -0
- /package/dist/{chunk-UOQQENDW.js.map → chunk-3WWJOTYG.js.map} +0 -0
- /package/dist/{chunk-POR75WM6.js.map → chunk-63ZGP4Q2.js.map} +0 -0
- /package/dist/{chunk-ACQ2AIEM.js.map → chunk-AIYFHQRX.js.map} +0 -0
- /package/dist/{chunk-YSNIAJ5D.js.map → chunk-UEWMSIL3.js.map} +0 -0
- /package/dist/{cli-AHTINAHY.js.map → cli-UWBAOHLL.js.map} +0 -0
- /package/dist/{client-LHENCAV3.js.map → client-SLDDMSKN.js.map} +0 -0
- /package/dist/{executor-ACDHGTRH.js.map → executor-J4IBXSBY.js.map} +0 -0
- /package/dist/{installer-ZNK4JSQA.js.map → installer-I6KRGJOO.js.map} +0 -0
- /package/dist/{open-AB5ULZIB.js.map → open-4UGDPBKN.js.map} +0 -0
- /package/dist/{post-compact-P2B7C7FE.js.map → post-compact-BFU3WZSV.js.map} +0 -0
- /package/dist/{post-tool-use-LXL6NXDS.js.map → post-tool-use-RYHXLCTC.js.map} +0 -0
- /package/dist/{post-tool-use-failure-WAYVVKGR.js.map → post-tool-use-failure-DCVHK2P3.js.map} +0 -0
- /package/dist/{pre-compact-BCXUCF4V.js.map → pre-compact-EZZCJ6AG.js.map} +0 -0
- /package/dist/{remove-KAPX5NT2.js.map → remove-GBBQG3SJ.js.map} +0 -0
- /package/dist/{restart-HQO36FTG.js.map → restart-RMIGKMA6.js.map} +0 -0
- /package/dist/{search-YOMOKAAI.js.map → search-2A5AJVNG.js.map} +0 -0
- /package/dist/{server-2N23P6F2.js.map → server-TSYZMFFK.js.map} +0 -0
- /package/dist/{session-WW2JLHPX.js.map → session-NKREOTEO.js.map} +0 -0
- /package/dist/{session-end-4WRTIBVQ.js.map → session-end-DQELLTGJ.js.map} +0 -0
- /package/dist/{setup-llm-HFWSBUAF.js.map → setup-llm-SLX5764H.js.map} +0 -0
- /package/dist/{stats-7A4CJ4MS.js.map → stats-ARBLNEE3.js.map} +0 -0
- /package/dist/{stop-R2GDHMRA.js.map → stop-5AJXBKEE.js.map} +0 -0
- /package/dist/{stop-failure-773KR4VZ.js.map → stop-failure-XGKTZPLR.js.map} +0 -0
- /package/dist/{subagent-start-IDECNBHW.js.map → subagent-start-2JLIPGJN.js.map} +0 -0
- /package/dist/{subagent-stop-3JH7DR2S.js.map → subagent-stop-FV4EOKWZ.js.map} +0 -0
- /package/dist/{task-completed-AYVHPHDR.js.map → task-completed-XJKT366I.js.map} +0 -0
- /package/dist/{update-YWYW55JM.js.map → update-XVSAMN4O.js.map} +0 -0
- /package/dist/{user-prompt-submit-YELSR6XI.js.map → user-prompt-submit-TTBTHBBH.js.map} +0 -0
- /package/dist/{version-K5NETYIL.js.map → version-HRVSEMUR.js.map} +0 -0
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
getEmbeddingQueueDepth,
|
|
16
16
|
getUnembedded,
|
|
17
17
|
markEmbedded
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-22JALAXN.js";
|
|
19
19
|
import {
|
|
20
20
|
getTeamPackageVersion,
|
|
21
21
|
loadSecrets,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
setResponseSummary,
|
|
73
73
|
updateCandidate,
|
|
74
74
|
updateNotificationStatus
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-FGY7J6EZ.js";
|
|
76
76
|
import {
|
|
77
77
|
fullTextSearch,
|
|
78
78
|
hydrateSearchResults
|
|
@@ -110,11 +110,11 @@ import {
|
|
|
110
110
|
listBufferSessionIds
|
|
111
111
|
} from "./chunk-V7XG6V6C.js";
|
|
112
112
|
import "./chunk-POEPHBQK.js";
|
|
113
|
-
import "./chunk-
|
|
113
|
+
import "./chunk-UEWMSIL3.js";
|
|
114
114
|
import "./chunk-SAKJMNSR.js";
|
|
115
115
|
import {
|
|
116
116
|
SymbiontInstaller
|
|
117
|
-
} from "./chunk-
|
|
117
|
+
} from "./chunk-LZP4IJB3.js";
|
|
118
118
|
import {
|
|
119
119
|
checkLocalProvider
|
|
120
120
|
} from "./chunk-BPRIYNLE.js";
|
|
@@ -189,10 +189,10 @@ import {
|
|
|
189
189
|
} from "./chunk-ZXZPJJN3.js";
|
|
190
190
|
import {
|
|
191
191
|
resolveCliEntryPath
|
|
192
|
-
} from "./chunk-
|
|
192
|
+
} from "./chunk-3WWJOTYG.js";
|
|
193
193
|
import {
|
|
194
194
|
getPluginVersion
|
|
195
|
-
} from "./chunk-
|
|
195
|
+
} from "./chunk-AIYFHQRX.js";
|
|
196
196
|
import {
|
|
197
197
|
loadManifests,
|
|
198
198
|
resolvePackageRoot
|
|
@@ -2287,7 +2287,7 @@ function getConfiguredManifests(projectRoot, config) {
|
|
|
2287
2287
|
return allManifests.filter((manifest) => fs12.existsSync(path12.join(projectRoot, manifest.configDir)));
|
|
2288
2288
|
}
|
|
2289
2289
|
function reconcileConfiguredSymbionts(projectRoot, vaultDir = path12.join(projectRoot, ".myco"), preloadedConfig) {
|
|
2290
|
-
const config = preloadedConfig ??
|
|
2290
|
+
const config = preloadedConfig ?? loadMergedConfig(vaultDir);
|
|
2291
2291
|
const manifests = getConfiguredManifests(projectRoot, config);
|
|
2292
2292
|
const packageRoot = resolvePackageRoot();
|
|
2293
2293
|
let updatedCount = 0;
|
|
@@ -2457,11 +2457,20 @@ function restoreBackup(db, backupPath) {
|
|
|
2457
2457
|
}
|
|
2458
2458
|
|
|
2459
2459
|
// src/daemon/api/backup.ts
|
|
2460
|
+
import os7 from "os";
|
|
2460
2461
|
import path14 from "path";
|
|
2462
|
+
function resolveBackupDir(config, vaultDir) {
|
|
2463
|
+
const rawDir = config.backup.dir;
|
|
2464
|
+
if (!rawDir) return path14.resolve(vaultDir, "backups");
|
|
2465
|
+
const expanded = rawDir.startsWith("~/") ? path14.join(os7.homedir(), rawDir.slice(2)) : rawDir;
|
|
2466
|
+
return path14.resolve(expanded);
|
|
2467
|
+
}
|
|
2461
2468
|
function createBackupHandlers(deps) {
|
|
2469
|
+
const currentBackupDir = () => resolveBackupDir(deps.liveConfig.current, deps.vaultDir);
|
|
2462
2470
|
async function handleCreateBackup(_req) {
|
|
2463
|
-
const
|
|
2464
|
-
const
|
|
2471
|
+
const backupDir = currentBackupDir();
|
|
2472
|
+
const filePath = createBackup(deps.db, backupDir, deps.machineId);
|
|
2473
|
+
const backups = listBackups(backupDir);
|
|
2465
2474
|
const created = backups.find((b) => b.machine_id === deps.machineId);
|
|
2466
2475
|
return {
|
|
2467
2476
|
body: {
|
|
@@ -2472,7 +2481,7 @@ function createBackupHandlers(deps) {
|
|
|
2472
2481
|
};
|
|
2473
2482
|
}
|
|
2474
2483
|
async function handleListBackups(_req) {
|
|
2475
|
-
const backups = listBackups(
|
|
2484
|
+
const backups = listBackups(currentBackupDir());
|
|
2476
2485
|
return { body: { backups } };
|
|
2477
2486
|
}
|
|
2478
2487
|
async function handleRestorePreview(req) {
|
|
@@ -2480,12 +2489,13 @@ function createBackupHandlers(deps) {
|
|
|
2480
2489
|
if (!machine_id) {
|
|
2481
2490
|
return { status: 400, body: { error: "missing_machine_id" } };
|
|
2482
2491
|
}
|
|
2483
|
-
const
|
|
2492
|
+
const backupDir = currentBackupDir();
|
|
2493
|
+
const backups = listBackups(backupDir);
|
|
2484
2494
|
const backup = backups.find((b) => b.machine_id === machine_id);
|
|
2485
2495
|
if (!backup) {
|
|
2486
2496
|
return { status: 404, body: { error: "backup_not_found" } };
|
|
2487
2497
|
}
|
|
2488
|
-
const backupPath = `${
|
|
2498
|
+
const backupPath = `${backupDir}/${backup.file_name}`;
|
|
2489
2499
|
const tables = restorePreview(deps.db, backupPath);
|
|
2490
2500
|
const total_new = tables.reduce((sum, t) => sum + t.new, 0);
|
|
2491
2501
|
const total_existing = tables.reduce((sum, t) => sum + t.existing, 0);
|
|
@@ -2496,12 +2506,13 @@ function createBackupHandlers(deps) {
|
|
|
2496
2506
|
if (!machine_id) {
|
|
2497
2507
|
return { status: 400, body: { error: "missing_machine_id" } };
|
|
2498
2508
|
}
|
|
2499
|
-
const
|
|
2509
|
+
const backupDir = currentBackupDir();
|
|
2510
|
+
const backups = listBackups(backupDir);
|
|
2500
2511
|
const backup = backups.find((b) => b.machine_id === machine_id);
|
|
2501
2512
|
if (!backup) {
|
|
2502
2513
|
return { status: 404, body: { error: "backup_not_found" } };
|
|
2503
2514
|
}
|
|
2504
|
-
const backupPath = `${
|
|
2515
|
+
const backupPath = `${backupDir}/${backup.file_name}`;
|
|
2505
2516
|
const result = restoreBackup(deps.db, backupPath);
|
|
2506
2517
|
return { body: { machine_id, ...result } };
|
|
2507
2518
|
}
|
|
@@ -2515,7 +2526,7 @@ function createBackupHandlers(deps) {
|
|
|
2515
2526
|
function createBackupConfigHandlers(deps) {
|
|
2516
2527
|
const { vaultDir } = deps;
|
|
2517
2528
|
async function handleGetBackupConfig() {
|
|
2518
|
-
const cfg =
|
|
2529
|
+
const cfg = loadMergedConfig(vaultDir);
|
|
2519
2530
|
return { body: { dir: cfg.backup.dir ?? null, default_dir: path14.resolve(vaultDir, "backups") } };
|
|
2520
2531
|
}
|
|
2521
2532
|
async function handlePutBackupConfig(req) {
|
|
@@ -2747,17 +2758,15 @@ function createTeamHandlers(deps) {
|
|
|
2747
2758
|
worker_url: url
|
|
2748
2759
|
});
|
|
2749
2760
|
writeSecret(vaultDir, TEAM_API_KEY_SECRET, api_key);
|
|
2750
|
-
|
|
2751
|
-
const config = loadConfig(vaultDir);
|
|
2761
|
+
const config = loadMergedConfig(vaultDir);
|
|
2752
2762
|
return { body: { connected: true, team: config.team } };
|
|
2753
2763
|
}
|
|
2754
2764
|
async function handleDisconnect(_req) {
|
|
2755
2765
|
updateTeamConfig(vaultDir, { enabled: false });
|
|
2756
|
-
deps.setTeamClient(null);
|
|
2757
2766
|
return { body: { connected: false } };
|
|
2758
2767
|
}
|
|
2759
2768
|
async function handleStatus(_req) {
|
|
2760
|
-
const config =
|
|
2769
|
+
const config = loadMergedConfig(vaultDir);
|
|
2761
2770
|
const client = deps.getTeamClient();
|
|
2762
2771
|
const secrets = readSecrets(vaultDir);
|
|
2763
2772
|
const hasApiKey = Boolean(secrets[TEAM_API_KEY_SECRET]);
|
|
@@ -2986,7 +2995,7 @@ function createSessionLifecycleHandlers(deps) {
|
|
|
2986
2995
|
powerManager,
|
|
2987
2996
|
machineId,
|
|
2988
2997
|
logger,
|
|
2989
|
-
|
|
2998
|
+
liveConfig,
|
|
2990
2999
|
vaultDir
|
|
2991
3000
|
} = deps;
|
|
2992
3001
|
async function handleRegister(req) {
|
|
@@ -3018,7 +3027,7 @@ function createSessionLifecycleHandlers(deps) {
|
|
|
3018
3027
|
message: branch ? `Branch: ${branch}` : void 0,
|
|
3019
3028
|
link: `/sessions/${session_id}`,
|
|
3020
3029
|
metadata: { sessionId: session_id, agent: agent ?? "claude-code", branch }
|
|
3021
|
-
},
|
|
3030
|
+
}, liveConfig.current);
|
|
3022
3031
|
return { body: { ok: true, sessions: registry.sessions } };
|
|
3023
3032
|
}
|
|
3024
3033
|
async function handleUnregister(req) {
|
|
@@ -3038,7 +3047,7 @@ function createSessionLifecycleHandlers(deps) {
|
|
|
3038
3047
|
title: "Session ended",
|
|
3039
3048
|
link: `/sessions/${session_id}`,
|
|
3040
3049
|
metadata: { sessionId: session_id }
|
|
3041
|
-
},
|
|
3050
|
+
}, liveConfig.current);
|
|
3042
3051
|
return { body: { ok: true, sessions: registry.sessions } };
|
|
3043
3052
|
}
|
|
3044
3053
|
return { handleRegister, handleUnregister };
|
|
@@ -3221,7 +3230,7 @@ function createSkillRecordDeleteHandler(deps) {
|
|
|
3221
3230
|
logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill directory", { name: record.name, error: String(err) });
|
|
3222
3231
|
}
|
|
3223
3232
|
try {
|
|
3224
|
-
const { syncSkillSymlinks } = await import("./installer-
|
|
3233
|
+
const { syncSkillSymlinks } = await import("./installer-I6KRGJOO.js");
|
|
3225
3234
|
syncSkillSymlinks(projectRoot, record.name, { remove: true });
|
|
3226
3235
|
} catch (err) {
|
|
3227
3236
|
logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill symlinks", { name: record.name, error: String(err) });
|
|
@@ -3234,37 +3243,56 @@ function createSkillRecordDeleteHandler(deps) {
|
|
|
3234
3243
|
|
|
3235
3244
|
// src/daemon/team-sync-init.ts
|
|
3236
3245
|
function initTeamSync(deps) {
|
|
3237
|
-
const {
|
|
3246
|
+
const { liveConfig, machineId, logger, vaultDir, serverVersion } = deps;
|
|
3238
3247
|
let teamClient = null;
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
const
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3248
|
+
let clientSignature = null;
|
|
3249
|
+
async function reconcileClient() {
|
|
3250
|
+
const config = liveConfig.current;
|
|
3251
|
+
const workerUrl = config.team.worker_url?.trim() || null;
|
|
3252
|
+
const apiKey = readSecrets(vaultDir)[TEAM_API_KEY_SECRET]?.trim() || null;
|
|
3253
|
+
const nextSignature = config.team.enabled && workerUrl && apiKey ? `${workerUrl}
|
|
3254
|
+
${apiKey}` : null;
|
|
3255
|
+
if (!nextSignature) {
|
|
3256
|
+
if (teamClient) {
|
|
3257
|
+
logger.info(LOG_KINDS.TEAM_SYNC_START, "Team sync client cleared", {
|
|
3258
|
+
enabled: config.team.enabled,
|
|
3259
|
+
has_worker_url: Boolean(workerUrl),
|
|
3260
|
+
has_api_key: Boolean(apiKey)
|
|
3261
|
+
});
|
|
3262
|
+
}
|
|
3263
|
+
teamClient = null;
|
|
3264
|
+
clientSignature = null;
|
|
3265
|
+
return;
|
|
3266
|
+
}
|
|
3267
|
+
if (teamClient && clientSignature === nextSignature) return;
|
|
3268
|
+
const activeWorkerUrl = workerUrl;
|
|
3269
|
+
const activeApiKey = apiKey;
|
|
3270
|
+
teamClient = new TeamSyncClient({
|
|
3271
|
+
workerUrl: activeWorkerUrl,
|
|
3272
|
+
apiKey: activeApiKey,
|
|
3273
|
+
machineId,
|
|
3274
|
+
syncProtocolVersion: SYNC_PROTOCOL_VERSION
|
|
3275
|
+
});
|
|
3276
|
+
clientSignature = nextSignature;
|
|
3277
|
+
logger.info(LOG_KINDS.TEAM_SYNC_START, "Team sync client initialized", { worker_url: activeWorkerUrl });
|
|
3278
|
+
try {
|
|
3279
|
+
await teamClient.connect({
|
|
3251
3280
|
machine_id: machineId,
|
|
3252
3281
|
version: serverVersion
|
|
3253
|
-
}).then(() => {
|
|
3254
|
-
logger.info(LOG_KINDS.TEAM_SYNC_START, "Node registered with team worker");
|
|
3255
|
-
}).catch((err) => {
|
|
3256
|
-
logger.warn(LOG_KINDS.TEAM_SYNC_ERROR, "Node registration failed (will retry on next flush)", { error: err.message });
|
|
3257
3282
|
});
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3283
|
+
logger.info(LOG_KINDS.TEAM_SYNC_START, "Node registered with team worker");
|
|
3284
|
+
} catch (err) {
|
|
3285
|
+
logger.warn(LOG_KINDS.TEAM_SYNC_ERROR, "Node registration failed (will retry on next flush)", {
|
|
3286
|
+
error: err.message
|
|
3287
|
+
});
|
|
3288
|
+
}
|
|
3289
|
+
try {
|
|
3290
|
+
const backfilled = backfillUnsynced(machineId);
|
|
3291
|
+
if (backfilled > 0) {
|
|
3292
|
+
logger.info(LOG_KINDS.TEAM_SYNC_START, `Backfilled ${backfilled} unsynced records into outbox`);
|
|
3293
|
+
}
|
|
3294
|
+
} catch (err) {
|
|
3295
|
+
logger.error(LOG_KINDS.TEAM_SYNC_ERROR, "Backfill failed", { error: err.message });
|
|
3268
3296
|
}
|
|
3269
3297
|
}
|
|
3270
3298
|
return {
|
|
@@ -3272,8 +3300,8 @@ function initTeamSync(deps) {
|
|
|
3272
3300
|
setTeamClient: (client) => {
|
|
3273
3301
|
teamClient = client;
|
|
3274
3302
|
},
|
|
3303
|
+
reconcileClient,
|
|
3275
3304
|
registerFlushJob: (powerManager) => {
|
|
3276
|
-
if (!config.team.enabled) return;
|
|
3277
3305
|
const logDeadLettered = (ids) => {
|
|
3278
3306
|
if (ids.length > 0) {
|
|
3279
3307
|
logger.error(LOG_KINDS.TEAM_SYNC_DEAD_LETTER, `Dead-lettered ${ids.length} records after max retries`, { ids });
|
|
@@ -3282,8 +3310,9 @@ function initTeamSync(deps) {
|
|
|
3282
3310
|
powerManager.register({
|
|
3283
3311
|
name: "team-sync-flush",
|
|
3284
3312
|
runIn: ["active", "idle", "sleep"],
|
|
3285
|
-
preventsDeepSleep: () => countPending() > 0,
|
|
3313
|
+
preventsDeepSleep: () => liveConfig.current.team.enabled && countPending() > 0,
|
|
3286
3314
|
fn: async () => {
|
|
3315
|
+
if (!liveConfig.current.team.enabled) return;
|
|
3287
3316
|
const client = teamClient;
|
|
3288
3317
|
if (!client) return;
|
|
3289
3318
|
const pending = listPending();
|
|
@@ -3849,11 +3878,12 @@ async function cleanupAfterSessionCascade(sessionId, result, embeddingManager, v
|
|
|
3849
3878
|
|
|
3850
3879
|
// src/daemon/trigger-title-summary.ts
|
|
3851
3880
|
async function triggerTitleSummary(sessionId, deps) {
|
|
3852
|
-
const { vaultDir, embeddingManager,
|
|
3881
|
+
const { vaultDir, embeddingManager, liveConfig, logger } = deps;
|
|
3882
|
+
const config = liveConfig.current;
|
|
3853
3883
|
if (config.agent.summary_batch_interval <= 0) return;
|
|
3854
3884
|
if (config.agent.event_tasks_enabled === false) return;
|
|
3855
3885
|
try {
|
|
3856
|
-
const { runAgent } = await import("./executor-
|
|
3886
|
+
const { runAgent } = await import("./executor-J4IBXSBY.js");
|
|
3857
3887
|
runAgent(vaultDir, {
|
|
3858
3888
|
task: "title-summary",
|
|
3859
3889
|
instruction: `Process session ${sessionId} only`,
|
|
@@ -3918,7 +3948,7 @@ async function handleGetSessionPlans(req) {
|
|
|
3918
3948
|
return { body: plans };
|
|
3919
3949
|
}
|
|
3920
3950
|
function createSessionMutationHandlers(deps) {
|
|
3921
|
-
const { embeddingManager, vaultDir, logger,
|
|
3951
|
+
const { embeddingManager, vaultDir, logger, liveConfig } = deps;
|
|
3922
3952
|
async function handleDeleteSession(req) {
|
|
3923
3953
|
const sessionId = req.params.id;
|
|
3924
3954
|
const result = deleteSessionCascade(sessionId);
|
|
@@ -3942,7 +3972,7 @@ function createSessionMutationHandlers(deps) {
|
|
|
3942
3972
|
ended_at: session.ended_at ?? epochSeconds()
|
|
3943
3973
|
});
|
|
3944
3974
|
}
|
|
3945
|
-
await triggerTitleSummary(sessionId, { vaultDir, embeddingManager,
|
|
3975
|
+
await triggerTitleSummary(sessionId, { vaultDir, embeddingManager, liveConfig, logger });
|
|
3946
3976
|
logger.info(LOG_KINDS.API_SESSION_COMPLETE, "Session manually completed", {
|
|
3947
3977
|
session_id: sessionId,
|
|
3948
3978
|
was_active: wasActive
|
|
@@ -4378,7 +4408,8 @@ var PromptContextBody = external_exports.object({
|
|
|
4378
4408
|
function createSessionContextHandler(deps) {
|
|
4379
4409
|
return async function handleSessionContext(req) {
|
|
4380
4410
|
const { session_id, branch } = SessionContextBody.parse(req.body);
|
|
4381
|
-
const { logger,
|
|
4411
|
+
const { logger, liveConfig } = deps;
|
|
4412
|
+
const config = liveConfig.current;
|
|
4382
4413
|
logger.debug(LOG_KINDS.CONTEXT_QUERY, "Session context query", { session_id });
|
|
4383
4414
|
try {
|
|
4384
4415
|
const parts = [];
|
|
@@ -4490,7 +4521,8 @@ function createResumeContextHandler(deps) {
|
|
|
4490
4521
|
function createPromptContextHandler(deps) {
|
|
4491
4522
|
return async function handlePromptContext(req) {
|
|
4492
4523
|
const { prompt, session_id } = PromptContextBody.parse(req.body);
|
|
4493
|
-
const { logger,
|
|
4524
|
+
const { logger, liveConfig, embeddingManager } = deps;
|
|
4525
|
+
const config = liveConfig.current;
|
|
4494
4526
|
if (!config.context.prompt_search) {
|
|
4495
4527
|
logger.debug(LOG_KINDS.CONTEXT_PROMPT, "Prompt search disabled by config", { session_id });
|
|
4496
4528
|
return { body: { text: "" } };
|
|
@@ -4611,7 +4643,7 @@ async function handleListSymbionts(vaultDir) {
|
|
|
4611
4643
|
const manifests = loadManifests();
|
|
4612
4644
|
let enabledNames = null;
|
|
4613
4645
|
try {
|
|
4614
|
-
enabledNames = getEnabledSymbiontNames(
|
|
4646
|
+
enabledNames = getEnabledSymbiontNames(loadMergedConfig(vaultDir));
|
|
4615
4647
|
} catch {
|
|
4616
4648
|
}
|
|
4617
4649
|
const symbionts = manifests.map((m) => ({
|
|
@@ -4628,7 +4660,7 @@ async function handleListSymbionts(vaultDir) {
|
|
|
4628
4660
|
var EMBEDDING_STATUS_IDLE = "idle";
|
|
4629
4661
|
var EMBEDDING_STATUS_PENDING = "pending";
|
|
4630
4662
|
async function handleGetEmbeddingStatus(vaultDir) {
|
|
4631
|
-
const config =
|
|
4663
|
+
const config = loadMergedConfig(vaultDir);
|
|
4632
4664
|
const { queue_depth, embedded_count } = getEmbeddingQueueDepth();
|
|
4633
4665
|
return {
|
|
4634
4666
|
body: {
|
|
@@ -6050,7 +6082,7 @@ async function handleCreateNotification(vaultDir, body) {
|
|
|
6050
6082
|
return { status: 400, body: { error: "validation_failed", issues: parsed.error.issues } };
|
|
6051
6083
|
}
|
|
6052
6084
|
const { domain, type, title, message, link, metadata } = parsed.data;
|
|
6053
|
-
const config =
|
|
6085
|
+
const config = loadMergedConfig(vaultDir);
|
|
6054
6086
|
if (!config.notifications.enabled) {
|
|
6055
6087
|
return { body: { ok: true, suppressed: true, reason: "notifications_disabled" } };
|
|
6056
6088
|
}
|
|
@@ -6254,7 +6286,7 @@ async function handleDeleteTask(req, vaultDir) {
|
|
|
6254
6286
|
}
|
|
6255
6287
|
async function handleGetTaskConfig(req, vaultDir) {
|
|
6256
6288
|
const taskId = req.params.id;
|
|
6257
|
-
const config =
|
|
6289
|
+
const config = loadMergedConfig(vaultDir);
|
|
6258
6290
|
const taskConfig = config.agent.tasks?.[taskId] ?? null;
|
|
6259
6291
|
return { status: HTTP_OK, body: { taskId, config: taskConfig } };
|
|
6260
6292
|
}
|
|
@@ -6406,16 +6438,17 @@ function buildScheduledJobs(tasks, configOverrides, context, initialLastRuns) {
|
|
|
6406
6438
|
}
|
|
6407
6439
|
|
|
6408
6440
|
// src/daemon/task-scheduling.ts
|
|
6441
|
+
var SCHEDULED_JOB_PREFIX = "scheduled:";
|
|
6409
6442
|
async function registerScheduledTasks(powerManager, deps) {
|
|
6410
|
-
const { definitionsDir, vaultDir, embeddingManager, logger,
|
|
6443
|
+
const { definitionsDir, vaultDir, embeddingManager, logger, liveConfig } = deps;
|
|
6411
6444
|
const runningTasks = /* @__PURE__ */ new Set();
|
|
6412
6445
|
if (!definitionsDir) {
|
|
6413
6446
|
logger.warn(LOG_KINDS.AGENT_ERROR, "Skipping dynamic task scheduling \u2014 definitions directory unavailable");
|
|
6414
6447
|
return;
|
|
6415
6448
|
}
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6449
|
+
let lastEnabled = liveConfig.current.agent.scheduled_tasks_enabled !== false;
|
|
6450
|
+
if (!lastEnabled) {
|
|
6451
|
+
logger.info(LOG_KINDS.AGENT_RUN, "Scheduled agent tasks disabled (agent.scheduled_tasks_enabled: false) \u2014 jobs registered but will no-op until enabled");
|
|
6419
6452
|
}
|
|
6420
6453
|
const { loadAllTasks: loadAllTasks2 } = await import("./registry-MGJSJBAS.js");
|
|
6421
6454
|
const allTasks = Array.from(loadAllTasks2(definitionsDir, vaultDir).values());
|
|
@@ -6443,7 +6476,17 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
6443
6476
|
else runningTasks.delete(name);
|
|
6444
6477
|
},
|
|
6445
6478
|
runTask: async (taskName) => {
|
|
6446
|
-
const
|
|
6479
|
+
const config = liveConfig.current;
|
|
6480
|
+
const enabled = config.agent.scheduled_tasks_enabled !== false;
|
|
6481
|
+
if (enabled !== lastEnabled) {
|
|
6482
|
+
logger.info(
|
|
6483
|
+
LOG_KINDS.AGENT_RUN,
|
|
6484
|
+
enabled ? "Scheduled agent tasks re-enabled \u2014 resuming" : "Scheduled agent tasks disabled \u2014 skipping until re-enabled"
|
|
6485
|
+
);
|
|
6486
|
+
lastEnabled = enabled;
|
|
6487
|
+
}
|
|
6488
|
+
if (!enabled) return;
|
|
6489
|
+
const { runAgent } = await import("./executor-J4IBXSBY.js");
|
|
6447
6490
|
const taskConfig = config.agent.tasks?.[taskName];
|
|
6448
6491
|
const projectRoot = resolve(vaultDir, "..");
|
|
6449
6492
|
const built = buildTaskInstruction(taskName, taskConfig?.params, taskAgentMap.get(taskName), projectRoot, embeddingManager);
|
|
@@ -6535,14 +6578,12 @@ async function registerScheduledTasks(powerManager, deps) {
|
|
|
6535
6578
|
};
|
|
6536
6579
|
const scheduledJobs = buildScheduledJobs(
|
|
6537
6580
|
allTasks,
|
|
6538
|
-
|
|
6581
|
+
liveConfig.current.agent.tasks ?? {},
|
|
6539
6582
|
scheduledContext,
|
|
6540
6583
|
initialLastRuns
|
|
6541
6584
|
);
|
|
6542
|
-
|
|
6543
|
-
|
|
6544
|
-
}
|
|
6545
|
-
logger.info(LOG_KINDS.DAEMON_START, `Registered ${scheduledJobs.length} scheduled task(s)`, {
|
|
6585
|
+
powerManager.replaceGroup(SCHEDULED_JOB_PREFIX, scheduledJobs);
|
|
6586
|
+
logger.info(LOG_KINDS.DAEMON_START, `Synced ${scheduledJobs.length} scheduled task(s)`, {
|
|
6546
6587
|
tasks: scheduledJobs.map((j) => j.name)
|
|
6547
6588
|
});
|
|
6548
6589
|
}
|
|
@@ -6807,7 +6848,7 @@ function createAgentRunHandlers(deps) {
|
|
|
6807
6848
|
const { vaultDir, embeddingManager, logger } = deps;
|
|
6808
6849
|
async function handleRun(req) {
|
|
6809
6850
|
const { task, instruction: rawInstruction, agentId } = AgentRunBody.parse(req.body);
|
|
6810
|
-
const mycoConfig =
|
|
6851
|
+
const mycoConfig = loadMergedConfig(vaultDir);
|
|
6811
6852
|
if (!hasConfiguredProvider(mycoConfig, task)) {
|
|
6812
6853
|
return {
|
|
6813
6854
|
status: 400,
|
|
@@ -6842,7 +6883,7 @@ function createAgentRunHandlers(deps) {
|
|
|
6842
6883
|
};
|
|
6843
6884
|
}
|
|
6844
6885
|
}
|
|
6845
|
-
const { runAgent } = await import("./executor-
|
|
6886
|
+
const { runAgent } = await import("./executor-J4IBXSBY.js");
|
|
6846
6887
|
const resultPromise = runAgent(vaultDir, {
|
|
6847
6888
|
task,
|
|
6848
6889
|
instruction,
|
|
@@ -7218,6 +7259,10 @@ var PowerManager = class {
|
|
|
7218
7259
|
register(job) {
|
|
7219
7260
|
this.jobs.push(job);
|
|
7220
7261
|
}
|
|
7262
|
+
replaceGroup(prefix, jobs) {
|
|
7263
|
+
this.jobs = this.jobs.filter((job) => !job.name.startsWith(prefix));
|
|
7264
|
+
this.jobs.push(...jobs);
|
|
7265
|
+
}
|
|
7221
7266
|
recordActivity() {
|
|
7222
7267
|
this.lastActivity = Date.now();
|
|
7223
7268
|
this.deepSleepHeld = false;
|
|
@@ -7367,7 +7412,7 @@ async function runSessionMaintenance(deps) {
|
|
|
7367
7412
|
// src/daemon/power-jobs.ts
|
|
7368
7413
|
var STAGING_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
|
|
7369
7414
|
function registerPowerJobs(powerManager, deps) {
|
|
7370
|
-
const { embeddingManager, registry, logger,
|
|
7415
|
+
const { embeddingManager, registry, logger, liveConfig, db, machineId, vaultDir, databaseManager } = deps;
|
|
7371
7416
|
let reconcileRunning = false;
|
|
7372
7417
|
powerManager.register({
|
|
7373
7418
|
name: "embedding-reconcile",
|
|
@@ -7390,14 +7435,14 @@ function registerPowerJobs(powerManager, deps) {
|
|
|
7390
7435
|
registeredSessionIds: () => registry.sessions,
|
|
7391
7436
|
embeddingManager,
|
|
7392
7437
|
vaultDir,
|
|
7393
|
-
staleThresholdMs:
|
|
7438
|
+
staleThresholdMs: liveConfig.current.daemon.stale_session_threshold_ms
|
|
7394
7439
|
})
|
|
7395
7440
|
});
|
|
7396
7441
|
powerManager.register({
|
|
7397
7442
|
name: "log-retention",
|
|
7398
7443
|
runIn: ["idle", "sleep"],
|
|
7399
7444
|
fn: async () => {
|
|
7400
|
-
const retentionDays =
|
|
7445
|
+
const retentionDays = liveConfig.current.daemon.log_retention_days;
|
|
7401
7446
|
const cutoff = new Date(Date.now() - retentionDays * MS_PER_DAY).toISOString();
|
|
7402
7447
|
const deleted = deleteOldLogs(cutoff);
|
|
7403
7448
|
if (deleted > 0) {
|
|
@@ -7410,6 +7455,7 @@ function registerPowerJobs(powerManager, deps) {
|
|
|
7410
7455
|
runIn: ["idle", "sleep"],
|
|
7411
7456
|
fn: async () => {
|
|
7412
7457
|
try {
|
|
7458
|
+
const backupDir = resolveBackupDir(liveConfig.current, vaultDir);
|
|
7413
7459
|
logger.info(LOG_KINDS.BACKUP_START, "Auto-backup starting");
|
|
7414
7460
|
const filePath = createBackup(db, backupDir, machineId);
|
|
7415
7461
|
logger.info(LOG_KINDS.BACKUP_COMPLETE, "Auto-backup complete", { file_path: filePath });
|
|
@@ -7422,6 +7468,7 @@ function registerPowerJobs(powerManager, deps) {
|
|
|
7422
7468
|
name: "database-optimize",
|
|
7423
7469
|
runIn: ["idle", "sleep"],
|
|
7424
7470
|
fn: async () => {
|
|
7471
|
+
const config = liveConfig.current;
|
|
7425
7472
|
if (!config.maintenance?.auto_optimize) return;
|
|
7426
7473
|
const intervalMs = (config.maintenance.auto_optimize_interval_hours ?? 24) * MS_PER_HOUR;
|
|
7427
7474
|
const lastRun = await databaseManager.getLastOptimizeAt();
|
|
@@ -7734,7 +7781,7 @@ function captureBatchImages(input) {
|
|
|
7734
7781
|
|
|
7735
7782
|
// src/daemon/plan-capture.ts
|
|
7736
7783
|
import { createHash as createHash4 } from "crypto";
|
|
7737
|
-
import
|
|
7784
|
+
import os8 from "os";
|
|
7738
7785
|
import path20 from "path";
|
|
7739
7786
|
function extractTaggedPlans(text, tags) {
|
|
7740
7787
|
const results = [];
|
|
@@ -7763,7 +7810,7 @@ var PLAN_ID_HASH_LENGTH = 16;
|
|
|
7763
7810
|
function isInPlanDirectory(filePath, watchDirs, projectRoot) {
|
|
7764
7811
|
const abs = path20.isAbsolute(filePath) ? filePath : path20.resolve(projectRoot, filePath);
|
|
7765
7812
|
return watchDirs.some((dir) => {
|
|
7766
|
-
const expanded = dir.startsWith("~/") ? path20.join(
|
|
7813
|
+
const expanded = dir.startsWith("~/") ? path20.join(os8.homedir(), dir.slice(2)) : dir;
|
|
7767
7814
|
const absDir = path20.isAbsolute(expanded) ? expanded : path20.resolve(projectRoot, expanded);
|
|
7768
7815
|
const prefix = absDir.endsWith(path20.sep) ? absDir : absDir + path20.sep;
|
|
7769
7816
|
return abs === absDir || abs.startsWith(prefix);
|
|
@@ -7867,7 +7914,7 @@ function enrichTurnsWithToolMetadata(turns, events) {
|
|
|
7867
7914
|
}
|
|
7868
7915
|
}
|
|
7869
7916
|
function createStopProcessor(deps) {
|
|
7870
|
-
const { registry, sessionBuffers, transcriptMiner, embeddingManager, logger,
|
|
7917
|
+
const { registry, sessionBuffers, transcriptMiner, embeddingManager, logger, liveConfig, vaultDir } = deps;
|
|
7871
7918
|
let activeStopProcessing = null;
|
|
7872
7919
|
const sessionTitleCache = /* @__PURE__ */ new Map();
|
|
7873
7920
|
const StopBody = external_exports.object({
|
|
@@ -7877,7 +7924,7 @@ function createStopProcessor(deps) {
|
|
|
7877
7924
|
transcript_path: external_exports.string().nullish(),
|
|
7878
7925
|
last_assistant_message: external_exports.string().nullish()
|
|
7879
7926
|
});
|
|
7880
|
-
const triggerTitleSummary2 = (sessionId) => triggerTitleSummary(sessionId, { vaultDir, embeddingManager,
|
|
7927
|
+
const triggerTitleSummary2 = (sessionId) => triggerTitleSummary(sessionId, { vaultDir, embeddingManager, liveConfig, logger });
|
|
7881
7928
|
function cleanupInvalidCapturedSession(sessionId) {
|
|
7882
7929
|
registry.unregister(sessionId);
|
|
7883
7930
|
sessionBuffers.delete(sessionId);
|
|
@@ -8138,7 +8185,7 @@ function createEventDispatcher(deps) {
|
|
|
8138
8185
|
powerManager,
|
|
8139
8186
|
logger,
|
|
8140
8187
|
machineId,
|
|
8141
|
-
|
|
8188
|
+
liveConfig,
|
|
8142
8189
|
vaultDir,
|
|
8143
8190
|
reconcileSession,
|
|
8144
8191
|
planWatchConfig,
|
|
@@ -8205,7 +8252,7 @@ function createEventDispatcher(deps) {
|
|
|
8205
8252
|
});
|
|
8206
8253
|
}
|
|
8207
8254
|
const batchCount = promptNumber;
|
|
8208
|
-
const summaryInterval =
|
|
8255
|
+
const summaryInterval = liveConfig.current.agent.summary_batch_interval;
|
|
8209
8256
|
if (summaryInterval > 0 && batchCount > 0 && batchCount % summaryInterval === 0) {
|
|
8210
8257
|
triggerTitleSummary2(event.session_id);
|
|
8211
8258
|
}
|
|
@@ -8429,7 +8476,6 @@ function createPlanWatchReaction(deps) {
|
|
|
8429
8476
|
|
|
8430
8477
|
// src/daemon/main.ts
|
|
8431
8478
|
import fs23 from "fs";
|
|
8432
|
-
import os8 from "os";
|
|
8433
8479
|
import path22 from "path";
|
|
8434
8480
|
function killStaleDaemon(vaultDir, logger) {
|
|
8435
8481
|
const daemonJsonPath = path22.join(vaultDir, "daemon.json");
|
|
@@ -8456,7 +8502,8 @@ async function main() {
|
|
|
8456
8502
|
}
|
|
8457
8503
|
const vaultDir = path22.resolve(vaultArg);
|
|
8458
8504
|
loadSecrets(vaultDir);
|
|
8459
|
-
const config =
|
|
8505
|
+
const config = loadMergedConfig(vaultDir);
|
|
8506
|
+
const liveConfig = { current: config };
|
|
8460
8507
|
const manifests = loadManifests();
|
|
8461
8508
|
const symbiontPlanDirs = manifests.flatMap((m) => m.capture?.planDirs ?? []);
|
|
8462
8509
|
const symbiontPlanTags = [...new Set(manifests.flatMap((m) => m.capture?.planTags ?? []))];
|
|
@@ -8596,7 +8643,7 @@ async function main() {
|
|
|
8596
8643
|
message: "Daemon restarted while run was in progress",
|
|
8597
8644
|
link: `/agent?run=${row.id}`,
|
|
8598
8645
|
metadata: { taskName: row.task, runId: row.id, reason: "daemon_restart" }
|
|
8599
|
-
},
|
|
8646
|
+
}, liveConfig.current);
|
|
8600
8647
|
}
|
|
8601
8648
|
logger.info(LOG_KINDS.AGENT_RUN, "Cleaned stale running agent runs", {
|
|
8602
8649
|
count: staleRows.length,
|
|
@@ -8654,7 +8701,7 @@ async function main() {
|
|
|
8654
8701
|
transcriptMiner,
|
|
8655
8702
|
embeddingManager,
|
|
8656
8703
|
logger,
|
|
8657
|
-
|
|
8704
|
+
liveConfig,
|
|
8658
8705
|
vaultDir,
|
|
8659
8706
|
planTags: symbiontPlanTags
|
|
8660
8707
|
});
|
|
@@ -8667,7 +8714,7 @@ async function main() {
|
|
|
8667
8714
|
powerManager,
|
|
8668
8715
|
machineId,
|
|
8669
8716
|
logger,
|
|
8670
|
-
|
|
8717
|
+
liveConfig,
|
|
8671
8718
|
vaultDir
|
|
8672
8719
|
});
|
|
8673
8720
|
server.registerRoute("POST", "/sessions/register", sessionLifecycle.handleRegister);
|
|
@@ -8678,7 +8725,7 @@ async function main() {
|
|
|
8678
8725
|
powerManager,
|
|
8679
8726
|
logger,
|
|
8680
8727
|
machineId,
|
|
8681
|
-
|
|
8728
|
+
liveConfig,
|
|
8682
8729
|
vaultDir,
|
|
8683
8730
|
reconcileSession: reconciler.reconcileSession,
|
|
8684
8731
|
planWatchConfig,
|
|
@@ -8686,7 +8733,7 @@ async function main() {
|
|
|
8686
8733
|
});
|
|
8687
8734
|
server.registerRoute("POST", "/events", eventDispatcher);
|
|
8688
8735
|
server.registerRoute("POST", "/events/stop", stopProcessor.handleStopRoute);
|
|
8689
|
-
const contextDeps = { embeddingManager,
|
|
8736
|
+
const contextDeps = { embeddingManager, liveConfig, logger };
|
|
8690
8737
|
server.registerRoute("POST", "/context", createSessionContextHandler(contextDeps));
|
|
8691
8738
|
server.registerRoute("POST", "/context/resume", createResumeContextHandler(contextDeps));
|
|
8692
8739
|
server.registerRoute("POST", "/context/prompt", createPromptContextHandler(contextDeps));
|
|
@@ -8705,6 +8752,9 @@ async function main() {
|
|
|
8705
8752
|
reactions.on([], () => {
|
|
8706
8753
|
configHash = computeConfigHash(vaultDir);
|
|
8707
8754
|
});
|
|
8755
|
+
reactions.on([], (ctx) => {
|
|
8756
|
+
liveConfig.current = ctx;
|
|
8757
|
+
});
|
|
8708
8758
|
reactions.on(["capture", "symbionts"], (ctx) => {
|
|
8709
8759
|
reconcileConfiguredSymbionts(path22.dirname(vaultDir), vaultDir, ctx);
|
|
8710
8760
|
});
|
|
@@ -8720,14 +8770,28 @@ async function main() {
|
|
|
8720
8770
|
delete process.env.MYCO_AGENT_DEBUG;
|
|
8721
8771
|
}
|
|
8722
8772
|
});
|
|
8773
|
+
async function syncScheduledTasks() {
|
|
8774
|
+
await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, liveConfig });
|
|
8775
|
+
}
|
|
8776
|
+
reactions.on(["agent.tasks"], async () => {
|
|
8777
|
+
await syncScheduledTasks();
|
|
8778
|
+
});
|
|
8779
|
+
async function applyConfigWriteReactions(touchedPaths) {
|
|
8780
|
+
const reactionContext = loadReactionContext(vaultDir, logger);
|
|
8781
|
+
if (!reactionContext) {
|
|
8782
|
+
configHash = computeConfigHash(vaultDir);
|
|
8783
|
+
return null;
|
|
8784
|
+
}
|
|
8785
|
+
await reactions.fire(touchedPaths, reactionContext);
|
|
8786
|
+
return reactionContext;
|
|
8787
|
+
}
|
|
8723
8788
|
server.registerRoute("PUT", "/api/config/scoped", async (req) => {
|
|
8724
8789
|
const result = await handlePutScopedConfig(vaultDir, req.body);
|
|
8725
8790
|
if (!result.status || result.status < 400) {
|
|
8726
8791
|
const body = req.body;
|
|
8727
8792
|
const touchedPaths = computeTouchedPaths(body.patch, body.clear);
|
|
8728
|
-
const reactionContext =
|
|
8793
|
+
const reactionContext = await applyConfigWriteReactions(touchedPaths);
|
|
8729
8794
|
if (reactionContext) {
|
|
8730
|
-
await reactions.fire(touchedPaths, reactionContext);
|
|
8731
8795
|
const summary = buildScopedConfigSaveNotification(body.scope, touchedPaths);
|
|
8732
8796
|
notify(vaultDir, {
|
|
8733
8797
|
domain: "settings",
|
|
@@ -8780,7 +8844,7 @@ async function main() {
|
|
|
8780
8844
|
server.registerRoute("GET", "/api/progress/:token", async (req) => handleGetProgress(progressTracker, req.params.token));
|
|
8781
8845
|
server.registerRoute("GET", "/api/sessions", handleListSessions);
|
|
8782
8846
|
server.registerRoute("GET", "/api/sessions/:id", handleGetSession);
|
|
8783
|
-
const sessionMutations = createSessionMutationHandlers({ embeddingManager, vaultDir, logger,
|
|
8847
|
+
const sessionMutations = createSessionMutationHandlers({ embeddingManager, vaultDir, logger, liveConfig });
|
|
8784
8848
|
server.registerRoute("GET", "/api/sessions/:id/impact", sessionMutations.handleGetSessionImpact);
|
|
8785
8849
|
server.registerRoute("POST", "/api/sessions/:id/complete", sessionMutations.handleCompleteSession);
|
|
8786
8850
|
server.registerRoute("DELETE", "/api/sessions/:id", sessionMutations.handleDeleteSession);
|
|
@@ -8813,12 +8877,42 @@ async function main() {
|
|
|
8813
8877
|
server.registerRoute("GET", "/api/agent/tasks", async (req) => handleListTasks(req, vaultDir));
|
|
8814
8878
|
server.registerRoute("GET", "/api/agent/tasks/:id", async (req) => handleGetTask(req, vaultDir));
|
|
8815
8879
|
server.registerRoute("GET", "/api/agent/tasks/:id/yaml", async (req) => handleGetTaskYaml(req, vaultDir));
|
|
8816
|
-
server.registerRoute("PUT", "/api/agent/tasks/:id", async (req) =>
|
|
8817
|
-
|
|
8818
|
-
|
|
8819
|
-
|
|
8880
|
+
server.registerRoute("PUT", "/api/agent/tasks/:id", async (req) => {
|
|
8881
|
+
const result = await handleUpdateTask(req, vaultDir);
|
|
8882
|
+
if (!result.status || result.status < 400) {
|
|
8883
|
+
await syncScheduledTasks();
|
|
8884
|
+
}
|
|
8885
|
+
return result;
|
|
8886
|
+
});
|
|
8887
|
+
server.registerRoute("POST", "/api/agent/tasks", async (req) => {
|
|
8888
|
+
const result = await handleCreateTask(req, vaultDir);
|
|
8889
|
+
if (!result.status || result.status < 400) {
|
|
8890
|
+
await syncScheduledTasks();
|
|
8891
|
+
}
|
|
8892
|
+
return result;
|
|
8893
|
+
});
|
|
8894
|
+
server.registerRoute("POST", "/api/agent/tasks/:id/copy", async (req) => {
|
|
8895
|
+
const result = await handleCopyTask(req, vaultDir);
|
|
8896
|
+
if (!result.status || result.status < 400) {
|
|
8897
|
+
await syncScheduledTasks();
|
|
8898
|
+
}
|
|
8899
|
+
return result;
|
|
8900
|
+
});
|
|
8901
|
+
server.registerRoute("DELETE", "/api/agent/tasks/:id", async (req) => {
|
|
8902
|
+
const result = await handleDeleteTask(req, vaultDir);
|
|
8903
|
+
if (!result.status || result.status < 400) {
|
|
8904
|
+
await syncScheduledTasks();
|
|
8905
|
+
}
|
|
8906
|
+
return result;
|
|
8907
|
+
});
|
|
8820
8908
|
server.registerRoute("GET", "/api/agent/tasks/:id/config", async (req) => handleGetTaskConfig(req, vaultDir));
|
|
8821
|
-
server.registerRoute("PUT", "/api/agent/tasks/:id/config", async (req) =>
|
|
8909
|
+
server.registerRoute("PUT", "/api/agent/tasks/:id/config", async (req) => {
|
|
8910
|
+
const result = await handleUpdateTaskConfig(req, vaultDir);
|
|
8911
|
+
if (!result.status || result.status < 400) {
|
|
8912
|
+
await applyConfigWriteReactions([`agent.tasks.${req.params.id}`]);
|
|
8913
|
+
}
|
|
8914
|
+
return result;
|
|
8915
|
+
});
|
|
8822
8916
|
server.registerRoute("GET", "/api/providers", async () => handleGetProviders());
|
|
8823
8917
|
server.registerRoute("POST", "/api/providers/test", async (req) => handleTestProvider(req));
|
|
8824
8918
|
const mcpProxy = createMcpProxyHandlers({ machineId, embeddingManager });
|
|
@@ -8828,17 +8922,25 @@ async function main() {
|
|
|
8828
8922
|
server.registerRoute("GET", "/api/mcp/plans", mcpProxy.handlePlans);
|
|
8829
8923
|
server.registerRoute("GET", "/api/mcp/sessions", mcpProxy.handleSessions);
|
|
8830
8924
|
server.registerRoute("GET", "/api/mcp/team", mcpProxy.handleTeam);
|
|
8831
|
-
const
|
|
8832
|
-
const backupDir = rawBackupDir ? path22.resolve(rawBackupDir.startsWith("~/") ? path22.join(os8.homedir(), rawBackupDir.slice(2)) : rawBackupDir) : path22.resolve(vaultDir, "backups");
|
|
8833
|
-
const backupHandlers = createBackupHandlers({ db, backupDir, machineId });
|
|
8925
|
+
const backupHandlers = createBackupHandlers({ db, machineId, vaultDir, liveConfig });
|
|
8834
8926
|
server.registerRoute("POST", "/api/backup", backupHandlers.handleCreateBackup);
|
|
8835
8927
|
server.registerRoute("GET", "/api/backups", backupHandlers.handleListBackups);
|
|
8836
8928
|
server.registerRoute("POST", "/api/restore/preview", backupHandlers.handleRestorePreview);
|
|
8837
8929
|
server.registerRoute("POST", "/api/restore", backupHandlers.handleRestore);
|
|
8838
8930
|
const backupConfigHandlers = createBackupConfigHandlers({ vaultDir });
|
|
8839
8931
|
server.registerRoute("GET", "/api/backup/config", backupConfigHandlers.handleGetBackupConfig);
|
|
8840
|
-
server.registerRoute("PUT", "/api/backup/config",
|
|
8841
|
-
|
|
8932
|
+
server.registerRoute("PUT", "/api/backup/config", async (req) => {
|
|
8933
|
+
const result = await backupConfigHandlers.handlePutBackupConfig(req);
|
|
8934
|
+
if (!result.status || result.status < 400) {
|
|
8935
|
+
await applyConfigWriteReactions(["backup.dir"]);
|
|
8936
|
+
}
|
|
8937
|
+
return result;
|
|
8938
|
+
});
|
|
8939
|
+
const teamSync = initTeamSync({ liveConfig, machineId, logger, vaultDir, serverVersion: server.version });
|
|
8940
|
+
reactions.on(["team"], async () => {
|
|
8941
|
+
await teamSync.reconcileClient();
|
|
8942
|
+
});
|
|
8943
|
+
await teamSync.reconcileClient();
|
|
8842
8944
|
const teamHandlers = createTeamHandlers({
|
|
8843
8945
|
vaultDir,
|
|
8844
8946
|
machineId,
|
|
@@ -8846,8 +8948,20 @@ async function main() {
|
|
|
8846
8948
|
getTeamClient: teamSync.getTeamClient,
|
|
8847
8949
|
setTeamClient: teamSync.setTeamClient
|
|
8848
8950
|
});
|
|
8849
|
-
server.registerRoute("POST", "/api/team/connect",
|
|
8850
|
-
|
|
8951
|
+
server.registerRoute("POST", "/api/team/connect", async (req) => {
|
|
8952
|
+
const result = await teamHandlers.handleConnect(req);
|
|
8953
|
+
if (!result.status || result.status < 400) {
|
|
8954
|
+
await applyConfigWriteReactions(["team.enabled", "team.worker_url"]);
|
|
8955
|
+
}
|
|
8956
|
+
return result;
|
|
8957
|
+
});
|
|
8958
|
+
server.registerRoute("POST", "/api/team/disconnect", async (req) => {
|
|
8959
|
+
const result = await teamHandlers.handleDisconnect(req);
|
|
8960
|
+
if (!result.status || result.status < 400) {
|
|
8961
|
+
await applyConfigWriteReactions(["team.enabled", "team.worker_url"]);
|
|
8962
|
+
}
|
|
8963
|
+
return result;
|
|
8964
|
+
});
|
|
8851
8965
|
server.registerRoute("GET", "/api/team/status", teamHandlers.handleStatus);
|
|
8852
8966
|
server.registerRoute("POST", "/api/team/backfill", teamHandlers.handleBackfill);
|
|
8853
8967
|
server.registerRoute("POST", "/api/team/retry-failed", teamHandlers.handleRetryFailed);
|
|
@@ -8899,9 +9013,9 @@ async function main() {
|
|
|
8899
9013
|
logger.warn(LOG_KINDS.DAEMON_CONFIG, "Failed to persist auto-derived port", { error: err.message });
|
|
8900
9014
|
}
|
|
8901
9015
|
}
|
|
8902
|
-
registerPowerJobs(powerManager, { embeddingManager, registry, logger,
|
|
9016
|
+
registerPowerJobs(powerManager, { embeddingManager, registry, logger, liveConfig, db, machineId, vaultDir, databaseManager });
|
|
8903
9017
|
teamSync.registerFlushJob(powerManager);
|
|
8904
|
-
await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger,
|
|
9018
|
+
await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, liveConfig });
|
|
8905
9019
|
powerManager.start();
|
|
8906
9020
|
const shutdown = async (signal) => {
|
|
8907
9021
|
logger.info(LOG_KINDS.DAEMON_START, `${signal} received`);
|
|
@@ -8933,4 +9047,4 @@ export {
|
|
|
8933
9047
|
handleUserPrompt,
|
|
8934
9048
|
main
|
|
8935
9049
|
};
|
|
8936
|
-
//# sourceMappingURL=main-
|
|
9050
|
+
//# sourceMappingURL=main-E7HU4QYR.js.map
|