crewly 1.8.9 → 1.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/constants.d.ts.map +1 -0
- package/config/index.d.ts.map +1 -0
- package/config/roles/_common/memory-instructions.md +6 -5
- package/config/roles/_common/wiki-instructions.md +49 -0
- package/config/roles/architect/prompt.md +2 -2
- package/config/roles/backend-developer/prompt.md +2 -2
- package/config/roles/designer/prompt.md +2 -2
- package/config/roles/developer/prompt.md +2 -2
- package/config/roles/frontend-developer/prompt.md +2 -2
- package/config/roles/fullstack-dev/prompt.md +2 -2
- package/config/roles/generalist/prompt.md +2 -2
- package/config/roles/ops/prompt.md +2 -2
- package/config/roles/orchestrator/prompt.md +135 -11
- package/config/roles/product-manager/prompt.md +2 -2
- package/config/roles/qa/prompt.md +2 -2
- package/config/roles/qa-engineer/prompt.md +2 -2
- package/config/roles/researcher/prompt.md +15 -6
- package/config/roles/sales/prompt.md +2 -2
- package/config/roles/support/prompt.md +2 -2
- package/config/roles/team-leader/prompt.md +17 -2
- package/config/roles/tpm/prompt.md +2 -2
- package/config/roles/ux-designer/prompt.md +2 -2
- package/config/skills/orchestrator/wiki-cleanup/SKILL.md +89 -0
- package/config/skills/orchestrator/wiki-cleanup/execute.sh +139 -0
- package/config/skills/orchestrator/wiki-lint/SKILL.md +75 -0
- package/config/skills/orchestrator/wiki-lint/execute.sh +66 -0
- package/config/skills/orchestrator/wiki-migrate/SKILL.md +103 -0
- package/config/skills/orchestrator/wiki-migrate/execute.sh +82 -0
- package/config/skills/orchestrator/wiki-process-queue/SKILL.md +9 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +169 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1779 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +18 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +63 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +5 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +109 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +419 -4
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +11 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +78 -3
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/index.js.orc-bak-20260529 +3130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +513 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +1568 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +86 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +147 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +279 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +340 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +1176 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +79 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +145 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +16 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +16 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +141 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +310 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +1937 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +1 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +171 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js +725 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +50 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +45 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- 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 +34 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +118 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +326 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts +72 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +186 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +27 -4
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +133 -10
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -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 +15 -4
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +160 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +399 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +182 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +505 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +232 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +1416 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +102 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +104 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +229 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +90 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js +190 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +164 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +675 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +65 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
- package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/backend/backend/src/types/cron-task.types.d.ts +16 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +111 -0
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/esm-require.utils.js +124 -0
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +220 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +37 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +56 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +91 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +304 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +115 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +215 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +78 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.js +179 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +1 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +331 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.js +814 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +1 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +171 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.js +725 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +45 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
- package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/cli/cli/src/index.js +0 -0
- package/frontend/dist/assets/{index-db3f5041.css → index-068bb4f6.css} +10 -1
- package/frontend/dist/assets/index-c24ceb15.js +4960 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/config/skills/agent/core/query-knowledge/SKILL.md +0 -87
- package/config/skills/agent/core/query-knowledge/execute.sh +0 -30
- package/config/skills/orchestrator/query-knowledge/SKILL.md +0 -75
- package/config/skills/orchestrator/query-knowledge/execute.sh +0 -30
- package/frontend/dist/assets/index-cc115bb4.js +0 -4926
|
@@ -116,10 +116,18 @@ export class WikiBookkeepService {
|
|
|
116
116
|
}
|
|
117
117
|
const duplicateCandidates = this.findDuplicateClusters(pages);
|
|
118
118
|
const queueStats = await this.queue.getStats(input.vaultPath);
|
|
119
|
-
|
|
119
|
+
// Net-new is the robust fire signal. When a baseline is supplied, count
|
|
120
|
+
// only pages added since it; otherwise fall back to the mtime window.
|
|
121
|
+
// NOTE: duplicate clusters are surfaced in `recommendations` but no longer
|
|
122
|
+
// force `shouldFire` — a standing set of filename clusters is not "new
|
|
123
|
+
// activity", so OR-ing it in made every non-trivial vault fire forever.
|
|
124
|
+
const netNewMdCount = input.baselineMdCount != null
|
|
125
|
+
? Math.max(0, totalMdCount - input.baselineMdCount)
|
|
126
|
+
: recentMdCount;
|
|
127
|
+
const shouldFire = netNewMdCount >= threshold;
|
|
120
128
|
const recommendations = this.buildRecommendations({
|
|
121
129
|
shouldFire,
|
|
122
|
-
|
|
130
|
+
netNewMdCount,
|
|
123
131
|
threshold,
|
|
124
132
|
duplicates: duplicateCandidates,
|
|
125
133
|
countsByFolder,
|
|
@@ -138,6 +146,7 @@ export class WikiBookkeepService {
|
|
|
138
146
|
shouldFire,
|
|
139
147
|
totalMdCount,
|
|
140
148
|
recentMdCount,
|
|
149
|
+
netNewMdCount,
|
|
141
150
|
countsByFolder,
|
|
142
151
|
duplicateCandidates,
|
|
143
152
|
staleCount,
|
|
@@ -148,6 +157,8 @@ export class WikiBookkeepService {
|
|
|
148
157
|
vault: input.vaultPath,
|
|
149
158
|
totalMd: totalMdCount,
|
|
150
159
|
recentMd: recentMdCount,
|
|
160
|
+
netNewMd: netNewMdCount,
|
|
161
|
+
baseline: input.baselineMdCount ?? null,
|
|
151
162
|
duplicates: duplicateCandidates.length,
|
|
152
163
|
shouldFire,
|
|
153
164
|
});
|
|
@@ -271,10 +282,10 @@ export class WikiBookkeepService {
|
|
|
271
282
|
buildRecommendations(args) {
|
|
272
283
|
const recs = [];
|
|
273
284
|
if (!args.shouldFire) {
|
|
274
|
-
recs.push(`Quiet vault — only ${args.
|
|
285
|
+
recs.push(`Quiet vault — only ${args.netNewMdCount} net-new md(s) since the last pass (threshold ${args.threshold}). No action required.`);
|
|
275
286
|
}
|
|
276
287
|
else {
|
|
277
|
-
recs.push(
|
|
288
|
+
recs.push(`${args.netNewMdCount} net-new md(s) since the last pass — at or above threshold (${args.threshold}). Consider a consolidation pass.`);
|
|
278
289
|
}
|
|
279
290
|
if (args.duplicates.length > 0) {
|
|
280
291
|
recs.push(`${args.duplicates.length} likely-duplicate cluster(s) detected. Review each with your LLM and call wiki-ingest with a consolidated body when you can merge.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-bookkeep.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,iBAAiB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"wiki-bookkeep.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-bookkeep.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiChatSubscriberService — listens on chat-v2's `chat_message` event
|
|
3
|
+
* and fires `WikiIngestService.ingest` for every user-authored message.
|
|
4
|
+
*
|
|
5
|
+
* Phase A (rules-only routing):
|
|
6
|
+
* senderType === 'user' → ingest into the Crewly project vault.
|
|
7
|
+
* senderType === 'agent' | 'system' → skip.
|
|
8
|
+
*
|
|
9
|
+
* Phase B (per spec §4.5) will replace the project-only routing with an
|
|
10
|
+
* LLM-driven gate that picks team / project / global per source.
|
|
11
|
+
*
|
|
12
|
+
* Failure mode is FIRE-AND-FORGET: a malformed message, missing schema,
|
|
13
|
+
* or filesystem error MUST NOT block the live chat flow. Errors are
|
|
14
|
+
* logged at warn-level and swallowed.
|
|
15
|
+
*
|
|
16
|
+
* @module services/wiki/wiki-chat-subscriber.service
|
|
17
|
+
*/
|
|
18
|
+
import type { ChatV2Service } from '../chat-v2/chat-v2.service.js';
|
|
19
|
+
import { WikiIngestService } from './wiki-ingest.service.js';
|
|
20
|
+
/**
|
|
21
|
+
* Shape we consume from chat-v2's `chat_message` payload. Kept narrow so
|
|
22
|
+
* we don't take a heavy structural dep on the wire DTO; matches the
|
|
23
|
+
* fields produced by `toMessageDTO` (chat-v2.service.ts:1537).
|
|
24
|
+
*/
|
|
25
|
+
interface MinimalChatMessageDTO {
|
|
26
|
+
id: string;
|
|
27
|
+
channelId: string;
|
|
28
|
+
senderType: 'user' | 'agent' | 'system';
|
|
29
|
+
senderId: string;
|
|
30
|
+
content: string;
|
|
31
|
+
contentType: string;
|
|
32
|
+
createdAt: string | number;
|
|
33
|
+
}
|
|
34
|
+
export interface WikiChatSubscriberOptions {
|
|
35
|
+
/** chat-v2 singleton — `getChatV2Service()` at composition root. */
|
|
36
|
+
chatService: ChatV2Service;
|
|
37
|
+
/** Absolute path to the project vault. Default falls back to env / well-known location. */
|
|
38
|
+
projectVaultPath?: string;
|
|
39
|
+
/** Optional override for tests. */
|
|
40
|
+
ingestService?: WikiIngestService;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Process-singleton subscriber. Call `start()` once at server boot,
|
|
44
|
+
* `stop()` at shutdown.
|
|
45
|
+
*/
|
|
46
|
+
export declare class WikiChatSubscriberService {
|
|
47
|
+
private readonly logger;
|
|
48
|
+
private readonly chatService;
|
|
49
|
+
private readonly projectVaultPath;
|
|
50
|
+
private readonly ingestService;
|
|
51
|
+
private boundHandler;
|
|
52
|
+
private started;
|
|
53
|
+
constructor(opts: WikiChatSubscriberOptions);
|
|
54
|
+
/**
|
|
55
|
+
* Subscribe to `chat_message`. Idempotent — calling start() twice
|
|
56
|
+
* leaves a single listener.
|
|
57
|
+
*/
|
|
58
|
+
start(): void;
|
|
59
|
+
/** Detach. Safe to call when not started. */
|
|
60
|
+
stop(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Handle a single chat message. Public for tests.
|
|
63
|
+
*/
|
|
64
|
+
handle(dto: MinimalChatMessageDTO): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Decide whether a chat-v2 message should drive a wiki write.
|
|
67
|
+
* Public for tests; logic is conservative — only ingest user-authored
|
|
68
|
+
* text messages, skip agents/system, mentions-only pings, and slash
|
|
69
|
+
* commands.
|
|
70
|
+
*/
|
|
71
|
+
isIngestable(dto: MinimalChatMessageDTO): boolean;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=wiki-chat-subscriber.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-chat-subscriber.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-chat-subscriber.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAsB,MAAM,0BAA0B,CAAC;AAEjF;;;;GAIG;AACH,UAAU,qBAAqB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,WAAW,EAAE,aAAa,CAAC;IAC3B,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,yBAAyB;IAO3C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAgBb,6CAA6C;IAC7C,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDvD;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO;CAYlD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiChatSubscriberService — listens on chat-v2's `chat_message` event
|
|
3
|
+
* and fires `WikiIngestService.ingest` for every user-authored message.
|
|
4
|
+
*
|
|
5
|
+
* Phase A (rules-only routing):
|
|
6
|
+
* senderType === 'user' → ingest into the Crewly project vault.
|
|
7
|
+
* senderType === 'agent' | 'system' → skip.
|
|
8
|
+
*
|
|
9
|
+
* Phase B (per spec §4.5) will replace the project-only routing with an
|
|
10
|
+
* LLM-driven gate that picks team / project / global per source.
|
|
11
|
+
*
|
|
12
|
+
* Failure mode is FIRE-AND-FORGET: a malformed message, missing schema,
|
|
13
|
+
* or filesystem error MUST NOT block the live chat flow. Errors are
|
|
14
|
+
* logged at warn-level and swallowed.
|
|
15
|
+
*
|
|
16
|
+
* @module services/wiki/wiki-chat-subscriber.service
|
|
17
|
+
*/
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
20
|
+
import { WikiIngestService, detectMessageShape } from './wiki-ingest.service.js';
|
|
21
|
+
/**
|
|
22
|
+
* Process-singleton subscriber. Call `start()` once at server boot,
|
|
23
|
+
* `stop()` at shutdown.
|
|
24
|
+
*/
|
|
25
|
+
export class WikiChatSubscriberService {
|
|
26
|
+
logger;
|
|
27
|
+
chatService;
|
|
28
|
+
projectVaultPath;
|
|
29
|
+
ingestService;
|
|
30
|
+
boundHandler = null;
|
|
31
|
+
started = false;
|
|
32
|
+
constructor(opts) {
|
|
33
|
+
this.logger = LoggerService.getInstance().createComponentLogger('WikiChatSubscriber');
|
|
34
|
+
this.chatService = opts.chatService;
|
|
35
|
+
this.projectVaultPath = opts.projectVaultPath ?? resolveDefaultProjectVaultPath();
|
|
36
|
+
this.ingestService = opts.ingestService ?? WikiIngestService.getInstance();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Subscribe to `chat_message`. Idempotent — calling start() twice
|
|
40
|
+
* leaves a single listener.
|
|
41
|
+
*/
|
|
42
|
+
start() {
|
|
43
|
+
if (this.started) {
|
|
44
|
+
this.logger.debug('start() called twice — ignoring');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.boundHandler = (dto) => {
|
|
48
|
+
// Fire-and-forget; any thrown error is logged + swallowed in handle().
|
|
49
|
+
void this.handle(dto);
|
|
50
|
+
};
|
|
51
|
+
this.chatService.on('chat_message', this.boundHandler);
|
|
52
|
+
this.started = true;
|
|
53
|
+
this.logger.info('WikiChatSubscriber started', {
|
|
54
|
+
vaultPath: this.projectVaultPath,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Detach. Safe to call when not started. */
|
|
58
|
+
stop() {
|
|
59
|
+
if (!this.started || !this.boundHandler)
|
|
60
|
+
return;
|
|
61
|
+
this.chatService.off('chat_message', this.boundHandler);
|
|
62
|
+
this.boundHandler = null;
|
|
63
|
+
this.started = false;
|
|
64
|
+
this.logger.info('WikiChatSubscriber stopped');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Handle a single chat message. Public for tests.
|
|
68
|
+
*/
|
|
69
|
+
async handle(dto) {
|
|
70
|
+
try {
|
|
71
|
+
if (!this.isIngestable(dto)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const ingestInput = {
|
|
75
|
+
vaultPath: this.projectVaultPath,
|
|
76
|
+
sourceType: 'user_chat',
|
|
77
|
+
sourceRef: `chat:${dto.channelId}:${dto.id}`,
|
|
78
|
+
sourceBody: dto.content,
|
|
79
|
+
callerSession: `user/${dto.senderId}`,
|
|
80
|
+
};
|
|
81
|
+
// Phase A rules-based promotion: decision-shaped chats land in
|
|
82
|
+
// BOTH log.md (audit) and llm-curated/decisions/<date>-<slug>.md
|
|
83
|
+
// (canonical). Phase B will replace `detectMessageShape` with an
|
|
84
|
+
// LLM gate per v2.1 §4.
|
|
85
|
+
const shape = detectMessageShape(dto.content);
|
|
86
|
+
if (shape === 'decision') {
|
|
87
|
+
const result = await this.ingestService.ingestDecision(ingestInput);
|
|
88
|
+
if (!result.log.ok) {
|
|
89
|
+
this.logger.warn('WikiChatSubscriber decision-log ingest refused', {
|
|
90
|
+
reason: result.log.reason,
|
|
91
|
+
messageId: dto.id,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (!result.decision.ok) {
|
|
95
|
+
this.logger.warn('WikiChatSubscriber decisions/ promotion refused', {
|
|
96
|
+
reason: result.decision.reason,
|
|
97
|
+
messageId: dto.id,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const outcome = await this.ingestService.ingest(ingestInput);
|
|
103
|
+
if (!outcome.ok) {
|
|
104
|
+
this.logger.warn('WikiChatSubscriber ingest refused', {
|
|
105
|
+
reason: outcome.reason,
|
|
106
|
+
messageId: dto.id,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
// Swallow — chat flow must not block on wiki write failures.
|
|
112
|
+
this.logger.warn('WikiChatSubscriber.handle threw (swallowed)', {
|
|
113
|
+
messageId: dto.id,
|
|
114
|
+
error: err.message,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Decide whether a chat-v2 message should drive a wiki write.
|
|
120
|
+
* Public for tests; logic is conservative — only ingest user-authored
|
|
121
|
+
* text messages, skip agents/system, mentions-only pings, and slash
|
|
122
|
+
* commands.
|
|
123
|
+
*/
|
|
124
|
+
isIngestable(dto) {
|
|
125
|
+
if (dto.senderType !== 'user')
|
|
126
|
+
return false;
|
|
127
|
+
if (!dto.content || dto.content.trim().length === 0)
|
|
128
|
+
return false;
|
|
129
|
+
// Skip slash commands — they're orc-controls, not knowledge.
|
|
130
|
+
if (dto.content.trimStart().startsWith('/'))
|
|
131
|
+
return false;
|
|
132
|
+
// chat-v2 defaults `contentType` to 'markdown' when sendMessage doesn't
|
|
133
|
+
// supply one (chat-v2.service.ts ~line 1240). Accept the two readable
|
|
134
|
+
// text-bearing types; reject binary/system flavors like 'system_note'.
|
|
135
|
+
const acceptable = new Set(['text', 'markdown']);
|
|
136
|
+
if (dto.contentType && !acceptable.has(dto.contentType))
|
|
137
|
+
return false;
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolve a sensible default vault path:
|
|
143
|
+
* 1. `CREWLY_PROJECT_VAULT_PATH` env var (explicit override)
|
|
144
|
+
* 2. `<cwd>/.crewly/wiki` if it exists
|
|
145
|
+
* 3. The Crewly repo's own project vault (the only one with SCHEMA.md today)
|
|
146
|
+
*/
|
|
147
|
+
function resolveDefaultProjectVaultPath() {
|
|
148
|
+
const fromEnv = process.env['CREWLY_PROJECT_VAULT_PATH'];
|
|
149
|
+
if (fromEnv && path.isAbsolute(fromEnv)) {
|
|
150
|
+
return fromEnv;
|
|
151
|
+
}
|
|
152
|
+
return path.join('/Users/yellowsunhy/Desktop/projects/crewly-projects/crewly', '.crewly/wiki');
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=wiki-chat-subscriber.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-chat-subscriber.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-chat-subscriber.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WikiCleanupService — detect + remove low-quality pages from a wiki vault.
|
|
3
|
+
*
|
|
4
|
+
* Origin: the 2026-05-27 migration dumped every agent's `memory.json`
|
|
5
|
+
* roleKnowledge entries as their own wiki page (~3,277 pages across 6
|
|
6
|
+
* project vaults). Many are stream-of-consciousness daily memory rather
|
|
7
|
+
* than team-level patterns. Symptom: each project vault has 500+ pages
|
|
8
|
+
* under `patterns/`, most low-quality (confidence < 0.5, verbatim memory
|
|
9
|
+
* dump shape). Karpathy's wiki spec says "frequently-read distilled
|
|
10
|
+
* knowledge" — 500 stream-of-consciousness pages violates that.
|
|
11
|
+
*
|
|
12
|
+
* Detection is **rule-based + mechanical** (OSS does this). The actual
|
|
13
|
+
* keep/delete decision can be deferred to an agent via the bridge —
|
|
14
|
+
* this service exposes both `scan(rules)` (mechanical candidate list)
|
|
15
|
+
* and `apply(pages)` (executes the explicit page list provided).
|
|
16
|
+
*
|
|
17
|
+
* Design rules (mirror WikiMigrateService):
|
|
18
|
+
* - Default DRY-RUN. Caller must pass `{ apply: true }` to delete.
|
|
19
|
+
* - Idempotent + reversible. Every deleted page body + frontmatter is
|
|
20
|
+
* archived to `<vault>/.wiki-cleanup-archive.json` BEFORE the file
|
|
21
|
+
* is removed. Re-running with the same input is a no-op.
|
|
22
|
+
* - Migrate manifest is updated so the SAME source entry is not
|
|
23
|
+
* re-imported by the next `wiki-migrate --apply` (would defeat the
|
|
24
|
+
* cleanup).
|
|
25
|
+
* - LEGACY FILES (`memory.json`, `.crewly/knowledge/*`) are NEVER
|
|
26
|
+
* touched. The cleanup ONLY removes pages from the wiki vault.
|
|
27
|
+
* - Frozen folders (`memory/`, `sop/`, `sop-overrides/`, `okr/`,
|
|
28
|
+
* `decisions/manual/`) are never scanned.
|
|
29
|
+
*
|
|
30
|
+
* @module services/wiki/wiki-cleanup.service
|
|
31
|
+
*/
|
|
32
|
+
export declare const WIKI_CLEANUP_ARCHIVE_FILENAME = ".wiki-cleanup-archive.json";
|
|
33
|
+
export declare const WIKI_CLEANUP_ARCHIVE_VERSION = 1;
|
|
34
|
+
export interface WikiCleanupRules {
|
|
35
|
+
/** Drop pages whose frontmatter `confidence` is below this. Default 0.5. */
|
|
36
|
+
minConfidence?: number;
|
|
37
|
+
/** Drop pages whose `migrated_from` starts with `agent/`. Default true. */
|
|
38
|
+
dropAgentMemoryDumps?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Keep at most N pages per `original_author`. Pages outside the top-N
|
|
41
|
+
* (sorted by confidence desc, then original_date desc) are flagged.
|
|
42
|
+
* Default: 0 (cap disabled).
|
|
43
|
+
*/
|
|
44
|
+
maxPerAgent?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface WikiCleanupCandidate {
|
|
47
|
+
/** Path relative to the vault root (e.g. `llm-curated/patterns/x.md`). */
|
|
48
|
+
relPath: string;
|
|
49
|
+
/** Why this page is a cleanup candidate (one or more rule names). */
|
|
50
|
+
reasons: string[];
|
|
51
|
+
/** Parsed `confidence` (if present in frontmatter), used for ranking. */
|
|
52
|
+
confidence: number | null;
|
|
53
|
+
/** Parsed `original_author` (if present), used by the per-agent cap. */
|
|
54
|
+
originalAuthor: string | null;
|
|
55
|
+
/** Parsed `migrated_from` (if present), used to invalidate manifest entry. */
|
|
56
|
+
migratedFrom: string | null;
|
|
57
|
+
/** Parsed `original_id` (if present), used to invalidate manifest entry. */
|
|
58
|
+
originalId: string | null;
|
|
59
|
+
/** File size in bytes. */
|
|
60
|
+
bytes: number;
|
|
61
|
+
}
|
|
62
|
+
export interface WikiCleanupScanInput {
|
|
63
|
+
/** Absolute vault path (the dir containing `SCHEMA.md`). */
|
|
64
|
+
vaultPath: string;
|
|
65
|
+
/** Rule overrides; defaults applied for any missing key. */
|
|
66
|
+
rules?: WikiCleanupRules;
|
|
67
|
+
}
|
|
68
|
+
export interface WikiCleanupScanResult {
|
|
69
|
+
ok: true;
|
|
70
|
+
vaultPath: string;
|
|
71
|
+
/** Pages flagged by at least one rule. Capped at {@link SCAN_HARD_CAP}. */
|
|
72
|
+
candidates: WikiCleanupCandidate[];
|
|
73
|
+
/** Total pages walked (whether candidate or not). */
|
|
74
|
+
scannedCount: number;
|
|
75
|
+
/** Did the scan hit {@link SCAN_HARD_CAP}? */
|
|
76
|
+
truncated: boolean;
|
|
77
|
+
/** Per-reason counts for quick eyeballing. */
|
|
78
|
+
summary: {
|
|
79
|
+
lowConfidence: number;
|
|
80
|
+
agentMemoryDump: number;
|
|
81
|
+
perAgentCapped: number;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface WikiCleanupApplyInput {
|
|
85
|
+
vaultPath: string;
|
|
86
|
+
/**
|
|
87
|
+
* Explicit list of relative paths to delete. The bridge / agent passes
|
|
88
|
+
* this in after deciding which scan candidates to actually act on. We
|
|
89
|
+
* deliberately do NOT take a rule set here — `apply` is the mechanical
|
|
90
|
+
* deletion step, the decision happened upstream.
|
|
91
|
+
*/
|
|
92
|
+
pages: string[];
|
|
93
|
+
}
|
|
94
|
+
export interface WikiCleanupApplyResult {
|
|
95
|
+
ok: true;
|
|
96
|
+
vaultPath: string;
|
|
97
|
+
/** Pages actually deleted in this run. */
|
|
98
|
+
deleted: string[];
|
|
99
|
+
/** Pages requested but not deleted (missing on disk, already archived, etc). */
|
|
100
|
+
skipped: Array<{
|
|
101
|
+
relPath: string;
|
|
102
|
+
reason: 'not_found' | 'outside_vault' | 'frozen';
|
|
103
|
+
}>;
|
|
104
|
+
archivePath: string;
|
|
105
|
+
/** Migrate manifest entries removed so cleanup-deleted pages don't get re-migrated. */
|
|
106
|
+
manifestEntriesInvalidated: number;
|
|
107
|
+
}
|
|
108
|
+
export type WikiCleanupOutcome = WikiCleanupScanResult | WikiCleanupApplyResult | {
|
|
109
|
+
ok: false;
|
|
110
|
+
reason: 'invalid_input' | 'vault_missing';
|
|
111
|
+
message: string;
|
|
112
|
+
};
|
|
113
|
+
export declare class WikiCleanupService {
|
|
114
|
+
private static instance;
|
|
115
|
+
private readonly logger;
|
|
116
|
+
constructor();
|
|
117
|
+
static getInstance(): WikiCleanupService;
|
|
118
|
+
/** Test-only reset. */
|
|
119
|
+
static resetInstance(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Walk the vault's `llm-curated/` tree, parse frontmatter, return all
|
|
122
|
+
* pages matching at least one cleanup rule. Pure read — no writes.
|
|
123
|
+
*/
|
|
124
|
+
scan(input: WikiCleanupScanInput): Promise<WikiCleanupOutcome>;
|
|
125
|
+
/**
|
|
126
|
+
* Delete the listed pages from the vault, archive each one (body +
|
|
127
|
+
* frontmatter) to `.wiki-cleanup-archive.json`, and invalidate the
|
|
128
|
+
* corresponding entry in the migrate manifest so the same source can't
|
|
129
|
+
* resurrect the page on the next `wiki-migrate --apply`.
|
|
130
|
+
*/
|
|
131
|
+
apply(input: WikiCleanupApplyInput): Promise<WikiCleanupOutcome>;
|
|
132
|
+
private validateVault;
|
|
133
|
+
/**
|
|
134
|
+
* Best-effort safe-rel normalisation. Returns null if the path would
|
|
135
|
+
* resolve outside the vault (`..` traversal etc).
|
|
136
|
+
*/
|
|
137
|
+
private normalizeRelPath;
|
|
138
|
+
/**
|
|
139
|
+
* Walk the vault tree, parsing frontmatter on each `.md` file. Skips
|
|
140
|
+
* frozen folders + non-md files. Returns true if the scan was truncated
|
|
141
|
+
* by the hard cap.
|
|
142
|
+
*/
|
|
143
|
+
private walkPages;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Parse `confidence` from frontmatter into a number, or null if absent /
|
|
147
|
+
* unparseable. Accepts both numeric (`0.3`) and string (`"0.3"`) shapes
|
|
148
|
+
* because YAML quoting is inconsistent across older migrated pages.
|
|
149
|
+
*/
|
|
150
|
+
export declare function parseConfidence(raw: unknown): number | null;
|
|
151
|
+
/**
|
|
152
|
+
* Minimal YAML frontmatter parser. Handles the shapes our migrate service
|
|
153
|
+
* emits — `key: value` lines, with optional quotes around values. NOT a
|
|
154
|
+
* general YAML parser. Returns `{}` when no frontmatter is present.
|
|
155
|
+
*/
|
|
156
|
+
export declare function parseFrontmatter(raw: string): {
|
|
157
|
+
frontmatter: Record<string, unknown>;
|
|
158
|
+
body: string;
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=wiki-cleanup.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-cleanup.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-cleanup.service.ts"],"names":[],"mappings":"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"}
|