@goondocks/myco 0.20.0 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/{agent-run-4HUXVRHW.js → agent-run-X25Q2A6T.js} +6 -6
  2. package/dist/{agent-tasks-JF45ELB6.js → agent-tasks-7B6OFERB.js} +6 -6
  3. package/dist/{chunk-POR75WM6.js → chunk-2PDWCDKY.js} +2 -2
  4. package/dist/{chunk-57O67XVF.js → chunk-6X2ERTQV.js} +2 -2
  5. package/dist/{chunk-4M7EWPIA.js → chunk-CCRGY3QW.js} +4 -3
  6. package/dist/{chunk-4M7EWPIA.js.map → chunk-CCRGY3QW.js.map} +1 -1
  7. package/dist/{chunk-P3DN5EWW.js → chunk-JZGN33AY.js} +5 -5
  8. package/dist/chunk-JZGN33AY.js.map +1 -0
  9. package/dist/{chunk-YSNIAJ5D.js → chunk-KESLPBKV.js} +3 -3
  10. package/dist/{chunk-SRXTSI25.js → chunk-OD4AA7PV.js} +2 -2
  11. package/dist/chunk-OD4AA7PV.js.map +1 -0
  12. package/dist/{chunk-4LCIKVDM.js → chunk-Q36VMZST.js} +4 -4
  13. package/dist/chunk-Q36VMZST.js.map +1 -0
  14. package/dist/{chunk-L6XFAJIF.js → chunk-UYMFCYBF.js} +57 -7
  15. package/dist/chunk-UYMFCYBF.js.map +1 -0
  16. package/dist/{chunk-UOQQENDW.js → chunk-VVNL26WX.js} +2 -2
  17. package/dist/{chunk-QS5TWZBL.js → chunk-XATDZX7U.js} +2 -2
  18. package/dist/{chunk-ACQ2AIEM.js → chunk-XG5RRUYF.js} +2 -2
  19. package/dist/{cli-AHTINAHY.js → cli-GGPWH4UO.js} +38 -38
  20. package/dist/{client-LHENCAV3.js → client-YXQUTXVZ.js} +3 -3
  21. package/dist/{config-XPV5GDE4.js → config-OMCYHG2S.js} +2 -2
  22. package/dist/{doctor-XPCF5HV5.js → doctor-5JXJ36KA.js} +9 -9
  23. package/dist/doctor-5JXJ36KA.js.map +1 -0
  24. package/dist/{executor-ACDHGTRH.js → executor-HWW2QNZQ.js} +10 -10
  25. package/dist/{init-V3KCC36O.js → init-LMYOVZAV.js} +12 -16
  26. package/dist/init-LMYOVZAV.js.map +1 -0
  27. package/dist/{installer-ZNK4JSQA.js → installer-FS257JRZ.js} +3 -3
  28. package/dist/{loader-H7OFASVC.js → loader-CQYTFHEW.js} +2 -2
  29. package/dist/{loader-TSB5M7FD.js → loader-NOMBJUPW.js} +2 -2
  30. package/dist/{main-5S4MDCIO.js → main-YTBVRTBI.js} +234 -115
  31. package/dist/main-YTBVRTBI.js.map +1 -0
  32. package/dist/{open-AB5ULZIB.js → open-HG2DX6RN.js} +6 -6
  33. package/dist/{post-compact-P2B7C7FE.js → post-compact-JSECI44W.js} +4 -4
  34. package/dist/{post-tool-use-LXL6NXDS.js → post-tool-use-POGPTJBA.js} +3 -3
  35. package/dist/{post-tool-use-failure-WAYVVKGR.js → post-tool-use-failure-OT7BFWQW.js} +4 -4
  36. package/dist/{pre-compact-BCXUCF4V.js → pre-compact-OXVODKH4.js} +4 -4
  37. package/dist/{registry-MGJSJBAS.js → registry-U4CHXK6R.js} +3 -3
  38. package/dist/{remove-KAPX5NT2.js → remove-N7ZPELFU.js} +6 -6
  39. package/dist/{restart-HQO36FTG.js → restart-ADG5GBTB.js} +7 -7
  40. package/dist/{search-YOMOKAAI.js → search-AHZEUNRR.js} +6 -6
  41. package/dist/{server-2N23P6F2.js → server-AGVYZVP5.js} +3 -3
  42. package/dist/{session-WW2JLHPX.js → session-6IU4AXYP.js} +6 -6
  43. package/dist/{session-end-4WRTIBVQ.js → session-end-FT27DWYZ.js} +3 -3
  44. package/dist/{session-start-HRWTZXQR.js → session-start-LAFICHII.js} +6 -6
  45. package/dist/{session-start-HRWTZXQR.js.map → session-start-LAFICHII.js.map} +1 -1
  46. package/dist/{setup-llm-HFWSBUAF.js → setup-llm-77MP4I2G.js} +6 -6
  47. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +1 -1
  48. package/dist/src/agent/definitions/tasks/skill-evolve.yaml +1 -0
  49. package/dist/src/agent/definitions/tasks/skill-generate.yaml +1 -0
  50. package/dist/src/agent/definitions/tasks/skill-survey.yaml +23 -7
  51. package/dist/src/cli.js +1 -1
  52. package/dist/src/daemon/main.js +1 -1
  53. package/dist/src/hooks/post-tool-use.js +1 -1
  54. package/dist/src/hooks/session-end.js +1 -1
  55. package/dist/src/hooks/session-start.js +1 -1
  56. package/dist/src/hooks/stop.js +1 -1
  57. package/dist/src/hooks/user-prompt-submit.js +1 -1
  58. package/dist/src/mcp/server.js +1 -1
  59. package/dist/{stats-7A4CJ4MS.js → stats-NVPWOYTE.js} +7 -7
  60. package/dist/{stop-R2GDHMRA.js → stop-ZPIKVLH4.js} +3 -3
  61. package/dist/{stop-failure-773KR4VZ.js → stop-failure-2PX67YJC.js} +4 -4
  62. package/dist/{subagent-start-IDECNBHW.js → subagent-start-UUE6EHQD.js} +4 -4
  63. package/dist/{subagent-stop-3JH7DR2S.js → subagent-stop-KQWWWPE6.js} +4 -4
  64. package/dist/{task-completed-AYVHPHDR.js → task-completed-WMHOFQ7B.js} +4 -4
  65. package/dist/{team-3JKF7VAD.js → team-LRZ6GTQK.js} +3 -3
  66. package/dist/{update-YWYW55JM.js → update-O6V4RC4W.js} +6 -6
  67. package/dist/{user-prompt-submit-YELSR6XI.js → user-prompt-submit-N36KUPHI.js} +3 -3
  68. package/dist/{verify-JS44DVKJ.js → verify-LXPV7NYG.js} +4 -4
  69. package/dist/verify-LXPV7NYG.js.map +1 -0
  70. package/dist/{version-K5NETYIL.js → version-XMPPJQHR.js} +2 -2
  71. package/package.json +1 -1
  72. package/dist/chunk-4LCIKVDM.js.map +0 -1
  73. package/dist/chunk-L6XFAJIF.js.map +0 -1
  74. package/dist/chunk-P3DN5EWW.js.map +0 -1
  75. package/dist/chunk-SRXTSI25.js.map +0 -1
  76. package/dist/doctor-XPCF5HV5.js.map +0 -1
  77. package/dist/init-V3KCC36O.js.map +0 -1
  78. package/dist/main-5S4MDCIO.js.map +0 -1
  79. package/dist/verify-JS44DVKJ.js.map +0 -1
  80. /package/dist/{agent-run-4HUXVRHW.js.map → agent-run-X25Q2A6T.js.map} +0 -0
  81. /package/dist/{agent-tasks-JF45ELB6.js.map → agent-tasks-7B6OFERB.js.map} +0 -0
  82. /package/dist/{chunk-POR75WM6.js.map → chunk-2PDWCDKY.js.map} +0 -0
  83. /package/dist/{chunk-57O67XVF.js.map → chunk-6X2ERTQV.js.map} +0 -0
  84. /package/dist/{chunk-YSNIAJ5D.js.map → chunk-KESLPBKV.js.map} +0 -0
  85. /package/dist/{chunk-UOQQENDW.js.map → chunk-VVNL26WX.js.map} +0 -0
  86. /package/dist/{chunk-QS5TWZBL.js.map → chunk-XATDZX7U.js.map} +0 -0
  87. /package/dist/{chunk-ACQ2AIEM.js.map → chunk-XG5RRUYF.js.map} +0 -0
  88. /package/dist/{cli-AHTINAHY.js.map → cli-GGPWH4UO.js.map} +0 -0
  89. /package/dist/{client-LHENCAV3.js.map → client-YXQUTXVZ.js.map} +0 -0
  90. /package/dist/{config-XPV5GDE4.js.map → config-OMCYHG2S.js.map} +0 -0
  91. /package/dist/{executor-ACDHGTRH.js.map → executor-HWW2QNZQ.js.map} +0 -0
  92. /package/dist/{installer-ZNK4JSQA.js.map → installer-FS257JRZ.js.map} +0 -0
  93. /package/dist/{loader-H7OFASVC.js.map → loader-CQYTFHEW.js.map} +0 -0
  94. /package/dist/{loader-TSB5M7FD.js.map → loader-NOMBJUPW.js.map} +0 -0
  95. /package/dist/{open-AB5ULZIB.js.map → open-HG2DX6RN.js.map} +0 -0
  96. /package/dist/{post-compact-P2B7C7FE.js.map → post-compact-JSECI44W.js.map} +0 -0
  97. /package/dist/{post-tool-use-LXL6NXDS.js.map → post-tool-use-POGPTJBA.js.map} +0 -0
  98. /package/dist/{post-tool-use-failure-WAYVVKGR.js.map → post-tool-use-failure-OT7BFWQW.js.map} +0 -0
  99. /package/dist/{pre-compact-BCXUCF4V.js.map → pre-compact-OXVODKH4.js.map} +0 -0
  100. /package/dist/{registry-MGJSJBAS.js.map → registry-U4CHXK6R.js.map} +0 -0
  101. /package/dist/{remove-KAPX5NT2.js.map → remove-N7ZPELFU.js.map} +0 -0
  102. /package/dist/{restart-HQO36FTG.js.map → restart-ADG5GBTB.js.map} +0 -0
  103. /package/dist/{search-YOMOKAAI.js.map → search-AHZEUNRR.js.map} +0 -0
  104. /package/dist/{server-2N23P6F2.js.map → server-AGVYZVP5.js.map} +0 -0
  105. /package/dist/{session-WW2JLHPX.js.map → session-6IU4AXYP.js.map} +0 -0
  106. /package/dist/{session-end-4WRTIBVQ.js.map → session-end-FT27DWYZ.js.map} +0 -0
  107. /package/dist/{setup-llm-HFWSBUAF.js.map → setup-llm-77MP4I2G.js.map} +0 -0
  108. /package/dist/{stats-7A4CJ4MS.js.map → stats-NVPWOYTE.js.map} +0 -0
  109. /package/dist/{stop-R2GDHMRA.js.map → stop-ZPIKVLH4.js.map} +0 -0
  110. /package/dist/{stop-failure-773KR4VZ.js.map → stop-failure-2PX67YJC.js.map} +0 -0
  111. /package/dist/{subagent-start-IDECNBHW.js.map → subagent-start-UUE6EHQD.js.map} +0 -0
  112. /package/dist/{subagent-stop-3JH7DR2S.js.map → subagent-stop-KQWWWPE6.js.map} +0 -0
  113. /package/dist/{task-completed-AYVHPHDR.js.map → task-completed-WMHOFQ7B.js.map} +0 -0
  114. /package/dist/{team-3JKF7VAD.js.map → team-LRZ6GTQK.js.map} +0 -0
  115. /package/dist/{update-YWYW55JM.js.map → update-O6V4RC4W.js.map} +0 -0
  116. /package/dist/{user-prompt-submit-YELSR6XI.js.map → user-prompt-submit-N36KUPHI.js.map} +0 -0
  117. /package/dist/{version-K5NETYIL.js.map → version-XMPPJQHR.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-JZGN33AY.js";
19
19
  import {
20
20
  getTeamPackageVersion,
21
21
  loadSecrets,
@@ -23,8 +23,9 @@ import {
23
23
  readSecrets,
24
24
  resolveVaultConfigPath,
25
25
  writeSecret
26
- } from "./chunk-QS5TWZBL.js";
26
+ } from "./chunk-XATDZX7U.js";
27
27
  import {
28
+ SKILL_SURVEY_TASK,
28
29
  buildTaskInstruction,
29
30
  closeOpenBatches,
30
31
  countBatchesBySession,
@@ -49,6 +50,7 @@ import {
49
50
  getRun,
50
51
  getSkillRecord,
51
52
  getSkillRecordByName,
53
+ getSkillSurveyEligibility,
52
54
  hasConfiguredProvider,
53
55
  incrementActivityCount,
54
56
  incrementSkillUsageCount,
@@ -72,7 +74,7 @@ import {
72
74
  setResponseSummary,
73
75
  updateCandidate,
74
76
  updateNotificationStatus
75
- } from "./chunk-L6XFAJIF.js";
77
+ } from "./chunk-UYMFCYBF.js";
76
78
  import {
77
79
  fullTextSearch,
78
80
  hydrateSearchResults
@@ -83,13 +85,13 @@ import {
83
85
  loadAllTasks,
84
86
  validateTaskName,
85
87
  writeUserTask
86
- } from "./chunk-57O67XVF.js";
88
+ } from "./chunk-6X2ERTQV.js";
87
89
  import {
88
90
  AgentTaskSchema,
89
91
  registerAgent,
90
92
  resolveDefinitionsDir,
91
93
  taskFromParsed
92
- } from "./chunk-4M7EWPIA.js";
94
+ } from "./chunk-CCRGY3QW.js";
93
95
  import {
94
96
  listTurnsByRun
95
97
  } from "./chunk-6RFZWV4R.js";
@@ -110,11 +112,11 @@ import {
110
112
  listBufferSessionIds
111
113
  } from "./chunk-V7XG6V6C.js";
112
114
  import "./chunk-POEPHBQK.js";
113
- import "./chunk-YSNIAJ5D.js";
115
+ import "./chunk-KESLPBKV.js";
114
116
  import "./chunk-SAKJMNSR.js";
115
117
  import {
116
118
  SymbiontInstaller
117
- } from "./chunk-4LCIKVDM.js";
119
+ } from "./chunk-Q36VMZST.js";
118
120
  import {
119
121
  checkLocalProvider
120
122
  } from "./chunk-BPRIYNLE.js";
@@ -177,7 +179,7 @@ import {
177
179
  updateConfig,
178
180
  updateLocalConfig,
179
181
  updateTeamConfig
180
- } from "./chunk-SRXTSI25.js";
182
+ } from "./chunk-OD4AA7PV.js";
181
183
  import {
182
184
  closeDatabase,
183
185
  getDatabase,
@@ -189,10 +191,10 @@ import {
189
191
  } from "./chunk-ZXZPJJN3.js";
190
192
  import {
191
193
  resolveCliEntryPath
192
- } from "./chunk-UOQQENDW.js";
194
+ } from "./chunk-VVNL26WX.js";
193
195
  import {
194
196
  getPluginVersion
195
- } from "./chunk-ACQ2AIEM.js";
197
+ } from "./chunk-XG5RRUYF.js";
196
198
  import {
197
199
  loadManifests,
198
200
  resolvePackageRoot
@@ -2287,7 +2289,7 @@ function getConfiguredManifests(projectRoot, config) {
2287
2289
  return allManifests.filter((manifest) => fs12.existsSync(path12.join(projectRoot, manifest.configDir)));
2288
2290
  }
2289
2291
  function reconcileConfiguredSymbionts(projectRoot, vaultDir = path12.join(projectRoot, ".myco"), preloadedConfig) {
2290
- const config = preloadedConfig ?? loadConfig(vaultDir);
2292
+ const config = preloadedConfig ?? loadMergedConfig(vaultDir);
2291
2293
  const manifests = getConfiguredManifests(projectRoot, config);
2292
2294
  const packageRoot = resolvePackageRoot();
2293
2295
  let updatedCount = 0;
@@ -2457,11 +2459,20 @@ function restoreBackup(db, backupPath) {
2457
2459
  }
2458
2460
 
2459
2461
  // src/daemon/api/backup.ts
2462
+ import os7 from "os";
2460
2463
  import path14 from "path";
2464
+ function resolveBackupDir(config, vaultDir) {
2465
+ const rawDir = config.backup.dir;
2466
+ if (!rawDir) return path14.resolve(vaultDir, "backups");
2467
+ const expanded = rawDir.startsWith("~/") ? path14.join(os7.homedir(), rawDir.slice(2)) : rawDir;
2468
+ return path14.resolve(expanded);
2469
+ }
2461
2470
  function createBackupHandlers(deps) {
2471
+ const currentBackupDir = () => resolveBackupDir(deps.liveConfig.current, deps.vaultDir);
2462
2472
  async function handleCreateBackup(_req) {
2463
- const filePath = createBackup(deps.db, deps.backupDir, deps.machineId);
2464
- const backups = listBackups(deps.backupDir);
2473
+ const backupDir = currentBackupDir();
2474
+ const filePath = createBackup(deps.db, backupDir, deps.machineId);
2475
+ const backups = listBackups(backupDir);
2465
2476
  const created = backups.find((b) => b.machine_id === deps.machineId);
2466
2477
  return {
2467
2478
  body: {
@@ -2472,7 +2483,7 @@ function createBackupHandlers(deps) {
2472
2483
  };
2473
2484
  }
2474
2485
  async function handleListBackups(_req) {
2475
- const backups = listBackups(deps.backupDir);
2486
+ const backups = listBackups(currentBackupDir());
2476
2487
  return { body: { backups } };
2477
2488
  }
2478
2489
  async function handleRestorePreview(req) {
@@ -2480,12 +2491,13 @@ function createBackupHandlers(deps) {
2480
2491
  if (!machine_id) {
2481
2492
  return { status: 400, body: { error: "missing_machine_id" } };
2482
2493
  }
2483
- const backups = listBackups(deps.backupDir);
2494
+ const backupDir = currentBackupDir();
2495
+ const backups = listBackups(backupDir);
2484
2496
  const backup = backups.find((b) => b.machine_id === machine_id);
2485
2497
  if (!backup) {
2486
2498
  return { status: 404, body: { error: "backup_not_found" } };
2487
2499
  }
2488
- const backupPath = `${deps.backupDir}/${backup.file_name}`;
2500
+ const backupPath = `${backupDir}/${backup.file_name}`;
2489
2501
  const tables = restorePreview(deps.db, backupPath);
2490
2502
  const total_new = tables.reduce((sum, t) => sum + t.new, 0);
2491
2503
  const total_existing = tables.reduce((sum, t) => sum + t.existing, 0);
@@ -2496,12 +2508,13 @@ function createBackupHandlers(deps) {
2496
2508
  if (!machine_id) {
2497
2509
  return { status: 400, body: { error: "missing_machine_id" } };
2498
2510
  }
2499
- const backups = listBackups(deps.backupDir);
2511
+ const backupDir = currentBackupDir();
2512
+ const backups = listBackups(backupDir);
2500
2513
  const backup = backups.find((b) => b.machine_id === machine_id);
2501
2514
  if (!backup) {
2502
2515
  return { status: 404, body: { error: "backup_not_found" } };
2503
2516
  }
2504
- const backupPath = `${deps.backupDir}/${backup.file_name}`;
2517
+ const backupPath = `${backupDir}/${backup.file_name}`;
2505
2518
  const result = restoreBackup(deps.db, backupPath);
2506
2519
  return { body: { machine_id, ...result } };
2507
2520
  }
@@ -2515,7 +2528,7 @@ function createBackupHandlers(deps) {
2515
2528
  function createBackupConfigHandlers(deps) {
2516
2529
  const { vaultDir } = deps;
2517
2530
  async function handleGetBackupConfig() {
2518
- const cfg = loadConfig(vaultDir);
2531
+ const cfg = loadMergedConfig(vaultDir);
2519
2532
  return { body: { dir: cfg.backup.dir ?? null, default_dir: path14.resolve(vaultDir, "backups") } };
2520
2533
  }
2521
2534
  async function handlePutBackupConfig(req) {
@@ -2747,17 +2760,15 @@ function createTeamHandlers(deps) {
2747
2760
  worker_url: url
2748
2761
  });
2749
2762
  writeSecret(vaultDir, TEAM_API_KEY_SECRET, api_key);
2750
- deps.setTeamClient(client);
2751
- const config = loadConfig(vaultDir);
2763
+ const config = loadMergedConfig(vaultDir);
2752
2764
  return { body: { connected: true, team: config.team } };
2753
2765
  }
2754
2766
  async function handleDisconnect(_req) {
2755
2767
  updateTeamConfig(vaultDir, { enabled: false });
2756
- deps.setTeamClient(null);
2757
2768
  return { body: { connected: false } };
2758
2769
  }
2759
2770
  async function handleStatus(_req) {
2760
- const config = loadConfig(vaultDir);
2771
+ const config = loadMergedConfig(vaultDir);
2761
2772
  const client = deps.getTeamClient();
2762
2773
  const secrets = readSecrets(vaultDir);
2763
2774
  const hasApiKey = Boolean(secrets[TEAM_API_KEY_SECRET]);
@@ -2829,7 +2840,7 @@ function createTeamHandlers(deps) {
2829
2840
  return { body: { retried: count } };
2830
2841
  }
2831
2842
  async function handleUpgradeWorker(_req) {
2832
- const { upgradeWorker } = await import("./team-3JKF7VAD.js");
2843
+ const { upgradeWorker } = await import("./team-LRZ6GTQK.js");
2833
2844
  logger.info("team-sync.upgrade.start", "Starting worker upgrade");
2834
2845
  const result = upgradeWorker(vaultDir);
2835
2846
  if (!result.success) {
@@ -2986,7 +2997,7 @@ function createSessionLifecycleHandlers(deps) {
2986
2997
  powerManager,
2987
2998
  machineId,
2988
2999
  logger,
2989
- config,
3000
+ liveConfig,
2990
3001
  vaultDir
2991
3002
  } = deps;
2992
3003
  async function handleRegister(req) {
@@ -3018,7 +3029,7 @@ function createSessionLifecycleHandlers(deps) {
3018
3029
  message: branch ? `Branch: ${branch}` : void 0,
3019
3030
  link: `/sessions/${session_id}`,
3020
3031
  metadata: { sessionId: session_id, agent: agent ?? "claude-code", branch }
3021
- }, config);
3032
+ }, liveConfig.current);
3022
3033
  return { body: { ok: true, sessions: registry.sessions } };
3023
3034
  }
3024
3035
  async function handleUnregister(req) {
@@ -3038,7 +3049,7 @@ function createSessionLifecycleHandlers(deps) {
3038
3049
  title: "Session ended",
3039
3050
  link: `/sessions/${session_id}`,
3040
3051
  metadata: { sessionId: session_id }
3041
- }, config);
3052
+ }, liveConfig.current);
3042
3053
  return { body: { ok: true, sessions: registry.sessions } };
3043
3054
  }
3044
3055
  return { handleRegister, handleUnregister };
@@ -3221,7 +3232,7 @@ function createSkillRecordDeleteHandler(deps) {
3221
3232
  logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill directory", { name: record.name, error: String(err) });
3222
3233
  }
3223
3234
  try {
3224
- const { syncSkillSymlinks } = await import("./installer-ZNK4JSQA.js");
3235
+ const { syncSkillSymlinks } = await import("./installer-FS257JRZ.js");
3225
3236
  syncSkillSymlinks(projectRoot, record.name, { remove: true });
3226
3237
  } catch (err) {
3227
3238
  logger.warn(LOG_KINDS.PROCESSOR_BATCH, "Failed to remove skill symlinks", { name: record.name, error: String(err) });
@@ -3234,37 +3245,56 @@ function createSkillRecordDeleteHandler(deps) {
3234
3245
 
3235
3246
  // src/daemon/team-sync-init.ts
3236
3247
  function initTeamSync(deps) {
3237
- const { config, machineId, logger, vaultDir, serverVersion } = deps;
3248
+ const { liveConfig, machineId, logger, vaultDir, serverVersion } = deps;
3238
3249
  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({
3250
+ let clientSignature = null;
3251
+ async function reconcileClient() {
3252
+ const config = liveConfig.current;
3253
+ const workerUrl = config.team.worker_url?.trim() || null;
3254
+ const apiKey = readSecrets(vaultDir)[TEAM_API_KEY_SECRET]?.trim() || null;
3255
+ const nextSignature = config.team.enabled && workerUrl && apiKey ? `${workerUrl}
3256
+ ${apiKey}` : null;
3257
+ if (!nextSignature) {
3258
+ if (teamClient) {
3259
+ logger.info(LOG_KINDS.TEAM_SYNC_START, "Team sync client cleared", {
3260
+ enabled: config.team.enabled,
3261
+ has_worker_url: Boolean(workerUrl),
3262
+ has_api_key: Boolean(apiKey)
3263
+ });
3264
+ }
3265
+ teamClient = null;
3266
+ clientSignature = null;
3267
+ return;
3268
+ }
3269
+ if (teamClient && clientSignature === nextSignature) return;
3270
+ const activeWorkerUrl = workerUrl;
3271
+ const activeApiKey = apiKey;
3272
+ teamClient = new TeamSyncClient({
3273
+ workerUrl: activeWorkerUrl,
3274
+ apiKey: activeApiKey,
3275
+ machineId,
3276
+ syncProtocolVersion: SYNC_PROTOCOL_VERSION
3277
+ });
3278
+ clientSignature = nextSignature;
3279
+ logger.info(LOG_KINDS.TEAM_SYNC_START, "Team sync client initialized", { worker_url: activeWorkerUrl });
3280
+ try {
3281
+ await teamClient.connect({
3251
3282
  machine_id: machineId,
3252
3283
  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
3284
  });
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);
3285
+ logger.info(LOG_KINDS.TEAM_SYNC_START, "Node registered with team worker");
3286
+ } catch (err) {
3287
+ logger.warn(LOG_KINDS.TEAM_SYNC_ERROR, "Node registration failed (will retry on next flush)", {
3288
+ error: err.message
3289
+ });
3290
+ }
3291
+ try {
3292
+ const backfilled = backfillUnsynced(machineId);
3293
+ if (backfilled > 0) {
3294
+ logger.info(LOG_KINDS.TEAM_SYNC_START, `Backfilled ${backfilled} unsynced records into outbox`);
3295
+ }
3296
+ } catch (err) {
3297
+ logger.error(LOG_KINDS.TEAM_SYNC_ERROR, "Backfill failed", { error: err.message });
3268
3298
  }
3269
3299
  }
3270
3300
  return {
@@ -3272,8 +3302,8 @@ function initTeamSync(deps) {
3272
3302
  setTeamClient: (client) => {
3273
3303
  teamClient = client;
3274
3304
  },
3305
+ reconcileClient,
3275
3306
  registerFlushJob: (powerManager) => {
3276
- if (!config.team.enabled) return;
3277
3307
  const logDeadLettered = (ids) => {
3278
3308
  if (ids.length > 0) {
3279
3309
  logger.error(LOG_KINDS.TEAM_SYNC_DEAD_LETTER, `Dead-lettered ${ids.length} records after max retries`, { ids });
@@ -3282,8 +3312,9 @@ function initTeamSync(deps) {
3282
3312
  powerManager.register({
3283
3313
  name: "team-sync-flush",
3284
3314
  runIn: ["active", "idle", "sleep"],
3285
- preventsDeepSleep: () => countPending() > 0,
3315
+ preventsDeepSleep: () => liveConfig.current.team.enabled && countPending() > 0,
3286
3316
  fn: async () => {
3317
+ if (!liveConfig.current.team.enabled) return;
3287
3318
  const client = teamClient;
3288
3319
  if (!client) return;
3289
3320
  const pending = listPending();
@@ -3849,11 +3880,12 @@ async function cleanupAfterSessionCascade(sessionId, result, embeddingManager, v
3849
3880
 
3850
3881
  // src/daemon/trigger-title-summary.ts
3851
3882
  async function triggerTitleSummary(sessionId, deps) {
3852
- const { vaultDir, embeddingManager, config, logger } = deps;
3883
+ const { vaultDir, embeddingManager, liveConfig, logger } = deps;
3884
+ const config = liveConfig.current;
3853
3885
  if (config.agent.summary_batch_interval <= 0) return;
3854
3886
  if (config.agent.event_tasks_enabled === false) return;
3855
3887
  try {
3856
- const { runAgent } = await import("./executor-ACDHGTRH.js");
3888
+ const { runAgent } = await import("./executor-HWW2QNZQ.js");
3857
3889
  runAgent(vaultDir, {
3858
3890
  task: "title-summary",
3859
3891
  instruction: `Process session ${sessionId} only`,
@@ -3918,7 +3950,7 @@ async function handleGetSessionPlans(req) {
3918
3950
  return { body: plans };
3919
3951
  }
3920
3952
  function createSessionMutationHandlers(deps) {
3921
- const { embeddingManager, vaultDir, logger, config } = deps;
3953
+ const { embeddingManager, vaultDir, logger, liveConfig } = deps;
3922
3954
  async function handleDeleteSession(req) {
3923
3955
  const sessionId = req.params.id;
3924
3956
  const result = deleteSessionCascade(sessionId);
@@ -3942,7 +3974,7 @@ function createSessionMutationHandlers(deps) {
3942
3974
  ended_at: session.ended_at ?? epochSeconds()
3943
3975
  });
3944
3976
  }
3945
- await triggerTitleSummary(sessionId, { vaultDir, embeddingManager, config, logger });
3977
+ await triggerTitleSummary(sessionId, { vaultDir, embeddingManager, liveConfig, logger });
3946
3978
  logger.info(LOG_KINDS.API_SESSION_COMPLETE, "Session manually completed", {
3947
3979
  session_id: sessionId,
3948
3980
  was_active: wasActive
@@ -4378,7 +4410,8 @@ var PromptContextBody = external_exports.object({
4378
4410
  function createSessionContextHandler(deps) {
4379
4411
  return async function handleSessionContext(req) {
4380
4412
  const { session_id, branch } = SessionContextBody.parse(req.body);
4381
- const { logger, config } = deps;
4413
+ const { logger, liveConfig } = deps;
4414
+ const config = liveConfig.current;
4382
4415
  logger.debug(LOG_KINDS.CONTEXT_QUERY, "Session context query", { session_id });
4383
4416
  try {
4384
4417
  const parts = [];
@@ -4490,7 +4523,8 @@ function createResumeContextHandler(deps) {
4490
4523
  function createPromptContextHandler(deps) {
4491
4524
  return async function handlePromptContext(req) {
4492
4525
  const { prompt, session_id } = PromptContextBody.parse(req.body);
4493
- const { logger, config, embeddingManager } = deps;
4526
+ const { logger, liveConfig, embeddingManager } = deps;
4527
+ const config = liveConfig.current;
4494
4528
  if (!config.context.prompt_search) {
4495
4529
  logger.debug(LOG_KINDS.CONTEXT_PROMPT, "Prompt search disabled by config", { session_id });
4496
4530
  return { body: { text: "" } };
@@ -4611,7 +4645,7 @@ async function handleListSymbionts(vaultDir) {
4611
4645
  const manifests = loadManifests();
4612
4646
  let enabledNames = null;
4613
4647
  try {
4614
- enabledNames = getEnabledSymbiontNames(loadConfig(vaultDir));
4648
+ enabledNames = getEnabledSymbiontNames(loadMergedConfig(vaultDir));
4615
4649
  } catch {
4616
4650
  }
4617
4651
  const symbionts = manifests.map((m) => ({
@@ -4628,7 +4662,7 @@ async function handleListSymbionts(vaultDir) {
4628
4662
  var EMBEDDING_STATUS_IDLE = "idle";
4629
4663
  var EMBEDDING_STATUS_PENDING = "pending";
4630
4664
  async function handleGetEmbeddingStatus(vaultDir) {
4631
- const config = loadConfig(vaultDir);
4665
+ const config = loadMergedConfig(vaultDir);
4632
4666
  const { queue_depth, embedded_count } = getEmbeddingQueueDepth();
4633
4667
  return {
4634
4668
  body: {
@@ -6050,7 +6084,7 @@ async function handleCreateNotification(vaultDir, body) {
6050
6084
  return { status: 400, body: { error: "validation_failed", issues: parsed.error.issues } };
6051
6085
  }
6052
6086
  const { domain, type, title, message, link, metadata } = parsed.data;
6053
- const config = loadConfig(vaultDir);
6087
+ const config = loadMergedConfig(vaultDir);
6054
6088
  if (!config.notifications.enabled) {
6055
6089
  return { body: { ok: true, suppressed: true, reason: "notifications_disabled" } };
6056
6090
  }
@@ -6254,7 +6288,7 @@ async function handleDeleteTask(req, vaultDir) {
6254
6288
  }
6255
6289
  async function handleGetTaskConfig(req, vaultDir) {
6256
6290
  const taskId = req.params.id;
6257
- const config = loadConfig(vaultDir);
6291
+ const config = loadMergedConfig(vaultDir);
6258
6292
  const taskConfig = config.agent.tasks?.[taskId] ?? null;
6259
6293
  return { status: HTTP_OK, body: { taskId, config: taskConfig } };
6260
6294
  }
@@ -6406,18 +6440,19 @@ function buildScheduledJobs(tasks, configOverrides, context, initialLastRuns) {
6406
6440
  }
6407
6441
 
6408
6442
  // src/daemon/task-scheduling.ts
6443
+ var SCHEDULED_JOB_PREFIX = "scheduled:";
6409
6444
  async function registerScheduledTasks(powerManager, deps) {
6410
- const { definitionsDir, vaultDir, embeddingManager, logger, config } = deps;
6445
+ const { definitionsDir, vaultDir, embeddingManager, logger, liveConfig } = deps;
6411
6446
  const runningTasks = /* @__PURE__ */ new Set();
6412
6447
  if (!definitionsDir) {
6413
6448
  logger.warn(LOG_KINDS.AGENT_ERROR, "Skipping dynamic task scheduling \u2014 definitions directory unavailable");
6414
6449
  return;
6415
6450
  }
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;
6451
+ let lastEnabled = liveConfig.current.agent.scheduled_tasks_enabled !== false;
6452
+ if (!lastEnabled) {
6453
+ 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
6454
  }
6420
- const { loadAllTasks: loadAllTasks2 } = await import("./registry-MGJSJBAS.js");
6455
+ const { loadAllTasks: loadAllTasks2 } = await import("./registry-U4CHXK6R.js");
6421
6456
  const allTasks = Array.from(loadAllTasks2(definitionsDir, vaultDir).values());
6422
6457
  const taskAgentMap = /* @__PURE__ */ new Map();
6423
6458
  for (const task of allTasks) {
@@ -6443,7 +6478,17 @@ async function registerScheduledTasks(powerManager, deps) {
6443
6478
  else runningTasks.delete(name);
6444
6479
  },
6445
6480
  runTask: async (taskName) => {
6446
- const { runAgent } = await import("./executor-ACDHGTRH.js");
6481
+ const config = liveConfig.current;
6482
+ const enabled = config.agent.scheduled_tasks_enabled !== false;
6483
+ if (enabled !== lastEnabled) {
6484
+ logger.info(
6485
+ LOG_KINDS.AGENT_RUN,
6486
+ enabled ? "Scheduled agent tasks re-enabled \u2014 resuming" : "Scheduled agent tasks disabled \u2014 skipping until re-enabled"
6487
+ );
6488
+ lastEnabled = enabled;
6489
+ }
6490
+ if (!enabled) return;
6491
+ const { runAgent } = await import("./executor-HWW2QNZQ.js");
6447
6492
  const taskConfig = config.agent.tasks?.[taskName];
6448
6493
  const projectRoot = resolve(vaultDir, "..");
6449
6494
  const built = buildTaskInstruction(taskName, taskConfig?.params, taskAgentMap.get(taskName), projectRoot, embeddingManager);
@@ -6525,6 +6570,9 @@ async function registerScheduledTasks(powerManager, deps) {
6525
6570
  },
6526
6571
  "has-approved-candidates": () => {
6527
6572
  return countCandidates({ status: "approved" }) > 0;
6573
+ },
6574
+ "has-skill-survey-evidence": () => {
6575
+ return getSkillSurveyEligibility(taskAgentMap.get(SKILL_SURVEY_TASK)).eligible;
6528
6576
  }
6529
6577
  },
6530
6578
  onTaskError: (taskName, err) => {
@@ -6535,14 +6583,12 @@ async function registerScheduledTasks(powerManager, deps) {
6535
6583
  };
6536
6584
  const scheduledJobs = buildScheduledJobs(
6537
6585
  allTasks,
6538
- config.agent.tasks ?? {},
6586
+ liveConfig.current.agent.tasks ?? {},
6539
6587
  scheduledContext,
6540
6588
  initialLastRuns
6541
6589
  );
6542
- for (const job of scheduledJobs) {
6543
- powerManager.register(job);
6544
- }
6545
- logger.info(LOG_KINDS.DAEMON_START, `Registered ${scheduledJobs.length} scheduled task(s)`, {
6590
+ powerManager.replaceGroup(SCHEDULED_JOB_PREFIX, scheduledJobs);
6591
+ logger.info(LOG_KINDS.DAEMON_START, `Synced ${scheduledJobs.length} scheduled task(s)`, {
6546
6592
  tasks: scheduledJobs.map((j) => j.name)
6547
6593
  });
6548
6594
  }
@@ -6807,7 +6853,7 @@ function createAgentRunHandlers(deps) {
6807
6853
  const { vaultDir, embeddingManager, logger } = deps;
6808
6854
  async function handleRun(req) {
6809
6855
  const { task, instruction: rawInstruction, agentId } = AgentRunBody.parse(req.body);
6810
- const mycoConfig = loadConfig(vaultDir);
6856
+ const mycoConfig = loadMergedConfig(vaultDir);
6811
6857
  if (!hasConfiguredProvider(mycoConfig, task)) {
6812
6858
  return {
6813
6859
  status: 400,
@@ -6842,7 +6888,7 @@ function createAgentRunHandlers(deps) {
6842
6888
  };
6843
6889
  }
6844
6890
  }
6845
- const { runAgent } = await import("./executor-ACDHGTRH.js");
6891
+ const { runAgent } = await import("./executor-HWW2QNZQ.js");
6846
6892
  const resultPromise = runAgent(vaultDir, {
6847
6893
  task,
6848
6894
  instruction,
@@ -7218,6 +7264,10 @@ var PowerManager = class {
7218
7264
  register(job) {
7219
7265
  this.jobs.push(job);
7220
7266
  }
7267
+ replaceGroup(prefix, jobs) {
7268
+ this.jobs = this.jobs.filter((job) => !job.name.startsWith(prefix));
7269
+ this.jobs.push(...jobs);
7270
+ }
7221
7271
  recordActivity() {
7222
7272
  this.lastActivity = Date.now();
7223
7273
  this.deepSleepHeld = false;
@@ -7367,7 +7417,7 @@ async function runSessionMaintenance(deps) {
7367
7417
  // src/daemon/power-jobs.ts
7368
7418
  var STAGING_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
7369
7419
  function registerPowerJobs(powerManager, deps) {
7370
- const { embeddingManager, registry, logger, config, db, backupDir, machineId, vaultDir, databaseManager } = deps;
7420
+ const { embeddingManager, registry, logger, liveConfig, db, machineId, vaultDir, databaseManager } = deps;
7371
7421
  let reconcileRunning = false;
7372
7422
  powerManager.register({
7373
7423
  name: "embedding-reconcile",
@@ -7390,14 +7440,14 @@ function registerPowerJobs(powerManager, deps) {
7390
7440
  registeredSessionIds: () => registry.sessions,
7391
7441
  embeddingManager,
7392
7442
  vaultDir,
7393
- staleThresholdMs: config.daemon.stale_session_threshold_ms
7443
+ staleThresholdMs: liveConfig.current.daemon.stale_session_threshold_ms
7394
7444
  })
7395
7445
  });
7396
7446
  powerManager.register({
7397
7447
  name: "log-retention",
7398
7448
  runIn: ["idle", "sleep"],
7399
7449
  fn: async () => {
7400
- const retentionDays = loadMergedConfig(vaultDir).daemon.log_retention_days;
7450
+ const retentionDays = liveConfig.current.daemon.log_retention_days;
7401
7451
  const cutoff = new Date(Date.now() - retentionDays * MS_PER_DAY).toISOString();
7402
7452
  const deleted = deleteOldLogs(cutoff);
7403
7453
  if (deleted > 0) {
@@ -7410,6 +7460,7 @@ function registerPowerJobs(powerManager, deps) {
7410
7460
  runIn: ["idle", "sleep"],
7411
7461
  fn: async () => {
7412
7462
  try {
7463
+ const backupDir = resolveBackupDir(liveConfig.current, vaultDir);
7413
7464
  logger.info(LOG_KINDS.BACKUP_START, "Auto-backup starting");
7414
7465
  const filePath = createBackup(db, backupDir, machineId);
7415
7466
  logger.info(LOG_KINDS.BACKUP_COMPLETE, "Auto-backup complete", { file_path: filePath });
@@ -7422,6 +7473,7 @@ function registerPowerJobs(powerManager, deps) {
7422
7473
  name: "database-optimize",
7423
7474
  runIn: ["idle", "sleep"],
7424
7475
  fn: async () => {
7476
+ const config = liveConfig.current;
7425
7477
  if (!config.maintenance?.auto_optimize) return;
7426
7478
  const intervalMs = (config.maintenance.auto_optimize_interval_hours ?? 24) * MS_PER_HOUR;
7427
7479
  const lastRun = await databaseManager.getLastOptimizeAt();
@@ -7734,7 +7786,7 @@ function captureBatchImages(input) {
7734
7786
 
7735
7787
  // src/daemon/plan-capture.ts
7736
7788
  import { createHash as createHash4 } from "crypto";
7737
- import os7 from "os";
7789
+ import os8 from "os";
7738
7790
  import path20 from "path";
7739
7791
  function extractTaggedPlans(text, tags) {
7740
7792
  const results = [];
@@ -7763,7 +7815,7 @@ var PLAN_ID_HASH_LENGTH = 16;
7763
7815
  function isInPlanDirectory(filePath, watchDirs, projectRoot) {
7764
7816
  const abs = path20.isAbsolute(filePath) ? filePath : path20.resolve(projectRoot, filePath);
7765
7817
  return watchDirs.some((dir) => {
7766
- const expanded = dir.startsWith("~/") ? path20.join(os7.homedir(), dir.slice(2)) : dir;
7818
+ const expanded = dir.startsWith("~/") ? path20.join(os8.homedir(), dir.slice(2)) : dir;
7767
7819
  const absDir = path20.isAbsolute(expanded) ? expanded : path20.resolve(projectRoot, expanded);
7768
7820
  const prefix = absDir.endsWith(path20.sep) ? absDir : absDir + path20.sep;
7769
7821
  return abs === absDir || abs.startsWith(prefix);
@@ -7867,7 +7919,7 @@ function enrichTurnsWithToolMetadata(turns, events) {
7867
7919
  }
7868
7920
  }
7869
7921
  function createStopProcessor(deps) {
7870
- const { registry, sessionBuffers, transcriptMiner, embeddingManager, logger, config, vaultDir } = deps;
7922
+ const { registry, sessionBuffers, transcriptMiner, embeddingManager, logger, liveConfig, vaultDir } = deps;
7871
7923
  let activeStopProcessing = null;
7872
7924
  const sessionTitleCache = /* @__PURE__ */ new Map();
7873
7925
  const StopBody = external_exports.object({
@@ -7877,7 +7929,7 @@ function createStopProcessor(deps) {
7877
7929
  transcript_path: external_exports.string().nullish(),
7878
7930
  last_assistant_message: external_exports.string().nullish()
7879
7931
  });
7880
- const triggerTitleSummary2 = (sessionId) => triggerTitleSummary(sessionId, { vaultDir, embeddingManager, config, logger });
7932
+ const triggerTitleSummary2 = (sessionId) => triggerTitleSummary(sessionId, { vaultDir, embeddingManager, liveConfig, logger });
7881
7933
  function cleanupInvalidCapturedSession(sessionId) {
7882
7934
  registry.unregister(sessionId);
7883
7935
  sessionBuffers.delete(sessionId);
@@ -8138,7 +8190,7 @@ function createEventDispatcher(deps) {
8138
8190
  powerManager,
8139
8191
  logger,
8140
8192
  machineId,
8141
- config,
8193
+ liveConfig,
8142
8194
  vaultDir,
8143
8195
  reconcileSession,
8144
8196
  planWatchConfig,
@@ -8205,7 +8257,7 @@ function createEventDispatcher(deps) {
8205
8257
  });
8206
8258
  }
8207
8259
  const batchCount = promptNumber;
8208
- const summaryInterval = config.agent.summary_batch_interval;
8260
+ const summaryInterval = liveConfig.current.agent.summary_batch_interval;
8209
8261
  if (summaryInterval > 0 && batchCount > 0 && batchCount % summaryInterval === 0) {
8210
8262
  triggerTitleSummary2(event.session_id);
8211
8263
  }
@@ -8429,7 +8481,6 @@ function createPlanWatchReaction(deps) {
8429
8481
 
8430
8482
  // src/daemon/main.ts
8431
8483
  import fs23 from "fs";
8432
- import os8 from "os";
8433
8484
  import path22 from "path";
8434
8485
  function killStaleDaemon(vaultDir, logger) {
8435
8486
  const daemonJsonPath = path22.join(vaultDir, "daemon.json");
@@ -8456,7 +8507,8 @@ async function main() {
8456
8507
  }
8457
8508
  const vaultDir = path22.resolve(vaultArg);
8458
8509
  loadSecrets(vaultDir);
8459
- const config = loadConfig(vaultDir);
8510
+ const config = loadMergedConfig(vaultDir);
8511
+ const liveConfig = { current: config };
8460
8512
  const manifests = loadManifests();
8461
8513
  const symbiontPlanDirs = manifests.flatMap((m) => m.capture?.planDirs ?? []);
8462
8514
  const symbiontPlanTags = [...new Set(manifests.flatMap((m) => m.capture?.planTags ?? []))];
@@ -8571,7 +8623,7 @@ async function main() {
8571
8623
  const databaseManager = new DatabaseMaintenanceManager(vaultDbPath(vaultDir), vaultDir, logger);
8572
8624
  let definitionsDir;
8573
8625
  try {
8574
- const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-TSB5M7FD.js");
8626
+ const { registerBuiltInAgentsAndTasks, resolveDefinitionsDir: resolveDefinitionsDir2 } = await import("./loader-NOMBJUPW.js");
8575
8627
  definitionsDir = resolveDefinitionsDir2();
8576
8628
  await registerBuiltInAgentsAndTasks(definitionsDir, vaultDir);
8577
8629
  logger.info(LOG_KINDS.AGENT_TASK, "Built-in agents and tasks registered");
@@ -8596,7 +8648,7 @@ async function main() {
8596
8648
  message: "Daemon restarted while run was in progress",
8597
8649
  link: `/agent?run=${row.id}`,
8598
8650
  metadata: { taskName: row.task, runId: row.id, reason: "daemon_restart" }
8599
- }, config);
8651
+ }, liveConfig.current);
8600
8652
  }
8601
8653
  logger.info(LOG_KINDS.AGENT_RUN, "Cleaned stale running agent runs", {
8602
8654
  count: staleRows.length,
@@ -8654,7 +8706,7 @@ async function main() {
8654
8706
  transcriptMiner,
8655
8707
  embeddingManager,
8656
8708
  logger,
8657
- config,
8709
+ liveConfig,
8658
8710
  vaultDir,
8659
8711
  planTags: symbiontPlanTags
8660
8712
  });
@@ -8667,7 +8719,7 @@ async function main() {
8667
8719
  powerManager,
8668
8720
  machineId,
8669
8721
  logger,
8670
- config,
8722
+ liveConfig,
8671
8723
  vaultDir
8672
8724
  });
8673
8725
  server.registerRoute("POST", "/sessions/register", sessionLifecycle.handleRegister);
@@ -8678,7 +8730,7 @@ async function main() {
8678
8730
  powerManager,
8679
8731
  logger,
8680
8732
  machineId,
8681
- config,
8733
+ liveConfig,
8682
8734
  vaultDir,
8683
8735
  reconcileSession: reconciler.reconcileSession,
8684
8736
  planWatchConfig,
@@ -8686,7 +8738,7 @@ async function main() {
8686
8738
  });
8687
8739
  server.registerRoute("POST", "/events", eventDispatcher);
8688
8740
  server.registerRoute("POST", "/events/stop", stopProcessor.handleStopRoute);
8689
- const contextDeps = { embeddingManager, config, logger };
8741
+ const contextDeps = { embeddingManager, liveConfig, logger };
8690
8742
  server.registerRoute("POST", "/context", createSessionContextHandler(contextDeps));
8691
8743
  server.registerRoute("POST", "/context/resume", createResumeContextHandler(contextDeps));
8692
8744
  server.registerRoute("POST", "/context/prompt", createPromptContextHandler(contextDeps));
@@ -8705,6 +8757,9 @@ async function main() {
8705
8757
  reactions.on([], () => {
8706
8758
  configHash = computeConfigHash(vaultDir);
8707
8759
  });
8760
+ reactions.on([], (ctx) => {
8761
+ liveConfig.current = ctx;
8762
+ });
8708
8763
  reactions.on(["capture", "symbionts"], (ctx) => {
8709
8764
  reconcileConfiguredSymbionts(path22.dirname(vaultDir), vaultDir, ctx);
8710
8765
  });
@@ -8720,14 +8775,28 @@ async function main() {
8720
8775
  delete process.env.MYCO_AGENT_DEBUG;
8721
8776
  }
8722
8777
  });
8778
+ async function syncScheduledTasks() {
8779
+ await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, liveConfig });
8780
+ }
8781
+ reactions.on(["agent.tasks"], async () => {
8782
+ await syncScheduledTasks();
8783
+ });
8784
+ async function applyConfigWriteReactions(touchedPaths) {
8785
+ const reactionContext = loadReactionContext(vaultDir, logger);
8786
+ if (!reactionContext) {
8787
+ configHash = computeConfigHash(vaultDir);
8788
+ return null;
8789
+ }
8790
+ await reactions.fire(touchedPaths, reactionContext);
8791
+ return reactionContext;
8792
+ }
8723
8793
  server.registerRoute("PUT", "/api/config/scoped", async (req) => {
8724
8794
  const result = await handlePutScopedConfig(vaultDir, req.body);
8725
8795
  if (!result.status || result.status < 400) {
8726
8796
  const body = req.body;
8727
8797
  const touchedPaths = computeTouchedPaths(body.patch, body.clear);
8728
- const reactionContext = loadReactionContext(vaultDir, logger);
8798
+ const reactionContext = await applyConfigWriteReactions(touchedPaths);
8729
8799
  if (reactionContext) {
8730
- await reactions.fire(touchedPaths, reactionContext);
8731
8800
  const summary = buildScopedConfigSaveNotification(body.scope, touchedPaths);
8732
8801
  notify(vaultDir, {
8733
8802
  domain: "settings",
@@ -8780,7 +8849,7 @@ async function main() {
8780
8849
  server.registerRoute("GET", "/api/progress/:token", async (req) => handleGetProgress(progressTracker, req.params.token));
8781
8850
  server.registerRoute("GET", "/api/sessions", handleListSessions);
8782
8851
  server.registerRoute("GET", "/api/sessions/:id", handleGetSession);
8783
- const sessionMutations = createSessionMutationHandlers({ embeddingManager, vaultDir, logger, config });
8852
+ const sessionMutations = createSessionMutationHandlers({ embeddingManager, vaultDir, logger, liveConfig });
8784
8853
  server.registerRoute("GET", "/api/sessions/:id/impact", sessionMutations.handleGetSessionImpact);
8785
8854
  server.registerRoute("POST", "/api/sessions/:id/complete", sessionMutations.handleCompleteSession);
8786
8855
  server.registerRoute("DELETE", "/api/sessions/:id", sessionMutations.handleDeleteSession);
@@ -8813,12 +8882,42 @@ async function main() {
8813
8882
  server.registerRoute("GET", "/api/agent/tasks", async (req) => handleListTasks(req, vaultDir));
8814
8883
  server.registerRoute("GET", "/api/agent/tasks/:id", async (req) => handleGetTask(req, vaultDir));
8815
8884
  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));
8885
+ server.registerRoute("PUT", "/api/agent/tasks/:id", async (req) => {
8886
+ const result = await handleUpdateTask(req, vaultDir);
8887
+ if (!result.status || result.status < 400) {
8888
+ await syncScheduledTasks();
8889
+ }
8890
+ return result;
8891
+ });
8892
+ server.registerRoute("POST", "/api/agent/tasks", async (req) => {
8893
+ const result = await handleCreateTask(req, vaultDir);
8894
+ if (!result.status || result.status < 400) {
8895
+ await syncScheduledTasks();
8896
+ }
8897
+ return result;
8898
+ });
8899
+ server.registerRoute("POST", "/api/agent/tasks/:id/copy", async (req) => {
8900
+ const result = await handleCopyTask(req, vaultDir);
8901
+ if (!result.status || result.status < 400) {
8902
+ await syncScheduledTasks();
8903
+ }
8904
+ return result;
8905
+ });
8906
+ server.registerRoute("DELETE", "/api/agent/tasks/:id", async (req) => {
8907
+ const result = await handleDeleteTask(req, vaultDir);
8908
+ if (!result.status || result.status < 400) {
8909
+ await syncScheduledTasks();
8910
+ }
8911
+ return result;
8912
+ });
8820
8913
  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));
8914
+ server.registerRoute("PUT", "/api/agent/tasks/:id/config", async (req) => {
8915
+ const result = await handleUpdateTaskConfig(req, vaultDir);
8916
+ if (!result.status || result.status < 400) {
8917
+ await applyConfigWriteReactions([`agent.tasks.${req.params.id}`]);
8918
+ }
8919
+ return result;
8920
+ });
8822
8921
  server.registerRoute("GET", "/api/providers", async () => handleGetProviders());
8823
8922
  server.registerRoute("POST", "/api/providers/test", async (req) => handleTestProvider(req));
8824
8923
  const mcpProxy = createMcpProxyHandlers({ machineId, embeddingManager });
@@ -8828,17 +8927,25 @@ async function main() {
8828
8927
  server.registerRoute("GET", "/api/mcp/plans", mcpProxy.handlePlans);
8829
8928
  server.registerRoute("GET", "/api/mcp/sessions", mcpProxy.handleSessions);
8830
8929
  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 });
8930
+ const backupHandlers = createBackupHandlers({ db, machineId, vaultDir, liveConfig });
8834
8931
  server.registerRoute("POST", "/api/backup", backupHandlers.handleCreateBackup);
8835
8932
  server.registerRoute("GET", "/api/backups", backupHandlers.handleListBackups);
8836
8933
  server.registerRoute("POST", "/api/restore/preview", backupHandlers.handleRestorePreview);
8837
8934
  server.registerRoute("POST", "/api/restore", backupHandlers.handleRestore);
8838
8935
  const backupConfigHandlers = createBackupConfigHandlers({ vaultDir });
8839
8936
  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 });
8937
+ server.registerRoute("PUT", "/api/backup/config", async (req) => {
8938
+ const result = await backupConfigHandlers.handlePutBackupConfig(req);
8939
+ if (!result.status || result.status < 400) {
8940
+ await applyConfigWriteReactions(["backup.dir"]);
8941
+ }
8942
+ return result;
8943
+ });
8944
+ const teamSync = initTeamSync({ liveConfig, machineId, logger, vaultDir, serverVersion: server.version });
8945
+ reactions.on(["team"], async () => {
8946
+ await teamSync.reconcileClient();
8947
+ });
8948
+ await teamSync.reconcileClient();
8842
8949
  const teamHandlers = createTeamHandlers({
8843
8950
  vaultDir,
8844
8951
  machineId,
@@ -8846,8 +8953,20 @@ async function main() {
8846
8953
  getTeamClient: teamSync.getTeamClient,
8847
8954
  setTeamClient: teamSync.setTeamClient
8848
8955
  });
8849
- server.registerRoute("POST", "/api/team/connect", teamHandlers.handleConnect);
8850
- server.registerRoute("POST", "/api/team/disconnect", teamHandlers.handleDisconnect);
8956
+ server.registerRoute("POST", "/api/team/connect", async (req) => {
8957
+ const result = await teamHandlers.handleConnect(req);
8958
+ if (!result.status || result.status < 400) {
8959
+ await applyConfigWriteReactions(["team.enabled", "team.worker_url"]);
8960
+ }
8961
+ return result;
8962
+ });
8963
+ server.registerRoute("POST", "/api/team/disconnect", async (req) => {
8964
+ const result = await teamHandlers.handleDisconnect(req);
8965
+ if (!result.status || result.status < 400) {
8966
+ await applyConfigWriteReactions(["team.enabled", "team.worker_url"]);
8967
+ }
8968
+ return result;
8969
+ });
8851
8970
  server.registerRoute("GET", "/api/team/status", teamHandlers.handleStatus);
8852
8971
  server.registerRoute("POST", "/api/team/backfill", teamHandlers.handleBackfill);
8853
8972
  server.registerRoute("POST", "/api/team/retry-failed", teamHandlers.handleRetryFailed);
@@ -8899,9 +9018,9 @@ async function main() {
8899
9018
  logger.warn(LOG_KINDS.DAEMON_CONFIG, "Failed to persist auto-derived port", { error: err.message });
8900
9019
  }
8901
9020
  }
8902
- registerPowerJobs(powerManager, { embeddingManager, registry, logger, config, db, backupDir, machineId, vaultDir, databaseManager });
9021
+ registerPowerJobs(powerManager, { embeddingManager, registry, logger, liveConfig, db, machineId, vaultDir, databaseManager });
8903
9022
  teamSync.registerFlushJob(powerManager);
8904
- await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, config });
9023
+ await registerScheduledTasks(powerManager, { definitionsDir, vaultDir, embeddingManager, logger, liveConfig });
8905
9024
  powerManager.start();
8906
9025
  const shutdown = async (signal) => {
8907
9026
  logger.info(LOG_KINDS.DAEMON_START, `${signal} received`);
@@ -8933,4 +9052,4 @@ export {
8933
9052
  handleUserPrompt,
8934
9053
  main
8935
9054
  };
8936
- //# sourceMappingURL=main-5S4MDCIO.js.map
9055
+ //# sourceMappingURL=main-YTBVRTBI.js.map