crewly 1.20.355 → 1.20.358

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 (393) hide show
  1. package/config/constants.ts +11 -0
  2. package/config/roles/team-leader/prompt.md +1 -1
  3. package/config/roles/team-leader/tl-addon.md +1 -1
  4. package/config/skills/team-leader/delegate-task/SKILL.md +23 -1
  5. package/config/skills/team-leader/delegate-task/execute.sh +44 -1
  6. package/config/skills/team-leader/delegate-task/execute.test.sh +95 -1
  7. package/dist/backend/backend/src/constants.d.ts +319 -17
  8. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  9. package/dist/backend/backend/src/constants.js +322 -17
  10. package/dist/backend/backend/src/constants.js.map +1 -1
  11. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  12. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +10 -0
  13. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  14. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +7 -0
  16. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/team/team.controller.js +5 -0
  19. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  20. package/dist/backend/backend/src/index.d.ts +15 -0
  21. package/dist/backend/backend/src/index.d.ts.map +1 -1
  22. package/dist/backend/backend/src/index.js +138 -15
  23. package/dist/backend/backend/src/index.js.map +1 -1
  24. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +21 -2
  25. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/agent/agent-registration.service.js +100 -3
  27. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  28. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
  29. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
  31. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
  33. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/agent/idle-detection.service.js +26 -2
  35. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
  37. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
  39. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts +22 -0
  41. package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/agent/resource-mode-protection.js +33 -0
  43. package/dist/backend/backend/src/services/agent/resource-mode-protection.js.map +1 -1
  44. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +59 -3
  45. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/agent/resource-mode.service.js +108 -10
  47. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
  49. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +126 -11
  51. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
  55. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
  57. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  58. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +47 -6
  59. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  60. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +150 -0
  61. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +319 -0
  63. package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -0
  64. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +9 -7
  65. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +19 -17
  67. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -1
  68. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/memory/memory.service.js +11 -0
  70. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
  72. package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/memory/startup-briefing.service.js +302 -0
  74. package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -0
  75. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts +14 -2
  76. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js +21 -4
  78. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js.map +1 -1
  79. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
  80. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
  82. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  83. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts +24 -1
  84. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js +54 -3
  86. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js.map +1 -1
  87. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +10 -1
  89. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  90. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +8 -0
  91. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/open-items/open-items.service.js +33 -0
  93. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  94. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +2 -2
  95. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
  96. package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts +49 -0
  97. package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/open-items/question-card-gate.js +77 -0
  99. package/dist/backend/backend/src/services/open-items/question-card-gate.js.map +1 -0
  100. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +9 -0
  101. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +16 -2
  103. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +10 -0
  106. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  107. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
  108. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
  110. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  111. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
  112. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
  114. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  115. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts +30 -0
  116. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts.map +1 -0
  117. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js +48 -0
  118. package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js.map +1 -0
  119. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +8 -0
  120. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +29 -8
  122. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  123. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
  124. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
  126. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  127. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
  128. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
  129. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js +3 -2
  130. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
  131. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +128 -5
  132. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  133. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +320 -38
  134. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  135. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +23 -0
  136. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +48 -3
  138. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  139. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
  140. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
  142. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
  143. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
  144. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
  145. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
  146. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
  147. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
  148. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
  149. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
  150. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
  151. package/dist/backend/backend/src/services/slack/agent-coordination.d.ts +119 -0
  152. package/dist/backend/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
  153. package/dist/backend/backend/src/services/slack/agent-coordination.js +174 -0
  154. package/dist/backend/backend/src/services/slack/agent-coordination.js.map +1 -0
  155. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  156. package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -0
  157. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  158. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
  159. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  160. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +619 -9
  161. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  162. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
  163. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  164. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +49 -12
  165. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  166. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
  167. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  168. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
  169. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  170. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +21 -1
  171. package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -1
  172. package/dist/backend/backend/src/services/team-move/team-move-chat.js +54 -2
  173. package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -1
  174. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +9 -4
  175. package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -1
  176. package/dist/backend/backend/src/services/team-move/team-move-exporter.js +32 -10
  177. package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -1
  178. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +19 -0
  179. package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -1
  180. package/dist/backend/backend/src/services/team-move/team-move-importer.js +78 -3
  181. package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -1
  182. package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -1
  183. package/dist/backend/backend/src/services/team-move/team-move-runtime.js +8 -0
  184. package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -1
  185. package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts +106 -0
  186. package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts.map +1 -0
  187. package/dist/backend/backend/src/services/team-move/team-move-transcripts.js +212 -0
  188. package/dist/backend/backend/src/services/team-move/team-move-transcripts.js.map +1 -0
  189. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +20 -0
  190. package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -1
  191. package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -1
  192. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -2
  193. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  194. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -4
  195. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  196. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  197. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +13 -0
  198. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  199. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +3 -0
  201. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  203. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +4 -1
  204. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  205. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
  206. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +4 -0
  207. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
  208. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
  209. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  210. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +75 -7
  211. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  212. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -1
  213. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +3 -1
  214. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -1
  215. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +116 -0
  216. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -0
  217. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +227 -0
  218. package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -0
  219. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
  220. package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
  221. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +222 -0
  222. package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
  223. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +93 -0
  224. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -0
  225. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +142 -0
  226. package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -0
  227. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +104 -0
  228. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -0
  229. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +192 -0
  230. package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -0
  231. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +3 -2
  232. package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -1
  233. package/dist/backend/backend/src/services/wiki/wiki-query.service.js +23 -39
  234. package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -1
  235. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts +105 -0
  236. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts.map +1 -0
  237. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js +195 -0
  238. package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js.map +1 -0
  239. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +3 -0
  241. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -1
  242. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
  243. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  244. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +96 -25
  245. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  246. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
  247. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
  248. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js +17 -1
  249. package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
  250. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +22 -0
  251. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  252. package/dist/backend/backend/src/services/workflow/scheduler.service.js +35 -1
  253. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  254. package/dist/backend/backend/src/types/index.d.ts +12 -0
  255. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  256. package/dist/backend/backend/src/types/index.js.map +1 -1
  257. package/dist/backend/backend/src/types/team-template.types.d.ts +1 -0
  258. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  259. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  260. package/dist/backend/build-info.json +2 -2
  261. package/dist/backend/config/constants.d.ts +11 -0
  262. package/dist/backend/config/constants.d.ts.map +1 -1
  263. package/dist/backend/config/constants.js +11 -0
  264. package/dist/backend/config/constants.js.map +1 -1
  265. package/dist/cli/backend/src/constants.d.ts +319 -17
  266. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  267. package/dist/cli/backend/src/constants.js +322 -17
  268. package/dist/cli/backend/src/constants.js.map +1 -1
  269. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +21 -2
  270. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  271. package/dist/cli/backend/src/services/agent/agent-registration.service.js +100 -3
  272. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  273. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
  274. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  275. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
  276. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  277. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
  278. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  279. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
  280. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  281. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +59 -3
  282. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  283. package/dist/cli/backend/src/services/agent/resource-mode.service.js +108 -10
  284. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  285. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
  286. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  287. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +126 -11
  288. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  289. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
  290. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  291. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
  292. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  293. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
  294. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  295. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +47 -6
  296. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  297. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  298. package/dist/cli/backend/src/services/memory/memory.service.js +11 -0
  299. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  300. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
  301. package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
  302. package/dist/cli/backend/src/services/memory/startup-briefing.service.js +302 -0
  303. package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -0
  304. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
  305. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  306. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
  307. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  308. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  309. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +10 -1
  310. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  311. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +8 -0
  312. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  313. package/dist/cli/backend/src/services/open-items/open-items.service.js +33 -0
  314. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  315. package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts +49 -0
  316. package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
  317. package/dist/cli/backend/src/services/open-items/question-card-gate.js +77 -0
  318. package/dist/cli/backend/src/services/open-items/question-card-gate.js.map +1 -0
  319. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
  320. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  321. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
  322. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  323. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
  324. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  325. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
  326. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  327. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
  328. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  329. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
  330. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  331. package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
  332. package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
  333. package/dist/cli/backend/src/services/runtime-fallback/reset-time.js +3 -2
  334. package/dist/cli/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
  335. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
  336. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
  337. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
  338. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
  339. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
  340. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
  341. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
  342. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
  343. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
  344. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
  345. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
  346. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
  347. package/dist/cli/backend/src/services/slack/agent-coordination.d.ts +119 -0
  348. package/dist/cli/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
  349. package/dist/cli/backend/src/services/slack/agent-coordination.js +174 -0
  350. package/dist/cli/backend/src/services/slack/agent-coordination.js.map +1 -0
  351. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
  352. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  353. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +619 -9
  354. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  355. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
  356. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
  357. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +49 -12
  358. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  359. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
  360. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  361. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
  362. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  363. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
  364. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  365. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js +75 -7
  366. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  367. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
  368. package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
  369. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +222 -0
  370. package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
  371. package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
  372. package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
  373. package/dist/cli/backend/src/services/wiki/wiki-recent.service.js +105 -0
  374. package/dist/cli/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
  375. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
  376. package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  377. package/dist/cli/backend/src/services/wiki/wiki-search.service.js +96 -25
  378. package/dist/cli/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  379. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
  380. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
  381. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js +17 -1
  382. package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
  383. package/dist/cli/backend/src/types/index.d.ts +12 -0
  384. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  385. package/dist/cli/backend/src/types/index.js.map +1 -1
  386. package/dist/cli/backend/src/types/team-template.types.d.ts +1 -0
  387. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  388. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  389. package/dist/cli/config/constants.d.ts +11 -0
  390. package/dist/cli/config/constants.d.ts.map +1 -1
  391. package/dist/cli/config/constants.js +11 -0
  392. package/dist/cli/config/constants.js.map +1 -1
  393. package/package.json +1 -1
@@ -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"}
@@ -0,0 +1,222 @@
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
+ import { createHash } from 'crypto';
20
+ import { WIKI_LOG_CONSTANTS } from '../../constants.js';
21
+ /** Header a fresh `log.md` starts with. */
22
+ export const WIKI_LOG_HEADER = '# Activity log\n\nAppend-only log of ingested sources. Each entry: `## [<ISO>] <sourceType> | <caller>`.\n';
23
+ const HEADER_RE = /^## \[([^\]]+)\]\s+(\S+)\s+\|\s+(.+)$/gm;
24
+ /**
25
+ * Templated records that carry no information for a reader:
26
+ * - auto-learning state transitions (`[pattern] [[WorkItem-x]] task:done running→done. timestamp=… Source: …`);
27
+ * - the same shape without the category tag;
28
+ * - task-completion stubs (`Task completed: …`) that belong on the WorkItem.
29
+ */
30
+ const NOISE_PATTERNS = [
31
+ /\[\[(?:WorkItem|Mission)-[^\]]+\]\]\s+(?:task|mission):[a-z_]+\s+\S*\.?\s*(?:team=\S+\s*)?(?:mission=\S+\s*)?(?:resolver=\S+\s*)?timestamp=/i,
32
+ /^\s*(?:\([a-z_]+\)\s*)?(?:\[[a-z_]+\]\s*)?Task (?:completed|done)(?: by [^:]+)?:\s*\S/i,
33
+ ];
34
+ /**
35
+ * Whether a learning / log body is a content-free templated record.
36
+ *
37
+ * @param body - Entry body or learning text
38
+ * @returns True when the text matches a known templated shape or is blank
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * isNoiseLogBody('(learning) [pattern] [[WorkItem-1]] task:done running→done. timestamp=2026-10-17T00:00:00Z. Source: x.'); // true
43
+ * isNoiseLogBody('(gotcha) complete-task rejects queued→done; accept-task first.'); // false
44
+ * ```
45
+ */
46
+ export function isNoiseLogBody(body) {
47
+ if (!body)
48
+ return true;
49
+ const text = body.trim();
50
+ if (text.length === 0)
51
+ return true;
52
+ return NOISE_PATTERNS.some((re) => re.test(text));
53
+ }
54
+ /**
55
+ * Conversation handover snapshots (`**Conversation handover — <agent> — task <id>** (fact) …`)
56
+ * that the fresh-conversation path mirrors into the vault. They are state,
57
+ * not knowledge: a thousand of them a week on one machine. They stay in the
58
+ * log (the agent is pointed at them) but are not knowledge for search, the
59
+ * digest, memory or the briefing.
60
+ *
61
+ * @param body - Entry body
62
+ * @returns True for a handover snapshot
63
+ */
64
+ export function isHandoverLogBody(body) {
65
+ if (!body)
66
+ return false;
67
+ return /^\s*(?:\([a-z_-]+\)\s*)?\*\*Conversation handover\b/i.test(body.trim());
68
+ }
69
+ /**
70
+ * Normalised form of a body used for duplicate detection: whitespace
71
+ * collapsed, case folded, trailing punctuation dropped.
72
+ *
73
+ * @param body - Entry body
74
+ * @returns Normalised text
75
+ */
76
+ export function normalizeLogBody(body) {
77
+ return body.replace(/\s+/g, ' ').trim().toLowerCase().replace(/[.。]+$/, '');
78
+ }
79
+ /**
80
+ * Stable key of an entry's content (sha1 of the normalised body). Two
81
+ * entries with the same body share a key whatever their timestamps.
82
+ *
83
+ * @param body - Entry body
84
+ * @returns 40-char hex digest
85
+ */
86
+ export function logBodyKey(body) {
87
+ return createHash('sha1').update(normalizeLogBody(body)).digest('hex');
88
+ }
89
+ /**
90
+ * Parse a whole `log.md` into entries, in file order. Text before the
91
+ * first entry header (the preamble, a migrated learnings import) is not an
92
+ * entry and is dropped.
93
+ *
94
+ * @param raw - File content
95
+ * @returns Entries in file order
96
+ */
97
+ export function parseLogEntries(raw) {
98
+ const matches = [];
99
+ HEADER_RE.lastIndex = 0;
100
+ let m;
101
+ while ((m = HEADER_RE.exec(raw))) {
102
+ matches.push({ idx: m.index, ts: m[1], sourceType: m[2], caller: m[3].trim() });
103
+ }
104
+ const entries = [];
105
+ for (let i = 0; i < matches.length; i++) {
106
+ const start = matches[i].idx;
107
+ const end = i + 1 < matches.length ? matches[i + 1].idx : raw.length;
108
+ const block = raw.slice(start, end);
109
+ const refMatch = block.match(/^ref:\s*(.+)$/m);
110
+ let body = '';
111
+ if (refMatch) {
112
+ const refLineEnd = block.indexOf(refMatch[0]) + refMatch[0].length;
113
+ body = block.slice(refLineEnd).replace(/^\n+/, '').trim();
114
+ }
115
+ else {
116
+ // Entries written by hand or migrated: body is everything after the header line.
117
+ body = block.slice(block.indexOf('\n') + 1).trim();
118
+ }
119
+ entries.push({
120
+ timestamp: matches[i].ts,
121
+ timestampMs: Date.parse(matches[i].ts),
122
+ sourceType: matches[i].sourceType,
123
+ caller: matches[i].caller,
124
+ ref: refMatch ? refMatch[1].trim() : '',
125
+ body,
126
+ raw: block.replace(/\s+$/, ''),
127
+ });
128
+ }
129
+ return entries;
130
+ }
131
+ /**
132
+ * Serialise an entry back into the append format (leading blank line,
133
+ * header, ref line, body, trailing blank line).
134
+ *
135
+ * @param entry - Entry to serialise
136
+ * @returns Markdown block
137
+ */
138
+ export function serializeLogEntry(entry) {
139
+ return ['', `## [${entry.timestamp}] ${entry.sourceType} | ${entry.caller}`, '', `ref: ${entry.ref}`, '', entry.body, ''].join('\n');
140
+ }
141
+ /**
142
+ * The entries from the last `days` days that carry content, newest first,
143
+ * with duplicate bodies collapsed (the newest copy wins). Handover
144
+ * snapshots are left out unless `includeHandovers` is set (rotation keeps
145
+ * them; search, digest, memory and briefing do not).
146
+ *
147
+ * @param entries - Parsed entries (any order)
148
+ * @param days - Window length
149
+ * @param now - Current epoch ms
150
+ * @param limit - Cap on returned entries
151
+ * @param options - `includeHandovers` keeps handover snapshots
152
+ * @returns Recent, non-noise, deduped entries, newest first
153
+ */
154
+ export function recentContentEntries(entries, days, now = Date.now(), limit = Number.MAX_SAFE_INTEGER, options = {}) {
155
+ const cutoff = now - days * 24 * 60 * 60 * 1000;
156
+ const seen = new Set();
157
+ const out = [];
158
+ const sorted = [...entries].sort((a, b) => (b.timestampMs || 0) - (a.timestampMs || 0));
159
+ for (const e of sorted) {
160
+ if (!Number.isFinite(e.timestampMs) || e.timestampMs < cutoff)
161
+ continue;
162
+ if (isNoiseLogBody(e.body))
163
+ continue;
164
+ if (!options.includeHandovers && isHandoverLogBody(e.body))
165
+ continue;
166
+ const key = logBodyKey(e.body);
167
+ if (seen.has(key))
168
+ continue;
169
+ seen.add(key);
170
+ out.push(e);
171
+ if (out.length >= limit)
172
+ break;
173
+ }
174
+ return out;
175
+ }
176
+ /**
177
+ * Vault-relative "path" of a log entry as surfaced by search:
178
+ * `llm-curated/log.md#<ISO timestamp>`.
179
+ *
180
+ * @param entry - Entry
181
+ * @returns Pseudo path
182
+ */
183
+ export function logEntryPath(entry) {
184
+ return `${WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH}${WIKI_LOG_CONSTANTS.ENTRY_PATH_SEPARATOR}${entry.timestamp}`;
185
+ }
186
+ /**
187
+ * Whether a vault-relative path points at a log entry (as opposed to a page).
188
+ *
189
+ * @param relativePath - Path from a search hit
190
+ * @returns True for `llm-curated/log.md#…`
191
+ */
192
+ export function isLogEntryPath(relativePath) {
193
+ return relativePath.startsWith(`${WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH}${WIKI_LOG_CONSTANTS.ENTRY_PATH_SEPARATOR}`);
194
+ }
195
+ /**
196
+ * The `(category)` prefix `MemoryService` puts on a mirrored memory
197
+ * (`(gotcha) …`, `(decision) …`) or the `[tag]` an auto-recorder uses.
198
+ *
199
+ * @param body - Entry body
200
+ * @returns Lower-case category, or 'learning' when none is present
201
+ */
202
+ export function logEntryCategory(body) {
203
+ const m = body.match(/^\s*(?:\*\*[^*]+\*\*\s*)?[([]([a-z_-]+)[)\]]/i);
204
+ return m ? m[1].toLowerCase() : 'learning';
205
+ }
206
+ /**
207
+ * Topic of an entry for grouping in a digest: the first `[[Entity]]` link,
208
+ * else a bold `**Title**` lead, else the category.
209
+ *
210
+ * @param body - Entry body
211
+ * @returns Short topic label
212
+ */
213
+ export function logEntryTopic(body) {
214
+ const link = body.match(/\[\[([^\]]{1,80})\]\]/);
215
+ if (link)
216
+ return link[1].trim();
217
+ const bold = body.match(/^\s*(?:\([a-z_-]+\)\s*)?\*\*([^*]{1,80})\*\*/i);
218
+ if (bold)
219
+ return bold[1].trim();
220
+ return logEntryCategory(body);
221
+ }
222
+ //# sourceMappingURL=wiki-log-entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-entries.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * WikiLogRotationService — keeps a vault's `llm-curated/log.md` readable.
3
+ *
4
+ * The log is append-only and was never rotated: one project vault reached
5
+ * 19 MB / 150k lines, most of it templated noise (#1345). When a log is
6
+ * larger than `ROTATE_MAX_BYTES` or holds more than `ROTATE_MAX_ENTRIES`
7
+ * entries, this service:
8
+ *
9
+ * 1. moves the file, unchanged, to `llm-curated/log-archive/log-<date>.md`
10
+ * (a second rotation on the same day gets a `-2`, `-3`… suffix);
11
+ * 2. writes a fresh `log.md` with the standard header and the non-noise,
12
+ * deduped entries of the last `CARRY_FORWARD_DAYS` days (capped), so
13
+ * search and the digest still see recent learnings.
14
+ *
15
+ * Nothing is deleted. `dryRun` reports what would happen without touching
16
+ * the disk. Walkers skip the archive folder.
17
+ *
18
+ * @module services/wiki/wiki-log-rotation.service
19
+ */
20
+ import { WikiIngestService } from './wiki-ingest.service.js';
21
+ /** Options for {@link WikiLogRotationService.rotate}. */
22
+ export interface WikiLogRotateOptions {
23
+ /** Report only; write nothing. */
24
+ dryRun?: boolean;
25
+ /** Clock (tests). */
26
+ now?: number;
27
+ /** Size cap override (tests). */
28
+ maxBytes?: number;
29
+ /** Entry-count cap override (tests). */
30
+ maxEntries?: number;
31
+ }
32
+ /** Outcome of one vault's rotation check. */
33
+ export interface WikiLogRotateResult {
34
+ vaultPath: string;
35
+ /** False when the log is missing or under both caps. */
36
+ rotated: boolean;
37
+ /** Why nothing happened (when `rotated` is false). */
38
+ reason?: 'no_log' | 'under_caps';
39
+ /** Log size before rotation. */
40
+ bytes: number;
41
+ /** Entries before rotation. */
42
+ entries: number;
43
+ /** Entries carried into the fresh log. */
44
+ carried: number;
45
+ /** Vault-relative archive path (set when rotated, or planned in a dry run). */
46
+ archivePath?: string;
47
+ dryRun: boolean;
48
+ }
49
+ /**
50
+ * Rotates oversized vault logs into an archive folder. Stateless singleton.
51
+ */
52
+ export declare class WikiLogRotationService {
53
+ private readonly ingest;
54
+ private static instance;
55
+ private readonly logger;
56
+ constructor(ingest?: WikiIngestService);
57
+ static getInstance(): WikiLogRotationService;
58
+ /** Test-only reset. */
59
+ static _resetForTesting(): void;
60
+ /**
61
+ * Check one vault's log and rotate it when it is over a cap.
62
+ *
63
+ * @param vaultPath - Vault root (must contain `llm-curated/`)
64
+ * @param opts - Dry run, clock and cap overrides
65
+ * @returns What happened (or would happen)
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const plan = await WikiLogRotationService.getInstance().rotate(vault, { dryRun: true });
70
+ * if (plan.rotated) console.log(`would archive ${plan.bytes} bytes to ${plan.archivePath}`);
71
+ * ```
72
+ */
73
+ rotate(vaultPath: string, opts?: WikiLogRotateOptions): Promise<WikiLogRotateResult>;
74
+ /**
75
+ * Rotate every vault in a list; failures are logged per vault and never
76
+ * stop the pass.
77
+ *
78
+ * @param vaults - Vault roots
79
+ * @param opts - Passed to {@link rotate}
80
+ * @returns One result per vault that was checked
81
+ */
82
+ rotateAll(vaults: readonly string[], opts?: WikiLogRotateOptions): Promise<WikiLogRotateResult[]>;
83
+ /**
84
+ * Vault-relative archive path for a rotation at `now`: `log-YYYY-MM-DD.md`,
85
+ * with a numeric suffix when that name is taken.
86
+ *
87
+ * @param vaultPath - Vault root
88
+ * @param now - Epoch ms
89
+ * @returns Relative path under the archive folder
90
+ */
91
+ private archivePathFor;
92
+ }
93
+ //# sourceMappingURL=wiki-log-rotation.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-rotation.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-rotation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,yDAAyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACjC,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAIrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAEZ,MAAM,GAAE,iBAAmD;IAIxF,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAK5C,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgD9F;;;;;;;OAOG;IACG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAY3G;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;CAQvB"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * WikiLogRotationService — keeps a vault's `llm-curated/log.md` readable.
3
+ *
4
+ * The log is append-only and was never rotated: one project vault reached
5
+ * 19 MB / 150k lines, most of it templated noise (#1345). When a log is
6
+ * larger than `ROTATE_MAX_BYTES` or holds more than `ROTATE_MAX_ENTRIES`
7
+ * entries, this service:
8
+ *
9
+ * 1. moves the file, unchanged, to `llm-curated/log-archive/log-<date>.md`
10
+ * (a second rotation on the same day gets a `-2`, `-3`… suffix);
11
+ * 2. writes a fresh `log.md` with the standard header and the non-noise,
12
+ * deduped entries of the last `CARRY_FORWARD_DAYS` days (capped), so
13
+ * search and the digest still see recent learnings.
14
+ *
15
+ * Nothing is deleted. `dryRun` reports what would happen without touching
16
+ * the disk. Walkers skip the archive folder.
17
+ *
18
+ * @module services/wiki/wiki-log-rotation.service
19
+ */
20
+ import * as path from 'path';
21
+ import * as fs from 'fs/promises';
22
+ import { existsSync } from 'fs';
23
+ import { LoggerService } from '../core/logger.service.js';
24
+ import { WIKI_LOG_CONSTANTS } from '../../constants.js';
25
+ import { WIKI_LOG_HEADER, parseLogEntries, recentContentEntries, serializeLogEntry } from './wiki-log-entries.js';
26
+ import { WikiIngestService } from './wiki-ingest.service.js';
27
+ /**
28
+ * Rotates oversized vault logs into an archive folder. Stateless singleton.
29
+ */
30
+ export class WikiLogRotationService {
31
+ ingest;
32
+ static instance = null;
33
+ logger;
34
+ constructor(ingest = WikiIngestService.getInstance()) {
35
+ this.ingest = ingest;
36
+ this.logger = LoggerService.getInstance().createComponentLogger('WikiLogRotation');
37
+ }
38
+ static getInstance() {
39
+ if (!this.instance)
40
+ this.instance = new WikiLogRotationService();
41
+ return this.instance;
42
+ }
43
+ /** Test-only reset. */
44
+ static _resetForTesting() {
45
+ this.instance = null;
46
+ }
47
+ /**
48
+ * Check one vault's log and rotate it when it is over a cap.
49
+ *
50
+ * @param vaultPath - Vault root (must contain `llm-curated/`)
51
+ * @param opts - Dry run, clock and cap overrides
52
+ * @returns What happened (or would happen)
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const plan = await WikiLogRotationService.getInstance().rotate(vault, { dryRun: true });
57
+ * if (plan.rotated) console.log(`would archive ${plan.bytes} bytes to ${plan.archivePath}`);
58
+ * ```
59
+ */
60
+ async rotate(vaultPath, opts = {}) {
61
+ const dryRun = opts.dryRun === true;
62
+ const now = opts.now ?? Date.now();
63
+ const maxBytes = opts.maxBytes ?? WIKI_LOG_CONSTANTS.ROTATE_MAX_BYTES;
64
+ const maxEntries = opts.maxEntries ?? WIKI_LOG_CONSTANTS.ROTATE_MAX_ENTRIES;
65
+ const logAbs = path.join(vaultPath, WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH);
66
+ const base = { vaultPath, rotated: false, bytes: 0, entries: 0, carried: 0, dryRun };
67
+ let size;
68
+ try {
69
+ size = (await fs.stat(logAbs)).size;
70
+ }
71
+ catch {
72
+ return { ...base, reason: 'no_log' };
73
+ }
74
+ base.bytes = size;
75
+ const raw = await fs.readFile(logAbs, 'utf8');
76
+ const entries = parseLogEntries(raw);
77
+ base.entries = entries.length;
78
+ if (size <= maxBytes && entries.length <= maxEntries)
79
+ return { ...base, reason: 'under_caps' };
80
+ // Handover snapshots are carried: an agent may still be pointed at one.
81
+ const carried = recentContentEntries(entries, WIKI_LOG_CONSTANTS.CARRY_FORWARD_DAYS, now, WIKI_LOG_CONSTANTS.CARRY_FORWARD_MAX_ENTRIES, { includeHandovers: true })
82
+ // Oldest first in the fresh file, like any log.
83
+ .sort((a, b) => a.timestampMs - b.timestampMs);
84
+ const archiveRel = this.archivePathFor(vaultPath, now);
85
+ const result = { ...base, rotated: true, carried: carried.length, archivePath: archiveRel };
86
+ if (dryRun) {
87
+ this.logger.info('WikiLogRotation dry run — would rotate', { vaultPath, bytes: size, entries: base.entries, carried: carried.length, archivePath: archiveRel });
88
+ return result;
89
+ }
90
+ const archiveAbs = path.join(vaultPath, archiveRel);
91
+ await fs.mkdir(path.dirname(archiveAbs), { recursive: true });
92
+ // Move first (atomic on one filesystem), then write the fresh log. A
93
+ // crash in between leaves no log.md, which the next append recreates;
94
+ // nothing is lost because the archive already holds everything.
95
+ await fs.rename(logAbs, archiveAbs);
96
+ const fresh = WIKI_LOG_HEADER + `\n<!-- rotated ${new Date(now).toISOString()}: ${base.entries} entries archived to ${archiveRel}; ${carried.length} recent entries carried forward -->\n` + carried.map((e) => serializeLogEntry(e)).join('');
97
+ const tmp = `${logAbs}.tmp`;
98
+ await fs.writeFile(tmp, fresh, 'utf8');
99
+ await fs.rename(tmp, logAbs);
100
+ this.ingest.forgetRecentBodies(logAbs);
101
+ this.logger.info('WikiLogRotation rotated log', { vaultPath, bytes: size, entries: base.entries, carried: carried.length, archivePath: archiveRel });
102
+ return result;
103
+ }
104
+ /**
105
+ * Rotate every vault in a list; failures are logged per vault and never
106
+ * stop the pass.
107
+ *
108
+ * @param vaults - Vault roots
109
+ * @param opts - Passed to {@link rotate}
110
+ * @returns One result per vault that was checked
111
+ */
112
+ async rotateAll(vaults, opts = {}) {
113
+ const out = [];
114
+ for (const vaultPath of vaults) {
115
+ try {
116
+ out.push(await this.rotate(vaultPath, opts));
117
+ }
118
+ catch (err) {
119
+ this.logger.warn('WikiLogRotation failed for vault (non-fatal)', { vaultPath, error: err instanceof Error ? err.message : String(err) });
120
+ }
121
+ }
122
+ return out;
123
+ }
124
+ /**
125
+ * Vault-relative archive path for a rotation at `now`: `log-YYYY-MM-DD.md`,
126
+ * with a numeric suffix when that name is taken.
127
+ *
128
+ * @param vaultPath - Vault root
129
+ * @param now - Epoch ms
130
+ * @returns Relative path under the archive folder
131
+ */
132
+ archivePathFor(vaultPath, now) {
133
+ const day = new Date(now).toISOString().slice(0, 10);
134
+ for (let n = 1;; n++) {
135
+ const name = n === 1 ? `log-${day}.md` : `log-${day}-${n}.md`;
136
+ const rel = `${WIKI_LOG_CONSTANTS.ARCHIVE_DIR}/${name}`;
137
+ if (!existsSync(path.join(vaultPath, rel)))
138
+ return rel;
139
+ }
140
+ }
141
+ }
142
+ //# sourceMappingURL=wiki-log-rotation.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-log-rotation.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-log-rotation.service.ts"],"names":[],"mappings":"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"}