@tutti-os/tutti-ops-cli 0.1.4 → 0.1.5

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/README.md CHANGED
@@ -1,8 +1,55 @@
1
1
  # tutti-ops-cli
2
2
 
3
- Internal CLI for Tutti operations. The first workflow is App Center
4
- release publishing, but the command surface is intentionally broader than app
5
- uploads so it can grow with admin automation.
3
+ Internal CLI for Tutti admin operations: access, commerce, App Center, market,
4
+ LLM, releases, computers, tasks, and diagnostics.
5
+
6
+ ## Design and development
7
+
8
+ See [implementation status](docs/implementation-status.md) for delivered capabilities and remaining backend dependencies.
9
+ See [CLI design](docs/cli-design.md) for target commands and compatibility,
10
+ [execution contract](docs/cli-contract.md) for agent-facing behavior, and
11
+ [admin capability inventory](docs/admin-cli-capability-inventory.md) for verified API coverage and gaps.
12
+ Repository contributors start with [AGENTS.md](AGENTS.md).
13
+
14
+ ## Discover and run
15
+
16
+ ```bash
17
+ pnpm install --frozen-lockfile
18
+ pnpm build
19
+ node dist/index.js capabilities --access read
20
+ node dist/index.js schema access.login-code-settings.update
21
+ node dist/index.js skills show tutti-admin
22
+
23
+ # Offline request preview
24
+ node dist/index.js access login-code-settings update \
25
+ --scope-app-id example-app --enabled false --dry-run
26
+
27
+ # Explicitly execute an authorized write
28
+ node dist/index.js access login-code-settings update \
29
+ --scope-app-id example-app --enabled false --yes
30
+
31
+ # Read all pages for an operation with verified pagination support
32
+ node dist/index.js --mode read brand list --page-all --page-limit 10
33
+ ```
34
+
35
+ Canonical commands accept `--params` / `--data` as JSON objects, `@file.json`, or
36
+ `-` for stdin. Use schema for required fields and scope. Output defaults to a v1
37
+ JSON envelope; `--format table` produces TSV and `--format ndjson` emits records
38
+ and a summary. Failures use stderr JSON and nonzero exit codes. Exit 6 retains
39
+ partial data or indicates an uncertain write outcome; inspect state before retrying.
40
+
41
+ Management keys support **Read-only** (`access_mode=read`) and **Full access**
42
+ (`access_mode=write`) with the companion backend changes. New keys default to
43
+ read-only; existing keys retain full access. Server enforcement requires the
44
+ [coordinated rollout](docs/admin-token-permissions.md). Verify the target environment
45
+ before relying on typed key support.
46
+ `--mode read` (or `TUTTI_OPS_MODE=read`) adds a local write restriction and does not
47
+ change the key's actual permission. Existing administrator and business rules apply.
48
+ Session access can use an explicitly supplied `TUTTI_ADMIN_COOKIE`.
49
+
50
+ Credential fields are redacted by default. If an authorized task needs a newly
51
+ created token or a client config, pass `--show-secrets` on that successful request.
52
+ Dry-run and error output always redact known credential fields.
6
53
 
7
54
  ## Auth
8
55
 
@@ -17,7 +64,7 @@ The CLI stores the token in `~/.config/tutti-ops/config.json` with `0600`
17
64
  permissions. CI can provide `TUTTI_ADMIN_TOKEN` instead.
18
65
  `admin.nextop.sh` is normalized to the API origin `https://nextop.sh`.
19
66
 
20
- ## App Release
67
+ ## App Release (legacy commands)
21
68
 
22
69
  ```bash
23
70
  tutti-ops app list --brand nextop --query design
@@ -52,3 +99,17 @@ icon through App Center asset upload, or `--icon-url <url>` when the asset is
52
99
  already hosted.
53
100
  `app delete` removes the app catalog entry and all version metadata. It does not
54
101
  delete previously uploaded CDN artifacts.
102
+
103
+ ## Canonical App workflow
104
+
105
+ ```bash
106
+ tutti-ops app +validate --zip ./output/vibe-design.zip
107
+ tutti-ops app +release --app-id vibe-design --zip ./output/vibe-design.zip \
108
+ --publish true --latest true --dry-run
109
+ tutti-ops app +release --app-id vibe-design --zip ./output/vibe-design.zip \
110
+ --publish true --latest true --yes
111
+ ```
112
+
113
+ Legacy App commands retain their original success output and flags. Legacy
114
+ `--brand` does not enforce brand isolation. Use canonical entries for schema,
115
+ dry-run, confirmation, structured output and workflow request history.
package/dist/config.d.ts CHANGED
@@ -9,8 +9,11 @@ export declare function writeConfig(config: StoredConfig): Promise<void>;
9
9
  export declare function resolveRuntimeConfig(options?: {
10
10
  adminUrl?: string;
11
11
  token?: string;
12
+ mode?: 'read' | 'write';
12
13
  }): Promise<{
13
14
  adminUrl: string;
14
15
  token: string;
16
+ cookie: string | undefined;
17
+ mode: "read" | "write";
15
18
  }>;
16
19
  export { CONFIG_PATH };
package/dist/config.js CHANGED
@@ -24,14 +24,19 @@ export async function readConfig() {
24
24
  }
25
25
  export async function writeConfig(config) {
26
26
  await mkdir(dirname(CONFIG_PATH), { recursive: true });
27
- await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
27
+ await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
28
28
  await chmod(CONFIG_PATH, 0o600);
29
29
  }
30
30
  export async function resolveRuntimeConfig(options = {}) {
31
31
  const stored = await readConfig();
32
- const adminUrl = normalizeApiOrigin(options.adminUrl || stored.adminUrl);
33
- const token = (options.token || process.env.TUTTI_ADMIN_TOKEN || stored.token || '').trim();
34
- return { adminUrl, token };
32
+ const adminUrl = normalizeApiOrigin(options.adminUrl || process.env.TUTTI_ADMIN_URL || stored.adminUrl);
33
+ const sameOrigin = !stored.token || adminUrl === normalizeApiOrigin(stored.adminUrl);
34
+ const token = (options.token || process.env.TUTTI_ADMIN_TOKEN || (sameOrigin ? stored.token : '') || '').trim();
35
+ const cookie = process.env.TUTTI_ADMIN_COOKIE?.trim();
36
+ const mode = options.mode || process.env.TUTTI_OPS_MODE || 'write';
37
+ if (mode !== 'read' && mode !== 'write')
38
+ throw new Error('Mode must be read or write');
39
+ return { adminUrl, token, cookie, mode: mode };
35
40
  }
36
41
  export { CONFIG_PATH };
37
42
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAiD,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAE3E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAEzB,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAC,QAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;IACnG,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAA0E,EAAE;IACrH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,KAAK,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;IACnE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACvF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAwB,EAAE,CAAC;AACrE,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOperations(program: Command): void;
@@ -0,0 +1,71 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolveRuntimeConfig } from '../config.js';
3
+ import { operations, findOperation } from '../operations/registry.js';
4
+ import { execute, envelope } from './executor.js';
5
+ import { CliError } from './errors.js';
6
+ import { errorEnvelope, redact, render } from './output.js';
7
+ function child(parent, name) {
8
+ return parent.commands.find(command => command.name() === name) ?? parent.command(name);
9
+ }
10
+ async function stdin() {
11
+ let data = '';
12
+ for await (const chunk of process.stdin)
13
+ data += chunk;
14
+ return data;
15
+ }
16
+ export function registerOperations(program) {
17
+ program.option('--mode <mode>', 'local operation policy: read or write (TUTTI_OPS_MODE)');
18
+ program.command('capabilities').description('List canonical operations and their read/write classification')
19
+ .option('--access <access>', 'read or write').option('--module <module>', 'top-level module')
20
+ .action(options => {
21
+ if (options.access && !['read', 'write'].includes(options.access))
22
+ throw new CliError('INVALID_ACCESS', 'Use read or write');
23
+ const list = operations.filter(op => (!options.access || op.access === options.access) && (!options.module || op.command.split(' ')[0] === options.module));
24
+ process.stdout.write(render(envelope('capabilities', list.map(({ id, command, access, kind, scope, blocked, permission }) => ({ id, command, access, kind, scope, availability: blocked ? 'blocked' : 'implemented', authorization: 'server-enforced; CLI mode is local only', blocked, permission })), false, true)));
25
+ });
26
+ program.command('schema <operation...>').description('Describe one operation (dotted ID or command words)')
27
+ .action((parts) => {
28
+ const op = findOperation(parts.join(' '));
29
+ if (!op)
30
+ throw new CliError('UNKNOWN_OPERATION', 'Unknown operation; run capabilities', 8);
31
+ process.stdout.write(render(envelope('schema', op, false, true)));
32
+ });
33
+ const skills = program.command('skills').description('Discover bundled agent instructions');
34
+ skills.command('list').action(() => { process.stdout.write(render(envelope('skills.list', [{ name: 'tutti-admin' }], false, true))); });
35
+ skills.command('show <name>').action(async (name) => {
36
+ if (name !== 'tutti-admin')
37
+ throw new CliError('UNKNOWN_SKILL', 'Use skills list', 8);
38
+ const text = await readFile(new URL('../../skills/tutti-admin/SKILL.md', import.meta.url), 'utf8');
39
+ process.stdout.write(text);
40
+ });
41
+ for (const op of operations) {
42
+ let command = program;
43
+ for (const name of op.command.split(' '))
44
+ command = child(command, name);
45
+ command.description(`${op.description} [${op.access}${op.blocked ? ', blocked' : ''}]`)
46
+ .option('--params <json>', 'query/path JSON, @file, or - for stdin')
47
+ .option('--data <json>', 'body JSON, @file, or - for stdin')
48
+ .option('--dry-run', 'validate and print a plan without network requests')
49
+ .option('--yes', 'execute an authorized write')
50
+ .option('--format <format>', 'json, table or ndjson', 'json')
51
+ .option('--show-secrets', 'include credential fields in successful output')
52
+ .option('--page-all', 'collect pages with a verified pagination contract')
53
+ .option('--page-limit <count>', 'maximum number of pages', '10')
54
+ .option('--page-delay <ms>', 'delay between pages', '200');
55
+ for (const field of op.fields)
56
+ command.option(`--${field.flag} <value>`, `${field.in}.${field.key}${field.required ? ' (required)' : ''}; ${field.schema.type ?? 'JSON'}`);
57
+ command.action(async (_, cmd) => {
58
+ const options = cmd.optsWithGlobals();
59
+ try {
60
+ const value = await execute(op, options, { stdin, runtime: () => resolveRuntimeConfig(options) });
61
+ process.stdout.write(render(options.showSecrets && !options.dryRun ? value : redact(value), String(options.format)));
62
+ }
63
+ catch (error) {
64
+ const failure = errorEnvelope(error, op.id);
65
+ process.stderr.write(render(failure.value));
66
+ process.exitCode = failure.exitCode;
67
+ }
68
+ });
69
+ }
70
+ }
71
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class CliError extends Error {
2
+ readonly code: string;
3
+ readonly exitCode: number;
4
+ readonly details: Record<string, unknown>;
5
+ constructor(code: string, message: string, exitCode?: number, details?: Record<string, unknown>);
6
+ }
7
+ export declare const errorType: (exit: number) => string;
@@ -0,0 +1,16 @@
1
+ export class CliError extends Error {
2
+ code;
3
+ exitCode;
4
+ details;
5
+ constructor(code, message, exitCode = 2, details = {}) {
6
+ super(message);
7
+ this.code = code;
8
+ this.exitCode = exitCode;
9
+ this.details = details;
10
+ }
11
+ }
12
+ export const errorType = (exit) => ({
13
+ 1: 'internal', 2: 'validation', 3: 'authentication', 4: 'authorization',
14
+ 5: 'upstream', 6: 'partial', 7: 'conflict', 8: 'unsupported', 10: 'confirmation',
15
+ }[exit] ?? 'internal');
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACZ;IAAwC;IAAuB;IAApF,YAAqB,IAAY,EAAE,OAAe,EAAW,WAAW,CAAC,EAAW,UAAmC,EAAE;QACvH,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,SAAI,GAAJ,IAAI,CAAQ;QAA4B,aAAQ,GAAR,QAAQ,CAAI;QAAW,YAAO,GAAP,OAAO,CAA8B;IAEzH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,eAAe;IACvE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc;CACjF,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type HttpClientOptions } from '../http.js';
2
+ import type { JsonObject, Operation } from './types.js';
3
+ export interface Dependencies {
4
+ runtime: () => Promise<HttpClientOptions>;
5
+ stdin: () => Promise<string>;
6
+ }
7
+ export declare function envelope(operation: string, data: unknown, executed: boolean, complete: boolean | null, extra?: JsonObject): {
8
+ ok: boolean;
9
+ operation: string;
10
+ identity: {
11
+ verification: string;
12
+ };
13
+ data: unknown;
14
+ meta: {
15
+ contractVersion: string;
16
+ executed: boolean;
17
+ complete: boolean | null;
18
+ };
19
+ };
20
+ export declare function execute(op: Operation, options: JsonObject, dependencies: Dependencies): Promise<{
21
+ ok: boolean;
22
+ operation: string;
23
+ identity: {
24
+ verification: string;
25
+ };
26
+ data: unknown;
27
+ meta: {
28
+ contractVersion: string;
29
+ executed: boolean;
30
+ complete: boolean | null;
31
+ };
32
+ }>;
@@ -0,0 +1,133 @@
1
+ import { HttpClient, HttpError } from '../http.js';
2
+ import { CliError } from './errors.js';
3
+ import { buildPlan, parseInput } from './input.js';
4
+ import { runWorkflow } from '../workflows/app.js';
5
+ export function envelope(operation, data, executed, complete, extra = {}) {
6
+ return { ok: true, operation, identity: { verification: executed ? 'request-accepted-by-server' : 'not-checked' }, data, meta: { contractVersion: '1', executed, complete, ...extra } };
7
+ }
8
+ function classify(error, op) {
9
+ if (error instanceof CliError)
10
+ return error;
11
+ if (error instanceof HttpError) {
12
+ const code = error.status;
13
+ if (code === 401)
14
+ return new CliError('UNAUTHENTICATED', 'Server rejected authentication', 3);
15
+ if (code === 403)
16
+ return new CliError('FORBIDDEN', 'Server or local mode denied this operation', 4);
17
+ if (code === 409 || code === 412)
18
+ return new CliError('CONFLICT', 'Resource version or state has changed', 7);
19
+ if (code === 400 || code === 422)
20
+ return new CliError('UPSTREAM_VALIDATION', 'Server rejected the request fields', 2);
21
+ return new CliError('UPSTREAM_ERROR', `HTTP ${code}`, op.access === 'write' && code >= 500 ? 6 : 5, { status: code, outcome: op.access === 'write' && code >= 500 ? 'unknown' : 'failed' });
22
+ }
23
+ return new CliError(op.access === 'write' ? 'WRITE_OUTCOME_UNKNOWN' : 'NETWORK_ERROR', op.access === 'write' ? 'Request failed; inspect resource state before retrying' : 'Request failed', op.access === 'write' ? 6 : 5);
24
+ }
25
+ const get = (value, path) => path.split('.').reduce((v, k) => v && typeof v === 'object' ? (v[k] ?? v[k.replace(/[A-Z]/g, c => '_' + c.toLowerCase())]) : undefined, value);
26
+ export async function execute(op, options, dependencies) {
27
+ if (op.blocked)
28
+ throw new CliError('UNSUPPORTED', op.blocked, 8);
29
+ if (!['json', 'table', 'ndjson'].includes(String(options.format ?? 'json')))
30
+ throw new CliError('INVALID_FORMAT', 'Use json, table or ndjson');
31
+ const mode = options.mode ?? process.env.TUTTI_OPS_MODE ?? 'write';
32
+ if (mode !== 'read' && mode !== 'write')
33
+ throw new CliError('INVALID_MODE', 'Use read or write');
34
+ const input = await parseInput(op, options, dependencies.stdin);
35
+ const plan = buildPlan(op, input);
36
+ if (options.pageAll && !op.pagination)
37
+ throw new CliError('UNSUPPORTED_PAGINATION', 'This operation has no verified automatic pagination contract', 8);
38
+ const limit = Number(options.pageLimit ?? 10), delay = Number(options.pageDelay ?? 200);
39
+ if (!Number.isInteger(limit) || limit < 1 || limit > 1000 || !Number.isInteger(delay) || delay < 0 || delay > 60000)
40
+ throw new CliError('INVALID_PAGINATION', 'page-limit: 1..1000; page-delay: 0..60000 ms');
41
+ if (options.dryRun)
42
+ return envelope(op.id, plan, false, false, { locallyAllowed: mode === 'write' || op.access === 'read' });
43
+ if (mode === 'read' && op.access === 'write')
44
+ throw new CliError('READ_ONLY', 'Write operation denied by local read mode', 4);
45
+ if (op.confirmation && !options.yes)
46
+ throw new CliError('CONFIRMATION_REQUIRED', 'Review --dry-run, then pass --yes to execute the authorized write', 10);
47
+ if (op.kind === 'local')
48
+ return envelope(op.id, await runWorkflow(op, input, undefined), false, true);
49
+ const runtime = await dependencies.runtime();
50
+ if (!runtime.token && !runtime.cookie)
51
+ throw new CliError('MISSING_AUTH', 'Set TUTTI_ADMIN_TOKEN for supported bearer endpoints or TUTTI_ADMIN_COOKIE for admin session endpoints', 3);
52
+ const client = new HttpClient({ ...runtime, mode: mode });
53
+ if (op.kind === 'workflow') {
54
+ try {
55
+ return envelope(op.id, await runWorkflow(op, input, client), true, true);
56
+ }
57
+ catch (error) {
58
+ throw classify(error, op);
59
+ }
60
+ }
61
+ const request = plan.request;
62
+ if (op.id === 'admin-token.create') {
63
+ let capabilities;
64
+ try {
65
+ capabilities = await client.get('/api/admin/api/v1/admin/tokens');
66
+ }
67
+ catch (error) {
68
+ throw classify(error, { ...op, access: 'read' });
69
+ }
70
+ const modes = get(capabilities, 'supportedAccessModes');
71
+ if (!Array.isArray(modes) || !modes.includes('read') || !modes.includes('write'))
72
+ throw new CliError('UNSUPPORTED_TOKEN_PERMISSIONS', 'Upgrade admin-server before creating a typed management token', 8);
73
+ }
74
+ const items = [];
75
+ let pages = 0;
76
+ const p = op.pagination;
77
+ const seen = new Set();
78
+ if (p) {
79
+ const target = p.location === 'data' ? request.data : request.params;
80
+ target[p.size] ??= 20;
81
+ if (p.kind !== 'cursor')
82
+ target[p.key] ??= p.kind === 'offset' ? 0 : 1;
83
+ }
84
+ let response;
85
+ let sourceIncomplete = false;
86
+ for (;;) {
87
+ try {
88
+ response = await client.request(request.method, request.path, request.data, { params: request.params, headers: request.headers, access: op.access });
89
+ }
90
+ catch (error) {
91
+ if (pages)
92
+ throw new CliError('PARTIAL_RESULT', 'Pagination stopped after a request failed', 6, { items, pages, complete: false, cause: classify(error, op).code });
93
+ throw classify(error, op);
94
+ }
95
+ pages++;
96
+ if (!response || typeof response !== 'object')
97
+ throw new CliError('INVALID_RESPONSE', 'Expected a JSON response object', 6);
98
+ if (op.id === 'admin-token.create' && get(response, 'token.accessMode') !== request.data?.access_mode)
99
+ throw new CliError('TOKEN_MODE_MISMATCH', 'Server returned a different token mode; inspect and revoke the new token', 6, { tokenId: get(response, 'token.tokenId') });
100
+ const failures = get(response, 'failedCount');
101
+ const results = get(response, 'results');
102
+ if (Number(failures) > 0 || (Array.isArray(results) && results.some(r => r && typeof r === 'object' && r.success === false)))
103
+ throw new CliError('PARTIAL_RESULT', 'Some batch operations failed', 6, { data: response, complete: false });
104
+ const truncated = ['truncated', 'eventsTruncated', 'sourceTruncated'].some(key => get(response, key) === true);
105
+ sourceIncomplete ||= truncated;
106
+ if (!p)
107
+ return envelope(op.id, response, true, op.access === 'read' ? !truncated : null);
108
+ const batch = get(response, p.items);
109
+ if (!Array.isArray(batch))
110
+ throw new CliError('INVALID_RESPONSE', 'Expected a paginated item array', 6, { items, pages, complete: false });
111
+ items.push(...batch);
112
+ const target = p.location === 'data' ? request.data : request.params;
113
+ const current = target[p.key];
114
+ const size = Number(target[p.size] ?? 20);
115
+ const totalValue = p.total ? get(response, p.total) : undefined;
116
+ const total = totalValue === undefined ? undefined : Number(totalValue);
117
+ const next = p.next ? get(response, p.next) : undefined;
118
+ const more = p.kind === 'cursor' ? typeof next === 'string' && next.length > 0 : total !== undefined ? (p.kind === 'offset' ? Number(current ?? 0) : Math.max(0, Number(current ?? 1) - 1) * size) + batch.length < total : batch.length >= size;
119
+ if (!options.pageAll)
120
+ return envelope(op.id, response, true, !more && !sourceIncomplete, { pages });
121
+ if (!more && (sourceIncomplete || get(response, 'hasMore') === true))
122
+ throw new CliError('PARTIAL_RESULT', 'Source reports incomplete data without a continuation cursor', 6, { items, pages, complete: false });
123
+ if (!more)
124
+ return envelope(op.id, { items }, true, true, { pages });
125
+ if (pages >= limit || batch.length === 0 || (p.kind === 'cursor' && (next === current || seen.has(next))))
126
+ throw new CliError('PARTIAL_RESULT', 'Pagination limit or stalled cursor reached', 6, { items, pages, complete: false, next });
127
+ seen.add(next);
128
+ target[p.key] = p.kind === 'cursor' ? next : p.kind === 'offset' ? Number(current ?? 0) + batch.length : Number(current ?? 1) + 1;
129
+ if (delay)
130
+ await new Promise(resolve => setTimeout(resolve, delay));
131
+ }
132
+ }
133
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Input, JsonObject, Operation, Plan, Schema } from './types.js';
2
+ export declare const flagKey: (name: string) => string;
3
+ export declare const kebab: (name: string) => string;
4
+ export declare function validate(value: unknown, schema: Schema, path?: string): void;
5
+ export declare function parseInput(op: Operation, options: JsonObject, stdin: () => Promise<string>): Promise<Input>;
6
+ export declare function buildPlan(op: Operation, input: Input): Plan;
@@ -0,0 +1,163 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { CliError } from './errors.js';
3
+ const own = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4
+ export const flagKey = (name) => name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
5
+ export const kebab = (name) => name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replaceAll('_', '-').toLowerCase();
6
+ export function validate(value, schema, path = 'input') {
7
+ const fail = (message) => { throw new CliError('INVALID_INPUT', `${path}: ${message}`); };
8
+ if (schema.anyOf) {
9
+ if (!schema.anyOf.some((branch) => { try {
10
+ validate(value, branch, path);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ } }))
16
+ fail('does not match any allowed type');
17
+ return;
18
+ }
19
+ if (schema.enum && !schema.enum.some((item) => item === value))
20
+ fail(`expected one of ${JSON.stringify(schema.enum)}`);
21
+ if (schema.type === 'object') {
22
+ if (!value || typeof value !== 'object' || Array.isArray(value))
23
+ fail('expected an object');
24
+ const record = value;
25
+ for (const key of schema.required ?? [])
26
+ if (!own(record, key))
27
+ fail(`missing ${key}`);
28
+ for (const [key, item] of Object.entries(record)) {
29
+ if (['__proto__', 'constructor', 'prototype'].includes(key))
30
+ fail('unsafe property');
31
+ const child = schema.properties?.[key];
32
+ if (child)
33
+ validate(item, child, `${path}.${key}`);
34
+ else if (schema.additionalProperties === false)
35
+ fail(`unknown property ${key}`);
36
+ else if (typeof schema.additionalProperties === 'object')
37
+ validate(item, schema.additionalProperties, `${path}.${key}`);
38
+ }
39
+ }
40
+ else if (schema.type === 'array') {
41
+ if (!Array.isArray(value))
42
+ fail('expected an array');
43
+ value.forEach((item, index) => validate(item, schema.items ?? {}, `${path}[${index}]`));
44
+ }
45
+ else if (schema.type === 'null') {
46
+ if (value !== null)
47
+ fail('expected null');
48
+ }
49
+ else if (schema.type) {
50
+ const type = schema.type === 'integer' ? 'number' : schema.type;
51
+ if (typeof value !== type)
52
+ fail(`expected ${schema.type}`);
53
+ if (typeof value === 'number' && (!Number.isFinite(value) || (schema.type === 'integer' && !Number.isSafeInteger(value))))
54
+ fail('expected a finite, safe number');
55
+ }
56
+ if (typeof value === 'number') {
57
+ if (schema.minimum !== undefined && value < schema.minimum)
58
+ fail(`minimum ${schema.minimum}`);
59
+ if (schema.maximum !== undefined && value > schema.maximum)
60
+ fail(`maximum ${schema.maximum}`);
61
+ }
62
+ if (typeof value === 'string' && schema.pattern && !new RegExp(schema.pattern).test(value))
63
+ fail('invalid format');
64
+ }
65
+ async function jsonArg(raw, stdin) {
66
+ if (raw === undefined)
67
+ return {};
68
+ try {
69
+ const text = raw === '-' ? await stdin() : raw.startsWith('@') ? await readFile(raw.slice(1), 'utf8') : raw;
70
+ const result = JSON.parse(text);
71
+ validate(result, { type: 'object' });
72
+ return result;
73
+ }
74
+ catch (error) {
75
+ if (error instanceof CliError)
76
+ throw error;
77
+ throw new CliError('INVALID_JSON', 'Expected a JSON object, @file, or - for stdin');
78
+ }
79
+ }
80
+ function convert(raw, schema) {
81
+ if (typeof raw !== 'string')
82
+ return raw;
83
+ if (schema.type === 'string' || schema.anyOf?.some(branch => branch.type === 'string'))
84
+ return raw;
85
+ try {
86
+ return JSON.parse(raw);
87
+ }
88
+ catch {
89
+ throw new CliError('INVALID_FLAG', 'Expected a JSON number, boolean, array or object');
90
+ }
91
+ }
92
+ export async function parseInput(op, options, stdin) {
93
+ if (options.params === '-' && options.data === '-')
94
+ throw new CliError('STDIN_CONFLICT', 'Only one argument may consume stdin');
95
+ const params = await jsonArg(options.params, stdin);
96
+ const data = op.data ? await jsonArg(options.data, stdin) : undefined;
97
+ if (!op.data && options.data !== undefined)
98
+ throw new CliError('UNEXPECTED_BODY', 'This operation does not accept --data');
99
+ const input = { params, data, headers: {}, local: {} };
100
+ for (const field of op.fields) {
101
+ const raw = options[flagKey(field.flag)];
102
+ const target = input[field.in];
103
+ if (!target)
104
+ continue;
105
+ if (raw !== undefined) {
106
+ const value = convert(raw, field.schema);
107
+ if (field.identity && own(target, field.key) && target[field.key] !== value)
108
+ throw new CliError('SCOPE_CONFLICT', `Conflicting ${field.flag}`);
109
+ validate(value, field.schema, `--${field.flag}`);
110
+ target[field.key] = value;
111
+ }
112
+ }
113
+ // A body and a path may both carry an ID. Both must name the same resource.
114
+ for (const name of op.path?.matchAll(/\{(\w+)\}/g) ?? []) {
115
+ const key = name[1];
116
+ if (data && own(data, key) && own(params, key) && data[key] !== params[key])
117
+ throw new CliError('SCOPE_CONFLICT', `Conflicting ${key} in path and body`);
118
+ if (data && own(data, key) && !own(params, key))
119
+ params[key] = data[key];
120
+ if (data && op.data?.properties?.[key] && own(params, key) && !own(data, key))
121
+ data[key] = params[key];
122
+ }
123
+ for (const field of op.fields) {
124
+ const target = input[field.in];
125
+ if (field.required && (!target || !own(target, field.key)))
126
+ throw new CliError('MISSING_INPUT', `Missing --${field.flag}`);
127
+ if (field.identity && target && own(target, field.key) && typeof target[field.key] === 'string' && !String(target[field.key]).trim())
128
+ throw new CliError('EMPTY_SCOPE', `Empty --${field.flag}`);
129
+ }
130
+ for (const key of ['appId', 'version']) {
131
+ const value = input.local[key];
132
+ if (typeof value === 'string' && (!value.trim() || /[/%\\?#\x00-\x1f]/.test(value) || value === '.' || value === '..'))
133
+ throw new CliError('INVALID_PATH_PARAMETER', `Invalid ${key}`);
134
+ }
135
+ validate(params, op.params, 'params');
136
+ if (op.data)
137
+ validate(data, op.data, 'data');
138
+ return input;
139
+ }
140
+ export function buildPlan(op, input) {
141
+ let path = op.path;
142
+ const params = { ...input.params };
143
+ if (path)
144
+ path = path.replace(/\{(\w+)\}/g, (_, key) => {
145
+ const value = params[key];
146
+ if (typeof value !== 'string' || !value.trim() || /[\/%\\?#\x00-\x1f]/.test(value) || value === '.' || value === '..')
147
+ throw new CliError('INVALID_PATH_PARAMETER', `Invalid ${key}`);
148
+ delete params[key];
149
+ if (key === 'source' && op.command.startsWith('agent-package '))
150
+ return value === 'tsh-v1' ? 'v1' : 'v2';
151
+ return encodeURIComponent(value);
152
+ });
153
+ if (op.id === 'auth.status' && input.data)
154
+ input.data.metadata_only = true;
155
+ if (op.id === 'admin-token.create' && input.data)
156
+ input.data.access_mode ??= 'read';
157
+ return {
158
+ operation: op.id, access: op.access, scope: op.scope, effects: op.effects,
159
+ ...(path ? { request: { method: op.method, path, params, data: input.data, headers: input.headers } } : { steps: op.steps, localInputs: input.local }),
160
+ unresolved: op.kind === 'local' ? [] : ['server authentication, authorization and resource state are checked at execution'],
161
+ };
162
+ }
163
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/core/input.ts"],"names":[],"mappings":"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"}