@studio-foundation/engine 0.3.0-beta.1 → 0.3.0-beta.6
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
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { ToolCall, ToolCallStartEvent, ToolCallCompleteEvent, AgentThinkingEvent, AgentProgressEvent, AgentTokenEvent } from '@studio-foundation/contracts';
|
|
2
|
+
export interface ToolCallSummary {
|
|
3
|
+
name: string;
|
|
4
|
+
arguments_summary: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TokenUsage {
|
|
7
|
+
prompt_tokens: number;
|
|
8
|
+
completion_tokens: number;
|
|
9
|
+
total_tokens: number;
|
|
10
|
+
}
|
|
11
|
+
export interface PipelineStartEvent {
|
|
12
|
+
pipeline_name: string;
|
|
13
|
+
run_id: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PipelineCompleteEvent {
|
|
16
|
+
pipeline_name: string;
|
|
17
|
+
run_id: string;
|
|
18
|
+
status: string;
|
|
19
|
+
duration_ms: number;
|
|
20
|
+
total_tokens: number;
|
|
21
|
+
total_tool_calls: number;
|
|
22
|
+
}
|
|
23
|
+
export interface PipelineCancelledEvent {
|
|
24
|
+
run_id: string;
|
|
25
|
+
cancelled_at_stage: string;
|
|
26
|
+
duration_ms: number;
|
|
27
|
+
}
|
|
28
|
+
export interface StageStartEvent {
|
|
29
|
+
stage_name: string;
|
|
30
|
+
stage_index: number;
|
|
31
|
+
total_stages: number;
|
|
32
|
+
max_attempts: number;
|
|
33
|
+
}
|
|
34
|
+
export interface StageCompleteEvent {
|
|
35
|
+
stage_name: string;
|
|
36
|
+
stage_index: number;
|
|
37
|
+
total_stages: number;
|
|
38
|
+
status: string;
|
|
39
|
+
attempts: number;
|
|
40
|
+
duration_ms: number;
|
|
41
|
+
output_summary?: string;
|
|
42
|
+
output?: unknown;
|
|
43
|
+
tool_calls?: ToolCall[];
|
|
44
|
+
token_usage?: TokenUsage;
|
|
45
|
+
rejection_reason?: string;
|
|
46
|
+
rejection_details?: string[];
|
|
47
|
+
skipped_reason?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface StageRetryEvent {
|
|
50
|
+
stage: string;
|
|
51
|
+
attempt: number;
|
|
52
|
+
max_attempts: number;
|
|
53
|
+
failures: string[];
|
|
54
|
+
agent_output_raw?: string;
|
|
55
|
+
tool_calls_count?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface GroupStartEvent {
|
|
58
|
+
group_name: string;
|
|
59
|
+
max_iterations: number;
|
|
60
|
+
parallel?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface GroupIterationEvent {
|
|
63
|
+
group_name: string;
|
|
64
|
+
iteration: number;
|
|
65
|
+
max_iterations: number;
|
|
66
|
+
}
|
|
67
|
+
export interface GroupFeedbackEvent {
|
|
68
|
+
group_name: string;
|
|
69
|
+
iteration: number;
|
|
70
|
+
rejection_reason: string;
|
|
71
|
+
rejection_details: string[];
|
|
72
|
+
}
|
|
73
|
+
export interface GroupCompleteEvent {
|
|
74
|
+
group_name: string;
|
|
75
|
+
iterations: number;
|
|
76
|
+
status: string;
|
|
77
|
+
}
|
|
78
|
+
export interface StageContextEvent {
|
|
79
|
+
stage: string;
|
|
80
|
+
run_id: string;
|
|
81
|
+
context_keys: Record<string, number>;
|
|
82
|
+
context_content?: Record<string, unknown>;
|
|
83
|
+
system_prompt?: string;
|
|
84
|
+
}
|
|
85
|
+
export interface StagedToolCallStartEvent extends ToolCallStartEvent {
|
|
86
|
+
stage: string;
|
|
87
|
+
}
|
|
88
|
+
export interface StagedToolCallCompleteEvent extends ToolCallCompleteEvent {
|
|
89
|
+
stage: string;
|
|
90
|
+
}
|
|
91
|
+
export interface StagedAgentThinkingEvent extends AgentThinkingEvent {
|
|
92
|
+
stage: string;
|
|
93
|
+
}
|
|
94
|
+
export interface StagedAgentProgressEvent extends AgentProgressEvent {
|
|
95
|
+
stage: string;
|
|
96
|
+
}
|
|
97
|
+
export interface StagedAgentTokenEvent extends AgentTokenEvent {
|
|
98
|
+
stage: string;
|
|
99
|
+
}
|
|
100
|
+
export interface EngineEvents {
|
|
101
|
+
onPipelineStart?: (event: PipelineStartEvent) => void;
|
|
102
|
+
onPipelineComplete?: (event: PipelineCompleteEvent) => void;
|
|
103
|
+
onPipelineCancelled?: (event: PipelineCancelledEvent) => void;
|
|
104
|
+
onStageStart?: (event: StageStartEvent) => void;
|
|
105
|
+
onStageComplete?: (event: StageCompleteEvent) => void;
|
|
106
|
+
onTaskRetry?: (event: StageRetryEvent) => void;
|
|
107
|
+
onGroupStart?: (event: GroupStartEvent) => void;
|
|
108
|
+
onGroupIteration?: (event: GroupIterationEvent) => void;
|
|
109
|
+
onGroupFeedback?: (event: GroupFeedbackEvent) => void;
|
|
110
|
+
onGroupComplete?: (event: GroupCompleteEvent) => void;
|
|
111
|
+
onStageContext?: (event: StageContextEvent) => void;
|
|
112
|
+
onToolCallStart?: (event: StagedToolCallStartEvent) => void;
|
|
113
|
+
onToolCallComplete?: (event: StagedToolCallCompleteEvent) => void;
|
|
114
|
+
onAgentThinking?: (event: StagedAgentThinkingEvent) => void;
|
|
115
|
+
onAgentProgress?: (event: StagedAgentProgressEvent) => void;
|
|
116
|
+
onAgentToken?: (event: StagedAgentTokenEvent) => void;
|
|
117
|
+
}
|
|
118
|
+
export type PipelineEvent = {
|
|
119
|
+
type: 'pipeline_start';
|
|
120
|
+
pipelineId: string;
|
|
121
|
+
} | {
|
|
122
|
+
type: 'pipeline_complete';
|
|
123
|
+
pipelineId: string;
|
|
124
|
+
} | {
|
|
125
|
+
type: 'stage_start';
|
|
126
|
+
stageId: string;
|
|
127
|
+
stageName: string;
|
|
128
|
+
} | {
|
|
129
|
+
type: 'stage_complete';
|
|
130
|
+
stageId: string;
|
|
131
|
+
stageName: string;
|
|
132
|
+
} | {
|
|
133
|
+
type: 'task_retry';
|
|
134
|
+
stageName: string;
|
|
135
|
+
attempt: number;
|
|
136
|
+
failures: string[];
|
|
137
|
+
rawOutput?: string;
|
|
138
|
+
} | {
|
|
139
|
+
type: 'group_start';
|
|
140
|
+
groupName: string;
|
|
141
|
+
maxIterations: number;
|
|
142
|
+
} | {
|
|
143
|
+
type: 'group_iteration';
|
|
144
|
+
groupName: string;
|
|
145
|
+
iteration: number;
|
|
146
|
+
maxIterations: number;
|
|
147
|
+
} | {
|
|
148
|
+
type: 'group_feedback';
|
|
149
|
+
groupName: string;
|
|
150
|
+
iteration: number;
|
|
151
|
+
rejectionReason: string;
|
|
152
|
+
} | {
|
|
153
|
+
type: 'group_complete';
|
|
154
|
+
groupName: string;
|
|
155
|
+
iterations: number;
|
|
156
|
+
status: string;
|
|
157
|
+
};
|
|
158
|
+
export declare class PipelineEventEmitter {
|
|
159
|
+
private listeners;
|
|
160
|
+
on(listener: (event: PipelineEvent) => void): void;
|
|
161
|
+
emit(event: PipelineEvent): void;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AA0JA,MAAM,OAAO,oBAAoB;IACvB,SAAS,GAA0C,EAAE,CAAC;IAE9D,EAAE,CAAC,QAAwC;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,KAAoB;QACvB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,64 +1,22 @@
|
|
|
1
|
-
// Export barrel for @studio/engine
|
|
2
|
-
|
|
3
|
-
// Main engine
|
|
4
1
|
export { PipelineEngine } from './engine.js';
|
|
5
2
|
export type { EngineConfig, RunInput } from './engine.js';
|
|
6
|
-
|
|
7
|
-
// Events
|
|
8
3
|
export { PipelineEventEmitter } from './events.js';
|
|
9
|
-
export type {
|
|
10
|
-
EngineEvents,
|
|
11
|
-
PipelineEvent,
|
|
12
|
-
PipelineStartEvent,
|
|
13
|
-
PipelineCompleteEvent,
|
|
14
|
-
PipelineCancelledEvent,
|
|
15
|
-
StageStartEvent,
|
|
16
|
-
StageCompleteEvent,
|
|
17
|
-
StageRetryEvent,
|
|
18
|
-
ToolCallSummary,
|
|
19
|
-
TokenUsage,
|
|
20
|
-
GroupStartEvent,
|
|
21
|
-
GroupIterationEvent,
|
|
22
|
-
GroupFeedbackEvent,
|
|
23
|
-
GroupCompleteEvent,
|
|
24
|
-
StageContextEvent,
|
|
25
|
-
StagedToolCallStartEvent,
|
|
26
|
-
StagedToolCallCompleteEvent,
|
|
27
|
-
} from './events.js';
|
|
28
|
-
|
|
29
|
-
// State management
|
|
4
|
+
export type { EngineEvents, PipelineEvent, PipelineStartEvent, PipelineCompleteEvent, PipelineCancelledEvent, StageStartEvent, StageCompleteEvent, StageRetryEvent, ToolCallSummary, TokenUsage, GroupStartEvent, GroupIterationEvent, GroupFeedbackEvent, GroupCompleteEvent, StageContextEvent, StagedToolCallStartEvent, StagedToolCallCompleteEvent, } from './events.js';
|
|
30
5
|
export { deriveStageStatus } from './state/status-derivation.js';
|
|
31
6
|
export { isValidTransition, transition } from './state/state-machine.js';
|
|
32
7
|
export type { StageLifecycleState } from './state/state-machine.js';
|
|
33
|
-
|
|
34
|
-
// Run store
|
|
35
8
|
export { InMemoryRunStore, SQLiteRunStore, PgRunStore } from './state/run-store.js';
|
|
36
9
|
export type { RunStore, AsyncRunStore, AnyRunStore } from './state/run-store.js';
|
|
37
|
-
|
|
38
|
-
// Pipeline loaders
|
|
39
10
|
export { loadPipeline, loadPipelineByName, parsePipelineYaml } from './pipeline/loader.js';
|
|
40
11
|
export { loadAgentProfile, parseAgentYaml } from './pipeline/agent-loader.js';
|
|
41
12
|
export { loadContract, parseContractYaml } from './pipeline/contract-loader.js';
|
|
42
|
-
|
|
43
|
-
// Context propagation
|
|
44
|
-
export {
|
|
45
|
-
createInitialContext,
|
|
46
|
-
addStageOutput,
|
|
47
|
-
getContextForStage,
|
|
48
|
-
setGroupFeedback,
|
|
49
|
-
clearGroupFeedback,
|
|
50
|
-
} from './pipeline/context-propagation.js';
|
|
13
|
+
export { createInitialContext, addStageOutput, getContextForStage, setGroupFeedback, clearGroupFeedback, } from './pipeline/context-propagation.js';
|
|
51
14
|
export type { PipelineContext, PipelineInput, GroupFeedback } from './pipeline/context-propagation.js';
|
|
52
|
-
|
|
53
|
-
// Contract validation
|
|
54
15
|
export { validateOutput } from './pipeline/output-validator.js';
|
|
55
16
|
export type { OutputValidationResult } from './pipeline/output-validator.js';
|
|
56
17
|
export type { PostValidationResult } from './pipeline/post-validator.js';
|
|
57
18
|
export { validateSchema } from '@studio-foundation/ralph';
|
|
58
|
-
|
|
59
|
-
// Spawners
|
|
60
19
|
export { DirectEngineSpawner } from './spawners/direct-engine-spawner.js';
|
|
61
|
-
|
|
62
|
-
// Repo resolution
|
|
63
20
|
export { resolveRepoPath, cloneRepo } from './repo-resolver.js';
|
|
64
21
|
export type { RepoResolveOptions } from './repo-resolver.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGhF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvG,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Export barrel for @studio/engine
|
|
2
|
+
// Main engine
|
|
3
|
+
export { PipelineEngine } from './engine.js';
|
|
4
|
+
// Events
|
|
5
|
+
export { PipelineEventEmitter } from './events.js';
|
|
6
|
+
// State management
|
|
7
|
+
export { deriveStageStatus } from './state/status-derivation.js';
|
|
8
|
+
export { isValidTransition, transition } from './state/state-machine.js';
|
|
9
|
+
// Run store
|
|
10
|
+
export { InMemoryRunStore, SQLiteRunStore, PgRunStore } from './state/run-store.js';
|
|
11
|
+
// Pipeline loaders
|
|
12
|
+
export { loadPipeline, loadPipelineByName, parsePipelineYaml } from './pipeline/loader.js';
|
|
13
|
+
export { loadAgentProfile, parseAgentYaml } from './pipeline/agent-loader.js';
|
|
14
|
+
export { loadContract, parseContractYaml } from './pipeline/contract-loader.js';
|
|
15
|
+
// Context propagation
|
|
16
|
+
export { createInitialContext, addStageOutput, getContextForStage, setGroupFeedback, clearGroupFeedback, } from './pipeline/context-propagation.js';
|
|
17
|
+
// Contract validation
|
|
18
|
+
export { validateOutput } from './pipeline/output-validator.js';
|
|
19
|
+
export { validateSchema } from '@studio-foundation/ralph';
|
|
20
|
+
// Spawners
|
|
21
|
+
export { DirectEngineSpawner } from './spawners/direct-engine-spawner.js';
|
|
22
|
+
// Repo resolution
|
|
23
|
+
export { resolveRepoPath, cloneRepo } from './repo-resolver.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,SAAS;AACT,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAqBnD,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGzE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGpF,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEhF,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAG3C,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentConfig } from '@studio-foundation/contracts';
|
|
2
|
+
export declare function loadAgentProfile(name: string, agentsDir: string): Promise<AgentConfig>;
|
|
3
|
+
export declare function parseAgentYaml(yamlContent: string, sourcePath?: string): AgentConfig;
|
|
4
|
+
//# sourceMappingURL=agent-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loader.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAepF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Load agent profiles from YAML files
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
export async function loadAgentProfile(name, agentsDir) {
|
|
6
|
+
const path = join(agentsDir, `${name}.agent.yaml`);
|
|
7
|
+
let content;
|
|
8
|
+
try {
|
|
9
|
+
content = await readFile(path, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new Error(`Failed to load agent profile '${name}' at ${path}: ${err.message}`);
|
|
13
|
+
}
|
|
14
|
+
return parseAgentYaml(content, path);
|
|
15
|
+
}
|
|
16
|
+
export function parseAgentYaml(yamlContent, sourcePath) {
|
|
17
|
+
const parsed = yaml.load(yamlContent);
|
|
18
|
+
const context = sourcePath ? ` (from ${sourcePath})` : '';
|
|
19
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
20
|
+
throw new Error(`Invalid agent YAML: expected an object${context}`);
|
|
21
|
+
}
|
|
22
|
+
if (!parsed.name || typeof parsed.name !== 'string') {
|
|
23
|
+
throw new Error(`Agent config missing required field 'name'${context}`);
|
|
24
|
+
}
|
|
25
|
+
// provider and model are optional — defaults are applied at execution time
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=agent-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loader.js","sourceRoot":"","sources":["../../src/pipeline/agent-loader.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAGhC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,SAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;IAEnD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,QAAQ,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,UAAmB;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAA4B,CAAC;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,2EAA2E;IAE3E,OAAO,MAAgC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loader.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseAgentYaml } from './agent-loader.js';
|
|
3
|
+
describe('parseAgentYaml', () => {
|
|
4
|
+
it('parses plugins field from agent YAML', () => {
|
|
5
|
+
const yaml = `
|
|
6
|
+
name: code-reviewer
|
|
7
|
+
provider: anthropic
|
|
8
|
+
model: claude-sonnet-4-20250514
|
|
9
|
+
plugins:
|
|
10
|
+
- code-review
|
|
11
|
+
- analysis
|
|
12
|
+
tools:
|
|
13
|
+
- repo_manager-read_file
|
|
14
|
+
`;
|
|
15
|
+
const result = parseAgentYaml(yaml);
|
|
16
|
+
expect(result.plugins).toEqual(['code-review', 'analysis']);
|
|
17
|
+
});
|
|
18
|
+
it('returns undefined plugins when not specified', () => {
|
|
19
|
+
const yaml = `
|
|
20
|
+
name: analyst
|
|
21
|
+
provider: anthropic
|
|
22
|
+
model: claude-haiku-4-5-20251001
|
|
23
|
+
`;
|
|
24
|
+
const result = parseAgentYaml(yaml);
|
|
25
|
+
expect(result.plugins).toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('skill injection logic', () => {
|
|
29
|
+
it('appends skill content to system_prompt when plugins match', () => {
|
|
30
|
+
// Test the injection logic directly
|
|
31
|
+
const agent = parseAgentYaml(`
|
|
32
|
+
name: test-agent
|
|
33
|
+
provider: anthropic
|
|
34
|
+
model: claude-haiku-4-5-20251001
|
|
35
|
+
system_prompt: "You are a reviewer."
|
|
36
|
+
plugins:
|
|
37
|
+
- code-review
|
|
38
|
+
`);
|
|
39
|
+
// Simulate what engine does
|
|
40
|
+
const pluginSkills = {
|
|
41
|
+
'code-review': ['## Skill: review-guidelines\n\nAlways check for bugs.'],
|
|
42
|
+
};
|
|
43
|
+
if (agent.plugins?.length && pluginSkills) {
|
|
44
|
+
const skillChunks = agent.plugins.flatMap((p) => pluginSkills[p] ?? []);
|
|
45
|
+
if (skillChunks.length > 0) {
|
|
46
|
+
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
expect(agent.system_prompt).toContain('You are a reviewer.');
|
|
50
|
+
expect(agent.system_prompt).toContain('## Skill: review-guidelines');
|
|
51
|
+
expect(agent.system_prompt).toContain('Always check for bugs.');
|
|
52
|
+
});
|
|
53
|
+
it('does not modify system_prompt when no matching plugin skills', () => {
|
|
54
|
+
const agent = parseAgentYaml(`
|
|
55
|
+
name: test-agent
|
|
56
|
+
provider: anthropic
|
|
57
|
+
model: claude-haiku-4-5-20251001
|
|
58
|
+
system_prompt: "Original prompt."
|
|
59
|
+
plugins:
|
|
60
|
+
- unknown-plugin
|
|
61
|
+
`);
|
|
62
|
+
const pluginSkills = {
|
|
63
|
+
'code-review': ['## Skill: review-guidelines\n\nAlways check for bugs.'],
|
|
64
|
+
};
|
|
65
|
+
const originalPrompt = agent.system_prompt;
|
|
66
|
+
if (agent.plugins?.length && pluginSkills) {
|
|
67
|
+
const skillChunks = agent.plugins.flatMap((p) => pluginSkills[p] ?? []);
|
|
68
|
+
if (skillChunks.length > 0) {
|
|
69
|
+
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
expect(agent.system_prompt).toBe(originalPrompt);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('skills field parsing', () => {
|
|
76
|
+
it('parses skills field from agent YAML', () => {
|
|
77
|
+
const yaml = `
|
|
78
|
+
name: coder
|
|
79
|
+
provider: anthropic
|
|
80
|
+
model: claude-sonnet-4-6
|
|
81
|
+
skills:
|
|
82
|
+
- git-workflow
|
|
83
|
+
- code-conventions
|
|
84
|
+
`;
|
|
85
|
+
const result = parseAgentYaml(yaml);
|
|
86
|
+
expect(result.skills).toEqual(['git-workflow', 'code-conventions']);
|
|
87
|
+
});
|
|
88
|
+
it('returns undefined skills when not specified', () => {
|
|
89
|
+
const yaml = `
|
|
90
|
+
name: analyst
|
|
91
|
+
provider: anthropic
|
|
92
|
+
model: claude-haiku-4-5-20251001
|
|
93
|
+
`;
|
|
94
|
+
const result = parseAgentYaml(yaml);
|
|
95
|
+
expect(result.skills).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('project skill injection logic', () => {
|
|
99
|
+
it('appends skill content to system_prompt for declared skills', () => {
|
|
100
|
+
const agent = parseAgentYaml(`
|
|
101
|
+
name: coder
|
|
102
|
+
provider: anthropic
|
|
103
|
+
model: claude-sonnet-4-6
|
|
104
|
+
system_prompt: "You are a developer."
|
|
105
|
+
skills:
|
|
106
|
+
- git-workflow
|
|
107
|
+
`);
|
|
108
|
+
// Simulate what engine does: format loaded skills and append to system_prompt
|
|
109
|
+
const loadedSkills = [{ name: 'git-workflow', content: '# Git Workflow\n\nAlways branch from main.' }];
|
|
110
|
+
if (agent.skills?.length && loadedSkills.length > 0) {
|
|
111
|
+
const skillChunks = loadedSkills.map((s) => `## Skill: ${s.name}\n\n${s.content}`);
|
|
112
|
+
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
113
|
+
}
|
|
114
|
+
expect(agent.system_prompt).toContain('You are a developer.');
|
|
115
|
+
expect(agent.system_prompt).toContain('## Skill: git-workflow');
|
|
116
|
+
expect(agent.system_prompt).toContain('Always branch from main.');
|
|
117
|
+
});
|
|
118
|
+
it('does not modify system_prompt when no skills declared', () => {
|
|
119
|
+
const agent = parseAgentYaml(`
|
|
120
|
+
name: analyst
|
|
121
|
+
provider: anthropic
|
|
122
|
+
model: claude-sonnet-4-6
|
|
123
|
+
system_prompt: "You are an analyst."
|
|
124
|
+
`);
|
|
125
|
+
const originalPrompt = agent.system_prompt;
|
|
126
|
+
const loadedSkills = [];
|
|
127
|
+
if (agent.skills?.length && loadedSkills.length > 0) {
|
|
128
|
+
const skillChunks = loadedSkills.map((s) => `## Skill: ${s.name}\n\n${s.content}`);
|
|
129
|
+
agent.system_prompt = `${agent.system_prompt ?? ''}\n\n${skillChunks.join('\n\n---\n\n')}`;
|
|
130
|
+
}
|
|
131
|
+
expect(agent.system_prompt).toBe(originalPrompt);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=agent-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loader.test.js","sourceRoot":"","sources":["../../src/pipeline/agent-loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.d.ts","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM9D,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACpE,OAAO,CAyBT"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Secure condition evaluator — no eval(), no external dependencies.
|
|
2
|
+
// Supported syntax:
|
|
3
|
+
// input.<field.path> compared to a literal
|
|
4
|
+
// stages.<stage-name>.output.<field.path> compared to a literal
|
|
5
|
+
// Operators: ===, !==, >=, <=, ==, !=, >, <
|
|
6
|
+
// Returns false for any undefined/invalid path (skip-safe).
|
|
7
|
+
// Longest-first to avoid '>' matching inside '>='
|
|
8
|
+
const OPERATORS = ['===', '!==', '>=', '<=', '==', '!=', '>', '<'];
|
|
9
|
+
export function evaluateCondition(condition, context) {
|
|
10
|
+
const trimmed = condition.trim();
|
|
11
|
+
// Find operator (longest-first)
|
|
12
|
+
let operator;
|
|
13
|
+
let lhsStr = '';
|
|
14
|
+
let rhsStr = '';
|
|
15
|
+
for (const op of OPERATORS) {
|
|
16
|
+
const idx = trimmed.indexOf(op);
|
|
17
|
+
if (idx !== -1) {
|
|
18
|
+
operator = op;
|
|
19
|
+
lhsStr = trimmed.slice(0, idx).trim();
|
|
20
|
+
rhsStr = trimmed.slice(idx + op.length).trim();
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (!operator || !lhsStr || !rhsStr)
|
|
25
|
+
return false;
|
|
26
|
+
const lhsValue = resolveLhs(lhsStr, context);
|
|
27
|
+
if (lhsValue === undefined)
|
|
28
|
+
return false;
|
|
29
|
+
const rhsValue = parseRhs(rhsStr);
|
|
30
|
+
return compare(lhsValue, operator, rhsValue);
|
|
31
|
+
}
|
|
32
|
+
function resolveLhs(lhs, context) {
|
|
33
|
+
if (lhs.startsWith('input.')) {
|
|
34
|
+
const fieldPath = lhs.slice('input.'.length);
|
|
35
|
+
if (typeof context.input !== 'object' || context.input === null)
|
|
36
|
+
return undefined;
|
|
37
|
+
return traversePath(context.input, fieldPath);
|
|
38
|
+
}
|
|
39
|
+
if (lhs.startsWith('stages.')) {
|
|
40
|
+
// Format: stages.<stage-name>.output.<field.path>
|
|
41
|
+
// Stage names can contain hyphens — split on first '.output.' occurrence
|
|
42
|
+
const rest = lhs.slice('stages.'.length);
|
|
43
|
+
const outputMarker = '.output.';
|
|
44
|
+
const markerIdx = rest.indexOf(outputMarker);
|
|
45
|
+
if (markerIdx === -1)
|
|
46
|
+
return undefined;
|
|
47
|
+
const stageName = rest.slice(0, markerIdx);
|
|
48
|
+
const fieldPath = rest.slice(markerIdx + outputMarker.length);
|
|
49
|
+
const stageOutput = context.stageOutputs.get(stageName);
|
|
50
|
+
if (stageOutput === undefined || stageOutput === null)
|
|
51
|
+
return undefined;
|
|
52
|
+
return traversePath(stageOutput, fieldPath);
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
function traversePath(obj, path) {
|
|
57
|
+
const parts = path.split('.');
|
|
58
|
+
let current = obj;
|
|
59
|
+
for (const part of parts) {
|
|
60
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
current = current[part];
|
|
64
|
+
}
|
|
65
|
+
return current;
|
|
66
|
+
}
|
|
67
|
+
function parseRhs(rhs) {
|
|
68
|
+
// Number (int or float, optional leading minus)
|
|
69
|
+
if (/^-?\d+(\.\d+)?$/.test(rhs))
|
|
70
|
+
return Number(rhs);
|
|
71
|
+
// Boolean
|
|
72
|
+
if (rhs === 'true')
|
|
73
|
+
return true;
|
|
74
|
+
if (rhs === 'false')
|
|
75
|
+
return false;
|
|
76
|
+
// Quoted string
|
|
77
|
+
if ((rhs.startsWith('"') && rhs.endsWith('"')) || (rhs.startsWith("'") && rhs.endsWith("'"))) {
|
|
78
|
+
return rhs.slice(1, -1);
|
|
79
|
+
}
|
|
80
|
+
// Plain string (e.g. input.mode == fast)
|
|
81
|
+
return rhs;
|
|
82
|
+
}
|
|
83
|
+
function compare(lhs, op, rhs) {
|
|
84
|
+
// Coerce lhs to number if rhs is a number and lhs is a string
|
|
85
|
+
let lhsCoerced = lhs;
|
|
86
|
+
if (typeof rhs === 'number' && typeof lhs === 'string') {
|
|
87
|
+
const n = Number(lhs);
|
|
88
|
+
if (!isNaN(n))
|
|
89
|
+
lhsCoerced = n;
|
|
90
|
+
}
|
|
91
|
+
switch (op) {
|
|
92
|
+
case '>': return typeof lhsCoerced === 'number' && typeof rhs === 'number' && lhsCoerced > rhs;
|
|
93
|
+
case '>=': return typeof lhsCoerced === 'number' && typeof rhs === 'number' && lhsCoerced >= rhs;
|
|
94
|
+
case '<': return typeof lhsCoerced === 'number' && typeof rhs === 'number' && lhsCoerced < rhs;
|
|
95
|
+
case '<=': return typeof lhsCoerced === 'number' && typeof rhs === 'number' && lhsCoerced <= rhs;
|
|
96
|
+
// eslint-disable-next-line eqeqeq
|
|
97
|
+
case '==': return lhsCoerced == rhs;
|
|
98
|
+
case '===': return lhsCoerced === rhs;
|
|
99
|
+
// eslint-disable-next-line eqeqeq
|
|
100
|
+
case '!=': return lhsCoerced != rhs;
|
|
101
|
+
case '!==': return lhsCoerced !== rhs;
|
|
102
|
+
default: return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=condition-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/condition-evaluator.test.ts"],"names":[],"mappings":""}
|