@mc1global/opencode-jarvis 0.1.1 → 0.3.0

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 (291) hide show
  1. package/dist/application/agent-registry/dtos.d.ts +66 -0
  2. package/dist/application/agent-registry/dtos.d.ts.map +1 -0
  3. package/dist/application/agent-registry/dtos.js +11 -0
  4. package/dist/application/agent-registry/dtos.js.map +1 -0
  5. package/dist/application/agent-registry/use-cases.d.ts +39 -0
  6. package/dist/application/agent-registry/use-cases.d.ts.map +1 -0
  7. package/dist/application/agent-registry/use-cases.js +222 -0
  8. package/dist/application/agent-registry/use-cases.js.map +1 -0
  9. package/dist/application/azure-sync/dtos.d.ts +210 -0
  10. package/dist/application/azure-sync/dtos.d.ts.map +1 -0
  11. package/dist/application/azure-sync/dtos.js +11 -0
  12. package/dist/application/azure-sync/dtos.js.map +1 -0
  13. package/dist/application/azure-sync/field-builders.d.ts +54 -0
  14. package/dist/application/azure-sync/field-builders.d.ts.map +1 -0
  15. package/dist/application/azure-sync/field-builders.js +166 -0
  16. package/dist/application/azure-sync/field-builders.js.map +1 -0
  17. package/dist/application/azure-sync/index.d.ts +16 -0
  18. package/dist/application/azure-sync/index.d.ts.map +1 -0
  19. package/dist/application/azure-sync/index.js +10 -0
  20. package/dist/application/azure-sync/index.js.map +1 -0
  21. package/dist/application/azure-sync/pr-use-cases.d.ts +39 -0
  22. package/dist/application/azure-sync/pr-use-cases.d.ts.map +1 -0
  23. package/dist/application/azure-sync/pr-use-cases.js +192 -0
  24. package/dist/application/azure-sync/pr-use-cases.js.map +1 -0
  25. package/dist/application/azure-sync/pull-use-cases.d.ts +43 -0
  26. package/dist/application/azure-sync/pull-use-cases.d.ts.map +1 -0
  27. package/dist/application/azure-sync/pull-use-cases.js +322 -0
  28. package/dist/application/azure-sync/pull-use-cases.js.map +1 -0
  29. package/dist/application/azure-sync/push-use-cases.d.ts +53 -0
  30. package/dist/application/azure-sync/push-use-cases.d.ts.map +1 -0
  31. package/dist/application/azure-sync/push-use-cases.js +341 -0
  32. package/dist/application/azure-sync/push-use-cases.js.map +1 -0
  33. package/dist/application/azure-sync/reverse-field-builder.d.ts +52 -0
  34. package/dist/application/azure-sync/reverse-field-builder.d.ts.map +1 -0
  35. package/dist/application/azure-sync/reverse-field-builder.js +130 -0
  36. package/dist/application/azure-sync/reverse-field-builder.js.map +1 -0
  37. package/dist/application/azure-sync/task-push-use-cases.d.ts +68 -0
  38. package/dist/application/azure-sync/task-push-use-cases.d.ts.map +1 -0
  39. package/dist/application/azure-sync/task-push-use-cases.js +162 -0
  40. package/dist/application/azure-sync/task-push-use-cases.js.map +1 -0
  41. package/dist/application/config/config-service.d.ts +64 -0
  42. package/dist/application/config/config-service.d.ts.map +1 -0
  43. package/dist/application/config/config-service.js +110 -0
  44. package/dist/application/config/config-service.js.map +1 -0
  45. package/dist/application/config/index.d.ts +5 -0
  46. package/dist/application/config/index.d.ts.map +1 -0
  47. package/dist/application/config/index.js +5 -0
  48. package/dist/application/config/index.js.map +1 -0
  49. package/dist/application/kanban/board-use-cases.d.ts.map +1 -1
  50. package/dist/application/kanban/board-use-cases.js +14 -0
  51. package/dist/application/kanban/board-use-cases.js.map +1 -1
  52. package/dist/application/kanban/card-use-cases.d.ts +21 -2
  53. package/dist/application/kanban/card-use-cases.d.ts.map +1 -1
  54. package/dist/application/kanban/card-use-cases.js +180 -1
  55. package/dist/application/kanban/card-use-cases.js.map +1 -1
  56. package/dist/application/kanban/dtos.d.ts +59 -0
  57. package/dist/application/kanban/dtos.d.ts.map +1 -1
  58. package/dist/application/mcp/index.d.ts +10 -0
  59. package/dist/application/mcp/index.d.ts.map +1 -0
  60. package/dist/application/mcp/index.js +8 -0
  61. package/dist/application/mcp/index.js.map +1 -0
  62. package/dist/application/mcp/middleware.d.ts +91 -0
  63. package/dist/application/mcp/middleware.d.ts.map +1 -0
  64. package/dist/application/mcp/middleware.js +84 -0
  65. package/dist/application/mcp/middleware.js.map +1 -0
  66. package/dist/application/mcp/tool-adapter.d.ts +72 -0
  67. package/dist/application/mcp/tool-adapter.d.ts.map +1 -0
  68. package/dist/application/mcp/tool-adapter.js +132 -0
  69. package/dist/application/mcp/tool-adapter.js.map +1 -0
  70. package/dist/application/pipeline/dtos.d.ts +135 -0
  71. package/dist/application/pipeline/dtos.d.ts.map +1 -0
  72. package/dist/application/pipeline/dtos.js +11 -0
  73. package/dist/application/pipeline/dtos.js.map +1 -0
  74. package/dist/application/pipeline/index.d.ts +8 -0
  75. package/dist/application/pipeline/index.d.ts.map +1 -0
  76. package/dist/application/pipeline/index.js +7 -0
  77. package/dist/application/pipeline/index.js.map +1 -0
  78. package/dist/application/pipeline/use-cases.d.ts +67 -0
  79. package/dist/application/pipeline/use-cases.d.ts.map +1 -0
  80. package/dist/application/pipeline/use-cases.js +413 -0
  81. package/dist/application/pipeline/use-cases.js.map +1 -0
  82. package/dist/application/rag/use-cases.d.ts +3 -0
  83. package/dist/application/rag/use-cases.d.ts.map +1 -1
  84. package/dist/application/rag/use-cases.js +112 -34
  85. package/dist/application/rag/use-cases.js.map +1 -1
  86. package/dist/domain/agent-registry/entities.d.ts +68 -0
  87. package/dist/domain/agent-registry/entities.d.ts.map +1 -0
  88. package/dist/domain/agent-registry/entities.js +177 -0
  89. package/dist/domain/agent-registry/entities.js.map +1 -0
  90. package/dist/domain/agent-registry/repositories.d.ts +56 -0
  91. package/dist/domain/agent-registry/repositories.d.ts.map +1 -0
  92. package/dist/domain/agent-registry/repositories.js +12 -0
  93. package/dist/domain/agent-registry/repositories.js.map +1 -0
  94. package/dist/domain/agent-registry/services.d.ts +87 -0
  95. package/dist/domain/agent-registry/services.d.ts.map +1 -0
  96. package/dist/domain/agent-registry/services.js +188 -0
  97. package/dist/domain/agent-registry/services.js.map +1 -0
  98. package/dist/domain/agent-registry/value-objects.d.ts +145 -0
  99. package/dist/domain/agent-registry/value-objects.d.ts.map +1 -0
  100. package/dist/domain/agent-registry/value-objects.js +339 -0
  101. package/dist/domain/agent-registry/value-objects.js.map +1 -0
  102. package/dist/domain/azure-sync/entities.d.ts +165 -0
  103. package/dist/domain/azure-sync/entities.d.ts.map +1 -0
  104. package/dist/domain/azure-sync/entities.js +203 -0
  105. package/dist/domain/azure-sync/entities.js.map +1 -0
  106. package/dist/domain/azure-sync/index.d.ts +16 -0
  107. package/dist/domain/azure-sync/index.d.ts.map +1 -0
  108. package/dist/domain/azure-sync/index.js +14 -0
  109. package/dist/domain/azure-sync/index.js.map +1 -0
  110. package/dist/domain/azure-sync/ports.d.ts +117 -0
  111. package/dist/domain/azure-sync/ports.d.ts.map +1 -0
  112. package/dist/domain/azure-sync/ports.js +13 -0
  113. package/dist/domain/azure-sync/ports.js.map +1 -0
  114. package/dist/domain/azure-sync/repositories.d.ts +53 -0
  115. package/dist/domain/azure-sync/repositories.d.ts.map +1 -0
  116. package/dist/domain/azure-sync/repositories.js +11 -0
  117. package/dist/domain/azure-sync/repositories.js.map +1 -0
  118. package/dist/domain/azure-sync/services.d.ts +107 -0
  119. package/dist/domain/azure-sync/services.d.ts.map +1 -0
  120. package/dist/domain/azure-sync/services.js +316 -0
  121. package/dist/domain/azure-sync/services.js.map +1 -0
  122. package/dist/domain/azure-sync/value-objects.d.ts +129 -0
  123. package/dist/domain/azure-sync/value-objects.d.ts.map +1 -0
  124. package/dist/domain/azure-sync/value-objects.js +343 -0
  125. package/dist/domain/azure-sync/value-objects.js.map +1 -0
  126. package/dist/domain/config/index.d.ts +9 -0
  127. package/dist/domain/config/index.d.ts.map +1 -0
  128. package/dist/domain/config/index.js +7 -0
  129. package/dist/domain/config/index.js.map +1 -0
  130. package/dist/domain/config/repositories.d.ts +36 -0
  131. package/dist/domain/config/repositories.d.ts.map +1 -0
  132. package/dist/domain/config/repositories.js +12 -0
  133. package/dist/domain/config/repositories.js.map +1 -0
  134. package/dist/domain/config/value-objects.d.ts +112 -0
  135. package/dist/domain/config/value-objects.d.ts.map +1 -0
  136. package/dist/domain/config/value-objects.js +93 -0
  137. package/dist/domain/config/value-objects.js.map +1 -0
  138. package/dist/domain/governance/policies.d.ts.map +1 -1
  139. package/dist/domain/governance/policies.js +70 -0
  140. package/dist/domain/governance/policies.js.map +1 -1
  141. package/dist/domain/kanban/entities.d.ts +67 -15
  142. package/dist/domain/kanban/entities.d.ts.map +1 -1
  143. package/dist/domain/kanban/entities.js +177 -14
  144. package/dist/domain/kanban/entities.js.map +1 -1
  145. package/dist/domain/kanban/grooming.d.ts +27 -7
  146. package/dist/domain/kanban/grooming.d.ts.map +1 -1
  147. package/dist/domain/kanban/grooming.js +50 -12
  148. package/dist/domain/kanban/grooming.js.map +1 -1
  149. package/dist/domain/kanban/services.d.ts +16 -2
  150. package/dist/domain/kanban/services.d.ts.map +1 -1
  151. package/dist/domain/kanban/services.js +29 -2
  152. package/dist/domain/kanban/services.js.map +1 -1
  153. package/dist/domain/kanban/value-objects.d.ts +48 -0
  154. package/dist/domain/kanban/value-objects.d.ts.map +1 -1
  155. package/dist/domain/kanban/value-objects.js +53 -0
  156. package/dist/domain/kanban/value-objects.js.map +1 -1
  157. package/dist/domain/pipeline/gate.d.ts +75 -0
  158. package/dist/domain/pipeline/gate.d.ts.map +1 -0
  159. package/dist/domain/pipeline/gate.js +158 -0
  160. package/dist/domain/pipeline/gate.js.map +1 -0
  161. package/dist/domain/pipeline/index.d.ts +13 -0
  162. package/dist/domain/pipeline/index.d.ts.map +1 -0
  163. package/dist/domain/pipeline/index.js +14 -0
  164. package/dist/domain/pipeline/index.js.map +1 -0
  165. package/dist/domain/pipeline/pipeline.d.ts +99 -0
  166. package/dist/domain/pipeline/pipeline.d.ts.map +1 -0
  167. package/dist/domain/pipeline/pipeline.js +257 -0
  168. package/dist/domain/pipeline/pipeline.js.map +1 -0
  169. package/dist/domain/pipeline/ports.d.ts +120 -0
  170. package/dist/domain/pipeline/ports.d.ts.map +1 -0
  171. package/dist/domain/pipeline/ports.js +12 -0
  172. package/dist/domain/pipeline/ports.js.map +1 -0
  173. package/dist/domain/pipeline/repositories.d.ts +66 -0
  174. package/dist/domain/pipeline/repositories.d.ts.map +1 -0
  175. package/dist/domain/pipeline/repositories.js +11 -0
  176. package/dist/domain/pipeline/repositories.js.map +1 -0
  177. package/dist/domain/pipeline/services.d.ts +77 -0
  178. package/dist/domain/pipeline/services.d.ts.map +1 -0
  179. package/dist/domain/pipeline/services.js +156 -0
  180. package/dist/domain/pipeline/services.js.map +1 -0
  181. package/dist/domain/pipeline/value-objects.d.ts +117 -0
  182. package/dist/domain/pipeline/value-objects.d.ts.map +1 -0
  183. package/dist/domain/pipeline/value-objects.js +313 -0
  184. package/dist/domain/pipeline/value-objects.js.map +1 -0
  185. package/dist/domain/rag/value-objects.d.ts +9 -2
  186. package/dist/domain/rag/value-objects.d.ts.map +1 -1
  187. package/dist/domain/rag/value-objects.js +8 -2
  188. package/dist/domain/rag/value-objects.js.map +1 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +113 -75
  191. package/dist/index.js.map +1 -1
  192. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts +29 -0
  193. package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts.map +1 -0
  194. package/dist/infrastructure/agent-registry/agent-profile-repository.js +109 -0
  195. package/dist/infrastructure/agent-registry/agent-profile-repository.js.map +1 -0
  196. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts +28 -0
  197. package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts.map +1 -0
  198. package/dist/infrastructure/agent-registry/agent-session-adapter.js +61 -0
  199. package/dist/infrastructure/agent-registry/agent-session-adapter.js.map +1 -0
  200. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts +19 -0
  201. package/dist/infrastructure/agent-registry/built-in-profiles.d.ts.map +1 -0
  202. package/dist/infrastructure/agent-registry/built-in-profiles.js +210 -0
  203. package/dist/infrastructure/agent-registry/built-in-profiles.js.map +1 -0
  204. package/dist/infrastructure/azure-sync/azure-auth.d.ts +40 -0
  205. package/dist/infrastructure/azure-sync/azure-auth.d.ts.map +1 -0
  206. package/dist/infrastructure/azure-sync/azure-auth.js +94 -0
  207. package/dist/infrastructure/azure-sync/azure-auth.js.map +1 -0
  208. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts +43 -0
  209. package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -0
  210. package/dist/infrastructure/azure-sync/azure-devops-client.js +296 -0
  211. package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -0
  212. package/dist/infrastructure/azure-sync/index.d.ts +9 -0
  213. package/dist/infrastructure/azure-sync/index.d.ts.map +1 -0
  214. package/dist/infrastructure/azure-sync/index.js +12 -0
  215. package/dist/infrastructure/azure-sync/index.js.map +1 -0
  216. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts +39 -0
  217. package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts.map +1 -0
  218. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js +202 -0
  219. package/dist/infrastructure/azure-sync/sqlite-sync-repository.js.map +1 -0
  220. package/dist/infrastructure/config/index.d.ts +5 -0
  221. package/dist/infrastructure/config/index.d.ts.map +1 -0
  222. package/dist/infrastructure/config/index.js +5 -0
  223. package/dist/infrastructure/config/index.js.map +1 -0
  224. package/dist/infrastructure/config/yaml-config-repository.d.ts +22 -0
  225. package/dist/infrastructure/config/yaml-config-repository.d.ts.map +1 -0
  226. package/dist/infrastructure/config/yaml-config-repository.js +68 -0
  227. package/dist/infrastructure/config/yaml-config-repository.js.map +1 -0
  228. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts +21 -0
  229. package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts.map +1 -0
  230. package/dist/infrastructure/domain-map/llm-prompt-factory.js +49 -0
  231. package/dist/infrastructure/domain-map/llm-prompt-factory.js.map +1 -0
  232. package/dist/infrastructure/kanban/card-repository.d.ts +6 -0
  233. package/dist/infrastructure/kanban/card-repository.d.ts.map +1 -1
  234. package/dist/infrastructure/kanban/card-repository.js +79 -7
  235. package/dist/infrastructure/kanban/card-repository.js.map +1 -1
  236. package/dist/infrastructure/pipeline/dagger-adapter.d.ts +50 -0
  237. package/dist/infrastructure/pipeline/dagger-adapter.d.ts.map +1 -0
  238. package/dist/infrastructure/pipeline/dagger-adapter.js +153 -0
  239. package/dist/infrastructure/pipeline/dagger-adapter.js.map +1 -0
  240. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts +35 -0
  241. package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts.map +1 -0
  242. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js +132 -0
  243. package/dist/infrastructure/pipeline/dagger-scaffold-generator.js.map +1 -0
  244. package/dist/infrastructure/pipeline/index.d.ts +20 -0
  245. package/dist/infrastructure/pipeline/index.d.ts.map +1 -0
  246. package/dist/infrastructure/pipeline/index.js +19 -0
  247. package/dist/infrastructure/pipeline/index.js.map +1 -0
  248. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts +23 -0
  249. package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts.map +1 -0
  250. package/dist/infrastructure/pipeline/pipeline-template-registry.js +63 -0
  251. package/dist/infrastructure/pipeline/pipeline-template-registry.js.map +1 -0
  252. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts +17 -0
  253. package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts.map +1 -0
  254. package/dist/infrastructure/pipeline/scaffold-templates-extra.js +467 -0
  255. package/dist/infrastructure/pipeline/scaffold-templates-extra.js.map +1 -0
  256. package/dist/infrastructure/pipeline/scaffold-templates.d.ts +23 -0
  257. package/dist/infrastructure/pipeline/scaffold-templates.d.ts.map +1 -0
  258. package/dist/infrastructure/pipeline/scaffold-templates.js +476 -0
  259. package/dist/infrastructure/pipeline/scaffold-templates.js.map +1 -0
  260. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts +32 -0
  261. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts.map +1 -0
  262. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js +197 -0
  263. package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js.map +1 -0
  264. package/dist/mcp-server.d.ts +3 -0
  265. package/dist/mcp-server.d.ts.map +1 -0
  266. package/dist/mcp-server.js +300 -0
  267. package/dist/mcp-server.js.map +1 -0
  268. package/dist/tools/agent-registry-tools.d.ts +11 -0
  269. package/dist/tools/agent-registry-tools.d.ts.map +1 -0
  270. package/dist/tools/agent-registry-tools.js +208 -0
  271. package/dist/tools/agent-registry-tools.js.map +1 -0
  272. package/dist/tools/azure-sync-tools.d.ts +15 -0
  273. package/dist/tools/azure-sync-tools.d.ts.map +1 -0
  274. package/dist/tools/azure-sync-tools.js +332 -0
  275. package/dist/tools/azure-sync-tools.js.map +1 -0
  276. package/dist/tools/kanban-card-tools.d.ts.map +1 -1
  277. package/dist/tools/kanban-card-tools.js +41 -16
  278. package/dist/tools/kanban-card-tools.js.map +1 -1
  279. package/dist/tools/kanban-gate-tools.d.ts +7 -0
  280. package/dist/tools/kanban-gate-tools.d.ts.map +1 -0
  281. package/dist/tools/kanban-gate-tools.js +106 -0
  282. package/dist/tools/kanban-gate-tools.js.map +1 -0
  283. package/dist/tools/kanban-grooming-tools.d.ts +7 -0
  284. package/dist/tools/kanban-grooming-tools.d.ts.map +1 -0
  285. package/dist/tools/kanban-grooming-tools.js +180 -0
  286. package/dist/tools/kanban-grooming-tools.js.map +1 -0
  287. package/dist/tools/pipeline-tools.d.ts +15 -0
  288. package/dist/tools/pipeline-tools.d.ts.map +1 -0
  289. package/dist/tools/pipeline-tools.js +424 -0
  290. package/dist/tools/pipeline-tools.js.map +1 -0
  291. package/package.json +7 -2
@@ -0,0 +1,413 @@
1
+ import { ok, fail } from "../../domain/shared/value-objects.js";
2
+ import { WorkspaceId } from "../../domain/shared/value-objects.js";
3
+ import { PipelineId, GateId, isValidPipelineScope, isValidStackTemplate, PIPELINE_SCOPES, STACK_TEMPLATES, PIPELINE_STATUSES, } from "../../domain/pipeline/value-objects.js";
4
+ // ── Mappers ────────────────────────────────────────────────────────────
5
+ /** Maps a Gate entity to a GateResponse DTO. */
6
+ function toGateResponse(gate) {
7
+ return {
8
+ id: gate.id.value,
9
+ type: gate.type,
10
+ status: gate.status,
11
+ order: gate.order,
12
+ daggerFunction: gate.daggerFunction.toString(),
13
+ skipPolicy: gate.skipPolicy,
14
+ ...(gate.command !== undefined ? { command: gate.command } : {}),
15
+ ...(gate.output !== undefined ? { output: gate.output.toString() } : {}),
16
+ ...(gate.skippedReason !== undefined ? { skippedReason: gate.skippedReason } : {}),
17
+ ...(gate.approvedBy !== undefined ? { approvedBy: gate.approvedBy } : {}),
18
+ ...(gate.startedAt !== undefined ? { startedAt: gate.startedAt.toISO() } : {}),
19
+ ...(gate.completedAt !== undefined ? { completedAt: gate.completedAt.toISO() } : {}),
20
+ };
21
+ }
22
+ /** Maps a Pipeline entity to a PipelineResponse DTO. */
23
+ function toPipelineResponse(pipeline) {
24
+ return {
25
+ id: pipeline.id.value,
26
+ workspaceId: pipeline.workspaceId.value,
27
+ templateId: pipeline.templateId,
28
+ scope: pipeline.scope,
29
+ status: pipeline.status,
30
+ version: pipeline.version.toString(),
31
+ gates: pipeline.gates.map(toGateResponse),
32
+ gateCount: pipeline.gateCount,
33
+ ...(pipeline.currentGate !== undefined
34
+ ? { currentGate: pipeline.currentGate.id.value }
35
+ : {}),
36
+ ...(pipeline.nextGate !== undefined
37
+ ? { nextGate: pipeline.nextGate.id.value }
38
+ : {}),
39
+ createdAt: pipeline.createdAt.toISO(),
40
+ ...(pipeline.activatedAt !== undefined
41
+ ? { activatedAt: pipeline.activatedAt.toISO() }
42
+ : {}),
43
+ ...(pipeline.completedAt !== undefined
44
+ ? { completedAt: pipeline.completedAt.toISO() }
45
+ : {}),
46
+ ...(pipeline.cardId !== undefined ? { cardId: pipeline.cardId } : {}),
47
+ };
48
+ }
49
+ // ── Validation Helpers ─────────────────────────────────────────────────
50
+ function parsePipelineStatus(value) {
51
+ return PIPELINE_STATUSES.includes(value)
52
+ ? value
53
+ : null;
54
+ }
55
+ function parsePipelineScope(value) {
56
+ return isValidPipelineScope(value) ? value : null;
57
+ }
58
+ function parseStackTemplate(value) {
59
+ return isValidStackTemplate(value) ? value : null;
60
+ }
61
+ // ── Use Cases ──────────────────────────────────────────────────────────
62
+ /**
63
+ * Pipeline application use cases.
64
+ *
65
+ * Orchestrates pipeline lifecycle (init, activate, cancel, retry),
66
+ * gate operations (run, pass, fail, skip, retry), queries, and
67
+ * template browsing.
68
+ */
69
+ export class PipelineUseCases {
70
+ pipelineRepo;
71
+ templateRepo;
72
+ pipelineFactory;
73
+ gateEnforcer;
74
+ daggerPort;
75
+ scaffoldPort;
76
+ gateMetricsRecorder;
77
+ constructor(pipelineRepo, templateRepo, pipelineFactory, gateEnforcer, daggerPort, scaffoldPort, gateMetricsRecorder) {
78
+ this.pipelineRepo = pipelineRepo;
79
+ this.templateRepo = templateRepo;
80
+ this.pipelineFactory = pipelineFactory;
81
+ this.gateEnforcer = gateEnforcer;
82
+ this.daggerPort = daggerPort;
83
+ this.scaffoldPort = scaffoldPort;
84
+ this.gateMetricsRecorder = gateMetricsRecorder;
85
+ }
86
+ // ── Pipeline Lifecycle ───────────────────────────────────────────
87
+ /** Create a new pipeline from a stack template. Returns pipeline in draft status. */
88
+ async initPipeline(request) {
89
+ try {
90
+ const stack = parseStackTemplate(request.stack);
91
+ if (stack === null) {
92
+ return fail(`Invalid stack template: "${request.stack}". ` +
93
+ `Valid: ${STACK_TEMPLATES.join(", ")}`);
94
+ }
95
+ const scope = parsePipelineScope(request.scope);
96
+ if (scope === null) {
97
+ return fail(`Invalid pipeline scope: "${request.scope}". ` +
98
+ `Valid: ${PIPELINE_SCOPES.join(", ")}`);
99
+ }
100
+ const workspace = WorkspaceId.create(request.workspace);
101
+ const result = await this.pipelineFactory.create({
102
+ workspaceId: workspace,
103
+ stack,
104
+ scope,
105
+ version: request.version,
106
+ ...(request.cardId !== undefined ? { cardId: request.cardId } : {}),
107
+ });
108
+ if (!result.success)
109
+ return fail(result.error);
110
+ await this.pipelineRepo.save(result.data);
111
+ return ok(toPipelineResponse(result.data));
112
+ }
113
+ catch (error) {
114
+ return fail(`Failed to init pipeline: ${String(error)}`);
115
+ }
116
+ }
117
+ /** Activate a draft pipeline, making it runnable. */
118
+ async activatePipeline(request) {
119
+ try {
120
+ const pipelineId = PipelineId.from(request.pipelineId);
121
+ const result = await this.gateEnforcer.activatePipeline(pipelineId);
122
+ if (!result.success)
123
+ return fail(result.error);
124
+ return ok(toPipelineResponse(result.data));
125
+ }
126
+ catch (error) {
127
+ return fail(`Failed to activate pipeline: ${String(error)}`);
128
+ }
129
+ }
130
+ /** Cancel a draft or active pipeline. */
131
+ async cancelPipeline(request) {
132
+ try {
133
+ const pipelineId = PipelineId.from(request.pipelineId);
134
+ const result = await this.gateEnforcer.cancelPipeline(pipelineId);
135
+ if (!result.success)
136
+ return fail(result.error);
137
+ return ok(toPipelineResponse(result.data));
138
+ }
139
+ catch (error) {
140
+ return fail(`Failed to cancel pipeline: ${String(error)}`);
141
+ }
142
+ }
143
+ /** Retry a failed pipeline (resets to active, retries the failed gate). */
144
+ async retryPipeline(request) {
145
+ try {
146
+ const pipelineId = PipelineId.from(request.pipelineId);
147
+ const result = await this.gateEnforcer.retryPipeline(pipelineId);
148
+ if (!result.success)
149
+ return fail(result.error);
150
+ return ok(toPipelineResponse(result.data));
151
+ }
152
+ catch (error) {
153
+ return fail(`Failed to retry pipeline: ${String(error)}`);
154
+ }
155
+ }
156
+ // ── Gate Operations ──────────────────────────────────────────────
157
+ /** Execute a gate via Dagger. Starts the gate, runs the Dagger function, then passes/fails. */
158
+ async runGate(request) {
159
+ try {
160
+ const pipelineId = PipelineId.from(request.pipelineId);
161
+ const gateId = GateId.from(request.gateId);
162
+ // Start the gate
163
+ const startResult = await this.gateEnforcer.startGate(pipelineId, gateId);
164
+ if (!startResult.success)
165
+ return fail(startResult.error);
166
+ // Find the gate to get its dagger function name
167
+ const gate = startResult.data.findGate(gateId);
168
+ if (gate === undefined) {
169
+ return fail(`Gate ${request.gateId} not found after start`);
170
+ }
171
+ // Run via Dagger
172
+ const daggerResult = await this.daggerPort.run({
173
+ moduleDir: request.moduleDir,
174
+ functionName: gate.daggerFunction.toString(),
175
+ ...(request.args !== undefined ? { args: request.args } : {}),
176
+ ...(request.timeoutMs !== undefined ? { timeoutMs: request.timeoutMs } : {}),
177
+ });
178
+ if (!daggerResult.success) {
179
+ const failResult = await this.gateEnforcer.failGate(pipelineId, gateId, daggerResult.error);
180
+ if (!failResult.success)
181
+ return fail(failResult.error);
182
+ await this.recordGateMetrics(request.pipelineId, request.gateId, false, 0, failResult.data.cardId);
183
+ return ok({
184
+ pipeline: toPipelineResponse(failResult.data),
185
+ gateId: request.gateId,
186
+ daggerResult: { success: false, output: daggerResult.error, exitCode: -1, durationMs: 0 },
187
+ });
188
+ }
189
+ const dagger = daggerResult.data;
190
+ if (dagger.success) {
191
+ const passResult = await this.gateEnforcer.passGate(pipelineId, gateId, dagger.output);
192
+ if (!passResult.success)
193
+ return fail(passResult.error);
194
+ await this.recordGateMetrics(request.pipelineId, request.gateId, true, dagger.durationMs, passResult.data.cardId);
195
+ return ok({
196
+ pipeline: toPipelineResponse(passResult.data),
197
+ gateId: request.gateId,
198
+ daggerResult: { success: true, output: dagger.output, exitCode: dagger.exitCode, durationMs: dagger.durationMs },
199
+ });
200
+ }
201
+ else {
202
+ const failResult = await this.gateEnforcer.failGate(pipelineId, gateId, dagger.output);
203
+ if (!failResult.success)
204
+ return fail(failResult.error);
205
+ await this.recordGateMetrics(request.pipelineId, request.gateId, false, dagger.durationMs, failResult.data.cardId);
206
+ return ok({
207
+ pipeline: toPipelineResponse(failResult.data),
208
+ gateId: request.gateId,
209
+ daggerResult: { success: false, output: dagger.output, exitCode: dagger.exitCode, durationMs: dagger.durationMs },
210
+ });
211
+ }
212
+ }
213
+ catch (error) {
214
+ return fail(`Failed to run gate: ${String(error)}`);
215
+ }
216
+ }
217
+ /** Manually mark a gate as passed. */
218
+ async passGate(request) {
219
+ try {
220
+ const pipelineId = PipelineId.from(request.pipelineId);
221
+ const gateId = GateId.from(request.gateId);
222
+ // Start then pass (for manual pass, gate must go through running first)
223
+ const startResult = await this.gateEnforcer.startGate(pipelineId, gateId);
224
+ if (!startResult.success)
225
+ return fail(startResult.error);
226
+ const result = await this.gateEnforcer.passGate(pipelineId, gateId, request.output);
227
+ if (!result.success)
228
+ return fail(result.error);
229
+ return ok(toPipelineResponse(result.data));
230
+ }
231
+ catch (error) {
232
+ return fail(`Failed to pass gate: ${String(error)}`);
233
+ }
234
+ }
235
+ /** Manually mark a gate as failed. */
236
+ async failGate(request) {
237
+ try {
238
+ const pipelineId = PipelineId.from(request.pipelineId);
239
+ const gateId = GateId.from(request.gateId);
240
+ // Start then fail
241
+ const startResult = await this.gateEnforcer.startGate(pipelineId, gateId);
242
+ if (!startResult.success)
243
+ return fail(startResult.error);
244
+ const result = await this.gateEnforcer.failGate(pipelineId, gateId, request.output);
245
+ if (!result.success)
246
+ return fail(result.error);
247
+ return ok(toPipelineResponse(result.data));
248
+ }
249
+ catch (error) {
250
+ return fail(`Failed to fail gate: ${String(error)}`);
251
+ }
252
+ }
253
+ /** Skip a gate with justification (enforces skip policy from domain). */
254
+ async skipGate(request) {
255
+ try {
256
+ const pipelineId = PipelineId.from(request.pipelineId);
257
+ const gateId = GateId.from(request.gateId);
258
+ const result = await this.gateEnforcer.skipGate(pipelineId, gateId, request.reason, request.approvedBy);
259
+ if (!result.success)
260
+ return fail(result.error);
261
+ return ok(toPipelineResponse(result.data));
262
+ }
263
+ catch (error) {
264
+ return fail(`Failed to skip gate: ${String(error)}`);
265
+ }
266
+ }
267
+ /** Retry a failed gate (resets to pending). */
268
+ async retryGate(request) {
269
+ try {
270
+ const pipelineId = PipelineId.from(request.pipelineId);
271
+ const gateId = GateId.from(request.gateId);
272
+ const result = await this.gateEnforcer.retryGate(pipelineId, gateId);
273
+ if (!result.success)
274
+ return fail(result.error);
275
+ return ok(toPipelineResponse(result.data));
276
+ }
277
+ catch (error) {
278
+ return fail(`Failed to retry gate: ${String(error)}`);
279
+ }
280
+ }
281
+ // ── Queries ──────────────────────────────────────────────────────
282
+ /** Get a pipeline by ID with all gate details. */
283
+ async getPipeline(request) {
284
+ try {
285
+ const pipelineId = PipelineId.from(request.pipelineId);
286
+ const pipeline = await this.pipelineRepo.findById(pipelineId);
287
+ if (pipeline === undefined)
288
+ return ok(null);
289
+ return ok(toPipelineResponse(pipeline));
290
+ }
291
+ catch (error) {
292
+ return fail(`Failed to get pipeline: ${String(error)}`);
293
+ }
294
+ }
295
+ /** List pipelines for a workspace, optionally filtered by status or scope. */
296
+ async listPipelines(request) {
297
+ try {
298
+ const workspace = WorkspaceId.create(request.workspace);
299
+ let pipelines;
300
+ if (request.status !== undefined) {
301
+ const status = parsePipelineStatus(request.status);
302
+ if (status === null) {
303
+ return fail(`Invalid pipeline status: "${request.status}". ` +
304
+ `Valid: ${PIPELINE_STATUSES.join(", ")}`);
305
+ }
306
+ pipelines = await this.pipelineRepo.findByStatus(workspace, status);
307
+ }
308
+ else if (request.scope !== undefined) {
309
+ const scope = parsePipelineScope(request.scope);
310
+ if (scope === null) {
311
+ return fail(`Invalid pipeline scope: "${request.scope}". ` +
312
+ `Valid: ${PIPELINE_SCOPES.join(", ")}`);
313
+ }
314
+ pipelines = await this.pipelineRepo.findByScope(workspace, scope);
315
+ }
316
+ else {
317
+ pipelines = await this.pipelineRepo.findByWorkspace(workspace);
318
+ }
319
+ return ok(pipelines.map(toPipelineResponse));
320
+ }
321
+ catch (error) {
322
+ return fail(`Failed to list pipelines: ${String(error)}`);
323
+ }
324
+ }
325
+ // ── Template Queries ─────────────────────────────────────────────
326
+ /** List available stack templates. */
327
+ async getTemplates() {
328
+ try {
329
+ const templates = await this.templateRepo.listTemplates();
330
+ return ok({ templates });
331
+ }
332
+ catch (error) {
333
+ return fail(`Failed to list templates: ${String(error)}`);
334
+ }
335
+ }
336
+ /** Get template details for a specific stack + scope. */
337
+ async getTemplate(request) {
338
+ try {
339
+ const stack = parseStackTemplate(request.stack);
340
+ if (stack === null) {
341
+ return fail(`Invalid stack template: "${request.stack}". ` +
342
+ `Valid: ${STACK_TEMPLATES.join(", ")}`);
343
+ }
344
+ const scope = parsePipelineScope(request.scope);
345
+ if (scope === null) {
346
+ return fail(`Invalid pipeline scope: "${request.scope}". ` +
347
+ `Valid: ${PIPELINE_SCOPES.join(", ")}`);
348
+ }
349
+ const template = await this.templateRepo.getTemplate(stack, scope);
350
+ if (template === undefined)
351
+ return ok(null);
352
+ const gateResponses = template.gates.map((g) => ({
353
+ type: g.type,
354
+ daggerFunction: g.daggerFunction,
355
+ skipPolicy: g.skipPolicy,
356
+ ...(g.command !== undefined ? { command: g.command } : {}),
357
+ }));
358
+ return ok({
359
+ stack: template.stack,
360
+ scope: template.scope,
361
+ gates: gateResponses,
362
+ });
363
+ }
364
+ catch (error) {
365
+ return fail(`Failed to get template: ${String(error)}`);
366
+ }
367
+ }
368
+ // ── Scaffold Operations ─────────────────────────────────────────
369
+ /** Generate Dagger module scaffold files for a stack template. */
370
+ async generateScaffold(request) {
371
+ try {
372
+ if (this.scaffoldPort === undefined) {
373
+ return fail("Scaffold generation is not available (no ScaffoldPort configured)");
374
+ }
375
+ const output = this.scaffoldPort.generate(request.stack);
376
+ if (output === undefined) {
377
+ const supported = this.scaffoldPort.supportedStacks();
378
+ return fail(`No scaffold available for stack "${request.stack}". ` +
379
+ `Supported: ${supported.join(", ")}`);
380
+ }
381
+ return ok({
382
+ stack: output.stack,
383
+ sdk: output.sdk,
384
+ moduleName: output.moduleName,
385
+ files: output.files.map((f) => ({ path: f.path, content: f.content })),
386
+ });
387
+ }
388
+ catch (error) {
389
+ return fail(`Failed to generate scaffold: ${String(error)}`);
390
+ }
391
+ }
392
+ /** List stacks that have Dagger scaffold support. */
393
+ async getSupportedStacks() {
394
+ try {
395
+ if (this.scaffoldPort === undefined)
396
+ return ok({ stacks: [] });
397
+ return ok({ stacks: this.scaffoldPort.supportedStacks() });
398
+ }
399
+ catch (error) {
400
+ return fail(`Failed to get supported stacks: ${String(error)}`);
401
+ }
402
+ }
403
+ /** Record gate execution metrics via optional callback (fire-and-forget). */
404
+ async recordGateMetrics(pipelineId, gateId, success, durationMs, cardId) {
405
+ if (this.gateMetricsRecorder === undefined)
406
+ return;
407
+ await this.gateMetricsRecorder({
408
+ pipelineId, gateId, success, durationMs,
409
+ ...(cardId !== undefined ? { cardId } : {}),
410
+ }).catch(() => { });
411
+ }
412
+ }
413
+ //# sourceMappingURL=use-cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-cases.js","sourceRoot":"","sources":["../../../src/application/pipeline/use-cases.ts"],"names":[],"mappings":"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"}
@@ -11,18 +11,21 @@
11
11
  */
12
12
  import type { Result } from "../../domain/shared/value-objects.js";
13
13
  import type { EmbeddingProvider, VectorRepository, TextSplitterPort, FileDiscoveryPort } from "../../domain/rag/repositories.js";
14
+ import type { RagConfig } from "../../domain/config/value-objects.js";
14
15
  import type { RagSearchRequest, RagSearchResponse, RagIndexRequest, RagIndexResponse, RagSnippetRequest, RagSnippetResponse, RagUpdateRequest, RagUpdateResponse, RagDeleteRequest, RagDeleteResponse, RagStatusRequest, RagStatusResponse } from "./dtos.js";
15
16
  export interface RagUseCasesDeps {
16
17
  readonly embeddingProvider: EmbeddingProvider;
17
18
  readonly vectorRepository: VectorRepository;
18
19
  readonly textSplitter: TextSplitterPort;
19
20
  readonly fileDiscovery: FileDiscoveryPort;
21
+ readonly ragConfig: RagConfig;
20
22
  }
21
23
  export declare class RagUseCases {
22
24
  private readonly embedding;
23
25
  private readonly vectors;
24
26
  private readonly splitter;
25
27
  private readonly files;
28
+ private readonly ragConfig;
26
29
  constructor(deps: RagUseCasesDeps);
27
30
  search(request: RagSearchRequest): Promise<Result<RagSearchResponse>>;
28
31
  index(request: RagIndexRequest): Promise<Result<RagIndexResponse>>;
@@ -1 +1 @@
1
- {"version":3,"file":"use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/rag/use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAQ1C,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAKnB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;CAC3C;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAE9B,IAAI,EAAE,eAAe;IAS3B,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAgCrE,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAyElE,OAAO,CACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAoChC,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAwErE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAqBrE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;CAuB5E"}
1
+ {"version":3,"file":"use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/rag/use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAO1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAKnB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,IAAI,EAAE,eAAe;IAU3B,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAgCrE,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAmGlE,OAAO,CACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAoChC,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAkGrE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAqBrE,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;CAuB5E"}
@@ -1,5 +1,5 @@
1
1
  import { ok, fail } from "../../domain/shared/value-objects.js";
2
- import { EXTENSION_LANGUAGE_MAP, DEFAULT_CHUNK_CONFIGS, inferDomain, } from "../../domain/rag/value-objects.js";
2
+ import { EXTENSION_LANGUAGE_MAP, inferDomain, } from "../../domain/rag/value-objects.js";
3
3
  import { extractSnippet } from "../../domain/rag/services.js";
4
4
  import { extname } from "node:path";
5
5
  // ── Use Cases ─────────────────────────────────────────────────────────
@@ -8,11 +8,13 @@ export class RagUseCases {
8
8
  vectors;
9
9
  splitter;
10
10
  files;
11
+ ragConfig;
11
12
  constructor(deps) {
12
13
  this.embedding = deps.embeddingProvider;
13
14
  this.vectors = deps.vectorRepository;
14
15
  this.splitter = deps.textSplitter;
15
16
  this.files = deps.fileDiscovery;
17
+ this.ragConfig = deps.ragConfig;
16
18
  }
17
19
  // ── Search ──────────────────────────────────────────────────────
18
20
  async search(request) {
@@ -66,16 +68,39 @@ export class RagUseCases {
66
68
  continue;
67
69
  const ext = extname(file.absolutePath).toLowerCase();
68
70
  const language = EXTENSION_LANGUAGE_MAP.get(ext);
69
- const config = DEFAULT_CHUNK_CONFIGS.get(language ?? "default") ??
70
- DEFAULT_CHUNK_CONFIGS.get("default");
71
- const textChunks = await this.splitter.split(content, language, config);
71
+ const domain = inferDomain(file.relativePath);
72
+ const fileType = ext.startsWith(".") ? ext.slice(1) : ext;
73
+ // Route markdown through splitByHeaders when enabled
74
+ if (language === "markdown" &&
75
+ this.ragConfig.markdownSplitByHeaders) {
76
+ const sections = this.splitter.splitByHeaders(content);
77
+ if (sections.length === 0)
78
+ continue;
79
+ const texts = sections.map((s) => enrichWithHeaders(s));
80
+ const vectors = await this.embedding.embedBatch(texts);
81
+ const chunks = sections.map((_, i) => ({
82
+ vector: vectors[i],
83
+ metadata: {
84
+ source: file.absolutePath,
85
+ workspace,
86
+ domain,
87
+ fileType,
88
+ chunkIndex: i,
89
+ totalChunks: sections.length,
90
+ content: texts[i],
91
+ },
92
+ }));
93
+ await this.vectors.addChunks(workspace, chunks);
94
+ totalChunks += chunks.length;
95
+ continue;
96
+ }
97
+ // Standard language-aware splitting with config-driven chunk sizes
98
+ const chunkEntry = resolveChunkConfig(this.ragConfig, language);
99
+ const textChunks = await this.splitter.split(content, language, chunkEntry);
72
100
  if (textChunks.length === 0)
73
101
  continue;
74
- // Generate embeddings in batch
75
102
  const texts = textChunks.map((c) => c.content);
76
103
  const vectors = await this.embedding.embedBatch(texts);
77
- const domain = inferDomain(file.relativePath);
78
- const fileType = ext.startsWith(".") ? ext.slice(1) : ext;
79
104
  const chunks = textChunks.map((chunk, i) => ({
80
105
  vector: vectors[i],
81
106
  metadata: {
@@ -152,39 +177,62 @@ export class RagUseCases {
152
177
  }
153
178
  const ext = extname(request.filePath).toLowerCase();
154
179
  const language = EXTENSION_LANGUAGE_MAP.get(ext);
155
- const config = DEFAULT_CHUNK_CONFIGS.get(language ?? "default") ??
156
- DEFAULT_CHUNK_CONFIGS.get("default");
157
- const textChunks = await this.splitter.split(content, language, config);
158
- if (textChunks.length === 0) {
159
- return ok({
160
- workspace,
161
- filePath: request.filePath,
162
- chunksRemoved: removed,
163
- chunksAdded: 0,
164
- });
165
- }
166
- const texts = textChunks.map((c) => c.content);
167
- const vectors = await this.embedding.embedBatch(texts);
168
180
  const domain = inferDomain(request.filePath);
169
181
  const fileType = ext.startsWith(".") ? ext.slice(1) : ext;
170
- const chunks = textChunks.map((chunk, i) => ({
171
- vector: vectors[i],
172
- metadata: {
173
- source: request.filePath,
174
- workspace,
175
- domain,
176
- fileType,
177
- chunkIndex: chunk.index,
178
- totalChunks: textChunks.length,
179
- content: chunk.content,
180
- },
181
- }));
182
- await this.vectors.addChunks(workspace, chunks);
182
+ let chunksAdded = 0;
183
+ // Route markdown through splitByHeaders when enabled
184
+ if (language === "markdown" &&
185
+ this.ragConfig.markdownSplitByHeaders) {
186
+ const sections = this.splitter.splitByHeaders(content);
187
+ if (sections.length === 0) {
188
+ return ok({ workspace, filePath: request.filePath, chunksRemoved: removed, chunksAdded: 0 });
189
+ }
190
+ const texts = sections.map((s) => enrichWithHeaders(s));
191
+ const vectors = await this.embedding.embedBatch(texts);
192
+ const chunks = sections.map((_, i) => ({
193
+ vector: vectors[i],
194
+ metadata: {
195
+ source: request.filePath,
196
+ workspace,
197
+ domain,
198
+ fileType,
199
+ chunkIndex: i,
200
+ totalChunks: sections.length,
201
+ content: texts[i],
202
+ },
203
+ }));
204
+ await this.vectors.addChunks(workspace, chunks);
205
+ chunksAdded = chunks.length;
206
+ }
207
+ else {
208
+ // Standard language-aware splitting
209
+ const chunkEntry = resolveChunkConfig(this.ragConfig, language);
210
+ const textChunks = await this.splitter.split(content, language, chunkEntry);
211
+ if (textChunks.length === 0) {
212
+ return ok({ workspace, filePath: request.filePath, chunksRemoved: removed, chunksAdded: 0 });
213
+ }
214
+ const texts = textChunks.map((c) => c.content);
215
+ const vectors = await this.embedding.embedBatch(texts);
216
+ const chunks = textChunks.map((chunk, i) => ({
217
+ vector: vectors[i],
218
+ metadata: {
219
+ source: request.filePath,
220
+ workspace,
221
+ domain,
222
+ fileType,
223
+ chunkIndex: chunk.index,
224
+ totalChunks: textChunks.length,
225
+ content: chunk.content,
226
+ },
227
+ }));
228
+ await this.vectors.addChunks(workspace, chunks);
229
+ chunksAdded = chunks.length;
230
+ }
183
231
  return ok({
184
232
  workspace,
185
233
  filePath: request.filePath,
186
234
  chunksRemoved: removed,
187
- chunksAdded: chunks.length,
235
+ chunksAdded,
188
236
  });
189
237
  }
190
238
  catch (error) {
@@ -231,4 +279,34 @@ export class RagUseCases {
231
279
  }
232
280
  }
233
281
  }
282
+ /**
283
+ * Prepend header hierarchy to section content for richer embeddings.
284
+ * Produces `# H1\n## H2\n### H3\n\nContent` so the embedding vector
285
+ * captures the heading context without changing ChunkMetadata schema.
286
+ */
287
+ function enrichWithHeaders(section) {
288
+ const headers = [];
289
+ if (section.header1)
290
+ headers.push(`# ${section.header1}`);
291
+ if (section.header2)
292
+ headers.push(`## ${section.header2}`);
293
+ if (section.header3)
294
+ headers.push(`### ${section.header3}`);
295
+ return headers.length > 0
296
+ ? `${headers.join("\n")}\n\n${section.content}`
297
+ : section.content;
298
+ }
299
+ /**
300
+ * Resolve chunk config from RagConfig for a given language.
301
+ * Falls back to "default" entry if language has no specific config.
302
+ */
303
+ function resolveChunkConfig(ragConfig, language) {
304
+ const key = language ?? "default";
305
+ const entry = ragConfig.chunks[key] ?? ragConfig.chunks["default"];
306
+ if (entry !== undefined) {
307
+ return { chunkSize: entry.chunkSize, chunkOverlap: entry.chunkOverlap };
308
+ }
309
+ // Ultimate fallback if config has no "default" entry
310
+ return { chunkSize: 500, chunkOverlap: 50 };
311
+ }
234
312
  //# sourceMappingURL=use-cases.js.map