@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.41
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/CHANGELOG.md +161 -0
- package/assets/renderer-scaffold/README.md +41 -11
- package/assets/renderer-scaffold/foundry.toml +5 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +99 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +144 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +447 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/deploy.d.ts +242 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5429 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +147 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/maintenance.d.ts +4 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +114 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/project.d.ts +429 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1720 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +85 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +868 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +738 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +748 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +399 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +102 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +622 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +105 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +351 -12
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +390 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/deploy-plan.d.ts +150 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +31 -0
- package/dist/deploy-plan.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +184 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +47 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +125 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +79 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +786 -4838
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +179 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +780 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +381 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2014 -359
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/prompt.d.ts +17 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +19 -0
- package/dist/prompt.js.map +1 -0
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +157 -52
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +435 -46
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +62 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +234 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +13 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +84 -15
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +86 -5
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +161 -20
- package/dist/update-check.js.map +1 -1
- package/package.json +13 -12
- package/skill/SKILL.md +181 -347
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +188 -0
- package/skill/reference/code.md +220 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +174 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +186 -93
- package/skill/reference/operate.md +220 -0
- package/skill/reference/services.md +121 -0
- package/skill/reference/setup.md +154 -36
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -116
- package/skill/reference/troubleshooting.md +0 -28
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { ABX_FEEDBACK_AREAS, AbxServiceClient, FEEDBACK_KINDS, FEEDBACK_SEVERITIES, SERVICE_FEEDBACK_INTERFACE, } from '@artblocks/abx-sdk';
|
|
3
|
+
import { bold, dim, info, ok } from '../output.js';
|
|
4
|
+
import { ABX_SERVICES_URL, requireRemoteToken, resolveRemote, serviceClient, } from '../remote.js';
|
|
5
|
+
import { readCliVersion } from '../update-check.js';
|
|
6
|
+
function value(flags, key) {
|
|
7
|
+
const raw = flags[key];
|
|
8
|
+
return typeof raw === 'string' && raw !== 'true' ? raw : undefined;
|
|
9
|
+
}
|
|
10
|
+
function oneOf(raw, choices, flag) {
|
|
11
|
+
if (raw === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (choices.includes(raw))
|
|
14
|
+
return raw;
|
|
15
|
+
throw new Error(`${flag} must be one of: ${choices.join(', ')}`);
|
|
16
|
+
}
|
|
17
|
+
function jsonObject(text, source) {
|
|
18
|
+
let parsed;
|
|
19
|
+
try {
|
|
20
|
+
parsed = JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error(`${source} must contain valid JSON`);
|
|
24
|
+
}
|
|
25
|
+
if (!parsed || Array.isArray(parsed) || typeof parsed !== 'object') {
|
|
26
|
+
throw new Error(`${source} must be a JSON object`);
|
|
27
|
+
}
|
|
28
|
+
return parsed;
|
|
29
|
+
}
|
|
30
|
+
function fileOrFlag(flags, flag, fileFlag) {
|
|
31
|
+
const direct = value(flags, flag);
|
|
32
|
+
const path = value(flags, fileFlag);
|
|
33
|
+
if (direct && path)
|
|
34
|
+
throw new Error(`use --${flag} or --${fileFlag}, not both`);
|
|
35
|
+
return path ? readFileSync(path, 'utf8') : direct;
|
|
36
|
+
}
|
|
37
|
+
/** Pure report construction: validate locally so a preview is the exact body that --yes sends. */
|
|
38
|
+
export function buildFeedbackReport(flags, target) {
|
|
39
|
+
const summary = value(flags, 'summary');
|
|
40
|
+
if (!summary)
|
|
41
|
+
return null;
|
|
42
|
+
const kind = oneOf(value(flags, 'kind'), FEEDBACK_KINDS, '--kind');
|
|
43
|
+
if (!kind)
|
|
44
|
+
throw new Error(`--kind is required with --summary (${FEEDBACK_KINDS.join(', ')})`);
|
|
45
|
+
const severity = oneOf(value(flags, 'severity'), FEEDBACK_SEVERITIES, '--severity');
|
|
46
|
+
const via = oneOf(value(flags, 'via'), ['agent', 'human'], '--via');
|
|
47
|
+
const detail = fileOrFlag(flags, 'detail', 'detail-file');
|
|
48
|
+
const contextRaw = fileOrFlag(flags, 'context', 'context-file');
|
|
49
|
+
const context = {
|
|
50
|
+
...(contextRaw ? jsonObject(contextRaw, value(flags, 'context-file') ? '--context-file' : '--context') : {}),
|
|
51
|
+
cliVersion: readCliVersion(),
|
|
52
|
+
};
|
|
53
|
+
const shared = { kind: kind, summary, detail, severity: severity, via, context };
|
|
54
|
+
if (target === 'abx') {
|
|
55
|
+
if (value(flags, 'component'))
|
|
56
|
+
throw new Error('--component is for --remote provider feedback; use --area for core ABX');
|
|
57
|
+
const area = oneOf(value(flags, 'area'), ABX_FEEDBACK_AREAS, '--area');
|
|
58
|
+
if (!area)
|
|
59
|
+
throw new Error(`--area is required for core ABX feedback (${ABX_FEEDBACK_AREAS.join(', ')})`);
|
|
60
|
+
return { area, ...shared };
|
|
61
|
+
}
|
|
62
|
+
if (value(flags, 'area'))
|
|
63
|
+
throw new Error('--area is for core ABX feedback; use --component with --remote');
|
|
64
|
+
return { component: value(flags, 'component'), ...shared };
|
|
65
|
+
}
|
|
66
|
+
async function targetFor(flags, env = process.env) {
|
|
67
|
+
const tokenFlag = value(flags, 'remote-token');
|
|
68
|
+
if (flags.remote === undefined) {
|
|
69
|
+
const remote = resolveRemote('abx', tokenFlag, env);
|
|
70
|
+
return {
|
|
71
|
+
kind: 'abx',
|
|
72
|
+
label: 'core ABX',
|
|
73
|
+
endpoint: `${ABX_SERVICES_URL}/abx/feedback`,
|
|
74
|
+
remote,
|
|
75
|
+
// The generic SDK feedback paths become /abx/feedback and /abx/feedback/mine.
|
|
76
|
+
client: new AbxServiceClient({ baseUrl: `${ABX_SERVICES_URL}/abx`, token: remote.token }),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const remote = resolveRemote(String(flags.remote), tokenFlag, env);
|
|
80
|
+
if (!remote)
|
|
81
|
+
throw new Error('--remote needs a provider name or URL');
|
|
82
|
+
const client = serviceClient(remote);
|
|
83
|
+
const descriptor = await client.descriptor();
|
|
84
|
+
if (!descriptor.interfaces?.includes(SERVICE_FEEDBACK_INTERFACE)) {
|
|
85
|
+
throw new Error(`${remote.url} does not declare ${SERVICE_FEEDBACK_INTERFACE}; provider feedback is not supported there. ` +
|
|
86
|
+
`Core ABX feedback is the default: run abx feedback without --remote.`);
|
|
87
|
+
}
|
|
88
|
+
return { kind: 'service', label: `provider ${remote.name?.toLowerCase() ?? remote.url}`, endpoint: `${remote.url}/feedback`, remote, client };
|
|
89
|
+
}
|
|
90
|
+
/** Core ABX by default; `--remote <provider>` switches to that provider's standard feedback path. */
|
|
91
|
+
export async function cmdFeedback(flags) {
|
|
92
|
+
const target = await targetFor(flags);
|
|
93
|
+
const report = buildFeedbackReport(flags, target.kind);
|
|
94
|
+
const mine = flags.mine !== undefined;
|
|
95
|
+
const json = flags.json !== undefined;
|
|
96
|
+
if (mine && report)
|
|
97
|
+
throw new Error('--mine cannot be combined with --summary');
|
|
98
|
+
if (mine) {
|
|
99
|
+
requireRemoteToken(target.remote);
|
|
100
|
+
const limitRaw = value(flags, 'limit');
|
|
101
|
+
const limit = limitRaw === undefined ? undefined : Number(limitRaw);
|
|
102
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0))
|
|
103
|
+
throw new Error('--limit must be a positive integer');
|
|
104
|
+
const rows = await target.client.listFeedback({
|
|
105
|
+
area: target.kind === 'abx' ? value(flags, 'area') : undefined,
|
|
106
|
+
component: target.kind === 'service' ? value(flags, 'component') : undefined,
|
|
107
|
+
kind: oneOf(value(flags, 'kind'), FEEDBACK_KINDS, '--kind'),
|
|
108
|
+
limit,
|
|
109
|
+
});
|
|
110
|
+
if (json)
|
|
111
|
+
console.log(JSON.stringify({ target: target.kind, feedback: rows }, null, 2));
|
|
112
|
+
else {
|
|
113
|
+
console.log(`\n ${bold(`${target.label} feedback`)} ${dim(`${rows.length} report(s)`)}`);
|
|
114
|
+
for (const row of rows)
|
|
115
|
+
console.log(` ${row.id} ${row.kind} ${row.summary}`);
|
|
116
|
+
console.log('');
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!report) {
|
|
121
|
+
const instructions = await target.client.feedbackInstructions();
|
|
122
|
+
if (json)
|
|
123
|
+
console.log(JSON.stringify(instructions, null, 2));
|
|
124
|
+
else
|
|
125
|
+
console.log(`\n${JSON.stringify(instructions, null, 2)}\n`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (flags.yes === undefined) {
|
|
129
|
+
const preview = { submitted: false, target: target.kind, endpoint: target.endpoint, report };
|
|
130
|
+
if (json)
|
|
131
|
+
console.log(JSON.stringify(preview, null, 2));
|
|
132
|
+
else {
|
|
133
|
+
console.log(`\n ${bold('feedback preview')} ${dim(`→ ${target.endpoint}`)}`);
|
|
134
|
+
console.log(JSON.stringify(report, null, 2));
|
|
135
|
+
info('Report content not sent. Review/redact it, obtain human approval, then re-run with --yes.');
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
requireRemoteToken(target.remote);
|
|
141
|
+
const result = await target.client.submitFeedback(report);
|
|
142
|
+
if (json)
|
|
143
|
+
console.log(JSON.stringify({ submitted: true, target: target.kind, ...result }, null, 2));
|
|
144
|
+
else
|
|
145
|
+
ok(`${target.label} feedback recorded (${result.id})`);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/commands/maintenance.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAC,KAAK,KAAK,EAAC,MAAM,aAAa,CAAC;AAiBvC,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E;AA8DD,eAAO,MAAM,WAAW,QAQ8D,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `abx vacuum` — SQLite maintenance for the local reference store (issue #113).
|
|
3
|
+
*
|
|
4
|
+
* Two halves, matching `SqliteStore`'s split in `packages/indexer/src/store.ts`:
|
|
5
|
+
* - `abx vacuum convert` the one-time, EXPLICIT full `VACUUM` for a store stuck at
|
|
6
|
+
* `auto_vacuum='none'` — every store created before this repo started
|
|
7
|
+
* setting the pragma ahead of schema creation (and, until the pragma
|
|
8
|
+
* ordering bug this issue also fixed, every store created since too —
|
|
9
|
+
* see the comment on `SCHEMA` in store.ts). A full VACUUM rewrites the
|
|
10
|
+
* ENTIRE database file and can briefly need up to ~2x its on-disk size,
|
|
11
|
+
* so it never runs on its own anywhere in this codebase — this command
|
|
12
|
+
* is the only place it happens, and only when an operator asks for it.
|
|
13
|
+
* - `abx vacuum incremental` a manual, bounded `PRAGMA incremental_vacuum` pass — the SAME bounded
|
|
14
|
+
* mechanism `abx serve` already runs automatically BETWEEN watch-loop
|
|
15
|
+
* ticks (`SelfHostIndexer.startVacuumMaintenance`), exposed here for an
|
|
16
|
+
* operator who wants one pass on demand (right after `convert`, or on a
|
|
17
|
+
* node that isn't running `abx serve`'s watcher at all).
|
|
18
|
+
*
|
|
19
|
+
* `abx vacuum` (or `abx vacuum status`) alone is read-only: it just reports where the store stands,
|
|
20
|
+
* so an operator can decide whether either half applies before running anything.
|
|
21
|
+
*/
|
|
22
|
+
import { DEFAULT_INCREMENTAL_VACUUM_PAGES, SqliteStore } from '@artblocks/abx-indexer';
|
|
23
|
+
import { localIndexer } from '../config.js';
|
|
24
|
+
import { bold, dim, g, info, ok, warn } from '../output.js';
|
|
25
|
+
/** Vacuuming is SQLite-specific (see store.ts's docstring on why these methods aren't on the
|
|
26
|
+
* generic `Store` interface) — a platform-scale Postgres deploy has its own manual VACUUM story
|
|
27
|
+
* outside this codebase, so this command has nothing to do there and says so plainly. */
|
|
28
|
+
function requireSqliteStore() {
|
|
29
|
+
const store = localIndexer().store;
|
|
30
|
+
if (!(store instanceof SqliteStore)) {
|
|
31
|
+
throw new Error('abx vacuum applies to the local SQLite reference store only — this node is backed by something else, ' +
|
|
32
|
+
'which owns its own maintenance story.');
|
|
33
|
+
}
|
|
34
|
+
return store;
|
|
35
|
+
}
|
|
36
|
+
export async function cmdVacuum(rest, flags) {
|
|
37
|
+
const sub = rest[0];
|
|
38
|
+
switch (sub) {
|
|
39
|
+
case undefined:
|
|
40
|
+
case 'status':
|
|
41
|
+
return cmdVacuumStatus();
|
|
42
|
+
case 'convert':
|
|
43
|
+
return cmdVacuumConvert();
|
|
44
|
+
case 'incremental':
|
|
45
|
+
return cmdVacuumIncremental(flags);
|
|
46
|
+
default:
|
|
47
|
+
console.error(VACUUM_USAGE);
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function cmdVacuumStatus() {
|
|
52
|
+
const store = requireSqliteStore();
|
|
53
|
+
const stats = store.vacuumStats();
|
|
54
|
+
console.log(`store ${store.path}`);
|
|
55
|
+
console.log(`auto_vacuum ${bold(stats.mode)}`);
|
|
56
|
+
console.log(`page_count ${stats.pageCount}`);
|
|
57
|
+
console.log(`freelist ${stats.freelistPages} page(s)`);
|
|
58
|
+
console.log('');
|
|
59
|
+
if (stats.mode === 'none') {
|
|
60
|
+
warn(`this store predates incremental auto-vacuum and needs a one-time conversion: ${g('abx vacuum convert')}`);
|
|
61
|
+
}
|
|
62
|
+
else if (stats.freelistPages > 0) {
|
|
63
|
+
info(`${stats.freelistPages} freed page(s) reclaimable — abx serve does this automatically between watch ticks; ` +
|
|
64
|
+
`run one pass now with ${g('abx vacuum incremental')}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
ok('nothing to reclaim');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function cmdVacuumConvert() {
|
|
71
|
+
const store = requireSqliteStore();
|
|
72
|
+
const before = store.vacuumStats();
|
|
73
|
+
if (before.mode !== 'none') {
|
|
74
|
+
ok(`already converted — auto_vacuum is '${before.mode}'; nothing to do.`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log(`${bold('abx vacuum convert')} runs a full SQLite ${bold('VACUUM')} on ${store.path} to enable incremental ` +
|
|
78
|
+
`auto-vacuum.\n` +
|
|
79
|
+
`${dim(`this REWRITES THE ENTIRE FILE (currently ${before.pageCount} page(s)) and can briefly need up to`)}\n` +
|
|
80
|
+
`${dim('~2x its on-disk size while it runs. This is a one-time operation — after it, freed pages reclaim')}\n` +
|
|
81
|
+
`${dim(`incrementally instead (${g('abx vacuum incremental')}, or automatically between abx serve's watch ticks).`)}\n`);
|
|
82
|
+
console.log(`converting… (auto_vacuum: none → incremental)`);
|
|
83
|
+
const mode = store.vacuumConvert();
|
|
84
|
+
const after = store.vacuumStats();
|
|
85
|
+
ok(`done — auto_vacuum is now '${mode}'; ${before.pageCount} → ${after.pageCount} page(s).`);
|
|
86
|
+
}
|
|
87
|
+
function cmdVacuumIncremental(flags) {
|
|
88
|
+
const store = requireSqliteStore();
|
|
89
|
+
const maxPages = flags.pages !== undefined ? Number(flags.pages) : DEFAULT_INCREMENTAL_VACUUM_PAGES;
|
|
90
|
+
if (!Number.isFinite(maxPages) || maxPages <= 0) {
|
|
91
|
+
throw new Error(`--pages must be a positive number (got ${JSON.stringify(flags.pages)})`);
|
|
92
|
+
}
|
|
93
|
+
const mode = store.autoVacuumMode();
|
|
94
|
+
if (mode !== 'incremental') {
|
|
95
|
+
warn(`auto_vacuum is '${mode}' — incremental_vacuum has nothing to do until this store is converted: ${g('abx vacuum convert')}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const reclaimed = store.runIncrementalVacuum(maxPages);
|
|
99
|
+
if (reclaimed > 0)
|
|
100
|
+
ok(`reclaimed ${reclaimed} page(s) (bounded to ${maxPages} this pass)`);
|
|
101
|
+
else
|
|
102
|
+
info('nothing to reclaim');
|
|
103
|
+
}
|
|
104
|
+
const VACUUM_USAGE = `usage: abx vacuum [status|convert|incremental] [--pages <n>]`;
|
|
105
|
+
export const VACUUM_HELP = `
|
|
106
|
+
${bold('abx vacuum')} [status|convert|incremental] ${dim('— SQLite maintenance for the local reference store; read-only unless a write happens below')}
|
|
107
|
+
${g('abx vacuum')} ${dim('(default: status)')} report auto_vacuum mode + page/freelist counts
|
|
108
|
+
${g('abx vacuum convert')} one-time, EXPLICIT full VACUUM for a store stuck at auto_vacuum='none' — rewrites
|
|
109
|
+
the whole file; can briefly need up to ~2x its on-disk size. Never runs automatically.
|
|
110
|
+
${g('abx vacuum incremental')} [--pages <n>] one bounded PRAGMA incremental_vacuum pass (default ${DEFAULT_INCREMENTAL_VACUUM_PAGES}
|
|
111
|
+
pages) — the same bounded reclaim \`abx serve\` already runs automatically BETWEEN watch
|
|
112
|
+
ticks; use this on demand (after \`convert\`, or on a node not running \`abx serve\`).
|
|
113
|
+
${dim('c.f. site/content/docs/using-abx/self-hosting.mdx → SQLite maintenance.')}`;
|
|
114
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/commands/maintenance.ts"],"names":[],"mappings":"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"}
|