crewly 1.8.9 → 1.8.12

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 (245) hide show
  1. package/config/constants.d.ts.map +1 -0
  2. package/config/index.d.ts.map +1 -0
  3. package/config/roles/_common/memory-instructions.md +6 -5
  4. package/config/roles/_common/wiki-instructions.md +49 -0
  5. package/config/roles/architect/prompt.md +2 -2
  6. package/config/roles/backend-developer/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +2 -2
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +2 -2
  10. package/config/roles/fullstack-dev/prompt.md +2 -2
  11. package/config/roles/generalist/prompt.md +2 -2
  12. package/config/roles/ops/prompt.md +2 -2
  13. package/config/roles/orchestrator/prompt.md +135 -11
  14. package/config/roles/product-manager/prompt.md +2 -2
  15. package/config/roles/qa/prompt.md +2 -2
  16. package/config/roles/qa-engineer/prompt.md +2 -2
  17. package/config/roles/researcher/prompt.md +15 -6
  18. package/config/roles/sales/prompt.md +2 -2
  19. package/config/roles/support/prompt.md +2 -2
  20. package/config/roles/team-leader/prompt.md +17 -2
  21. package/config/roles/tpm/prompt.md +2 -2
  22. package/config/roles/ux-designer/prompt.md +2 -2
  23. package/config/skills/orchestrator/wiki-cleanup/SKILL.md +89 -0
  24. package/config/skills/orchestrator/wiki-cleanup/execute.sh +139 -0
  25. package/config/skills/orchestrator/wiki-lint/SKILL.md +75 -0
  26. package/config/skills/orchestrator/wiki-lint/execute.sh +66 -0
  27. package/config/skills/orchestrator/wiki-migrate/SKILL.md +103 -0
  28. package/config/skills/orchestrator/wiki-migrate/execute.sh +82 -0
  29. package/config/skills/orchestrator/wiki-process-queue/SKILL.md +9 -1
  30. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +169 -0
  31. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
  32. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1779 -0
  33. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +18 -0
  35. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +63 -0
  37. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +5 -1
  40. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +109 -0
  42. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +419 -4
  44. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +11 -1
  47. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
  48. package/dist/backend/backend/src/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/index.js +78 -3
  50. package/dist/backend/backend/src/index.js.map +1 -1
  51. package/dist/backend/backend/src/index.js.orc-bak-20260529 +3130 -0
  52. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +513 -0
  53. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +1568 -0
  55. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +86 -0
  57. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +147 -0
  59. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +1 -0
  60. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
  61. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
  63. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
  64. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
  65. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
  67. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
  68. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
  69. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
  71. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
  72. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
  73. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +279 -0
  75. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
  76. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +340 -0
  77. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +1176 -0
  79. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +79 -0
  81. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +145 -0
  83. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +1 -0
  84. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
  85. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
  87. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
  88. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +16 -0
  89. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +16 -0
  91. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
  92. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
  93. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
  95. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
  96. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +141 -0
  97. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +310 -0
  99. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
  100. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
  101. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
  103. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
  104. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
  105. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
  107. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
  109. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
  111. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
  112. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
  113. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
  115. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
  116. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +135 -0
  117. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +1937 -0
  119. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
  120. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +1 -1
  121. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
  122. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
  123. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
  124. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
  125. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +171 -0
  126. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  127. package/dist/backend/backend/src/services/project/task-tracking.service.js +725 -0
  128. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
  129. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +50 -0
  131. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  132. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  133. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +45 -0
  135. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +34 -1
  138. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +118 -0
  140. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +1 -0
  141. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +326 -0
  142. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +1 -0
  143. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts +72 -0
  144. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -0
  145. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +186 -0
  146. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -0
  147. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +27 -4
  148. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +133 -10
  150. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  151. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -1
  152. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +15 -4
  154. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
  156. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
  157. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
  158. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
  159. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +160 -0
  160. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +399 -0
  162. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -0
  163. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +182 -0
  164. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +505 -0
  166. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -0
  167. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +232 -0
  168. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +1416 -0
  170. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -0
  171. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
  172. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +102 -0
  174. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
  175. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +104 -0
  176. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +229 -0
  178. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -0
  179. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +90 -0
  180. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +190 -0
  182. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -0
  183. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +164 -0
  184. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +675 -0
  186. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -0
  187. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  188. package/dist/backend/backend/src/services/workflow/cron-task.service.js +65 -0
  189. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  190. package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
  191. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
  192. package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
  193. package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
  194. package/dist/backend/backend/src/types/cron-task.types.d.ts +16 -1
  195. package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
  196. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +111 -0
  197. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +1 -0
  198. package/dist/backend/backend/src/utils/esm-require.utils.js +124 -0
  199. package/dist/backend/backend/src/utils/esm-require.utils.js.map +1 -0
  200. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +220 -0
  201. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
  202. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +37 -0
  203. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
  204. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +56 -0
  205. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +1 -0
  206. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +91 -0
  207. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +1 -0
  208. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  209. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  210. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +304 -0
  211. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  212. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +115 -0
  213. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +215 -0
  215. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +1 -0
  216. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +78 -0
  217. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +1 -0
  218. package/dist/cli/backend/src/services/memory/embedding-provider.js +179 -0
  219. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +1 -0
  220. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +331 -0
  221. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/memory/vector-store.service.js +814 -0
  223. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +1 -0
  224. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +171 -0
  225. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  226. package/dist/cli/backend/src/services/project/task-tracking.service.js +725 -0
  227. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +1 -0
  228. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  229. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +45 -0
  231. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  232. package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
  233. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
  234. package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
  235. package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
  236. package/dist/cli/cli/src/index.js +0 -0
  237. package/frontend/dist/assets/{index-db3f5041.css → index-068bb4f6.css} +10 -1
  238. package/frontend/dist/assets/index-c24ceb15.js +4960 -0
  239. package/frontend/dist/index.html +2 -2
  240. package/package.json +1 -1
  241. package/config/skills/agent/core/query-knowledge/SKILL.md +0 -87
  242. package/config/skills/agent/core/query-knowledge/execute.sh +0 -30
  243. package/config/skills/orchestrator/query-knowledge/SKILL.md +0 -75
  244. package/config/skills/orchestrator/query-knowledge/execute.sh +0 -30
  245. package/frontend/dist/assets/index-cc115bb4.js +0 -4926
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Wiki Backlinks Service
3
+ *
4
+ * Given a target page in a vault, scan every other page for `[[wikilink]]`
5
+ * references that resolve to it. Powers the UI's right-side "References"
6
+ * panel.
7
+ *
8
+ * Phase 1: plain scan, no incremental index. Vaults are small enough that
9
+ * a single regex pass per file is fine.
10
+ *
11
+ * @module services/wiki/wiki-backlinks.service
12
+ */
13
+ /** Hard cap on scanned files to avoid pathological vaults. */
14
+ export declare const WIKI_BACKLINKS_MAX_FILES = 500;
15
+ /** Cap on per-file size to read; larger files are skipped. */
16
+ export declare const WIKI_BACKLINKS_MAX_FILE_BYTES: number;
17
+ /** Max snippets surfaced per source page. */
18
+ export declare const WIKI_BACKLINKS_MAX_SNIPPETS_PER_FILE = 2;
19
+ /** Total backlink rows returned. */
20
+ export declare const WIKI_BACKLINKS_MAX_RESULTS = 50;
21
+ export interface WikiBacklinkSnippet {
22
+ lineNumber: number;
23
+ text: string;
24
+ }
25
+ export interface WikiBacklink {
26
+ /** Source page that links to the target. */
27
+ relativePath: string;
28
+ /** Up to N snippets where the link appears. */
29
+ snippets: WikiBacklinkSnippet[];
30
+ }
31
+ export interface WikiBacklinksInput {
32
+ vaultPath: string;
33
+ /** The page being backlinked TO. */
34
+ relativePath: string;
35
+ }
36
+ export interface WikiBacklinksResult {
37
+ ok: true;
38
+ vaultPath: string;
39
+ relativePath: string;
40
+ backlinks: WikiBacklink[];
41
+ truncated: boolean;
42
+ }
43
+ export interface WikiBacklinksFailure {
44
+ ok: false;
45
+ reason: 'vault_missing' | 'invalid_input';
46
+ message: string;
47
+ }
48
+ /**
49
+ * Resolve a wikilink target string against a known target page.
50
+ *
51
+ * The matcher mirrors the frontend's `resolveWikilink` semantics so a
52
+ * `[[customers/anthropic]]` reference matches the page at
53
+ * `llm-curated/customers/anthropic.md`.
54
+ *
55
+ * @param wikilinkTarget - Raw target from `[[…]]` (no alias, trimmed).
56
+ * @param normalizedTargetPath - The target page path, normalized (lowercase,
57
+ * forward slashes, with `.md` suffix).
58
+ * @returns true when the wikilink would resolve to the target page.
59
+ */
60
+ export declare function wikilinkMatchesTarget(wikilinkTarget: string, normalizedTargetPath: string): boolean;
61
+ /**
62
+ * Backlinks service. Singleton pattern to match the other wiki services.
63
+ */
64
+ export declare class WikiBacklinksService {
65
+ private static instance;
66
+ static getInstance(): WikiBacklinksService;
67
+ static resetInstance(): void;
68
+ find(input: WikiBacklinksInput): Promise<WikiBacklinksResult | WikiBacklinksFailure>;
69
+ private collectMdFiles;
70
+ private scanFile;
71
+ }
72
+ //# sourceMappingURL=wiki-backlinks.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-backlinks.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-backlinks.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,8DAA8D;AAC9D,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,8DAA8D;AAC9D,eAAO,MAAM,6BAA6B,QAAa,CAAC;AACxD,6CAA6C;AAC7C,eAAO,MAAM,oCAAoC,IAAI,CAAC;AACtD,oCAAoC;AACpC,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAK7C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,eAAe,GAAG,eAAe,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM,GAC3B,OAAO,CAmBT;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAE5D,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAK1C,MAAM,CAAC,aAAa,IAAI,IAAI;IAItB,IAAI,CACR,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,GAAG,oBAAoB,CAAC;YA8CxC,cAAc;YAqBd,QAAQ;CA2CvB"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Wiki Backlinks Service
3
+ *
4
+ * Given a target page in a vault, scan every other page for `[[wikilink]]`
5
+ * references that resolve to it. Powers the UI's right-side "References"
6
+ * panel.
7
+ *
8
+ * Phase 1: plain scan, no incremental index. Vaults are small enough that
9
+ * a single regex pass per file is fine.
10
+ *
11
+ * @module services/wiki/wiki-backlinks.service
12
+ */
13
+ import * as fs from 'fs/promises';
14
+ import * as path from 'path';
15
+ import { existsSync } from 'fs';
16
+ /** Hard cap on scanned files to avoid pathological vaults. */
17
+ export const WIKI_BACKLINKS_MAX_FILES = 500;
18
+ /** Cap on per-file size to read; larger files are skipped. */
19
+ export const WIKI_BACKLINKS_MAX_FILE_BYTES = 256 * 1024;
20
+ /** Max snippets surfaced per source page. */
21
+ export const WIKI_BACKLINKS_MAX_SNIPPETS_PER_FILE = 2;
22
+ /** Total backlink rows returned. */
23
+ export const WIKI_BACKLINKS_MAX_RESULTS = 50;
24
+ /** `[[target]]` or `[[target|alias]]`. */
25
+ const WIKILINK_RE = /\[\[([^\]|]+?)(?:\|[^\]]+?)?\]\]/g;
26
+ /**
27
+ * Resolve a wikilink target string against a known target page.
28
+ *
29
+ * The matcher mirrors the frontend's `resolveWikilink` semantics so a
30
+ * `[[customers/anthropic]]` reference matches the page at
31
+ * `llm-curated/customers/anthropic.md`.
32
+ *
33
+ * @param wikilinkTarget - Raw target from `[[…]]` (no alias, trimmed).
34
+ * @param normalizedTargetPath - The target page path, normalized (lowercase,
35
+ * forward slashes, with `.md` suffix).
36
+ * @returns true when the wikilink would resolve to the target page.
37
+ */
38
+ export function wikilinkMatchesTarget(wikilinkTarget, normalizedTargetPath) {
39
+ const raw = wikilinkTarget.trim().toLowerCase();
40
+ if (!raw)
41
+ return false;
42
+ const withMd = raw.endsWith('.md') ? raw : `${raw}.md`;
43
+ if (withMd === normalizedTargetPath)
44
+ return true;
45
+ if (normalizedTargetPath.endsWith(`/${withMd}`))
46
+ return true;
47
+ // Basename match — only if the wikilink target has no slashes (it's just
48
+ // a name) so we don't over-match on partial paths.
49
+ if (!raw.includes('/')) {
50
+ const baseNoMd = raw.endsWith('.md') ? raw.slice(0, -3) : raw;
51
+ const targetBase = normalizedTargetPath.split('/').pop() ?? '';
52
+ const targetBaseNoMd = targetBase.endsWith('.md')
53
+ ? targetBase.slice(0, -3)
54
+ : targetBase;
55
+ if (baseNoMd === targetBaseNoMd)
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ /**
61
+ * Backlinks service. Singleton pattern to match the other wiki services.
62
+ */
63
+ export class WikiBacklinksService {
64
+ static instance = null;
65
+ static getInstance() {
66
+ if (!this.instance)
67
+ this.instance = new WikiBacklinksService();
68
+ return this.instance;
69
+ }
70
+ static resetInstance() {
71
+ this.instance = null;
72
+ }
73
+ async find(input) {
74
+ const { vaultPath, relativePath } = input;
75
+ if (!vaultPath || !path.isAbsolute(vaultPath)) {
76
+ return {
77
+ ok: false,
78
+ reason: 'invalid_input',
79
+ message: 'vaultPath must be an absolute path',
80
+ };
81
+ }
82
+ if (!existsSync(vaultPath)) {
83
+ return { ok: false, reason: 'vault_missing', message: `vault not found: ${vaultPath}` };
84
+ }
85
+ if (!relativePath || !relativePath.endsWith('.md')) {
86
+ return {
87
+ ok: false,
88
+ reason: 'invalid_input',
89
+ message: 'relativePath is required and must end in .md',
90
+ };
91
+ }
92
+ const normalizedTarget = relativePath.replace(/\\/g, '/').toLowerCase();
93
+ const allFiles = [];
94
+ await this.collectMdFiles(vaultPath, vaultPath, allFiles);
95
+ const truncatedFiles = allFiles.length >= WIKI_BACKLINKS_MAX_FILES;
96
+ const slice = allFiles.slice(0, WIKI_BACKLINKS_MAX_FILES);
97
+ const backlinks = [];
98
+ for (const source of slice) {
99
+ if (backlinks.length >= WIKI_BACKLINKS_MAX_RESULTS)
100
+ break;
101
+ // A page does not backlink to itself.
102
+ if (source.toLowerCase() === normalizedTarget)
103
+ continue;
104
+ const found = await this.scanFile(vaultPath, source, normalizedTarget);
105
+ if (found)
106
+ backlinks.push(found);
107
+ }
108
+ return {
109
+ ok: true,
110
+ vaultPath,
111
+ relativePath,
112
+ backlinks,
113
+ truncated: truncatedFiles || backlinks.length >= WIKI_BACKLINKS_MAX_RESULTS,
114
+ };
115
+ }
116
+ async collectMdFiles(rootDir, dir, acc) {
117
+ if (acc.length >= WIKI_BACKLINKS_MAX_FILES)
118
+ return;
119
+ let entries;
120
+ try {
121
+ entries = await fs.readdir(dir, { withFileTypes: true });
122
+ }
123
+ catch {
124
+ return;
125
+ }
126
+ for (const entry of entries) {
127
+ if (acc.length >= WIKI_BACKLINKS_MAX_FILES)
128
+ return;
129
+ if (entry.name.startsWith('.'))
130
+ continue;
131
+ const abs = path.join(dir, entry.name);
132
+ if (entry.isDirectory()) {
133
+ await this.collectMdFiles(rootDir, abs, acc);
134
+ }
135
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
136
+ const rel = path.relative(rootDir, abs).replace(/\\/g, '/');
137
+ acc.push(rel);
138
+ }
139
+ }
140
+ }
141
+ async scanFile(vaultPath, relativePath, normalizedTarget) {
142
+ const abs = path.join(vaultPath, relativePath);
143
+ let stat;
144
+ try {
145
+ stat = await fs.stat(abs);
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ if (stat.size > WIKI_BACKLINKS_MAX_FILE_BYTES)
151
+ return null;
152
+ let content;
153
+ try {
154
+ content = await fs.readFile(abs, 'utf8');
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ if (!content.includes('[['))
160
+ return null;
161
+ const lines = content.split(/\r?\n/);
162
+ const snippets = [];
163
+ for (let i = 0; i < lines.length; i++) {
164
+ const line = lines[i];
165
+ if (!line.includes('[['))
166
+ continue;
167
+ WIKILINK_RE.lastIndex = 0;
168
+ let m;
169
+ while ((m = WIKILINK_RE.exec(line)) !== null) {
170
+ if (wikilinkMatchesTarget(m[1], normalizedTarget)) {
171
+ if (snippets.length < WIKI_BACKLINKS_MAX_SNIPPETS_PER_FILE) {
172
+ snippets.push({
173
+ lineNumber: i + 1,
174
+ text: line.trim().slice(0, 300),
175
+ });
176
+ }
177
+ break; // one snippet per line
178
+ }
179
+ }
180
+ if (snippets.length >= WIKI_BACKLINKS_MAX_SNIPPETS_PER_FILE)
181
+ break;
182
+ }
183
+ return snippets.length > 0 ? { relativePath, snippets } : null;
184
+ }
185
+ }
186
+ //# sourceMappingURL=wiki-backlinks.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-backlinks.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-backlinks.service.ts"],"names":[],"mappings":"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"}
@@ -35,11 +35,20 @@ export interface WikiBookkeepTriggerOptions {
35
35
  discoverRoots?: () => Promise<string[]>;
36
36
  /** Optional override of the bookkeep service (tests). */
37
37
  bookkeepService?: WikiBookkeepService;
38
+ /**
39
+ * Where to persist per-vault baseline + debounce state. Defaults to
40
+ * `~/.crewly/wiki-bookkeep-trigger-state.json`. Pass `null` to disable
41
+ * persistence (tests) so the trigger keeps state in-memory only.
42
+ */
43
+ statePath?: string | null;
38
44
  }
39
45
  /**
40
46
  * Discover absolute vault paths by walking the well-known Crewly roots:
41
47
  * - `<env CREWLY_PROJECT_VAULT_PATH>` (single explicit override)
42
- * - `<process.cwd>/.crewly/wiki` (current project vault)
48
+ * - `<process.cwd>/.crewly/wiki` (current project vault — the OSS's own dir)
49
+ * - `~/.crewly/projects.json` → every registered project's `.crewly/wiki`
50
+ * (Closie, Flopost, CE, etc. — each team manages a project, and that
51
+ * project gets its own vault per v2.1 spec §1)
43
52
  * - `~/.crewly/teams/<uuid>/wiki` (every team vault)
44
53
  * - `~/.crewly/global-wiki` (ORC cross-project vault, if present)
45
54
  *
@@ -58,11 +67,21 @@ export declare class WikiBookkeepTriggerService {
58
67
  private readonly discoverRoots;
59
68
  private readonly bookkeepService;
60
69
  private timer;
61
- /** vaultPath → last fired timestamp (ms). */
62
- private readonly lastFiredAt;
70
+ /** vaultPath → persisted baseline + last-fired state. */
71
+ private readonly state;
63
72
  /** Per-vault locks so two overlapping ticks don't double-fire. */
64
73
  private inflight;
74
+ private readonly statePath;
75
+ private stateLoaded;
65
76
  constructor(opts: WikiBookkeepTriggerOptions);
77
+ /**
78
+ * Load per-vault baseline + debounce state from disk (once). Without this,
79
+ * the in-memory ledger resets on every backend restart, so the next tick
80
+ * re-fires for every eligible vault — the "noise burst after a restart".
81
+ */
82
+ private loadStateFromDisk;
83
+ /** Persist the per-vault state map (best-effort; failures are logged, not thrown). */
84
+ private saveStateToDisk;
66
85
  static getInstance(): WikiBookkeepTriggerService | null;
67
86
  /** Wire the production singleton. Pass null to detach (tests / shutdown). */
68
87
  static setInstance(next: WikiBookkeepTriggerService | null): void;
@@ -80,7 +99,11 @@ export declare class WikiBookkeepTriggerService {
80
99
  skippedByDebounce: string[];
81
100
  quietVaults: string[];
82
101
  }>;
83
- /** Test affordance: clear the debounce ledger. */
102
+ /**
103
+ * Test affordance: clear the in-memory baseline + debounce ledger. Leaves
104
+ * `stateLoaded` set so a subsequent `tick()` does NOT reload persisted state
105
+ * (which would undo the clear).
106
+ */
84
107
  _resetDebounceForTesting(): void;
85
108
  }
86
109
  //# sourceMappingURL=wiki-bookkeep-trigger.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-bookkeep-trigger.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,KACvB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,EAAE,kBAAkB,CAAC;IAC3B,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,yDAAyD;IACzD,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAKD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA4B5D;AAED;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,KAAK,CAA+B;IAC5C,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,IAAI,EAAE,0BAA0B;IAS5C,MAAM,CAAC,WAAW,IAAI,0BAA0B,GAAG,IAAI;IAIvD,6EAA6E;IAC7E,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAKjE,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAWb,kDAAkD;IAClD,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IAoDF,kDAAkD;IAClD,wBAAwB,IAAI,IAAI;CAGjC"}
1
+ {"version":3,"file":"wiki-bookkeep-trigger.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAcrF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,KACvB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,EAAE,kBAAkB,CAAC;IAC3B,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,yDAAyD;IACzD,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAKD;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAgD5D;AAED;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,KAAK,CAA+B;IAC5C,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyC;IAC/D,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE,0BAA0B;IAgB5C;;;;OAIG;YACW,iBAAiB;IA+B/B,sFAAsF;YACxE,eAAe;IAe7B,MAAM,CAAC,WAAW,IAAI,0BAA0B,GAAG,IAAI;IAIvD,6EAA6E;IAC7E,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAKjE,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAWb,kDAAkD;IAClD,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IAkFF;;;;OAIG;IACH,wBAAwB,IAAI,IAAI;CAGjC"}
@@ -28,12 +28,18 @@ import * as fs from 'fs/promises';
28
28
  import { existsSync } from 'fs';
29
29
  import { LoggerService } from '../core/logger.service.js';
30
30
  import { WikiBookkeepService } from './wiki-bookkeep.service.js';
31
+ import { atomicWriteJson, safeReadJson, ensureDir } from '../../utils/file-io.utils.js';
32
+ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
33
+ const STATE_FILE_NAME = 'wiki-bookkeep-trigger-state.json';
31
34
  const DEFAULT_INTERVAL_MS = 30 * 60 * 1000;
32
35
  const DEFAULT_DEBOUNCE_MS = 6 * 3600 * 1000;
33
36
  /**
34
37
  * Discover absolute vault paths by walking the well-known Crewly roots:
35
38
  * - `<env CREWLY_PROJECT_VAULT_PATH>` (single explicit override)
36
- * - `<process.cwd>/.crewly/wiki` (current project vault)
39
+ * - `<process.cwd>/.crewly/wiki` (current project vault — the OSS's own dir)
40
+ * - `~/.crewly/projects.json` → every registered project's `.crewly/wiki`
41
+ * (Closie, Flopost, CE, etc. — each team manages a project, and that
42
+ * project gets its own vault per v2.1 spec §1)
37
43
  * - `~/.crewly/teams/<uuid>/wiki` (every team vault)
38
44
  * - `~/.crewly/global-wiki` (ORC cross-project vault, if present)
39
45
  *
@@ -47,6 +53,26 @@ export async function discoverWikiVaults() {
47
53
  candidates.push(fromEnv);
48
54
  candidates.push(path.join(process.cwd(), '.crewly/wiki'));
49
55
  candidates.push(path.join(os.homedir(), '.crewly/global-wiki'));
56
+ // (NEW 2026-05-27) Every registered project's wiki. Without this, only
57
+ // the OSS's own cwd project (Crewly itself) surfaces — Closie/Flopost/CE
58
+ // managed by their teams stay invisible despite being real projects.
59
+ const projectsJsonPath = path.join(os.homedir(), '.crewly/projects.json');
60
+ if (existsSync(projectsJsonPath)) {
61
+ try {
62
+ const raw = await fs.readFile(projectsJsonPath, 'utf8');
63
+ const parsed = JSON.parse(raw);
64
+ if (Array.isArray(parsed)) {
65
+ for (const entry of parsed) {
66
+ if (entry && typeof entry.path === 'string' && path.isAbsolute(entry.path)) {
67
+ candidates.push(path.join(entry.path, '.crewly/wiki'));
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ // malformed projects.json — skip; partial discovery is fine
74
+ }
75
+ }
50
76
  const teamsRoot = path.join(os.homedir(), '.crewly/teams');
51
77
  if (existsSync(teamsRoot)) {
52
78
  try {
@@ -80,10 +106,12 @@ export class WikiBookkeepTriggerService {
80
106
  discoverRoots;
81
107
  bookkeepService;
82
108
  timer = null;
83
- /** vaultPath → last fired timestamp (ms). */
84
- lastFiredAt = new Map();
109
+ /** vaultPath → persisted baseline + last-fired state. */
110
+ state = new Map();
85
111
  /** Per-vault locks so two overlapping ticks don't double-fire. */
86
112
  inflight = new Set();
113
+ statePath;
114
+ stateLoaded = false;
87
115
  constructor(opts) {
88
116
  this.logger = LoggerService.getInstance().createComponentLogger('WikiBookkeepTrigger');
89
117
  this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
@@ -91,6 +119,69 @@ export class WikiBookkeepTriggerService {
91
119
  this.fireFn = opts.fireFn;
92
120
  this.discoverRoots = opts.discoverRoots ?? discoverWikiVaults;
93
121
  this.bookkeepService = opts.bookkeepService ?? WikiBookkeepService.getInstance();
122
+ if (opts.statePath === null) {
123
+ this.statePath = null;
124
+ }
125
+ else if (typeof opts.statePath === 'string') {
126
+ this.statePath = opts.statePath;
127
+ }
128
+ else {
129
+ this.statePath = path.join(getCrewlyHomePath(), STATE_FILE_NAME);
130
+ }
131
+ }
132
+ /**
133
+ * Load per-vault baseline + debounce state from disk (once). Without this,
134
+ * the in-memory ledger resets on every backend restart, so the next tick
135
+ * re-fires for every eligible vault — the "noise burst after a restart".
136
+ */
137
+ async loadStateFromDisk() {
138
+ if (this.stateLoaded)
139
+ return;
140
+ this.stateLoaded = true;
141
+ if (!this.statePath)
142
+ return;
143
+ try {
144
+ const data = await safeReadJson(this.statePath, null);
145
+ if (data && typeof data === 'object') {
146
+ for (const [vault, entry] of Object.entries(data)) {
147
+ if (entry &&
148
+ typeof entry.baselineMdCount === 'number' &&
149
+ typeof entry.lastFiredAt === 'number') {
150
+ this.state.set(vault, entry);
151
+ }
152
+ }
153
+ this.logger.info('WikiBookkeepTrigger loaded persisted state', {
154
+ statePath: this.statePath,
155
+ vaults: this.state.size,
156
+ });
157
+ }
158
+ }
159
+ catch (err) {
160
+ // A transient read error (e.g. EACCES) must not abort the tick — start
161
+ // with an empty ledger this run; a later tick re-establishes baselines.
162
+ this.logger.warn('WikiBookkeepTrigger: failed to load state (non-fatal)', {
163
+ statePath: this.statePath,
164
+ error: err.message,
165
+ });
166
+ }
167
+ }
168
+ /** Persist the per-vault state map (best-effort; failures are logged, not thrown). */
169
+ async saveStateToDisk() {
170
+ if (!this.statePath)
171
+ return;
172
+ try {
173
+ const payload = {};
174
+ for (const [vault, entry] of this.state)
175
+ payload[vault] = entry;
176
+ await ensureDir(path.dirname(this.statePath));
177
+ await atomicWriteJson(this.statePath, payload);
178
+ }
179
+ catch (err) {
180
+ this.logger.warn('WikiBookkeepTrigger: failed to persist state (non-fatal)', {
181
+ statePath: this.statePath,
182
+ error: err.message,
183
+ });
184
+ }
94
185
  }
95
186
  static getInstance() {
96
187
  return this.instance;
@@ -126,6 +217,7 @@ export class WikiBookkeepTriggerService {
126
217
  * `/api/wiki/bookkeep/trigger-now` endpoint.
127
218
  */
128
219
  async tick() {
220
+ await this.loadStateFromDisk();
129
221
  const vaults = await this.discoverRoots();
130
222
  const result = {
131
223
  scanned: [...vaults],
@@ -133,12 +225,17 @@ export class WikiBookkeepTriggerService {
133
225
  skippedByDebounce: [],
134
226
  quietVaults: [],
135
227
  };
228
+ let stateDirty = false;
136
229
  for (const v of vaults) {
137
230
  if (this.inflight.has(v))
138
231
  continue;
139
232
  this.inflight.add(v);
140
233
  try {
141
- const outcome = await this.bookkeepService.generate({ vaultPath: v });
234
+ const prior = this.state.get(v);
235
+ const outcome = await this.bookkeepService.generate({
236
+ vaultPath: v,
237
+ baselineMdCount: prior?.baselineMdCount,
238
+ });
142
239
  if (!outcome.ok) {
143
240
  this.logger.warn('WikiBookkeepTrigger: bookkeep failed for vault', {
144
241
  vault: v,
@@ -146,22 +243,42 @@ export class WikiBookkeepTriggerService {
146
243
  });
147
244
  continue;
148
245
  }
246
+ const total = outcome.report.totalMdCount;
247
+ // First sight of a vault: establish the baseline at the current count
248
+ // and DON'T fire. This is what stops a freshly-migrated vault (every
249
+ // file mtime-recent) from firing on its entire backlog — only pages
250
+ // added AFTER this point count toward the next threshold.
251
+ if (!prior) {
252
+ this.state.set(v, { baselineMdCount: total, lastFiredAt: 0 });
253
+ stateDirty = true;
254
+ result.quietVaults.push(v);
255
+ continue;
256
+ }
257
+ // A vault that shrank (cleanup deleted pages) lowers the baseline so
258
+ // future adds are measured from the new floor — keep it persisted.
259
+ if (total < prior.baselineMdCount) {
260
+ prior.baselineMdCount = total;
261
+ stateDirty = true;
262
+ }
149
263
  if (!outcome.report.shouldFire) {
150
264
  result.quietVaults.push(v);
151
265
  continue;
152
266
  }
153
- const last = this.lastFiredAt.get(v) ?? 0;
154
- if (Date.now() - last < this.debounceMs) {
267
+ if (Date.now() - prior.lastFiredAt < this.debounceMs) {
155
268
  result.skippedByDebounce.push(v);
156
269
  continue;
157
270
  }
158
- this.lastFiredAt.set(v, Date.now());
271
+ // Fire, then advance the baseline to the current count so we don't
272
+ // re-fire until another `threshold` net-new pages accumulate.
273
+ prior.lastFiredAt = Date.now();
274
+ prior.baselineMdCount = total;
275
+ stateDirty = true;
159
276
  try {
160
277
  await this.fireFn(v, outcome.report);
161
278
  result.fired.push(v);
162
279
  this.logger.info('WikiBookkeepTrigger fired', {
163
280
  vault: v,
164
- recentMd: outcome.report.recentMdCount,
281
+ netNewMd: outcome.report.netNewMdCount,
165
282
  threshold: outcome.report.threshold,
166
283
  duplicates: outcome.report.duplicateCandidates.length,
167
284
  });
@@ -177,11 +294,17 @@ export class WikiBookkeepTriggerService {
177
294
  this.inflight.delete(v);
178
295
  }
179
296
  }
297
+ if (stateDirty)
298
+ await this.saveStateToDisk();
180
299
  return result;
181
300
  }
182
- /** Test affordance: clear the debounce ledger. */
301
+ /**
302
+ * Test affordance: clear the in-memory baseline + debounce ledger. Leaves
303
+ * `stateLoaded` set so a subsequent `tick()` does NOT reload persisted state
304
+ * (which would undo the clear).
305
+ */
183
306
  _resetDebounceForTesting() {
184
- this.lastFiredAt.clear();
307
+ this.state.clear();
185
308
  }
186
309
  }
187
310
  //# sourceMappingURL=wiki-bookkeep-trigger.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-bookkeep-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wiki-bookkeep-trigger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep-trigger.service.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,17 @@ export interface WikiBookkeepInput {
30
30
  windowDays?: number;
31
31
  /** Md-count threshold used by `shouldFire` (default 10). */
32
32
  threshold?: number;
33
+ /**
34
+ * Total md count the caller last acted on for this vault (its persisted
35
+ * baseline / high-water mark). When provided, `shouldFire` is driven by
36
+ * NET-NEW pages since the baseline (`totalMdCount - baselineMdCount`)
37
+ * rather than by mtime-recency. This is the robust signal: an mtime
38
+ * window counts every file a bulk operation (e.g. a vault migration that
39
+ * writes 500 pages at once) just touched as "recent", so it fires forever;
40
+ * net-new only counts genuinely-added pages. Omit for a stateless report
41
+ * (falls back to the mtime-window `recentMdCount`).
42
+ */
43
+ baselineMdCount?: number;
33
44
  }
34
45
  export interface WikiPageRef {
35
46
  path: string;
@@ -55,8 +66,14 @@ export interface WikiBookkeepReport {
55
66
  shouldFire: boolean;
56
67
  /** Total md files under the vault (recursive). */
57
68
  totalMdCount: number;
58
- /** Newly created/touched mds within `windowDays`. */
69
+ /** Newly created/touched mds within `windowDays` (mtime-based; informational). */
59
70
  recentMdCount: number;
71
+ /**
72
+ * Net-new pages since the caller's baseline (`max(0, total - baseline)`).
73
+ * Equals `recentMdCount` when no baseline was supplied. This is what
74
+ * `shouldFire` is computed from.
75
+ */
76
+ netNewMdCount: number;
60
77
  /** Per-folder counts under llm-curated/<x>/. */
61
78
  countsByFolder: Record<string, number>;
62
79
  /** Likely-duplicate clusters by filename Jaccard. */
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-bookkeep.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qDAAqD;IACrD,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;IAC5C,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,qDAAqD;IACrD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGvC,YAAY,CAAC,EAAE,mBAAmB,EAClC,KAAK,CAAC,EAAE,gBAAgB;IAO1B,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAKzC,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAwGxD,YAAY;IA2C1B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CA8C7B"}
1
+ {"version":3,"file":"wiki-bookkeep.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAM3D,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qDAAqD;IACrD,mBAAmB,EAAE,oBAAoB,EAAE,CAAC;IAC5C,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,qDAAqD;IACrD,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGvC,YAAY,CAAC,EAAE,mBAAmB,EAClC,KAAK,CAAC,EAAE,gBAAgB;IAO1B,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAKzC,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAoHxD,YAAY;IA2C1B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CA8C7B"}