predictable-ai 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/README.md +265 -0
- package/dist/args.js +76 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.js +17 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/bundle.js +754 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/execute.js +266 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/config.js +93 -0
- package/dist/config.js.map +1 -0
- package/dist/diagnostics.js +99 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/commands.json +881 -0
- package/dist/generated/csv-safety.js +181 -0
- package/dist/generated/csv-safety.js.map +1 -0
- package/dist/generated/csv-safety.ts +184 -0
- package/dist/help.js +133 -0
- package/dist/help.js.map +1 -0
- package/dist/http.js +146 -0
- package/dist/http.js.map +1 -0
- package/dist/output.js +102 -0
- package/dist/output.js.map +1 -0
- package/dist/parity.js +30 -0
- package/dist/parity.js.map +1 -0
- package/dist/registry.js +359 -0
- package/dist/registry.js.map +1 -0
- package/dist/run.js +102 -0
- package/dist/run.js.map +1 -0
- package/dist/surface.js +24 -0
- package/dist/surface.js.map +1 -0
- package/dist/version.js +91 -0
- package/dist/version.js.map +1 -0
- package/package.json +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/commands/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { nextCommandHint, previewInstruction } from '../diagnostics.js';
|
|
3
|
+
import { CliError, EXIT } from '../errors.js';
|
|
4
|
+
import { classify, routeUnavailableReason, send } from '../http.js';
|
|
5
|
+
import { renderJson, renderText } from '../output.js';
|
|
6
|
+
import { pathBindings } from '../registry.js';
|
|
7
|
+
import { EXPORT_PURPOSES, writeCampaignBundle } from './bundle.js';
|
|
8
|
+
/** Substitute `[token]` segments from the command's flag bindings. */
|
|
9
|
+
function concretePath(spec, route, args) {
|
|
10
|
+
const bind = pathBindings(spec.name);
|
|
11
|
+
return route.path.replace(/\[([^\]]+)\]/g, (_match, token) => {
|
|
12
|
+
const flag = bind[token];
|
|
13
|
+
const value = flag ? args.flags.get(flag) : undefined;
|
|
14
|
+
if (!value) {
|
|
15
|
+
throw new CliError(EXIT.USAGE, `--${flag ?? token} is required for ${route.method} ${route.path}.`);
|
|
16
|
+
}
|
|
17
|
+
return encodeURIComponent(value);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function queryFor(spec, args) {
|
|
21
|
+
const query = {};
|
|
22
|
+
for (const param of spec.params) {
|
|
23
|
+
if (!param.query)
|
|
24
|
+
continue;
|
|
25
|
+
const value = args.flags.get(param.name);
|
|
26
|
+
if (value !== undefined && value !== '')
|
|
27
|
+
query[param.query] = value;
|
|
28
|
+
}
|
|
29
|
+
return query;
|
|
30
|
+
}
|
|
31
|
+
function checkRequired(spec, args) {
|
|
32
|
+
for (const param of spec.params) {
|
|
33
|
+
if (!param.required)
|
|
34
|
+
continue;
|
|
35
|
+
const value = args.flags.get(param.name);
|
|
36
|
+
if (value === undefined || value === '') {
|
|
37
|
+
throw new CliError(EXIT.USAGE, `--${param.name} ${param.placeholder} is required.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function bodyFor(args, io) {
|
|
42
|
+
const raw = args.flags.get('body');
|
|
43
|
+
if (raw === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
const text = raw === '-' ? await io.readStdin() : raw;
|
|
46
|
+
try {
|
|
47
|
+
JSON.parse(text);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new CliError(EXIT.USAGE, '--body must be JSON (or - to read JSON from stdin).');
|
|
51
|
+
}
|
|
52
|
+
return text;
|
|
53
|
+
}
|
|
54
|
+
/** The short column label a multi-route command prefixes its lines with. */
|
|
55
|
+
function labelFor(route) {
|
|
56
|
+
const segments = route.path.split('/').filter((s) => s && !s.startsWith('['));
|
|
57
|
+
return segments[segments.length - 1] ?? route.path;
|
|
58
|
+
}
|
|
59
|
+
async function callOne(ctx, spec, route, args, body) {
|
|
60
|
+
const path = concretePath(spec, route, args);
|
|
61
|
+
const call = {
|
|
62
|
+
method: route.method,
|
|
63
|
+
path,
|
|
64
|
+
// The request goes to `path`; error text names `template` instead, so an
|
|
65
|
+
// id the caller typed never reaches stderr.
|
|
66
|
+
template: route.path,
|
|
67
|
+
query: queryFor(spec, args),
|
|
68
|
+
...(body !== undefined ? { body } : {}),
|
|
69
|
+
};
|
|
70
|
+
const response = await send(ctx, call);
|
|
71
|
+
let failure = classify(response, call);
|
|
72
|
+
if (failure && response.status === 404) {
|
|
73
|
+
const reason = await routeUnavailableReason(ctx, route);
|
|
74
|
+
if (reason)
|
|
75
|
+
failure = classify(response, call, reason);
|
|
76
|
+
}
|
|
77
|
+
if (failure)
|
|
78
|
+
throw failure;
|
|
79
|
+
return { path: route.path, label: labelFor(route), body: response.text };
|
|
80
|
+
}
|
|
81
|
+
function emit(results, args, io) {
|
|
82
|
+
if (args.booleans.has('json')) {
|
|
83
|
+
io.stdout(`${renderJson(results)}\n`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const text = renderText(results);
|
|
87
|
+
if (text.length > 0)
|
|
88
|
+
io.stdout(`${text}\n`);
|
|
89
|
+
}
|
|
90
|
+
/** A free read: every planned read route whose `when` flags were supplied. */
|
|
91
|
+
async function runRead(ctx, spec, args, io) {
|
|
92
|
+
const routes = spec.routes.filter((r) => r.role === 'read' && (r.when ?? []).every((flag) => args.flags.get(flag)));
|
|
93
|
+
if (routes.length === 0)
|
|
94
|
+
throw new CliError(EXIT.USAGE, `${spec.name} has no route to call with those flags.`);
|
|
95
|
+
const results = [];
|
|
96
|
+
for (const route of routes)
|
|
97
|
+
results.push(await callOne(ctx, spec, route, args));
|
|
98
|
+
emit(results, args, io);
|
|
99
|
+
}
|
|
100
|
+
/** A single named call, body from --body or stdin. */
|
|
101
|
+
async function runAction(ctx, spec, args, io) {
|
|
102
|
+
const actionable = spec.routes.filter((r) => r.role === 'action');
|
|
103
|
+
const routes = actionable.length > 0 ? actionable : spec.routes;
|
|
104
|
+
const wanted = args.flags.get('action') ?? spec.defaultAction;
|
|
105
|
+
const route = routes.length === 1
|
|
106
|
+
? routes[0]
|
|
107
|
+
: routes.find((r) => r.action === wanted);
|
|
108
|
+
if (!route) {
|
|
109
|
+
const names = [...new Set(routes.map((r) => r.action).filter(Boolean))].join(', ');
|
|
110
|
+
throw new CliError(EXIT.USAGE, `--action must be one of: ${names}.`);
|
|
111
|
+
}
|
|
112
|
+
const body = await bodyFor(args, io);
|
|
113
|
+
emit([await callOne(ctx, spec, route, args, body ?? '{}')], args, io);
|
|
114
|
+
}
|
|
115
|
+
/** The quote fields a preview must surface, in the order they are printed. */
|
|
116
|
+
const QUOTE_FIELDS = ['quote_id', 'total_price_credits', 'unit_price_credits', 'expires_at'];
|
|
117
|
+
function renderQuote(spec, body) {
|
|
118
|
+
let parsed;
|
|
119
|
+
try {
|
|
120
|
+
parsed = JSON.parse(body);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new CliError(EXIT.SERVER, 'the preview did not return a quote', 'response was not JSON');
|
|
124
|
+
}
|
|
125
|
+
const quoteId = parsed.quote_id;
|
|
126
|
+
if (typeof quoteId !== 'string' || quoteId.length === 0) {
|
|
127
|
+
throw new CliError(EXIT.SERVER, 'the preview did not return a quote', 'no quote_id in the response');
|
|
128
|
+
}
|
|
129
|
+
const named = new Set(QUOTE_FIELDS);
|
|
130
|
+
const lines = [
|
|
131
|
+
...QUOTE_FIELDS.map((field) => `${field}\t${parsed[field] ?? ''}`),
|
|
132
|
+
...Object.entries(parsed)
|
|
133
|
+
.filter(([key, value]) => !named.has(key) && (value === null || typeof value !== 'object'))
|
|
134
|
+
.map(([key, value]) => `${key}\t${value ?? ''}`),
|
|
135
|
+
];
|
|
136
|
+
return { lines: lines.join('\n'), quoteId };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The paid two-step (ticket AC4, spec §5.2).
|
|
140
|
+
*
|
|
141
|
+
* The refusal is LOCAL AND UNCONDITIONAL: with no --quote, this returns before
|
|
142
|
+
* anything is sent, so no acting POST leaves the process. Server-side quote
|
|
143
|
+
* enforcement is T5's (ga-mfacl.5) and is the authority; this is the client
|
|
144
|
+
* half, and it exists so an agent that forgets the preview gets a usable
|
|
145
|
+
* instruction instead of a 400 it has to parse.
|
|
146
|
+
*/
|
|
147
|
+
async function runPaid(ctx, spec, args, io) {
|
|
148
|
+
const preview = spec.routes.find((r) => r.role === 'preview');
|
|
149
|
+
const acting = spec.routes.find((r) => r.role === 'act');
|
|
150
|
+
if (args.booleans.has('preview')) {
|
|
151
|
+
if (!preview)
|
|
152
|
+
throw new CliError(EXIT.USAGE, `${spec.name} has no preview route in this manifest.`);
|
|
153
|
+
const body = await bodyFor(args, io);
|
|
154
|
+
const result = await callOne(ctx, spec, preview, args, body ?? '{}');
|
|
155
|
+
// BOTH MODES GET THE HINT. --json used to return here, so the one caller
|
|
156
|
+
// most likely to be a script — the one piping to jq — was the one never
|
|
157
|
+
// told the next command. stdout still differs by mode (the verbatim body
|
|
158
|
+
// or the quote lines); the hint is a diagnostic and goes to stderr either
|
|
159
|
+
// way. In --json the body is written FIRST, so a preview that minted no
|
|
160
|
+
// quote still hands the caller the bytes it got before failing the way the
|
|
161
|
+
// default mode fails on the same response.
|
|
162
|
+
const json = args.booleans.has('json');
|
|
163
|
+
if (json)
|
|
164
|
+
io.stdout(`${renderJson([result])}\n`);
|
|
165
|
+
const { lines, quoteId } = renderQuote(spec, result.body);
|
|
166
|
+
if (!json)
|
|
167
|
+
io.stdout(`${lines}\n`);
|
|
168
|
+
io.stderr(nextCommandHint(spec.name, args, quoteId));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const quote = args.flags.get('quote');
|
|
172
|
+
if (quote === undefined || quote.length === 0) {
|
|
173
|
+
throw new CliError(EXIT.QUOTE_REQUIRED, `${spec.name} spends credits and needs a quote.`, previewInstruction(spec.name, args));
|
|
174
|
+
}
|
|
175
|
+
if (!acting)
|
|
176
|
+
throw new CliError(EXIT.USAGE, `${spec.name} has no acting route in this manifest.`);
|
|
177
|
+
const supplied = await bodyFor(args, io);
|
|
178
|
+
const merged = {
|
|
179
|
+
...(supplied ? JSON.parse(supplied) : {}),
|
|
180
|
+
quote_id: quote,
|
|
181
|
+
request_key: args.flags.get('request-key') ?? randomUUID(),
|
|
182
|
+
};
|
|
183
|
+
emit([await callOne(ctx, spec, acting, args, JSON.stringify(merged))], args, io);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* `guide <topic>` — the manifest's coaching text.
|
|
187
|
+
*
|
|
188
|
+
* IT READS THE DEPLOYMENT, NOT THE BUNDLE, and that is the point. T15
|
|
189
|
+
* (ga-mfacl.17) serves each topic's body at `manifest.guides[<topic>]`; a CLI
|
|
190
|
+
* older than the deployment therefore prints the deployment's CURRENT coaching
|
|
191
|
+
* instead of a stale copy compiled into itself, and there is no hand-written
|
|
192
|
+
* second copy of text that has one source of truth.
|
|
193
|
+
*
|
|
194
|
+
* A deployment that serves no body for a registered topic gets the honest
|
|
195
|
+
* refusal below rather than a bundled fallback — see `test/guide.test.ts`.
|
|
196
|
+
*/
|
|
197
|
+
async function runGuide(ctx, spec, args, io) {
|
|
198
|
+
const response = await send(ctx, { method: 'GET', path: '/api/agent/manifest' });
|
|
199
|
+
const failure = classify(response, { method: 'GET', path: '/api/agent/manifest' });
|
|
200
|
+
if (failure)
|
|
201
|
+
throw failure;
|
|
202
|
+
const manifest = JSON.parse(response.text);
|
|
203
|
+
const content = manifest.guides?.[spec.topic ?? ''];
|
|
204
|
+
if (content === undefined) {
|
|
205
|
+
throw new CliError(EXIT.SERVER, 'not available on this deployment yet', `the manifest serves no content for guide topic "${spec.topic}".`);
|
|
206
|
+
}
|
|
207
|
+
if (args.booleans.has('json')) {
|
|
208
|
+
io.stdout(`${JSON.stringify(content, null, 2)}\n`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
io.stdout(`${typeof content === 'string' ? content : JSON.stringify(content, null, 2)}\n`);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* `export campaign` — write the §3.4 bundle to `--out` (ticket AC2-AC5).
|
|
215
|
+
*
|
|
216
|
+
* The command prints a RECEIPT, not the data: the data is on disk, and echoing
|
|
217
|
+
* a hundred thousand contacts to stdout on the way there is how a caller's
|
|
218
|
+
* terminal becomes the bundle. `--json` gets the same receipt as JSON.
|
|
219
|
+
*/
|
|
220
|
+
async function runBundle(ctx, spec, args, io, env, now) {
|
|
221
|
+
const listId = args.flags.get('list');
|
|
222
|
+
const outDir = args.flags.get('out');
|
|
223
|
+
const requested = args.flags.get('purpose') ?? 'prospecting_activation';
|
|
224
|
+
if (!EXPORT_PURPOSES.includes(requested)) {
|
|
225
|
+
throw new CliError(EXIT.USAGE, `--purpose must be one of: ${EXPORT_PURPOSES.join(', ')}.`);
|
|
226
|
+
}
|
|
227
|
+
const purpose = requested;
|
|
228
|
+
const sequenceId = args.flags.get('sequence');
|
|
229
|
+
const result = await writeCampaignBundle({
|
|
230
|
+
ctx,
|
|
231
|
+
listId,
|
|
232
|
+
outDir,
|
|
233
|
+
purpose,
|
|
234
|
+
env,
|
|
235
|
+
now,
|
|
236
|
+
...(sequenceId ? { sequenceId } : {}),
|
|
237
|
+
});
|
|
238
|
+
if (args.booleans.has('json')) {
|
|
239
|
+
io.stdout(`${JSON.stringify({ directory: result.directory, files: result.files }, null, 2)}\n`);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const lines = Object.entries(result.files).map(([file, bytes]) => `${file}\t${bytes}`);
|
|
243
|
+
io.stdout(`${[result.directory, ...lines].join('\n')}\n`);
|
|
244
|
+
// `reporting_history` skips the suppression filter by design (§6). A bundle
|
|
245
|
+
// that did so says so on stderr, every time — a deliberate bypass that leaves
|
|
246
|
+
// no trace in the operator's terminal is a bypass nobody remembers making.
|
|
247
|
+
if (purpose === 'reporting_history') {
|
|
248
|
+
io.stderr('note: --purpose reporting_history bypasses suppression filtering; manifest.json records it.\n');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export async function executeCommand(ctx, spec, args, io, env = process.env, now = new Date().toISOString()) {
|
|
252
|
+
checkRequired(spec, args);
|
|
253
|
+
switch (spec.mode) {
|
|
254
|
+
case 'read':
|
|
255
|
+
return runRead(ctx, spec, args, io);
|
|
256
|
+
case 'action':
|
|
257
|
+
return runAction(ctx, spec, args, io);
|
|
258
|
+
case 'paid':
|
|
259
|
+
return runPaid(ctx, spec, args, io);
|
|
260
|
+
case 'bundle':
|
|
261
|
+
return runBundle(ctx, spec, args, io, env, now);
|
|
262
|
+
case 'guide':
|
|
263
|
+
return runGuide(ctx, spec, args, io);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Token and base-URL resolution (spec D-k, ticket AC5).
|
|
6
|
+
*
|
|
7
|
+
* THE TOKEN IS NEVER READ FROM ARGV. There is no --token flag and no positional
|
|
8
|
+
* token anywhere in this CLI: a token on a command line lands in the shell
|
|
9
|
+
* history, in `ps` output for every user on the box, and in CI logs. The two
|
|
10
|
+
* sanctioned channels are the environment and a file the user owns.
|
|
11
|
+
* `test/hygiene.test.ts` asserts that no --help text and no README example ever
|
|
12
|
+
* puts one on a command line.
|
|
13
|
+
*/
|
|
14
|
+
export const TOKEN_ENV_VAR = 'PREDICTABLE_TOKEN';
|
|
15
|
+
export const BASE_URL_ENV_VAR = 'PREDICTABLE_BASE_URL';
|
|
16
|
+
/** Spec D-k: the base URL defaults to production and is overridable. */
|
|
17
|
+
export const DEFAULT_BASE_URL = 'https://www.predictable.ai';
|
|
18
|
+
export const CONFIG_DIR_NAME = '.predictable';
|
|
19
|
+
export const CONFIG_FILE_NAME = 'config.json';
|
|
20
|
+
export function configPath(home = homedir()) {
|
|
21
|
+
return join(home, CONFIG_DIR_NAME, CONFIG_FILE_NAME);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the token: PREDICTABLE_TOKEN first, then ~/.predictable/config.json.
|
|
25
|
+
*
|
|
26
|
+
* A config file that is group- or world-readable is a finding, not a failure:
|
|
27
|
+
* refusing to run would strand a user mid-script with a credential they can
|
|
28
|
+
* still see, so the CLI warns on stderr and proceeds. The warning names the
|
|
29
|
+
* mode and the path — never the token.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveToken({ env, home }) {
|
|
32
|
+
const warnings = [];
|
|
33
|
+
const fromEnv = env[TOKEN_ENV_VAR];
|
|
34
|
+
if (typeof fromEnv === 'string' && fromEnv.trim().length > 0) {
|
|
35
|
+
return { token: fromEnv.trim(), source: 'env', warnings };
|
|
36
|
+
}
|
|
37
|
+
const path = configPath(home ?? homedir());
|
|
38
|
+
let raw;
|
|
39
|
+
try {
|
|
40
|
+
const stat = statSync(path);
|
|
41
|
+
// 0o077 = any permission bit for group or other.
|
|
42
|
+
if ((stat.mode & 0o077) !== 0) {
|
|
43
|
+
warnings.push(`${path} is readable beyond its owner (mode ${(stat.mode & 0o777).toString(8)}); run chmod 600 on it.`);
|
|
44
|
+
}
|
|
45
|
+
raw = readFileSync(path, 'utf8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return { token: undefined, source: 'none', warnings };
|
|
49
|
+
}
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
warnings.push(`${path} is not valid JSON; ignoring it.`);
|
|
56
|
+
return { token: undefined, source: 'none', warnings };
|
|
57
|
+
}
|
|
58
|
+
const token = parsed?.token;
|
|
59
|
+
if (typeof token !== 'string' || token.trim().length === 0) {
|
|
60
|
+
return { token: undefined, source: 'none', warnings };
|
|
61
|
+
}
|
|
62
|
+
return { token: token.trim(), source: 'config-file', warnings };
|
|
63
|
+
}
|
|
64
|
+
/** The deployment to talk to. Every test overrides this to a local stub. */
|
|
65
|
+
export function resolveBaseUrl(env) {
|
|
66
|
+
const override = env[BASE_URL_ENV_VAR];
|
|
67
|
+
const chosen = typeof override === 'string' && override.trim().length > 0 ? override.trim() : DEFAULT_BASE_URL;
|
|
68
|
+
return chosen.replace(/\/+$/, '');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* An extra header for QA against a protected preview deployment, e.g.
|
|
72
|
+
* `PREDICTABLE_EXTRA_HEADER='x-vercel-protection-bypass: <secret>'`. It exists
|
|
73
|
+
* so the token-mode run against a preview needs no code change; it is never
|
|
74
|
+
* required against production.
|
|
75
|
+
*/
|
|
76
|
+
export const EXTRA_HEADER_ENV_VAR = 'PREDICTABLE_EXTRA_HEADER';
|
|
77
|
+
export function resolveExtraHeaders(env) {
|
|
78
|
+
const raw = env[EXTRA_HEADER_ENV_VAR];
|
|
79
|
+
if (typeof raw !== 'string' || raw.trim().length === 0)
|
|
80
|
+
return {};
|
|
81
|
+
const headers = {};
|
|
82
|
+
for (const pair of raw.split('\n')) {
|
|
83
|
+
const at = pair.indexOf(':');
|
|
84
|
+
if (at <= 0)
|
|
85
|
+
continue;
|
|
86
|
+
const name = pair.slice(0, at).trim();
|
|
87
|
+
const value = pair.slice(at + 1).trim();
|
|
88
|
+
if (name && value)
|
|
89
|
+
headers[name] = value;
|
|
90
|
+
}
|
|
91
|
+
return headers;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { CONFIG_DIR_NAME, CONFIG_FILE_NAME, TOKEN_ENV_VAR } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every message that could carry something the user typed, in one place.
|
|
4
|
+
*
|
|
5
|
+
* THE RULE (owner ruling, round 2). A diagnostic NEVER prints a value the user
|
|
6
|
+
* supplied on the command line. It prints the SHAPE — how many words, how many
|
|
7
|
+
* flags — and the command to run for the real answer. The reason is a
|
|
8
|
+
* credential: a caller who types `predictable --token agt_...` has already put
|
|
9
|
+
* a secret on a command line, and a CLI that answers `unknown command: agt_...`
|
|
10
|
+
* copies it into stderr, which in CI is a log file somebody keeps.
|
|
11
|
+
*
|
|
12
|
+
* WHY ONE MODULE. Ticket AC5's hygiene proof was a lint over help text, and a
|
|
13
|
+
* lint over text cannot see a runtime echo. The durable fence is that there is
|
|
14
|
+
* exactly ONE place a diagnostic string gets built from input, so a later
|
|
15
|
+
* branch cannot re-introduce an echo by writing its own template literal:
|
|
16
|
+
* `test/argv-hygiene.test.ts` then proves the whole set behaviorally, by
|
|
17
|
+
* spawning the shipped binary and reading both streams.
|
|
18
|
+
*
|
|
19
|
+
* WHAT MAY BE PRINTED. Flag names we declare are ours and are printed freely.
|
|
20
|
+
* A value is printed only through `hintFlags`, and only for the identifying
|
|
21
|
+
* flags a copy-pasteable next command needs — never for an unknown flag, an
|
|
22
|
+
* unknown command, or a leftover word, whose text is by definition whatever
|
|
23
|
+
* the caller typed.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Our own credential prefix, measured from `dashboard/src/middleware.ts`
|
|
27
|
+
* (`AGENT_TOKEN_PREFIX`): a minted token is `agt_` + 32 hex. It is here so the
|
|
28
|
+
* one place that may echo a value can still refuse to echo a credential that
|
|
29
|
+
* was typed into the wrong flag.
|
|
30
|
+
*/
|
|
31
|
+
export const CREDENTIAL_PREFIX = 'agt_';
|
|
32
|
+
/** What a value is replaced by when it must not be printed. */
|
|
33
|
+
export const REDACTED = '<redacted>';
|
|
34
|
+
function words(count) {
|
|
35
|
+
return `${count} word${count === 1 ? '' : 's'}`;
|
|
36
|
+
}
|
|
37
|
+
/** A value is safe to repeat back only when it is not one of our credentials. */
|
|
38
|
+
export function redactCredential(value) {
|
|
39
|
+
return value.startsWith(CREDENTIAL_PREFIX) ? REDACTED : value;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The command line named no command this CLI knows.
|
|
43
|
+
*
|
|
44
|
+
* The root help follows this line and lists every command, so naming the count
|
|
45
|
+
* rather than the words costs the caller nothing they cannot see on their own
|
|
46
|
+
* screen.
|
|
47
|
+
*/
|
|
48
|
+
export function unknownCommandLine(count) {
|
|
49
|
+
if (count === 0)
|
|
50
|
+
return 'unknown command; the commands this CLI knows are below.\n';
|
|
51
|
+
return `unknown command (${words(count)}); the commands this CLI knows are below.\n`;
|
|
52
|
+
}
|
|
53
|
+
/** Words left over after a command name. Commands take no positionals. */
|
|
54
|
+
export function unexpectedArgumentLine(command, count) {
|
|
55
|
+
return `unexpected argument after ${command} (${words(count)}); this command takes flags only.\n`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Flags this command does not declare.
|
|
59
|
+
*
|
|
60
|
+
* The NAMES are not printed: an unknown flag's name is whatever the caller
|
|
61
|
+
* typed, so `--agt_deadbeef` would echo a credential just as surely as a value
|
|
62
|
+
* would. `--help` below prints every flag the command does declare.
|
|
63
|
+
*/
|
|
64
|
+
export function unknownFlagLine(command, count) {
|
|
65
|
+
return `${count} unknown flag${count === 1 ? '' : 's'} for ${command}; it accepts only the flags in its --help.\n`;
|
|
66
|
+
}
|
|
67
|
+
/** The two sanctioned token channels, for a caller who put one in argv. */
|
|
68
|
+
export function tokenFlagRefusalLine() {
|
|
69
|
+
return (`there is no --token flag: set ${TOKEN_ENV_VAR}, or put {"token": "..."} in ` +
|
|
70
|
+
`~/${CONFIG_DIR_NAME}/${CONFIG_FILE_NAME}\n`);
|
|
71
|
+
}
|
|
72
|
+
/** Point the caller at the help that answers what they got wrong. */
|
|
73
|
+
export function runHelpLine(command) {
|
|
74
|
+
return `Run: predictable ${command ? `${command} ` : ''}--help\n`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The identifying flags a suggested next command has to repeat.
|
|
78
|
+
*
|
|
79
|
+
* This is the ONE place a value the caller typed is printed back, and the list
|
|
80
|
+
* is closed: a list, a column and a sequence id name WHICH records the next
|
|
81
|
+
* command acts on, and a next command missing them is not runnable. Anything
|
|
82
|
+
* carrying our credential prefix is redacted even here — a token typed into
|
|
83
|
+
* `--list` is still a token.
|
|
84
|
+
*/
|
|
85
|
+
const HINT_FLAGS = ['list', 'column', 'sequence'];
|
|
86
|
+
export function hintFlags(args) {
|
|
87
|
+
return HINT_FLAGS.filter((name) => args.flags.get(name))
|
|
88
|
+
.map((name) => ` --${name} ${redactCredential(args.flags.get(name))}`)
|
|
89
|
+
.join('');
|
|
90
|
+
}
|
|
91
|
+
/** After a preview: the exact command that spends against the minted quote. */
|
|
92
|
+
export function nextCommandHint(command, args, quoteId) {
|
|
93
|
+
return `Next: predictable ${command} --quote ${quoteId}${hintFlags(args)}\n`;
|
|
94
|
+
}
|
|
95
|
+
/** Before a paid call with no quote: the preview command that mints one. */
|
|
96
|
+
export function previewInstruction(command, args) {
|
|
97
|
+
return `Run: predictable ${command} --preview${hintFlags(args)} then re-run with --quote <id>. Nothing was sent.`;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEvC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAA;AAEpC,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;AACjD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAA;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,2DAA2D,CAAA;IACnF,OAAO,oBAAoB,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAA;AACtF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,KAAa;IACnE,OAAO,6BAA6B,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAA;AACnG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,OAAO,GAAG,KAAK,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,OAAO,8CAA8C,CAAA;AACpH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB;IAClC,OAAO,CACL,iCAAiC,aAAa,+BAA+B;QAC7E,KAAK,eAAe,IAAI,gBAAgB,IAAI,CAC7C,CAAA;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO,oBAAoB,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAA;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAA;AAE1D,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC;SACtE,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAgB,EAAE,OAAe;IAChF,OAAO,qBAAqB,OAAO,YAAY,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAA;AAC9E,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAAgB;IAClE,OAAO,oBAAoB,OAAO,aAAa,SAAS,CAAC,IAAI,CAAC,qDAAqD,CAAA;AACrH,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exit codes are part of the CLI's contract: a caller pipes `predictable` in a
|
|
3
|
+
* script and branches on the code. They are documented in README.md and
|
|
4
|
+
* asserted in `test/output.test.ts`.
|
|
5
|
+
*/
|
|
6
|
+
export const EXIT = {
|
|
7
|
+
OK: 0,
|
|
8
|
+
/** Bad flags, unknown command, missing required argument. */
|
|
9
|
+
USAGE: 1,
|
|
10
|
+
/** The server refused the credential: 401 or 403. */
|
|
11
|
+
AUTH: 2,
|
|
12
|
+
/** 429. The Retry-After the server sent is echoed on stderr. */
|
|
13
|
+
RATE_LIMITED: 3,
|
|
14
|
+
/** 5xx, an unreachable host, or a verb not available on this deployment. */
|
|
15
|
+
SERVER: 4,
|
|
16
|
+
/** A paid acting command was invoked without --quote. Nothing was sent. */
|
|
17
|
+
QUOTE_REQUIRED: 5,
|
|
18
|
+
};
|
|
19
|
+
/** An error that carries the exit code the process should end with. */
|
|
20
|
+
export class CliError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
detail;
|
|
23
|
+
constructor(code, message, detail) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'CliError';
|
|
26
|
+
this.code = code;
|
|
27
|
+
this.detail = detail;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,6DAA6D;IAC7D,KAAK,EAAE,CAAC;IACR,qDAAqD;IACrD,IAAI,EAAE,CAAC;IACP,gEAAgE;IAChE,YAAY,EAAE,CAAC;IACf,4EAA4E;IAC5E,MAAM,EAAE,CAAC;IACT,2EAA2E;IAC3E,cAAc,EAAE,CAAC;CACT,CAAA;AAIV,uEAAuE;AACvE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAU;IACd,MAAM,CAAoB;IAEnC,YAAY,IAAc,EAAE,OAAe,EAAE,MAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF"}
|