@cleocode/core 2026.10.18 → 2026.10.19
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/build-provenance.json +2 -2
- package/dist/check/pr-gate.js +1 -1
- package/dist/check/pr-gate.js.map +1 -1
- package/dist/cloud/nexus-vault.d.ts +4 -3
- package/dist/cloud/nexus-vault.d.ts.map +1 -1
- package/dist/cloud/nexus-vault.js +62 -22
- package/dist/cloud/nexus-vault.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/docs/conduit-history-backfill.d.ts +210 -0
- package/dist/docs/conduit-history-backfill.d.ts.map +1 -0
- package/dist/docs/conduit-history-backfill.js +451 -0
- package/dist/docs/conduit-history-backfill.js.map +1 -0
- package/dist/docs/docs-ops.d.ts +33 -0
- package/dist/docs/docs-ops.d.ts.map +1 -1
- package/dist/docs/docs-ops.js +72 -0
- package/dist/docs/docs-ops.js.map +1 -1
- package/dist/docs/docs-update.d.ts.map +1 -1
- package/dist/docs/docs-update.js +71 -0
- package/dist/docs/docs-update.js.map +1 -1
- package/dist/docs/doctor.d.ts +18 -4
- package/dist/docs/doctor.d.ts.map +1 -1
- package/dist/docs/doctor.js +124 -3
- package/dist/docs/doctor.js.map +1 -1
- package/dist/docs/section-merge.d.ts +70 -9
- package/dist/docs/section-merge.d.ts.map +1 -1
- package/dist/docs/section-merge.js +167 -10
- package/dist/docs/section-merge.js.map +1 -1
- package/dist/docs/section-write-path.d.ts.map +1 -1
- package/dist/docs/section-write-path.js +23 -8
- package/dist/docs/section-write-path.js.map +1 -1
- package/dist/gateway-client/generated/types.gen.d.ts +4 -0
- package/dist/gateway-client/generated/types.gen.d.ts.map +1 -1
- package/dist/go/driver.d.ts +29 -145
- package/dist/go/driver.d.ts.map +1 -1
- package/dist/go/driver.js +75 -168
- package/dist/go/driver.js.map +1 -1
- package/dist/go/index.d.ts +1 -1
- package/dist/go/index.d.ts.map +1 -1
- package/dist/go/index.js +1 -1
- package/dist/go/index.js.map +1 -1
- package/dist/goal/close.d.ts +1 -1
- package/dist/goal/close.js +2 -2
- package/dist/goal/close.js.map +1 -1
- package/dist/goal/draft.d.ts +10 -3
- package/dist/goal/draft.d.ts.map +1 -1
- package/dist/goal/draft.js +14 -9
- package/dist/goal/draft.js.map +1 -1
- package/dist/goal/index.d.ts +9 -12
- package/dist/goal/index.d.ts.map +1 -1
- package/dist/goal/index.js +9 -12
- package/dist/goal/index.js.map +1 -1
- package/dist/goal/runtime.d.ts +126 -0
- package/dist/goal/runtime.d.ts.map +1 -0
- package/dist/goal/runtime.js +289 -0
- package/dist/goal/runtime.js.map +1 -0
- package/dist/goal/status.d.ts +39 -0
- package/dist/goal/status.d.ts.map +1 -0
- package/dist/goal/status.js +101 -0
- package/dist/goal/status.js.map +1 -0
- package/dist/hooks/project-runner.d.ts +8 -3
- package/dist/hooks/project-runner.d.ts.map +1 -1
- package/dist/hooks/project-runner.js +104 -14
- package/dist/hooks/project-runner.js.map +1 -1
- package/dist/hooks/project-state.js +1 -1
- package/dist/hooks/project-state.js.map +1 -1
- package/dist/internal.d.ts +7 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +5 -3
- package/dist/internal.js.map +1 -1
- package/dist/lifecycle/engine-ops.d.ts.map +1 -1
- package/dist/lifecycle/engine-ops.js +9 -6
- package/dist/lifecycle/engine-ops.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +4 -8
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -1
- package/dist/paths.js.map +1 -1
- package/dist/playbooks/cantbook-profile.d.ts +3 -3
- package/dist/playbooks/cantbook-profile.js +3 -3
- package/dist/playbooks/pi-runner-wiring.d.ts +3 -3
- package/dist/playbooks/pi-runner-wiring.js +3 -3
- package/dist/release/ci-evidence.d.ts +28 -0
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +76 -20
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/release/open.d.ts +11 -0
- package/dist/release/open.d.ts.map +1 -1
- package/dist/release/open.js +49 -10
- package/dist/release/open.js.map +1 -1
- package/dist/release/preflight-skip.d.ts +50 -0
- package/dist/release/preflight-skip.d.ts.map +1 -1
- package/dist/release/preflight-skip.js +151 -34
- package/dist/release/preflight-skip.js.map +1 -1
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +6 -3
- package/dist/release/reconcile.js.map +1 -1
- package/dist/scaffold/ensure-config.d.ts +1 -1
- package/dist/scaffold/ensure-config.d.ts.map +1 -1
- package/dist/scaffold/ensure-config.js +2 -0
- package/dist/scaffold/ensure-config.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/override-cap-setting.d.ts +180 -0
- package/dist/security/override-cap-setting.d.ts.map +1 -0
- package/dist/security/override-cap-setting.js +657 -0
- package/dist/security/override-cap-setting.js.map +1 -0
- package/dist/security/override-cap.d.ts +20 -29
- package/dist/security/override-cap.d.ts.map +1 -1
- package/dist/security/override-cap.js +47 -71
- package/dist/security/override-cap.js.map +1 -1
- package/dist/security/owner-override-auth.d.ts +58 -0
- package/dist/security/owner-override-auth.d.ts.map +1 -1
- package/dist/security/owner-override-auth.js +82 -1
- package/dist/security/owner-override-auth.js.map +1 -1
- package/dist/security/owner-override-authority.d.ts +67 -0
- package/dist/security/owner-override-authority.d.ts.map +1 -0
- package/dist/security/owner-override-authority.js +100 -0
- package/dist/security/owner-override-authority.js.map +1 -0
- package/dist/sessions/handoff.d.ts.map +1 -1
- package/dist/sessions/handoff.js +4 -5
- package/dist/sessions/handoff.js.map +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +22 -25
- package/dist/sessions/index.js.map +1 -1
- package/dist/store/conduit-doc-history.d.ts +39 -7
- package/dist/store/conduit-doc-history.d.ts.map +1 -1
- package/dist/store/conduit-doc-history.js +62 -12
- package/dist/store/conduit-doc-history.js.map +1 -1
- package/dist/store/data-safety-central.d.ts.map +1 -1
- package/dist/store/data-safety-central.js +3 -2
- package/dist/store/data-safety-central.js.map +1 -1
- package/dist/store/json.d.ts.map +1 -1
- package/dist/store/json.js +7 -7
- package/dist/store/json.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts +23 -1
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +85 -3
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +6 -1
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/row-identity-registry.d.ts +5 -3
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +54 -38
- package/dist/store/row-identity-registry.js.map +1 -1
- package/dist/store/schema/cleo-project/conduit.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/conduit.js +4 -3
- package/dist/store/schema/cleo-project/conduit.js.map +1 -1
- package/dist/store/schema/cleo-project/runtime.d.ts +32 -0
- package/dist/store/schema/cleo-project/runtime.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/runtime.js +7 -3
- package/dist/store/schema/cleo-project/runtime.js.map +1 -1
- package/dist/store/session-store.d.ts +45 -0
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +96 -1
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sqlite.d.ts +2 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +12 -0
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/sync/merge/rules.d.ts.map +1 -1
- package/dist/store/sync/merge/rules.js +0 -16
- package/dist/store/sync/merge/rules.js.map +1 -1
- package/dist/store/sync/sealer.d.ts.map +1 -1
- package/dist/store/sync/sealer.js +27 -1
- package/dist/store/sync/sealer.js.map +1 -1
- package/dist/store/sync/sequencing.d.ts +3 -1
- package/dist/store/sync/sequencing.d.ts.map +1 -1
- package/dist/store/sync/sequencing.js +5 -3
- package/dist/store/sync/sequencing.js.map +1 -1
- package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
- package/dist/store/sync/timestamp-canon.js +4 -0
- package/dist/store/sync/timestamp-canon.js.map +1 -1
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +12 -8
- package/dist/store/table-classification.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +21 -0
- package/dist/store/twin-collapse.d.ts.map +1 -1
- package/dist/store/twin-collapse.js +235 -18
- package/dist/store/twin-collapse.js.map +1 -1
- package/dist/system/health.d.ts +17 -0
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +96 -0
- package/dist/system/health.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +67 -2
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +149 -21
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +91 -5
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/changeset-plan.d.ts +33 -0
- package/dist/tasks/changeset-plan.d.ts.map +1 -0
- package/dist/tasks/changeset-plan.js +152 -0
- package/dist/tasks/changeset-plan.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +9 -1
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +28 -14
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +5 -1
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +149 -18
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +76 -4
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/qa-run-binding.d.ts +18 -0
- package/dist/tasks/qa-run-binding.d.ts.map +1 -1
- package/dist/tasks/qa-run-binding.js +41 -1
- package/dist/tasks/qa-run-binding.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +62 -0
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +126 -21
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/tasks/tool-resolver.d.ts +7 -0
- package/dist/tasks/tool-resolver.d.ts.map +1 -1
- package/dist/tasks/tool-resolver.js +3 -1
- package/dist/tasks/tool-resolver.js.map +1 -1
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +24 -29
- package/dist/validation/engine-ops.js.map +1 -1
- package/migrations/drizzle-cleo-project/20261016120000_t12535-playbook-row-uids/migration.sql +24 -0
- package/package.json +13 -13
- package/schemas/project-context.schema.json +5 -0
- package/templates/CLEO-INJECTION.md +1 -1
- package/templates/CLEO-REFERENCE.md +42 -1
- package/templates/cleo-gitignore +3 -0
- package/templates/git-hooks/legacy-hashes.json +1 -0
- package/templates/git-hooks/pre-push +35 -7
- package/templates/workflows/release-prepare.yml.tmpl +82 -4
- package/dist/goal/advance-with-persist.d.ts +0 -80
- package/dist/goal/advance-with-persist.d.ts.map +0 -1
- package/dist/goal/advance-with-persist.js +0 -105
- package/dist/goal/advance-with-persist.js.map +0 -1
- package/dist/goal/arm.d.ts +0 -61
- package/dist/goal/arm.d.ts.map +0 -1
- package/dist/goal/arm.js +0 -65
- package/dist/goal/arm.js.map +0 -1
- package/dist/goal/continuation.d.ts +0 -66
- package/dist/goal/continuation.d.ts.map +0 -1
- package/dist/goal/continuation.js +0 -111
- package/dist/goal/continuation.js.map +0 -1
- package/dist/goal/judge.d.ts +0 -113
- package/dist/goal/judge.d.ts.map +0 -1
- package/dist/goal/judge.js +0 -193
- package/dist/goal/judge.js.map +0 -1
- package/dist/goal/loop.d.ts +0 -75
- package/dist/goal/loop.d.ts.map +0 -1
- package/dist/goal/loop.js +0 -132
- package/dist/goal/loop.js.map +0 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T13727 — backfill `conduit_attachment_versions` for docs whose history
|
|
3
|
+
* predates the conduit adoption.
|
|
4
|
+
*
|
|
5
|
+
* The section write path (`section-write-path.ts`) has projected every docs
|
|
6
|
+
* update through the conduit history family since the adoption release, but
|
|
7
|
+
* updates from BEFORE the adoption wrote no conduit rows — the T13360
|
|
8
|
+
* migration projected only then-current content. A doc at `docVersion` 3 can
|
|
9
|
+
* therefore hold a single conduit version row (the first post-adoption
|
|
10
|
+
* update, minted as local display ordinal 1), with versions 1..N−1 known
|
|
11
|
+
* only to the legacy surfaces. This module is the historical complement to
|
|
12
|
+
* that projection: it reconstructs the missing rows from the honest
|
|
13
|
+
* pre-adoption sources and inserts them through the canonical accessor.
|
|
14
|
+
*
|
|
15
|
+
* Honest-metadata contract (Council condition for migrated history):
|
|
16
|
+
*
|
|
17
|
+
* - The version CHAIN comes from the docs-versioning audit log
|
|
18
|
+
* (`.cleo/audit/docs-versioning.jsonl`): each changed revision records
|
|
19
|
+
* the real timestamp (`ts`), the real author (`attachedBy`) and the real
|
|
20
|
+
* content address (`sha256`). Version 1 anchors at the first revision's
|
|
21
|
+
* `previousSha256`; its creation instant is read from the matching
|
|
22
|
+
* `docs_attachments` row (historical rows keep their `created_at` after
|
|
23
|
+
* an update re-homes the slug), and its author is unknown — recorded as
|
|
24
|
+
* {@link CONDUIT_BACKFILL_AUTHOR}, never invented.
|
|
25
|
+
* - `changeType` is the schema's honest `'migrated'` (via
|
|
26
|
+
* {@link importMigratedConduitVersion}); `origin` is `'backfill-t13727'`
|
|
27
|
+
* so repair-synthesized rows never pose as T13360 imports.
|
|
28
|
+
* - `contentHash` addresses the REAL historical bytes. When the bytes are
|
|
29
|
+
* unrecoverable (neither the blob store nor the legacy attachment tree
|
|
30
|
+
* holds them), the position is recorded as a GAP and skipped — content
|
|
31
|
+
* is never fabricated. The parent chain links across a gap to the
|
|
32
|
+
* nearest present ancestor and the report counts the gap.
|
|
33
|
+
* - Existing conduit rows are NEVER updated or renumbered (append-only).
|
|
34
|
+
* Matching is by CONTENT HASH, never by ordinal or tail position
|
|
35
|
+
* (review-2253): a chain position whose hash already has a row is done;
|
|
36
|
+
* an existing row whose hash is not in the chain refuses the doc
|
|
37
|
+
* (reported for manual review); complete means every recoverable
|
|
38
|
+
* position is present, and unrecoverable positions stay reported as
|
|
39
|
+
* gaps rather than being silently dropped.
|
|
40
|
+
*
|
|
41
|
+
* Idempotency: a doc whose chain positions all have rows (by content hash)
|
|
42
|
+
* is skipped; per-row natural uids (doc uid, content hash, createdAt) make a
|
|
43
|
+
* partial re-run a verified no-op via `ON CONFLICT DO NOTHING`.
|
|
44
|
+
*
|
|
45
|
+
* The parent link from the last backfilled row to the first EXISTING row is
|
|
46
|
+
* implicit (content alignment + display ordinals); existing rows'
|
|
47
|
+
* `parent_version_uid` is history and stays untouched.
|
|
48
|
+
*
|
|
49
|
+
* @module
|
|
50
|
+
* @task T13727
|
|
51
|
+
* @epic T13340
|
|
52
|
+
* @saga T13339
|
|
53
|
+
*/
|
|
54
|
+
import { createHash } from 'node:crypto';
|
|
55
|
+
import { readFileSync } from 'node:fs';
|
|
56
|
+
import { readFile } from 'node:fs/promises';
|
|
57
|
+
import { join } from 'node:path';
|
|
58
|
+
import { and, asc, eq, isNotNull } from 'drizzle-orm';
|
|
59
|
+
import { resolveCleoDir } from '../paths.js';
|
|
60
|
+
import { resolveLegacyByteSource } from '../store/blob-keep.js';
|
|
61
|
+
import { importMigratedConduitVersion, listConduitAttachmentVersions, withConduitDocWriteTransaction, } from '../store/conduit-doc-history.js';
|
|
62
|
+
import { naturalRowUid } from '../store/row-identity.js';
|
|
63
|
+
import { conduitAttachments } from '../store/schema/cleo-project/conduit.js';
|
|
64
|
+
import { getDb } from '../store/sqlite.js';
|
|
65
|
+
import { docsAttachments } from '../store/tasks-schema.js';
|
|
66
|
+
import { DOCS_VERSIONING_AUDIT_FILE } from './docs-update.js';
|
|
67
|
+
/**
|
|
68
|
+
* Honest author label for backfilled rows whose real author is unrecoverable
|
|
69
|
+
* (the original creation predates the docs-versioning audit trail's author
|
|
70
|
+
* tracking on revisions, and `docs_attachments` records no author).
|
|
71
|
+
*
|
|
72
|
+
* @task T13727
|
|
73
|
+
*/
|
|
74
|
+
export const CONDUIT_BACKFILL_AUTHOR = 'cleo:backfill-t13727';
|
|
75
|
+
/**
|
|
76
|
+
* Import provenance written to `conduit_attachment_versions.origin` — keeps
|
|
77
|
+
* repair-synthesized rows distinguishable from T13360 `'migrated'` imports
|
|
78
|
+
* and from native (`NULL`) rows.
|
|
79
|
+
*
|
|
80
|
+
* @task T13727
|
|
81
|
+
*/
|
|
82
|
+
export const CONDUIT_BACKFILL_ORIGIN = 'backfill-t13727';
|
|
83
|
+
/** MIME used to probe the legacy attachment tree for historical doc bytes. */
|
|
84
|
+
const DOC_PROBE_MIME = 'text/markdown';
|
|
85
|
+
/**
|
|
86
|
+
* Measure a token count the way the docs write path does
|
|
87
|
+
* (`section-write-path.ts`) — whitespace-split, empty tokens dropped.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
function countTokens(text) {
|
|
92
|
+
return text.split(/\s+/).filter((w) => w.length > 0).length;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* True when `value` is a non-empty string (the audit parser's field guard).
|
|
96
|
+
* @internal
|
|
97
|
+
*/
|
|
98
|
+
function isNonEmptyString(value) {
|
|
99
|
+
return typeof value === 'string' && value.length > 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Read the docs-versioning audit log once, flattening every squash window's
|
|
103
|
+
* revisions into a per-slug chronological list. Malformed lines and entries
|
|
104
|
+
* are skipped — the file is an audit aid, and a corrupt line must not fail
|
|
105
|
+
* the repair planning pass.
|
|
106
|
+
*
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
function readAuditRevisionsBySlug(projectRoot) {
|
|
110
|
+
let raw;
|
|
111
|
+
try {
|
|
112
|
+
raw = readFileSync(join(projectRoot, DOCS_VERSIONING_AUDIT_FILE), 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return new Map();
|
|
116
|
+
}
|
|
117
|
+
const bySlug = new Map();
|
|
118
|
+
for (const line of raw.split('\n')) {
|
|
119
|
+
if (line.trim().length === 0)
|
|
120
|
+
continue;
|
|
121
|
+
let entry;
|
|
122
|
+
try {
|
|
123
|
+
entry = JSON.parse(line);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (entry.op !== 'docs.update' || !isNonEmptyString(entry.slug))
|
|
129
|
+
continue;
|
|
130
|
+
if (!Array.isArray(entry.revisions))
|
|
131
|
+
continue;
|
|
132
|
+
const list = bySlug.get(entry.slug) ?? [];
|
|
133
|
+
for (const revision of entry.revisions) {
|
|
134
|
+
if (revision !== null && typeof revision === 'object') {
|
|
135
|
+
list.push(revision);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
bySlug.set(entry.slug, list);
|
|
139
|
+
}
|
|
140
|
+
return bySlug;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Read the bytes for `sha256` from the blob store or the legacy attachment
|
|
144
|
+
* tree, verifying the SHA-256 before returning. Read-only: unlike
|
|
145
|
+
* `blobReadBySha` this never heals/mirrors — planning and dry runs must stay
|
|
146
|
+
* side-effect free. A candidate whose hash does not verify is skipped (a
|
|
147
|
+
* corrupt file at the address is a gap, not content).
|
|
148
|
+
*
|
|
149
|
+
* @internal
|
|
150
|
+
*/
|
|
151
|
+
async function readVerifiedVersionBytes(cleoDir, sha256) {
|
|
152
|
+
const candidates = [
|
|
153
|
+
join(cleoDir, 'blobs', 'blobs', sha256),
|
|
154
|
+
resolveLegacyByteSource(cleoDir, sha256, DOC_PROBE_MIME),
|
|
155
|
+
];
|
|
156
|
+
for (const candidate of candidates) {
|
|
157
|
+
if (candidate === null)
|
|
158
|
+
continue;
|
|
159
|
+
let bytes;
|
|
160
|
+
try {
|
|
161
|
+
bytes = await readFile(candidate);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (createHash('sha256').update(bytes).digest('hex') === sha256)
|
|
167
|
+
return bytes;
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Reconstruct one doc's pre-adoption version chain from the honest sources.
|
|
173
|
+
*
|
|
174
|
+
* Chain shape: position 1 anchors at the first audit revision's
|
|
175
|
+
* `previousSha256` (the content the slug pointed at before any recorded
|
|
176
|
+
* update); every CHANGED revision appends its `sha256` as the next state.
|
|
177
|
+
* Noop revisions (a lifecycle-only update writes `changed: false`) create no
|
|
178
|
+
* new content state and are skipped. A doc the audit log never saw yields a
|
|
179
|
+
* single-state chain from its current `docs_attachments` row.
|
|
180
|
+
*
|
|
181
|
+
* Returns null when the chain cannot be anchored honestly (the first
|
|
182
|
+
* revision carries no usable `previousSha256` but changed revisions exist) —
|
|
183
|
+
* the caller reports the doc as unrecoverable rather than mislabeling a
|
|
184
|
+
* later state as the root.
|
|
185
|
+
*
|
|
186
|
+
* @internal
|
|
187
|
+
*/
|
|
188
|
+
async function deriveChainStates(db, slug, revisions) {
|
|
189
|
+
const changed = revisions.filter((r) => r.changed === true && isNonEmptyString(r.ts) && isNonEmptyString(r.sha256));
|
|
190
|
+
if (revisions.length === 0) {
|
|
191
|
+
const row = await db
|
|
192
|
+
.select({ sha256: docsAttachments.sha256, createdAt: docsAttachments.createdAt })
|
|
193
|
+
.from(docsAttachments)
|
|
194
|
+
.where(eq(docsAttachments.slug, slug))
|
|
195
|
+
.get();
|
|
196
|
+
if (!row)
|
|
197
|
+
return [];
|
|
198
|
+
// Honest labeling (review-2253 LOW-2): the audit log records NOTHING for
|
|
199
|
+
// this doc, so the single state is the version that SURVIVED, not a
|
|
200
|
+
// recorded "original version" — chain length 1 by survival, and any
|
|
201
|
+
// earlier history is unrecoverable rather than absent-by-proof.
|
|
202
|
+
return [
|
|
203
|
+
{
|
|
204
|
+
position: 1,
|
|
205
|
+
sha256: row.sha256,
|
|
206
|
+
createdAt: row.createdAt,
|
|
207
|
+
authorAgentId: CONDUIT_BACKFILL_AUTHOR,
|
|
208
|
+
changeSummary: 'only surviving version — doc predates the docs-versioning audit log; ' +
|
|
209
|
+
'earlier history is unrecoverable (backfilled by T13727)',
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
const anchor = revisions[0]?.previousSha256;
|
|
214
|
+
if (!isNonEmptyString(anchor))
|
|
215
|
+
return null;
|
|
216
|
+
const firstTs = revisions[0]?.ts;
|
|
217
|
+
// The anchor row must be the ORIGINAL creation row (doc_version = 1), not
|
|
218
|
+
// just any row carrying the sha: content-address dedupe reuses one
|
|
219
|
+
// docs_attachments row across slugs, and a reused row's created_at belongs
|
|
220
|
+
// to another doc's timeline (review-2253 LOW-1).
|
|
221
|
+
const anchorRow = await db
|
|
222
|
+
.select({ createdAt: docsAttachments.createdAt })
|
|
223
|
+
.from(docsAttachments)
|
|
224
|
+
.where(and(eq(docsAttachments.sha256, anchor), eq(docsAttachments.docVersion, 1)))
|
|
225
|
+
.get();
|
|
226
|
+
if (!anchorRow && !isNonEmptyString(firstTs))
|
|
227
|
+
return null;
|
|
228
|
+
const states = [
|
|
229
|
+
{
|
|
230
|
+
position: 1,
|
|
231
|
+
sha256: anchor,
|
|
232
|
+
createdAt: anchorRow?.createdAt ?? firstTs,
|
|
233
|
+
authorAgentId: CONDUIT_BACKFILL_AUTHOR,
|
|
234
|
+
changeSummary: anchorRow
|
|
235
|
+
? 'original version (pre-adoption history backfilled by T13727)'
|
|
236
|
+
: 'original version — timestamp is the first recorded update; the creation instant ' +
|
|
237
|
+
'is unrecoverable (pre-adoption history backfilled by T13727)',
|
|
238
|
+
},
|
|
239
|
+
];
|
|
240
|
+
for (const revision of changed) {
|
|
241
|
+
const message = isNonEmptyString(revision.message) ? `: ${revision.message}` : '';
|
|
242
|
+
states.push({
|
|
243
|
+
position: states.length + 1,
|
|
244
|
+
sha256: revision.sha256,
|
|
245
|
+
createdAt: revision.ts,
|
|
246
|
+
authorAgentId: isNonEmptyString(revision.attachedBy)
|
|
247
|
+
? revision.attachedBy
|
|
248
|
+
: CONDUIT_BACKFILL_AUTHOR,
|
|
249
|
+
changeSummary: `pre-adoption history backfilled by T13727${message}`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
return states;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Plan the conduit-history backfill for every adopted doc.
|
|
256
|
+
*
|
|
257
|
+
* A doc is in scope when the docs registry (`docs_attachments`) knows its
|
|
258
|
+
* slug AND a `conduit_attachments` row exists for it — the doc was adopted
|
|
259
|
+
* (or migrated) but its pre-adoption updates wrote no conduit rows. Pure
|
|
260
|
+
* with respect to the database and the blob store: safe in dry-run planning.
|
|
261
|
+
*
|
|
262
|
+
* Matching model (review-2253): matching is by CONTENT HASH, never by
|
|
263
|
+
* ordinal or tail position — after a gapped apply the existing set mixes
|
|
264
|
+
* backfilled low positions with minted rows, so a positional tail check
|
|
265
|
+
* would false-conflict forever. The rules:
|
|
266
|
+
*
|
|
267
|
+
* - a chain position whose content_hash already has a row is done;
|
|
268
|
+
* - a position with no row and no verified bytes is a gap (counted);
|
|
269
|
+
* - an existing row whose content_hash is not in the chain is a conflict
|
|
270
|
+
* (the doc is refused and reported, never overwritten);
|
|
271
|
+
* - complete means every recoverable position is present — a doc with
|
|
272
|
+
* permanent gaps can be complete AND still report them.
|
|
273
|
+
*
|
|
274
|
+
* Existing rows keep their minted local display ordinals (rows are
|
|
275
|
+
* append-only); backfilled rows carry their chain position as
|
|
276
|
+
* `version_number`, so ordinals may repeat across the seam — the schema
|
|
277
|
+
* defines `version_number` as a local display ordinal that is never a key,
|
|
278
|
+
* and `docs versions` assigns read-time display ordinals instead.
|
|
279
|
+
*
|
|
280
|
+
* @param projectRoot - Absolute path to the CLEO project root.
|
|
281
|
+
* @returns One plan per in-scope doc (complete, backfill, gap or conflict).
|
|
282
|
+
* @task T13727
|
|
283
|
+
*/
|
|
284
|
+
export async function planConduitHistoryBackfill(projectRoot) {
|
|
285
|
+
const db = await getDb(projectRoot);
|
|
286
|
+
const registrySlugs = new Set((await db
|
|
287
|
+
.select({ slug: docsAttachments.slug })
|
|
288
|
+
.from(docsAttachments)
|
|
289
|
+
.where(isNotNull(docsAttachments.slug))
|
|
290
|
+
.all()).map((r) => r.slug));
|
|
291
|
+
const conduitDocs = await db
|
|
292
|
+
.select({ uid: conduitAttachments.uid, slug: conduitAttachments.slug })
|
|
293
|
+
.from(conduitAttachments)
|
|
294
|
+
.where(isNotNull(conduitAttachments.slug))
|
|
295
|
+
.orderBy(asc(conduitAttachments.slug))
|
|
296
|
+
.all();
|
|
297
|
+
const revisionsBySlug = readAuditRevisionsBySlug(projectRoot);
|
|
298
|
+
const cleoDir = resolveCleoDir(projectRoot);
|
|
299
|
+
const plans = [];
|
|
300
|
+
for (const doc of conduitDocs) {
|
|
301
|
+
if (doc.slug === null || doc.uid === null)
|
|
302
|
+
continue;
|
|
303
|
+
if (!registrySlugs.has(doc.slug))
|
|
304
|
+
continue;
|
|
305
|
+
const slug = doc.slug;
|
|
306
|
+
const registryRow = await db
|
|
307
|
+
.select({ docVersion: docsAttachments.docVersion })
|
|
308
|
+
.from(docsAttachments)
|
|
309
|
+
.where(eq(docsAttachments.slug, slug))
|
|
310
|
+
.get();
|
|
311
|
+
const existing = (await listConduitAttachmentVersions(projectRoot, doc.uid)).sort((a, b) => a.versionNumber - b.versionNumber);
|
|
312
|
+
const base = {
|
|
313
|
+
slug,
|
|
314
|
+
docUid: doc.uid,
|
|
315
|
+
existingVersions: existing.length,
|
|
316
|
+
auditGapVersions: 0,
|
|
317
|
+
};
|
|
318
|
+
const states = await deriveChainStates(db, slug, revisionsBySlug.get(slug) ?? []);
|
|
319
|
+
if (states === null) {
|
|
320
|
+
plans.push({
|
|
321
|
+
...base,
|
|
322
|
+
expectedVersions: 0,
|
|
323
|
+
presentVersions: 0,
|
|
324
|
+
toBackfill: [],
|
|
325
|
+
gaps: [],
|
|
326
|
+
complete: false,
|
|
327
|
+
conflict: true,
|
|
328
|
+
});
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const auditGapVersions = Math.max(0, (registryRow?.docVersion ?? states.length) - states.length);
|
|
332
|
+
// An existing row whose content_hash is not in the chain contradicts
|
|
333
|
+
// the honest sources — refuse the doc and report it, never overwrite.
|
|
334
|
+
const chainHashes = new Set(states.map((s) => s.sha256));
|
|
335
|
+
if (existing.some((row) => !chainHashes.has(row.contentHash))) {
|
|
336
|
+
plans.push({
|
|
337
|
+
...base,
|
|
338
|
+
expectedVersions: states.length,
|
|
339
|
+
auditGapVersions,
|
|
340
|
+
presentVersions: 0,
|
|
341
|
+
toBackfill: [],
|
|
342
|
+
gaps: [],
|
|
343
|
+
complete: false,
|
|
344
|
+
conflict: true,
|
|
345
|
+
});
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
// Content-hash matching (review-2253): no ordinal or tail-position
|
|
349
|
+
// assumptions — a position is done when its hash already has a row.
|
|
350
|
+
const hashPresent = new Set(existing.map((r) => r.contentHash));
|
|
351
|
+
// Earliest-created row per hash is the DAG parent candidate when several
|
|
352
|
+
// rows share a content hash (a revert, a recorded conflict).
|
|
353
|
+
const uidByHash = new Map();
|
|
354
|
+
for (const row of [...existing].sort((a, b) => a.createdAt.localeCompare(b.createdAt) || (a.uid ?? '').localeCompare(b.uid ?? ''))) {
|
|
355
|
+
if (typeof row.uid === 'string' && row.uid.length > 0 && !uidByHash.has(row.contentHash)) {
|
|
356
|
+
uidByHash.set(row.contentHash, row.uid);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const toBackfill = [];
|
|
360
|
+
const gaps = [];
|
|
361
|
+
let presentVersions = 0;
|
|
362
|
+
// The DAG parent of the next backfilled row: the uid of the nearest
|
|
363
|
+
// lower chain position that has (or will have, via this plan) a row.
|
|
364
|
+
let lastRowUid = null;
|
|
365
|
+
for (const state of states) {
|
|
366
|
+
if (hashPresent.has(state.sha256)) {
|
|
367
|
+
presentVersions += 1;
|
|
368
|
+
const uid = uidByHash.get(state.sha256);
|
|
369
|
+
if (uid !== undefined)
|
|
370
|
+
lastRowUid = uid;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
const bytes = await readVerifiedVersionBytes(cleoDir, state.sha256);
|
|
374
|
+
if (bytes === null) {
|
|
375
|
+
gaps.push({ position: state.position, sha256: state.sha256 });
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
toBackfill.push({
|
|
379
|
+
...state,
|
|
380
|
+
sizeBytes: bytes.length,
|
|
381
|
+
tokens: countTokens(bytes.toString('utf-8')),
|
|
382
|
+
parentVersionUid: lastRowUid,
|
|
383
|
+
});
|
|
384
|
+
// The uid this row WILL have — importMigratedConduitVersion derives the
|
|
385
|
+
// same natural uid, so the link is stable across a re-run.
|
|
386
|
+
lastRowUid = naturalRowUid('project', 'conduit_attachment_versions', [
|
|
387
|
+
doc.uid,
|
|
388
|
+
state.sha256,
|
|
389
|
+
state.createdAt,
|
|
390
|
+
]);
|
|
391
|
+
}
|
|
392
|
+
plans.push({
|
|
393
|
+
...base,
|
|
394
|
+
expectedVersions: states.length,
|
|
395
|
+
auditGapVersions,
|
|
396
|
+
presentVersions,
|
|
397
|
+
toBackfill,
|
|
398
|
+
gaps,
|
|
399
|
+
// Complete = every recoverable position is present; permanent gaps
|
|
400
|
+
// stay reported in `gaps` rather than being silently dropped.
|
|
401
|
+
complete: toBackfill.length === 0,
|
|
402
|
+
conflict: false,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
return plans;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Execute one {@link ConduitDocBackfillPlan}: insert the synthesized history
|
|
409
|
+
* rows through the canonical accessor, one transaction per doc.
|
|
410
|
+
*
|
|
411
|
+
* Every statement inside the transaction resolves without a real I/O yield
|
|
412
|
+
* (bytes were read and measured during planning; {@link withConduitDocWriteTransaction}
|
|
413
|
+
* brackets the inserts), so a partial backfill cannot leave a forked chain.
|
|
414
|
+
* Per-row natural uids make a re-run a verified no-op; a doc whose count
|
|
415
|
+
* already equals the chain length was filtered by the planner
|
|
416
|
+
* (`complete: true`) and inserts nothing here.
|
|
417
|
+
*
|
|
418
|
+
* @param projectRoot - Absolute path to the CLEO project root.
|
|
419
|
+
* @param plan - One doc's plan from {@link planConduitHistoryBackfill}.
|
|
420
|
+
* @returns Inserted row count and unrecoverable gap count for the doc.
|
|
421
|
+
* @task T13727
|
|
422
|
+
*/
|
|
423
|
+
// @sync-invariant docs.versions.append-only history rows are synthesized from the real audit chain and inserted with natural uids; nothing is updated or deleted, and a conflicting doc is refused by the planner before any write
|
|
424
|
+
export async function applyConduitHistoryBackfill(projectRoot, plan) {
|
|
425
|
+
if (plan.complete || plan.conflict) {
|
|
426
|
+
return { slug: plan.slug, docUid: plan.docUid, inserted: 0, gaps: plan.gaps.length };
|
|
427
|
+
}
|
|
428
|
+
let inserted = 0;
|
|
429
|
+
await withConduitDocWriteTransaction(projectRoot, async () => {
|
|
430
|
+
for (const version of plan.toBackfill) {
|
|
431
|
+
const { inserted: didInsert } = await importMigratedConduitVersion(projectRoot, {
|
|
432
|
+
attachmentUid: plan.docUid,
|
|
433
|
+
parentVersionUid: version.parentVersionUid,
|
|
434
|
+
authorAgentId: version.authorAgentId,
|
|
435
|
+
storageKey: `sha256:${version.sha256}`,
|
|
436
|
+
contentHash: version.sha256,
|
|
437
|
+
sizeBytes: version.sizeBytes,
|
|
438
|
+
tokens: version.tokens,
|
|
439
|
+
versionNumber: version.position,
|
|
440
|
+
createdAt: version.createdAt,
|
|
441
|
+
changeSummary: version.changeSummary,
|
|
442
|
+
slug: plan.slug,
|
|
443
|
+
origin: CONDUIT_BACKFILL_ORIGIN,
|
|
444
|
+
});
|
|
445
|
+
if (didInsert)
|
|
446
|
+
inserted += 1;
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
return { slug: plan.slug, docUid: plan.docUid, inserted, gaps: plan.gaps.length };
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=conduit-history-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conduit-history-backfill.js","sourceRoot":"","sources":["../../src/docs/conduit-history-backfill.ts"],"names":[],"mappings":"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"}
|
package/dist/docs/docs-ops.d.ts
CHANGED
|
@@ -123,6 +123,25 @@ export interface DocsVersionEntry {
|
|
|
123
123
|
readonly ownerVersion?: string;
|
|
124
124
|
/** Sequential doc version counter (T11181). */
|
|
125
125
|
readonly docVersion?: number;
|
|
126
|
+
/**
|
|
127
|
+
* Display ordinal 1..N over the doc's version history, assigned at READ
|
|
128
|
+
* time (T13727 display-ordinal ruling): rows are ordered by `created_at`
|
|
129
|
+
* ascending (uid tiebreak) and the oldest row gets 1, the newest N. This
|
|
130
|
+
* never repeats across the pre-/post-adoption seam the way stored
|
|
131
|
+
* ordinals can. Present only on conduit-history entries (T13727 routing);
|
|
132
|
+
* manifest-fallback entries carry no version sequence and omit the field.
|
|
133
|
+
*/
|
|
134
|
+
readonly version?: number;
|
|
135
|
+
/**
|
|
136
|
+
* The row's stored `conduit_attachment_versions.version_number` — the
|
|
137
|
+
* honest local display ordinal, which MAY repeat across the
|
|
138
|
+
* pre-/post-adoption seam (backfilled head rows carry their chain
|
|
139
|
+
* position while post-adoption rows keep their minted ordinals; rows are
|
|
140
|
+
* append-only and never renumbered). Diagnostics only — user-facing
|
|
141
|
+
* ordering uses {@link DocsVersionEntry.version}. Present only on
|
|
142
|
+
* conduit-history entries.
|
|
143
|
+
*/
|
|
144
|
+
readonly storedVersionNumber?: number;
|
|
126
145
|
}
|
|
127
146
|
/**
|
|
128
147
|
* Result returned by {@link listDocVersions}.
|
|
@@ -402,6 +421,20 @@ export declare function rankDocs(opts: {
|
|
|
402
421
|
* (sibling docs included; narrow with `name`). An
|
|
403
422
|
* arg that is neither throws `E_NOT_FOUND`.
|
|
404
423
|
*
|
|
424
|
+
* T13727 — precedence: when the arg resolves as a doc slug that has been
|
|
425
|
+
* adopted into the conduit family AND has at least one
|
|
426
|
+
* `conduit_attachment_versions` row, the listing comes from the conduit
|
|
427
|
+
* history ({@link listConduitAttachmentVersions}) keyed on the doc's
|
|
428
|
+
* immutable uid — the canonical per-doc history — instead of the LWW blob
|
|
429
|
+
* manifest. Entries carry the version's `content_hash`, a read-time
|
|
430
|
+
* display ordinal (`version`, 1..N chronological — see
|
|
431
|
+
* {@link DocsVersionEntry.version}) and the stored
|
|
432
|
+
* `version_number` (`storedVersionNumber`), ordered newest first. A doc
|
|
433
|
+
* with no conduit row, or none yet adopted, keeps the manifest listing as
|
|
434
|
+
* fallback so the command never regresses; manifest entries omit
|
|
435
|
+
* `version`/`storedVersionNumber` (no stored version sequence exists
|
|
436
|
+
* there).
|
|
437
|
+
*
|
|
405
438
|
* @param opts - Required `ownerId` (owner id or doc slug), optional `name`
|
|
406
439
|
* filter and `projectRoot`.
|
|
407
440
|
* @returns Version list with SHA-256 content addresses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-ops.d.ts","sourceRoot":"","sources":["../../src/docs/docs-ops.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"docs-ops.d.ts","sourceRoot":"","sources":["../../src/docs/docs-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/docs/docs-ops.js
CHANGED
|
@@ -576,6 +576,57 @@ export async function rankDocs(opts) {
|
|
|
576
576
|
});
|
|
577
577
|
return { ownerId: opts.ownerId, hits };
|
|
578
578
|
}
|
|
579
|
+
/**
|
|
580
|
+
* Try the T13727 conduit-history listing for a doc-slug arg.
|
|
581
|
+
*
|
|
582
|
+
* Returns null (caller falls back to the manifest path) when the arg does
|
|
583
|
+
* not resolve to a conduit doc, when the doc has no version rows yet, or
|
|
584
|
+
* when the project store cannot be read — the command must never regress
|
|
585
|
+
* because the store was unreachable.
|
|
586
|
+
*
|
|
587
|
+
* @internal
|
|
588
|
+
*/
|
|
589
|
+
async function listConduitDocVersions(root, slug, name) {
|
|
590
|
+
try {
|
|
591
|
+
const { findConduitAttachmentByUid, listConduitAttachmentVersions, resolveConduitDocUid } = await import('../store/conduit-doc-history.js');
|
|
592
|
+
const docUid = await resolveConduitDocUid(root, slug);
|
|
593
|
+
if (docUid === null)
|
|
594
|
+
return null;
|
|
595
|
+
const doc = await findConduitAttachmentByUid(root, docUid);
|
|
596
|
+
const rows = await listConduitAttachmentVersions(root, docUid);
|
|
597
|
+
if (rows.length === 0)
|
|
598
|
+
return null;
|
|
599
|
+
const entryName = doc?.slug ?? slug;
|
|
600
|
+
if (name !== undefined && name !== entryName) {
|
|
601
|
+
return { ownerId: slug, nameFilter: name, versions: [] };
|
|
602
|
+
}
|
|
603
|
+
// Display-ordinal ruling (T13727): assign 1..N in chronological order
|
|
604
|
+
// (created_at ascending, uid tiebreak) — rows stay append-only and are
|
|
605
|
+
// never renumbered, so the stored version_number can repeat across the
|
|
606
|
+
// pre-/post-adoption seam; the read-time ordinal cannot. Entries are
|
|
607
|
+
// returned newest first, so the list reads N..1.
|
|
608
|
+
const chronological = [...rows].sort((a, b) => {
|
|
609
|
+
const byTime = a.createdAt.localeCompare(b.createdAt);
|
|
610
|
+
return byTime !== 0 ? byTime : (a.uid ?? '').localeCompare(b.uid ?? '');
|
|
611
|
+
});
|
|
612
|
+
const versions = chronological
|
|
613
|
+
.map((row, index) => ({ row, display: index + 1 }))
|
|
614
|
+
.reverse()
|
|
615
|
+
.map(({ row, display }) => ({
|
|
616
|
+
attachmentId: row.contentHash,
|
|
617
|
+
name: entryName,
|
|
618
|
+
sha256: row.contentHash,
|
|
619
|
+
sizeBytes: row.originalSize,
|
|
620
|
+
docVersion: row.versionNumber,
|
|
621
|
+
version: display,
|
|
622
|
+
storedVersionNumber: row.versionNumber,
|
|
623
|
+
}));
|
|
624
|
+
return { ownerId: slug, nameFilter: name, versions };
|
|
625
|
+
}
|
|
626
|
+
catch {
|
|
627
|
+
return null;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
579
630
|
/**
|
|
580
631
|
* List all SHA-256 content-address versions of attachments for an owner.
|
|
581
632
|
*
|
|
@@ -591,6 +642,20 @@ export async function rankDocs(opts) {
|
|
|
591
642
|
* (sibling docs included; narrow with `name`). An
|
|
592
643
|
* arg that is neither throws `E_NOT_FOUND`.
|
|
593
644
|
*
|
|
645
|
+
* T13727 — precedence: when the arg resolves as a doc slug that has been
|
|
646
|
+
* adopted into the conduit family AND has at least one
|
|
647
|
+
* `conduit_attachment_versions` row, the listing comes from the conduit
|
|
648
|
+
* history ({@link listConduitAttachmentVersions}) keyed on the doc's
|
|
649
|
+
* immutable uid — the canonical per-doc history — instead of the LWW blob
|
|
650
|
+
* manifest. Entries carry the version's `content_hash`, a read-time
|
|
651
|
+
* display ordinal (`version`, 1..N chronological — see
|
|
652
|
+
* {@link DocsVersionEntry.version}) and the stored
|
|
653
|
+
* `version_number` (`storedVersionNumber`), ordered newest first. A doc
|
|
654
|
+
* with no conduit row, or none yet adopted, keeps the manifest listing as
|
|
655
|
+
* fallback so the command never regresses; manifest entries omit
|
|
656
|
+
* `version`/`storedVersionNumber` (no stored version sequence exists
|
|
657
|
+
* there).
|
|
658
|
+
*
|
|
594
659
|
* @param opts - Required `ownerId` (owner id or doc slug), optional `name`
|
|
595
660
|
* filter and `projectRoot`.
|
|
596
661
|
* @returns Version list with SHA-256 content addresses.
|
|
@@ -603,6 +668,13 @@ export async function rankDocs(opts) {
|
|
|
603
668
|
*/
|
|
604
669
|
export async function listDocVersions(opts) {
|
|
605
670
|
const root = opts.projectRoot ?? getProjectRoot();
|
|
671
|
+
// T13727 — a doc slug with conduit history lists the canonical version
|
|
672
|
+
// rows; any failure to reach the store degrades to the manifest path.
|
|
673
|
+
if (!/^(T\d+$|ses_|O-)/.test(opts.ownerId)) {
|
|
674
|
+
const conduit = await listConduitDocVersions(root, opts.ownerId, opts.name);
|
|
675
|
+
if (conduit !== null)
|
|
676
|
+
return conduit;
|
|
677
|
+
}
|
|
606
678
|
let allBlobs = await blobList(opts.ownerId, root).catch(() => []);
|
|
607
679
|
let listedOwnerId = opts.ownerId;
|
|
608
680
|
if (allBlobs.length === 0 && !/^(T\d+$|ses_|O-)/.test(opts.ownerId)) {
|