@solidnumber/cli 2.18.0 → 2.20.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 +15 -0
- package/dist/commands/accounting.d.ts +10 -1
- package/dist/commands/accounting.d.ts.map +1 -1
- package/dist/commands/accounting.js +77 -52
- package/dist/commands/accounting.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +219 -10
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/ant.js +7 -21
- package/dist/commands/ant.js.map +1 -1
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +2 -3
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +14 -17
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/bids.d.ts.map +1 -1
- package/dist/commands/bids.js +4 -9
- package/dist/commands/bids.js.map +1 -1
- package/dist/commands/blog.js +12 -41
- package/dist/commands/blog.js.map +1 -1
- package/dist/commands/books.d.ts +24 -0
- package/dist/commands/books.d.ts.map +1 -0
- package/dist/commands/books.js +242 -0
- package/dist/commands/books.js.map +1 -0
- package/dist/commands/brand.js +11 -12
- package/dist/commands/brand.js.map +1 -1
- package/dist/commands/call.js +11 -0
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/chains.d.ts.map +1 -1
- package/dist/commands/chains.js +16 -17
- package/dist/commands/chains.js.map +1 -1
- package/dist/commands/chat_widgets.d.ts.map +1 -1
- package/dist/commands/chat_widgets.js +5 -6
- package/dist/commands/chat_widgets.js.map +1 -1
- package/dist/commands/clone.d.ts.map +1 -1
- package/dist/commands/clone.js +12 -3
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/code.js +4 -8
- package/dist/commands/code.js.map +1 -1
- package/dist/commands/company.js +92 -59
- package/dist/commands/company.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +14 -3
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/connect.js +11 -27
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/crm.d.ts.map +1 -1
- package/dist/commands/crm.js +51 -64
- package/dist/commands/crm.js.map +1 -1
- package/dist/commands/demo.js +1 -1
- package/dist/commands/demo.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +5 -15
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/design.js +10 -6
- package/dist/commands/design.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +11 -17
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/dispatch_shortcuts.d.ts +7 -0
- package/dist/commands/dispatch_shortcuts.d.ts.map +1 -1
- package/dist/commands/dispatch_shortcuts.js +7 -3
- package/dist/commands/dispatch_shortcuts.js.map +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.js +1 -1
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/drafts.d.ts.map +1 -1
- package/dist/commands/drafts.js +2 -6
- package/dist/commands/drafts.js.map +1 -1
- package/dist/commands/droplet.d.ts.map +1 -1
- package/dist/commands/droplet.js +8 -0
- package/dist/commands/droplet.js.map +1 -1
- package/dist/commands/ecommerce.d.ts.map +1 -1
- package/dist/commands/ecommerce.js +32 -36
- package/dist/commands/ecommerce.js.map +1 -1
- package/dist/commands/emails.d.ts.map +1 -1
- package/dist/commands/emails.js +12 -13
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/embed.d.ts.map +1 -1
- package/dist/commands/embed.js +3 -4
- package/dist/commands/embed.js.map +1 -1
- package/dist/commands/flows.d.ts.map +1 -1
- package/dist/commands/flows.js +7 -21
- package/dist/commands/flows.js.map +1 -1
- package/dist/commands/forms.d.ts.map +1 -1
- package/dist/commands/forms.js +31 -32
- package/dist/commands/forms.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +7 -3
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +10 -25
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +1 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/inbound.d.ts.map +1 -1
- package/dist/commands/inbound.js +9 -13
- package/dist/commands/inbound.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +15 -43
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/integrations.js +9 -27
- package/dist/commands/integrations.js.map +1 -1
- package/dist/commands/inventory.js +7 -21
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/kb.d.ts.map +1 -1
- package/dist/commands/kb.js +4 -10
- package/dist/commands/kb.js.map +1 -1
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +3 -7
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/landing.d.ts.map +1 -1
- package/dist/commands/landing.js +8 -9
- package/dist/commands/landing.js.map +1 -1
- package/dist/commands/leads.d.ts.map +1 -1
- package/dist/commands/leads.js +19 -23
- package/dist/commands/leads.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +1 -3
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/marketplace.d.ts.map +1 -1
- package/dist/commands/marketplace.js +10 -14
- package/dist/commands/marketplace.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +1 -3
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/nest.js +5 -11
- package/dist/commands/nest.js.map +1 -1
- package/dist/commands/notes.js +5 -10
- package/dist/commands/notes.js.map +1 -1
- package/dist/commands/offer.d.ts.map +1 -1
- package/dist/commands/offer.js +2 -5
- package/dist/commands/offer.js.map +1 -1
- package/dist/commands/onboarding.d.ts.map +1 -1
- package/dist/commands/onboarding.js +34 -38
- package/dist/commands/onboarding.js.map +1 -1
- package/dist/commands/orders.d.ts.map +1 -1
- package/dist/commands/orders.js +12 -16
- package/dist/commands/orders.js.map +1 -1
- package/dist/commands/pages.d.ts.map +1 -1
- package/dist/commands/pages.js +11 -30
- package/dist/commands/pages.js.map +1 -1
- package/dist/commands/payment_links.d.ts.map +1 -1
- package/dist/commands/payment_links.js +6 -7
- package/dist/commands/payment_links.js.map +1 -1
- package/dist/commands/products.d.ts.map +1 -1
- package/dist/commands/products.js +7 -11
- package/dist/commands/products.js.map +1 -1
- package/dist/commands/proposal.js +2 -2
- package/dist/commands/proposal.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +2 -6
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +5 -16
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +7 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +22 -27
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/schedule.js +10 -30
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/schema.js +1 -1
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/seo.js +1 -0
- package/dist/commands/seo.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +1 -0
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/site.js +8 -21
- package/dist/commands/site.js.map +1 -1
- package/dist/commands/sites.js +1 -1
- package/dist/commands/sites.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -7
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/storage.d.ts.map +1 -1
- package/dist/commands/storage.js +17 -21
- package/dist/commands/storage.js.map +1 -1
- package/dist/commands/subscriptions.d.ts.map +1 -1
- package/dist/commands/subscriptions.js +6 -7
- package/dist/commands/subscriptions.js.map +1 -1
- package/dist/commands/switch.js +1 -1
- package/dist/commands/switch.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +2 -6
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/train.js +6 -6
- package/dist/commands/train.js.map +1 -1
- package/dist/commands/ucp.js +1 -1
- package/dist/commands/ucp.js.map +1 -1
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +197 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +22 -26
- package/dist/commands/users.js.map +1 -1
- package/dist/commands/vibe.d.ts.map +1 -1
- package/dist/commands/vibe.js +5 -7
- package/dist/commands/vibe.js.map +1 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +31 -35
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/webhooks-listen.d.ts.map +1 -1
- package/dist/commands/webhooks-listen.js +1 -0
- package/dist/commands/webhooks-listen.js.map +1 -1
- package/dist/commands/webhooks.js +1 -3
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/commands/webmcp.js +1 -1
- package/dist/commands/webmcp.js.map +1 -1
- package/dist/commands/widgets.js +6 -18
- package/dist/commands/widgets.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +68 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +145 -10
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/command-kit.d.ts +29 -0
- package/dist/lib/command-kit.d.ts.map +1 -1
- package/dist/lib/command-kit.js +53 -1
- package/dist/lib/command-kit.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +15 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/json-output.d.ts +25 -1
- package/dist/lib/json-output.d.ts.map +1 -1
- package/dist/lib/json-output.js +56 -0
- package/dist/lib/json-output.js.map +1 -1
- package/dist/lib/list-envelope.d.ts.map +1 -1
- package/dist/lib/list-envelope.js +24 -0
- package/dist/lib/list-envelope.js.map +1 -1
- package/package.json +2 -2
- package/platform-docs/llms.txt +11 -7
package/README.md
CHANGED
|
@@ -118,6 +118,7 @@ solid agent mission "Create a Valentine's campaign for VIP customers"
|
|
|
118
118
|
| `solid auth logout` | Clear stored credentials |
|
|
119
119
|
| `solid auth whoami` | Show current session |
|
|
120
120
|
| `solid status` | Company dashboard |
|
|
121
|
+
| `solid update` | Update the CLI — knows npm, Homebrew and scoop |
|
|
121
122
|
| `solid pull` | Download pages, KB, settings as files |
|
|
122
123
|
| `solid push` | Push local changes to production |
|
|
123
124
|
| `solid diff` | Preview changes before pushing |
|
|
@@ -402,6 +403,20 @@ Full contract: see the [Scripting Contract doc](https://github.com/Adam-Camp-Kin
|
|
|
402
403
|
|
|
403
404
|
## Update notifier
|
|
404
405
|
|
|
406
|
+
When it says there's a new version, run:
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
solid update # check, then upgrade this copy
|
|
410
|
+
solid update --check # say what would happen, change nothing
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
It works out how this copy was installed and runs the right thing —
|
|
414
|
+
`npm install -g`, `brew upgrade`, or `scoop update`. It also warns when a
|
|
415
|
+
**second** `solid` is on your PATH at a different version: an npm global under
|
|
416
|
+
nvm in front of a Homebrew formula is easy to end up with, whichever comes
|
|
417
|
+
first in PATH wins, and upgrading one leaves the other lying in wait. The
|
|
418
|
+
notifier cannot see that — it only ever looks at the copy that is running.
|
|
419
|
+
|
|
405
420
|
The CLI checks npm once every **4 hours** for a newer release and prints
|
|
406
421
|
a boxed notice on the next run. Suppress it:
|
|
407
422
|
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `solid accounting` — the OPTIONAL mirror of Solid#'s books into QuickBooks,
|
|
3
|
+
* Xero or FreshBooks. The books themselves are `solid books`, `solid invoices`
|
|
4
|
+
* and `solid expenses` (commands/books.ts) — every company has those, with or
|
|
5
|
+
* without an accounting system.
|
|
6
|
+
*
|
|
7
|
+
* ⛔ Fixed 2026-09-11 — all three commands spoke to an API that never existed:
|
|
8
|
+
* `sync` POSTed with no connection_id (the backend requires one → 422),
|
|
9
|
+
* `history` called /sync/history (only /sync/history/{connection_id} exists → 404),
|
|
10
|
+
* and `status` read provider/status/last_sync at the top level when the backend
|
|
11
|
+
* returns {connections: [...]}.
|
|
3
12
|
*/
|
|
4
13
|
import { Command } from 'commander';
|
|
5
14
|
export declare const accountingCommand: Command;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounting.d.ts","sourceRoot":"","sources":["../../src/commands/accounting.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accounting.d.ts","sourceRoot":"","sources":["../../src/commands/accounting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,eAAO,MAAM,iBAAiB,SAE4B,CAAC"}
|
|
@@ -38,36 +38,63 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.accountingCommand = void 0;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* `solid accounting` — the OPTIONAL mirror of Solid#'s books into QuickBooks,
|
|
42
|
+
* Xero or FreshBooks. The books themselves are `solid books`, `solid invoices`
|
|
43
|
+
* and `solid expenses` (commands/books.ts) — every company has those, with or
|
|
44
|
+
* without an accounting system.
|
|
45
|
+
*
|
|
46
|
+
* ⛔ Fixed 2026-09-11 — all three commands spoke to an API that never existed:
|
|
47
|
+
* `sync` POSTed with no connection_id (the backend requires one → 422),
|
|
48
|
+
* `history` called /sync/history (only /sync/history/{connection_id} exists → 404),
|
|
49
|
+
* and `status` read provider/status/last_sync at the top level when the backend
|
|
50
|
+
* returns {connections: [...]}.
|
|
42
51
|
*/
|
|
43
52
|
const commander_1 = require("commander");
|
|
44
53
|
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
-
const config_1 = require("../lib/config");
|
|
46
54
|
const api_client_1 = require("../lib/api-client");
|
|
47
|
-
const
|
|
55
|
+
const command_kit_1 = require("../lib/command-kit");
|
|
48
56
|
const json_output_1 = require("../lib/json-output");
|
|
57
|
+
const ui_1 = require("../lib/ui");
|
|
58
|
+
const dispatch_shortcuts_1 = require("./dispatch_shortcuts");
|
|
59
|
+
async function connectionFor(connectionId) {
|
|
60
|
+
const res = await api_client_1.apiClient.get('/api/v1/accounting/connections');
|
|
61
|
+
const list = ((res.data || {}).connections || []);
|
|
62
|
+
if (list.length === 0) {
|
|
63
|
+
throw new Error('No accounting system is connected — connect one in Integrations → Accounting.');
|
|
64
|
+
}
|
|
65
|
+
if (!connectionId)
|
|
66
|
+
return list[0];
|
|
67
|
+
const match = list.find((c) => c.id === Number(connectionId));
|
|
68
|
+
if (!match)
|
|
69
|
+
throw new Error(`No accounting connection ${connectionId} on this account.`);
|
|
70
|
+
return match;
|
|
71
|
+
}
|
|
49
72
|
exports.accountingCommand = new commander_1.Command('accounting')
|
|
50
|
-
.description('
|
|
73
|
+
.description('Optional mirror of your books into QuickBooks / Xero / FreshBooks (the books: `solid books`)')
|
|
51
74
|
.action(async () => { exports.accountingCommand.outputHelp(); });
|
|
52
|
-
exports.accountingCommand.command('
|
|
75
|
+
exports.accountingCommand.command('status').description('Each connected accounting system and how its last sync went')
|
|
53
76
|
.option('--json', 'JSON output')
|
|
54
77
|
.action(async (options) => {
|
|
55
|
-
|
|
56
|
-
console.error(chalk_1.default.red('Not logged in.'));
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
78
|
+
(0, command_kit_1.requireAuth)();
|
|
59
79
|
const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
60
|
-
const spinner = ora('
|
|
80
|
+
const spinner = ora('Loading...').start();
|
|
61
81
|
try {
|
|
62
|
-
const res = await api_client_1.apiClient.
|
|
82
|
+
const res = await api_client_1.apiClient.get('/api/v1/accounting/sync/status');
|
|
63
83
|
spinner.stop();
|
|
64
84
|
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
65
85
|
console.log(JSON.stringify(res.data, null, 2));
|
|
66
86
|
return;
|
|
67
87
|
}
|
|
68
|
-
const
|
|
88
|
+
const connections = ((res.data || {}).connections || []);
|
|
69
89
|
console.log('');
|
|
70
|
-
console.log(ui_1.ui.
|
|
90
|
+
console.log(ui_1.ui.header('Accounting'));
|
|
91
|
+
if (connections.length === 0)
|
|
92
|
+
console.log(chalk_1.default.dim(' Nothing connected — your books live in Solid# (`solid books summary`).'));
|
|
93
|
+
for (const c of connections) {
|
|
94
|
+
const status = c.last_status === 'success' ? chalk_1.default.green(c.last_status)
|
|
95
|
+
: c.last_status ? chalk_1.default.yellow(c.last_status) : chalk_1.default.dim('never synced');
|
|
96
|
+
console.log(ui_1.ui.label(`${c.provider} (#${c.connection_id})`, `${status}${c.last_sync ? chalk_1.default.dim(` ${c.last_sync}`) : ''}`));
|
|
97
|
+
}
|
|
71
98
|
console.log('');
|
|
72
99
|
}
|
|
73
100
|
catch (e) {
|
|
@@ -76,33 +103,26 @@ exports.accountingCommand.command('sync').description('Trigger a full accounting
|
|
|
76
103
|
process.exit(1);
|
|
77
104
|
}
|
|
78
105
|
});
|
|
79
|
-
exports.accountingCommand.command('
|
|
106
|
+
exports.accountingCommand.command('sync').description('Send what is waiting to the connected accounting system now')
|
|
107
|
+
.option('--connection-id <id>', 'Which connection (default: the first)')
|
|
80
108
|
.option('--json', 'JSON output')
|
|
81
109
|
.action(async (options) => {
|
|
82
|
-
|
|
83
|
-
console.error(chalk_1.default.red('Not logged in.'));
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
110
|
+
(0, command_kit_1.requireAuth)();
|
|
86
111
|
const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
87
|
-
const spinner = ora('
|
|
112
|
+
const spinner = ora('Starting sync...').start();
|
|
88
113
|
try {
|
|
89
|
-
const
|
|
114
|
+
const connection = await connectionFor(options.connectionId);
|
|
115
|
+
const res = await api_client_1.apiClient.post('/api/v1/accounting/sync', { connection_id: connection.id });
|
|
90
116
|
spinner.stop();
|
|
91
117
|
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
92
118
|
console.log(JSON.stringify(res.data, null, 2));
|
|
93
119
|
return;
|
|
94
120
|
}
|
|
95
|
-
const d = res.data;
|
|
96
121
|
console.log('');
|
|
97
|
-
console.log(ui_1.ui.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
console.log(ui_1.ui.label('Status', d.status === 'connected' ? chalk_1.default.green(d.status) : chalk_1.default.yellow(d.status)));
|
|
102
|
-
if (d.last_sync)
|
|
103
|
-
console.log(ui_1.ui.label('Last Sync', d.last_sync));
|
|
104
|
-
if (d.records_synced !== undefined)
|
|
105
|
-
console.log(ui_1.ui.label('Records', String(d.records_synced)));
|
|
122
|
+
console.log(ui_1.ui.successBox('Sync started', [
|
|
123
|
+
`${chalk_1.default.dim('Provider:')} ${connection.provider}`,
|
|
124
|
+
chalk_1.default.dim('Each expense and invoice records how it landed — `solid accounting history`.'),
|
|
125
|
+
]));
|
|
106
126
|
console.log('');
|
|
107
127
|
}
|
|
108
128
|
catch (e) {
|
|
@@ -111,34 +131,31 @@ exports.accountingCommand.command('status').description('Check sync status')
|
|
|
111
131
|
process.exit(1);
|
|
112
132
|
}
|
|
113
133
|
});
|
|
114
|
-
exports.accountingCommand.command('history').description('
|
|
115
|
-
.option('--
|
|
134
|
+
exports.accountingCommand.command('history').description('What was sent, and how each landed')
|
|
135
|
+
.option('--connection-id <id>', 'Which connection (default: the first)')
|
|
136
|
+
.option('--limit <n>', 'Entries', '20')
|
|
137
|
+
.option('--json', 'JSON output')
|
|
116
138
|
.action(async (options) => {
|
|
117
|
-
|
|
118
|
-
console.error(chalk_1.default.red('Not logged in.'));
|
|
119
|
-
process.exit(1);
|
|
120
|
-
}
|
|
139
|
+
(0, command_kit_1.requireAuth)();
|
|
121
140
|
const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
122
141
|
const spinner = ora('Loading...').start();
|
|
123
142
|
try {
|
|
124
|
-
const
|
|
143
|
+
const connection = await connectionFor(options.connectionId);
|
|
144
|
+
const res = await api_client_1.apiClient.get(`/api/v1/accounting/sync/history/${connection.id}`, { params: { limit: options.limit } });
|
|
125
145
|
spinner.stop();
|
|
126
146
|
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
127
147
|
console.log(JSON.stringify(res.data, null, 2));
|
|
128
148
|
return;
|
|
129
149
|
}
|
|
130
|
-
const
|
|
131
|
-
const entries = d.history || d.syncs || [];
|
|
150
|
+
const items = ((res.data || {}).items || []);
|
|
132
151
|
console.log('');
|
|
133
|
-
console.log(ui_1.ui.header(
|
|
134
|
-
if (
|
|
135
|
-
console.log(chalk_1.default.dim('
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
console.log(` ${s} ${e.created_at || e.date} — ${e.records || 0} records`);
|
|
141
|
-
}
|
|
152
|
+
console.log(ui_1.ui.header(`${connection.provider} — sync history (${items.length})`));
|
|
153
|
+
if (items.length === 0)
|
|
154
|
+
console.log(chalk_1.default.dim(' Nothing sent yet.'));
|
|
155
|
+
for (const e of items) {
|
|
156
|
+
const mark = e.status === 'success' ? chalk_1.default.green('✓') : e.status === 'failed' ? chalk_1.default.red('✗') : chalk_1.default.yellow('…');
|
|
157
|
+
const where = e.remote_id ? ` → ${e.remote_id}` : '';
|
|
158
|
+
console.log(` ${mark} ${e.entity_type} ${e.solid_id}${where} ${chalk_1.default.dim(e.synced_at || '')}${e.error ? chalk_1.default.red(` ${e.error}`) : ''}`);
|
|
142
159
|
}
|
|
143
160
|
console.log('');
|
|
144
161
|
}
|
|
@@ -148,10 +165,18 @@ exports.accountingCommand.command('history').description('View sync history')
|
|
|
148
165
|
process.exit(1);
|
|
149
166
|
}
|
|
150
167
|
});
|
|
151
|
-
|
|
168
|
+
exports.accountingCommand.command('setup').description('Where money out and money in land in the connected books, and what is still missing')
|
|
169
|
+
.option('--accounts', 'Also list the accounts in their books to choose from')
|
|
170
|
+
.option('--json', 'JSON output')
|
|
171
|
+
.action(async (options) => {
|
|
172
|
+
const payload = { include_accounts: Boolean(options.accounts) };
|
|
173
|
+
await (0, dispatch_shortcuts_1.invokeAgentVerbShortcut)('integration.accounting_expense_setup', payload, options, 'Money out...');
|
|
174
|
+
await (0, dispatch_shortcuts_1.invokeAgentVerbShortcut)('integration.accounting_receivable_setup', payload, options, 'Money in...');
|
|
175
|
+
});
|
|
152
176
|
(0, command_kit_1.appendExamples)(exports.accountingCommand, [
|
|
153
|
-
{ cmd: 'solid accounting
|
|
154
|
-
{ cmd: 'solid accounting
|
|
155
|
-
{ cmd: 'solid accounting
|
|
177
|
+
{ cmd: 'solid accounting status', why: 'Connected systems + how the last sync went' },
|
|
178
|
+
{ cmd: 'solid accounting setup --accounts', why: 'Where expenses and invoices land, what to choose' },
|
|
179
|
+
{ cmd: 'solid accounting sync', why: 'Send what is waiting now' },
|
|
180
|
+
{ cmd: 'solid accounting history', why: 'What was sent, and how each landed' },
|
|
156
181
|
]);
|
|
157
182
|
//# sourceMappingURL=accounting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounting.js","sourceRoot":"","sources":["../../src/commands/accounting.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"accounting.js","sourceRoot":"","sources":["../../src/commands/accounting.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqFpC,eAAO,MAAM,YAAY,SAC2B,CAAC"}
|
package/dist/commands/agent.js
CHANGED
|
@@ -77,12 +77,13 @@ function scoreBar(value, width = 15) {
|
|
|
77
77
|
}
|
|
78
78
|
function fmt(n) { return n.toLocaleString(); }
|
|
79
79
|
function trunc(s, max) { return !s ? '' : s.length > max ? s.slice(0, max - 1) + '…' : s; }
|
|
80
|
+
// Returns a rejection handler that FAILS the command: exit 1, and under
|
|
81
|
+
// --json a structured error envelope on stdout. The previous version wrote
|
|
82
|
+
// the error box to stdout via console.log and then returned normally, so an
|
|
83
|
+
// agent piping this command got exit 0 with an error box mixed into the
|
|
84
|
+
// payload it was trying to parse.
|
|
80
85
|
function catchError(spinner, label) {
|
|
81
|
-
return (error) =>
|
|
82
|
-
spinner.fail(chalk_1.default.red(label));
|
|
83
|
-
console.log(ui_1.ui.errorBox('Error', [(0, api_client_1.handleApiError)(error).message]));
|
|
84
|
-
console.log('');
|
|
85
|
-
};
|
|
86
|
+
return (error) => (0, command_kit_1.fail)(spinner, label, error);
|
|
86
87
|
}
|
|
87
88
|
// ── Command Tree ─────────────────────────────────────────────────────
|
|
88
89
|
exports.agentCommand = new commander_1.Command('agent')
|
|
@@ -136,11 +137,17 @@ exports.agentCommand
|
|
|
136
137
|
const detail = detailRes.status === 'fulfilled' ? detailRes.value.data : null;
|
|
137
138
|
const data = dataRes.status === 'fulfilled' ? dataRes.value.data : null;
|
|
138
139
|
if (!detail) {
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
// Was: print an error box to STDOUT and return — exit 0, with the box
|
|
141
|
+
// landing in the payload an agent was parsing. Synthesize the 404 so
|
|
142
|
+
// it takes the identical path (and envelope) as a real one.
|
|
143
|
+
const msg = `Agent "${name}" (${agentType}) not found.`;
|
|
144
|
+
(0, command_kit_1.emitErrorAndExit)(Object.assign(new Error(msg), {
|
|
145
|
+
isAxiosError: true,
|
|
146
|
+
response: { status: 404, data: { detail: msg } },
|
|
147
|
+
}));
|
|
141
148
|
}
|
|
142
149
|
if ((0, json_output_1.isJsonOutput)(opts)) {
|
|
143
|
-
|
|
150
|
+
(0, json_output_1.printJson)({ detail, data });
|
|
144
151
|
return;
|
|
145
152
|
}
|
|
146
153
|
console.log(ui_1.ui.header(detail.name || agentType));
|
|
@@ -360,7 +367,7 @@ exports.agentCommand
|
|
|
360
367
|
const dash = dashRes.status === 'fulfilled' ? dashRes.value.data : null;
|
|
361
368
|
const tel = telRes.status === 'fulfilled' ? telRes.value.data : null;
|
|
362
369
|
if ((0, json_output_1.isJsonOutput)(opts)) {
|
|
363
|
-
|
|
370
|
+
(0, json_output_1.printJson)({ dashboard: dash, telemetry: tel });
|
|
364
371
|
return;
|
|
365
372
|
}
|
|
366
373
|
console.log(ui_1.ui.header('Agent Dashboard'));
|
|
@@ -445,7 +452,7 @@ exports.agentCommand
|
|
|
445
452
|
const { data: result } = await api_client_1.apiClient.missionExecute(mission.mission_id);
|
|
446
453
|
spinner.stop();
|
|
447
454
|
if ((0, json_output_1.isJsonOutput)(opts)) {
|
|
448
|
-
|
|
455
|
+
(0, json_output_1.printJson)({ mission, execution: result });
|
|
449
456
|
return;
|
|
450
457
|
}
|
|
451
458
|
console.log(ui_1.ui.successBox('Mission Executed', [
|
|
@@ -1043,6 +1050,204 @@ exports.agentCommand
|
|
|
1043
1050
|
catchError(spinner, 'Uninstall failed')(e);
|
|
1044
1051
|
}
|
|
1045
1052
|
});
|
|
1053
|
+
// ── SPRINT-AGENT-FIREWALL — identity, quarantine, reputation ─────────
|
|
1054
|
+
//
|
|
1055
|
+
// solid agent identity list|create|revoke|use|clear
|
|
1056
|
+
// solid agent quarantine <id> [--reason]
|
|
1057
|
+
// solid agent release <id>
|
|
1058
|
+
// solid agent reputation <id>
|
|
1059
|
+
// solid agent risk [--days 7]
|
|
1060
|
+
function printIdentity(i) {
|
|
1061
|
+
const status = String(i.status);
|
|
1062
|
+
const badge = status === 'active' ? chalk_1.default.green('active') : status === 'quarantined' ? chalk_1.default.red('quarantined') : chalk_1.default.dim('revoked');
|
|
1063
|
+
console.log(` #${String(i.id).padEnd(5)} ${badge.padEnd(20)} ${chalk_1.default.bold(String(i.agent_type)).padEnd(24)} tier=${String(i.trust_tier).padEnd(9)} rep=${Number(i.reputation ?? 1).toFixed(2)} ${chalk_1.default.dim(String(i.key_prefix))}… ${chalk_1.default.dim(String(i.label ?? ''))}`);
|
|
1064
|
+
}
|
|
1065
|
+
const identityCommand = new commander_1.Command('identity')
|
|
1066
|
+
.description('Agent identities — a revocable key that says WHICH agent acted (sent as X-Agent-Id)');
|
|
1067
|
+
identityCommand
|
|
1068
|
+
.command('list').alias('ls')
|
|
1069
|
+
.description('List agent identities on the current company')
|
|
1070
|
+
.option('--all', 'Include revoked identities', false)
|
|
1071
|
+
.option('--json', 'Output as JSON')
|
|
1072
|
+
.action(async (options) => {
|
|
1073
|
+
requireLogin();
|
|
1074
|
+
try {
|
|
1075
|
+
const res = await api_client_1.apiClient.agentIdentityList(Boolean(options.all));
|
|
1076
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
1077
|
+
console.log(JSON.stringify(res.data, null, 2));
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
console.log('');
|
|
1081
|
+
if (!res.data.identities.length) {
|
|
1082
|
+
console.log(chalk_1.default.dim(' No agent identities. Create one: solid agent identity create --type custom-bot --tier custom'));
|
|
1083
|
+
return;
|
|
1084
|
+
}
|
|
1085
|
+
res.data.identities.forEach(printIdentity);
|
|
1086
|
+
const active = config_1.config.agentKey;
|
|
1087
|
+
console.log(active ? chalk_1.default.dim(`\n This CLI is sending X-Agent-Id (${active.slice(0, 12)}…)`) : chalk_1.default.dim('\n This CLI is not sending an agent identity. `solid agent identity use <key>` to attach one.'));
|
|
1088
|
+
}
|
|
1089
|
+
catch (error) {
|
|
1090
|
+
const apiError = (0, api_client_1.handleApiError)(error);
|
|
1091
|
+
console.error(chalk_1.default.red(` ${apiError.message}`));
|
|
1092
|
+
process.exit(1);
|
|
1093
|
+
}
|
|
1094
|
+
});
|
|
1095
|
+
identityCommand
|
|
1096
|
+
.command('create')
|
|
1097
|
+
.description('Create an agent identity — the key is shown ONCE')
|
|
1098
|
+
.requiredOption('--type <agent_type>', 'sarah | marcus | ada | cli | mcp | custom-<slug>')
|
|
1099
|
+
.option('--tier <trust_tier>', 'platform | agency | custom (rate-limit tier)', 'custom')
|
|
1100
|
+
.option('--label <label>', 'Human label')
|
|
1101
|
+
.option('--use', 'Attach the new key to this CLI immediately', false)
|
|
1102
|
+
.option('--json', 'Output as JSON')
|
|
1103
|
+
.action(async (options) => {
|
|
1104
|
+
requireLogin();
|
|
1105
|
+
const spinner = (0, ora_1.default)(`Creating identity ${options.type} (${options.tier})...`).start();
|
|
1106
|
+
try {
|
|
1107
|
+
const res = await api_client_1.apiClient.agentIdentityCreate({ agent_type: options.type, trust_tier: options.tier, label: options.label });
|
|
1108
|
+
spinner.succeed(chalk_1.default.green(`Created #${res.data.id}`));
|
|
1109
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
1110
|
+
console.log(JSON.stringify(res.data, null, 2));
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
console.log('');
|
|
1114
|
+
console.log(` ${chalk_1.default.bold('Agent key (shown once):')} ${chalk_1.default.cyan(res.data.agent_key)}`);
|
|
1115
|
+
console.log(chalk_1.default.dim(' Attach it: solid agent identity use <key> or export SOLID_AGENT_KEY=<key>'));
|
|
1116
|
+
if (options.use) {
|
|
1117
|
+
config_1.config.agentKey = res.data.agent_key;
|
|
1118
|
+
console.log(chalk_1.default.green(' ✔ attached to this CLI'));
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
catch (error) {
|
|
1122
|
+
(0, command_kit_1.fail)(spinner, 'Create failed', error);
|
|
1123
|
+
}
|
|
1124
|
+
});
|
|
1125
|
+
identityCommand
|
|
1126
|
+
.command('revoke <id>')
|
|
1127
|
+
.description('Revoke an agent identity — its key stops resolving immediately (403 on every call)')
|
|
1128
|
+
.action(async (idArg) => {
|
|
1129
|
+
requireLogin();
|
|
1130
|
+
const spinner = (0, ora_1.default)(`Revoking #${idArg}...`).start();
|
|
1131
|
+
try {
|
|
1132
|
+
const res = await api_client_1.apiClient.agentIdentityRevoke(parseInt(idArg, 10));
|
|
1133
|
+
spinner.succeed(chalk_1.default.green(`Revoked #${idArg}`));
|
|
1134
|
+
printIdentity(res.data);
|
|
1135
|
+
}
|
|
1136
|
+
catch (error) {
|
|
1137
|
+
(0, command_kit_1.fail)(spinner, 'Revoke failed', error);
|
|
1138
|
+
}
|
|
1139
|
+
});
|
|
1140
|
+
identityCommand
|
|
1141
|
+
.command('use <key>')
|
|
1142
|
+
.description('Attach an agent key to this CLI (sent as X-Agent-Id on every request)')
|
|
1143
|
+
.action((key) => {
|
|
1144
|
+
if (!String(key).startsWith('sak_')) {
|
|
1145
|
+
console.error(chalk_1.default.red('That is not an agent key (expected sak_…). Create one: solid agent identity create'));
|
|
1146
|
+
process.exit(1);
|
|
1147
|
+
}
|
|
1148
|
+
config_1.config.agentKey = String(key);
|
|
1149
|
+
console.log(chalk_1.default.green(`✔ This CLI now identifies as ${String(key).slice(0, 12)}…`));
|
|
1150
|
+
});
|
|
1151
|
+
identityCommand
|
|
1152
|
+
.command('clear')
|
|
1153
|
+
.description('Stop sending an agent identity from this CLI')
|
|
1154
|
+
.action(() => {
|
|
1155
|
+
config_1.config.agentKey = undefined;
|
|
1156
|
+
console.log(chalk_1.default.green('✔ Agent identity detached'));
|
|
1157
|
+
});
|
|
1158
|
+
exports.agentCommand.addCommand(identityCommand);
|
|
1159
|
+
exports.agentCommand
|
|
1160
|
+
.command('quarantine <id>')
|
|
1161
|
+
.description('Quarantine an agent identity — every write is denied until released')
|
|
1162
|
+
.option('--reason <reason>', 'Why', 'manual')
|
|
1163
|
+
.action(async (idArg, options) => {
|
|
1164
|
+
requireLogin();
|
|
1165
|
+
const spinner = (0, ora_1.default)(`Quarantining #${idArg}...`).start();
|
|
1166
|
+
try {
|
|
1167
|
+
const res = await api_client_1.apiClient.agentIdentityQuarantine(parseInt(idArg, 10), String(options.reason));
|
|
1168
|
+
spinner.succeed(chalk_1.default.red(`Quarantined #${idArg}`));
|
|
1169
|
+
printIdentity(res.data);
|
|
1170
|
+
}
|
|
1171
|
+
catch (error) {
|
|
1172
|
+
(0, command_kit_1.fail)(spinner, 'Quarantine failed', error);
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1175
|
+
exports.agentCommand
|
|
1176
|
+
.command('release <id>')
|
|
1177
|
+
.description('Release a quarantined agent identity')
|
|
1178
|
+
.action(async (idArg) => {
|
|
1179
|
+
requireLogin();
|
|
1180
|
+
const spinner = (0, ora_1.default)(`Releasing #${idArg}...`).start();
|
|
1181
|
+
try {
|
|
1182
|
+
const res = await api_client_1.apiClient.agentIdentityRelease(parseInt(idArg, 10));
|
|
1183
|
+
spinner.succeed(chalk_1.default.green(`Released #${idArg}`));
|
|
1184
|
+
printIdentity(res.data);
|
|
1185
|
+
}
|
|
1186
|
+
catch (error) {
|
|
1187
|
+
(0, command_kit_1.fail)(spinner, 'Release failed', error);
|
|
1188
|
+
}
|
|
1189
|
+
});
|
|
1190
|
+
exports.agentCommand
|
|
1191
|
+
.command('reputation <id>')
|
|
1192
|
+
.description('Reputation score, effective rate limit and recent deductions for an agent identity')
|
|
1193
|
+
.option('--json', 'Output as JSON')
|
|
1194
|
+
.action(async (idArg, options) => {
|
|
1195
|
+
requireLogin();
|
|
1196
|
+
try {
|
|
1197
|
+
const res = await api_client_1.apiClient.agentIdentityReputation(parseInt(idArg, 10));
|
|
1198
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
1199
|
+
console.log(JSON.stringify(res.data, null, 2));
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
const d = res.data;
|
|
1203
|
+
console.log('');
|
|
1204
|
+
printIdentity(d.identity);
|
|
1205
|
+
console.log(` ${chalk_1.default.bold('Reputation:')} ${d.reputation.toFixed(3)}`);
|
|
1206
|
+
console.log(` ${chalk_1.default.bold('Rate limit:')} ${d.effective_limit_per_min}/min effective (tier ${d.trust_tier} base ${d.base_limit_per_min}/min)`);
|
|
1207
|
+
if (!d.deductions.length) {
|
|
1208
|
+
console.log(chalk_1.default.dim(' No deductions in the window.'));
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
console.log(chalk_1.default.bold('\n Recent deductions:'));
|
|
1212
|
+
d.deductions.forEach((x) => {
|
|
1213
|
+
console.log(` ${chalk_1.default.dim(String(x.at ?? '').slice(0, 19))} -${Number(x.amount ?? 0).toFixed(3)} ${x.reason.padEnd(20)} ${chalk_1.default.dim(`${Number(x.before ?? 0).toFixed(2)} → ${Number(x.after ?? 0).toFixed(2)}`)}`);
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
catch (error) {
|
|
1217
|
+
const apiError = (0, api_client_1.handleApiError)(error);
|
|
1218
|
+
console.error(chalk_1.default.red(` ${apiError.message}`));
|
|
1219
|
+
process.exit(1);
|
|
1220
|
+
}
|
|
1221
|
+
});
|
|
1222
|
+
exports.agentCommand
|
|
1223
|
+
.command('risk')
|
|
1224
|
+
.description('Trust Surface: agents with elevated risk this week, and who is quarantined')
|
|
1225
|
+
.option('--days <n>', 'Window in days', '7')
|
|
1226
|
+
.option('--json', 'Output as JSON')
|
|
1227
|
+
.action(async (options) => {
|
|
1228
|
+
requireLogin();
|
|
1229
|
+
try {
|
|
1230
|
+
const res = await api_client_1.apiClient.agentRisk(parseInt(String(options.days), 10) || 7);
|
|
1231
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
1232
|
+
console.log(JSON.stringify(res.data, null, 2));
|
|
1233
|
+
return;
|
|
1234
|
+
}
|
|
1235
|
+
console.log('');
|
|
1236
|
+
if (!res.data.elevated.length && !res.data.quarantined.length) {
|
|
1237
|
+
console.log(chalk_1.default.green(` No elevated-risk agents in the last ${res.data.window_days} days.`));
|
|
1238
|
+
return;
|
|
1239
|
+
}
|
|
1240
|
+
res.data.elevated.forEach((a) => {
|
|
1241
|
+
console.log(` ${chalk_1.default.bold(String(a.agent_key)).padEnd(16)} max risk ${chalk_1.default.yellow(Number(a.max_risk).toFixed(2))} flagged=${a.flagged_actions} blocked=${a.blocked} approvals=${a.approvals_required} ${chalk_1.default.dim(a.reasons.join(', '))}`);
|
|
1242
|
+
});
|
|
1243
|
+
res.data.quarantined.forEach((i) => printIdentity(i));
|
|
1244
|
+
}
|
|
1245
|
+
catch (error) {
|
|
1246
|
+
const apiError = (0, api_client_1.handleApiError)(error);
|
|
1247
|
+
console.error(chalk_1.default.red(` ${apiError.message}`));
|
|
1248
|
+
process.exit(1);
|
|
1249
|
+
}
|
|
1250
|
+
});
|
|
1046
1251
|
const command_kit_1 = require("../lib/command-kit");
|
|
1047
1252
|
(0, command_kit_1.appendExamples)(exports.agentCommand, [
|
|
1048
1253
|
{ cmd: 'solid agent dashboard', why: 'All agents + telemetry' },
|
|
@@ -1055,6 +1260,10 @@ const command_kit_1 = require("../lib/command-kit");
|
|
|
1055
1260
|
{ cmd: 'solid agent grant <id> --scope kb:read', why: 'Grant scopes after install' },
|
|
1056
1261
|
{ cmd: 'solid agent call <id> "summarize pricing"', why: 'Invoke an installed agent' },
|
|
1057
1262
|
{ cmd: 'solid agent dispatch kb_entry_create --args \'{"title":"FAQ","content":"...","category_id":1}\' --confirm', why: 'Run any ADA verb directly' },
|
|
1263
|
+
{ cmd: 'solid agent identity create --type custom-bot --tier custom --use', why: 'Issue a revocable agent key and attach it (X-Agent-Id)' },
|
|
1264
|
+
{ cmd: 'solid agent reputation 5', why: 'Score, effective rate limit, deductions' },
|
|
1265
|
+
{ cmd: 'solid agent quarantine 5 --reason "bulk delete"', why: 'Hard-block an agent until released' },
|
|
1266
|
+
{ cmd: 'solid agent risk', why: 'Agents with elevated risk this week' },
|
|
1058
1267
|
]);
|
|
1059
1268
|
// ── solid agent dispatch <verb> — generic verb dispatcher ────────────
|
|
1060
1269
|
//
|