openwolf-enhanced 1.26.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +306 -0
  2. package/dist/dashboard/assets/{AISuggestions-DZmzksSA.js → AISuggestions-C7WFvzLO.js} +1 -1
  3. package/dist/dashboard/assets/{ActivityLog-BJ0omuzu.js → ActivityLog-SsRbpBFt.js} +1 -1
  4. package/dist/dashboard/assets/{ActivityTimeline-BWhxretI.js → ActivityTimeline-BoV30nDY.js} +1 -1
  5. package/dist/dashboard/assets/{AnatomyBrowser-DNVp6-_r.js → AnatomyBrowser-DwzsHn4z.js} +1 -1
  6. package/dist/dashboard/assets/{BugLog-DMJTuU9p.js → BugLog-CPl4Q-JG.js} +1 -1
  7. package/dist/dashboard/assets/{CerebrumViewer-BwcGr6pu.js → CerebrumViewer-_f6fBsNF.js} +1 -1
  8. package/dist/dashboard/assets/{CronStatus-Dwf_M4-S.js → CronStatus-1iBEPJK5.js} +1 -1
  9. package/dist/dashboard/assets/{DesignQC-DzHkh94I.js → DesignQC-D4UU7lca.js} +1 -1
  10. package/dist/dashboard/assets/{LinkGraph-kqQD--Yj.js → LinkGraph-BWtI8Gh3.js} +1 -1
  11. package/dist/dashboard/assets/{MemoryViewer-BCn9Fr-w.js → MemoryViewer-BYRVG34g.js} +1 -1
  12. package/dist/dashboard/assets/{NativeMemory-DPMZaP5E.js → NativeMemory-Dphtrqjt.js} +1 -1
  13. package/dist/dashboard/assets/{ProjectOverview-PWENJiC4.js → ProjectOverview-CTYohvjD.js} +1 -1
  14. package/dist/dashboard/assets/{ProjectsAggregate-Baj44DVk.js → ProjectsAggregate-CMxNs35H.js} +1 -1
  15. package/dist/dashboard/assets/{StatusBadge-Db61D51H.js → StatusBadge-CjrFCDOI.js} +1 -1
  16. package/dist/dashboard/assets/{TokenUsage-UefDh9w4.js → TokenUsage-C5wJpMl8.js} +1 -1
  17. package/dist/dashboard/assets/index-BNi8lsJE.css +2 -0
  18. package/dist/dashboard/assets/{index-e2PfOI0b.js → index-C74qneS9.js} +5 -5
  19. package/dist/dashboard/index.html +2 -2
  20. package/dist/hooks/post-bash.js +10 -5
  21. package/dist/hooks/post-read.js +24 -26
  22. package/dist/hooks/post-write.js +135 -118
  23. package/dist/hooks/pre-read.js +42 -36
  24. package/dist/hooks/pre-write.js +3 -3
  25. package/dist/hooks/precompact.js +2 -2
  26. package/dist/hooks/session-start.js +15 -6
  27. package/dist/hooks/shared.js +221 -14
  28. package/dist/hooks/stop.js +33 -7
  29. package/dist/src/cli/cron-cmd.js +2 -2
  30. package/dist/src/cli/cron-cmd.js.map +1 -1
  31. package/dist/src/cli/daemon-cmd.js +49 -21
  32. package/dist/src/cli/daemon-cmd.js.map +1 -1
  33. package/dist/src/cli/doctor-cmd.js +2 -1
  34. package/dist/src/cli/doctor-cmd.js.map +1 -1
  35. package/dist/src/cli/export-cmd.js +8 -0
  36. package/dist/src/cli/export-cmd.js.map +1 -1
  37. package/dist/src/cli/init.js +34 -8
  38. package/dist/src/cli/init.js.map +1 -1
  39. package/dist/src/cli/registry.js +68 -33
  40. package/dist/src/cli/registry.js.map +1 -1
  41. package/dist/src/cli/update.js +37 -6
  42. package/dist/src/cli/update.js.map +1 -1
  43. package/dist/src/daemon/cron-engine.js +70 -8
  44. package/dist/src/daemon/cron-engine.js.map +1 -1
  45. package/dist/src/daemon/file-watcher.js +4 -1
  46. package/dist/src/daemon/file-watcher.js.map +1 -1
  47. package/dist/src/daemon/llm-provider.js +9 -6
  48. package/dist/src/daemon/llm-provider.js.map +1 -1
  49. package/dist/src/daemon/wolf-daemon.js +69 -15
  50. package/dist/src/daemon/wolf-daemon.js.map +1 -1
  51. package/dist/src/designqc/designqc-capture.js +116 -6
  52. package/dist/src/designqc/designqc-capture.js.map +1 -1
  53. package/dist/src/designqc/designqc-engine.js +9 -3
  54. package/dist/src/designqc/designqc-engine.js.map +1 -1
  55. package/dist/src/hooks/post-bash.js +10 -5
  56. package/dist/src/hooks/post-bash.js.map +1 -1
  57. package/dist/src/hooks/post-read.js +24 -26
  58. package/dist/src/hooks/post-read.js.map +1 -1
  59. package/dist/src/hooks/post-write.js +135 -118
  60. package/dist/src/hooks/post-write.js.map +1 -1
  61. package/dist/src/hooks/pre-read.js +42 -36
  62. package/dist/src/hooks/pre-read.js.map +1 -1
  63. package/dist/src/hooks/pre-write.js +3 -3
  64. package/dist/src/hooks/pre-write.js.map +1 -1
  65. package/dist/src/hooks/precompact.js +2 -2
  66. package/dist/src/hooks/precompact.js.map +1 -1
  67. package/dist/src/hooks/session-start.js +15 -6
  68. package/dist/src/hooks/session-start.js.map +1 -1
  69. package/dist/src/hooks/shared.js +221 -14
  70. package/dist/src/hooks/shared.js.map +1 -1
  71. package/dist/src/hooks/stop.js +33 -7
  72. package/dist/src/hooks/stop.js.map +1 -1
  73. package/dist/src/scanner/anatomy-scanner.js +7 -3
  74. package/dist/src/scanner/anatomy-scanner.js.map +1 -1
  75. package/dist/src/utils/agent-hooks.js +50 -4
  76. package/dist/src/utils/agent-hooks.js.map +1 -1
  77. package/dist/src/utils/daemon-pid.js +56 -0
  78. package/dist/src/utils/daemon-pid.js.map +1 -0
  79. package/dist/src/utils/dashboard-auth.js +13 -1
  80. package/dist/src/utils/dashboard-auth.js.map +1 -1
  81. package/dist/src/utils/embeddings.js +9 -1
  82. package/dist/src/utils/embeddings.js.map +1 -1
  83. package/dist/src/utils/fs-safe.js +69 -11
  84. package/dist/src/utils/fs-safe.js.map +1 -1
  85. package/dist/src/utils/logger.js +21 -6
  86. package/dist/src/utils/logger.js.map +1 -1
  87. package/dist/src/utils/maintenance.js +100 -6
  88. package/dist/src/utils/maintenance.js.map +1 -1
  89. package/dist/src/utils/platform.js +39 -0
  90. package/dist/src/utils/platform.js.map +1 -1
  91. package/dist/src/utils/remote.js +2 -2
  92. package/dist/src/utils/remote.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/templates/config.json +34 -9
  95. package/dist/dashboard/assets/index-CVfvTpSA.css +0 -2
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { readJSON, writeJSON, writeText } from "./fs-safe.js";
3
+ import { writeJSON, writeText } from "./fs-safe.js";
4
4
  import { ensureDir } from "./paths.js";
5
5
  import { upsertMarkerBlock, AGENTS_SNIPPET } from "./marker-block.js";
6
6
  import { isWindows } from "./platform.js";
@@ -216,18 +216,64 @@ export function detectAgents(projectRoot) {
216
216
  }
217
217
  return found;
218
218
  }
219
+ /**
220
+ * Merge OpenWolf's hook entries into an agent's config file — or refuse, loudly.
221
+ *
222
+ * This used to call readJSON, whose contract on an unparseable file is "warn and hand back the
223
+ * fallback". The fallback here is `{}`, so a settings.json or hooks.json with one stray comma was
224
+ * treated as an empty config: OpenWolf's entries were written over the user's file, every hook the
225
+ * user had configured themselves was gone, and deployment reported success. A merge that cannot
226
+ * read the existing side is not a merge.
227
+ *
228
+ * The file is now left byte-identical and the caller is told what to do about it. Losing the hooks
229
+ * for one agent until a typo is fixed beats silently replacing someone's configuration.
230
+ */
231
+ class MalformedAgentConfigError extends Error {
232
+ file;
233
+ constructor(file, cause) {
234
+ super(`${file} is not valid JSON (${cause}) — left untouched. Fix or remove it, then run \`openwolf update\` to register the hooks.`);
235
+ this.file = file;
236
+ this.name = "MalformedAgentConfigError";
237
+ }
238
+ }
219
239
  function deployJsonAgent(dir, file, settings) {
220
240
  ensureDir(dir);
221
241
  const p = path.join(dir, file);
222
- const existing = fs.existsSync(p) ? readJSON(p, {}) : {};
242
+ let existing = {};
243
+ if (fs.existsSync(p)) {
244
+ let raw = "";
245
+ try {
246
+ raw = fs.readFileSync(p, "utf-8");
247
+ }
248
+ catch { /* unreadable — treat as absent below */ }
249
+ if (raw.trim()) {
250
+ try {
251
+ const parsed = JSON.parse(raw);
252
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
253
+ throw new Error("top level is not an object");
254
+ }
255
+ existing = parsed;
256
+ }
257
+ catch (e) {
258
+ throw new MalformedAgentConfigError(path.join(path.basename(dir), file), e.message);
259
+ }
260
+ }
261
+ }
223
262
  writeJSON(p, mergeManagedHooks(existing, settings));
224
263
  }
225
264
  // Deploy OpenWolf hooks to Claude (always) plus every detected agent. Returns a per-agent result.
226
265
  export function deployAgentHooks(projectRoot) {
227
266
  const results = [];
228
267
  // Claude — always.
229
- deployJsonAgent(path.join(projectRoot, ".claude"), "settings.json", claudeSettings());
230
- results.push({ agent: "claude", deployed: true, detail: ".claude/settings.json" });
268
+ try {
269
+ deployJsonAgent(path.join(projectRoot, ".claude"), "settings.json", claudeSettings());
270
+ results.push({ agent: "claude", deployed: true, detail: ".claude/settings.json" });
271
+ }
272
+ catch (e) {
273
+ // Reported, not thrown: a malformed .claude/settings.json must not abort `openwolf init` for
274
+ // everything else it does — but it must not be silently overwritten either.
275
+ results.push({ agent: "claude", deployed: false, detail: e.message });
276
+ }
231
277
  for (const agent of detectAgents(projectRoot)) {
232
278
  try {
233
279
  if (agent === "codex") {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-hooks.js","sourceRoot":"","sources":["../../../src/utils/agent-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-hooks.js","sourceRoot":"","sources":["../../../src/utils/agent-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAY,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAY1C,MAAM,CAAC,MAAM,iBAAiB,GAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAa5E,MAAM,KAAK,GAAc;IACvB,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;IACxE,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE;IACrE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE;IACtF,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE;IACvE,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE;IACxF,8FAA8F;IAC9F,qFAAqF;IACrF,iGAAiG;IACjG,+FAA+F;IAC/F,wFAAwF;IACxF,uDAAuD;IACvD,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAClF,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IACvD,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;CACpE,CAAC;AAEF,mGAAmG;AACnG,6DAA6D;AAC7D,EAAE;AACF,8FAA8F;AAC9F,yEAAyE;AACzE,6FAA6F;AAC7F,iGAAiG;AACjG,gGAAgG;AAChG,+FAA+F;AAC/F,iGAAiG;AACjG,0DAA0D;AAC1D,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACtF,CAAC;AAED,kGAAkG;AAClG,gDAAgD;AAChD,EAAE;AACF,mGAAmG;AACnG,6FAA6F;AAC7F,kGAAkG;AAClG,8FAA8F;AAC9F,8EAA8E;AAC9E,SAAS,GAAG,CAAC,WAAmB,EAAE,MAAc;IAC9C,OAAO,QAAQ,OAAO,CAAC,GAAG,WAAW,gBAAgB,MAAM,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,sEAAsE;AACtE,SAAS,cAAc;IACrB,MAAM,KAAK,GAAoC,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC/H,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;YACxB,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,yFAAyF;YACzF,6FAA6F;YAC7F,2FAA2F;YAC3F,0FAA0F;YAC1F,iFAAiF;YACjF,0FAA0F;YAC1F,yFAAyF;YACzF,kDAAkD;YAClD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,sCAAsC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;SACzI,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,0FAA0F;AAC1F,mGAAmG;AACnG,6EAA6E;AAC7E,8FAA8F;AAC9F,+FAA+F;AAC/F,+FAA+F;AAC/F,kDAAkD;AAClD,EAAE;AACF,+FAA+F;AAC/F,8FAA8F;AAC9F,iGAAiG;AACjG,6BAA6B;AAC7B,SAAS,aAAa,CAAC,WAAmB;IACxC,MAAM,CAAC,GAAG,CAAC,MAAc,EAAE,aAAqB,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI,EAAE,SAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa;QAC/D,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO;KAC3C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,sCAAsC,CAAC;IACrD,MAAM,IAAI,GAAG,oBAAoB,CAAC;IAClC,OAAO;QACL,KAAK,EAAE;YACL,2FAA2F;YAC3F,2FAA2F;YAC3F,qFAAqF;YACrF,8EAA8E;YAC9E,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC,EAAE,CAAC;YAChF,UAAU,EAAE;gBACV,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC,EAAE;gBACtE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC,EAAE;aAC1E;YACD,WAAW,EAAE;gBACX,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC,EAAE;gBACvE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC,EAAE;gBAC9E,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC,EAAE;aACjG;YACD,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC,EAAE,CAAC;YAC7E,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;SAClE;KACF,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,kGAAkG;AAClG,iFAAiF;AACjF,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,gGAAgG;IAChG,+FAA+F;IAC/F,iGAAiG;IACjG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC;YAAC,SAAS;QAAC,CAAC;QACrE,IAAI,UAAU,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACvE,CAAC;IACD,OAAO,+FAA+F,CAAC;AACzG,CAAC;AAED,uGAAuG;AACvG,uCAAuC;AACvC,EAAE;AACF,kGAAkG;AAClG,mGAAmG;AACnG,gGAAgG;AAChG,+FAA+F;AAC/F,qBAAqB;AACrB,SAAS,cAAc,CAAC,WAAmB;IACzC,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5J,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;YAC5E,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC,EAAE;gBACrF,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC,EAAE;aACnF;YACD,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;SACzD;KACF,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,oGAAoG;AACpG,oGAAoG;AACpG,MAAM,UAAU,iBAAiB,CAAC,QAAiC,EAAE,QAAsB;IACzF,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAwC,CAAC;IAC9D,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpD,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA6B,CAAC,UAAU,KAAK,UAAU,CAAC,CACvF,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mGAAmG;AACnG,qGAAqG;AACrG,SAAS,cAAc,CAAC,WAAmB;IACzC,OAAO;;;;;kBAKS,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B5C,CAAC;AACF,CAAC;AAID,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAU,EAAE,CAAC;QAC5G,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,yBAA0B,SAAQ,KAAK;IACf,IAAI;IAAhC,YAA4B,IAAY,EAAE,KAAa;QACrD,KAAK,CAAC,GAAG,IAAI,uBAAuB,KAAK,2FAA2F,CAAC,CAAC;oBAD5G,IAAI;QAE9B,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,IAAY,EAAE,QAAsB;IACxE,SAAS,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wCAAwC,CAAC,CAAC;QAC7F,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChD,CAAC;gBACD,QAAQ,GAAG,MAAiC,CAAC;YAC/C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;IACD,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,mBAAmB;IACnB,IAAI,CAAC;QACH,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,6FAA6F;QAC7F,4EAA4E;QAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAClD,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;gBACnF,MAAM,IAAI,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC/D,IAAI,GAAG,CAAC,OAAO;oBAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAC9C,IAAI,GAAG,CAAC,OAAO;oBAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,IAAI,IAAI;oBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;gBACjG,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAC1D,SAAS,CAAC,GAAG,CAAC,CAAC;gBACf,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtE,+FAA+F;gBAC/F,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,CAAC;gBACnF,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,uDAAuD;0BACjG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,WAAY,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { readJSON, writeJSON } from "./fs-safe.js";
5
+ export function daemonPidPath(wolfDir) {
6
+ return path.join(wolfDir, "daemon.pid");
7
+ }
8
+ export function writeDaemonRecord(wolfDir, projectRoot, port) {
9
+ try {
10
+ writeJSON(daemonPidPath(wolfDir), {
11
+ pid: process.pid,
12
+ project_root: projectRoot,
13
+ hostname: os.hostname(),
14
+ port,
15
+ started_at: new Date().toISOString(),
16
+ });
17
+ }
18
+ catch { /* the daemon still works without the record; stop just falls back to reporting */ }
19
+ }
20
+ export function clearDaemonRecord(wolfDir) {
21
+ try {
22
+ fs.unlinkSync(daemonPidPath(wolfDir));
23
+ }
24
+ catch { /* already gone */ }
25
+ }
26
+ /** Is the PID currently alive? Signal 0 tests existence without delivering anything. */
27
+ export function pidIsAlive(pid) {
28
+ try {
29
+ process.kill(pid, 0);
30
+ return true;
31
+ }
32
+ catch (e) {
33
+ // EPERM means it exists but belongs to another user — alive, and emphatically not ours to kill.
34
+ return e.code === "EPERM";
35
+ }
36
+ }
37
+ /**
38
+ * The PID this project's daemon claims, or null.
39
+ *
40
+ * Every condition has to hold: a record written on THIS host, for THIS project root, naming a live
41
+ * process. A stale record (daemon crashed, machine rebooted and the PID was reused) fails the
42
+ * liveness test or the host test, and a record copied along with the project fails the root test.
43
+ */
44
+ export function readOwnDaemonPid(wolfDir, projectRoot) {
45
+ const rec = readJSON(daemonPidPath(wolfDir), {});
46
+ if (typeof rec.pid !== "number" || rec.pid <= 0)
47
+ return null;
48
+ if (rec.hostname !== os.hostname())
49
+ return null;
50
+ if (path.resolve(rec.project_root ?? "") !== path.resolve(projectRoot))
51
+ return null;
52
+ if (!pidIsAlive(rec.pid))
53
+ return null;
54
+ return rec.pid;
55
+ }
56
+ //# sourceMappingURL=daemon-pid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-pid.js","sourceRoot":"","sources":["../../../src/utils/daemon-pid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBnD,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,WAAmB,EAAE,IAAY;IAClF,IAAI,CAAC;QACH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;YAChC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,IAAI;YACJ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACd,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC,CAAC,kFAAkF,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC7E,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gGAAgG;QAChG,OAAQ,CAA2B,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,WAAmB;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAwB,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ,EAAE;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC"}
@@ -13,8 +13,20 @@ export function ensureDashboardToken(wolfDir) {
13
13
  const p = dashboardTokenPath(wolfDir);
14
14
  try {
15
15
  const existing = fs.readFileSync(p, "utf-8").trim();
16
- if (existing)
16
+ if (existing) {
17
+ // A token created before this check — or restored from a backup, or copied with a umask that
18
+ // let the group bits through — kept whatever mode it had, and 0600 was only ever applied to
19
+ // files this function CREATED. A token readable by other local users is a token they can use.
20
+ //
21
+ // Repaired in place, never rotated: this is the token a live dashboard tab is already
22
+ // holding, and rotating it would log the user out to fix a permission bit.
23
+ try {
24
+ if ((fs.statSync(p).mode & 0o077) !== 0)
25
+ fs.chmodSync(p, 0o600);
26
+ }
27
+ catch { /* no chmod on this platform, or a race — the token is still valid */ }
17
28
  return existing;
29
+ }
18
30
  }
19
31
  catch { /* fall through to create */ }
20
32
  const token = crypto.randomBytes(24).toString("hex");
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-auth.js","sourceRoot":"","sources":["../../../src/utils/dashboard-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,uFAAuF;AACvF,qFAAqF;AACrF,kFAAkF;AAClF,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAgB;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"dashboard-auth.js","sourceRoot":"","sources":["../../../src/utils/dashboard-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,uFAAuF;AACvF,qFAAqF;AACrF,kFAAkF;AAClF,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,6FAA6F;YAC7F,4FAA4F;YAC5F,8FAA8F;YAC9F,EAAE;YACF,sFAAsF;YACtF,2EAA2E;YAC3E,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;oBAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC,CAAC,qEAAqE,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAgB;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import * as path from "node:path";
2
2
  import { readJSON } from "./fs-safe.js";
3
- import { isLocalEndpoint } from "../daemon/llm-provider.js";
3
+ import { isLocalEndpoint, assertSafeBaseUrl } from "../daemon/llm-provider.js";
4
4
  const DEFAULTS = {
5
5
  baseUrl: "http://localhost:1234/v1",
6
6
  model: "text-embedding-nomic-embed-text-v1.5",
@@ -20,6 +20,13 @@ export function resolveEmbedConfig(wolfDir) {
20
20
  export async function embedTexts(cfg, texts) {
21
21
  if (texts.length === 0)
22
22
  return [];
23
+ // Same gate the chat path has carried since 1.15.1 (bug-130), and for the same reason: base_url
24
+ // comes out of .wolf/config.json, a committed file, so a cloned repo picks the host. What goes out
25
+ // here is the knowledge base itself — cerebrum, memory, anatomy — plus the bearer token, which is
26
+ // strictly more than a chat prompt. It had no guard at all: no https requirement, no private/
27
+ // metadata-address check, and default redirect handling, so a 307 replayed the whole POST body
28
+ // (and the Authorization header) at whatever host the first one named.
29
+ assertSafeBaseUrl(cfg.baseUrl, "recall.embeddings.base_url");
23
30
  const key = process.env[cfg.apiKeyEnv] ?? "";
24
31
  if (!key && !isLocalEndpoint(cfg.baseUrl)) {
25
32
  throw new Error(`${cfg.apiKeyEnv} is not set — a remote embeddings endpoint needs a key. Point openwolf.recall.embeddings.base_url at a local server (LM Studio http://localhost:1234/v1) to run keyless.`);
@@ -29,6 +36,7 @@ export async function embedTexts(cfg, texts) {
29
36
  headers: { "content-type": "application/json", ...(key ? { authorization: `Bearer ${key}` } : {}) },
30
37
  body: JSON.stringify({ model: cfg.model, input: texts }),
31
38
  signal: AbortSignal.timeout(120_000),
39
+ redirect: "error",
32
40
  });
33
41
  if (!res.ok) {
34
42
  const t = await res.text().catch(() => "");
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/utils/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/utils/embeddings.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,24 @@ export function readJSON(filePath, fallback) {
16
16
  return JSON.parse(raw);
17
17
  }
18
18
  catch (e) {
19
- process.stderr.write(`[openwolf] ${path.basename(filePath)} exists but is not valid JSON — using defaults (${e.message})\n`);
19
+ // The caller is about to treat this file as empty and, in a read-modify-write, overwrite it
20
+ // with defaults — so a corrupt token-ledger.json meant months of usage history vanished on the
21
+ // next Stop hook, with one line on stderr as the only trace. Move it aside first. Recovery is
22
+ // then a possibility rather than a hope, and because the path no longer exists, the next read
23
+ // takes the ordinary "missing file" branch instead of warning forever.
24
+ quarantineCorrupt(filePath);
25
+ process.stderr.write(`[openwolf] ${path.basename(filePath)} was not valid JSON — moved aside, using defaults (${e.message})\n`);
20
26
  return fallback;
21
27
  }
22
28
  }
29
+ /** Rename a corrupt file to <name>.corrupt-<stamp>. Best-effort: never throws, never blocks a read. */
30
+ function quarantineCorrupt(filePath) {
31
+ try {
32
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
33
+ fs.renameSync(filePath, `${filePath}.corrupt-${stamp}`);
34
+ }
35
+ catch { /* unwritable directory, race with another process — defaults still apply */ }
36
+ }
23
37
  // Shared tmp+rename write. Never throws (hooks must not kill a session over a failed journal
24
38
  // write), but a total failure is REPORTED on stderr instead of vanishing — a silently dropped
25
39
  // write once hid that the semantic-recall index never persisted at all (bug-183).
@@ -84,9 +98,20 @@ export function readText(filePath, fallback = "") {
84
98
  export function writeText(filePath, content) {
85
99
  return writeAtomic(filePath, () => content);
86
100
  }
87
- // Best-effort advisory lock around a read-modify-write cycle (M1). Duplicated from
88
- // hooks/shared.ts (separate build roots). Never blocks for long — waits up to ~1s, steals a
89
- // stale lock (>5s), and runs unlocked if it can't acquire, so it can't wedge a process.
101
+ // Advisory lock around a read-modify-write cycle (M1). Duplicated from hooks/shared.ts (separate
102
+ // build roots) — keep the two in step. Waits with a fast backoff, steals a lock left behind by a
103
+ // dead process (>5s), and FAILS rather than proceeding unlocked; see the long note in
104
+ // hooks/shared.ts for why running the callback anyway made the lock meaningless for everyone.
105
+ export class LockTimeoutError extends Error {
106
+ targetPath;
107
+ waitedMs;
108
+ constructor(targetPath, waitedMs) {
109
+ super(`could not acquire the lock on ${path.basename(targetPath)} within ${waitedMs}ms — update skipped`);
110
+ this.targetPath = targetPath;
111
+ this.waitedMs = waitedMs;
112
+ this.name = "LockTimeoutError";
113
+ }
114
+ }
90
115
  function sleepSync(ms) {
91
116
  try {
92
117
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
@@ -95,10 +120,11 @@ function sleepSync(ms) {
95
120
  }
96
121
  export function withLock(targetPath, fn) {
97
122
  const lockPath = targetPath + ".lock";
98
- const MAX_WAIT_MS = 1000;
123
+ const MAX_WAIT_MS = 1500;
99
124
  const STALE_MS = 5000;
100
125
  const start = Date.now();
101
126
  let held = false;
127
+ let backoff = 2;
102
128
  while (Date.now() - start < MAX_WAIT_MS) {
103
129
  try {
104
130
  const fd = fs.openSync(lockPath, "wx");
@@ -120,19 +146,51 @@ export function withLock(targetPath, fn) {
120
146
  catch {
121
147
  continue;
122
148
  }
123
- sleepSync(25);
149
+ sleepSync(backoff);
150
+ backoff = Math.min(backoff * 2, 50);
124
151
  }
125
152
  }
153
+ if (!held)
154
+ throw new LockTimeoutError(targetPath, Date.now() - start);
126
155
  try {
127
156
  return fn();
128
157
  }
129
158
  finally {
130
- if (held) {
131
- try {
132
- fs.unlinkSync(lockPath);
133
- }
134
- catch { /* ignore */ }
159
+ try {
160
+ fs.unlinkSync(lockPath);
161
+ }
162
+ catch { /* ignore */ }
163
+ }
164
+ }
165
+ /**
166
+ * withLock for a caller that returns a value and has a sensible "did not run" answer.
167
+ * The skip is reported, never silent — a maintenance pass that quietly did nothing reads exactly
168
+ * like a maintenance pass that found nothing to do.
169
+ */
170
+ export function withLockOr(targetPath, onSkip, fn) {
171
+ try {
172
+ return withLock(targetPath, fn);
173
+ }
174
+ catch (e) {
175
+ if (e instanceof LockTimeoutError) {
176
+ process.stderr.write(`[openwolf] ${e.message}\n`);
177
+ return onSkip();
178
+ }
179
+ throw e;
180
+ }
181
+ }
182
+ /** withLock for callers that must not throw. Reports a lost update instead of hiding it. */
183
+ export function tryWithLock(targetPath, fn) {
184
+ try {
185
+ withLock(targetPath, fn);
186
+ return true;
187
+ }
188
+ catch (e) {
189
+ if (e instanceof LockTimeoutError) {
190
+ process.stderr.write(`[openwolf] ${e.message}\n`);
191
+ return false;
135
192
  }
193
+ throw e;
136
194
  }
137
195
  }
138
196
  // Copy a file via read+write instead of fs.copyFileSync. copyFileSync uses the
@@ -1 +1 @@
1
- {"version":3,"file":"fs-safe.js","sourceRoot":"","sources":["../../../src/utils/fs-safe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-safe.js","sourceRoot":"","sources":["../../../src/utils/fs-safe.ts"],"names":[],"mappings":"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"}
@@ -12,12 +12,27 @@ export class Logger {
12
12
  constructor(logFile, level = "info") {
13
13
  this.logFile = logFile;
14
14
  this.level = level;
15
- if (logFile) {
16
- const dir = path.dirname(logFile);
17
- if (!fs.existsSync(dir)) {
18
- fs.mkdirSync(dir, { recursive: true });
19
- }
20
- }
15
+ this.ensureDir();
16
+ }
17
+ ensureDir() {
18
+ if (!this.logFile)
19
+ return;
20
+ const dir = path.dirname(this.logFile);
21
+ if (!fs.existsSync(dir))
22
+ fs.mkdirSync(dir, { recursive: true });
23
+ }
24
+ /**
25
+ * Point the logger at another project's .wolf/daemon.log.
26
+ *
27
+ * The daemon can hot-switch projects without restarting, and the logger was the one binding that
28
+ * never moved: after a switch, project B's cron runs, task failures and LLM errors kept appending
29
+ * to project A's daemon.log, under A's log level. `openwolf daemon logs` in B then showed nothing
30
+ * at all, which reads like a daemon that stopped working.
31
+ */
32
+ retarget(logFile, level = this.level) {
33
+ this.logFile = logFile;
34
+ this.level = level;
35
+ this.ensureDir();
21
36
  }
22
37
  shouldLog(level) {
23
38
  return LEVEL_ORDER[level] >= LEVEL_ORDER[this.level];
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,OAAO,CAAgB;IACvB,KAAK,CAAW;IAExB,YAAY,OAAsB,EAAE,KAAK,GAAa,MAAM;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,KAAe;QAC/B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,KAAe,EAAE,OAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACvD"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,OAAO,CAAgB;IACvB,KAAK,CAAW;IAExB,YAAY,OAAsB,EAAE,KAAK,GAAa,MAAM;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAsB,EAAE,KAAK,GAAa,IAAI,CAAC,KAAK;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS,CAAC,KAAe;QAC/B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,KAAe,EAAE,OAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACvD"}
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { readJSON, writeJSON, readText, writeText, withLock } from "./fs-safe.js";
3
+ import { readJSON, writeJSON, readText, writeText, withLockOr } from "./fs-safe.js";
4
4
  import { nativeMemoryDir } from "../hooks/shared.js";
5
5
  import { blocksFor } from "./recall.js";
6
6
  export const DEFAULT_RETENTION = {
@@ -11,6 +11,7 @@ export const DEFAULT_RETENTION = {
11
11
  memory_consolidate_after_days: 7,
12
12
  memory_max_bytes: 262144, // 256 KB
13
13
  daemon_log_max_bytes: 524288, // 512 KB
14
+ proposals_keep: 20,
14
15
  };
15
16
  export function getRetention(wolfDir) {
16
17
  const cfg = readJSON(path.join(wolfDir, "config.json"), {});
@@ -48,12 +49,17 @@ export function makeIgnoreMatcher(patterns) {
48
49
  if (pat.startsWith("*.") && norm.endsWith(pat.slice(1)))
49
50
  return true;
50
51
  }
51
- if (pat.includes("*")) {
52
+ // `?` is a gitignore wildcard for exactly one character, and it also has to be handled BEFORE
53
+ // this becomes a regex — it used to be neither escaped nor translated, so it survived into the
54
+ // pattern as a regex quantifier and made the preceding character OPTIONAL. `build?/*.js` then
55
+ // matched `buil/x.js` and missed `build2/x.js`: the rule silently covered the wrong files.
56
+ if (pat.includes("*") || pat.includes("?")) {
52
57
  const re = new RegExp("^" +
53
58
  pat
54
59
  .replace(/[.+^${}()|[\]\\]/g, "\\$&")
55
60
  .replace(/\*\*/g, "\u0000")
56
61
  .replace(/\*/g, "[^/]*")
62
+ .replace(/\?/g, "[^/]")
57
63
  .replace(/\u0000/g, ".*") +
58
64
  "$");
59
65
  if (re.test(norm) || (!anchored && re.test(base)))
@@ -93,6 +99,54 @@ export function loadIgnore(projectRoot) {
93
99
  }
94
100
  return makeIgnoreMatcher(lines);
95
101
  }
102
+ /**
103
+ * The one list of directories and files the anatomy index never covers.
104
+ *
105
+ * There were four of these: the config template, `init`'s inline fallback, and two copies inside
106
+ * the scanner — and they disagreed. A project initialised from one path got a different index from
107
+ * a project that fell back to another, which is a difference nobody can see and nobody expects.
108
+ *
109
+ * Missing entries had a real cost. `.venv` and `site-packages` were absent, so on a mixed
110
+ * Python/JS project the index filled up with dependency source: the indexed file budget is spent,
111
+ * the descriptions are of somebody else's code, and every anatomy lookup for the project's OWN
112
+ * files misses. Agent-config directories (.claude, .codex, …) were indexed too, which points the
113
+ * model at its own harness configuration — noise that ranked HIGH because those files are small
114
+ * and densely worded.
115
+ */
116
+ export const DEFAULT_ANATOMY_EXCLUDES = [
117
+ // VCS and tooling
118
+ ".git", ".svn", ".hg", ".wolf",
119
+ // JS/TS
120
+ "node_modules", "dist", "build", ".next", ".nuxt", ".turbo", ".vercel", ".netlify", ".output",
121
+ "coverage", ".parcel-cache", ".svelte-kit",
122
+ // Python — see also isPythonVenv() for virtualenvs under a non-standard name
123
+ "__pycache__", ".venv", "venv", "site-packages", ".tox", ".mypy_cache", ".pytest_cache", ".ruff_cache",
124
+ // JVM / Rust / Go
125
+ "target", ".gradle", "gradle", ".m2",
126
+ // Editors and OS
127
+ ".vscode", ".idea", ".cache", ".DS_Store", "Thumbs.db",
128
+ // Agent config: steering the model toward its own harness config is noise, and these files
129
+ // topped the importance ranking in real projects because they are short and keyword-dense.
130
+ ".claude", ".codex", ".opencode", ".gemini", ".cursor", ".aider",
131
+ // Generated artefacts
132
+ "*.min.js", "*.min.css", "*.map", "*.lock",
133
+ ];
134
+ /**
135
+ * A Python virtualenv, whatever it is called.
136
+ *
137
+ * Excluding the NAMES `.venv` and `venv` catches the convention and misses the reality: envs get
138
+ * called `env`, `.env310`, `pyenv`, or the project's own name. `pyvenv.cfg` at the root of the
139
+ * directory is what actually defines one, and it is present in every venv created by the stdlib
140
+ * module since 3.3.
141
+ */
142
+ export function isPythonVenv(dirPath) {
143
+ try {
144
+ return fs.existsSync(path.join(dirPath, "pyvenv.cfg"));
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
96
150
  const SUGGEST_DEFAULT_EXCLUDES = new Set([
97
151
  "node_modules", ".git", "dist", "build", ".wolf", ".next", ".nuxt", "coverage",
98
152
  "__pycache__", ".cache", "target", ".vscode", ".idea", ".turbo", ".vercel",
@@ -479,13 +533,16 @@ function safeReaddir(dir) {
479
533
  }
480
534
  }
481
535
  const noop = (name) => ({ changed: false, before: 0, after: 0, detail: `${name}: nothing to do` });
536
+ // Distinct from noop on purpose: "in use by another process, try again" is a different answer
537
+ // from "there was nothing to do", and conflating them hides a contended maintenance run.
538
+ const skipped = (name) => ({ changed: false, before: 0, after: 0, detail: `${name}: skipped, file is locked by another process` });
482
539
  export function compactLedger(wolfDir, ret) {
483
540
  const p = path.join(wolfDir, "token-ledger.json");
484
541
  if (!fs.existsSync(p))
485
542
  return noop("token-ledger");
486
543
  // Hold the same file lock as the daemon/stop-hook ledger writers (withLock on the ledger path)
487
544
  // so a doctor-compaction and a live write can't clobber each other → no lost updates.
488
- return withLock(p, () => {
545
+ return withLockOr(p, () => skipped("token-ledger"), () => {
489
546
  const before = fileSize(p);
490
547
  const ledger = readJSON(p, {});
491
548
  if (!Array.isArray(ledger.sessions))
@@ -516,7 +573,7 @@ export function compactLedger(wolfDir, ret) {
516
573
  // Mirrors the daemon's consolidateMemory so it also runs without the daemon.
517
574
  export function consolidateMemory(wolfDir, olderThanDays) {
518
575
  const p = path.join(wolfDir, "memory.md");
519
- return withLock(p, () => {
576
+ return withLockOr(p, () => skipped("memory"), () => {
520
577
  const content = readText(p);
521
578
  if (!content)
522
579
  return noop("memory");
@@ -571,7 +628,7 @@ export function dedupeAndCapBuglog(wolfDir, max) {
571
628
  const p = path.join(wolfDir, "buglog.json");
572
629
  if (!fs.existsSync(p))
573
630
  return noop("buglog");
574
- return withLock(p, () => {
631
+ return withLockOr(p, () => skipped("buglog"), () => {
575
632
  const before = fileSize(p);
576
633
  // Tolerate legacy bare-array buglogs ([...]) as well as {version, bugs:[]}.
577
634
  const raw = readJSON(p, { version: 1, bugs: [] });
@@ -709,6 +766,43 @@ export function rotateDaemonLog(wolfDir, maxBytes) {
709
766
  const after = fileSize(p);
710
767
  return { changed: true, before, after, detail: `daemon.log: rotated ${humanBytes(before)} → ${humanBytes(after)}` };
711
768
  }
769
+ /**
770
+ * Keep .wolf/proposals/ bounded.
771
+ *
772
+ * Every AI cron task writes one proposal per run and nothing ever removed them: two enabled tasks
773
+ * on a weekly schedule leave ~100 files a year, each holding a model's full answer over cerebrum.md
774
+ * and memory.md. Backups and the daemon log had a retention rule; this directory was simply missed.
775
+ * Newest are kept — a proposal is a review item, and an unreviewed one from last spring is not.
776
+ */
777
+ export function pruneProposals(wolfDir, keep) {
778
+ const dir = path.join(wolfDir, "proposals");
779
+ if (!fs.existsSync(dir))
780
+ return noop("proposals");
781
+ const before = dirSize(dir);
782
+ const files = safeReaddir(dir)
783
+ .map((n) => ({ name: n, full: path.join(dir, n) }))
784
+ .filter((e) => {
785
+ try {
786
+ return fs.statSync(e.full).isFile();
787
+ }
788
+ catch {
789
+ return false;
790
+ }
791
+ })
792
+ .sort((a, b) => a.name.localeCompare(b.name)); // "<task>-<ISO stamp>.md" sorts chronologically
793
+ if (files.length <= keep) {
794
+ return { changed: false, before, after: before, detail: `proposals: ${files.length} kept, within limit (${keep})` };
795
+ }
796
+ const toRemove = files.slice(0, files.length - keep);
797
+ for (const f of toRemove) {
798
+ try {
799
+ fs.rmSync(f.full, { force: true });
800
+ }
801
+ catch { }
802
+ }
803
+ const after = dirSize(dir);
804
+ return { changed: true, before, after, detail: `proposals: removed ${toRemove.length}, kept ${keep} (${humanBytes(before)} → ${humanBytes(after)})` };
805
+ }
712
806
  // Content words for similarity: lowercase alphanumerics (incl. German umlauts) of length ≥ 4,
713
807
  // which drops most stopwords/articles ("the", "und", "der") without a stopword list.
714
808
  function contentWords(text) {
@@ -860,7 +954,7 @@ export function repairNativeMemoryIndex(dir, opts = {}) {
860
954
  const next = base.includes(heading)
861
955
  ? `${base}\n${added.map((a) => a.line).join("\n")}\n`
862
956
  : `${base}\n\n${heading}\n${added.map((a) => a.line).join("\n")}\n`;
863
- const wrote = withLock(indexPath, () => writeText(indexPath, next));
957
+ const wrote = withLockOr(indexPath, () => false, () => writeText(indexPath, next));
864
958
  return { added, skippedStale, skippedBudget, deadLinks, wrote };
865
959
  }
866
960
  //# sourceMappingURL=maintenance.js.map