@codeworksh/harness 0.0.1-dev.20260825093030 → 0.0.1-dev.20260907151726

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/cli/index.d.mts DELETED
@@ -1,22 +0,0 @@
1
- import { Effect, Option, Schema } from "effect";
2
- import { CliError, Command } from "effect/unstable/cli";
3
- //#region src/cli/index.d.ts
4
- declare const InvalidInputError_base: Schema.Class<InvalidInputError, Schema.TaggedStruct<"CLI.InvalidInputError", {
5
- readonly message: Schema.String;
6
- }>, import("effect/Cause").YieldableError>;
7
- declare class InvalidInputError extends InvalidInputError_base {}
8
- declare const ModelgenError_base: Schema.Class<ModelgenError, Schema.TaggedStruct<"CLI.ModelgenError", {
9
- readonly cause: Schema.Defect;
10
- }>, import("effect/Cause").YieldableError>;
11
- declare class ModelgenError extends ModelgenError_base {}
12
- declare const command: Command.Command<"codework", {
13
- readonly home: Option.Option<string>;
14
- readonly database: Option.Option<string>;
15
- }, {
16
- readonly home: Option.Option<string>;
17
- readonly database: Option.Option<string>;
18
- }, InvalidInputError | ModelgenError, never>;
19
- declare const main: Effect.Effect<void, Command.Error<typeof command> | CliError.CliError>;
20
- //#endregion
21
- export { command, main };
22
- //# sourceMappingURL=index.d.mts.map
package/cli/index.mjs DELETED
@@ -1,289 +0,0 @@
1
- #!/usr/bin/env node
2
- import { _ as LLMEnded, a as create, b as ID, d as LLMStreamError, f as ModelCatalogError, g as SandboxProviderError, i as Drivers, l as layer, m as ProviderError, n as create$1, o as register, p as ModelNotFoundError, t as attach, v as LLMTextDelta, y as TurnEnded } from "../session-B8PG8cMg.mjs";
3
- import { Duration, Effect, Fiber, Option, Queue, Ref, Schema, Stream } from "effect";
4
- import { generateModels } from "@codeworksh/aikit/modelgen";
5
- import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
6
- import * as NodeServices from "@effect/platform-node/NodeServices";
7
- import { Argument, Command, Flag } from "effect/unstable/cli";
8
- //#region src/cli/error.ts
9
- const isProviderError = Schema.is(ProviderError);
10
- const isModelCatalogError = Schema.is(ModelCatalogError);
11
- const isModelNotFoundError = Schema.is(ModelNotFoundError);
12
- const isLLMStreamError = Schema.is(LLMStreamError);
13
- const isSandboxProviderError = Schema.is(SandboxProviderError);
14
- const providerCategory = (reason) => {
15
- switch (reason._tag) {
16
- case "Runner.ProviderAuthenticationError": return "authentication";
17
- case "Runner.ProviderConfigurationError": return "configuration";
18
- case "Runner.ProviderAuthorizationError": return "authorization";
19
- case "Runner.ProviderModelUnavailableError": return "model_unavailable";
20
- case "Runner.ProviderRateLimitError": return "rate_limited";
21
- case "Runner.ProviderQuotaError": return "quota";
22
- case "Runner.ProviderInvalidRequestError": return "invalid_request";
23
- case "Runner.ProviderContentPolicyError": return "content_policy";
24
- case "Runner.ProviderTimeoutError": return "timeout";
25
- case "Runner.ProviderTransportError": return "transport";
26
- case "Runner.ProviderUnavailableError": return "provider_unavailable";
27
- case "Runner.ProviderInvalidResponseError": return "invalid_response";
28
- case "Runner.ProviderUnknownError": return "provider";
29
- }
30
- };
31
- const credentialHint = (provider) => {
32
- switch (provider) {
33
- case "openrouter": return "set OPENROUTER_API_KEY and retry";
34
- case "openai": return "set OPENAI_API_KEY and retry";
35
- case "anthropic": return "set ANTHROPIC_API_KEY and retry";
36
- case "google": return "set GOOGLE_GENERATIVE_AI_API_KEY and retry";
37
- case "xai": return "set XAI_API_KEY and retry";
38
- default: return `configure credentials for provider "${provider}" and retry`;
39
- }
40
- };
41
- const providerHint = (error) => {
42
- switch (error.reason._tag) {
43
- case "Runner.ProviderAuthenticationError": return error.reason.authentication === "missing" ? credentialHint(error.provider) : `check the credentials configured for provider "${error.provider}"`;
44
- case "Runner.ProviderAuthorizationError": return "check that the credential can access this model and endpoint";
45
- case "Runner.ProviderModelUnavailableError": return "check the provider model ID and whether your account can access it";
46
- case "Runner.ProviderRateLimitError": return error.reason.retryAfter === void 0 ? "retry after the provider rate-limit window resets" : `retry in about ${Math.ceil(Duration.toMillis(error.reason.retryAfter) / 1e3)} seconds`;
47
- case "Runner.ProviderQuotaError": return "check the provider account quota or billing balance";
48
- case "Runner.ProviderTimeoutError":
49
- case "Runner.ProviderTransportError":
50
- case "Runner.ProviderUnavailableError": return error.isRetryable ? "this failure is retryable" : void 0;
51
- default: return;
52
- }
53
- };
54
- const unknownMessage = (error) => {
55
- if (error instanceof Error && error.message.trim().length > 0) return error.message;
56
- if (typeof error === "string" && error.trim().length > 0) return error;
57
- if (typeof error === "object" && error !== null && "_tag" in error) return String(error._tag);
58
- return "the command failed for an unknown reason";
59
- };
60
- /** Render typed SDK errors for humans without exposing Effect causes or provider payloads. */
61
- const renderError = (error) => {
62
- if (isSandboxProviderError(error)) return [
63
- `error: SandboxProviderError - ${error.sanitized.message}`,
64
- `driver: ${error.driver}`,
65
- `operation: ${error.operation}`,
66
- ...error.sanitized.code === void 0 ? [] : [`code: ${error.sanitized.code}`],
67
- ...error.stack === void 0 ? [] : ["traceback:", error.stack]
68
- ].join("\n") + "\n";
69
- if (isProviderError(error)) {
70
- const hint = providerHint(error);
71
- return [
72
- `error[${providerCategory(error.reason)}]: ${error.message}`,
73
- `provider: ${error.provider}`,
74
- `model: ${error.model}`,
75
- ...error.reason.requestId === void 0 ? [] : [`request: ${error.reason.requestId}`],
76
- ...hint === void 0 ? [] : [`hint: ${hint}`]
77
- ].join("\n") + "\n";
78
- }
79
- if (isModelCatalogError(error)) return [`error[model_catalog]: ${error.message}`, "hint: run `codework modelgen` or set CODEWORK_MODELS_FILE to a generated catalog"].join("\n") + "\n";
80
- if (isModelNotFoundError(error)) return [`error[model_not_found]: ${error.message}`, "hint: check the provider/model IDs in models.gen.json or regenerate the catalog"].join("\n") + "\n";
81
- if (isLLMStreamError(error)) return `error[stream_protocol]: ${error.message}\n`;
82
- return `error: ${unknownMessage(error)}\n`;
83
- };
84
- //#endregion
85
- //#region src/cli/output.ts
86
- const emptyUsage = {
87
- turns: 0,
88
- input: 0,
89
- output: 0,
90
- reasoning: 0,
91
- cacheRead: 0,
92
- cacheWrite: 0,
93
- totalTokens: 0,
94
- cost: 0
95
- };
96
- const addUsage = (summary, message) => ({
97
- turns: summary.turns + 1,
98
- provider: message.provider.id,
99
- model: message.responseModel ?? message.model,
100
- input: summary.input + message.usage.input,
101
- output: summary.output + message.usage.output,
102
- reasoning: summary.reasoning + (message.usage.reasoning ?? 0),
103
- cacheRead: summary.cacheRead + message.usage.cacheRead,
104
- cacheWrite: summary.cacheWrite + message.usage.cacheWrite,
105
- totalTokens: summary.totalTokens + message.usage.totalTokens,
106
- cost: summary.cost + message.usage.cost.total
107
- });
108
- const number = new Intl.NumberFormat("en-US");
109
- const row = (label, value) => `${label.padEnd(9)}${value}\n`;
110
- const formatCost = (cost) => `$${cost.toFixed(cost > 0 && cost < .01 ? 6 : 4)}`;
111
- const divider = (label, columns = 72) => {
112
- const width = Math.min(100, Math.max(32, columns));
113
- const start = `── ${label} `;
114
- return `${start}${"─".repeat(Math.max(2, width - start.length))}\n`;
115
- };
116
- const header = (input) => `${row("session", input.sessionId)}${row("sandbox", `${input.sandbox} · ${input.directory}`)}\n${divider("response", input.columns)}`;
117
- const usage = (summary, columns) => {
118
- const turns = `${summary.turns} ${summary.turns === 1 ? "turn" : "turns"}`;
119
- const model = summary.provider === void 0 || summary.model === void 0 ? "unknown" : `${summary.provider}/${summary.model}`;
120
- const reasoning = summary.reasoning === 0 ? "" : ` · ${number.format(summary.reasoning)} reasoning`;
121
- return `${divider("usage", columns)}${row("model", model)}${row("tokens", `${number.format(summary.input)} input · ${number.format(summary.output)} output${reasoning} · ${number.format(summary.totalTokens)} total`)}${row("cache", `${number.format(summary.cacheRead)} read · ${number.format(summary.cacheWrite)} write`)}${row("cost", `${formatCost(summary.cost)} · ${turns}`)}`;
122
- };
123
- //#endregion
124
- //#region src/cli/index.ts
125
- const thinkingLevels = [
126
- "off",
127
- "minimal",
128
- "low",
129
- "medium",
130
- "high",
131
- "xhigh",
132
- "max"
133
- ];
134
- const sandboxDrivers = [
135
- "local",
136
- "daytona",
137
- "vercel"
138
- ];
139
- const writeOut = (value) => Effect.sync(() => void process.stdout.write(value));
140
- const writeError = (value) => Effect.sync(() => void process.stderr.write(value));
141
- const terminalColumns = () => process.stderr.isTTY ? process.stderr.columns ?? 72 : 72;
142
- var InvalidInputError = class extends Schema.TaggedError()("CLI.InvalidInputError", { message: Schema.String }) {};
143
- var ModelgenError = class extends Schema.TaggedError()("CLI.ModelgenError", { cause: Schema.Defect() }) {};
144
- const initialRenderState = {
145
- usage: emptyUsage,
146
- textSeen: false,
147
- textEndsWithNewline: false
148
- };
149
- const isTextDelta = Schema.is(LLMTextDelta);
150
- const isLLMEnded = Schema.is(LLMEnded);
151
- const isTurnEnded = Schema.is(TurnEnded);
152
- const render = (ended, state) => Effect.fn("CLI.render")(function* (event) {
153
- if (isTextDelta(event)) {
154
- yield* writeOut(event.data.delta);
155
- if (event.data.delta.length > 0) yield* Ref.update(state, (current) => ({
156
- ...current,
157
- textSeen: true,
158
- textEndsWithNewline: event.data.delta.endsWith("\n")
159
- }));
160
- return;
161
- }
162
- if (isLLMEnded(event)) {
163
- yield* Ref.update(state, (current) => ({
164
- ...current,
165
- usage: addUsage(current.usage, event.data.message)
166
- }));
167
- return;
168
- }
169
- if (isTurnEnded(event)) yield* Queue.offer(ended, event.data.messageId);
170
- });
171
- const awaitMessage = Effect.fn("CLI.awaitMessage")(function* (ended, messageId) {
172
- while ((yield* Queue.take(ended)) !== messageId);
173
- });
174
- const selectSandbox = Effect.fn("CLI.selectSandbox")(function* (driver, providerResourceId) {
175
- if (driver === "local") return void 0;
176
- if (driver === "daytona") return providerResourceId === void 0 ? yield* create({ driver }) : yield* register({
177
- driver,
178
- providerResourceId
179
- });
180
- return providerResourceId === void 0 ? yield* create({ driver }) : yield* register({
181
- driver,
182
- providerResourceId
183
- });
184
- });
185
- const root = Command.make("codework").pipe(Command.withSharedFlags({
186
- home: Flag.string("home").pipe(Flag.withDescription("Harness data directory"), Flag.optional),
187
- database: Flag.string("database").pipe(Flag.withDescription("SQLite path or :memory:"), Flag.optional)
188
- }), Command.withDescription("Run Codework agent sessions"));
189
- const run = Command.make("run", {
190
- prompt: Argument.string("prompt").pipe(Argument.withDescription("Prompt for the agent")),
191
- session: Flag.string("session").pipe(Flag.withAlias("s"), Flag.withDescription("Continue an existing session ID"), Flag.optional),
192
- cwd: Flag.string("cwd").pipe(Flag.withAlias("C"), Flag.withDescription("Working directory for a new session"), Flag.optional),
193
- sandbox: Flag.choice("sandbox", sandboxDrivers).pipe(Flag.withDescription("Sandbox for a new session (default: local)"), Flag.optional),
194
- sandboxProviderId: Flag.string("sandbox-provider-id").pipe(Flag.withDescription("Provider ID of an existing sandbox"), Flag.optional),
195
- provider: Flag.string("provider").pipe(Flag.withDescription("Model catalog provider ID"), Flag.optional),
196
- model: Flag.string("model").pipe(Flag.withDescription("Model ID"), Flag.optional),
197
- thinking: Flag.choice("thinking", thinkingLevels).pipe(Flag.withDescription("Thinking level"), Flag.optional)
198
- }, Effect.fn("CLI.run")(function* ({ prompt, session, cwd, sandbox, sandboxProviderId, provider, model, thinking }) {
199
- const shared = yield* root;
200
- if (Option.isSome(session) && (Option.isSome(cwd) || Option.isSome(sandbox) || Option.isSome(sandboxProviderId))) return yield* new InvalidInputError({ message: "--cwd, --sandbox, and --sandbox-provider-id can only be used when creating a new session" });
201
- if (Option.isSome(provider) !== Option.isSome(model)) return yield* new InvalidInputError({ message: "--provider and --model must be provided together" });
202
- if (Option.isSome(sandboxProviderId) && (Option.isNone(sandbox) || sandbox.value === "local")) return yield* new InvalidInputError({ message: "--sandbox-provider-id requires a remote --sandbox" });
203
- return yield* Effect.gen(function* () {
204
- const runtime = {
205
- ...Option.isNone(provider) || Option.isNone(model) ? {} : { model: {
206
- provider: provider.value,
207
- id: model.value
208
- } },
209
- ...Option.isNone(thinking) ? {} : { thinkingLevel: thinking.value }
210
- };
211
- let handle;
212
- if (Option.isSome(session)) handle = yield* attach({
213
- sessionId: ID.make(session.value),
214
- ...runtime
215
- });
216
- else {
217
- const selectedSandbox = Option.getOrElse(sandbox, () => "local");
218
- const selected = yield* selectSandbox(selectedSandbox, Option.getOrUndefined(sandboxProviderId));
219
- handle = yield* create$1({
220
- title: "CLI",
221
- ...runtime,
222
- ...selected === void 0 ? {} : { sandbox: selected },
223
- ...Option.isNone(cwd) ? {} : { directory: cwd.value }
224
- });
225
- }
226
- const ended = yield* Queue.unbounded();
227
- const renderState = yield* Ref.make(initialRenderState);
228
- const printer = yield* handle.events().pipe(Stream.runForEach(render(ended, renderState)), Effect.forkScoped({ startImmediately: true }));
229
- const info = yield* handle.info;
230
- const columns = terminalColumns();
231
- yield* writeError(header({
232
- sessionId: handle.id,
233
- sandbox: info.sandbox?.driver ?? "local",
234
- directory: info.directory,
235
- columns
236
- }));
237
- yield* handle.run(prompt);
238
- const leaf = (yield* handle.path()).at(-1);
239
- if (leaf !== void 0) yield* awaitMessage(ended, leaf.entry.id);
240
- yield* Fiber.interrupt(printer);
241
- const rendered = yield* Ref.get(renderState);
242
- if (rendered.textSeen && !rendered.textEndsWithNewline) yield* writeOut("\n");
243
- yield* writeError(usage(rendered.usage, columns));
244
- }).pipe(Effect.provide(layer({
245
- ...Option.isNone(shared.home) ? {} : { home: shared.home.value },
246
- ...Option.isNone(shared.database) ? {} : { database: shared.database.value },
247
- sandboxes: [Drivers.daytona(), Drivers.vercel()]
248
- })), Effect.scoped, Effect.catch((error) => writeError(renderError(error)).pipe(Effect.andThen(Effect.sync(() => {
249
- process.exitCode = 1;
250
- })))));
251
- })).pipe(Command.withDescription("Start or continue an agent session"), Command.withExamples([
252
- {
253
- command: "codework run \"Inspect the failing tests\"",
254
- description: "Create a session"
255
- },
256
- {
257
- command: "codework run --provider openai --model gpt-5.5 --thinking high \"Inspect the failing tests\"",
258
- description: "Create a session with an explicit model"
259
- },
260
- {
261
- command: "codework run --sandbox daytona \"Inspect the repository\"",
262
- description: "Create a Daytona sandbox and session"
263
- },
264
- {
265
- command: "codework run --sandbox daytona --sandbox-provider-id <id> \"Inspect the repository\"",
266
- description: "Use an existing remote sandbox"
267
- },
268
- {
269
- command: "codework run --session <id> --provider openai --model gpt-5.6-luna \"Now fix them\"",
270
- description: "Continue a session with explicit model bindings"
271
- }
272
- ]));
273
- const modelgen = Command.make("modelgen", { path: Argument.string("path").pipe(Argument.withDescription("Output path; defaults to CODEWORK_MODELS_FILE or ./models.gen.json"), Argument.optional) }, Effect.fn("CLI.modelgen")(function* ({ path }) {
274
- const generated = yield* Effect.tryPromise({
275
- try: () => generateModels(Option.isNone(path) ? {} : { path: path.value }),
276
- catch: (cause) => new ModelgenError({ cause })
277
- });
278
- yield* writeOut(`Generated model catalog at ${generated}\n`);
279
- })).pipe(Command.withDescription("Generate the Aikit model catalog"), Command.withExamples([{
280
- command: "codework modelgen",
281
- description: "Generate models.gen.json"
282
- }]));
283
- const command = root.pipe(Command.withSubcommands([run, modelgen]));
284
- const main = Command.run(command, { version: "0.0.1" }).pipe(Effect.provide(NodeServices.layer));
285
- NodeRuntime.runMain(main);
286
- //#endregion
287
- export { command, main };
288
-
289
- //# sourceMappingURL=index.mjs.map
package/cli/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["Runner.ProviderError","Runner.ModelCatalogError","Runner.ModelNotFoundError","Runner.LLMStreamError","EventList.LLMTextDelta","EventList.LLMEnded","EventList.TurnEnded","Sandbox.create","Sandbox.register","Session.attach","Session.create","Harness.layer"],"sources":["../../../src/cli/error.ts","../../../src/cli/output.ts","../../../src/cli/index.ts"],"sourcesContent":["import { Duration, Schema } from \"effect\";\nimport { Runner } from \"../runner/run.ts\";\nimport { SandboxProviderError } from \"../sandbox/errors.ts\";\n\nconst isProviderError = Schema.is(Runner.ProviderError);\nconst isModelCatalogError = Schema.is(Runner.ModelCatalogError);\nconst isModelNotFoundError = Schema.is(Runner.ModelNotFoundError);\nconst isLLMStreamError = Schema.is(Runner.LLMStreamError);\nconst isSandboxProviderError = Schema.is(SandboxProviderError);\n\nconst providerCategory = (reason: Runner.ProviderFailureReason): string => {\n\tswitch (reason._tag) {\n\t\tcase \"Runner.ProviderAuthenticationError\":\n\t\t\treturn \"authentication\";\n\t\tcase \"Runner.ProviderConfigurationError\":\n\t\t\treturn \"configuration\";\n\t\tcase \"Runner.ProviderAuthorizationError\":\n\t\t\treturn \"authorization\";\n\t\tcase \"Runner.ProviderModelUnavailableError\":\n\t\t\treturn \"model_unavailable\";\n\t\tcase \"Runner.ProviderRateLimitError\":\n\t\t\treturn \"rate_limited\";\n\t\tcase \"Runner.ProviderQuotaError\":\n\t\t\treturn \"quota\";\n\t\tcase \"Runner.ProviderInvalidRequestError\":\n\t\t\treturn \"invalid_request\";\n\t\tcase \"Runner.ProviderContentPolicyError\":\n\t\t\treturn \"content_policy\";\n\t\tcase \"Runner.ProviderTimeoutError\":\n\t\t\treturn \"timeout\";\n\t\tcase \"Runner.ProviderTransportError\":\n\t\t\treturn \"transport\";\n\t\tcase \"Runner.ProviderUnavailableError\":\n\t\t\treturn \"provider_unavailable\";\n\t\tcase \"Runner.ProviderInvalidResponseError\":\n\t\t\treturn \"invalid_response\";\n\t\tcase \"Runner.ProviderUnknownError\":\n\t\t\treturn \"provider\";\n\t}\n};\n\nconst credentialHint = (provider: string): string => {\n\tswitch (provider) {\n\t\tcase \"openrouter\":\n\t\t\treturn \"set OPENROUTER_API_KEY and retry\";\n\t\tcase \"openai\":\n\t\t\treturn \"set OPENAI_API_KEY and retry\";\n\t\tcase \"anthropic\":\n\t\t\treturn \"set ANTHROPIC_API_KEY and retry\";\n\t\tcase \"google\":\n\t\t\treturn \"set GOOGLE_GENERATIVE_AI_API_KEY and retry\";\n\t\tcase \"xai\":\n\t\t\treturn \"set XAI_API_KEY and retry\";\n\t\tdefault:\n\t\t\treturn `configure credentials for provider \"${provider}\" and retry`;\n\t}\n};\n\nconst providerHint = (error: Runner.ProviderError): string | undefined => {\n\tswitch (error.reason._tag) {\n\t\tcase \"Runner.ProviderAuthenticationError\":\n\t\t\treturn error.reason.authentication === \"missing\"\n\t\t\t\t? credentialHint(error.provider)\n\t\t\t\t: `check the credentials configured for provider \"${error.provider}\"`;\n\t\tcase \"Runner.ProviderAuthorizationError\":\n\t\t\treturn \"check that the credential can access this model and endpoint\";\n\t\tcase \"Runner.ProviderModelUnavailableError\":\n\t\t\treturn \"check the provider model ID and whether your account can access it\";\n\t\tcase \"Runner.ProviderRateLimitError\":\n\t\t\treturn error.reason.retryAfter === undefined\n\t\t\t\t? \"retry after the provider rate-limit window resets\"\n\t\t\t\t: `retry in about ${Math.ceil(Duration.toMillis(error.reason.retryAfter) / 1_000)} seconds`;\n\t\tcase \"Runner.ProviderQuotaError\":\n\t\t\treturn \"check the provider account quota or billing balance\";\n\t\tcase \"Runner.ProviderTimeoutError\":\n\t\tcase \"Runner.ProviderTransportError\":\n\t\tcase \"Runner.ProviderUnavailableError\":\n\t\t\treturn error.isRetryable ? \"this failure is retryable\" : undefined;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n};\n\nconst unknownMessage = (error: unknown): string => {\n\tif (error instanceof Error && error.message.trim().length > 0) return error.message;\n\tif (typeof error === \"string\" && error.trim().length > 0) return error;\n\tif (typeof error === \"object\" && error !== null && \"_tag\" in error) return String(error._tag);\n\treturn \"the command failed for an unknown reason\";\n};\n\n/** Render typed SDK errors for humans without exposing Effect causes or provider payloads. */\nexport const renderError = (error: unknown): string => {\n\tif (isSandboxProviderError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error: SandboxProviderError - ${error.sanitized.message}`,\n\t\t\t\t`driver: ${error.driver}`,\n\t\t\t\t`operation: ${error.operation}`,\n\t\t\t\t...(error.sanitized.code === undefined ? [] : [`code: ${error.sanitized.code}`]),\n\t\t\t\t...(error.stack === undefined ? [] : [\"traceback:\", error.stack]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isProviderError(error)) {\n\t\tconst hint = providerHint(error);\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[${providerCategory(error.reason)}]: ${error.message}`,\n\t\t\t\t`provider: ${error.provider}`,\n\t\t\t\t`model: ${error.model}`,\n\t\t\t\t...(error.reason.requestId === undefined ? [] : [`request: ${error.reason.requestId}`]),\n\t\t\t\t...(hint === undefined ? [] : [`hint: ${hint}`]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isModelCatalogError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[model_catalog]: ${error.message}`,\n\t\t\t\t\"hint: run `codework modelgen` or set CODEWORK_MODELS_FILE to a generated catalog\",\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isModelNotFoundError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[model_not_found]: ${error.message}`,\n\t\t\t\t\"hint: check the provider/model IDs in models.gen.json or regenerate the catalog\",\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isLLMStreamError(error)) {\n\t\treturn `error[stream_protocol]: ${error.message}\\n`;\n\t}\n\treturn `error: ${unknownMessage(error)}\\n`;\n};\n","import type { Message } from \"@codeworksh/aikit\";\n\nexport interface UsageSummary {\n\treadonly turns: number;\n\treadonly provider?: string;\n\treadonly model?: string;\n\treadonly input: number;\n\treadonly output: number;\n\treadonly reasoning: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly totalTokens: number;\n\treadonly cost: number;\n}\n\nexport const emptyUsage: UsageSummary = {\n\tturns: 0,\n\tinput: 0,\n\toutput: 0,\n\treasoning: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: 0,\n};\n\nexport const addUsage = (summary: UsageSummary, message: Message.AssistantMessage): UsageSummary => ({\n\tturns: summary.turns + 1,\n\tprovider: message.provider.id,\n\tmodel: message.responseModel ?? message.model,\n\tinput: summary.input + message.usage.input,\n\toutput: summary.output + message.usage.output,\n\treasoning: summary.reasoning + (message.usage.reasoning ?? 0),\n\tcacheRead: summary.cacheRead + message.usage.cacheRead,\n\tcacheWrite: summary.cacheWrite + message.usage.cacheWrite,\n\ttotalTokens: summary.totalTokens + message.usage.totalTokens,\n\tcost: summary.cost + message.usage.cost.total,\n});\n\nconst number = new Intl.NumberFormat(\"en-US\");\nconst row = (label: string, value: string) => `${label.padEnd(9)}${value}\\n`;\n\nconst formatCost = (cost: number): string => `$${cost.toFixed(cost > 0 && cost < 0.01 ? 6 : 4)}`;\n\nexport const divider = (label: string, columns = 72): string => {\n\tconst width = Math.min(100, Math.max(32, columns));\n\tconst start = `── ${label} `;\n\treturn `${start}${\"─\".repeat(Math.max(2, width - start.length))}\\n`;\n};\n\nexport const header = (input: {\n\treadonly sessionId: string;\n\treadonly sandbox: string;\n\treadonly directory: string;\n\treadonly columns?: number;\n}): string =>\n\t`${row(\"session\", input.sessionId)}${row(\"sandbox\", `${input.sandbox} · ${input.directory}`)}\\n${divider(\n\t\t\"response\",\n\t\tinput.columns,\n\t)}`;\n\nexport const usage = (summary: UsageSummary, columns?: number): string => {\n\tconst turns = `${summary.turns} ${summary.turns === 1 ? \"turn\" : \"turns\"}`;\n\tconst model =\n\t\tsummary.provider === undefined || summary.model === undefined\n\t\t\t? \"unknown\"\n\t\t\t: `${summary.provider}/${summary.model}`;\n\tconst reasoning = summary.reasoning === 0 ? \"\" : ` · ${number.format(summary.reasoning)} reasoning`;\n\treturn `${divider(\"usage\", columns)}${row(\"model\", model)}${row(\n\t\t\"tokens\",\n\t\t`${number.format(summary.input)} input · ${number.format(summary.output)} output${reasoning} · ${number.format(\n\t\t\tsummary.totalTokens,\n\t\t)} total`,\n\t)}${row(\"cache\", `${number.format(summary.cacheRead)} read · ${number.format(summary.cacheWrite)} write`)}${row(\n\t\t\"cost\",\n\t\t`${formatCost(summary.cost)} · ${turns}`,\n\t)}`;\n};\n","#!/usr/bin/env node\n\nimport { generateModels } from \"@codeworksh/aikit/modelgen\";\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport { Effect, Fiber, Option, Queue, Ref, Schema, Stream } from \"effect\";\nimport { Argument, CliError, Command, Flag } from \"effect/unstable/cli\";\nimport { Harness } from \"../effect/harness.ts\";\nimport { Sandbox } from \"../effect/sandbox.ts\";\nimport { Session } from \"../effect/session.ts\";\nimport { EventList } from \"../event/list.ts\";\nimport type { EventSchema } from \"../event/schema.ts\";\nimport { renderError } from \"./error.ts\";\nimport { addUsage, emptyUsage, header, usage, type UsageSummary } from \"./output.ts\";\n\nconst thinkingLevels = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nconst sandboxDrivers = [\"local\", \"daytona\", \"vercel\"] as const;\n\nconst writeOut = (value: string) => Effect.sync(() => void process.stdout.write(value));\nconst writeError = (value: string) => Effect.sync(() => void process.stderr.write(value));\nconst terminalColumns = () => (process.stderr.isTTY ? (process.stderr.columns ?? 72) : 72);\n\nclass InvalidInputError extends Schema.TaggedError<InvalidInputError>()(\"CLI.InvalidInputError\", {\n\tmessage: Schema.String,\n}) {}\n\nclass ModelgenError extends Schema.TaggedError<ModelgenError>()(\"CLI.ModelgenError\", {\n\tcause: Schema.Defect(),\n}) {}\n\ninterface RenderState {\n\treadonly usage: UsageSummary;\n\treadonly textSeen: boolean;\n\treadonly textEndsWithNewline: boolean;\n}\n\nconst initialRenderState: RenderState = {\n\tusage: emptyUsage,\n\ttextSeen: false,\n\ttextEndsWithNewline: false,\n};\n\nconst isTextDelta = Schema.is(EventList.LLMTextDelta);\nconst isLLMEnded = Schema.is(EventList.LLMEnded);\nconst isTurnEnded = Schema.is(EventList.TurnEnded);\n\nconst render = (ended: Queue.Queue<string>, state: Ref.Ref<RenderState>) =>\n\tEffect.fn(\"CLI.render\")(function* (event: EventSchema.Payload) {\n\t\tif (isTextDelta(event)) {\n\t\t\tyield* writeOut(event.data.delta);\n\t\t\tif (event.data.delta.length > 0) {\n\t\t\t\tyield* Ref.update(state, (current) => ({\n\t\t\t\t\t...current,\n\t\t\t\t\ttextSeen: true,\n\t\t\t\t\ttextEndsWithNewline: event.data.delta.endsWith(\"\\n\"),\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (isLLMEnded(event)) {\n\t\t\tyield* Ref.update(state, (current) => ({ ...current, usage: addUsage(current.usage, event.data.message) }));\n\t\t\treturn;\n\t\t}\n\t\tif (isTurnEnded(event)) {\n\t\t\tyield* Queue.offer(ended, event.data.messageId);\n\t\t}\n\t});\n\nconst awaitMessage = Effect.fn(\"CLI.awaitMessage\")(function* (ended: Queue.Queue<string>, messageId: string) {\n\twhile ((yield* Queue.take(ended)) !== messageId) {\n\t\t// Earlier turns in the same drain are expected when a tool call continues.\n\t}\n});\n\nconst selectSandbox = Effect.fn(\"CLI.selectSandbox\")(function* (\n\tdriver: (typeof sandboxDrivers)[number],\n\tproviderResourceId?: string,\n) {\n\tif (driver === \"local\") return undefined;\n\tif (driver === \"daytona\") {\n\t\treturn providerResourceId === undefined\n\t\t\t? yield* Sandbox.create({ driver })\n\t\t\t: yield* Sandbox.register({ driver, providerResourceId });\n\t}\n\treturn providerResourceId === undefined\n\t\t? yield* Sandbox.create({ driver })\n\t\t: yield* Sandbox.register({ driver, providerResourceId });\n});\n\nconst root = Command.make(\"codework\").pipe(\n\tCommand.withSharedFlags({\n\t\thome: Flag.string(\"home\").pipe(Flag.withDescription(\"Harness data directory\"), Flag.optional),\n\t\tdatabase: Flag.string(\"database\").pipe(Flag.withDescription(\"SQLite path or :memory:\"), Flag.optional),\n\t}),\n\tCommand.withDescription(\"Run Codework agent sessions\"),\n);\n\nconst run = Command.make(\n\t\"run\",\n\t{\n\t\tprompt: Argument.string(\"prompt\").pipe(Argument.withDescription(\"Prompt for the agent\")),\n\t\tsession: Flag.string(\"session\").pipe(\n\t\t\tFlag.withAlias(\"s\"),\n\t\t\tFlag.withDescription(\"Continue an existing session ID\"),\n\t\t\tFlag.optional,\n\t\t),\n\t\tcwd: Flag.string(\"cwd\").pipe(\n\t\t\tFlag.withAlias(\"C\"),\n\t\t\tFlag.withDescription(\"Working directory for a new session\"),\n\t\t\tFlag.optional,\n\t\t),\n\t\tsandbox: Flag.choice(\"sandbox\", sandboxDrivers).pipe(\n\t\t\tFlag.withDescription(\"Sandbox for a new session (default: local)\"),\n\t\t\tFlag.optional,\n\t\t),\n\t\tsandboxProviderId: Flag.string(\"sandbox-provider-id\").pipe(\n\t\t\tFlag.withDescription(\"Provider ID of an existing sandbox\"),\n\t\t\tFlag.optional,\n\t\t),\n\t\tprovider: Flag.string(\"provider\").pipe(Flag.withDescription(\"Model catalog provider ID\"), Flag.optional),\n\t\tmodel: Flag.string(\"model\").pipe(Flag.withDescription(\"Model ID\"), Flag.optional),\n\t\tthinking: Flag.choice(\"thinking\", thinkingLevels).pipe(Flag.withDescription(\"Thinking level\"), Flag.optional),\n\t},\n\tEffect.fn(\"CLI.run\")(function* ({ prompt, session, cwd, sandbox, sandboxProviderId, provider, model, thinking }) {\n\t\tconst shared = yield* root;\n\t\tif (\n\t\t\tOption.isSome(session) &&\n\t\t\t(Option.isSome(cwd) || Option.isSome(sandbox) || Option.isSome(sandboxProviderId))\n\t\t) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage: \"--cwd, --sandbox, and --sandbox-provider-id can only be used when creating a new session\",\n\t\t\t});\n\t\t}\n\t\tif (Option.isSome(provider) !== Option.isSome(model)) {\n\t\t\treturn yield* new InvalidInputError({ message: \"--provider and --model must be provided together\" });\n\t\t}\n\t\tif (Option.isSome(sandboxProviderId) && (Option.isNone(sandbox) || sandbox.value === \"local\")) {\n\t\t\treturn yield* new InvalidInputError({ message: \"--sandbox-provider-id requires a remote --sandbox\" });\n\t\t}\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst runtime = {\n\t\t\t\t...(Option.isNone(provider) || Option.isNone(model)\n\t\t\t\t\t? {}\n\t\t\t\t\t: { model: { provider: provider.value, id: model.value } }),\n\t\t\t\t...(Option.isNone(thinking) ? {} : { thinkingLevel: thinking.value }),\n\t\t\t};\n\t\t\tlet handle: Session.Handle;\n\t\t\tif (Option.isSome(session)) {\n\t\t\t\thandle = yield* Session.attach({ sessionId: Session.SessionSchema.ID.make(session.value), ...runtime });\n\t\t\t} else {\n\t\t\t\tconst selectedSandbox = Option.getOrElse(sandbox, () => \"local\" as const);\n\t\t\t\tconst selected = yield* selectSandbox(selectedSandbox, Option.getOrUndefined(sandboxProviderId));\n\t\t\t\thandle = yield* Session.create({\n\t\t\t\t\ttitle: \"CLI\",\n\t\t\t\t\t...runtime,\n\t\t\t\t\t...(selected === undefined ? {} : { sandbox: selected }),\n\t\t\t\t\t...(Option.isNone(cwd) ? {} : { directory: cwd.value }),\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst ended = yield* Queue.unbounded<string>();\n\t\t\tconst renderState = yield* Ref.make(initialRenderState);\n\t\t\tconst printer = yield* handle\n\t\t\t\t.events()\n\t\t\t\t.pipe(Stream.runForEach(render(ended, renderState)), Effect.forkScoped({ startImmediately: true }));\n\n\t\t\tconst info = yield* handle.info;\n\t\t\tconst columns = terminalColumns();\n\t\t\tyield* writeError(\n\t\t\t\theader({\n\t\t\t\t\tsessionId: handle.id,\n\t\t\t\t\tsandbox: info.sandbox?.driver ?? \"local\",\n\t\t\t\t\tdirectory: info.directory,\n\t\t\t\t\tcolumns,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tyield* handle.run(prompt);\n\t\t\tconst path = yield* handle.path();\n\t\t\tconst leaf = path.at(-1);\n\t\t\tif (leaf !== undefined) yield* awaitMessage(ended, leaf.entry.id);\n\t\t\tyield* Fiber.interrupt(printer);\n\t\t\tconst rendered = yield* Ref.get(renderState);\n\t\t\tif (rendered.textSeen && !rendered.textEndsWithNewline) yield* writeOut(\"\\n\");\n\t\t\tyield* writeError(usage(rendered.usage, columns));\n\t\t});\n\n\t\treturn yield* program.pipe(\n\t\t\tEffect.provide(\n\t\t\t\tHarness.layer({\n\t\t\t\t\t...(Option.isNone(shared.home) ? {} : { home: shared.home.value }),\n\t\t\t\t\t...(Option.isNone(shared.database) ? {} : { database: shared.database.value }),\n\t\t\t\t\tsandboxes: [Sandbox.Drivers.daytona(), Sandbox.Drivers.vercel()],\n\t\t\t\t}),\n\t\t\t),\n\t\t\tEffect.scoped,\n\t\t\tEffect.catch((error) =>\n\t\t\t\twriteError(renderError(error)).pipe(\n\t\t\t\t\tEffect.andThen(\n\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t}),\n).pipe(\n\tCommand.withDescription(\"Start or continue an agent session\"),\n\tCommand.withExamples([\n\t\t{ command: 'codework run \"Inspect the failing tests\"', description: \"Create a session\" },\n\t\t{\n\t\t\tcommand: 'codework run --provider openai --model gpt-5.5 --thinking high \"Inspect the failing tests\"',\n\t\t\tdescription: \"Create a session with an explicit model\",\n\t\t},\n\t\t{\n\t\t\tcommand: 'codework run --sandbox daytona \"Inspect the repository\"',\n\t\t\tdescription: \"Create a Daytona sandbox and session\",\n\t\t},\n\t\t{\n\t\t\tcommand: 'codework run --sandbox daytona --sandbox-provider-id <id> \"Inspect the repository\"',\n\t\t\tdescription: \"Use an existing remote sandbox\",\n\t\t},\n\t\t{\n\t\t\tcommand: 'codework run --session <id> --provider openai --model gpt-5.6-luna \"Now fix them\"',\n\t\t\tdescription: \"Continue a session with explicit model bindings\",\n\t\t},\n\t]),\n);\n\nconst modelgen = Command.make(\n\t\"modelgen\",\n\t{\n\t\tpath: Argument.string(\"path\").pipe(\n\t\t\tArgument.withDescription(\"Output path; defaults to CODEWORK_MODELS_FILE or ./models.gen.json\"),\n\t\t\tArgument.optional,\n\t\t),\n\t},\n\tEffect.fn(\"CLI.modelgen\")(function* ({ path }) {\n\t\tconst generated = yield* Effect.tryPromise({\n\t\t\ttry: () => generateModels(Option.isNone(path) ? {} : { path: path.value }),\n\t\t\tcatch: (cause) => new ModelgenError({ cause }),\n\t\t});\n\t\tyield* writeOut(`Generated model catalog at ${generated}\\n`);\n\t}),\n).pipe(\n\tCommand.withDescription(\"Generate the Aikit model catalog\"),\n\tCommand.withExamples([{ command: \"codework modelgen\", description: \"Generate models.gen.json\" }]),\n);\n\nexport const command = root.pipe(Command.withSubcommands([run, modelgen]));\n\nexport const main: Effect.Effect<void, Command.Error<typeof command> | CliError.CliError> = Command.run(command, {\n\tversion: \"0.0.1\",\n}).pipe(Effect.provide(NodeServices.layer));\n\nNodeRuntime.runMain(main);\n"],"mappings":"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"}