crewly 1.8.8 → 1.8.9
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/dist/backend/backend/src/constants.d.ts +12 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +12 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +17 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +8 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +15 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +15 -29
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +97 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +174 -15
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +12 -4
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +17 -5
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +75 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +164 -12
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +12 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +12 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +0 -0
- package/package.json +1 -1
- package/config/constants.d.ts.map +0 -1
- package/config/index.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
- package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +0 -220
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +0 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +0 -37
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
- package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fts5-search-strategy.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/fts5-search-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,kBAAkB;IACZ,YAAY,CAAsB;IAClC,MAAM,CAAkB;IAEzC;;;;OAIG;IACH,YAAY,YAAiC;QAC3C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,SAAqC;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAElE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,4EAA4E;YAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAE9C,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,8EAA8E;gBAC9E,MAAM,UAAU,GAA6B;oBAC3C,EAAE,EAAE,SAAS,CAAC,EAAE;oBAChB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oBACxD,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACxC,KAAK,EAAE,QAAQ;oBACf,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Learnings Index Service
|
|
3
|
-
*
|
|
4
|
-
* Surfaces project-scoped record-learning entries (`.crewly/knowledge/learnings.md`)
|
|
5
|
-
* as virtual `KnowledgeDocumentSummary` entries so they appear in the `/knowledge`
|
|
6
|
-
* UI and are returned by recall searches.
|
|
7
|
-
*
|
|
8
|
-
* Background (memory.f1, 2026-04-28): the `record-learning` skill writes to
|
|
9
|
-
* `learnings.md` (an append-only log owned by `ProjectMemoryService`), but the
|
|
10
|
-
* `/knowledge` UI reads `KnowledgeService.listDocuments()` which only sees
|
|
11
|
-
* `.crewly/docs/`. As a result, learnings persisted to disk were not visible
|
|
12
|
-
* in the UI and were not returned by recall. This service bridges that gap by
|
|
13
|
-
* parsing the learnings log on demand and exposing each entry under a stable
|
|
14
|
-
* synthetic ID (`learning:<sha1-prefix>`) that the rest of the knowledge stack
|
|
15
|
-
* can carry through `listDocuments` / `getDocument` / search.
|
|
16
|
-
*
|
|
17
|
-
* @module services/knowledge/learnings-index.service
|
|
18
|
-
*/
|
|
19
|
-
import type { KnowledgeDocument, KnowledgeDocumentSummary, KnowledgeScope } from '../../types/knowledge.types.js';
|
|
20
|
-
/** Prefix that marks a synthetic learning document ID. */
|
|
21
|
-
export declare const LEARNING_ID_PREFIX = "learning:";
|
|
22
|
-
/** Category label used for learnings surfaced in the knowledge UI. */
|
|
23
|
-
export declare const LEARNINGS_CATEGORY = "Learnings";
|
|
24
|
-
/**
|
|
25
|
-
* A learning entry parsed out of `learnings.md`.
|
|
26
|
-
*
|
|
27
|
-
* @internal
|
|
28
|
-
*/
|
|
29
|
-
export interface ParsedLearning {
|
|
30
|
-
/** Stable synthetic ID — `learning:` prefix + sha1 hash of (timestamp + author + content). */
|
|
31
|
-
id: string;
|
|
32
|
-
/** Title — Karpathy-lite `[[Entity]]` opener if present, else first sentence (capped). */
|
|
33
|
-
title: string;
|
|
34
|
-
/** Tags — `learning` always, plus any `[tag-name]` tokens found in the body. */
|
|
35
|
-
tags: string[];
|
|
36
|
-
/** Full body of the entry (date / agent header lines stripped). */
|
|
37
|
-
content: string;
|
|
38
|
-
/** ISO timestamp parsed from `## YYYY-MM-DD` and `### [role/agent] HH:MM:SS` headers. */
|
|
39
|
-
createdAt: string;
|
|
40
|
-
/** Same as `createdAt` — learnings are append-only, no separate update timestamp. */
|
|
41
|
-
updatedAt: string;
|
|
42
|
-
/** Agent author string from the `[role/agentId]` header (or `unknown`). */
|
|
43
|
-
author: string;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Parse `learnings.md` content into discrete learning entries.
|
|
47
|
-
*
|
|
48
|
-
* The expected format produced by `ProjectMemoryService.recordLearning` is:
|
|
49
|
-
*
|
|
50
|
-
* ```
|
|
51
|
-
* ## YYYY-MM-DD
|
|
52
|
-
*
|
|
53
|
-
* ### [role/agentId] HH:MM:SS
|
|
54
|
-
* <content>
|
|
55
|
-
*
|
|
56
|
-
* ---
|
|
57
|
-
* ```
|
|
58
|
-
*
|
|
59
|
-
* Older entries may lack the `### [role/agentId]` header — those are still
|
|
60
|
-
* parsed, with `author = 'unknown'` and time defaulting to `00:00:00`. Entries
|
|
61
|
-
* containing only the file-level header (`# Project Learnings`) are skipped.
|
|
62
|
-
*
|
|
63
|
-
* Exported for testing only — callers should use {@link LearningsIndexService}.
|
|
64
|
-
*
|
|
65
|
-
* @param raw - Full file content (YAML frontmatter is stripped if present)
|
|
66
|
-
* @returns Parsed entries in file order
|
|
67
|
-
*/
|
|
68
|
-
export declare function parseLearnings(raw: string): ParsedLearning[];
|
|
69
|
-
/**
|
|
70
|
-
* Service that surfaces `learnings.md` entries as virtual knowledge documents.
|
|
71
|
-
*
|
|
72
|
-
* Singleton, file-system-backed, no caching — `learnings.md` is small enough
|
|
73
|
-
* (a single project's append-only log) that re-parsing on every list call is
|
|
74
|
-
* acceptable and avoids stale-cache bugs across writes from the agent skill.
|
|
75
|
-
*/
|
|
76
|
-
export declare class LearningsIndexService {
|
|
77
|
-
private static instance;
|
|
78
|
-
private readonly logger;
|
|
79
|
-
private constructor();
|
|
80
|
-
/**
|
|
81
|
-
* Get the singleton instance.
|
|
82
|
-
*
|
|
83
|
-
* @returns LearningsIndexService instance
|
|
84
|
-
*/
|
|
85
|
-
static getInstance(): LearningsIndexService;
|
|
86
|
-
/**
|
|
87
|
-
* Reset the singleton (for testing).
|
|
88
|
-
*/
|
|
89
|
-
static resetInstance(): void;
|
|
90
|
-
/**
|
|
91
|
-
* Detect whether an ID belongs to this service's synthetic namespace.
|
|
92
|
-
*
|
|
93
|
-
* @param id - Document ID to test
|
|
94
|
-
* @returns True if the ID has the learning prefix
|
|
95
|
-
*/
|
|
96
|
-
static isLearningId(id: string): boolean;
|
|
97
|
-
/**
|
|
98
|
-
* Resolve the absolute path to `learnings.md` for the given scope.
|
|
99
|
-
*
|
|
100
|
-
* Learnings only exist at project scope today (the `record-learning` skill
|
|
101
|
-
* always requires a `projectPath`). Global scope returns null so callers
|
|
102
|
-
* can short-circuit cleanly.
|
|
103
|
-
*
|
|
104
|
-
* @param scope - 'global' or 'project'
|
|
105
|
-
* @param projectPath - Required when scope is 'project'
|
|
106
|
-
* @returns Absolute file path, or null if learnings cannot exist for this scope
|
|
107
|
-
*/
|
|
108
|
-
private learningsPath;
|
|
109
|
-
/**
|
|
110
|
-
* Read and parse `learnings.md` for the given scope.
|
|
111
|
-
*
|
|
112
|
-
* Missing-file and read-error cases both return an empty array — the
|
|
113
|
-
* indexer must never fail callers just because no learnings exist yet.
|
|
114
|
-
*
|
|
115
|
-
* @param scope - Document scope
|
|
116
|
-
* @param projectPath - Project path (required for 'project' scope)
|
|
117
|
-
* @returns Parsed learning entries (empty if file missing or unreadable)
|
|
118
|
-
*/
|
|
119
|
-
private readLearnings;
|
|
120
|
-
/**
|
|
121
|
-
* List all learnings for the given scope as `KnowledgeDocumentSummary` entries.
|
|
122
|
-
*
|
|
123
|
-
* Sorted newest-first so the UI shows recent learnings at the top of the
|
|
124
|
-
* unified knowledge list (matching the user mental model that learnings
|
|
125
|
-
* are a chronological journal).
|
|
126
|
-
*
|
|
127
|
-
* @param scope - 'global' or 'project'
|
|
128
|
-
* @param projectPath - Required when scope is 'project'
|
|
129
|
-
* @returns Array of summaries (empty if scope is 'global' or no learnings exist)
|
|
130
|
-
*/
|
|
131
|
-
listLearnings(scope: KnowledgeScope, projectPath?: string): Promise<KnowledgeDocumentSummary[]>;
|
|
132
|
-
/**
|
|
133
|
-
* Fetch a single learning by its synthetic ID.
|
|
134
|
-
*
|
|
135
|
-
* @param id - Synthetic document ID (must start with `learning:`)
|
|
136
|
-
* @param scope - Document scope
|
|
137
|
-
* @param projectPath - Required when scope is 'project'
|
|
138
|
-
* @returns Full document, or null if id is not a learning id or not found
|
|
139
|
-
*/
|
|
140
|
-
getLearning(id: string, scope: KnowledgeScope, projectPath?: string): Promise<KnowledgeDocument | null>;
|
|
141
|
-
/**
|
|
142
|
-
* Project a parsed entry into a `KnowledgeDocumentSummary`.
|
|
143
|
-
*
|
|
144
|
-
* @param e - Parsed learning entry
|
|
145
|
-
* @param scope - Target scope label
|
|
146
|
-
* @returns Summary suitable for the knowledge list API
|
|
147
|
-
*/
|
|
148
|
-
private toSummary;
|
|
149
|
-
/**
|
|
150
|
-
* Project a parsed entry into a full `KnowledgeDocument`.
|
|
151
|
-
*
|
|
152
|
-
* @param e - Parsed learning entry
|
|
153
|
-
* @param scope - Target scope label
|
|
154
|
-
* @param projectPath - Carried into the document for project-scoped entries
|
|
155
|
-
* @returns Full document suitable for the knowledge document API
|
|
156
|
-
*/
|
|
157
|
-
private toDocument;
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=learnings-index.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-index.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/learnings-index.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACf,MAAM,gCAAgC,CAAC;AAGxC,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAQ9C;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,EAAE,EAAE,MAAM,CAAC;IACX,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAiG5D;AAED;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAO3C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;;;;;OASG;YACW,aAAa;IAiB3B;;;;;;;;;;OAUG;IACG,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAOrG;;;;;;;OAOG;IACG,WAAW,CACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,cAAc,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IASpC;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAejB;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;CAmBnB"}
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Learnings Index Service
|
|
3
|
-
*
|
|
4
|
-
* Surfaces project-scoped record-learning entries (`.crewly/knowledge/learnings.md`)
|
|
5
|
-
* as virtual `KnowledgeDocumentSummary` entries so they appear in the `/knowledge`
|
|
6
|
-
* UI and are returned by recall searches.
|
|
7
|
-
*
|
|
8
|
-
* Background (memory.f1, 2026-04-28): the `record-learning` skill writes to
|
|
9
|
-
* `learnings.md` (an append-only log owned by `ProjectMemoryService`), but the
|
|
10
|
-
* `/knowledge` UI reads `KnowledgeService.listDocuments()` which only sees
|
|
11
|
-
* `.crewly/docs/`. As a result, learnings persisted to disk were not visible
|
|
12
|
-
* in the UI and were not returned by recall. This service bridges that gap by
|
|
13
|
-
* parsing the learnings log on demand and exposing each entry under a stable
|
|
14
|
-
* synthetic ID (`learning:<sha1-prefix>`) that the rest of the knowledge stack
|
|
15
|
-
* can carry through `listDocuments` / `getDocument` / search.
|
|
16
|
-
*
|
|
17
|
-
* @module services/knowledge/learnings-index.service
|
|
18
|
-
*/
|
|
19
|
-
import * as path from 'path';
|
|
20
|
-
import * as fs from 'fs/promises';
|
|
21
|
-
import { existsSync } from 'fs';
|
|
22
|
-
import { createHash } from 'crypto';
|
|
23
|
-
import { LoggerService } from '../core/logger.service.js';
|
|
24
|
-
import { CREWLY_CONSTANTS, MEMORY_CONSTANTS } from '../../constants.js';
|
|
25
|
-
import { KNOWLEDGE_CONSTANTS } from '../../types/knowledge.types.js';
|
|
26
|
-
/** Prefix that marks a synthetic learning document ID. */
|
|
27
|
-
export const LEARNING_ID_PREFIX = 'learning:';
|
|
28
|
-
/** Category label used for learnings surfaced in the knowledge UI. */
|
|
29
|
-
export const LEARNINGS_CATEGORY = 'Learnings';
|
|
30
|
-
/** Maximum title length for a synthesized learning summary (kept short for list rendering). */
|
|
31
|
-
const MAX_TITLE_LENGTH = 100;
|
|
32
|
-
/** Length of the sha1 hash prefix used for synthetic IDs (16 hex chars = 64 bits collision space). */
|
|
33
|
-
const ID_HASH_LENGTH = 16;
|
|
34
|
-
/**
|
|
35
|
-
* Parse `learnings.md` content into discrete learning entries.
|
|
36
|
-
*
|
|
37
|
-
* The expected format produced by `ProjectMemoryService.recordLearning` is:
|
|
38
|
-
*
|
|
39
|
-
* ```
|
|
40
|
-
* ## YYYY-MM-DD
|
|
41
|
-
*
|
|
42
|
-
* ### [role/agentId] HH:MM:SS
|
|
43
|
-
* <content>
|
|
44
|
-
*
|
|
45
|
-
* ---
|
|
46
|
-
* ```
|
|
47
|
-
*
|
|
48
|
-
* Older entries may lack the `### [role/agentId]` header — those are still
|
|
49
|
-
* parsed, with `author = 'unknown'` and time defaulting to `00:00:00`. Entries
|
|
50
|
-
* containing only the file-level header (`# Project Learnings`) are skipped.
|
|
51
|
-
*
|
|
52
|
-
* Exported for testing only — callers should use {@link LearningsIndexService}.
|
|
53
|
-
*
|
|
54
|
-
* @param raw - Full file content (YAML frontmatter is stripped if present)
|
|
55
|
-
* @returns Parsed entries in file order
|
|
56
|
-
*/
|
|
57
|
-
export function parseLearnings(raw) {
|
|
58
|
-
// Strip YAML frontmatter (if present) so the first `---` after it doesn't
|
|
59
|
-
// get treated as a section separator.
|
|
60
|
-
let body = raw;
|
|
61
|
-
if (body.startsWith('---')) {
|
|
62
|
-
const end = body.indexOf('\n---', 3);
|
|
63
|
-
if (end !== -1) {
|
|
64
|
-
body = body.slice(end + 4);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
// Sections are separated by a markdown horizontal rule (a line containing
|
|
68
|
-
// only `---`). The recordLearning writer always emits this between entries.
|
|
69
|
-
const sections = body
|
|
70
|
-
.split(/^---\s*$/m)
|
|
71
|
-
.map((s) => s.trim())
|
|
72
|
-
.filter((s) => s.length > 0);
|
|
73
|
-
const entries = [];
|
|
74
|
-
for (const section of sections) {
|
|
75
|
-
// Skip file-level headers (`# Project Learnings: ...`).
|
|
76
|
-
if (/^#\s+(Project Learnings|Learnings from)/i.test(section)) {
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
const dateMatch = section.match(/^##\s+(\d{4}-\d{2}-\d{2})/m);
|
|
80
|
-
const date = dateMatch?.[1] ?? '';
|
|
81
|
-
const agentMatch = section.match(/^###\s+\[([^\]]+)\]\s+(\d{2}:\d{2}:\d{2})/m);
|
|
82
|
-
const author = agentMatch?.[1] ?? 'unknown';
|
|
83
|
-
const time = agentMatch?.[2] ?? '00:00:00';
|
|
84
|
-
// ISO timestamp: combine date + time as UTC. If date is missing (truly
|
|
85
|
-
// malformed), fall back to epoch so the entry still surfaces but sorts
|
|
86
|
-
// last. This is intentionally permissive: better to show a learning with
|
|
87
|
-
// a wrong-looking timestamp than to drop it silently.
|
|
88
|
-
const createdAt = date ? `${date}T${time}.000Z` : new Date(0).toISOString();
|
|
89
|
-
// Strip the headers we already parsed from the content body so they don't
|
|
90
|
-
// appear duplicated in the synthesized document.
|
|
91
|
-
const content = section
|
|
92
|
-
.replace(/^##\s+\d{4}-\d{2}-\d{2}\s*$/m, '')
|
|
93
|
-
.replace(/^###\s+\[[^\]]+\]\s+\d{2}:\d{2}:\d{2}\s*$/m, '')
|
|
94
|
-
.trim();
|
|
95
|
-
if (!content) {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
// Title selection priority:
|
|
99
|
-
// 1. Karpathy-lite `[[Entity]]` opener — entity name as title.
|
|
100
|
-
// 2. First sentence/line of the body, capped at MAX_TITLE_LENGTH.
|
|
101
|
-
const entityMatch = content.match(/^\[\[([^\]]+)\]\]/);
|
|
102
|
-
let title;
|
|
103
|
-
if (entityMatch) {
|
|
104
|
-
title = entityMatch[1].trim().slice(0, MAX_TITLE_LENGTH);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
const firstSentence = content.split(/[.\n]/)[0].trim();
|
|
108
|
-
title = firstSentence.slice(0, MAX_TITLE_LENGTH) || 'Learning';
|
|
109
|
-
}
|
|
110
|
-
// Tags: 'learning' plus any `[tag-name]` markers in the body. Matches the
|
|
111
|
-
// existing convention used by record-learning callers (e.g. `[best-practice]`,
|
|
112
|
-
// `[gotcha]`, `[architecture-decision]`).
|
|
113
|
-
const tags = ['learning'];
|
|
114
|
-
const tagPattern = /\[([a-z][a-z0-9-]{0,49})\]/g;
|
|
115
|
-
let tagMatch;
|
|
116
|
-
while ((tagMatch = tagPattern.exec(content)) !== null) {
|
|
117
|
-
const tag = tagMatch[1];
|
|
118
|
-
if (!tags.includes(tag) && tags.length < KNOWLEDGE_CONSTANTS.MAX_TAGS) {
|
|
119
|
-
tags.push(tag);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// Stable synthetic ID. We hash (timestamp + author + content prefix) so
|
|
123
|
-
// that re-parsing the same file produces the same IDs, but two entries
|
|
124
|
-
// written at the same second by the same author with different content
|
|
125
|
-
// get distinct IDs. SHA-1 + 16 hex chars is sufficient (64 bits) for the
|
|
126
|
-
// append-only log scale.
|
|
127
|
-
const idHash = createHash('sha1')
|
|
128
|
-
.update(`${createdAt}|${author}|${content.slice(0, 200)}`)
|
|
129
|
-
.digest('hex')
|
|
130
|
-
.slice(0, ID_HASH_LENGTH);
|
|
131
|
-
entries.push({
|
|
132
|
-
id: `${LEARNING_ID_PREFIX}${idHash}`,
|
|
133
|
-
title,
|
|
134
|
-
tags,
|
|
135
|
-
content,
|
|
136
|
-
createdAt,
|
|
137
|
-
updatedAt: createdAt,
|
|
138
|
-
author,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
return entries;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Service that surfaces `learnings.md` entries as virtual knowledge documents.
|
|
145
|
-
*
|
|
146
|
-
* Singleton, file-system-backed, no caching — `learnings.md` is small enough
|
|
147
|
-
* (a single project's append-only log) that re-parsing on every list call is
|
|
148
|
-
* acceptable and avoids stale-cache bugs across writes from the agent skill.
|
|
149
|
-
*/
|
|
150
|
-
export class LearningsIndexService {
|
|
151
|
-
static instance = null;
|
|
152
|
-
logger;
|
|
153
|
-
constructor() {
|
|
154
|
-
this.logger = LoggerService.getInstance().createComponentLogger('LearningsIndexService');
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get the singleton instance.
|
|
158
|
-
*
|
|
159
|
-
* @returns LearningsIndexService instance
|
|
160
|
-
*/
|
|
161
|
-
static getInstance() {
|
|
162
|
-
if (!LearningsIndexService.instance) {
|
|
163
|
-
LearningsIndexService.instance = new LearningsIndexService();
|
|
164
|
-
}
|
|
165
|
-
return LearningsIndexService.instance;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Reset the singleton (for testing).
|
|
169
|
-
*/
|
|
170
|
-
static resetInstance() {
|
|
171
|
-
LearningsIndexService.instance = null;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Detect whether an ID belongs to this service's synthetic namespace.
|
|
175
|
-
*
|
|
176
|
-
* @param id - Document ID to test
|
|
177
|
-
* @returns True if the ID has the learning prefix
|
|
178
|
-
*/
|
|
179
|
-
static isLearningId(id) {
|
|
180
|
-
return typeof id === 'string' && id.startsWith(LEARNING_ID_PREFIX);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Resolve the absolute path to `learnings.md` for the given scope.
|
|
184
|
-
*
|
|
185
|
-
* Learnings only exist at project scope today (the `record-learning` skill
|
|
186
|
-
* always requires a `projectPath`). Global scope returns null so callers
|
|
187
|
-
* can short-circuit cleanly.
|
|
188
|
-
*
|
|
189
|
-
* @param scope - 'global' or 'project'
|
|
190
|
-
* @param projectPath - Required when scope is 'project'
|
|
191
|
-
* @returns Absolute file path, or null if learnings cannot exist for this scope
|
|
192
|
-
*/
|
|
193
|
-
learningsPath(scope, projectPath) {
|
|
194
|
-
if (scope !== 'project' || !projectPath) {
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
return path.join(projectPath, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, MEMORY_CONSTANTS.PATHS.KNOWLEDGE_DIR, MEMORY_CONSTANTS.PROJECT_FILES.LEARNINGS);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Read and parse `learnings.md` for the given scope.
|
|
201
|
-
*
|
|
202
|
-
* Missing-file and read-error cases both return an empty array — the
|
|
203
|
-
* indexer must never fail callers just because no learnings exist yet.
|
|
204
|
-
*
|
|
205
|
-
* @param scope - Document scope
|
|
206
|
-
* @param projectPath - Project path (required for 'project' scope)
|
|
207
|
-
* @returns Parsed learning entries (empty if file missing or unreadable)
|
|
208
|
-
*/
|
|
209
|
-
async readLearnings(scope, projectPath) {
|
|
210
|
-
const filePath = this.learningsPath(scope, projectPath);
|
|
211
|
-
if (!filePath || !existsSync(filePath)) {
|
|
212
|
-
return [];
|
|
213
|
-
}
|
|
214
|
-
try {
|
|
215
|
-
const raw = await fs.readFile(filePath, 'utf-8');
|
|
216
|
-
return parseLearnings(raw);
|
|
217
|
-
}
|
|
218
|
-
catch (error) {
|
|
219
|
-
this.logger.warn('Failed to read learnings.md', {
|
|
220
|
-
path: filePath,
|
|
221
|
-
error: error instanceof Error ? error.message : String(error),
|
|
222
|
-
});
|
|
223
|
-
return [];
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* List all learnings for the given scope as `KnowledgeDocumentSummary` entries.
|
|
228
|
-
*
|
|
229
|
-
* Sorted newest-first so the UI shows recent learnings at the top of the
|
|
230
|
-
* unified knowledge list (matching the user mental model that learnings
|
|
231
|
-
* are a chronological journal).
|
|
232
|
-
*
|
|
233
|
-
* @param scope - 'global' or 'project'
|
|
234
|
-
* @param projectPath - Required when scope is 'project'
|
|
235
|
-
* @returns Array of summaries (empty if scope is 'global' or no learnings exist)
|
|
236
|
-
*/
|
|
237
|
-
async listLearnings(scope, projectPath) {
|
|
238
|
-
const parsed = await this.readLearnings(scope, projectPath);
|
|
239
|
-
return parsed
|
|
240
|
-
.map((e) => this.toSummary(e, scope))
|
|
241
|
-
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Fetch a single learning by its synthetic ID.
|
|
245
|
-
*
|
|
246
|
-
* @param id - Synthetic document ID (must start with `learning:`)
|
|
247
|
-
* @param scope - Document scope
|
|
248
|
-
* @param projectPath - Required when scope is 'project'
|
|
249
|
-
* @returns Full document, or null if id is not a learning id or not found
|
|
250
|
-
*/
|
|
251
|
-
async getLearning(id, scope, projectPath) {
|
|
252
|
-
if (!LearningsIndexService.isLearningId(id)) {
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
const parsed = await this.readLearnings(scope, projectPath);
|
|
256
|
-
const found = parsed.find((e) => e.id === id);
|
|
257
|
-
return found ? this.toDocument(found, scope, projectPath) : null;
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Project a parsed entry into a `KnowledgeDocumentSummary`.
|
|
261
|
-
*
|
|
262
|
-
* @param e - Parsed learning entry
|
|
263
|
-
* @param scope - Target scope label
|
|
264
|
-
* @returns Summary suitable for the knowledge list API
|
|
265
|
-
*/
|
|
266
|
-
toSummary(e, scope) {
|
|
267
|
-
return {
|
|
268
|
-
id: e.id,
|
|
269
|
-
title: e.title,
|
|
270
|
-
category: LEARNINGS_CATEGORY,
|
|
271
|
-
tags: e.tags,
|
|
272
|
-
preview: e.content.slice(0, KNOWLEDGE_CONSTANTS.PREVIEW_LENGTH),
|
|
273
|
-
scope,
|
|
274
|
-
createdBy: e.author,
|
|
275
|
-
updatedBy: e.author,
|
|
276
|
-
createdAt: e.createdAt,
|
|
277
|
-
updatedAt: e.updatedAt,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Project a parsed entry into a full `KnowledgeDocument`.
|
|
282
|
-
*
|
|
283
|
-
* @param e - Parsed learning entry
|
|
284
|
-
* @param scope - Target scope label
|
|
285
|
-
* @param projectPath - Carried into the document for project-scoped entries
|
|
286
|
-
* @returns Full document suitable for the knowledge document API
|
|
287
|
-
*/
|
|
288
|
-
toDocument(e, scope, projectPath) {
|
|
289
|
-
return {
|
|
290
|
-
id: e.id,
|
|
291
|
-
title: e.title,
|
|
292
|
-
category: LEARNINGS_CATEGORY,
|
|
293
|
-
tags: e.tags,
|
|
294
|
-
content: e.content,
|
|
295
|
-
scope,
|
|
296
|
-
projectPath: scope === 'project' ? projectPath : undefined,
|
|
297
|
-
createdBy: e.author,
|
|
298
|
-
updatedBy: e.author,
|
|
299
|
-
createdAt: e.createdAt,
|
|
300
|
-
updatedAt: e.updatedAt,
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
//# sourceMappingURL=learnings-index.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-index.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/learnings-index.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wiki Compiler Service
|
|
3
|
-
*
|
|
4
|
-
* Reads Markdown files with YAML frontmatter from the `.crewly/knowledge/`
|
|
5
|
-
* directory and indexes them into the FTS5 full-text search database.
|
|
6
|
-
* Provides reindexing, single-file indexing, and search capabilities.
|
|
7
|
-
*
|
|
8
|
-
* @module services/knowledge/wiki-compiler.service
|
|
9
|
-
*/
|
|
10
|
-
import { Fts5IndexService, type FtsSearchResult } from './fts5-index.service.js';
|
|
11
|
-
/**
|
|
12
|
-
* Parsed frontmatter result containing extracted metadata and the body text.
|
|
13
|
-
*/
|
|
14
|
-
interface ParsedFrontmatter {
|
|
15
|
-
/** Key-value pairs extracted from YAML frontmatter */
|
|
16
|
-
frontmatter: Record<string, string>;
|
|
17
|
-
/** The markdown body after the frontmatter block */
|
|
18
|
-
body: string;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Parse YAML frontmatter from a Markdown file content string.
|
|
22
|
-
* Handles simple key: value pairs and bracket-delimited arrays.
|
|
23
|
-
* Does not require an external YAML parsing dependency.
|
|
24
|
-
*
|
|
25
|
-
* @param content - Raw file content including frontmatter
|
|
26
|
-
* @returns Parsed frontmatter object and body text
|
|
27
|
-
*/
|
|
28
|
-
export declare function parseFrontmatter(content: string): ParsedFrontmatter;
|
|
29
|
-
/**
|
|
30
|
-
* WikiCompilerService scans `.md` files in a knowledge directory, parses
|
|
31
|
-
* their YAML frontmatter, and indexes the content into an FTS5 database
|
|
32
|
-
* for fast full-text search.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* const compiler = new WikiCompilerService('/Users/me/.crewly/knowledge');
|
|
37
|
-
* const { indexed, errors } = await compiler.reindex();
|
|
38
|
-
* const results = compiler.search('deployment guide');
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export declare class WikiCompilerService {
|
|
42
|
-
private readonly fts5;
|
|
43
|
-
private readonly knowledgePath;
|
|
44
|
-
private readonly logger;
|
|
45
|
-
/**
|
|
46
|
-
* Create a WikiCompilerService.
|
|
47
|
-
*
|
|
48
|
-
* @param knowledgePath - Directory containing `.md` knowledge files
|
|
49
|
-
*/
|
|
50
|
-
constructor(knowledgePath: string);
|
|
51
|
-
/**
|
|
52
|
-
* Get the path to the knowledge directory.
|
|
53
|
-
*
|
|
54
|
-
* @returns The absolute path to the knowledge directory
|
|
55
|
-
*/
|
|
56
|
-
getKnowledgePath(): string;
|
|
57
|
-
/**
|
|
58
|
-
* Recursively find all `.md` files under the knowledge directory.
|
|
59
|
-
*
|
|
60
|
-
* @returns Array of absolute file paths
|
|
61
|
-
*/
|
|
62
|
-
getMarkdownFiles(): Promise<string[]>;
|
|
63
|
-
/**
|
|
64
|
-
* Scan all `.md` files in the knowledge directory (recursively), parse
|
|
65
|
-
* their frontmatter, and rebuild the FTS5 index from scratch.
|
|
66
|
-
*
|
|
67
|
-
* @returns An object with the count of indexed documents and any errors encountered
|
|
68
|
-
*/
|
|
69
|
-
reindex(): Promise<{
|
|
70
|
-
indexed: number;
|
|
71
|
-
errors: string[];
|
|
72
|
-
}>;
|
|
73
|
-
/**
|
|
74
|
-
* Index a single markdown file into the FTS5 database.
|
|
75
|
-
*
|
|
76
|
-
* @param filePath - Absolute path to the markdown file
|
|
77
|
-
*/
|
|
78
|
-
indexFile(filePath: string): Promise<void>;
|
|
79
|
-
/**
|
|
80
|
-
* Search the knowledge base using FTS5 full-text search.
|
|
81
|
-
*
|
|
82
|
-
* @param query - The search query string
|
|
83
|
-
* @param options - Optional search parameters (category filter, result limit)
|
|
84
|
-
* @returns Array of matching documents sorted by BM25 relevance
|
|
85
|
-
*/
|
|
86
|
-
search(query: string, options?: {
|
|
87
|
-
category?: string;
|
|
88
|
-
limit?: number;
|
|
89
|
-
}): FtsSearchResult[];
|
|
90
|
-
/**
|
|
91
|
-
* Get direct access to the underlying FTS5 index service.
|
|
92
|
-
*
|
|
93
|
-
* @returns The Fts5IndexService instance
|
|
94
|
-
*/
|
|
95
|
-
getFts5(): Fts5IndexService;
|
|
96
|
-
/**
|
|
97
|
-
* Close the underlying FTS5 database connection.
|
|
98
|
-
*/
|
|
99
|
-
close(): void;
|
|
100
|
-
/**
|
|
101
|
-
* Recursively find all `.md` files under the knowledge directory.
|
|
102
|
-
*
|
|
103
|
-
* @returns Array of absolute file paths
|
|
104
|
-
*/
|
|
105
|
-
private globMarkdownFiles;
|
|
106
|
-
/**
|
|
107
|
-
* Read and parse a single markdown file into an FTS5 document shape.
|
|
108
|
-
*
|
|
109
|
-
* @param filePath - Absolute path to the markdown file
|
|
110
|
-
* @returns Parsed document ready for FTS5 indexing
|
|
111
|
-
*/
|
|
112
|
-
private parseFile;
|
|
113
|
-
}
|
|
114
|
-
export {};
|
|
115
|
-
//# sourceMappingURL=wiki-compiler.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-compiler.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/wiki-compiler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAMjF;;GAEG;AACH,UAAU,iBAAiB;IACzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA4BnE;AAkBD;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC;;;;OAIG;gBACS,aAAa,EAAE,MAAM;IAMjC;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3C;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA4B/D;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAIzF;;;;OAIG;IACH,OAAO,IAAI,gBAAgB;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;;;OAIG;YACW,iBAAiB;IAyB/B;;;;;OAKG;YACW,SAAS;CAcxB"}
|