surfcode 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +325 -2
- package/assets/surfcode-logo.gif +0 -0
- package/dist/cli/auth.js +315 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/config.js +228 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/headless.js +355 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/inspect.js +462 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/interactive.js +130 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/sessions.js +170 -0
- package/dist/cli/sessions.js.map +1 -0
- package/dist/cli/sync.js +190 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/util.js +345 -0
- package/dist/cli/util.js.map +1 -0
- package/dist/cli.js +485 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.js +281 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agents.js +55 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/auth.js +107 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/catalog.js +306 -0
- package/dist/core/catalog.js.map +1 -0
- package/dist/core/chat/anthropic.js +222 -0
- package/dist/core/chat/anthropic.js.map +1 -0
- package/dist/core/chat/common.js +367 -0
- package/dist/core/chat/common.js.map +1 -0
- package/dist/core/chat/google.js +180 -0
- package/dist/core/chat/google.js.map +1 -0
- package/dist/core/chat/index.js +80 -0
- package/dist/core/chat/index.js.map +1 -0
- package/dist/core/chat/openai.js +164 -0
- package/dist/core/chat/openai.js.map +1 -0
- package/dist/core/chat/types.js +2 -0
- package/dist/core/chat/types.js.map +1 -0
- package/dist/core/clipboard.js +34 -0
- package/dist/core/clipboard.js.map +1 -0
- package/dist/core/compact.js +39 -0
- package/dist/core/compact.js.map +1 -0
- package/dist/core/config.js +211 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/delegate.js +184 -0
- package/dist/core/delegate.js.map +1 -0
- package/dist/core/effort.js +80 -0
- package/dist/core/effort.js.map +1 -0
- package/dist/core/errors.js +32 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/free.js +21 -0
- package/dist/core/free.js.map +1 -0
- package/dist/core/github.js +445 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/paths.js +51 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/prompt.js +95 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/provider.js +298 -0
- package/dist/core/provider.js.map +1 -0
- package/dist/core/session.js +159 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/sync.js +126 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/usage.js +127 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/workspace.js +70 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/data/models.json +1 -0
- package/dist/sync/server.js +179 -0
- package/dist/sync/server.js.map +1 -0
- package/dist/tools/diff.js +21 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/files.js +227 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/github.js +238 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.js +231 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.js +118 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/todos.js +50 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/webfetch.js +108 -0
- package/dist/tools/webfetch.js.map +1 -0
- package/dist/tui/App.js +3002 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/ansi.js +151 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/commands.js +61 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/explorer.js +152 -0
- package/dist/tui/explorer.js.map +1 -0
- package/dist/tui/icons.js +21 -0
- package/dist/tui/icons.js.map +1 -0
- package/dist/tui/layout.js +324 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/markdown.js +335 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/overlays.js +316 -0
- package/dist/tui/overlays.js.map +1 -0
- package/dist/tui/render.js +234 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/theme.js +148 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.js +73 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":"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"}
|