crewly 1.20.356 → 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.
- package/config/constants.ts +11 -0
- package/dist/backend/backend/src/constants.d.ts +254 -17
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +257 -17
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +70 -4
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +27 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
- package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +26 -2
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +9 -0
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +16 -0
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +126 -11
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts +150 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js +319 -0
- package/dist/backend/backend/src/services/memory/agent-memory-refresh.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +9 -7
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +19 -17
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/memory.service.js +11 -0
- package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js +302 -0
- package/dist/backend/backend/src/services/memory/startup-briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts +24 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js +54 -3
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +9 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +16 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts +30 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js +48 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-prefixes.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +8 -0
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +29 -8
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +27 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +78 -24
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts +23 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +38 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/slack/agent-coordination.d.ts +119 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.js +174 -0
- package/dist/backend/backend/src/services/slack/agent-coordination.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +619 -9
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +49 -12
- package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts +21 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-chat.js +54 -2
- package/dist/backend/backend/src/services/team-move/team-move-chat.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts +9 -4
- package/dist/backend/backend/src/services/team-move/team-move-exporter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js +32 -10
- package/dist/backend/backend/src/services/team-move/team-move-exporter.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts +19 -0
- package/dist/backend/backend/src/services/team-move/team-move-importer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-importer.js +78 -3
- package/dist/backend/backend/src/services/team-move/team-move-importer.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-runtime.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js +8 -0
- package/dist/backend/backend/src/services/team-move/team-move-runtime.js.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts +106 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.js +212 -0
- package/dist/backend/backend/src/services/team-move/team-move-transcripts.js.map +1 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts +20 -0
- package/dist/backend/backend/src/services/team-move/team-move.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/team-move/team-move.types.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -2
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +11 -4
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +3 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +4 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +4 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js +75 -7
- package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts +116 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js +227 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-compile.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js +222 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts +93 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js +142 -0
- package/dist/backend/backend/src/services/wiki/wiki-log-rotation.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts +104 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js +192 -0
- package/dist/backend/backend/src/services/wiki/wiki-maintenance.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts +3 -2
- package/dist/backend/backend/src/services/wiki/wiki-query.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js +23 -39
- package/dist/backend/backend/src/services/wiki/wiki-query.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts +105 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js +195 -0
- package/dist/backend/backend/src/services/wiki/wiki-queue-drain.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +3 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js +96 -25
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js +17 -1
- package/dist/backend/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +11 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +11 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +254 -17
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +257 -17
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +27 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +34 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +69 -13
- package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +9 -0
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +16 -0
- package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +44 -3
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +126 -11
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +2 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +9 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/memory.service.js +11 -0
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts +104 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js +302 -0
- package/dist/cli/backend/src/services/memory/startup-briefing.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +33 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +69 -4
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/agent-coordination.d.ts +119 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.js +174 -0
- package/dist/cli/backend/src/services/slack/agent-coordination.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +167 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +619 -9
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +22 -0
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +49 -12
- package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +7 -0
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +25 -4
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +33 -4
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js +75 -7
- package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts +142 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js +222 -0
- package/dist/cli/backend/src/services/wiki/wiki-log-entries.js.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.js +105 -0
- package/dist/cli/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
- package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts +28 -5
- package/dist/cli/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-search.service.js +96 -25
- package/dist/cli/backend/src/services/wiki/wiki-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts +11 -0
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.d.ts.map +1 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js +17 -1
- package/dist/cli/backend/src/services/wiki/wiki-vault-walk.js.map +1 -1
- package/dist/cli/config/constants.d.ts +11 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +11 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiMaintenanceService — the scheduler behind log hygiene (#1345).
|
|
3
|
+
*
|
|
4
|
+
* One hourly tick:
|
|
5
|
+
* - every tick: a queue drain pass ({@link WikiQueueDrainService});
|
|
6
|
+
* - once per day (and on the first tick after boot when the last daily
|
|
7
|
+
* pass is older than a day): log rotation then digest compile for every
|
|
8
|
+
* discovered vault.
|
|
9
|
+
*
|
|
10
|
+
* The first tick runs `MAINTENANCE_BOOT_DELAY_MS` after `start()` so boot
|
|
11
|
+
* I/O settles first. State (last daily pass) lives in
|
|
12
|
+
* `CREWLY_HOME/wiki-maintenance-state.json`. `CREWLY_WIKI_MAINTENANCE=false`
|
|
13
|
+
* disables the whole thing. Every step is non-fatal and logged.
|
|
14
|
+
*
|
|
15
|
+
* @module services/wiki/wiki-maintenance.service
|
|
16
|
+
*/
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
19
|
+
import { WIKI_LOG_CONSTANTS } from '../../constants.js';
|
|
20
|
+
import { atomicWriteJson, safeReadJson, ensureDir } from '../../utils/file-io.utils.js';
|
|
21
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
22
|
+
import { discoverWikiVaults } from './wiki-bookkeep-trigger.service.js';
|
|
23
|
+
import { WikiLogRotationService } from './wiki-log-rotation.service.js';
|
|
24
|
+
import { WikiLogCompileService } from './wiki-log-compile.service.js';
|
|
25
|
+
import { WikiQueueDrainService } from './wiki-queue-drain.service.js';
|
|
26
|
+
/**
|
|
27
|
+
* Hourly wiki maintenance scheduler. Start at boot, stop at shutdown.
|
|
28
|
+
*/
|
|
29
|
+
export class WikiMaintenanceService {
|
|
30
|
+
static instance = null;
|
|
31
|
+
logger;
|
|
32
|
+
intervalMs;
|
|
33
|
+
dailyMs;
|
|
34
|
+
bootDelayMs;
|
|
35
|
+
statePath;
|
|
36
|
+
discoverRoots;
|
|
37
|
+
rotation;
|
|
38
|
+
compile;
|
|
39
|
+
drain;
|
|
40
|
+
nowFn;
|
|
41
|
+
dryRun;
|
|
42
|
+
timer = null;
|
|
43
|
+
bootTimer = null;
|
|
44
|
+
running = false;
|
|
45
|
+
state = { lastDailyAt: null };
|
|
46
|
+
stateLoaded = false;
|
|
47
|
+
constructor(opts = {}) {
|
|
48
|
+
this.logger = LoggerService.getInstance().createComponentLogger('WikiMaintenance');
|
|
49
|
+
this.intervalMs = opts.intervalMs ?? WIKI_LOG_CONSTANTS.MAINTENANCE_INTERVAL_MS;
|
|
50
|
+
this.dailyMs = opts.dailyMs ?? WIKI_LOG_CONSTANTS.MAINTENANCE_DAILY_MS;
|
|
51
|
+
this.bootDelayMs = opts.bootDelayMs ?? WIKI_LOG_CONSTANTS.MAINTENANCE_BOOT_DELAY_MS;
|
|
52
|
+
this.statePath = opts.statePath === null ? null : opts.statePath ?? path.join(getCrewlyHomePath(), WIKI_LOG_CONSTANTS.MAINTENANCE_STATE_FILE);
|
|
53
|
+
this.discoverRoots = opts.discoverRoots ?? discoverWikiVaults;
|
|
54
|
+
this.rotation = opts.rotation ?? WikiLogRotationService.getInstance();
|
|
55
|
+
this.compile = opts.compile ?? WikiLogCompileService.getInstance();
|
|
56
|
+
this.drain = opts.drain ?? WikiQueueDrainService.getInstance();
|
|
57
|
+
this.nowFn = opts.now ?? (() => Date.now());
|
|
58
|
+
this.dryRun = opts.dryRun === true;
|
|
59
|
+
}
|
|
60
|
+
static getInstance() {
|
|
61
|
+
return this.instance;
|
|
62
|
+
}
|
|
63
|
+
/** Wire / detach the production singleton. */
|
|
64
|
+
static setInstance(next) {
|
|
65
|
+
if (this.instance && this.instance !== next)
|
|
66
|
+
this.instance.stop();
|
|
67
|
+
this.instance = next;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Begin ticking. Idempotent. Returns false when the kill switch is set.
|
|
71
|
+
*
|
|
72
|
+
* @returns Whether the scheduler started
|
|
73
|
+
*/
|
|
74
|
+
start() {
|
|
75
|
+
if (this.timer)
|
|
76
|
+
return true;
|
|
77
|
+
if (process.env[WIKI_LOG_CONSTANTS.MAINTENANCE_ENV_KILL_SWITCH] === 'false') {
|
|
78
|
+
this.logger.warn(`WikiMaintenance disabled via ${WIKI_LOG_CONSTANTS.MAINTENANCE_ENV_KILL_SWITCH}=false — not starting`);
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
this.bootTimer = setTimeout(() => {
|
|
82
|
+
this.bootTimer = null;
|
|
83
|
+
void this.tick();
|
|
84
|
+
}, this.bootDelayMs);
|
|
85
|
+
this.bootTimer.unref?.();
|
|
86
|
+
this.timer = setInterval(() => void this.tick(), this.intervalMs);
|
|
87
|
+
this.timer.unref?.();
|
|
88
|
+
this.logger.info('WikiMaintenance started', { intervalMs: this.intervalMs, dailyMs: this.dailyMs, bootDelayMs: this.bootDelayMs, dryRun: this.dryRun });
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/** Stop ticking. Safe to call more than once. */
|
|
92
|
+
stop() {
|
|
93
|
+
if (this.bootTimer) {
|
|
94
|
+
clearTimeout(this.bootTimer);
|
|
95
|
+
this.bootTimer = null;
|
|
96
|
+
}
|
|
97
|
+
if (this.timer) {
|
|
98
|
+
clearInterval(this.timer);
|
|
99
|
+
this.timer = null;
|
|
100
|
+
this.logger.info('WikiMaintenance stopped');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether the daily pass is due.
|
|
105
|
+
*
|
|
106
|
+
* @returns True when no daily pass is recorded or it is older than `dailyMs`
|
|
107
|
+
*/
|
|
108
|
+
isDailyDue() {
|
|
109
|
+
if (!this.state.lastDailyAt)
|
|
110
|
+
return true;
|
|
111
|
+
const last = Date.parse(this.state.lastDailyAt);
|
|
112
|
+
return !Number.isFinite(last) || this.nowFn() - last >= this.dailyMs;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* One tick: drain, then the daily pass when due. Public for tests and
|
|
116
|
+
* an on-demand run.
|
|
117
|
+
*
|
|
118
|
+
* @param opts - `force` runs the daily pass whether or not it is due
|
|
119
|
+
* @returns What ran
|
|
120
|
+
*/
|
|
121
|
+
async tick(opts = {}) {
|
|
122
|
+
const result = { drain: null };
|
|
123
|
+
if (this.running) {
|
|
124
|
+
this.logger.debug('WikiMaintenance tick already running — skipping overlap');
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
this.running = true;
|
|
128
|
+
try {
|
|
129
|
+
await this.loadState();
|
|
130
|
+
try {
|
|
131
|
+
result.drain = await this.drain.drain({ dryRun: this.dryRun, now: this.nowFn() });
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
this.logger.warn('WikiMaintenance: drain failed (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
|
|
135
|
+
}
|
|
136
|
+
if (!opts.force && !this.isDailyDue()) {
|
|
137
|
+
result.skippedDaily = 'not_due';
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
const vaults = await this.discoverRoots();
|
|
141
|
+
const now = this.nowFn();
|
|
142
|
+
const rotated = await this.rotation.rotateAll(vaults, { dryRun: this.dryRun, now });
|
|
143
|
+
const compiled = await this.compile.compileAll(vaults, { dryRun: this.dryRun, now });
|
|
144
|
+
result.daily = { vaults, rotated, compiled };
|
|
145
|
+
this.logger.info('WikiMaintenance daily pass', {
|
|
146
|
+
dryRun: this.dryRun,
|
|
147
|
+
vaults: vaults.length,
|
|
148
|
+
rotated: rotated.filter((r) => r.rotated).map((r) => ({ vault: r.vaultPath, bytes: r.bytes, entries: r.entries, carried: r.carried, archive: r.archivePath })),
|
|
149
|
+
compiled: compiled.filter((c) => c.compiled).map((c) => ({ vault: c.vaultPath, page: c.pagePath, entries: c.entriesCompiled })),
|
|
150
|
+
});
|
|
151
|
+
if (!this.dryRun) {
|
|
152
|
+
this.state = { lastDailyAt: new Date(now).toISOString() };
|
|
153
|
+
await this.saveState();
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
this.logger.warn('WikiMaintenance tick failed (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
this.running = false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async loadState() {
|
|
166
|
+
if (this.stateLoaded)
|
|
167
|
+
return;
|
|
168
|
+
this.stateLoaded = true;
|
|
169
|
+
if (!this.statePath)
|
|
170
|
+
return;
|
|
171
|
+
try {
|
|
172
|
+
const data = await safeReadJson(this.statePath, null);
|
|
173
|
+
if (data && typeof data.lastDailyAt === 'string')
|
|
174
|
+
this.state = { lastDailyAt: data.lastDailyAt };
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
this.logger.warn('WikiMaintenance: failed to load state (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async saveState() {
|
|
181
|
+
if (!this.statePath)
|
|
182
|
+
return;
|
|
183
|
+
try {
|
|
184
|
+
await ensureDir(path.dirname(this.statePath));
|
|
185
|
+
await atomicWriteJson(this.statePath, this.state);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
this.logger.warn('WikiMaintenance: failed to persist state (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=wiki-maintenance.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-maintenance.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-maintenance.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -142,8 +142,9 @@ export declare class WikiQueryService {
|
|
|
142
142
|
* Rank the vault's `llm-curated/` pages by Okapi BM25 against the query,
|
|
143
143
|
* reusing {@link WikiSearchService.searchCorpus} so the agent-facing
|
|
144
144
|
* skill scores identically to the wiki UI search. Seed files (index,
|
|
145
|
-
* log) are excluded;
|
|
146
|
-
*
|
|
145
|
+
* log) are excluded as files; the log's recent entries take part one by
|
|
146
|
+
* one with a lower weight (#1345). Superseded/invisible/proposed pages
|
|
147
|
+
* are dropped by the search filters.
|
|
147
148
|
*
|
|
148
149
|
* @param vaultPath - Vault root
|
|
149
150
|
* @param query - Query text
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-query.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-query.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,8 @@ import { WikiIndexService } from './wiki-index.service.js';
|
|
|
30
30
|
import { WikiUsageService } from './wiki-usage.service.js';
|
|
31
31
|
import { parsePage, isVisibleTo } from './wiki-page.js';
|
|
32
32
|
import { walkCuratedPages, isSeedFile } from './wiki-vault-walk.js';
|
|
33
|
+
import { isLogEntryPath, isNoiseLogBody, parseLogEntries } from './wiki-log-entries.js';
|
|
34
|
+
import { WIKI_LOG_CONSTANTS } from '../../constants.js';
|
|
33
35
|
const DEFAULT_RECENT_LOG_ENTRIES = 20;
|
|
34
36
|
const DEFAULT_TOP_K_PAGES = 5;
|
|
35
37
|
const MAX_PAGE_BYTES = 8 * 1024; // truncate per-page excerpt
|
|
@@ -125,6 +127,7 @@ export class WikiQueryService {
|
|
|
125
127
|
'Cite pages by their relative path inside the vault.',
|
|
126
128
|
'Do not propose writes into any frozenPaths — refuse or redirect to llm-curated/.',
|
|
127
129
|
'candidatePages.excerpt is truncated; `pages` returns full content.',
|
|
130
|
+
`A candidate whose path is \`${WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH}${WIKI_LOG_CONSTANTS.ENTRY_PATH_SEPARATOR}<timestamp>\` is one recent log entry (a learning nobody turned into a page yet); its excerpt is the whole entry — cite it as "log entry <timestamp>", it cannot be requested through \`pages\`.`,
|
|
128
131
|
'Pages marked superseded are hidden; ask with includeSuperseded when you need the history of a judgement.',
|
|
129
132
|
'The recentLog is append-only audit; never propose rewrites to its content.',
|
|
130
133
|
'If nothing here answers the question, say so — that miss is recorded as a capture gap.',
|
|
@@ -184,7 +187,7 @@ export class WikiQueryService {
|
|
|
184
187
|
* <body lines>
|
|
185
188
|
*/
|
|
186
189
|
async readRecentLog(vaultPath, limit) {
|
|
187
|
-
const logPath = path.join(vaultPath,
|
|
190
|
+
const logPath = path.join(vaultPath, WIKI_LOG_CONSTANTS.LOG_RELATIVE_PATH);
|
|
188
191
|
let raw;
|
|
189
192
|
try {
|
|
190
193
|
raw = await fs.readFile(logPath, 'utf8');
|
|
@@ -192,46 +195,21 @@ export class WikiQueryService {
|
|
|
192
195
|
catch {
|
|
193
196
|
return [];
|
|
194
197
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
ts: m[1],
|
|
203
|
-
sourceType: m[2],
|
|
204
|
-
caller: m[3].trim(),
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
for (let i = 0; i < matches.length; i++) {
|
|
208
|
-
const start = matches[i].idx;
|
|
209
|
-
const end = i + 1 < matches.length ? matches[i + 1].idx : raw.length;
|
|
210
|
-
const block = raw.slice(start, end);
|
|
211
|
-
const refMatch = block.match(/^ref:\s*(.+)$/m);
|
|
212
|
-
// Body is everything after the `ref:` line (skipping the blank line).
|
|
213
|
-
let body = '';
|
|
214
|
-
if (refMatch) {
|
|
215
|
-
const refLineEnd = block.indexOf(refMatch[0]) + refMatch[0].length;
|
|
216
|
-
body = block.slice(refLineEnd).replace(/^\n+/, '').trim();
|
|
217
|
-
}
|
|
218
|
-
entries.push({
|
|
219
|
-
timestamp: matches[i].ts,
|
|
220
|
-
sourceType: matches[i].sourceType,
|
|
221
|
-
caller: matches[i].caller,
|
|
222
|
-
ref: refMatch ? refMatch[1].trim() : '',
|
|
223
|
-
body,
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
// Most-recent-first; cap to requested limit.
|
|
227
|
-
return entries.slice(-limit).reverse();
|
|
198
|
+
// Content-free templated entries (auto-learning transitions) are not
|
|
199
|
+
// worth a reader's context (#1345); the rest, most-recent-first.
|
|
200
|
+
const entries = parseLogEntries(raw).filter((e) => !isNoiseLogBody(e.body));
|
|
201
|
+
return entries
|
|
202
|
+
.slice(-limit)
|
|
203
|
+
.reverse()
|
|
204
|
+
.map((e) => ({ timestamp: e.timestamp, sourceType: e.sourceType, caller: e.caller, ref: e.ref, body: e.body }));
|
|
228
205
|
}
|
|
229
206
|
/**
|
|
230
207
|
* Rank the vault's `llm-curated/` pages by Okapi BM25 against the query,
|
|
231
208
|
* reusing {@link WikiSearchService.searchCorpus} so the agent-facing
|
|
232
209
|
* skill scores identically to the wiki UI search. Seed files (index,
|
|
233
|
-
* log) are excluded;
|
|
234
|
-
*
|
|
210
|
+
* log) are excluded as files; the log's recent entries take part one by
|
|
211
|
+
* one with a lower weight (#1345). Superseded/invisible/proposed pages
|
|
212
|
+
* are dropped by the search filters.
|
|
235
213
|
*
|
|
236
214
|
* @param vaultPath - Vault root
|
|
237
215
|
* @param query - Query text
|
|
@@ -240,13 +218,19 @@ export class WikiQueryService {
|
|
|
240
218
|
* @returns Candidates with truncated excerpts
|
|
241
219
|
*/
|
|
242
220
|
async findCandidatePages(vaultPath, query, topK, filters) {
|
|
243
|
-
const
|
|
221
|
+
const search = WikiSearchService.getInstance();
|
|
222
|
+
const pages = (await walkCuratedPages(vaultPath)).filter((p) => !isSeedFile(p.relativePath));
|
|
223
|
+
const entries = await search.collectLogEntryDocs(vaultPath);
|
|
224
|
+
const docs = [...pages, ...entries];
|
|
244
225
|
if (docs.length === 0)
|
|
245
226
|
return [];
|
|
246
|
-
const
|
|
227
|
+
const inline = new Map(entries.map((d) => [d.relativePath, d.content ?? '']));
|
|
228
|
+
const hits = await search.searchCorpus(vaultPath, docs, query, filters);
|
|
247
229
|
const candidates = [];
|
|
248
230
|
for (const hit of hits.slice(0, topK)) {
|
|
249
|
-
const excerpt =
|
|
231
|
+
const excerpt = isLogEntryPath(hit.relativePath)
|
|
232
|
+
? inline.get(hit.relativePath) ?? ''
|
|
233
|
+
: await this.readExcerpt(path.join(vaultPath, hit.relativePath));
|
|
250
234
|
candidates.push({ path: hit.relativePath, excerpt, score: hit.score });
|
|
251
235
|
}
|
|
252
236
|
return candidates;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-query.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAA0B,MAAM,0BAA0B,CAAC;AAE/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,WAAW,EAA4B,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-query.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-query.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiQueueDrainService — the code consumer of `~/.crewly/wiki-queue/`.
|
|
3
|
+
*
|
|
4
|
+
* Why (#1345): the queue's only consumer was `WikiWorkItemBridgeService`,
|
|
5
|
+
* which turns pending items into WorkItems for an agent to classify with
|
|
6
|
+
* its LLM. With the bridge switched off (`WIKI_BRIDGE_ENABLED=false`)
|
|
7
|
+
* nothing claimed anything and the sweep inside the same tick never ran,
|
|
8
|
+
* so 219 items sat pending for up to a month. Even with the bridge on, a
|
|
9
|
+
* drain cost a model turn per batch and depended on an agent picking the
|
|
10
|
+
* WorkItem up.
|
|
11
|
+
*
|
|
12
|
+
* What this does instead, without an LLM: a pending item that nobody has
|
|
13
|
+
* claimed within `DRAIN_MIN_AGE_MS` is filed into its vault's `log.md`
|
|
14
|
+
* (the "maybe useful" tier that search and the weekly digest now read),
|
|
15
|
+
* with the queueing agent as caller, the original source type and ref, and
|
|
16
|
+
* the agent's stated reason. The item is marked processed with the log as
|
|
17
|
+
* target. Content-free items are marked skipped. Items whose vault has no
|
|
18
|
+
* `SCHEMA.md` are left alone (the sweep expires them to the dead-letter
|
|
19
|
+
* folder after `MAX_ITEM_AGE_MS`). The queue sweep runs here too, so claim
|
|
20
|
+
* release, expiry and the stale alert no longer depend on the bridge.
|
|
21
|
+
*
|
|
22
|
+
* Idempotent: the queue's status transitions guard every step (an item is
|
|
23
|
+
* claimed before it is written, and only claimed items are marked). Rate
|
|
24
|
+
* limited: at most `DRAIN_BATCH_SIZE` items per pass with a short pause
|
|
25
|
+
* between items. One summary log line per pass.
|
|
26
|
+
*
|
|
27
|
+
* @module services/wiki/wiki-queue-drain.service
|
|
28
|
+
*/
|
|
29
|
+
import { WikiQueueService, type WikiQueueSweepResult } from './wiki-queue.service.js';
|
|
30
|
+
import { WikiIngestService } from './wiki-ingest.service.js';
|
|
31
|
+
/** Options for {@link WikiQueueDrainService.drain}. */
|
|
32
|
+
export interface WikiQueueDrainOptions {
|
|
33
|
+
/** Report only; claim/write/mark nothing, run no sweep. */
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
/** Clock (tests). */
|
|
36
|
+
now?: number;
|
|
37
|
+
/** Batch size override (tests). */
|
|
38
|
+
limit?: number;
|
|
39
|
+
/** Minimum pending age override (tests). */
|
|
40
|
+
minAgeMs?: number;
|
|
41
|
+
/** Pause between items override (tests; 0 = none). */
|
|
42
|
+
pauseMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/** Outcome of one drain pass. */
|
|
45
|
+
export interface WikiQueueDrainResult {
|
|
46
|
+
/** Pending items seen before filtering. */
|
|
47
|
+
pending: number;
|
|
48
|
+
/** Items younger than the minimum age (left for an agent). */
|
|
49
|
+
tooYoung: number;
|
|
50
|
+
/** Items whose vault has no SCHEMA.md (left for the sweep). */
|
|
51
|
+
noVault: number;
|
|
52
|
+
/** Items written into a log and marked processed. */
|
|
53
|
+
filed: number;
|
|
54
|
+
/** Items marked skipped (content-free, or refused by the confidentiality gate). */
|
|
55
|
+
skipped: number;
|
|
56
|
+
/** Items that hit an unexpected error (left claimed; the sweep releases them). */
|
|
57
|
+
failed: number;
|
|
58
|
+
/** Items left pending because the batch cap was reached. */
|
|
59
|
+
deferred: number;
|
|
60
|
+
/** Sweep outcome (absent in a dry run). */
|
|
61
|
+
sweep?: Pick<WikiQueueSweepResult, 'releasedClaims'> & {
|
|
62
|
+
expired: number;
|
|
63
|
+
backlogVaults: number;
|
|
64
|
+
};
|
|
65
|
+
dryRun: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Files aged pending queue items into their vault log. Singleton.
|
|
69
|
+
*/
|
|
70
|
+
export declare class WikiQueueDrainService {
|
|
71
|
+
private readonly queue;
|
|
72
|
+
private readonly ingest;
|
|
73
|
+
private static instance;
|
|
74
|
+
private readonly logger;
|
|
75
|
+
private running;
|
|
76
|
+
constructor(queue?: WikiQueueService, ingest?: WikiIngestService);
|
|
77
|
+
static getInstance(): WikiQueueDrainService;
|
|
78
|
+
/** Test-only reset. */
|
|
79
|
+
static _resetForTesting(): void;
|
|
80
|
+
/**
|
|
81
|
+
* One drain pass over the whole queue, oldest items first.
|
|
82
|
+
*
|
|
83
|
+
* @param opts - Dry run, clock, batch and age overrides
|
|
84
|
+
* @returns Counts of what happened
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const r = await WikiQueueDrainService.getInstance().drain({ dryRun: true });
|
|
89
|
+
* // r.filed is how many items a real pass would file now
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
drain(opts?: WikiQueueDrainOptions): Promise<WikiQueueDrainResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Claim one item and file it: a content-free item is skipped; otherwise
|
|
95
|
+
* the content plus the agent's reason go into the vault log and the item
|
|
96
|
+
* is marked processed. A confidentiality refusal marks it skipped with
|
|
97
|
+
* the gate's reason (the value is never logged). Any other error leaves
|
|
98
|
+
* the item claimed for the sweep to release.
|
|
99
|
+
*
|
|
100
|
+
* @param item - Pending queue item
|
|
101
|
+
* @param result - Pass counters to update
|
|
102
|
+
*/
|
|
103
|
+
private file;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=wiki-queue-drain.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-queue-drain.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-queue-drain.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,EAAE,gBAAgB,EAAsB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAClG,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAM9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAS;gBAGL,KAAK,GAAE,gBAAiD,EACxD,MAAM,GAAE,iBAAmD;IAK9E,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAK3C,uBAAuB;IACvB,MAAM,CAAC,gBAAgB,IAAI,IAAI;IAI/B;;;;;;;;;;;OAWG;IACG,KAAK,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsE5E;;;;;;;;;OASG;YACW,IAAI;CAuCnB"}
|