crewly 1.20.356 → 1.20.359

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 (277) hide show
  1. package/config/constants.ts +11 -0
  2. package/dist/backend/backend/src/constants.d.ts +313 -17
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +316 -17
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/index.d.ts +21 -0
  7. package/dist/backend/backend/src/index.d.ts.map +1 -1
  8. package/dist/backend/backend/src/index.js +232 -15
  9. package/dist/backend/backend/src/index.js.map +1 -1
  10. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -2
  11. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  12. package/dist/backend/backend/src/services/agent/agent-registration.service.js +27 -2
  13. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  14. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
  15. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  16. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
  17. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  18. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
  19. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  20. package/dist/backend/backend/src/services/agent/idle-detection.service.js +26 -2
  21. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  22. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +9 -0
  23. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/agent/resource-mode.service.js +16 -0
  25. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
  27. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +126 -11
  29. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  30. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
  31. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
  33. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  34. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +150 -0
  35. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -0
  36. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +324 -0
  37. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -0
  38. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +9 -7
  39. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +19 -17
  41. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -1
  42. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/memory/memory.service.js +11 -0
  44. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +114 -0
  46. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/memory/startup-briefing.service.js +345 -0
  48. package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -0
  49. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
  50. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
  52. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts +24 -1
  54. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js +54 -3
  56. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js.map +1 -1
  57. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +9 -0
  58. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +16 -2
  60. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts +30 -0
  62. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js +48 -0
  64. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js.map +1 -0
  65. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +8 -0
  66. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +29 -8
  68. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +27 -0
  70. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +78 -24
  72. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +23 -0
  74. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +38 -1
  76. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  77. package/dist/backend/backend/src/services/session/session-binding.d.ts +25 -2
  78. package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/session/session-binding.js +32 -4
  80. package/dist/backend/backend/src/services/session/session-binding.js.map +1 -1
  81. package/dist/backend/backend/src/services/slack/agent-coordination.d.ts +119 -0
  82. package/dist/backend/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
  83. package/dist/backend/backend/src/services/slack/agent-coordination.js +174 -0
  84. package/dist/backend/backend/src/services/slack/agent-coordination.js.map +1 -0
  85. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -0
  87. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  88. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
  89. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +619 -9
  91. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
  93. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +49 -12
  95. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
  97. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
  99. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +21 -1
  101. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/team-move/team-move-chat.js +54 -2
  103. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -1
  104. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +9 -4
  105. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +32 -10
  107. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -1
  108. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +19 -0
  109. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -1
  110. package/dist/backend/backend/src/services/team-move/team-move-importer.js +78 -3
  111. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -1
  112. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +8 -0
  114. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -1
  115. package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts +106 -0
  116. package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts.map +1 -0
  117. package/dist/backend/backend/src/services/team-move/team-move-transcripts.js +212 -0
  118. package/dist/backend/backend/src/services/team-move/team-move-transcripts.js.map +1 -0
  119. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +20 -0
  120. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -1
  122. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -2
  123. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -4
  125. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +3 -0
  128. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +4 -1
  131. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  132. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
  133. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +4 -0
  134. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
  135. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +36 -5
  136. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +75 -7
  138. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -1
  140. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +3 -1
  141. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -1
  142. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +141 -0
  143. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -0
  144. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +324 -0
  145. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -0
  146. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
  147. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
  148. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +222 -0
  149. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
  150. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +93 -0
  151. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -0
  152. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +142 -0
  153. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -0
  154. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +104 -0
  155. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -0
  156. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +192 -0
  157. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -0
  158. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +3 -2
  159. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -1
  160. package/dist/backend/backend/src/services/wiki/wiki-query.service.js +23 -39
  161. package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -1
  162. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts +105 -0
  163. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts.map +1 -0
  164. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js +195 -0
  165. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js.map +1 -0
  166. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -1
  167. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +3 -0
  168. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -1
  169. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
  170. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  171. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +96 -25
  172. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  173. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
  174. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
  175. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js +17 -1
  176. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
  177. package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
  178. package/dist/backend/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
  179. package/dist/backend/backend/src/services/wiki/work-record-transcript.js +194 -0
  180. package/dist/backend/backend/src/services/wiki/work-record-transcript.js.map +1 -0
  181. package/dist/backend/backend/src/services/wiki/work-record.d.ts +239 -0
  182. package/dist/backend/backend/src/services/wiki/work-record.d.ts.map +1 -0
  183. package/dist/backend/backend/src/services/wiki/work-record.js +631 -0
  184. package/dist/backend/backend/src/services/wiki/work-record.js.map +1 -0
  185. package/dist/backend/backend/src/services/wiki/work-record.service.d.ts +209 -0
  186. package/dist/backend/backend/src/services/wiki/work-record.service.d.ts.map +1 -0
  187. package/dist/backend/backend/src/services/wiki/work-record.service.js +514 -0
  188. package/dist/backend/backend/src/services/wiki/work-record.service.js.map +1 -0
  189. package/dist/backend/build-info.json +2 -2
  190. package/dist/backend/config/constants.d.ts +11 -0
  191. package/dist/backend/config/constants.d.ts.map +1 -1
  192. package/dist/backend/config/constants.js +11 -0
  193. package/dist/backend/config/constants.js.map +1 -1
  194. package/dist/cli/backend/src/constants.d.ts +313 -17
  195. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  196. package/dist/cli/backend/src/constants.js +316 -17
  197. package/dist/cli/backend/src/constants.js.map +1 -1
  198. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -2
  199. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  200. package/dist/cli/backend/src/services/agent/agent-registration.service.js +27 -2
  201. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  202. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
  203. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  204. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
  205. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  206. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +9 -0
  207. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  208. package/dist/cli/backend/src/services/agent/resource-mode.service.js +16 -0
  209. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  210. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
  211. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  212. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +126 -11
  213. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  214. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
  215. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  216. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
  217. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  218. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  219. package/dist/cli/backend/src/services/memory/memory.service.js +11 -0
  220. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  221. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +114 -0
  222. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
  223. package/dist/cli/backend/src/services/memory/startup-briefing.service.js +345 -0
  224. package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -0
  225. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
  226. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  227. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
  228. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  229. package/dist/cli/backend/src/services/slack/agent-coordination.d.ts +119 -0
  230. package/dist/cli/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
  231. package/dist/cli/backend/src/services/slack/agent-coordination.js +174 -0
  232. package/dist/cli/backend/src/services/slack/agent-coordination.js.map +1 -0
  233. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
  234. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  235. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +619 -9
  236. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  237. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
  238. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  239. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +49 -12
  240. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  241. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
  242. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  243. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
  244. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  245. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +36 -5
  246. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  247. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js +75 -7
  248. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  249. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
  250. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
  251. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +222 -0
  252. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
  253. package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
  254. package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
  255. package/dist/cli/backend/src/services/wiki/wiki-recent.service.js +105 -0
  256. package/dist/cli/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
  257. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
  258. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  259. package/dist/cli/backend/src/services/wiki/wiki-search.service.js +96 -25
  260. package/dist/cli/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  261. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
  262. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
  263. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js +17 -1
  264. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
  265. package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts +64 -0
  266. package/dist/cli/backend/src/services/wiki/work-record-transcript.d.ts.map +1 -0
  267. package/dist/cli/backend/src/services/wiki/work-record-transcript.js +194 -0
  268. package/dist/cli/backend/src/services/wiki/work-record-transcript.js.map +1 -0
  269. package/dist/cli/backend/src/services/wiki/work-record.d.ts +239 -0
  270. package/dist/cli/backend/src/services/wiki/work-record.d.ts.map +1 -0
  271. package/dist/cli/backend/src/services/wiki/work-record.js +631 -0
  272. package/dist/cli/backend/src/services/wiki/work-record.js.map +1 -0
  273. package/dist/cli/config/constants.d.ts +11 -0
  274. package/dist/cli/config/constants.d.ts.map +1 -1
  275. package/dist/cli/config/constants.js +11 -0
  276. package/dist/cli/config/constants.js.map +1 -1
  277. package/package.json +1 -1
@@ -0,0 +1,141 @@
1
+ /**
2
+ * WikiLogCompileService — turns the week's log entries into a digest page.
3
+ *
4
+ * Agents append learnings to `llm-curated/log.md` and nothing ever read
5
+ * them back (#1345): bookkeep waited for ten net-new *pages* and reflect
6
+ * fed a queue nobody drained. This service does the deterministic half of
7
+ * "compile": once a day it takes the non-noise, not-yet-compiled entries
8
+ * of the last `COMPILE_WINDOW_DAYS`, groups them by category and topic,
9
+ * and writes (or appends to) one page per vault and ISO week under
10
+ * `llm-curated/digests/`, through the normal ingest path so the page gets
11
+ * frontmatter, an index line and history. Compiled entries are remembered
12
+ * by body key in `<vault>/.wiki-compile-state.json` so a later run does
13
+ * not compile them again. No LLM; an agent can still rewrite a digest into
14
+ * a proper topic page.
15
+ *
16
+ * Work records (#1349, `work_record` entries) get their own sections ahead
17
+ * of the learning groups: "Work done", "Errors and fixes", "Collaboration".
18
+ *
19
+ * @module services/wiki/wiki-log-compile.service
20
+ */
21
+ import { WikiIngestService } from './wiki-ingest.service.js';
22
+ /** Options for {@link WikiLogCompileService.compile}. */
23
+ export interface WikiLogCompileOptions {
24
+ /** Report only; write nothing (page or state). */
25
+ dryRun?: boolean;
26
+ /** Clock (tests). */
27
+ now?: number;
28
+ /** Window override (tests). */
29
+ windowDays?: number;
30
+ /** Minimum-entries override (tests). */
31
+ minEntries?: number;
32
+ }
33
+ /** Outcome of one vault's compile. */
34
+ export interface WikiLogCompileResult {
35
+ vaultPath: string;
36
+ /** False when the log is missing, too few new entries, or ingest refused the page. */
37
+ compiled: boolean;
38
+ reason?: 'no_log' | 'too_few_entries' | 'ingest_refused';
39
+ /** Uncompiled non-noise entries found in the window. */
40
+ candidates: number;
41
+ /** Entries written into the digest. */
42
+ entriesCompiled: number;
43
+ /** Vault-relative digest page (planned in a dry run). */
44
+ pagePath?: string;
45
+ /** Topic groups written. */
46
+ groups: number;
47
+ dryRun: boolean;
48
+ }
49
+ /**
50
+ * ISO-8601 week label (`YYYY-Www`) of a date.
51
+ *
52
+ * @param ms - Epoch ms
53
+ * @returns Label such as `2026-W42`
54
+ */
55
+ export declare function isoWeekLabel(ms: number): string;
56
+ /**
57
+ * Compiles vault log entries into weekly digest pages. Stateless singleton
58
+ * apart from the per-vault state file.
59
+ */
60
+ export declare class WikiLogCompileService {
61
+ private readonly ingest;
62
+ private static instance;
63
+ private readonly logger;
64
+ constructor(ingest?: WikiIngestService);
65
+ static getInstance(): WikiLogCompileService;
66
+ /** Test-only reset. */
67
+ static _resetForTesting(): void;
68
+ /**
69
+ * Compile one vault's uncompiled recent entries into this week's digest.
70
+ *
71
+ * @param vaultPath - Vault root
72
+ * @param opts - Dry run, clock and threshold overrides
73
+ * @returns What was (or would be) written
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const r = await WikiLogCompileService.getInstance().compile(vault);
78
+ * // r.compiled && r.pagePath === 'llm-curated/digests/2026-W42.md'
79
+ * ```
80
+ */
81
+ compile(vaultPath: string, opts?: WikiLogCompileOptions): Promise<WikiLogCompileResult>;
82
+ /**
83
+ * Compile every vault in a list; failures are logged per vault.
84
+ *
85
+ * @param vaults - Vault roots
86
+ * @param opts - Passed to {@link compile}
87
+ * @returns One result per vault checked
88
+ */
89
+ compileAll(vaults: readonly string[], opts?: WikiLogCompileOptions): Promise<WikiLogCompileResult[]>;
90
+ /**
91
+ * Group entries by `<category> / <topic>`, largest groups first, stable
92
+ * within a group (oldest first).
93
+ *
94
+ * @param entries - Candidate entries
95
+ * @returns Groups with a label and members
96
+ */
97
+ private group;
98
+ /**
99
+ * `k gotchas, m decisions, …` for the page summary.
100
+ *
101
+ * @param entries - Entries
102
+ * @returns Comma-separated counts, most frequent first
103
+ */
104
+ private categoryCounts;
105
+ /**
106
+ * Separate work records (#1349) from learnings. A record whose body does
107
+ * not parse is kept as a learning so nothing is dropped.
108
+ *
109
+ * @param entries - Candidate entries
110
+ * @returns Records with parsed fields, and the rest
111
+ */
112
+ private splitRecords;
113
+ /**
114
+ * Markdown body of one compile run: a dated heading; when the run holds
115
+ * work records, `### Work done`, `### Errors and fixes` and
116
+ * `### Collaboration` (the digest renders task titles, never ticket ids —
117
+ * those stay on each record's `meta:` line); then one `###` per learning
118
+ * group with one bullet per entry (author, date, body clipped).
119
+ *
120
+ * @param groups - Grouped learning entries
121
+ * @param all - All entries in the run (for the date range)
122
+ * @param now - Epoch ms of the run
123
+ * @param records - Work records in the run
124
+ * @returns Markdown
125
+ */
126
+ private renderBody;
127
+ /**
128
+ * The three record sections. "Work done" lists every record (asked by →
129
+ * done by → outputs → outcome); "Errors and fixes" the records that met
130
+ * errors; "Collaboration" counts, per pair, delegations, asks and reviews.
131
+ *
132
+ * @param records - Records of the run, oldest first
133
+ * @returns Markdown lines (each section followed by a blank line)
134
+ */
135
+ private renderRecordSections;
136
+ private clipText;
137
+ private statePath;
138
+ private readState;
139
+ private writeState;
140
+ }
141
+ //# sourceMappingURL=wiki-log-compile.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-compile.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-compile.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAyB7D,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;IACzD,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAIpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAEZ,MAAM,GAAE,iBAAmD;IAIxF,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAK3C,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;;;;;;;;;;OAYG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiEjG;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAc9G;;;;;;OAMG;IACH,OAAO,CAAC,KAAK;IAeb;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAWpB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,UAAU;IAiBlB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IA+C5B,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,SAAS;YAIH,SAAS;YAQT,UAAU;CAGzB"}
@@ -0,0 +1,324 @@
1
+ /**
2
+ * WikiLogCompileService — turns the week's log entries into a digest page.
3
+ *
4
+ * Agents append learnings to `llm-curated/log.md` and nothing ever read
5
+ * them back (#1345): bookkeep waited for ten net-new *pages* and reflect
6
+ * fed a queue nobody drained. This service does the deterministic half of
7
+ * "compile": once a day it takes the non-noise, not-yet-compiled entries
8
+ * of the last `COMPILE_WINDOW_DAYS`, groups them by category and topic,
9
+ * and writes (or appends to) one page per vault and ISO week under
10
+ * `llm-curated/digests/`, through the normal ingest path so the page gets
11
+ * frontmatter, an index line and history. Compiled entries are remembered
12
+ * by body key in `<vault>/.wiki-compile-state.json` so a later run does
13
+ * not compile them again. No LLM; an agent can still rewrite a digest into
14
+ * a proper topic page.
15
+ *
16
+ * Work records (#1349, `work_record` entries) get their own sections ahead
17
+ * of the learning groups: "Work done", "Errors and fixes", "Collaboration".
18
+ *
19
+ * @module services/wiki/wiki-log-compile.service
20
+ */
21
+ import * as path from 'path';
22
+ import * as fs from 'fs/promises';
23
+ import { LoggerService } from '../core/logger.service.js';
24
+ import { WIKI_LOG_CONSTANTS } from '../../constants.js';
25
+ import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
26
+ import { WikiIngestService } from './wiki-ingest.service.js';
27
+ import { logBodyKey, logEntryCategory, logEntryTopic, parseLogEntries, recentContentEntries, } from './wiki-log-entries.js';
28
+ import { isWorkRecordEntry, parseWorkRecordBody } from './work-record.js';
29
+ /**
30
+ * ISO-8601 week label (`YYYY-Www`) of a date.
31
+ *
32
+ * @param ms - Epoch ms
33
+ * @returns Label such as `2026-W42`
34
+ */
35
+ export function isoWeekLabel(ms) {
36
+ const d = new Date(ms);
37
+ const date = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
38
+ // Thursday of the current week decides the ISO year.
39
+ const day = date.getUTCDay() || 7;
40
+ date.setUTCDate(date.getUTCDate() + 4 - day);
41
+ const yearStart = Date.UTC(date.getUTCFullYear(), 0, 1);
42
+ const week = Math.ceil(((date.getTime() - yearStart) / 86_400_000 + 1) / 7);
43
+ return `${date.getUTCFullYear()}-W${String(week).padStart(2, '0')}`;
44
+ }
45
+ /**
46
+ * Compiles vault log entries into weekly digest pages. Stateless singleton
47
+ * apart from the per-vault state file.
48
+ */
49
+ export class WikiLogCompileService {
50
+ ingest;
51
+ static instance = null;
52
+ logger;
53
+ constructor(ingest = WikiIngestService.getInstance()) {
54
+ this.ingest = ingest;
55
+ this.logger = LoggerService.getInstance().createComponentLogger('WikiLogCompile');
56
+ }
57
+ static getInstance() {
58
+ if (!this.instance)
59
+ this.instance = new WikiLogCompileService();
60
+ return this.instance;
61
+ }
62
+ /** Test-only reset. */
63
+ static _resetForTesting() {
64
+ this.instance = null;
65
+ }
66
+ /**
67
+ * Compile one vault's uncompiled recent entries into this week's digest.
68
+ *
69
+ * @param vaultPath - Vault root
70
+ * @param opts - Dry run, clock and threshold overrides
71
+ * @returns What was (or would be) written
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const r = await WikiLogCompileService.getInstance().compile(vault);
76
+ * // r.compiled && r.pagePath === 'llm-curated/digests/2026-W42.md'
77
+ * ```
78
+ */
79
+ async compile(vaultPath, opts = {}) {
80
+ const dryRun = opts.dryRun === true;
81
+ const now = opts.now ?? Date.now();
82
+ const windowDays = opts.windowDays ?? WIKI_LOG_CONSTANTS.COMPILE_WINDOW_DAYS;
83
+ const minEntries = opts.minEntries ?? WIKI_LOG_CONSTANTS.COMPILE_MIN_ENTRIES;
84
+ const base = { vaultPath, compiled: false, candidates: 0, entriesCompiled: 0, groups: 0, dryRun };
85
+ let raw;
86
+ try {
87
+ raw = await fs.readFile(path.join(vaultPath, WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH), 'utf8');
88
+ }
89
+ catch {
90
+ return { ...base, reason: 'no_log' };
91
+ }
92
+ const state = await this.readState(vaultPath);
93
+ const done = new Set(state.compiledKeys);
94
+ const candidates = recentContentEntries(parseLogEntries(raw), windowDays, now)
95
+ .filter((e) => !done.has(logBodyKey(e.body)))
96
+ .sort((a, b) => a.timestampMs - b.timestampMs)
97
+ .slice(0, WIKI_LOG_CONSTANTS.COMPILE_MAX_ENTRIES);
98
+ base.candidates = candidates.length;
99
+ if (candidates.length < minEntries)
100
+ return { ...base, reason: 'too_few_entries' };
101
+ const week = isoWeekLabel(now);
102
+ const pagePath = `${WIKI_LOG_CONSTANTS.COMPILE_DIR}/${week}.md`;
103
+ const { records, others } = this.splitRecords(candidates);
104
+ const groups = this.group(others);
105
+ const body = this.renderBody(groups, candidates, now, records);
106
+ const result = { ...base, compiled: true, entriesCompiled: candidates.length, pagePath, groups: groups.length };
107
+ if (dryRun) {
108
+ this.logger.info('WikiLogCompile dry run — would write digest', { vaultPath, pagePath, entries: candidates.length, groups: groups.length, records: records.length });
109
+ return result;
110
+ }
111
+ const counts = this.categoryCounts(others);
112
+ const summaryLead = records.length > 0
113
+ ? `${records.length} work record${records.length === 1 ? '' : 's'}${others.length > 0 ? ` and ${others.length} learnings (${counts})` : ''} from the vault log`
114
+ : `${candidates.length} learnings from the vault log (${counts})`;
115
+ const outcome = await this.ingest.ingest({
116
+ vaultPath,
117
+ sourceType: 'record_learning',
118
+ sourceRef: `wiki-log-compile:${week}:${new Date(now).toISOString()}`,
119
+ sourceBody: body,
120
+ callerSession: 'system:wiki-log-compile',
121
+ targetRelativePath: pagePath,
122
+ title: `Digest ${week}`,
123
+ summary: `${summaryLead} compiled ${new Date(now).toISOString().slice(0, 10)} — read before working on these topics; promote what still matters to its own page.`,
124
+ keepBecause: 'reusable_method',
125
+ tags: ['digest', week],
126
+ });
127
+ if (!outcome.ok) {
128
+ this.logger.warn('WikiLogCompile: ingest refused the digest page (non-fatal)', { vaultPath, pagePath, reason: outcome.reason });
129
+ return { ...base, reason: 'ingest_refused', candidates: candidates.length };
130
+ }
131
+ const keys = [...state.compiledKeys, ...candidates.map((e) => logBodyKey(e.body))];
132
+ await this.writeState(vaultPath, {
133
+ compiledKeys: keys.slice(-WIKI_LOG_CONSTANTS.COMPILE_STATE_MAX_KEYS),
134
+ lastCompiledAt: new Date(now).toISOString(),
135
+ });
136
+ this.logger.info('WikiLogCompile wrote digest', { vaultPath, pagePath, entries: candidates.length, groups: groups.length });
137
+ return result;
138
+ }
139
+ /**
140
+ * Compile every vault in a list; failures are logged per vault.
141
+ *
142
+ * @param vaults - Vault roots
143
+ * @param opts - Passed to {@link compile}
144
+ * @returns One result per vault checked
145
+ */
146
+ async compileAll(vaults, opts = {}) {
147
+ const out = [];
148
+ for (const vaultPath of vaults) {
149
+ try {
150
+ out.push(await this.compile(vaultPath, opts));
151
+ }
152
+ catch (err) {
153
+ this.logger.warn('WikiLogCompile failed for vault (non-fatal)', { vaultPath, error: err instanceof Error ? err.message : String(err) });
154
+ }
155
+ }
156
+ return out;
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ /**
160
+ * Group entries by `<category> / <topic>`, largest groups first, stable
161
+ * within a group (oldest first).
162
+ *
163
+ * @param entries - Candidate entries
164
+ * @returns Groups with a label and members
165
+ */
166
+ group(entries) {
167
+ const byLabel = new Map();
168
+ for (const e of entries) {
169
+ const category = logEntryCategory(e.body);
170
+ const topic = logEntryTopic(e.body);
171
+ const label = topic.toLowerCase() === category ? category : `${category} / ${topic}`;
172
+ const list = byLabel.get(label) ?? [];
173
+ list.push(e);
174
+ byLabel.set(label, list);
175
+ }
176
+ return [...byLabel.entries()]
177
+ .map(([label, members]) => ({ label, members }))
178
+ .sort((a, b) => b.members.length - a.members.length || a.label.localeCompare(b.label));
179
+ }
180
+ /**
181
+ * `k gotchas, m decisions, …` for the page summary.
182
+ *
183
+ * @param entries - Entries
184
+ * @returns Comma-separated counts, most frequent first
185
+ */
186
+ categoryCounts(entries) {
187
+ const counts = new Map();
188
+ for (const e of entries) {
189
+ const c = logEntryCategory(e.body);
190
+ counts.set(c, (counts.get(c) ?? 0) + 1);
191
+ }
192
+ return [...counts.entries()]
193
+ .sort((a, b) => b[1] - a[1])
194
+ .map(([c, n]) => `${n} ${c}`)
195
+ .join(', ');
196
+ }
197
+ /**
198
+ * Separate work records (#1349) from learnings. A record whose body does
199
+ * not parse is kept as a learning so nothing is dropped.
200
+ *
201
+ * @param entries - Candidate entries
202
+ * @returns Records with parsed fields, and the rest
203
+ */
204
+ splitRecords(entries) {
205
+ const records = [];
206
+ const others = [];
207
+ for (const e of entries) {
208
+ const parsed = isWorkRecordEntry(e) ? parseWorkRecordBody(e.body) : null;
209
+ if (parsed)
210
+ records.push({ entry: e, parsed });
211
+ else
212
+ others.push(e);
213
+ }
214
+ return { records, others };
215
+ }
216
+ /**
217
+ * Markdown body of one compile run: a dated heading; when the run holds
218
+ * work records, `### Work done`, `### Errors and fixes` and
219
+ * `### Collaboration` (the digest renders task titles, never ticket ids —
220
+ * those stay on each record's `meta:` line); then one `###` per learning
221
+ * group with one bullet per entry (author, date, body clipped).
222
+ *
223
+ * @param groups - Grouped learning entries
224
+ * @param all - All entries in the run (for the date range)
225
+ * @param now - Epoch ms of the run
226
+ * @param records - Work records in the run
227
+ * @returns Markdown
228
+ */
229
+ renderBody(groups, all, now, records = []) {
230
+ const first = all[0]?.timestamp.slice(0, 10) ?? '';
231
+ const last = all[all.length - 1]?.timestamp.slice(0, 10) ?? '';
232
+ const lines = [`## Compiled ${new Date(now).toISOString().slice(0, 10)} — ${all.length} entries from ${first} to ${last}`, ''];
233
+ if (records.length > 0)
234
+ lines.push(...this.renderRecordSections(records));
235
+ for (const g of groups) {
236
+ lines.push(`### ${g.label} (${g.members.length})`, '');
237
+ for (const e of g.members) {
238
+ const body = e.body.replace(/\s+/g, ' ').trim();
239
+ const clipped = body.length > WIKI_LOG_CONSTANTS.COMPILE_ENTRY_MAX_CHARS ? `${body.slice(0, WIKI_LOG_CONSTANTS.COMPILE_ENTRY_MAX_CHARS - 1)}…` : body;
240
+ lines.push(`- ${e.timestamp.slice(0, 10)} · ${e.caller}: ${clipped}`);
241
+ }
242
+ lines.push('');
243
+ }
244
+ return lines.join('\n').trim();
245
+ }
246
+ /**
247
+ * The three record sections. "Work done" lists every record (asked by →
248
+ * done by → outputs → outcome); "Errors and fixes" the records that met
249
+ * errors; "Collaboration" counts, per pair, delegations, asks and reviews.
250
+ *
251
+ * @param records - Records of the run, oldest first
252
+ * @returns Markdown lines (each section followed by a blank line)
253
+ */
254
+ renderRecordSections(records) {
255
+ const lines = [`### Work done (${records.length})`, ''];
256
+ for (const { entry, parsed } of records) {
257
+ const parts = [`asked by ${parsed.askedBy || 'unknown'}`, `done by ${parsed.doneBy || 'unknown'}`];
258
+ if (parsed.did)
259
+ parts.push(this.clipText(parsed.did, WIKI_LOG_CONSTANTS.COMPILE_ENTRY_MAX_CHARS / 2));
260
+ if (parsed.outputs.length)
261
+ parts.push(`outputs: ${parsed.outputs.slice(0, 3).join('; ')}`);
262
+ lines.push(`- ${entry.timestamp.slice(0, 10)} · **${parsed.title}** — ${parts.join(' → ')} → ${parsed.outcome || 'unknown'}`);
263
+ }
264
+ lines.push('');
265
+ const withErrors = records.filter((r) => r.parsed.errors.length > 0);
266
+ if (withErrors.length > 0) {
267
+ lines.push(`### Errors and fixes (${withErrors.length})`, '');
268
+ for (const { entry, parsed } of withErrors) {
269
+ lines.push(`- ${entry.timestamp.slice(0, 10)} · ${parsed.title} (${parsed.doneBy || 'unknown'}): ${this.clipText(parsed.errors.join('; '), WIKI_LOG_CONSTANTS.COMPILE_ENTRY_MAX_CHARS)}`);
270
+ }
271
+ lines.push('');
272
+ }
273
+ const pairs = new Map();
274
+ const count = (from, to, how) => {
275
+ if (!from || !to || from === to)
276
+ return;
277
+ const key = `${from} → ${to}`;
278
+ const byHow = pairs.get(key) ?? new Map();
279
+ byHow.set(how, (byHow.get(how) ?? 0) + 1);
280
+ pairs.set(key, byHow);
281
+ };
282
+ for (const { parsed } of records) {
283
+ const asker = parsed.askedBy.replace(/\s*\((?:team lead|orchestrator)\)/, '').replace(/\s+for the owner.*$/, '').replace(/\s*\([^)]*\)$/, '').trim();
284
+ if (asker && !asker.startsWith('schedule') && asker !== 'Crewly (system)')
285
+ count(asker, parsed.doneBy, 'delegation');
286
+ for (const h of parsed.helpers) {
287
+ if (h.how === 'delegated')
288
+ count(parsed.doneBy, h.name, 'delegation');
289
+ else if (h.how === 'asked')
290
+ count(parsed.doneBy, h.name, h.rest.includes('answered') ? 'ask answered' : 'ask unanswered');
291
+ else
292
+ count(h.name, parsed.doneBy, 'review');
293
+ }
294
+ }
295
+ if (pairs.size > 0) {
296
+ lines.push(`### Collaboration (${pairs.size} pair${pairs.size === 1 ? '' : 's'})`, '');
297
+ const rows = [...pairs.entries()]
298
+ .map(([pair, byHow]) => ({ pair, total: [...byHow.values()].reduce((a, b) => a + b, 0), detail: [...byHow.entries()].sort((a, b) => b[1] - a[1]).map(([how, n]) => `${n} ${how}${n === 1 || how.endsWith('answered') ? '' : 's'}`).join(', ') }))
299
+ .sort((a, b) => b.total - a.total || a.pair.localeCompare(b.pair));
300
+ for (const r of rows)
301
+ lines.push(`- ${r.pair}: ${r.detail}`);
302
+ lines.push('');
303
+ }
304
+ return lines;
305
+ }
306
+ clipText(text, max) {
307
+ const flat = text.replace(/\s+/g, ' ').trim();
308
+ return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
309
+ }
310
+ statePath(vaultPath) {
311
+ return path.join(vaultPath, WIKI_LOG_CONSTANTS.COMPILE_STATE_FILE);
312
+ }
313
+ async readState(vaultPath) {
314
+ const data = await safeReadJson(this.statePath(vaultPath), null);
315
+ return {
316
+ compiledKeys: Array.isArray(data?.compiledKeys) ? data.compiledKeys.filter((k) => typeof k === 'string') : [],
317
+ lastCompiledAt: typeof data?.lastCompiledAt === 'string' ? data.lastCompiledAt : null,
318
+ };
319
+ }
320
+ async writeState(vaultPath, state) {
321
+ await atomicWriteJson(this.statePath(vaultPath), state);
322
+ }
323
+ }
324
+ //# sourceMappingURL=wiki-log-compile.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-compile.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-compile.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * The vault activity log (`llm-curated/log.md`) as entries.
3
+ *
4
+ * One place that knows the entry format `WikiIngestService` appends:
5
+ *
6
+ * ## [<ISO>] <sourceType> | <caller>
7
+ *
8
+ * ref: <sourceRef>
9
+ *
10
+ * <body>
11
+ *
12
+ * Used by search (one document per recent entry), rotation (carry forward
13
+ * the recent non-noise entries), the digest compiler and the startup
14
+ * briefing. Also decides what counts as a content-free entry (#1345): a
15
+ * templated state transition carries nothing a reader could use.
16
+ *
17
+ * @module services/wiki/wiki-log-entries
18
+ */
19
+ /** One parsed `log.md` entry. */
20
+ export interface WikiLogEntryRecord {
21
+ /** ISO timestamp from the header. */
22
+ timestamp: string;
23
+ /** Epoch ms of `timestamp`, or NaN when it does not parse. */
24
+ timestampMs: number;
25
+ /** Source type from the header (`record_learning`, `user_chat`, ...). */
26
+ sourceType: string;
27
+ /** Caller session (or source ref) from the header. */
28
+ caller: string;
29
+ /** `ref:` line value, '' when absent. */
30
+ ref: string;
31
+ /** Entry body after the `ref:` line, trimmed. */
32
+ body: string;
33
+ /** The entry's raw text, header included, as it stands in the file. */
34
+ raw: string;
35
+ }
36
+ /** Header a fresh `log.md` starts with. */
37
+ export declare const WIKI_LOG_HEADER = "# Activity log\n\nAppend-only log of ingested sources. Each entry: `## [<ISO>] <sourceType> | <caller>`.\n";
38
+ /**
39
+ * Whether a learning / log body is a content-free templated record.
40
+ *
41
+ * @param body - Entry body or learning text
42
+ * @returns True when the text matches a known templated shape or is blank
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * isNoiseLogBody('(learning) [pattern] [[WorkItem-1]] task:done running→done. timestamp=2026-10-17T00:00:00Z. Source: x.'); // true
47
+ * isNoiseLogBody('(gotcha) complete-task rejects queued→done; accept-task first.'); // false
48
+ * ```
49
+ */
50
+ export declare function isNoiseLogBody(body: string | undefined | null): boolean;
51
+ /**
52
+ * Conversation handover snapshots (`**Conversation handover — <agent> — task <id>** (fact) …`)
53
+ * that the fresh-conversation path mirrors into the vault. They are state,
54
+ * not knowledge: a thousand of them a week on one machine. They stay in the
55
+ * log (the agent is pointed at them) but are not knowledge for search, the
56
+ * digest, memory or the briefing.
57
+ *
58
+ * @param body - Entry body
59
+ * @returns True for a handover snapshot
60
+ */
61
+ export declare function isHandoverLogBody(body: string | undefined | null): boolean;
62
+ /**
63
+ * Normalised form of a body used for duplicate detection: whitespace
64
+ * collapsed, case folded, trailing punctuation dropped.
65
+ *
66
+ * @param body - Entry body
67
+ * @returns Normalised text
68
+ */
69
+ export declare function normalizeLogBody(body: string): string;
70
+ /**
71
+ * Stable key of an entry's content (sha1 of the normalised body). Two
72
+ * entries with the same body share a key whatever their timestamps.
73
+ *
74
+ * @param body - Entry body
75
+ * @returns 40-char hex digest
76
+ */
77
+ export declare function logBodyKey(body: string): string;
78
+ /**
79
+ * Parse a whole `log.md` into entries, in file order. Text before the
80
+ * first entry header (the preamble, a migrated learnings import) is not an
81
+ * entry and is dropped.
82
+ *
83
+ * @param raw - File content
84
+ * @returns Entries in file order
85
+ */
86
+ export declare function parseLogEntries(raw: string): WikiLogEntryRecord[];
87
+ /**
88
+ * Serialise an entry back into the append format (leading blank line,
89
+ * header, ref line, body, trailing blank line).
90
+ *
91
+ * @param entry - Entry to serialise
92
+ * @returns Markdown block
93
+ */
94
+ export declare function serializeLogEntry(entry: Pick<WikiLogEntryRecord, 'timestamp' | 'sourceType' | 'caller' | 'ref' | 'body'>): string;
95
+ /**
96
+ * The entries from the last `days` days that carry content, newest first,
97
+ * with duplicate bodies collapsed (the newest copy wins). Handover
98
+ * snapshots are left out unless `includeHandovers` is set (rotation keeps
99
+ * them; search, digest, memory and briefing do not).
100
+ *
101
+ * @param entries - Parsed entries (any order)
102
+ * @param days - Window length
103
+ * @param now - Current epoch ms
104
+ * @param limit - Cap on returned entries
105
+ * @param options - `includeHandovers` keeps handover snapshots
106
+ * @returns Recent, non-noise, deduped entries, newest first
107
+ */
108
+ export declare function recentContentEntries(entries: readonly WikiLogEntryRecord[], days: number, now?: number, limit?: number, options?: {
109
+ includeHandovers?: boolean;
110
+ }): WikiLogEntryRecord[];
111
+ /**
112
+ * Vault-relative "path" of a log entry as surfaced by search:
113
+ * `llm-curated/log.md#<ISO timestamp>`.
114
+ *
115
+ * @param entry - Entry
116
+ * @returns Pseudo path
117
+ */
118
+ export declare function logEntryPath(entry: Pick<WikiLogEntryRecord, 'timestamp'>): string;
119
+ /**
120
+ * Whether a vault-relative path points at a log entry (as opposed to a page).
121
+ *
122
+ * @param relativePath - Path from a search hit
123
+ * @returns True for `llm-curated/log.md#…`
124
+ */
125
+ export declare function isLogEntryPath(relativePath: string): boolean;
126
+ /**
127
+ * The `(category)` prefix `MemoryService` puts on a mirrored memory
128
+ * (`(gotcha) …`, `(decision) …`) or the `[tag]` an auto-recorder uses.
129
+ *
130
+ * @param body - Entry body
131
+ * @returns Lower-case category, or 'learning' when none is present
132
+ */
133
+ export declare function logEntryCategory(body: string): string;
134
+ /**
135
+ * Topic of an entry for grouping in a digest: the first `[[Entity]]` link,
136
+ * else a bold `**Title**` lead, else the category.
137
+ *
138
+ * @param body - Entry body
139
+ * @returns Short topic label
140
+ */
141
+ export declare function logEntryTopic(body: string): string;
142
+ //# sourceMappingURL=wiki-log-entries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-entries.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-entries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2CAA2C;AAC3C,eAAO,MAAM,eAAe,+GACkF,CAAC;AAe/G;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAKvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAG1E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAgCjE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAEjI;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EACtC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAmB,EACxB,KAAK,GAAE,MAAgC,EACvC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,kBAAkB,EAAE,CAgBtB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,MAAM,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD"}