@studio-foundation/engine 0.3.0-beta.1 → 0.3.0-beta.5
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/__tests__/engine.conditions-group.test.d.ts +2 -0
- package/dist/__tests__/engine.conditions-group.test.d.ts.map +1 -0
- package/dist/__tests__/engine.conditions-group.test.js +222 -0
- package/dist/__tests__/engine.conditions-group.test.js.map +1 -0
- package/dist/__tests__/engine.conditions.test.d.ts +2 -0
- package/dist/__tests__/engine.conditions.test.d.ts.map +1 -0
- package/dist/__tests__/engine.conditions.test.js +164 -0
- package/dist/__tests__/engine.conditions.test.js.map +1 -0
- package/dist/__tests__/engine.resume.test.d.ts +2 -0
- package/dist/__tests__/engine.resume.test.d.ts.map +1 -0
- package/dist/__tests__/engine.resume.test.js +93 -0
- package/dist/__tests__/engine.resume.test.js.map +1 -0
- package/dist/__tests__/engine.script-stage.test.d.ts +2 -0
- package/dist/__tests__/engine.script-stage.test.d.ts.map +1 -0
- package/dist/__tests__/engine.script-stage.test.js +108 -0
- package/dist/__tests__/engine.script-stage.test.js.map +1 -0
- package/dist/db/client.d.ts +3 -0
- package/dist/db/client.d.ts.map +1 -0
- package/{src/db/client.ts → dist/db/client.js} +1 -2
- package/dist/db/client.js.map +1 -0
- package/dist/engine.context-event.test.d.ts +2 -0
- package/dist/engine.context-event.test.d.ts.map +1 -0
- package/dist/engine.context-event.test.js +111 -0
- package/dist/engine.context-event.test.js.map +1 -0
- package/dist/engine.d.ts +52 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +364 -0
- package/dist/engine.js.map +1 -0
- package/dist/events.d.ts +163 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +12 -0
- package/dist/events.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +3 -45
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/agent-loader.d.ts +4 -0
- package/dist/pipeline/agent-loader.d.ts.map +1 -0
- package/dist/pipeline/agent-loader.js +28 -0
- package/dist/pipeline/agent-loader.js.map +1 -0
- package/dist/pipeline/agent-loader.test.d.ts +2 -0
- package/dist/pipeline/agent-loader.test.d.ts.map +1 -0
- package/dist/pipeline/agent-loader.test.js +134 -0
- package/dist/pipeline/agent-loader.test.js.map +1 -0
- package/dist/pipeline/condition-evaluator.d.ts +6 -0
- package/dist/pipeline/condition-evaluator.d.ts.map +1 -0
- package/dist/pipeline/condition-evaluator.js +105 -0
- package/dist/pipeline/condition-evaluator.js.map +1 -0
- package/dist/pipeline/condition-evaluator.test.d.ts +2 -0
- package/dist/pipeline/condition-evaluator.test.d.ts.map +1 -0
- package/dist/pipeline/condition-evaluator.test.js +103 -0
- package/dist/pipeline/condition-evaluator.test.js.map +1 -0
- package/dist/pipeline/context-pack-loader.d.ts +3 -0
- package/dist/pipeline/context-pack-loader.d.ts.map +1 -0
- package/dist/pipeline/context-pack-loader.js +51 -0
- package/dist/pipeline/context-pack-loader.js.map +1 -0
- package/dist/pipeline/context-propagation.d.ts +28 -0
- package/dist/pipeline/context-propagation.d.ts.map +1 -0
- package/dist/pipeline/context-propagation.js +161 -0
- package/dist/pipeline/context-propagation.js.map +1 -0
- package/dist/pipeline/context-propagation.test.d.ts +2 -0
- package/dist/pipeline/context-propagation.test.d.ts.map +1 -0
- package/dist/pipeline/context-propagation.test.js +194 -0
- package/dist/pipeline/context-propagation.test.js.map +1 -0
- package/dist/pipeline/contract-loader.d.ts +4 -0
- package/dist/pipeline/contract-loader.d.ts.map +1 -0
- package/dist/pipeline/contract-loader.js +30 -0
- package/dist/pipeline/contract-loader.js.map +1 -0
- package/dist/pipeline/group-orchestrator.d.ts +19 -0
- package/dist/pipeline/group-orchestrator.d.ts.map +1 -0
- package/dist/pipeline/group-orchestrator.js +376 -0
- package/dist/pipeline/group-orchestrator.js.map +1 -0
- package/dist/pipeline/hook-executor.d.ts +28 -0
- package/dist/pipeline/hook-executor.d.ts.map +1 -0
- package/dist/pipeline/hook-executor.js +63 -0
- package/dist/pipeline/hook-executor.js.map +1 -0
- package/dist/pipeline/hook-executor.test.d.ts +2 -0
- package/dist/pipeline/hook-executor.test.d.ts.map +1 -0
- package/dist/pipeline/hook-executor.test.js +71 -0
- package/dist/pipeline/hook-executor.test.js.map +1 -0
- package/dist/pipeline/invariants-loader.d.ts +6 -0
- package/dist/pipeline/invariants-loader.d.ts.map +1 -0
- package/dist/pipeline/invariants-loader.js +15 -0
- package/dist/pipeline/invariants-loader.js.map +1 -0
- package/dist/pipeline/invariants-loader.test.d.ts +2 -0
- package/dist/pipeline/invariants-loader.test.d.ts.map +1 -0
- package/dist/pipeline/invariants-loader.test.js +39 -0
- package/dist/pipeline/invariants-loader.test.js.map +1 -0
- package/dist/pipeline/loader.d.ts +5 -0
- package/dist/pipeline/loader.d.ts.map +1 -0
- package/dist/pipeline/loader.js +132 -0
- package/dist/pipeline/loader.js.map +1 -0
- package/dist/pipeline/loader.test.d.ts +2 -0
- package/dist/pipeline/loader.test.d.ts.map +1 -0
- package/dist/pipeline/loader.test.js +120 -0
- package/dist/pipeline/loader.test.js.map +1 -0
- package/dist/pipeline/output-validator.d.ts +10 -0
- package/dist/pipeline/output-validator.d.ts.map +1 -0
- package/dist/pipeline/output-validator.js +20 -0
- package/dist/pipeline/output-validator.js.map +1 -0
- package/dist/pipeline/output-validator.test.d.ts +2 -0
- package/dist/pipeline/output-validator.test.d.ts.map +1 -0
- package/dist/pipeline/output-validator.test.js +77 -0
- package/dist/pipeline/output-validator.test.js.map +1 -0
- package/dist/pipeline/post-validator.d.ts +8 -0
- package/dist/pipeline/post-validator.d.ts.map +1 -0
- package/dist/pipeline/post-validator.js +103 -0
- package/dist/pipeline/post-validator.js.map +1 -0
- package/dist/pipeline/skill-loader.d.ts +10 -0
- package/dist/pipeline/skill-loader.d.ts.map +1 -0
- package/dist/pipeline/skill-loader.js +26 -0
- package/dist/pipeline/skill-loader.js.map +1 -0
- package/dist/pipeline/skill-loader.test.d.ts +2 -0
- package/dist/pipeline/skill-loader.test.d.ts.map +1 -0
- package/dist/pipeline/skill-loader.test.js +38 -0
- package/dist/pipeline/skill-loader.test.js.map +1 -0
- package/dist/pipeline/stage-executor.d.ts +26 -0
- package/dist/pipeline/stage-executor.d.ts.map +1 -0
- package/dist/pipeline/stage-executor.js +540 -0
- package/dist/pipeline/stage-executor.js.map +1 -0
- package/dist/pipeline/stage-resolver.d.ts +3 -0
- package/dist/pipeline/stage-resolver.d.ts.map +1 -0
- package/dist/pipeline/stage-resolver.js +6 -0
- package/dist/pipeline/stage-resolver.js.map +1 -0
- package/dist/pipeline/startup-executor.d.ts +3 -0
- package/dist/pipeline/startup-executor.d.ts.map +1 -0
- package/dist/pipeline/startup-executor.js +23 -0
- package/dist/pipeline/startup-executor.js.map +1 -0
- package/dist/pipeline/startup-executor.test.d.ts +2 -0
- package/dist/pipeline/startup-executor.test.d.ts.map +1 -0
- package/dist/pipeline/startup-executor.test.js +34 -0
- package/dist/pipeline/startup-executor.test.js.map +1 -0
- package/dist/pipeline/types.d.ts +28 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +12 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/repo-resolver.d.ts +10 -0
- package/dist/repo-resolver.d.ts.map +1 -0
- package/dist/repo-resolver.js +39 -0
- package/dist/repo-resolver.js.map +1 -0
- package/dist/spawners/direct-engine-spawner.d.ts +8 -0
- package/dist/spawners/direct-engine-spawner.d.ts.map +1 -0
- package/dist/spawners/direct-engine-spawner.js +24 -0
- package/dist/spawners/direct-engine-spawner.js.map +1 -0
- package/dist/state/run-store.d.ts +74 -0
- package/dist/state/run-store.d.ts.map +1 -0
- package/dist/state/run-store.js +269 -0
- package/dist/state/run-store.js.map +1 -0
- package/dist/state/run-store.test.d.ts +2 -0
- package/dist/state/run-store.test.d.ts.map +1 -0
- package/dist/state/run-store.test.js +130 -0
- package/dist/state/run-store.test.js.map +1 -0
- package/dist/state/state-machine.d.ts +6 -0
- package/dist/state/state-machine.d.ts.map +1 -0
- package/dist/state/state-machine.js +27 -0
- package/dist/state/state-machine.js.map +1 -0
- package/dist/state/status-derivation.d.ts +12 -0
- package/dist/state/status-derivation.d.ts.map +1 -0
- package/dist/state/status-derivation.js +30 -0
- package/dist/state/status-derivation.js.map +1 -0
- package/package.json +7 -4
- package/ARCHITECTURE.md +0 -57
- package/src/__tests__/__fixtures__/script-stage/contracts/book-context.contract.yaml +0 -4
- package/src/__tests__/engine.conditions-group.test.ts +0 -244
- package/src/__tests__/engine.conditions.test.ts +0 -186
- package/src/__tests__/engine.resume.test.ts +0 -108
- package/src/__tests__/engine.script-stage.test.ts +0 -125
- package/src/engine.context-event.test.ts +0 -175
- package/src/engine.ts +0 -491
- package/src/events.ts +0 -167
- package/src/pipeline/agent-loader.test.ts +0 -151
- package/src/pipeline/agent-loader.ts +0 -39
- package/src/pipeline/condition-evaluator.test.ts +0 -129
- package/src/pipeline/condition-evaluator.ts +0 -121
- package/src/pipeline/context-pack-loader.ts +0 -63
- package/src/pipeline/context-propagation.test.ts +0 -237
- package/src/pipeline/context-propagation.ts +0 -235
- package/src/pipeline/contract-loader.ts +0 -41
- package/src/pipeline/group-orchestrator.ts +0 -483
- package/src/pipeline/hook-executor.test.ts +0 -121
- package/src/pipeline/hook-executor.ts +0 -87
- package/src/pipeline/invariants-loader.test.ts +0 -51
- package/src/pipeline/invariants-loader.ts +0 -14
- package/src/pipeline/loader.test.ts +0 -128
- package/src/pipeline/loader.ts +0 -149
- package/src/pipeline/output-validator.test.ts +0 -100
- package/src/pipeline/output-validator.ts +0 -40
- package/src/pipeline/post-validator.ts +0 -124
- package/src/pipeline/skill-loader.test.ts +0 -44
- package/src/pipeline/skill-loader.ts +0 -32
- package/src/pipeline/stage-executor.ts +0 -654
- package/src/pipeline/stage-resolver.ts +0 -8
- package/src/pipeline/startup-executor.test.ts +0 -37
- package/src/pipeline/startup-executor.ts +0 -32
- package/src/pipeline/types.ts +0 -42
- package/src/repo-resolver.ts +0 -61
- package/src/spawners/direct-engine-spawner.ts +0 -26
- package/src/state/run-store.test.ts +0 -157
- package/src/state/run-store.ts +0 -362
- package/src/state/state-machine.ts +0 -35
- package/src/state/status-derivation.ts +0 -36
- package/tests/context-pack-loader.test.ts +0 -113
- package/tests/context-propagation.test.ts +0 -267
- package/tests/direct-engine-spawner.test.ts +0 -102
- package/tests/e2e/feature-v5.test.ts +0 -57
- package/tests/events.test.ts +0 -56
- package/tests/fixtures/agents/test-agent.agent.yaml +0 -5
- package/tests/fixtures/contracts/code-gen.contract.yaml +0 -6
- package/tests/fixtures/contracts/qa-gate.contract.yaml +0 -15
- package/tests/fixtures/contracts/test-contract.contract.yaml +0 -6
- package/tests/fixtures/pipelines/group-test.pipeline.yaml +0 -40
- package/tests/fixtures/pipelines/simple.pipeline.yaml +0 -15
- package/tests/fixtures/pipelines/two-stage.pipeline.yaml +0 -24
- package/tests/fixtures/software/pipelines/feature-builder.pipeline.yaml +0 -75
- package/tests/fixtures/test-project/agents/test-agent.agent.yaml +0 -5
- package/tests/fixtures/test-project/contracts/basic-result.contract.yaml +0 -6
- package/tests/fixtures/test-project/contracts/code-gen.contract.yaml +0 -6
- package/tests/fixtures/test-project/contracts/maximum-only.contract.yaml +0 -8
- package/tests/fixtures/test-project/contracts/qa-gate.contract.yaml +0 -15
- package/tests/fixtures/test-project/contracts/strict-result.contract.yaml +0 -7
- package/tests/fixtures/test-project/contracts/test-contract.contract.yaml +0 -6
- package/tests/fixtures/test-project/pipelines/group-simple.pipeline.yaml +0 -26
- package/tests/fixtures/test-project/pipelines/group-test.pipeline.yaml +0 -40
- package/tests/fixtures/test-project/pipelines/hook-output-template.pipeline.yaml +0 -19
- package/tests/fixtures/test-project/pipelines/hook-reject-on-failure.pipeline.yaml +0 -19
- package/tests/fixtures/test-project/pipelines/maximum-only.pipeline.yaml +0 -15
- package/tests/fixtures/test-project/pipelines/parallel-collect-all-test.pipeline.yaml +0 -39
- package/tests/fixtures/test-project/pipelines/parallel-context-isolation-test.pipeline.yaml +0 -38
- package/tests/fixtures/test-project/pipelines/parallel-fail-test.pipeline.yaml +0 -39
- package/tests/fixtures/test-project/pipelines/parallel-test.pipeline.yaml +0 -39
- package/tests/fixtures/test-project/pipelines/parallel-then-sequential-test.pipeline.yaml +0 -38
- package/tests/fixtures/test-project/pipelines/simple.pipeline.yaml +0 -15
- package/tests/fixtures/test-project/pipelines/two-stage.pipeline.yaml +0 -24
- package/tests/fixtures/test-project/pipelines/with-startup.pipeline.yaml +0 -19
- package/tests/loader.test.ts +0 -385
- package/tests/post-validator.test.ts +0 -297
- package/tests/repo-resolver.test.ts +0 -102
- package/tests/run-store.test.ts +0 -143
- package/tests/state-machine.test.ts +0 -110
- package/tests/unit/context-propagation.test.ts +0 -45
- package/tests/unit/engine.test.ts +0 -770
- package/tests/unit/group-loop.test.ts +0 -389
- package/tests/unit/group-parallel.test.ts +0 -423
- package/tests/unit/state/status-derivation.test.ts +0 -88
- package/tsconfig.json +0 -24
- package/vitest.config.ts +0 -14
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { executeStartupCommands } from './startup-executor.js';
|
|
3
|
+
describe('executeStartupCommands', () => {
|
|
4
|
+
it('returns stdout keyed by inject_as', async () => {
|
|
5
|
+
const result = await executeStartupCommands([
|
|
6
|
+
{ command: 'echo hello', inject_as: 'greeting' },
|
|
7
|
+
{ command: 'echo world', inject_as: 'place' },
|
|
8
|
+
]);
|
|
9
|
+
expect(result.greeting).toBe('hello');
|
|
10
|
+
expect(result.place).toBe('world');
|
|
11
|
+
});
|
|
12
|
+
it('skips and warns when a command fails', async () => {
|
|
13
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
14
|
+
const result = await executeStartupCommands([
|
|
15
|
+
{ command: 'exit 1', inject_as: 'bad' },
|
|
16
|
+
{ command: 'echo ok', inject_as: 'good' },
|
|
17
|
+
]);
|
|
18
|
+
expect(result.bad).toBeUndefined();
|
|
19
|
+
expect(result.good).toBe('ok');
|
|
20
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('[on_pipeline_start]'));
|
|
21
|
+
warnSpy.mockRestore();
|
|
22
|
+
});
|
|
23
|
+
it('returns empty object when no commands given', async () => {
|
|
24
|
+
const result = await executeStartupCommands([]);
|
|
25
|
+
expect(result).toEqual({});
|
|
26
|
+
});
|
|
27
|
+
it('trims trailing whitespace from stdout', async () => {
|
|
28
|
+
const result = await executeStartupCommands([
|
|
29
|
+
{ command: 'printf "trimmed"', inject_as: 'val' },
|
|
30
|
+
]);
|
|
31
|
+
expect(result.val).toBe('trimmed');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=startup-executor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-executor.test.js","sourceRoot":"","sources":["../../src/pipeline/startup-executor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE;YAChD,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE;SAC9C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;YACvC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StageRun, StageStatus, ToolCall } from '@studio-foundation/contracts';
|
|
2
|
+
import type { PostValidationResult } from './post-validator.js';
|
|
3
|
+
import type { PipelineContext } from './context-propagation.js';
|
|
4
|
+
export interface ProjectPaths {
|
|
5
|
+
projectDir: string;
|
|
6
|
+
pipelinesDir: string;
|
|
7
|
+
agentsDir: string;
|
|
8
|
+
contractsDir: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveProjectPaths(configsDir: string): ProjectPaths;
|
|
11
|
+
export interface StageResult {
|
|
12
|
+
stageRun: StageRun;
|
|
13
|
+
status: StageStatus;
|
|
14
|
+
postValidation?: PostValidationResult;
|
|
15
|
+
lastAgentOutput?: unknown;
|
|
16
|
+
toolCalls?: ToolCall[];
|
|
17
|
+
tokensDelta?: number;
|
|
18
|
+
toolCallsDelta?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface GroupResult {
|
|
21
|
+
status: StageStatus;
|
|
22
|
+
stageRuns: StageRun[];
|
|
23
|
+
stagesExecuted: number;
|
|
24
|
+
context: PipelineContext;
|
|
25
|
+
totalTokensDelta: number;
|
|
26
|
+
totalToolCallsDelta: number;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pipeline/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAOpE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,eAAe,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// engine/src/pipeline/types.ts
|
|
2
|
+
// Shared local types for pipeline execution — used by engine, StageExecutor, GroupOrchestrator
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
export function resolveProjectPaths(configsDir) {
|
|
5
|
+
return {
|
|
6
|
+
projectDir: configsDir,
|
|
7
|
+
pipelinesDir: join(configsDir, 'pipelines'),
|
|
8
|
+
agentsDir: join(configsDir, 'agents'),
|
|
9
|
+
contractsDir: join(configsDir, 'contracts'),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pipeline/types.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+FAA+F;AAE/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO;QACL,UAAU,EAAE,UAAU;QACtB,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;QACrC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface RepoResolveOptions {
|
|
2
|
+
repoPathOverride?: string;
|
|
3
|
+
repoUrl?: string;
|
|
4
|
+
rawProjectsDir?: string;
|
|
5
|
+
pipelineName: string;
|
|
6
|
+
branch?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function cloneRepo(repoUrl: string, projectsDir: string, pipelineName: string, branch?: string): Promise<string>;
|
|
9
|
+
export declare function resolveRepoPath(options: RepoResolveOptions): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=repo-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-resolver.d.ts","sourceRoot":"","sources":["../src/repo-resolver.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { resolve, join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
export async function cloneRepo(repoUrl, projectsDir, pipelineName, branch) {
|
|
6
|
+
await mkdir(projectsDir, { recursive: true });
|
|
7
|
+
const timestamp = new Date().toISOString()
|
|
8
|
+
.replace(/:/g, 'h')
|
|
9
|
+
.replace(/\..+$/, '')
|
|
10
|
+
.replace('T', 'T');
|
|
11
|
+
const dirName = `${pipelineName}-${timestamp}`;
|
|
12
|
+
const clonePath = join(projectsDir, dirName);
|
|
13
|
+
const branchArg = branch ? `--branch ${branch}` : '';
|
|
14
|
+
const cmd = `git clone --depth 1 ${branchArg} ${repoUrl} ${clonePath}`;
|
|
15
|
+
try {
|
|
16
|
+
execSync(cmd, { stdio: 'pipe' });
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
20
|
+
throw new Error(`Failed to clone ${repoUrl}: ${msg}`);
|
|
21
|
+
}
|
|
22
|
+
return clonePath;
|
|
23
|
+
}
|
|
24
|
+
export async function resolveRepoPath(options) {
|
|
25
|
+
const { repoPathOverride, repoUrl, rawProjectsDir, pipelineName, branch } = options;
|
|
26
|
+
if (repoPathOverride) {
|
|
27
|
+
return resolve(repoPathOverride);
|
|
28
|
+
}
|
|
29
|
+
if (repoUrl) {
|
|
30
|
+
const rawDir = rawProjectsDir || process.env['STUDIO_PROJECTS_DIR'];
|
|
31
|
+
const projectsDir = rawDir?.replace(/^~/, homedir());
|
|
32
|
+
if (!projectsDir) {
|
|
33
|
+
throw new Error('STUDIO_PROJECTS_DIR is not set. Set it in config.yaml paths.projects_dir or as an environment variable.');
|
|
34
|
+
}
|
|
35
|
+
return cloneRepo(repoUrl, projectsDir, pipelineName, branch);
|
|
36
|
+
}
|
|
37
|
+
return '.';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=repo-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-resolver.js","sourceRoot":"","sources":["../src/repo-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,WAAmB,EACnB,YAAoB,EACpB,MAAe;IAEf,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,SAAS,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,uBAAuB,SAAS,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;IAEvE,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B;IAC/D,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpF,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RunSpawner, SpawnConfig, SpawnResult } from '@studio-foundation/contracts';
|
|
2
|
+
import { type EngineConfig } from '../engine.js';
|
|
3
|
+
export declare class DirectEngineSpawner implements RunSpawner {
|
|
4
|
+
private engineConfig;
|
|
5
|
+
constructor(engineConfig: EngineConfig);
|
|
6
|
+
spawnAndWait(config: SpawnConfig): Promise<SpawnResult>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=direct-engine-spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-engine-spawner.d.ts","sourceRoot":"","sources":["../../src/spawners/direct-engine-spawner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAe,MAAM,8BAA8B,CAAC;AACtG,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjE,qBAAa,mBAAoB,YAAW,UAAU;IACxC,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAmB9D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PipelineEngine } from '../engine.js';
|
|
2
|
+
export class DirectEngineSpawner {
|
|
3
|
+
engineConfig;
|
|
4
|
+
constructor(engineConfig) {
|
|
5
|
+
this.engineConfig = engineConfig;
|
|
6
|
+
}
|
|
7
|
+
async spawnAndWait(config) {
|
|
8
|
+
const child = new PipelineEngine(this.engineConfig);
|
|
9
|
+
const result = await child.run({
|
|
10
|
+
pipeline: config.pipeline,
|
|
11
|
+
input: config.input,
|
|
12
|
+
parentRunId: config.parentRunId,
|
|
13
|
+
depth: config.depth,
|
|
14
|
+
});
|
|
15
|
+
if (result.status === 'failed' || result.status === 'rejected' || result.status === 'cancelled') {
|
|
16
|
+
throw new Error(`Child run ${result.id} ${result.status}`);
|
|
17
|
+
}
|
|
18
|
+
// Extract output from the last successful stage
|
|
19
|
+
const lastStage = [...result.stages].reverse().find(s => s.status === 'success');
|
|
20
|
+
const output = lastStage?.output ?? null;
|
|
21
|
+
return { run_id: result.id, status: result.status, output };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=direct-engine-spawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-engine-spawner.js","sourceRoot":"","sources":["../../src/spawners/direct-engine-spawner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AAEjE,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD,KAAK,CAAC,YAAY,CAAC,MAAmB;QACpC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,MAAM,GAAgB,MAAM,KAAK,CAAC,GAAG,CAAC;YAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChG,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,gDAAgD;QAChD,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACjF,MAAM,MAAM,GAAI,SAA8C,EAAE,MAAM,IAAI,IAAI,CAAC;QAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9D,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { PipelineRun } from '@studio-foundation/contracts';
|
|
2
|
+
export interface RunStore {
|
|
3
|
+
savePipelineRun(run: PipelineRun): void;
|
|
4
|
+
getPipelineRun(id: string): PipelineRun | null;
|
|
5
|
+
listPipelineRuns(options?: {
|
|
6
|
+
limit?: number;
|
|
7
|
+
status?: string;
|
|
8
|
+
}): PipelineRun[];
|
|
9
|
+
getLatestRun(pipelineName?: string): PipelineRun | null;
|
|
10
|
+
saveLogPath(runId: string, logPath: string): void;
|
|
11
|
+
getLogPath(runId: string): string | null;
|
|
12
|
+
close?(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface AsyncRunStore {
|
|
15
|
+
savePipelineRun(run: PipelineRun): Promise<void>;
|
|
16
|
+
getPipelineRun(id: string): Promise<PipelineRun | null>;
|
|
17
|
+
listPipelineRuns(options?: {
|
|
18
|
+
limit?: number;
|
|
19
|
+
status?: string;
|
|
20
|
+
}): Promise<PipelineRun[]>;
|
|
21
|
+
getLatestRun(pipelineName?: string): Promise<PipelineRun | null>;
|
|
22
|
+
saveLogPath(runId: string, logPath: string): Promise<void>;
|
|
23
|
+
getLogPath(runId: string): Promise<string | null>;
|
|
24
|
+
close?(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export type AnyRunStore = RunStore | AsyncRunStore;
|
|
27
|
+
export declare class InMemoryRunStore implements RunStore {
|
|
28
|
+
private runs;
|
|
29
|
+
private logPaths;
|
|
30
|
+
savePipelineRun(run: PipelineRun): void;
|
|
31
|
+
getPipelineRun(id: string): PipelineRun | null;
|
|
32
|
+
listPipelineRuns(options?: {
|
|
33
|
+
limit?: number;
|
|
34
|
+
status?: string;
|
|
35
|
+
}): PipelineRun[];
|
|
36
|
+
getLatestRun(pipelineName?: string): PipelineRun | null;
|
|
37
|
+
saveLogPath(runId: string, logPath: string): void;
|
|
38
|
+
getLogPath(runId: string): string | null;
|
|
39
|
+
}
|
|
40
|
+
export declare class SQLiteRunStore implements RunStore {
|
|
41
|
+
private db;
|
|
42
|
+
constructor(dbPath: string);
|
|
43
|
+
private initSchema;
|
|
44
|
+
savePipelineRun(run: PipelineRun): void;
|
|
45
|
+
getPipelineRun(id: string): PipelineRun | null;
|
|
46
|
+
listPipelineRuns(options?: {
|
|
47
|
+
limit?: number;
|
|
48
|
+
status?: string;
|
|
49
|
+
}): PipelineRun[];
|
|
50
|
+
getLatestRun(pipelineName?: string): PipelineRun | null;
|
|
51
|
+
saveLogPath(runId: string, logPath: string): void;
|
|
52
|
+
getLogPath(runId: string): string | null;
|
|
53
|
+
close(): void;
|
|
54
|
+
}
|
|
55
|
+
export declare class PgRunStore implements AsyncRunStore {
|
|
56
|
+
private pool;
|
|
57
|
+
private schemaReady;
|
|
58
|
+
constructor(connectionString: string);
|
|
59
|
+
private ensureSchema;
|
|
60
|
+
private initSchema;
|
|
61
|
+
savePipelineRun(run: PipelineRun): Promise<void>;
|
|
62
|
+
getPipelineRun(id: string): Promise<PipelineRun | null>;
|
|
63
|
+
listPipelineRuns(options?: {
|
|
64
|
+
limit?: number;
|
|
65
|
+
status?: string;
|
|
66
|
+
}): Promise<PipelineRun[]>;
|
|
67
|
+
getLatestRun(pipelineName?: string): Promise<PipelineRun | null>;
|
|
68
|
+
saveLogPath(runId: string, logPath: string): Promise<void>;
|
|
69
|
+
getLogPath(runId: string): Promise<string | null>;
|
|
70
|
+
close(): Promise<void>;
|
|
71
|
+
/** Test-only: wipe table contents. Never call in production. */
|
|
72
|
+
dangerouslyTruncateForTests(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=run-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/state/run-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// Persistence layer for pipeline runs
|
|
2
|
+
// Three implementations: InMemoryRunStore (tests), SQLiteRunStore (local), PgRunStore (postgres)
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
// In-memory store for tests and simple usage
|
|
5
|
+
export class InMemoryRunStore {
|
|
6
|
+
runs = new Map();
|
|
7
|
+
logPaths = new Map();
|
|
8
|
+
savePipelineRun(run) {
|
|
9
|
+
this.runs.set(run.id, structuredClone(run));
|
|
10
|
+
}
|
|
11
|
+
getPipelineRun(id) {
|
|
12
|
+
const run = this.runs.get(id);
|
|
13
|
+
return run ? structuredClone(run) : null;
|
|
14
|
+
}
|
|
15
|
+
listPipelineRuns(options) {
|
|
16
|
+
let runs = Array.from(this.runs.values());
|
|
17
|
+
if (options?.status) {
|
|
18
|
+
runs = runs.filter(r => r.status === options.status);
|
|
19
|
+
}
|
|
20
|
+
// Sort by started_at descending
|
|
21
|
+
runs.sort((a, b) => b.started_at.localeCompare(a.started_at));
|
|
22
|
+
if (options?.limit) {
|
|
23
|
+
runs = runs.slice(0, options.limit);
|
|
24
|
+
}
|
|
25
|
+
return runs.map(r => structuredClone(r));
|
|
26
|
+
}
|
|
27
|
+
getLatestRun(pipelineName) {
|
|
28
|
+
let runs = Array.from(this.runs.values());
|
|
29
|
+
if (pipelineName) {
|
|
30
|
+
runs = runs.filter(r => r.pipeline_name === pipelineName);
|
|
31
|
+
}
|
|
32
|
+
if (runs.length === 0)
|
|
33
|
+
return null;
|
|
34
|
+
runs.sort((a, b) => b.started_at.localeCompare(a.started_at));
|
|
35
|
+
return structuredClone(runs[0]);
|
|
36
|
+
}
|
|
37
|
+
saveLogPath(runId, logPath) {
|
|
38
|
+
this.logPaths.set(runId, logPath);
|
|
39
|
+
}
|
|
40
|
+
getLogPath(runId) {
|
|
41
|
+
return this.logPaths.get(runId) ?? null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// SQLite store for production persistence
|
|
45
|
+
// Uses better-sqlite3 (synchronous, simple, no migrations)
|
|
46
|
+
// Stores the entire PipelineRun as JSON in a single column — simple, queryable by status
|
|
47
|
+
export class SQLiteRunStore {
|
|
48
|
+
db;
|
|
49
|
+
constructor(dbPath) {
|
|
50
|
+
const _require = createRequire(import.meta.url);
|
|
51
|
+
const Database = _require('better-sqlite3');
|
|
52
|
+
this.db = new Database(dbPath);
|
|
53
|
+
this.db.pragma('journal_mode = WAL');
|
|
54
|
+
this.initSchema();
|
|
55
|
+
}
|
|
56
|
+
initSchema() {
|
|
57
|
+
this.db.exec(`
|
|
58
|
+
CREATE TABLE IF NOT EXISTS pipeline_runs (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
pipeline_name TEXT NOT NULL,
|
|
61
|
+
status TEXT NOT NULL,
|
|
62
|
+
result TEXT NOT NULL,
|
|
63
|
+
started_at TEXT NOT NULL,
|
|
64
|
+
completed_at TEXT,
|
|
65
|
+
log_path TEXT,
|
|
66
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_pipeline_runs_status
|
|
70
|
+
ON pipeline_runs(status);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_pipeline_runs_created
|
|
72
|
+
ON pipeline_runs(created_at DESC);
|
|
73
|
+
`);
|
|
74
|
+
// Migration: add log_path column to existing databases
|
|
75
|
+
try {
|
|
76
|
+
this.db.exec('ALTER TABLE pipeline_runs ADD COLUMN log_path TEXT');
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Column already exists — ignore
|
|
80
|
+
}
|
|
81
|
+
// Migration: add parent_run_id column to existing databases
|
|
82
|
+
try {
|
|
83
|
+
this.db.exec('ALTER TABLE pipeline_runs ADD COLUMN parent_run_id TEXT');
|
|
84
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS idx_pipeline_runs_parent ON pipeline_runs(parent_run_id)');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Column already exists — ignore
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
savePipelineRun(run) {
|
|
91
|
+
this.db.prepare(`
|
|
92
|
+
INSERT INTO pipeline_runs (id, pipeline_name, status, result, started_at, completed_at, parent_run_id)
|
|
93
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
94
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
95
|
+
pipeline_name = excluded.pipeline_name,
|
|
96
|
+
status = excluded.status,
|
|
97
|
+
result = excluded.result,
|
|
98
|
+
started_at = excluded.started_at,
|
|
99
|
+
completed_at = excluded.completed_at,
|
|
100
|
+
parent_run_id = excluded.parent_run_id
|
|
101
|
+
`).run(run.id, run.pipeline_name, run.status, JSON.stringify(run), run.started_at, run.completed_at ?? null, run.parent_run_id ?? null);
|
|
102
|
+
}
|
|
103
|
+
getPipelineRun(id) {
|
|
104
|
+
const row = this.db.prepare('SELECT result FROM pipeline_runs WHERE id = ?').get(id);
|
|
105
|
+
if (!row)
|
|
106
|
+
return null;
|
|
107
|
+
return JSON.parse(row.result);
|
|
108
|
+
}
|
|
109
|
+
listPipelineRuns(options) {
|
|
110
|
+
let sql = 'SELECT result FROM pipeline_runs';
|
|
111
|
+
const params = [];
|
|
112
|
+
if (options?.status) {
|
|
113
|
+
sql += ' WHERE status = ?';
|
|
114
|
+
params.push(options.status);
|
|
115
|
+
}
|
|
116
|
+
sql += ' ORDER BY created_at DESC';
|
|
117
|
+
if (options?.limit) {
|
|
118
|
+
sql += ' LIMIT ?';
|
|
119
|
+
params.push(options.limit);
|
|
120
|
+
}
|
|
121
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
122
|
+
return rows.map(row => JSON.parse(row.result));
|
|
123
|
+
}
|
|
124
|
+
getLatestRun(pipelineName) {
|
|
125
|
+
let sql = 'SELECT result FROM pipeline_runs';
|
|
126
|
+
const params = [];
|
|
127
|
+
if (pipelineName) {
|
|
128
|
+
sql += ' WHERE pipeline_name = ?';
|
|
129
|
+
params.push(pipelineName);
|
|
130
|
+
}
|
|
131
|
+
sql += ' ORDER BY created_at DESC LIMIT 1';
|
|
132
|
+
const row = this.db.prepare(sql).get(...params);
|
|
133
|
+
if (!row)
|
|
134
|
+
return null;
|
|
135
|
+
return JSON.parse(row.result);
|
|
136
|
+
}
|
|
137
|
+
saveLogPath(runId, logPath) {
|
|
138
|
+
this.db.prepare('UPDATE pipeline_runs SET log_path = ? WHERE id = ?').run(logPath, runId);
|
|
139
|
+
}
|
|
140
|
+
getLogPath(runId) {
|
|
141
|
+
const row = this.db.prepare('SELECT log_path FROM pipeline_runs WHERE id = ?').get(runId);
|
|
142
|
+
return row?.log_path ?? null;
|
|
143
|
+
}
|
|
144
|
+
close() {
|
|
145
|
+
this.db.close();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// PostgreSQL store — async implementation using raw pg (no Prisma)
|
|
149
|
+
// Creates its own `studio_pipeline_runs` table on first use (like SQLiteRunStore does with initSchema).
|
|
150
|
+
// Stores the entire PipelineRun as JSON in `result` — same pattern as SQLiteRunStore.
|
|
151
|
+
// Uses table prefix `studio_` to avoid conflicts with the user app's own tables.
|
|
152
|
+
export class PgRunStore {
|
|
153
|
+
pool;
|
|
154
|
+
schemaReady = null;
|
|
155
|
+
constructor(connectionString) {
|
|
156
|
+
const _require = createRequire(import.meta.url);
|
|
157
|
+
const { Pool } = _require('pg');
|
|
158
|
+
this.pool = new Pool({ connectionString });
|
|
159
|
+
}
|
|
160
|
+
ensureSchema() {
|
|
161
|
+
if (!this.schemaReady) {
|
|
162
|
+
this.schemaReady = this.initSchema();
|
|
163
|
+
}
|
|
164
|
+
return this.schemaReady;
|
|
165
|
+
}
|
|
166
|
+
async initSchema() {
|
|
167
|
+
await this.pool.query(`
|
|
168
|
+
CREATE TABLE IF NOT EXISTS studio_pipeline_runs (
|
|
169
|
+
id TEXT PRIMARY KEY,
|
|
170
|
+
pipeline_name TEXT NOT NULL,
|
|
171
|
+
status TEXT NOT NULL,
|
|
172
|
+
result TEXT NOT NULL,
|
|
173
|
+
started_at TEXT NOT NULL,
|
|
174
|
+
completed_at TEXT,
|
|
175
|
+
log_path TEXT,
|
|
176
|
+
parent_run_id TEXT,
|
|
177
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
178
|
+
)
|
|
179
|
+
`);
|
|
180
|
+
await this.pool.query(`
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_studio_pipeline_runs_status
|
|
182
|
+
ON studio_pipeline_runs(status)
|
|
183
|
+
`);
|
|
184
|
+
await this.pool.query(`
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_studio_pipeline_runs_created
|
|
186
|
+
ON studio_pipeline_runs(created_at DESC)
|
|
187
|
+
`);
|
|
188
|
+
await this.pool.query(`
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_studio_pipeline_runs_parent
|
|
190
|
+
ON studio_pipeline_runs(parent_run_id)
|
|
191
|
+
`);
|
|
192
|
+
}
|
|
193
|
+
async savePipelineRun(run) {
|
|
194
|
+
await this.ensureSchema();
|
|
195
|
+
await this.pool.query(`INSERT INTO studio_pipeline_runs
|
|
196
|
+
(id, pipeline_name, status, result, started_at, completed_at, parent_run_id)
|
|
197
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
198
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
199
|
+
pipeline_name = EXCLUDED.pipeline_name,
|
|
200
|
+
status = EXCLUDED.status,
|
|
201
|
+
result = EXCLUDED.result,
|
|
202
|
+
started_at = EXCLUDED.started_at,
|
|
203
|
+
completed_at = EXCLUDED.completed_at,
|
|
204
|
+
parent_run_id = EXCLUDED.parent_run_id`, [
|
|
205
|
+
run.id,
|
|
206
|
+
run.pipeline_name,
|
|
207
|
+
run.status,
|
|
208
|
+
JSON.stringify(run),
|
|
209
|
+
run.started_at,
|
|
210
|
+
run.completed_at ?? null,
|
|
211
|
+
run.parent_run_id ?? null,
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
async getPipelineRun(id) {
|
|
215
|
+
await this.ensureSchema();
|
|
216
|
+
const res = await this.pool.query('SELECT result FROM studio_pipeline_runs WHERE id = $1', [id]);
|
|
217
|
+
if (res.rows.length === 0)
|
|
218
|
+
return null;
|
|
219
|
+
return JSON.parse(res.rows[0].result);
|
|
220
|
+
}
|
|
221
|
+
async listPipelineRuns(options) {
|
|
222
|
+
await this.ensureSchema();
|
|
223
|
+
const params = [];
|
|
224
|
+
let sql = 'SELECT result FROM studio_pipeline_runs';
|
|
225
|
+
if (options?.status) {
|
|
226
|
+
params.push(options.status);
|
|
227
|
+
sql += ` WHERE status = $${params.length}`;
|
|
228
|
+
}
|
|
229
|
+
sql += ' ORDER BY created_at DESC';
|
|
230
|
+
if (options?.limit) {
|
|
231
|
+
params.push(options.limit);
|
|
232
|
+
sql += ` LIMIT $${params.length}`;
|
|
233
|
+
}
|
|
234
|
+
const res = await this.pool.query(sql, params);
|
|
235
|
+
return res.rows.map((r) => JSON.parse(r.result));
|
|
236
|
+
}
|
|
237
|
+
async getLatestRun(pipelineName) {
|
|
238
|
+
await this.ensureSchema();
|
|
239
|
+
const params = [];
|
|
240
|
+
let sql = 'SELECT result FROM studio_pipeline_runs';
|
|
241
|
+
if (pipelineName) {
|
|
242
|
+
params.push(pipelineName);
|
|
243
|
+
sql += ` WHERE pipeline_name = $${params.length}`;
|
|
244
|
+
}
|
|
245
|
+
sql += ' ORDER BY created_at DESC LIMIT 1';
|
|
246
|
+
const res = await this.pool.query(sql, params);
|
|
247
|
+
if (res.rows.length === 0)
|
|
248
|
+
return null;
|
|
249
|
+
return JSON.parse(res.rows[0].result);
|
|
250
|
+
}
|
|
251
|
+
async saveLogPath(runId, logPath) {
|
|
252
|
+
await this.ensureSchema();
|
|
253
|
+
await this.pool.query('UPDATE studio_pipeline_runs SET log_path = $1 WHERE id = $2', [logPath, runId]);
|
|
254
|
+
}
|
|
255
|
+
async getLogPath(runId) {
|
|
256
|
+
await this.ensureSchema();
|
|
257
|
+
const res = await this.pool.query('SELECT log_path FROM studio_pipeline_runs WHERE id = $1', [runId]);
|
|
258
|
+
return res.rows[0]?.log_path ?? null;
|
|
259
|
+
}
|
|
260
|
+
async close() {
|
|
261
|
+
await this.pool.end();
|
|
262
|
+
}
|
|
263
|
+
/** Test-only: wipe table contents. Never call in production. */
|
|
264
|
+
async dangerouslyTruncateForTests() {
|
|
265
|
+
await this.ensureSchema();
|
|
266
|
+
await this.pool.query('TRUNCATE TABLE studio_pipeline_runs');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=run-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/state/run-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.test.d.ts","sourceRoot":"","sources":["../../src/state/run-store.test.ts"],"names":[],"mappings":""}
|