@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.
Files changed (189) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/assets/renderer-scaffold/README.md +41 -11
  3. package/assets/renderer-scaffold/foundry.toml +5 -0
  4. package/assets/renderer-scaffold/remappings.txt +1 -1
  5. package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
  6. package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
  7. package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
  8. package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
  9. package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
  10. package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
  11. package/dist/bin.d.ts +26 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +63 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/capabilities.d.ts +99 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +144 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/commands/auth.d.ts +54 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +447 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/deploy.d.ts +242 -0
  24. package/dist/commands/deploy.d.ts.map +1 -0
  25. package/dist/commands/deploy.js +5429 -0
  26. package/dist/commands/deploy.js.map +1 -0
  27. package/dist/commands/feedback.d.ts +7 -0
  28. package/dist/commands/feedback.d.ts.map +1 -0
  29. package/dist/commands/feedback.js +147 -0
  30. package/dist/commands/feedback.js.map +1 -0
  31. package/dist/commands/maintenance.d.ts +4 -0
  32. package/dist/commands/maintenance.d.ts.map +1 -0
  33. package/dist/commands/maintenance.js +114 -0
  34. package/dist/commands/maintenance.js.map +1 -0
  35. package/dist/commands/project.d.ts +429 -0
  36. package/dist/commands/project.d.ts.map +1 -0
  37. package/dist/commands/project.js +1720 -0
  38. package/dist/commands/project.js.map +1 -0
  39. package/dist/commands/reads.d.ts +85 -0
  40. package/dist/commands/reads.d.ts.map +1 -0
  41. package/dist/commands/reads.js +868 -0
  42. package/dist/commands/reads.js.map +1 -0
  43. package/dist/commands/scaffold.d.ts +89 -0
  44. package/dist/commands/scaffold.d.ts.map +1 -0
  45. package/dist/commands/scaffold.js +738 -0
  46. package/dist/commands/scaffold.js.map +1 -0
  47. package/dist/commands/service.d.ts +67 -0
  48. package/dist/commands/service.d.ts.map +1 -0
  49. package/dist/commands/service.js +748 -0
  50. package/dist/commands/service.js.map +1 -0
  51. package/dist/commands/storage.d.ts +51 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +399 -0
  54. package/dist/commands/storage.js.map +1 -0
  55. package/dist/commands/submit-app.d.ts +102 -0
  56. package/dist/commands/submit-app.d.ts.map +1 -0
  57. package/dist/commands/submit-app.js +622 -0
  58. package/dist/commands/submit-app.js.map +1 -0
  59. package/dist/config.d.ts +105 -2
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +351 -12
  62. package/dist/config.js.map +1 -1
  63. package/dist/conformance.d.ts +31 -0
  64. package/dist/conformance.d.ts.map +1 -0
  65. package/dist/conformance.js +390 -0
  66. package/dist/conformance.js.map +1 -0
  67. package/dist/contract-read-error.d.ts +5 -0
  68. package/dist/contract-read-error.d.ts.map +1 -0
  69. package/dist/contract-read-error.js +37 -0
  70. package/dist/contract-read-error.js.map +1 -0
  71. package/dist/deploy-plan.d.ts +150 -0
  72. package/dist/deploy-plan.d.ts.map +1 -0
  73. package/dist/deploy-plan.js +31 -0
  74. package/dist/deploy-plan.js.map +1 -0
  75. package/dist/deps.d.ts +6 -39
  76. package/dist/deps.d.ts.map +1 -1
  77. package/dist/deps.js +4 -68
  78. package/dist/deps.js.map +1 -1
  79. package/dist/errors.d.ts +20 -0
  80. package/dist/errors.d.ts.map +1 -0
  81. package/dist/errors.js +25 -0
  82. package/dist/errors.js.map +1 -0
  83. package/dist/flag-allowlists.d.ts +53 -0
  84. package/dist/flag-allowlists.d.ts.map +1 -0
  85. package/dist/flag-allowlists.js +184 -0
  86. package/dist/flag-allowlists.js.map +1 -0
  87. package/dist/flags.d.ts +47 -0
  88. package/dist/flags.d.ts.map +1 -1
  89. package/dist/flags.js +125 -1
  90. package/dist/flags.js.map +1 -1
  91. package/dist/jsonout.d.ts +37 -0
  92. package/dist/jsonout.d.ts.map +1 -0
  93. package/dist/jsonout.js +79 -0
  94. package/dist/jsonout.js.map +1 -0
  95. package/dist/kind.d.ts +57 -0
  96. package/dist/kind.d.ts.map +1 -0
  97. package/dist/kind.js +122 -0
  98. package/dist/kind.js.map +1 -0
  99. package/dist/main.js +786 -4838
  100. package/dist/main.js.map +1 -1
  101. package/dist/mintpage.d.ts +17 -2
  102. package/dist/mintpage.d.ts.map +1 -1
  103. package/dist/mintpage.js +241 -54
  104. package/dist/mintpage.js.map +1 -1
  105. package/dist/output.d.ts +179 -0
  106. package/dist/output.d.ts.map +1 -0
  107. package/dist/output.js +780 -0
  108. package/dist/output.js.map +1 -0
  109. package/dist/ownerops.d.ts +381 -57
  110. package/dist/ownerops.d.ts.map +1 -1
  111. package/dist/ownerops.js +2014 -359
  112. package/dist/ownerops.js.map +1 -1
  113. package/dist/preview.d.ts +23 -5
  114. package/dist/preview.d.ts.map +1 -1
  115. package/dist/preview.js +95 -43
  116. package/dist/preview.js.map +1 -1
  117. package/dist/prompt.d.ts +17 -0
  118. package/dist/prompt.d.ts.map +1 -0
  119. package/dist/prompt.js +19 -0
  120. package/dist/prompt.js.map +1 -0
  121. package/dist/provision.d.ts +3 -13
  122. package/dist/provision.d.ts.map +1 -1
  123. package/dist/provision.js +19 -21
  124. package/dist/provision.js.map +1 -1
  125. package/dist/remote.d.ts +157 -52
  126. package/dist/remote.d.ts.map +1 -1
  127. package/dist/remote.js +435 -46
  128. package/dist/remote.js.map +1 -1
  129. package/dist/riskgate.d.ts +62 -0
  130. package/dist/riskgate.d.ts.map +1 -0
  131. package/dist/riskgate.js +234 -0
  132. package/dist/riskgate.js.map +1 -0
  133. package/dist/scaffold.d.ts +12 -0
  134. package/dist/scaffold.d.ts.map +1 -0
  135. package/dist/scaffold.js +56 -0
  136. package/dist/scaffold.js.map +1 -0
  137. package/dist/schema.d.ts +36 -1
  138. package/dist/schema.d.ts.map +1 -1
  139. package/dist/schema.js +121 -26
  140. package/dist/schema.js.map +1 -1
  141. package/dist/script-chunks.d.ts +8 -0
  142. package/dist/script-chunks.d.ts.map +1 -0
  143. package/dist/script-chunks.js +35 -0
  144. package/dist/script-chunks.js.map +1 -0
  145. package/dist/served.d.ts +30 -0
  146. package/dist/served.d.ts.map +1 -0
  147. package/dist/served.js +112 -0
  148. package/dist/served.js.map +1 -0
  149. package/dist/signer.d.ts +13 -0
  150. package/dist/signer.d.ts.map +1 -1
  151. package/dist/signer.js +84 -15
  152. package/dist/signer.js.map +1 -1
  153. package/dist/update-check.d.ts +86 -5
  154. package/dist/update-check.d.ts.map +1 -1
  155. package/dist/update-check.js +161 -20
  156. package/dist/update-check.js.map +1 -1
  157. package/package.json +13 -12
  158. package/skill/SKILL.md +181 -347
  159. package/skill/agents/openai.yaml +4 -0
  160. package/skill/reference/capabilities.md +188 -0
  161. package/skill/reference/code.md +220 -0
  162. package/skill/reference/creator-token.md +94 -0
  163. package/skill/reference/deploy.md +174 -0
  164. package/skill/reference/diagnose.md +178 -0
  165. package/skill/reference/hosting.md +186 -93
  166. package/skill/reference/operate.md +220 -0
  167. package/skill/reference/services.md +121 -0
  168. package/skill/reference/setup.md +154 -36
  169. package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
  170. package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
  171. package/dist/inspect.d.ts +0 -48
  172. package/dist/inspect.d.ts.map +0 -1
  173. package/dist/inspect.js +0 -184
  174. package/dist/inspect.js.map +0 -1
  175. package/dist/migrate.d.ts +0 -65
  176. package/dist/migrate.d.ts.map +0 -1
  177. package/dist/migrate.js +0 -180
  178. package/dist/migrate.js.map +0 -1
  179. package/dist/onchain-uri.d.ts +0 -97
  180. package/dist/onchain-uri.d.ts.map +0 -1
  181. package/dist/onchain-uri.js +0 -243
  182. package/dist/onchain-uri.js.map +0 -1
  183. package/dist/upload.d.ts +0 -28
  184. package/dist/upload.d.ts.map +0 -1
  185. package/dist/upload.js +0 -41
  186. package/dist/upload.js.map +0 -1
  187. package/skill/reference/code-projects.md +0 -246
  188. package/skill/reference/operating.md +0 -116
  189. 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,4 @@
1
+ import { type Flags } from '../flags.js';
2
+ export declare function cmdVacuum(rest: string[], flags: Flags): Promise<void>;
3
+ export declare const VACUUM_HELP: string;
4
+ //# sourceMappingURL=maintenance.d.ts.map
@@ -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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"}