@solidnumber/cli 2.3.2 → 2.4.2

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
@@ -2,7 +2,7 @@
2
2
 
3
3
  Run an AI-powered business from your terminal.
4
4
  <!-- AUTO-NUMBERS: do not edit by hand; updated by scripts/sync-marketing-numbers.ts -->
5
- 98 top-level commands, 500+ subcommands, 52 industries, 116 AI agents. One CLI.
5
+ 101 top-level commands, 600+ subcommands, 52 industries, 116 AI agents. One CLI.
6
6
 
7
7
  **v2.2.0** — magic-link install + Homebrew + Scoop. Logged-in dashboard
8
8
  users mint a single-use `ist_*` token, paste one command, CLI is
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Bids commands for Solid CLI.
3
+ *
4
+ * Wraps the `/api/v1/bids/` REST surface so AI agents (and humans) can
5
+ * drive the photo → AI-drafted bid pipeline from the terminal:
6
+ *
7
+ * solid bids list [--status ready] [--limit 50] [--json]
8
+ * solid bids show <id> [--json]
9
+ * solid bids upload <file...> [--note "..."] [--contact <id>]
10
+ * solid bids approve <id>
11
+ * solid bids reject <id> [--reason "..."]
12
+ * solid bids reanalyze <id>
13
+ *
14
+ * JSON-first per CLI contract — every subcommand exits with structured
15
+ * output when `--json` (or program-wide `--output-file`) is set.
16
+ */
17
+ import { Command } from 'commander';
18
+ export declare const bidsCommand: Command;
19
+ //# sourceMappingURL=bids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bids.d.ts","sourceRoot":"","sources":["../../src/commands/bids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,eAAO,MAAM,WAAW,SACkD,CAAC"}
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ /**
3
+ * Bids commands for Solid CLI.
4
+ *
5
+ * Wraps the `/api/v1/bids/` REST surface so AI agents (and humans) can
6
+ * drive the photo → AI-drafted bid pipeline from the terminal:
7
+ *
8
+ * solid bids list [--status ready] [--limit 50] [--json]
9
+ * solid bids show <id> [--json]
10
+ * solid bids upload <file...> [--note "..."] [--contact <id>]
11
+ * solid bids approve <id>
12
+ * solid bids reject <id> [--reason "..."]
13
+ * solid bids reanalyze <id>
14
+ *
15
+ * JSON-first per CLI contract — every subcommand exits with structured
16
+ * output when `--json` (or program-wide `--output-file`) is set.
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ var __importDefault = (this && this.__importDefault) || function (mod) {
52
+ return (mod && mod.__esModule) ? mod : { "default": mod };
53
+ };
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.bidsCommand = void 0;
56
+ const commander_1 = require("commander");
57
+ const fs = __importStar(require("fs"));
58
+ const path = __importStar(require("path"));
59
+ const form_data_1 = __importDefault(require("form-data"));
60
+ const chalk_1 = __importDefault(require("chalk"));
61
+ const ora_1 = __importDefault(require("ora"));
62
+ const config_1 = require("../lib/config");
63
+ const api_client_1 = require("../lib/api-client");
64
+ const json_output_1 = require("../lib/json-output");
65
+ function requireAuth() {
66
+ if (!config_1.config.isLoggedIn()) {
67
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
68
+ process.exit(1);
69
+ }
70
+ }
71
+ function fmtMoney(n) {
72
+ if (n === null || n === undefined)
73
+ return '—';
74
+ const num = typeof n === 'string' ? parseFloat(n) : n;
75
+ if (Number.isNaN(num))
76
+ return '—';
77
+ return `$${num.toFixed(2)}`;
78
+ }
79
+ const STATUS_COLOR = {
80
+ pending: chalk_1.default.gray,
81
+ analyzing: chalk_1.default.yellow,
82
+ ready: chalk_1.default.green,
83
+ finalized: chalk_1.default.blue,
84
+ rejected: chalk_1.default.gray,
85
+ failed: chalk_1.default.red,
86
+ };
87
+ exports.bidsCommand = new commander_1.Command('bids')
88
+ .description('AI-drafted bids from photos (intake → analyze → approve)');
89
+ // ── list ──────────────────────────────────────────────────────────────────
90
+ {
91
+ const { withListFlags } = require('../lib/command-kit');
92
+ const listCmd = exports.bidsCommand
93
+ .command('list')
94
+ .alias('ls')
95
+ .description('List bid intakes (newest first)')
96
+ .option('--status <status...>', 'Filter by status (pending, analyzing, ready, finalized, rejected, failed)');
97
+ withListFlags(listCmd);
98
+ listCmd.action(async (opts) => {
99
+ const { runListCommand } = await Promise.resolve().then(() => __importStar(require('../lib/command-kit')));
100
+ await runListCommand(opts, {
101
+ spinnerText: 'Loading bid inbox...',
102
+ errorText: 'Failed to load bid inbox',
103
+ fetch: async (offset, limit) => {
104
+ const params = { limit };
105
+ if (opts.status && opts.status.length)
106
+ params.statuses = opts.status;
107
+ const r = await api_client_1.apiClient.get('/api/v1/bids/intakes', { params });
108
+ // Endpoint returns a bare list — wrap it so command-kit handles it.
109
+ return Array.isArray(r.data) ? { items: r.data } : r.data;
110
+ },
111
+ extract: (page) => {
112
+ const d = page;
113
+ return (d.items || []);
114
+ },
115
+ render: (rows) => {
116
+ if (!rows.length) {
117
+ console.log(chalk_1.default.dim(' No bid intakes found.'));
118
+ return;
119
+ }
120
+ console.log('');
121
+ for (const r of rows) {
122
+ const status = String(r.status || 'pending');
123
+ const c = STATUS_COLOR[status] || chalk_1.default.white;
124
+ const conf = r.confidence_score !== null && r.confidence_score !== undefined
125
+ ? `${Math.round(Number(r.confidence_score) * 100)}%`
126
+ : '—';
127
+ const summary = r.scene_summary || r.customer_message || chalk_1.default.dim('(awaiting analysis)');
128
+ const id = chalk_1.default.bold(`#${String(r.id)}`);
129
+ console.log(` ${id} ${c(status.padEnd(10))} conf:${conf.padEnd(5)} src:${String(r.source).padEnd(6)} ${String(summary).slice(0, 80)}`);
130
+ }
131
+ },
132
+ });
133
+ });
134
+ }
135
+ // ── show ──────────────────────────────────────────────────────────────────
136
+ exports.bidsCommand
137
+ .command('show <id>')
138
+ .description('Show a single bid intake with photos + draft proposal')
139
+ .option('--json', 'Output as JSON')
140
+ .action(async (id, options) => {
141
+ requireAuth();
142
+ const spinner = (0, ora_1.default)(`Loading bid #${id}...`).start();
143
+ try {
144
+ const r = await api_client_1.apiClient.get(`/api/v1/bids/intakes/${id}`);
145
+ const intake = r.data;
146
+ if ((0, json_output_1.isJsonOutput)(options)) {
147
+ spinner.stop();
148
+ console.log(JSON.stringify(intake, null, 2));
149
+ return;
150
+ }
151
+ const status = String(intake.status || 'pending');
152
+ const c = STATUS_COLOR[status] || chalk_1.default.white;
153
+ spinner.succeed(chalk_1.default.green(`Bid #${intake.id} — ${c(status)}`));
154
+ console.log('');
155
+ console.log(` ${chalk_1.default.bold('Source:')} ${intake.source}`);
156
+ if (intake.confidence_score !== null && intake.confidence_score !== undefined) {
157
+ console.log(` ${chalk_1.default.bold('Confidence:')} ${Math.round(intake.confidence_score * 100)}%`);
158
+ }
159
+ if (intake.scene_summary) {
160
+ console.log(` ${chalk_1.default.bold('Scene:')} ${intake.scene_summary}`);
161
+ }
162
+ if (intake.customer_message) {
163
+ console.log(` ${chalk_1.default.bold('Customer:')} "${intake.customer_message}"`);
164
+ }
165
+ if (intake.warnings && intake.warnings.length > 0) {
166
+ console.log('');
167
+ console.log(` ${chalk_1.default.bold('Warnings:')}`);
168
+ for (const w of intake.warnings)
169
+ console.log(` • ${chalk_1.default.yellow(w)}`);
170
+ }
171
+ if (intake.media && intake.media.length > 0) {
172
+ console.log('');
173
+ console.log(` ${chalk_1.default.bold('Photos:')}`);
174
+ for (const m of intake.media) {
175
+ console.log(` • doc#${m.document_id} ${m.filename} (${m.mime_type || 'image'})`);
176
+ }
177
+ }
178
+ if (intake.proposal) {
179
+ const p = intake.proposal;
180
+ console.log('');
181
+ console.log(` ${chalk_1.default.bold('Draft Bid:')} ${p.document_number || '#' + p.id} — ${chalk_1.default.dim(p.status)}`);
182
+ if (p.title)
183
+ console.log(` ${p.title}`);
184
+ if (p.items && p.items.length > 0) {
185
+ for (const it of p.items) {
186
+ const total = fmtMoney(it.total_price);
187
+ console.log(` ${chalk_1.default.dim('•')} ${it.name} — ${it.quantity} ${it.unit || ''} × ${fmtMoney(it.unit_price)} = ${chalk_1.default.green(total)}`);
188
+ }
189
+ }
190
+ if (p.total_amount !== null && p.total_amount !== undefined) {
191
+ console.log(` ${chalk_1.default.bold('Total:')} ${chalk_1.default.green(fmtMoney(p.total_amount))}`);
192
+ }
193
+ }
194
+ if (intake.error_message) {
195
+ console.log('');
196
+ console.log(chalk_1.default.red(` Error: ${intake.error_message}`));
197
+ }
198
+ }
199
+ catch (error) {
200
+ spinner.fail(chalk_1.default.red(`Failed to load bid #${id}`));
201
+ console.error(chalk_1.default.red(` ${(0, api_client_1.handleApiError)(error).message}`));
202
+ process.exit(1);
203
+ }
204
+ });
205
+ // ── upload ────────────────────────────────────────────────────────────────
206
+ exports.bidsCommand
207
+ .command('upload <files...>')
208
+ .description('Upload one or more photos for AI analysis (max 5, 10 MB each)')
209
+ .option('--note <text>', 'Customer note / context for the bid')
210
+ .option('--contact <id>', 'Link to a CRM contact')
211
+ .option('--json', 'Output as JSON')
212
+ .action(async (files, options) => {
213
+ requireAuth();
214
+ if (files.length === 0) {
215
+ console.error(chalk_1.default.red('Provide at least one photo path.'));
216
+ process.exit(1);
217
+ }
218
+ if (files.length > 5) {
219
+ console.error(chalk_1.default.red('Max 5 photos per intake.'));
220
+ process.exit(1);
221
+ }
222
+ for (const f of files) {
223
+ if (!fs.existsSync(f)) {
224
+ console.error(chalk_1.default.red(`File not found: ${f}`));
225
+ process.exit(1);
226
+ }
227
+ const sizeMB = fs.statSync(f).size / 1024 / 1024;
228
+ if (sizeMB > 10) {
229
+ console.error(chalk_1.default.red(`${f} is ${sizeMB.toFixed(1)} MB — over the 10 MB cap.`));
230
+ process.exit(1);
231
+ }
232
+ }
233
+ const spinner = (0, ora_1.default)(`Uploading ${files.length} photo${files.length === 1 ? '' : 's'}...`).start();
234
+ try {
235
+ const fd = new form_data_1.default();
236
+ for (const f of files) {
237
+ fd.append('files', fs.createReadStream(f), { filename: path.basename(f) });
238
+ }
239
+ if (options.note)
240
+ fd.append('customer_message', options.note);
241
+ if (options.contact)
242
+ fd.append('contact_id', String(options.contact));
243
+ // apiClient.post takes 2 args; FormData headers are auto-set by axios
244
+ // through its multipart adapter. Body is ≤ 50 MB (5 × 10 MB caps),
245
+ // well within axios's default ceiling.
246
+ const r = await api_client_1.apiClient.post('/api/v1/bids/intake/web', fd);
247
+ const intake = r.data;
248
+ if ((0, json_output_1.isJsonOutput)(options)) {
249
+ spinner.stop();
250
+ console.log(JSON.stringify(intake, null, 2));
251
+ return;
252
+ }
253
+ spinner.succeed(chalk_1.default.green(`Bid intake #${intake.id} created — AI analyzing now`));
254
+ console.log('');
255
+ console.log(chalk_1.default.dim(` Run \`solid bids show ${intake.id}\` in ~10s to see the draft.`));
256
+ }
257
+ catch (error) {
258
+ spinner.fail(chalk_1.default.red('Upload failed'));
259
+ console.error(chalk_1.default.red(` ${(0, api_client_1.handleApiError)(error).message}`));
260
+ process.exit(1);
261
+ }
262
+ });
263
+ // ── approve / reject / reanalyze ─────────────────────────────────────────
264
+ function makeStateChange(verb) {
265
+ const path = verb === 'approve'
266
+ ? '/api/v1/bids/intakes/:id/finalize'
267
+ : verb === 'reject'
268
+ ? '/api/v1/bids/intakes/:id/reject'
269
+ : '/api/v1/bids/intakes/:id/reanalyze';
270
+ const cmd = exports.bidsCommand
271
+ .command(`${verb} <id>`)
272
+ .description(verb === 'approve'
273
+ ? 'Approve the AI draft (intake → finalized; send via Proposals UI)'
274
+ : verb === 'reject'
275
+ ? 'Discard a bid intake'
276
+ : 'Re-run the vision LLM on a bid intake')
277
+ .option('--json', 'Output as JSON');
278
+ if (verb === 'reject')
279
+ cmd.option('--reason <text>', 'Rejection reason');
280
+ cmd.action(async (id, options) => {
281
+ requireAuth();
282
+ const spinner = (0, ora_1.default)(`${verb}ing bid #${id}...`).start();
283
+ try {
284
+ const body = {};
285
+ if (verb === 'reject' && options.reason)
286
+ body.reason = options.reason;
287
+ const r = await api_client_1.apiClient.post(path.replace(':id', id), body);
288
+ const intake = r.data;
289
+ if ((0, json_output_1.isJsonOutput)(options)) {
290
+ spinner.stop();
291
+ console.log(JSON.stringify(intake, null, 2));
292
+ return;
293
+ }
294
+ const c = STATUS_COLOR[String(intake.status)] || chalk_1.default.white;
295
+ spinner.succeed(chalk_1.default.green(`Bid #${id} → ${c(intake.status)}`));
296
+ if (verb === 'approve') {
297
+ console.log(chalk_1.default.dim(' Open Proposals to send: /dashboard/crm/proposals/' + (intake.proposal_id ?? '?')));
298
+ }
299
+ }
300
+ catch (error) {
301
+ spinner.fail(chalk_1.default.red(`Failed to ${verb} bid #${id}`));
302
+ console.error(chalk_1.default.red(` ${(0, api_client_1.handleApiError)(error).message}`));
303
+ process.exit(1);
304
+ }
305
+ });
306
+ }
307
+ makeStateChange('approve');
308
+ makeStateChange('reject');
309
+ makeStateChange('reanalyze');
310
+ //# sourceMappingURL=bids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bids.js","sourceRoot":"","sources":["../../src/commands/bids.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Predict commands for Solid CLI.
3
+ *
4
+ * Surfaces the predict-and-act platform to the terminal so AI agents
5
+ * (and humans) can drive predictions from a one-liner:
6
+ *
7
+ * solid predict deal-close <deal_id> [--json]
8
+ * solid predict no-show <appointment_id> [--json]
9
+ * solid predict payment-late <invoice_id> [--json]
10
+ * solid predict targets [--status proposed] [--json]
11
+ * solid predict approve <target_id>
12
+ * solid predict reject <target_id> [--reason "..."]
13
+ * solid predict discover # trigger Devon's sweep on demand
14
+ *
15
+ * Mirrors mcp/tools/predictions_tools.py — same surface, two interfaces.
16
+ *
17
+ * See: Owners-Manual/74-Predict-And-Act/
18
+ */
19
+ import { Command } from 'commander';
20
+ export declare const predictCommand: Command;
21
+ //# sourceMappingURL=predict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict.d.ts","sourceRoot":"","sources":["../../src/commands/predict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DpC,eAAO,MAAM,cAAc,SACmE,CAAC"}
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.predictCommand = void 0;
7
+ /**
8
+ * Predict commands for Solid CLI.
9
+ *
10
+ * Surfaces the predict-and-act platform to the terminal so AI agents
11
+ * (and humans) can drive predictions from a one-liner:
12
+ *
13
+ * solid predict deal-close <deal_id> [--json]
14
+ * solid predict no-show <appointment_id> [--json]
15
+ * solid predict payment-late <invoice_id> [--json]
16
+ * solid predict targets [--status proposed] [--json]
17
+ * solid predict approve <target_id>
18
+ * solid predict reject <target_id> [--reason "..."]
19
+ * solid predict discover # trigger Devon's sweep on demand
20
+ *
21
+ * Mirrors mcp/tools/predictions_tools.py — same surface, two interfaces.
22
+ *
23
+ * See: Owners-Manual/74-Predict-And-Act/
24
+ */
25
+ const commander_1 = require("commander");
26
+ const chalk_1 = __importDefault(require("chalk"));
27
+ const ora_1 = __importDefault(require("ora"));
28
+ const config_1 = require("../lib/config");
29
+ const api_client_1 = require("../lib/api-client");
30
+ const json_output_1 = require("../lib/json-output");
31
+ function requireAuth() {
32
+ if (!config_1.config.isLoggedIn()) {
33
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
34
+ process.exit(1);
35
+ }
36
+ }
37
+ const TIER_COLOR = {
38
+ hot: chalk_1.default.green.bold,
39
+ warm: chalk_1.default.yellow.bold,
40
+ cold: chalk_1.default.gray,
41
+ high: chalk_1.default.red.bold,
42
+ medium: chalk_1.default.yellow.bold,
43
+ low: chalk_1.default.green,
44
+ unknown: chalk_1.default.cyan,
45
+ };
46
+ function renderPrediction(label, recordId, p, options) {
47
+ if ((0, json_output_1.isJsonOutput)(options)) {
48
+ console.log(JSON.stringify(p, null, 2));
49
+ return;
50
+ }
51
+ const tier = String(p.tier ?? 'unknown');
52
+ const c = TIER_COLOR[tier] || chalk_1.default.white;
53
+ const pct = p.probability != null ? `${Math.round(Number(p.probability) * 100)}%` : '—';
54
+ const conf = p.confidence != null ? `${Math.round(Number(p.confidence) * 100)}%` : '—';
55
+ console.log('');
56
+ console.log(` ${chalk_1.default.bold(label)}: #${recordId}`);
57
+ console.log(` ${chalk_1.default.bold('Tier:')} ${c(tier.toUpperCase())}`);
58
+ console.log(` ${chalk_1.default.bold('Probability:')} ${pct}`);
59
+ console.log(` ${chalk_1.default.bold('Confidence:')} ${conf}`);
60
+ console.log(` ${chalk_1.default.bold('Trained on:')} ${p.n_train_rows ?? 0} labelled rows`);
61
+ if (p.top_features && p.top_features.length) {
62
+ console.log(` ${chalk_1.default.bold('Top features:')}`);
63
+ for (const f of p.top_features.slice(0, 3)) {
64
+ const w = typeof f.weight === 'number' ? f.weight.toFixed(3) : '?';
65
+ console.log(` • ${f.name} (weight ${w})`);
66
+ }
67
+ }
68
+ if (p.recommendation) {
69
+ console.log(` ${chalk_1.default.bold('Recommendation:')}`);
70
+ console.log(` ${chalk_1.default.cyan(p.recommendation)}`);
71
+ }
72
+ if (p.notes) {
73
+ console.log(` ${chalk_1.default.dim('Note: ' + p.notes)}`);
74
+ }
75
+ console.log('');
76
+ }
77
+ exports.predictCommand = new commander_1.Command('predict')
78
+ .description('AI predictions — deal close, no-show, payment-late, Devon-discovered targets');
79
+ // ── deal-close ────────────────────────────────────────────────────────────
80
+ exports.predictCommand
81
+ .command('deal-close <deal_id>')
82
+ .description('Predict the probability a deal closes (won)')
83
+ .option('--json', 'Output as JSON')
84
+ .action(async (dealId, options) => {
85
+ requireAuth();
86
+ const spinner = (0, ora_1.default)(`Predicting deal-close for #${dealId}...`).start();
87
+ try {
88
+ const r = await api_client_1.apiClient.get(`/api/v1/predictions/deal-close/${dealId}`);
89
+ spinner.stop();
90
+ renderPrediction('Deal', dealId, r.data, options);
91
+ }
92
+ catch (e) {
93
+ spinner.fail('Prediction failed');
94
+ (0, api_client_1.handleApiError)(e);
95
+ }
96
+ });
97
+ // ── no-show ───────────────────────────────────────────────────────────────
98
+ exports.predictCommand
99
+ .command('no-show <appointment_id>')
100
+ .description('Predict the probability an appointment is a no-show')
101
+ .option('--json', 'Output as JSON')
102
+ .action(async (apptId, options) => {
103
+ requireAuth();
104
+ const spinner = (0, ora_1.default)(`Predicting no-show for appointment #${apptId}...`).start();
105
+ try {
106
+ const r = await api_client_1.apiClient.get(`/api/v1/predictions/no-show/${apptId}`);
107
+ spinner.stop();
108
+ renderPrediction('Appointment', apptId, r.data, options);
109
+ }
110
+ catch (e) {
111
+ spinner.fail('Prediction failed');
112
+ (0, api_client_1.handleApiError)(e);
113
+ }
114
+ });
115
+ // ── payment-late ──────────────────────────────────────────────────────────
116
+ exports.predictCommand
117
+ .command('payment-late <invoice_id>')
118
+ .description('Predict the probability an invoice is paid late')
119
+ .option('--json', 'Output as JSON')
120
+ .action(async (invoiceId, options) => {
121
+ requireAuth();
122
+ const spinner = (0, ora_1.default)(`Predicting payment-late for invoice #${invoiceId}...`).start();
123
+ try {
124
+ const r = await api_client_1.apiClient.get(`/api/v1/predictions/payment-late/${invoiceId}`);
125
+ spinner.stop();
126
+ renderPrediction('Invoice', invoiceId, r.data, options);
127
+ }
128
+ catch (e) {
129
+ spinner.fail('Prediction failed');
130
+ (0, api_client_1.handleApiError)(e);
131
+ }
132
+ });
133
+ // ── targets list ──────────────────────────────────────────────────────────
134
+ exports.predictCommand
135
+ .command('targets')
136
+ .description("List Devon-discovered predict targets (proposed + approved)")
137
+ .option('--status <status>', 'Filter by status (proposed, approved, rejected)')
138
+ .option('--json', 'Output as JSON')
139
+ .action(async (options) => {
140
+ requireAuth();
141
+ const spinner = (0, ora_1.default)('Loading predict targets...').start();
142
+ try {
143
+ const url = options.status
144
+ ? `/api/v1/predictions/targets?status_filter=${encodeURIComponent(options.status)}`
145
+ : '/api/v1/predictions/targets';
146
+ const r = await api_client_1.apiClient.get(url);
147
+ spinner.stop();
148
+ const rows = Array.isArray(r.data) ? r.data : (r.data?.targets || []);
149
+ if ((0, json_output_1.isJsonOutput)(options)) {
150
+ console.log(JSON.stringify(rows, null, 2));
151
+ return;
152
+ }
153
+ if (!rows.length) {
154
+ console.log(chalk_1.default.dim(' No predict targets yet. Devon proposes new ones on its nightly sweep.'));
155
+ return;
156
+ }
157
+ console.log('');
158
+ for (const t of rows) {
159
+ const status = String(t.status || 'proposed');
160
+ const c = status === 'approved'
161
+ ? chalk_1.default.green.bold
162
+ : status === 'proposed'
163
+ ? chalk_1.default.cyan
164
+ : status === 'rejected'
165
+ ? chalk_1.default.gray
166
+ : chalk_1.default.white;
167
+ const acc = t.proposed_accuracy != null
168
+ ? `${Math.round(Number(t.proposed_accuracy) * 100)}%`
169
+ : '—';
170
+ console.log(` ${chalk_1.default.bold('#' + t.id)} ${c(status.padEnd(9))} acc:${acc.padEnd(5)} ${chalk_1.default.bold(t.target_name)}`);
171
+ if (t.description)
172
+ console.log(` ${chalk_1.default.dim(t.description)}`);
173
+ }
174
+ console.log('');
175
+ }
176
+ catch (e) {
177
+ spinner.fail('Failed to load targets');
178
+ (0, api_client_1.handleApiError)(e);
179
+ }
180
+ });
181
+ // ── targets approve ───────────────────────────────────────────────────────
182
+ exports.predictCommand
183
+ .command('approve <target_id>')
184
+ .description('Approve a Devon-proposed predict target')
185
+ .option('--json', 'Output as JSON')
186
+ .action(async (targetId, options) => {
187
+ requireAuth();
188
+ const spinner = (0, ora_1.default)(`Approving target #${targetId}...`).start();
189
+ try {
190
+ const r = await api_client_1.apiClient.post(`/api/v1/predictions/targets/${targetId}/decide`, {
191
+ approve: true,
192
+ });
193
+ spinner.succeed(chalk_1.default.green(`Target #${targetId} approved.`));
194
+ if ((0, json_output_1.isJsonOutput)(options)) {
195
+ console.log(JSON.stringify(r.data, null, 2));
196
+ }
197
+ }
198
+ catch (e) {
199
+ spinner.fail('Approval failed');
200
+ (0, api_client_1.handleApiError)(e);
201
+ }
202
+ });
203
+ // ── targets reject ────────────────────────────────────────────────────────
204
+ exports.predictCommand
205
+ .command('reject <target_id>')
206
+ .description("Reject a Devon-proposed predict target")
207
+ .option('--reason <reason>', 'Reason for rejection (audit trail)')
208
+ .option('--json', 'Output as JSON')
209
+ .action(async (targetId, options) => {
210
+ requireAuth();
211
+ const spinner = (0, ora_1.default)(`Rejecting target #${targetId}...`).start();
212
+ try {
213
+ const r = await api_client_1.apiClient.post(`/api/v1/predictions/targets/${targetId}/decide`, {
214
+ approve: false,
215
+ rejection_reason: options.reason || null,
216
+ });
217
+ spinner.succeed(chalk_1.default.gray(`Target #${targetId} rejected.`));
218
+ if ((0, json_output_1.isJsonOutput)(options)) {
219
+ console.log(JSON.stringify(r.data, null, 2));
220
+ }
221
+ }
222
+ catch (e) {
223
+ spinner.fail('Rejection failed');
224
+ (0, api_client_1.handleApiError)(e);
225
+ }
226
+ });
227
+ //# sourceMappingURL=predict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict.js","sourceRoot":"","sources":["../../src/commands/predict.ts"],"names":[],"mappings":"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"}