@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.
- package/dist/application/agent-registry/dtos.d.ts +66 -0
- package/dist/application/agent-registry/dtos.d.ts.map +1 -0
- package/dist/application/agent-registry/dtos.js +11 -0
- package/dist/application/agent-registry/dtos.js.map +1 -0
- package/dist/application/agent-registry/use-cases.d.ts +39 -0
- package/dist/application/agent-registry/use-cases.d.ts.map +1 -0
- package/dist/application/agent-registry/use-cases.js +222 -0
- package/dist/application/agent-registry/use-cases.js.map +1 -0
- package/dist/application/azure-sync/dtos.d.ts +210 -0
- package/dist/application/azure-sync/dtos.d.ts.map +1 -0
- package/dist/application/azure-sync/dtos.js +11 -0
- package/dist/application/azure-sync/dtos.js.map +1 -0
- package/dist/application/azure-sync/field-builders.d.ts +54 -0
- package/dist/application/azure-sync/field-builders.d.ts.map +1 -0
- package/dist/application/azure-sync/field-builders.js +166 -0
- package/dist/application/azure-sync/field-builders.js.map +1 -0
- package/dist/application/azure-sync/index.d.ts +16 -0
- package/dist/application/azure-sync/index.d.ts.map +1 -0
- package/dist/application/azure-sync/index.js +10 -0
- package/dist/application/azure-sync/index.js.map +1 -0
- package/dist/application/azure-sync/pr-use-cases.d.ts +39 -0
- package/dist/application/azure-sync/pr-use-cases.d.ts.map +1 -0
- package/dist/application/azure-sync/pr-use-cases.js +192 -0
- package/dist/application/azure-sync/pr-use-cases.js.map +1 -0
- package/dist/application/azure-sync/pull-use-cases.d.ts +43 -0
- package/dist/application/azure-sync/pull-use-cases.d.ts.map +1 -0
- package/dist/application/azure-sync/pull-use-cases.js +322 -0
- package/dist/application/azure-sync/pull-use-cases.js.map +1 -0
- package/dist/application/azure-sync/push-use-cases.d.ts +53 -0
- package/dist/application/azure-sync/push-use-cases.d.ts.map +1 -0
- package/dist/application/azure-sync/push-use-cases.js +341 -0
- package/dist/application/azure-sync/push-use-cases.js.map +1 -0
- package/dist/application/azure-sync/reverse-field-builder.d.ts +52 -0
- package/dist/application/azure-sync/reverse-field-builder.d.ts.map +1 -0
- package/dist/application/azure-sync/reverse-field-builder.js +130 -0
- package/dist/application/azure-sync/reverse-field-builder.js.map +1 -0
- package/dist/application/azure-sync/task-push-use-cases.d.ts +68 -0
- package/dist/application/azure-sync/task-push-use-cases.d.ts.map +1 -0
- package/dist/application/azure-sync/task-push-use-cases.js +162 -0
- package/dist/application/azure-sync/task-push-use-cases.js.map +1 -0
- package/dist/application/config/config-service.d.ts +64 -0
- package/dist/application/config/config-service.d.ts.map +1 -0
- package/dist/application/config/config-service.js +110 -0
- package/dist/application/config/config-service.js.map +1 -0
- package/dist/application/config/index.d.ts +5 -0
- package/dist/application/config/index.d.ts.map +1 -0
- package/dist/application/config/index.js +5 -0
- package/dist/application/config/index.js.map +1 -0
- package/dist/application/kanban/board-use-cases.d.ts.map +1 -1
- package/dist/application/kanban/board-use-cases.js +14 -0
- package/dist/application/kanban/board-use-cases.js.map +1 -1
- package/dist/application/kanban/card-use-cases.d.ts +21 -2
- package/dist/application/kanban/card-use-cases.d.ts.map +1 -1
- package/dist/application/kanban/card-use-cases.js +180 -1
- package/dist/application/kanban/card-use-cases.js.map +1 -1
- package/dist/application/kanban/dtos.d.ts +59 -0
- package/dist/application/kanban/dtos.d.ts.map +1 -1
- package/dist/application/mcp/index.d.ts +10 -0
- package/dist/application/mcp/index.d.ts.map +1 -0
- package/dist/application/mcp/index.js +8 -0
- package/dist/application/mcp/index.js.map +1 -0
- package/dist/application/mcp/middleware.d.ts +91 -0
- package/dist/application/mcp/middleware.d.ts.map +1 -0
- package/dist/application/mcp/middleware.js +84 -0
- package/dist/application/mcp/middleware.js.map +1 -0
- package/dist/application/mcp/tool-adapter.d.ts +72 -0
- package/dist/application/mcp/tool-adapter.d.ts.map +1 -0
- package/dist/application/mcp/tool-adapter.js +132 -0
- package/dist/application/mcp/tool-adapter.js.map +1 -0
- package/dist/application/pipeline/dtos.d.ts +135 -0
- package/dist/application/pipeline/dtos.d.ts.map +1 -0
- package/dist/application/pipeline/dtos.js +11 -0
- package/dist/application/pipeline/dtos.js.map +1 -0
- package/dist/application/pipeline/index.d.ts +8 -0
- package/dist/application/pipeline/index.d.ts.map +1 -0
- package/dist/application/pipeline/index.js +7 -0
- package/dist/application/pipeline/index.js.map +1 -0
- package/dist/application/pipeline/use-cases.d.ts +67 -0
- package/dist/application/pipeline/use-cases.d.ts.map +1 -0
- package/dist/application/pipeline/use-cases.js +413 -0
- package/dist/application/pipeline/use-cases.js.map +1 -0
- package/dist/application/rag/use-cases.d.ts +3 -0
- package/dist/application/rag/use-cases.d.ts.map +1 -1
- package/dist/application/rag/use-cases.js +112 -34
- package/dist/application/rag/use-cases.js.map +1 -1
- package/dist/domain/agent-registry/entities.d.ts +68 -0
- package/dist/domain/agent-registry/entities.d.ts.map +1 -0
- package/dist/domain/agent-registry/entities.js +177 -0
- package/dist/domain/agent-registry/entities.js.map +1 -0
- package/dist/domain/agent-registry/repositories.d.ts +56 -0
- package/dist/domain/agent-registry/repositories.d.ts.map +1 -0
- package/dist/domain/agent-registry/repositories.js +12 -0
- package/dist/domain/agent-registry/repositories.js.map +1 -0
- package/dist/domain/agent-registry/services.d.ts +87 -0
- package/dist/domain/agent-registry/services.d.ts.map +1 -0
- package/dist/domain/agent-registry/services.js +188 -0
- package/dist/domain/agent-registry/services.js.map +1 -0
- package/dist/domain/agent-registry/value-objects.d.ts +145 -0
- package/dist/domain/agent-registry/value-objects.d.ts.map +1 -0
- package/dist/domain/agent-registry/value-objects.js +339 -0
- package/dist/domain/agent-registry/value-objects.js.map +1 -0
- package/dist/domain/azure-sync/entities.d.ts +165 -0
- package/dist/domain/azure-sync/entities.d.ts.map +1 -0
- package/dist/domain/azure-sync/entities.js +203 -0
- package/dist/domain/azure-sync/entities.js.map +1 -0
- package/dist/domain/azure-sync/index.d.ts +16 -0
- package/dist/domain/azure-sync/index.d.ts.map +1 -0
- package/dist/domain/azure-sync/index.js +14 -0
- package/dist/domain/azure-sync/index.js.map +1 -0
- package/dist/domain/azure-sync/ports.d.ts +117 -0
- package/dist/domain/azure-sync/ports.d.ts.map +1 -0
- package/dist/domain/azure-sync/ports.js +13 -0
- package/dist/domain/azure-sync/ports.js.map +1 -0
- package/dist/domain/azure-sync/repositories.d.ts +53 -0
- package/dist/domain/azure-sync/repositories.d.ts.map +1 -0
- package/dist/domain/azure-sync/repositories.js +11 -0
- package/dist/domain/azure-sync/repositories.js.map +1 -0
- package/dist/domain/azure-sync/services.d.ts +107 -0
- package/dist/domain/azure-sync/services.d.ts.map +1 -0
- package/dist/domain/azure-sync/services.js +316 -0
- package/dist/domain/azure-sync/services.js.map +1 -0
- package/dist/domain/azure-sync/value-objects.d.ts +129 -0
- package/dist/domain/azure-sync/value-objects.d.ts.map +1 -0
- package/dist/domain/azure-sync/value-objects.js +343 -0
- package/dist/domain/azure-sync/value-objects.js.map +1 -0
- package/dist/domain/config/index.d.ts +9 -0
- package/dist/domain/config/index.d.ts.map +1 -0
- package/dist/domain/config/index.js +7 -0
- package/dist/domain/config/index.js.map +1 -0
- package/dist/domain/config/repositories.d.ts +36 -0
- package/dist/domain/config/repositories.d.ts.map +1 -0
- package/dist/domain/config/repositories.js +12 -0
- package/dist/domain/config/repositories.js.map +1 -0
- package/dist/domain/config/value-objects.d.ts +112 -0
- package/dist/domain/config/value-objects.d.ts.map +1 -0
- package/dist/domain/config/value-objects.js +93 -0
- package/dist/domain/config/value-objects.js.map +1 -0
- package/dist/domain/governance/policies.d.ts.map +1 -1
- package/dist/domain/governance/policies.js +70 -0
- package/dist/domain/governance/policies.js.map +1 -1
- package/dist/domain/kanban/entities.d.ts +67 -15
- package/dist/domain/kanban/entities.d.ts.map +1 -1
- package/dist/domain/kanban/entities.js +177 -14
- package/dist/domain/kanban/entities.js.map +1 -1
- package/dist/domain/kanban/grooming.d.ts +27 -7
- package/dist/domain/kanban/grooming.d.ts.map +1 -1
- package/dist/domain/kanban/grooming.js +50 -12
- package/dist/domain/kanban/grooming.js.map +1 -1
- package/dist/domain/kanban/services.d.ts +16 -2
- package/dist/domain/kanban/services.d.ts.map +1 -1
- package/dist/domain/kanban/services.js +29 -2
- package/dist/domain/kanban/services.js.map +1 -1
- package/dist/domain/kanban/value-objects.d.ts +48 -0
- package/dist/domain/kanban/value-objects.d.ts.map +1 -1
- package/dist/domain/kanban/value-objects.js +53 -0
- package/dist/domain/kanban/value-objects.js.map +1 -1
- package/dist/domain/pipeline/gate.d.ts +75 -0
- package/dist/domain/pipeline/gate.d.ts.map +1 -0
- package/dist/domain/pipeline/gate.js +158 -0
- package/dist/domain/pipeline/gate.js.map +1 -0
- package/dist/domain/pipeline/index.d.ts +13 -0
- package/dist/domain/pipeline/index.d.ts.map +1 -0
- package/dist/domain/pipeline/index.js +14 -0
- package/dist/domain/pipeline/index.js.map +1 -0
- package/dist/domain/pipeline/pipeline.d.ts +99 -0
- package/dist/domain/pipeline/pipeline.d.ts.map +1 -0
- package/dist/domain/pipeline/pipeline.js +257 -0
- package/dist/domain/pipeline/pipeline.js.map +1 -0
- package/dist/domain/pipeline/ports.d.ts +120 -0
- package/dist/domain/pipeline/ports.d.ts.map +1 -0
- package/dist/domain/pipeline/ports.js +12 -0
- package/dist/domain/pipeline/ports.js.map +1 -0
- package/dist/domain/pipeline/repositories.d.ts +66 -0
- package/dist/domain/pipeline/repositories.d.ts.map +1 -0
- package/dist/domain/pipeline/repositories.js +11 -0
- package/dist/domain/pipeline/repositories.js.map +1 -0
- package/dist/domain/pipeline/services.d.ts +77 -0
- package/dist/domain/pipeline/services.d.ts.map +1 -0
- package/dist/domain/pipeline/services.js +156 -0
- package/dist/domain/pipeline/services.js.map +1 -0
- package/dist/domain/pipeline/value-objects.d.ts +117 -0
- package/dist/domain/pipeline/value-objects.d.ts.map +1 -0
- package/dist/domain/pipeline/value-objects.js +313 -0
- package/dist/domain/pipeline/value-objects.js.map +1 -0
- package/dist/domain/rag/value-objects.d.ts +9 -2
- package/dist/domain/rag/value-objects.d.ts.map +1 -1
- package/dist/domain/rag/value-objects.js +8 -2
- package/dist/domain/rag/value-objects.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +113 -75
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts +29 -0
- package/dist/infrastructure/agent-registry/agent-profile-repository.d.ts.map +1 -0
- package/dist/infrastructure/agent-registry/agent-profile-repository.js +109 -0
- package/dist/infrastructure/agent-registry/agent-profile-repository.js.map +1 -0
- package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts +28 -0
- package/dist/infrastructure/agent-registry/agent-session-adapter.d.ts.map +1 -0
- package/dist/infrastructure/agent-registry/agent-session-adapter.js +61 -0
- package/dist/infrastructure/agent-registry/agent-session-adapter.js.map +1 -0
- package/dist/infrastructure/agent-registry/built-in-profiles.d.ts +19 -0
- package/dist/infrastructure/agent-registry/built-in-profiles.d.ts.map +1 -0
- package/dist/infrastructure/agent-registry/built-in-profiles.js +210 -0
- package/dist/infrastructure/agent-registry/built-in-profiles.js.map +1 -0
- package/dist/infrastructure/azure-sync/azure-auth.d.ts +40 -0
- package/dist/infrastructure/azure-sync/azure-auth.d.ts.map +1 -0
- package/dist/infrastructure/azure-sync/azure-auth.js +94 -0
- package/dist/infrastructure/azure-sync/azure-auth.js.map +1 -0
- package/dist/infrastructure/azure-sync/azure-devops-client.d.ts +43 -0
- package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -0
- package/dist/infrastructure/azure-sync/azure-devops-client.js +296 -0
- package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -0
- package/dist/infrastructure/azure-sync/index.d.ts +9 -0
- package/dist/infrastructure/azure-sync/index.d.ts.map +1 -0
- package/dist/infrastructure/azure-sync/index.js +12 -0
- package/dist/infrastructure/azure-sync/index.js.map +1 -0
- package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts +39 -0
- package/dist/infrastructure/azure-sync/sqlite-sync-repository.d.ts.map +1 -0
- package/dist/infrastructure/azure-sync/sqlite-sync-repository.js +202 -0
- package/dist/infrastructure/azure-sync/sqlite-sync-repository.js.map +1 -0
- package/dist/infrastructure/config/index.d.ts +5 -0
- package/dist/infrastructure/config/index.d.ts.map +1 -0
- package/dist/infrastructure/config/index.js +5 -0
- package/dist/infrastructure/config/index.js.map +1 -0
- package/dist/infrastructure/config/yaml-config-repository.d.ts +22 -0
- package/dist/infrastructure/config/yaml-config-repository.d.ts.map +1 -0
- package/dist/infrastructure/config/yaml-config-repository.js +68 -0
- package/dist/infrastructure/config/yaml-config-repository.js.map +1 -0
- package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts +21 -0
- package/dist/infrastructure/domain-map/llm-prompt-factory.d.ts.map +1 -0
- package/dist/infrastructure/domain-map/llm-prompt-factory.js +49 -0
- package/dist/infrastructure/domain-map/llm-prompt-factory.js.map +1 -0
- package/dist/infrastructure/kanban/card-repository.d.ts +6 -0
- package/dist/infrastructure/kanban/card-repository.d.ts.map +1 -1
- package/dist/infrastructure/kanban/card-repository.js +79 -7
- package/dist/infrastructure/kanban/card-repository.js.map +1 -1
- package/dist/infrastructure/pipeline/dagger-adapter.d.ts +50 -0
- package/dist/infrastructure/pipeline/dagger-adapter.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/dagger-adapter.js +153 -0
- package/dist/infrastructure/pipeline/dagger-adapter.js.map +1 -0
- package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts +35 -0
- package/dist/infrastructure/pipeline/dagger-scaffold-generator.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/dagger-scaffold-generator.js +132 -0
- package/dist/infrastructure/pipeline/dagger-scaffold-generator.js.map +1 -0
- package/dist/infrastructure/pipeline/index.d.ts +20 -0
- package/dist/infrastructure/pipeline/index.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/index.js +19 -0
- package/dist/infrastructure/pipeline/index.js.map +1 -0
- package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts +23 -0
- package/dist/infrastructure/pipeline/pipeline-template-registry.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/pipeline-template-registry.js +63 -0
- package/dist/infrastructure/pipeline/pipeline-template-registry.js.map +1 -0
- package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts +17 -0
- package/dist/infrastructure/pipeline/scaffold-templates-extra.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/scaffold-templates-extra.js +467 -0
- package/dist/infrastructure/pipeline/scaffold-templates-extra.js.map +1 -0
- package/dist/infrastructure/pipeline/scaffold-templates.d.ts +23 -0
- package/dist/infrastructure/pipeline/scaffold-templates.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/scaffold-templates.js +476 -0
- package/dist/infrastructure/pipeline/scaffold-templates.js.map +1 -0
- package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts +32 -0
- package/dist/infrastructure/pipeline/sqlite-pipeline-repository.d.ts.map +1 -0
- package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js +197 -0
- package/dist/infrastructure/pipeline/sqlite-pipeline-repository.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +300 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/tools/agent-registry-tools.d.ts +11 -0
- package/dist/tools/agent-registry-tools.d.ts.map +1 -0
- package/dist/tools/agent-registry-tools.js +208 -0
- package/dist/tools/agent-registry-tools.js.map +1 -0
- package/dist/tools/azure-sync-tools.d.ts +15 -0
- package/dist/tools/azure-sync-tools.d.ts.map +1 -0
- package/dist/tools/azure-sync-tools.js +332 -0
- package/dist/tools/azure-sync-tools.js.map +1 -0
- package/dist/tools/kanban-card-tools.d.ts.map +1 -1
- package/dist/tools/kanban-card-tools.js +41 -16
- package/dist/tools/kanban-card-tools.js.map +1 -1
- package/dist/tools/kanban-gate-tools.d.ts +7 -0
- package/dist/tools/kanban-gate-tools.d.ts.map +1 -0
- package/dist/tools/kanban-gate-tools.js +106 -0
- package/dist/tools/kanban-gate-tools.js.map +1 -0
- package/dist/tools/kanban-grooming-tools.d.ts +7 -0
- package/dist/tools/kanban-grooming-tools.d.ts.map +1 -0
- package/dist/tools/kanban-grooming-tools.js +180 -0
- package/dist/tools/kanban-grooming-tools.js.map +1 -0
- package/dist/tools/pipeline-tools.d.ts +15 -0
- package/dist/tools/pipeline-tools.d.ts.map +1 -0
- package/dist/tools/pipeline-tools.js +424 -0
- package/dist/tools/pipeline-tools.js.map +1 -0
- 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;
|
|
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,
|
|
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
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
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
|