moorline 0.0.3
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/dist/app/cli/cli.d.ts +27 -0
- package/dist/app/cli/cli.js +585 -0
- package/dist/app/cli/cli.js.map +1 -0
- package/dist/app/cli/cliCommandParseUtils.d.ts +27 -0
- package/dist/app/cli/cliCommandParseUtils.js +136 -0
- package/dist/app/cli/cliCommandParseUtils.js.map +1 -0
- package/dist/app/cli/cliCommandTypes.d.ts +76 -0
- package/dist/app/cli/cliCommandTypes.js +2 -0
- package/dist/app/cli/cliCommandTypes.js.map +1 -0
- package/dist/app/cli/cliCommands.d.ts +3 -0
- package/dist/app/cli/cliCommands.js +322 -0
- package/dist/app/cli/cliCommands.js.map +1 -0
- package/dist/app/cli/cliConfigureCommands.d.ts +2 -0
- package/dist/app/cli/cliConfigureCommands.js +259 -0
- package/dist/app/cli/cliConfigureCommands.js.map +1 -0
- package/dist/app/cli/cliForegroundCommands.d.ts +8 -0
- package/dist/app/cli/cliForegroundCommands.js +178 -0
- package/dist/app/cli/cliForegroundCommands.js.map +1 -0
- package/dist/app/cli/cliHistoryCommands.d.ts +2 -0
- package/dist/app/cli/cliHistoryCommands.js +108 -0
- package/dist/app/cli/cliHistoryCommands.js.map +1 -0
- package/dist/app/cli/cliRequestCommands.d.ts +2 -0
- package/dist/app/cli/cliRequestCommands.js +70 -0
- package/dist/app/cli/cliRequestCommands.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +168 -0
- package/dist/main.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ChildProcessRunner, CommandRunner } from '@moorline/core/core/shared/utils/commandRunner.js';
|
|
2
|
+
import { parseCliArgs, type CliCommand } from './cliCommands.js';
|
|
3
|
+
export interface OutputWriter {
|
|
4
|
+
write(line: string): void;
|
|
5
|
+
}
|
|
6
|
+
interface PromptOption<T extends string> {
|
|
7
|
+
label: string;
|
|
8
|
+
value: T;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PromptAdapter {
|
|
12
|
+
input(label: string, description: string, fallback: string, validate?: (value: string) => string | null, options?: {
|
|
13
|
+
sensitive?: boolean;
|
|
14
|
+
}): Promise<string>;
|
|
15
|
+
select<T extends string>(label: string, description: string, options: PromptOption<T>[], fallback: T): Promise<T>;
|
|
16
|
+
confirm(label: string, description: string, fallback: boolean): Promise<boolean>;
|
|
17
|
+
close(): void;
|
|
18
|
+
}
|
|
19
|
+
export { parseCliArgs };
|
|
20
|
+
export interface CliDeps {
|
|
21
|
+
prompt: PromptAdapter;
|
|
22
|
+
output: OutputWriter;
|
|
23
|
+
commandRunner: CommandRunner;
|
|
24
|
+
waitForShutdown?: () => Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare function executeCli(command: CliCommand, deps: CliDeps): Promise<number>;
|
|
27
|
+
export declare function cliDefaults(output: OutputWriter, prompt: PromptAdapter, commandRunner: ChildProcessRunner): CliDeps;
|
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, extname, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { loadMoorlineConfig, resolveConfigPath, runtimePaths, saveMoorlineConfig } from '@moorline/core/core/system/config/configStore.js';
|
|
5
|
+
import { DEFAULT_MOORLINE_MODEL, defaultAdminConfig, defaultHttpApiAdapterConfig, defaultMainProcessConfig, defaultSurfaceNames, defaultMoorlineRuntimeRoot } from '@moorline/core/types/config.js';
|
|
6
|
+
import { validateApiAdapterPackageManifest } from '@moorline/contracts';
|
|
7
|
+
import { ApiBootstrapResolver, clearControlApiBootstrapRecord, readControlApiBootstrapRecord } from '@moorline/control-api/bootstrap.js';
|
|
8
|
+
import { parseCliArgs } from './cliCommands.js';
|
|
9
|
+
import { OperatorPackageService } from '@moorline/core/app/bootstrap/operatorPackageService.js';
|
|
10
|
+
import { runApiForeground, runRuntimeWorker } from './cliForegroundCommands.js';
|
|
11
|
+
export { parseCliArgs };
|
|
12
|
+
function renderJson(value, output) {
|
|
13
|
+
output.write(JSON.stringify(value, null, 2));
|
|
14
|
+
}
|
|
15
|
+
function formatHuman(value) {
|
|
16
|
+
if (typeof value === 'string') {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
if (value && typeof value === 'object') {
|
|
20
|
+
const record = value;
|
|
21
|
+
if (typeof record.message === 'string') {
|
|
22
|
+
return record.message;
|
|
23
|
+
}
|
|
24
|
+
if (typeof record.detail === 'string') {
|
|
25
|
+
return record.detail;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return JSON.stringify(value, null, 2);
|
|
29
|
+
}
|
|
30
|
+
function sourceLabel(entry) {
|
|
31
|
+
if (entry.registrySource === 'npm') {
|
|
32
|
+
return 'npm';
|
|
33
|
+
}
|
|
34
|
+
if (entry.registrySource === 'local_cache') {
|
|
35
|
+
return 'cached npm';
|
|
36
|
+
}
|
|
37
|
+
return 'unknown';
|
|
38
|
+
}
|
|
39
|
+
function renderPackageRows(value, output) {
|
|
40
|
+
const entries = Array.isArray(value) ? value : [];
|
|
41
|
+
if (entries.length === 0) {
|
|
42
|
+
output.write('No packages found.');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
output.write(`${entry.packageId} ${entry.kind} ${entry.version ?? 'unknown'} ${sourceLabel(entry)}`);
|
|
47
|
+
if (typeof entry.description === 'string') {
|
|
48
|
+
output.write(` ${entry.description}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function renderPackageInfo(value, output) {
|
|
53
|
+
if (!value || typeof value !== 'object') {
|
|
54
|
+
output.write(formatHuman(value));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const entry = value;
|
|
58
|
+
output.write(`${entry.packageId}`);
|
|
59
|
+
output.write(`Name: ${entry.name ?? entry.packageId}`);
|
|
60
|
+
output.write(`Kind: ${entry.kind}`);
|
|
61
|
+
output.write(`Version: ${entry.version ?? 'unknown'}`);
|
|
62
|
+
output.write(`Source: ${sourceLabel(entry)}`);
|
|
63
|
+
if (entry.npm && typeof entry.npm === 'object') {
|
|
64
|
+
const npm = entry.npm;
|
|
65
|
+
output.write(`Package source: ${npm.packageName ?? 'unknown'}`);
|
|
66
|
+
}
|
|
67
|
+
if (typeof entry.description === 'string') {
|
|
68
|
+
output.write('');
|
|
69
|
+
output.write(entry.description);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function renderHelp(output) {
|
|
73
|
+
output.write('Moorline CLI');
|
|
74
|
+
output.write('');
|
|
75
|
+
output.write('Setup:');
|
|
76
|
+
output.write(' moorline init [--config <path>]');
|
|
77
|
+
output.write('');
|
|
78
|
+
output.write('Control API:');
|
|
79
|
+
output.write(' moorline run');
|
|
80
|
+
output.write(' moorline api start');
|
|
81
|
+
output.write(' moorline api stop [--url <url>] [--token <token>]');
|
|
82
|
+
output.write(' moorline api status');
|
|
83
|
+
output.write(' moorline api diagnostics-export [--url <url>] [--token <token>] [--json]');
|
|
84
|
+
output.write(' moorline main <status|start|stop|restart> [--url <url>] [--token <token>] [--json]');
|
|
85
|
+
output.write('');
|
|
86
|
+
output.write('Operations:');
|
|
87
|
+
output.write(' moorline ops state [--url <url>] [--token <token>] [--json]');
|
|
88
|
+
output.write(' moorline ops accepting <on|off> [--url <url>] [--token <token>] [--json]');
|
|
89
|
+
output.write(' moorline ops reload <graceful|force> [--url <url>] [--token <token>] [--json]');
|
|
90
|
+
output.write(' moorline ops provider <start|stop> [--thread <id>] [--url <url>] [--token <token>] [--json]');
|
|
91
|
+
output.write(' moorline ops session create ...');
|
|
92
|
+
output.write('');
|
|
93
|
+
output.write('Configure:');
|
|
94
|
+
output.write(' moorline package <search|info|install> ...');
|
|
95
|
+
output.write(' moorline configure state [--url <url>] [--token <token>] [--json]');
|
|
96
|
+
output.write(' moorline configure apply [--url <url>] [--token <token>] [--json]');
|
|
97
|
+
output.write(' moorline configure package <install|remove|activate|deactivate|config> ...');
|
|
98
|
+
output.write(' moorline configure model <model-id> [--url <url>] [--token <token>] [--json]');
|
|
99
|
+
output.write(' moorline configure setup-export [--out <file>] [--url <url>] [--token <token>] [--json]');
|
|
100
|
+
output.write(' moorline configure backup [--include-workspaces] [--out <file>] [--url <url>] [--token <token>] [--json]');
|
|
101
|
+
output.write(' moorline configure import <archive-path> [--force] [--url <url>] [--token <token>] [--json]');
|
|
102
|
+
output.write('');
|
|
103
|
+
output.write('History and Requests:');
|
|
104
|
+
output.write(' moorline history <status|list|show|diff|snapshot|restore|discard> ...');
|
|
105
|
+
output.write(' moorline requests <list|inspect|resolve|answer|cancel> ...');
|
|
106
|
+
output.write('');
|
|
107
|
+
output.write('Interactive wizard:');
|
|
108
|
+
output.write(' moorline interactive [--url <url>] [--token <token>] [--json]');
|
|
109
|
+
}
|
|
110
|
+
function defaultRuntimeRootForConfig(configPath, explicitConfigPath) {
|
|
111
|
+
if (!explicitConfigPath) {
|
|
112
|
+
return defaultMoorlineRuntimeRoot();
|
|
113
|
+
}
|
|
114
|
+
const extension = extname(configPath);
|
|
115
|
+
const stem = basename(configPath, extension);
|
|
116
|
+
return resolve(dirname(configPath), `${stem}.runtime`);
|
|
117
|
+
}
|
|
118
|
+
function initialMoorlineConfig(configPath, explicitConfigPath) {
|
|
119
|
+
const surface = defaultSurfaceNames();
|
|
120
|
+
return {
|
|
121
|
+
version: 4,
|
|
122
|
+
runtimeRoot: defaultRuntimeRootForConfig(configPath, explicitConfigPath),
|
|
123
|
+
admin: defaultAdminConfig(),
|
|
124
|
+
main: defaultMainProcessConfig(),
|
|
125
|
+
defaults: {
|
|
126
|
+
runtimeMode: 'full-access',
|
|
127
|
+
model: DEFAULT_MOORLINE_MODEL
|
|
128
|
+
},
|
|
129
|
+
surface: surface,
|
|
130
|
+
setup: {
|
|
131
|
+
completed: false
|
|
132
|
+
},
|
|
133
|
+
surfaces: {
|
|
134
|
+
apiAdapter: {
|
|
135
|
+
activePackageId: null,
|
|
136
|
+
config: {},
|
|
137
|
+
configByPackageId: {}
|
|
138
|
+
},
|
|
139
|
+
transport: {
|
|
140
|
+
activePackageId: null,
|
|
141
|
+
config: {},
|
|
142
|
+
configByPackageId: {}
|
|
143
|
+
},
|
|
144
|
+
provider: {
|
|
145
|
+
activePackageId: null,
|
|
146
|
+
config: {},
|
|
147
|
+
configByPackageId: {}
|
|
148
|
+
},
|
|
149
|
+
plugins: {
|
|
150
|
+
enabledPackageIds: [],
|
|
151
|
+
configByPackageId: {}
|
|
152
|
+
},
|
|
153
|
+
skills: {
|
|
154
|
+
enabledPackageIds: [],
|
|
155
|
+
configByPackageId: {}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function readApiAdapterPackageId(packageDir) {
|
|
161
|
+
try {
|
|
162
|
+
const manifest = validateApiAdapterPackageManifest(JSON.parse(readFileSync(join(packageDir, 'manifest.json'), 'utf8')));
|
|
163
|
+
return manifest.id;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function findBundledApiAdapterPackage() {
|
|
170
|
+
let current = dirname(fileURLToPath(import.meta.url));
|
|
171
|
+
while (true) {
|
|
172
|
+
const candidates = [
|
|
173
|
+
join(current, 'packages', 'http'),
|
|
174
|
+
join(current, '..', 'http'),
|
|
175
|
+
join(current, 'node_modules', '@moorline', 'http')
|
|
176
|
+
];
|
|
177
|
+
for (const packageDir of candidates) {
|
|
178
|
+
if (!existsSync(join(packageDir, 'manifest.json'))) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const packageId = readApiAdapterPackageId(packageDir);
|
|
182
|
+
if (packageId) {
|
|
183
|
+
return { packageDir, packageId };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const parent = dirname(current);
|
|
187
|
+
if (parent === current) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
current = parent;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function ensureCoreRuntimeDirs(runtimeRoot) {
|
|
194
|
+
const paths = runtimePaths(runtimeRoot);
|
|
195
|
+
mkdirSync(paths.stateDir, { recursive: true });
|
|
196
|
+
mkdirSync(paths.workspacesDir, { recursive: true });
|
|
197
|
+
mkdirSync(paths.logsDir, { recursive: true });
|
|
198
|
+
}
|
|
199
|
+
async function runInit(command, deps) {
|
|
200
|
+
const configPath = resolveConfigPath(command.configPath);
|
|
201
|
+
if (existsSync(configPath)) {
|
|
202
|
+
deps.output.write(`Moorline config already exists: ${configPath}`);
|
|
203
|
+
deps.output.write('No changes made.');
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
const config = initialMoorlineConfig(configPath, command.configPath);
|
|
207
|
+
ensureCoreRuntimeDirs(config.runtimeRoot);
|
|
208
|
+
saveMoorlineConfig(config, configPath);
|
|
209
|
+
const packageService = new OperatorPackageService(config, configPath);
|
|
210
|
+
packageService.ensureInitialized();
|
|
211
|
+
const bundledApiAdapter = findBundledApiAdapterPackage();
|
|
212
|
+
if (bundledApiAdapter) {
|
|
213
|
+
config.surfaces.apiAdapter.configByPackageId ??= {};
|
|
214
|
+
config.surfaces.apiAdapter.configByPackageId[bundledApiAdapter.packageId] = { ...defaultHttpApiAdapterConfig() };
|
|
215
|
+
await packageService.installPackage({
|
|
216
|
+
kind: 'api-adapter',
|
|
217
|
+
source: {
|
|
218
|
+
kind: 'local_dir',
|
|
219
|
+
path: bundledApiAdapter.packageDir
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
packageService.setSelectedPackage('api-adapter', bundledApiAdapter.packageId);
|
|
223
|
+
}
|
|
224
|
+
deps.output.write(`Moorline config: ${configPath}`);
|
|
225
|
+
deps.output.write(`Moorline runtime root: ${config.runtimeRoot}`);
|
|
226
|
+
deps.output.write(bundledApiAdapter
|
|
227
|
+
? `Installed and selected bundled API adapter ${bundledApiAdapter.packageId}.`
|
|
228
|
+
: 'No bundled API adapter found; install one before starting the Control API.');
|
|
229
|
+
deps.output.write('Core runtime scaffold initialized. Run moorline run to open the Control API.');
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
async function controlApiClient(input) {
|
|
233
|
+
const { ControlApiClient } = await import('@moorline/control-api/client.js');
|
|
234
|
+
return new ControlApiClient({
|
|
235
|
+
...(input.url ? { url: input.url } : {}),
|
|
236
|
+
...(input.token ? { token: input.token } : {}),
|
|
237
|
+
...(input.configPath ? { configPath: input.configPath } : {}),
|
|
238
|
+
autoStart: true,
|
|
239
|
+
entrypoint: process.argv[1]
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function hasRemoteConnection(input) {
|
|
243
|
+
return Boolean(input.url ?? process.env.MOORLINE_API_URL);
|
|
244
|
+
}
|
|
245
|
+
function interactiveLeasePolicy(command) {
|
|
246
|
+
if (hasRemoteConnection(command)) {
|
|
247
|
+
return defaultMainProcessConfig().defaultLifecyclePolicy;
|
|
248
|
+
}
|
|
249
|
+
const config = loadMoorlineConfig(resolveConfigPath(command.configPath));
|
|
250
|
+
return config.main?.defaultLifecyclePolicy ?? defaultMainProcessConfig().defaultLifecyclePolicy;
|
|
251
|
+
}
|
|
252
|
+
function filenameFromContentDisposition(value) {
|
|
253
|
+
if (!value) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
const match = value.match(/filename="?([^";]+)"?/i);
|
|
257
|
+
if (!match?.[1]) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
return basename(match[1]);
|
|
261
|
+
}
|
|
262
|
+
async function runInteractive(command, deps) {
|
|
263
|
+
const client = await controlApiClient(command);
|
|
264
|
+
const { bindControlApiLease } = await import('@moorline/control-api/client.js');
|
|
265
|
+
const lease = await bindControlApiLease(client, {
|
|
266
|
+
clientName: 'cli-interactive',
|
|
267
|
+
policy: interactiveLeasePolicy(command)
|
|
268
|
+
});
|
|
269
|
+
deps.output.write('Moorline interactive mode (prompt wizard).');
|
|
270
|
+
try {
|
|
271
|
+
while (true) {
|
|
272
|
+
const mode = await deps.prompt.select('Mode', 'Choose a top-level mode.', [
|
|
273
|
+
{ label: 'Operations', value: 'operations', description: 'Runtime control and live work actions.' },
|
|
274
|
+
{ label: 'Configure', value: 'configure', description: 'Package, model, and setup actions.' },
|
|
275
|
+
{ label: 'Exit', value: 'exit', description: 'Leave interactive mode.' }
|
|
276
|
+
], 'operations');
|
|
277
|
+
if (mode === 'exit') {
|
|
278
|
+
deps.output.write('Interactive mode closed.');
|
|
279
|
+
return 0;
|
|
280
|
+
}
|
|
281
|
+
if (mode === 'operations') {
|
|
282
|
+
const action = await deps.prompt.select('Operations Action', 'Select an operations action.', [
|
|
283
|
+
{ label: 'Show state', value: 'state', description: 'Get operations snapshot.' },
|
|
284
|
+
{ label: 'Set accepting', value: 'accepting', description: 'Toggle queue intake.' },
|
|
285
|
+
{ label: 'Reload runtime', value: 'reload', description: 'Graceful or force reload.' },
|
|
286
|
+
{ label: 'Provider test', value: 'test', description: 'Verify selected provider startup.' },
|
|
287
|
+
{ label: 'Provider start', value: 'start', description: 'Start provider sessions.' },
|
|
288
|
+
{ label: 'Provider stop', value: 'stop', description: 'Stop provider sessions.' },
|
|
289
|
+
{ label: 'List requests', value: 'requests', description: 'Inspect pending requests.' }
|
|
290
|
+
], 'state');
|
|
291
|
+
if (action === 'state') {
|
|
292
|
+
renderJson(await client.get('/api/state/operations'), deps.output);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (action === 'accepting') {
|
|
296
|
+
const choice = await deps.prompt.select('Accepting', 'Set runtime queue acceptance mode.', [
|
|
297
|
+
{ label: 'On', value: 'on', description: 'Accept new work.' },
|
|
298
|
+
{ label: 'Off', value: 'off', description: 'Drain new work.' }
|
|
299
|
+
], 'on');
|
|
300
|
+
renderJson(await client.post('/api/runtime/accepting', { accepting: choice === 'on' }), deps.output);
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (action === 'reload') {
|
|
304
|
+
const modeChoice = await deps.prompt.select('Reload Mode', 'Choose runtime reload mode.', [
|
|
305
|
+
{ label: 'Graceful', value: 'graceful', description: 'Drain and replace worker.' },
|
|
306
|
+
{ label: 'Force', value: 'force', description: 'Immediate interruption.' }
|
|
307
|
+
], 'graceful');
|
|
308
|
+
renderJson(await client.post('/api/runtime/reload', { mode: modeChoice }), deps.output);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (action === 'start') {
|
|
312
|
+
renderJson(await client.post('/api/provider/start', {}), deps.output);
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (action === 'test') {
|
|
316
|
+
renderJson(await client.post('/api/provider/test', { sendTurn: true }), deps.output);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (action === 'stop') {
|
|
320
|
+
renderJson(await client.post('/api/provider/stop', {}), deps.output);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (action === 'requests') {
|
|
324
|
+
renderJson(await client.get('/api/pending-requests/list'), deps.output);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (mode === 'configure') {
|
|
329
|
+
const action = await deps.prompt.select('Configure Action', 'Select a configure action.', [
|
|
330
|
+
{ label: 'Show state', value: 'state', description: 'Get configure snapshot.' },
|
|
331
|
+
{ label: 'Apply packages', value: 'apply', description: 'Apply staged package/config changes.' },
|
|
332
|
+
{ label: 'Set default model', value: 'model', description: 'Update default model id.' },
|
|
333
|
+
{ label: 'Create snapshot', value: 'snapshot', description: 'Create local history snapshot.' }
|
|
334
|
+
], 'state');
|
|
335
|
+
if (action === 'state') {
|
|
336
|
+
renderJson(await client.get('/api/state/configure'), deps.output);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (action === 'apply') {
|
|
340
|
+
renderJson(await client.post('/api/packages/apply', {}), deps.output);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (action === 'model') {
|
|
344
|
+
const model = await deps.prompt.input('Default Model', 'Enter model id.', 'latest');
|
|
345
|
+
renderJson(await client.post('/api/management/default-model', { model }), deps.output);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (action === 'snapshot') {
|
|
349
|
+
const label = await deps.prompt.input('Snapshot Label', 'Enter snapshot label.', 'interactive snapshot');
|
|
350
|
+
renderJson(await client.post('/api/history/snapshot', { label }), deps.output);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
await lease.release();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
export async function executeCli(command, deps) {
|
|
361
|
+
try {
|
|
362
|
+
switch (command.kind) {
|
|
363
|
+
case 'help': {
|
|
364
|
+
renderHelp(deps.output);
|
|
365
|
+
return 0;
|
|
366
|
+
}
|
|
367
|
+
case 'init': {
|
|
368
|
+
return await runInit(command, deps);
|
|
369
|
+
}
|
|
370
|
+
case 'api-run-foreground': {
|
|
371
|
+
return await runApiForeground(command, deps);
|
|
372
|
+
}
|
|
373
|
+
case 'api-start': {
|
|
374
|
+
const resolver = new ApiBootstrapResolver({
|
|
375
|
+
configPath: command.configPath,
|
|
376
|
+
entrypoint: process.argv[1]
|
|
377
|
+
});
|
|
378
|
+
const hasRemoteConnection = Boolean(command.url ?? process.env.MOORLINE_API_URL);
|
|
379
|
+
const started = hasRemoteConnection
|
|
380
|
+
? await resolver.resolveConnection({
|
|
381
|
+
url: command.url,
|
|
382
|
+
token: command.token,
|
|
383
|
+
configPath: command.configPath,
|
|
384
|
+
autoStart: false
|
|
385
|
+
})
|
|
386
|
+
: await resolver.startLocalApiInBackground(resolveConfigPath(command.configPath));
|
|
387
|
+
deps.output.write(`Moorline Control API: ${started.url}`);
|
|
388
|
+
deps.output.write(`Moorline Control API token: ${started.token}`);
|
|
389
|
+
return 0;
|
|
390
|
+
}
|
|
391
|
+
case 'api-stop': {
|
|
392
|
+
const resolver = new ApiBootstrapResolver({
|
|
393
|
+
configPath: command.configPath,
|
|
394
|
+
entrypoint: process.argv[1]
|
|
395
|
+
});
|
|
396
|
+
const hasRemoteConnection = Boolean(command.url ?? process.env.MOORLINE_API_URL);
|
|
397
|
+
const record = hasRemoteConnection ? null : readControlApiBootstrapRecord(command.configPath);
|
|
398
|
+
const connection = hasRemoteConnection
|
|
399
|
+
? await resolver.resolveConnection({
|
|
400
|
+
url: command.url,
|
|
401
|
+
token: command.token,
|
|
402
|
+
configPath: command.configPath,
|
|
403
|
+
autoStart: false
|
|
404
|
+
})
|
|
405
|
+
: record
|
|
406
|
+
? { url: record.url, token: record.token, configPath: record.configPath }
|
|
407
|
+
: null;
|
|
408
|
+
if (!connection) {
|
|
409
|
+
deps.output.write('Control API is not running.');
|
|
410
|
+
return 0;
|
|
411
|
+
}
|
|
412
|
+
const client = await controlApiClient({
|
|
413
|
+
configPath: connection.configPath,
|
|
414
|
+
url: connection.url,
|
|
415
|
+
token: connection.token
|
|
416
|
+
});
|
|
417
|
+
await client.post('/api/shutdown', {});
|
|
418
|
+
if (!hasRemoteConnection) {
|
|
419
|
+
clearControlApiBootstrapRecord(command.configPath);
|
|
420
|
+
}
|
|
421
|
+
deps.output.write('Control API shutdown requested.');
|
|
422
|
+
return 0;
|
|
423
|
+
}
|
|
424
|
+
case 'api-status': {
|
|
425
|
+
const resolver = new ApiBootstrapResolver({
|
|
426
|
+
configPath: command.configPath,
|
|
427
|
+
entrypoint: process.argv[1]
|
|
428
|
+
});
|
|
429
|
+
const hasRemoteConnection = Boolean(command.url ?? process.env.MOORLINE_API_URL);
|
|
430
|
+
const record = hasRemoteConnection ? null : readControlApiBootstrapRecord(command.configPath);
|
|
431
|
+
const connection = hasRemoteConnection
|
|
432
|
+
? await resolver.resolveConnection({
|
|
433
|
+
url: command.url,
|
|
434
|
+
token: command.token,
|
|
435
|
+
configPath: command.configPath,
|
|
436
|
+
autoStart: false
|
|
437
|
+
})
|
|
438
|
+
: record
|
|
439
|
+
? { url: record.url, token: record.token, configPath: record.configPath, pid: record.pid, startedAt: record.startedAt }
|
|
440
|
+
: null;
|
|
441
|
+
if (!connection) {
|
|
442
|
+
deps.output.write('Control API is not running.');
|
|
443
|
+
return 0;
|
|
444
|
+
}
|
|
445
|
+
const apiBaseUrl = connection.url.replace(/\/+$/, '');
|
|
446
|
+
const response = await fetch(`${apiBaseUrl}/api/state/configure`, {
|
|
447
|
+
headers: {
|
|
448
|
+
authorization: `Bearer ${connection.token}`
|
|
449
|
+
}
|
|
450
|
+
}).catch(() => null);
|
|
451
|
+
if (!response?.ok) {
|
|
452
|
+
deps.output.write(`Control API metadata exists but authenticated status check failed: ${connection.url}`);
|
|
453
|
+
return 1;
|
|
454
|
+
}
|
|
455
|
+
deps.output.write(`Control API: ${connection.url}`);
|
|
456
|
+
if ('pid' in connection) {
|
|
457
|
+
deps.output.write(`PID: ${connection.pid}`);
|
|
458
|
+
}
|
|
459
|
+
if ('startedAt' in connection) {
|
|
460
|
+
deps.output.write(`Started: ${connection.startedAt}`);
|
|
461
|
+
}
|
|
462
|
+
return 0;
|
|
463
|
+
}
|
|
464
|
+
case 'worker-run': {
|
|
465
|
+
return await runRuntimeWorker(command, deps);
|
|
466
|
+
}
|
|
467
|
+
case 'package-search': {
|
|
468
|
+
const params = new globalThis.URLSearchParams();
|
|
469
|
+
if (command.query) {
|
|
470
|
+
params.set('q', command.query);
|
|
471
|
+
}
|
|
472
|
+
if (command.packageKind) {
|
|
473
|
+
params.set('kind', command.packageKind);
|
|
474
|
+
}
|
|
475
|
+
const path = `/api/packages/search${params.toString() ? `?${params.toString()}` : ''}`;
|
|
476
|
+
const payload = await (await controlApiClient(command)).get(path);
|
|
477
|
+
if (command.json) {
|
|
478
|
+
renderJson(payload, deps.output);
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
renderPackageRows(payload, deps.output);
|
|
482
|
+
}
|
|
483
|
+
return 0;
|
|
484
|
+
}
|
|
485
|
+
case 'package-info': {
|
|
486
|
+
const params = new globalThis.URLSearchParams({
|
|
487
|
+
packageId: command.packageId
|
|
488
|
+
});
|
|
489
|
+
if (command.packageKind) {
|
|
490
|
+
params.set('kind', command.packageKind);
|
|
491
|
+
}
|
|
492
|
+
const payload = await (await controlApiClient(command)).get(`/api/packages/info?${params.toString()}`);
|
|
493
|
+
if (command.json) {
|
|
494
|
+
renderJson(payload, deps.output);
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
renderPackageInfo(payload, deps.output);
|
|
498
|
+
}
|
|
499
|
+
return 0;
|
|
500
|
+
}
|
|
501
|
+
case 'package-install': {
|
|
502
|
+
const payload = await (await controlApiClient(command)).post('/api/packages/install', {
|
|
503
|
+
kind: command.packageKind,
|
|
504
|
+
packageId: command.packageId
|
|
505
|
+
});
|
|
506
|
+
if (command.json) {
|
|
507
|
+
renderJson(payload, deps.output);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
deps.output.write(formatHuman(payload));
|
|
511
|
+
}
|
|
512
|
+
return 0;
|
|
513
|
+
}
|
|
514
|
+
case 'api-get': {
|
|
515
|
+
const payload = await (await controlApiClient(command)).get(command.path);
|
|
516
|
+
if (command.json) {
|
|
517
|
+
renderJson(payload, deps.output);
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
deps.output.write(formatHuman(payload));
|
|
521
|
+
}
|
|
522
|
+
return 0;
|
|
523
|
+
}
|
|
524
|
+
case 'api-post': {
|
|
525
|
+
const payload = await (await controlApiClient(command)).post(command.path, command.payload);
|
|
526
|
+
if (command.json) {
|
|
527
|
+
renderJson(payload, deps.output);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
deps.output.write(formatHuman(payload));
|
|
531
|
+
}
|
|
532
|
+
return 0;
|
|
533
|
+
}
|
|
534
|
+
case 'api-download': {
|
|
535
|
+
const result = await (await controlApiClient(command)).getBinary(command.path);
|
|
536
|
+
const inferredName = filenameFromContentDisposition(result.contentDisposition) ?? 'moorline-download.bin';
|
|
537
|
+
const target = resolve(command.outPath ?? inferredName);
|
|
538
|
+
writeFileSync(target, Buffer.from(result.bytes));
|
|
539
|
+
if (command.json) {
|
|
540
|
+
renderJson({ path: target, bytes: result.bytes.byteLength, contentType: result.contentType }, deps.output);
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
deps.output.write(`Saved ${result.bytes.byteLength} bytes to ${target}.`);
|
|
544
|
+
}
|
|
545
|
+
return 0;
|
|
546
|
+
}
|
|
547
|
+
case 'api-upload': {
|
|
548
|
+
const bytes = readFileSync(resolve(command.filePath));
|
|
549
|
+
const payload = await (await controlApiClient(command)).postBinary(command.path, bytes, command.contentType);
|
|
550
|
+
if (command.json) {
|
|
551
|
+
renderJson(payload, deps.output);
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
deps.output.write(formatHuman(payload));
|
|
555
|
+
}
|
|
556
|
+
return 0;
|
|
557
|
+
}
|
|
558
|
+
case 'interactive': {
|
|
559
|
+
return await runInteractive(command, deps);
|
|
560
|
+
}
|
|
561
|
+
default:
|
|
562
|
+
return 1;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
finally {
|
|
566
|
+
deps.prompt.close();
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
export function cliDefaults(output, prompt, commandRunner) {
|
|
570
|
+
return {
|
|
571
|
+
output,
|
|
572
|
+
prompt,
|
|
573
|
+
commandRunner,
|
|
574
|
+
waitForShutdown: () => new Promise((resolve) => {
|
|
575
|
+
const finish = () => {
|
|
576
|
+
process.off('SIGINT', finish);
|
|
577
|
+
process.off('SIGTERM', finish);
|
|
578
|
+
resolve();
|
|
579
|
+
};
|
|
580
|
+
process.on('SIGINT', finish);
|
|
581
|
+
process.on('SIGTERM', finish);
|
|
582
|
+
})
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../../../src/app/cli/cli.ts"],"names":[],"mappings":"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"}
|