spawnee 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,241 @@
1
+ import { z } from 'zod';
2
+ import { TaskInput } from '../core/task-queue.js';
3
+ declare const TaskSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ name: z.ZodString;
6
+ prompt: z.ZodString;
7
+ dependsOn: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
8
+ files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
9
+ branch: z.ZodOptional<z.ZodString>;
10
+ priority: z.ZodDefault<z.ZodNumber>;
11
+ timeout: z.ZodOptional<z.ZodNumber>;
12
+ retries: z.ZodOptional<z.ZodNumber>;
13
+ validation: z.ZodOptional<z.ZodObject<{
14
+ command: z.ZodString;
15
+ successPattern: z.ZodString;
16
+ }, "strip", z.ZodTypeAny, {
17
+ command: string;
18
+ successPattern: string;
19
+ }, {
20
+ command: string;
21
+ successPattern: string;
22
+ }>>;
23
+ complete: z.ZodOptional<z.ZodBoolean>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ id: string;
26
+ name: string;
27
+ prompt: string;
28
+ dependsOn: string[];
29
+ priority: number;
30
+ timeout?: number | undefined;
31
+ branch?: string | undefined;
32
+ files?: string[] | undefined;
33
+ retries?: number | undefined;
34
+ validation?: {
35
+ command: string;
36
+ successPattern: string;
37
+ } | undefined;
38
+ complete?: boolean | undefined;
39
+ }, {
40
+ id: string;
41
+ name: string;
42
+ prompt: string;
43
+ timeout?: number | undefined;
44
+ dependsOn?: string[] | undefined;
45
+ priority?: number | undefined;
46
+ branch?: string | undefined;
47
+ files?: string[] | undefined;
48
+ retries?: number | undefined;
49
+ validation?: {
50
+ command: string;
51
+ successPattern: string;
52
+ } | undefined;
53
+ complete?: boolean | undefined;
54
+ }>;
55
+ declare const TemplateSchema: z.ZodObject<{
56
+ name: z.ZodString;
57
+ repository: z.ZodObject<{
58
+ url: z.ZodString;
59
+ branch: z.ZodDefault<z.ZodString>;
60
+ baseBranch: z.ZodOptional<z.ZodString>;
61
+ }, "strip", z.ZodTypeAny, {
62
+ url: string;
63
+ branch: string;
64
+ baseBranch?: string | undefined;
65
+ }, {
66
+ url: string;
67
+ branch?: string | undefined;
68
+ baseBranch?: string | undefined;
69
+ }>;
70
+ defaults: z.ZodDefault<z.ZodObject<{
71
+ model: z.ZodDefault<z.ZodEnum<["auto", "claude-4-opus", "claude-4.5-opus-high-thinking", "claude-4.5-sonnet-thinking", "gemini-3-pro", "gpt-4o", "gpt-5.1-codex-high", "gpt-5.1-codex-max-high-fast", "gpt-5.1-codex-max-high", "gpt-5.1-codex-max-low-fast", "gpt-5.1-codex-max-low", "gpt-5.1-codex-max-medium-fast", "gpt-5.1-codex-max-xhigh-fast", "gpt-5.1-codex-max-xhigh", "gpt-5.1-codex-max", "gpt-5.1-codex"]>>;
72
+ timeout: z.ZodDefault<z.ZodNumber>;
73
+ retries: z.ZodDefault<z.ZodNumber>;
74
+ createPR: z.ZodDefault<z.ZodBoolean>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ timeout: number;
77
+ retries: number;
78
+ model: "auto" | "claude-4-opus" | "claude-4.5-opus-high-thinking" | "claude-4.5-sonnet-thinking" | "gemini-3-pro" | "gpt-4o" | "gpt-5.1-codex-high" | "gpt-5.1-codex-max-high-fast" | "gpt-5.1-codex-max-high" | "gpt-5.1-codex-max-low-fast" | "gpt-5.1-codex-max-low" | "gpt-5.1-codex-max-medium-fast" | "gpt-5.1-codex-max-xhigh-fast" | "gpt-5.1-codex-max-xhigh" | "gpt-5.1-codex-max" | "gpt-5.1-codex";
79
+ createPR: boolean;
80
+ }, {
81
+ timeout?: number | undefined;
82
+ retries?: number | undefined;
83
+ model?: "auto" | "claude-4-opus" | "claude-4.5-opus-high-thinking" | "claude-4.5-sonnet-thinking" | "gemini-3-pro" | "gpt-4o" | "gpt-5.1-codex-high" | "gpt-5.1-codex-max-high-fast" | "gpt-5.1-codex-max-high" | "gpt-5.1-codex-max-low-fast" | "gpt-5.1-codex-max-low" | "gpt-5.1-codex-max-medium-fast" | "gpt-5.1-codex-max-xhigh-fast" | "gpt-5.1-codex-max-xhigh" | "gpt-5.1-codex-max" | "gpt-5.1-codex" | undefined;
84
+ createPR?: boolean | undefined;
85
+ }>>;
86
+ context: z.ZodDefault<z.ZodObject<{
87
+ files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
88
+ instructions: z.ZodOptional<z.ZodString>;
89
+ }, "strip", z.ZodTypeAny, {
90
+ files: string[];
91
+ instructions?: string | undefined;
92
+ }, {
93
+ files?: string[] | undefined;
94
+ instructions?: string | undefined;
95
+ }>>;
96
+ tasks: z.ZodArray<z.ZodObject<{
97
+ id: z.ZodString;
98
+ name: z.ZodString;
99
+ prompt: z.ZodString;
100
+ dependsOn: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
101
+ files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
102
+ branch: z.ZodOptional<z.ZodString>;
103
+ priority: z.ZodDefault<z.ZodNumber>;
104
+ timeout: z.ZodOptional<z.ZodNumber>;
105
+ retries: z.ZodOptional<z.ZodNumber>;
106
+ validation: z.ZodOptional<z.ZodObject<{
107
+ command: z.ZodString;
108
+ successPattern: z.ZodString;
109
+ }, "strip", z.ZodTypeAny, {
110
+ command: string;
111
+ successPattern: string;
112
+ }, {
113
+ command: string;
114
+ successPattern: string;
115
+ }>>;
116
+ complete: z.ZodOptional<z.ZodBoolean>;
117
+ }, "strip", z.ZodTypeAny, {
118
+ id: string;
119
+ name: string;
120
+ prompt: string;
121
+ dependsOn: string[];
122
+ priority: number;
123
+ timeout?: number | undefined;
124
+ branch?: string | undefined;
125
+ files?: string[] | undefined;
126
+ retries?: number | undefined;
127
+ validation?: {
128
+ command: string;
129
+ successPattern: string;
130
+ } | undefined;
131
+ complete?: boolean | undefined;
132
+ }, {
133
+ id: string;
134
+ name: string;
135
+ prompt: string;
136
+ timeout?: number | undefined;
137
+ dependsOn?: string[] | undefined;
138
+ priority?: number | undefined;
139
+ branch?: string | undefined;
140
+ files?: string[] | undefined;
141
+ retries?: number | undefined;
142
+ validation?: {
143
+ command: string;
144
+ successPattern: string;
145
+ } | undefined;
146
+ complete?: boolean | undefined;
147
+ }>, "many">;
148
+ }, "strip", z.ZodTypeAny, {
149
+ name: string;
150
+ repository: {
151
+ url: string;
152
+ branch: string;
153
+ baseBranch?: string | undefined;
154
+ };
155
+ defaults: {
156
+ timeout: number;
157
+ retries: number;
158
+ model: "auto" | "claude-4-opus" | "claude-4.5-opus-high-thinking" | "claude-4.5-sonnet-thinking" | "gemini-3-pro" | "gpt-4o" | "gpt-5.1-codex-high" | "gpt-5.1-codex-max-high-fast" | "gpt-5.1-codex-max-high" | "gpt-5.1-codex-max-low-fast" | "gpt-5.1-codex-max-low" | "gpt-5.1-codex-max-medium-fast" | "gpt-5.1-codex-max-xhigh-fast" | "gpt-5.1-codex-max-xhigh" | "gpt-5.1-codex-max" | "gpt-5.1-codex";
159
+ createPR: boolean;
160
+ };
161
+ context: {
162
+ files: string[];
163
+ instructions?: string | undefined;
164
+ };
165
+ tasks: {
166
+ id: string;
167
+ name: string;
168
+ prompt: string;
169
+ dependsOn: string[];
170
+ priority: number;
171
+ timeout?: number | undefined;
172
+ branch?: string | undefined;
173
+ files?: string[] | undefined;
174
+ retries?: number | undefined;
175
+ validation?: {
176
+ command: string;
177
+ successPattern: string;
178
+ } | undefined;
179
+ complete?: boolean | undefined;
180
+ }[];
181
+ }, {
182
+ name: string;
183
+ repository: {
184
+ url: string;
185
+ branch?: string | undefined;
186
+ baseBranch?: string | undefined;
187
+ };
188
+ tasks: {
189
+ id: string;
190
+ name: string;
191
+ prompt: string;
192
+ timeout?: number | undefined;
193
+ dependsOn?: string[] | undefined;
194
+ priority?: number | undefined;
195
+ branch?: string | undefined;
196
+ files?: string[] | undefined;
197
+ retries?: number | undefined;
198
+ validation?: {
199
+ command: string;
200
+ successPattern: string;
201
+ } | undefined;
202
+ complete?: boolean | undefined;
203
+ }[];
204
+ defaults?: {
205
+ timeout?: number | undefined;
206
+ retries?: number | undefined;
207
+ model?: "auto" | "claude-4-opus" | "claude-4.5-opus-high-thinking" | "claude-4.5-sonnet-thinking" | "gemini-3-pro" | "gpt-4o" | "gpt-5.1-codex-high" | "gpt-5.1-codex-max-high-fast" | "gpt-5.1-codex-max-high" | "gpt-5.1-codex-max-low-fast" | "gpt-5.1-codex-max-low" | "gpt-5.1-codex-max-medium-fast" | "gpt-5.1-codex-max-xhigh-fast" | "gpt-5.1-codex-max-xhigh" | "gpt-5.1-codex-max" | "gpt-5.1-codex" | undefined;
208
+ createPR?: boolean | undefined;
209
+ } | undefined;
210
+ context?: {
211
+ files?: string[] | undefined;
212
+ instructions?: string | undefined;
213
+ } | undefined;
214
+ }>;
215
+ export type Template = z.infer<typeof TemplateSchema>;
216
+ export type TemplateTask = z.infer<typeof TaskSchema>;
217
+ export interface ParsedTemplate {
218
+ name: string;
219
+ repository: {
220
+ url: string;
221
+ branch: string;
222
+ baseBranch?: string;
223
+ };
224
+ defaults: {
225
+ model: string;
226
+ timeout: number;
227
+ retries: number;
228
+ createPR: boolean;
229
+ };
230
+ context: {
231
+ files: string[];
232
+ instructions?: string;
233
+ };
234
+ tasks: TaskInput[];
235
+ }
236
+ export declare function parseTemplate(filePath: string): ParsedTemplate;
237
+ export declare function validateTemplateFile(filePath: string): {
238
+ valid: boolean;
239
+ errors: string[];
240
+ };
241
+ export {};
@@ -0,0 +1,119 @@
1
+ import { z } from 'zod';
2
+ import * as yaml from 'yaml';
3
+ import { readFileSync } from 'fs';
4
+ const ValidationSchema = z.object({
5
+ command: z.string(),
6
+ successPattern: z.string(),
7
+ }).optional();
8
+ const TaskSchema = z.object({
9
+ id: z.string(),
10
+ name: z.string(),
11
+ prompt: z.string(),
12
+ dependsOn: z.array(z.string()).default([]),
13
+ files: z.array(z.string()).optional(),
14
+ branch: z.string().optional(),
15
+ priority: z.number().default(0),
16
+ timeout: z.number().optional(),
17
+ retries: z.number().optional(),
18
+ validation: ValidationSchema,
19
+ complete: z.boolean().optional(),
20
+ });
21
+ const RepositorySchema = z.object({
22
+ url: z.string().url(),
23
+ branch: z.string().default('main'),
24
+ baseBranch: z.string().optional(),
25
+ });
26
+ const DefaultsSchema = z.object({
27
+ model: z.enum(['auto', 'claude-4-opus', 'claude-4.5-opus-high-thinking', 'claude-4.5-sonnet-thinking', 'gemini-3-pro', 'gpt-4o', 'gpt-5.1-codex-high', 'gpt-5.1-codex-max-high-fast', 'gpt-5.1-codex-max-high', 'gpt-5.1-codex-max-low-fast', 'gpt-5.1-codex-max-low', 'gpt-5.1-codex-max-medium-fast', 'gpt-5.1-codex-max-xhigh-fast', 'gpt-5.1-codex-max-xhigh', 'gpt-5.1-codex-max', 'gpt-5.1-codex']).default('auto'),
28
+ timeout: z.number().default(3600000),
29
+ retries: z.number().default(2),
30
+ createPR: z.boolean().default(true),
31
+ }).default({});
32
+ const ContextSchema = z.object({
33
+ files: z.array(z.string()).default([]),
34
+ instructions: z.string().optional(),
35
+ }).default({});
36
+ const TemplateSchema = z.object({
37
+ name: z.string(),
38
+ repository: RepositorySchema,
39
+ defaults: DefaultsSchema,
40
+ context: ContextSchema,
41
+ tasks: z.array(TaskSchema).min(1, 'At least one task is required'),
42
+ });
43
+ export function parseTemplate(filePath) {
44
+ const content = readFileSync(filePath, 'utf-8');
45
+ const isYaml = filePath.endsWith('.yaml') || filePath.endsWith('.yml');
46
+ const raw = isYaml ? yaml.parse(content) : JSON.parse(content);
47
+ const validated = TemplateSchema.parse(raw);
48
+ const tasks = validated.tasks.map(t => ({
49
+ id: t.id,
50
+ name: t.name,
51
+ prompt: t.prompt,
52
+ dependsOn: t.dependsOn,
53
+ priority: t.priority,
54
+ branch: t.branch,
55
+ files: t.files,
56
+ timeout: t.timeout ?? validated.defaults.timeout,
57
+ retries: t.retries ?? validated.defaults.retries,
58
+ validation: t.validation,
59
+ complete: t.complete,
60
+ }));
61
+ validateDependencies(tasks);
62
+ return {
63
+ name: validated.name,
64
+ repository: validated.repository,
65
+ defaults: validated.defaults,
66
+ context: validated.context,
67
+ tasks,
68
+ };
69
+ }
70
+ function validateDependencies(tasks) {
71
+ const taskIds = new Set(tasks.map(t => t.id));
72
+ const errors = [];
73
+ for (const task of tasks) {
74
+ for (const depId of task.dependsOn) {
75
+ if (!taskIds.has(depId))
76
+ errors.push(`Task "${task.id}" depends on unknown task "${depId}"`);
77
+ }
78
+ }
79
+ if (hasCycle(tasks))
80
+ errors.push('Circular dependency detected in task graph');
81
+ if (errors.length > 0)
82
+ throw new Error(`Template validation failed:\n${errors.join('\n')}`);
83
+ }
84
+ function hasCycle(tasks) {
85
+ const visited = new Set();
86
+ const recursionStack = new Set();
87
+ const taskMap = new Map(tasks.map(t => [t.id, t]));
88
+ function dfs(taskId) {
89
+ visited.add(taskId);
90
+ recursionStack.add(taskId);
91
+ const task = taskMap.get(taskId);
92
+ if (!task)
93
+ return false;
94
+ for (const depId of task.dependsOn) {
95
+ if (!visited.has(depId) && dfs(depId))
96
+ return true;
97
+ if (recursionStack.has(depId))
98
+ return true;
99
+ }
100
+ recursionStack.delete(taskId);
101
+ return false;
102
+ }
103
+ for (const task of tasks) {
104
+ if (!visited.has(task.id) && dfs(task.id))
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ export function validateTemplateFile(filePath) {
110
+ try {
111
+ parseTemplate(filePath);
112
+ return { valid: true, errors: [] };
113
+ }
114
+ catch (error) {
115
+ const message = error instanceof Error ? error.message : String(error);
116
+ return { valid: false, errors: [message] };
117
+ }
118
+ }
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { StateStore, OrchestratorState } from './state-store.js';
2
+ export declare class FileStateStore implements StateStore {
3
+ private filePath;
4
+ private logger;
5
+ constructor(filePath: string);
6
+ save(state: OrchestratorState): Promise<void>;
7
+ load(): Promise<OrchestratorState | null>;
8
+ clear(): Promise<void>;
9
+ exists(): Promise<boolean>;
10
+ }
@@ -0,0 +1,46 @@
1
+ import { readFile, writeFile, unlink, access } from 'fs/promises';
2
+ import { Logger } from '../utils/logger.js';
3
+ export class FileStateStore {
4
+ filePath;
5
+ logger;
6
+ constructor(filePath) {
7
+ this.filePath = filePath;
8
+ this.logger = new Logger('FileStateStore');
9
+ }
10
+ async save(state) {
11
+ const data = JSON.stringify({ ...state, updatedAt: new Date().toISOString() }, null, 2);
12
+ await writeFile(this.filePath, data, 'utf-8');
13
+ this.logger.debug(`State saved to ${this.filePath}`);
14
+ }
15
+ async load() {
16
+ try {
17
+ const data = await readFile(this.filePath, 'utf-8');
18
+ return JSON.parse(data);
19
+ }
20
+ catch (error) {
21
+ if (error.code === 'ENOENT')
22
+ return null;
23
+ throw error;
24
+ }
25
+ }
26
+ async clear() {
27
+ try {
28
+ await unlink(this.filePath);
29
+ this.logger.debug(`State file cleared: ${this.filePath}`);
30
+ }
31
+ catch (error) {
32
+ if (error.code !== 'ENOENT')
33
+ throw error;
34
+ }
35
+ }
36
+ async exists() {
37
+ try {
38
+ await access(this.filePath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=file-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-adapter.js","sourceRoot":"","sources":["../../src/storage/file-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,cAAc;IAGL;IAFZ,MAAM,CAAS;IAEvB,YAAoB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAwB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ import { TaskStatus } from '../core/task-queue.js';
2
+ export interface OrchestratorState {
3
+ templateName: string;
4
+ startedAt: string;
5
+ updatedAt: string;
6
+ repository: string;
7
+ tasks: SerializedTask[];
8
+ activeAgents: Array<{
9
+ agentId: string;
10
+ taskId: string;
11
+ }>;
12
+ }
13
+ export interface SerializedTask {
14
+ id: string;
15
+ name: string;
16
+ status: TaskStatus;
17
+ agentId?: string;
18
+ attempts: number;
19
+ error?: string;
20
+ result?: {
21
+ branch?: string;
22
+ pullRequestUrl?: string;
23
+ completedAt: string;
24
+ };
25
+ }
26
+ export interface StateStore {
27
+ save(state: OrchestratorState): Promise<void>;
28
+ load(): Promise<OrchestratorState | null>;
29
+ clear(): Promise<void>;
30
+ exists(): Promise<boolean>;
31
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/storage/state-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ declare const ConfigSchema: z.ZodObject<{
3
+ apiKey: z.ZodString;
4
+ apiBaseUrl: z.ZodDefault<z.ZodString>;
5
+ maxConcurrent: z.ZodDefault<z.ZodNumber>;
6
+ pollInterval: z.ZodDefault<z.ZodNumber>;
7
+ defaultTimeout: z.ZodDefault<z.ZodNumber>;
8
+ stateFile: z.ZodDefault<z.ZodString>;
9
+ verbose: z.ZodDefault<z.ZodBoolean>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ apiKey: string;
12
+ apiBaseUrl: string;
13
+ maxConcurrent: number;
14
+ pollInterval: number;
15
+ defaultTimeout: number;
16
+ stateFile: string;
17
+ verbose: boolean;
18
+ }, {
19
+ apiKey: string;
20
+ apiBaseUrl?: string | undefined;
21
+ maxConcurrent?: number | undefined;
22
+ pollInterval?: number | undefined;
23
+ defaultTimeout?: number | undefined;
24
+ stateFile?: string | undefined;
25
+ verbose?: boolean | undefined;
26
+ }>;
27
+ export type Config = z.infer<typeof ConfigSchema>;
28
+ export interface ConfigOverrides {
29
+ apiKey?: string;
30
+ apiBaseUrl?: string;
31
+ maxConcurrent?: number;
32
+ pollInterval?: number;
33
+ defaultTimeout?: number;
34
+ stateFile?: string;
35
+ verbose?: boolean;
36
+ configFile?: string;
37
+ }
38
+ declare const DEFAULT_CONFIG_FILENAME = ".spawneerc.json";
39
+ export declare function loadConfig(overrides?: ConfigOverrides): Config;
40
+ export declare function generateDefaultConfig(): string;
41
+ export declare function getConfigFilePath(): string;
42
+ export { DEFAULT_CONFIG_FILENAME };
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import { readFileSync, existsSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ const ConfigSchema = z.object({
5
+ apiKey: z.string().min(1, 'API key is required. Set SPAWNEE_API_KEY or use --api-key'),
6
+ apiBaseUrl: z.string().url().default('https://api.cursor.com'),
7
+ maxConcurrent: z.number().min(1).max(256).default(10),
8
+ pollInterval: z.number().min(5000).default(15000),
9
+ defaultTimeout: z.number().min(60000).default(3600000),
10
+ stateFile: z.string().default('.spawnee-state.json'),
11
+ verbose: z.boolean().default(false),
12
+ });
13
+ const DEFAULT_CONFIG_FILENAME = '.spawneerc.json';
14
+ function loadConfigFile(configPath) {
15
+ const paths = configPath
16
+ ? [resolve(configPath)]
17
+ : [resolve(process.cwd(), DEFAULT_CONFIG_FILENAME), resolve(process.env.HOME || '', DEFAULT_CONFIG_FILENAME)];
18
+ for (const filePath of paths) {
19
+ if (!existsSync(filePath))
20
+ continue;
21
+ try {
22
+ const content = readFileSync(filePath, 'utf-8');
23
+ return JSON.parse(content);
24
+ }
25
+ catch {
26
+ if (configPath)
27
+ throw new Error(`Failed to parse config file: ${filePath}`); // Only throw if explicitly specified
28
+ }
29
+ }
30
+ return {};
31
+ }
32
+ function loadEnvConfig() {
33
+ const env = {};
34
+ if (process.env.SPAWNEE_API_KEY)
35
+ env.apiKey = process.env.SPAWNEE_API_KEY;
36
+ if (process.env.SPAWNEE_API_URL)
37
+ env.apiBaseUrl = process.env.SPAWNEE_API_URL;
38
+ if (process.env.SPAWNEE_CONCURRENCY)
39
+ env.maxConcurrent = parseInt(process.env.SPAWNEE_CONCURRENCY, 10);
40
+ if (process.env.SPAWNEE_POLL_INTERVAL)
41
+ env.pollInterval = parseInt(process.env.SPAWNEE_POLL_INTERVAL, 10);
42
+ if (process.env.SPAWNEE_TIMEOUT)
43
+ env.defaultTimeout = parseInt(process.env.SPAWNEE_TIMEOUT, 10);
44
+ if (process.env.SPAWNEE_STATE_FILE)
45
+ env.stateFile = process.env.SPAWNEE_STATE_FILE;
46
+ if (process.env.SPAWNEE_VERBOSE)
47
+ env.verbose = process.env.SPAWNEE_VERBOSE === 'true' || process.env.SPAWNEE_VERBOSE === '1';
48
+ return env;
49
+ }
50
+ export function loadConfig(overrides = {}) {
51
+ const fileConfig = loadConfigFile(overrides.configFile); // Priority 3: Config file
52
+ const envConfig = loadEnvConfig(); // Priority 2: Environment variables
53
+ const { configFile: _, ...cliOverrides } = overrides; // Priority 1: CLI flags (strip configFile key)
54
+ const filteredOverrides = Object.fromEntries(Object.entries(cliOverrides).filter(([, v]) => v !== undefined));
55
+ const merged = { ...fileConfig, ...envConfig, ...filteredOverrides };
56
+ return ConfigSchema.parse(merged);
57
+ }
58
+ export function generateDefaultConfig() {
59
+ const template = {
60
+ apiKey: '',
61
+ apiBaseUrl: 'https://api.cursor.com',
62
+ maxConcurrent: 10,
63
+ pollInterval: 15000,
64
+ defaultTimeout: 3600000,
65
+ stateFile: '.spawnee-state.json',
66
+ verbose: false,
67
+ };
68
+ return JSON.stringify(template, null, 2);
69
+ }
70
+ export function getConfigFilePath() {
71
+ return resolve(process.cwd(), DEFAULT_CONFIG_FILENAME);
72
+ }
73
+ export { DEFAULT_CONFIG_FILENAME };
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export declare class Logger {
3
+ private context;
4
+ private minLevel;
5
+ constructor(context: string, minLevel?: LogLevel);
6
+ private levels;
7
+ private shouldLog;
8
+ private timestamp;
9
+ private format;
10
+ debug(message: string): void;
11
+ info(message: string): void;
12
+ warn(message: string): void;
13
+ error(message: string): void;
14
+ success(message: string): void;
15
+ }
16
+ export declare const logger: Logger;
@@ -0,0 +1,47 @@
1
+ import chalk from 'chalk';
2
+ export class Logger {
3
+ context;
4
+ minLevel;
5
+ constructor(context, minLevel = 'info') {
6
+ this.context = context;
7
+ this.minLevel = minLevel;
8
+ }
9
+ levels = { debug: 0, info: 1, warn: 2, error: 3 };
10
+ shouldLog(level) {
11
+ return this.levels[level] >= this.levels[this.minLevel];
12
+ }
13
+ timestamp() {
14
+ return new Date().toISOString().slice(11, 19);
15
+ }
16
+ format(level, message) {
17
+ const colors = {
18
+ debug: chalk.gray,
19
+ info: chalk.blue,
20
+ warn: chalk.yellow,
21
+ error: chalk.red,
22
+ };
23
+ return `${chalk.gray(`[${this.timestamp()}]`)} ${colors[level](`[${this.context}]`)} ${message}`;
24
+ }
25
+ debug(message) {
26
+ if (this.shouldLog('debug'))
27
+ console.log(this.format('debug', message));
28
+ }
29
+ info(message) {
30
+ if (this.shouldLog('info'))
31
+ console.log(this.format('info', message));
32
+ }
33
+ warn(message) {
34
+ if (this.shouldLog('warn'))
35
+ console.log(this.format('warn', `⚠ ${message}`));
36
+ }
37
+ error(message) {
38
+ if (this.shouldLog('error'))
39
+ console.log(this.format('error', `✗ ${message}`));
40
+ }
41
+ success(message) {
42
+ if (this.shouldLog('info'))
43
+ console.log(this.format('info', chalk.green(`✓ ${message}`)));
44
+ }
45
+ }
46
+ export const logger = new Logger('Main');
47
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,OAAO,MAAM;IACG;IAAyB;IAA7C,YAAoB,OAAe,EAAU,WAAqB,MAAM;QAApD,YAAO,GAAP,OAAO,CAAQ;QAAU,aAAQ,GAAR,QAAQ,CAAmB;IAAG,CAAC;IAEpE,MAAM,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAE5E,SAAS,CAAC,KAAe;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEO,SAAS;QACf,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,MAAM,GAA4C;YACtD,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,MAAM;YAClB,KAAK,EAAE,KAAK,CAAC,GAAG;SACjB,CAAC;QACF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC"}