pm-csv 2026.10.28 → 2026.10.30
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/README.md +86 -2
- package/dist/admission.d.ts +93 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +362 -0
- package/dist/admission.js.map +1 -0
- package/dist/atomic-update.d.ts.map +1 -1
- package/dist/atomic-update.js +16 -14
- package/dist/atomic-update.js.map +1 -1
- package/dist/edit-refusal.d.ts +1 -1
- package/dist/edit-refusal.d.ts.map +1 -1
- package/dist/index.d.ts +46 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +364 -117
- package/dist/index.js.map +1 -1
- package/dist/join-plans.d.ts +110 -0
- package/dist/join-plans.d.ts.map +1 -0
- package/dist/join-plans.js +557 -0
- package/dist/join-plans.js.map +1 -0
- package/dist/lineage.d.ts +3 -6
- package/dist/lineage.d.ts.map +1 -1
- package/dist/lineage.js +32 -11
- package/dist/lineage.js.map +1 -1
- package/dist/mutation-intent.d.ts +57 -0
- package/dist/mutation-intent.d.ts.map +1 -0
- package/dist/mutation-intent.js +145 -0
- package/dist/mutation-intent.js.map +1 -0
- package/dist/roundtrip.d.ts +2 -8
- package/dist/roundtrip.d.ts.map +1 -1
- package/dist/roundtrip.js +78 -24
- package/dist/roundtrip.js.map +1 -1
- package/dist/settings-snapshot.d.ts +37 -0
- package/dist/settings-snapshot.d.ts.map +1 -0
- package/dist/settings-snapshot.js +128 -0
- package/dist/settings-snapshot.js.map +1 -0
- package/dist/table-schema.d.ts +10 -7
- package/dist/table-schema.d.ts.map +1 -1
- package/dist/table-schema.js +36 -12
- package/dist/table-schema.js.map +1 -1
- package/docs/import-admission.md +199 -0
- package/docs/join-plans.md +201 -0
- package/docs/join-validation.md +240 -0
- package/docs/spreadsheet-roundtrip.md +17 -2
- package/manifest.json +1 -1
- package/package.json +10 -6
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import * as nativeSdk from "@unbrained/pm-cli/sdk";
|
|
4
|
+
import { readFileSync, writeFileSync, statSync } from "node:fs";
|
|
5
|
+
import { acquireLock, create, commitWorkspaceTransaction, generateItemId, getHistoryPath, locateItem, normalizeItemId, PmCliError, readHistoryEntries, readLocatedItem, resolveItemTypeRegistry, resolveRuntimeStatusRegistry, verifyHistoryEntries, appendHistoryEntry, createHistoryEntry, emptyImportedDocument, removeFileIfExists, nowIso, PmClient, runWithActiveExtensions, runActiveOnWriteHooks, runWorkspaceTransactionGc, } from "@unbrained/pm-cli/sdk";
|
|
6
|
+
import { assertEditLease } from "./lease-guard.js";
|
|
7
|
+
import { assertCanonicalMutationIds, buildMutationIntent, mutationMessageBase, matchesMutationScope } from "./mutation-intent.js";
|
|
8
|
+
import { readTable } from "./table-schema.js";
|
|
9
|
+
import { captureSettings, inSettingsTransaction, pinCreateDefaults, readPinnedSettings as readSettings, rethrowSettingsChange, settingsChangedIn, settingsDigest, useSettings, verifySettings, withSettings, withSettingsFence } from "./settings-snapshot.js";
|
|
10
|
+
/** Explicit SDK create-option vocabulary: no implicit header mappings or field coercion. */
|
|
11
|
+
const FIELDS = ["title", "body", "type", "status", "priority", "tags", "assignee", "sprint", "release", "estimatedMinutes", "acceptanceCriteria", "closeReason", "completedAt"];
|
|
12
|
+
/** Typed refusal with a stable machine code, semantic exit status and actionable remedy. */
|
|
13
|
+
export class JoinRefusal extends PmCliError {
|
|
14
|
+
/** Stable category for callers that must choose a recovery action. */
|
|
15
|
+
code;
|
|
16
|
+
/** Recovery action that avoids replaying over newer native state. */
|
|
17
|
+
remedy;
|
|
18
|
+
/** Original lower-level category, when a boundary wrapped another refusal. */
|
|
19
|
+
sourceCode;
|
|
20
|
+
constructor(code, remedy, sourceCode) {
|
|
21
|
+
super(`${code}: ${remedy}`, 2, { code, required: remedy, nextSteps: [remedy], ...(sourceCode ? { sourceCode, sourceRemedy: remedy } : {}) });
|
|
22
|
+
this.sourceCode = sourceCode;
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.remedy = remedy;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Preserve the documented refusal family while retaining lower-level categories and remedies. */
|
|
28
|
+
function joinRefusal(error, code, remedy) {
|
|
29
|
+
if (error instanceof JoinRefusal)
|
|
30
|
+
return error;
|
|
31
|
+
const sourceCode = typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" ? error.code : "unexpected_error";
|
|
32
|
+
const sourceRemedy = typeof error === "object" && error !== null && "remedy" in error && typeof error.remedy === "string" ? error.remedy : remedy;
|
|
33
|
+
const refusal = new JoinRefusal(code, sourceRemedy, sourceCode);
|
|
34
|
+
refusal.cause = error;
|
|
35
|
+
return refusal;
|
|
36
|
+
}
|
|
37
|
+
/** Hash captured strings as UTF-8 bytes and structured revision data as JSON. */
|
|
38
|
+
function hash(value) {
|
|
39
|
+
return createHash("sha256").update(typeof value === "string" ? value : JSON.stringify(value)).digest("hex");
|
|
40
|
+
}
|
|
41
|
+
/** Derive a recorded domain's compatible key; new attempts always supply the complete reviewed order. */
|
|
42
|
+
export function joinTransactionId(plan, selected, derive = nativeSdk.deriveMutationTransactionId) {
|
|
43
|
+
const input = JSON.stringify(["csv-join-v2", plan.digest, plan.expected, selected.map(i => plan.ids[i])]);
|
|
44
|
+
return `csv-join-${derive ? derive(input) : `mutate-${hash(input).slice(0, 24)}`}`;
|
|
45
|
+
}
|
|
46
|
+
/** Discover only cryptographically plan-bound journals, including historical subset keys. */
|
|
47
|
+
export async function resolveJoinJournal(pmRoot, plan, order) {
|
|
48
|
+
const inventory = await runWorkspaceTransactionGc(pmRoot, { dryRun: true, retentionDays: Infinity });
|
|
49
|
+
const matches = [];
|
|
50
|
+
for (const entry of inventory.entries) {
|
|
51
|
+
if (!basename(entry.file).startsWith("csv-join-"))
|
|
52
|
+
continue;
|
|
53
|
+
let value;
|
|
54
|
+
try {
|
|
55
|
+
value = JSON.parse(readFileSync(resolve(pmRoot, entry.file), "utf8"));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
} // Foreign/unreadable records never authorize a new ownership claim.
|
|
60
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || !Object.hasOwn(value, "schemaVersion") || !("schemaVersion" in value) || value.schemaVersion !== 1
|
|
61
|
+
|| !Object.hasOwn(value, "transactionId") || !("transactionId" in value) || typeof value.transactionId !== "string"
|
|
62
|
+
|| !Object.hasOwn(value, "stepIds") || !("stepIds" in value) || !Array.isArray(value.stepIds) || !value.stepIds.length)
|
|
63
|
+
continue;
|
|
64
|
+
const ids = value.stepIds;
|
|
65
|
+
const indices = order.filter(i => ids.includes(plan.ids[i]));
|
|
66
|
+
if (indices.length !== ids.length || indices.some((i, index) => plan.ids[i] !== ids[index]))
|
|
67
|
+
continue;
|
|
68
|
+
const legacy = `csv-join-${hash([plan.digest, indices])}`;
|
|
69
|
+
if (basename(entry.file) !== `${value.transactionId}.json` || ![legacy, joinTransactionId(plan, indices)].includes(value.transactionId))
|
|
70
|
+
continue;
|
|
71
|
+
const restarted = Object.hasOwn(value, "attempt") && "attempt" in value && typeof value.attempt === "number" && value.attempt > 1;
|
|
72
|
+
matches.push({ transactionId: value.transactionId, indices, status: entry.status, restarted });
|
|
73
|
+
}
|
|
74
|
+
const recovering = matches.find(journal => journal.status === "compensating");
|
|
75
|
+
if (recovering)
|
|
76
|
+
return recovering;
|
|
77
|
+
if (matches.length > 1)
|
|
78
|
+
throw new JoinRefusal("csv_join_reconcile", "Multiple historical journals belong to this plan. Reconcile their recorded attempts before previewing fresh identities; no replacement journal was created.");
|
|
79
|
+
return matches[0];
|
|
80
|
+
}
|
|
81
|
+
/** Maintain the host's derived index inside its lease, without inventing older-host cache files. */
|
|
82
|
+
export async function mutateJoinIndex(mutation, run, capabilities = nativeSdk) {
|
|
83
|
+
const release = capabilities.acquireItemMetadataDerivedIndexLock
|
|
84
|
+
? await capabilities.acquireItemMetadataDerivedIndexLock(mutation.pmRoot, "pm-csv") : undefined;
|
|
85
|
+
try {
|
|
86
|
+
try {
|
|
87
|
+
await run();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
if (capabilities.refreshItemMetadataDerivedIndex) {
|
|
91
|
+
const located = await locateItem(mutation.pmRoot, mutation.id, mutation.idPrefix, mutation.preferredFormat, mutation.typeToFolder);
|
|
92
|
+
const document = located ? (await readLocatedItem(located, { schema: mutation.schema })).document : null;
|
|
93
|
+
await capabilities.refreshItemMetadataDerivedIndex({ ...mutation, document });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await release?.();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Refuse malformed boundary data without disclosing input values. */
|
|
102
|
+
function invalid() {
|
|
103
|
+
throw new JoinRefusal("csv_join_invalid", "Use a version 1 join input or unchanged preview plan; use dense bounded arrays, exact declared keys and supported scalar mappings.");
|
|
104
|
+
}
|
|
105
|
+
/** One strict boundary schema shared by SDK and CLI, including artifact validation. */
|
|
106
|
+
function boundary(value, artifact) {
|
|
107
|
+
/** Check own property keys before reading any nested structure. */
|
|
108
|
+
const object = (v, keys) => {
|
|
109
|
+
if (!v || typeof v !== "object" || Array.isArray(v) || Object.keys(v).some(k => !keys.includes(k)) || keys.some(k => !Object.hasOwn(v, k)))
|
|
110
|
+
invalid();
|
|
111
|
+
return v;
|
|
112
|
+
};
|
|
113
|
+
/** Arrays must be dense, bounded and free of additional enumerable properties. */
|
|
114
|
+
const array = (v, max) => {
|
|
115
|
+
if (!Array.isArray(v) || v.length > max || Object.keys(v).length !== v.length || Array.from({ length: v.length }, (_, i) => !Object.hasOwn(v, i)).some(Boolean))
|
|
116
|
+
invalid();
|
|
117
|
+
return v;
|
|
118
|
+
};
|
|
119
|
+
/** Bound string allocations before field-specific header and identifier checks. */
|
|
120
|
+
const string = (v, max) => {
|
|
121
|
+
if (typeof v !== "string" || v.length > max)
|
|
122
|
+
invalid();
|
|
123
|
+
return v;
|
|
124
|
+
};
|
|
125
|
+
const envelope = artifact ? object(value, ["version", "input", "sources", "settings", "ids", "expected", "digest"]) : undefined;
|
|
126
|
+
const input = object(artifact ? envelope.input : value, ["version", "tables"]);
|
|
127
|
+
if (input.version !== 1 || (envelope && (envelope.version !== 1 || envelope.expected !== "absent")))
|
|
128
|
+
invalid();
|
|
129
|
+
let bytes = 0;
|
|
130
|
+
const tables = array(input.tables, 16).map(v => {
|
|
131
|
+
const t = object(v, ["name", "key", "csv", "fields", "references"]);
|
|
132
|
+
const name = string(t.name, 64), key = string(t.key, 128), csv = string(t.csv, 8 * 1024 * 1024);
|
|
133
|
+
bytes += Buffer.byteLength(csv);
|
|
134
|
+
if (!/^[a-z][a-z0-9_-]*$/.test(name) || !key.trim() || bytes > 8 * 1024 * 1024)
|
|
135
|
+
invalid();
|
|
136
|
+
if (!t.fields || typeof t.fields !== "object" || Array.isArray(t.fields) || Object.keys(t.fields).length > FIELDS.length)
|
|
137
|
+
invalid();
|
|
138
|
+
const fields = Object.create(null);
|
|
139
|
+
for (const [field, column] of Object.entries(t.fields)) {
|
|
140
|
+
if (!FIELDS.includes(field))
|
|
141
|
+
invalid();
|
|
142
|
+
fields[field] = string(column, 128);
|
|
143
|
+
}
|
|
144
|
+
if (!fields.title)
|
|
145
|
+
invalid();
|
|
146
|
+
const references = array(t.references, 16).map((v) => {
|
|
147
|
+
const r = object(v, ["column", "table", "kind"]);
|
|
148
|
+
if (r.kind !== "parent" && r.kind !== "blocked_by")
|
|
149
|
+
invalid();
|
|
150
|
+
return { column: string(r.column, 128), table: string(r.table, 64), kind: r.kind };
|
|
151
|
+
});
|
|
152
|
+
if (references.filter(r => r.kind === "parent").length > 1)
|
|
153
|
+
invalid();
|
|
154
|
+
return { name, key, csv, fields, references };
|
|
155
|
+
});
|
|
156
|
+
if (!tables.length || new Set(tables.map(t => t.name)).size !== tables.length)
|
|
157
|
+
invalid();
|
|
158
|
+
const parsed = { version: 1, tables };
|
|
159
|
+
if (!envelope)
|
|
160
|
+
return parsed;
|
|
161
|
+
const ids = array(envelope.ids, 1000).map(v => string(v, 128));
|
|
162
|
+
const sources = array(envelope.sources, 16).map(v => string(v, 64));
|
|
163
|
+
const settings = string(envelope.settings, 64), digest = string(envelope.digest, 64);
|
|
164
|
+
if (new Set(ids).size !== ids.length || ids.some(id => !/^[a-z0-9][a-z0-9_-]*$/.test(id)) ||
|
|
165
|
+
sources.some(v => !/^[a-f0-9]{64}$/.test(v)) || !/^[a-f0-9]{64}$/.test(settings))
|
|
166
|
+
invalid();
|
|
167
|
+
const base = { version: 1, input: parsed, sources, settings, ids, expected: "absent" };
|
|
168
|
+
if (digest !== hash(base) || JSON.stringify(sources) !== JSON.stringify(tables.map(t => hash(t.csv))))
|
|
169
|
+
invalid();
|
|
170
|
+
return { ...base, digest };
|
|
171
|
+
}
|
|
172
|
+
/** Compile and validate all tables before generating a plan or invoking mutation primitives. */
|
|
173
|
+
async function compile(settings, input) {
|
|
174
|
+
const statuses = resolveRuntimeStatusRegistry(settings.schema);
|
|
175
|
+
const types = new Map(Object.entries(resolveItemTypeRegistry(settings).type_to_folder));
|
|
176
|
+
const issues = [], rows = [];
|
|
177
|
+
const tables = input.tables.map(t => ({ ...t, data: readTable(t.csv, ",").table, keys: new Map() }));
|
|
178
|
+
for (const t of tables) {
|
|
179
|
+
const headers = t.data[0];
|
|
180
|
+
if (![t.key, ...Object.values(t.fields), ...t.references.map(r => r.column)].every(c => headers.includes(c)) ||
|
|
181
|
+
t.references.some(r => !tables.some(target => target.name === r.table)))
|
|
182
|
+
invalid();
|
|
183
|
+
for (const [offset, data] of t.data.slice(1).entries()) {
|
|
184
|
+
const row = offset + 2, keyColumn = headers.indexOf(t.key) + 1;
|
|
185
|
+
const key = data[keyColumn - 1].trim();
|
|
186
|
+
const options = Object.assign(Object.create(null), Object.fromEntries(Object.entries(t.fields).map(([field, column]) => [field, data[headers.indexOf(column)]])));
|
|
187
|
+
if (!options.title.trim() || (options.priority !== undefined && !/^[0-4]$/.test(options.priority.trim())) ||
|
|
188
|
+
(options.estimatedMinutes !== undefined && (!options.estimatedMinutes.trim() || !Number.isFinite(Number(options.estimatedMinutes)) || Number(options.estimatedMinutes) < 0 || Number(options.estimatedMinutes) > 1e9)) ||
|
|
189
|
+
(options.status !== undefined && !statuses.by_id.has(options.status.trim())) ||
|
|
190
|
+
(options.type !== undefined && !types.has(options.type.trim())) ||
|
|
191
|
+
(options.status !== undefined && statuses.terminal_statuses.has(options.status.trim()) && !options.closeReason?.trim()))
|
|
192
|
+
invalid();
|
|
193
|
+
Object.assign(options, pinCreateDefaults(options, settings));
|
|
194
|
+
if (!key)
|
|
195
|
+
issues.push({ table: t.name, row, column: keyColumn, code: "empty_key" });
|
|
196
|
+
const entries = t.keys.get(key) ?? [];
|
|
197
|
+
entries.push(rows.length);
|
|
198
|
+
t.keys.set(key, entries);
|
|
199
|
+
rows.push({ table: t.name, row, keyColumn, options, edges: [] });
|
|
200
|
+
}
|
|
201
|
+
for (const entries of t.keys.values())
|
|
202
|
+
if (entries.length > 1)
|
|
203
|
+
for (const i of entries)
|
|
204
|
+
issues.push({ table: t.name, row: rows[i].row, column: rows[i].keyColumn, code: "duplicate_key" });
|
|
205
|
+
}
|
|
206
|
+
if (rows.length > 1000)
|
|
207
|
+
invalid();
|
|
208
|
+
let index = 0;
|
|
209
|
+
for (const t of tables)
|
|
210
|
+
for (const data of t.data.slice(1)) {
|
|
211
|
+
const row = rows[index++];
|
|
212
|
+
for (const ref of t.references) {
|
|
213
|
+
const column = t.data[0].indexOf(ref.column) + 1, key = data[column - 1].trim();
|
|
214
|
+
if (!key)
|
|
215
|
+
continue;
|
|
216
|
+
const targets = tables.find(t => t.name === ref.table).keys.get(key);
|
|
217
|
+
if (targets?.length !== 1)
|
|
218
|
+
issues.push({ table: t.name, row: row.row, column, code: "unresolved" });
|
|
219
|
+
else
|
|
220
|
+
row.edges.push({ target: targets[0], kind: ref.kind, column });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const order = [], visiting = new Set(), done = new Set();
|
|
224
|
+
/** Topologically order all parent/dependency targets; cyclic imports are refused as a whole. */
|
|
225
|
+
function visit(i) {
|
|
226
|
+
if (done.has(i))
|
|
227
|
+
return;
|
|
228
|
+
if (visiting.has(i)) {
|
|
229
|
+
const r = rows[i];
|
|
230
|
+
issues.push({ table: r.table, row: r.row, column: r.keyColumn, code: "cycle" });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
visiting.add(i);
|
|
234
|
+
for (const edge of rows[i].edges)
|
|
235
|
+
visit(edge.target);
|
|
236
|
+
visiting.delete(i);
|
|
237
|
+
done.add(i);
|
|
238
|
+
order.push(i);
|
|
239
|
+
}
|
|
240
|
+
rows.forEach((_, i) => visit(i));
|
|
241
|
+
return { rows, issues, order };
|
|
242
|
+
}
|
|
243
|
+
/** Reject nonfinite, fractional, negative or excessive receipt numbers at the output boundary. */
|
|
244
|
+
export function assertJoinNumbers(values) {
|
|
245
|
+
if (values.some(n => !Number.isSafeInteger(n) || n < 0 || n > 32000))
|
|
246
|
+
invalid();
|
|
247
|
+
}
|
|
248
|
+
/** Check every emitted numeric field, including coordinates, before returning a receipt. */
|
|
249
|
+
function receipt(input, rows, issues, applied = 0, unchanged = 0, skipped = 0) {
|
|
250
|
+
const result = { ok: issues.length === 0, tables: input.tables.length, rows: rows.length, references: rows.reduce((sum, r) => sum + r.edges.length, 0), applied, unchanged, skipped, issueCount: issues.length, issues: issues.slice(0, 20) };
|
|
251
|
+
assertJoinNumbers([result.tables, result.rows, result.references, applied, unchanged, skipped, result.issueCount, ...result.issues.flatMap(i => [i.row, i.column])]);
|
|
252
|
+
return { ...result, ...(issues.length ? { remedy: "Resolve reported key coordinates or reconcile foreign targets and their dependent rows before previewing a new plan." } : {}) };
|
|
253
|
+
}
|
|
254
|
+
/** Resolve every selected table in a single read-only preview and mint SDK-owned native identities. */
|
|
255
|
+
async function previewJoinsInternal(pmRoot, input) {
|
|
256
|
+
const settings = await readSettings(pmRoot);
|
|
257
|
+
const { rows, issues } = await compile(settings, input);
|
|
258
|
+
const result = receipt(input, rows, issues);
|
|
259
|
+
if (!result.ok)
|
|
260
|
+
return { receipt: result };
|
|
261
|
+
const namespace = await generateItemId(pmRoot, settings.id_prefix, { tokenLength: 12 });
|
|
262
|
+
const ids = rows.map((_, i) => normalizeItemId(`${namespace}-${i}`, settings.id_prefix));
|
|
263
|
+
const base = { version: 1, input, sources: input.tables.map(t => hash(t.csv)), settings: hash(settings), ids, expected: "absent" };
|
|
264
|
+
await verifySettings(pmRoot);
|
|
265
|
+
return { receipt: result, plan: { ...base, digest: hash(base) } };
|
|
266
|
+
}
|
|
267
|
+
/** Revalidate exact ownership, complete history and scope while the caller owns the item lease. */
|
|
268
|
+
async function inspectLocked(pmRoot, id, marker, row, ids, settings) {
|
|
269
|
+
const types = resolveItemTypeRegistry(settings);
|
|
270
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, types.type_to_folder);
|
|
271
|
+
const history = await readHistoryEntries(getHistoryPath(pmRoot, id), id);
|
|
272
|
+
if (!located && history.length === 0)
|
|
273
|
+
return "pending";
|
|
274
|
+
if (mutationMessageBase(history[0]?.message) !== marker)
|
|
275
|
+
return "foreign";
|
|
276
|
+
const changed = () => { throw new JoinRefusal("csv_join_target_changed", "An owned target or its SDK history changed. Reconcile current state and the transaction journal before retrying this reviewed plan."); };
|
|
277
|
+
if (history.length > 2 || history.some((entry, index) => entry.op !== (index % 2 ? "delete" : "create") ||
|
|
278
|
+
mutationMessageBase(entry.message) !== (index % 2 ? `${marker}:compensate` : marker)))
|
|
279
|
+
changed();
|
|
280
|
+
const deleted = history.at(-1).op === "delete";
|
|
281
|
+
const empty = emptyImportedDocument();
|
|
282
|
+
if (deleted && !verifyHistoryEntries(history, empty).ok)
|
|
283
|
+
changed();
|
|
284
|
+
if (!located) {
|
|
285
|
+
if (deleted)
|
|
286
|
+
return "compensated";
|
|
287
|
+
return changed();
|
|
288
|
+
}
|
|
289
|
+
const { document } = await readLocatedItem(located, { schema: settings.schema });
|
|
290
|
+
if (!verifyHistoryEntries(deleted ? history.slice(0, -1) : history, document).ok)
|
|
291
|
+
changed();
|
|
292
|
+
const parent = row.edges.find(edge => edge.kind === "parent");
|
|
293
|
+
if (!matchesMutationScope(document, { ...row.options, parent: parent ? ids[parent.target] : undefined }, settings, row.edges.filter(edge => edge.kind === "blocked_by").map(edge => ({ id: ids[edge.target], kind: edge.kind }))))
|
|
294
|
+
changed();
|
|
295
|
+
return deleted ? "rollback_pending" : "applied";
|
|
296
|
+
}
|
|
297
|
+
/** Inspect current SDK state under its item lease, never a frozen journal receipt. */
|
|
298
|
+
async function inspect(pmRoot, id, marker, row, ids) {
|
|
299
|
+
const settings = await readSettings(pmRoot);
|
|
300
|
+
const release = await acquireLock(pmRoot, id, settings.locks.ttl_seconds, "pm-csv", false, false, settings.locks.wait_ms);
|
|
301
|
+
const started = performance.now();
|
|
302
|
+
try {
|
|
303
|
+
const result = await inspectLocked(pmRoot, id, marker, row, ids, settings);
|
|
304
|
+
assertEditLease(performance.now() - started, settings.locks.ttl_seconds);
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
await release();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Compensate only this plan's unchanged create. Native delete dry-run enforces
|
|
313
|
+
* policies/hooks; the subsequent item lease revalidates the exact approved SDK
|
|
314
|
+
* revision. Public SDK store/history/index primitives publish an audited tombstone
|
|
315
|
+
* before removal, allowing recovery of a crash between the two durable writes.
|
|
316
|
+
*/
|
|
317
|
+
async function compensateCreate(pmRoot, plan, i, row, options) {
|
|
318
|
+
const id = plan.ids[i], marker = `csv-join:${plan.digest}:${i}`;
|
|
319
|
+
return runWithActiveExtensions({ path: pmRoot }, async () => {
|
|
320
|
+
const prior = await inspect(pmRoot, id, marker, row, plan.ids);
|
|
321
|
+
if (prior === "foreign")
|
|
322
|
+
return "foreign";
|
|
323
|
+
if (prior === "pending" || prior === "compensated")
|
|
324
|
+
return;
|
|
325
|
+
if (prior === "applied")
|
|
326
|
+
await withSettingsFence(pmRoot, () => PmClient.forActiveExtensionHost({ pmRoot, author: options.author }).delete(id, { dryRun: true, force: true }));
|
|
327
|
+
await options.onBoundary?.("compensation_validated", id);
|
|
328
|
+
return withSettingsFence(pmRoot, async () => {
|
|
329
|
+
const settings = await readSettings(pmRoot);
|
|
330
|
+
const release = await acquireLock(pmRoot, id, settings.locks.ttl_seconds, options.author, false, false, settings.locks.wait_ms);
|
|
331
|
+
const started = performance.now();
|
|
332
|
+
try {
|
|
333
|
+
await options.onBoundary?.("compensation_locked", id);
|
|
334
|
+
await verifySettings(pmRoot);
|
|
335
|
+
const current = await inspectLocked(pmRoot, id, marker, row, plan.ids, settings);
|
|
336
|
+
if (current === "foreign")
|
|
337
|
+
return "foreign";
|
|
338
|
+
if (current === "pending" || current === "compensated")
|
|
339
|
+
return;
|
|
340
|
+
await options.onBoundary?.("compensation_checked", id);
|
|
341
|
+
const types = resolveItemTypeRegistry(settings);
|
|
342
|
+
const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, types.type_to_folder);
|
|
343
|
+
if (!located)
|
|
344
|
+
throw new JoinRefusal("csv_join_target_changed", "Reconcile a missing compensation target before retrying.");
|
|
345
|
+
const { document } = await readLocatedItem(located, { schema: settings.schema });
|
|
346
|
+
const empty = emptyImportedDocument(), historyPath = getHistoryPath(pmRoot, id);
|
|
347
|
+
await mutateJoinIndex({ id, idPrefix: settings.id_prefix, pmRoot, preferredFormat: settings.item_format, typeToFolder: types.type_to_folder,
|
|
348
|
+
schema: settings.schema, itemPath: located.itemPath, document: null }, async () => {
|
|
349
|
+
assertEditLease(performance.now() - started, settings.locks.ttl_seconds);
|
|
350
|
+
if (current === "applied")
|
|
351
|
+
await appendHistoryEntry(historyPath, createHistoryEntry({ nowIso: nowIso(), author: options.author,
|
|
352
|
+
op: "delete", before: document, after: empty, message: `${marker}:compensate` }));
|
|
353
|
+
await options.onBoundary?.("compensation_recorded", id);
|
|
354
|
+
assertEditLease(performance.now() - started, settings.locks.ttl_seconds);
|
|
355
|
+
await removeFileIfExists(located.itemPath);
|
|
356
|
+
await options.onBoundary?.("compensation_removed", id);
|
|
357
|
+
});
|
|
358
|
+
for (const [path, op] of [[located.itemPath, "delete"], [historyPath, "delete:history"]])
|
|
359
|
+
await runActiveOnWriteHooks({ path, scope: "project", op,
|
|
360
|
+
item_id: id, item_type: document.metadata.type, before: document, after: empty, changed_fields: ["deleted"] });
|
|
361
|
+
}
|
|
362
|
+
finally {
|
|
363
|
+
await release();
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
/** Apply captured source bytes under SDK journal coordination; retries always revalidate every target revision. */
|
|
369
|
+
async function applyJoinsInternal(pmRoot, plan, options) {
|
|
370
|
+
const settings = await readSettings(pmRoot);
|
|
371
|
+
if (settingsDigest(settings) !== plan.settings)
|
|
372
|
+
throw settingsChanged();
|
|
373
|
+
assertCanonicalMutationIds(plan.ids, settings.id_prefix, () => new JoinRefusal("csv_join_invalid", "Use distinct canonical native IDs from an unchanged preview. Prefix, case or whitespace aliases cannot identify separate rows; preview a fresh plan."));
|
|
374
|
+
const { rows, issues, order } = await compile(settings, plan.input);
|
|
375
|
+
if (rows.length !== plan.ids.length || issues.length)
|
|
376
|
+
invalid();
|
|
377
|
+
const journal = await resolveJoinJournal(pmRoot, plan, order);
|
|
378
|
+
const marker = (i) => `csv-join:${plan.digest}:${i}`;
|
|
379
|
+
const states = [];
|
|
380
|
+
// A refusal must not leave sibling SDK inspections acquiring/releasing leases.
|
|
381
|
+
for (const [i, id] of plan.ids.entries())
|
|
382
|
+
states.push(await inspect(pmRoot, id, marker(i), rows[i], plan.ids));
|
|
383
|
+
const skipped = new Set();
|
|
384
|
+
for (const i of order) {
|
|
385
|
+
const row = rows[i];
|
|
386
|
+
const code = states[i] === "foreign" ? "foreign" : row.edges.some(e => skipped.has(e.target)) ? "dependency_skipped" : undefined;
|
|
387
|
+
if (code) {
|
|
388
|
+
skipped.add(i);
|
|
389
|
+
issues.push({ table: row.table, row: row.row, column: row.keyColumn, code });
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Membership is reviewed/recorded state, never the currently eligible subset.
|
|
393
|
+
const selected = journal?.indices ?? order;
|
|
394
|
+
/** Preserve foreign records and propagate skips at every inspected step boundary. */
|
|
395
|
+
const skip = (i, code) => {
|
|
396
|
+
if (!skipped.has(i)) {
|
|
397
|
+
skipped.add(i);
|
|
398
|
+
issues.push({ table: rows[i].table, row: rows[i].row, column: rows[i].keyColumn, code });
|
|
399
|
+
}
|
|
400
|
+
return "applied";
|
|
401
|
+
};
|
|
402
|
+
let compensating = false;
|
|
403
|
+
let rollbackSettings;
|
|
404
|
+
/** Inspect current target and dependency revisions; a peer's identical success is applied. */
|
|
405
|
+
const state = async (i, allowRollback = false) => {
|
|
406
|
+
if (skipped.has(i))
|
|
407
|
+
return "applied";
|
|
408
|
+
const current = await inspect(pmRoot, plan.ids[i], marker(i), rows[i], plan.ids);
|
|
409
|
+
if (current === "foreign")
|
|
410
|
+
return skip(i, "foreign");
|
|
411
|
+
for (const e of rows[i].edges) {
|
|
412
|
+
if (skipped.has(e.target) || await inspect(pmRoot, plan.ids[e.target], marker(e.target), rows[e.target], plan.ids) === "foreign")
|
|
413
|
+
return skip(i, "dependency_skipped");
|
|
414
|
+
}
|
|
415
|
+
return current === "compensated" ? "pending" : current === "rollback_pending" ? allowRollback ? "applied" : "pending" : current;
|
|
416
|
+
};
|
|
417
|
+
let applied = 0;
|
|
418
|
+
const steps = selected.map(i => ({
|
|
419
|
+
id: plan.ids[i],
|
|
420
|
+
inspect: async () => {
|
|
421
|
+
const current = await state(i, compensating);
|
|
422
|
+
await options.onBoundary?.("inspected", plan.ids[i]);
|
|
423
|
+
return { state: current, result: plan.ids[i] };
|
|
424
|
+
},
|
|
425
|
+
apply: () => inSettingsTransaction(pmRoot, async () => {
|
|
426
|
+
const revision = await inspect(pmRoot, plan.ids[i], marker(i), rows[i], plan.ids);
|
|
427
|
+
if (revision === "compensated" || revision === "rollback_pending")
|
|
428
|
+
throw new JoinRefusal("csv_join_reconcile", "This plan was compensated and its native identities retain tombstone history. Finish journal recovery, then preview fresh identities; never resurrect a compensated plan blindly.");
|
|
429
|
+
if (await state(i) === "applied")
|
|
430
|
+
return plan.ids[i];
|
|
431
|
+
await options.onBoundary?.("before_dependencies", plan.ids[i]);
|
|
432
|
+
for (const e of rows[i].edges)
|
|
433
|
+
if (await inspect(pmRoot, plan.ids[e.target], marker(e.target), rows[e.target], plan.ids) !== "applied") {
|
|
434
|
+
throw new JoinRefusal("csv_join_target_changed", "A dependency disappeared during apply. Reconcile current targets and preview a fresh plan.");
|
|
435
|
+
}
|
|
436
|
+
const row = rows[i];
|
|
437
|
+
const parent = row.edges.find(e => e.kind === "parent");
|
|
438
|
+
await options.onBoundary?.("before_create", plan.ids[i]);
|
|
439
|
+
try {
|
|
440
|
+
await withSettingsFence(pmRoot, () => create(buildMutationIntent({ ...row.options, id: plan.ids[i], author: options.author, message: marker(i),
|
|
441
|
+
...(parent ? { parent: plan.ids[parent.target] } : {}),
|
|
442
|
+
dep: row.edges.filter(e => e.kind === "blocked_by").map(e => `kind=blocked_by,id=${plan.ids[e.target]}`),
|
|
443
|
+
}), { pmRoot }));
|
|
444
|
+
applied++;
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
if (settingsChangedIn(error))
|
|
448
|
+
throw error;
|
|
449
|
+
if (await state(i) !== "applied")
|
|
450
|
+
throw error;
|
|
451
|
+
}
|
|
452
|
+
return plan.ids[i];
|
|
453
|
+
}),
|
|
454
|
+
compensate: async () => {
|
|
455
|
+
await options.onBoundary?.("compensating", plan.ids[i]);
|
|
456
|
+
if (await inSettingsTransaction(pmRoot, () => useSettings(pmRoot, rollbackSettings, () => compensateCreate(pmRoot, plan, i, rows[i], options))) === "foreign")
|
|
457
|
+
skip(i, "foreign");
|
|
458
|
+
},
|
|
459
|
+
}));
|
|
460
|
+
try {
|
|
461
|
+
if ((journal?.status === "compensated" && skipped.size < rows.length) || (journal?.restarted && journal.status !== "compensating"))
|
|
462
|
+
throw new JoinRefusal("csv_join_reconcile", "This plan was compensated or restarted. Reconcile its recorded attempt and preview fresh identities instead of restarting a frozen plan.");
|
|
463
|
+
if (steps.length && (skipped.size < rows.length || (journal && journal.status !== "committed" && journal.status !== "compensated"))) {
|
|
464
|
+
const transactionId = journal?.transactionId ?? joinTransactionId(plan, order);
|
|
465
|
+
await commitWorkspaceTransaction({ pmRoot, transactionId, author: options.author, steps, onTransition: async (context) => {
|
|
466
|
+
if (context.transition === "compensating") {
|
|
467
|
+
compensating = true;
|
|
468
|
+
rollbackSettings = await captureSettings(pmRoot, settingsChanged);
|
|
469
|
+
}
|
|
470
|
+
if (context.transition === "prepared")
|
|
471
|
+
compensating = false;
|
|
472
|
+
await options.onTransition?.(context);
|
|
473
|
+
if (context.transition === "prepared") {
|
|
474
|
+
const current = await resolveJoinJournal(pmRoot, plan, order);
|
|
475
|
+
if (!current || current.transactionId !== context.transactionId || current.restarted)
|
|
476
|
+
throw new JoinRefusal("csv_join_reconcile", "Recorded recovery identity or generation changed. No forward rows were applied; reconcile the retained journal before previewing new work.");
|
|
477
|
+
}
|
|
478
|
+
if (journal?.status === "compensating" && ["compensated", "prepared"].includes(context.transition)) {
|
|
479
|
+
throw new JoinRefusal("csv_join_reconcile", "Pending compensation was recovered under the original journal. Preview fresh identities; this retry does not restart forward work.");
|
|
480
|
+
}
|
|
481
|
+
if (!compensating && context.transition !== "committed")
|
|
482
|
+
await withSettingsFence(pmRoot, async () => { });
|
|
483
|
+
} });
|
|
484
|
+
}
|
|
485
|
+
// The SDK fast-paths committed journals without calling step inspectors. Never trust that frozen receipt.
|
|
486
|
+
for (const i of order)
|
|
487
|
+
if (await state(i) === "pending") {
|
|
488
|
+
throw new JoinRefusal("csv_join_target_changed", "A reviewed target is missing after coordination. Read current SDK state, reconcile the journal and preview a fresh plan.");
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
rethrowSettingsChange(error, settingsChanged);
|
|
493
|
+
throw joinRefusal(error, "csv_join_apply_failed", "Inspect the SDK transaction journal and current targets before retrying this reviewed plan. Reverse compensation removes only owned unchanged creates and retains SDK tombstones. Inspect pending or blocked cleanup before retry; changed, foreign or policy-blocked targets require reconciliation.");
|
|
494
|
+
}
|
|
495
|
+
await verifySettings(pmRoot);
|
|
496
|
+
return receipt(plan.input, rows, issues, applied, rows.length - applied - skipped.size, skipped.size);
|
|
497
|
+
}
|
|
498
|
+
/** Resolve selected sources, exposing only JoinRefusal for malformed CSV, SDK and input failures. */
|
|
499
|
+
export async function previewJoins(pmRoot, value) {
|
|
500
|
+
pmRoot = resolve(pmRoot);
|
|
501
|
+
try {
|
|
502
|
+
const input = boundary(value, false);
|
|
503
|
+
return await withSettings(pmRoot, settingsChanged, () => previewJoinsInternal(pmRoot, input));
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
throw joinRefusal(error, "csv_join_invalid", "Check the selected sources and initialized tracker, then preview again.");
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/** Apply a saved source/revision plan using the same documented JoinRefusal boundary on every path. */
|
|
510
|
+
export async function applyJoins(pmRoot, value, options) {
|
|
511
|
+
pmRoot = resolve(pmRoot);
|
|
512
|
+
try {
|
|
513
|
+
const plan = boundary(value, true), captured = { ...options };
|
|
514
|
+
return await withSettings(pmRoot, settingsChanged, () => applyJoinsInternal(pmRoot, plan, captured));
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
throw joinRefusal(error, "csv_join_invalid", "Check the reviewed plan and current SDK state before retrying.");
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/** Keep settings drift in the join API's documented refusal family. */
|
|
521
|
+
function settingsChanged() {
|
|
522
|
+
return new JoinRefusal("csv_join_settings_changed", "Settings or schema changed since review. Reconcile any interrupted cleanup, then preview a fresh plan against current settings.");
|
|
523
|
+
}
|
|
524
|
+
/** Register compact native TOON/JSON commands; full source-bearing plans require an explicit output artifact. */
|
|
525
|
+
export function registerJoinCommands(api) {
|
|
526
|
+
for (const action of ["preview", "apply"])
|
|
527
|
+
api.registerCommand({
|
|
528
|
+
name: `csv join ${action}`, description: `${action === "preview" ? "Resolve external table keys without mutations" : "Apply a reviewed cross-table create plan using SDK transactions"}.`,
|
|
529
|
+
arguments: [{ name: "file", required: true, description: "Version 1 join input or saved plan JSON; saved native IDs must be canonical and distinct under the tracker prefix" }],
|
|
530
|
+
flags: action === "preview" ? [{ long: "--output", value_name: "file", description: "Exclusively create source-bearing plan JSON; never overwrite" }] : [],
|
|
531
|
+
async run(ctx) {
|
|
532
|
+
let value;
|
|
533
|
+
try {
|
|
534
|
+
if (statSync(ctx.args[0]).size > 32 * 1024 * 1024)
|
|
535
|
+
throw new JoinRefusal("csv_join_io", "Provide readable UTF-8 join input or saved plan JSON no larger than 32 MiB.");
|
|
536
|
+
value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(readFileSync(ctx.args[0])));
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
throw joinRefusal(error, "csv_join_io", "Provide readable UTF-8 join input or saved plan JSON no larger than 32 MiB.");
|
|
540
|
+
}
|
|
541
|
+
if (action === "apply")
|
|
542
|
+
return { ...await applyJoins(ctx.pm_root, value, { author: ctx.global["author"] ?? "pm-csv" }) };
|
|
543
|
+
const result = await previewJoins(ctx.pm_root, value);
|
|
544
|
+
const output = ctx.options["output"];
|
|
545
|
+
if (output && result.plan) {
|
|
546
|
+
try {
|
|
547
|
+
writeFileSync(output, `${JSON.stringify(result.plan, null, 2)}\n`, { flag: "wx", mode: 0o600 });
|
|
548
|
+
}
|
|
549
|
+
catch (error) {
|
|
550
|
+
throw joinRefusal(error, "csv_join_io", "Choose a new writable plan filename; existing review artifacts are preserved.");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return { ...result.receipt, saved: Boolean(output && result.plan) };
|
|
554
|
+
},
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=join-plans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-plans.js","sourceRoot":"","sources":["../join-plans.ts"],"names":[],"mappings":"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"}
|