@cleocode/core 2026.10.19 → 2026.10.20
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/dist/audit-prune.d.ts +18 -0
- package/dist/audit-prune.d.ts.map +1 -1
- package/dist/audit-prune.js +42 -1
- package/dist/audit-prune.js.map +1 -1
- package/dist/build-provenance.json +2 -2
- package/dist/cloud/nexus-vault.d.ts.map +1 -1
- package/dist/cloud/nexus-vault.js +41 -4
- package/dist/cloud/nexus-vault.js.map +1 -1
- package/dist/docs/docs-update.d.ts.map +1 -1
- package/dist/docs/docs-update.js +136 -28
- package/dist/docs/docs-update.js.map +1 -1
- package/dist/docs/export-document.js +9 -0
- package/dist/docs/export-document.js.map +1 -1
- package/dist/docs/section-write-path.d.ts +26 -0
- package/dist/docs/section-write-path.d.ts.map +1 -1
- package/dist/docs/section-write-path.js +49 -2
- package/dist/docs/section-write-path.js.map +1 -1
- package/dist/goal/runtime.d.ts +6 -2
- package/dist/goal/runtime.d.ts.map +1 -1
- package/dist/goal/runtime.js +12 -3
- package/dist/goal/runtime.js.map +1 -1
- package/dist/hooks/payload-schemas.d.ts +3 -3
- package/dist/llm/plugin-facade.js +8 -0
- package/dist/llm/plugin-facade.js.map +1 -1
- package/dist/memory/learnings.d.ts +8 -8
- package/dist/memory/patterns.d.ts +14 -14
- package/dist/memory/redaction.js +8 -0
- package/dist/memory/redaction.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +16 -0
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +45 -1
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/selfimprove/fix-gen.js +8 -0
- package/dist/selfimprove/fix-gen.js.map +1 -1
- package/dist/sentient/ingesters/nexus-ingester.d.ts.map +1 -1
- package/dist/sentient/ingesters/nexus-ingester.js +2 -1
- package/dist/sentient/ingesters/nexus-ingester.js.map +1 -1
- package/dist/sessions/session-end-snapshot.d.ts +3 -0
- package/dist/sessions/session-end-snapshot.d.ts.map +1 -1
- package/dist/sessions/session-end-snapshot.js +6 -0
- package/dist/sessions/session-end-snapshot.js.map +1 -1
- package/dist/store/audit-log-schema.d.ts +25 -17
- package/dist/store/audit-log-schema.d.ts.map +1 -1
- package/dist/store/audit-log-schema.js +6 -0
- package/dist/store/audit-log-schema.js.map +1 -1
- package/dist/store/display-id-alias.d.ts.map +1 -1
- package/dist/store/display-id-alias.js +3 -1
- package/dist/store/display-id-alias.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +11 -0
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/nexus-validation-schemas.d.ts +8 -8
- package/dist/store/schema/attachments.d.ts +3 -3
- package/dist/store/schema/audit.d.ts +14 -14
- package/dist/store/schema/audit.d.ts.map +1 -1
- package/dist/store/schema/audit.js +5 -4
- package/dist/store/schema/audit.js.map +1 -1
- package/dist/store/schema/background-jobs.d.ts +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +5 -5
- package/dist/store/schema/cleo-global/nexus.js +3 -3
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-global/services.d.ts +1 -1
- package/dist/store/schema/cleo-global/skills.d.ts +3 -3
- package/dist/store/schema/cleo-project/audit.d.ts +14 -14
- package/dist/store/schema/cleo-project/audit.js +5 -5
- package/dist/store/schema/cleo-project/audit.js.map +1 -1
- package/dist/store/schema/cleo-project/docs.d.ts +4 -4
- package/dist/store/schema/cleo-project/lifecycle.d.ts +4 -4
- package/dist/store/schema/cleo-project/nexus-graph.d.ts +3 -3
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +5 -5
- package/dist/store/schema/cleo-project/runtime.d.ts +3 -3
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +10 -10
- package/dist/store/schema/cleo-shared/brain.d.ts +24 -24
- package/dist/store/schema/lifecycle.d.ts +4 -4
- package/dist/store/schema/manifest.d.ts +1 -1
- package/dist/store/schema/memory-schema.d.ts +27 -27
- package/dist/store/schema/nexus-schema.d.ts +7 -7
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +3 -2
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +2 -2
- package/dist/store/schema/schema-utils.d.ts +52 -0
- package/dist/store/schema/schema-utils.d.ts.map +1 -1
- package/dist/store/schema/schema-utils.js +138 -47
- package/dist/store/schema/schema-utils.js.map +6 -1
- package/dist/store/schema/skills-schema.d.ts +3 -3
- package/dist/store/schema/tasks.d.ts +9 -9
- package/dist/store/sync/apply/resolve-conflict.d.ts.map +1 -1
- package/dist/store/sync/apply/resolve-conflict.js +3 -1
- package/dist/store/sync/apply/resolve-conflict.js.map +1 -1
- package/dist/store/sync/apply/write-api.d.ts.map +1 -1
- package/dist/store/sync/apply/write-api.js +10 -2
- package/dist/store/sync/apply/write-api.js.map +1 -1
- package/dist/store/sync/audit-scrub.d.ts +47 -0
- package/dist/store/sync/audit-scrub.d.ts.map +1 -0
- package/dist/store/sync/audit-scrub.js +90 -0
- package/dist/store/sync/audit-scrub.js.map +1 -0
- package/dist/store/sync/merge/engine.d.ts.map +1 -1
- package/dist/store/sync/merge/engine.js +7 -1
- package/dist/store/sync/merge/engine.js.map +1 -1
- package/dist/store/sync/merge/rules.d.ts.map +1 -1
- package/dist/store/sync/merge/rules.js +10 -0
- package/dist/store/sync/merge/rules.js.map +1 -1
- package/dist/store/sync/merge/types.d.ts +7 -0
- package/dist/store/sync/merge/types.d.ts.map +1 -1
- package/dist/store/sync/reconcile-copy.d.ts.map +1 -1
- package/dist/store/sync/reconcile-copy.js +6 -2
- package/dist/store/sync/reconcile-copy.js.map +1 -1
- package/dist/store/sync/schema.d.ts +10 -0
- package/dist/store/sync/schema.d.ts.map +1 -1
- package/dist/store/sync/schema.js +24 -0
- package/dist/store/sync/schema.js.map +1 -1
- package/dist/store/sync/sequencing.d.ts.map +1 -1
- package/dist/store/sync/sequencing.js +11 -1
- package/dist/store/sync/sequencing.js.map +1 -1
- package/dist/store/table-classification.d.ts +3 -2
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +14 -5
- package/dist/store/table-classification.js.map +1 -1
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +4 -1
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +89 -89
- package/dist/store/vault-manifest.d.ts +21 -1
- package/dist/store/vault-manifest.d.ts.map +1 -1
- package/dist/store/vault-manifest.js +62 -9
- package/dist/store/vault-manifest.js.map +1 -1
- package/package.json +13 -13
- package/templates/CLEO-INJECTION.md +1 -1
- package/templates/CLEO-REFERENCE.md +1 -1
package/dist/audit-prune.d.ts
CHANGED
|
@@ -93,4 +93,22 @@ export declare function auditPruneCondition(table: PrunableAuditTable, cutoff: s
|
|
|
93
93
|
* @param config - LoggingConfig with auditRetentionDays and archiveBeforePrune
|
|
94
94
|
*/
|
|
95
95
|
export declare function pruneAuditLog(cleoDir: string, config: LoggingConfig): Promise<PruneResult>;
|
|
96
|
+
/** File under `.cleo/logs/` holding the time of the last automatic prune (T13828). */
|
|
97
|
+
export declare const AUTO_AUDIT_PRUNE_STAMP = "audit-prune.last";
|
|
98
|
+
/** The least time between two automatic prunes of one project: a day (T13828). */
|
|
99
|
+
export declare const AUTO_AUDIT_PRUNE_INTERVAL_MS = 86400000;
|
|
100
|
+
/**
|
|
101
|
+
* The automatic audit prune (T13828): {@link pruneAuditLog} with the project's
|
|
102
|
+
* `logging` config, at most once per {@link AUTO_AUDIT_PRUNE_INTERVAL_MS} per
|
|
103
|
+
* project. Session end runs it after its snapshot; `cleo admin cleanup
|
|
104
|
+
* --target logs` still prunes on demand.
|
|
105
|
+
*
|
|
106
|
+
* The stamp is written before the prune, so concurrent session ends skip
|
|
107
|
+
* rather than all prune. Never throws.
|
|
108
|
+
*
|
|
109
|
+
* @param projectRoot - The project root.
|
|
110
|
+
* @param now - The current time (tests).
|
|
111
|
+
* @returns The prune result, or `null` when a prune ran within the interval or it failed.
|
|
112
|
+
*/
|
|
113
|
+
export declare function autoPruneAuditLog(projectRoot: string, now?: Date): Promise<PruneResult | null>;
|
|
96
114
|
//# sourceMappingURL=audit-prune.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-prune.d.ts","sourceRoot":"","sources":["../src/audit-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAuB,KAAK,GAAG,EAAO,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-prune.d.ts","sourceRoot":"","sources":["../src/audit-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAuB,KAAK,GAAG,EAAO,MAAM,aAAa,CAAC;AAIjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAI1E,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAIvD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,4FAA4F;AAC5F,MAAM,MAAM,kBAAkB,GAAG,OAAO,QAAQ,GAAG,OAAO,aAAa,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CASlF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CA8EhG;AAED,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,WAAa,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB7B"}
|
package/dist/audit-prune.js
CHANGED
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @task T5339
|
|
12
12
|
*/
|
|
13
|
-
import { createWriteStream, mkdirSync } from 'node:fs';
|
|
13
|
+
import { createWriteStream, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
15
|
import { Readable } from 'node:stream';
|
|
16
16
|
import { pipeline } from 'node:stream/promises';
|
|
17
17
|
import { createGzip } from 'node:zlib';
|
|
18
18
|
import { and, lt, notInArray, sql } from 'drizzle-orm';
|
|
19
19
|
import { getLogger } from './logger.js';
|
|
20
|
+
import { getCleoDir } from './paths.js';
|
|
20
21
|
import { AC_BINDINGS_PRUNED_ACTION } from './store/ac-binding-prune.js';
|
|
21
22
|
const log = getLogger('prune');
|
|
22
23
|
/**
|
|
@@ -159,4 +160,44 @@ export async function pruneAuditLog(cleoDir, config) {
|
|
|
159
160
|
return { rowsArchived: 0, rowsDeleted: 0 };
|
|
160
161
|
}
|
|
161
162
|
}
|
|
163
|
+
/** File under `.cleo/logs/` holding the time of the last automatic prune (T13828). */
|
|
164
|
+
export const AUTO_AUDIT_PRUNE_STAMP = 'audit-prune.last';
|
|
165
|
+
/** The least time between two automatic prunes of one project: a day (T13828). */
|
|
166
|
+
export const AUTO_AUDIT_PRUNE_INTERVAL_MS = 86_400_000;
|
|
167
|
+
/**
|
|
168
|
+
* The automatic audit prune (T13828): {@link pruneAuditLog} with the project's
|
|
169
|
+
* `logging` config, at most once per {@link AUTO_AUDIT_PRUNE_INTERVAL_MS} per
|
|
170
|
+
* project. Session end runs it after its snapshot; `cleo admin cleanup
|
|
171
|
+
* --target logs` still prunes on demand.
|
|
172
|
+
*
|
|
173
|
+
* The stamp is written before the prune, so concurrent session ends skip
|
|
174
|
+
* rather than all prune. Never throws.
|
|
175
|
+
*
|
|
176
|
+
* @param projectRoot - The project root.
|
|
177
|
+
* @param now - The current time (tests).
|
|
178
|
+
* @returns The prune result, or `null` when a prune ran within the interval or it failed.
|
|
179
|
+
*/
|
|
180
|
+
export async function autoPruneAuditLog(projectRoot, now = new Date()) {
|
|
181
|
+
try {
|
|
182
|
+
const cleoDir = getCleoDir(projectRoot);
|
|
183
|
+
const stamp = join(cleoDir, 'logs', AUTO_AUDIT_PRUNE_STAMP);
|
|
184
|
+
let last = Number.NaN;
|
|
185
|
+
try {
|
|
186
|
+
last = Date.parse(readFileSync(stamp, 'utf8').trim());
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// never pruned automatically
|
|
190
|
+
}
|
|
191
|
+
if (now.getTime() - last < AUTO_AUDIT_PRUNE_INTERVAL_MS)
|
|
192
|
+
return null;
|
|
193
|
+
mkdirSync(join(cleoDir, 'logs'), { recursive: true });
|
|
194
|
+
writeFileSync(stamp, `${now.toISOString()}\n`);
|
|
195
|
+
const { loadConfig } = await import('./config.js');
|
|
196
|
+
return await pruneAuditLog(cleoDir, (await loadConfig(projectRoot)).logging);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
log.warn({ err, projectRoot }, 'automatic audit prune failed');
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
162
203
|
//# sourceMappingURL=audit-prune.js.map
|
package/dist/audit-prune.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-prune.js","sourceRoot":"","sources":["../src/audit-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-prune.js","sourceRoot":"","sources":["../src/audit-prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexus-vault.d.ts","sourceRoot":"","sources":["../../src/cloud/nexus-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAQH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EAGf,eAAe,EAEf,sBAAsB,EAGtB,iBAAiB,EAGlB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"nexus-vault.d.ts","sourceRoot":"","sources":["../../src/cloud/nexus-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,7 @@ import { SYNC_SCHEMA_VERSION } from '@cleocode/contracts/sync-schema.js';
|
|
|
63
63
|
import { readDeclaredProjectIdentity } from '@cleocode/paths';
|
|
64
64
|
import { extract as tarExtract } from 'tar';
|
|
65
65
|
import { z } from 'zod';
|
|
66
|
+
import { currentDeviceId } from '../nexus/path-map.js';
|
|
66
67
|
import { getCleoHome, resolveOrCwd } from '../paths.js';
|
|
67
68
|
import { withLock } from '../store/lock.js';
|
|
68
69
|
import { exportPortableBundle, globalHomeRules } from '../store/portable-bundle.js';
|
|
@@ -85,7 +86,7 @@ import { sealBacklog } from '../store/sync/seal-backlog.js';
|
|
|
85
86
|
import { sealPending } from '../store/sync/sealer.js';
|
|
86
87
|
import { unpushedSegments } from '../store/sync/segments.js';
|
|
87
88
|
import { firstBadTxnSignature, signTxn } from '../store/sync/txn-signing.js';
|
|
88
|
-
import { buildVaultManifest, carryMachineState, compareVaultManifests, emptyVaultTableHash, isVaultAnnotationKey, isVaultForkManifest, sameVaultManifest, VAULT_FILES_KEY, VAULT_FORK_KEY, VAULT_FORMAT_KEY, VAULT_GLOBAL_CONFIG_LOCAL_KEYS, VAULT_MANIFEST_FORMAT_VERSION, vaultDatabaseEntry, vaultDatabaseKey, vaultFileDigest, vaultFilesEntry, vaultForkEntry, vaultFormatEntry, vaultManifestFormat, vaultStripColumns, } from '../store/vault-manifest.js';
|
|
89
|
+
import { buildVaultManifest, carryMachineState, compareVaultManifests, emptyVaultTableHash, isVaultAnnotationKey, isVaultForkManifest, sameVaultAuthoredState, sameVaultManifest, VAULT_FILES_KEY, VAULT_FORK_KEY, VAULT_FORMAT_KEY, VAULT_GLOBAL_CONFIG_LOCAL_KEYS, VAULT_MANIFEST_FORMAT_VERSION, vaultDatabaseEntry, vaultDatabaseKey, vaultFileDigest, vaultFilesEntry, vaultForkEntry, vaultFormatEntry, vaultManifestFormat, vaultStripColumns, } from '../store/vault-manifest.js';
|
|
89
90
|
import { foreignWriterLeases, storeOpenElsewhere } from '../store/writer-lease.js';
|
|
90
91
|
import { autoSyncSuppressedBy } from './auto-sync.js';
|
|
91
92
|
import { deriveKey, uuidv7 } from './crypto.js';
|
|
@@ -568,6 +569,18 @@ function compareWithSynced(local, snapshot, git, changes) {
|
|
|
568
569
|
return rows;
|
|
569
570
|
return rows.map((r) => (r.table === VAULT_FILES_KEY ? { ...r, match: changes.length === 0 } : r));
|
|
570
571
|
}
|
|
572
|
+
/**
|
|
573
|
+
* The changes a pull must not overwrite (T13850): {@link compareWithSynced},
|
|
574
|
+
* except that `cleo.db` tables count as unchanged when the authored digests
|
|
575
|
+
* agree, since then they differ only in what memory reads wrote (retrieval
|
|
576
|
+
* log, citation counters), and the snapshot may replace that.
|
|
577
|
+
*/
|
|
578
|
+
function changesToKeep(local, snapshot, git, changes) {
|
|
579
|
+
const rows = compareWithSynced(local, snapshot, git, changes);
|
|
580
|
+
if (!sameVaultAuthoredState(local, snapshot))
|
|
581
|
+
return rows;
|
|
582
|
+
return rows.map((r) => (isSnapshotAuthoritativeKey(r.table) ? r : { ...r, match: true }));
|
|
583
|
+
}
|
|
571
584
|
/**
|
|
572
585
|
* This device's local-only change journal, emptied in every vault snapshot
|
|
573
586
|
* (T13042): capture, undo and quarantined images, and apply intents (T12757),
|
|
@@ -835,6 +848,29 @@ async function localManifest(t, git, untracked, like) {
|
|
|
835
848
|
vault.tables[VAULT_FILES_KEY] = vaultFilesEntry(files, hashKey);
|
|
836
849
|
return { manifest: vault, files: digests };
|
|
837
850
|
}
|
|
851
|
+
/**
|
|
852
|
+
* Rows a store writes about this machine on its own: the device's heartbeat
|
|
853
|
+
* row in `nexus_devices`, which login and every CLI start write and the next
|
|
854
|
+
* start rewrites. A restore that replaces it loses nothing, so it never makes
|
|
855
|
+
* a never-synced store hold data of its own (T13853).
|
|
856
|
+
*/
|
|
857
|
+
async function ownMachineRows(t) {
|
|
858
|
+
if (t.scope !== 'global')
|
|
859
|
+
return {};
|
|
860
|
+
const { openNativeDatabase } = await import('../store/sqlite-native.js');
|
|
861
|
+
const db = openNativeDatabase(t.dbPath, { readonly: true, enableWal: false });
|
|
862
|
+
try {
|
|
863
|
+
if (!hasTable(db, 'nexus_devices'))
|
|
864
|
+
return {};
|
|
865
|
+
const { n } = db
|
|
866
|
+
.prepare('SELECT count(*) AS n FROM nexus_devices WHERE device_id = ?')
|
|
867
|
+
.get(currentDeviceId());
|
|
868
|
+
return Number(n) > 0 ? { nexus_devices: Number(n) } : {};
|
|
869
|
+
}
|
|
870
|
+
finally {
|
|
871
|
+
db.close();
|
|
872
|
+
}
|
|
873
|
+
}
|
|
838
874
|
/**
|
|
839
875
|
* This store's section as a vault snapshot walks it: the section root, the
|
|
840
876
|
* export's walk rules (so secrets, excluded directories and machine-local
|
|
@@ -1255,7 +1291,7 @@ async function pushJournalCheckpoint(conn, key, opts, scope, warnings) {
|
|
|
1255
1291
|
throw vaultError('E_NEXUS_VAULT_REFUSED', `this store's rows do not reconcile with ${t.streamId}'s change journal (${unexplained.slice(0, 8).join(', ')}): ${exemptOnly ? 'these tables are not in the change journal yet, and this Cleo Nexus server does not take a snapshot-authoritative list (manifest.snapshot-authoritative)' : transition ? `the head snapshot is vault format ${parentFormat}, and the local rows it counted do not explain the shortfall: synced rows are missing from this store` : 'a write landed outside the journal'}`, exemptOnly
|
|
1256
1292
|
? 'nothing was written; upgrade the Cleo Nexus server, then push again'
|
|
1257
1293
|
: transition
|
|
1258
|
-
? 'nothing was written; run `cleo cloud pull` to take the cloud copy, or `cleo cloud push --force` to keep this store as a labelled fork'
|
|
1294
|
+
? 'nothing was written; run `cleo cloud pull --force` to take the cloud copy, or `cleo cloud push --force` to keep this store as a labelled fork'
|
|
1259
1295
|
: 'nothing was written; run `cleo cloud sync`, then push again');
|
|
1260
1296
|
}
|
|
1261
1297
|
const vaultOnlyChanged = keys.some((k) => isSnapshotAuthoritativeKey(k) && local[k] !== (parent.manifest.tables[k]?.rows ?? 0));
|
|
@@ -2981,9 +3017,10 @@ async function restoreNexusVaultImpl(opts) {
|
|
|
2981
3017
|
? await localManifest(t, git, untrackedComparison(t, git, synced), last?.manifest)
|
|
2982
3018
|
: null;
|
|
2983
3019
|
if (local !== null) {
|
|
2984
|
-
const
|
|
3020
|
+
const own = last ? {} : await ownMachineRows(t);
|
|
3021
|
+
const hasRows = Object.entries(local.manifest.tables).some(([name, x]) => x.rows - (own[name] ?? 0) > 0 && name !== VAULT_FILES_KEY);
|
|
2985
3022
|
const fileChanges = fileChangesSinceSync(local.files, t, git, synced);
|
|
2986
|
-
const rows = last ?
|
|
3023
|
+
const rows = last ? changesToKeep(local.manifest, last.manifest, git, fileChanges) : [];
|
|
2987
3024
|
if ((!last && hasRows) || rows.some((d) => !d.match)) {
|
|
2988
3025
|
const changed = rows
|
|
2989
3026
|
.filter((d) => !d.match)
|