crewly 1.8.7 → 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.
Files changed (165) hide show
  1. package/dist/backend/backend/src/constants.d.ts +12 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +12 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  6. package/dist/backend/backend/src/controllers/browser/browser.controller.js +17 -0
  7. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +8 -1
  10. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +15 -7
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +7 -0
  15. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  16. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +69 -12
  17. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  18. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +122 -1
  19. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  20. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +252 -17
  21. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  22. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +37 -3
  23. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +140 -23
  25. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +75 -0
  27. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +164 -12
  29. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  30. package/dist/cli/backend/src/constants.d.ts +12 -0
  31. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  32. package/dist/cli/backend/src/constants.js +12 -0
  33. package/dist/cli/backend/src/constants.js.map +1 -1
  34. package/dist/cli/cli/src/index.js +0 -0
  35. package/package.json +1 -1
  36. package/config/constants.d.ts.map +0 -1
  37. package/config/index.d.ts.map +0 -1
  38. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  39. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  40. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  41. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  42. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  43. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  44. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  45. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  46. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  47. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  48. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  49. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  50. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  51. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  52. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  53. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  54. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  55. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  56. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  57. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  58. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  59. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  60. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  61. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  62. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  63. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  64. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  65. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  66. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  67. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  68. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  69. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  70. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  71. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  72. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  73. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  74. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  75. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  76. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  77. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  78. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  79. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  80. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  81. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  82. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  83. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  84. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  85. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  86. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  87. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  88. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  89. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  90. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  91. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  92. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  93. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  94. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  95. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  96. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  97. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  98. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  99. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  100. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  101. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  102. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  103. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  104. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  105. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  106. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  107. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  108. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  109. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  110. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  111. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  112. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  113. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  114. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  115. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  116. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  117. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  118. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  119. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  120. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  121. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  122. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  123. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  124. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  125. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  126. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  127. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  128. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  129. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  130. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  131. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  132. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  133. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  134. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +0 -220
  135. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +0 -1
  136. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +0 -37
  137. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +0 -1
  138. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  139. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  140. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  141. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  142. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  143. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  144. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  145. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  146. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  147. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  148. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  149. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  150. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  151. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  152. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  153. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  154. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  155. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  156. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  157. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  158. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  159. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  160. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  161. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  162. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  163. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  164. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  165. package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
@@ -1,111 +0,0 @@
1
- /**
2
- * ESM/CJS-dual-mode helpers for the lazy `nodeRequire` pattern.
3
- *
4
- * Background
5
- * ----------
6
- * Several services in this codebase use the canonical `nodeRequire` pattern
7
- * (commit `070cd3e5` — `fix(esm): anchor createRequire to process.argv[1]`)
8
- * to lazily load modules without forcing every test that transitively imports
9
- * them to mock the dependency. The pattern looks like:
10
- *
11
- * const nodeRequire: NodeRequire =
12
- * typeof require === 'function'
13
- * ? require
14
- * : createRequire(pathToFileURL(process.argv[1] || process.cwd()).href);
15
- *
16
- * That pattern works **only** for npm-package targets (e.g.
17
- * `nodeRequire('better-sqlite3')`) — Node's resolver walks UP from the anchor
18
- * (`process.argv[1]`) to find `node_modules`, so the anchor's exact location
19
- * does not matter for package resolution.
20
- *
21
- * It silently breaks for **relative project paths** like
22
- * `nodeRequire('../v3/request.service.js')`. In production ESM, the relative
23
- * spec is resolved against `process.argv[1]` (the entry script) — NOT against
24
- * the calling module — so the require fails with `Cannot find module …`. In
25
- * tests (ts-jest CJS transpile) the per-module `require` parameter is used
26
- * instead, so the relative spec resolves correctly against the calling file
27
- * and the bug stays hidden.
28
- *
29
- * Symptom that motivated this helper: `core/get-my-active-work` returned 500
30
- * with "Cannot find module '../v3/request.service.js'" because
31
- * `ActiveWorkBriefingService.getInstance()` called
32
- * `nodeRequire('../v3/request.service.js')` from
33
- * `services/agent/active-work-briefing.service.js` while `nodeRequire` was
34
- * anchored to `dist/backend/backend/src/index.js`.
35
- *
36
- * What this helper does
37
- * ---------------------
38
- * `resolveProjectModulePath(testRelativePath, prodPathFromEntryDir)` returns:
39
- *
40
- * 1. In test mode (`typeof require === 'function'` — ts-jest CJS) — the
41
- * `testRelativePath` unchanged, so the per-module CJS require resolves it
42
- * relative to the calling file (its existing, working behavior).
43
- * 2. In production ESM — an absolute path computed by joining
44
- * `path.dirname(process.argv[1])` with `prodPathFromEntryDir`.
45
- * Absolute paths are accepted by `nodeRequire` regardless of anchor.
46
- *
47
- * Why this is two-arg rather than one
48
- * -----------------------------------
49
- * We considered single-arg variants:
50
- * • `import.meta.url` — triggers TS1343 under ts-jest's CJS target. Even with
51
- * `// @ts-expect-error`, ts-jest's transpile may still fail at parse.
52
- * • `new Function('return import.meta.url')()` — was tried (PR #323) and is
53
- * forbidden — `new Function` evaluates in non-module scope where
54
- * `import.meta` is a SyntaxError. Crashed production at startup.
55
- * • `eval('import.meta.url')` — works at runtime via direct-eval scope
56
- * inheritance, but trips ESLint `no-eval` and is fragile across engines.
57
- * • Stack-trace introspection — gross and slow.
58
- *
59
- * Asking the caller to spell out **two** equivalent paths (one usable from the
60
- * caller's perspective, one usable from the entry script's perspective) is
61
- * verbose but unambiguous, parse-clean under both TS targets, and free of any
62
- * runtime tricks.
63
- *
64
- * Usage
65
- * -----
66
- * // Caller is at `backend/src/services/agent/active-work-briefing.service.ts`
67
- * // Target is at `backend/src/services/v3/request.service.ts`
68
- * // Entry script (process.argv[1]) is `dist/backend/backend/src/index.js`
69
- * // → from the caller's perspective: `../v3/request.service.js`
70
- * // → from the entry-script-dir's perspective: `services/v3/request.service.js`
71
- *
72
- * const spec = resolveProjectModulePath(
73
- * '../v3/request.service.js',
74
- * 'services/v3/request.service.js',
75
- * );
76
- * const { RequestService } = nodeRequire(spec);
77
- *
78
- * Test guard
79
- * ----------
80
- * `esm-require.utils.test.ts` exercises both branches and locks the contract
81
- * (test branch ↔ untouched relative path; prod branch ↔ absolute path joined
82
- * to `process.argv[1]`'s dirname).
83
- *
84
- * @module utils/esm-require.utils
85
- */
86
- /**
87
- * Resolves a project-relative require spec to a string safe to pass to
88
- * `nodeRequire` in both ts-jest CJS test mode and production ESM mode.
89
- *
90
- * @param testRelativePath - The require spec written from the calling file's
91
- * perspective. Used verbatim in test mode (ts-jest CJS) where each module
92
- * gets its own `require` and relative resolution Just Works. Example:
93
- * `'../v3/request.service.js'`.
94
- * @param prodPathFromEntryDir - The require spec rewritten as a path under
95
- * `path.dirname(process.argv[1])`. Used in production ESM where
96
- * `nodeRequire` is anchored to the entry script. Example:
97
- * `'services/v3/request.service.js'` (under `dist/backend/backend/src/`).
98
- * @returns A string suitable for `nodeRequire(...)`.
99
- *
100
- * @example
101
- * ```typescript
102
- * const { RequestService } = nodeRequire(
103
- * resolveProjectModulePath(
104
- * '../v3/request.service.js',
105
- * 'services/v3/request.service.js',
106
- * ),
107
- * );
108
- * ```
109
- */
110
- export declare function resolveProjectModulePath(testRelativePath: string, prodPathFromEntryDir: string): string;
111
- //# sourceMappingURL=esm-require.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"esm-require.utils.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/esm-require.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAIH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAYR"}
@@ -1,124 +0,0 @@
1
- /**
2
- * ESM/CJS-dual-mode helpers for the lazy `nodeRequire` pattern.
3
- *
4
- * Background
5
- * ----------
6
- * Several services in this codebase use the canonical `nodeRequire` pattern
7
- * (commit `070cd3e5` — `fix(esm): anchor createRequire to process.argv[1]`)
8
- * to lazily load modules without forcing every test that transitively imports
9
- * them to mock the dependency. The pattern looks like:
10
- *
11
- * const nodeRequire: NodeRequire =
12
- * typeof require === 'function'
13
- * ? require
14
- * : createRequire(pathToFileURL(process.argv[1] || process.cwd()).href);
15
- *
16
- * That pattern works **only** for npm-package targets (e.g.
17
- * `nodeRequire('better-sqlite3')`) — Node's resolver walks UP from the anchor
18
- * (`process.argv[1]`) to find `node_modules`, so the anchor's exact location
19
- * does not matter for package resolution.
20
- *
21
- * It silently breaks for **relative project paths** like
22
- * `nodeRequire('../v3/request.service.js')`. In production ESM, the relative
23
- * spec is resolved against `process.argv[1]` (the entry script) — NOT against
24
- * the calling module — so the require fails with `Cannot find module …`. In
25
- * tests (ts-jest CJS transpile) the per-module `require` parameter is used
26
- * instead, so the relative spec resolves correctly against the calling file
27
- * and the bug stays hidden.
28
- *
29
- * Symptom that motivated this helper: `core/get-my-active-work` returned 500
30
- * with "Cannot find module '../v3/request.service.js'" because
31
- * `ActiveWorkBriefingService.getInstance()` called
32
- * `nodeRequire('../v3/request.service.js')` from
33
- * `services/agent/active-work-briefing.service.js` while `nodeRequire` was
34
- * anchored to `dist/backend/backend/src/index.js`.
35
- *
36
- * What this helper does
37
- * ---------------------
38
- * `resolveProjectModulePath(testRelativePath, prodPathFromEntryDir)` returns:
39
- *
40
- * 1. In test mode (`typeof require === 'function'` — ts-jest CJS) — the
41
- * `testRelativePath` unchanged, so the per-module CJS require resolves it
42
- * relative to the calling file (its existing, working behavior).
43
- * 2. In production ESM — an absolute path computed by joining
44
- * `path.dirname(process.argv[1])` with `prodPathFromEntryDir`.
45
- * Absolute paths are accepted by `nodeRequire` regardless of anchor.
46
- *
47
- * Why this is two-arg rather than one
48
- * -----------------------------------
49
- * We considered single-arg variants:
50
- * • `import.meta.url` — triggers TS1343 under ts-jest's CJS target. Even with
51
- * `// @ts-expect-error`, ts-jest's transpile may still fail at parse.
52
- * • `new Function('return import.meta.url')()` — was tried (PR #323) and is
53
- * forbidden — `new Function` evaluates in non-module scope where
54
- * `import.meta` is a SyntaxError. Crashed production at startup.
55
- * • `eval('import.meta.url')` — works at runtime via direct-eval scope
56
- * inheritance, but trips ESLint `no-eval` and is fragile across engines.
57
- * • Stack-trace introspection — gross and slow.
58
- *
59
- * Asking the caller to spell out **two** equivalent paths (one usable from the
60
- * caller's perspective, one usable from the entry script's perspective) is
61
- * verbose but unambiguous, parse-clean under both TS targets, and free of any
62
- * runtime tricks.
63
- *
64
- * Usage
65
- * -----
66
- * // Caller is at `backend/src/services/agent/active-work-briefing.service.ts`
67
- * // Target is at `backend/src/services/v3/request.service.ts`
68
- * // Entry script (process.argv[1]) is `dist/backend/backend/src/index.js`
69
- * // → from the caller's perspective: `../v3/request.service.js`
70
- * // → from the entry-script-dir's perspective: `services/v3/request.service.js`
71
- *
72
- * const spec = resolveProjectModulePath(
73
- * '../v3/request.service.js',
74
- * 'services/v3/request.service.js',
75
- * );
76
- * const { RequestService } = nodeRequire(spec);
77
- *
78
- * Test guard
79
- * ----------
80
- * `esm-require.utils.test.ts` exercises both branches and locks the contract
81
- * (test branch ↔ untouched relative path; prod branch ↔ absolute path joined
82
- * to `process.argv[1]`'s dirname).
83
- *
84
- * @module utils/esm-require.utils
85
- */
86
- import path from 'path';
87
- /**
88
- * Resolves a project-relative require spec to a string safe to pass to
89
- * `nodeRequire` in both ts-jest CJS test mode and production ESM mode.
90
- *
91
- * @param testRelativePath - The require spec written from the calling file's
92
- * perspective. Used verbatim in test mode (ts-jest CJS) where each module
93
- * gets its own `require` and relative resolution Just Works. Example:
94
- * `'../v3/request.service.js'`.
95
- * @param prodPathFromEntryDir - The require spec rewritten as a path under
96
- * `path.dirname(process.argv[1])`. Used in production ESM where
97
- * `nodeRequire` is anchored to the entry script. Example:
98
- * `'services/v3/request.service.js'` (under `dist/backend/backend/src/`).
99
- * @returns A string suitable for `nodeRequire(...)`.
100
- *
101
- * @example
102
- * ```typescript
103
- * const { RequestService } = nodeRequire(
104
- * resolveProjectModulePath(
105
- * '../v3/request.service.js',
106
- * 'services/v3/request.service.js',
107
- * ),
108
- * );
109
- * ```
110
- */
111
- export function resolveProjectModulePath(testRelativePath, prodPathFromEntryDir) {
112
- // The same `typeof require` probe the canonical `nodeRequire` pattern uses.
113
- // Under ts-jest's CJS transpile, the per-module `require` parameter is
114
- // defined and is the correct anchor for relative resolution. Under
115
- // production ESM, `require` is undefined globally and we must hand
116
- // `nodeRequire` an absolute path.
117
- if (typeof require === 'function') {
118
- return testRelativePath;
119
- }
120
- const entryScript = process.argv[1] || process.cwd();
121
- const entryDir = path.dirname(entryScript);
122
- return path.join(entryDir, prodPathFromEntryDir);
123
- }
124
- //# sourceMappingURL=esm-require.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"esm-require.utils.js","sourceRoot":"","sources":["../../../../../backend/src/utils/esm-require.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,wBAAwB,CACtC,gBAAwB,EACxB,oBAA4B;IAE5B,4EAA4E;IAC5E,uEAAuE;IACvE,mEAAmE;IACnE,mEAAmE;IACnE,kCAAkC;IAClC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACnD,CAAC"}
@@ -1,220 +0,0 @@
1
- /**
2
- * Interface for modular prompt components.
3
- *
4
- * Each module is responsible for one concern (identity, skills, team, etc.)
5
- * and produces a markdown string that gets assembled into the final agent prompt.
6
- *
7
- * Modules are assembled in priority order (1 = highest, assembled first).
8
- * Non-compactable modules are never truncated when token budget is tight.
9
- */
10
- /**
11
- * Configuration passed to each prompt module during assembly.
12
- * Contains all the context needed to build module-specific content.
13
- */
14
- /**
15
- * Organizational role derived from team hierarchy.
16
- * Determines role boundary rules and event subscriptions.
17
- */
18
- export type OrgRole = 'orchestrator' | 'team-lead' | 'executor';
19
- /**
20
- * Autonomy level controls the decision rights matrix.
21
- * - directed: Execute assigned tasks only, escalate all ambiguity.
22
- * - bounded: Make decisions within task/domain scope, log rationale.
23
- * - domain_autonomous: Monitor domain continuously, make approved decisions without waiting.
24
- */
25
- export type AutonomyLevel = 'directed' | 'bounded' | 'domain_autonomous';
26
- export interface ModuleConfig {
27
- /** Agent's session name (e.g. 'crewly-product-sam-217bfbbf') */
28
- sessionName: string;
29
- /** Agent's member ID (UUID) */
30
- memberId: string;
31
- /** Agent's role (e.g. 'developer', 'orchestrator') */
32
- role: string;
33
- /** Team ID this agent belongs to */
34
- teamId?: string;
35
- /** Absolute path to the project directory */
36
- projectPath?: string;
37
- /** Runtime type determines formatting and injection strategy */
38
- runtimeType?: 'claude-code' | 'gemini-cli' | 'codex' | 'crewly-agent';
39
- /** Whether this agent can delegate tasks to subordinates */
40
- canDelegate?: boolean;
41
- /** Resolved subordinate details for TL agents */
42
- subordinates?: SubordinateInfoCompat[];
43
- /** Absolute path to agent skill scripts */
44
- agentSkillsPath: string;
45
- /** Absolute path to team-leader skill scripts */
46
- tlSkillsPath: string;
47
- /** Absolute path to the project root (where config/ lives) */
48
- projectRoot: string;
49
- /** Organizational role derived from team hierarchy (orchestrator, team-lead, executor) */
50
- orgRole?: OrgRole;
51
- /** Autonomy level controlling the decision rights matrix */
52
- autonomyLevel?: AutonomyLevel;
53
- /** Capability flags (e.g., ['can-decide', 'can-verify']) */
54
- capabilities?: string[];
55
- /** Domain SOP name — loads config/domain-sops/{domainSOP}.sop.md */
56
- domainSOP?: string;
57
- /** Risk policy name — loads config/risk-policies/{riskPolicy}.policy.md */
58
- riskPolicy?: string;
59
- /** Job title for this position: "Frontend Tech Lead" */
60
- jobTitle?: string;
61
- /** What this member is responsible for */
62
- jobDescription?: string;
63
- /** Member-level ownership scope */
64
- ownershipScope?: {
65
- domains: string[];
66
- deliverables: string[];
67
- areas?: string[];
68
- };
69
- /** Team-level ownership scope */
70
- teamOwnershipScope?: {
71
- domains: string[];
72
- deliverables: string[];
73
- areas?: string[];
74
- };
75
- /** Team's service contract */
76
- serviceContract?: {
77
- accepts: string[];
78
- avoids: string[];
79
- expectedOutput: string[];
80
- };
81
- /** Expert profile ID — loads config/experts/{expertId}.md or Pro expert library */
82
- expertId?: string;
83
- /** Team description — injected into agent prompt to guide team-aligned behavior */
84
- teamDescription?: string;
85
- /** Team mission / OKR statement — injected into agent prompt for goal alignment */
86
- teamMission?: string;
87
- /** Team budget configuration — injected so agents can respect cost constraints */
88
- teamBudget?: {
89
- maxTokensPerDay?: number;
90
- maxUsdPerMonth?: number;
91
- alertThreshold?: number;
92
- };
93
- /** Team quality gate — injected so agents know review requirements */
94
- teamQualityGate?: {
95
- reviewerId?: string;
96
- autoApprove?: boolean;
97
- minQualityScore?: number;
98
- };
99
- /** Absolute path to team norms directory (from template application) */
100
- teamNormsPath?: string;
101
- /**
102
- * Human-readable team slug used for resolving slug-named team files
103
- * (e.g. `<teamSlug>-team-sub-okr.md` under `.crewly/goals/`).
104
- * Populated by PromptBuilderService from team metadata when available.
105
- * Optional — modules MUST tolerate undefined and skip slug-dependent
106
- * sections silently.
107
- */
108
- teamSlug?: string;
109
- /**
110
- * Team-graph ancestor IDs (parent, grandparent, ...) used by modules
111
- * that need to surface inherited org context such as parent-team
112
- * missions / OKRs. Caller resolves the chain; modules consume it
113
- * read-only. Empty / undefined means "no ancestors" — modules MUST
114
- * default to a single-team view rather than error.
115
- */
116
- teamAncestorIds?: string[];
117
- /**
118
- * When true, the prompt assembler skips non-core modules to reduce token usage
119
- * during eval runs. Core modules: identity, soul, role-boundary, recovery.
120
- */
121
- evalMode?: boolean;
122
- }
123
- /**
124
- * Subordinate info compatible with the existing SubordinateInfo type
125
- */
126
- export interface SubordinateInfoCompat {
127
- name: string;
128
- sessionName: string;
129
- role: string;
130
- memberId: string;
131
- }
132
- /**
133
- * Result of building a single prompt module.
134
- * Includes the content and metadata for budget tracking.
135
- */
136
- export interface ModuleBuildResult {
137
- /** Module name */
138
- name: string;
139
- /** Generated markdown content */
140
- content: string;
141
- /** Estimated token count of the content */
142
- estimatedTokens: number;
143
- }
144
- /**
145
- * Interface that all prompt modules must implement.
146
- *
147
- * @example
148
- * ```typescript
149
- * class IdentityModule implements PromptModule {
150
- * name = 'identity';
151
- * priority = 1;
152
- * maxTokens = 150;
153
- * compactable = false;
154
- *
155
- * shouldInclude(_config: ModuleConfig): boolean { return true; }
156
- *
157
- * async build(config: ModuleConfig): Promise<string> {
158
- * return `## Your Identity\n- **Session Name:** ${config.sessionName}`;
159
- * }
160
- * }
161
- * ```
162
- */
163
- export interface PromptModule {
164
- /** Module name (used for logging and debugging) */
165
- name: string;
166
- /** Assembly priority (1 = highest, assembled first) */
167
- priority: number;
168
- /** Token soft cap for this module */
169
- maxTokens: number;
170
- /** Whether this module can be skipped when token budget is tight */
171
- compactable: boolean;
172
- /** Condition check — return false to skip this module */
173
- shouldInclude(config: ModuleConfig): boolean;
174
- /** Build module content as markdown string */
175
- build(config: ModuleConfig): Promise<string>;
176
- }
177
- /**
178
- * Report returned by PromptAssemblyService.assemble() describing
179
- * token usage and any truncation that occurred.
180
- */
181
- export interface AssemblyReport {
182
- /** Total estimated tokens in the final prompt */
183
- totalTokens: number;
184
- /** Per-module token breakdown */
185
- moduleBreakdown: ModuleBuildResult[];
186
- /** Modules that were truncated or removed to fit budget */
187
- truncated: TruncatedModuleInfo[];
188
- }
189
- /**
190
- * Info about a module that was truncated or removed during assembly.
191
- */
192
- export interface TruncatedModuleInfo {
193
- /** Module name */
194
- name: string;
195
- /** Original estimated tokens before truncation */
196
- originalTokens: number;
197
- /** Tokens after truncation (0 if fully removed) */
198
- finalTokens: number;
199
- /** What happened: 'trimmed' (to 50%) or 'removed' (dropped entirely) */
200
- action: 'trimmed' | 'removed';
201
- }
202
- /**
203
- * Load a role-specific fragment file from config/roles/{role}/fragments/{fragmentName}.md.
204
- * Returns null if the file doesn't exist.
205
- *
206
- * @param projectRoot - Project root path (where config/ lives)
207
- * @param role - Agent role (e.g. 'orchestrator')
208
- * @param fragmentName - Fragment file name without .md extension
209
- * @returns Fragment content string or null
210
- */
211
- export declare function loadRoleFragment(projectRoot: string, role: string, fragmentName: string): string | null;
212
- /**
213
- * Estimate token count from a string.
214
- * Uses the rough heuristic of ~4 characters per token (suitable for English/code mix).
215
- *
216
- * @param text - Text to estimate tokens for
217
- * @returns Estimated token count
218
- */
219
- export declare function estimateTokens(text: string): number;
220
- //# sourceMappingURL=prompt-module.interface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-module.interface.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/prompt-module.interface.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- /**
4
- * Load a role-specific fragment file from config/roles/{role}/fragments/{fragmentName}.md.
5
- * Returns null if the file doesn't exist.
6
- *
7
- * @param projectRoot - Project root path (where config/ lives)
8
- * @param role - Agent role (e.g. 'orchestrator')
9
- * @param fragmentName - Fragment file name without .md extension
10
- * @returns Fragment content string or null
11
- */
12
- export function loadRoleFragment(projectRoot, role, fragmentName) {
13
- try {
14
- const fragmentPath = path.join(projectRoot, 'config', 'roles', role, 'fragments', `${fragmentName}.md`);
15
- if (fs.existsSync(fragmentPath)) {
16
- return fs.readFileSync(fragmentPath, 'utf-8');
17
- }
18
- }
19
- catch {
20
- // Fragment not found — fall back to inline content
21
- }
22
- return null;
23
- }
24
- /**
25
- * Estimate token count from a string.
26
- * Uses the rough heuristic of ~4 characters per token (suitable for English/code mix).
27
- *
28
- * @param text - Text to estimate tokens for
29
- * @returns Estimated token count
30
- */
31
- export function estimateTokens(text) {
32
- if (!text)
33
- return 0;
34
- // ~4 chars per token is a reasonable estimate for English + code
35
- return Math.ceil(text.length / 4);
36
- }
37
- //# sourceMappingURL=prompt-module.interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-module.interface.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/prompt-module.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAyM7B;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC/B,WAAmB,EACnB,IAAY,EACZ,YAAoB;IAEpB,IAAI,CAAC;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC;QACxG,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,mDAAmD;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,iEAAiE;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -1,56 +0,0 @@
1
- /**
2
- * FTS5 Search Strategy
3
- *
4
- * Implements the KnowledgeSearchStrategy interface using the SQLite FTS5
5
- * full-text search index. Maps FTS5 BM25-ranked results to the existing
6
- * ScoredDocument format used by KnowledgeSearchService.
7
- *
8
- * @module services/knowledge/fts5-search-strategy
9
- */
10
- import type { KnowledgeSearchStrategy, ScoredDocument } from './knowledge-search.service.js';
11
- import type { KnowledgeDocumentSummary } from '../../types/knowledge.types.js';
12
- import { WikiCompilerService } from './wiki-compiler.service.js';
13
- /**
14
- * FTS5-based search strategy for the Wiki-First Knowledge System.
15
- *
16
- * This strategy provides pure full-text search via SQLite FTS5 with BM25 ranking.
17
- *
18
- * Note on semantic fallback (design doc Section 10): The 10% semantic fallback
19
- * weight is achieved at the MemoryService level, which runs both FTS5 knowledge
20
- * search AND vector-based semantic search in parallel. This strategy intentionally
21
- * does not mix semantic results — that composition happens upstream in the recall
22
- * pipeline (MemoryService.recall -> searchKnowledgeDocuments + semanticSearch).
23
- *
24
- * Uses SQLite FTS5 MATCH with BM25 ranking for fast, zero-cost retrieval.
25
- * Results are mapped back to the KnowledgeDocumentSummary objects provided
26
- * by the caller, falling back to minimal summaries when a document is found
27
- * in the FTS5 index but not in the provided documents array.
28
- *
29
- * @example
30
- * ```typescript
31
- * const strategy = new Fts5SearchStrategy(wikiCompiler);
32
- * const results = await strategy.search('deployment guide', documents);
33
- * ```
34
- */
35
- export declare class Fts5SearchStrategy implements KnowledgeSearchStrategy {
36
- private readonly wikiCompiler;
37
- private readonly logger;
38
- /**
39
- * Create an Fts5SearchStrategy.
40
- *
41
- * @param wikiCompiler - The WikiCompilerService instance providing FTS5 search
42
- */
43
- constructor(wikiCompiler: WikiCompilerService);
44
- /**
45
- * Search for documents matching the query using FTS5 full-text search.
46
- *
47
- * FTS5 BM25 rank values are negative (more negative = more relevant),
48
- * so scores are converted to positive values for the ScoredDocument interface.
49
- *
50
- * @param query - The search query text
51
- * @param documents - Candidate document summaries to match against
52
- * @returns Documents sorted by descending relevance score
53
- */
54
- search(query: string, documents: KnowledgeDocumentSummary[]): Promise<ScoredDocument[]>;
55
- }
56
- //# sourceMappingURL=fts5-search-strategy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fts5-search-strategy.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/fts5-search-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,kBAAmB,YAAW,uBAAuB;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC;;;;OAIG;gBACS,YAAY,EAAE,mBAAmB;IAK7C;;;;;;;;;OASG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAyC9F"}
@@ -1,91 +0,0 @@
1
- /**
2
- * FTS5 Search Strategy
3
- *
4
- * Implements the KnowledgeSearchStrategy interface using the SQLite FTS5
5
- * full-text search index. Maps FTS5 BM25-ranked results to the existing
6
- * ScoredDocument format used by KnowledgeSearchService.
7
- *
8
- * @module services/knowledge/fts5-search-strategy
9
- */
10
- import { LoggerService } from '../core/logger.service.js';
11
- /**
12
- * FTS5-based search strategy for the Wiki-First Knowledge System.
13
- *
14
- * This strategy provides pure full-text search via SQLite FTS5 with BM25 ranking.
15
- *
16
- * Note on semantic fallback (design doc Section 10): The 10% semantic fallback
17
- * weight is achieved at the MemoryService level, which runs both FTS5 knowledge
18
- * search AND vector-based semantic search in parallel. This strategy intentionally
19
- * does not mix semantic results — that composition happens upstream in the recall
20
- * pipeline (MemoryService.recall -> searchKnowledgeDocuments + semanticSearch).
21
- *
22
- * Uses SQLite FTS5 MATCH with BM25 ranking for fast, zero-cost retrieval.
23
- * Results are mapped back to the KnowledgeDocumentSummary objects provided
24
- * by the caller, falling back to minimal summaries when a document is found
25
- * in the FTS5 index but not in the provided documents array.
26
- *
27
- * @example
28
- * ```typescript
29
- * const strategy = new Fts5SearchStrategy(wikiCompiler);
30
- * const results = await strategy.search('deployment guide', documents);
31
- * ```
32
- */
33
- export class Fts5SearchStrategy {
34
- wikiCompiler;
35
- logger;
36
- /**
37
- * Create an Fts5SearchStrategy.
38
- *
39
- * @param wikiCompiler - The WikiCompilerService instance providing FTS5 search
40
- */
41
- constructor(wikiCompiler) {
42
- this.wikiCompiler = wikiCompiler;
43
- this.logger = LoggerService.getInstance().createComponentLogger('Fts5SearchStrategy');
44
- }
45
- /**
46
- * Search for documents matching the query using FTS5 full-text search.
47
- *
48
- * FTS5 BM25 rank values are negative (more negative = more relevant),
49
- * so scores are converted to positive values for the ScoredDocument interface.
50
- *
51
- * @param query - The search query text
52
- * @param documents - Candidate document summaries to match against
53
- * @returns Documents sorted by descending relevance score
54
- */
55
- async search(query, documents) {
56
- const ftsResults = this.wikiCompiler.search(query, { limit: 10 });
57
- if (ftsResults.length === 0) {
58
- this.logger.debug('FTS5 search returned no results', { query });
59
- return [];
60
- }
61
- // Build a lookup map from the provided documents array
62
- const docById = new Map(documents.map((d) => [d.id, d]));
63
- const scored = [];
64
- for (const ftsResult of ftsResults) {
65
- // FTS5 rank is negative; convert to positive score (higher = more relevant)
66
- const score = Math.abs(ftsResult.rank);
67
- const existingDoc = docById.get(ftsResult.id);
68
- if (existingDoc) {
69
- scored.push({ document: existingDoc, score });
70
- }
71
- else {
72
- // Create a minimal summary for documents in FTS5 but not in the provided list
73
- const minimalDoc = {
74
- id: ftsResult.id,
75
- title: ftsResult.title,
76
- category: ftsResult.category,
77
- tags: ftsResult.tags ? ftsResult.tags.split(/,\s*/) : [],
78
- preview: ftsResult.content.slice(0, 200),
79
- scope: 'global',
80
- createdBy: 'system',
81
- updatedBy: 'system',
82
- createdAt: new Date().toISOString(),
83
- updatedAt: new Date().toISOString(),
84
- };
85
- scored.push({ document: minimalDoc, score });
86
- }
87
- }
88
- return scored.sort((a, b) => b.score - a.score);
89
- }
90
- }
91
- //# sourceMappingURL=fts5-search-strategy.js.map