@scanton/phase2s 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/dist/bin/phase2s.d.ts +3 -0
  4. package/dist/bin/phase2s.d.ts.map +1 -0
  5. package/dist/bin/phase2s.js +7 -0
  6. package/dist/bin/phase2s.js.map +1 -0
  7. package/dist/src/cli/index.d.ts +2 -0
  8. package/dist/src/cli/index.d.ts.map +1 -0
  9. package/dist/src/cli/index.js +499 -0
  10. package/dist/src/cli/index.js.map +1 -0
  11. package/dist/src/core/agent.d.ts +63 -0
  12. package/dist/src/core/agent.d.ts.map +1 -0
  13. package/dist/src/core/agent.js +178 -0
  14. package/dist/src/core/agent.js.map +1 -0
  15. package/dist/src/core/config.d.ts +52 -0
  16. package/dist/src/core/config.d.ts.map +1 -0
  17. package/dist/src/core/config.js +103 -0
  18. package/dist/src/core/config.js.map +1 -0
  19. package/dist/src/core/conversation.d.ts +44 -0
  20. package/dist/src/core/conversation.d.ts.map +1 -0
  21. package/dist/src/core/conversation.js +128 -0
  22. package/dist/src/core/conversation.js.map +1 -0
  23. package/dist/src/core/memory.d.ts +24 -0
  24. package/dist/src/core/memory.d.ts.map +1 -0
  25. package/dist/src/core/memory.js +65 -0
  26. package/dist/src/core/memory.js.map +1 -0
  27. package/dist/src/mcp/server.d.ts +73 -0
  28. package/dist/src/mcp/server.d.ts.map +1 -0
  29. package/dist/src/mcp/server.js +215 -0
  30. package/dist/src/mcp/server.js.map +1 -0
  31. package/dist/src/providers/codex.d.ts +28 -0
  32. package/dist/src/providers/codex.d.ts.map +1 -0
  33. package/dist/src/providers/codex.js +162 -0
  34. package/dist/src/providers/codex.js.map +1 -0
  35. package/dist/src/providers/index.d.ts +6 -0
  36. package/dist/src/providers/index.d.ts.map +1 -0
  37. package/dist/src/providers/index.js +13 -0
  38. package/dist/src/providers/index.js.map +1 -0
  39. package/dist/src/providers/openai.d.ts +36 -0
  40. package/dist/src/providers/openai.d.ts.map +1 -0
  41. package/dist/src/providers/openai.js +117 -0
  42. package/dist/src/providers/openai.js.map +1 -0
  43. package/dist/src/providers/types.d.ts +34 -0
  44. package/dist/src/providers/types.d.ts.map +1 -0
  45. package/dist/src/providers/types.js +2 -0
  46. package/dist/src/providers/types.js.map +1 -0
  47. package/dist/src/skills/index.d.ts +3 -0
  48. package/dist/src/skills/index.d.ts.map +1 -0
  49. package/dist/src/skills/index.js +2 -0
  50. package/dist/src/skills/index.js.map +1 -0
  51. package/dist/src/skills/loader.d.ts +23 -0
  52. package/dist/src/skills/loader.d.ts.map +1 -0
  53. package/dist/src/skills/loader.js +136 -0
  54. package/dist/src/skills/loader.js.map +1 -0
  55. package/dist/src/skills/types.d.ts +14 -0
  56. package/dist/src/skills/types.d.ts.map +1 -0
  57. package/dist/src/skills/types.js +2 -0
  58. package/dist/src/skills/types.js.map +1 -0
  59. package/dist/src/tools/file-read.d.ts +3 -0
  60. package/dist/src/tools/file-read.d.ts.map +1 -0
  61. package/dist/src/tools/file-read.js +50 -0
  62. package/dist/src/tools/file-read.js.map +1 -0
  63. package/dist/src/tools/file-write.d.ts +3 -0
  64. package/dist/src/tools/file-write.d.ts.map +1 -0
  65. package/dist/src/tools/file-write.js +90 -0
  66. package/dist/src/tools/file-write.js.map +1 -0
  67. package/dist/src/tools/glob-tool.d.ts +3 -0
  68. package/dist/src/tools/glob-tool.d.ts.map +1 -0
  69. package/dist/src/tools/glob-tool.js +38 -0
  70. package/dist/src/tools/glob-tool.js.map +1 -0
  71. package/dist/src/tools/grep-tool.d.ts +3 -0
  72. package/dist/src/tools/grep-tool.d.ts.map +1 -0
  73. package/dist/src/tools/grep-tool.js +59 -0
  74. package/dist/src/tools/grep-tool.js.map +1 -0
  75. package/dist/src/tools/index.d.ts +5 -0
  76. package/dist/src/tools/index.d.ts.map +1 -0
  77. package/dist/src/tools/index.js +17 -0
  78. package/dist/src/tools/index.js.map +1 -0
  79. package/dist/src/tools/registry.d.ts +13 -0
  80. package/dist/src/tools/registry.d.ts.map +1 -0
  81. package/dist/src/tools/registry.js +50 -0
  82. package/dist/src/tools/registry.js.map +1 -0
  83. package/dist/src/tools/sandbox.d.ts +29 -0
  84. package/dist/src/tools/sandbox.d.ts.map +1 -0
  85. package/dist/src/tools/sandbox.js +84 -0
  86. package/dist/src/tools/sandbox.js.map +1 -0
  87. package/dist/src/tools/shell.d.ts +10 -0
  88. package/dist/src/tools/shell.d.ts.map +1 -0
  89. package/dist/src/tools/shell.js +108 -0
  90. package/dist/src/tools/shell.js.map +1 -0
  91. package/dist/src/tools/types.d.ts +25 -0
  92. package/dist/src/tools/types.d.ts.map +1 -0
  93. package/dist/src/tools/types.js +54 -0
  94. package/dist/src/tools/types.js.map +1 -0
  95. package/dist/src/utils/logger.d.ts +10 -0
  96. package/dist/src/utils/logger.d.ts.map +1 -0
  97. package/dist/src/utils/logger.js +25 -0
  98. package/dist/src/utils/logger.js.map +1 -0
  99. package/dist/src/utils/prompt.d.ts +3 -0
  100. package/dist/src/utils/prompt.d.ts.map +1 -0
  101. package/dist/src/utils/prompt.js +26 -0
  102. package/dist/src/utils/prompt.js.map +1 -0
  103. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Config } from "./config.js";
2
+ import { Conversation } from "./conversation.js";
3
+ import { type Provider } from "../providers/index.js";
4
+ import { type ToolRegistry } from "../tools/index.js";
5
+ export interface SatoriResult {
6
+ attempt: number;
7
+ passed: boolean;
8
+ verifyOutput: string;
9
+ text: string;
10
+ }
11
+ export interface AgentRunOptions {
12
+ onDelta?: (text: string) => void;
13
+ modelOverride?: string;
14
+ maxRetries?: number;
15
+ verifyCommand?: string;
16
+ verifyFn?: (command: string) => Promise<{
17
+ exitCode: number;
18
+ output: string;
19
+ }>;
20
+ preRun?: () => Promise<void>;
21
+ postRun?: (result: SatoriResult) => Promise<void>;
22
+ }
23
+ export interface AgentOptions {
24
+ config: Config;
25
+ tools?: ToolRegistry;
26
+ systemPrompt?: string;
27
+ provider?: Provider;
28
+ conversation?: Conversation;
29
+ /** Pre-formatted learnings string from formatLearningsForPrompt(). Injected into the system prompt. */
30
+ learnings?: string;
31
+ }
32
+ export declare class Agent {
33
+ private provider;
34
+ private tools;
35
+ private conversation;
36
+ private config;
37
+ private maxTurns;
38
+ constructor(opts: AgentOptions);
39
+ getConversation(): Conversation;
40
+ /**
41
+ * Resolve a model alias ("fast" | "smart") to an actual model ID using config.
42
+ * Falls back to config.model if alias not configured.
43
+ */
44
+ private resolveModel;
45
+ /**
46
+ * Run the shell verify command. Uses verifyFn if provided (for testing),
47
+ * otherwise execs the command directly.
48
+ */
49
+ private runVerify;
50
+ /**
51
+ * Run one pass of the agent loop (inner loop — does NOT add userMessage to conversation).
52
+ * Called by run() after the user message is already added.
53
+ */
54
+ private runOnce;
55
+ /**
56
+ * Run the agent with an optional satori retry loop.
57
+ *
58
+ * If options.maxRetries is set, runs the task, verifies with verifyCommand,
59
+ * retries on failure (injecting failure context), stops when passing or exhausted.
60
+ */
61
+ run(userMessage: string, options?: AgentRunOptions | ((text: string) => void)): Promise<string>;
62
+ }
63
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/core/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAM7E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,uGAAuG;IACvG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,YAAY;IAoB9B,eAAe,IAAI,YAAY;IAI/B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAMpB;;;OAGG;YACW,SAAS;IAoBvB;;;OAGG;YACW,OAAO;IAyErB;;;;;OAKG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAgDtG"}
@@ -0,0 +1,178 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { Conversation } from "./conversation.js";
4
+ import { createProvider } from "../providers/index.js";
5
+ import { createDefaultRegistry } from "../tools/index.js";
6
+ import { buildSystemPrompt } from "../utils/prompt.js";
7
+ import { log } from "../utils/logger.js";
8
+ const execAsync = promisify(exec);
9
+ export class Agent {
10
+ provider;
11
+ tools;
12
+ conversation;
13
+ config;
14
+ maxTurns;
15
+ constructor(opts) {
16
+ this.config = opts.config;
17
+ this.tools = opts.tools ?? createDefaultRegistry(opts.config.allowDestructive);
18
+ this.provider = opts.provider ?? createProvider(opts.config);
19
+ this.maxTurns = opts.config.maxTurns;
20
+ if (opts.conversation) {
21
+ this.conversation = opts.conversation;
22
+ }
23
+ else {
24
+ const systemPrompt = buildSystemPrompt(this.tools.list(), opts.systemPrompt ?? opts.config.systemPrompt, opts.learnings);
25
+ this.conversation = new Conversation(systemPrompt);
26
+ }
27
+ log.dim(`Provider: ${this.provider.name} | Model: ${this.config.model}`);
28
+ }
29
+ getConversation() {
30
+ return this.conversation;
31
+ }
32
+ /**
33
+ * Resolve a model alias ("fast" | "smart") to an actual model ID using config.
34
+ * Falls back to config.model if alias not configured.
35
+ */
36
+ resolveModel(model) {
37
+ if (model === "fast")
38
+ return this.config.fast_model ?? this.config.model;
39
+ if (model === "smart")
40
+ return this.config.smart_model ?? this.config.model;
41
+ return model; // literal model string
42
+ }
43
+ /**
44
+ * Run the shell verify command. Uses verifyFn if provided (for testing),
45
+ * otherwise execs the command directly.
46
+ */
47
+ async runVerify(command, verifyFn) {
48
+ if (verifyFn)
49
+ return verifyFn(command);
50
+ try {
51
+ const { stdout, stderr } = await execAsync(command, {
52
+ cwd: process.cwd(),
53
+ timeout: 120_000,
54
+ });
55
+ return { exitCode: 0, output: stdout + stderr };
56
+ }
57
+ catch (err) {
58
+ const e = err;
59
+ return {
60
+ exitCode: e.code ?? 1,
61
+ output: (e.stdout ?? "") + (e.stderr ?? ""),
62
+ };
63
+ }
64
+ }
65
+ /**
66
+ * Run one pass of the agent loop (inner loop — does NOT add userMessage to conversation).
67
+ * Called by run() after the user message is already added.
68
+ */
69
+ async runOnce(onDelta, modelOverride) {
70
+ let turns = 0;
71
+ while (turns < this.maxTurns) {
72
+ turns++;
73
+ this.conversation.trimToTokenBudget();
74
+ let text = "";
75
+ const toolCalls = [];
76
+ const resolvedModel = modelOverride ? this.resolveModel(modelOverride) : undefined;
77
+ for await (const event of this.provider.chatStream(this.conversation.getMessages(), this.tools.toOpenAI(), resolvedModel ? { model: resolvedModel } : undefined)) {
78
+ if (event.type === "text") {
79
+ text += event.content;
80
+ onDelta?.(event.content);
81
+ }
82
+ else if (event.type === "tool_calls") {
83
+ toolCalls.push(...event.calls);
84
+ }
85
+ else if (event.type === "error") {
86
+ throw new Error(event.error);
87
+ }
88
+ else if (event.type === "done") {
89
+ break;
90
+ }
91
+ }
92
+ if (toolCalls.length === 0) {
93
+ this.conversation.addAssistant(text);
94
+ return text;
95
+ }
96
+ this.conversation.addAssistant(text, toolCalls);
97
+ for (const call of toolCalls) {
98
+ log.tool(call.name, truncate(call.arguments, 100));
99
+ let args;
100
+ try {
101
+ args = JSON.parse(call.arguments);
102
+ }
103
+ catch {
104
+ this.conversation.addToolResult(call.id, `Error: Invalid JSON arguments`);
105
+ continue;
106
+ }
107
+ let resultContent;
108
+ try {
109
+ const result = await this.tools.execute(call.name, args);
110
+ if (result.success) {
111
+ log.tool(call.name, truncate(result.output, 200));
112
+ resultContent = result.output;
113
+ }
114
+ else {
115
+ log.tool(call.name, `Error: ${result.error}`);
116
+ resultContent = `Error: ${result.error}`;
117
+ }
118
+ }
119
+ catch (err) {
120
+ const msg = err instanceof Error ? err.message : String(err);
121
+ log.tool(call.name, `Unexpected error: ${msg}`);
122
+ resultContent = `Error: ${msg}`;
123
+ }
124
+ this.conversation.addToolResult(call.id, resultContent);
125
+ }
126
+ }
127
+ return "(Agent reached maximum turns without a final response)";
128
+ }
129
+ /**
130
+ * Run the agent with an optional satori retry loop.
131
+ *
132
+ * If options.maxRetries is set, runs the task, verifies with verifyCommand,
133
+ * retries on failure (injecting failure context), stops when passing or exhausted.
134
+ */
135
+ async run(userMessage, options) {
136
+ // Backward compat: if called as run(message, onDelta) (old signature), wrap in options
137
+ const opts = typeof options === "function"
138
+ ? { onDelta: options }
139
+ : (options ?? {});
140
+ this.conversation.addUser(userMessage);
141
+ // Satori mode: retry loop with shell verification
142
+ if (opts.maxRetries && opts.maxRetries > 0) {
143
+ const verifyCommand = opts.verifyCommand ?? this.config.verifyCommand ?? "npm test";
144
+ if (opts.preRun)
145
+ await opts.preRun();
146
+ let lastText = "";
147
+ for (let attempt = 1; attempt <= opts.maxRetries; attempt++) {
148
+ lastText = await this.runOnce(opts.onDelta, opts.modelOverride);
149
+ const { exitCode, output } = await this.runVerify(verifyCommand, opts.verifyFn);
150
+ const passed = exitCode === 0;
151
+ const satoriResult = {
152
+ attempt,
153
+ passed,
154
+ verifyOutput: output,
155
+ text: lastText,
156
+ };
157
+ if (opts.postRun)
158
+ await opts.postRun(satoriResult);
159
+ if (passed) {
160
+ return lastText;
161
+ }
162
+ if (attempt < opts.maxRetries) {
163
+ // Inject failure context for next attempt
164
+ this.conversation.addUser(`Verification failed on attempt ${attempt}/${opts.maxRetries}:\n${output.slice(0, 2000)}\nPlease address these failures.`);
165
+ }
166
+ }
167
+ return `${lastText}\n\n[Satori: verification did not pass after ${opts.maxRetries} attempts]`;
168
+ }
169
+ // Normal single-pass mode
170
+ return this.runOnce(opts.onDelta, opts.modelOverride);
171
+ }
172
+ }
173
+ function truncate(s, max) {
174
+ if (s.length <= max)
175
+ return s;
176
+ return s.slice(0, max) + "...";
177
+ }
178
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/core/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ declare const configSchema: z.ZodObject<{
3
+ provider: z.ZodDefault<z.ZodEnum<["codex-cli", "openai-api"]>>;
4
+ /**
5
+ * Model to use. For codex-cli provider, defaults to whatever is in
6
+ * ~/.codex/config.toml so the user's existing Codex setup is respected.
7
+ * For openai-api, defaults to "gpt-4o".
8
+ */
9
+ model: z.ZodOptional<z.ZodString>;
10
+ fast_model: z.ZodOptional<z.ZodString>;
11
+ smart_model: z.ZodOptional<z.ZodString>;
12
+ apiKey: z.ZodOptional<z.ZodString>;
13
+ codexPath: z.ZodDefault<z.ZodString>;
14
+ systemPrompt: z.ZodOptional<z.ZodString>;
15
+ maxTurns: z.ZodDefault<z.ZodNumber>;
16
+ timeout: z.ZodDefault<z.ZodNumber>;
17
+ allowDestructive: z.ZodDefault<z.ZodBoolean>;
18
+ verifyCommand: z.ZodDefault<z.ZodString>;
19
+ requireSpecification: z.ZodDefault<z.ZodBoolean>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ provider: "codex-cli" | "openai-api";
22
+ codexPath: string;
23
+ maxTurns: number;
24
+ timeout: number;
25
+ allowDestructive: boolean;
26
+ verifyCommand: string;
27
+ requireSpecification: boolean;
28
+ model?: string | undefined;
29
+ fast_model?: string | undefined;
30
+ smart_model?: string | undefined;
31
+ apiKey?: string | undefined;
32
+ systemPrompt?: string | undefined;
33
+ }, {
34
+ provider?: "codex-cli" | "openai-api" | undefined;
35
+ model?: string | undefined;
36
+ fast_model?: string | undefined;
37
+ smart_model?: string | undefined;
38
+ apiKey?: string | undefined;
39
+ codexPath?: string | undefined;
40
+ systemPrompt?: string | undefined;
41
+ maxTurns?: number | undefined;
42
+ timeout?: number | undefined;
43
+ allowDestructive?: boolean | undefined;
44
+ verifyCommand?: string | undefined;
45
+ requireSpecification?: boolean | undefined;
46
+ }>;
47
+ export type Config = z.infer<typeof configSchema> & {
48
+ model: string;
49
+ };
50
+ export declare function loadConfig(overrides?: Partial<z.infer<typeof configSchema>>): Promise<Config>;
51
+ export {};
52
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,YAAY;;IAEhB;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDnG"}
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve, join } from "node:path";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { parse as parseToml } from "@iarna/toml";
6
+ const configSchema = z.object({
7
+ provider: z.enum(["codex-cli", "openai-api"]).default("codex-cli"),
8
+ /**
9
+ * Model to use. For codex-cli provider, defaults to whatever is in
10
+ * ~/.codex/config.toml so the user's existing Codex setup is respected.
11
+ * For openai-api, defaults to "gpt-4o".
12
+ */
13
+ model: z.string().optional(),
14
+ fast_model: z.string().optional(),
15
+ smart_model: z.string().optional(),
16
+ apiKey: z.string().optional(),
17
+ codexPath: z.string().default("codex"),
18
+ systemPrompt: z.string().optional(),
19
+ maxTurns: z.number().default(50),
20
+ timeout: z.number().default(120_000),
21
+ allowDestructive: z.boolean().default(false),
22
+ verifyCommand: z.string().default("npm test"),
23
+ requireSpecification: z.boolean().default(false),
24
+ });
25
+ export async function loadConfig(overrides) {
26
+ let fileConfig = {};
27
+ // Try loading .phase2s.yaml from current directory
28
+ for (const name of [".phase2s.yaml", ".phase2s.yml"]) {
29
+ try {
30
+ const raw = await readFile(resolve(name), "utf-8");
31
+ const parsed = parseYaml(raw);
32
+ if (parsed === null || parsed === undefined) {
33
+ // Empty file — treat as no config
34
+ }
35
+ else if (typeof parsed !== "object" || Array.isArray(parsed)) {
36
+ throw new Error(`${name} must be a YAML mapping (key: value), not a ${Array.isArray(parsed) ? "list" : typeof parsed}`);
37
+ }
38
+ else {
39
+ fileConfig = parsed;
40
+ }
41
+ break;
42
+ }
43
+ catch (err) {
44
+ if (err instanceof Error && err.message.includes("must be a YAML"))
45
+ throw err;
46
+ // Swallow only filesystem "file not found / not readable" errors.
47
+ // Re-throw YAML parse errors so the user sees them (invalid config is not silent).
48
+ const code = err.code;
49
+ if (code !== "ENOENT" && code !== "EACCES")
50
+ throw err;
51
+ }
52
+ }
53
+ // Env vars override file config
54
+ const envConfig = {};
55
+ if (process.env.OPENAI_API_KEY)
56
+ envConfig.apiKey = process.env.OPENAI_API_KEY;
57
+ if (process.env.PHASE2S_PROVIDER)
58
+ envConfig.provider = process.env.PHASE2S_PROVIDER;
59
+ if (process.env.PHASE2S_MODEL)
60
+ envConfig.model = process.env.PHASE2S_MODEL;
61
+ if (process.env.PHASE2S_CODEX_PATH)
62
+ envConfig.codexPath = process.env.PHASE2S_CODEX_PATH;
63
+ if (process.env.PHASE2S_FAST_MODEL)
64
+ envConfig.fast_model = process.env.PHASE2S_FAST_MODEL;
65
+ if (process.env.PHASE2S_SMART_MODEL)
66
+ envConfig.smart_model = process.env.PHASE2S_SMART_MODEL;
67
+ if (process.env.PHASE2S_VERIFY_COMMAND)
68
+ envConfig.verifyCommand = process.env.PHASE2S_VERIFY_COMMAND;
69
+ // Accept "true", "1", "yes" (case-insensitive) for PHASE2S_ALLOW_DESTRUCTIVE.
70
+ const _destructive = process.env.PHASE2S_ALLOW_DESTRUCTIVE?.toLowerCase();
71
+ if (_destructive === "true" || _destructive === "1" || _destructive === "yes") {
72
+ envConfig.allowDestructive = true;
73
+ }
74
+ const merged = { ...fileConfig, ...envConfig, ...overrides };
75
+ const parsed = configSchema.parse(merged);
76
+ // Resolve model: explicit config > ~/.codex/config.toml > provider default
77
+ if (!parsed.model) {
78
+ parsed.model = await resolveDefaultModel(parsed.provider);
79
+ }
80
+ return parsed;
81
+ }
82
+ /**
83
+ * Read the model from ~/.codex/config.toml if available (for codex-cli provider),
84
+ * otherwise fall back to a sensible default per provider.
85
+ */
86
+ async function resolveDefaultModel(provider) {
87
+ if (provider === "codex-cli") {
88
+ try {
89
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
90
+ const raw = await readFile(join(home, ".codex", "config.toml"), "utf-8");
91
+ const toml = parseToml(raw);
92
+ if (typeof toml.model === "string" && toml.model) {
93
+ return toml.model;
94
+ }
95
+ }
96
+ catch {
97
+ // No config file, use default
98
+ }
99
+ return "gpt-4o"; // safe fallback for ChatGPT subscriptions
100
+ }
101
+ return "gpt-4o"; // direct API default
102
+ }
103
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Message } from "../providers/types.js";
2
+ export declare class Conversation {
3
+ private messages;
4
+ constructor(systemPrompt?: string);
5
+ addUser(content: string): void;
6
+ addAssistant(content: string, toolCalls?: Message["toolCalls"]): void;
7
+ addToolResult(toolCallId: string, content: string): void;
8
+ getMessages(): Message[];
9
+ get length(): number;
10
+ /** Rough token estimate for context management (4 chars ≈ 1 token).
11
+ * Includes toolCalls arguments in the estimate — they can be substantial
12
+ * and excluding them causes consistent undercounting that leads to 400 errors. */
13
+ estimateTokens(): number;
14
+ /**
15
+ * Serialize the conversation history to a JSON file.
16
+ * Creates parent directories if they don't exist.
17
+ *
18
+ * @param mode Optional file permission mode (e.g. 0o600 for owner-only).
19
+ * Defaults to umask-controlled permissions if not specified.
20
+ * Pass 0o600 from the CLI to prevent session files (which may
21
+ * contain code, file paths, or secrets) from being world-readable.
22
+ */
23
+ save(path: string, mode?: number): Promise<void>;
24
+ /**
25
+ * Deserialize a conversation from a JSON file previously written by save().
26
+ *
27
+ * Throws if the file doesn't exist, is unreadable, or contains invalid JSON —
28
+ * callers (e.g. the CLI --resume path) should handle these gracefully.
29
+ */
30
+ static load(path: string): Promise<Conversation>;
31
+ /**
32
+ * Trim oldest tool turns to stay under the token budget.
33
+ * Called automatically before each LLM turn to prevent context overflow.
34
+ *
35
+ * Drops complete turns atomically: the assistant message that issued tool calls
36
+ * AND all its paired tool results are removed together. This is required because
37
+ * the OpenAI API rejects messages where a tool result exists without its paired
38
+ * assistant tool_call (or vice versa) — partial removal causes a 400 error.
39
+ *
40
+ * Preserves: system prompt, user messages, assistant text-only responses.
41
+ */
42
+ trimToTokenBudget(maxTokens?: number): void;
43
+ }
44
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/core/conversation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAMrD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;gBAErB,YAAY,CAAC,EAAE,MAAM;IAMjC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAIrE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxD,WAAW,IAAI,OAAO,EAAE;IAIxB,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;sFAEkF;IAClF,cAAc,IAAI,MAAM;IAUxB;;;;;;;;OAQG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD;;;;;OAKG;WACU,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BtD;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,SAAS,GAAE,MAA6B,GAAG,IAAI;CAwBlE"}
@@ -0,0 +1,128 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ // Conservative token budget: 80% of gpt-4o's 128k context window.
4
+ // Trimming starts here to leave headroom for the model's response.
5
+ const DEFAULT_TOKEN_BUDGET = Math.floor(128_000 * 0.8);
6
+ export class Conversation {
7
+ messages = [];
8
+ constructor(systemPrompt) {
9
+ if (systemPrompt) {
10
+ this.messages.push({ role: "system", content: systemPrompt });
11
+ }
12
+ }
13
+ addUser(content) {
14
+ this.messages.push({ role: "user", content });
15
+ }
16
+ addAssistant(content, toolCalls) {
17
+ this.messages.push({ role: "assistant", content, toolCalls });
18
+ }
19
+ addToolResult(toolCallId, content) {
20
+ this.messages.push({ role: "tool", content, toolCallId });
21
+ }
22
+ getMessages() {
23
+ return [...this.messages];
24
+ }
25
+ get length() {
26
+ return this.messages.length;
27
+ }
28
+ /** Rough token estimate for context management (4 chars ≈ 1 token).
29
+ * Includes toolCalls arguments in the estimate — they can be substantial
30
+ * and excluding them causes consistent undercounting that leads to 400 errors. */
31
+ estimateTokens() {
32
+ return this.messages.reduce((sum, m) => {
33
+ const contentLen = (m.content ?? "").length;
34
+ const toolCallsLen = m.toolCalls
35
+ ? m.toolCalls.reduce((s, tc) => s + tc.name.length + tc.arguments.length, 0)
36
+ : 0;
37
+ return sum + Math.ceil((contentLen + toolCallsLen) / 4);
38
+ }, 0);
39
+ }
40
+ /**
41
+ * Serialize the conversation history to a JSON file.
42
+ * Creates parent directories if they don't exist.
43
+ *
44
+ * @param mode Optional file permission mode (e.g. 0o600 for owner-only).
45
+ * Defaults to umask-controlled permissions if not specified.
46
+ * Pass 0o600 from the CLI to prevent session files (which may
47
+ * contain code, file paths, or secrets) from being world-readable.
48
+ */
49
+ async save(path, mode) {
50
+ await mkdir(dirname(path), { recursive: true });
51
+ const content = JSON.stringify(this.messages, null, 2);
52
+ if (mode !== undefined) {
53
+ await writeFile(path, content, { encoding: "utf-8", mode });
54
+ }
55
+ else {
56
+ await writeFile(path, content, "utf-8");
57
+ }
58
+ }
59
+ /**
60
+ * Deserialize a conversation from a JSON file previously written by save().
61
+ *
62
+ * Throws if the file doesn't exist, is unreadable, or contains invalid JSON —
63
+ * callers (e.g. the CLI --resume path) should handle these gracefully.
64
+ */
65
+ static async load(path) {
66
+ const raw = await readFile(path, "utf-8");
67
+ const parsed = JSON.parse(raw);
68
+ if (!Array.isArray(parsed)) {
69
+ throw new Error("Invalid session file: expected a JSON array of messages");
70
+ }
71
+ // Validate each message to prevent prompt injection via a crafted session file.
72
+ const validRoles = new Set(["system", "user", "assistant", "tool"]);
73
+ for (let i = 0; i < parsed.length; i++) {
74
+ const msg = parsed[i];
75
+ if (typeof msg !== "object" || msg === null) {
76
+ throw new Error(`Invalid session file: message at index ${i} is not an object`);
77
+ }
78
+ const { role, content } = msg;
79
+ if (typeof role !== "string" || !validRoles.has(role)) {
80
+ throw new Error(`Invalid session file: message at index ${i} has invalid role: ${String(role)}`);
81
+ }
82
+ if (content !== undefined && content !== null && typeof content !== "string") {
83
+ throw new Error(`Invalid session file: message at index ${i} has non-string content`);
84
+ }
85
+ }
86
+ const messages = parsed;
87
+ const conv = new Conversation();
88
+ // Copy the array to avoid sharing the reference with the parsed JSON object.
89
+ conv.messages = [...messages];
90
+ return conv;
91
+ }
92
+ /**
93
+ * Trim oldest tool turns to stay under the token budget.
94
+ * Called automatically before each LLM turn to prevent context overflow.
95
+ *
96
+ * Drops complete turns atomically: the assistant message that issued tool calls
97
+ * AND all its paired tool results are removed together. This is required because
98
+ * the OpenAI API rejects messages where a tool result exists without its paired
99
+ * assistant tool_call (or vice versa) — partial removal causes a 400 error.
100
+ *
101
+ * Preserves: system prompt, user messages, assistant text-only responses.
102
+ */
103
+ trimToTokenBudget(maxTokens = DEFAULT_TOKEN_BUDGET) {
104
+ while (this.estimateTokens() > maxTokens) {
105
+ // Find the oldest tool result message
106
+ const firstToolIdx = this.messages.findIndex((m) => m.role === "tool");
107
+ if (firstToolIdx === -1)
108
+ break; // nothing left to trim
109
+ // The assistant message that issued these tool calls is immediately before
110
+ // the first tool result in this batch
111
+ const prevIdx = firstToolIdx - 1;
112
+ const prevMsg = prevIdx >= 0 ? this.messages[prevIdx] : null;
113
+ if (prevMsg?.role === "assistant" && prevMsg.toolCalls?.length) {
114
+ // Drop the entire turn: assistant message + all its consecutive tool results
115
+ let endIdx = firstToolIdx;
116
+ while (endIdx < this.messages.length && this.messages[endIdx].role === "tool") {
117
+ endIdx++;
118
+ }
119
+ this.messages.splice(prevIdx, endIdx - prevIdx);
120
+ }
121
+ else {
122
+ // Orphaned tool result (no paired assistant message) — drop just the result
123
+ this.messages.splice(firstToolIdx, 1);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=conversation.js.map