@mknightzzz/stw 0.1.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/LICENSE +21 -0
- package/README.md +277 -0
- package/dist/agentic-fallback.d.ts +3 -0
- package/dist/agentic-fallback.js +32 -0
- package/dist/agentic-fallback.js.map +1 -0
- package/dist/agentic-prompt.d.ts +2 -0
- package/dist/agentic-prompt.js +68 -0
- package/dist/agentic-prompt.js.map +1 -0
- package/dist/agentic-runtime.d.ts +48 -0
- package/dist/agentic-runtime.js +149 -0
- package/dist/agentic-runtime.js.map +1 -0
- package/dist/agentic-types.d.ts +37 -0
- package/dist/agentic-types.js +2 -0
- package/dist/agentic-types.js.map +1 -0
- package/dist/agents.d.ts +7 -0
- package/dist/agents.js +2 -0
- package/dist/agents.js.map +1 -0
- package/dist/assignments.d.ts +7 -0
- package/dist/assignments.js +125 -0
- package/dist/assignments.js.map +1 -0
- package/dist/checkpoint.d.ts +35 -0
- package/dist/checkpoint.js +78 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/circuit-breaker.d.ts +17 -0
- package/dist/circuit-breaker.js +65 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/claim.d.ts +6 -0
- package/dist/claim.js +135 -0
- package/dist/claim.js.map +1 -0
- package/dist/clarity-gate.d.ts +12 -0
- package/dist/clarity-gate.js +83 -0
- package/dist/clarity-gate.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-dispatch.d.ts +45 -0
- package/dist/command-dispatch.js +206 -0
- package/dist/command-dispatch.js.map +1 -0
- package/dist/command-parser.d.ts +11 -0
- package/dist/command-parser.js +101 -0
- package/dist/command-parser.js.map +1 -0
- package/dist/commands/clean.d.ts +10 -0
- package/dist/commands/clean.js +133 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/execution.d.ts +2 -0
- package/dist/commands/execution.js +327 -0
- package/dist/commands/execution.js.map +1 -0
- package/dist/commands/go.d.ts +2 -0
- package/dist/commands/go.js +197 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/helpers.d.ts +44 -0
- package/dist/commands/helpers.js +231 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/idea.d.ts +2 -0
- package/dist/commands/idea.js +89 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integration.d.ts +7 -0
- package/dist/commands/integration.js +139 -0
- package/dist/commands/integration.js.map +1 -0
- package/dist/commands/maintenance.d.ts +2 -0
- package/dist/commands/maintenance.js +301 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +356 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +198 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spec.d.ts +2 -0
- package/dist/commands/spec.js +35 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/stats.d.ts +2 -0
- package/dist/commands/stats.js +80 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/task-ops.d.ts +2 -0
- package/dist/commands/task-ops.js +406 -0
- package/dist/commands/task-ops.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +338 -0
- package/dist/config.js.map +1 -0
- package/dist/cost.d.ts +30 -0
- package/dist/cost.js +167 -0
- package/dist/cost.js.map +1 -0
- package/dist/crash-recovery.d.ts +9 -0
- package/dist/crash-recovery.js +42 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/diagnostic.d.ts +48 -0
- package/dist/diagnostic.js +328 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/doctor.d.ts +31 -0
- package/dist/doctor.js +225 -0
- package/dist/doctor.js.map +1 -0
- package/dist/drift.d.ts +11 -0
- package/dist/drift.js +57 -0
- package/dist/drift.js.map +1 -0
- package/dist/git-utils.d.ts +20 -0
- package/dist/git-utils.js +206 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/gitlab.d.ts +54 -0
- package/dist/gitlab.js +101 -0
- package/dist/gitlab.js.map +1 -0
- package/dist/idea.d.ts +35 -0
- package/dist/idea.js +251 -0
- package/dist/idea.js.map +1 -0
- package/dist/import-resolution.d.ts +13 -0
- package/dist/import-resolution.js +111 -0
- package/dist/import-resolution.js.map +1 -0
- package/dist/inbox-renderer.d.ts +2 -0
- package/dist/inbox-renderer.js +67 -0
- package/dist/inbox-renderer.js.map +1 -0
- package/dist/init.d.ts +105 -0
- package/dist/init.js +235 -0
- package/dist/init.js.map +1 -0
- package/dist/llm-reviewer.d.ts +14 -0
- package/dist/llm-reviewer.js +109 -0
- package/dist/llm-reviewer.js.map +1 -0
- package/dist/lock.d.ts +26 -0
- package/dist/lock.js +76 -0
- package/dist/lock.js.map +1 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/math-utils.d.ts +2 -0
- package/dist/math-utils.js +7 -0
- package/dist/math-utils.js.map +1 -0
- package/dist/mechanical-review.d.ts +30 -0
- package/dist/mechanical-review.js +76 -0
- package/dist/mechanical-review.js.map +1 -0
- package/dist/merge.d.ts +83 -0
- package/dist/merge.js +363 -0
- package/dist/merge.js.map +1 -0
- package/dist/parallel.d.ts +35 -0
- package/dist/parallel.js +214 -0
- package/dist/parallel.js.map +1 -0
- package/dist/plan-validation.d.ts +19 -0
- package/dist/plan-validation.js +253 -0
- package/dist/plan-validation.js.map +1 -0
- package/dist/planner-prompt.d.ts +33 -0
- package/dist/planner-prompt.js +244 -0
- package/dist/planner-prompt.js.map +1 -0
- package/dist/planner.d.ts +29 -0
- package/dist/planner.js +511 -0
- package/dist/planner.js.map +1 -0
- package/dist/poller.d.ts +34 -0
- package/dist/poller.js +91 -0
- package/dist/poller.js.map +1 -0
- package/dist/progress.d.ts +34 -0
- package/dist/progress.js +122 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompt-builder.d.ts +51 -0
- package/dist/prompt-builder.js +481 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/provider.d.ts +14 -0
- package/dist/provider.js +278 -0
- package/dist/provider.js.map +1 -0
- package/dist/question-handler.d.ts +18 -0
- package/dist/question-handler.js +154 -0
- package/dist/question-handler.js.map +1 -0
- package/dist/question-triage.d.ts +31 -0
- package/dist/question-triage.js +175 -0
- package/dist/question-triage.js.map +1 -0
- package/dist/repo-detection.d.ts +8 -0
- package/dist/repo-detection.js +18 -0
- package/dist/repo-detection.js.map +1 -0
- package/dist/retry-context.d.ts +2 -0
- package/dist/retry-context.js +196 -0
- package/dist/retry-context.js.map +1 -0
- package/dist/router.d.ts +18 -0
- package/dist/router.js +137 -0
- package/dist/router.js.map +1 -0
- package/dist/run-artifact-types.d.ts +43 -0
- package/dist/run-artifact-types.js +2 -0
- package/dist/run-artifact-types.js.map +1 -0
- package/dist/run-summary.d.ts +14 -0
- package/dist/run-summary.js +347 -0
- package/dist/run-summary.js.map +1 -0
- package/dist/run-sync.d.ts +11 -0
- package/dist/run-sync.js +110 -0
- package/dist/run-sync.js.map +1 -0
- package/dist/run.d.ts +26 -0
- package/dist/run.js +150 -0
- package/dist/run.js.map +1 -0
- package/dist/scope-expansion.d.ts +10 -0
- package/dist/scope-expansion.js +117 -0
- package/dist/scope-expansion.js.map +1 -0
- package/dist/scope.d.ts +4 -0
- package/dist/scope.js +37 -0
- package/dist/scope.js.map +1 -0
- package/dist/scorecard.d.ts +18 -0
- package/dist/scorecard.js +128 -0
- package/dist/scorecard.js.map +1 -0
- package/dist/spec-templates.d.ts +2 -0
- package/dist/spec-templates.js +285 -0
- package/dist/spec-templates.js.map +1 -0
- package/dist/spec-validator.d.ts +8 -0
- package/dist/spec-validator.js +144 -0
- package/dist/spec-validator.js.map +1 -0
- package/dist/status.d.ts +68 -0
- package/dist/status.js +261 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +9 -0
- package/dist/storage.js +35 -0
- package/dist/storage.js.map +1 -0
- package/dist/task-executor-completion.d.ts +12 -0
- package/dist/task-executor-completion.js +67 -0
- package/dist/task-executor-completion.js.map +1 -0
- package/dist/task-executor-fallback.d.ts +20 -0
- package/dist/task-executor-fallback.js +12 -0
- package/dist/task-executor-fallback.js.map +1 -0
- package/dist/task-executor.d.ts +34 -0
- package/dist/task-executor.js +521 -0
- package/dist/task-executor.js.map +1 -0
- package/dist/task-graph.d.ts +11 -0
- package/dist/task-graph.js +226 -0
- package/dist/task-graph.js.map +1 -0
- package/dist/task-pipeline-helpers.d.ts +45 -0
- package/dist/task-pipeline-helpers.js +160 -0
- package/dist/task-pipeline-helpers.js.map +1 -0
- package/dist/task-review.d.ts +51 -0
- package/dist/task-review.js +410 -0
- package/dist/task-review.js.map +1 -0
- package/dist/transitions.d.ts +13 -0
- package/dist/transitions.js +104 -0
- package/dist/transitions.js.map +1 -0
- package/dist/types.d.ts +405 -0
- package/dist/types.js +101 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +19 -0
- package/dist/validation.js +73 -0
- package/dist/validation.js.map +1 -0
- package/dist/worker-response.d.ts +12 -0
- package/dist/worker-response.js +60 -0
- package/dist/worker-response.js.map +1 -0
- package/dist/worker-runner.d.ts +19 -0
- package/dist/worker-runner.js +347 -0
- package/dist/worker-runner.js.map +1 -0
- package/dist/worktree-cleanup.d.ts +44 -0
- package/dist/worktree-cleanup.js +325 -0
- package/dist/worktree-cleanup.js.map +1 -0
- package/dist/worktree.d.ts +22 -0
- package/dist/worktree.js +213 -0
- package/dist/worktree.js.map +1 -0
- package/examples/spec.md +58 -0
- package/package.json +66 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import type { AgenticBackend, AgenticConfig, AgenticFallbackConfig } from './agentic-types.js';
|
|
2
|
+
export declare const RUN_STATES: readonly ["pending", "planning", "plan_blocked", "plan_ready", "routing", "running", "paused", "human_review_required", "complete", "failed", "stopped"];
|
|
3
|
+
export type RunState = (typeof RUN_STATES)[number];
|
|
4
|
+
export declare const TERMINAL_RUN_STATES: readonly RunState[];
|
|
5
|
+
export declare const TASK_STATES: readonly ["pending", "queued", "working", "diagnosing", "validating", "reviewing", "revision_requested", "retrying", "escalated", "question_pending", "waiting_for_human", "rejected", "complete", "failed", "skipped"];
|
|
6
|
+
export type TaskState = (typeof TASK_STATES)[number];
|
|
7
|
+
export declare const TERMINAL_TASK_STATES: readonly TaskState[];
|
|
8
|
+
export type PhaseChangeState = 'pending' | 'running' | 'success' | 'failed';
|
|
9
|
+
export declare const MODEL_TIERS: readonly ["cheap", "medium", "strong", "reader"];
|
|
10
|
+
export type ModelTier = (typeof MODEL_TIERS)[number];
|
|
11
|
+
export interface ModelEntry {
|
|
12
|
+
id: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
model: string;
|
|
15
|
+
tier: ModelTier;
|
|
16
|
+
input_cost_per_mtok: number;
|
|
17
|
+
output_cost_per_mtok: number;
|
|
18
|
+
}
|
|
19
|
+
export type ModelsConfig = Record<string, Omit<ModelEntry, 'id'>>;
|
|
20
|
+
export declare const RISK_LEVELS: readonly ["low", "medium", "high"];
|
|
21
|
+
export type RiskLevel = (typeof RISK_LEVELS)[number];
|
|
22
|
+
export declare const STATUS_VALUES: readonly ["in_progress", "complete", "blocked", "failed", "escalated", "question", "skipped"];
|
|
23
|
+
export type StatusValue = (typeof STATUS_VALUES)[number];
|
|
24
|
+
export declare const RETRY_CONTEXT_LEVELS: readonly ["minimal", "basic", "full"];
|
|
25
|
+
export type RetryContextLevel = (typeof RETRY_CONTEXT_LEVELS)[number];
|
|
26
|
+
export declare const EXECUTION_MODES: readonly ["conservative", "agentic"];
|
|
27
|
+
export type ExecutionMode = (typeof EXECUTION_MODES)[number];
|
|
28
|
+
export declare const EXECUTION_OBSERVABILITY_MODES: readonly ["conservative_only", "fallback_to_agentic", "direct_agentic"];
|
|
29
|
+
export type ExecutionObservabilityMode = (typeof EXECUTION_OBSERVABILITY_MODES)[number];
|
|
30
|
+
export declare const FAILURE_CATEGORIES: readonly ["scope_violation", "validation_failed", "review_rejected", "provider_error", "content_null", "budget_exceeded", "worker_crash", "diff_empty", "parse_error"];
|
|
31
|
+
export type FailureCategory = (typeof FAILURE_CATEGORIES)[number];
|
|
32
|
+
export declare const ACTIONABLE_FAILURE_CLASSES: readonly ["backend_invocation_or_setup_failure", "backend_unavailable_during_fallback", "no_useful_in_scope_change", "out_of_scope_mutation", "post_mutation_validation_or_review_failure", "merge_conflict_needs_retry"];
|
|
33
|
+
export type ActionableFailureClass = (typeof ACTIONABLE_FAILURE_CLASSES)[number];
|
|
34
|
+
/** Failure classes where retrying at a higher tier won't help — the problem is structural, not stochastic. */
|
|
35
|
+
export declare const STRUCTURAL_FAILURE_CLASSES: ReadonlySet<ActionableFailureClass>;
|
|
36
|
+
export declare const ACTIONABLE_FAILURE_CLASS_TO_CATEGORY: Record<ActionableFailureClass, FailureCategory>;
|
|
37
|
+
export interface WorkerModeConfig {
|
|
38
|
+
enabled?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface WorkerModesConfig {
|
|
41
|
+
fresh_context?: WorkerModeConfig;
|
|
42
|
+
retry_with_context?: WorkerModeConfig;
|
|
43
|
+
}
|
|
44
|
+
export interface ParsedSpec {
|
|
45
|
+
title: string;
|
|
46
|
+
objective: string;
|
|
47
|
+
context: string;
|
|
48
|
+
requirements: string;
|
|
49
|
+
constraints: string;
|
|
50
|
+
acceptance_criteria: string;
|
|
51
|
+
risk_assessment: string;
|
|
52
|
+
target_files?: string;
|
|
53
|
+
non_goals?: string;
|
|
54
|
+
notes_for_reviewer?: string;
|
|
55
|
+
commands_to_validate?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare const REQUIRED_SPEC_SECTIONS: readonly ["Objective", "Context", "Requirements", "Constraints", "Acceptance Criteria", "Risk Assessment"];
|
|
58
|
+
export interface RunManifest {
|
|
59
|
+
schema_version: 1;
|
|
60
|
+
run_id: string;
|
|
61
|
+
spec_path: string;
|
|
62
|
+
repo_root: string;
|
|
63
|
+
base_branch: string;
|
|
64
|
+
branch: string;
|
|
65
|
+
status: RunState;
|
|
66
|
+
pr_number: number | null;
|
|
67
|
+
created_at: string;
|
|
68
|
+
pause_reason?: string;
|
|
69
|
+
drift_detected?: boolean;
|
|
70
|
+
last_polled_comment_id?: number;
|
|
71
|
+
spec_started_at?: string;
|
|
72
|
+
spec_completed_at?: string;
|
|
73
|
+
greenfield?: boolean;
|
|
74
|
+
seedDir?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface TaskScope {
|
|
77
|
+
files: string[];
|
|
78
|
+
new_files?: string[];
|
|
79
|
+
allow_shared_files: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface TaskPlannerMetadata {
|
|
82
|
+
planner_eligible?: boolean;
|
|
83
|
+
planner_reason?: string;
|
|
84
|
+
execution_mode?: ExecutionMode;
|
|
85
|
+
consolidation_signals?: string[];
|
|
86
|
+
agentic_backend?: AgenticBackend;
|
|
87
|
+
fallback_to_single_call?: boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface Task {
|
|
90
|
+
schema_version?: 1;
|
|
91
|
+
id: string;
|
|
92
|
+
description: string;
|
|
93
|
+
task_type: string;
|
|
94
|
+
risk: RiskLevel;
|
|
95
|
+
state: TaskState;
|
|
96
|
+
scope: TaskScope;
|
|
97
|
+
dependencies: string[];
|
|
98
|
+
acceptance_checks: string[];
|
|
99
|
+
model_tier: ModelTier;
|
|
100
|
+
provider_hint?: string;
|
|
101
|
+
max_retries: number;
|
|
102
|
+
timeout_minutes: number;
|
|
103
|
+
spec_path?: string;
|
|
104
|
+
planner_metadata?: TaskPlannerMetadata;
|
|
105
|
+
}
|
|
106
|
+
export interface TaskGraph {
|
|
107
|
+
schema_version: 1;
|
|
108
|
+
run_id: string;
|
|
109
|
+
tasks: Task[];
|
|
110
|
+
}
|
|
111
|
+
export interface CompletedTaskContext {
|
|
112
|
+
task_id: string;
|
|
113
|
+
description: string;
|
|
114
|
+
status: StatusValue;
|
|
115
|
+
notes: string;
|
|
116
|
+
}
|
|
117
|
+
export declare const DEFAULT_MAX_PROMPT_TOKENS = 32000;
|
|
118
|
+
export interface OversizedTask {
|
|
119
|
+
taskId: string;
|
|
120
|
+
estimatedTokens: number;
|
|
121
|
+
maxTokens: number;
|
|
122
|
+
}
|
|
123
|
+
export interface PromptSizeCheckResult {
|
|
124
|
+
oversizedTasks: OversizedTask[];
|
|
125
|
+
valid: boolean;
|
|
126
|
+
}
|
|
127
|
+
export interface Assignment {
|
|
128
|
+
task_id: string;
|
|
129
|
+
agent_id: string;
|
|
130
|
+
tool: string;
|
|
131
|
+
model: string;
|
|
132
|
+
tier: ModelTier;
|
|
133
|
+
reason: string;
|
|
134
|
+
}
|
|
135
|
+
export interface AssignmentsFile {
|
|
136
|
+
schema_version: 1;
|
|
137
|
+
run_id: string;
|
|
138
|
+
assignments: Assignment[];
|
|
139
|
+
}
|
|
140
|
+
export interface TaskStatus {
|
|
141
|
+
schema_version: 1;
|
|
142
|
+
task_id: string;
|
|
143
|
+
agent_id: string;
|
|
144
|
+
status: StatusValue;
|
|
145
|
+
completed_at: string;
|
|
146
|
+
notes: string;
|
|
147
|
+
question_number?: number;
|
|
148
|
+
preserved_worktree_path?: string;
|
|
149
|
+
preserved_worktree_paths?: string[];
|
|
150
|
+
stop_reason?: string;
|
|
151
|
+
stopped_at?: string;
|
|
152
|
+
stopped_by?: string;
|
|
153
|
+
execution_mode?: ExecutionObservabilityMode;
|
|
154
|
+
failure_class?: ActionableFailureClass;
|
|
155
|
+
}
|
|
156
|
+
export interface WorkerQuestionArtifact {
|
|
157
|
+
schema_version: 1;
|
|
158
|
+
task_id: string;
|
|
159
|
+
status: 'question';
|
|
160
|
+
question: string;
|
|
161
|
+
question_number: number;
|
|
162
|
+
created_at: string;
|
|
163
|
+
}
|
|
164
|
+
export interface WorkerQuestionAnswerArtifact {
|
|
165
|
+
schema_version: 1;
|
|
166
|
+
task_id: string;
|
|
167
|
+
question_number: number;
|
|
168
|
+
answer: string;
|
|
169
|
+
answered_at?: string;
|
|
170
|
+
answered_by?: string;
|
|
171
|
+
}
|
|
172
|
+
export interface QuestionTriageArtifact {
|
|
173
|
+
schema_version: 1;
|
|
174
|
+
task_id: string;
|
|
175
|
+
question: string;
|
|
176
|
+
question_number: number;
|
|
177
|
+
question_thread_id: string;
|
|
178
|
+
decision: 'auto_answer' | 'ask_human';
|
|
179
|
+
reason: string;
|
|
180
|
+
answer?: string;
|
|
181
|
+
confidence?: number;
|
|
182
|
+
created_at: string;
|
|
183
|
+
}
|
|
184
|
+
export interface ProcessedNotesCheckpointRecord {
|
|
185
|
+
schema_version: 1;
|
|
186
|
+
mr_iid: number;
|
|
187
|
+
last_seen_at: string;
|
|
188
|
+
last_processed_note_id: number | null;
|
|
189
|
+
processed_note_ids: number[];
|
|
190
|
+
updated_at: string;
|
|
191
|
+
}
|
|
192
|
+
export interface PricingEntry {
|
|
193
|
+
model: string;
|
|
194
|
+
input_cost_per_mtok: number;
|
|
195
|
+
output_cost_per_mtok: number;
|
|
196
|
+
}
|
|
197
|
+
export interface PricingConfig {
|
|
198
|
+
[model: string]: PricingEntry;
|
|
199
|
+
}
|
|
200
|
+
export interface CostEntry {
|
|
201
|
+
task_id: string;
|
|
202
|
+
model: string;
|
|
203
|
+
provider: string;
|
|
204
|
+
input_tokens: number;
|
|
205
|
+
output_tokens: number;
|
|
206
|
+
cost_usd: number;
|
|
207
|
+
timestamp: string;
|
|
208
|
+
tier: ModelTier;
|
|
209
|
+
latency_ms: number;
|
|
210
|
+
}
|
|
211
|
+
export interface CostsFile {
|
|
212
|
+
schema_version: 1;
|
|
213
|
+
run_id: string;
|
|
214
|
+
costs: CostEntry[];
|
|
215
|
+
total_cost_usd: number;
|
|
216
|
+
task_costs: Record<string, number>;
|
|
217
|
+
total_retries?: number;
|
|
218
|
+
task_retries?: Record<string, number>;
|
|
219
|
+
}
|
|
220
|
+
export interface TaskStateRecord {
|
|
221
|
+
schema_version: 1;
|
|
222
|
+
task_id: string;
|
|
223
|
+
state: TaskState;
|
|
224
|
+
updated_at: string;
|
|
225
|
+
updated_by: string;
|
|
226
|
+
previous_state: TaskState | null;
|
|
227
|
+
}
|
|
228
|
+
export interface ProviderConfig {
|
|
229
|
+
api_key_env: string;
|
|
230
|
+
base_url: string;
|
|
231
|
+
models: Partial<Record<ModelTier, string>>;
|
|
232
|
+
}
|
|
233
|
+
export interface RiskRuleEntry {
|
|
234
|
+
worker: ModelTier;
|
|
235
|
+
reviewer: ModelTier;
|
|
236
|
+
}
|
|
237
|
+
export interface RoutingPolicy {
|
|
238
|
+
require_plan_approval: boolean;
|
|
239
|
+
risk_rules?: Record<RiskLevel, RiskRuleEntry>;
|
|
240
|
+
task_type_rules?: Record<string, ModelTier>;
|
|
241
|
+
provider_preferences?: Partial<Record<ModelTier, string[]>>;
|
|
242
|
+
conservative_execution_task_types?: string[];
|
|
243
|
+
}
|
|
244
|
+
export interface BudgetConfig {
|
|
245
|
+
max_run_usd: number;
|
|
246
|
+
max_task_usd: number;
|
|
247
|
+
warn_threshold_pct: number;
|
|
248
|
+
on_exceed: 'warn' | 'pause';
|
|
249
|
+
max_run_retries?: number;
|
|
250
|
+
}
|
|
251
|
+
export interface CircuitBreakerConfig {
|
|
252
|
+
enabled?: boolean;
|
|
253
|
+
failure_threshold?: number;
|
|
254
|
+
success_threshold?: number;
|
|
255
|
+
timeout_seconds?: number;
|
|
256
|
+
half_open_max_requests?: number;
|
|
257
|
+
}
|
|
258
|
+
export interface TimeoutConfig {
|
|
259
|
+
task_timeout_minutes?: number;
|
|
260
|
+
api_timeout_seconds?: number;
|
|
261
|
+
poll_interval_seconds?: number;
|
|
262
|
+
overall_run_timeout_minutes?: number;
|
|
263
|
+
}
|
|
264
|
+
export interface CleanupConfig {
|
|
265
|
+
enabled?: boolean;
|
|
266
|
+
preserve_worktree_on_failure?: boolean;
|
|
267
|
+
cleanup_interval_minutes?: number;
|
|
268
|
+
max_worktrees_to_keep?: number;
|
|
269
|
+
}
|
|
270
|
+
export interface StwConfig {
|
|
271
|
+
providers: Record<string, ProviderConfig>;
|
|
272
|
+
routing_policy: RoutingPolicy;
|
|
273
|
+
defaults: {
|
|
274
|
+
poll_interval_seconds: number;
|
|
275
|
+
api_timeout_seconds: number;
|
|
276
|
+
task_timeout_minutes: number;
|
|
277
|
+
max_concurrent_workers: number;
|
|
278
|
+
max_retries: number;
|
|
279
|
+
max_questions_per_task: number;
|
|
280
|
+
max_auto_answers?: number;
|
|
281
|
+
max_prompt_tokens?: number;
|
|
282
|
+
max_scope_files_per_task?: number;
|
|
283
|
+
max_expansion_per_task?: number;
|
|
284
|
+
scope_trim_enabled?: boolean;
|
|
285
|
+
max_tasks_per_spec?: number;
|
|
286
|
+
authorized_commenters?: string[];
|
|
287
|
+
retry_context?: RetryContextLevel;
|
|
288
|
+
worker_modes?: WorkerModesConfig;
|
|
289
|
+
execution_mode?: ExecutionMode;
|
|
290
|
+
agentic_fallback?: AgenticFallbackConfig;
|
|
291
|
+
agentic?: AgenticConfig;
|
|
292
|
+
planner_max_retries?: number;
|
|
293
|
+
planner_fallback_models?: string[];
|
|
294
|
+
};
|
|
295
|
+
budget?: BudgetConfig;
|
|
296
|
+
pricing?: PricingConfig;
|
|
297
|
+
models?: ModelsConfig;
|
|
298
|
+
gitlab?: {
|
|
299
|
+
remote?: string;
|
|
300
|
+
base_branch?: string;
|
|
301
|
+
branch_prefix?: string;
|
|
302
|
+
allowed_command_users?: string[];
|
|
303
|
+
};
|
|
304
|
+
circuit_breaker?: CircuitBreakerConfig;
|
|
305
|
+
timeout?: TimeoutConfig;
|
|
306
|
+
cleanup?: CleanupConfig;
|
|
307
|
+
}
|
|
308
|
+
export interface ModelRequest {
|
|
309
|
+
model: string;
|
|
310
|
+
system_prompt?: string;
|
|
311
|
+
messages: Array<{
|
|
312
|
+
role: 'system' | 'user' | 'assistant';
|
|
313
|
+
content: string;
|
|
314
|
+
}>;
|
|
315
|
+
max_tokens?: number;
|
|
316
|
+
temperature?: number;
|
|
317
|
+
timeout_ms: number;
|
|
318
|
+
response_format?: 'text' | 'json';
|
|
319
|
+
}
|
|
320
|
+
export interface ModelResponse {
|
|
321
|
+
content: string;
|
|
322
|
+
model: string;
|
|
323
|
+
provider: string;
|
|
324
|
+
usage: {
|
|
325
|
+
input_tokens: number;
|
|
326
|
+
output_tokens: number;
|
|
327
|
+
};
|
|
328
|
+
latency_ms: number;
|
|
329
|
+
finish_reason: string;
|
|
330
|
+
raw_response_path?: string;
|
|
331
|
+
}
|
|
332
|
+
export type ProviderErrorCode = 'timeout';
|
|
333
|
+
export declare class ProviderError extends Error {
|
|
334
|
+
readonly retryable: boolean;
|
|
335
|
+
readonly statusCode?: number;
|
|
336
|
+
readonly code?: ProviderErrorCode;
|
|
337
|
+
constructor(message: string, retryable: boolean, statusCode?: number, code?: ProviderErrorCode);
|
|
338
|
+
}
|
|
339
|
+
export type WorkerOutputFailureClass = 'malformed_json' | 'truncated_json' | 'missing_schema_version' | 'invalid_payload_shape' | 'provider_transport_failure';
|
|
340
|
+
export interface WorkerOutputFailureEvent {
|
|
341
|
+
schema_version: 1;
|
|
342
|
+
task_id: string;
|
|
343
|
+
failure_class: WorkerOutputFailureClass;
|
|
344
|
+
message: string;
|
|
345
|
+
raw_content_length: number;
|
|
346
|
+
raw_content_preview: string;
|
|
347
|
+
timestamp: string;
|
|
348
|
+
}
|
|
349
|
+
export type RunEventType = 'manual_completion' | 'status_correction' | 'resume' | 'retry' | 'replan' | 'sync_repair' | 'stop' | 'answer' | 'escalation' | 'acceptance_gate_retry' | 'agentic_fallback' | 'manual_rescue';
|
|
350
|
+
export type EscalationCategory = 'human_review' | 'spec_gap' | 'validation_failure' | 'integration_issue' | 'sync_issue' | 'budget' | 'drift' | 'operator_override' | 'other';
|
|
351
|
+
export interface RunEvent {
|
|
352
|
+
schema_version: 1;
|
|
353
|
+
event_id: string;
|
|
354
|
+
run_id: string;
|
|
355
|
+
event_type: RunEventType;
|
|
356
|
+
created_at: string;
|
|
357
|
+
actor: string;
|
|
358
|
+
task_id?: string;
|
|
359
|
+
summary: string;
|
|
360
|
+
details?: string;
|
|
361
|
+
escalation_category?: EscalationCategory;
|
|
362
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
363
|
+
}
|
|
364
|
+
export interface RunEventsArtifact {
|
|
365
|
+
schema_version: 1;
|
|
366
|
+
run_id: string;
|
|
367
|
+
events: RunEvent[];
|
|
368
|
+
}
|
|
369
|
+
export interface RunMetricsMachine {
|
|
370
|
+
total_tasks?: number;
|
|
371
|
+
completed_tasks?: number;
|
|
372
|
+
failed_tasks?: number;
|
|
373
|
+
escalated_tasks?: number;
|
|
374
|
+
skipped_tasks?: number;
|
|
375
|
+
pending_tasks?: number;
|
|
376
|
+
total_cost_usd?: number;
|
|
377
|
+
total_input_tokens?: number;
|
|
378
|
+
total_output_tokens?: number;
|
|
379
|
+
avg_latency_ms?: number;
|
|
380
|
+
acceptance_gate_retries?: number;
|
|
381
|
+
agentic_fallback_triggers?: number;
|
|
382
|
+
manual_rescues?: number;
|
|
383
|
+
scope_trims?: number;
|
|
384
|
+
scope_trims_passed?: number;
|
|
385
|
+
}
|
|
386
|
+
export interface RunMetricsOperator {
|
|
387
|
+
objective_score?: number;
|
|
388
|
+
outcome_notes?: string;
|
|
389
|
+
true_cost_notes?: string;
|
|
390
|
+
intervention_notes?: string;
|
|
391
|
+
}
|
|
392
|
+
export interface RunMetricsArtifact {
|
|
393
|
+
schema_version: 1;
|
|
394
|
+
run_id: string;
|
|
395
|
+
machine: RunMetricsMachine;
|
|
396
|
+
operator?: RunMetricsOperator;
|
|
397
|
+
updated_at: string;
|
|
398
|
+
}
|
|
399
|
+
export interface SeedFileEntry {
|
|
400
|
+
relativePath: string;
|
|
401
|
+
absolutePath: string;
|
|
402
|
+
sizeBytes: number;
|
|
403
|
+
sizeHuman: string;
|
|
404
|
+
isBinary: boolean;
|
|
405
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// === State Enums ===
|
|
2
|
+
export const RUN_STATES = [
|
|
3
|
+
'pending',
|
|
4
|
+
'planning',
|
|
5
|
+
'plan_blocked',
|
|
6
|
+
'plan_ready',
|
|
7
|
+
'routing',
|
|
8
|
+
'running',
|
|
9
|
+
'paused',
|
|
10
|
+
'human_review_required',
|
|
11
|
+
'complete',
|
|
12
|
+
'failed',
|
|
13
|
+
'stopped',
|
|
14
|
+
];
|
|
15
|
+
export const TERMINAL_RUN_STATES = ['complete', 'failed', 'stopped'];
|
|
16
|
+
export const TASK_STATES = [
|
|
17
|
+
'pending',
|
|
18
|
+
'queued',
|
|
19
|
+
'working',
|
|
20
|
+
'diagnosing',
|
|
21
|
+
'validating',
|
|
22
|
+
'reviewing',
|
|
23
|
+
'revision_requested',
|
|
24
|
+
'retrying',
|
|
25
|
+
'escalated',
|
|
26
|
+
'question_pending',
|
|
27
|
+
'waiting_for_human',
|
|
28
|
+
'rejected',
|
|
29
|
+
'complete',
|
|
30
|
+
'failed',
|
|
31
|
+
'skipped',
|
|
32
|
+
];
|
|
33
|
+
export const TERMINAL_TASK_STATES = ['complete', 'rejected', 'failed'];
|
|
34
|
+
export const MODEL_TIERS = ['cheap', 'medium', 'strong', 'reader'];
|
|
35
|
+
export const RISK_LEVELS = ['low', 'medium', 'high'];
|
|
36
|
+
export const STATUS_VALUES = [
|
|
37
|
+
'in_progress',
|
|
38
|
+
'complete',
|
|
39
|
+
'blocked',
|
|
40
|
+
'failed',
|
|
41
|
+
'escalated',
|
|
42
|
+
'question',
|
|
43
|
+
'skipped',
|
|
44
|
+
];
|
|
45
|
+
export const RETRY_CONTEXT_LEVELS = ['minimal', 'basic', 'full'];
|
|
46
|
+
export const EXECUTION_MODES = ['conservative', 'agentic'];
|
|
47
|
+
export const EXECUTION_OBSERVABILITY_MODES = ['conservative_only', 'fallback_to_agentic', 'direct_agentic'];
|
|
48
|
+
export const FAILURE_CATEGORIES = [
|
|
49
|
+
'scope_violation',
|
|
50
|
+
'validation_failed',
|
|
51
|
+
'review_rejected',
|
|
52
|
+
'provider_error',
|
|
53
|
+
'content_null',
|
|
54
|
+
'budget_exceeded',
|
|
55
|
+
'worker_crash',
|
|
56
|
+
'diff_empty',
|
|
57
|
+
'parse_error',
|
|
58
|
+
];
|
|
59
|
+
export const ACTIONABLE_FAILURE_CLASSES = [
|
|
60
|
+
'backend_invocation_or_setup_failure',
|
|
61
|
+
'backend_unavailable_during_fallback',
|
|
62
|
+
'no_useful_in_scope_change',
|
|
63
|
+
'out_of_scope_mutation',
|
|
64
|
+
'post_mutation_validation_or_review_failure',
|
|
65
|
+
'merge_conflict_needs_retry',
|
|
66
|
+
];
|
|
67
|
+
/** Failure classes where retrying at a higher tier won't help — the problem is structural, not stochastic. */
|
|
68
|
+
export const STRUCTURAL_FAILURE_CLASSES = new Set([
|
|
69
|
+
'out_of_scope_mutation',
|
|
70
|
+
'backend_unavailable_during_fallback',
|
|
71
|
+
]);
|
|
72
|
+
export const ACTIONABLE_FAILURE_CLASS_TO_CATEGORY = {
|
|
73
|
+
backend_invocation_or_setup_failure: 'provider_error',
|
|
74
|
+
backend_unavailable_during_fallback: 'provider_error',
|
|
75
|
+
no_useful_in_scope_change: 'diff_empty',
|
|
76
|
+
out_of_scope_mutation: 'scope_violation',
|
|
77
|
+
post_mutation_validation_or_review_failure: 'validation_failed',
|
|
78
|
+
merge_conflict_needs_retry: 'validation_failed',
|
|
79
|
+
};
|
|
80
|
+
export const REQUIRED_SPEC_SECTIONS = [
|
|
81
|
+
'Objective',
|
|
82
|
+
'Context',
|
|
83
|
+
'Requirements',
|
|
84
|
+
'Constraints',
|
|
85
|
+
'Acceptance Criteria',
|
|
86
|
+
'Risk Assessment',
|
|
87
|
+
];
|
|
88
|
+
export const DEFAULT_MAX_PROMPT_TOKENS = 32000;
|
|
89
|
+
export class ProviderError extends Error {
|
|
90
|
+
retryable;
|
|
91
|
+
statusCode;
|
|
92
|
+
code;
|
|
93
|
+
constructor(message, retryable, statusCode, code) {
|
|
94
|
+
super(message);
|
|
95
|
+
this.name = 'ProviderError';
|
|
96
|
+
this.retryable = retryable;
|
|
97
|
+
this.statusCode = statusCode;
|
|
98
|
+
this.code = code;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function formatDuration(ms: number): string;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function formatDuration(ms) {
|
|
2
|
+
if (ms < 0) {
|
|
3
|
+
throw new Error('Duration cannot be negative');
|
|
4
|
+
}
|
|
5
|
+
if (ms < 1000) {
|
|
6
|
+
return `${ms}ms`;
|
|
7
|
+
}
|
|
8
|
+
const totalSeconds = ms / 1000;
|
|
9
|
+
const totalMinutes = totalSeconds / 60;
|
|
10
|
+
const totalHours = totalMinutes / 60;
|
|
11
|
+
if (totalSeconds < 60) {
|
|
12
|
+
return `${totalSeconds.toFixed(1)}s`;
|
|
13
|
+
}
|
|
14
|
+
if (totalMinutes < 60) {
|
|
15
|
+
const minutes = Math.floor(totalMinutes);
|
|
16
|
+
const seconds = Math.floor(totalSeconds % 60);
|
|
17
|
+
return `${minutes}m ${seconds}s`;
|
|
18
|
+
}
|
|
19
|
+
const hours = Math.floor(totalHours);
|
|
20
|
+
const minutes = Math.floor(totalMinutes % 60);
|
|
21
|
+
return `${hours}h ${minutes}m`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,EAAE,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/B,MAAM,YAAY,GAAG,YAAY,GAAG,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,YAAY,GAAG,EAAE,CAAC;IAErC,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ValidationCheck {
|
|
2
|
+
command: string;
|
|
3
|
+
passed: boolean;
|
|
4
|
+
exit_code: number;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
duration_ms: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ValidationResult {
|
|
10
|
+
passed: boolean;
|
|
11
|
+
checks: ValidationCheck[];
|
|
12
|
+
}
|
|
13
|
+
export interface ValidationOptions {
|
|
14
|
+
cwd: string;
|
|
15
|
+
commands: string[];
|
|
16
|
+
timeout_ms?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function needsShell(command: string): boolean;
|
|
19
|
+
export declare function runValidation(options: ValidationOptions): Promise<ValidationResult>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
2
|
+
function splitCommand(command) {
|
|
3
|
+
const parts = command.trim().split(/\s+/);
|
|
4
|
+
if (parts.length === 0 || parts[0] === '') {
|
|
5
|
+
throw new Error(`Invalid empty command: "${command}"`);
|
|
6
|
+
}
|
|
7
|
+
return { file: parts[0], args: parts.slice(1) };
|
|
8
|
+
}
|
|
9
|
+
export function needsShell(command) {
|
|
10
|
+
const shellPattern = /[|>]|\|\||&&|;|\$\(|`/;
|
|
11
|
+
return shellPattern.test(command);
|
|
12
|
+
}
|
|
13
|
+
// TODO(M3): Replace execFileSync with async execFile to avoid blocking the
|
|
14
|
+
// event loop. Currently safe because the task executor runs sequentially,
|
|
15
|
+
// but this will block concurrent task execution if we parallelize later.
|
|
16
|
+
export async function runValidation(options) {
|
|
17
|
+
const { cwd, commands, timeout_ms = 60000 } = options;
|
|
18
|
+
const checks = [];
|
|
19
|
+
for (const command of commands) {
|
|
20
|
+
const start = Date.now();
|
|
21
|
+
let passed = false;
|
|
22
|
+
let exit_code = -1;
|
|
23
|
+
let stdout = '';
|
|
24
|
+
let stderr = '';
|
|
25
|
+
const useShell = needsShell(command);
|
|
26
|
+
try {
|
|
27
|
+
if (useShell) {
|
|
28
|
+
const shellOpts = {
|
|
29
|
+
cwd,
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
timeout: timeout_ms,
|
|
32
|
+
shell: '/bin/sh',
|
|
33
|
+
};
|
|
34
|
+
stdout = execSync(command, shellOpts);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const { file, args } = splitCommand(command);
|
|
38
|
+
const opts = {
|
|
39
|
+
cwd,
|
|
40
|
+
encoding: 'utf-8',
|
|
41
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
42
|
+
timeout: timeout_ms,
|
|
43
|
+
};
|
|
44
|
+
stdout = execFileSync(file, args, opts);
|
|
45
|
+
}
|
|
46
|
+
exit_code = 0;
|
|
47
|
+
passed = true;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const error = err;
|
|
51
|
+
if (error.code === 'ENOENT') {
|
|
52
|
+
exit_code = 127;
|
|
53
|
+
stderr = `Command not found: ${command.split(/\s+/)[0]}`;
|
|
54
|
+
}
|
|
55
|
+
else if (error.killed || error.signal === 'SIGTERM') {
|
|
56
|
+
exit_code = error.status ?? -1;
|
|
57
|
+
stderr = `Command timed out after ${timeout_ms}ms`;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
exit_code = error.status ?? -1;
|
|
61
|
+
stdout = error.stdout ? String(error.stdout) : '';
|
|
62
|
+
stderr = error.stderr ? String(error.stderr) : '';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const duration_ms = Date.now() - start;
|
|
66
|
+
checks.push({ command, passed, exit_code, stdout: stdout.trim(), stderr: stderr.trim(), duration_ms });
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
passed: checks.every((c) => c.passed),
|
|
70
|
+
checks,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Task } from './types.js';
|
|
2
|
+
export interface WorkerFileWrite {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WorkerResponseArtifact {
|
|
7
|
+
schema_version: 1;
|
|
8
|
+
task_id: string;
|
|
9
|
+
files: WorkerFileWrite[];
|
|
10
|
+
}
|
|
11
|
+
export declare function stripCodeFences(content: string): string;
|
|
12
|
+
export declare function parseWorkerResponse(task: Task, rawContent: string): WorkerResponseArtifact;
|