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
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The output contract.
|
|
3
|
+
*
|
|
4
|
+
* DEFAULT: line-oriented text on stdout — one record per line, tab-separated,
|
|
5
|
+
* with a STABLE COLUMN ORDER taken from the first record so `cut -f2` means the
|
|
6
|
+
* same thing on every line.
|
|
7
|
+
*
|
|
8
|
+
* --json: the server's body VERBATIM. Not re-serialized: a body is reprinted as
|
|
9
|
+
* the bytes that arrived, so `predictable whoami --json | jq` sees exactly what
|
|
10
|
+
* the API sent and a field this CLI does not model is not silently dropped
|
|
11
|
+
* (mutant M6). For a command that reads more than one route, the bodies are
|
|
12
|
+
* spliced into one JSON object keyed by route path — still by text, so each
|
|
13
|
+
* body is still verbatim inside it.
|
|
14
|
+
*
|
|
15
|
+
* Diagnostics — warnings, errors, hints — go to stderr, never stdout, so a
|
|
16
|
+
* pipeline never eats them as data.
|
|
17
|
+
*/
|
|
18
|
+
/** The JSON document `--json` prints for a set of route results. */
|
|
19
|
+
export function renderJson(results) {
|
|
20
|
+
if (results.length === 1)
|
|
21
|
+
return results[0].body.trimEnd();
|
|
22
|
+
const parts = results.map((r) => `${JSON.stringify(r.path)}: ${r.body.trim() || 'null'}`);
|
|
23
|
+
return `{\n ${parts.join(',\n ')}\n}`;
|
|
24
|
+
}
|
|
25
|
+
function isScalar(value) {
|
|
26
|
+
return value === null || ['string', 'number', 'boolean'].includes(typeof value);
|
|
27
|
+
}
|
|
28
|
+
function scalarText(value) {
|
|
29
|
+
if (value === null || value === undefined)
|
|
30
|
+
return '';
|
|
31
|
+
if (typeof value === 'string')
|
|
32
|
+
return value.replace(/[\t\n\r]+/g, ' ');
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
/** The first array-valued property of an object, which is the record list. */
|
|
36
|
+
function recordsOf(body) {
|
|
37
|
+
if (Array.isArray(body))
|
|
38
|
+
return body;
|
|
39
|
+
if (body === null || typeof body !== 'object')
|
|
40
|
+
return undefined;
|
|
41
|
+
for (const value of Object.values(body)) {
|
|
42
|
+
if (Array.isArray(value))
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
function columnsOf(records) {
|
|
48
|
+
const first = records.find((r) => r !== null && typeof r === 'object' && !Array.isArray(r));
|
|
49
|
+
if (!first)
|
|
50
|
+
return [];
|
|
51
|
+
return Object.entries(first)
|
|
52
|
+
.filter(([, v]) => isScalar(v))
|
|
53
|
+
.map(([k]) => k);
|
|
54
|
+
}
|
|
55
|
+
function renderRecord(record, columns) {
|
|
56
|
+
if (record === null || typeof record !== 'object' || Array.isArray(record)) {
|
|
57
|
+
return scalarText(record);
|
|
58
|
+
}
|
|
59
|
+
const row = record;
|
|
60
|
+
return columns.map((c) => scalarText(row[c])).join('\t');
|
|
61
|
+
}
|
|
62
|
+
/** One body as lines. Nested objects/arrays are summarized, never dumped. */
|
|
63
|
+
export function renderLines(body) {
|
|
64
|
+
let parsed;
|
|
65
|
+
try {
|
|
66
|
+
parsed = JSON.parse(body);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return body.split('\n').filter((l) => l.length > 0);
|
|
70
|
+
}
|
|
71
|
+
const records = recordsOf(parsed);
|
|
72
|
+
if (records && records.length > 0) {
|
|
73
|
+
const columns = columnsOf(records);
|
|
74
|
+
if (columns.length === 0)
|
|
75
|
+
return records.map((r) => scalarText(r));
|
|
76
|
+
return records.map((r) => renderRecord(r, columns));
|
|
77
|
+
}
|
|
78
|
+
if (records && records.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
if (parsed !== null && typeof parsed === 'object') {
|
|
81
|
+
return Object.entries(parsed).map(([key, value]) => {
|
|
82
|
+
if (isScalar(value))
|
|
83
|
+
return `${key}\t${scalarText(value)}`;
|
|
84
|
+
if (Array.isArray(value))
|
|
85
|
+
return `${key}\t[${value.length} items]`;
|
|
86
|
+
return `${key}\t${JSON.stringify(value)}`;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return [scalarText(parsed)];
|
|
90
|
+
}
|
|
91
|
+
/** The default rendering for a whole command: every route it read. */
|
|
92
|
+
export function renderText(results) {
|
|
93
|
+
const multi = results.length > 1;
|
|
94
|
+
const lines = [];
|
|
95
|
+
for (const result of results) {
|
|
96
|
+
for (const line of renderLines(result.body)) {
|
|
97
|
+
lines.push(multi ? `${result.label}\t${line}` : line);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return lines.join('\n');
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/parity.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Every command name the manifest says this CLI should have. */
|
|
2
|
+
export function expectedCommandSet(artifact) {
|
|
3
|
+
const expected = new Set();
|
|
4
|
+
for (const command of artifact.commands)
|
|
5
|
+
expected.add(command.command);
|
|
6
|
+
const topics = Array.isArray(artifact.guideTopics) ? artifact.guideTopics : [];
|
|
7
|
+
for (const topic of topics) {
|
|
8
|
+
if (typeof topic === 'string' && topic.length > 0)
|
|
9
|
+
expected.add(`guide ${topic}`);
|
|
10
|
+
}
|
|
11
|
+
return expected;
|
|
12
|
+
}
|
|
13
|
+
/** Set difference both ways. Zero drift means both lists are empty. */
|
|
14
|
+
export function parityDrift(artifact, registered) {
|
|
15
|
+
const expected = expectedCommandSet(artifact);
|
|
16
|
+
const actual = new Set(registered);
|
|
17
|
+
return {
|
|
18
|
+
missing: [...expected].filter((name) => !actual.has(name)).sort(),
|
|
19
|
+
extra: [...actual].filter((name) => !expected.has(name)).sort(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function describeDrift(drift) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (drift.missing.length > 0)
|
|
25
|
+
parts.push(`manifest verbs with no CLI command: ${drift.missing.join(', ')}`);
|
|
26
|
+
if (drift.extra.length > 0)
|
|
27
|
+
parts.push(`CLI commands with no manifest verb: ${drift.extra.join(', ')}`);
|
|
28
|
+
return parts.join('; ');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=parity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parity.js","sourceRoot":"","sources":["../src/parity.ts"],"names":[],"mappings":"AA4BA,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ;QAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,KAAK,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,WAAW,CAAC,QAAyB,EAAE,UAA6B;IAClF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;IAClC,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QACjE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;KAChE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,uCAAuC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3G,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,uCAAuC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { bundledSurface, surfaceGuideTopics } from './surface.js';
|
|
2
|
+
// ── Flag shorthands ────────────────────────────────────────────────────────
|
|
3
|
+
const LIST = { name: 'list', placeholder: '<uuid>', required: true, describe: 'The list (ICP) id.' };
|
|
4
|
+
const LIST_OPT = { ...LIST, required: false };
|
|
5
|
+
const COLUMN = { name: 'column', placeholder: '<uuid>', required: true, describe: 'The agent column id.' };
|
|
6
|
+
const SEQUENCE = { name: 'sequence', placeholder: '<uuid>', required: true, describe: 'The sequence id.' };
|
|
7
|
+
const BODY = {
|
|
8
|
+
name: 'body',
|
|
9
|
+
placeholder: '<json|->',
|
|
10
|
+
required: false,
|
|
11
|
+
describe: 'Request body as JSON, or - to read it from stdin.',
|
|
12
|
+
};
|
|
13
|
+
const OUT = {
|
|
14
|
+
name: 'out',
|
|
15
|
+
placeholder: '<dir>',
|
|
16
|
+
required: true,
|
|
17
|
+
describe: 'Directory to write the bundle into. Replaced if it exists.',
|
|
18
|
+
};
|
|
19
|
+
const PURPOSE = {
|
|
20
|
+
name: 'purpose',
|
|
21
|
+
placeholder: '<prospecting_activation|reporting_history>',
|
|
22
|
+
required: false,
|
|
23
|
+
describe: 'Export purpose. reporting_history bypasses suppression, deliberately.',
|
|
24
|
+
};
|
|
25
|
+
function q(name, key, describe, required = false) {
|
|
26
|
+
return { name, placeholder: '<value>', required, describe, query: key };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The flags every paid verb carries (ticket AC4, spec §5.2).
|
|
30
|
+
*
|
|
31
|
+
* They are appended by `buildRegistry` rather than repeated on five command
|
|
32
|
+
* definitions: the two-step is one rule, and a rule written five times is a rule
|
|
33
|
+
* that will one day be written four times.
|
|
34
|
+
*/
|
|
35
|
+
export const PAID_PARAMS = [
|
|
36
|
+
{
|
|
37
|
+
name: 'preview',
|
|
38
|
+
placeholder: '',
|
|
39
|
+
required: false,
|
|
40
|
+
boolean: true,
|
|
41
|
+
describe: 'Price the run and mint a quote. Spends nothing.',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'quote',
|
|
45
|
+
placeholder: '<uuid>',
|
|
46
|
+
required: false,
|
|
47
|
+
describe: 'The quote id from --preview. Required to act; this is what spends.',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'request-key',
|
|
51
|
+
placeholder: '<string>',
|
|
52
|
+
required: false,
|
|
53
|
+
describe: 'Idempotency key for the acting call. Defaults to a fresh uuid.',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
// ── The 50 verbs ───────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* The hand-declared command list.
|
|
59
|
+
*
|
|
60
|
+
* Exported so `test/parity.test.ts` can plant a rogue entry and register it
|
|
61
|
+
* THROUGH `buildRegistry` — the real registration path — rather than appending
|
|
62
|
+
* a name to an already-built list. A plant that hand-builds the registered set
|
|
63
|
+
* proves the comparison works; a plant that goes through the registry proves
|
|
64
|
+
* the thing being compared is the thing that ships.
|
|
65
|
+
*/
|
|
66
|
+
export const COMMAND_DEFS = [
|
|
67
|
+
// read pack
|
|
68
|
+
{ name: 'whoami', mode: 'read' },
|
|
69
|
+
{ name: 'lists list', mode: 'read' },
|
|
70
|
+
{ name: 'lists status', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
71
|
+
{ name: 'lists routing', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
72
|
+
{
|
|
73
|
+
name: 'candidates list',
|
|
74
|
+
mode: 'read',
|
|
75
|
+
bind: { id: 'list' },
|
|
76
|
+
params: [LIST, q('status', 'status', 'Filter to one candidate status.')],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'accounts detail',
|
|
80
|
+
mode: 'read',
|
|
81
|
+
bind: { id: 'list' },
|
|
82
|
+
params: [
|
|
83
|
+
LIST,
|
|
84
|
+
q('company', 'companyId', 'The company id (give this or --domain).'),
|
|
85
|
+
q('domain', 'domain', 'The company domain (give this or --company).'),
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{ name: 'accounts list', mode: 'read', bind: { icpId: 'list' }, params: [LIST] },
|
|
89
|
+
{ name: 'contacts staged', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
90
|
+
{ name: 'contacts list', mode: 'read', bind: { icpId: 'list' }, params: [LIST] },
|
|
91
|
+
{
|
|
92
|
+
name: 'contacts history',
|
|
93
|
+
mode: 'read',
|
|
94
|
+
bind: { id: 'contact' },
|
|
95
|
+
params: [
|
|
96
|
+
{ name: 'contact', placeholder: '<uuid>', required: true, describe: 'The contact id.' },
|
|
97
|
+
q('list', 'icp_id', 'The list (ICP) id the contact belongs to.', true),
|
|
98
|
+
],
|
|
99
|
+
plan: { 'GET /api/contact/[id]/fit-detail': { role: 'read', when: ['contact'] } },
|
|
100
|
+
},
|
|
101
|
+
{ name: 'dnc list', mode: 'read' },
|
|
102
|
+
{
|
|
103
|
+
name: 'dnc status',
|
|
104
|
+
mode: 'read',
|
|
105
|
+
bind: { id: 'import' },
|
|
106
|
+
params: [{ name: 'import', placeholder: '<uuid>', required: false, describe: 'Show one import job’s unresolved rows.' }],
|
|
107
|
+
plan: { 'GET /api/suppression-imports/[id]/unresolved': { role: 'read', when: ['import'] } },
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'runs list',
|
|
111
|
+
mode: 'read',
|
|
112
|
+
bind: { id: 'list', jobId: 'job' },
|
|
113
|
+
params: [LIST, { name: 'job', placeholder: '<uuid>', required: false, describe: 'Show one run in detail.' }],
|
|
114
|
+
plan: { 'GET /api/lists/[id]/exa-agent/runs/[jobId]': { role: 'read', when: ['job'] } },
|
|
115
|
+
},
|
|
116
|
+
{ name: 'source status', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
117
|
+
{ name: 'sequences list', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
118
|
+
{ name: 'sequences get', mode: 'read', bind: { id: 'list', seqId: 'sequence' }, params: [LIST, SEQUENCE] },
|
|
119
|
+
{ name: 'replies list', mode: 'read', bind: { icpId: 'list' }, params: [LIST] },
|
|
120
|
+
{
|
|
121
|
+
name: 'replies thread',
|
|
122
|
+
mode: 'read',
|
|
123
|
+
bind: { thread_id: 'thread' },
|
|
124
|
+
params: [{ name: 'thread', placeholder: '<id>', required: true, describe: 'The reply thread id.' }],
|
|
125
|
+
},
|
|
126
|
+
{ name: 'stats usage', mode: 'read' },
|
|
127
|
+
{ name: 'stats pipeline', mode: 'read', bind: { icpId: 'list' }, params: [LIST] },
|
|
128
|
+
{
|
|
129
|
+
name: 'campaigns instantly',
|
|
130
|
+
mode: 'read',
|
|
131
|
+
bind: { id: 'campaign' },
|
|
132
|
+
params: [{ name: 'campaign', placeholder: '<id>', required: false, describe: 'Show one campaign in detail.' }],
|
|
133
|
+
plan: { 'GET /api/instantly-campaigns/[id]/details': { role: 'read', when: ['campaign'] } },
|
|
134
|
+
},
|
|
135
|
+
{ name: 'export accounts', mode: 'read', bind: { icpId: 'list' }, params: [LIST] },
|
|
136
|
+
{
|
|
137
|
+
// `bundle`, not `read`: this verb's six reads are not printed, they are
|
|
138
|
+
// WRITTEN — seven files to a directory (spec §3.4). Running it through the
|
|
139
|
+
// read path would emit six response bodies to stdout and produce no bundle.
|
|
140
|
+
name: 'export campaign',
|
|
141
|
+
mode: 'bundle',
|
|
142
|
+
bind: { icpId: 'list', id: 'list', seqId: 'sequence' },
|
|
143
|
+
params: [LIST, OUT, PURPOSE, { ...SEQUENCE, required: false }],
|
|
144
|
+
},
|
|
145
|
+
{ name: 'activity tail', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
146
|
+
// build pack
|
|
147
|
+
{ name: 'lists create', mode: 'action', params: [BODY] },
|
|
148
|
+
{ name: 'search estimate', mode: 'read', bind: { id: 'list' }, params: [LIST] },
|
|
149
|
+
{ name: 'search run', mode: 'paid', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
150
|
+
{ name: 'alumni estimate', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
151
|
+
{ name: 'alumni pull', mode: 'paid', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
152
|
+
{
|
|
153
|
+
name: 'columns manage',
|
|
154
|
+
mode: 'action',
|
|
155
|
+
bind: { id: 'list', columnId: 'column' },
|
|
156
|
+
params: [LIST, { ...COLUMN, required: false }, BODY],
|
|
157
|
+
defaultAction: 'list',
|
|
158
|
+
plan: {
|
|
159
|
+
'GET /api/lists/[id]/exa-agent/columns': { role: 'action', action: 'list' },
|
|
160
|
+
'POST /api/lists/[id]/exa-agent/columns': { role: 'action', action: 'create' },
|
|
161
|
+
'PATCH /api/lists/[id]/exa-agent/columns/[columnId]': { role: 'action', action: 'update' },
|
|
162
|
+
'DELETE /api/lists/[id]/exa-agent/columns/[columnId]': { role: 'action', action: 'delete' },
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'columns assist',
|
|
167
|
+
mode: 'action',
|
|
168
|
+
bind: { id: 'list' },
|
|
169
|
+
params: [LIST, BODY],
|
|
170
|
+
defaultAction: 'prompt',
|
|
171
|
+
plan: {
|
|
172
|
+
'POST /api/lists/[id]/exa-agent/column-prompt': { role: 'action', action: 'prompt' },
|
|
173
|
+
'POST /api/lists/[id]/exa-agent/column-type': { role: 'action', action: 'type' },
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
{ name: 'columns fill', mode: 'paid', bind: { id: 'list', columnId: 'column' }, params: [LIST, COLUMN, BODY] },
|
|
177
|
+
{
|
|
178
|
+
name: 'contacts source',
|
|
179
|
+
mode: 'paid',
|
|
180
|
+
bind: { id: 'list' },
|
|
181
|
+
params: [LIST, BODY],
|
|
182
|
+
plan: {
|
|
183
|
+
'POST /api/lists/[id]/exa-agent/contact-source/retry': { role: 'action', action: 'retry' },
|
|
184
|
+
'POST /api/lists/[id]/exa-agent/contact-source/reset': { role: 'action', action: 'reset' },
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{ name: 'emails enrich', mode: 'paid', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
188
|
+
{
|
|
189
|
+
name: 'import csv',
|
|
190
|
+
mode: 'action',
|
|
191
|
+
bind: { sessionId: 'session' },
|
|
192
|
+
params: [
|
|
193
|
+
{ name: 'session', placeholder: '<uuid>', required: false, describe: 'The import session id.' },
|
|
194
|
+
BODY,
|
|
195
|
+
],
|
|
196
|
+
defaultAction: 'create',
|
|
197
|
+
plan: {
|
|
198
|
+
'POST /api/agent/import-sessions': { role: 'action', action: 'create' },
|
|
199
|
+
'GET /api/agent/import-sessions/[sessionId]': { role: 'action', action: 'show' },
|
|
200
|
+
'POST /api/agent/import-sessions/[sessionId]/rows': { role: 'action', action: 'rows' },
|
|
201
|
+
'POST /api/agent/import-sessions/[sessionId]/commit': { role: 'action', action: 'commit' },
|
|
202
|
+
'POST /api/agent/import-sessions/[sessionId]/release': { role: 'action', action: 'release' },
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'dnc add',
|
|
207
|
+
mode: 'action',
|
|
208
|
+
params: [BODY],
|
|
209
|
+
defaultAction: 'organizations',
|
|
210
|
+
plan: {
|
|
211
|
+
'POST /api/organization-suppressions': { role: 'action', action: 'organizations' },
|
|
212
|
+
'PATCH /api/organization-suppressions': { role: 'action', action: 'organizations-update' },
|
|
213
|
+
'POST /api/person-suppressions': { role: 'action', action: 'people' },
|
|
214
|
+
'PATCH /api/person-suppressions': { role: 'action', action: 'people-update' },
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'dnc import',
|
|
219
|
+
mode: 'action',
|
|
220
|
+
bind: { id: 'import' },
|
|
221
|
+
params: [{ name: 'import', placeholder: '<uuid>', required: false, describe: 'The import job id, for --action apply.' }, BODY],
|
|
222
|
+
defaultAction: 'create',
|
|
223
|
+
plan: {
|
|
224
|
+
'POST /api/suppression-imports': { role: 'action', action: 'create' },
|
|
225
|
+
'POST /api/suppression-imports/[id]': { role: 'action', action: 'apply' },
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
{ name: 'accounts verdict', mode: 'action', bind: { icpId: 'list' }, params: [LIST, BODY] },
|
|
229
|
+
{ name: 'candidates discard', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
230
|
+
// route pack
|
|
231
|
+
{ name: 'contacts route', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
232
|
+
{ name: 'contacts enroll', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
233
|
+
{ name: 'push run', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
234
|
+
{ name: 'push instantly', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
235
|
+
{ name: 'push ctd', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
236
|
+
{
|
|
237
|
+
name: 'destination map',
|
|
238
|
+
mode: 'action',
|
|
239
|
+
bind: { id: 'list' },
|
|
240
|
+
params: [LIST, BODY],
|
|
241
|
+
defaultAction: 'show',
|
|
242
|
+
plan: {
|
|
243
|
+
'GET /api/lists/[id]/exa-agent/destination-map': { role: 'action', action: 'show' },
|
|
244
|
+
'PUT /api/lists/[id]/exa-agent/destination-map': { role: 'action', action: 'set' },
|
|
245
|
+
'DELETE /api/lists/[id]/exa-agent/destination-map': { role: 'action', action: 'clear' },
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: 'autoroute rules',
|
|
250
|
+
mode: 'action',
|
|
251
|
+
bind: { id: 'list' },
|
|
252
|
+
params: [LIST, BODY],
|
|
253
|
+
defaultAction: 'show',
|
|
254
|
+
plan: {
|
|
255
|
+
'GET /api/lists/[id]/exa-agent/auto-route-rules': { role: 'action', action: 'show' },
|
|
256
|
+
'POST /api/lists/[id]/exa-agent/auto-route-rules': { role: 'action', action: 'create' },
|
|
257
|
+
'PATCH /api/lists/[id]/exa-agent/auto-route-rules': { role: 'action', action: 'update' },
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
{ name: 'sequences create', mode: 'action', bind: { id: 'list' }, params: [LIST, BODY] },
|
|
261
|
+
{ name: 'sequences edit', mode: 'action', bind: { id: 'list', seqId: 'sequence' }, params: [LIST, SEQUENCE, BODY] },
|
|
262
|
+
{ name: 'sequences publish', mode: 'action', bind: { id: 'list', seqId: 'sequence' }, params: [LIST, SEQUENCE, BODY] },
|
|
263
|
+
{
|
|
264
|
+
name: 'sequences lifecycle',
|
|
265
|
+
mode: 'action',
|
|
266
|
+
bind: { id: 'list', seqId: 'sequence', enrollmentId: 'enrollment' },
|
|
267
|
+
params: [
|
|
268
|
+
LIST,
|
|
269
|
+
SEQUENCE,
|
|
270
|
+
{ name: 'enrollment', placeholder: '<uuid>', required: false, describe: 'The enrollment id, for --action unenroll.' },
|
|
271
|
+
BODY,
|
|
272
|
+
],
|
|
273
|
+
defaultAction: 'pause',
|
|
274
|
+
plan: {
|
|
275
|
+
'POST /api/icps/[id]/sequences/[seqId]/clone': { role: 'action', action: 'clone' },
|
|
276
|
+
'POST /api/icps/[id]/sequences/[seqId]/pause': { role: 'action', action: 'pause' },
|
|
277
|
+
'POST /api/icps/[id]/sequences/[seqId]/resume': { role: 'action', action: 'resume' },
|
|
278
|
+
'POST /api/icps/[id]/sequences/[seqId]/stop': { role: 'action', action: 'stop' },
|
|
279
|
+
'DELETE /api/icps/[id]/sequences/[seqId]/enrollments/[enrollmentId]': { role: 'action', action: 'unenroll' },
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
];
|
|
283
|
+
/** Every command's flag bindings, keyed by command name. */
|
|
284
|
+
const BIND_BY_COMMAND = new Map(COMMAND_DEFS.map((d) => [d.name, d.bind ?? {}]));
|
|
285
|
+
export function pathBindings(command) {
|
|
286
|
+
return BIND_BY_COMMAND.get(command) ?? {};
|
|
287
|
+
}
|
|
288
|
+
/** The default plan for a route a command's `plan` does not name. */
|
|
289
|
+
function defaultPlanFor(def, route, index) {
|
|
290
|
+
// A bundle's routes are all reads; the verb core decides which to call and in
|
|
291
|
+
// what order, so they carry no per-route role beyond that.
|
|
292
|
+
if (def.mode === 'bundle')
|
|
293
|
+
return { role: 'read' };
|
|
294
|
+
if (def.mode === 'paid') {
|
|
295
|
+
// A paid verb's routes are the preview then the acting call (spec §5.2).
|
|
296
|
+
if (route.path.endsWith('/preview'))
|
|
297
|
+
return { role: 'preview' };
|
|
298
|
+
return { role: 'act' };
|
|
299
|
+
}
|
|
300
|
+
if (def.mode === 'read')
|
|
301
|
+
return { role: 'read' };
|
|
302
|
+
const tail = route.path.split('/').filter((s) => s && !s.startsWith('[')).pop() ?? `action-${index}`;
|
|
303
|
+
return { role: 'action', action: def.defaultAction ?? tail };
|
|
304
|
+
}
|
|
305
|
+
function planRoutes(def, routes) {
|
|
306
|
+
return routes.map((route, index) => {
|
|
307
|
+
const named = def.plan?.[`${route.method} ${route.path}`];
|
|
308
|
+
const entry = named ?? defaultPlanFor(def, route, index);
|
|
309
|
+
return { ...route, ...entry };
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* The `guide <topic>` commands.
|
|
314
|
+
*
|
|
315
|
+
* `guide` has no verb of its own (v-fix 6) — it reads the served manifest's
|
|
316
|
+
* guidance layer. Empty for an artifact with no topics, which is what a CLI
|
|
317
|
+
* built before T15 (ga-mfacl.17) carries; `test/parity.test.ts` keeps that
|
|
318
|
+
* case live so the derivation cannot decay into a hard-coded topic name.
|
|
319
|
+
*/
|
|
320
|
+
export function guideCommands(artifact) {
|
|
321
|
+
return surfaceGuideTopics(artifact).map((topic) => ({
|
|
322
|
+
name: `guide ${topic}`,
|
|
323
|
+
verb: null,
|
|
324
|
+
mode: 'guide',
|
|
325
|
+
pack: 'guide',
|
|
326
|
+
summary: `Coaching notes for ${topic}, served by the deployment's manifest.`,
|
|
327
|
+
routes: [{ method: 'GET', path: '/api/agent/manifest', role: 'read' }],
|
|
328
|
+
params: [],
|
|
329
|
+
topic,
|
|
330
|
+
}));
|
|
331
|
+
}
|
|
332
|
+
/** Every command this CLI registers, for the artifact given. */
|
|
333
|
+
export function buildRegistry(artifact = bundledSurface(), defs = COMMAND_DEFS) {
|
|
334
|
+
const byName = new Map(artifact.commands.map((c) => [c.command, c]));
|
|
335
|
+
const verbCommands = defs.map((def) => {
|
|
336
|
+
const entry = byName.get(def.name);
|
|
337
|
+
return {
|
|
338
|
+
name: def.name,
|
|
339
|
+
verb: entry?.verb ?? null,
|
|
340
|
+
mode: def.mode,
|
|
341
|
+
pack: entry?.pack ?? 'unknown',
|
|
342
|
+
summary: entry?.summary ?? '',
|
|
343
|
+
routes: planRoutes(def, entry?.routes ?? []),
|
|
344
|
+
params: [...(def.params ?? []), ...(def.mode === 'paid' ? PAID_PARAMS : [])],
|
|
345
|
+
...(def.defaultAction ? { defaultAction: def.defaultAction } : {}),
|
|
346
|
+
// FROM THE ARTIFACT, like the summary and the routes — never declared
|
|
347
|
+
// here. AC2's parity assertion is that the CLI's coaching IS the
|
|
348
|
+
// manifest's; a hand-written copy in this file would be the drift that
|
|
349
|
+
// assertion exists to catch.
|
|
350
|
+
...(entry?.guidance !== undefined ? { guidance: entry.guidance } : {}),
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
return [...verbCommands, ...guideCommands(artifact)];
|
|
354
|
+
}
|
|
355
|
+
/** The registered command NAMES — the parity guard's right-hand side. */
|
|
356
|
+
export function registeredCommandNames(artifact = bundledSurface(), defs = COMMAND_DEFS) {
|
|
357
|
+
return buildRegistry(artifact, defs).map((c) => c.name);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { parseArgs } from './args.js';
|
|
2
|
+
import { executeCommand } from './commands/execute.js';
|
|
3
|
+
import { resolveBaseUrl, resolveExtraHeaders, resolveToken } from './config.js';
|
|
4
|
+
import { runHelpLine, tokenFlagRefusalLine, unexpectedArgumentLine, unknownCommandLine, unknownFlagLine, } from './diagnostics.js';
|
|
5
|
+
import { CliError, EXIT } from './errors.js';
|
|
6
|
+
import { renderCommandHelp, renderRootHelp } from './help.js';
|
|
7
|
+
import { buildRegistry } from './registry.js';
|
|
8
|
+
import { bundledSurface } from './surface.js';
|
|
9
|
+
import { packageVersion, versionReport } from './version.js';
|
|
10
|
+
/**
|
|
11
|
+
* One entry point for the process and for the tests.
|
|
12
|
+
*
|
|
13
|
+
* Everything the CLI touches — argv, the environment, the home directory, the
|
|
14
|
+
* three streams — arrives as arguments, so a test drives a whole command
|
|
15
|
+
* in-process and reads exactly what a user would see. That is what lets AC4's
|
|
16
|
+
* "no POST fired" be an assertion about the real code path rather than about a
|
|
17
|
+
* mock of it.
|
|
18
|
+
*/
|
|
19
|
+
export async function run(io) {
|
|
20
|
+
const registry = buildRegistry();
|
|
21
|
+
const names = registry.map((c) => c.name);
|
|
22
|
+
const args = parseArgs(io.argv, names);
|
|
23
|
+
// BEFORE EVERY BRANCH THAT CAN EXIT (owner ruling, round 2). A --token
|
|
24
|
+
// anywhere on the command line is refused by name — not by the per-command
|
|
25
|
+
// unknown-flag check, which `--version`, `--help` and an unknown command all
|
|
26
|
+
// return before reaching. Parse order must not be able to skip the refusal,
|
|
27
|
+
// because a caller who was silently ignored believes they authenticated.
|
|
28
|
+
if (args.flags.has('token') || args.booleans.has('token')) {
|
|
29
|
+
io.stderr(tokenFlagRefusalLine());
|
|
30
|
+
return EXIT.USAGE;
|
|
31
|
+
}
|
|
32
|
+
const resolution = resolveToken({ env: io.env, ...(io.home !== undefined ? { home: io.home } : {}) });
|
|
33
|
+
for (const warning of resolution.warnings)
|
|
34
|
+
io.stderr(`warning: ${warning}\n`);
|
|
35
|
+
const ctx = {
|
|
36
|
+
baseUrl: resolveBaseUrl(io.env),
|
|
37
|
+
token: resolution.token,
|
|
38
|
+
extraHeaders: resolveExtraHeaders(io.env),
|
|
39
|
+
warn: (message) => io.stderr(`warning: ${message}\n`),
|
|
40
|
+
};
|
|
41
|
+
if (args.booleans.has('version') && args.command === '') {
|
|
42
|
+
const report = await versionReport(ctx);
|
|
43
|
+
io.stdout(`${report.lines.join('\n')}\n`);
|
|
44
|
+
for (const warning of report.warnings)
|
|
45
|
+
io.stderr(`warning: ${warning}\n`);
|
|
46
|
+
return EXIT.OK;
|
|
47
|
+
}
|
|
48
|
+
if (args.command === '') {
|
|
49
|
+
const help = renderRootHelp(registry, packageVersion(), bundledSurface().version);
|
|
50
|
+
if (args.booleans.has('help') || io.argv.length === 0) {
|
|
51
|
+
io.stdout(`${help}\n`);
|
|
52
|
+
return EXIT.OK;
|
|
53
|
+
}
|
|
54
|
+
// The count comes from the PARSED words, not from a re-filter of argv: a
|
|
55
|
+
// value that belongs to a flag is not a command word.
|
|
56
|
+
io.stderr(unknownCommandLine(args.rest.length));
|
|
57
|
+
io.stderr(`${help}\n`);
|
|
58
|
+
return EXIT.USAGE;
|
|
59
|
+
}
|
|
60
|
+
const spec = registry.find((c) => c.name === args.command);
|
|
61
|
+
if (args.booleans.has('help')) {
|
|
62
|
+
io.stdout(`${renderCommandHelp(spec)}\n`);
|
|
63
|
+
return EXIT.OK;
|
|
64
|
+
}
|
|
65
|
+
const unknown = unknownFlags(spec, args);
|
|
66
|
+
if (unknown.length > 0) {
|
|
67
|
+
io.stderr(unknownFlagLine(spec.name, unknown.length));
|
|
68
|
+
io.stderr(runHelpLine(spec.name));
|
|
69
|
+
return EXIT.USAGE;
|
|
70
|
+
}
|
|
71
|
+
if (args.rest.length > 0) {
|
|
72
|
+
io.stderr(unexpectedArgumentLine(spec.name, args.rest.length));
|
|
73
|
+
io.stderr(runHelpLine(spec.name));
|
|
74
|
+
return EXIT.USAGE;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
// io.env, NOT process.env: everything the CLI reads arrives as an argument,
|
|
78
|
+
// which is what lets a test drive a whole command in-process with a bare
|
|
79
|
+
// environment. The bundle's envelope caps are read from here.
|
|
80
|
+
await executeCommand(ctx, spec, args, io, io.env);
|
|
81
|
+
return EXIT.OK;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof CliError) {
|
|
85
|
+
io.stderr(`${error.message}\n`);
|
|
86
|
+
if (error.detail)
|
|
87
|
+
io.stderr(`${error.detail}\n`);
|
|
88
|
+
return error.code;
|
|
89
|
+
}
|
|
90
|
+
io.stderr(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
91
|
+
return EXIT.SERVER;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Flags every command accepts regardless of its own parameters. */
|
|
95
|
+
const GLOBAL_FLAGS = new Set(['json', 'help', 'version']);
|
|
96
|
+
function unknownFlags(spec, args) {
|
|
97
|
+
const allowed = new Set([...GLOBAL_FLAGS, ...spec.params.map((p) => p.name)]);
|
|
98
|
+
if (spec.routes.some((r) => r.action))
|
|
99
|
+
allowed.add('action');
|
|
100
|
+
return [...args.flags.keys(), ...args.booleans].filter((name) => !allowed.has(name));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=run.js.map
|