@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.
Files changed (94) hide show
  1. package/dist/{agent-run-4HUXVRHW.js → agent-run-PQXC246Y.js} +5 -5
  2. package/dist/{agent-tasks-JF45ELB6.js → agent-tasks-323BZEBX.js} +5 -5
  3. package/dist/{chunk-P3DN5EWW.js → chunk-22JALAXN.js} +4 -4
  4. package/dist/chunk-22JALAXN.js.map +1 -0
  5. package/dist/{chunk-UOQQENDW.js → chunk-3WWJOTYG.js} +2 -2
  6. package/dist/{chunk-POR75WM6.js → chunk-63ZGP4Q2.js} +2 -2
  7. package/dist/{chunk-ACQ2AIEM.js → chunk-AIYFHQRX.js} +2 -2
  8. package/dist/{chunk-L6XFAJIF.js → chunk-FGY7J6EZ.js} +4 -4
  9. package/dist/chunk-FGY7J6EZ.js.map +1 -0
  10. package/dist/{chunk-4LCIKVDM.js → chunk-LZP4IJB3.js} +3 -3
  11. package/dist/chunk-LZP4IJB3.js.map +1 -0
  12. package/dist/{chunk-YSNIAJ5D.js → chunk-UEWMSIL3.js} +3 -3
  13. package/dist/{cli-AHTINAHY.js → cli-UWBAOHLL.js} +34 -34
  14. package/dist/{client-LHENCAV3.js → client-SLDDMSKN.js} +3 -3
  15. package/dist/{doctor-XPCF5HV5.js → doctor-UUUOVDZS.js} +7 -7
  16. package/dist/doctor-UUUOVDZS.js.map +1 -0
  17. package/dist/{executor-ACDHGTRH.js → executor-J4IBXSBY.js} +7 -7
  18. package/dist/{init-V3KCC36O.js → init-UDH3ZBDD.js} +11 -15
  19. package/dist/init-UDH3ZBDD.js.map +1 -0
  20. package/dist/{installer-ZNK4JSQA.js → installer-I6KRGJOO.js} +2 -2
  21. package/dist/{main-5S4MDCIO.js → main-E7HU4QYR.js} +222 -108
  22. package/dist/main-E7HU4QYR.js.map +1 -0
  23. package/dist/{open-AB5ULZIB.js → open-4UGDPBKN.js} +5 -5
  24. package/dist/{post-compact-P2B7C7FE.js → post-compact-BFU3WZSV.js} +4 -4
  25. package/dist/{post-tool-use-LXL6NXDS.js → post-tool-use-RYHXLCTC.js} +3 -3
  26. package/dist/{post-tool-use-failure-WAYVVKGR.js → post-tool-use-failure-DCVHK2P3.js} +4 -4
  27. package/dist/{pre-compact-BCXUCF4V.js → pre-compact-EZZCJ6AG.js} +4 -4
  28. package/dist/{remove-KAPX5NT2.js → remove-GBBQG3SJ.js} +5 -5
  29. package/dist/{restart-HQO36FTG.js → restart-RMIGKMA6.js} +6 -6
  30. package/dist/{search-YOMOKAAI.js → search-2A5AJVNG.js} +5 -5
  31. package/dist/{server-2N23P6F2.js → server-TSYZMFFK.js} +3 -3
  32. package/dist/{session-WW2JLHPX.js → session-NKREOTEO.js} +5 -5
  33. package/dist/{session-end-4WRTIBVQ.js → session-end-DQELLTGJ.js} +3 -3
  34. package/dist/{session-start-HRWTZXQR.js → session-start-5SUTR5GP.js} +5 -5
  35. package/dist/{session-start-HRWTZXQR.js.map → session-start-5SUTR5GP.js.map} +1 -1
  36. package/dist/{setup-llm-HFWSBUAF.js → setup-llm-SLX5764H.js} +5 -5
  37. package/dist/src/cli.js +1 -1
  38. package/dist/src/daemon/main.js +1 -1
  39. package/dist/src/hooks/post-tool-use.js +1 -1
  40. package/dist/src/hooks/session-end.js +1 -1
  41. package/dist/src/hooks/session-start.js +1 -1
  42. package/dist/src/hooks/stop.js +1 -1
  43. package/dist/src/hooks/user-prompt-submit.js +1 -1
  44. package/dist/src/mcp/server.js +1 -1
  45. package/dist/{stats-7A4CJ4MS.js → stats-ARBLNEE3.js} +6 -6
  46. package/dist/{stop-R2GDHMRA.js → stop-5AJXBKEE.js} +3 -3
  47. package/dist/{stop-failure-773KR4VZ.js → stop-failure-XGKTZPLR.js} +4 -4
  48. package/dist/{subagent-start-IDECNBHW.js → subagent-start-2JLIPGJN.js} +4 -4
  49. package/dist/{subagent-stop-3JH7DR2S.js → subagent-stop-FV4EOKWZ.js} +4 -4
  50. package/dist/{task-completed-AYVHPHDR.js → task-completed-XJKT366I.js} +4 -4
  51. package/dist/{update-YWYW55JM.js → update-XVSAMN4O.js} +5 -5
  52. package/dist/{user-prompt-submit-YELSR6XI.js → user-prompt-submit-TTBTHBBH.js} +3 -3
  53. package/dist/{verify-JS44DVKJ.js → verify-LMHNEYIP.js} +3 -3
  54. package/dist/verify-LMHNEYIP.js.map +1 -0
  55. package/dist/{version-K5NETYIL.js → version-HRVSEMUR.js} +2 -2
  56. package/package.json +1 -1
  57. package/dist/chunk-4LCIKVDM.js.map +0 -1
  58. package/dist/chunk-L6XFAJIF.js.map +0 -1
  59. package/dist/chunk-P3DN5EWW.js.map +0 -1
  60. package/dist/doctor-XPCF5HV5.js.map +0 -1
  61. package/dist/init-V3KCC36O.js.map +0 -1
  62. package/dist/main-5S4MDCIO.js.map +0 -1
  63. package/dist/verify-JS44DVKJ.js.map +0 -1
  64. /package/dist/{agent-run-4HUXVRHW.js.map → agent-run-PQXC246Y.js.map} +0 -0
  65. /package/dist/{agent-tasks-JF45ELB6.js.map → agent-tasks-323BZEBX.js.map} +0 -0
  66. /package/dist/{chunk-UOQQENDW.js.map → chunk-3WWJOTYG.js.map} +0 -0
  67. /package/dist/{chunk-POR75WM6.js.map → chunk-63ZGP4Q2.js.map} +0 -0
  68. /package/dist/{chunk-ACQ2AIEM.js.map → chunk-AIYFHQRX.js.map} +0 -0
  69. /package/dist/{chunk-YSNIAJ5D.js.map → chunk-UEWMSIL3.js.map} +0 -0
  70. /package/dist/{cli-AHTINAHY.js.map → cli-UWBAOHLL.js.map} +0 -0
  71. /package/dist/{client-LHENCAV3.js.map → client-SLDDMSKN.js.map} +0 -0
  72. /package/dist/{executor-ACDHGTRH.js.map → executor-J4IBXSBY.js.map} +0 -0
  73. /package/dist/{installer-ZNK4JSQA.js.map → installer-I6KRGJOO.js.map} +0 -0
  74. /package/dist/{open-AB5ULZIB.js.map → open-4UGDPBKN.js.map} +0 -0
  75. /package/dist/{post-compact-P2B7C7FE.js.map → post-compact-BFU3WZSV.js.map} +0 -0
  76. /package/dist/{post-tool-use-LXL6NXDS.js.map → post-tool-use-RYHXLCTC.js.map} +0 -0
  77. /package/dist/{post-tool-use-failure-WAYVVKGR.js.map → post-tool-use-failure-DCVHK2P3.js.map} +0 -0
  78. /package/dist/{pre-compact-BCXUCF4V.js.map → pre-compact-EZZCJ6AG.js.map} +0 -0
  79. /package/dist/{remove-KAPX5NT2.js.map → remove-GBBQG3SJ.js.map} +0 -0
  80. /package/dist/{restart-HQO36FTG.js.map → restart-RMIGKMA6.js.map} +0 -0
  81. /package/dist/{search-YOMOKAAI.js.map → search-2A5AJVNG.js.map} +0 -0
  82. /package/dist/{server-2N23P6F2.js.map → server-TSYZMFFK.js.map} +0 -0
  83. /package/dist/{session-WW2JLHPX.js.map → session-NKREOTEO.js.map} +0 -0
  84. /package/dist/{session-end-4WRTIBVQ.js.map → session-end-DQELLTGJ.js.map} +0 -0
  85. /package/dist/{setup-llm-HFWSBUAF.js.map → setup-llm-SLX5764H.js.map} +0 -0
  86. /package/dist/{stats-7A4CJ4MS.js.map → stats-ARBLNEE3.js.map} +0 -0
  87. /package/dist/{stop-R2GDHMRA.js.map → stop-5AJXBKEE.js.map} +0 -0
  88. /package/dist/{stop-failure-773KR4VZ.js.map → stop-failure-XGKTZPLR.js.map} +0 -0
  89. /package/dist/{subagent-start-IDECNBHW.js.map → subagent-start-2JLIPGJN.js.map} +0 -0
  90. /package/dist/{subagent-stop-3JH7DR2S.js.map → subagent-stop-FV4EOKWZ.js.map} +0 -0
  91. /package/dist/{task-completed-AYVHPHDR.js.map → task-completed-XJKT366I.js.map} +0 -0
  92. /package/dist/{update-YWYW55JM.js.map → update-XVSAMN4O.js.map} +0 -0
  93. /package/dist/{user-prompt-submit-YELSR6XI.js.map → user-prompt-submit-TTBTHBBH.js.map} +0 -0
  94. /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-P3DN5EWW.js";
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-L6XFAJIF.js";
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-YSNIAJ5D.js";
113
+ import "./chunk-UEWMSIL3.js";
114
114
  import "./chunk-SAKJMNSR.js";
115
115
  import {
116
116
  SymbiontInstaller
117
- } from "./chunk-4LCIKVDM.js";
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-UOQQENDW.js";
192
+ } from "./chunk-3WWJOTYG.js";
193
193
  import {
194
194
  getPluginVersion
195
- } from "./chunk-ACQ2AIEM.js";
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 ?? loadConfig(vaultDir);
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 filePath = createBackup(deps.db, deps.backupDir, deps.machineId);
2464
- const backups = listBackups(deps.backupDir);
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(deps.backupDir);
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 backups = listBackups(deps.backupDir);
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 = `${deps.backupDir}/${backup.file_name}`;
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 backups = listBackups(deps.backupDir);
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 = `${deps.backupDir}/${backup.file_name}`;
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 = loadConfig(vaultDir);
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
- deps.setTeamClient(client);
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 = loadConfig(vaultDir);
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
- config,
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
- }, config);
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
- }, config);
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-ZNK4JSQA.js");
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 { config, machineId, logger, vaultDir, serverVersion } = deps;
3246
+ const { liveConfig, machineId, logger, vaultDir, serverVersion } = deps;
3238
3247
  let teamClient = null;
3239
- if (config.team.enabled && config.team.worker_url) {
3240
- const secrets = readSecrets(vaultDir);
3241
- const teamApiKey = secrets[TEAM_API_KEY_SECRET];
3242
- if (teamApiKey) {
3243
- teamClient = new TeamSyncClient({
3244
- workerUrl: config.team.worker_url,
3245
- apiKey: teamApiKey,
3246
- machineId,
3247
- syncProtocolVersion: SYNC_PROTOCOL_VERSION
3248
- });
3249
- logger.info(LOG_KINDS.TEAM_SYNC_START, "Team sync client initialized", { worker_url: config.team.worker_url });
3250
- teamClient.connect({
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
- setTimeout(() => {
3259
- try {
3260
- const backfilled = backfillUnsynced(machineId);
3261
- if (backfilled > 0) {
3262
- logger.info(LOG_KINDS.TEAM_SYNC_START, `Backfilled ${backfilled} unsynced records into outbox`);
3263
- }
3264
- } catch (err) {
3265
- logger.error(LOG_KINDS.TEAM_SYNC_ERROR, "Backfill failed", { error: err.message });
3266
- }
3267
- }, 0);
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, config, logger } = deps;
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-ACDHGTRH.js");
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, config } = deps;
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, config, logger });
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, config } = deps;
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, config, embeddingManager } = deps;
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(loadConfig(vaultDir));
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 = loadConfig(vaultDir);
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 = loadConfig(vaultDir);
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 = loadConfig(vaultDir);
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, config } = deps;
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
- if (config.agent.scheduled_tasks_enabled === false) {
6417
- logger.info(LOG_KINDS.AGENT_RUN, "Scheduled agent tasks disabled globally (agent.scheduled_tasks_enabled: false)");
6418
- return;
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 { runAgent } = await import("./executor-ACDHGTRH.js");
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
- config.agent.tasks ?? {},
6581
+ liveConfig.current.agent.tasks ?? {},
6539
6582
  scheduledContext,
6540
6583
  initialLastRuns
6541
6584
  );
6542
- for (const job of scheduledJobs) {
6543
- powerManager.register(job);
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 = loadConfig(vaultDir);
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-ACDHGTRH.js");
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, config, db, backupDir, machineId, vaultDir, databaseManager } = deps;
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: config.daemon.stale_session_threshold_ms
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 = loadMergedConfig(vaultDir).daemon.log_retention_days;
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 os7 from "os";
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(os7.homedir(), dir.slice(2)) : dir;
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, config, vaultDir } = deps;
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, config, logger });
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
- config,
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 = config.agent.summary_batch_interval;
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 = loadConfig(vaultDir);
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
- }, config);
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
- config,
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
- config,
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
- config,
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, config, logger };
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 = loadReactionContext(vaultDir, logger);
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, config });
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) => handleUpdateTask(req, vaultDir));
8817
- server.registerRoute("POST", "/api/agent/tasks", async (req) => handleCreateTask(req, vaultDir));
8818
- server.registerRoute("POST", "/api/agent/tasks/:id/copy", async (req) => handleCopyTask(req, vaultDir));
8819
- server.registerRoute("DELETE", "/api/agent/tasks/:id", async (req) => handleDeleteTask(req, vaultDir));
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) => handleUpdateTaskConfig(req, vaultDir));
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 rawBackupDir = config.backup.dir;
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", backupConfigHandlers.handlePutBackupConfig);
8841
- const teamSync = initTeamSync({ config, machineId, logger, vaultDir, serverVersion: server.version });
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", teamHandlers.handleConnect);
8850
- server.registerRoute("POST", "/api/team/disconnect", teamHandlers.handleDisconnect);
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, config, db, backupDir, machineId, vaultDir, databaseManager });
9016
+ registerPowerJobs(powerManager, { embeddingManager, registry, logger, liveConfig, db, machineId, vaultDir, databaseManager });
8903
9017
  teamSync.registerFlushJob(powerManager);
8904
- await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, config });
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-5S4MDCIO.js.map
9050
+ //# sourceMappingURL=main-E7HU4QYR.js.map