surfcode 0.0.0-stage → 0.1.1

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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -2
  3. package/assets/surfcode-logo.gif +0 -0
  4. package/dist/cli/auth.js +315 -0
  5. package/dist/cli/auth.js.map +1 -0
  6. package/dist/cli/config.js +228 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/headless.js +355 -0
  9. package/dist/cli/headless.js.map +1 -0
  10. package/dist/cli/inspect.js +462 -0
  11. package/dist/cli/inspect.js.map +1 -0
  12. package/dist/cli/interactive.js +130 -0
  13. package/dist/cli/interactive.js.map +1 -0
  14. package/dist/cli/sessions.js +170 -0
  15. package/dist/cli/sessions.js.map +1 -0
  16. package/dist/cli/sync.js +190 -0
  17. package/dist/cli/sync.js.map +1 -0
  18. package/dist/cli/util.js +345 -0
  19. package/dist/cli/util.js.map +1 -0
  20. package/dist/cli.js +485 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/core/agent.js +298 -0
  23. package/dist/core/agent.js.map +1 -0
  24. package/dist/core/agents.js +55 -0
  25. package/dist/core/agents.js.map +1 -0
  26. package/dist/core/auth.js +107 -0
  27. package/dist/core/auth.js.map +1 -0
  28. package/dist/core/catalog.js +306 -0
  29. package/dist/core/catalog.js.map +1 -0
  30. package/dist/core/chat/anthropic.js +222 -0
  31. package/dist/core/chat/anthropic.js.map +1 -0
  32. package/dist/core/chat/common.js +367 -0
  33. package/dist/core/chat/common.js.map +1 -0
  34. package/dist/core/chat/google.js +180 -0
  35. package/dist/core/chat/google.js.map +1 -0
  36. package/dist/core/chat/index.js +80 -0
  37. package/dist/core/chat/index.js.map +1 -0
  38. package/dist/core/chat/openai.js +164 -0
  39. package/dist/core/chat/openai.js.map +1 -0
  40. package/dist/core/chat/types.js +2 -0
  41. package/dist/core/chat/types.js.map +1 -0
  42. package/dist/core/clipboard.js +34 -0
  43. package/dist/core/clipboard.js.map +1 -0
  44. package/dist/core/compact.js +39 -0
  45. package/dist/core/compact.js.map +1 -0
  46. package/dist/core/config.js +211 -0
  47. package/dist/core/config.js.map +1 -0
  48. package/dist/core/delegate.js +184 -0
  49. package/dist/core/delegate.js.map +1 -0
  50. package/dist/core/effort.js +80 -0
  51. package/dist/core/effort.js.map +1 -0
  52. package/dist/core/errors.js +32 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/free.js +21 -0
  55. package/dist/core/free.js.map +1 -0
  56. package/dist/core/github.js +445 -0
  57. package/dist/core/github.js.map +1 -0
  58. package/dist/core/paths.js +51 -0
  59. package/dist/core/paths.js.map +1 -0
  60. package/dist/core/prompt.js +95 -0
  61. package/dist/core/prompt.js.map +1 -0
  62. package/dist/core/provider.js +298 -0
  63. package/dist/core/provider.js.map +1 -0
  64. package/dist/core/session.js +159 -0
  65. package/dist/core/session.js.map +1 -0
  66. package/dist/core/sync.js +126 -0
  67. package/dist/core/sync.js.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/core/usage.js +127 -0
  71. package/dist/core/usage.js.map +1 -0
  72. package/dist/core/workspace.js +70 -0
  73. package/dist/core/workspace.js.map +1 -0
  74. package/dist/data/models.json +1 -0
  75. package/dist/sync/server.js +179 -0
  76. package/dist/sync/server.js.map +1 -0
  77. package/dist/tools/diff.js +21 -0
  78. package/dist/tools/diff.js.map +1 -0
  79. package/dist/tools/files.js +227 -0
  80. package/dist/tools/files.js.map +1 -0
  81. package/dist/tools/github.js +238 -0
  82. package/dist/tools/github.js.map +1 -0
  83. package/dist/tools/index.js +34 -0
  84. package/dist/tools/index.js.map +1 -0
  85. package/dist/tools/search.js +231 -0
  86. package/dist/tools/search.js.map +1 -0
  87. package/dist/tools/shell.js +118 -0
  88. package/dist/tools/shell.js.map +1 -0
  89. package/dist/tools/todos.js +50 -0
  90. package/dist/tools/todos.js.map +1 -0
  91. package/dist/tools/webfetch.js +108 -0
  92. package/dist/tools/webfetch.js.map +1 -0
  93. package/dist/tui/App.js +2984 -0
  94. package/dist/tui/App.js.map +1 -0
  95. package/dist/tui/ansi.js +151 -0
  96. package/dist/tui/ansi.js.map +1 -0
  97. package/dist/tui/commands.js +61 -0
  98. package/dist/tui/commands.js.map +1 -0
  99. package/dist/tui/explorer.js +152 -0
  100. package/dist/tui/explorer.js.map +1 -0
  101. package/dist/tui/icons.js +21 -0
  102. package/dist/tui/icons.js.map +1 -0
  103. package/dist/tui/layout.js +324 -0
  104. package/dist/tui/layout.js.map +1 -0
  105. package/dist/tui/markdown.js +355 -0
  106. package/dist/tui/markdown.js.map +1 -0
  107. package/dist/tui/overlays.js +316 -0
  108. package/dist/tui/overlays.js.map +1 -0
  109. package/dist/tui/render.js +234 -0
  110. package/dist/tui/render.js.map +1 -0
  111. package/dist/tui/theme.js +148 -0
  112. package/dist/tui/theme.js.map +1 -0
  113. package/dist/tui/types.js +73 -0
  114. package/dist/tui/types.js.map +1 -0
  115. package/dist/version.js +3 -0
  116. package/dist/version.js.map +1 -0
  117. package/package.json +75 -4
package/dist/cli.js ADDED
@@ -0,0 +1,485 @@
1
+ #!/usr/bin/env node
2
+ import { stat } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import chalk from 'chalk';
6
+ import { Command, InvalidArgumentError } from 'commander';
7
+ import { parseEffort } from './core/effort.js';
8
+ import { errorMessage, isAbortError, SurfError } from './core/errors.js';
9
+ import { VERSION } from './version.js';
10
+ import { authCommand } from './cli/auth.js';
11
+ import { configEditCommand, configGetCommand, configPathCommand, configSetCommand, configShowCommand, configValidateCommand } from './cli/config.js';
12
+ import { doctorCommand, modelsCommand, providersCommand, updateModelsCommand } from './cli/inspect.js';
13
+ import { sessionRemoveCommand, sessionShowCommand, sessionsListCommand } from './cli/sessions.js';
14
+ import { syncCommand } from './cli/sync.js';
15
+ import { danger, muted, warning, writeError } from './cli/util.js';
16
+ const program = new Command();
17
+ program
18
+ .name('surf')
19
+ .description('SurfCode — a beautiful, provider-agnostic AI coding agent for your terminal.\nRide the code.')
20
+ .version(VERSION, '-v, --version', 'print the SurfCode version')
21
+ .usage('[prompt...] [options]')
22
+ .argument('[prompt...]', 'prompt to send in the interactive UI (or headless when piped)')
23
+ .option('--cwd <dir>', 'working directory for tools and sessions')
24
+ .option('--home <dir>', 'override the SurfCode config/data directory')
25
+ .option('--no-color', 'disable ANSI color output')
26
+ .option('-p, --provider <id>', 'provider to use')
27
+ .option('-m, --model <model>', 'model id, or provider/model')
28
+ .option('--plan', 'start in read-only plan mode')
29
+ .option('--theme <name>', 'color theme (aurora, dark, ember, forest, violet, mono)')
30
+ .option('--effort <level>', 'reasoning effort (auto, low, medium, high)', effortValue)
31
+ .option('-c, --continue', 'resume the most recent session in this directory')
32
+ .option('-s, --session <id>', 'resume a saved session')
33
+ .option('-P, --print', 'print the response instead of opening the interactive UI')
34
+ .option('-y, --yes', 'auto-approve tool actions in headless mode')
35
+ .option('--json', 'emit newline-delimited JSON events in headless mode')
36
+ .option('--quiet', 'suppress tool progress and summaries in headless mode')
37
+ .option('--no-save', 'do not save the headless session')
38
+ .showSuggestionAfterError()
39
+ .showHelpAfterError()
40
+ .action(async (promptParts, _options, command) => {
41
+ const options = command.optsWithGlobals();
42
+ const cwd = await resolveCwd(options.cwd);
43
+ const prompt = (promptParts ?? []).join(' ').trim() || undefined;
44
+ const headless = Boolean(options.print) ||
45
+ Boolean(options.json) ||
46
+ !process.stdin.isTTY ||
47
+ !process.stdout.isTTY;
48
+ if (headless) {
49
+ const { runHeadless } = await import('./cli/headless.js');
50
+ process.exitCode = await runHeadless({
51
+ cwd,
52
+ prompt,
53
+ provider: options.provider,
54
+ model: options.model,
55
+ plan: options.plan,
56
+ yes: options.yes,
57
+ json: options.json,
58
+ quiet: options.quiet,
59
+ save: options.save,
60
+ session: options.session,
61
+ continue: options.continue,
62
+ effort: options.effort
63
+ });
64
+ return;
65
+ }
66
+ const { runInteractive } = await import('./cli/interactive.js');
67
+ process.exitCode = await runInteractive({
68
+ cwd,
69
+ provider: options.provider,
70
+ model: options.model,
71
+ plan: options.plan,
72
+ theme: options.theme,
73
+ session: options.session,
74
+ continue: options.continue,
75
+ effort: options.effort,
76
+ initialPrompt: prompt
77
+ });
78
+ });
79
+ program.addHelpText('after', `
80
+ ${chalk.bold('Examples')}
81
+ ${chalk.hex('#5EEAD4')('surf')} open the interactive UI
82
+ ${chalk.hex('#5EEAD4')('surf "explain src/core/agent.ts"')} open the UI and send a prompt
83
+ ${chalk.hex('#5EEAD4')('surf run "fix the failing tests"')} one-shot headless run
84
+ ${chalk.hex('#5EEAD4')('surf run --json "list the files"')} newline-delimited JSON events
85
+ ${chalk.hex('#5EEAD4')('surf auth anthropic')} save an API key
86
+ ${chalk.hex('#5EEAD4')('surf models --provider openai')} browse the model catalog
87
+ ${chalk.hex('#5EEAD4')('surf doctor')} check your setup
88
+
89
+ ${chalk.dim('Run `surf <command> --help` for command-specific flags.')}
90
+ `);
91
+ program
92
+ .command('run')
93
+ .description('run one prompt headlessly and print the response')
94
+ .argument('[prompt...]', 'prompt to send; reads stdin when omitted')
95
+ .option('-p, --provider <id>', 'provider to use')
96
+ .option('-m, --model <model>', 'model id, or provider/model')
97
+ .option('--plan', 'read-only plan mode')
98
+ .option('-y, --yes', 'auto-approve tool actions')
99
+ .option('--json', 'emit newline-delimited JSON events')
100
+ .option('--quiet', 'suppress tool progress and the final summary')
101
+ .option('--reasoning', 'stream reasoning text (stderr, or JSON events)')
102
+ .option('--no-save', 'do not save the session')
103
+ .option('-c, --continue', 'resume the most recent session in this directory')
104
+ .option('-s, --session <id>', 'resume a saved session')
105
+ .option('--max-steps <count>', 'maximum tool steps', numberValue)
106
+ .option('--max-tokens <count>', 'maximum output tokens', numberValue)
107
+ .option('--temperature <value>', 'sampling temperature', numberValue)
108
+ .option('--effort <level>', 'reasoning effort (auto, low, medium, high)', effortValue)
109
+ .addHelpText('after', `
110
+ ${chalk.bold('Examples')}
111
+ surf run "summarize this repository"
112
+ surf run -m openai/gpt-5 "refactor the parser"
113
+ cat error.log | surf run "explain this failure"
114
+ surf run --json --yes "run the tests and fix failures"
115
+
116
+ ${chalk.dim('Tool progress goes to stderr, so stdout stays clean for piping.')}
117
+ `)
118
+ .action(async (promptParts, _options, command) => {
119
+ const options = command.optsWithGlobals();
120
+ validateNumbers(options);
121
+ const cwd = await resolveCwd(options.cwd);
122
+ const { runHeadless } = await import('./cli/headless.js');
123
+ process.exitCode = await runHeadless({
124
+ cwd,
125
+ prompt: (promptParts ?? []).join(' ').trim() || undefined,
126
+ provider: options.provider,
127
+ model: options.model,
128
+ plan: options.plan,
129
+ yes: options.yes,
130
+ json: options.json,
131
+ quiet: options.quiet,
132
+ reasoning: options.reasoning,
133
+ save: options.save,
134
+ session: options.session,
135
+ continue: options.continue,
136
+ maxSteps: options.maxSteps,
137
+ maxTokens: options.maxTokens,
138
+ temperature: options.temperature,
139
+ effort: options.effort
140
+ });
141
+ });
142
+ program
143
+ .command('auth')
144
+ .description('connect a provider or inspect saved credentials')
145
+ .argument('[provider]', 'provider id (or "list")')
146
+ .option('--key <key>', 'save this API key without a hidden prompt')
147
+ .option('--remove', 'remove the saved key for a provider')
148
+ .option('--env', 'show the environment variables a provider reads')
149
+ .option('--list', 'list credential status')
150
+ .option('--all', 'list every provider')
151
+ .option('--json', 'emit JSON')
152
+ .addHelpText('after', `
153
+ ${chalk.bold('Examples')}
154
+ surf auth show credential status
155
+ surf auth anthropic save an Anthropic key
156
+ surf auth openai --key sk-… save non-interactively
157
+ surf auth google --env show environment variable names
158
+ surf auth openrouter --remove remove a saved key
159
+
160
+ ${chalk.dim('Keys are stored in auth.json with mode 600. They are never printed in full.')}
161
+ `)
162
+ .action(async (provider, _options, command) => {
163
+ const options = command.optsWithGlobals();
164
+ process.exitCode = await authCommand({ provider, ...options });
165
+ });
166
+ program
167
+ .command('models')
168
+ .description('browse and search the models.dev catalog')
169
+ .argument('[query...]', 'search model or provider names')
170
+ .option('-p, --provider <id>', 'only show models from one provider')
171
+ .option('--all', 'include embedding, audio, image, and other non-chat models')
172
+ .option('--limit <count>', 'number of models to show', numberValue)
173
+ .option('--refresh', 'refresh the catalog from models.dev first')
174
+ .option('--json', 'emit JSON')
175
+ .addHelpText('after', `
176
+ ${chalk.bold('Examples')}
177
+ surf models top recommended chat models
178
+ surf models claude search the whole catalog
179
+ surf models --provider anthropic filter by provider
180
+ surf models --all --limit 100 include every model type
181
+ surf models --refresh update from models.dev
182
+ `)
183
+ .action(async (query, _options, command) => {
184
+ const options = command.optsWithGlobals();
185
+ if (options.limit !== undefined)
186
+ validatePositive('limit', options.limit, true);
187
+ process.exitCode = await modelsCommand({ query, ...options });
188
+ });
189
+ program
190
+ .command('providers')
191
+ .description('list AI providers and their connection status')
192
+ .argument('[query...]', 'search provider names, ids, or env vars')
193
+ .option('--all', 'show every provider')
194
+ .option('--connected', 'only show connected providers')
195
+ .option('--json', 'emit JSON')
196
+ .addHelpText('after', `
197
+ ${chalk.bold('Examples')}
198
+ surf providers connected providers and popular defaults
199
+ surf providers --all every provider in the catalog
200
+ surf providers --connected only ready-to-use providers
201
+ surf providers ollama find local providers
202
+ `)
203
+ .action(async (query, _options, command) => {
204
+ const options = command.optsWithGlobals();
205
+ process.exitCode = await providersCommand({ query, ...options });
206
+ });
207
+ const config = program
208
+ .command('config')
209
+ .description('inspect or edit SurfCode configuration')
210
+ .addHelpText('after', `
211
+ ${chalk.bold('Examples')}
212
+ surf config print the effective config
213
+ surf config path print the config file path
214
+ surf config get theme
215
+ surf config set theme ember
216
+ surf config set permissions.shell allow
217
+ surf config set providers.anthropic.baseURL https://example.com/v1
218
+ surf config edit
219
+ surf config validate
220
+ `)
221
+ .action(async () => {
222
+ process.exitCode = await configShowCommand();
223
+ });
224
+ config
225
+ .command('path')
226
+ .description('print the config file path')
227
+ .action(async () => {
228
+ process.exitCode = await configPathCommand();
229
+ });
230
+ config
231
+ .command('get')
232
+ .description('read one config value by dot path')
233
+ .argument('<key>', 'dot path, e.g. permissions.shell')
234
+ .option('--json', 'emit JSON')
235
+ .action(async (key, _options, command) => {
236
+ process.exitCode = await configGetCommand(key, command.optsWithGlobals());
237
+ });
238
+ config
239
+ .command('set')
240
+ .description('write one config value by dot path')
241
+ .argument('<key>', 'dot path, e.g. theme')
242
+ .argument('<value>', 'JSON value or plain string')
243
+ .action(async (key, value) => {
244
+ process.exitCode = await configSetCommand(key, value);
245
+ });
246
+ config
247
+ .command('edit')
248
+ .description('open the config in $VISUAL or $EDITOR')
249
+ .action(async () => {
250
+ process.exitCode = await configEditCommand();
251
+ });
252
+ config
253
+ .command('validate')
254
+ .description('validate the config file')
255
+ .action(async () => {
256
+ process.exitCode = await configValidateCommand();
257
+ });
258
+ const sessions = program
259
+ .command('sessions')
260
+ .description('list, inspect, resume, or delete saved sessions')
261
+ .option('--all', 'show sessions from every working directory')
262
+ .option('--limit <count>', 'number of sessions to show', numberValue)
263
+ .option('--json', 'emit JSON')
264
+ .addHelpText('after', `
265
+ ${chalk.bold('Examples')}
266
+ surf sessions sessions in this directory
267
+ surf sessions --all every saved session
268
+ surf sessions show ses_abc123 print a transcript
269
+ surf sessions resume ses_abc123 continue in the interactive UI
270
+ surf sessions rm ses_abc123 delete a session
271
+ `)
272
+ .action(async (_options, command) => {
273
+ const options = command.optsWithGlobals();
274
+ if (options.limit !== undefined)
275
+ validatePositive('limit', options.limit, true);
276
+ process.exitCode = await sessionsListCommand({
277
+ cwd: await resolveCwd(options.cwd),
278
+ all: options.all,
279
+ limit: options.limit,
280
+ json: options.json
281
+ });
282
+ });
283
+ sessions
284
+ .command('list')
285
+ .description('list saved sessions')
286
+ .option('--all', 'show sessions from every working directory')
287
+ .option('--limit <count>', 'number of sessions to show', numberValue)
288
+ .option('--json', 'emit JSON')
289
+ .action(async (_options, command) => {
290
+ const options = command.optsWithGlobals();
291
+ if (options.limit !== undefined)
292
+ validatePositive('limit', options.limit, true);
293
+ process.exitCode = await sessionsListCommand({
294
+ cwd: await resolveCwd(options.cwd),
295
+ all: options.all,
296
+ limit: options.limit,
297
+ json: options.json
298
+ });
299
+ });
300
+ sessions
301
+ .command('show')
302
+ .description('print a saved session transcript')
303
+ .argument('<id>', 'session id or unique prefix')
304
+ .option('--json', 'print the full session JSON')
305
+ .option('--full', 'show complete tool outputs')
306
+ .action(async (id, _options, command) => {
307
+ const options = command.optsWithGlobals();
308
+ process.exitCode = await sessionShowCommand(id, options);
309
+ });
310
+ sessions
311
+ .command('rm')
312
+ .alias('delete')
313
+ .description('delete a saved session')
314
+ .argument('<id>', 'session id or unique prefix')
315
+ .option('-y, --yes', 'skip the confirmation prompt')
316
+ .option('--json', 'emit JSON')
317
+ .action(async (id, _options, command) => {
318
+ const options = command.optsWithGlobals();
319
+ process.exitCode = await sessionRemoveCommand(id, options);
320
+ });
321
+ sessions
322
+ .command('resume')
323
+ .description('resume a saved session in the interactive UI')
324
+ .argument('<id>', 'session id or unique prefix')
325
+ .option('-p, --provider <id>', 'override the provider')
326
+ .option('-m, --model <model>', 'override the model')
327
+ .option('--plan', 'start in read-only plan mode')
328
+ .option('--theme <name>', 'color theme')
329
+ .action(async (id, _options, command) => {
330
+ const options = command.optsWithGlobals();
331
+ const { runInteractive } = await import('./cli/interactive.js');
332
+ process.exitCode = await runInteractive({
333
+ cwd: await resolveCwd(options.cwd),
334
+ provider: options.provider,
335
+ model: options.model,
336
+ plan: options.plan,
337
+ theme: options.theme,
338
+ session: id
339
+ });
340
+ });
341
+ program
342
+ .command('sync')
343
+ .description('sync sessions with a self-hosted, BYOK-friendly endpoint')
344
+ .argument('[action]', 'push, pull, both, status, setup, serve, enable, or disable')
345
+ .option('--url <url>', 'sync server base URL')
346
+ .option('--token <token>', 'sync bearer token')
347
+ .option('--auto', 'push after every completed turn')
348
+ .option('--port <port>', 'sync server port (default 8787)', numberValue)
349
+ .option('--host <host>', 'sync server bind address (default 127.0.0.1)')
350
+ .option('--data-dir <dir>', 'sync server storage directory')
351
+ .option('--json', 'emit JSON')
352
+ .addHelpText('after', `
353
+ ${chalk.bold('Examples')}
354
+ surf sync setup --url https://sync.example.com --token ... configure sync
355
+ surf sync status show sync state
356
+ surf sync push push local sessions
357
+ surf sync pull pull remote sessions
358
+ surf sync push and pull
359
+ surf sync serve --port 8787 run a self-hosted store
360
+
361
+ ${chalk.dim('Only sessions are uploaded. Provider API keys never leave your machine.')}
362
+ `)
363
+ .action(async (action, _options, command) => {
364
+ const options = command.optsWithGlobals();
365
+ if (options.port !== undefined)
366
+ validatePositive('port', options.port, false);
367
+ process.exitCode = await syncCommand({ action, ...options });
368
+ });
369
+ program
370
+ .command('doctor')
371
+ .description('check your SurfCode installation and configuration')
372
+ .option('--json', 'emit JSON')
373
+ .option('--network', 'also test connectivity to models.dev')
374
+ .action(async (_options, command) => {
375
+ const options = command.optsWithGlobals();
376
+ process.exitCode = await doctorCommand({
377
+ cwd: await resolveCwd(options.cwd),
378
+ json: options.json,
379
+ network: options.network
380
+ });
381
+ });
382
+ program
383
+ .command('update-models')
384
+ .description('refresh the models.dev catalog cache')
385
+ .option('--url <url>', 'alternate models.dev-compatible JSON endpoint')
386
+ .option('--json', 'emit JSON')
387
+ .action(async (_options, command) => {
388
+ const options = command.optsWithGlobals();
389
+ process.exitCode = await updateModelsCommand(options);
390
+ });
391
+ program.hook('preAction', (_thisCommand, actionCommand) => {
392
+ const options = actionCommand.optsWithGlobals();
393
+ if (options.home) {
394
+ process.env.SURFCODE_HOME = resolve(expandHome(options.home));
395
+ }
396
+ if (options.color === false)
397
+ chalk.level = 0;
398
+ });
399
+ process.stdout.on('error', (error) => {
400
+ if (error.code === 'EPIPE')
401
+ process.exit(0);
402
+ });
403
+ process.stderr.on('error', (error) => {
404
+ if (error.code === 'EPIPE')
405
+ process.exit(0);
406
+ });
407
+ try {
408
+ await program.parseAsync(process.argv);
409
+ }
410
+ catch (error) {
411
+ handleError(error);
412
+ }
413
+ function handleError(error) {
414
+ if (error instanceof SurfError) {
415
+ writeError(`${danger('error')} ${error.message}`);
416
+ if (error.hint)
417
+ writeError(muted(` ${error.hint}`));
418
+ process.exitCode = error.exitCode;
419
+ return;
420
+ }
421
+ if (isAbortError(error)) {
422
+ writeError(warning('aborted'));
423
+ process.exitCode = 130;
424
+ return;
425
+ }
426
+ writeError(`${danger('error')} ${errorMessage(error)}`);
427
+ if (process.env.SURFCODE_DEBUG && error instanceof Error && error.stack) {
428
+ writeError(muted(error.stack));
429
+ }
430
+ process.exitCode = 1;
431
+ }
432
+ async function resolveCwd(value) {
433
+ const target = resolve(expandHome(value ?? process.cwd()));
434
+ try {
435
+ const info = await stat(target);
436
+ if (!info.isDirectory())
437
+ throw new SurfError(`Not a directory: ${target}`);
438
+ }
439
+ catch (error) {
440
+ if (error instanceof SurfError)
441
+ throw error;
442
+ throw new SurfError(`Working directory not found: ${target}`);
443
+ }
444
+ return target;
445
+ }
446
+ function expandHome(value) {
447
+ if (value === '~')
448
+ return homedir();
449
+ if (value.startsWith('~/'))
450
+ return join(homedir(), value.slice(2));
451
+ return value;
452
+ }
453
+ function numberValue(value) {
454
+ const parsed = Number(value);
455
+ if (!Number.isFinite(parsed))
456
+ throw new InvalidArgumentError(`Expected a number, got "${value}".`);
457
+ return parsed;
458
+ }
459
+ function effortValue(value) {
460
+ const parsed = parseEffort(value);
461
+ if (!parsed) {
462
+ throw new InvalidArgumentError(`Expected auto, low, medium, or high; got "${value}".`);
463
+ }
464
+ return parsed;
465
+ }
466
+ function validateNumbers(options) {
467
+ if (options.maxSteps !== undefined)
468
+ validatePositive('max-steps', options.maxSteps, false);
469
+ if (options.maxTokens !== undefined)
470
+ validatePositive('max-tokens', options.maxTokens, false);
471
+ if (options.temperature !== undefined) {
472
+ if (options.temperature < 0 || options.temperature > 2) {
473
+ throw new SurfError('temperature must be between 0 and 2.');
474
+ }
475
+ }
476
+ }
477
+ function validatePositive(name, value, integer) {
478
+ if (!Number.isFinite(value) || value <= 0) {
479
+ throw new SurfError(`--${name} must be a positive number.`);
480
+ }
481
+ if (integer && !Number.isInteger(value)) {
482
+ throw new SurfError(`--${name} must be a whole number.`);
483
+ }
484
+ }
485
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"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"}