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