@cleocode/core 2026.9.16 → 2026.9.18

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 (236) hide show
  1. package/dist/changesets/parser.d.ts.map +1 -1
  2. package/dist/changesets/parser.js +67 -0
  3. package/dist/changesets/parser.js.map +1 -1
  4. package/dist/crypto/credentials.d.ts +128 -26
  5. package/dist/crypto/credentials.d.ts.map +1 -1
  6. package/dist/crypto/credentials.js +183 -142
  7. package/dist/crypto/credentials.js.map +1 -1
  8. package/dist/docs/export-document.js +14705 -12949
  9. package/dist/docs/export-document.js.map +3 -3
  10. package/dist/doctor/index.d.ts +1 -1
  11. package/dist/doctor/index.d.ts.map +1 -1
  12. package/dist/doctor/index.js +1 -1
  13. package/dist/doctor/index.js.map +1 -1
  14. package/dist/doctor/nexus-schema-residency.d.ts +1 -1
  15. package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
  16. package/dist/doctor/nexus-schema-residency.js +1 -0
  17. package/dist/doctor/nexus-schema-residency.js.map +1 -1
  18. package/dist/doctor/project-identity.d.ts +124 -0
  19. package/dist/doctor/project-identity.d.ts.map +1 -0
  20. package/dist/doctor/project-identity.js +307 -0
  21. package/dist/doctor/project-identity.js.map +1 -0
  22. package/dist/doctor/superseded-store.d.ts +8 -0
  23. package/dist/doctor/superseded-store.d.ts.map +1 -1
  24. package/dist/doctor/superseded-store.js +48 -3
  25. package/dist/doctor/superseded-store.js.map +1 -1
  26. package/dist/init.d.ts +7 -0
  27. package/dist/init.d.ts.map +1 -1
  28. package/dist/init.js +17 -2
  29. package/dist/init.js.map +1 -1
  30. package/dist/internal.d.ts +6 -3
  31. package/dist/internal.d.ts.map +1 -1
  32. package/dist/internal.js +4 -2
  33. package/dist/internal.js.map +1 -1
  34. package/dist/llm/credentials-store.d.ts +10 -0
  35. package/dist/llm/credentials-store.d.ts.map +1 -1
  36. package/dist/llm/credentials-store.js +7 -1
  37. package/dist/llm/credentials-store.js.map +1 -1
  38. package/dist/llm/plugin-facade.js +13368 -1550
  39. package/dist/llm/plugin-facade.js.map +3 -3
  40. package/dist/nexus/analyze-orchestrator.d.ts +20 -3
  41. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  42. package/dist/nexus/analyze-orchestrator.js +210 -16
  43. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  44. package/dist/nexus/assessment-store.d.ts +86 -0
  45. package/dist/nexus/assessment-store.d.ts.map +1 -0
  46. package/dist/nexus/assessment-store.js +113 -0
  47. package/dist/nexus/assessment-store.js.map +1 -0
  48. package/dist/nexus/freshness.d.ts +131 -0
  49. package/dist/nexus/freshness.d.ts.map +1 -0
  50. package/dist/nexus/freshness.js +391 -0
  51. package/dist/nexus/freshness.js.map +1 -0
  52. package/dist/nexus/graph-manifest.d.ts +88 -0
  53. package/dist/nexus/graph-manifest.d.ts.map +1 -0
  54. package/dist/nexus/graph-manifest.js +114 -0
  55. package/dist/nexus/graph-manifest.js.map +1 -0
  56. package/dist/nexus/knowledge.d.ts +21 -1
  57. package/dist/nexus/knowledge.d.ts.map +1 -1
  58. package/dist/nexus/knowledge.js +74 -37
  59. package/dist/nexus/knowledge.js.map +1 -1
  60. package/dist/nexus/path-map.d.ts +55 -0
  61. package/dist/nexus/path-map.d.ts.map +1 -0
  62. package/dist/nexus/path-map.js +87 -0
  63. package/dist/nexus/path-map.js.map +1 -0
  64. package/dist/nexus/projects-clean.d.ts +21 -28
  65. package/dist/nexus/projects-clean.d.ts.map +1 -1
  66. package/dist/nexus/projects-clean.js +168 -85
  67. package/dist/nexus/projects-clean.js.map +1 -1
  68. package/dist/nexus/query.d.ts.map +1 -1
  69. package/dist/nexus/query.js +3 -2
  70. package/dist/nexus/query.js.map +1 -1
  71. package/dist/nexus/registry-hygiene.d.ts +70 -0
  72. package/dist/nexus/registry-hygiene.d.ts.map +1 -0
  73. package/dist/nexus/registry-hygiene.js +113 -0
  74. package/dist/nexus/registry-hygiene.js.map +1 -0
  75. package/dist/nexus/registry.d.ts +2 -2
  76. package/dist/nexus/registry.d.ts.map +1 -1
  77. package/dist/nexus/registry.js +48 -12
  78. package/dist/nexus/registry.js.map +1 -1
  79. package/dist/paths.d.ts +26 -0
  80. package/dist/paths.d.ts.map +1 -1
  81. package/dist/paths.js +99 -6
  82. package/dist/paths.js.map +1 -1
  83. package/dist/release/index.d.ts +1 -1
  84. package/dist/release/index.d.ts.map +1 -1
  85. package/dist/release/index.js.map +1 -1
  86. package/dist/release/plan.d.ts +84 -2
  87. package/dist/release/plan.d.ts.map +1 -1
  88. package/dist/release/plan.js +61 -14
  89. package/dist/release/plan.js.map +1 -1
  90. package/dist/release/pr-evidence.d.ts +81 -1
  91. package/dist/release/pr-evidence.d.ts.map +1 -1
  92. package/dist/release/pr-evidence.js +149 -9
  93. package/dist/release/pr-evidence.js.map +1 -1
  94. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  95. package/dist/render/nexus/graph/index.js +8 -0
  96. package/dist/render/nexus/graph/index.js.map +1 -1
  97. package/dist/scaffold/ensure-config.d.ts +12 -3
  98. package/dist/scaffold/ensure-config.d.ts.map +1 -1
  99. package/dist/scaffold/ensure-config.js +61 -38
  100. package/dist/scaffold/ensure-config.js.map +1 -1
  101. package/dist/scaffold/project-identity.d.ts +136 -0
  102. package/dist/scaffold/project-identity.d.ts.map +1 -0
  103. package/dist/scaffold/project-identity.js +225 -0
  104. package/dist/scaffold/project-identity.js.map +1 -0
  105. package/dist/selfimprove/fix-gen.js +13319 -1556
  106. package/dist/selfimprove/fix-gen.js.map +3 -3
  107. package/dist/store/agent-api-key.d.ts +114 -0
  108. package/dist/store/agent-api-key.d.ts.map +1 -0
  109. package/dist/store/agent-api-key.js +136 -0
  110. package/dist/store/agent-api-key.js.map +1 -0
  111. package/dist/store/agent-registry-accessor.d.ts +4 -2
  112. package/dist/store/agent-registry-accessor.d.ts.map +1 -1
  113. package/dist/store/agent-registry-accessor.js +39 -89
  114. package/dist/store/agent-registry-accessor.js.map +1 -1
  115. package/dist/store/api-key-kdf.d.ts +7 -0
  116. package/dist/store/api-key-kdf.d.ts.map +1 -1
  117. package/dist/store/api-key-kdf.js +7 -0
  118. package/dist/store/api-key-kdf.js.map +1 -1
  119. package/dist/store/backup-crypto.d.ts +49 -0
  120. package/dist/store/backup-crypto.d.ts.map +1 -1
  121. package/dist/store/backup-crypto.js +154 -0
  122. package/dist/store/backup-crypto.js.map +1 -1
  123. package/dist/store/credential-transfer.d.ts +303 -0
  124. package/dist/store/credential-transfer.d.ts.map +1 -0
  125. package/dist/store/credential-transfer.js +774 -0
  126. package/dist/store/credential-transfer.js.map +1 -0
  127. package/dist/store/exodus/column-transforms.d.ts +79 -4
  128. package/dist/store/exodus/column-transforms.d.ts.map +1 -1
  129. package/dist/store/exodus/column-transforms.js +121 -4
  130. package/dist/store/exodus/column-transforms.js.map +1 -1
  131. package/dist/store/exodus/index.d.ts +1 -0
  132. package/dist/store/exodus/index.d.ts.map +1 -1
  133. package/dist/store/exodus/index.js +1 -0
  134. package/dist/store/exodus/index.js.map +1 -1
  135. package/dist/store/exodus/migrate.d.ts +17 -1
  136. package/dist/store/exodus/migrate.d.ts.map +1 -1
  137. package/dist/store/exodus/migrate.js +155 -33
  138. package/dist/store/exodus/migrate.js.map +1 -1
  139. package/dist/store/exodus/on-open.d.ts +14 -0
  140. package/dist/store/exodus/on-open.d.ts.map +1 -1
  141. package/dist/store/exodus/on-open.js +115 -6
  142. package/dist/store/exodus/on-open.js.map +1 -1
  143. package/dist/store/exodus/reconcile.d.ts +103 -0
  144. package/dist/store/exodus/reconcile.d.ts.map +1 -0
  145. package/dist/store/exodus/reconcile.js +728 -0
  146. package/dist/store/exodus/reconcile.js.map +1 -0
  147. package/dist/store/exodus/recovery.d.ts.map +1 -1
  148. package/dist/store/exodus/recovery.js +14 -2
  149. package/dist/store/exodus/recovery.js.map +1 -1
  150. package/dist/store/exodus/runtime-targets.d.ts +39 -0
  151. package/dist/store/exodus/runtime-targets.d.ts.map +1 -0
  152. package/dist/store/exodus/runtime-targets.js +63 -0
  153. package/dist/store/exodus/runtime-targets.js.map +1 -0
  154. package/dist/store/exodus/table-name-map.d.ts.map +1 -1
  155. package/dist/store/exodus/table-name-map.js +5 -0
  156. package/dist/store/exodus/table-name-map.js.map +1 -1
  157. package/dist/store/exodus/table-order.d.ts +35 -0
  158. package/dist/store/exodus/table-order.d.ts.map +1 -0
  159. package/dist/store/exodus/table-order.js +62 -0
  160. package/dist/store/exodus/table-order.js.map +1 -0
  161. package/dist/store/exodus/verify-migration.d.ts +4 -1
  162. package/dist/store/exodus/verify-migration.d.ts.map +1 -1
  163. package/dist/store/exodus/verify-migration.js +142 -10
  164. package/dist/store/exodus/verify-migration.js.map +1 -1
  165. package/dist/store/global-salt.d.ts +16 -0
  166. package/dist/store/global-salt.d.ts.map +1 -1
  167. package/dist/store/global-salt.js +22 -7
  168. package/dist/store/global-salt.js.map +1 -1
  169. package/dist/store/legacy-tasks-lineage.d.ts +86 -0
  170. package/dist/store/legacy-tasks-lineage.d.ts.map +1 -0
  171. package/dist/store/legacy-tasks-lineage.js +285 -0
  172. package/dist/store/legacy-tasks-lineage.js.map +1 -0
  173. package/dist/store/migration-manager.d.ts +27 -0
  174. package/dist/store/migration-manager.d.ts.map +1 -1
  175. package/dist/store/migration-manager.js +63 -0
  176. package/dist/store/migration-manager.js.map +1 -1
  177. package/dist/store/portable-bundle-import.d.ts +117 -0
  178. package/dist/store/portable-bundle-import.d.ts.map +1 -0
  179. package/dist/store/portable-bundle-import.js +589 -0
  180. package/dist/store/portable-bundle-import.js.map +1 -0
  181. package/dist/store/portable-bundle-relocate.d.ts +66 -0
  182. package/dist/store/portable-bundle-relocate.d.ts.map +1 -0
  183. package/dist/store/portable-bundle-relocate.js +304 -0
  184. package/dist/store/portable-bundle-relocate.js.map +1 -0
  185. package/dist/store/portable-bundle-scan.d.ts +167 -0
  186. package/dist/store/portable-bundle-scan.d.ts.map +1 -0
  187. package/dist/store/portable-bundle-scan.js +569 -0
  188. package/dist/store/portable-bundle-scan.js.map +1 -0
  189. package/dist/store/portable-bundle.d.ts +146 -0
  190. package/dist/store/portable-bundle.d.ts.map +1 -0
  191. package/dist/store/portable-bundle.js +674 -0
  192. package/dist/store/portable-bundle.js.map +1 -0
  193. package/dist/store/regenerators.d.ts +3 -1
  194. package/dist/store/regenerators.d.ts.map +1 -1
  195. package/dist/store/regenerators.js +6 -2
  196. package/dist/store/regenerators.js.map +1 -1
  197. package/dist/store/schema/cleo-global/nexus.d.ts +98 -0
  198. package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
  199. package/dist/store/schema/cleo-global/nexus.js +19 -0
  200. package/dist/store/schema/cleo-global/nexus.js.map +1 -1
  201. package/dist/store/schema/nexus-schema.d.ts +102 -0
  202. package/dist/store/schema/nexus-schema.d.ts.map +1 -1
  203. package/dist/store/schema/nexus-schema.js +24 -0
  204. package/dist/store/schema/nexus-schema.js.map +1 -1
  205. package/dist/store/split-brain-import.d.ts +176 -0
  206. package/dist/store/split-brain-import.d.ts.map +1 -0
  207. package/dist/store/split-brain-import.js +680 -0
  208. package/dist/store/split-brain-import.js.map +1 -0
  209. package/dist/store/sqlite.d.ts +29 -0
  210. package/dist/store/sqlite.d.ts.map +1 -1
  211. package/dist/store/sqlite.js +57 -5
  212. package/dist/store/sqlite.js.map +1 -1
  213. package/dist/system/health.d.ts.map +1 -1
  214. package/dist/system/health.js +30 -5
  215. package/dist/system/health.js.map +1 -1
  216. package/dist/tasks/complete.d.ts.map +1 -1
  217. package/dist/tasks/complete.js +5 -27
  218. package/dist/tasks/complete.js.map +1 -1
  219. package/dist/tasks/evidence.js +1 -1
  220. package/dist/tasks/evidence.js.map +1 -1
  221. package/dist/tasks/verification-policy.d.ts +55 -0
  222. package/dist/tasks/verification-policy.d.ts.map +1 -0
  223. package/dist/tasks/verification-policy.js +75 -0
  224. package/dist/tasks/verification-policy.js.map +1 -0
  225. package/dist/upgrade.d.ts.map +1 -1
  226. package/dist/upgrade.js +60 -0
  227. package/dist/upgrade.js.map +1 -1
  228. package/dist/validation/doctor/checks.d.ts +14 -0
  229. package/dist/validation/doctor/checks.d.ts.map +1 -1
  230. package/dist/validation/doctor/checks.js +33 -0
  231. package/dist/validation/doctor/checks.js.map +1 -1
  232. package/migrations/drizzle-cleo-global/20260924000000_t12354-project-paths/migration.sql +40 -0
  233. package/migrations/drizzle-nexus/20260924000000_t12315-nexus-parse-cache/migration.sql +21 -0
  234. package/package.json +13 -13
  235. package/templates/CLEO-INJECTION.md +3 -3
  236. package/templates/cleo-gitignore +7 -0
@@ -0,0 +1,569 @@
1
+ /**
2
+ * portable-bundle-scan.ts — tree walking, SQLite snapshotting and row
3
+ * counting shared by the portable-bundle export and import sides.
4
+ *
5
+ * Kept free of CLI and registry concerns: it answers "what is in this root,
6
+ * what may leave the machine, and how many rows does each table hold".
7
+ *
8
+ * @task T12318
9
+ * @epic T12317
10
+ * @module store/portable-bundle-scan
11
+ */
12
+ import crypto from 'node:crypto';
13
+ import fs from 'node:fs';
14
+ import { createRequire } from 'node:module';
15
+ import path from 'node:path';
16
+ import { DB_INVENTORY, } from '@cleocode/contracts';
17
+ import { resolveDualScopeDbPath } from './dual-scope-db.js';
18
+ import { applyPerfPragmas } from './sqlite-pragmas.js';
19
+ // node:sqlite interop (createRequire — Vitest strips `node:` prefix)
20
+ const _require = createRequire(import.meta.url);
21
+ const { DatabaseSync } = _require('node:sqlite');
22
+ // ---------------------------------------------------------------------------
23
+ // Store identity — derived from the canonical resolvers, never hand-typed
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Basename of the consolidated (post-E6) store, derived from the dual-scope
27
+ * resolver so a future rename cannot silently strand the export again.
28
+ */
29
+ export const PRIMARY_STORE_BASENAME = path.basename(resolveDualScopeDbPath('global', undefined, path.sep));
30
+ /**
31
+ * Pre-E6 per-domain database basenames that sit directly in a root, by tier.
32
+ * Derived from `DB_INVENTORY` (whose templates still describe the pre-E6
33
+ * layout): any inventory file at the top of `.cleo/` or `<cleoHome>/`.
34
+ */
35
+ export const LEGACY_STORE_BASENAMES = {
36
+ project: legacyBasenames('<projectRoot>/.cleo/'),
37
+ global: legacyBasenames('$XDG_DATA_HOME/cleo/'),
38
+ };
39
+ function legacyBasenames(prefix) {
40
+ const names = new Set();
41
+ for (const entry of DB_INVENTORY) {
42
+ if (!entry.filePathTemplate.startsWith(prefix))
43
+ continue;
44
+ const rest = entry.filePathTemplate.slice(prefix.length);
45
+ if (!rest.includes('/'))
46
+ names.add(rest);
47
+ }
48
+ return names;
49
+ }
50
+ /** File suffixes that are never captured byte-for-byte (live DBs go through VACUUM). */
51
+ const EXCLUDED_FILE_SUFFIXES = [
52
+ ['-wal', 'SQLite WAL sidecar (the database is captured via VACUUM INTO)'],
53
+ ['-shm', 'SQLite shared-memory sidecar (regenerated on open)'],
54
+ ['-journal', 'SQLite rollback journal (the database is captured via VACUUM INTO)'],
55
+ ['.pid', 'process id file (machine-local runtime state)'],
56
+ ['.lock', 'lock file (machine-local runtime state)'],
57
+ ['.sock', 'socket (machine-local runtime state)'],
58
+ ['.tmp', 'temporary file'],
59
+ ];
60
+ const IDENTITY_REMEDY = 'Project signing identity (Ed25519). Without it, run any severity-signing command to mint a new key; previously signed audit lines keep verifying against their embedded public key.';
61
+ /** Walk rules for a project `.cleo/` directory. */
62
+ export const PROJECT_SECTION_RULES = {
63
+ excludedDirs: {
64
+ backups: 'local snapshots (regenerable; the live stores are captured via VACUUM INTO)',
65
+ '.backups': 'local snapshots (regenerable; the live stores are captured via VACUUM INTO)',
66
+ cache: 'cache (regenerable)',
67
+ logs: 'logs (machine-local)',
68
+ locks: 'lock directory (machine-local runtime state)',
69
+ },
70
+ excludedDirNamesAnywhere: {
71
+ worktrees: 'git worktrees (recreated per machine)',
72
+ node_modules: 'dependency install (regenerable)',
73
+ __pycache__: 'Python bytecode cache (regenerable)',
74
+ },
75
+ secretRemedy: (relPath) => (relPath.startsWith('keys/') ? IDENTITY_REMEDY : null),
76
+ };
77
+ /** Secret files in the global CLEO home and what losing each one costs. */
78
+ const GLOBAL_SECRETS = {
79
+ 'global-salt': 'Global salt for agent API-key derivation. A new salt is generated on first use; every registered agent must re-authenticate (re-issue agent API keys).',
80
+ 'llm-credentials.json': 'Stored LLM provider credentials. Re-run provider login / re-enter API keys.',
81
+ 'anthropic-oauth.json': 'Anthropic OAuth session. Re-run the Anthropic login.',
82
+ 'google_oauth.json': 'Google OAuth session. Re-run the Google login.',
83
+ 'anthropic-key': 'Anthropic API key. Re-enter it.',
84
+ };
85
+ /**
86
+ * Generic credential-looking basenames, applied to TOP-LEVEL files of a home
87
+ * (and to everything under `auth/` in the config home). Deeper files are
88
+ * content (skills, templates, docs) where words like "token" are prose.
89
+ */
90
+ const SECRET_BASENAME_PATTERN = /(credential|secret|oauth|password|\.pem$|\.key$|^id_(rsa|ed25519))/i;
91
+ /** Walk rules for the global CLEO home. */
92
+ export const GLOBAL_HOME_RULES = {
93
+ excludedDirs: {
94
+ worktrees: 'agent git worktrees (recreated per machine)',
95
+ 'verification-archives': 'archived verification runs (regenerable history, large)',
96
+ _archive: 'archive of superseded state',
97
+ logs: 'logs (machine-local)',
98
+ backups: 'local snapshots (regenerable)',
99
+ '.backups': 'local snapshots (regenerable)',
100
+ locks: 'lock directory (machine-local runtime state)',
101
+ cache: 'cache (regenerable)',
102
+ '.cleanup-*': 'upgrade cleanup markers (machine-local)',
103
+ '.cleo-import-*': 'in-progress import staging',
104
+ },
105
+ excludedDirNamesAnywhere: {
106
+ node_modules: 'dependency install (regenerable)',
107
+ __pycache__: 'Python bytecode cache (regenerable)',
108
+ },
109
+ excludedFiles: {
110
+ // Device-bound (T12326): restoring it would overwrite the target's key and
111
+ // break every credential already stored there. Credentials move by being
112
+ // re-sealed under the bundle passphrase instead.
113
+ 'machine-key': 'device-bound machine key; never exported, even encrypted (restoring it would break credentials already on the target). Credentials encrypted with it need re-entry or the T12326 credential transfer',
114
+ },
115
+ secretRemedy: (relPath) => {
116
+ const explicit = GLOBAL_SECRETS[relPath];
117
+ if (explicit !== undefined)
118
+ return explicit;
119
+ return !relPath.includes('/') && SECRET_BASENAME_PATTERN.test(relPath)
120
+ ? `Credential-like file "${relPath}". Recreate it on the target machine.`
121
+ : null;
122
+ },
123
+ };
124
+ /** Walk rules for the config home (`$XDG_CONFIG_HOME/cleo`). */
125
+ export const CONFIG_HOME_RULES = {
126
+ excludedDirs: {},
127
+ excludedDirNamesAnywhere: {
128
+ node_modules: 'dependency install (regenerable)',
129
+ __pycache__: 'Python bytecode cache (regenerable)',
130
+ },
131
+ secretRemedy: (relPath) => relPath.startsWith('auth/') || (!relPath.includes('/') && SECRET_BASENAME_PATTERN.test(relPath))
132
+ ? `Provider authentication material "${relPath}". Re-run the provider login.`
133
+ : null,
134
+ };
135
+ /** Maximum entries measured under one excluded directory before reporting a lower bound. */
136
+ const EXCLUSION_MEASURE_BUDGET = 200_000;
137
+ const SQLITE_MAGIC = Buffer.from('SQLite format 3\0', 'latin1');
138
+ /**
139
+ * True when a file starts with the SQLite header.
140
+ *
141
+ * @param absPath - File to test.
142
+ * @returns Whether the file is a SQLite database.
143
+ */
144
+ export function isSqliteFile(absPath) {
145
+ let fd = null;
146
+ try {
147
+ fd = fs.openSync(absPath, 'r');
148
+ const header = Buffer.alloc(16);
149
+ const read = fs.readSync(fd, header, 0, 16, 0);
150
+ return read === 16 && header.equals(SQLITE_MAGIC);
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ finally {
156
+ if (fd !== null)
157
+ fs.closeSync(fd);
158
+ }
159
+ }
160
+ /**
161
+ * Measure bytes and files under a directory, stopping at a budget.
162
+ *
163
+ * @param absDir - Directory to measure (symlinks are not followed).
164
+ * @returns Totals and whether the walk completed.
165
+ */
166
+ function measureDir(absDir) {
167
+ let bytes = 0;
168
+ let fileCount = 0;
169
+ let visited = 0;
170
+ const stack = [absDir];
171
+ while (stack.length > 0) {
172
+ const dir = stack.pop();
173
+ let entries;
174
+ try {
175
+ entries = fs.readdirSync(dir, { withFileTypes: true });
176
+ }
177
+ catch {
178
+ continue;
179
+ }
180
+ for (const entry of entries) {
181
+ visited += 1;
182
+ if (visited > EXCLUSION_MEASURE_BUDGET)
183
+ return { bytes, fileCount, complete: false };
184
+ const abs = path.join(dir, entry.name);
185
+ if (entry.isDirectory()) {
186
+ stack.push(abs);
187
+ }
188
+ else if (entry.isFile()) {
189
+ try {
190
+ bytes += fs.lstatSync(abs).size;
191
+ fileCount += 1;
192
+ }
193
+ catch {
194
+ // vanished mid-walk
195
+ }
196
+ }
197
+ }
198
+ }
199
+ return { bytes, fileCount, complete: true };
200
+ }
201
+ function matchExcludedDir(relPath, name, rules) {
202
+ const anywhere = rules.excludedDirNamesAnywhere[name];
203
+ if (anywhere !== undefined)
204
+ return anywhere;
205
+ for (const [key, reason] of Object.entries(rules.excludedDirs)) {
206
+ if (key.endsWith('*') ? relPath.startsWith(key.slice(0, -1)) : relPath === key)
207
+ return reason;
208
+ }
209
+ return null;
210
+ }
211
+ /** Record a symlink: kept when its target stays inside the root, else excluded. */
212
+ function classifySymlink(scan, root, relPath, abs) {
213
+ let target = '<unreadable>';
214
+ try {
215
+ target = fs.readlinkSync(abs);
216
+ }
217
+ catch {
218
+ // keep placeholder
219
+ }
220
+ const resolved = path.resolve(path.dirname(abs), target);
221
+ const inside = resolved === root || resolved.startsWith(`${root}${path.sep}`);
222
+ if (!path.isAbsolute(target) && inside) {
223
+ scan.symlinks.push({ relPath, target });
224
+ return;
225
+ }
226
+ scan.excluded.push({
227
+ relPath,
228
+ reason: `symlink -> ${target} (points outside the root; not followed — recreate it on the target if needed)`,
229
+ bytes: 0,
230
+ fileCount: 0,
231
+ sizeComplete: true,
232
+ });
233
+ }
234
+ /** Record one regular file: excluded sidecar, secret, SQLite, or plain file. */
235
+ function classifyFile(scan, rules, relPath, name, abs) {
236
+ const suffix = EXCLUDED_FILE_SUFFIXES.find(([s]) => name.endsWith(s));
237
+ if (suffix !== undefined) {
238
+ let size = 0;
239
+ try {
240
+ size = fs.lstatSync(abs).size;
241
+ }
242
+ catch {
243
+ // vanished
244
+ }
245
+ scan.excluded.push({
246
+ relPath,
247
+ reason: suffix[1],
248
+ bytes: size,
249
+ fileCount: 1,
250
+ sizeComplete: true,
251
+ });
252
+ return;
253
+ }
254
+ const never = rules.excludedFiles?.[relPath];
255
+ if (never !== undefined) {
256
+ let size = 0;
257
+ try {
258
+ size = fs.lstatSync(abs).size;
259
+ }
260
+ catch {
261
+ // vanished
262
+ }
263
+ scan.excluded.push({ relPath, reason: never, bytes: size, fileCount: 1, sizeComplete: true });
264
+ return;
265
+ }
266
+ const remedy = rules.secretRemedy(relPath);
267
+ if (remedy !== null)
268
+ scan.secrets.push({ relPath, remedy });
269
+ else if (isSqliteFile(abs))
270
+ scan.sqlite.push(relPath);
271
+ else
272
+ scan.files.push(relPath);
273
+ }
274
+ /**
275
+ * Walk one root and classify every entry. Symlinks are never followed; an
276
+ * in-root relative symlink is recorded for recreation, any other symlink is
277
+ * reported as an exclusion so nothing leaves the root silently.
278
+ *
279
+ * @param root - Absolute root directory.
280
+ * @param rules - Section rules.
281
+ * @param skipAbsolute - Absolute paths to ignore entirely (e.g. the export's own staging dir).
282
+ * @returns The classified scan.
283
+ */
284
+ export function scanSection(root, rules, skipAbsolute = new Set()) {
285
+ const scan = { sqlite: [], files: [], secrets: [], symlinks: [], excluded: [] };
286
+ const stack = [''];
287
+ while (stack.length > 0) {
288
+ const relDir = stack.pop();
289
+ const absDir = relDir === '' ? root : path.join(root, relDir);
290
+ const entries = fs.readdirSync(absDir, { withFileTypes: true });
291
+ entries.sort((a, b) => a.name.localeCompare(b.name));
292
+ for (const entry of entries) {
293
+ const relPath = relDir === '' ? entry.name : `${relDir}/${entry.name}`;
294
+ const abs = path.join(root, relPath);
295
+ if (skipAbsolute.has(abs))
296
+ continue;
297
+ if (entry.isSymbolicLink()) {
298
+ classifySymlink(scan, root, relPath, abs);
299
+ }
300
+ else if (entry.isDirectory()) {
301
+ const reason = matchExcludedDir(relPath, entry.name, rules);
302
+ if (reason === null) {
303
+ stack.push(relPath);
304
+ continue;
305
+ }
306
+ const m = measureDir(abs);
307
+ scan.excluded.push({
308
+ relPath,
309
+ reason,
310
+ bytes: m.bytes,
311
+ fileCount: m.fileCount,
312
+ sizeComplete: m.complete,
313
+ });
314
+ }
315
+ else if (entry.isFile()) {
316
+ classifyFile(scan, rules, relPath, entry.name, abs);
317
+ }
318
+ else {
319
+ scan.excluded.push({
320
+ relPath,
321
+ reason: 'not a regular file (socket/fifo/device)',
322
+ bytes: 0,
323
+ fileCount: 0,
324
+ sizeComplete: true,
325
+ });
326
+ }
327
+ }
328
+ }
329
+ scan.sqlite.sort();
330
+ scan.files.sort();
331
+ return scan;
332
+ }
333
+ // ---------------------------------------------------------------------------
334
+ // SQLite helpers
335
+ // ---------------------------------------------------------------------------
336
+ /**
337
+ * Snapshot a SQLite database with `VACUUM INTO` over a READ-ONLY connection.
338
+ *
339
+ * VACUUM INTO runs inside one read transaction, so the snapshot is
340
+ * consistent even while other processes write through WAL. The source is
341
+ * never checkpointed or otherwise modified.
342
+ *
343
+ * @param srcPath - Source database.
344
+ * @param destPath - Snapshot path (must not exist).
345
+ * @throws {Error} When the source cannot be opened or read.
346
+ */
347
+ export function vacuumSnapshot(srcPath, destPath) {
348
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
349
+ const db = new DatabaseSync(srcPath, { readOnly: true });
350
+ try {
351
+ applyPerfPragmas(db, { enableWal: false });
352
+ db.exec(`VACUUM INTO '${destPath.replace(/'/g, "''")}'`);
353
+ }
354
+ finally {
355
+ db.close();
356
+ }
357
+ }
358
+ /**
359
+ * Count rows in every ordinary table of a database.
360
+ *
361
+ * Virtual tables are reported as uncounted (their rows live in shadow tables,
362
+ * which are counted); any other failure is reported with its message rather
363
+ * than swallowed.
364
+ *
365
+ * @param dbPath - Database to count.
366
+ * @returns Counts and uncountable tables.
367
+ */
368
+ export function countRows(dbPath) {
369
+ const rowCounts = {};
370
+ const uncountedTables = {};
371
+ const db = new DatabaseSync(dbPath, { readOnly: true });
372
+ try {
373
+ applyPerfPragmas(db, { enableWal: false });
374
+ const tables = db
375
+ .prepare("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
376
+ .all();
377
+ for (const t of tables) {
378
+ if ((t.sql ?? '').toUpperCase().startsWith('CREATE VIRTUAL TABLE')) {
379
+ uncountedTables[t.name] = 'virtual table (rows counted in its shadow tables)';
380
+ continue;
381
+ }
382
+ try {
383
+ const row = db
384
+ .prepare(`SELECT COUNT(*) AS cnt FROM "${t.name.replace(/"/g, '""')}"`)
385
+ .get();
386
+ rowCounts[t.name] = Number(row?.cnt ?? 0);
387
+ }
388
+ catch (err) {
389
+ uncountedTables[t.name] = err instanceof Error ? err.message : String(err);
390
+ }
391
+ }
392
+ }
393
+ finally {
394
+ db.close();
395
+ }
396
+ return { rowCounts, uncountedTables };
397
+ }
398
+ /**
399
+ * Run `PRAGMA integrity_check` on a database.
400
+ *
401
+ * @param dbPath - Database to check.
402
+ * @returns `ok` or the first reported problem.
403
+ */
404
+ export function integrityCheck(dbPath) {
405
+ const db = new DatabaseSync(dbPath, { readOnly: true });
406
+ try {
407
+ const row = db.prepare('PRAGMA integrity_check').get();
408
+ return row?.integrity_check ?? 'no result';
409
+ }
410
+ finally {
411
+ db.close();
412
+ }
413
+ }
414
+ /** Tables surfaced as "key counts" in results when present. */
415
+ export const KEY_COUNT_TABLES = [
416
+ 'tasks_tasks',
417
+ 'tasks_sessions',
418
+ 'brain_observations',
419
+ 'brain_decisions',
420
+ 'brain_learnings',
421
+ 'brain_patterns',
422
+ 'conduit_messages',
423
+ 'nexus_project_registry',
424
+ 'nexus_nodes',
425
+ ];
426
+ /**
427
+ * Legacy (pre-E6) table → consolidated table in `cleo.db`, for detecting data
428
+ * that exists only in legacy files.
429
+ */
430
+ export const LEGACY_TABLE_MAP = {
431
+ tasks: 'tasks_tasks',
432
+ sessions: 'tasks_sessions',
433
+ brain_observations: 'brain_observations',
434
+ brain_decisions: 'brain_decisions',
435
+ brain_learnings: 'brain_learnings',
436
+ brain_patterns: 'brain_patterns',
437
+ };
438
+ /**
439
+ * Select the key-table subset of a row-count map.
440
+ *
441
+ * @param rowCounts - Full counts.
442
+ * @returns Counts for the key tables that exist.
443
+ */
444
+ export function pickKeyCounts(rowCounts) {
445
+ const out = {};
446
+ for (const t of KEY_COUNT_TABLES) {
447
+ const v = rowCounts[t];
448
+ if (v !== undefined)
449
+ out[t] = v;
450
+ }
451
+ return out;
452
+ }
453
+ // ---------------------------------------------------------------------------
454
+ // Credential columns (ADR-093 `portable-secret`) and memory tables
455
+ // ---------------------------------------------------------------------------
456
+ /**
457
+ * Credential-bearing columns, by table, that an UNENCRYPTED bundle clears.
458
+ * Found by auditing the live project and global stores for secret-, token-,
459
+ * password- and key-bearing columns (usage counters such as `tokens_used`
460
+ * are not credentials). The rows are kept; only these values are cleared.
461
+ *
462
+ * Interim list: the table classification registry (T12332) is the intended
463
+ * long-term source for the `portable-secret` class.
464
+ */
465
+ export const CREDENTIAL_COLUMNS = {
466
+ // project scope
467
+ agent_credentials: ['api_key_encrypted'],
468
+ tasks_agent_credentials: ['api_key_encrypted'],
469
+ sessions: ['owner_auth_token'],
470
+ tasks_sessions: ['owner_auth_token'],
471
+ playbook_approvals: ['token'],
472
+ tasks_playbook_approvals: ['token'],
473
+ // global scope
474
+ accounts: ['secret_enc'],
475
+ agent_registry_accounts: ['access_token', 'refresh_token', 'id_token', 'password'],
476
+ agent_registry_agents: ['webhook_secret', 'api_key_hash', 'api_key_encrypted'],
477
+ agent_registry_sessions: ['token'],
478
+ agent_registry_users: ['password_hash'],
479
+ service_configs: ['client_secret_enc'],
480
+ service_connections: ['credentials_enc'],
481
+ };
482
+ /** What losing each credential table's secrets costs on the target machine. */
483
+ const CREDENTIAL_REMEDIES = {
484
+ agent_credentials: 'Stored agent API keys: re-issue or re-enter them.',
485
+ tasks_agent_credentials: 'Stored agent API keys: re-issue or re-enter them.',
486
+ sessions: 'Session owner tokens: start a new session (`cleo session start`) to own work again.',
487
+ tasks_sessions: 'Session owner tokens: start a new session (`cleo session start`) to own work again.',
488
+ playbook_approvals: 'Pending HITL resume tokens: re-run the paused playbook step to mint new ones.',
489
+ tasks_playbook_approvals: 'Pending HITL resume tokens: re-run the paused playbook step to mint new ones.',
490
+ accounts: 'Stored account secrets: re-enter them.',
491
+ agent_registry_accounts: 'Provider OAuth tokens / passwords: sign in again.',
492
+ agent_registry_agents: 'Agent API keys and webhook secrets: re-issue agent keys.',
493
+ agent_registry_sessions: 'Agent registry sessions: sign in again.',
494
+ agent_registry_users: 'Registry user passwords: reset them.',
495
+ service_configs: 'Service client secrets: re-enter them.',
496
+ service_connections: 'Service connection credentials: reconnect the services.',
497
+ };
498
+ /** Memory (ADR-093 `portable`) tables whose counts are disclosed on export. */
499
+ export const MEMORY_TABLES = [
500
+ 'brain_observations',
501
+ 'brain_decisions',
502
+ 'brain_learnings',
503
+ 'brain_patterns',
504
+ 'brain_sticky_notes',
505
+ ];
506
+ /**
507
+ * Clear credential columns in a SNAPSHOT (never a live store), then rebuild
508
+ * the file with `secure_delete` + `VACUUM` so the old values are not left in
509
+ * free pages. Rows are kept, so row counts are unchanged.
510
+ *
511
+ * @param snapshotPath - A VACUUM snapshot owned by the export staging area.
512
+ * @returns Per-table redactions (tables with no credential values are omitted).
513
+ * @throws {Error} When a credential column cannot be cleared; the caller must
514
+ * not ship the snapshot.
515
+ */
516
+ export function redactCredentials(snapshotPath) {
517
+ const out = [];
518
+ const db = new DatabaseSync(snapshotPath);
519
+ try {
520
+ db.exec('PRAGMA secure_delete = ON');
521
+ for (const [table, wanted] of Object.entries(CREDENTIAL_COLUMNS)) {
522
+ const present = db.prepare(`PRAGMA table_info("${table}")`).all().filter((c) => wanted.includes(c.name));
523
+ if (present.length === 0)
524
+ continue;
525
+ const cond = present
526
+ .map((c) => `("${c.name}" IS NOT NULL AND "${c.name}" <> '')`)
527
+ .join(' OR ');
528
+ const rows = Number(db.prepare(`SELECT COUNT(*) AS n FROM "${table}" WHERE ${cond}`).get().n);
529
+ if (rows === 0)
530
+ continue;
531
+ const assignments = present
532
+ .map((c) => `"${c.name}" = ${c.notnull ? "''" : 'NULL'}`)
533
+ .join(', ');
534
+ db.exec(`UPDATE "${table}" SET ${assignments} WHERE ${cond}`);
535
+ const left = Number(db.prepare(`SELECT COUNT(*) AS n FROM "${table}" WHERE ${cond}`).get().n);
536
+ if (left !== 0)
537
+ throw new Error(`credential columns of ${table} were not cleared (${left} rows remain)`);
538
+ out.push({
539
+ table,
540
+ columns: present.map((c) => c.name),
541
+ rows,
542
+ remedy: CREDENTIAL_REMEDIES[table] ?? 'Re-enter the credentials.',
543
+ });
544
+ }
545
+ if (out.length > 0)
546
+ db.exec('VACUUM');
547
+ }
548
+ finally {
549
+ db.close();
550
+ }
551
+ return out;
552
+ }
553
+ // ---------------------------------------------------------------------------
554
+ // Hashing
555
+ // ---------------------------------------------------------------------------
556
+ /**
557
+ * Stream a file through SHA-256.
558
+ *
559
+ * @param filePath - File to hash.
560
+ * @returns Lowercase hex digest.
561
+ */
562
+ export async function sha256File(filePath) {
563
+ const hash = crypto.createHash('sha256');
564
+ for await (const chunk of fs.createReadStream(filePath)) {
565
+ hash.update(chunk);
566
+ }
567
+ return hash.digest('hex');
568
+ }
569
+ //# sourceMappingURL=portable-bundle-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-bundle-scan.js","sourceRoot":"","sources":["../../src/store/portable-bundle-scan.ts"],"names":[],"mappings":"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"}