@jterrats/open-orchestra 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/autonomous-workflow.js +9 -0
  3. package/dist/autonomous-workflow.js.map +1 -1
  4. package/dist/benchmark.d.ts +2 -1
  5. package/dist/benchmark.js +70 -0
  6. package/dist/benchmark.js.map +1 -1
  7. package/dist/cli.js +19 -2
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands.d.ts +3 -0
  10. package/dist/commands.js +132 -21
  11. package/dist/commands.js.map +1 -1
  12. package/dist/constants.js +5 -0
  13. package/dist/constants.js.map +1 -1
  14. package/dist/defaults.d.ts +6 -0
  15. package/dist/defaults.js +6 -0
  16. package/dist/defaults.js.map +1 -1
  17. package/dist/model-providers.d.ts +26 -1
  18. package/dist/model-providers.js +257 -1
  19. package/dist/model-providers.js.map +1 -1
  20. package/dist/notifications.d.ts +31 -0
  21. package/dist/notifications.js +165 -0
  22. package/dist/notifications.js.map +1 -0
  23. package/dist/phase-executor.d.ts +18 -0
  24. package/dist/phase-executor.js +218 -0
  25. package/dist/phase-executor.js.map +1 -0
  26. package/dist/release-commands.d.ts +10 -0
  27. package/dist/release-commands.js +116 -0
  28. package/dist/release-commands.js.map +1 -1
  29. package/dist/sprint-metrics.d.ts +9 -0
  30. package/dist/sprint-metrics.js +203 -0
  31. package/dist/sprint-metrics.js.map +1 -0
  32. package/dist/types.d.ts +98 -0
  33. package/dist/types.js.map +1 -1
  34. package/dist/workflow-services.d.ts +3 -1
  35. package/dist/workflow-services.js +16 -6
  36. package/dist/workflow-services.js.map +1 -1
  37. package/docs/autonomous-workflow.md +28 -1
  38. package/docs/benchmark.md +18 -0
  39. package/docs/runtime-llm-flow.md +34 -9
  40. package/package.json +3 -4
@@ -25,6 +25,30 @@ export class InMemoryModelProviderRegistry {
25
25
  return [...this.providers.values()];
26
26
  }
27
27
  }
28
+ export function createModelProvider(providerId) {
29
+ if (providerId === "fake")
30
+ return new FakeModelProvider();
31
+ if (providerId === "openai")
32
+ return new OpenAIModelProvider();
33
+ if (providerId === "anthropic")
34
+ return new AnthropicModelProvider();
35
+ throw new Error(`unknown provider: ${providerId}`);
36
+ }
37
+ export function assertProviderAllowed(providerId, policy) {
38
+ if (policy?.blockedProviders?.includes(providerId)) {
39
+ throw new Error(`provider is blocked by policy: ${providerId}`);
40
+ }
41
+ if (policy?.allowedProviders &&
42
+ policy.allowedProviders.length > 0 &&
43
+ !policy.allowedProviders.includes(providerId)) {
44
+ throw new Error(`provider is not allowed by policy: ${providerId}`);
45
+ }
46
+ }
47
+ export function assertVendorFallbackAllowed(providerId, policy) {
48
+ if (!policy?.allowVendorFallbackWithoutApproval) {
49
+ throw new Error(`provider fallback approval required: ${providerId}`);
50
+ }
51
+ }
28
52
  export class FakeModelProvider {
29
53
  id;
30
54
  capabilities;
@@ -38,11 +62,14 @@ export class FakeModelProvider {
38
62
  if (this.shouldFail) {
39
63
  throw new Error(`fake provider failed: ${this.id}`);
40
64
  }
65
+ const content = request.jsonMode
66
+ ? fakeJsonResponse(request)
67
+ : request.messages.map((message) => message.content).join("\n");
41
68
  return {
42
69
  id: "fake-response",
43
70
  provider: this.id,
44
71
  model: request.model,
45
- content: request.messages.map((message) => message.content).join("\n"),
72
+ content,
46
73
  usage: {
47
74
  inputTokens: request.messages.length,
48
75
  outputTokens: 1,
@@ -51,6 +78,235 @@ export class FakeModelProvider {
51
78
  };
52
79
  }
53
80
  }
81
+ export class OpenAIModelProvider {
82
+ id = "openai";
83
+ capabilities = {
84
+ streaming: false,
85
+ tools: false,
86
+ vision: false,
87
+ jsonMode: true,
88
+ maxContextTokens: 0,
89
+ timeoutMs: 30000,
90
+ };
91
+ fetchFn;
92
+ env;
93
+ constructor({ fetchFn = fetch, env = process.env, } = {}) {
94
+ this.fetchFn = fetchFn;
95
+ this.env = env;
96
+ }
97
+ async complete(request) {
98
+ const apiKey = this.env.OPENAI_API_KEY;
99
+ if (!apiKey) {
100
+ throw new Error("OPENAI_API_KEY is required for provider openai");
101
+ }
102
+ const endpoint = openAIResponsesEndpoint(this.env.OPENAI_BASE_URL);
103
+ const response = await this.fetchFn(endpoint, {
104
+ method: "POST",
105
+ headers: {
106
+ authorization: `Bearer ${apiKey}`,
107
+ "content-type": "application/json",
108
+ },
109
+ body: JSON.stringify(openAIRequestBody(request)),
110
+ signal: AbortSignal.timeout(request.timeoutMs ?? this.capabilities.timeoutMs),
111
+ });
112
+ if (!response.ok) {
113
+ throw new Error(`OpenAI API returned HTTP ${response.status}`);
114
+ }
115
+ const payload = (await response.json());
116
+ return {
117
+ id: stringFrom(payload.id, "openai-response"),
118
+ provider: this.id,
119
+ model: stringFrom(payload.model, request.model),
120
+ content: openAIOutputText(payload),
121
+ usage: {
122
+ inputTokens: numberFrom(payload.usage?.input_tokens),
123
+ outputTokens: numberFrom(payload.usage?.output_tokens),
124
+ },
125
+ finishReason: openAIFinishReason(payload),
126
+ };
127
+ }
128
+ }
129
+ export class AnthropicModelProvider {
130
+ id = "anthropic";
131
+ capabilities = {
132
+ streaming: false,
133
+ tools: false,
134
+ vision: false,
135
+ jsonMode: true,
136
+ maxContextTokens: 0,
137
+ timeoutMs: 30000,
138
+ };
139
+ fetchFn;
140
+ env;
141
+ constructor({ fetchFn = fetch, env = process.env, } = {}) {
142
+ this.fetchFn = fetchFn;
143
+ this.env = env;
144
+ }
145
+ async complete(request) {
146
+ const apiKey = this.env.ANTHROPIC_API_KEY;
147
+ if (!apiKey) {
148
+ throw new Error("ANTHROPIC_API_KEY is required for provider anthropic");
149
+ }
150
+ const endpoint = anthropicMessagesEndpoint(this.env.ANTHROPIC_BASE_URL);
151
+ const response = await this.fetchFn(endpoint, {
152
+ method: "POST",
153
+ headers: {
154
+ "x-api-key": apiKey,
155
+ "anthropic-version": this.env.ANTHROPIC_VERSION?.trim() || "2023-06-01",
156
+ "content-type": "application/json",
157
+ },
158
+ body: JSON.stringify(anthropicRequestBody(request)),
159
+ signal: AbortSignal.timeout(request.timeoutMs ?? this.capabilities.timeoutMs),
160
+ });
161
+ if (!response.ok) {
162
+ throw new Error(`Anthropic API returned HTTP ${response.status}`);
163
+ }
164
+ const payload = (await response.json());
165
+ return {
166
+ id: stringFrom(payload.id, "anthropic-response"),
167
+ provider: this.id,
168
+ model: stringFrom(payload.model, request.model),
169
+ content: anthropicOutputText(payload),
170
+ usage: {
171
+ inputTokens: numberFrom(payload.usage?.input_tokens),
172
+ outputTokens: numberFrom(payload.usage?.output_tokens),
173
+ },
174
+ finishReason: anthropicFinishReason(payload),
175
+ };
176
+ }
177
+ }
178
+ function fakeJsonResponse(request) {
179
+ const marker = "FAKE_JSON_RESPONSE:";
180
+ const userMessage = [...request.messages]
181
+ .reverse()
182
+ .find((message) => message.role === "user");
183
+ const markerIndex = userMessage?.content.indexOf(marker) ?? -1;
184
+ if (userMessage && markerIndex >= 0) {
185
+ return userMessage.content.slice(markerIndex + marker.length).trim();
186
+ }
187
+ return JSON.stringify({
188
+ summary: "Fake provider structured response",
189
+ notes: "No fake response marker was provided.",
190
+ verdict: "pass",
191
+ });
192
+ }
193
+ function openAIResponsesEndpoint(baseUrl) {
194
+ const value = baseUrl?.trim() || "https://api.openai.com/v1";
195
+ const url = new URL(value);
196
+ if (url.protocol !== "https:") {
197
+ throw new Error("OPENAI_BASE_URL must use https");
198
+ }
199
+ return new URL(url.pathname.endsWith("/responses")
200
+ ? url.pathname
201
+ : joinUrlPath(url.pathname, "responses"), url.origin).toString();
202
+ }
203
+ function anthropicMessagesEndpoint(baseUrl) {
204
+ const value = baseUrl?.trim() || "https://api.anthropic.com";
205
+ const url = new URL(value);
206
+ if (url.protocol !== "https:") {
207
+ throw new Error("ANTHROPIC_BASE_URL must use https");
208
+ }
209
+ return new URL(url.pathname.endsWith("/v1/messages")
210
+ ? url.pathname
211
+ : joinUrlPath(url.pathname, "v1/messages"), url.origin).toString();
212
+ }
213
+ function openAIRequestBody(request) {
214
+ return {
215
+ model: request.model,
216
+ input: request.messages.map((message) => ({
217
+ role: message.role === "system" ? "developer" : message.role,
218
+ content: message.content,
219
+ })),
220
+ ...(request.maxTokens ? { max_output_tokens: request.maxTokens } : {}),
221
+ ...(request.temperature !== undefined
222
+ ? { temperature: request.temperature }
223
+ : {}),
224
+ ...(request.jsonMode
225
+ ? {
226
+ text: {
227
+ format: {
228
+ type: "json_schema",
229
+ name: "open_orchestra_response",
230
+ schema: { type: "object", additionalProperties: true },
231
+ strict: false,
232
+ },
233
+ },
234
+ }
235
+ : {}),
236
+ };
237
+ }
238
+ function anthropicRequestBody(request) {
239
+ const systemMessages = request.messages
240
+ .filter((message) => message.role === "system")
241
+ .map((message) => message.content);
242
+ const messages = request.messages
243
+ .filter((message) => message.role !== "system")
244
+ .map((message) => ({
245
+ role: message.role === "assistant" ? "assistant" : "user",
246
+ content: message.content,
247
+ }));
248
+ const jsonInstruction = "Return only valid JSON. Do not include markdown fences, prose, or commentary.";
249
+ return {
250
+ model: request.model,
251
+ max_tokens: request.maxTokens ?? 1024,
252
+ messages: request.jsonMode && messages.length > 0
253
+ ? [
254
+ ...messages.slice(0, -1),
255
+ {
256
+ role: messages[messages.length - 1]?.role ?? "user",
257
+ content: `${messages[messages.length - 1]?.content ?? ""}\n\n${jsonInstruction}`,
258
+ },
259
+ ]
260
+ : messages,
261
+ ...(systemMessages.length > 0
262
+ ? { system: systemMessages.join("\n\n") }
263
+ : {}),
264
+ ...(request.temperature !== undefined
265
+ ? { temperature: request.temperature }
266
+ : {}),
267
+ };
268
+ }
269
+ function openAIOutputText(payload) {
270
+ if (typeof payload.output_text === "string")
271
+ return payload.output_text;
272
+ for (const item of payload.output ?? []) {
273
+ for (const content of item.content ?? []) {
274
+ if (typeof content.text === "string")
275
+ return content.text;
276
+ }
277
+ }
278
+ return "";
279
+ }
280
+ function anthropicOutputText(payload) {
281
+ for (const content of payload.content ?? []) {
282
+ if (typeof content.text === "string")
283
+ return content.text;
284
+ }
285
+ return "";
286
+ }
287
+ function openAIFinishReason(payload) {
288
+ if (payload.status === "incomplete")
289
+ return "length";
290
+ if (payload.status === "failed")
291
+ return "error";
292
+ return "stop";
293
+ }
294
+ function anthropicFinishReason(payload) {
295
+ if (payload.stop_reason === "max_tokens")
296
+ return "length";
297
+ if (payload.stop_reason === "refusal")
298
+ return "error";
299
+ return "stop";
300
+ }
301
+ function joinUrlPath(basePath, segment) {
302
+ return `${basePath.replace(/\/+$/, "")}/${segment}`.replace(/^\/?/, "/");
303
+ }
304
+ function stringFrom(value, fallback) {
305
+ return typeof value === "string" && value ? value : fallback;
306
+ }
307
+ function numberFrom(value) {
308
+ return typeof value === "number" ? value : 0;
309
+ }
54
310
  export function summarizeConfiguredProviders(config) {
55
311
  const defaults = config.providers.defaults;
56
312
  const summaries = [];
@@ -1 +1 @@
1
- {"version":3,"file":"model-providers.js","sourceRoot":"","sources":["../src/model-providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-providers.js","sourceRoot":"","sources":["../src/model-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { AutonomousRun, NotificationChannelResult } from "./types.js";
2
+ export interface GatePauseNotificationInput {
3
+ root: string;
4
+ run: AutonomousRun;
5
+ transitionKey: string;
6
+ reviewArtifact: string;
7
+ }
8
+ export interface NotificationTransports {
9
+ postSlack?: (webhookUrl: string, body: SlackPayload) => Promise<void>;
10
+ commentOnIssue?: (issue: string, body: string) => Promise<void>;
11
+ }
12
+ interface GatePauseMessage {
13
+ taskId: string;
14
+ taskTitle: string;
15
+ transitionKey: string;
16
+ reviewArtifact: string;
17
+ resumeCommand: string;
18
+ }
19
+ interface SlackPayload {
20
+ text: string;
21
+ blocks: Array<{
22
+ type: "section";
23
+ text: {
24
+ type: "mrkdwn";
25
+ text: string;
26
+ };
27
+ }>;
28
+ }
29
+ export declare function notifyGatePaused(input: GatePauseNotificationInput, transports?: NotificationTransports): Promise<NotificationChannelResult[]>;
30
+ export declare function buildGatePauseMessage(input: GatePauseNotificationInput): Promise<GatePauseMessage>;
31
+ export {};
@@ -0,0 +1,165 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { appendEvent, loadWorkspace } from "./workspace.js";
4
+ import { getWorkflowConfig } from "./workflow-services.js";
5
+ const execFileAsync = promisify(execFile);
6
+ const DEFAULT_TRANSPORTS = {
7
+ postSlack: async (webhookUrl, body) => {
8
+ const response = await fetch(webhookUrl, {
9
+ method: "POST",
10
+ headers: { "content-type": "application/json" },
11
+ body: JSON.stringify(body),
12
+ });
13
+ if (!response.ok) {
14
+ throw new Error(`Slack webhook returned HTTP ${response.status}`);
15
+ }
16
+ },
17
+ commentOnIssue: async (issue, body) => {
18
+ await execFileAsync("gh", ["issue", "comment", issue, "--body", body]);
19
+ },
20
+ };
21
+ export async function notifyGatePaused(input, transports = {}) {
22
+ const config = await getWorkflowConfig(input.root);
23
+ const message = await buildGatePauseMessage(input);
24
+ const activeTransports = { ...DEFAULT_TRANSPORTS, ...transports };
25
+ const results = [];
26
+ if (config.notifications?.slack) {
27
+ results.push(await notifySlack(config, message, activeTransports.postSlack));
28
+ }
29
+ if (config.notifications?.github?.issueComment) {
30
+ results.push(await notifyGitHub(input.root, message, activeTransports.commentOnIssue));
31
+ }
32
+ for (const result of results) {
33
+ await appendEvent(input.root, {
34
+ type: result.status === "sent"
35
+ ? "AUTONOMOUS_GATE_NOTIFICATION_SENT"
36
+ : "AUTONOMOUS_GATE_NOTIFICATION_FAILED",
37
+ taskId: input.run.taskId,
38
+ actor: "parent",
39
+ summary: `Gate notification ${result.status}: ${result.channel}`,
40
+ metadata: {
41
+ runId: input.run.id,
42
+ channel: result.channel,
43
+ status: result.status,
44
+ detail: result.detail,
45
+ },
46
+ });
47
+ }
48
+ return results;
49
+ }
50
+ export async function buildGatePauseMessage(input) {
51
+ const workspace = await loadWorkspace(input.root);
52
+ const task = workspace.tasks.find((item) => item.id === input.run.taskId);
53
+ return {
54
+ taskId: input.run.taskId,
55
+ taskTitle: task?.title ?? input.run.taskId,
56
+ transitionKey: input.transitionKey,
57
+ reviewArtifact: input.reviewArtifact,
58
+ resumeCommand: `orchestra workflow run --task ${input.run.taskId} --resume ${input.run.id}`,
59
+ };
60
+ }
61
+ async function notifySlack(config, message, postSlack) {
62
+ try {
63
+ const webhook = resolveSlackWebhook(config);
64
+ if (!webhook) {
65
+ return {
66
+ channel: "slack",
67
+ status: "skipped",
68
+ detail: "Slack webhook env var is not configured",
69
+ };
70
+ }
71
+ await postSlack(webhook, renderSlackPayload(message));
72
+ return { channel: "slack", status: "sent", detail: "message posted" };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ channel: "slack",
77
+ status: "failed",
78
+ detail: error instanceof Error ? error.message : String(error),
79
+ };
80
+ }
81
+ }
82
+ async function notifyGitHub(root, message, commentOnIssue) {
83
+ const issue = await resolveGitHubIssue(root, message.taskId);
84
+ if (!issue) {
85
+ return {
86
+ channel: "github",
87
+ status: "skipped",
88
+ detail: "No GitHub issue reference found for task",
89
+ };
90
+ }
91
+ try {
92
+ await commentOnIssue(issue, renderGitHubComment(message));
93
+ return { channel: "github", status: "sent", detail: `commented ${issue}` };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ channel: "github",
98
+ status: "failed",
99
+ detail: error instanceof Error ? error.message : String(error),
100
+ };
101
+ }
102
+ }
103
+ function resolveSlackWebhook(config) {
104
+ const slack = config.notifications?.slack;
105
+ const envName = slack?.webhookUrlEnv ?? envNameFromReference(slack?.webhookUrl);
106
+ if (!envName) {
107
+ return null;
108
+ }
109
+ const value = process.env[envName];
110
+ if (!value) {
111
+ return null;
112
+ }
113
+ const url = new URL(value);
114
+ if (url.protocol !== "https:") {
115
+ throw new Error("Slack webhook must use https");
116
+ }
117
+ return value;
118
+ }
119
+ function envNameFromReference(reference) {
120
+ if (!reference?.startsWith("$")) {
121
+ return null;
122
+ }
123
+ const envName = reference.slice(1).trim();
124
+ return envName.length > 0 ? envName : null;
125
+ }
126
+ async function resolveGitHubIssue(root, taskId) {
127
+ const workspace = await loadWorkspace(root);
128
+ const task = workspace.tasks.find((item) => item.id === taskId);
129
+ if (task?.backlogItem?.startsWith("#")) {
130
+ return task.backlogItem;
131
+ }
132
+ const match = taskId.match(/(\d+)$/);
133
+ return match?.[1] ? `#${match[1]}` : null;
134
+ }
135
+ function renderSlackPayload(message) {
136
+ return {
137
+ text: `Open Orchestra gate paused: ${message.taskId}`,
138
+ blocks: [
139
+ {
140
+ type: "section",
141
+ text: {
142
+ type: "mrkdwn",
143
+ text: [
144
+ `*Open Orchestra gate paused*`,
145
+ `*Task:* ${message.taskId} - ${message.taskTitle}`,
146
+ `*Gate:* ${message.transitionKey}`,
147
+ `*Review:* ${message.reviewArtifact}`,
148
+ `*Resume:* \`${message.resumeCommand}\``,
149
+ ].join("\n"),
150
+ },
151
+ },
152
+ ],
153
+ };
154
+ }
155
+ function renderGitHubComment(message) {
156
+ return [
157
+ "Open Orchestra gate paused.",
158
+ "",
159
+ `- Task: ${message.taskId} - ${message.taskTitle}`,
160
+ `- Gate: ${message.transitionKey}`,
161
+ `- Review: ${message.reviewArtifact}`,
162
+ `- Resume: \`${message.resumeCommand}\``,
163
+ ].join("\n");
164
+ }
165
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AutonomousRun, PhaseExecutorPhase, PhaseLlmResult, PhaseStructuredOutput, PhaseExecutionMode } from "./types.js";
2
+ export declare function phaseExecutionMode(root: string, role: string): Promise<PhaseExecutionMode>;
3
+ export declare function executePhaseWithLlm({ root, run, phase, phaseIndex, }: {
4
+ root: string;
5
+ run: AutonomousRun;
6
+ phase: PhaseExecutorPhase;
7
+ phaseIndex: number;
8
+ }): Promise<PhaseLlmResult>;
9
+ export declare function buildPhasePrompt({ root, run, phase, phaseIndex, }: {
10
+ root: string;
11
+ run: AutonomousRun;
12
+ phase: PhaseExecutorPhase;
13
+ phaseIndex: number;
14
+ }): Promise<{
15
+ system: string;
16
+ user: string;
17
+ }>;
18
+ export declare function parsePhaseOutput(content: string): PhaseStructuredOutput;