@tutti-os/tutti-ops-cli 0.1.3 → 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 +73 -6
- package/dist/appApi.d.ts +11 -1
- package/dist/appApi.js +48 -3
- package/dist/appApi.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +9 -4
- package/dist/config.js.map +1 -1
- package/dist/core/commands.d.ts +2 -0
- package/dist/core/commands.js +71 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/errors.d.ts +7 -0
- package/dist/core/errors.js +16 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/executor.d.ts +32 -0
- package/dist/core/executor.js +133 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/input.d.ts +6 -0
- package/dist/core/input.js +163 -0
- package/dist/core/input.js.map +1 -0
- package/dist/core/output.d.ts +6 -0
- package/dist/core/output.js +35 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/types.d.ts +77 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/http.d.ts +9 -1
- package/dist/http.js +44 -41
- package/dist/http.js.map +1 -1
- package/dist/index.js +21 -7
- package/dist/index.js.map +1 -1
- package/dist/operations/admin-schemas.d.ts +2 -0
- package/dist/operations/admin-schemas.js +2433 -0
- package/dist/operations/admin-schemas.js.map +1 -0
- package/dist/operations/registry.d.ts +3 -0
- package/dist/operations/registry.js +204 -0
- package/dist/operations/registry.js.map +1 -0
- package/dist/upload.js +1 -0
- package/dist/upload.js.map +1 -1
- package/dist/workflows/app.d.ts +3 -0
- package/dist/workflows/app.js +82 -0
- package/dist/workflows/app.js.map +1 -0
- package/dist/zip.d.ts +19 -0
- package/dist/zip.js +154 -4
- package/dist/zip.js.map +1 -1
- package/package.json +6 -3
- package/skills/tutti-admin/SKILL.md +23 -0
|
@@ -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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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CliError, errorType } from './errors.js';
|
|
2
|
+
const secretKey = /^(authorization|cookie|token|token_value|tokenValue|auth_token|authToken|access_token|accessToken|secretAccessKey|secret_access_key|sessionToken|session_token|credentials|uploadSignature|upload_signature|uploadUrl|upload_url|plain_code|plainCode|codex_snippets|claude_code_snippets|codexSnippets|claudeCodeSnippets)$/i;
|
|
3
|
+
export function redact(value) {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return value.map(redact);
|
|
6
|
+
if (value && typeof value === 'object')
|
|
7
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, secretKey.test(key) && typeof item !== 'object' ? '[REDACTED]' : secretKey.test(key) && key !== 'token' ? '[REDACTED]' : redact(item)]));
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
export function errorEnvelope(error, operation) {
|
|
11
|
+
const e = error instanceof CliError ? error : new CliError('INTERNAL_ERROR', error instanceof Error ? error.message : 'Unknown error', 1);
|
|
12
|
+
return { exitCode: e.exitCode, value: redact({ ok: false, operation, error: { type: errorType(e.exitCode), code: e.code, message: e.message, retryable: false, ...e.details }, meta: { contractVersion: '1' } }) };
|
|
13
|
+
}
|
|
14
|
+
export function render(value, format = 'json') {
|
|
15
|
+
if (format === 'json')
|
|
16
|
+
return JSON.stringify(value, null, 2) + '\n';
|
|
17
|
+
const record = value;
|
|
18
|
+
const data = record.data;
|
|
19
|
+
const collectionKey = data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data).find(key => Array.isArray(data[key])) : undefined;
|
|
20
|
+
const collection = Array.isArray(data) ? data : collectionKey ? data[collectionKey] : undefined;
|
|
21
|
+
const context = collectionKey ? Object.fromEntries(Object.entries(data).filter(([key]) => key !== collectionKey)) : undefined;
|
|
22
|
+
const rows = collection ?? (data === undefined ? [] : [data]);
|
|
23
|
+
if (format === 'table') {
|
|
24
|
+
const objects = rows.map(row => row && typeof row === 'object' && !Array.isArray(row) ? row : { value: row });
|
|
25
|
+
const columns = [...new Set(objects.flatMap(row => Object.keys(row)))];
|
|
26
|
+
const cell = (item) => (typeof item === 'string' ? item : JSON.stringify(item) ?? '').replace(/[\t\r\n]/g, ' ');
|
|
27
|
+
return [columns.join('\t'), ...objects.map(row => columns.map(k => cell(row[k])).join('\t')), `# context ${JSON.stringify(context ?? {})}`, `# meta ${JSON.stringify(record.meta)}`].join('\n') + '\n';
|
|
28
|
+
}
|
|
29
|
+
if (format === 'ndjson') {
|
|
30
|
+
const { data: omitted, ...metadata } = record;
|
|
31
|
+
return [...rows.map(data => JSON.stringify({ type: 'item', data })), JSON.stringify({ type: 'summary', ...metadata, context })].join('\n') + '\n';
|
|
32
|
+
}
|
|
33
|
+
throw new CliError('INVALID_FORMAT', 'Format must be json, table or ndjson');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export type Access = 'read' | 'write';
|
|
2
|
+
export type JsonObject = Record<string, unknown>;
|
|
3
|
+
export interface Schema {
|
|
4
|
+
type?: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean' | 'null';
|
|
5
|
+
properties?: Record<string, Schema>;
|
|
6
|
+
required?: string[];
|
|
7
|
+
additionalProperties?: boolean | Schema;
|
|
8
|
+
items?: Schema;
|
|
9
|
+
enum?: unknown[];
|
|
10
|
+
anyOf?: Schema[];
|
|
11
|
+
minimum?: number;
|
|
12
|
+
maximum?: number;
|
|
13
|
+
pattern?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface Field {
|
|
17
|
+
flag: string;
|
|
18
|
+
key: string;
|
|
19
|
+
in: 'params' | 'data' | 'headers' | 'local';
|
|
20
|
+
schema: Schema;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
identity?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface Operation {
|
|
25
|
+
id: string;
|
|
26
|
+
command: string;
|
|
27
|
+
description: string;
|
|
28
|
+
access: Access;
|
|
29
|
+
kind: 'api' | 'workflow' | 'local';
|
|
30
|
+
effects: string[];
|
|
31
|
+
scope: string;
|
|
32
|
+
fields: Field[];
|
|
33
|
+
params: Schema;
|
|
34
|
+
data?: Schema;
|
|
35
|
+
method?: string;
|
|
36
|
+
path?: string;
|
|
37
|
+
confirmation: boolean;
|
|
38
|
+
permission?: string;
|
|
39
|
+
blocked?: string;
|
|
40
|
+
pagination?: {
|
|
41
|
+
location: 'params' | 'data';
|
|
42
|
+
kind: 'page' | 'offset' | 'cursor';
|
|
43
|
+
key: string;
|
|
44
|
+
size: string;
|
|
45
|
+
items: string;
|
|
46
|
+
total?: string;
|
|
47
|
+
next?: string;
|
|
48
|
+
};
|
|
49
|
+
steps?: string[];
|
|
50
|
+
source: string;
|
|
51
|
+
}
|
|
52
|
+
export interface Input {
|
|
53
|
+
params: JsonObject;
|
|
54
|
+
data?: JsonObject;
|
|
55
|
+
headers: Record<string, string>;
|
|
56
|
+
local: JsonObject;
|
|
57
|
+
}
|
|
58
|
+
export interface Plan {
|
|
59
|
+
operation: string;
|
|
60
|
+
access: Access;
|
|
61
|
+
scope: string;
|
|
62
|
+
effects: string[];
|
|
63
|
+
request?: {
|
|
64
|
+
method: string;
|
|
65
|
+
path: string;
|
|
66
|
+
params: JsonObject;
|
|
67
|
+
data?: JsonObject;
|
|
68
|
+
headers: Record<string, string>;
|
|
69
|
+
};
|
|
70
|
+
steps?: string[];
|
|
71
|
+
localInputs?: JsonObject;
|
|
72
|
+
unresolved: string[];
|
|
73
|
+
}
|
|
74
|
+
export declare const object: (properties?: Record<string, Schema>, required?: string[]) => Schema;
|
|
75
|
+
export declare const string: Schema;
|
|
76
|
+
export declare const integer: Schema;
|
|
77
|
+
export declare const boolean: Schema;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const object = (properties = {}, required = []) => ({ type: 'object', properties, required, additionalProperties: false });
|
|
2
|
+
export const string = { type: 'string' };
|
|
3
|
+
export const integer = { type: 'integer', minimum: 0 };
|
|
4
|
+
export const boolean = { type: 'boolean' };
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAyEA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,aAAqC,EAAE,EAAE,WAAqB,EAAE,EAAU,EAAE,CACjG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACjD,MAAM,CAAC,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/http.d.ts
CHANGED
|
@@ -6,11 +6,19 @@ export declare class HttpError extends Error {
|
|
|
6
6
|
export interface HttpClientOptions {
|
|
7
7
|
adminUrl: string;
|
|
8
8
|
token?: string;
|
|
9
|
+
cookie?: string;
|
|
10
|
+
mode?: 'read' | 'write';
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface RequestOptions {
|
|
14
|
+
params?: Record<string, unknown>;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
access?: 'read' | 'write';
|
|
9
17
|
}
|
|
10
18
|
export declare class HttpClient {
|
|
11
19
|
private readonly options;
|
|
12
20
|
constructor(options: HttpClientOptions);
|
|
13
|
-
request<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
21
|
+
request<T>(method: string, path: string, body?: unknown, request?: RequestOptions): Promise<T>;
|
|
14
22
|
get<T>(path: string): Promise<T>;
|
|
15
23
|
post<T>(path: string, body?: unknown): Promise<T>;
|
|
16
24
|
patch<T>(path: string, body?: unknown): Promise<T>;
|
package/dist/http.js
CHANGED
|
@@ -12,52 +12,55 @@ export class HttpClient {
|
|
|
12
12
|
constructor(options) {
|
|
13
13
|
this.options = options;
|
|
14
14
|
}
|
|
15
|
-
async request(method, path, body) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
async request(method, path, body, request = {}) {
|
|
16
|
+
const access = request.access ?? (['GET', 'HEAD', 'OPTIONS'].includes(method) ? 'read' : 'write');
|
|
17
|
+
if (this.options.mode === 'read' && access === 'write')
|
|
18
|
+
throw new HttpError('Write operation denied by local read mode', 403, undefined);
|
|
19
|
+
const origin = new URL(this.options.adminUrl).origin;
|
|
20
|
+
if (!path.startsWith('/') || path.startsWith('//'))
|
|
21
|
+
throw new HttpError('Expected a relative API path', 400, undefined);
|
|
22
|
+
const url = new URL(path, origin);
|
|
23
|
+
if (url.origin !== origin)
|
|
24
|
+
throw new HttpError('Cross-origin API request denied', 400, undefined);
|
|
25
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)))
|
|
26
|
+
throw new HttpError('Credentials require HTTPS (except localhost)', 400, undefined);
|
|
27
|
+
for (const [key, value] of Object.entries(request.params ?? {})) {
|
|
28
|
+
if (value === undefined || value === null)
|
|
29
|
+
continue;
|
|
30
|
+
for (const item of Array.isArray(value) ? value : [value])
|
|
31
|
+
url.searchParams.append(key, String(item));
|
|
21
32
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
const headers = { accept: 'application/json' };
|
|
34
|
+
for (const [key, value] of Object.entries(request.headers ?? {})) {
|
|
35
|
+
if (key !== 'brand_id')
|
|
36
|
+
throw new HttpError('Unsupported request header', 400, undefined);
|
|
37
|
+
headers[key] = value;
|
|
26
38
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
if (this.options.token)
|
|
40
|
+
headers.authorization = `Bearer ${this.options.token}`;
|
|
41
|
+
if (this.options.cookie)
|
|
42
|
+
headers.cookie = this.options.cookie;
|
|
43
|
+
if (body !== undefined)
|
|
44
|
+
headers['content-type'] = 'application/json';
|
|
45
|
+
const response = await fetch(url, { method, headers, body: body === undefined ? undefined : JSON.stringify(body),
|
|
46
|
+
redirect: 'error', signal: AbortSignal.timeout(this.options.timeoutMs ?? 30_000) });
|
|
32
47
|
const text = await response.text();
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
48
|
+
let parsed = {};
|
|
49
|
+
if (text.trim()) {
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(text);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
parsed = text;
|
|
55
|
+
}
|
|
36
56
|
}
|
|
57
|
+
if (!response.ok)
|
|
58
|
+
throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response.status, parsed);
|
|
37
59
|
return parsed;
|
|
38
60
|
}
|
|
39
|
-
get(path) {
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return this.request('POST', path, body);
|
|
44
|
-
}
|
|
45
|
-
patch(path, body) {
|
|
46
|
-
return this.request('PATCH', path, body);
|
|
47
|
-
}
|
|
48
|
-
delete(path) {
|
|
49
|
-
return this.request('DELETE', path);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function parseResponseBody(text) {
|
|
53
|
-
if (!text.trim()) {
|
|
54
|
-
return {};
|
|
55
|
-
}
|
|
56
|
-
try {
|
|
57
|
-
return JSON.parse(text);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return text;
|
|
61
|
-
}
|
|
61
|
+
get(path) { return this.request('GET', path); }
|
|
62
|
+
post(path, body) { return this.request('POST', path, body); }
|
|
63
|
+
patch(path, body) { return this.request('PATCH', path, body); }
|
|
64
|
+
delete(path) { return this.request('DELETE', path); }
|
|
62
65
|
}
|
|
63
66
|
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
3
|
import { stdin as input, stdout as output } from 'node:process';
|
|
4
|
-
import { Command } from 'commander';
|
|
4
|
+
import { Command, CommanderError } from 'commander';
|
|
5
|
+
import { CliError } from './core/errors.js';
|
|
5
6
|
import { AppApi } from './appApi.js';
|
|
6
7
|
import { CONFIG_PATH, readConfig, resolveRuntimeConfig, writeConfig } from './config.js';
|
|
7
8
|
import { HttpClient } from './http.js';
|
|
8
9
|
import { inspectZip } from './zip.js';
|
|
9
|
-
|
|
10
|
+
import { registerOperations } from './core/commands.js';
|
|
11
|
+
import { errorEnvelope, render } from './core/output.js';
|
|
12
|
+
const program = new Command().exitOverride().configureOutput({ writeErr: () => { } });
|
|
10
13
|
const ADMIN_TOKEN_INSPECT_PATH = '/api/admin/api/v1/admin/auth/token/inspect';
|
|
11
14
|
program
|
|
12
15
|
.name('tutti-ops')
|
|
@@ -106,6 +109,13 @@ app
|
|
|
106
109
|
.option('--latest')
|
|
107
110
|
.option('--reason <reason>')
|
|
108
111
|
.action(runApp((api, options) => api.release(options)));
|
|
112
|
+
app
|
|
113
|
+
.command('sync-metadata')
|
|
114
|
+
.requiredOption('--brand <brand>')
|
|
115
|
+
.requiredOption('--app-id <appId>')
|
|
116
|
+
.requiredOption('--zip <zip>')
|
|
117
|
+
.option('--reason <reason>')
|
|
118
|
+
.action(runApp((api, options) => api.syncMetadata(options.appId, options.zip, options.reason)));
|
|
109
119
|
app
|
|
110
120
|
.command('publish')
|
|
111
121
|
.requiredOption('--brand <brand>')
|
|
@@ -128,15 +138,19 @@ app
|
|
|
128
138
|
.requiredOption('--version <version>')
|
|
129
139
|
.option('--reason <reason>')
|
|
130
140
|
.action(runApp((api, options) => api.archive(options.appId, options.version, options.reason)));
|
|
141
|
+
registerOperations(program);
|
|
131
142
|
program.parseAsync().catch((error) => {
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
if (error instanceof CommanderError && error.exitCode === 0)
|
|
144
|
+
return;
|
|
145
|
+
const failure = errorEnvelope(error instanceof CommanderError ? new CliError('INVALID_ARGUMENTS', 'Invalid arguments; run the command with --help') : error);
|
|
146
|
+
process.stderr.write(render(failure.value));
|
|
147
|
+
process.exitCode = failure.exitCode;
|
|
134
148
|
});
|
|
135
149
|
function run(handler) {
|
|
136
150
|
return async () => {
|
|
137
151
|
const options = program.opts();
|
|
138
152
|
const runtime = await resolveRuntimeConfig(options);
|
|
139
|
-
if (!runtime.token) {
|
|
153
|
+
if (!runtime.token && !runtime.cookie) {
|
|
140
154
|
throw new Error('TUTTI_ADMIN_TOKEN is required. Run `tutti-ops auth login` first.');
|
|
141
155
|
}
|
|
142
156
|
print(await handler(new HttpClient(runtime)));
|
|
@@ -146,7 +160,7 @@ function runApp(handler) {
|
|
|
146
160
|
return async (options) => {
|
|
147
161
|
const rootOptions = program.opts();
|
|
148
162
|
const runtime = await resolveRuntimeConfig(rootOptions);
|
|
149
|
-
if (!runtime.token) {
|
|
163
|
+
if (!runtime.token && !runtime.cookie) {
|
|
150
164
|
throw new Error('TUTTI_ADMIN_TOKEN is required. Run `tutti-ops auth login` first.');
|
|
151
165
|
}
|
|
152
166
|
print(await handler(new AppApi(new HttpClient(runtime)), options));
|
|
@@ -173,6 +187,6 @@ async function resolveIconUrl(api, options) {
|
|
|
173
187
|
return api.uploadAppIcon(options.appId, icon);
|
|
174
188
|
}
|
|
175
189
|
function inspectAdminToken(client, token) {
|
|
176
|
-
return client.
|
|
190
|
+
return client.request('POST', ADMIN_TOKEN_INSPECT_PATH, token ? { token_value: token, metadata_only: true } : { metadata_only: true }, { access: 'read' });
|
|
177
191
|
}
|
|
178
192
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|