@wundam/orchex 1.0.0-rc.28 → 1.0.0-rc.29

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/README.md CHANGED
@@ -13,7 +13,7 @@ Your AI assistant does tasks one at a time. Orchex makes it do 10 at once — sa
13
13
  - **`orchex run`** — Describe what you want, get parallel execution. Auto-generates plans, previews waves, executes with ownership enforcement.
14
14
  - **`orchex learn`** — The advanced path. Paste a markdown plan, get executable parallel streams with dependency inference and anti-pattern detection.
15
15
  - **Self-Healing** — Categorized error analysis with targeted fix streams. Not blind retry. Model validation before execution prevents wasted API calls.
16
- - **Multi-LLM** — OpenAI, Gemini, Claude, DeepSeek, Ollama, AWS Bedrock. Dynamic model registry auto-discovers available models. Key-aware routing prevents "model not found" errors.
16
+ - **Multi-LLM** — OpenAI, Gemini, Claude, DeepSeek, Kimi (Moonshot AI), Ollama, AWS Bedrock. Dynamic model registry auto-discovers available models. Key-aware routing prevents "model not found" errors.
17
17
  - **BYOK** — Bring your own API key from any supported provider. You control costs.
18
18
 
19
19
  ## Prerequisites
@@ -24,6 +24,7 @@ Your AI assistant does tasks one at a time. Orchex makes it do 10 at once — sa
24
24
  - `OPENAI_API_KEY` for OpenAI (GPT-4.1, o1, o3)
25
25
  - `GEMINI_API_KEY` for Google Gemini
26
26
  - `DEEPSEEK_API_KEY` for DeepSeek (V3, Coder, R1)
27
+ - `KIMI_API_KEY` for Kimi / Moonshot AI (K2, moonshot-v1; `MOONSHOT_API_KEY` alias accepted)
27
28
  - Configure Ollama for local models
28
29
  - `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` for AWS Bedrock
29
30
 
package/dist/config.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  export declare const PRODUCTION_URL = "https://orchex.dev";
3
- export declare const LLMProviderSchema: z.ZodEnum<["anthropic", "openai", "gemini", "ollama", "deepseek", "bedrock"]>;
3
+ export declare const LLMProviderSchema: z.ZodEnum<["anthropic", "openai", "gemini", "ollama", "deepseek", "bedrock", "kimi"]>;
4
4
  export type LLMProvider = z.infer<typeof LLMProviderSchema>;
5
5
  /**
6
6
  * Detect the LLM provider based on available environment variables.
@@ -51,7 +51,7 @@ export declare const ConfigSchema: z.ZodObject<{
51
51
  /** User's subscription tier (synced from cloud on login) */
52
52
  tier: z.ZodDefault<z.ZodEnum<["free", "pro", "team", "enterprise"]>>;
53
53
  /** LLM provider (auto-detected if not set) */
54
- provider: z.ZodOptional<z.ZodEnum<["anthropic", "openai", "gemini", "ollama", "deepseek", "bedrock"]>>;
54
+ provider: z.ZodOptional<z.ZodEnum<["anthropic", "openai", "gemini", "ollama", "deepseek", "bedrock", "kimi"]>>;
55
55
  /** LLM model (uses provider default if not set) */
56
56
  model: z.ZodOptional<z.ZodString>;
57
57
  /** Cached trial runs remaining (synced from cloud on login) */
@@ -77,13 +77,13 @@ export declare const ConfigSchema: z.ZodObject<{
77
77
  endpoint?: string | undefined;
78
78
  };
79
79
  apiKey?: string | undefined;
80
- provider?: "anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock" | undefined;
80
+ provider?: "anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock" | "kimi" | undefined;
81
81
  model?: string | undefined;
82
82
  trialRunsRemaining?: number | undefined;
83
83
  accountCreatedAt?: string | undefined;
84
84
  }, {
85
85
  apiKey?: string | undefined;
86
- provider?: "anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock" | undefined;
86
+ provider?: "anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock" | "kimi" | undefined;
87
87
  mode?: "local" | "cloud" | undefined;
88
88
  apiUrl?: string | undefined;
89
89
  tier?: "free" | "pro" | "team" | "enterprise" | undefined;
package/dist/config.js CHANGED
@@ -10,7 +10,7 @@ export const PRODUCTION_URL = 'https://orchex.dev';
10
10
  // ============================================================================
11
11
  // LLM Provider Configuration
12
12
  // ============================================================================
13
- export const LLMProviderSchema = z.enum(['anthropic', 'openai', 'gemini', 'ollama', 'deepseek', 'bedrock']);
13
+ export const LLMProviderSchema = z.enum(['anthropic', 'openai', 'gemini', 'ollama', 'deepseek', 'bedrock', 'kimi']);
14
14
  /**
15
15
  * Detect the LLM provider based on available environment variables.
16
16
  * Priority: ORCHEX_PROVIDER env var > first available API key
@@ -18,7 +18,7 @@ export const LLMProviderSchema = z.enum(['anthropic', 'openai', 'gemini', 'ollam
18
18
  export function detectProvider() {
19
19
  // Explicit provider override
20
20
  const explicit = process.env.ORCHEX_PROVIDER?.toLowerCase();
21
- if (explicit && ['anthropic', 'openai', 'gemini', 'ollama', 'deepseek', 'bedrock'].includes(explicit)) {
21
+ if (explicit && ['anthropic', 'openai', 'gemini', 'ollama', 'deepseek', 'bedrock', 'kimi'].includes(explicit)) {
22
22
  return explicit;
23
23
  }
24
24
  // Auto-detect from available API keys (priority order)
@@ -30,6 +30,8 @@ export function detectProvider() {
30
30
  return 'gemini';
31
31
  if (process.env.DEEPSEEK_API_KEY)
32
32
  return 'deepseek';
33
+ if (process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY)
34
+ return 'kimi';
33
35
  if (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY)
34
36
  return 'bedrock';
35
37
  if (process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST)
@@ -63,6 +65,8 @@ export function getProviderApiKey(provider) {
63
65
  return process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
64
66
  case 'deepseek':
65
67
  return process.env.DEEPSEEK_API_KEY;
68
+ case 'kimi':
69
+ return process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY;
66
70
  case 'bedrock':
67
71
  return undefined; // Bedrock uses AWS credentials, not API key
68
72
  case 'ollama':
@@ -76,6 +80,8 @@ export function getProviderBaseUrl(provider) {
76
80
  switch (provider) {
77
81
  case 'deepseek':
78
82
  return process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1';
83
+ case 'kimi':
84
+ return process.env.KIMI_BASE_URL || 'https://api.moonshot.ai/v1';
79
85
  case 'ollama':
80
86
  return process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST || 'http://localhost:11434';
81
87
  default:
@@ -93,6 +99,7 @@ export const DEFAULT_MODELS = {
93
99
  deepseek: 'deepseek-coder',
94
100
  bedrock: 'claude-3.5-sonnet',
95
101
  ollama: 'llama3.3:70b',
102
+ kimi: 'kimi-k2-0905-preview',
96
103
  };
97
104
  /**
98
105
  * Get the configured provider.
package/dist/cost.js CHANGED
@@ -10,6 +10,7 @@ export const PROVIDER_RATES = {
10
10
  openai: { input: 0.03, output: 0.06 }, // GPT-4 Turbo
11
11
  gemini: { input: 0.00075, output: 0.003 }, // Gemini 1.5 Pro, 2026 pricing
12
12
  deepseek: { input: 0.00014, output: 0.0006 }, // Deepseek-VL
13
+ kimi: { input: 0.0006, output: 0.0025 }, // Kimi K2 rate (Q1 2026 public)
13
14
  ollama: { input: 0, output: 0 }, // Local, free
14
15
  };
15
16
  import { getModelCosts } from './intelligence/index.js';
@@ -91,9 +91,9 @@ export { Semaphore };
91
91
  * Default models for each provider.
92
92
  * Re-exported from config.ts for backward compatibility.
93
93
  */
94
- export declare const DEFAULT_MODELS: Record<"anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock", string>;
94
+ export declare const DEFAULT_MODELS: Record<"anthropic" | "openai" | "gemini" | "ollama" | "deepseek" | "bedrock" | "kimi", string>;
95
95
  /**
96
96
  * Map a generic model name to provider-specific model.
97
97
  * Allows users to specify "claude-sonnet-4-5" and it gets translated appropriately.
98
98
  */
99
- export declare function mapModelToProvider(requestedModel: string, provider: 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'deepseek'): string;
99
+ export declare function mapModelToProvider(requestedModel: string, provider: 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'deepseek' | 'kimi'): string;
@@ -198,6 +198,9 @@ export function mapModelToProvider(requestedModel, provider) {
198
198
  if (requestedModel.startsWith('deepseek-')) {
199
199
  return requestedModel;
200
200
  }
201
+ if (requestedModel.startsWith('kimi-') || requestedModel.startsWith('moonshot-')) {
202
+ return requestedModel;
203
+ }
201
204
  if (requestedModel.includes(':') || requestedModel.startsWith('llama') || requestedModel.startsWith('mistral')) {
202
205
  return requestedModel;
203
206
  }
@@ -12,6 +12,7 @@ export { GeminiExecutor } from './gemini-executor.js';
12
12
  export { OllamaExecutor } from './ollama-executor.js';
13
13
  export { DeepseekExecutor } from './deepseek-executor.js';
14
14
  export { BedrockExecutor } from './bedrock-executor.js';
15
+ export { KimiExecutor } from './kimi-executor.js';
15
16
  export * from './base.js';
16
17
  /**
17
18
  * Options for creating an executor.
@@ -11,6 +11,7 @@ import { GeminiExecutor } from './gemini-executor.js';
11
11
  import { OllamaExecutor } from './ollama-executor.js';
12
12
  import { DeepseekExecutor } from './deepseek-executor.js';
13
13
  import { BedrockExecutor } from './bedrock-executor.js';
14
+ import { KimiExecutor } from './kimi-executor.js';
14
15
  // Re-export individual executors
15
16
  export { ClaudeExecutor } from '../claude-executor.js';
16
17
  export { OpenAIExecutor } from './openai-executor.js';
@@ -18,6 +19,7 @@ export { GeminiExecutor } from './gemini-executor.js';
18
19
  export { OllamaExecutor } from './ollama-executor.js';
19
20
  export { DeepseekExecutor } from './deepseek-executor.js';
20
21
  export { BedrockExecutor } from './bedrock-executor.js';
22
+ export { KimiExecutor } from './kimi-executor.js';
21
23
  // Re-export base utilities
22
24
  export * from './base.js';
23
25
  /**
@@ -90,6 +92,15 @@ export function createExecutor(options = {}) {
90
92
  timeoutMs: options.timeoutMs,
91
93
  maxConcurrency: options.maxConcurrency,
92
94
  }));
95
+ case 'kimi':
96
+ return new KimiExecutor(defined({
97
+ apiKey: options.apiKey ?? getProviderApiKey('kimi'),
98
+ baseUrl: options.baseUrl ?? getProviderBaseUrl('kimi'),
99
+ maxRetries: options.maxRetries,
100
+ retryDelayMs: options.retryDelayMs,
101
+ timeoutMs: options.timeoutMs,
102
+ maxConcurrency: options.maxConcurrency,
103
+ }));
93
104
  case 'bedrock':
94
105
  return new BedrockExecutor(defined({
95
106
  maxRetries: options.maxRetries,
@@ -98,7 +109,7 @@ export function createExecutor(options = {}) {
98
109
  maxConcurrency: options.maxConcurrency,
99
110
  }));
100
111
  default:
101
- throw new Error(`Unknown provider: ${provider}. Supported: anthropic, openai, gemini, ollama, deepseek, bedrock`);
112
+ throw new Error(`Unknown provider: ${provider}. Supported: anthropic, openai, gemini, ollama, deepseek, bedrock, kimi`);
102
113
  }
103
114
  }
104
115
  /**
@@ -116,6 +127,7 @@ export function getProviderStatus() {
116
127
  ollama: 'Ollama (local)',
117
128
  deepseek: 'DeepSeek',
118
129
  bedrock: 'AWS Bedrock',
130
+ kimi: 'Kimi (Moonshot AI)',
119
131
  };
120
132
  if (provider === 'ollama') {
121
133
  return {
@@ -162,6 +174,8 @@ export function listConfiguredProviders() {
162
174
  configured.push('gemini');
163
175
  if (process.env.DEEPSEEK_API_KEY)
164
176
  configured.push('deepseek');
177
+ if (process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY)
178
+ configured.push('kimi');
165
179
  if (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY)
166
180
  configured.push('bedrock');
167
181
  if (process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST)
@@ -189,6 +203,7 @@ export async function getFullStatus() {
189
203
  ollama: 'Ollama (local)',
190
204
  deepseek: 'DeepSeek',
191
205
  bedrock: 'AWS Bedrock',
206
+ kimi: 'Kimi (Moonshot AI)',
192
207
  };
193
208
  if (provider === 'ollama') {
194
209
  return {
@@ -0,0 +1,18 @@
1
+ import type { ExecutorStrategy, ExecutionRequest, ExecutionResult } from '../types.js';
2
+ import { ExecutorConfig } from './base.js';
3
+ export interface KimiExecutorConfig extends ExecutorConfig {
4
+ apiKey?: string;
5
+ baseUrl?: string;
6
+ }
7
+ export declare class KimiExecutor implements ExecutorStrategy {
8
+ readonly provider = "kimi";
9
+ private config;
10
+ private semaphore;
11
+ private apiKey;
12
+ private baseUrl;
13
+ constructor(config?: Partial<KimiExecutorConfig>);
14
+ execute(request: ExecutionRequest): Promise<ExecutionResult>;
15
+ private executeWithRetry;
16
+ private callApi;
17
+ private buildMessages;
18
+ }
@@ -0,0 +1,136 @@
1
+ import { DEFAULT_EXECUTOR_CONFIG, Semaphore, sleep, isRetryableError, calculateBackoff, extractArtifactDetailed, buildOpenAIMessages, DEFAULT_MODELS, withCircuitBreaker, classifyExecutionError, } from './base.js';
2
+ const KIMI_BASE_URL = 'https://api.moonshot.ai/v1';
3
+ const KIMI_MAX_OUTPUT_TOKENS = 8192;
4
+ export class KimiExecutor {
5
+ provider = 'kimi';
6
+ config;
7
+ semaphore;
8
+ apiKey;
9
+ baseUrl;
10
+ constructor(config = {}) {
11
+ this.config = { ...DEFAULT_EXECUTOR_CONFIG, ...config };
12
+ this.apiKey = config.apiKey ?? process.env.KIMI_API_KEY ?? process.env.MOONSHOT_API_KEY ?? '';
13
+ this.baseUrl = config.baseUrl ?? process.env.KIMI_BASE_URL ?? KIMI_BASE_URL;
14
+ this.semaphore = new Semaphore(this.config.maxConcurrency);
15
+ if (!this.apiKey) {
16
+ throw new Error('Kimi API key required. Set KIMI_API_KEY environment variable.');
17
+ }
18
+ }
19
+ async execute(request) {
20
+ const release = await this.semaphore.acquire();
21
+ try {
22
+ return await withCircuitBreaker(this.provider, request.model, () => this.executeWithRetry(request));
23
+ }
24
+ finally {
25
+ release();
26
+ }
27
+ }
28
+ async executeWithRetry(request) {
29
+ let lastError;
30
+ for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
31
+ if (attempt > 0 && lastError) {
32
+ const classified = classifyExecutionError(lastError);
33
+ const delay = classified.retryAfterMs ?? calculateBackoff(attempt, this.config.retryDelayMs);
34
+ await sleep(delay);
35
+ }
36
+ try {
37
+ return await this.callApi(request);
38
+ }
39
+ catch (error) {
40
+ lastError = error;
41
+ if (!isRetryableError(error)) {
42
+ return {
43
+ success: false,
44
+ rawResponse: '',
45
+ tokensUsed: { input: 0, output: 0 },
46
+ error: lastError.message,
47
+ };
48
+ }
49
+ if (attempt === this.config.maxRetries) {
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ return {
55
+ success: false,
56
+ rawResponse: '',
57
+ tokensUsed: { input: 0, output: 0 },
58
+ error: `Failed after ${this.config.maxRetries + 1} attempts: ${lastError?.message}`,
59
+ };
60
+ }
61
+ async callApi(request) {
62
+ // Kimi models: kimi-k2-*, kimi-latest, moonshot-v1-*
63
+ const model = (request.model.startsWith('kimi-') || request.model.startsWith('moonshot-'))
64
+ ? request.model
65
+ : DEFAULT_MODELS.kimi;
66
+ const effectiveTimeout = request.timeoutMs ?? this.config.timeoutMs;
67
+ const messages = this.buildMessages(request);
68
+ const controller = new AbortController();
69
+ const timeoutId = setTimeout(() => controller.abort(), effectiveTimeout);
70
+ try {
71
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'Authorization': `Bearer ${this.apiKey}`,
76
+ },
77
+ body: JSON.stringify({
78
+ model,
79
+ messages,
80
+ max_tokens: Math.min(request.maxTokens, KIMI_MAX_OUTPUT_TOKENS),
81
+ stream: false,
82
+ }),
83
+ signal: controller.signal,
84
+ });
85
+ if (!response.ok) {
86
+ const errorBody = await response.text().catch(() => 'Unknown error');
87
+ const error = new Error(`Kimi API error: ${response.status} ${errorBody}`);
88
+ error.status = response.status;
89
+ throw error;
90
+ }
91
+ const data = await response.json();
92
+ const rawResponse = data.choices?.[0]?.message?.content ?? '';
93
+ const { artifact, diagnostic } = extractArtifactDetailed(rawResponse);
94
+ if (!artifact) {
95
+ const errorDetail = diagnostic.jsonRepaired
96
+ ? `Artifact JSON was repaired but still invalid (strategy: ${diagnostic.strategy})`
97
+ : diagnostic.error ?? 'No valid orchex-artifact block found in response';
98
+ return {
99
+ success: false,
100
+ rawResponse,
101
+ tokensUsed: {
102
+ input: data.usage?.prompt_tokens ?? 0,
103
+ output: data.usage?.completion_tokens ?? 0,
104
+ },
105
+ error: errorDetail,
106
+ };
107
+ }
108
+ return {
109
+ success: true,
110
+ rawResponse,
111
+ artifact,
112
+ tokensUsed: {
113
+ input: data.usage?.prompt_tokens ?? 0,
114
+ output: data.usage?.completion_tokens ?? 0,
115
+ },
116
+ };
117
+ }
118
+ catch (error) {
119
+ if (error.name === 'AbortError') {
120
+ return {
121
+ success: false,
122
+ rawResponse: '',
123
+ tokensUsed: { input: 0, output: 0 },
124
+ error: `API call timed out after ${effectiveTimeout}ms`,
125
+ };
126
+ }
127
+ throw error;
128
+ }
129
+ finally {
130
+ clearTimeout(timeoutId);
131
+ }
132
+ }
133
+ buildMessages(request) {
134
+ return buildOpenAIMessages(request);
135
+ }
136
+ }
package/dist/index.js CHANGED
@@ -336,11 +336,11 @@ async function handleConfigCommand(args) {
336
336
  updates.mode = 'local';
337
337
  break;
338
338
  case '--provider':
339
+ const validProviders = LLMProviderSchema.options;
339
340
  if (!value) {
340
- console.error('Error: --provider requires a value (anthropic, openai, gemini, deepseek, ollama)');
341
+ console.error(`Error: --provider requires a value (${validProviders.join(', ')})`);
341
342
  process.exit(1);
342
343
  }
343
- const validProviders = LLMProviderSchema.options;
344
344
  if (!validProviders.includes(value)) {
345
345
  console.error(`Error: Invalid provider "${value}". Valid: ${validProviders.join(', ')}`);
346
346
  process.exit(1);
@@ -1,6 +1,6 @@
1
- var Js=Object.defineProperty;var y=(e,n)=>()=>(e&&(n=e(e=0)),n);var ie=(e,n)=>{for(var t in n)Js(e,t,{get:n[t],enumerable:!0})};import{existsSync as M,readFileSync as ae,readdirSync as Xs}from"node:fs";import*as C from"node:path";function X(e){if(M(C.join(e,"pnpm-lock.yaml"))||M(C.join(e,"pnpm-workspace.yaml")))return"pnpm";if(M(C.join(e,"yarn.lock")))return"yarn";if(M(C.join(e,"bun.lockb"))||M(C.join(e,"bun.lock")))return"bun";if(M(C.join(e,"package-lock.json")))return"npm";try{let n=C.join(e,"package.json");if(M(n)){let s=JSON.parse(ae(n,"utf-8")).packageManager;if(typeof s=="string"){if(s.startsWith("pnpm"))return"pnpm";if(s.startsWith("yarn"))return"yarn";if(s.startsWith("bun"))return"bun"}}}catch{}return"npm"}function H(e,n){switch(e){case"pnpm":return`pnpm run ${n}`;case"yarn":return`yarn run ${n}`;case"bun":return`bun run ${n}`;default:return`npm run ${n}`}}function Oe(e,n){if(n)switch(e){case"pnpm":return`pnpm test -- ${n}`;case"yarn":return`yarn test -- ${n}`;case"bun":return`bun test -- ${n}`;default:return`npm test -- ${n}`}return H(e,"test")}function ct(e,n){let t=n.join(" ");switch(e){case"pnpm":return`pnpm add ${t}`;case"yarn":return`yarn add ${t}`;case"bun":return`bun add ${t}`;default:return`npm install ${t}`}}function lt(e){let t={isMonorepo:!1,tool:X(e),packages:[]},s=C.join(e,"pnpm-workspace.yaml");if(M(s))return t.isMonorepo=!0,t.packages=at(e,Qs(s)),t;try{let o=C.join(e,"package.json");if(M(o)){let r=JSON.parse(ae(o,"utf-8")),i=Array.isArray(r.workspaces)?r.workspaces:Array.isArray(r.workspaces?.packages)?r.workspaces.packages:null;if(i&&i.length>0)return t.isMonorepo=!0,t.packages=at(e,i),t}}catch{}return t}function Qs(e){try{let n=ae(e,"utf-8"),t=[],s=!1;for(let o of n.split(`
2
- `)){let r=o.trim();if(r==="packages:"){s=!0;continue}if(s){if(r.startsWith("- ")){let i=r.slice(2).replace(/^['"]|['"]$/g,"");t.push(i)}else if(r&&!r.startsWith("#"))break}}return t}catch{return[]}}function at(e,n){let t=[];for(let s of n){let o=s.replace(/\/?\*$/,""),r=C.join(e,o);try{let i=Xs(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory())continue;let c=C.join(r,a.name,"package.json");try{if(M(c)){let l=JSON.parse(ae(c,"utf-8"));typeof l.name=="string"&&t.push(l.name)}}catch{}}}catch{}}return t}var Te=y(()=>{"use strict"});import*as B from"fs/promises";import{existsSync as Zs}from"fs";import*as L from"path";import{DEFAULT_MODELS as eo}from"../config.js";async function dt(e,n,t){if(t.length>=ut)return;let s;try{s=await B.readdir(e,{withFileTypes:!0})}catch{return}for(let o of s){if(t.length>=ut)break;if(to.has(o.name)||o.name.startsWith(".")&&o.name!==".env.example")continue;let r=L.join(e,o.name);o.isDirectory()?await dt(r,n,t):t.push(L.relative(n,r))}}async function _e(e){let n=[];await dt(e,e,n);let t=n.sort().join(`
3
- `),s={};try{let r=await B.readFile(L.join(e,"package.json"),"utf-8");s=JSON.parse(r)}catch{}let o;try{let r=await B.readFile(L.join(e,"tsconfig.json"),"utf-8");o=JSON.parse(r)}catch{}return{fileTree:t,packageJson:s,tsconfig:o,existingFiles:n}}function Me(e,n){let t=[],s=/(?:spec|plan|design|doc):\s*(\S+\.(?:md|txt|yaml|yml))/gi,o;for(;(o=s.exec(e))!==null;)t.push(o[1]);if(n&&t.length===0){let r=/(\S+\.(?:md|txt|yaml|yml))/gi;for(;(o=r.exec(e))!==null;){let i=o[1],a=L.join(n,i);Zs(a)&&t.push(i)}}return t}function no(e,n,t){let s=t?.packageManager??"npm",o=s==="npm"?"npm run":`${s} run`,r=[];if(r.push(`You are an expert software architect using orchex, a parallel AI orchestration tool.
1
+ var Js=Object.defineProperty;var y=(e,n)=>()=>(e&&(n=e(e=0)),n);var ie=(e,n)=>{for(var t in n)Js(e,t,{get:n[t],enumerable:!0})};import{existsSync as I,readFileSync as ae,readdirSync as Xs}from"node:fs";import*as C from"node:path";function X(e){if(I(C.join(e,"pnpm-lock.yaml"))||I(C.join(e,"pnpm-workspace.yaml")))return"pnpm";if(I(C.join(e,"yarn.lock")))return"yarn";if(I(C.join(e,"bun.lockb"))||I(C.join(e,"bun.lock")))return"bun";if(I(C.join(e,"package-lock.json")))return"npm";try{let n=C.join(e,"package.json");if(I(n)){let s=JSON.parse(ae(n,"utf-8")).packageManager;if(typeof s=="string"){if(s.startsWith("pnpm"))return"pnpm";if(s.startsWith("yarn"))return"yarn";if(s.startsWith("bun"))return"bun"}}}catch{}return"npm"}function H(e,n){switch(e){case"pnpm":return`pnpm run ${n}`;case"yarn":return`yarn run ${n}`;case"bun":return`bun run ${n}`;default:return`npm run ${n}`}}function Oe(e,n){if(n)switch(e){case"pnpm":return`pnpm test -- ${n}`;case"yarn":return`yarn test -- ${n}`;case"bun":return`bun test -- ${n}`;default:return`npm test -- ${n}`}return H(e,"test")}function ct(e,n){let t=n.join(" ");switch(e){case"pnpm":return`pnpm add ${t}`;case"yarn":return`yarn add ${t}`;case"bun":return`bun add ${t}`;default:return`npm install ${t}`}}function lt(e){let t={isMonorepo:!1,tool:X(e),packages:[]},s=C.join(e,"pnpm-workspace.yaml");if(I(s))return t.isMonorepo=!0,t.packages=at(e,Qs(s)),t;try{let o=C.join(e,"package.json");if(I(o)){let r=JSON.parse(ae(o,"utf-8")),i=Array.isArray(r.workspaces)?r.workspaces:Array.isArray(r.workspaces?.packages)?r.workspaces.packages:null;if(i&&i.length>0)return t.isMonorepo=!0,t.packages=at(e,i),t}}catch{}return t}function Qs(e){try{let n=ae(e,"utf-8"),t=[],s=!1;for(let o of n.split(`
2
+ `)){let r=o.trim();if(r==="packages:"){s=!0;continue}if(s){if(r.startsWith("- ")){let i=r.slice(2).replace(/^['"]|['"]$/g,"");t.push(i)}else if(r&&!r.startsWith("#"))break}}return t}catch{return[]}}function at(e,n){let t=[];for(let s of n){let o=s.replace(/\/?\*$/,""),r=C.join(e,o);try{let i=Xs(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory())continue;let c=C.join(r,a.name,"package.json");try{if(I(c)){let l=JSON.parse(ae(c,"utf-8"));typeof l.name=="string"&&t.push(l.name)}}catch{}}}catch{}}return t}var Te=y(()=>{"use strict"});import*as B from"fs/promises";import{existsSync as Zs}from"fs";import*as L from"path";import{DEFAULT_MODELS as eo}from"../config.js";async function dt(e,n,t){if(t.length>=ut)return;let s;try{s=await B.readdir(e,{withFileTypes:!0})}catch{return}for(let o of s){if(t.length>=ut)break;if(to.has(o.name)||o.name.startsWith(".")&&o.name!==".env.example")continue;let r=L.join(e,o.name);o.isDirectory()?await dt(r,n,t):t.push(L.relative(n,r))}}async function _e(e){let n=[];await dt(e,e,n);let t=n.sort().join(`
3
+ `),s={};try{let r=await B.readFile(L.join(e,"package.json"),"utf-8");s=JSON.parse(r)}catch{}let o;try{let r=await B.readFile(L.join(e,"tsconfig.json"),"utf-8");o=JSON.parse(r)}catch{}return{fileTree:t,packageJson:s,tsconfig:o,existingFiles:n}}function Ie(e,n){let t=[],s=/(?:spec|plan|design|doc):\s*(\S+\.(?:md|txt|yaml|yml))/gi,o;for(;(o=s.exec(e))!==null;)t.push(o[1]);if(n&&t.length===0){let r=/(\S+\.(?:md|txt|yaml|yml))/gi;for(;(o=r.exec(e))!==null;){let i=o[1],a=L.join(n,i);Zs(a)&&t.push(i)}}return t}function no(e,n,t){let s=t?.packageManager??"npm",o=s==="npm"?"npm run":`${s} run`,r=[];if(r.push(`You are an expert software architect using orchex, a parallel AI orchestration tool.
4
4
  Your task: generate a plan document in orchex format from the user's intent.
5
5
 
6
6
  ## Output Format Rules
@@ -88,7 +88,7 @@ NEVER exceed ${t.maxStreams} streams \u2014 the plan will be rejected if you do.
88
88
 
89
89
  Generate the plan document now. Output ONLY the markdown plan document \u2014 no preamble, no explanation.
90
90
  Start with \`# <Feature Title>\` and include all H2 stream sections with YAML blocks.`),t?.specContents&&Object.keys(t.specContents).length>0&&r.push('\n## CRITICAL: Referenced Document Fidelity\n\nWhen a Referenced Document above contains exact code, you MUST copy it verbatim into stream plans. Specific rules:\n\n1. **Type definitions** \u2014 copy field names, values, and types exactly. If the document says `const ROLES = [\'admin\', \'creative\'] as const`, do NOT change to `[\'owner\', \'member\', \'guest\']`.\n2. **Dependency versions** \u2014 copy exact versions. If the document says `"better-auth": "^1.2.0"`, use `"^1.2.0"`, NOT `"^2.6.0"` or `"latest"`.\n3. **package.json fields** \u2014 copy scripts, dependencies, and devDependencies exactly as specified. Do NOT reclassify deps vs devDeps. Do NOT add dependencies not in the document (e.g., do NOT add ioredis if the document does not list it).\n4. **File paths** \u2014 use exact paths from the document in `owns:` and `reads:`.\n5. **Function signatures and imports** \u2014 use the exact names, parameters, and return types from the document.\n6. **Build scripts** \u2014 if the document specifies `"build": "tsc"`, do NOT change to `"build": "tsc --build"`. Copy exactly.\n7. **Workspace protocol** \u2014 in pnpm monorepos, internal deps MUST use `"workspace:*"`, not `"*"`. Check the project\'s lockfile.\n\nThe user has already designed the implementation. Your job is ONLY to decompose it into parallel streams \u2014 do NOT redesign, improve, modernize, or update any code from the document.\n\nCommon mistakes to AVOID (from real failures):\n- Changing `better-auth: "^1.2.0"` to `"^2.6.0"` \u2014 WRONG, use the document\'s version\n- Moving `drizzle-orm` from devDependencies to dependencies \u2014 WRONG, keep classification as-is\n- Adding `@single/config` or `ioredis` when not in the document \u2014 WRONG, only include listed deps\n- Generating different role names than specified in the document \u2014 WRONG, copy the exact values'),r.join(`
91
- `)}async function ft(e,n,t,s){let o=await _e(n),r=Me(e,n),i={};for(let f of r)try{let p=L.join(n,f),m=await B.readFile(p,"utf-8");i[f]=m}catch{}let a=X(n),c=lt(n),l=no(e,o,{specContents:Object.keys(i).length>0?i:void 0,maxStreams:s?.maxStreams,packageManager:a,monorepo:c});s?.extraContext&&(l+=`
91
+ `)}async function ft(e,n,t,s){let o=await _e(n),r=Ie(e,n),i={};for(let f of r)try{let p=L.join(n,f),m=await B.readFile(p,"utf-8");i[f]=m}catch{}let a=X(n),c=lt(n),l=no(e,o,{specContents:Object.keys(i).length>0?i:void 0,maxStreams:s?.maxStreams,packageManager:a,monorepo:c});s?.extraContext&&(l+=`
92
92
 
93
93
  `+s.extraContext);let u=await t.execute({prompt:l,model:s?.model??eo[s?.provider??t.provider??"anthropic"]??"claude-sonnet-4-5-20250929",maxTokens:s?.maxTokens??16384,streamId:"_auto-plan"});if(!u.rawResponse?.trim())throw new Error(`Auto-plan generation failed: ${u.error??"Empty response from LLM"}`);let d=u.rawResponse.trim();return d.startsWith("```markdown")?(d=d.slice(11),d.endsWith("```")&&(d=d.slice(0,-3)),d=d.trim()):d.startsWith("```")&&(d=d.slice(3),d.endsWith("```")&&(d=d.slice(0,-3)),d=d.trim()),{planMarkdown:d,tokensUsed:u.tokensUsed}}var to,ut,pt=y(()=>{"use strict";Te();to=new Set(["node_modules",".git","dist","build",".next",".orchex","coverage",".turbo",".cache","__pycache__",".venv","venv"]),ut=500});import{createLogger as so}from"../logging.js";function ro(e){return e.replace(/^```[\s\S]*?^```/gm,"")}function io(e){let n=ro(e),t=[/`([^`]+\.(ts|js|tsx|jsx|md|sql|json|yaml|yml))`/g,/"([^"]+\.(ts|js|tsx|jsx|md|sql|json|yaml|yml))"/g,/\[([^\]]+\.(ts|js|tsx|jsx|md|sql|json|yaml|yml))\]/g,/\b(src\/[^\s,)]+\.(ts|js|tsx|jsx))/g,/\b(tests?\/[^\s,)]+\.(ts|js|tsx|jsx))/g,/\b(docs\/[^\s,)]+\.md)/g],s=new Set;for(let r of t){r.lastIndex=0;let i;for(;(i=r.exec(n))!==null;){let a=i[1].trim();a&&!a.includes(" ")&&s.add(a)}}return[...s].filter(r=>{if(r.endsWith(".js")){let i=r.replace(/\.js$/,".ts");if(s.has(i))return!1}if(r.endsWith(".jsx")){let i=r.replace(/\.jsx$/,".tsx");if(s.has(i))return!1}return!0})}function ao(e){let n=[/depends?\s+on\s+[`"]?([^`",.]+)[`"]?/gi,/requires?\s+[`"]?([^`",.]+)[`"]?/gi,/after\s+[`"]?([^`",.]+)[`"]?\s+(?:is\s+)?(?:complete|done|finished)/gi,/\bdeps?:\s*\[([^\]]+)\]/gi],t=new Set;for(let s of n){s.lastIndex=0;let o;for(;(o=s.exec(e))!==null;)if(s.source.includes("deps")){let r=o[1].split(",").map(i=>i.trim().replace(/[`"']/g,""));for(let i of r)i&&i.length>2&&i.length<50&&t.add(i)}else{let r=o[1].trim().replace(/\s+is$/i,"").replace(/[`"]/g,"");r&&r.length>2&&r.length<50&&t.add(r)}}return[...t]}function co(e){let n=[],t=e.replace(/\r\n/g,`
94
94
  `),s=/^```(\w+)?[ \t]*\n(?:\/\/\s*(\S+)\n)?([\s\S]*?)^```[ \t]*$/gm,o;for(;(o=s.exec(t))!==null;)n.push({language:o[1]||"text",filename:o[2],code:o[3].trim()});return n}function lo(e){let n=e.split(`
@@ -96,25 +96,25 @@ Start with \`# <Feature Title>\` and include all H2 stream sections with YAML bl
96
96
  `).trim()),o=[];let l=c[1].length,u=c[2].trim(),d={level:l,title:u,content:"",codeBlocks:[],fileReferences:[],explicitDeps:[],children:[]};for(;s.length>0&&s[s.length-1].level>=l;)s.pop();s.length>0?s[s.length-1].children.push(d):t.push(d),s.push(d)}else o.push(a)}s.length>0&&(s[s.length-1].content=o.join(`
97
97
  `).trim());function i(a){a.codeBlocks=co(a.content),a.fileReferences=io(a.content),a.explicitDeps=ao(a.content);for(let c of a.children)i(c)}for(let a of t)i(a);return t}function ht(e){let n=lo(e),t=n.find(c=>c.level===1)?.title??"Untitled Plan",o=n.find(c=>c.level===1)?.content.split(`
98
98
  `).slice(0,3).join(`
99
- `)??"",r=new Set,i=[];function a(c){for(let l of c.fileReferences)r.add(l);i.push(...c.codeBlocks);for(let l of c.children)a(l)}for(let c of n)a(c);return{title:t,description:o,sections:n,allFileReferences:[...r],allCodeBlocks:i}}function Q(e,n){let t=[];function s(o){o.level===n&&t.push(o);for(let r of o.children)s(r)}for(let o of e)s(o);return t}function ce(e){let n=[];function t(s){n.push(s);for(let o of s.children)t(o)}for(let s of e)t(s);return n}function Ie(e){let n=e.trim();return n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'")?n:n.replace(/\s+#(?=\s|$).*/,"").trim()}function uo(e){let n={},t=e.split(`
99
+ `)??"",r=new Set,i=[];function a(c){for(let l of c.fileReferences)r.add(l);i.push(...c.codeBlocks);for(let l of c.children)a(l)}for(let c of n)a(c);return{title:t,description:o,sections:n,allFileReferences:[...r],allCodeBlocks:i}}function Q(e,n){let t=[];function s(o){o.level===n&&t.push(o);for(let r of o.children)s(r)}for(let o of e)s(o);return t}function ce(e){let n=[];function t(s){n.push(s);for(let o of s.children)t(o)}for(let s of e)t(s);return n}function Me(e){let n=e.trim();return n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'")?n:n.replace(/\s+#(?=\s|$).*/,"").trim()}function uo(e){let n={},t=e.split(`
100
100
  `),s=null,o=[],r=!1,i=!1,a=[];for(let c of t){if(r&&(c.startsWith(" ")||c.startsWith(" ")||c.trim()==="")){o.push(c.replace(/^ /,"").replace(/^\t/,""));continue}else r&&(s&&(n[s]=o.join(`
101
- `).trim()),r=!1,s=null,o=[]);if(i&&c.match(/^\s+-\s+/)){let u=c.replace(/^\s+-\s+/,"").trim();a.push(Ie(u));continue}else i&&!c.match(/^\s+-\s+/)&&c.trim()!==""&&(s&&(n[s]=a),i=!1,s=null,a=[]);let l=c.match(/^([\w-]+):\s*(.*)$/);if(l){let[,u,d]=l;if(d.startsWith("[")&&d.endsWith("]")){let f=d.slice(1,-1).split(",").map(p=>Ie(p).replace(/['"]/g,""));n[u]=f.filter(p=>p.length>0);continue}if(d==="|"||d==="|-"){s=u,o=[],r=!0;continue}if(d===""){s=u,a=[],i=!0;continue}n[u]=Ie(d).replace(/^["']|["']$/g,"")}}return r&&s&&(n[s]=o.join(`
101
+ `).trim()),r=!1,s=null,o=[]);if(i&&c.match(/^\s+-\s+/)){let u=c.replace(/^\s+-\s+/,"").trim();a.push(Me(u));continue}else i&&!c.match(/^\s+-\s+/)&&c.trim()!==""&&(s&&(n[s]=a),i=!1,s=null,a=[]);let l=c.match(/^([\w-]+):\s*(.*)$/);if(l){let[,u,d]=l;if(d.startsWith("[")&&d.endsWith("]")){let f=d.slice(1,-1).split(",").map(p=>Me(p).replace(/['"]/g,""));n[u]=f.filter(p=>p.length>0);continue}if(d==="|"||d==="|-"){s=u,o=[],r=!0;continue}if(d===""){s=u,a=[],i=!0;continue}n[u]=Me(d).replace(/^["']|["']$/g,"")}}return r&&s&&(n[s]=o.join(`
102
102
  `).trim()),i&&s&&(n[s]=a),n}function fo(e){let n=e.split(`
103
103
  `),t=[],s=n.findIndex(i=>/^streams:\s*$/.test(i));if(s===-1)return[];let o=null,r=[];for(let i=s+1;i<n.length;i++){let a=n[i],c=a.match(/^ ([\w-]+):\s*$/);if(c){o&&r.some(l=>l.trim())&&t.push({id:o,block:r.join(`
104
104
  `)}),o=c[1],r=[];continue}if(o&&(/^ /.test(a)||a.trim()==="")){r.push(a.replace(/^ /,""));continue}if(a.trim()!==""&&!/^\s/.test(a))break}return o&&r.some(i=>i.trim())&&t.push({id:o,block:r.join(`
105
- `)}),t}function mt(e,n){let t=uo(e),s=n??t.id??"",o=t.name??"";if(!s&&!o){oo.warn({block:e.slice(0,100)},"Malformed YAML block skipped \u2014 no id or name found");return}let r={id:s,name:o};return t.deps&&(r.deps=Array.isArray(t.deps)?t.deps:[t.deps]),t.owns&&(r.owns=Array.isArray(t.owns)?t.owns:[t.owns]),t.reads&&(r.reads=Array.isArray(t.reads)?t.reads:[t.reads]),t.plan&&(r.plan=t.plan),t.verify&&(r.verify=Array.isArray(t.verify)?t.verify:[t.verify]),t.setup&&(r.setup=Array.isArray(t.setup)?t.setup:[t.setup]),r}function Ae(e){let n=[];for(let t of e.codeBlocks){if(t.language!=="yaml"&&t.language!=="yml")continue;let s=fo(t.code);if(s.length>0){for(let{id:r,block:i}of s){let a=mt(i,r);a&&n.push(a)}continue}if(!t.code.includes("id:")&&!t.code.includes("name:"))continue;let o=mt(t.code);o&&n.push(o)}return n}function gt(e){return e.includes("ORCHEX PLAN TEMPLATE")}var oo,Re=y(()=>{"use strict";oo=so("plan-parser")});import*as I from"fs/promises";import*as q from"path";import{createLogger as po}from"../logging.js";function go(e){return e>=mo?"high":e>=ho?"medium":"low"}function ee(e,n){let t=`${e} ${n??""}`.toLowerCase();return t.includes("test")||t.includes("spec")?"test":t.includes("migration")||t.includes("migrate")||t.includes("refactor")||t.includes("restructure")?"migration":t.includes("integration")&&(t.includes("guide")||t.includes("doc"))?"integration-guide":t.includes("tutorial")||t.includes("getting-started")||t.includes("getting started")?"tutorial":t.includes("api")&&(t.includes("ref")||t.includes("doc"))?"api-reference":t.includes("doc")||t.includes("readme")||t.includes("md")||t.includes("guide")?"docs":"code"}function wo(e,n=Fe){let t=[],s=[],o=e.filter(u=>(u.eventType==="stream_complete"||u.eventType==="stream_failed")&&u.contextTokensEstimated!==void 0);if(o.length<n)return{correlations:[],suggestedThresholds:{},insights:[`Not enough data for learning. Have ${o.length}, need ${n} samples.`],hasEnoughData:!1};let r=o.filter(u=>u.eventType==="stream_complete").length,i=r/o.length;s.push(`Overall success rate: ${(i*100).toFixed(1)}% (${r}/${o.length})`);let a=yo(o);a.optimalRange&&(t.push({factor:"contextTokens",successRate:a.optimalSuccessRate,sampleSize:a.optimalSampleSize,threshold:a.optimalRange.max,recommendation:`Optimal context size: ${a.optimalRange.min.toLocaleString()}-${a.optimalRange.max.toLocaleString()} tokens (${(a.optimalSuccessRate*100).toFixed(1)}% success)`}),s.push(t[t.length-1].recommendation));let c=xo(o);c.softViolationSuccessRate!==void 0&&t.push({factor:"softViolation",successRate:c.softViolationSuccessRate,sampleSize:c.softViolationCount,threshold:0,recommendation:c.softViolationSuccessRate<.7?"Soft limit violations have low success rate - consider lowering soft limit":"Soft limit violations acceptable - current threshold is appropriate"});let l=vo(t,a,o.length);return{correlations:t,suggestedThresholds:l,insights:s,hasEnoughData:!0}}function yo(e){let n=[{min:0,max:5e4},{min:5e4,max:1e5},{min:1e5,max:15e4},{min:15e4,max:2e5}],t=n[0],s=0,o=0;for(let r of n){let i=e.filter(a=>a.contextTokensEstimated!==void 0&&a.contextTokensEstimated>=r.min&&a.contextTokensEstimated<r.max);if(i.length>=5){let c=i.filter(l=>l.eventType==="stream_complete").length/i.length;c>s&&(s=c,t=r,o=i.length)}}return{optimalRange:o>=5?t:void 0,optimalSuccessRate:s,optimalSampleSize:o}}function xo(e){let n=e.filter(s=>s.budgetViolationType==="soft"),t=e.filter(s=>s.budgetViolationType==="hard");return{softViolationCount:n.length,softViolationSuccessRate:n.length>=5?n.filter(s=>s.eventType==="stream_complete").length/n.length:void 0,hardViolationCount:t.length,hardViolationSuccessRate:t.length>=5?t.filter(s=>s.eventType==="stream_complete").length/t.length:void 0}}function vo(e,n,t){let s={sampleCount:t,confidence:go(t),lastUpdated:new Date().toISOString(),version:1};return n.optimalRange&&(s.globalSoftLimit=n.optimalRange.max,s.globalHardLimit=Math.round(n.optimalRange.max*1.3)),s}function So(e,n,t=.3){if(!n.hasEnoughData)return e;let s={...e},o=n.suggestedThresholds;return o.globalSoftLimit!==void 0&&(s.globalSoftLimit=Math.round(e.globalSoftLimit*(1-t)+o.globalSoftLimit*t)),o.globalHardLimit!==void 0&&(s.globalHardLimit=Math.round(e.globalHardLimit*(1-t)+o.globalHardLimit*t)),o.sampleCount!==void 0&&(s.sampleCount=o.sampleCount),o.confidence!==void 0&&(s.confidence=o.confidence),s.lastUpdated=new Date().toISOString(),s}function wt(e){return q.join(e,".orchex","learn","thresholds.json")}async function $o(e,n){let t=wt(e),s=q.dirname(t);await I.mkdir(s,{recursive:!0}),await I.writeFile(t,JSON.stringify(n,null,2),"utf-8")}async function ko(e){let n=wt(e);try{let t=await I.readFile(n,"utf-8"),s=JSON.parse(t);return s.version!==1?(le.warn({version:s.version},"unknown_thresholds_version"),null):s}catch{return null}}async function je(e){return await ko(e)??{...Z}}function yt(e,n,t){switch(t){case"owns":return e.maxOwnsCount[n]??Z.maxOwnsCount.other;case"reads":return e.maxReadsCount[n]??Z.maxReadsCount.other;case"tokens":return e.maxContextTokens[n]??e.globalSoftLimit}}function xt(e){return q.join(e,".orchex","learn","events.jsonl")}function vt(e,n,t){return{id:`learn-${Date.now()}-${e.id}`,sessionHash:"local",eventType:e.status==="complete"?"stream_complete":"stream_failed",timestamp:new Date().toISOString(),durationMs:e.executionTimeMs,success:e.status==="complete",tokensInput:e.tokensUsed?.input,tokensOutput:e.tokensUsed?.output,provider:n,model:t,contextTokensEstimated:e.contextMetrics?.estimatedTokens,contextTokensActual:e.contextMetrics?.actualTokens,contextBudgetUtilization:e.contextMetrics?.budgetUtilization,budgetViolationType:e.contextMetrics?.violationType}}async function St(e,n){if(n.length===0)return;let t=xt(e),s=q.dirname(t);await I.mkdir(s,{recursive:!0});let o=n.map(r=>JSON.stringify(r)).join(`
105
+ `)}),t}function mt(e,n){let t=uo(e),s=n??t.id??"",o=t.name??"";if(!s&&!o){oo.warn({block:e.slice(0,100)},"Malformed YAML block skipped \u2014 no id or name found");return}let r={id:s,name:o};return t.deps&&(r.deps=Array.isArray(t.deps)?t.deps:[t.deps]),t.owns&&(r.owns=Array.isArray(t.owns)?t.owns:[t.owns]),t.reads&&(r.reads=Array.isArray(t.reads)?t.reads:[t.reads]),t.plan&&(r.plan=t.plan),t.verify&&(r.verify=Array.isArray(t.verify)?t.verify:[t.verify]),t.setup&&(r.setup=Array.isArray(t.setup)?t.setup:[t.setup]),r}function Ae(e){let n=[];for(let t of e.codeBlocks){if(t.language!=="yaml"&&t.language!=="yml")continue;let s=fo(t.code);if(s.length>0){for(let{id:r,block:i}of s){let a=mt(i,r);a&&n.push(a)}continue}if(!t.code.includes("id:")&&!t.code.includes("name:"))continue;let o=mt(t.code);o&&n.push(o)}return n}function gt(e){return e.includes("ORCHEX PLAN TEMPLATE")}var oo,Re=y(()=>{"use strict";oo=so("plan-parser")});import*as M from"fs/promises";import*as q from"path";import{createLogger as po}from"../logging.js";function go(e){return e>=mo?"high":e>=ho?"medium":"low"}function ee(e,n){let t=`${e} ${n??""}`.toLowerCase();return t.includes("test")||t.includes("spec")?"test":t.includes("migration")||t.includes("migrate")||t.includes("refactor")||t.includes("restructure")?"migration":t.includes("integration")&&(t.includes("guide")||t.includes("doc"))?"integration-guide":t.includes("tutorial")||t.includes("getting-started")||t.includes("getting started")?"tutorial":t.includes("api")&&(t.includes("ref")||t.includes("doc"))?"api-reference":t.includes("doc")||t.includes("readme")||t.includes("md")||t.includes("guide")?"docs":"code"}function wo(e,n=Fe){let t=[],s=[],o=e.filter(u=>(u.eventType==="stream_complete"||u.eventType==="stream_failed")&&u.contextTokensEstimated!==void 0);if(o.length<n)return{correlations:[],suggestedThresholds:{},insights:[`Not enough data for learning. Have ${o.length}, need ${n} samples.`],hasEnoughData:!1};let r=o.filter(u=>u.eventType==="stream_complete").length,i=r/o.length;s.push(`Overall success rate: ${(i*100).toFixed(1)}% (${r}/${o.length})`);let a=yo(o);a.optimalRange&&(t.push({factor:"contextTokens",successRate:a.optimalSuccessRate,sampleSize:a.optimalSampleSize,threshold:a.optimalRange.max,recommendation:`Optimal context size: ${a.optimalRange.min.toLocaleString()}-${a.optimalRange.max.toLocaleString()} tokens (${(a.optimalSuccessRate*100).toFixed(1)}% success)`}),s.push(t[t.length-1].recommendation));let c=xo(o);c.softViolationSuccessRate!==void 0&&t.push({factor:"softViolation",successRate:c.softViolationSuccessRate,sampleSize:c.softViolationCount,threshold:0,recommendation:c.softViolationSuccessRate<.7?"Soft limit violations have low success rate - consider lowering soft limit":"Soft limit violations acceptable - current threshold is appropriate"});let l=vo(t,a,o.length);return{correlations:t,suggestedThresholds:l,insights:s,hasEnoughData:!0}}function yo(e){let n=[{min:0,max:5e4},{min:5e4,max:1e5},{min:1e5,max:15e4},{min:15e4,max:2e5}],t=n[0],s=0,o=0;for(let r of n){let i=e.filter(a=>a.contextTokensEstimated!==void 0&&a.contextTokensEstimated>=r.min&&a.contextTokensEstimated<r.max);if(i.length>=5){let c=i.filter(l=>l.eventType==="stream_complete").length/i.length;c>s&&(s=c,t=r,o=i.length)}}return{optimalRange:o>=5?t:void 0,optimalSuccessRate:s,optimalSampleSize:o}}function xo(e){let n=e.filter(s=>s.budgetViolationType==="soft"),t=e.filter(s=>s.budgetViolationType==="hard");return{softViolationCount:n.length,softViolationSuccessRate:n.length>=5?n.filter(s=>s.eventType==="stream_complete").length/n.length:void 0,hardViolationCount:t.length,hardViolationSuccessRate:t.length>=5?t.filter(s=>s.eventType==="stream_complete").length/t.length:void 0}}function vo(e,n,t){let s={sampleCount:t,confidence:go(t),lastUpdated:new Date().toISOString(),version:1};return n.optimalRange&&(s.globalSoftLimit=n.optimalRange.max,s.globalHardLimit=Math.round(n.optimalRange.max*1.3)),s}function So(e,n,t=.3){if(!n.hasEnoughData)return e;let s={...e},o=n.suggestedThresholds;return o.globalSoftLimit!==void 0&&(s.globalSoftLimit=Math.round(e.globalSoftLimit*(1-t)+o.globalSoftLimit*t)),o.globalHardLimit!==void 0&&(s.globalHardLimit=Math.round(e.globalHardLimit*(1-t)+o.globalHardLimit*t)),o.sampleCount!==void 0&&(s.sampleCount=o.sampleCount),o.confidence!==void 0&&(s.confidence=o.confidence),s.lastUpdated=new Date().toISOString(),s}function wt(e){return q.join(e,".orchex","learn","thresholds.json")}async function ko(e,n){let t=wt(e),s=q.dirname(t);await M.mkdir(s,{recursive:!0}),await M.writeFile(t,JSON.stringify(n,null,2),"utf-8")}async function $o(e){let n=wt(e);try{let t=await M.readFile(n,"utf-8"),s=JSON.parse(t);return s.version!==1?(le.warn({version:s.version},"unknown_thresholds_version"),null):s}catch{return null}}async function je(e){return await $o(e)??{...Z}}function yt(e,n,t){switch(t){case"owns":return e.maxOwnsCount[n]??Z.maxOwnsCount.other;case"reads":return e.maxReadsCount[n]??Z.maxReadsCount.other;case"tokens":return e.maxContextTokens[n]??e.globalSoftLimit}}function xt(e){return q.join(e,".orchex","learn","events.jsonl")}function vt(e,n,t){return{id:`learn-${Date.now()}-${e.id}`,sessionHash:"local",eventType:e.status==="complete"?"stream_complete":"stream_failed",timestamp:new Date().toISOString(),durationMs:e.executionTimeMs,success:e.status==="complete",tokensInput:e.tokensUsed?.input,tokensOutput:e.tokensUsed?.output,provider:n,model:t,contextTokensEstimated:e.contextMetrics?.estimatedTokens,contextTokensActual:e.contextMetrics?.actualTokens,contextBudgetUtilization:e.contextMetrics?.budgetUtilization,budgetViolationType:e.contextMetrics?.violationType}}async function St(e,n){if(n.length===0)return;let t=xt(e),s=q.dirname(t);await M.mkdir(s,{recursive:!0});let o=n.map(r=>JSON.stringify(r)).join(`
106
106
  `)+`
107
- `;await I.appendFile(t,o,"utf-8")}async function bo(e){let n=xt(e);try{let t=await I.readFile(n,"utf-8"),s=[];for(let o of t.split(`
108
- `))if(o.trim())try{s.push(JSON.parse(o))}catch{}return s}catch{return[]}}async function $t(e){let n=await bo(e);if(n.length<Fe)return le.debug({eventCount:n.length,minRequired:Fe},"learning_skipped_insufficient_data"),null;let t=wo(n);if(!t.hasEnoughData)return le.debug({insights:t.insights},"learning_insufficient_context_data"),t;let s=await je(e),o=So(s,t);return await $o(e,o),le.info({sampleCount:o.sampleCount,confidence:o.confidence,globalSoftLimit:o.globalSoftLimit,globalHardLimit:o.globalHardLimit},"learning_cycle_completed"),t}var le,Z,Fe,mo,ho,De=y(()=>{"use strict";le=po("learning-engine"),Z={maxOwnsCount:{code:4,docs:6,tutorial:3,"integration-guide":3,test:4,migration:3,"api-reference":4,other:4},maxReadsCount:{code:4,docs:3,tutorial:4,"integration-guide":4,test:5,migration:4,"api-reference":3,other:4},maxContextTokens:{code:14e4,docs:8e4,tutorial:1e5,"integration-guide":1e5,test:14e4,migration:16e4,"api-reference":8e4,other:1e5},globalSoftLimit:14e4,globalHardLimit:18e4,sampleCount:0,confidence:"low",lastUpdated:new Date().toISOString(),version:1},Fe=20,mo=100,ho=50});function Po(e){let n=e.toLowerCase(),t=n.split("/").pop()??n;for(let s of Co)switch(s){case"tests":if(n.includes("/test")||n.includes("/__tests__/")||t.includes(".test.")||t.includes(".spec.")||t.startsWith("test_")||t.endsWith("_test.ts")||t.endsWith("_test.js"))return"tests";break;case"migrations":if(n.includes("/migration")||t.includes("migration")||t.endsWith(".sql"))return"migrations";break;case"docs":if(n.endsWith(".md")||n.includes("/docs/")||n.includes("/documentation/"))return"docs";break;case"types":if(t.includes("types")||t.includes("schema")||t.includes("interface")||t==="index.d.ts")return"types";break;case"styles":if(n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".less")||n.endsWith(".sass")||n.includes("/styles/"))return"styles";break}return"core"}function To(e,n,t){let s=e.split(`
107
+ `;await M.appendFile(t,o,"utf-8")}async function bo(e){let n=xt(e);try{let t=await M.readFile(n,"utf-8"),s=[];for(let o of t.split(`
108
+ `))if(o.trim())try{s.push(JSON.parse(o))}catch{}return s}catch{return[]}}async function kt(e){let n=await bo(e);if(n.length<Fe)return le.debug({eventCount:n.length,minRequired:Fe},"learning_skipped_insufficient_data"),null;let t=wo(n);if(!t.hasEnoughData)return le.debug({insights:t.insights},"learning_insufficient_context_data"),t;let s=await je(e),o=So(s,t);return await ko(e,o),le.info({sampleCount:o.sampleCount,confidence:o.confidence,globalSoftLimit:o.globalSoftLimit,globalHardLimit:o.globalHardLimit},"learning_cycle_completed"),t}var le,Z,Fe,mo,ho,De=y(()=>{"use strict";le=po("learning-engine"),Z={maxOwnsCount:{code:4,docs:6,tutorial:3,"integration-guide":3,test:4,migration:3,"api-reference":4,other:4},maxReadsCount:{code:4,docs:3,tutorial:4,"integration-guide":4,test:5,migration:4,"api-reference":3,other:4},maxContextTokens:{code:14e4,docs:8e4,tutorial:1e5,"integration-guide":1e5,test:14e4,migration:16e4,"api-reference":8e4,other:1e5},globalSoftLimit:14e4,globalHardLimit:18e4,sampleCount:0,confidence:"low",lastUpdated:new Date().toISOString(),version:1},Fe=20,mo=100,ho=50});function Po(e){let n=e.toLowerCase(),t=n.split("/").pop()??n;for(let s of Co)switch(s){case"tests":if(n.includes("/test")||n.includes("/__tests__/")||t.includes(".test.")||t.includes(".spec.")||t.startsWith("test_")||t.endsWith("_test.ts")||t.endsWith("_test.js"))return"tests";break;case"migrations":if(n.includes("/migration")||t.includes("migration")||t.endsWith(".sql"))return"migrations";break;case"docs":if(n.endsWith(".md")||n.includes("/docs/")||n.includes("/documentation/"))return"docs";break;case"types":if(t.includes("types")||t.includes("schema")||t.includes("interface")||t==="index.d.ts")return"types";break;case"styles":if(n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".less")||n.endsWith(".sass")||n.includes("/styles/"))return"styles";break}return"core"}function To(e,n,t){let s=e.split(`
109
109
  `),o=Oo[n],r=t.map(a=>(a.split("/").pop()??a).toLowerCase().replace(/\.[^.]+$/,"")),i=s.filter(a=>{let c=a.toLowerCase();return!!(o.some(l=>c.includes(l))||r.some(l=>c.includes(l)))});return i.length>0?i.join(`
110
110
  `):`${e}
111
111
 
112
- Files: ${t.join(", ")}`}function _o(e,n){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return n?`${n}-${t}`:t}function bt(e){let n=[],t=[],s=/^\s*[-*]?\s*(?:Create|Modify|Test):\s*`([^`]+)`/gim,o;for(;(o=s.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&n.push(a)}let r=/\*\*(?:New\s+)?[Ff]ile:\*\*\s*`([^`]+)`/gi;for(;(o=r.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&n.push(a)}let i=/^\s*[-*]?\s*(?:Reads?|Imports?):\s*`([^`]+)`/gim;for(;(o=i.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&t.push(a)}return{owned:n,reads:t}}function Ct(e,n){let t=new Set,s=new Set(n),o=/(?:import\s+(?:[\s\S]*?\s+from\s+)?|import\s*\()['"]([^'"]+)['"]/g,r=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(let i of e){let a=[],c;for(o.lastIndex=0;(c=o.exec(i.code))!==null;)a.push(c[1]);for(r.lastIndex=0;(c=r.exec(i.code))!==null;)a.push(c[1]);for(let l of a){let u=Mo(l,i.filename);u&&(s.has(u)||n.some(d=>d.endsWith("/"+u))||t.add(u))}}return[...t]}function Mo(e,n){if(!e.startsWith(".")&&!e.startsWith("src/")&&!e.startsWith("tests/")&&!e.startsWith("lib/")||e.startsWith("node:"))return null;let t;if(e.startsWith(".")){if(!n)return null;let s=n.split("/");s.pop();let o=s.join("/"),r=[...o?o.split("/"):[]];for(let i of e.split("/"))i!=="."&&(i===".."?r.pop():r.push(i));t=r.join("/")}else t=e;return t.endsWith(".js")&&(t=t.replace(/\.js$/,".ts")),t.includes(".")||(t=t+".ts"),t}function Io(e,n){let t=new Set,s=new Set,o=e.content.match(/reads:\s*\[([^\]]+)\]/i);if(o){let d=o[1].split(",").map(f=>f.trim().replace(/[`"']/g,""));for(let f of d)f&&f.includes(".")&&s.add(f)}let r=te(e),i=Et(r),a=bt(i);for(let d of a.owned)s.has(d)||t.add(d);let c=ue(e,n);for(let d of c)d.filename&&d.filename.includes(".")&&!s.has(d.filename)&&t.add(d.filename);let l=/owns:\s*\[([^\]]+)\]/gi,u;for(;(u=l.exec(i))!==null;){let d=u[1].split(",").map(f=>f.trim().replace(/[`"']/g,""));for(let f of d)f&&f.includes(".")&&!s.has(f)&&t.add(f)}return[...t]}function Et(e){return e.replace(/^```[^\n]*\n[\s\S]*?^```\s*$/gm,"")}function te(e){let n=e.content;for(let t of e.children)n+=`
112
+ Files: ${t.join(", ")}`}function _o(e,n){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return n?`${n}-${t}`:t}function bt(e){let n=[],t=[],s=/^\s*[-*]?\s*(?:Create|Modify|Test):\s*`([^`]+)`/gim,o;for(;(o=s.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&n.push(a)}let r=/\*\*(?:New\s+)?[Ff]ile:\*\*\s*`([^`]+)`/gi;for(;(o=r.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&n.push(a)}let i=/^\s*[-*]?\s*(?:Reads?|Imports?):\s*`([^`]+)`/gim;for(;(o=i.exec(e))!==null;){let a=o[1].replace(/:\d+(-\d+)?$/,"").trim();a&&a.includes(".")&&t.push(a)}return{owned:n,reads:t}}function Ct(e,n){let t=new Set,s=new Set(n),o=/(?:import\s+(?:[\s\S]*?\s+from\s+)?|import\s*\()['"]([^'"]+)['"]/g,r=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(let i of e){let a=[],c;for(o.lastIndex=0;(c=o.exec(i.code))!==null;)a.push(c[1]);for(r.lastIndex=0;(c=r.exec(i.code))!==null;)a.push(c[1]);for(let l of a){let u=Io(l,i.filename);u&&(s.has(u)||n.some(d=>d.endsWith("/"+u))||t.add(u))}}return[...t]}function Io(e,n){if(!e.startsWith(".")&&!e.startsWith("src/")&&!e.startsWith("tests/")&&!e.startsWith("lib/")||e.startsWith("node:"))return null;let t;if(e.startsWith(".")){if(!n)return null;let s=n.split("/");s.pop();let o=s.join("/"),r=[...o?o.split("/"):[]];for(let i of e.split("/"))i!=="."&&(i===".."?r.pop():r.push(i));t=r.join("/")}else t=e;return t.endsWith(".js")&&(t=t.replace(/\.js$/,".ts")),t.includes(".")||(t=t+".ts"),t}function Mo(e,n){let t=new Set,s=new Set,o=e.content.match(/reads:\s*\[([^\]]+)\]/i);if(o){let d=o[1].split(",").map(f=>f.trim().replace(/[`"']/g,""));for(let f of d)f&&f.includes(".")&&s.add(f)}let r=te(e),i=Et(r),a=bt(i);for(let d of a.owned)s.has(d)||t.add(d);let c=ue(e,n);for(let d of c)d.filename&&d.filename.includes(".")&&!s.has(d.filename)&&t.add(d.filename);let l=/owns:\s*\[([^\]]+)\]/gi,u;for(;(u=l.exec(i))!==null;){let d=u[1].split(",").map(f=>f.trim().replace(/[`"']/g,""));for(let f of d)f&&f.includes(".")&&!s.has(f)&&t.add(f)}return[...t]}function Et(e){return e.replace(/^```[^\n]*\n[\s\S]*?^```\s*$/gm,"")}function te(e){let n=e.content;for(let t of e.children)n+=`
113
113
  `+t.title+`
114
114
  `+te(t);return n}function ue(e,n){let t=[...n];for(let s of e.children){t.push(...s.codeBlocks);for(let o of s.children)t.push(...ue(o,[]))}return t}function Ao(e){let n=e.split(`
115
115
  `);for(let t of n){let s=t.trim();if(!s||/^-{3,}$/.test(s)||/^\*\*[^*]+\*\*$/.test(s)&&s.split(/\s+/).length<=3)continue;if(s.split(/\s+/).filter(r=>r.length>0).length>3)return s.length>150?s.slice(0,147)+"...":s}return""}function Ro(e,n,t=3e3){let s=te(e);if(s.length<=t||e.children.length<3)return s.slice(0,t);let o=[],r=e.content.trim();r&&o.push(r.slice(0,300));for(let c=0;c<e.children.length;c++){let l=e.children[c],u=l.title,d=Ao(l.content),p=(l.fileReferences||[]).filter(h=>n.includes(h)),m=`${c+1}. ${u}`;p.length>0&&(m+=` (${p.join(", ")})`),d&&(m+=` \u2014 ${d}`),o.push(m)}let i=0,a=[];for(let c of o){if(i+c.length+1>t&&a.length>0)break;a.push(c),i+=c.length+1}return a.join(`
116
- `)}function Fo(e,n){let t=new Set,s=te(e),o=Et(s),r=o.match(/reads:\s*\[([^\]]+)\]/i);if(r){let l=r[1].split(",").map(u=>u.trim().replace(/[`"']/g,""));for(let u of l)u&&u.includes(".")&&!n.includes(u)&&t.add(u)}let i=bt(o);for(let l of i.reads)n.includes(l)||t.add(l);let a=ue(e,e.codeBlocks),c=Ct(a,n);for(let l of c)n.includes(l)||t.add(l);return[...t]}function Pt(e){let n=new Map;for(let t of e){let s=Po(t);n.has(s)||n.set(s,[]),n.get(s).push(t)}return n}function Ot(e){if(e._fromYaml)return{split:!1,reasons:[]};let t=[];e.ownedFiles.length>4&&t.push(`Owns ${e.ownedFiles.length} files (max recommended: 4)`);let s=(e.description.match(/\band\b/gi)??[]).length;if(s>2&&t.push(`Description has ${s} "and" conjunctions (suggests multiple tasks)`),e.ownedFiles.length>1){let o=Pt(e.ownedFiles);if(o.size>1){let r=[...o.keys()].join(", ");t.push(`Files belong to ${o.size} different concerns (${r})`)}}return{split:t.length>0,reasons:t}}function jo(e){let n=ee(e.name,e.plan||"");return{id:e.id,name:e.name,description:e.plan||"",category:n,ownedFiles:e.owns||[],readFiles:e.reads||[],explicitDeps:e.deps||[],codeExamples:[],isAtomic:!0,_fromYaml:!0,_verify:e.verify,_setup:e.setup}}function Do(e,n,t){let s=[],o=ce(e.sections);for(let r of o){let i=Ae(r);if(t){let a=r.codeBlocks.filter(c=>c.language==="yaml"||c.language==="yml");t.yamlBlocksFound+=a.length,t.yamlBlocksParsed+=i.length}for(let a of i){n&&!a.id.startsWith(n)&&(a.id=`${n}-${a.id}`);let c=jo(a),l=Ot(c);l.split&&(c.isAtomic=!1,c.suggestedSplit=l.reasons),s.push(c)}}return s}function Lo(e){let n=ce(e.sections);for(let t of n)if(Ae(t).length>0)return!0;return!1}function No(e){if(["test plan","implementation order","security checklist","gap inventory","task order","dependency order","execution order","deployment order","wave order"].some(r=>e.includes(r)))return!0;let t=["checklist","inventory","roadmap","timeline","schedule"],s=e.split(/[\s:]+/).filter(r=>r.length>0),o=s[s.length-1]??"";return!!t.includes(o)}function Tt(e,n={}){let{deliverableLevel:t=2,prefix:s,preferYaml:o=!0,diagnostics:r}=n;if(o&&Lo(e)){r&&(r.extractionPath="yaml");let l=Do(e,s,r);return r&&(r.deliverableCount=l.length),l}if(r){let l=ce(e.sections);for(let u of l)r.yamlBlocksFound+=u.codeBlocks.filter(d=>d.language==="yaml"||d.language==="yml").length;r.extractionPath="markdown"}let i=[],a=Q(e.sections,t);if(r)for(let l of[2,3,4])r.sectionsFound[l]=Q(e.sections,l).length;for(let l of a){let $=function(D){for(let R of D.fileReferences)m.includes(R)||h.includes(R)||b&&!S.has(R)||h.push(R);for(let R of D.children)$(R)};var c=$;let u=l.title.toLowerCase(),f=u.split(/[\s:]+/).filter(D=>D.length>0)[0]??"";if(u.includes("overview")&&a.indexOf(l)===0||f==="summary"||u==="summary: task order"||f==="conclusion"||f==="introduction"||f==="context"||f==="background"||f==="appendix"||f==="references"||f==="changelog"||f==="prerequisites"||No(u)){r&&r.sectionsFilteredAsMeta.push(l.title);continue}let p=_o(l.title,s),m=Io(l,l.codeBlocks),h=Fo(l,m),w=ue(l,l.codeBlocks),S=new Set(Ct(w,m)),b=S.size>0;for(let D of l.children)$(D);let v=te(l),g=ee(l.title,v),x={id:p,name:l.title,description:Ro(l,m),category:g,ownedFiles:m,readFiles:h,explicitDeps:l.explicitDeps,codeExamples:w,isAtomic:!0,childCount:l.children.length},U=Ot(x);U.split&&(x.isAtomic=!1,x.suggestedSplit=U.reasons),i.push(x)}return r&&(r.deliverableCount=i.length),i}function Wo(e,n){let t=(e.language||"").toLowerCase(),s=e.code.toLowerCase();switch(n){case"migrations":return t==="sql"||s.includes("create table")||s.includes("alter table");case"types":return(t==="typescript"||t==="ts")&&(s.includes("export type ")||s.includes("export interface ")||s.includes("z.object"));case"tests":return s.includes("describe(")||s.includes("it(")||s.includes("expect(");case"docs":return t==="markdown"||t==="md";case"styles":return t==="css"||t==="scss"||t==="less"||t==="sass";case"core":return(t==="typescript"||t==="ts"||t==="javascript"||t==="js")&&!s.includes("export type ")&&!s.includes("export interface ")&&!s.includes("describe(")&&!s.includes("it(");default:return!1}}function Uo(e){if(e._fromYaml)return[{...e,isAtomic:!0}];let t=Pt(e.ownedFiles);if(t.size<=1)return[{...e,isAtomic:!0}];let s=[],o=null,r=0;for(let i of Eo){let a=t.get(i);if(!a||a.length===0)continue;r++;let c=`${e.id}-${i}`,l=`${e.name} (${i})`,u=To(e.description,i,a),d=[];r===1&&e.explicitDeps.length>0&&d.push(...e.explicitDeps),o&&d.push(o);let f=[];switch(i){case"types":break;case"core":case"migrations":f=[...e.readFiles];break;case"tests":f=[...t.get("core")||[]];break;case"docs":f=[...t.get("core")||t.get("types")||[]];break}let p=e.codeExamples.filter(m=>m.filename&&a.some(h=>m.filename===h)?!0:m.filename?!1:Wo(m,i));s.push({id:c,name:l,description:u,category:e.category,ownedFiles:a,readFiles:f,explicitDeps:d,codeExamples:p,isAtomic:!0}),o=c}return s}function _t(e){let n=[];for(let t of e)t.isAtomic?n.push(t):n.push(...Uo(t));return n}function kt(e){let n=[];return n.push(`${e.id}:`),n.push(` Name: ${e.name}`),n.push(` Category: ${e.category}`),n.push(` Owns: ${e.ownedFiles.join(", ")||"(none)"}`),e.readFiles.length>0&&n.push(` Reads: ${e.readFiles.join(", ")}`),e.explicitDeps.length>0&&n.push(` Deps: ${e.explicitDeps.join(", ")}`),e.isAtomic||n.push(` \u26A0\uFE0F Should split: ${e.suggestedSplit?.join("; ")}`),n.join(`
117
- `)}function Mt(e){let n=e.filter(o=>o.isAtomic),t=e.filter(o=>!o.isAtomic),s=`=== Deliverables Report ===
116
+ `)}function Fo(e,n){let t=new Set,s=te(e),o=Et(s),r=o.match(/reads:\s*\[([^\]]+)\]/i);if(r){let l=r[1].split(",").map(u=>u.trim().replace(/[`"']/g,""));for(let u of l)u&&u.includes(".")&&!n.includes(u)&&t.add(u)}let i=bt(o);for(let l of i.reads)n.includes(l)||t.add(l);let a=ue(e,e.codeBlocks),c=Ct(a,n);for(let l of c)n.includes(l)||t.add(l);return[...t]}function Pt(e){let n=new Map;for(let t of e){let s=Po(t);n.has(s)||n.set(s,[]),n.get(s).push(t)}return n}function Ot(e){if(e._fromYaml)return{split:!1,reasons:[]};let t=[];e.ownedFiles.length>4&&t.push(`Owns ${e.ownedFiles.length} files (max recommended: 4)`);let s=(e.description.match(/\band\b/gi)??[]).length;if(s>2&&t.push(`Description has ${s} "and" conjunctions (suggests multiple tasks)`),e.ownedFiles.length>1){let o=Pt(e.ownedFiles);if(o.size>1){let r=[...o.keys()].join(", ");t.push(`Files belong to ${o.size} different concerns (${r})`)}}return{split:t.length>0,reasons:t}}function jo(e){let n=ee(e.name,e.plan||"");return{id:e.id,name:e.name,description:e.plan||"",category:n,ownedFiles:e.owns||[],readFiles:e.reads||[],explicitDeps:e.deps||[],codeExamples:[],isAtomic:!0,_fromYaml:!0,_verify:e.verify,_setup:e.setup}}function Do(e,n,t){let s=[],o=ce(e.sections);for(let r of o){let i=Ae(r);if(t){let a=r.codeBlocks.filter(c=>c.language==="yaml"||c.language==="yml");t.yamlBlocksFound+=a.length,t.yamlBlocksParsed+=i.length}for(let a of i){n&&!a.id.startsWith(n)&&(a.id=`${n}-${a.id}`);let c=jo(a),l=Ot(c);l.split&&(c.isAtomic=!1,c.suggestedSplit=l.reasons),s.push(c)}}return s}function Lo(e){let n=ce(e.sections);for(let t of n)if(Ae(t).length>0)return!0;return!1}function No(e){if(["test plan","implementation order","security checklist","gap inventory","task order","dependency order","execution order","deployment order","wave order"].some(r=>e.includes(r)))return!0;let t=["checklist","inventory","roadmap","timeline","schedule"],s=e.split(/[\s:]+/).filter(r=>r.length>0),o=s[s.length-1]??"";return!!t.includes(o)}function Tt(e,n={}){let{deliverableLevel:t=2,prefix:s,preferYaml:o=!0,diagnostics:r}=n;if(o&&Lo(e)){r&&(r.extractionPath="yaml");let l=Do(e,s,r);return r&&(r.deliverableCount=l.length),l}if(r){let l=ce(e.sections);for(let u of l)r.yamlBlocksFound+=u.codeBlocks.filter(d=>d.language==="yaml"||d.language==="yml").length;r.extractionPath="markdown"}let i=[],a=Q(e.sections,t);if(r)for(let l of[2,3,4])r.sectionsFound[l]=Q(e.sections,l).length;for(let l of a){let k=function(D){for(let R of D.fileReferences)m.includes(R)||h.includes(R)||b&&!S.has(R)||h.push(R);for(let R of D.children)k(R)};var c=k;let u=l.title.toLowerCase(),f=u.split(/[\s:]+/).filter(D=>D.length>0)[0]??"";if(u.includes("overview")&&a.indexOf(l)===0||f==="summary"||u==="summary: task order"||f==="conclusion"||f==="introduction"||f==="context"||f==="background"||f==="appendix"||f==="references"||f==="changelog"||f==="prerequisites"||No(u)){r&&r.sectionsFilteredAsMeta.push(l.title);continue}let p=_o(l.title,s),m=Mo(l,l.codeBlocks),h=Fo(l,m),w=ue(l,l.codeBlocks),S=new Set(Ct(w,m)),b=S.size>0;for(let D of l.children)k(D);let v=te(l),g=ee(l.title,v),x={id:p,name:l.title,description:Ro(l,m),category:g,ownedFiles:m,readFiles:h,explicitDeps:l.explicitDeps,codeExamples:w,isAtomic:!0,childCount:l.children.length},U=Ot(x);U.split&&(x.isAtomic=!1,x.suggestedSplit=U.reasons),i.push(x)}return r&&(r.deliverableCount=i.length),i}function Wo(e,n){let t=(e.language||"").toLowerCase(),s=e.code.toLowerCase();switch(n){case"migrations":return t==="sql"||s.includes("create table")||s.includes("alter table");case"types":return(t==="typescript"||t==="ts")&&(s.includes("export type ")||s.includes("export interface ")||s.includes("z.object"));case"tests":return s.includes("describe(")||s.includes("it(")||s.includes("expect(");case"docs":return t==="markdown"||t==="md";case"styles":return t==="css"||t==="scss"||t==="less"||t==="sass";case"core":return(t==="typescript"||t==="ts"||t==="javascript"||t==="js")&&!s.includes("export type ")&&!s.includes("export interface ")&&!s.includes("describe(")&&!s.includes("it(");default:return!1}}function Uo(e){if(e._fromYaml)return[{...e,isAtomic:!0}];let t=Pt(e.ownedFiles);if(t.size<=1)return[{...e,isAtomic:!0}];let s=[],o=null,r=0;for(let i of Eo){let a=t.get(i);if(!a||a.length===0)continue;r++;let c=`${e.id}-${i}`,l=`${e.name} (${i})`,u=To(e.description,i,a),d=[];r===1&&e.explicitDeps.length>0&&d.push(...e.explicitDeps),o&&d.push(o);let f=[];switch(i){case"types":break;case"core":case"migrations":f=[...e.readFiles];break;case"tests":f=[...t.get("core")||[]];break;case"docs":f=[...t.get("core")||t.get("types")||[]];break}let p=e.codeExamples.filter(m=>m.filename&&a.some(h=>m.filename===h)?!0:m.filename?!1:Wo(m,i));s.push({id:c,name:l,description:u,category:e.category,ownedFiles:a,readFiles:f,explicitDeps:d,codeExamples:p,isAtomic:!0}),o=c}return s}function _t(e){let n=[];for(let t of e)t.isAtomic?n.push(t):n.push(...Uo(t));return n}function $t(e){let n=[];return n.push(`${e.id}:`),n.push(` Name: ${e.name}`),n.push(` Category: ${e.category}`),n.push(` Owns: ${e.ownedFiles.join(", ")||"(none)"}`),e.readFiles.length>0&&n.push(` Reads: ${e.readFiles.join(", ")}`),e.explicitDeps.length>0&&n.push(` Deps: ${e.explicitDeps.join(", ")}`),e.isAtomic||n.push(` \u26A0\uFE0F Should split: ${e.suggestedSplit?.join("; ")}`),n.join(`
117
+ `)}function It(e){let n=e.filter(o=>o.isAtomic),t=e.filter(o=>!o.isAtomic),s=`=== Deliverables Report ===
118
118
 
119
119
  `;if(s+=`Total: ${e.length} deliverables
120
120
  `,s+=` ${n.length} atomic (ready for streams)
@@ -122,13 +122,13 @@ Files: ${t.join(", ")}`}function _o(e,n){let t=e.toLowerCase().replace(/[^a-z0-9
122
122
 
123
123
  `,t.length>0){s+=`--- Needs Splitting ---
124
124
 
125
- `;for(let o of t)s+=kt(o)+`
125
+ `;for(let o of t)s+=$t(o)+`
126
126
 
127
127
  `}s+=`--- Atomic Deliverables ---
128
128
 
129
- `;for(let o of n)s+=kt(o)+`
129
+ `;for(let o of n)s+=$t(o)+`
130
130
 
131
- `;return s}var Co,Eo,Oo,It=y(()=>{"use strict";Re();De();Co=["tests","migrations","docs","types","styles","core"],Eo=["types","migrations","styles","core","tests","docs"];Oo={types:["type","interface","schema","define","definition","typescript","zod"],migrations:["migrate","migration","schema","table","column","database","sql","alter"],core:["implement","create","add","configure","setup","install","build"],tests:["test","verify","check","assert","coverage","spec","expect"],docs:["document","readme","guide","example","usage","api reference"],styles:["style","css","scss","theme","design","token","color","layout"]}});function Le(e,n){let t=At.find(a=>e.id.endsWith(a));if(!t)return e;let s=e.id.slice(0,-t.length),o=n.filter(a=>At.some(c=>a.id===`${s}${c}`));if(o.length<=1)return e;let r=o.find(a=>a.id===`${s}-core`);if(r)return r;let i=["-migrations","-types"];for(let a of i){let c=o.find(l=>l.id===`${s}${a}`);if(c)return c}return e}function Ho(e,n){let t=e.toLowerCase().trim(),s=n.find(c=>c.id===e);if(s)return s;let o=n.find(c=>c.name.toLowerCase()===t);if(o)return Le(o,n);let r=n.find(c=>c.id.includes(t)||t.includes(c.id));if(r)return Le(r,n);let i=t.split(/[\s-_]+/).filter(c=>c.length>2),a=n.find(c=>{let l=c.name.toLowerCase().split(/[\s-_]+/);return i.filter(d=>l.some(f=>f.includes(d)||d.includes(f))).length>=i.length*.5});if(a)return Le(a,n)}function zo(e){let n=`${e.name} ${e.description}`.toLowerCase();return/\b(cleanup|clean\s*up|remove|delete|drop)\b/.test(n)}function Bo(e){let n=[],t=new Map;for(let r of e)if(!zo(r))for(let i of r.ownedFiles)t.set(i,r);for(let r of e)for(let i of r.readFiles){let a=t.get(i);a&&a.id!==r.id&&n.push({from:r.id,to:a.id,reason:"file-ownership",explanation:`${r.id} reads ${i} which is owned by ${a.id}`})}let s=new Set(n.map(r=>`${r.from}\u2192${r.to}`)),o=new Set;for(let r of n){let i=`${r.to}\u2192${r.from}`;s.has(i)&&(o.add(`${r.from}\u2192${r.to}`),o.add(i))}return n.filter(r=>!o.has(`${r.from}\u2192${r.to}`))}function qo(e){let n=[];for(let t of e){if(t.category==="test"){let s=t.id.replace(/-tests?$/,"").replace(/^tests?-/,""),o=e.find(r=>r.id!==t.id&&r.category==="code"&&(r.id===s||r.id===`${s}-core`||r.id===`${s}-service`||r.id===`${s}-implementation`));o&&n.push({from:t.id,to:o.id,reason:"content-pattern",explanation:`${t.id} (test) depends on ${o.id} (implementation)`})}if(t.category==="docs"||t.category==="tutorial"){let s=t.id.replace(/^docs?-/,"").replace(/-docs?$/,"").replace(/^tutorials?-/,"").replace(/-tutorials?$/,""),o=e.filter(i=>i.id!==t.id&&i.category==="code"),r=o.find(i=>i.id===s)||o.find(i=>i.id===`${s}-service`||i.id===`${s}-core`||i.id===`${s}-implementation`)||o.find(i=>i.id.startsWith(`${s}-`)&&!i.id.includes("types"));r&&n.push({from:t.id,to:r.id,reason:"content-pattern",explanation:`${t.id} (${t.category}) documents ${r.id}`})}}return n}function Yo(e,n){let t=[];for(let s of e)for(let o of s.explicitDeps){let r=Ho(o,e);if(r&&r.id!==s.id)t.push({from:s.id,to:r.id,reason:"explicit",explanation:`${s.id} explicitly depends on "${o}" (matched ${r.id})`});else if(!r){let i=`Stream '${s.id}': unmatched explicit dep '${o}'`;n?.diagnostics?.unmatchedDeps.push(i),n?.diagnostics?.warnings.push(i)}}return t}function Rt(e){let n=[],t=new Set,s=new Set,o=[];function r(i){t.add(i),s.add(i),o.push(i);let a=e.get(i)||[];for(let c of a)if(!t.has(c))r(c);else if(s.has(c)){let l=o.indexOf(c);if(l!==-1){let u=[...o.slice(l),c];n.push(u)}}o.pop(),s.delete(i)}for(let i of e.keys())t.has(i)||r(i);return n}function Ko(e,n,t){let s=0,o=new Set;for(let r of e){let i=[];for(let f=0;f<r.length-1;f++)i.push({from:r[f],to:r[f+1]});let a=[];for(let f of i){let p=n.find(m=>m.from===f.from&&m.to===f.to&&!o.has(`${m.from}\u2192${m.to}`));p&&a.push(p)}if(a.length===0||!a.every(f=>f.reason==="file-ownership"))continue;let l=a.reduce((f,p)=>{let m=t.get(f.from)?.length??0,h=t.get(p.from)?.length??0;return h<m||h===m&&p.from<f.from?p:f}),u=n.indexOf(l);u!==-1&&n.splice(u,1);let d=t.get(l.from);if(d){let f=d.indexOf(l.to);f!==-1&&d.splice(f,1)}o.add(`${l.from}\u2192${l.to}`),s++}return{broken:s}}function Ft(e,n){let t=[...Yo(e,n),...Bo(e),...qo(e)],s=new Set,o=[];for(let a of t){let c=`${a.from}\u2192${a.to}`;s.has(c)||(s.add(c),o.push(a))}let r=new Map;for(let a of e)r.set(a.id,[]);for(let a of o){let c=r.get(a.from)||[];c.includes(a.to)||c.push(a.to),r.set(a.from,c)}let i=Rt(r);if(i.length>0){let{broken:a}=Ko(i,o,r);a>0&&(i=Rt(r))}return{dependencies:r,edges:o,cycles:i,isAcyclic:i.length===0}}function jt(e){let n=["=== Dependency Analysis ===",""];if(n.push(`Total edges: ${e.edges.length}`),n.push(`Acyclic: ${e.isAcyclic?"Yes \u2713":"No \u26A0\uFE0F"}`),e.cycles.length>0){n.push(""),n.push("--- Cycles Detected ---");for(let t of e.cycles)n.push(` ${t.join(" \u2192 ")}`)}n.push(""),n.push("--- Dependencies by Deliverable ---");for(let[t,s]of e.dependencies)s.length>0&&n.push(`${t}: ${s.join(", ")}`);n.push(""),n.push("--- Edge Details ---");for(let t of e.edges)n.push(`${t.from} \u2192 ${t.to} (${t.reason})`),n.push(` ${t.explanation}`);return n.join(`
131
+ `;return s}var Co,Eo,Oo,Mt=y(()=>{"use strict";Re();De();Co=["tests","migrations","docs","types","styles","core"],Eo=["types","migrations","styles","core","tests","docs"];Oo={types:["type","interface","schema","define","definition","typescript","zod"],migrations:["migrate","migration","schema","table","column","database","sql","alter"],core:["implement","create","add","configure","setup","install","build"],tests:["test","verify","check","assert","coverage","spec","expect"],docs:["document","readme","guide","example","usage","api reference"],styles:["style","css","scss","theme","design","token","color","layout"]}});function Le(e,n){let t=At.find(a=>e.id.endsWith(a));if(!t)return e;let s=e.id.slice(0,-t.length),o=n.filter(a=>At.some(c=>a.id===`${s}${c}`));if(o.length<=1)return e;let r=o.find(a=>a.id===`${s}-core`);if(r)return r;let i=["-migrations","-types"];for(let a of i){let c=o.find(l=>l.id===`${s}${a}`);if(c)return c}return e}function Ho(e,n){let t=e.toLowerCase().trim(),s=n.find(c=>c.id===e);if(s)return s;let o=n.find(c=>c.name.toLowerCase()===t);if(o)return Le(o,n);let r=n.find(c=>c.id.includes(t)||t.includes(c.id));if(r)return Le(r,n);let i=t.split(/[\s-_]+/).filter(c=>c.length>2),a=n.find(c=>{let l=c.name.toLowerCase().split(/[\s-_]+/);return i.filter(d=>l.some(f=>f.includes(d)||d.includes(f))).length>=i.length*.5});if(a)return Le(a,n)}function zo(e){let n=`${e.name} ${e.description}`.toLowerCase();return/\b(cleanup|clean\s*up|remove|delete|drop)\b/.test(n)}function Bo(e){let n=[],t=new Map;for(let r of e)if(!zo(r))for(let i of r.ownedFiles)t.set(i,r);for(let r of e)for(let i of r.readFiles){let a=t.get(i);a&&a.id!==r.id&&n.push({from:r.id,to:a.id,reason:"file-ownership",explanation:`${r.id} reads ${i} which is owned by ${a.id}`})}let s=new Set(n.map(r=>`${r.from}\u2192${r.to}`)),o=new Set;for(let r of n){let i=`${r.to}\u2192${r.from}`;s.has(i)&&(o.add(`${r.from}\u2192${r.to}`),o.add(i))}return n.filter(r=>!o.has(`${r.from}\u2192${r.to}`))}function qo(e){let n=[];for(let t of e){if(t.category==="test"){let s=t.id.replace(/-tests?$/,"").replace(/^tests?-/,""),o=e.find(r=>r.id!==t.id&&r.category==="code"&&(r.id===s||r.id===`${s}-core`||r.id===`${s}-service`||r.id===`${s}-implementation`));o&&n.push({from:t.id,to:o.id,reason:"content-pattern",explanation:`${t.id} (test) depends on ${o.id} (implementation)`})}if(t.category==="docs"||t.category==="tutorial"){let s=t.id.replace(/^docs?-/,"").replace(/-docs?$/,"").replace(/^tutorials?-/,"").replace(/-tutorials?$/,""),o=e.filter(i=>i.id!==t.id&&i.category==="code"),r=o.find(i=>i.id===s)||o.find(i=>i.id===`${s}-service`||i.id===`${s}-core`||i.id===`${s}-implementation`)||o.find(i=>i.id.startsWith(`${s}-`)&&!i.id.includes("types"));r&&n.push({from:t.id,to:r.id,reason:"content-pattern",explanation:`${t.id} (${t.category}) documents ${r.id}`})}}return n}function Yo(e,n){let t=[];for(let s of e)for(let o of s.explicitDeps){let r=Ho(o,e);if(r&&r.id!==s.id)t.push({from:s.id,to:r.id,reason:"explicit",explanation:`${s.id} explicitly depends on "${o}" (matched ${r.id})`});else if(!r){let i=`Stream '${s.id}': unmatched explicit dep '${o}'`;n?.diagnostics?.unmatchedDeps.push(i),n?.diagnostics?.warnings.push(i)}}return t}function Rt(e){let n=[],t=new Set,s=new Set,o=[];function r(i){t.add(i),s.add(i),o.push(i);let a=e.get(i)||[];for(let c of a)if(!t.has(c))r(c);else if(s.has(c)){let l=o.indexOf(c);if(l!==-1){let u=[...o.slice(l),c];n.push(u)}}o.pop(),s.delete(i)}for(let i of e.keys())t.has(i)||r(i);return n}function Ko(e,n,t){let s=0,o=new Set;for(let r of e){let i=[];for(let f=0;f<r.length-1;f++)i.push({from:r[f],to:r[f+1]});let a=[];for(let f of i){let p=n.find(m=>m.from===f.from&&m.to===f.to&&!o.has(`${m.from}\u2192${m.to}`));p&&a.push(p)}if(a.length===0||!a.every(f=>f.reason==="file-ownership"))continue;let l=a.reduce((f,p)=>{let m=t.get(f.from)?.length??0,h=t.get(p.from)?.length??0;return h<m||h===m&&p.from<f.from?p:f}),u=n.indexOf(l);u!==-1&&n.splice(u,1);let d=t.get(l.from);if(d){let f=d.indexOf(l.to);f!==-1&&d.splice(f,1)}o.add(`${l.from}\u2192${l.to}`),s++}return{broken:s}}function Ft(e,n){let t=[...Yo(e,n),...Bo(e),...qo(e)],s=new Set,o=[];for(let a of t){let c=`${a.from}\u2192${a.to}`;s.has(c)||(s.add(c),o.push(a))}let r=new Map;for(let a of e)r.set(a.id,[]);for(let a of o){let c=r.get(a.from)||[];c.includes(a.to)||c.push(a.to),r.set(a.from,c)}let i=Rt(r);if(i.length>0){let{broken:a}=Ko(i,o,r);a>0&&(i=Rt(r))}return{dependencies:r,edges:o,cycles:i,isAcyclic:i.length===0}}function jt(e){let n=["=== Dependency Analysis ===",""];if(n.push(`Total edges: ${e.edges.length}`),n.push(`Acyclic: ${e.isAcyclic?"Yes \u2713":"No \u26A0\uFE0F"}`),e.cycles.length>0){n.push(""),n.push("--- Cycles Detected ---");for(let t of e.cycles)n.push(` ${t.join(" \u2192 ")}`)}n.push(""),n.push("--- Dependencies by Deliverable ---");for(let[t,s]of e.dependencies)s.length>0&&n.push(`${t}: ${s.join(", ")}`);n.push(""),n.push("--- Edge Details ---");for(let t of e.edges)n.push(`${t.from} \u2192 ${t.to} (${t.reason})`),n.push(` ${t.explanation}`);return n.join(`
132
132
  `)}var At,Dt=y(()=>{"use strict";At=["-types","-migrations","-core","-tests","-docs"]});function Y(e){return new Ne({...Lt,...e})}var Lt,Ne,de=y(()=>{"use strict";Lt={maxOwnsCount:4,maxReadsCount:4,maxDirectories:2,maxPlanConjunctions:4,warnOnMixedActions:!0,warnOnMixedFileTypes:!0,requireVerifyCommands:!0},Ne=class{config;constructor(n=Lt){this.config=n}analyzeStream(n,t){let s=[],o=t.owns||[],r=t.reads||[],i=t.plan||"",a=t.verify||[],c=o.length,l=r.length,u=this.countDirectories(o),d=this.countConjunctions(i),f=a.length,p=this.detectActionTypes(i),m=this.detectFileTypes([...o,...r]),h={ownsCount:c,readsCount:l,directoriesAffected:u,planConjunctions:d,verifyCommands:f,actionTypes:p,fileTypes:m};c>this.config.maxOwnsCount&&u>this.config.maxDirectories?s.push({type:"high_owns_complexity",severity:"error",message:`Stream owns ${c} files across ${u} directories`,details:`Consider splitting into smaller streams. Threshold: ${this.config.maxOwnsCount} files across ${this.config.maxDirectories} directories`,streamName:n}):c>this.config.maxOwnsCount&&s.push({type:"high_owns_count",severity:"warning",message:`Stream owns ${c} files (threshold: ${this.config.maxOwnsCount})`,details:"Consider splitting into smaller, more focused streams",streamName:n}),l>this.config.maxReadsCount&&s.push({type:"high_reads_count",severity:"warning",message:`Stream reads ${l} files (threshold: ${this.config.maxReadsCount})`,details:"Too many dependencies may indicate unclear scope or context bloat",streamName:n}),d>this.config.maxPlanConjunctions&&s.push({type:"compound_plan",severity:"warning",message:`Plan contains ${d} 'and' conjunctions (threshold: ${this.config.maxPlanConjunctions})`,details:"Complex plans with multiple actions should be split into separate streams",streamName:n}),this.config.warnOnMixedActions&&this.hasMixedActions(p)&&s.push({type:"mixed_actions",severity:"warning",message:"Stream mixes structural changes with content changes",details:`Detected actions: ${p.join(", ")}. Consider separating setup/structure from implementation`,streamName:n}),this.hasUnboundedTutorial(i,o)&&s.push({type:"unbounded_tutorial",severity:"error",message:"Stream appears to create tutorial/documentation without specific file ownership",details:"Tutorial or documentation streams must specify exact files in owns[]",streamName:n}),this.config.warnOnMixedFileTypes&&m.size>3&&s.push({type:"mixed_file_types",severity:"info",message:`Stream touches ${m.size} different file types`,details:`File types: ${Array.from(m).join(", ")}. Consider organizing by concern`,streamName:n}),this.config.requireVerifyCommands&&f===0&&c>0&&s.push({type:"no_verify",severity:"warning",message:"Stream has no verify commands",details:"Add verify commands to ensure implementation correctness",streamName:n}),(!i||i.trim().length===0)&&s.push({type:"empty_plan",severity:"error",message:"Stream has no plan description",details:"Every stream must have a clear plan describing what it does",streamName:n}),this.hasVaguePlan(i)&&s.push({type:"vague_plan",severity:"info",message:"Plan may be too vague or generic",details:"Use specific, actionable language describing exact changes",streamName:n});let w=this.calculateQualityScore(s,h);return{streamName:n,qualityScore:w,issues:s,metrics:h}}analyzeStreams(n){let t=[];for(let[r,i]of Object.entries(n))t.push(this.analyzeStream(r,i));let s=this.countIssuesBySeverity(t),o=this.calculateOverallScore(t);return{streams:t,overallScore:o,totalIssues:s}}countDirectories(n){let t=new Set;for(let s of n){let o=s.substring(0,s.lastIndexOf("/"));o?t.add(o):t.add(".")}return t.size}countConjunctions(n){let s=n.toLowerCase().match(/\band\b/g);return s?s.length:0}detectActionTypes(n){let t=n.toLowerCase(),s=[],o=[{type:"create",pattern:/\b(create|add|implement|build)\b/},{type:"update",pattern:/\b(update|modify|change|edit|refactor)\b/},{type:"delete",pattern:/\b(delete|remove)\b/},{type:"configure",pattern:/\b(configure|setup|install)\b/},{type:"test",pattern:/\b(test|verify)\b/},{type:"document",pattern:/\b(document|write|tutorial)\b/}];for(let{type:r,pattern:i}of o)i.test(t)&&s.push(r);return s}detectFileTypes(n){let t=new Set;for(let s of n){let o=s.substring(s.lastIndexOf(".")+1).toLowerCase();o&&o!==s&&t.add(o)}return t}hasMixedActions(n){let t=["create","delete","configure"],s=["update","document"],o=n.some(i=>t.includes(i)),r=n.some(i=>s.includes(i));return o&&r}hasUnboundedTutorial(n,t){let s=n.toLowerCase();return/\b(tutorial|guide|documentation|example)\b/.test(s)&&t.length===0}hasVaguePlan(n){let t=n.toLowerCase(),s=["various","some","multiple","general","misc","other","stuff","things"];for(let o of s)if(t.includes(o))return!0;return n.trim().split(/\s+/).length<5}calculateQualityScore(n,t){let s=100;for(let o of n)switch(o.severity){case"error":s-=20;break;case"warning":s-=10;break;case"info":s-=5;break}return t.verifyCommands>0&&(s+=5),t.ownsCount>0&&t.ownsCount<=3&&(s+=5),t.planConjunctions===0&&(s+=5),Math.max(0,Math.min(100,s))}calculateOverallScore(n){if(n.length===0)return 0;let t=n.reduce((s,o)=>s+o.qualityScore,0);return Math.round(t/n.length)}countIssuesBySeverity(n){let t={errors:0,warnings:0,info:0};for(let s of n)for(let o of s.issues)switch(o.severity){case"error":t.errors++;break;case"warning":t.warnings++;break;case"info":t.info++;break}return t}}});import{createLogger as Vo}from"../logging.js";function Jo(e){let n=new Map,t=[...e.keys()];function s(o,r){let i=new Set,a=[o];for(;a.length>0;){let c=a.shift();if(!i.has(c)){i.add(c);for(let l of e.get(c)??[])l!==r&&!i.has(l)&&a.push(l)}}return i}for(let o of t){let r=e.get(o)??[],i=[];for(let a of r){let c=r.filter(u=>u!==a),l=!1;for(let u of c)if(s(u,o).has(a)){l=!0;break}l||i.push(a)}n.set(o,i)}return n}function Xo(e){let n=new Map,t=new Map;for(let r of e){n.set(r.id,r.deps.length);for(let i of r.deps)t.has(i)||t.set(i,[]),t.get(i).push(r.id);t.has(r.id)||t.set(r.id,[])}let s=e.filter(r=>r.deps.length===0).map(r=>r.id),o=0;for(;s.length>0;){let r=s.shift();o++;for(let i of t.get(r)??[])n.set(i,(n.get(i)??1)-1),n.get(i)===0&&s.push(i)}return o===e.length}function Qo(e){let n=[],t=new Set,s=new Map(e.map(o=>[o.id,[...o.deps]]));for(;s.size>0;){let o=[];for(let[r,i]of s)i.every(a=>t.has(a))&&o.push(r);if(o.length===0)break;for(let r of o)s.delete(r),t.add(r);n.push(o)}return n}function fe(e){let n=[],t=e.reduce((f,p)=>f+p.deps.length,0),s=new Map(e.map(f=>[f.id,[...f.deps]])),o=Jo(s);n.push("transitive-reduction");let r=e.map(f=>({...f,deps:o.get(f.id)??f.deps})),i=r.reduce((f,p)=>f+p.deps.length,0),a=t-i;a>0&&Go.info({edgesRemoved:a,original:t},"transitive_reduction_applied");let c=Qo(r),l=Xo(r),u=Math.max(0,...c.map(f=>f.length)),d=c.length===1?"parallel":u===1?"sequential":"mixed";return{streams:r,waves:c,report:{originalEdgeCount:t,edgesRemoved:a,waveCount:c.length,classification:d,passesApplied:n},isValid:l}}var Go,We=y(()=>{"use strict";Go=Vo("topology-optimizer")});import*as N from"node:fs";import*as T from"node:path";function Nt(e,n){let t=[];if(!n)return{streams:e,warnings:t};let s={},o=new Set;for(let r of Object.values(e))for(let i of r.owns||[])o.add(i);for(let[r,i]of Object.entries(e)){let a=[...i.reads||[]],c=[];for(let l=0;l<a.length;l++){let u=a[l];if(o.has(u))continue;let d=T.join(n,u);if(N.existsSync(d))continue;let f=T.basename(u),p=Zo(n,f);p.matches===1&&p.path?(t.push(`${r}: path_corrected - reads path "${u}" corrected to "${p.path}" (only match found)`),a[l]=p.path):p.matches>1?t.push(`${r}: path_ambiguous - reads path "${u}" not found, ${p.matches} candidates exist`):(t.push(`${r}: path_removed - reads path "${u}" not found on disk, removed from reads`),c.push(l))}for(let l=c.length-1;l>=0;l--)a.splice(c[l],1);s[r]={...i,reads:a}}return{streams:s,warnings:t}}function Zo(e,n){let t=[],s=["src","tests","lib","scripts"];for(let r of s){let i=T.join(e,r);N.existsSync(i)&&Wt(i,n,t)}let o=T.join(e,n);return N.existsSync(o)&&N.statSync(o).isFile()&&t.push(n),t.length===1?{matches:1,path:t[0]}:{matches:t.length}}function Wt(e,n,t,s){let o=s||T.dirname(e);try{let r=N.readdirSync(e,{withFileTypes:!0});for(let i of r){if(i.name==="node_modules"||i.name===".git"||i.name==="dist")continue;let a=T.join(e,i.name);i.isDirectory()?Wt(a,n,t,o):i.name===n&&t.push(T.relative(o,a))}}catch{}}var Ut=y(()=>{"use strict"});import*as qt from"node:fs";import*as Yt from"node:path";function tr(e,n=5,t=4e3){let s=e.description.trim();if(s.split(/\s+/).filter(r=>r.length>0).length<n){let r=nr(e.category),i=e.ownedFiles.join(", ")||"the target files";s=`${r} ${e.name}. ${s}. Target: ${i}`}if(e.codeExamples.length>0){let r=[],i=0;for(let a of e.codeExamples){let c=`\`\`\`${a.language||""}
133
133
  ${a.code}
134
134
  \`\`\``;if(i+c.length>t)break;r.push(c),i+=c.length}r.length>0&&(s+=`
@@ -136,15 +136,15 @@ ${a.code}
136
136
  Reference code:
137
137
  `+r.join(`
138
138
 
139
- `))}return s}function nr(e){switch(e){case"code":return"Implement";case"test":return"Write tests for";case"docs":return"Document";case"tutorial":return"Create tutorial for";case"integration-guide":return"Write integration guide for";case"api-reference":return"Generate API reference for";case"migration":return"Migrate";default:return"Complete"}}function sr(e,n="npm"){let t=[];if(e.ownedFiles.some(o=>o.endsWith(".ts")||o.endsWith(".tsx")||o.endsWith(".js")||o.endsWith(".jsx"))&&t.push(H(n,"build")),e.category==="test"){let o=e.ownedFiles.find(r=>r.includes(".test."));o?t.push(Oe(n,o)):t.push(Oe(n))}return t}function or(e,n,t,s="npm"){let o=[],r=[];for(let i of e){if(n!=="test"&&/vitest|jest/.test(i)&&!/build|tsc/.test(i)){r.push(`Verify command '${i}' uses a test runner but stream category is '${n}'. Replaced with '${H(s,"build")}'.`),o.push(H(s,"build"));continue}let a=i.match(/(?:vitest|jest)\s+(?:run\s+)?(\S+\.(?:ts|tsx|js|jsx))/);if(a){let c=a[1];if(!t.some(u=>c.includes(u)||u.includes(c))){r.push(`Verify command references '${c}' which is not in this stream's owned files. Replaced with '${H(s,"build")}'.`),o.push(H(s,"build"));continue}}o.push(i)}return{commands:[...new Set(o)],warnings:r}}function rr(e,n,t={}){let{minPlanLength:s=5,estimateTimeout:o=!0,defaultVerify:r}=t,i=e,a=t.projectDir?X(t.projectDir):"npm",c=i._verify||r||sr(e,a),l=i._setup,{commands:u,warnings:d}=or(c,e.category,e.ownedFiles,a);if(d.length>0&&t.diagnostics)for(let h of d)t.diagnostics.warnings.push(`${e.id}: verify_warning - ${h}`);let p=(i._verify!==void 0||i._setup!==void 0)&&e.description.length>=s?e.description:tr(e,s),m={name:e.name,deps:n.length>0?n:void 0,owns:e.ownedFiles.length>0?e.ownedFiles:void 0,reads:e.readFiles.length>0?e.readFiles:void 0,plan:p,verify:u.length>0?u:void 0,setup:l&&l.length>0?l:void 0};if(o){let h=er[e.category],w=Math.max(1,Math.ceil(e.ownedFiles.length/2));m.timeoutMs=h*w}return m}function Kt(e,n,t={}){let{validateAntiPatterns:s=!0}=t,o={},r=[],i=[];n.isAcyclic||r.push(`Dependency graph has cycles: ${n.cycles.map(l=>l.join(" \u2192 ")).join("; ")}`);let a=s?Y():null;for(let l of e){let u=n.dependencies.get(l.id)||[],d=rr(l,u,t);if(a){let h=a.analyzeStream(l.id,{name:d.name,deps:d.deps||[],owns:d.owns||[],reads:d.reads||[],plan:d.plan,verify:d.verify||[]});if(h.issues.length>0){i.push(h);for(let w of h.issues)r.push(`${l.id}: ${w.type} - ${w.message}`)}}let f=l.childCount,p=d.plan?.length??0,m=(d.owns||[]).length;if(f!==void 0&&f>=5&&p>2500?r.push(`${l.id}: too_complex - ${f} sub-sections, ${m} owned files, ~${p} char plan. Consider: use YAML stream definitions for manual decomposition, or set deliverable_level: 3`):f!==void 0&&f>=3&&p>3500&&r.push(`${l.id}: too_complex - ${f} sub-sections, ~${p} char plan. Consider: use YAML stream definitions for finer control`),t.projectDir){let h=d.owns||[];for(let w of h)try{let S=Yt.join(t.projectDir,w),$=qt.readFileSync(S,"utf-8").split(`
140
- `).length;if($>800){let v=`${l.id}: large_file_critical - ${w} is ${$} lines (>800). Consider splitting this stream to reduce file scope`;r.push(v),t.diagnostics&&t.diagnostics.warnings.push(v)}else if($>500&&h.length>=3){let v=`${l.id}: large_file_risk - ${w} is ${$} lines, stream owns ${h.length} files. Consider splitting to reduce complexity`;r.push(v),t.diagnostics&&t.diagnostics.warnings.push(v)}}catch{}}if(l.ownedFiles.length===0){let h=`Stream '${l.id}' has no owned files. It can read but not write. If this is unintentional, check your Create:/Modify: syntax (must use backtick-quoted paths).`;r.push(h),t.diagnostics&&t.diagnostics.warnings.push(h)}o[l.id]=d}if(t.projectDir){let l=Nt(o,t.projectDir);r.push(...l.warnings);for(let[u,d]of Object.entries(l.streams))o[u]=d}let c=Object.entries(o).map(([l,u])=>({id:l,owns:u.owns??[],reads:u.reads??[],deps:u.deps??[]}));if(c.length>0){let l=fe(c);t.diagnostics&&(t.diagnostics.topologyReport=l.report);for(let u of l.streams)o[u.id]&&(o[u.id]={...o[u.id],deps:u.deps.length>0?u.deps:void 0});l.report.edgesRemoved>0&&r.push(`Topology optimization: removed ${l.report.edgesRemoved} redundant edge(s)`)}return{streams:o,warnings:r,antiPatterns:s?i:void 0,count:e.length}}function Vt(e){let n=["=== Generated Streams ===",""];if(n.push(`Total: ${e.count} streams`),e.warnings.length>0){n.push(""),n.push("--- Warnings ---");for(let t of e.warnings)n.push(`\u26A0\uFE0F ${t}`)}n.push(""),n.push("--- Stream Definitions ---");for(let[t,s]of Object.entries(e.streams))n.push(""),n.push(`${t}:`),n.push(` name: ${s.name}`),s.deps&&s.deps.length>0&&n.push(` deps: [${s.deps.join(", ")}]`),s.owns&&s.owns.length>0&&n.push(` owns: [${s.owns.join(", ")}]`),s.reads&&s.reads.length>0&&n.push(` reads: [${s.reads.join(", ")}]`),s.plan&&n.push(` plan: ${s.plan.slice(0,80)}${s.plan.length>80?"...":""}`),s.verify&&s.verify.length>0&&n.push(` verify: [${s.verify.join(", ")}]`),s.timeoutMs&&n.push(` timeoutMs: ${s.timeoutMs}`);return n.join(`
139
+ `))}return s}function nr(e){switch(e){case"code":return"Implement";case"test":return"Write tests for";case"docs":return"Document";case"tutorial":return"Create tutorial for";case"integration-guide":return"Write integration guide for";case"api-reference":return"Generate API reference for";case"migration":return"Migrate";default:return"Complete"}}function sr(e,n="npm"){let t=[];if(e.ownedFiles.some(o=>o.endsWith(".ts")||o.endsWith(".tsx")||o.endsWith(".js")||o.endsWith(".jsx"))&&t.push(H(n,"build")),e.category==="test"){let o=e.ownedFiles.find(r=>r.includes(".test."));o?t.push(Oe(n,o)):t.push(Oe(n))}return t}function or(e,n,t,s="npm"){let o=[],r=[];for(let i of e){if(n!=="test"&&/vitest|jest/.test(i)&&!/build|tsc/.test(i)){r.push(`Verify command '${i}' uses a test runner but stream category is '${n}'. Replaced with '${H(s,"build")}'.`),o.push(H(s,"build"));continue}let a=i.match(/(?:vitest|jest)\s+(?:run\s+)?(\S+\.(?:ts|tsx|js|jsx))/);if(a){let c=a[1];if(!t.some(u=>c.includes(u)||u.includes(c))){r.push(`Verify command references '${c}' which is not in this stream's owned files. Replaced with '${H(s,"build")}'.`),o.push(H(s,"build"));continue}}o.push(i)}return{commands:[...new Set(o)],warnings:r}}function rr(e,n,t={}){let{minPlanLength:s=5,estimateTimeout:o=!0,defaultVerify:r}=t,i=e,a=t.projectDir?X(t.projectDir):"npm",c=i._verify||r||sr(e,a),l=i._setup,{commands:u,warnings:d}=or(c,e.category,e.ownedFiles,a);if(d.length>0&&t.diagnostics)for(let h of d)t.diagnostics.warnings.push(`${e.id}: verify_warning - ${h}`);let p=(i._verify!==void 0||i._setup!==void 0)&&e.description.length>=s?e.description:tr(e,s),m={name:e.name,deps:n.length>0?n:void 0,owns:e.ownedFiles.length>0?e.ownedFiles:void 0,reads:e.readFiles.length>0?e.readFiles:void 0,plan:p,verify:u.length>0?u:void 0,setup:l&&l.length>0?l:void 0};if(o){let h=er[e.category],w=Math.max(1,Math.ceil(e.ownedFiles.length/2));m.timeoutMs=h*w}return m}function Kt(e,n,t={}){let{validateAntiPatterns:s=!0}=t,o={},r=[],i=[];n.isAcyclic||r.push(`Dependency graph has cycles: ${n.cycles.map(l=>l.join(" \u2192 ")).join("; ")}`);let a=s?Y():null;for(let l of e){let u=n.dependencies.get(l.id)||[],d=rr(l,u,t);if(a){let h=a.analyzeStream(l.id,{name:d.name,deps:d.deps||[],owns:d.owns||[],reads:d.reads||[],plan:d.plan,verify:d.verify||[]});if(h.issues.length>0){i.push(h);for(let w of h.issues)r.push(`${l.id}: ${w.type} - ${w.message}`)}}let f=l.childCount,p=d.plan?.length??0,m=(d.owns||[]).length;if(f!==void 0&&f>=5&&p>2500?r.push(`${l.id}: too_complex - ${f} sub-sections, ${m} owned files, ~${p} char plan. Consider: use YAML stream definitions for manual decomposition, or set deliverable_level: 3`):f!==void 0&&f>=3&&p>3500&&r.push(`${l.id}: too_complex - ${f} sub-sections, ~${p} char plan. Consider: use YAML stream definitions for finer control`),t.projectDir){let h=d.owns||[];for(let w of h)try{let S=Yt.join(t.projectDir,w),k=qt.readFileSync(S,"utf-8").split(`
140
+ `).length;if(k>800){let v=`${l.id}: large_file_critical - ${w} is ${k} lines (>800). Consider splitting this stream to reduce file scope`;r.push(v),t.diagnostics&&t.diagnostics.warnings.push(v)}else if(k>500&&h.length>=3){let v=`${l.id}: large_file_risk - ${w} is ${k} lines, stream owns ${h.length} files. Consider splitting to reduce complexity`;r.push(v),t.diagnostics&&t.diagnostics.warnings.push(v)}}catch{}}if(l.ownedFiles.length===0){let h=`Stream '${l.id}' has no owned files. It can read but not write. If this is unintentional, check your Create:/Modify: syntax (must use backtick-quoted paths).`;r.push(h),t.diagnostics&&t.diagnostics.warnings.push(h)}o[l.id]=d}if(t.projectDir){let l=Nt(o,t.projectDir);r.push(...l.warnings);for(let[u,d]of Object.entries(l.streams))o[u]=d}let c=Object.entries(o).map(([l,u])=>({id:l,owns:u.owns??[],reads:u.reads??[],deps:u.deps??[]}));if(c.length>0){let l=fe(c);t.diagnostics&&(t.diagnostics.topologyReport=l.report);for(let u of l.streams)o[u.id]&&(o[u.id]={...o[u.id],deps:u.deps.length>0?u.deps:void 0});l.report.edgesRemoved>0&&r.push(`Topology optimization: removed ${l.report.edgesRemoved} redundant edge(s)`)}return{streams:o,warnings:r,antiPatterns:s?i:void 0,count:e.length}}function Vt(e){let n=["=== Generated Streams ===",""];if(n.push(`Total: ${e.count} streams`),e.warnings.length>0){n.push(""),n.push("--- Warnings ---");for(let t of e.warnings)n.push(`\u26A0\uFE0F ${t}`)}n.push(""),n.push("--- Stream Definitions ---");for(let[t,s]of Object.entries(e.streams))n.push(""),n.push(`${t}:`),n.push(` name: ${s.name}`),s.deps&&s.deps.length>0&&n.push(` deps: [${s.deps.join(", ")}]`),s.owns&&s.owns.length>0&&n.push(` owns: [${s.owns.join(", ")}]`),s.reads&&s.reads.length>0&&n.push(` reads: [${s.reads.join(", ")}]`),s.plan&&n.push(` plan: ${s.plan.slice(0,80)}${s.plan.length>80?"...":""}`),s.verify&&s.verify.length>0&&n.push(` verify: [${s.verify.join(", ")}]`),s.timeoutMs&&n.push(` timeoutMs: ${s.timeoutMs}`);return n.join(`
141
141
  `)}function Gt(e){return e.streams}function Bt(e){let n=e.replace(/^\s*[-*]\s*/,"").trim();return n=n.replace(/\s*\(.*?\)\s*$/,"").trim(),n=n.replace(/[`"']/g,"").trim(),/^@?[a-z0-9][\w./-]*$/i.test(n)?n:null}function Jt(e,n="npm"){let t=new Set;for(let s of Object.values(e)){let o=s.plan??"",r;for(Ht.lastIndex=0;(r=Ht.exec(o))!==null;){let i=r[1].split(/\s+/).filter(a=>a&&!a.startsWith("-"));for(let a of i){let c=Bt(a);c&&t.add(c)}}for(zt.lastIndex=0;(r=zt.exec(o))!==null;){let i=r[1].split(`
142
- `);for(let a of i){let c=Bt(a);c&&t.add(c)}}}return t.size===0?[]:[ct(n,[...t])]}var er,Ht,zt,Xt=y(()=>{"use strict";de();We();Ut();Te();er={code:12e4,test:9e4,docs:6e4,tutorial:9e4,"integration-guide":9e4,"api-reference":6e4,migration:18e4,other:12e4};Ht=/(?:npm\s+install|pnpm\s+add|yarn\s+add|pip\s+install|bun\s+add)\s+(.+)/gi,zt=/install\s+(?:dependencies|packages)\s*:\s*\n((?:\s+[-*]\s+.+\n?)+)/gi});import{z as k}from"zod";import{ContextBudgetSchema as ir,StreamStatusSchema as ar}from"../types.js";function tn(e,n){let t=[],s={};for(let[i,a]of Object.entries(e)){if(i.length===0||i.length>en){t.push({streamName:i,field:"",message:`stream ID must be 1-${en} chars`});continue}if(!Zt.test(i)){t.push({streamName:i,field:"",message:`stream ID "${i}" must match ${Zt} (alphanumeric + _ -)`});continue}let c=Ue.safeParse(a);if(!c.success){for(let l of c.error.issues)t.push({streamName:i,field:l.path.join("."),message:l.message});continue}s[i]=c.data}if(t.length>0)return{ok:!1,errors:t};let o=new Map;for(let[i,a]of Object.entries(s))for(let c of a.owns){let l=o.get(c);l&&l!==i?t.push({streamName:i,field:"owns",message:`file "${c}" already owned by stream "${l}"`}):o.set(c,i)}for(let[i,a]of Object.entries(s)){for(let c of a.reads)a.owns.includes(c)&&t.push({streamName:i,field:"reads",message:`stream reads its own owned file "${c}"`});a.deps.includes(i)&&t.push({streamName:i,field:"deps",message:"stream cannot depend on itself"});for(let c of a.deps)s[c]||t.push({streamName:i,field:"deps",message:`dependency "${c}" is not a defined stream`})}let r=cr(s);for(let i of r)t.push({streamName:i[0],field:"deps",message:`circular dependency: ${i.join(" \u2192 ")}`});return t.length>0?{ok:!1,errors:t}:{ok:!0,streams:s}}function cr(e){let n=[],t=new Set,s=new Set,o=new Set;function r(i,a){if(o.has(i)){let c=a.indexOf(i),l=a.slice(c).concat(i),u=lr(l);t.has(u)||(t.add(u),n.push(l));return}if(!s.has(i)){s.add(i),o.add(i);for(let c of e[i]?.deps??[])r(c,[...a,i]);o.delete(i)}}for(let i of Object.keys(e))r(i,[]);return n}function lr(e){let n=e.slice(0,-1);if(n.length===0)return"";let t=n.reduce((o,r,i)=>r<n[o]?i:o,0);return[...n.slice(t),...n.slice(0,t)].join("\u2192")}function nn(e){return e.map(n=>` ${n.field?`${n.streamName}.${n.field}`:n.streamName}: ${n.message}`).join(`
143
- `)}var Qt,Zt,en,Ue,sn=y(()=>{"use strict";Qt=k.string().min(1,"file path must not be empty").refine(e=>!e.startsWith("/"),"file path must be relative (no leading /)").refine(e=>!e.endsWith("/"),"file path must not be a directory (trailing /)").refine(e=>!e.split("/").includes(".."),"file path must not contain path traversal (..)").refine(e=>!e.includes("*")&&!e.includes("?")&&!e.includes("["),"glob characters (* ? [) are not allowed in file paths"),Zt=/^[a-zA-Z0-9_-]+$/,en=100,Ue=k.object({name:k.string().min(1,"stream name required").max(200),deps:k.array(k.string()).optional().default([]),owns:k.array(Qt).optional().default([]),reads:k.array(Qt).optional().default([]),plan:k.string().optional(),setup:k.array(k.string().max(1024)).max(20).optional().default([]),verify:k.array(k.string().max(1024)).max(20).optional().default([]),status:ar.optional().default("pending"),error:k.string().optional(),attempts:k.number().optional().default(0),parentStreamId:k.string().optional(),appliedAt:k.string().optional(),timeoutMs:k.number().optional(),contextBudget:ir.optional(),estimatedTokens:k.number().optional(),provider:k.string().optional(),suggestedProvider:k.string().optional(),model:k.string().optional()}).strict()});var on={};ie(on,{autoFixSequentialEdits:()=>He,detectSequentialEdits:()=>pe});function pe(e){let n=new Map;for(let[r,i]of Object.entries(e))for(let a of i.owns??[]){let c=n.get(a)??[];c.push(r),n.set(a,c)}let t=new Map;function s(r,i=new Set){if(t.has(r))return t.get(r);if(i.has(r))return new Set;i.add(r);let a=e[r]?.deps??[],c=new Set(a);for(let l of a)for(let u of s(l,i))c.add(u);return t.set(r,c),c}for(let r of Object.keys(e))s(r);let o=[];for(let[r,i]of n){if(i.length<2)continue;let a=[];for(let c=0;c<i.length;c++){let l=!1;for(let u=0;u<i.length;u++){if(c===u)continue;let d=t.get(i[c])??new Set,f=t.get(i[u])??new Set;if(d.has(i[u])||f.has(i[c])){l=!0;break}}l||a.push(i[c])}a.length>=2&&o.push({file:r,streams:a,suggestion:`${r} is modified by ${a.join(" and ")} in the same wave. Split into separate waves by adding a dependency edge, or merge into one stream.`})}return o}function He(e){let n=pe(e),t=0,s=[];for(let o of n)for(let r=1;r<o.streams.length;r++){let i=e[o.streams[r]],a=o.streams[r-1],c=i.deps??[];c.includes(a)||(c.push(a),i.deps=c,t++,s.push(`Added dep: ${o.streams[r]} \u2192 ${a} (shared file: ${o.file})`))}return{edgesAdded:t,fixes:s}}var ze=y(()=>{"use strict"});var an={};ie(an,{calculateWaves:()=>dr,findCurrentWave:()=>fr});import{existsSync as ur}from"fs";import*as rn from"path";function dr(e,n){let t=[],s=[],o=[],r=new Set,i=new Set,a=new Map;for(let[u,d]of Object.entries(e.streams))d.status==="complete"||d.status==="skipped"?r.add(u):d.status==="failed"||d.status==="blocked"?i.add(u):a.set(u,d.deps);let c=1,l=a.size+1;for(let u=0;u<l&&a.size>0;u++){let d=!0;for(;d;){d=!1;let m=[];for(let[h,w]of a){let S=w.filter(b=>i.has(b));if(S.length>0)if(!(n?S.every($=>{let v=e.streams[$];return!v?.owns||v.owns.length===0?!1:v.owns.every(g=>{try{return ur(rn.resolve(n,g))}catch{return!1}})}):!1))m.push(h);else for(let $ of S)r.has($)||r.add($)}for(let h of m){o.push(h),i.add(h),a.delete(h),d=!0;let S=e.streams[h].deps.filter(b=>i.has(b));t.push(`Stream '${h}' blocked: ${S.length===1?`dependency '${S[0]}' failed`:`dependencies '${S.join("', '")}' failed`}`)}}let f=[];for(let[m,h]of a)h.every(S=>r.has(S)||!e.streams[S])&&f.push(m);if(f.length===0&&a.size>0){let m=Array.from(a.keys()).join(", ");t.push(`Circular dependency detected among streams: ${m}`);break}if(f.length===0)break;let p=f.map(m=>({id:m,...e.streams[m]}));s.push({number:c,streams:p});for(let m of f)r.add(m),a.delete(m);c++}return{waves:s,errors:t,blocked:o}}function fr(e,n){for(let t of e)if(t.streams.some(s=>!n.has(s.id)))return t;return null}var cn=y(()=>{"use strict"});import*as z from"fs/promises";import*as Be from"path";import*as ln from"os";function un(){return process.env.ORCHEX_CONFIG_DIR??Be.join(ln.homedir(),".orchex")}function dn(){return Be.join(un(),mr)}async function hr(e){let n=un();await z.mkdir(n,{recursive:!0}),await z.writeFile(dn(),JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}async function fn(){try{let e=await z.readFile(dn(),"utf-8"),n=JSON.parse(e);return Date.now()-new Date(n.fetchedAt).getTime()>pr?null:n}catch{return null}}async function pn(e){try{let n=await fetch(`${e}/api/v1/models`,{signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let s={providers:(await n.json()).providers,fetchedAt:new Date().toISOString()};return await hr(s),s}catch{return null}}var pr,mr,mn=y(()=>{"use strict";pr=1440*60*1e3,mr="models.json"});import{z as E}from"zod";var qe,Ui,hn=y(()=>{"use strict";qe=E.enum(["free","pro","team","enterprise"]),Ui=E.object({id:qe,name:E.string(),price:E.number().describe("Monthly price in USD, -1 = contact sales"),cloudOrchestrations:E.number().describe("Max cloud orchestrations per month, 0 = local only, -1 = unlimited"),maxParallelAgents:E.number().describe("Max parallel agents"),selfHealing:E.enum(["none","full"]),smartPlanning:E.enum(["none","full"]),teamMembers:E.number().describe("Max team members, 1 = solo, -1 = unlimited"),maxWaves:E.number().describe("Max dependency waves allowed. -1 = unlimited"),maxProviders:E.number().describe("Max LLM providers allowed per orchestration. -1 = unlimited"),maxApiTokens:E.number().describe("Max API tokens per user. -1 = unlimited")})});import me from"pino";function he(e){return wr.child({module:e})}var gr,wr,Ye=y(()=>{"use strict";gr=["password","hashedPassword","hashed_password","token","resetToken","sessionId","apiKey","api_key","masterKey","master_key","clientSecret","client_secret","databaseUrl","database_url","webhookSecret","webhook_secret","secretKey","secret_key","encryptionKey","encryption_key","req.headers.authorization","req.headers.cookie"],wr=me({level:process.env.LOG_LEVEL||"info",redact:gr,serializers:{err:me.stdSerializers.err,req:me.stdSerializers.req,res:me.stdSerializers.res},transport:process.env.LOG_PRETTY==="1"?{target:"pino-pretty",options:{colorize:!0}}:void 0})});import*as Ke from"fs/promises";import*as yr from"path";import{z as _}from"zod";function gn(e){switch(e){case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"gemini":return process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY;case"deepseek":return process.env.DEEPSEEK_API_KEY;case"bedrock":return;case"ollama":return}}var Vi,xr,vr,wn,Sr,Gi,yn=y(()=>{"use strict";hn();Ye();Vi=he("config"),xr="https://orchex.dev",vr=_.enum(["anthropic","openai","gemini","ollama","deepseek","bedrock"]);wn={anthropic:"claude-sonnet-4-5-20250929",openai:"gpt-4.1",gemini:"gemini-2.0-flash",deepseek:"deepseek-coder",bedrock:"claude-3.5-sonnet",ollama:"llama3.3:70b"},Sr=_.object({enabled:_.boolean().default(!1),endpoint:_.string().url().optional()}),Gi=_.object({mode:_.enum(["local","cloud"]).default("local"),apiUrl:_.string().url().refine(e=>e.startsWith("https://")||e.startsWith("http://localhost")||e.startsWith("http://127.0.0.1"),{message:"apiUrl must use https:// (http://localhost and http://127.0.0.1 are allowed for development)"}).default(xr),apiKey:_.string().optional(),tier:qe.default("free"),provider:vr.optional(),model:_.string().optional(),trialRunsRemaining:_.number().optional(),accountCreatedAt:_.string().optional(),telemetry:Sr.default({enabled:!1})})});var xn={};ie(xn,{MODEL_FALLBACKS:()=>Ge,isProviderAvailable:()=>br,resolveModel:()=>kr});async function $r(){let e=process.env.OLLAMA_BASE_URL??process.env.OLLAMA_HOST??"http://localhost:11434";try{let n=await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(3e3)});return n.ok?(await n.json()).models.map(s=>s.name):[]}catch{return[]}}async function kr(e,n,t){if(e==="ollama"){let i=await $r();if(i.length>0){if(i.includes(n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let a=i.find(c=>c.startsWith(n)||n.startsWith(c.split(":")[0]));return a?{originalModel:n,resolvedModel:a,wasFallback:!0,reason:`Partial match: ${a}`}:{originalModel:n,resolvedModel:i[0],wasFallback:!0,reason:`${n} not installed, using ${i[0]}`}}}let s=await fn();if(!s&&t&&(s=await pn(t)),s?.providers[e]){let i=s.providers[e];if(i.some(l=>l.modelId===n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let c=Ge[e]??[];for(let l of c)if(i.some(u=>u.modelId===l))return Ve.warn({provider:e,original:n,fallback:l},"model_fallback"),{originalModel:n,resolvedModel:l,wasFallback:!0,reason:`${n} not found in ${e} model registry, using ${l}`};if(i.length>0){let l=i[0].modelId;return Ve.warn({provider:e,original:n,fallback:l},"model_fallback_registry_first"),{originalModel:n,resolvedModel:l,wasFallback:!0,reason:`${n} not found, using first available: ${l}`}}}let o=Ge[e]??[];if(o.includes(n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let r=o[0]??wn[e]??n;return r!==n?(Ve.warn({provider:e,original:n,fallback:r},"model_fallback_static"),{originalModel:n,resolvedModel:r,wasFallback:!0,reason:`Offline \u2014 ${n} unverified, using safe default ${r}`}):{originalModel:n,resolvedModel:n,wasFallback:!1}}function br(e){return e==="ollama"||e==="bedrock"?!0:!!gn(e)}var Ve,Ge,vn=y(()=>{"use strict";mn();yn();Ye();Ve=he("model-validator"),Ge={anthropic:["claude-sonnet-4-5-20250929","claude-3-5-sonnet-20241022","claude-3-haiku-20240307"],openai:["gpt-4.1","gpt-4o","gpt-4o-mini","gpt-3.5-turbo"],gemini:["gemini-2.5-pro","gemini-2.0-flash","gemini-1.5-flash"],deepseek:["deepseek-chat","deepseek-coder"],bedrock:["claude-3.5-sonnet","claude-3-haiku"],ollama:["llama3.3:70b","llama3.2:latest"]}});function Je(e,n,t,s,o){let r=new Set;for(let d of Object.values(e))for(let f of d.owns??[])r.add(f);let i=0;if(o)for(let d of Object.values(o))d.estimatedCostUsd&&(i+=d.estimatedCostUsd);let a=n.map(d=>({number:d.number,streams:d.streams.map(f=>{let p=e[f],m=o?.[f];return{id:f,name:p?.name??f,owns:p?.owns??[],reads:p?.reads??[],deps:p?.deps??[],provider:m?.provider,model:m?.model,estimatedCostUsd:m?.estimatedCostUsd,modelFallback:m?.fallback}})})),c=[...t];if(s)for(let d of s)c.push(`Sequential edit conflict: ${d.suggestion}`);if(o)for(let[d,f]of Object.entries(o))f.fallback&&c.push(`${d}: ${f.fallback}`);let l=100;c.length>0&&(l-=c.length*5);let u=Object.values(e).filter(d=>!d.owns||d.owns.length===0).length;return l-=u*10,l=Math.max(0,Math.min(100,l)),{summary:{streamCount:Object.keys(e).length,waveCount:n.length,fileCount:r.size,estimatedCostUsd:i>0?i:void 0},waves:a,warnings:c,qualityScore:l}}function Cr(e){return!e||e===0?"":e<.01?" ~< $0.01":` ~$${e.toFixed(2)}`}function Sn(e){let n=[],t=e.summary.estimatedCostUsd?`, est. ~$${e.summary.estimatedCostUsd.toFixed(2)}`:"";n.push(`Plan Preview: ${e.summary.streamCount} streams, ${e.summary.waveCount} waves, ${e.summary.fileCount} files${t}`),n.push(`Quality Score: ${e.qualityScore}/100`),n.push("");for(let s of e.waves){n.push(`Wave ${s.number}:`);for(let o of s.streams){let r=o.deps.length>0?` (deps: ${o.deps.join(", ")})`:"",i=o.model?` (${o.model})`:"",a=Cr(o.estimatedCostUsd);n.push(` ${o.id}: ${o.name}${i}${a}${r}`),o.owns.length>0&&n.push(` owns: ${o.owns.join(", ")}`),o.reads.length>0&&n.push(` reads: ${o.reads.join(", ")}`)}n.push("")}if(e.warnings.length>0){n.push("Warnings:");for(let s of e.warnings)n.push(` - ${s}`);n.push("")}return n.join(`
144
- `)}async function $n(e){let{generatePlan:n,parsePlanDocument:t,extractDeliverables:s,processDeliverables:o,buildDependencyGraph:r,generateStreams:i,toInitFormat:a,createDiagnostics:c,estimatePlannedCost:l}=await Promise.resolve().then(()=>(Cn(),bn)),{detectSequentialEdits:u}=await Promise.resolve().then(()=>(ze(),on)),{calculateWaves:d}=await Promise.resolve().then(()=>(cn(),an)),{resolveModel:f}=await Promise.resolve().then(()=>(vn(),xn)),{DEFAULT_MODELS:p}=await import("../config.js"),m=e.planMarkdown,h={input:0,output:0};if(!m){let F=await n(e.intent,e.projectDir,e.executor,{model:e.model,provider:e.provider,maxStreams:e.maxStreams});m=F.planMarkdown,h=F.tokensUsed}let w=c(),S=t(m),b=s(S,{diagnostics:w}),$=o(b);if($.length===0)throw new Error("Plan generated no deliverables. Try a more specific intent.");let v=r($,{diagnostics:w}),g=i($,v,{validateAntiPatterns:!0,projectDir:e.projectDir,diagnostics:w}),x=u(g.streams),U=a(g),D=Object.fromEntries(Object.entries(U).map(([F,O])=>[F,{name:O.name,deps:O.deps||[],owns:O.owns||[],reads:O.reads||[],setup:[],plan:O.plan,verify:O.verify||[],status:"pending",attempts:0}])),{waves:R}=d({feature:S.title,streams:D,status:"pending",created:new Date().toISOString()}),Bs=R.map(F=>({number:F.number,streams:F.streams.map(O=>O.id)})),qs=[...g.warnings,...w.warnings],Ee={};for(let[F,O]of Object.entries(U)){let Pe=O.suggestedProvider??e.provider,Ks=p[Pe]??e.model,J=await f(Pe,Ks??"",e.modelApiUrl),Vs=(O.owns??[]).length*100,Gs=l(Vs*4,J.resolvedModel);Ee[F]={provider:Pe,model:J.resolvedModel,estimatedCostUsd:Gs.finalCost,fallback:J.wasFallback?`${J.originalModel} \u2192 ${J.resolvedModel}`:void 0}}let Ys=Je(U,Bs,qs,x,Ee);return{planMarkdown:m,preview:Ys,initStreams:U,waves:R,sequentialDiagnostics:x,modelDecisions:Ee,tokensUsed:h}}var kn=y(()=>{"use strict"});function En(){return{yamlBlocksFound:0,yamlBlocksParsed:0,yamlParseErrors:[],extractionPath:null,sectionsFound:{},sectionsFilteredAsMeta:[],deliverableCount:0,splitCount:0,unmatchedDeps:[],ownershipConflicts:[],warnings:[]}}function Pn(e){let n=new Map;for(let[s,o]of Object.entries(e))for(let r of o.owns||[]){let i=n.get(r)||[];i.push(s),n.set(r,i)}let t=[];for(let[s,o]of n)o.length>1&&t.push(`${s} owned by: ${o.join(", ")}`);return t}var On=y(()=>{"use strict"});function ge(e,n){for(let{pattern:s,category:o,retryable:r,selfHealable:i,suggestion:a}of Er)if(s.test(e))return{category:o,retryable:r,selfHealable:i,suggestion:a};let t=n==="artifact"||n==="verify";return{category:"unknown",retryable:t,selfHealable:t,suggestion:t?"Unknown code error. Retry with the full error message included in the prompt.":`Unknown infrastructure error (origin: ${n??"unspecified"}). Check API key, model availability, and network connectivity.`}}var Er,Xe=y(()=>{"use strict";Er=[{pattern:/model.*not.found|not_found_error.*model|Model ".*" not found/i,category:"model_not_found",retryable:!1,selfHealable:!1,suggestion:"Model not found. Check the model name in your configuration and ensure it is available for your API key."},{pattern:/invalid api key|api key.*expired|authentication failed|(?<!\d)401(?!\d)|unauthorized/i,category:"auth_error",retryable:!1,selfHealable:!1,suggestion:"Authentication error. Check your API key configuration and ensure it is valid and not expired."},{pattern:/cloud api error: 5\d{2}|502 bad gateway|503 service unavailable|504 gateway timeout|internal server error|overloaded_error/i,category:"server_error",retryable:!0,selfHealable:!1,suggestion:"Cloud server error. Transport retries exhausted \u2014 try again later or switch to local mode."},{pattern:/timed?\s*out|ETIMEDOUT|deadline|timeout/i,category:"timeout",retryable:!1,selfHealable:!1,suggestion:"Timeout is an infrastructure issue. Consider increasing stream timeout or reducing scope."},{pattern:/network error|ECONNREFUSED|ECONNRESET|EHOSTUNREACH|socket hang up/i,category:"network",retryable:!1,selfHealable:!1,suggestion:"Network connectivity issue. Check API endpoint availability and network configuration."},{pattern:/rate limit|too many requests|429|quota exceeded/i,category:"rate_limit",retryable:!1,selfHealable:!1,suggestion:"Rate limited by API. Wait before retrying or reduce parallel stream count."},{pattern:/old_?content.*not found|edit.*mismatch|does not match|oldContent/i,category:"edit_mismatch",retryable:!0,selfHealable:!0,suggestion:"The file content changed since context was built. Re-read the file and retry with updated content."},{pattern:/invalid.*artifact|parse.*error|orchex-artifact.*not found|JSON\.parse/i,category:"invalid_artifact",retryable:!0,selfHealable:!0,suggestion:"The agent produced malformed output. Retry with clearer instructions about the artifact format."},{pattern:/ENOENT|EACCES|EPERM|ENOSPC|no such file|permission denied/i,category:"environment",retryable:!1,selfHealable:!1,suggestion:"File system error. Check file paths and permissions."},{pattern:/ownership violation|outside owned files|SECURITY.*path traversal|SECURITY.*absolute path/i,category:"ownership_violation",retryable:!0,selfHealable:!0,suggestion:"File operation attempted outside owned files. The fix stream should only modify files in the owns list, or the owns list should be updated to include the new file."},{pattern:/test.*fail|expect.*received|assertion.*error|FAIL\s+tests\//i,category:"test_failure",retryable:!0,selfHealable:!0,suggestion:"Tests are failing. Include the test error output in the retry prompt so the agent can fix the issue."},{pattern:/lint|eslint|prettier|formatting/i,category:"lint_error",retryable:!0,selfHealable:!0,suggestion:"Lint or formatting error. Include the lint output in the retry prompt."},{pattern:/TypeError|ReferenceError|SyntaxError|Cannot find module|cannot find name|TS\d{4}/i,category:"runtime_error",retryable:!0,selfHealable:!0,suggestion:"Code has type or runtime errors. Include the error output and relevant type definitions in the retry prompt."}]});import{loadManifest as Tn,saveManifest as _n}from"../manifest.js";import{createLogger as Pr}from"../logging.js";async function Mn(e){let n=await Tn(e),t={skipped:[],warnings:[]},s=Object.entries(n.streams).filter(([o,r])=>r.parentStreamId!==void 0);for(let[o,r]of s)r.status==="pending"&&Or(n,r.parentStreamId)&&(n.streams[o].status="skipped",n.streams[o].error="Parent stream completed; fix no longer needed",t.skipped.push(o));return t.skipped.length>0&&await _n(e,n),t}async function In(e,n){let t=await Tn(e),s={skipped:[],warnings:[]},o=Tr(t,n);for(let a of o){let c=t.streams[a];c.status==="pending"?(t.streams[a].status="skipped",t.streams[a].error=`Ancestor '${n}' completed; fix no longer needed`,s.skipped.push(a)):c.status==="in_progress"&&(t.streams[a].status="skipped",t.streams[a].error=`Sibling fix already resolved this stream (completed: '${n}')`,s.skipped.push(a))}let r=!1,i=t.streams[n];if(i?.parentStreamId){let a=i.parentStreamId;for(;t.streams[a]?.parentStreamId;)a=t.streams[a].parentStreamId;let c=t.streams[a];c&&c.status==="failed"&&(t.streams[a].status="complete",delete t.streams[a].error,r=!0,Qe.info({fixStreamId:n,rootStreamId:a},"fix_stream_propagated_completion_to_root"))}return(s.skipped.length>0||r)&&await _n(e,t),s}function ne(e,n){let t=e.streams[n];if(!t||!t.parentStreamId)return null;let s=[n],o=t.parentStreamId,r=new Set;for(;o&&!r.has(o);){r.add(o);let i=e.streams[o];if(!i)break;if(s.unshift(o),!i.parentStreamId)return{rootStreamId:o,fixChain:s.slice(1),rootStatus:i.status??"pending"};o=i.parentStreamId}return null}function An(e,n){return e.streams[n]?.parentStreamId!==void 0}function Rn(e,n){return ne(e,n)?.rootStreamId??n}function Or(e,n){let t=n,s=new Set;for(;t;){if(s.has(t)){Qe.warn({streamId:t},"circular_reference_in_fix_chain");break}s.add(t);let o=e.streams[t];if(!o){Qe.warn({parentId:t},"fix_stream_orphaned_parent");break}if(o.status==="complete")return!0;t=o.parentStreamId}return!1}function Tr(e,n){let t=[];for(let[s,o]of Object.entries(e.streams))o.parentStreamId&&_r(e,s,n)&&t.push(s);return t}function _r(e,n,t){let s=e.streams[n]?.parentStreamId,o=new Set;for(;s&&!o.has(s);){if(o.add(s),s===t)return!0;s=e.streams[s]?.parentStreamId}return!1}var Qe,Ze=y(()=>{"use strict";Qe=Pr("fix-stream-manager")});import{existsSync as Mr,statSync as Ir}from"node:fs";import*as jn from"node:path";function Ln(e,n){if(!e||e.length===0)return"";let t=[],s=[];for(let r of e)try{let i=jn.resolve(n,r);Mr(i)&&Ir(i).isFile()?t.push(r):s.push(r)}catch{}if(t.length===0&&s.length===0)return"";let o=["","### Disk State (for files you own)"];if(t.length>0){o.push(""),o.push("The following files currently exist on disk from a previous attempt:");for(let r of t)o.push(`- ${r}`)}if(s.length>0){o.push(""),o.push("The following files do NOT exist on disk:");for(let r of s)o.push(`- ${r}`)}return o.push(""),o.push('IMPORTANT: For files that already exist, use operation type `edit` or `replace`, NEVER `create`. Using `create` on an existing file will fail with "Conflicts detected" and this fix attempt will be wasted.'),s.length>0&&o.push("For files that do NOT exist, use `create`."),o.join(`
142
+ `);for(let a of i){let c=Bt(a);c&&t.add(c)}}}return t.size===0?[]:[ct(n,[...t])]}var er,Ht,zt,Xt=y(()=>{"use strict";de();We();Ut();Te();er={code:12e4,test:9e4,docs:6e4,tutorial:9e4,"integration-guide":9e4,"api-reference":6e4,migration:18e4,other:12e4};Ht=/(?:npm\s+install|pnpm\s+add|yarn\s+add|pip\s+install|bun\s+add)\s+(.+)/gi,zt=/install\s+(?:dependencies|packages)\s*:\s*\n((?:\s+[-*]\s+.+\n?)+)/gi});import{z as $}from"zod";import{ContextBudgetSchema as ir,StreamStatusSchema as ar}from"../types.js";function tn(e,n){let t=[],s={};for(let[i,a]of Object.entries(e)){if(i.length===0||i.length>en){t.push({streamName:i,field:"",message:`stream ID must be 1-${en} chars`});continue}if(!Zt.test(i)){t.push({streamName:i,field:"",message:`stream ID "${i}" must match ${Zt} (alphanumeric + _ -)`});continue}let c=Ue.safeParse(a);if(!c.success){for(let l of c.error.issues)t.push({streamName:i,field:l.path.join("."),message:l.message});continue}s[i]=c.data}if(t.length>0)return{ok:!1,errors:t};let o=new Map;for(let[i,a]of Object.entries(s))for(let c of a.owns){let l=o.get(c);l&&l!==i?t.push({streamName:i,field:"owns",message:`file "${c}" already owned by stream "${l}"`}):o.set(c,i)}for(let[i,a]of Object.entries(s)){for(let c of a.reads)a.owns.includes(c)&&t.push({streamName:i,field:"reads",message:`stream reads its own owned file "${c}"`});a.deps.includes(i)&&t.push({streamName:i,field:"deps",message:"stream cannot depend on itself"});for(let c of a.deps)s[c]||t.push({streamName:i,field:"deps",message:`dependency "${c}" is not a defined stream`})}let r=cr(s);for(let i of r)t.push({streamName:i[0],field:"deps",message:`circular dependency: ${i.join(" \u2192 ")}`});return t.length>0?{ok:!1,errors:t}:{ok:!0,streams:s}}function cr(e){let n=[],t=new Set,s=new Set,o=new Set;function r(i,a){if(o.has(i)){let c=a.indexOf(i),l=a.slice(c).concat(i),u=lr(l);t.has(u)||(t.add(u),n.push(l));return}if(!s.has(i)){s.add(i),o.add(i);for(let c of e[i]?.deps??[])r(c,[...a,i]);o.delete(i)}}for(let i of Object.keys(e))r(i,[]);return n}function lr(e){let n=e.slice(0,-1);if(n.length===0)return"";let t=n.reduce((o,r,i)=>r<n[o]?i:o,0);return[...n.slice(t),...n.slice(0,t)].join("\u2192")}function nn(e){return e.map(n=>` ${n.field?`${n.streamName}.${n.field}`:n.streamName}: ${n.message}`).join(`
143
+ `)}var Qt,Zt,en,Ue,sn=y(()=>{"use strict";Qt=$.string().min(1,"file path must not be empty").refine(e=>!e.startsWith("/"),"file path must be relative (no leading /)").refine(e=>!e.endsWith("/"),"file path must not be a directory (trailing /)").refine(e=>!e.split("/").includes(".."),"file path must not contain path traversal (..)").refine(e=>!e.includes("*")&&!e.includes("?")&&!e.includes("["),"glob characters (* ? [) are not allowed in file paths"),Zt=/^[a-zA-Z0-9_-]+$/,en=100,Ue=$.object({name:$.string().min(1,"stream name required").max(200),deps:$.array($.string()).optional().default([]),owns:$.array(Qt).optional().default([]),reads:$.array(Qt).optional().default([]),plan:$.string().optional(),setup:$.array($.string().max(1024)).max(20).optional().default([]),verify:$.array($.string().max(1024)).max(20).optional().default([]),status:ar.optional().default("pending"),error:$.string().optional(),attempts:$.number().optional().default(0),parentStreamId:$.string().optional(),appliedAt:$.string().optional(),timeoutMs:$.number().optional(),contextBudget:ir.optional(),estimatedTokens:$.number().optional(),provider:$.string().optional(),suggestedProvider:$.string().optional(),model:$.string().optional()}).strict()});var on={};ie(on,{autoFixSequentialEdits:()=>He,detectSequentialEdits:()=>pe});function pe(e){let n=new Map;for(let[r,i]of Object.entries(e))for(let a of i.owns??[]){let c=n.get(a)??[];c.push(r),n.set(a,c)}let t=new Map;function s(r,i=new Set){if(t.has(r))return t.get(r);if(i.has(r))return new Set;i.add(r);let a=e[r]?.deps??[],c=new Set(a);for(let l of a)for(let u of s(l,i))c.add(u);return t.set(r,c),c}for(let r of Object.keys(e))s(r);let o=[];for(let[r,i]of n){if(i.length<2)continue;let a=[];for(let c=0;c<i.length;c++){let l=!1;for(let u=0;u<i.length;u++){if(c===u)continue;let d=t.get(i[c])??new Set,f=t.get(i[u])??new Set;if(d.has(i[u])||f.has(i[c])){l=!0;break}}l||a.push(i[c])}a.length>=2&&o.push({file:r,streams:a,suggestion:`${r} is modified by ${a.join(" and ")} in the same wave. Split into separate waves by adding a dependency edge, or merge into one stream.`})}return o}function He(e){let n=pe(e),t=0,s=[];for(let o of n)for(let r=1;r<o.streams.length;r++){let i=e[o.streams[r]],a=o.streams[r-1],c=i.deps??[];c.includes(a)||(c.push(a),i.deps=c,t++,s.push(`Added dep: ${o.streams[r]} \u2192 ${a} (shared file: ${o.file})`))}return{edgesAdded:t,fixes:s}}var ze=y(()=>{"use strict"});var an={};ie(an,{calculateWaves:()=>dr,findCurrentWave:()=>fr});import{existsSync as ur}from"fs";import*as rn from"path";function dr(e,n){let t=[],s=[],o=[],r=new Set,i=new Set,a=new Map;for(let[u,d]of Object.entries(e.streams))d.status==="complete"||d.status==="skipped"?r.add(u):d.status==="failed"||d.status==="blocked"?i.add(u):a.set(u,d.deps);let c=1,l=a.size+1;for(let u=0;u<l&&a.size>0;u++){let d=!0;for(;d;){d=!1;let m=[];for(let[h,w]of a){let S=w.filter(b=>i.has(b));if(S.length>0)if(!(n?S.every(k=>{let v=e.streams[k];return!v?.owns||v.owns.length===0?!1:v.owns.every(g=>{try{return ur(rn.resolve(n,g))}catch{return!1}})}):!1))m.push(h);else for(let k of S)r.has(k)||r.add(k)}for(let h of m){o.push(h),i.add(h),a.delete(h),d=!0;let S=e.streams[h].deps.filter(b=>i.has(b));t.push(`Stream '${h}' blocked: ${S.length===1?`dependency '${S[0]}' failed`:`dependencies '${S.join("', '")}' failed`}`)}}let f=[];for(let[m,h]of a)h.every(S=>r.has(S)||!e.streams[S])&&f.push(m);if(f.length===0&&a.size>0){let m=Array.from(a.keys()).join(", ");t.push(`Circular dependency detected among streams: ${m}`);break}if(f.length===0)break;let p=f.map(m=>({id:m,...e.streams[m]}));s.push({number:c,streams:p});for(let m of f)r.add(m),a.delete(m);c++}return{waves:s,errors:t,blocked:o}}function fr(e,n){for(let t of e)if(t.streams.some(s=>!n.has(s.id)))return t;return null}var cn=y(()=>{"use strict"});import*as z from"fs/promises";import*as Be from"path";import*as ln from"os";function un(){return process.env.ORCHEX_CONFIG_DIR??Be.join(ln.homedir(),".orchex")}function dn(){return Be.join(un(),mr)}async function hr(e){let n=un();await z.mkdir(n,{recursive:!0}),await z.writeFile(dn(),JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}async function fn(){try{let e=await z.readFile(dn(),"utf-8"),n=JSON.parse(e);return Date.now()-new Date(n.fetchedAt).getTime()>pr?null:n}catch{return null}}async function pn(e){try{let n=await fetch(`${e}/api/v1/models`,{signal:AbortSignal.timeout(5e3)});if(!n.ok)return null;let s={providers:(await n.json()).providers,fetchedAt:new Date().toISOString()};return await hr(s),s}catch{return null}}var pr,mr,mn=y(()=>{"use strict";pr=1440*60*1e3,mr="models.json"});import{z as E}from"zod";var qe,Ui,hn=y(()=>{"use strict";qe=E.enum(["free","pro","team","enterprise"]),Ui=E.object({id:qe,name:E.string(),price:E.number().describe("Monthly price in USD, -1 = contact sales"),cloudOrchestrations:E.number().describe("Max cloud orchestrations per month, 0 = local only, -1 = unlimited"),maxParallelAgents:E.number().describe("Max parallel agents"),selfHealing:E.enum(["none","full"]),smartPlanning:E.enum(["none","full"]),teamMembers:E.number().describe("Max team members, 1 = solo, -1 = unlimited"),maxWaves:E.number().describe("Max dependency waves allowed. -1 = unlimited"),maxProviders:E.number().describe("Max LLM providers allowed per orchestration. -1 = unlimited"),maxApiTokens:E.number().describe("Max API tokens per user. -1 = unlimited")})});import me from"pino";function he(e){return wr.child({module:e})}var gr,wr,Ye=y(()=>{"use strict";gr=["password","hashedPassword","hashed_password","token","resetToken","sessionId","apiKey","api_key","masterKey","master_key","clientSecret","client_secret","databaseUrl","database_url","webhookSecret","webhook_secret","secretKey","secret_key","encryptionKey","encryption_key","req.headers.authorization","req.headers.cookie"],wr=me({level:process.env.LOG_LEVEL||"info",redact:gr,serializers:{err:me.stdSerializers.err,req:me.stdSerializers.req,res:me.stdSerializers.res},transport:process.env.LOG_PRETTY==="1"?{target:"pino-pretty",options:{colorize:!0}}:void 0})});import*as Ke from"fs/promises";import*as yr from"path";import{z as _}from"zod";function gn(e){switch(e){case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"gemini":return process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY;case"deepseek":return process.env.DEEPSEEK_API_KEY;case"kimi":return process.env.KIMI_API_KEY||process.env.MOONSHOT_API_KEY;case"bedrock":return;case"ollama":return}}var Vi,xr,vr,wn,Sr,Gi,yn=y(()=>{"use strict";hn();Ye();Vi=he("config"),xr="https://orchex.dev",vr=_.enum(["anthropic","openai","gemini","ollama","deepseek","bedrock","kimi"]);wn={anthropic:"claude-sonnet-4-5-20250929",openai:"gpt-4.1",gemini:"gemini-2.0-flash",deepseek:"deepseek-coder",bedrock:"claude-3.5-sonnet",ollama:"llama3.3:70b",kimi:"kimi-k2-0905-preview"},Sr=_.object({enabled:_.boolean().default(!1),endpoint:_.string().url().optional()}),Gi=_.object({mode:_.enum(["local","cloud"]).default("local"),apiUrl:_.string().url().refine(e=>e.startsWith("https://")||e.startsWith("http://localhost")||e.startsWith("http://127.0.0.1"),{message:"apiUrl must use https:// (http://localhost and http://127.0.0.1 are allowed for development)"}).default(xr),apiKey:_.string().optional(),tier:qe.default("free"),provider:vr.optional(),model:_.string().optional(),trialRunsRemaining:_.number().optional(),accountCreatedAt:_.string().optional(),telemetry:Sr.default({enabled:!1})})});var xn={};ie(xn,{MODEL_FALLBACKS:()=>Ge,isProviderAvailable:()=>br,resolveModel:()=>$r});async function kr(){let e=process.env.OLLAMA_BASE_URL??process.env.OLLAMA_HOST??"http://localhost:11434";try{let n=await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(3e3)});return n.ok?(await n.json()).models.map(s=>s.name):[]}catch{return[]}}async function $r(e,n,t){if(e==="ollama"){let i=await kr();if(i.length>0){if(i.includes(n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let a=i.find(c=>c.startsWith(n)||n.startsWith(c.split(":")[0]));return a?{originalModel:n,resolvedModel:a,wasFallback:!0,reason:`Partial match: ${a}`}:{originalModel:n,resolvedModel:i[0],wasFallback:!0,reason:`${n} not installed, using ${i[0]}`}}}let s=await fn();if(!s&&t&&(s=await pn(t)),s?.providers[e]){let i=s.providers[e];if(i.some(l=>l.modelId===n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let c=Ge[e]??[];for(let l of c)if(i.some(u=>u.modelId===l))return Ve.warn({provider:e,original:n,fallback:l},"model_fallback"),{originalModel:n,resolvedModel:l,wasFallback:!0,reason:`${n} not found in ${e} model registry, using ${l}`};if(i.length>0){let l=i[0].modelId;return Ve.warn({provider:e,original:n,fallback:l},"model_fallback_registry_first"),{originalModel:n,resolvedModel:l,wasFallback:!0,reason:`${n} not found, using first available: ${l}`}}}let o=Ge[e]??[];if(o.includes(n))return{originalModel:n,resolvedModel:n,wasFallback:!1};let r=o[0]??wn[e]??n;return r!==n?(Ve.warn({provider:e,original:n,fallback:r},"model_fallback_static"),{originalModel:n,resolvedModel:r,wasFallback:!0,reason:`Offline \u2014 ${n} unverified, using safe default ${r}`}):{originalModel:n,resolvedModel:n,wasFallback:!1}}function br(e){return e==="ollama"||e==="bedrock"?!0:!!gn(e)}var Ve,Ge,vn=y(()=>{"use strict";mn();yn();Ye();Ve=he("model-validator"),Ge={anthropic:["claude-sonnet-4-5-20250929","claude-3-5-sonnet-20241022","claude-3-haiku-20240307"],openai:["gpt-4.1","gpt-4o","gpt-4o-mini","gpt-3.5-turbo"],gemini:["gemini-2.5-pro","gemini-2.0-flash","gemini-1.5-flash"],deepseek:["deepseek-chat","deepseek-coder"],kimi:["kimi-k2-0905-preview","kimi-latest","moonshot-v1-128k","moonshot-v1-32k","moonshot-v1-8k"],bedrock:["claude-3.5-sonnet","claude-3-haiku"],ollama:["llama3.3:70b","llama3.2:latest"]}});function Je(e,n,t,s,o){let r=new Set;for(let d of Object.values(e))for(let f of d.owns??[])r.add(f);let i=0;if(o)for(let d of Object.values(o))d.estimatedCostUsd&&(i+=d.estimatedCostUsd);let a=n.map(d=>({number:d.number,streams:d.streams.map(f=>{let p=e[f],m=o?.[f];return{id:f,name:p?.name??f,owns:p?.owns??[],reads:p?.reads??[],deps:p?.deps??[],provider:m?.provider,model:m?.model,estimatedCostUsd:m?.estimatedCostUsd,modelFallback:m?.fallback}})})),c=[...t];if(s)for(let d of s)c.push(`Sequential edit conflict: ${d.suggestion}`);if(o)for(let[d,f]of Object.entries(o))f.fallback&&c.push(`${d}: ${f.fallback}`);let l=100;c.length>0&&(l-=c.length*5);let u=Object.values(e).filter(d=>!d.owns||d.owns.length===0).length;return l-=u*10,l=Math.max(0,Math.min(100,l)),{summary:{streamCount:Object.keys(e).length,waveCount:n.length,fileCount:r.size,estimatedCostUsd:i>0?i:void 0},waves:a,warnings:c,qualityScore:l}}function Cr(e){return!e||e===0?"":e<.01?" ~< $0.01":` ~$${e.toFixed(2)}`}function Sn(e){let n=[],t=e.summary.estimatedCostUsd?`, est. ~$${e.summary.estimatedCostUsd.toFixed(2)}`:"";n.push(`Plan Preview: ${e.summary.streamCount} streams, ${e.summary.waveCount} waves, ${e.summary.fileCount} files${t}`),n.push(`Quality Score: ${e.qualityScore}/100`),n.push("");for(let s of e.waves){n.push(`Wave ${s.number}:`);for(let o of s.streams){let r=o.deps.length>0?` (deps: ${o.deps.join(", ")})`:"",i=o.model?` (${o.model})`:"",a=Cr(o.estimatedCostUsd);n.push(` ${o.id}: ${o.name}${i}${a}${r}`),o.owns.length>0&&n.push(` owns: ${o.owns.join(", ")}`),o.reads.length>0&&n.push(` reads: ${o.reads.join(", ")}`)}n.push("")}if(e.warnings.length>0){n.push("Warnings:");for(let s of e.warnings)n.push(` - ${s}`);n.push("")}return n.join(`
144
+ `)}async function kn(e){let{generatePlan:n,parsePlanDocument:t,extractDeliverables:s,processDeliverables:o,buildDependencyGraph:r,generateStreams:i,toInitFormat:a,createDiagnostics:c,estimatePlannedCost:l}=await Promise.resolve().then(()=>(Cn(),bn)),{detectSequentialEdits:u}=await Promise.resolve().then(()=>(ze(),on)),{calculateWaves:d}=await Promise.resolve().then(()=>(cn(),an)),{resolveModel:f}=await Promise.resolve().then(()=>(vn(),xn)),{DEFAULT_MODELS:p}=await import("../config.js"),m=e.planMarkdown,h={input:0,output:0};if(!m){let F=await n(e.intent,e.projectDir,e.executor,{model:e.model,provider:e.provider,maxStreams:e.maxStreams});m=F.planMarkdown,h=F.tokensUsed}let w=c(),S=t(m),b=s(S,{diagnostics:w}),k=o(b);if(k.length===0)throw new Error("Plan generated no deliverables. Try a more specific intent.");let v=r(k,{diagnostics:w}),g=i(k,v,{validateAntiPatterns:!0,projectDir:e.projectDir,diagnostics:w}),x=u(g.streams),U=a(g),D=Object.fromEntries(Object.entries(U).map(([F,O])=>[F,{name:O.name,deps:O.deps||[],owns:O.owns||[],reads:O.reads||[],setup:[],plan:O.plan,verify:O.verify||[],status:"pending",attempts:0}])),{waves:R}=d({feature:S.title,streams:D,status:"pending",created:new Date().toISOString()}),Bs=R.map(F=>({number:F.number,streams:F.streams.map(O=>O.id)})),qs=[...g.warnings,...w.warnings],Ee={};for(let[F,O]of Object.entries(U)){let Pe=O.suggestedProvider??e.provider,Ks=p[Pe]??e.model,J=await f(Pe,Ks??"",e.modelApiUrl),Vs=(O.owns??[]).length*100,Gs=l(Vs*4,J.resolvedModel);Ee[F]={provider:Pe,model:J.resolvedModel,estimatedCostUsd:Gs.finalCost,fallback:J.wasFallback?`${J.originalModel} \u2192 ${J.resolvedModel}`:void 0}}let Ys=Je(U,Bs,qs,x,Ee);return{planMarkdown:m,preview:Ys,initStreams:U,waves:R,sequentialDiagnostics:x,modelDecisions:Ee,tokensUsed:h}}var $n=y(()=>{"use strict"});function En(){return{yamlBlocksFound:0,yamlBlocksParsed:0,yamlParseErrors:[],extractionPath:null,sectionsFound:{},sectionsFilteredAsMeta:[],deliverableCount:0,splitCount:0,unmatchedDeps:[],ownershipConflicts:[],warnings:[]}}function Pn(e){let n=new Map;for(let[s,o]of Object.entries(e))for(let r of o.owns||[]){let i=n.get(r)||[];i.push(s),n.set(r,i)}let t=[];for(let[s,o]of n)o.length>1&&t.push(`${s} owned by: ${o.join(", ")}`);return t}var On=y(()=>{"use strict"});function ge(e,n){for(let{pattern:s,category:o,retryable:r,selfHealable:i,suggestion:a}of Er)if(s.test(e))return{category:o,retryable:r,selfHealable:i,suggestion:a};let t=n==="artifact"||n==="verify";return{category:"unknown",retryable:t,selfHealable:t,suggestion:t?"Unknown code error. Retry with the full error message included in the prompt.":`Unknown infrastructure error (origin: ${n??"unspecified"}). Check API key, model availability, and network connectivity.`}}var Er,Xe=y(()=>{"use strict";Er=[{pattern:/model.*not.found|not_found_error.*model|Model ".*" not found/i,category:"model_not_found",retryable:!1,selfHealable:!1,suggestion:"Model not found. Check the model name in your configuration and ensure it is available for your API key."},{pattern:/invalid api key|api key.*expired|authentication failed|(?<!\d)401(?!\d)|unauthorized/i,category:"auth_error",retryable:!1,selfHealable:!1,suggestion:"Authentication error. Check your API key configuration and ensure it is valid and not expired."},{pattern:/cloud api error: 5\d{2}|502 bad gateway|503 service unavailable|504 gateway timeout|internal server error|overloaded_error/i,category:"server_error",retryable:!0,selfHealable:!1,suggestion:"Cloud server error. Transport retries exhausted \u2014 try again later or switch to local mode."},{pattern:/timed?\s*out|ETIMEDOUT|deadline|timeout/i,category:"timeout",retryable:!1,selfHealable:!1,suggestion:"Timeout is an infrastructure issue. Consider increasing stream timeout or reducing scope."},{pattern:/network error|ECONNREFUSED|ECONNRESET|EHOSTUNREACH|socket hang up/i,category:"network",retryable:!1,selfHealable:!1,suggestion:"Network connectivity issue. Check API endpoint availability and network configuration."},{pattern:/rate limit|too many requests|429|quota exceeded/i,category:"rate_limit",retryable:!1,selfHealable:!1,suggestion:"Rate limited by API. Wait before retrying or reduce parallel stream count."},{pattern:/old_?content.*not found|edit.*mismatch|does not match|oldContent/i,category:"edit_mismatch",retryable:!0,selfHealable:!0,suggestion:"The file content changed since context was built. Re-read the file and retry with updated content."},{pattern:/invalid.*artifact|parse.*error|orchex-artifact.*not found|JSON\.parse/i,category:"invalid_artifact",retryable:!0,selfHealable:!0,suggestion:"The agent produced malformed output. Retry with clearer instructions about the artifact format."},{pattern:/ENOENT|EACCES|EPERM|ENOSPC|no such file|permission denied/i,category:"environment",retryable:!1,selfHealable:!1,suggestion:"File system error. Check file paths and permissions."},{pattern:/ownership violation|outside owned files|SECURITY.*path traversal|SECURITY.*absolute path/i,category:"ownership_violation",retryable:!0,selfHealable:!0,suggestion:"File operation attempted outside owned files. The fix stream should only modify files in the owns list, or the owns list should be updated to include the new file."},{pattern:/test.*fail|expect.*received|assertion.*error|FAIL\s+tests\//i,category:"test_failure",retryable:!0,selfHealable:!0,suggestion:"Tests are failing. Include the test error output in the retry prompt so the agent can fix the issue."},{pattern:/lint|eslint|prettier|formatting/i,category:"lint_error",retryable:!0,selfHealable:!0,suggestion:"Lint or formatting error. Include the lint output in the retry prompt."},{pattern:/TypeError|ReferenceError|SyntaxError|Cannot find module|cannot find name|TS\d{4}/i,category:"runtime_error",retryable:!0,selfHealable:!0,suggestion:"Code has type or runtime errors. Include the error output and relevant type definitions in the retry prompt."}]});import{loadManifest as Tn,saveManifest as _n}from"../manifest.js";import{createLogger as Pr}from"../logging.js";async function In(e){let n=await Tn(e),t={skipped:[],warnings:[]},s=Object.entries(n.streams).filter(([o,r])=>r.parentStreamId!==void 0);for(let[o,r]of s)r.status==="pending"&&Or(n,r.parentStreamId)&&(n.streams[o].status="skipped",n.streams[o].error="Parent stream completed; fix no longer needed",t.skipped.push(o));return t.skipped.length>0&&await _n(e,n),t}async function Mn(e,n){let t=await Tn(e),s={skipped:[],warnings:[]},o=Tr(t,n);for(let a of o){let c=t.streams[a];c.status==="pending"?(t.streams[a].status="skipped",t.streams[a].error=`Ancestor '${n}' completed; fix no longer needed`,s.skipped.push(a)):c.status==="in_progress"&&(t.streams[a].status="skipped",t.streams[a].error=`Sibling fix already resolved this stream (completed: '${n}')`,s.skipped.push(a))}let r=!1,i=t.streams[n];if(i?.parentStreamId){let a=i.parentStreamId;for(;t.streams[a]?.parentStreamId;)a=t.streams[a].parentStreamId;let c=t.streams[a];c&&c.status==="failed"&&(t.streams[a].status="complete",delete t.streams[a].error,r=!0,Qe.info({fixStreamId:n,rootStreamId:a},"fix_stream_propagated_completion_to_root"))}return(s.skipped.length>0||r)&&await _n(e,t),s}function ne(e,n){let t=e.streams[n];if(!t||!t.parentStreamId)return null;let s=[n],o=t.parentStreamId,r=new Set;for(;o&&!r.has(o);){r.add(o);let i=e.streams[o];if(!i)break;if(s.unshift(o),!i.parentStreamId)return{rootStreamId:o,fixChain:s.slice(1),rootStatus:i.status??"pending"};o=i.parentStreamId}return null}function An(e,n){return e.streams[n]?.parentStreamId!==void 0}function Rn(e,n){return ne(e,n)?.rootStreamId??n}function Or(e,n){let t=n,s=new Set;for(;t;){if(s.has(t)){Qe.warn({streamId:t},"circular_reference_in_fix_chain");break}s.add(t);let o=e.streams[t];if(!o){Qe.warn({parentId:t},"fix_stream_orphaned_parent");break}if(o.status==="complete")return!0;t=o.parentStreamId}return!1}function Tr(e,n){let t=[];for(let[s,o]of Object.entries(e.streams))o.parentStreamId&&_r(e,s,n)&&t.push(s);return t}function _r(e,n,t){let s=e.streams[n]?.parentStreamId,o=new Set;for(;s&&!o.has(s);){if(o.add(s),s===t)return!0;s=e.streams[s]?.parentStreamId}return!1}var Qe,Ze=y(()=>{"use strict";Qe=Pr("fix-stream-manager")});import{existsSync as Ir,statSync as Mr}from"node:fs";import*as jn from"node:path";function Ln(e,n){if(!e||e.length===0)return"";let t=[],s=[];for(let r of e)try{let i=jn.resolve(n,r);Ir(i)&&Mr(i).isFile()?t.push(r):s.push(r)}catch{}if(t.length===0&&s.length===0)return"";let o=["","### Disk State (for files you own)"];if(t.length>0){o.push(""),o.push("The following files currently exist on disk from a previous attempt:");for(let r of t)o.push(`- ${r}`)}if(s.length>0){o.push(""),o.push("The following files do NOT exist on disk:");for(let r of s)o.push(`- ${r}`)}return o.push(""),o.push('IMPORTANT: For files that already exist, use operation type `edit` or `replace`, NEVER `create`. Using `create` on an existing file will fail with "Conflicts detected" and this fix attempt will be wasted.'),s.length>0&&o.push("For files that do NOT exist, use `create`."),o.join(`
145
145
  `)}function Nn(e,n){let t=0,s=n;for(;s;){let o=e.streams[s];if(!o)break;t+=o.attempts??0,s=o.parentStreamId}return t}function Fn(e,n){return ne(e,n)?.rootStreamId??n}function Wn(e,n){let t=Fn(e,n);for(let[s,o]of Object.entries(e.streams)){if(s===n||!o.parentStreamId||o.status!=="pending"&&o.status!=="in_progress")continue;if(Fn(e,s)===t)return!0}return!1}function Un(e,n,t,s,o){let r=e.streams[n];if(!r||r.status==="failed"&&r.error?.startsWith("Setup failed:"))return null;let i=r.error??"",a=t??ge(i);if(!a.selfHealable||Wn(e,n)||Nn(e,n)>=Dn)return null;let u=(r.attempts??0)+1,d=`${n}-fix-${u}`,f=n,p=o?Ln(r.owns??[],o):"",m=[`## Fix Attempt #${u} for "${r.name}"`,"","### Original Plan",r.plan??"(no plan)","","### Error That Occurred","```",i,"```","",`### Error Category: ${a.category}`,"",`### Suggestion: ${a.suggestion}`,"","### Instructions",`This is a retry of the failed stream "${n}".`,"Fix the issue described above. The original files are in your owns list.","Make sure to address the specific error before implementing the rest of the plan.",...s?["","### Upstream Dependency Warning",`Your error references '${s.errorRef}' which is likely defined by upstream stream '${s.suspectStreamId}'.`,`That stream owns: ${s.suspectFiles.join(", ")}`,"Before fixing your own code, verify that the upstream dependency exports the types/values you need.","If the upstream output is incorrect (wrong type names, missing exports), this fix will fail again.","In that case, the issue will be escalated to fix the upstream stream directly."]:[],...p?[p]:[]].join(`
146
146
  `),h={name:`${r.name} (Fix #${u})`,deps:r.deps??[],owns:r.owns??[],reads:r.reads??[],plan:m,setup:r.setup??[],verify:r.verify??[],status:"pending",attempts:0,parentStreamId:f};return{fixStreamId:d,fixStream:h,analysis:{category:a.category,suggestion:a.suggestion}}}function Hn(e,n){let t=e.streams[n];if(!t?.error)return null;let s=t.deps??[];if(s.length===0)return null;let o=/(?:Cannot find (?:name|module) '(\w+)'|Type '(\w+)'|has no (?:exported )?member '(\w+)'|is not assignable to type '(\w+)'|does not exist on type '(\w+)'|Property '(\w+)' does not exist)/gi,r=new Set,i;for(;(i=o.exec(t.error))!==null;){let a=i[1]||i[2]||i[3]||i[4]||i[5]||i[6];a&&r.add(a)}if(r.size===0)return null;for(let a of s){let c=e.streams[a];if(!c||c.status!=="complete")continue;let l=c.owns??[];if(l.length===0)continue;let u=l.filter(d=>d.endsWith(".ts")||d.endsWith(".tsx")||d.endsWith(".d.ts"));if(u.length!==0)for(let d of r){let f=d.toLowerCase();if(u.some(m=>{let h=m.toLowerCase();return h.includes("type")||h.includes("index")||h.includes(f)||h.includes("model")||h.includes("schema")||h.includes("interface")}))return{suspectStreamId:a,errorRef:d,suspectFiles:u}}}return null}function we(e,n){if(n.length<2)return null;let t=new Map;for(let d of n){let f=e.streams[d];f?.error&&t.set(d,f.error)}if(t.size<2)return null;let s=/(?:Cannot find (?:name|module)|Type '(\w+)'|has no (?:exported )?member '(\w+)'|is not assignable|does not exist on type '(\w+)')/.source,o=new Map;for(let[d,f]of t){let p=new RegExp(s,"gi"),m,h=new Set;for(;(m=p.exec(f))!==null;){let w=m[1]||m[2]||m[3]||m[0];h.add(w)}for(let w of h){let S=o.get(w)??[];S.push(d),o.set(w,S)}}let r="",i=0;for(let[d,f]of o)f.length>i&&(r=d,i=f.length);if(i<2)return null;let a=o.get(r),c=new Map;for(let d of a){let f=e.streams[d];for(let p of f?.deps??[])c.set(p,(c.get(p)??0)+1)}let l="",u=0;for(let[d,f]of c)e.streams[d]?.status==="complete"&&f>u&&(l=d,u=f);return l?{rootCauseStreamId:l,reason:`Stream '${l}' completed but ${a.length} downstream streams failed with errors referencing '${r}'`,affectedStreamIds:a,commonErrorPattern:r}:null}function zn(e,n,t){let s=n.rootCauseStreamId,o=e.streams[s];if(!o||o.status!=="failed"||Nn(e,s)>=Dn||Wn(e,s))return null;let a=(o.attempts??0)+1,c=`${s}-fix-${a}`,l=[];for(let p of n.affectedStreamIds.slice(0,3)){let m=e.streams[p];m?.error&&l.push(`- ${m.name}: ${m.error.slice(0,200)}`)}let u=t?Ln(o.owns??[],t):"",d=[`## Root Cause Fix #${a} for "${o.name}"`,"","### Original Plan",o.plan??"(no plan)","","### Problem Identified",`This stream completed but its output caused ${n.affectedStreamIds.length} downstream streams to fail.`,`All downstream errors reference: **${n.commonErrorPattern}**`,"","### Downstream Error Samples",...l,"","### Instructions",`This stream's output is incorrect. The code you produce must define '${n.commonErrorPattern}' correctly`,"so that downstream streams importing from this file can compile successfully.","Re-read the original plan carefully and ensure your output matches the specified types, exports, and signatures exactly.","Pay special attention to type definitions, enum values, and const arrays \u2014 they must match what downstream code expects.",...u?[u]:[]].join(`
147
- `),f={name:`${o.name} (Root Cause Fix #${a})`,deps:o.deps??[],owns:o.owns??[],reads:o.reads??[],plan:d,setup:o.setup??[],verify:o.verify??[],status:"pending",attempts:0,parentStreamId:s};return{fixStreamId:c,fixStream:f,analysis:{category:"runtime_error",suggestion:n.reason}}}var Dn,et=y(()=>{"use strict";Xe();Ze();Dn=3});import{randomUUID as Ar}from"crypto";function Rr(e,n,t){let s=100,o=e.filter(r=>r.status==="failed").length;return s-=o*20,s-=t*10,s+=n*5,Math.max(0,Math.min(100,s))}function Bn(e,n,t){let s=e.runId??Ar(),o=new Date().toISOString(),r=[];for(let g of n)r.push(...g.streams);let i=new Set;for(let g of n)if(g.fixStreamsGenerated)for(let x of g.fixStreamsGenerated)i.add(x);for(let[g,x]of Object.entries(e.streams))x.parentStreamId&&i.add(g);let a=new Map;for(let g of r)a.set(g.id,g);let c=[...a.values()].map(g=>({id:g.id,name:g.name,status:g.status,tokensUsed:g.tokensUsed,executionTimeMs:g.executionTimeMs,selfHealCount:i.has(g.id)?1:0,errorCategory:g.errorDetail?.category,errorMessage:g.error,errorSuggestion:g.errorDetail?.suggestion,errorRetryable:g.errorDetail?.retryable,errorSelfHealable:g.errorDetail?.selfHealable,provider:g.provider,model:g.model,filesChanged:g.filesChanged})),l=0,u=0,d={};for(let g of r)if(g.tokensUsed){l+=g.tokensUsed.input,u+=g.tokensUsed.output;let x=g.provider??"unknown";d[x]||(d[x]={input:0,output:0}),d[x].input+=g.tokensUsed.input,d[x].output+=g.tokensUsed.output}let f=0,p=0;for(let g of n)g.timing&&(f+=g.timing.parallelMs,p+=g.timing.sequentialMs);let m=new Set;for(let g of r)if(g.filesChanged)for(let x of g.filesChanged)m.add(x);let h=0;for(let g of n)g.streams.length>0&&g.streams.every(x=>x.status==="complete")&&h++;let w={};for(let g of r)if(g.status==="failed"&&g.errorDetail?.category){let x=g.errorDetail.category;w[x]=(w[x]??0)+1}let S,b=r.filter(g=>g.status==="failed").map(g=>g.id);if(b.length>=2){let g=we(e,b);g&&(S=g)}let $=i.size,v=Rr(r,h,$);return{runId:s,timestamp:o,feature:e.feature,planQualityScore:v,streamResults:c,waveEfficiency:{parallelMs:f,sequentialMs:p,timeSavedMs:Math.max(0,p-f)},autoPlanAccuracy:t?.autoPlanEdits!==void 0?{editsBeforeApproval:t.autoPlanEdits}:void 0,tokenUsage:{totalInput:l,totalOutput:u,byProvider:d},fileChangeImpact:{filesCreated:0,filesModified:m.size,totalFilesChanged:m.size},failurePatterns:w,failureCorrelation:S,totalWaves:n.length,totalStreams:a.size}}async function qn(e,n){let{mkdir:t,writeFile:s}=await import("fs/promises"),{join:o}=await import("path"),r=o(e,".orchex","reports");await t(r,{recursive:!0});let i=o(r,`${n.runId}.json`);return await s(i,JSON.stringify(n,null,2),"utf-8"),i}var Yn=y(()=>{"use strict";et()});import{formatDuration as Fr}from"../types.js";function Kn(e,n){let t=[];if(e.waveEfficiency.timeSavedMs>0&&e.totalStreams>1){let r=Fr(e.waveEfficiency.timeSavedMs),i=e.waveEfficiency.sequentialMs>0?Math.round(e.waveEfficiency.timeSavedMs/e.waveEfficiency.sequentialMs*100):0;t.push(`${e.totalStreams} streams ran in parallel across ${e.totalWaves} wave(s), saving ${r} (${i}%).`)}else e.totalStreams>1&&t.push(`${e.totalStreams} streams executed across ${e.totalWaves} wave(s).`);let s=Object.entries(e.failurePatterns);if(s.length>0){s.sort((c,l)=>l[1]-c[1]);let[r,i]=s[0],a=s.reduce((c,[,l])=>c+l,0);r==="type_error"?t.push(`${r} was the most common failure (${i}/${a}). Consider adding a types-only stream first.`):t.push(`${r} was the most common failure (${i}/${a}).`)}if(n&&n.length>0){let r=n.reduce((a,c)=>a+c.planQualityScore,0)/n.length,i=e.planQualityScore-r;i>10?t.push(`Plan quality improved from ${Math.round(r)} to ${e.planQualityScore} \u2014 orchex is learning your patterns.`):i<-10?t.push(`Plan quality dropped from ${Math.round(r)} to ${e.planQualityScore}. Review the failure patterns above.`):t.push(`Plan quality score: ${e.planQualityScore}/100 (consistent with previous runs at ~${Math.round(r)}).`)}else t.push(`Plan quality score: ${e.planQualityScore}/100.`);let o=e.tokenUsage.totalInput+e.tokenUsage.totalOutput;if(o>0&&t.length<3){let r=Object.keys(e.tokenUsage.byProvider);r.length>1&&t.push(`Used ${r.length} providers: ${r.join(", ")} \u2014 total ${o.toLocaleString()} tokens.`)}return t.slice(0,3)}var Vn=y(()=>{"use strict"});import*as P from"fs/promises";import*as W from"path";async function Jn(e){let n=W.join(e,".orchex");try{await P.access(n)}catch{return!0}try{return await P.access(W.join(n,Gn)),!1}catch{}try{let t=W.join(n,"archive");if((await P.readdir(t)).length>0)return!1}catch{}try{let t=W.join(n,"reports");if((await P.readdir(t)).some(o=>o.endsWith(".json")))return!1}catch{}try{let t=W.join(n,"learn","events.jsonl");if((await P.stat(t)).size>0)return!1}catch{}return!0}async function Xn(e){let n=W.join(e,".orchex");await P.mkdir(n,{recursive:!0}),await P.writeFile(W.join(n,Gn),new Date().toISOString(),"utf-8")}function Qn(){return["Welcome to orchex! This looks like your first time using orchex in this project.","","Try a quick demo to see orchestration in action:",' orchex run "Add a hello world API endpoint to this project"',"","Or use the MCP auto tool in your AI assistant:",' auto({ prompt: "Add a health check endpoint" })',"","Orchex will generate a plan, show you a preview, and execute in parallel.","Learn more: https://orchex.dev/docs/user-guide/quickstart"].join(`
147
+ `),f={name:`${o.name} (Root Cause Fix #${a})`,deps:o.deps??[],owns:o.owns??[],reads:o.reads??[],plan:d,setup:o.setup??[],verify:o.verify??[],status:"pending",attempts:0,parentStreamId:s};return{fixStreamId:c,fixStream:f,analysis:{category:"runtime_error",suggestion:n.reason}}}var Dn,et=y(()=>{"use strict";Xe();Ze();Dn=3});import{randomUUID as Ar}from"crypto";function Rr(e,n,t){let s=100,o=e.filter(r=>r.status==="failed").length;return s-=o*20,s-=t*10,s+=n*5,Math.max(0,Math.min(100,s))}function Bn(e,n,t){let s=e.runId??Ar(),o=new Date().toISOString(),r=[];for(let g of n)r.push(...g.streams);let i=new Set;for(let g of n)if(g.fixStreamsGenerated)for(let x of g.fixStreamsGenerated)i.add(x);for(let[g,x]of Object.entries(e.streams))x.parentStreamId&&i.add(g);let a=new Map;for(let g of r)a.set(g.id,g);let c=[...a.values()].map(g=>({id:g.id,name:g.name,status:g.status,tokensUsed:g.tokensUsed,executionTimeMs:g.executionTimeMs,selfHealCount:i.has(g.id)?1:0,errorCategory:g.errorDetail?.category,errorMessage:g.error,errorSuggestion:g.errorDetail?.suggestion,errorRetryable:g.errorDetail?.retryable,errorSelfHealable:g.errorDetail?.selfHealable,provider:g.provider,model:g.model,filesChanged:g.filesChanged})),l=0,u=0,d={};for(let g of r)if(g.tokensUsed){l+=g.tokensUsed.input,u+=g.tokensUsed.output;let x=g.provider??"unknown";d[x]||(d[x]={input:0,output:0}),d[x].input+=g.tokensUsed.input,d[x].output+=g.tokensUsed.output}let f=0,p=0;for(let g of n)g.timing&&(f+=g.timing.parallelMs,p+=g.timing.sequentialMs);let m=new Set;for(let g of r)if(g.filesChanged)for(let x of g.filesChanged)m.add(x);let h=0;for(let g of n)g.streams.length>0&&g.streams.every(x=>x.status==="complete")&&h++;let w={};for(let g of r)if(g.status==="failed"&&g.errorDetail?.category){let x=g.errorDetail.category;w[x]=(w[x]??0)+1}let S,b=r.filter(g=>g.status==="failed").map(g=>g.id);if(b.length>=2){let g=we(e,b);g&&(S=g)}let k=i.size,v=Rr(r,h,k);return{runId:s,timestamp:o,feature:e.feature,planQualityScore:v,streamResults:c,waveEfficiency:{parallelMs:f,sequentialMs:p,timeSavedMs:Math.max(0,p-f)},autoPlanAccuracy:t?.autoPlanEdits!==void 0?{editsBeforeApproval:t.autoPlanEdits}:void 0,tokenUsage:{totalInput:l,totalOutput:u,byProvider:d},fileChangeImpact:{filesCreated:0,filesModified:m.size,totalFilesChanged:m.size},failurePatterns:w,failureCorrelation:S,totalWaves:n.length,totalStreams:a.size}}async function qn(e,n){let{mkdir:t,writeFile:s}=await import("fs/promises"),{join:o}=await import("path"),r=o(e,".orchex","reports");await t(r,{recursive:!0});let i=o(r,`${n.runId}.json`);return await s(i,JSON.stringify(n,null,2),"utf-8"),i}var Yn=y(()=>{"use strict";et()});import{formatDuration as Fr}from"../types.js";function Kn(e,n){let t=[];if(e.waveEfficiency.timeSavedMs>0&&e.totalStreams>1){let r=Fr(e.waveEfficiency.timeSavedMs),i=e.waveEfficiency.sequentialMs>0?Math.round(e.waveEfficiency.timeSavedMs/e.waveEfficiency.sequentialMs*100):0;t.push(`${e.totalStreams} streams ran in parallel across ${e.totalWaves} wave(s), saving ${r} (${i}%).`)}else e.totalStreams>1&&t.push(`${e.totalStreams} streams executed across ${e.totalWaves} wave(s).`);let s=Object.entries(e.failurePatterns);if(s.length>0){s.sort((c,l)=>l[1]-c[1]);let[r,i]=s[0],a=s.reduce((c,[,l])=>c+l,0);r==="type_error"?t.push(`${r} was the most common failure (${i}/${a}). Consider adding a types-only stream first.`):t.push(`${r} was the most common failure (${i}/${a}).`)}if(n&&n.length>0){let r=n.reduce((a,c)=>a+c.planQualityScore,0)/n.length,i=e.planQualityScore-r;i>10?t.push(`Plan quality improved from ${Math.round(r)} to ${e.planQualityScore} \u2014 orchex is learning your patterns.`):i<-10?t.push(`Plan quality dropped from ${Math.round(r)} to ${e.planQualityScore}. Review the failure patterns above.`):t.push(`Plan quality score: ${e.planQualityScore}/100 (consistent with previous runs at ~${Math.round(r)}).`)}else t.push(`Plan quality score: ${e.planQualityScore}/100.`);let o=e.tokenUsage.totalInput+e.tokenUsage.totalOutput;if(o>0&&t.length<3){let r=Object.keys(e.tokenUsage.byProvider);r.length>1&&t.push(`Used ${r.length} providers: ${r.join(", ")} \u2014 total ${o.toLocaleString()} tokens.`)}return t.slice(0,3)}var Vn=y(()=>{"use strict"});import*as P from"fs/promises";import*as W from"path";async function Jn(e){let n=W.join(e,".orchex");try{await P.access(n)}catch{return!0}try{return await P.access(W.join(n,Gn)),!1}catch{}try{let t=W.join(n,"archive");if((await P.readdir(t)).length>0)return!1}catch{}try{let t=W.join(n,"reports");if((await P.readdir(t)).some(o=>o.endsWith(".json")))return!1}catch{}try{let t=W.join(n,"learn","events.jsonl");if((await P.stat(t)).size>0)return!1}catch{}return!0}async function Xn(e){let n=W.join(e,".orchex");await P.mkdir(n,{recursive:!0}),await P.writeFile(W.join(n,Gn),new Date().toISOString(),"utf-8")}function Qn(){return["Welcome to orchex! This looks like your first time using orchex in this project.","","Try a quick demo to see orchestration in action:",' orchex run "Add a hello world API endpoint to this project"',"","Or use the MCP auto tool in your AI assistant:",' auto({ prompt: "Add a health check endpoint" })',"","Orchex will generate a plan, show you a preview, and execute in parallel.","Learn more: https://orchex.dev/docs/user-guide/quickstart"].join(`
148
148
  `)}var Gn,Zn=y(()=>{"use strict";Gn=".first-run-complete"});import*as se from"fs/promises";import*as A from"path";async function ts(e,n){if(!n.confirm)throw new Error("Reset learning requires --confirm flag. This permanently deletes learning data.");let t=[],s=A.join(e,".orchex","learn"),o=A.join(e,".orchex","reports");n.patternsOnly?await ye(A.join(s,"patterns.json"),t):n.reportsOnly?await es(o,t,".json"):(await ye(A.join(s,"thresholds.json"),t),await ye(A.join(s,"events.jsonl"),t),await ye(A.join(s,"patterns.json"),t),await es(o,t,".json"));let r=n.patternsOnly?"patterns":n.reportsOnly?"reports":"all learning data";return{deleted:t,totalDeleted:t.length,message:t.length>0?`Reset ${r}: ${t.length} file(s) deleted.`:`No ${r} found to delete.`}}async function ye(e,n){try{await se.unlink(e),n.push(A.basename(e))}catch(t){if(t.code!=="ENOENT")throw t}}async function es(e,n,t){try{let s=await se.readdir(e);for(let o of s)t&&!o.endsWith(t)||(await se.unlink(A.join(e,o)),n.push(o))}catch(s){if(s.code!=="ENOENT")throw s}}var ns=y(()=>{"use strict"});import{createLogger as jr}from"../logging.js";function ss(e){let{streamResults:n,iterationNumber:t,maxIterations:s,intent:o}=e;if(t>=s){let d=n.filter(f=>f.status==="failed"||!f.verifyPassed).length;return{complete:!0,reason:`Reached max iterations (${s})${d>0?` with ${d} unresolved failure(s)`:""}`,failureSummary:d>0?n.filter(f=>f.status==="failed").map(f=>`${f.id}: ${f.error}`).join("; "):void 0}}let r=n.filter(d=>d.status==="failed"),i=n.filter(d=>d.status==="complete"&&!d.verifyPassed);if(r.length===0&&i.length===0)return{complete:!0,reason:`All ${n.length} stream(s) completed and verified successfully`};let c=[];for(let d of r)c.push(`Stream "${d.id}" failed: ${d.error??"unknown error"}`);for(let d of i)c.push(`Stream "${d.id}" verify failed: ${d.verifyError??"verification error"}`);let l=c.join("; "),u=`Fix the following issues from the previous attempt to "${o}": ${l}`;return Dr.info({iteration:t,failed:r.length,verifyFailed:i.length},"iteration_incomplete"),{complete:!1,reason:`${r.length} stream(s) failed, ${i.length} verification(s) failed`,nextIntent:u,failureSummary:l}}var Dr,os=y(()=>{"use strict";Dr=jr("iteration-evaluator")});function oe(e){let n=e.toLowerCase(),t=null;for(let s of zr){let o=0;for(let r of s.keywords)n.includes(r.toLowerCase())&&(o+=2);for(let r of s.patterns){let i=r.toLowerCase().split(/[\s/,]+/).filter(c=>c.length>2);i.filter(c=>n.includes(c)).length>=i.length/2&&(o+=1)}o>0&&(!t||o>t.score)&&(t={template:s,score:o})}return t&&t.score>=3?t.template:null}function xe(e,n){let t=[];if(e.id==="documentation-set"){let s=n.topics||[];for(let o of s)t.push({name:`docs-${o}`,deps:[],owns:[`docs/${o}/**/*.md`],reads:["src/**/*.ts","README.md"],plan:`Research ${o} implementation \u2192 Write documentation \u2192 Add examples \u2192 Review completeness`})}else if(e.id==="code-feature"){let s=n.featureName;t.push({name:`${s}-types`,deps:[],owns:[`src/types/${s}.ts`],reads:["src/types.ts"],plan:"Analyze requirements \u2192 Define types \u2192 Add validation schemas \u2192 Export types"},{name:`${s}-core`,deps:[`${s}-types`],owns:[`src/${s}/*.ts`],reads:[`src/types/${s}.ts`,"src/utils/*.ts"],plan:"Implement core logic \u2192 Add error handling \u2192 Integrate with existing systems"},{name:`${s}-tests`,deps:[`${s}-core`],owns:[`tests/${s}.test.ts`],reads:[`src/${s}/*.ts`],plan:"Write unit tests \u2192 Add integration tests \u2192 Test edge cases \u2192 Verify coverage"},{name:`${s}-docs`,deps:[`${s}-core`],owns:[`docs/${s}/*.md`],reads:[`src/${s}/*.ts`],plan:"Document API \u2192 Add usage examples \u2192 Write integration guide"})}else if(e.id==="migration"){let s=n.featureName,o=n.components||[];t.push({name:`${s}-new-implementation`,deps:[],owns:[`src/${s}-new/*.ts`],reads:[`src/${s}-old/*.ts`],plan:"Implement new version \u2192 Match old API \u2192 Add compatibility layer"});for(let r of o)t.push({name:`${s}-migrate-${r}`,deps:[`${s}-new-implementation`],owns:[`src/${r}/**/*.ts`],reads:[`src/${s}-new/*.ts`,`src/${s}-old/*.ts`],plan:"Update imports \u2192 Replace function calls \u2192 Update tests \u2192 Verify behavior"});t.push({name:`${s}-deprecate-old`,deps:o.map(r=>`${s}-migrate-${r}`),owns:[`src/${s}-old/*.ts`],reads:[],plan:"Add deprecation notices \u2192 Update docs \u2192 Plan removal timeline"})}else if(e.id==="tutorial"){let s=n.topics||[];for(let o of s)t.push({name:`tutorial-${o}`,deps:[],owns:[`docs/tutorials/${o}.md`,`examples/${o}/**/*`],reads:["src/**/*.ts"],plan:"Define learning objectives \u2192 Write tutorial \u2192 Create working example \u2192 Add exercises"})}else if(e.id==="api-reference"){let s=n.modules||[];for(let o of s)t.push({name:`api-${o}-reference`,deps:[],owns:[`docs/api/${o}.md`],reads:[`src/${o}/**/*.ts`],plan:"Extract types/interfaces \u2192 Document functions \u2192 Add examples \u2192 Cross-link related APIs"})}return t}function rs(e){let n=e.owns||[],t=e.reads||[];if(n.length>5)return{originalStream:e.name,reason:`Stream owns ${n.length} files, which may be too many for a single stream`,guidance:["Consider grouping related files together","Split by logical component or responsibility","Create dependencies between resulting streams if needed"],suggestedStreams:[]};if(t.length>10)return{originalStream:e.name,reason:`Stream reads ${t.length} files, which may indicate broad scope`,guidance:["Reading many files often means the stream is doing too much","Consider splitting into smaller, focused streams","Each stream should ideally read 3-5 context files"],suggestedStreams:[]};let s=`${e.name} ${e.plan||""}`,o=oe(s);return o&&["multiple","all","complete","full","entire"].some(a=>e.name.toLowerCase().includes(a))?{originalStream:e.name,reason:"Stream name suggests broad scope that could be split",template:o,guidance:o.guidelines,suggestedStreams:[]}:null}var Lr,Nr,Wr,Ur,Hr,zr,tt=y(()=>{"use strict";Lr={id:"documentation-set",name:"Documentation Set",description:"Multiple documentation files (guides, tutorials, API references) that should be created independently",keywords:["docs","documentation","guide","tutorial","readme","api reference","multiple pages"],patterns:["Multiple .md files in docs/","Creating 3+ documentation files","Tutorial series","API documentation pages"],streamStructure:[{namePattern:"docs-{topic}",purpose:"Create documentation for a specific topic",dependsOn:[],ownsPatterns:["docs/{topic}/**/*.md"],readsPatterns:["src/**/*.ts","README.md"],planOutline:"Research implementation \u2192 Write documentation \u2192 Add examples \u2192 Review completeness"}],guidelines:["Split by logical topic, not file count","Each stream should own 1-3 related doc files","Order dependencies: concepts \u2192 API reference \u2192 tutorials \u2192 advanced guides","Streams can run in parallel if topics are independent","Keep related examples with their topic"]},Nr={id:"code-feature",name:"Code Feature Implementation",description:"Multi-component feature with types, implementation, tests, and documentation",keywords:["feature","implement","add","create","types","tests","integration"],patterns:["Types \u2192 Implementation \u2192 Tests \u2192 Docs","Multiple source files with dependencies","Test files alongside implementation","Integration with existing code"],streamStructure:[{namePattern:"{feature}-types",purpose:"Define interfaces, types, and schemas",dependsOn:[],ownsPatterns:["src/types/{feature}.ts","src/schemas/{feature}.ts"],readsPatterns:["src/types.ts"],planOutline:"Analyze requirements \u2192 Define types \u2192 Add validation schemas \u2192 Export types"},{namePattern:"{feature}-core",purpose:"Core feature implementation",dependsOn:["{feature}-types"],ownsPatterns:["src/{feature}/*.ts"],readsPatterns:["src/types/{feature}.ts","src/utils/*.ts"],planOutline:"Implement core logic \u2192 Add error handling \u2192 Integrate with existing systems"},{namePattern:"{feature}-tests",purpose:"Unit and integration tests",dependsOn:["{feature}-core"],ownsPatterns:["tests/{feature}.test.ts"],readsPatterns:["src/{feature}/*.ts"],planOutline:"Write unit tests \u2192 Add integration tests \u2192 Test edge cases \u2192 Verify coverage"},{namePattern:"{feature}-docs",purpose:"Documentation and examples",dependsOn:["{feature}-core"],ownsPatterns:["docs/{feature}/*.md"],readsPatterns:["src/{feature}/*.ts"],planOutline:"Document API \u2192 Add usage examples \u2192 Write integration guide"}],guidelines:["Always start with types to establish contracts","Core implementation depends on types being defined","Tests and docs can run in parallel after core is complete","Keep streams focused: one stream = one responsibility","If a file has 200+ lines, consider splitting implementation into multiple streams"]},Wr={id:"migration",name:"Migration",description:"Migrating code, data, or structure with backward compatibility",keywords:["migration","migrate","refactor","rename","move","deprecate","backward compatible"],patterns:["From old to new","Rename/move files or functions","Change data structure","Update multiple call sites","Maintain backward compatibility"],streamStructure:[{namePattern:"{migration}-new-implementation",purpose:"Create new implementation alongside old one",dependsOn:[],ownsPatterns:["src/{new}/*.ts"],readsPatterns:["src/{old}/*.ts"],planOutline:"Implement new version \u2192 Match old API \u2192 Add compatibility layer"},{namePattern:"{migration}-migrate-{component}",purpose:"Migrate specific component to new implementation",dependsOn:["{migration}-new-implementation"],ownsPatterns:["src/{component}/**/*.ts"],readsPatterns:["src/{new}/*.ts","src/{old}/*.ts"],planOutline:"Update imports \u2192 Replace function calls \u2192 Update tests \u2192 Verify behavior"},{namePattern:"{migration}-deprecate-old",purpose:"Mark old implementation as deprecated",dependsOn:["{migration}-migrate-*"],ownsPatterns:["src/{old}/*.ts"],readsPatterns:[],planOutline:"Add deprecation notices \u2192 Update docs \u2192 Plan removal timeline"}],guidelines:["Create new before removing old","Migrate in small, independent chunks (by component/module)","Each migration stream should be independently testable","Keep deprecation as the final step","Ensure each stream leaves the codebase in a working state"]},Ur={id:"tutorial",name:"Tutorial Series",description:"Progressive tutorial series from basics to advanced",keywords:["tutorial","guide","example","walkthrough","getting started","beginner","advanced"],patterns:["Multiple tutorial steps","Progressive complexity","Beginner \u2192 Intermediate \u2192 Advanced","Examples with documentation"],streamStructure:[{namePattern:"tutorial-{level}-{topic}",purpose:"Create tutorial for specific level and topic",dependsOn:["tutorial-{previous-level}-*"],ownsPatterns:["docs/tutorials/{level}-{topic}.md","examples/{topic}/**/*"],readsPatterns:["src/**/*.ts","docs/tutorials/{previous}*.md"],planOutline:"Define learning objectives \u2192 Write tutorial \u2192 Create working example \u2192 Add exercises"}],guidelines:["Order by prerequisite knowledge: basics \u2192 intermediate \u2192 advanced","Each tutorial should be self-contained but build on previous concepts","Include working code examples","Beginner tutorials can run in parallel if they cover different topics","Advanced tutorials depend on relevant beginner/intermediate tutorials"]},Hr={id:"api-reference",name:"API Reference",description:"Comprehensive API documentation for modules, classes, and functions",keywords:["api","reference","documentation","modules","classes","functions","methods"],patterns:["Documenting multiple modules","Class/function reference","Method documentation","Parameter and return type docs"],streamStructure:[{namePattern:"api-{module}-reference",purpose:"Create API reference for a specific module",dependsOn:[],ownsPatterns:["docs/api/{module}.md"],readsPatterns:["src/{module}/**/*.ts"],planOutline:"Extract types/interfaces \u2192 Document functions \u2192 Add examples \u2192 Cross-link related APIs"}],guidelines:["Split by module or logical grouping","All API reference streams can run in parallel","Include type signatures and examples","Cross-reference related APIs","Keep each stream to 1-2 related modules"]},zr=[Lr,Nr,Wr,Ur,Hr]});function Br(e,n,t){if(t.issues.length===0)return null;let s=t.issues.some(l=>l.severity==="error"),o=t.issues.some(l=>l.severity==="warning"),r=`${n.name??e} ${n.plan??""}`,i=oe(r),a=null;if(i){let l=e.replace(/-/g,"_");a=xe(i,{featureName:l})}let c="";s?c=`Stream "${e}" has critical issues:
149
149
  `:o?c=`Stream "${e}" has potential issues:
150
150
  `:c=`Stream "${e}" has suggestions:
@@ -164,14 +164,14 @@ No template match. Consider manual split or ignore.`;return{streamId:e,violation
164
164
  `;for(let r of e.filter(i=>i.violations.some(a=>a.severity==="error"))){let i=r.violations.filter(a=>a.severity==="error").map(a=>a.type);o+=` \u2022 ${r.streamId}: ${i.join(", ")}
165
165
  `}}return{totalStreams:e.length,errorCount:n,warningCount:t,templateMatches:s,summary:o}}var cs=y(()=>{"use strict";de();tt()});function ls(e){let n=new Map;for(let[l,u]of Object.entries(e))for(let d of u.owns??[]){let f=n.get(d)??[];f.push(l),n.set(d,f)}let t=new Map;function s(l){return t.has(l)||t.set(l,l),t.get(l)!==l&&t.set(l,s(t.get(l))),t.get(l)}function o(l,u){let d=s(l),f=s(u);d!==f&&(d<f?t.set(f,d):t.set(d,f))}for(let[,l]of n)if(!(l.length<2))for(let u=1;u<l.length;u++)o(l[0],l[u]);let r=new Map;for(let l of Object.keys(e)){let u=s(l),d=r.get(u)??[];d.push(l),r.set(u,d)}let i={},a=[],c=new Map;for(let[,l]of r){if(l.length===1){let v=l[0];i[v]=e[v],c.set(v,v);continue}l.sort();let u=l[0],d=[],f=new Set,p=new Set,m=new Set,h=[],w=[];for(let v of l){let g=e[v];d.push(g.name);for(let x of g.owns??[])f.add(x);for(let x of g.reads??[])p.add(x);for(let x of g.deps??[])m.add(x);for(let x of g.verify??[])h.includes(x)||h.push(x);g.plan&&w.push(`## ${g.name}
166
166
 
167
- ${g.plan}`),c.set(v,u)}for(let v of f)p.delete(v);let S=new Set(l);for(let v of S)m.delete(v);let b,$=[];for(let v of l){let g=e[v];g.timeoutMs&&(!b||g.timeoutMs>b)&&(b=g.timeoutMs);for(let x of g.setup??[])$.includes(x)||$.push(x)}i[u]={name:d.join(" + "),owns:[...f],reads:[...p],deps:[...m],plan:w.join(`
167
+ ${g.plan}`),c.set(v,u)}for(let v of f)p.delete(v);let S=new Set(l);for(let v of S)m.delete(v);let b,k=[];for(let v of l){let g=e[v];g.timeoutMs&&(!b||g.timeoutMs>b)&&(b=g.timeoutMs);for(let x of g.setup??[])k.includes(x)||k.push(x)}i[u]={name:d.join(" + "),owns:[...f],reads:[...p],deps:[...m],plan:w.join(`
168
168
 
169
169
  ---
170
170
 
171
- `),verify:h,setup:$.length>0?$:void 0,timeoutMs:b},a.push(`Merged [${l.join(", ")}] \u2192 ${u} (shared files: ${[...f].filter(v=>(n.get(v)??[]).length>1).join(", ")})`)}for(let[l,u]of Object.entries(i)){let d=u.deps??[],f=[...new Set(d.map(p=>c.get(p)??p))].filter(p=>p!==l);u.deps=f}return{streams:i,merges:a}}var us=y(()=>{"use strict"});function ds(e){return e.isTestGeneration?{provider:void 0,confidence:.3,reason:"Test generation works well with any provider \u2014 use your default."}:e.isStructuralChange&&(e.totalOwnedLines>500||e.fileCount>4)?{provider:"anthropic",confidence:.7,reason:`Structural edits across ${e.fileCount} files (${e.totalOwnedLines} lines) \u2014 Claude handles complex multi-file reasoning best.`}:!e.isStructuralChange&&e.totalOwnedLines<200&&e.fileCount<=2?{provider:"openai",model:"gpt-4.1-mini",confidence:.6,reason:`Simple transform (${e.totalOwnedLines} lines, ${e.fileCount} files) \u2014 GPT-4.1-mini is cost-effective for small tasks.`}:e.isStructuralChange?{provider:"anthropic",confidence:.5,reason:`Structural changes across ${e.fileCount} files \u2014 Claude recommended for refactoring tasks.`}:{provider:void 0,confidence:.2,reason:"No strong provider preference for this task type \u2014 use your configured default."}}function fs(e,n,t){let s=e.toLowerCase(),o=s.includes("test")||s.includes("spec")||n.some(a=>a.includes(".test.")||a.includes(".spec.")||a.startsWith("tests/")),i=["refactor","restructure","reorganize","migrate","rewrite","split","merge","move","rename","extract","inline","new module","new class","new service","new component"].some(a=>s.includes(a));return{totalOwnedLines:t,isStructuralChange:i,isTestGeneration:o,fileCount:n.length}}var ps=y(()=>{"use strict"});import*as K from"fs/promises";import*as nt from"path";import*as ve from"yaml";import{exec as qr}from"child_process";import{promisify as Yr}from"util";async function hs(e,n){let t=nt.join(e,".orchex","active","manifest.yaml"),s=await K.readFile(t,"utf-8"),o=ve.parse(s),r=new Set(n);for(let[i,a]of Object.entries(o.streams))a.status==="pending"&&(r.has(i)||(o.streams[i].status="skipped"));await K.writeFile(t,ve.stringify(o,{indent:2,lineWidth:0}),"utf-8")}async function gs(e,n,t){let s=[],o=[];for(let r of t){let i=nt.join(e,r);try{let{stdout:a}=await ms(`git ls-files "${r}"`,{cwd:e});if(a.trim())await ms(`git checkout HEAD -- "${r}"`,{cwd:e}),s.push(r);else try{await K.unlink(i),s.push(r)}catch(c){c.code!=="ENOENT"&&o.push(`Failed to delete ${r}: ${c.message}`)}}catch(a){if(a.message?.includes("did not match any"))continue;o.push(`Failed to rollback ${r}: ${a.message}`)}}return{streamId:n,reverted:s,errors:o}}var ms,ws=y(()=>{"use strict";ms=Yr(qr)});function st(e){if(Se[e])return Se[e];let n=e.toLowerCase();for(let[t,s]of Object.entries(Se))if(t!=="default"&&n.includes(t.split("-").slice(0,2).join("-")))return s;return Se.default}function ys(e,n,t,s){let o=st(t),r=e/1e3*o.input,i=n/1e3*o.output,a=r+i,c;s&&s>0&&(c=s/1e3*o.input*Kr);let l=a-(c??0);return{inputTokens:e,outputTokens:n,inputCost:r,outputCost:i,totalCost:a,cacheHitTokens:s,cacheDiscount:c,finalCost:l,model:t}}function xs(e,n,t=.3){let s=Math.ceil(e*t);return ys(e,s,n)}var Se,Kr,ot=y(()=>{"use strict";Se={"claude-opus-4-5-20251101":{input:.015,output:.075},"claude-sonnet-4-5-20250929":{input:.003,output:.015},"claude-sonnet-4-20250514":{input:.003,output:.015},"claude-3-5-sonnet-20241022":{input:.003,output:.015},"claude-3-opus-20240229":{input:.015,output:.075},"claude-3-haiku-20240307":{input:25e-5,output:.00125},"gpt-4.5-turbo":{input:.005,output:.015},"gpt-4-turbo":{input:.01,output:.03},"gpt-4-turbo-preview":{input:.01,output:.03},"gpt-4o":{input:.005,output:.015},"gpt-4o-mini":{input:15e-5,output:6e-4},"o1-preview":{input:.015,output:.06},"o1-mini":{input:.003,output:.012},"o3-mini":{input:.0011,output:.0044},"gpt-3.5-turbo":{input:5e-4,output:.0015},"gemini-2.5-pro":{input:.00125,output:.01},"gemini-2.0-flash":{input:1e-4,output:4e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4},"gemini-pro":{input:125e-6,output:375e-6},"deepseek-chat":{input:28e-5,output:42e-5},"deepseek-coder":{input:28e-5,output:42e-5},"deepseek-reasoner":{input:55e-5,output:.00219},"llama3.3:70b":{input:0,output:0},"llama3.2:latest":{input:0,output:0},"mistral:latest":{input:0,output:0},default:{input:.003,output:.015}},Kr=.9});import*as Ss from"fs";import*as rt from"path";import{createLogger as Vr}from"../logging.js";function Gr(e){let n=[...e.owns,...e.reads??[]],t=e.name.toLowerCase(),s=(e.plan??"").toLowerCase();return n.some(o=>o.match(/\.(md|mdx|txt|rst)$/))||t.includes("doc")||t.includes("readme")?"docs":n.some(o=>o.includes(".test.")||o.includes(".spec.")||o.includes("__tests__"))||t.includes("test")?"test":n.some(o=>o.includes("migration"))||t.includes("migrat")?"migration":e.owns.length>=3||(e.estimatedLines??0)>500||s.includes("refactor")||s.includes("restructur")?"complex-code":"simple-code"}function Jr(e,n){switch(e){case"docs":return{provider:"deepseek",model:"deepseek-chat",reasoning:`Routed documentation stream "${n.name}" to cheapest provider (DeepSeek)`};case"test":return{provider:"openai",model:"gpt-4o",reasoning:`Routed test stream "${n.name}" to mid-tier provider (GPT-4o)`};case"migration":return{provider:"google",model:"gemini-2.5-pro",reasoning:`Routed migration stream "${n.name}" to cost-effective provider (Gemini)`};case"complex-code":return{provider:"anthropic",model:"claude-sonnet-4-5-20250929",reasoning:`Routed complex code stream "${n.name}" (${n.owns.length} files${(n.estimatedLines??0)>500?", large file edits":""}) to premium provider (Claude)`};default:return{provider:"openai",model:"gpt-4o",reasoning:`Routed simple code stream "${n.name}" to balanced provider (GPT-4o)`}}}function Xr(e){switch(e){case"docs":return["gemini","openai","anthropic"];case"test":return["anthropic","gemini","deepseek"];case"migration":return["openai","anthropic","deepseek"];case"complex-code":return["openai","gemini","deepseek"];default:return["anthropic","gemini","deepseek"]}}function $s(e,n,t){let s=t?.availableProviders,o=t?.registryModels,r=(c,l)=>o?.[c]?.length?o[c].includes(l)?l:o[c][0]:l;if(n.overrides?.[e.id]){let c=n.overrides[e.id];return{provider:c.provider,model:c.model,reasoning:"User override"}}if(n.defaultProvider){let c=n.defaultModel??vs[n.defaultProvider]??n.defaultProvider,l=r(n.defaultProvider,c);return{provider:n.defaultProvider,model:l,reasoning:"User default provider preference"}}let i=Gr(e),a=Jr(i,e);if(s&&!s.has(a.provider)){let c=Xr(i);for(let l of c)if(s.has(l)){let u=r(l,vs[l]??l);return{provider:l,model:u,reasoning:`${a.reasoning} \u2014 ${a.provider} not available, fell back to ${l}`}}}return a.model=r(a.provider,a.model),a}function ks(e){let n=e??rt.join(process.env.HOME??"",".orchex"),t=rt.join(n,"config.json");try{let s=Ss.readFileSync(t,"utf-8"),o=JSON.parse(s);return{defaultProvider:o.routing?.defaultProvider,defaultModel:o.routing?.defaultModel,overrides:o.routing?.overrides}}catch{return{}}}var Ma,vs,bs=y(()=>{"use strict";ot();Ma=Vr("smart-router"),vs={anthropic:"claude-sonnet-4-5-20250929",openai:"gpt-4.1",google:"gemini-2.5-pro",deepseek:"deepseek-chat",ollama:"llama3.3:70b"}});import*as V from"fs/promises";import*as $e from"path";function Cs(e){let n=e.streamResults.filter(r=>r.status==="complete").length,t=e.streamResults.filter(r=>r.status==="failed").length,s=e.streamResults.filter(r=>r.status==="skipped").length,o=e.streamResults.reduce((r,i)=>r+(i.executionTimeMs??0),0);return{id:e.runId,feature:e.feature,timestamp:e.timestamp,success:e.planQualityScore>=80,totalStreams:e.totalStreams,completedStreams:n,failedStreams:t,skippedStreams:s,totalWaves:e.totalWaves,executionTimeMs:o,streams:e.streamResults.map(r=>({id:r.id,name:r.name,status:r.status,wave:0,filesOwned:0,executionTimeMs:r.executionTimeMs??0,tokensUsed:r.tokensUsed??{input:0,output:0},errorCategory:r.errorCategory}))}}function Es(e){if(e.length<Qr)return[];let n=[],t=[Zr,ei,ti,ni,si,oi,ri];for(let s of t){let o=s(e);o&&n.push(o)}return n}function Zr(e){let n={low:{total:0,success:0,ids:[]},mid:{total:0,success:0,ids:[]},high:{total:0,success:0,ids:[]}};for(let u of e){let d=u.totalStreams<=5?"low":u.totalStreams<=8?"mid":"high";n[d].total++,u.success&&n[d].success++,n[d].ids.push(u.id)}if(n.low.total<3&&n.mid.total<3||n.high.total<2&&n.mid.total<2)return null;let t=n.low.total>0?n.low.success/n.low.total:0,s=n.high.total>0?n.high.success/n.high.total:0,o=n.mid.total>0?n.mid.success/n.mid.total:0,r=Math.max(t,o),i=Math.min(t,o,s);if(r-i<.2)return null;let a=t>=o?"low (1-5 streams)":"mid (6-8 streams)",c=Math.max(t,o),l=[...n.low.ids,...n.mid.ids,...n.high.ids];return{type:j.STREAM_COUNT_SWEET_SPOT,description:`Plans with ${a} succeed ${(c*100).toFixed(0)}% of the time`,confidence:Math.min(e.length/20,1),recommendation:`Prefer ${a.includes("low")?"3-5":"6-8"} streams per plan. Larger plans (${n.high.total>0?`>8 streams: ${(s*100).toFixed(0)}% success`:"not enough data"}) tend to fail more.`,evidence:{reportIds:l,metric:"streamCount",values:{"low_1-5_rate":`${(t*100).toFixed(0)}%`,"mid_6-8_rate":`${(o*100).toFixed(0)}%`,"high_9+_rate":`${(s*100).toFixed(0)}%`,low_count:n.low.total,high_count:n.high.total}}}}function ei(e){let n=0,t=0,s=0,o=0,r=[];for(let c of e){for(let l of c.streams)l.filesOwned<=4?(t++,l.status==="complete"&&n++):(o++,l.status==="complete"&&s++);r.push(c.id)}if(t<5||o<3)return null;let i=n/t,a=s/o;return i-a<.15?null:{type:j.FILE_PER_STREAM,description:`Streams with <=4 files succeed ${(i*100).toFixed(0)}%, streams with >4 files succeed ${(a*100).toFixed(0)}%`,confidence:Math.min((t+o)/30,1),recommendation:"Keep streams to 4 or fewer owned files. Split larger streams into focused units.",evidence:{reportIds:r,metric:"filesPerStream",values:{low_files_success_rate:`${(i*100).toFixed(0)}%`,high_files_success_rate:`${(a*100).toFixed(0)}%`,low_files_count:t,high_files_count:o}}}}function ti(e){let n={},t=0,s=[];for(let c of e){for(let l of c.streams)l.status==="failed"&&l.errorCategory&&(n[l.errorCategory]=(n[l.errorCategory]||0)+1,t++);c.failedStreams>0&&s.push(c.id)}if(t<3)return null;let o=Object.entries(n).sort((c,l)=>l[1]-c[1]),[r,i]=o[0],a=i/t*100;return{type:j.SELF_HEAL_PATTERN,description:`${r} errors are the most common failure (${a.toFixed(0)}% of all errors)`,confidence:Math.min(t/15,1),recommendation:`Focus on preventing ${r} errors. Consider adding targeted verify commands or adjusting prompts to avoid this error type.`,evidence:{reportIds:s,metric:"errorCategories",values:Object.fromEntries(o.map(([c,l])=>[c,`${l} (${(l/t*100).toFixed(0)}%)`]))}}}function ni(e){let n=0,t=0,s=0,o=0,r=[];for(let c of e){let l=new Set(c.streams.filter(u=>!u.name.toLowerCase().includes("test")).map(u=>u.id));for(let u of c.streams){if(!u.name.toLowerCase().includes("test"))continue;u.deps&&u.deps.some(p=>l.has(p))?(n++,u.status==="complete"&&t++):(s++,u.status==="complete"&&o++)}r.push(c.id)}if(n<3||s<3)return null;let i=t/n,a=o/s;return i-a<.15?null:{type:j.DEPENDENCY_ORDERING,description:`Test streams with impl dependencies succeed ${(i*100).toFixed(0)}%, without: ${(a*100).toFixed(0)}%`,confidence:Math.min((n+s)/15,1),recommendation:"Always add implementation streams as dependencies of test streams. Place tests in later waves.",evidence:{reportIds:r,metric:"dependencyOrdering",values:{with_deps_rate:`${(i*100).toFixed(0)}%`,without_deps_rate:`${(a*100).toFixed(0)}%`,with_deps_count:n,without_deps_count:s}}}}function si(e){let n={low:{total:0,success:0},high:{total:0,success:0}},t=[];for(let c of e){let l=c.totalWaves<=3?"low":"high";n[l].total++,c.success&&n[l].success++,t.push(c.id)}if(n.low.total<3||n.high.total<3)return null;let s=n.low.success/n.low.total,o=n.high.success/n.high.total;if(Math.abs(s-o)<.15)return null;let r=s>=o?"low":"high",i=r==="low"?s:o,a=r==="low"?"1-3":"4+";return{type:j.WAVE_EFFICIENCY,description:`Orchestrations with ${a} waves succeed ${(i*100).toFixed(0)}%`,confidence:Math.min(e.length/15,1),recommendation:`Prefer ${a} waves for best results. ${r==="low"?"Keep dependency depth shallow.":"More waves indicates better dependency structure."}`,evidence:{reportIds:t,metric:"waveCount",values:{"low_1-3_rate":`${(s*100).toFixed(0)}%`,"high_4+_rate":`${(o*100).toFixed(0)}%`,low_count:n.low.total,high_count:n.high.total}}}}function oi(e){let n={},t=[];for(let c of e){for(let l of c.streams){let u=l.provider??c.provider??"unknown";u!=="unknown"&&(n[u]||(n[u]={total:0,success:0}),n[u].total++,l.status==="complete"&&n[u].success++)}t.push(c.id)}let s=Object.entries(n).filter(([c,l])=>l.total>=3);if(s.length<2)return null;let o=s.map(([c,l])=>({name:c,rate:l.success/l.total,total:l.total})),r=o.sort((c,l)=>l.rate-c.rate),i=r[0],a=r[r.length-1];return i.rate-a.rate<.1?null:{type:j.PROVIDER_PERFORMANCE,description:`${i.name} succeeds ${(i.rate*100).toFixed(0)}%, ${a.name}: ${(a.rate*100).toFixed(0)}%`,confidence:Math.min(s.reduce((c,[l,u])=>c+u.total,0)/30,1),recommendation:`${i.name} performs best in your project. Consider using it as the default provider.`,evidence:{reportIds:t,metric:"providerPerformance",values:Object.fromEntries(o.map(c=>[c.name,`${(c.rate*100).toFixed(0)}% (n=${c.total})`]))}}}function ri(e){let n={morning:{total:0,success:0},afternoon:{total:0,success:0},evening:{total:0,success:0},night:{total:0,success:0}},t=[];for(let c of e){let l=new Date(c.timestamp).getHours(),u=l<6?"night":l<12?"morning":l<18?"afternoon":"evening";n[u].total++,c.success&&n[u].success++,t.push(c.id)}let s=Object.entries(n).filter(([c,l])=>l.total>=3);if(s.length<2)return null;let o=s.map(([c,l])=>({name:c,rate:l.success/l.total,total:l.total})),r=o.sort((c,l)=>l.rate-c.rate),i=r[0],a=r[r.length-1];return i.rate-a.rate<.2?null:{type:j.TIME_OF_DAY,description:`${i.name} runs succeed ${(i.rate*100).toFixed(0)}%, ${a.name}: ${(a.rate*100).toFixed(0)}%`,confidence:Math.min(e.length/20,1),recommendation:`Orchestrations during ${i.name} hours have the highest success rate. This may correlate with API rate limit availability.`,evidence:{reportIds:t,metric:"timeOfDay",values:Object.fromEntries(o.map(c=>[c.name,`${(c.rate*100).toFixed(0)}% (n=${c.total})`]))}}}function Ps(e){if(e.length===0)return"No significant patterns detected yet. Need more execution history.";let n=["=== Detected Patterns ===",""];for(let t of e){let s=t.confidence>=.7?"HIGH":t.confidence>=.4?"MEDIUM":"LOW";n.push(`[${s}] ${t.description}`),n.push(` Recommendation: ${t.recommendation}`),n.push("")}return n.join(`
171
+ `),verify:h,setup:k.length>0?k:void 0,timeoutMs:b},a.push(`Merged [${l.join(", ")}] \u2192 ${u} (shared files: ${[...f].filter(v=>(n.get(v)??[]).length>1).join(", ")})`)}for(let[l,u]of Object.entries(i)){let d=u.deps??[],f=[...new Set(d.map(p=>c.get(p)??p))].filter(p=>p!==l);u.deps=f}return{streams:i,merges:a}}var us=y(()=>{"use strict"});function ds(e){return e.isTestGeneration?{provider:void 0,confidence:.3,reason:"Test generation works well with any provider \u2014 use your default."}:e.isStructuralChange&&(e.totalOwnedLines>500||e.fileCount>4)?{provider:"anthropic",confidence:.7,reason:`Structural edits across ${e.fileCount} files (${e.totalOwnedLines} lines) \u2014 Claude handles complex multi-file reasoning best.`}:!e.isStructuralChange&&e.totalOwnedLines<200&&e.fileCount<=2?{provider:"openai",model:"gpt-4.1-mini",confidence:.6,reason:`Simple transform (${e.totalOwnedLines} lines, ${e.fileCount} files) \u2014 GPT-4.1-mini is cost-effective for small tasks.`}:e.isStructuralChange?{provider:"anthropic",confidence:.5,reason:`Structural changes across ${e.fileCount} files \u2014 Claude recommended for refactoring tasks.`}:{provider:void 0,confidence:.2,reason:"No strong provider preference for this task type \u2014 use your configured default."}}function fs(e,n,t){let s=e.toLowerCase(),o=s.includes("test")||s.includes("spec")||n.some(a=>a.includes(".test.")||a.includes(".spec.")||a.startsWith("tests/")),i=["refactor","restructure","reorganize","migrate","rewrite","split","merge","move","rename","extract","inline","new module","new class","new service","new component"].some(a=>s.includes(a));return{totalOwnedLines:t,isStructuralChange:i,isTestGeneration:o,fileCount:n.length}}var ps=y(()=>{"use strict"});import*as K from"fs/promises";import*as nt from"path";import*as ve from"yaml";import{exec as qr}from"child_process";import{promisify as Yr}from"util";async function hs(e,n){let t=nt.join(e,".orchex","active","manifest.yaml"),s=await K.readFile(t,"utf-8"),o=ve.parse(s),r=new Set(n);for(let[i,a]of Object.entries(o.streams))a.status==="pending"&&(r.has(i)||(o.streams[i].status="skipped"));await K.writeFile(t,ve.stringify(o,{indent:2,lineWidth:0}),"utf-8")}async function gs(e,n,t){let s=[],o=[];for(let r of t){let i=nt.join(e,r);try{let{stdout:a}=await ms(`git ls-files "${r}"`,{cwd:e});if(a.trim())await ms(`git checkout HEAD -- "${r}"`,{cwd:e}),s.push(r);else try{await K.unlink(i),s.push(r)}catch(c){c.code!=="ENOENT"&&o.push(`Failed to delete ${r}: ${c.message}`)}}catch(a){if(a.message?.includes("did not match any"))continue;o.push(`Failed to rollback ${r}: ${a.message}`)}}return{streamId:n,reverted:s,errors:o}}var ms,ws=y(()=>{"use strict";ms=Yr(qr)});function st(e){if(Se[e])return Se[e];let n=e.toLowerCase();for(let[t,s]of Object.entries(Se))if(t!=="default"&&n.includes(t.split("-").slice(0,2).join("-")))return s;return Se.default}function ys(e,n,t,s){let o=st(t),r=e/1e3*o.input,i=n/1e3*o.output,a=r+i,c;s&&s>0&&(c=s/1e3*o.input*Kr);let l=a-(c??0);return{inputTokens:e,outputTokens:n,inputCost:r,outputCost:i,totalCost:a,cacheHitTokens:s,cacheDiscount:c,finalCost:l,model:t}}function xs(e,n,t=.3){let s=Math.ceil(e*t);return ys(e,s,n)}var Se,Kr,ot=y(()=>{"use strict";Se={"claude-opus-4-5-20251101":{input:.015,output:.075},"claude-sonnet-4-5-20250929":{input:.003,output:.015},"claude-sonnet-4-20250514":{input:.003,output:.015},"claude-3-5-sonnet-20241022":{input:.003,output:.015},"claude-3-opus-20240229":{input:.015,output:.075},"claude-3-haiku-20240307":{input:25e-5,output:.00125},"gpt-4.5-turbo":{input:.005,output:.015},"gpt-4-turbo":{input:.01,output:.03},"gpt-4-turbo-preview":{input:.01,output:.03},"gpt-4o":{input:.005,output:.015},"gpt-4o-mini":{input:15e-5,output:6e-4},"o1-preview":{input:.015,output:.06},"o1-mini":{input:.003,output:.012},"o3-mini":{input:.0011,output:.0044},"gpt-3.5-turbo":{input:5e-4,output:.0015},"gemini-2.5-pro":{input:.00125,output:.01},"gemini-2.0-flash":{input:1e-4,output:4e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4},"gemini-pro":{input:125e-6,output:375e-6},"deepseek-chat":{input:28e-5,output:42e-5},"deepseek-coder":{input:28e-5,output:42e-5},"deepseek-reasoner":{input:55e-5,output:.00219},"kimi-k2-0905-preview":{input:6e-4,output:.0025},"kimi-k2-turbo-preview":{input:6e-4,output:.0025},"kimi-latest":{input:6e-4,output:.0025},"moonshot-v1-8k":{input:.00168,output:.00168},"moonshot-v1-32k":{input:.0024,output:.0024},"moonshot-v1-128k":{input:.012,output:.012},"llama3.3:70b":{input:0,output:0},"llama3.2:latest":{input:0,output:0},"mistral:latest":{input:0,output:0},default:{input:.003,output:.015}},Kr=.9});import*as Ss from"fs";import*as rt from"path";import{createLogger as Vr}from"../logging.js";function Gr(e){let n=[...e.owns,...e.reads??[]],t=e.name.toLowerCase(),s=(e.plan??"").toLowerCase();return n.some(o=>o.match(/\.(md|mdx|txt|rst)$/))||t.includes("doc")||t.includes("readme")?"docs":n.some(o=>o.includes(".test.")||o.includes(".spec.")||o.includes("__tests__"))||t.includes("test")?"test":n.some(o=>o.includes("migration"))||t.includes("migrat")?"migration":e.owns.length>=3||(e.estimatedLines??0)>500||s.includes("refactor")||s.includes("restructur")?"complex-code":"simple-code"}function Jr(e,n){switch(e){case"docs":return{provider:"deepseek",model:"deepseek-chat",reasoning:`Routed documentation stream "${n.name}" to cheapest provider (DeepSeek)`};case"test":return{provider:"openai",model:"gpt-4o",reasoning:`Routed test stream "${n.name}" to mid-tier provider (GPT-4o)`};case"migration":return{provider:"google",model:"gemini-2.5-pro",reasoning:`Routed migration stream "${n.name}" to cost-effective provider (Gemini)`};case"complex-code":return{provider:"anthropic",model:"claude-sonnet-4-5-20250929",reasoning:`Routed complex code stream "${n.name}" (${n.owns.length} files${(n.estimatedLines??0)>500?", large file edits":""}) to premium provider (Claude)`};default:return{provider:"openai",model:"gpt-4o",reasoning:`Routed simple code stream "${n.name}" to balanced provider (GPT-4o)`}}}function Xr(e){switch(e){case"docs":return["gemini","openai","anthropic"];case"test":return["anthropic","gemini","deepseek"];case"migration":return["openai","anthropic","deepseek"];case"complex-code":return["openai","gemini","deepseek"];default:return["anthropic","gemini","deepseek"]}}function ks(e,n,t){let s=t?.availableProviders,o=t?.registryModels,r=(c,l)=>o?.[c]?.length?o[c].includes(l)?l:o[c][0]:l;if(n.overrides?.[e.id]){let c=n.overrides[e.id];return{provider:c.provider,model:c.model,reasoning:"User override"}}if(n.defaultProvider){let c=n.defaultModel??vs[n.defaultProvider]??n.defaultProvider,l=r(n.defaultProvider,c);return{provider:n.defaultProvider,model:l,reasoning:"User default provider preference"}}let i=Gr(e),a=Jr(i,e);if(s&&!s.has(a.provider)){let c=Xr(i);for(let l of c)if(s.has(l)){let u=r(l,vs[l]??l);return{provider:l,model:u,reasoning:`${a.reasoning} \u2014 ${a.provider} not available, fell back to ${l}`}}}return a.model=r(a.provider,a.model),a}function $s(e){let n=e??rt.join(process.env.HOME??"",".orchex"),t=rt.join(n,"config.json");try{let s=Ss.readFileSync(t,"utf-8"),o=JSON.parse(s);return{defaultProvider:o.routing?.defaultProvider,defaultModel:o.routing?.defaultModel,overrides:o.routing?.overrides}}catch{return{}}}var Ia,vs,bs=y(()=>{"use strict";ot();Ia=Vr("smart-router"),vs={anthropic:"claude-sonnet-4-5-20250929",openai:"gpt-4.1",google:"gemini-2.5-pro",deepseek:"deepseek-chat",kimi:"kimi-k2-0905-preview",ollama:"llama3.3:70b"}});import*as V from"fs/promises";import*as ke from"path";function Cs(e){let n=e.streamResults.filter(r=>r.status==="complete").length,t=e.streamResults.filter(r=>r.status==="failed").length,s=e.streamResults.filter(r=>r.status==="skipped").length,o=e.streamResults.reduce((r,i)=>r+(i.executionTimeMs??0),0);return{id:e.runId,feature:e.feature,timestamp:e.timestamp,success:e.planQualityScore>=80,totalStreams:e.totalStreams,completedStreams:n,failedStreams:t,skippedStreams:s,totalWaves:e.totalWaves,executionTimeMs:o,streams:e.streamResults.map(r=>({id:r.id,name:r.name,status:r.status,wave:0,filesOwned:0,executionTimeMs:r.executionTimeMs??0,tokensUsed:r.tokensUsed??{input:0,output:0},errorCategory:r.errorCategory}))}}function Es(e){if(e.length<Qr)return[];let n=[],t=[Zr,ei,ti,ni,si,oi,ri];for(let s of t){let o=s(e);o&&n.push(o)}return n}function Zr(e){let n={low:{total:0,success:0,ids:[]},mid:{total:0,success:0,ids:[]},high:{total:0,success:0,ids:[]}};for(let u of e){let d=u.totalStreams<=5?"low":u.totalStreams<=8?"mid":"high";n[d].total++,u.success&&n[d].success++,n[d].ids.push(u.id)}if(n.low.total<3&&n.mid.total<3||n.high.total<2&&n.mid.total<2)return null;let t=n.low.total>0?n.low.success/n.low.total:0,s=n.high.total>0?n.high.success/n.high.total:0,o=n.mid.total>0?n.mid.success/n.mid.total:0,r=Math.max(t,o),i=Math.min(t,o,s);if(r-i<.2)return null;let a=t>=o?"low (1-5 streams)":"mid (6-8 streams)",c=Math.max(t,o),l=[...n.low.ids,...n.mid.ids,...n.high.ids];return{type:j.STREAM_COUNT_SWEET_SPOT,description:`Plans with ${a} succeed ${(c*100).toFixed(0)}% of the time`,confidence:Math.min(e.length/20,1),recommendation:`Prefer ${a.includes("low")?"3-5":"6-8"} streams per plan. Larger plans (${n.high.total>0?`>8 streams: ${(s*100).toFixed(0)}% success`:"not enough data"}) tend to fail more.`,evidence:{reportIds:l,metric:"streamCount",values:{"low_1-5_rate":`${(t*100).toFixed(0)}%`,"mid_6-8_rate":`${(o*100).toFixed(0)}%`,"high_9+_rate":`${(s*100).toFixed(0)}%`,low_count:n.low.total,high_count:n.high.total}}}}function ei(e){let n=0,t=0,s=0,o=0,r=[];for(let c of e){for(let l of c.streams)l.filesOwned<=4?(t++,l.status==="complete"&&n++):(o++,l.status==="complete"&&s++);r.push(c.id)}if(t<5||o<3)return null;let i=n/t,a=s/o;return i-a<.15?null:{type:j.FILE_PER_STREAM,description:`Streams with <=4 files succeed ${(i*100).toFixed(0)}%, streams with >4 files succeed ${(a*100).toFixed(0)}%`,confidence:Math.min((t+o)/30,1),recommendation:"Keep streams to 4 or fewer owned files. Split larger streams into focused units.",evidence:{reportIds:r,metric:"filesPerStream",values:{low_files_success_rate:`${(i*100).toFixed(0)}%`,high_files_success_rate:`${(a*100).toFixed(0)}%`,low_files_count:t,high_files_count:o}}}}function ti(e){let n={},t=0,s=[];for(let c of e){for(let l of c.streams)l.status==="failed"&&l.errorCategory&&(n[l.errorCategory]=(n[l.errorCategory]||0)+1,t++);c.failedStreams>0&&s.push(c.id)}if(t<3)return null;let o=Object.entries(n).sort((c,l)=>l[1]-c[1]),[r,i]=o[0],a=i/t*100;return{type:j.SELF_HEAL_PATTERN,description:`${r} errors are the most common failure (${a.toFixed(0)}% of all errors)`,confidence:Math.min(t/15,1),recommendation:`Focus on preventing ${r} errors. Consider adding targeted verify commands or adjusting prompts to avoid this error type.`,evidence:{reportIds:s,metric:"errorCategories",values:Object.fromEntries(o.map(([c,l])=>[c,`${l} (${(l/t*100).toFixed(0)}%)`]))}}}function ni(e){let n=0,t=0,s=0,o=0,r=[];for(let c of e){let l=new Set(c.streams.filter(u=>!u.name.toLowerCase().includes("test")).map(u=>u.id));for(let u of c.streams){if(!u.name.toLowerCase().includes("test"))continue;u.deps&&u.deps.some(p=>l.has(p))?(n++,u.status==="complete"&&t++):(s++,u.status==="complete"&&o++)}r.push(c.id)}if(n<3||s<3)return null;let i=t/n,a=o/s;return i-a<.15?null:{type:j.DEPENDENCY_ORDERING,description:`Test streams with impl dependencies succeed ${(i*100).toFixed(0)}%, without: ${(a*100).toFixed(0)}%`,confidence:Math.min((n+s)/15,1),recommendation:"Always add implementation streams as dependencies of test streams. Place tests in later waves.",evidence:{reportIds:r,metric:"dependencyOrdering",values:{with_deps_rate:`${(i*100).toFixed(0)}%`,without_deps_rate:`${(a*100).toFixed(0)}%`,with_deps_count:n,without_deps_count:s}}}}function si(e){let n={low:{total:0,success:0},high:{total:0,success:0}},t=[];for(let c of e){let l=c.totalWaves<=3?"low":"high";n[l].total++,c.success&&n[l].success++,t.push(c.id)}if(n.low.total<3||n.high.total<3)return null;let s=n.low.success/n.low.total,o=n.high.success/n.high.total;if(Math.abs(s-o)<.15)return null;let r=s>=o?"low":"high",i=r==="low"?s:o,a=r==="low"?"1-3":"4+";return{type:j.WAVE_EFFICIENCY,description:`Orchestrations with ${a} waves succeed ${(i*100).toFixed(0)}%`,confidence:Math.min(e.length/15,1),recommendation:`Prefer ${a} waves for best results. ${r==="low"?"Keep dependency depth shallow.":"More waves indicates better dependency structure."}`,evidence:{reportIds:t,metric:"waveCount",values:{"low_1-3_rate":`${(s*100).toFixed(0)}%`,"high_4+_rate":`${(o*100).toFixed(0)}%`,low_count:n.low.total,high_count:n.high.total}}}}function oi(e){let n={},t=[];for(let c of e){for(let l of c.streams){let u=l.provider??c.provider??"unknown";u!=="unknown"&&(n[u]||(n[u]={total:0,success:0}),n[u].total++,l.status==="complete"&&n[u].success++)}t.push(c.id)}let s=Object.entries(n).filter(([c,l])=>l.total>=3);if(s.length<2)return null;let o=s.map(([c,l])=>({name:c,rate:l.success/l.total,total:l.total})),r=o.sort((c,l)=>l.rate-c.rate),i=r[0],a=r[r.length-1];return i.rate-a.rate<.1?null:{type:j.PROVIDER_PERFORMANCE,description:`${i.name} succeeds ${(i.rate*100).toFixed(0)}%, ${a.name}: ${(a.rate*100).toFixed(0)}%`,confidence:Math.min(s.reduce((c,[l,u])=>c+u.total,0)/30,1),recommendation:`${i.name} performs best in your project. Consider using it as the default provider.`,evidence:{reportIds:t,metric:"providerPerformance",values:Object.fromEntries(o.map(c=>[c.name,`${(c.rate*100).toFixed(0)}% (n=${c.total})`]))}}}function ri(e){let n={morning:{total:0,success:0},afternoon:{total:0,success:0},evening:{total:0,success:0},night:{total:0,success:0}},t=[];for(let c of e){let l=new Date(c.timestamp).getHours(),u=l<6?"night":l<12?"morning":l<18?"afternoon":"evening";n[u].total++,c.success&&n[u].success++,t.push(c.id)}let s=Object.entries(n).filter(([c,l])=>l.total>=3);if(s.length<2)return null;let o=s.map(([c,l])=>({name:c,rate:l.success/l.total,total:l.total})),r=o.sort((c,l)=>l.rate-c.rate),i=r[0],a=r[r.length-1];return i.rate-a.rate<.2?null:{type:j.TIME_OF_DAY,description:`${i.name} runs succeed ${(i.rate*100).toFixed(0)}%, ${a.name}: ${(a.rate*100).toFixed(0)}%`,confidence:Math.min(e.length/20,1),recommendation:`Orchestrations during ${i.name} hours have the highest success rate. This may correlate with API rate limit availability.`,evidence:{reportIds:t,metric:"timeOfDay",values:Object.fromEntries(o.map(c=>[c.name,`${(c.rate*100).toFixed(0)}% (n=${c.total})`]))}}}function Ps(e){if(e.length===0)return"No significant patterns detected yet. Need more execution history.";let n=["=== Detected Patterns ===",""];for(let t of e){let s=t.confidence>=.7?"HIGH":t.confidence>=.4?"MEDIUM":"LOW";n.push(`[${s}] ${t.description}`),n.push(` Recommendation: ${t.recommendation}`),n.push("")}return n.join(`
172
172
  `)}function Os(e){if(e.length===0)return"";let n=e.filter(t=>t.confidence>=.4).map(t=>`- ${t.recommendation}`).join(`
173
173
  `);return n?["## Project-Specific Guidance (from execution history)","","Based on this project's past orchestration runs:",n,"","Apply these recommendations when generating the plan."].join(`
174
- `):""}function Ts(e){return $e.join(e,".orchex","learn","patterns.json")}async function _s(e,n){let t=Ts(e),s=$e.dirname(t);await V.mkdir(s,{recursive:!0}),await V.writeFile(t,JSON.stringify(n,null,2),"utf-8")}async function Ms(e){let n=Ts(e);try{let t=await V.readFile(n,"utf-8");return JSON.parse(t)}catch{return[]}}var j,Qr,Is=y(()=>{"use strict";(function(e){e.STREAM_COUNT_SWEET_SPOT="stream-count-sweet-spot",e.DEPENDENCY_ORDERING="dependency-ordering",e.FILE_PER_STREAM="file-per-stream",e.WAVE_EFFICIENCY="wave-efficiency",e.PROVIDER_PERFORMANCE="provider-performance",e.SELF_HEAL_PATTERN="self-heal-pattern",e.TIME_OF_DAY="time-of-day"})(j||(j={}));Qr=5});function ke(e){let n=[],t=/(?:import|export)\s+.*?from\s+['"](.+?)['"]/g,s;for(;(s=t.exec(e))!==null;)n.push(s[1]);let o=/require\s*\(\s*['"](.+?)['"]\s*\)/g;for(;(s=o.exec(e))!==null;)n.push(s[1]);return n}function be(e,n){if(!n.startsWith("."))return null;let t=e.substring(0,e.lastIndexOf("/")),s=n.replace(/\.js$/,""),o=[...t.split("/"),...s.split("/")],r=[];for(let a of o)a===".."?r.pop():a!=="."&&r.push(a);let i=r.join("/");return i.endsWith(".ts")?i:i+".ts"}var it=y(()=>{"use strict"});function As(e,n,t){let s=new Set([...e]),o=new Set,r=[...e],i=[],a=new Map;for(let l of e)a.set(l,[]);for(;r.length>0;){let l=r.shift();if(o.has(l))continue;o.add(l);let u=t[l];if(!u)continue;let d=ke(u);for(let f of d){let p=be(l,f);if(p&&t[p]){if(o.has(p)){let m=a.get(l)||[];i.push(`Circular dependency detected: ${[...m,l,p].join(" \u2192 ")}`)}else if(!s.has(p)){s.add(p),r.push(p);let m=a.get(l)||[];a.set(p,[...m,l])}}}}for(let l of n)s.add(l);let c=Object.keys(t).filter(l=>!s.has(l));return{needed:[...s],pruned:c,warnings:i.length>0?i:void 0}}function Rs(e,n,t){let s=[];return t.length>100&&s.push({content:t,type:"system_prompt",reusable:!0,estimatedTokens:re(t)}),e.length>500&&s.push({content:e,type:"project_context",reusable:!0,estimatedTokens:re(e)}),n.length>500&&s.push({content:n,type:"stream_context",reusable:!0,estimatedTokens:re(n)}),s}function re(e){if(!e||e.length===0)return 0;let n=e.trim().startsWith("{")||e.trim().startsWith("["),t=/^#+\s|^-\s|^\*\s|^\d+\.\s/m.test(e);if(n)return Math.ceil(e.length/G.JSON);if(t)return Math.ceil(e.length/G.MARKDOWN);let s=e.split(`
174
+ `):""}function Ts(e){return ke.join(e,".orchex","learn","patterns.json")}async function _s(e,n){let t=Ts(e),s=ke.dirname(t);await V.mkdir(s,{recursive:!0}),await V.writeFile(t,JSON.stringify(n,null,2),"utf-8")}async function Is(e){let n=Ts(e);try{let t=await V.readFile(n,"utf-8");return JSON.parse(t)}catch{return[]}}var j,Qr,Ms=y(()=>{"use strict";(function(e){e.STREAM_COUNT_SWEET_SPOT="stream-count-sweet-spot",e.DEPENDENCY_ORDERING="dependency-ordering",e.FILE_PER_STREAM="file-per-stream",e.WAVE_EFFICIENCY="wave-efficiency",e.PROVIDER_PERFORMANCE="provider-performance",e.SELF_HEAL_PATTERN="self-heal-pattern",e.TIME_OF_DAY="time-of-day"})(j||(j={}));Qr=5});function $e(e){let n=[],t=/(?:import|export)\s+.*?from\s+['"](.+?)['"]/g,s;for(;(s=t.exec(e))!==null;)n.push(s[1]);let o=/require\s*\(\s*['"](.+?)['"]\s*\)/g;for(;(s=o.exec(e))!==null;)n.push(s[1]);return n}function be(e,n){if(!n.startsWith("."))return null;let t=e.substring(0,e.lastIndexOf("/")),s=n.replace(/\.js$/,""),o=[...t.split("/"),...s.split("/")],r=[];for(let a of o)a===".."?r.pop():a!=="."&&r.push(a);let i=r.join("/");return i.endsWith(".ts")?i:i+".ts"}var it=y(()=>{"use strict"});function As(e,n,t){let s=new Set([...e]),o=new Set,r=[...e],i=[],a=new Map;for(let l of e)a.set(l,[]);for(;r.length>0;){let l=r.shift();if(o.has(l))continue;o.add(l);let u=t[l];if(!u)continue;let d=$e(u);for(let f of d){let p=be(l,f);if(p&&t[p]){if(o.has(p)){let m=a.get(l)||[];i.push(`Circular dependency detected: ${[...m,l,p].join(" \u2192 ")}`)}else if(!s.has(p)){s.add(p),r.push(p);let m=a.get(l)||[];a.set(p,[...m,l])}}}}for(let l of n)s.add(l);let c=Object.keys(t).filter(l=>!s.has(l));return{needed:[...s],pruned:c,warnings:i.length>0?i:void 0}}function Rs(e,n,t){let s=[];return t.length>100&&s.push({content:t,type:"system_prompt",reusable:!0,estimatedTokens:re(t)}),e.length>500&&s.push({content:e,type:"project_context",reusable:!0,estimatedTokens:re(e)}),n.length>500&&s.push({content:n,type:"stream_context",reusable:!0,estimatedTokens:re(n)}),s}function re(e){if(!e||e.length===0)return 0;let n=e.trim().startsWith("{")||e.trim().startsWith("["),t=/^#+\s|^-\s|^\*\s|^\d+\.\s/m.test(e);if(n)return Math.ceil(e.length/G.JSON);if(t)return Math.ceil(e.length/G.MARKDOWN);let s=e.split(`
175
175
  `),o=0,r=0,i=0,a=0;for(let f of s){let p=f.trim();if(o+=f.length,p.length===0){a+=f.length;continue}if(p.startsWith("//")||p.startsWith("/*")||p.startsWith("*")||p.startsWith("#"))i+=f.length;else{r+=f.length;let m=f.length-p.length;a+=m,r-=m}}let c=Math.ceil(r/G.CODE),l=Math.ceil(i/G.COMMENTS),u=Math.ceil(a/G.WHITESPACE),d=Math.ceil((o-r-i-a)/G.COMMENTS);return c+l+u+d}var G,Fs=y(()=>{"use strict";it();G={CODE:3.5,COMMENTS:4.5,WHITESPACE:6,JSON:3.8,MARKDOWN:4.2}});function Ls(e,n){return n&&Ds[n]?Ds[n]:js[e]??js.default}function Ns(e,n,t){let s=Ls(n,t),o=e?.softLimitTokens??Math.floor(s*ii),r=e?.hardLimitTokens??Math.floor(s*ai),i=e?.enforcementLevel??"warn",a=e?.warningThreshold??ci;return{enforcementLevel:i,softLimitTokens:o,hardLimitTokens:r,warningThreshold:a,provider:n,model:t}}function li(e,n,t){let s=n-t,o=Math.round(s/t*100);if(e==="none")return"";let r=[`Context is ${o}% over the ${e} limit.`,"Consider:",' - Reducing the number of files in "reads"'," - Splitting the stream into smaller tasks"," - Using file patterns instead of directories"," - Extracting only function signatures instead of full files"];return e==="hard"&&r.push(" - Or increase the hard limit in contextBudget settings"),r.join(`
176
- `)}function Ws(e,n){let t=Ls(n.provider,n.model),{softLimitTokens:s,hardLimitTokens:o,warningThreshold:r,enforcementLevel:i}=n,a="none",c=s;e>=o?(a="hard",c=o):e>=s&&(a="soft",c=s);let l=e/s,u=!0;a==="hard"&&i==="hard"?u=!1:a==="soft"&&i==="soft"&&(u=!0);let d;if(a!=="none"){let p=a==="hard"?"hard limit":"soft limit";d=`Context size (${e.toLocaleString()} tokens) exceeds ${p} (${c.toLocaleString()} tokens)`,u||(d+=". Execution blocked.")}else l>=r&&(d=`Context size at ${Math.round(l*100)}% of soft limit (${e.toLocaleString()} / ${s.toLocaleString()} tokens)`);let f=a!=="none"?li(a,e,c):void 0;return{allowed:u,violationType:a,estimatedTokens:e,budgetLimit:c,utilizationRatio:l,warning:d,suggestion:f,providerLimit:t}}var js,Ds,ii,ai,ci,Ce,Us=y(()=>{"use strict";js={anthropic:2e5,openai:128e3,gemini:1e6,deepseek:128e3,ollama:128e3,default:1e5},Ds={"claude-opus-4-5-20251101":2e5,"claude-sonnet-4-5-20250929":2e5,"claude-sonnet-4-20250514":2e5,"claude-3-5-sonnet-20241022":2e5,"claude-3-opus-20240229":2e5,"claude-3-haiku-20240307":2e5,"gpt-4.5-turbo":128e3,"gpt-4-turbo":128e3,"gpt-4-turbo-preview":128e3,"gpt-4o":128e3,"gpt-4o-mini":128e3,"o1-preview":128e3,"o1-mini":128e3,"o3-mini":2e5,"gpt-3.5-turbo":16385,"gemini-2.5-pro":1e6,"gemini-2.0-flash":1e6,"gemini-1.5-pro":1e6,"gemini-1.5-flash":1e6,"gemini-pro":32768,"deepseek-chat":128e3,"deepseek-coder":128e3,"deepseek-reasoner":128e3,"llama3.3:70b":128e3,"llama3.2:latest":128e3,"mistral:latest":32e3},ii=.7,ai=.9,ci=.8;Ce=class extends Error{checkResult;streamId;constructor(n,t){let s=t?` for stream "${t}"`:"";super(`Context budget exceeded${s}: ${n.warning}`),this.checkResult=n,this.streamId=t,this.name="ContextBudgetExceededError"}}});function Hs(e,n,t=300,s=10,o=120,r=!1){let i=e.split(/\r?\n/);if(i.length<t||n.length===0)return e;let a=n.map(h=>new RegExp(ui(h),"i")),c=[];for(let h=0;h<i.length;++h)a.some(w=>w.test(i[h]))&&c.push(h);let l=new Set;for(let h of c)for(let w=Math.max(0,h-s);w<=Math.min(i.length-1,h+s);++w)l.add(w);if(l.size<Math.min(20,s*2)){for(let h=0;h<Math.min(s*2,i.length);++h)l.add(h);for(let h=Math.max(0,i.length-s*2);h<i.length;++h)l.add(h)}let d=Array.from(l).sort((h,w)=>h-w).slice(0,o),f=-2,p=[],m=r?String(i.length).length:0;for(let h of d)h>f+1&&p.length>0&&p.push("..."),r?p.push(`${String(h+1).padStart(m)}: ${i[h]}`):p.push(i[h]),f=h;return p.join(`
177
- `)}function ui(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var zs=y(()=>{"use strict"});var bn={};ie(bn,{ContextBudgetExceededError:()=>Ce,DEFAULT_THRESHOLDS:()=>Z,PlanContractStreamSchema:()=>Ue,adaptReport:()=>Cs,analyzeError:()=>ge,analyzeFailureCorrelation:()=>we,appendLocalEvents:()=>St,applyPartialApproval:()=>hs,applyTemplate:()=>xe,autoFixSequentialEdits:()=>He,autoMergeOwnershipConflicts:()=>ls,buildDependencyGraph:()=>Ft,categorizeStream:()=>ee,checkBudget:()=>Ws,classifyTask:()=>fs,cleanupOrphanFixStreams:()=>Mn,createBudgetConfig:()=>Ns,createDetector:()=>Y,createDiagnostics:()=>En,detectOwnershipConflicts:()=>Pn,detectPatterns:()=>Es,detectSequentialEdits:()=>pe,detectUpstreamSuspect:()=>Hn,estimatePlannedCost:()=>xs,estimateTokens:()=>re,evaluateCompletion:()=>ss,extractDeliverables:()=>Tt,extractImports:()=>ke,extractPrerequisites:()=>Jt,extractRelevantChunks:()=>Hs,extractSpecPaths:()=>Me,findMatchingTemplate:()=>oe,formatDeliverablesReport:()=>Mt,formatDependencyReport:()=>jt,formatPatterns:()=>Ps,formatPlanPreview:()=>Je,formatPlanPreviewText:()=>Sn,formatPlanValidationErrors:()=>nn,formatStreamsForReview:()=>Vt,gatherProjectContext:()=>_e,generateAllSuggestions:()=>is,generateCachingHints:()=>Rs,generateFixStream:()=>Un,generateLearningSummary:()=>Kn,generatePlan:()=>ft,generatePlanPreview:()=>$n,generateReport:()=>Bn,generateRootCauseFixStream:()=>zn,generateStreams:()=>Kt,getFirstRunSuggestion:()=>Qn,getFixChainInfo:()=>ne,getModelCosts:()=>st,getOriginalStreamId:()=>Rn,getRecommendedLimit:()=>yt,getSectionsAtLevel:()=>Q,getSuggestionsSummary:()=>as,getThresholds:()=>je,isFirstRun:()=>Jn,isFixStream:()=>An,isUnpopulatedTemplate:()=>gt,loadPatterns:()=>Ms,loadRoutingRules:()=>ks,markFirstRunComplete:()=>Xn,onStreamComplete:()=>In,optimizeTopology:()=>fe,parsePlanDocument:()=>ht,patternsToPromptHints:()=>Os,processDeliverables:()=>_t,pruneUnusedFiles:()=>As,resetLearning:()=>ts,resolveImportPath:()=>be,rollbackStream:()=>gs,routeStream:()=>$s,runLearningCycle:()=>$t,savePatterns:()=>_s,saveReportLocally:()=>qn,streamResultToTelemetryEvent:()=>vt,suggestProvider:()=>ds,suggestSplit:()=>rs,toInitFormat:()=>Gt,validatePlan:()=>tn});var Cn=y(()=>{pt();Re();It();Dt();Xt();sn();kn();ze();On();Yn();Vn();Zn();ns();Xe();os();De();de();cs();us();ps();ws();et();Ze();bs();Is();Fs();Us();zs();ot();it();tt();We()});Cn();export{Ce as ContextBudgetExceededError,Z as DEFAULT_THRESHOLDS,Ue as PlanContractStreamSchema,Cs as adaptReport,ge as analyzeError,we as analyzeFailureCorrelation,St as appendLocalEvents,hs as applyPartialApproval,xe as applyTemplate,He as autoFixSequentialEdits,ls as autoMergeOwnershipConflicts,Ft as buildDependencyGraph,ee as categorizeStream,Ws as checkBudget,fs as classifyTask,Mn as cleanupOrphanFixStreams,Ns as createBudgetConfig,Y as createDetector,En as createDiagnostics,Pn as detectOwnershipConflicts,Es as detectPatterns,pe as detectSequentialEdits,Hn as detectUpstreamSuspect,xs as estimatePlannedCost,re as estimateTokens,ss as evaluateCompletion,Tt as extractDeliverables,ke as extractImports,Jt as extractPrerequisites,Hs as extractRelevantChunks,Me as extractSpecPaths,oe as findMatchingTemplate,Mt as formatDeliverablesReport,jt as formatDependencyReport,Ps as formatPatterns,Je as formatPlanPreview,Sn as formatPlanPreviewText,nn as formatPlanValidationErrors,Vt as formatStreamsForReview,_e as gatherProjectContext,is as generateAllSuggestions,Rs as generateCachingHints,Un as generateFixStream,Kn as generateLearningSummary,ft as generatePlan,$n as generatePlanPreview,Bn as generateReport,zn as generateRootCauseFixStream,Kt as generateStreams,Qn as getFirstRunSuggestion,ne as getFixChainInfo,st as getModelCosts,Rn as getOriginalStreamId,yt as getRecommendedLimit,Q as getSectionsAtLevel,as as getSuggestionsSummary,je as getThresholds,Jn as isFirstRun,An as isFixStream,gt as isUnpopulatedTemplate,Ms as loadPatterns,ks as loadRoutingRules,Xn as markFirstRunComplete,In as onStreamComplete,fe as optimizeTopology,ht as parsePlanDocument,Os as patternsToPromptHints,_t as processDeliverables,As as pruneUnusedFiles,ts as resetLearning,be as resolveImportPath,gs as rollbackStream,$s as routeStream,$t as runLearningCycle,_s as savePatterns,qn as saveReportLocally,vt as streamResultToTelemetryEvent,ds as suggestProvider,rs as suggestSplit,Gt as toInitFormat,tn as validatePlan};
176
+ `)}function Ws(e,n){let t=Ls(n.provider,n.model),{softLimitTokens:s,hardLimitTokens:o,warningThreshold:r,enforcementLevel:i}=n,a="none",c=s;e>=o?(a="hard",c=o):e>=s&&(a="soft",c=s);let l=e/s,u=!0;a==="hard"&&i==="hard"?u=!1:a==="soft"&&i==="soft"&&(u=!0);let d;if(a!=="none"){let p=a==="hard"?"hard limit":"soft limit";d=`Context size (${e.toLocaleString()} tokens) exceeds ${p} (${c.toLocaleString()} tokens)`,u||(d+=". Execution blocked.")}else l>=r&&(d=`Context size at ${Math.round(l*100)}% of soft limit (${e.toLocaleString()} / ${s.toLocaleString()} tokens)`);let f=a!=="none"?li(a,e,c):void 0;return{allowed:u,violationType:a,estimatedTokens:e,budgetLimit:c,utilizationRatio:l,warning:d,suggestion:f,providerLimit:t}}var js,Ds,ii,ai,ci,Ce,Us=y(()=>{"use strict";js={anthropic:2e5,openai:128e3,gemini:1e6,deepseek:128e3,kimi:262144,ollama:128e3,default:1e5},Ds={"claude-opus-4-5-20251101":2e5,"claude-sonnet-4-5-20250929":2e5,"claude-sonnet-4-20250514":2e5,"claude-3-5-sonnet-20241022":2e5,"claude-3-opus-20240229":2e5,"claude-3-haiku-20240307":2e5,"gpt-4.5-turbo":128e3,"gpt-4-turbo":128e3,"gpt-4-turbo-preview":128e3,"gpt-4o":128e3,"gpt-4o-mini":128e3,"o1-preview":128e3,"o1-mini":128e3,"o3-mini":2e5,"gpt-3.5-turbo":16385,"gemini-2.5-pro":1e6,"gemini-2.0-flash":1e6,"gemini-1.5-pro":1e6,"gemini-1.5-flash":1e6,"gemini-pro":32768,"deepseek-chat":128e3,"deepseek-coder":128e3,"deepseek-reasoner":128e3,"kimi-k2-0905-preview":262144,"kimi-k2-turbo-preview":262144,"kimi-latest":262144,"moonshot-v1-8k":8192,"moonshot-v1-32k":32768,"moonshot-v1-128k":131072,"llama3.3:70b":128e3,"llama3.2:latest":128e3,"mistral:latest":32e3},ii=.7,ai=.9,ci=.8;Ce=class extends Error{checkResult;streamId;constructor(n,t){let s=t?` for stream "${t}"`:"";super(`Context budget exceeded${s}: ${n.warning}`),this.checkResult=n,this.streamId=t,this.name="ContextBudgetExceededError"}}});function Hs(e,n,t=300,s=10,o=120,r=!1){let i=e.split(/\r?\n/);if(i.length<t||n.length===0)return e;let a=n.map(h=>new RegExp(ui(h),"i")),c=[];for(let h=0;h<i.length;++h)a.some(w=>w.test(i[h]))&&c.push(h);let l=new Set;for(let h of c)for(let w=Math.max(0,h-s);w<=Math.min(i.length-1,h+s);++w)l.add(w);if(l.size<Math.min(20,s*2)){for(let h=0;h<Math.min(s*2,i.length);++h)l.add(h);for(let h=Math.max(0,i.length-s*2);h<i.length;++h)l.add(h)}let d=Array.from(l).sort((h,w)=>h-w).slice(0,o),f=-2,p=[],m=r?String(i.length).length:0;for(let h of d)h>f+1&&p.length>0&&p.push("..."),r?p.push(`${String(h+1).padStart(m)}: ${i[h]}`):p.push(i[h]),f=h;return p.join(`
177
+ `)}function ui(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var zs=y(()=>{"use strict"});var bn={};ie(bn,{ContextBudgetExceededError:()=>Ce,DEFAULT_THRESHOLDS:()=>Z,PlanContractStreamSchema:()=>Ue,adaptReport:()=>Cs,analyzeError:()=>ge,analyzeFailureCorrelation:()=>we,appendLocalEvents:()=>St,applyPartialApproval:()=>hs,applyTemplate:()=>xe,autoFixSequentialEdits:()=>He,autoMergeOwnershipConflicts:()=>ls,buildDependencyGraph:()=>Ft,categorizeStream:()=>ee,checkBudget:()=>Ws,classifyTask:()=>fs,cleanupOrphanFixStreams:()=>In,createBudgetConfig:()=>Ns,createDetector:()=>Y,createDiagnostics:()=>En,detectOwnershipConflicts:()=>Pn,detectPatterns:()=>Es,detectSequentialEdits:()=>pe,detectUpstreamSuspect:()=>Hn,estimatePlannedCost:()=>xs,estimateTokens:()=>re,evaluateCompletion:()=>ss,extractDeliverables:()=>Tt,extractImports:()=>$e,extractPrerequisites:()=>Jt,extractRelevantChunks:()=>Hs,extractSpecPaths:()=>Ie,findMatchingTemplate:()=>oe,formatDeliverablesReport:()=>It,formatDependencyReport:()=>jt,formatPatterns:()=>Ps,formatPlanPreview:()=>Je,formatPlanPreviewText:()=>Sn,formatPlanValidationErrors:()=>nn,formatStreamsForReview:()=>Vt,gatherProjectContext:()=>_e,generateAllSuggestions:()=>is,generateCachingHints:()=>Rs,generateFixStream:()=>Un,generateLearningSummary:()=>Kn,generatePlan:()=>ft,generatePlanPreview:()=>kn,generateReport:()=>Bn,generateRootCauseFixStream:()=>zn,generateStreams:()=>Kt,getFirstRunSuggestion:()=>Qn,getFixChainInfo:()=>ne,getModelCosts:()=>st,getOriginalStreamId:()=>Rn,getRecommendedLimit:()=>yt,getSectionsAtLevel:()=>Q,getSuggestionsSummary:()=>as,getThresholds:()=>je,isFirstRun:()=>Jn,isFixStream:()=>An,isUnpopulatedTemplate:()=>gt,loadPatterns:()=>Is,loadRoutingRules:()=>$s,markFirstRunComplete:()=>Xn,onStreamComplete:()=>Mn,optimizeTopology:()=>fe,parsePlanDocument:()=>ht,patternsToPromptHints:()=>Os,processDeliverables:()=>_t,pruneUnusedFiles:()=>As,resetLearning:()=>ts,resolveImportPath:()=>be,rollbackStream:()=>gs,routeStream:()=>ks,runLearningCycle:()=>kt,savePatterns:()=>_s,saveReportLocally:()=>qn,streamResultToTelemetryEvent:()=>vt,suggestProvider:()=>ds,suggestSplit:()=>rs,toInitFormat:()=>Gt,validatePlan:()=>tn});var Cn=y(()=>{pt();Re();Mt();Dt();Xt();sn();$n();ze();On();Yn();Vn();Zn();ns();Xe();os();De();de();cs();us();ps();ws();et();Ze();bs();Ms();Fs();Us();zs();ot();it();tt();We()});Cn();export{Ce as ContextBudgetExceededError,Z as DEFAULT_THRESHOLDS,Ue as PlanContractStreamSchema,Cs as adaptReport,ge as analyzeError,we as analyzeFailureCorrelation,St as appendLocalEvents,hs as applyPartialApproval,xe as applyTemplate,He as autoFixSequentialEdits,ls as autoMergeOwnershipConflicts,Ft as buildDependencyGraph,ee as categorizeStream,Ws as checkBudget,fs as classifyTask,In as cleanupOrphanFixStreams,Ns as createBudgetConfig,Y as createDetector,En as createDiagnostics,Pn as detectOwnershipConflicts,Es as detectPatterns,pe as detectSequentialEdits,Hn as detectUpstreamSuspect,xs as estimatePlannedCost,re as estimateTokens,ss as evaluateCompletion,Tt as extractDeliverables,$e as extractImports,Jt as extractPrerequisites,Hs as extractRelevantChunks,Ie as extractSpecPaths,oe as findMatchingTemplate,It as formatDeliverablesReport,jt as formatDependencyReport,Ps as formatPatterns,Je as formatPlanPreview,Sn as formatPlanPreviewText,nn as formatPlanValidationErrors,Vt as formatStreamsForReview,_e as gatherProjectContext,is as generateAllSuggestions,Rs as generateCachingHints,Un as generateFixStream,Kn as generateLearningSummary,ft as generatePlan,kn as generatePlanPreview,Bn as generateReport,zn as generateRootCauseFixStream,Kt as generateStreams,Qn as getFirstRunSuggestion,ne as getFixChainInfo,st as getModelCosts,Rn as getOriginalStreamId,yt as getRecommendedLimit,Q as getSectionsAtLevel,as as getSuggestionsSummary,je as getThresholds,Jn as isFirstRun,An as isFixStream,gt as isUnpopulatedTemplate,Is as loadPatterns,$s as loadRoutingRules,Xn as markFirstRunComplete,Mn as onStreamComplete,fe as optimizeTopology,ht as parsePlanDocument,Os as patternsToPromptHints,_t as processDeliverables,As as pruneUnusedFiles,ts as resetLearning,be as resolveImportPath,gs as rollbackStream,ks as routeStream,kt as runLearningCycle,_s as savePatterns,qn as saveReportLocally,vt as streamResultToTelemetryEvent,ds as suggestProvider,rs as suggestSplit,Gt as toInitFormat,tn as validatePlan};
@@ -1 +1 @@
1
- export declare const ORCHEX_INSTRUCTIONS = "Orchex is a multi-LLM orchestration tool that coordinates parallel AI agents to implement features across multiple files with zero merge conflicts.\n\n## Core Concepts\n\n\u2022 **Streams**: File ownership units \u2014 each stream owns 1-3 files exclusively\n\u2022 **Waves**: Parallel execution groups \u2014 streams in same wave run simultaneously \n\u2022 **Ownership**: Strict isolation \u2014 no two streams can modify the same file\n\u2022 **Self-Healing**: Auto-recovery from failures (max 3 attempts per stream)\n\u2022 **Learning**: System improves with every run, adapting to your codebase\n\u2022 **Model Registry**: Dynamic model discovery \u2014 available models auto-updated from providers daily\n\n## How to Start\n\nAlways use `auto`. It handles everything:\n- Short intent: \"Add user auth with JWT\"\n- Full PRD or spec document: paste the content as the intent\n- Bug report: \"Fix the login timeout on mobile\"\n- Refactoring request: \"Extract payment logic into service layer\"\n\nDo NOT use `learn` directly \u2014 it expects a structured implementation plan with code deliverables, not a PRD or spec.\nDo NOT parse user documents into sections yourself \u2014 `auto` does this automatically.\n\n## Available Tools\n\n### Getting Started:\n\u2022 `auto` \u2014 **Start here.** Takes any input (intent, PRD, spec, bug report) \u2192 generates implementation plan \u2192 previews \u2192 executes.\n\u2022 `init-plan` \u2014 Generate plan template for manual editing (advanced \u2014 use `auto` for most cases)\n\u2022 `init` + `add_stream` \u2014 Manual stream-by-stream control (advanced)\n\n### During Execution:\n\u2022 `status` \u2014 Check current state and progress. **Call every 15-30 seconds during execution and relay the executionProgress to the user** \u2014 they cannot see progress otherwise.\n\u2022 `execute` \u2014 Run all pending streams\n\u2022 `recover` \u2014 Auto-heal failed streams\n\u2022 `rollback-stream` \u2014 Undo changes from a specific stream\n\u2022 `reload` \u2014 Refresh state from disk\n\n### After Execution:\n\u2022 `complete` \u2014 Mark orchestration as done and cleanup\n\u2022 `reset-learning` \u2014 Clear learned patterns\n\n### Internal (rarely called directly):\n\u2022 `learn` \u2014 Parse a structured implementation plan into stream definitions. Prefer `auto`.\n\n## Error Recovery\n\nIf execute fails, call status to check stream states, then recover to self-heal failed streams automatically.\n\n## Available Resources\n\n\u2022 orchex://quickstart \u2014 Getting started guide and setup\n\u2022 orchex://concepts/streams \u2014 Stream ownership model\n\u2022 orchex://concepts/waves \u2014 Parallel execution system\n\u2022 orchex://concepts/ownership \u2014 File isolation rules\n\u2022 orchex://concepts/self-healing \u2014 Auto-recovery mechanics\n\u2022 orchex://concepts/providers \u2014 LLM provider configuration\n\u2022 orchex://examples \u2014 Real-world orchestration examples\n\u2022 orchex://api-reference \u2014 Stream definition schema\n\n## API Keys\n\nANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (for Bedrock)\n\n## Supported Providers\n\nClaude (Anthropic), OpenAI, Gemini, DeepSeek, Ollama (local), AWS Bedrock \u2014 models auto-discovered via registry\n\n**Note:** Cloud mode (`mode: \"cloud\"`) currently uses Anthropic as the execution provider. All 6 providers are available in local mode.\n\n## Cloud Trial\n\nGet 10 free cloud runs (no expiry, no credit card required) \u2014 run `npx @wundam/orchex login`\n\n## Tiers\n\n\u2022 **Free**: 5 streams, 2 waves, all 6 providers (BYOK)\n\u2022 **Pro** ($19/mo): 15 streams, 10 waves\n\u2022 **Team** ($49/user/mo): 25 streams, 25 waves";
1
+ export declare const ORCHEX_INSTRUCTIONS = "Orchex is a multi-LLM orchestration tool that coordinates parallel AI agents to implement features across multiple files with zero merge conflicts.\n\n## Core Concepts\n\n\u2022 **Streams**: File ownership units \u2014 each stream owns 1-3 files exclusively\n\u2022 **Waves**: Parallel execution groups \u2014 streams in same wave run simultaneously \n\u2022 **Ownership**: Strict isolation \u2014 no two streams can modify the same file\n\u2022 **Self-Healing**: Auto-recovery from failures (max 3 attempts per stream)\n\u2022 **Learning**: System improves with every run, adapting to your codebase\n\u2022 **Model Registry**: Dynamic model discovery \u2014 available models auto-updated from providers daily\n\n## How to Start\n\nAlways use `auto`. It handles everything:\n- Short intent: \"Add user auth with JWT\"\n- Full PRD or spec document: paste the content as the intent\n- Bug report: \"Fix the login timeout on mobile\"\n- Refactoring request: \"Extract payment logic into service layer\"\n\nDo NOT use `learn` directly \u2014 it expects a structured implementation plan with code deliverables, not a PRD or spec.\nDo NOT parse user documents into sections yourself \u2014 `auto` does this automatically.\n\n## Available Tools\n\n### Getting Started:\n\u2022 `auto` \u2014 **Start here.** Takes any input (intent, PRD, spec, bug report) \u2192 generates implementation plan \u2192 previews \u2192 executes.\n\u2022 `init-plan` \u2014 Generate plan template for manual editing (advanced \u2014 use `auto` for most cases)\n\u2022 `init` + `add_stream` \u2014 Manual stream-by-stream control (advanced)\n\n### During Execution:\n\u2022 `status` \u2014 Check current state and progress. **Call every 15-30 seconds during execution and relay the executionProgress to the user** \u2014 they cannot see progress otherwise.\n\u2022 `execute` \u2014 Run all pending streams\n\u2022 `recover` \u2014 Auto-heal failed streams\n\u2022 `rollback-stream` \u2014 Undo changes from a specific stream\n\u2022 `reload` \u2014 Refresh state from disk\n\n### After Execution:\n\u2022 `complete` \u2014 Mark orchestration as done and cleanup\n\u2022 `reset-learning` \u2014 Clear learned patterns\n\n### Internal (rarely called directly):\n\u2022 `learn` \u2014 Parse a structured implementation plan into stream definitions. Prefer `auto`.\n\n## Error Recovery\n\nIf execute fails, call status to check stream states, then recover to self-heal failed streams automatically.\n\n## Available Resources\n\n\u2022 orchex://quickstart \u2014 Getting started guide and setup\n\u2022 orchex://concepts/streams \u2014 Stream ownership model\n\u2022 orchex://concepts/waves \u2014 Parallel execution system\n\u2022 orchex://concepts/ownership \u2014 File isolation rules\n\u2022 orchex://concepts/self-healing \u2014 Auto-recovery mechanics\n\u2022 orchex://concepts/providers \u2014 LLM provider configuration\n\u2022 orchex://examples \u2014 Real-world orchestration examples\n\u2022 orchex://api-reference \u2014 Stream definition schema\n\n## API Keys\n\nANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, KIMI_API_KEY, AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (for Bedrock)\n\n## Supported Providers\n\nClaude (Anthropic), OpenAI, Gemini, DeepSeek, Kimi (Moonshot AI), Ollama (local), AWS Bedrock \u2014 models auto-discovered via registry\n\n**Note:** Cloud mode (`mode: \"cloud\"`) currently uses Anthropic as the execution provider. All 7 providers are available in local mode.\n\n## Cloud Trial\n\nGet 10 free cloud runs (no expiry, no credit card required) \u2014 run `npx @wundam/orchex login`\n\n## Tiers\n\n\u2022 **Free**: 5 streams, 2 waves, all 7 providers (BYOK)\n\u2022 **Pro** ($19/mo): 15 streams, 10 waves\n\u2022 **Team** ($49/user/mo): 25 streams, 25 waves";
@@ -61,15 +61,15 @@ failed streams automatically.
61
61
 
62
62
  ## API Keys
63
63
 
64
- ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, \
64
+ ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY, KIMI_API_KEY, \
65
65
  AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (for Bedrock)
66
66
 
67
67
  ## Supported Providers
68
68
 
69
- Claude (Anthropic), OpenAI, Gemini, DeepSeek, Ollama (local), AWS Bedrock — models auto-discovered via registry
69
+ Claude (Anthropic), OpenAI, Gemini, DeepSeek, Kimi (Moonshot AI), Ollama (local), AWS Bedrock — models auto-discovered via registry
70
70
 
71
71
  **Note:** Cloud mode (\`mode: "cloud"\`) currently uses Anthropic as the execution \
72
- provider. All 6 providers are available in local mode.
72
+ provider. All 7 providers are available in local mode.
73
73
 
74
74
  ## Cloud Trial
75
75
 
@@ -78,7 +78,7 @@ Get 10 free cloud runs (no expiry, no credit card required) — run \
78
78
 
79
79
  ## Tiers
80
80
 
81
- • **Free**: 5 streams, 2 waves, all 6 providers (BYOK)
81
+ • **Free**: 5 streams, 2 waves, all 7 providers (BYOK)
82
82
  • **Pro** ($19/mo): 15 streams, 10 waves
83
83
  • **Team** ($49/user/mo): 25 streams, 25 waves\
84
84
  `;
@@ -29,6 +29,7 @@ Set provider keys as environment variables in your shell profile (\`~/.zshrc\` o
29
29
  - \`OPENAI_API_KEY\` — GPT-4o and variants
30
30
  - \`GEMINI_API_KEY\` — Google Gemini
31
31
  - \`DEEPSEEK_API_KEY\` — DeepSeek
32
+ - \`KIMI_API_KEY\` — Kimi (Moonshot AI)
32
33
  - AWS credentials — Bedrock
33
34
 
34
35
  Orchex auto-detects which providers are available from your environment.
@@ -230,7 +231,7 @@ Streams can opt out of self-healing by setting \`selfHealable: false\`. Infrastr
230
231
  description: 'LLM provider configuration and API keys',
231
232
  content: `# Providers
232
233
 
233
- Orchex supports 6 LLM providers. Keys are read from environment variables automatically.
234
+ Orchex supports 7 LLM providers. Keys are read from environment variables automatically.
234
235
 
235
236
  ## Supported Providers
236
237
 
@@ -240,6 +241,7 @@ Orchex supports 6 LLM providers. Keys are read from environment variables automa
240
241
  | OpenAI | \`OPENAI_API_KEY\` | gpt-4.1 |
241
242
  | Google Gemini | \`GEMINI_API_KEY\` | gemini-2.0-flash |
242
243
  | DeepSeek | \`DEEPSEEK_API_KEY\` | deepseek-coder |
244
+ | Kimi (Moonshot AI) | \`KIMI_API_KEY\` | kimi-k2-0905-preview |
243
245
  | Ollama | (none — local) | llama3.3:70b |
244
246
  | AWS Bedrock | \`AWS_ACCESS_KEY_ID\` + \`AWS_SECRET_ACCESS_KEY\` + \`AWS_REGION\` | claude-3.5-sonnet |
245
247
 
@@ -255,7 +257,7 @@ ORCHEX_PROVIDER=openai ORCHEX_MODEL=gpt-4o-mini
255
257
 
256
258
  ## Auto-Detection
257
259
 
258
- Orchex scans available API keys at startup and selects a provider automatically. Priority order: Anthropic → OpenAI → Gemini → DeepSeek → Bedrock → Ollama.
260
+ Orchex scans available API keys at startup and selects a provider automatically. Priority order: Anthropic → OpenAI → Gemini → DeepSeek → Kimi → Bedrock → Ollama.
259
261
 
260
262
  ## Cloud Mode
261
263
 
@@ -278,7 +280,7 @@ Orchex maintains a dynamic model registry updated daily from provider APIs. Mode
278
280
 
279
281
  ## Providers
280
282
 
281
- All tiers support all 6 providers (BYOK) — no provider restrictions.
283
+ All tiers support all 7 providers (BYOK) — no provider restrictions.
282
284
 
283
285
  ## Ollama (Local)
284
286
 
@@ -10,6 +10,7 @@ export const MODEL_FALLBACKS = {
10
10
  openai: ['gpt-4.1', 'gpt-4o', 'gpt-4o-mini', 'gpt-3.5-turbo'],
11
11
  gemini: ['gemini-2.5-pro', 'gemini-2.0-flash', 'gemini-1.5-flash'],
12
12
  deepseek: ['deepseek-chat', 'deepseek-coder'],
13
+ kimi: ['kimi-k2-0905-preview', 'kimi-latest', 'moonshot-v1-128k', 'moonshot-v1-32k', 'moonshot-v1-8k'],
13
14
  bedrock: ['claude-3.5-sonnet', 'claude-3-haiku'],
14
15
  ollama: ['llama3.3:70b', 'llama3.2:latest'],
15
16
  };
package/dist/tools.js CHANGED
@@ -821,7 +821,7 @@ export function registerTools(server, executor, context) {
821
821
  const status = getProviderStatus();
822
822
  return fail(`Failed to create executor. ${status.message}`, {
823
823
  code: 'EXECUTOR_CREATE_FAILED', retryable: false,
824
- suggestion: 'Set an API key for a supported provider (ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, or OLLAMA_HOST), or store a key at orchex.dev/dashboard/keys and run `orchex login`.',
824
+ suggestion: 'Set an API key for a supported provider (ANTHROPIC_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, KIMI_API_KEY, or OLLAMA_HOST), or store a key at orchex.dev/dashboard/keys and run `orchex login`.',
825
825
  });
826
826
  }
827
827
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wundam/orchex",
3
3
  "mcpName": "io.github.wundam/orchex",
4
- "version": "1.0.0-rc.28",
4
+ "version": "1.0.0-rc.29",
5
5
  "description": "Autopilot AI orchestration — auto-plan, parallelize, and execute with ownership enforcement",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",