@dzhechkov/harness-core 0.4.2 → 0.4.4
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/.dz-manifest.json +104 -28
- package/README.md +15 -4
- package/dist/backlog.d.ts +35 -0
- package/dist/backlog.d.ts.map +1 -1
- package/dist/backlog.js +167 -3
- package/dist/backlog.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/loop-blobs.generated.d.ts.map +1 -1
- package/dist/loop-blobs.generated.js +1 -0
- package/dist/loop-blobs.generated.js.map +1 -1
- package/dist/loop-lint.d.ts +6 -2
- package/dist/loop-lint.d.ts.map +1 -1
- package/dist/loop-lint.js +54 -0
- package/dist/loop-lint.js.map +1 -1
- package/dist/loop-plan-graph.d.ts +49 -0
- package/dist/loop-plan-graph.d.ts.map +1 -0
- package/dist/loop-plan-graph.js +128 -0
- package/dist/loop-plan-graph.js.map +1 -0
- package/dist/loop-plan.d.ts +17 -0
- package/dist/loop-plan.d.ts.map +1 -1
- package/dist/loop-plan.js +18 -15
- package/dist/loop-plan.js.map +1 -1
- package/dist/loop-render.d.ts.map +1 -1
- package/dist/loop-render.js +8 -0
- package/dist/loop-render.js.map +1 -1
- package/dist/model-recommender.d.ts +91 -0
- package/dist/model-recommender.d.ts.map +1 -0
- package/dist/model-recommender.js +186 -0
- package/dist/model-recommender.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -1
- package/dist/registry.js.map +1 -1
- package/dist/skills-verify.d.ts +40 -0
- package/dist/skills-verify.d.ts.map +1 -1
- package/dist/skills-verify.js +80 -10
- package/dist/skills-verify.js.map +1 -1
- package/dist/trace-bundle.d.ts +209 -0
- package/dist/trace-bundle.d.ts.map +1 -0
- package/dist/trace-bundle.js +601 -0
- package/dist/trace-bundle.js.map +1 -0
- package/dist/usage.d.ts +7 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +30 -2
- package/dist/usage.js.map +1 -1
- package/package.json +18 -18
- package/sbom.json +217 -27
- package/src/backlog.ts +176 -3
- package/src/index.ts +3 -0
- package/src/loop-blobs.generated.ts +1 -0
- package/src/loop-lint.ts +55 -1
- package/src/loop-plan-graph.ts +132 -0
- package/src/loop-plan.ts +35 -15
- package/src/loop-render.ts +8 -0
- package/src/model-recommender.ts +228 -0
- package/src/registry.ts +4 -1
- package/src/skills-verify.ts +108 -10
- package/src/trace-bundle.ts +743 -0
- package/src/usage.ts +42 -2
- package/LICENSE +0 -21
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable workflow trace bundles — the PURE half.
|
|
3
|
+
*
|
|
4
|
+
* The caller owns every external read and write. This module owns the decisions that must be
|
|
5
|
+
* replayable in a test: which ledger rows belong to a run, whether the harness-record layout is
|
|
6
|
+
* recognised, whether an import may touch a destination, and the exact relative writes it permits.
|
|
7
|
+
* Keeping those decisions independent of the host makes a refusal a value rather than a partially
|
|
8
|
+
* completed mutation.
|
|
9
|
+
*/
|
|
10
|
+
import { traceValidateEvent } from './loop-trace.js';
|
|
11
|
+
/** The version is part of the wire contract: readers refuse versions they do not understand. */
|
|
12
|
+
export const TRACE_BUNDLE_SCHEMA = 'trace-bundle/1';
|
|
13
|
+
/** Native shelves used by both local runs and imported runs. */
|
|
14
|
+
export const TRACE_BUNDLE_LEDGER_PATH = '.dz/feature-adr/run-cost-ledger.jsonl';
|
|
15
|
+
export const TRACE_BUNDLE_RUN_META_FILE = 'run-meta.json';
|
|
16
|
+
const ATTRIBUTION_RULE = 'last-writer-wins by timestamp is a CHOICE: a run whose phases used different models has no single honest answer; this reports "who ran it last"';
|
|
17
|
+
function isObject(value) {
|
|
18
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
19
|
+
}
|
|
20
|
+
function nonEmptyString(value) {
|
|
21
|
+
return typeof value === 'string' && value.trim() !== '';
|
|
22
|
+
}
|
|
23
|
+
function nonNegativeInteger(value) {
|
|
24
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0;
|
|
25
|
+
}
|
|
26
|
+
/** A member origin must remain below the root to which the caller applies the plan. */
|
|
27
|
+
function safeRelativePath(value) {
|
|
28
|
+
if (!nonEmptyString(value) || value.includes('\0') || value.includes('\\'))
|
|
29
|
+
return false;
|
|
30
|
+
if (value.startsWith('/') || /^[A-Za-z]:/.test(value))
|
|
31
|
+
return false;
|
|
32
|
+
return value.split('/').every((part) => part !== '' && part !== '.' && part !== '..');
|
|
33
|
+
}
|
|
34
|
+
function memberShape(value) {
|
|
35
|
+
if (!isObject(value))
|
|
36
|
+
return false;
|
|
37
|
+
return safeRelativePath(value['origin']) && typeof value['content'] === 'string';
|
|
38
|
+
}
|
|
39
|
+
function memberSlotShape(value) {
|
|
40
|
+
if (!isObject(value) || typeof value['present'] !== 'boolean')
|
|
41
|
+
return false;
|
|
42
|
+
if (value['present'] === true)
|
|
43
|
+
return memberShape(value['member']);
|
|
44
|
+
return nonEmptyString(value['reason']);
|
|
45
|
+
}
|
|
46
|
+
function normalizedSlot(value, absentReason) {
|
|
47
|
+
try {
|
|
48
|
+
if (memberSlotShape(value))
|
|
49
|
+
return value;
|
|
50
|
+
if (memberShape(value))
|
|
51
|
+
return { present: true, member: value };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// A hostile value is simply not a readable member; exporting the other facts remains useful.
|
|
55
|
+
}
|
|
56
|
+
return { present: false, reason: absentReason };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Select only rows attributable to this logical run. Slug fallback is deliberately disabled when
|
|
60
|
+
* a row carries any run id: otherwise a foreign loop run sharing a slug leaks into the slice.
|
|
61
|
+
*/
|
|
62
|
+
export function selectLedgerRows(lines, identity) {
|
|
63
|
+
const selected = [];
|
|
64
|
+
let scanned = 0;
|
|
65
|
+
let malformed = 0;
|
|
66
|
+
const source = Array.isArray(lines) ? lines : [];
|
|
67
|
+
const targetRunId = identity !== null && identity !== undefined && typeof identity.runId === 'string' ? identity.runId : null;
|
|
68
|
+
const targetSlug = identity !== null && identity !== undefined && typeof identity.slug === 'string' ? identity.slug : null;
|
|
69
|
+
for (const line of source) {
|
|
70
|
+
scanned++;
|
|
71
|
+
if (typeof line !== 'string') {
|
|
72
|
+
malformed++;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
let row;
|
|
76
|
+
try {
|
|
77
|
+
row = JSON.parse(line);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
malformed++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (!isObject(row))
|
|
84
|
+
continue;
|
|
85
|
+
const rowRunId = row['runId'];
|
|
86
|
+
const carriesRunId = nonEmptyString(rowRunId);
|
|
87
|
+
const byRunId = carriesRunId && targetRunId !== null && rowRunId === targetRunId;
|
|
88
|
+
const bySlug = !carriesRunId && targetSlug !== null && row['slug'] === targetSlug;
|
|
89
|
+
if (byRunId || bySlug)
|
|
90
|
+
selected.push(line);
|
|
91
|
+
}
|
|
92
|
+
return { lines: selected, scanned, matched: selected.length, malformed };
|
|
93
|
+
}
|
|
94
|
+
function readRecord(value) {
|
|
95
|
+
let parsed = value;
|
|
96
|
+
if (typeof value === 'string') {
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(value);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return { ok: false };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return isObject(parsed) ? { ok: true, record: parsed } : { ok: false };
|
|
105
|
+
}
|
|
106
|
+
function readArgsSlug(value) {
|
|
107
|
+
let args = value;
|
|
108
|
+
if (typeof value === 'string') {
|
|
109
|
+
try {
|
|
110
|
+
args = JSON.parse(value);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return { ok: false };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (args === null || args === undefined)
|
|
117
|
+
return { ok: true, slug: null };
|
|
118
|
+
if (!isObject(args))
|
|
119
|
+
return { ok: true, slug: null };
|
|
120
|
+
return { ok: true, slug: typeof args['slug'] === 'string' ? args['slug'] : null };
|
|
121
|
+
}
|
|
122
|
+
function modelsUsedShape(value) {
|
|
123
|
+
if (!isObject(value))
|
|
124
|
+
return false;
|
|
125
|
+
const entries = Object.entries(value);
|
|
126
|
+
return entries.length > 0 && entries.every(([stage, model]) => stage !== '' && nonEmptyString(model));
|
|
127
|
+
}
|
|
128
|
+
const HISTORICAL_FEATURE_ADR_RESULT_KEYS = [
|
|
129
|
+
'slug',
|
|
130
|
+
'tier',
|
|
131
|
+
'artifactsDir',
|
|
132
|
+
'qeGrade',
|
|
133
|
+
'design',
|
|
134
|
+
'codeWrote',
|
|
135
|
+
'gaps',
|
|
136
|
+
];
|
|
137
|
+
function historicalFeatureAdrResultShape(value) {
|
|
138
|
+
if (!isObject(value))
|
|
139
|
+
return false;
|
|
140
|
+
// Older feature-ADR result fields drifted across versions, so require a recognisable threshold
|
|
141
|
+
// rather than an exact key set while still refusing arbitrary objects.
|
|
142
|
+
const recognisedKeys = HISTORICAL_FEATURE_ADR_RESULT_KEYS.filter((key) => (Object.prototype.hasOwnProperty.call(value, key)));
|
|
143
|
+
return recognisedKeys.length >= 3;
|
|
144
|
+
}
|
|
145
|
+
function recordPredatesModelRouting(record) {
|
|
146
|
+
const result = record['result'];
|
|
147
|
+
if (result === null || result === undefined)
|
|
148
|
+
return true;
|
|
149
|
+
if (!isObject(result) || modelsUsedShape(result['modelsUsed']))
|
|
150
|
+
return false;
|
|
151
|
+
return historicalFeatureAdrResultShape(result);
|
|
152
|
+
}
|
|
153
|
+
function harnessRecordShape(value) {
|
|
154
|
+
if (!isObject(value))
|
|
155
|
+
return false;
|
|
156
|
+
if (!nonEmptyString(value['runId']) || !nonEmptyString(value['timestamp']))
|
|
157
|
+
return false;
|
|
158
|
+
if (typeof value['agentCount'] !== 'number' || !Number.isFinite(value['agentCount']))
|
|
159
|
+
return false;
|
|
160
|
+
const result = value['result'];
|
|
161
|
+
if (!isObject(result) || !modelsUsedShape(result['modelsUsed']))
|
|
162
|
+
return false;
|
|
163
|
+
return !('usageEvents' in result) || Array.isArray(result['usageEvents']);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Join persisted harness records without guessing through an unfamiliar layout. Returning no
|
|
167
|
+
* records on a joined shape failure prevents a model-blind record from appearing model-aware.
|
|
168
|
+
*/
|
|
169
|
+
export function resolveRunMeta(records, slug) {
|
|
170
|
+
try {
|
|
171
|
+
if (!Array.isArray(records) || records.length === 0) {
|
|
172
|
+
return { resolved: false, reason: 'records-absent' };
|
|
173
|
+
}
|
|
174
|
+
const joined = [];
|
|
175
|
+
for (const source of records) {
|
|
176
|
+
const read = readRecord(source);
|
|
177
|
+
if (!read.ok)
|
|
178
|
+
return { resolved: false, reason: 'unreadable' };
|
|
179
|
+
const args = readArgsSlug(read.record['args']);
|
|
180
|
+
if (!args.ok)
|
|
181
|
+
return { resolved: false, reason: 'unreadable' };
|
|
182
|
+
if (slug !== null && args.slug === slug)
|
|
183
|
+
joined.push(read.record);
|
|
184
|
+
}
|
|
185
|
+
if (joined.length === 0)
|
|
186
|
+
return { resolved: false, reason: 'no-match' };
|
|
187
|
+
// The unit of judgement is the RECORD, not the slug: the two-phase L/XL flow puts an older
|
|
188
|
+
// first phase and a newer re-invoke under ONE slug, so refusing the slug because one sibling
|
|
189
|
+
// predates model routing throws away data that is right there (MEASURED: 1 slug of 32).
|
|
190
|
+
const recognised = [];
|
|
191
|
+
const notUsable = [];
|
|
192
|
+
for (const record of joined) {
|
|
193
|
+
if (harnessRecordShape(record))
|
|
194
|
+
recognised.push(record);
|
|
195
|
+
else
|
|
196
|
+
notUsable.push(record);
|
|
197
|
+
}
|
|
198
|
+
if (recognised.length === 0) {
|
|
199
|
+
const reason = notUsable.every(recordPredatesModelRouting)
|
|
200
|
+
? 'predates-model-routing'
|
|
201
|
+
: 'layout-unrecognised';
|
|
202
|
+
return { resolved: false, reason };
|
|
203
|
+
}
|
|
204
|
+
const historical = notUsable.filter(recordPredatesModelRouting).length;
|
|
205
|
+
const skipped = {
|
|
206
|
+
count: notUsable.length,
|
|
207
|
+
historical,
|
|
208
|
+
unrecognised: notUsable.length - historical,
|
|
209
|
+
};
|
|
210
|
+
const ordered = recognised
|
|
211
|
+
.map((record, index) => ({ record, index }))
|
|
212
|
+
.sort((a, b) => {
|
|
213
|
+
const byTimestamp = a.record.timestamp < b.record.timestamp ? -1 : a.record.timestamp > b.record.timestamp ? 1 : 0;
|
|
214
|
+
return byTimestamp === 0 ? a.index - b.index : byTimestamp;
|
|
215
|
+
})
|
|
216
|
+
.map(({ record }) => record);
|
|
217
|
+
return { resolved: true, records: ordered, skipped };
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return { resolved: false, reason: 'unreadable' };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Fold the labelled convenience view alongside its source records. Last-writer-wins is explicitly
|
|
225
|
+
* a policy choice, and the source ids let a later consumer choose and audit a different policy.
|
|
226
|
+
*/
|
|
227
|
+
export function foldAttribution(records) {
|
|
228
|
+
if (!Array.isArray(records) || records.length === 0)
|
|
229
|
+
return { derived: false, reason: 'no-runmeta' };
|
|
230
|
+
try {
|
|
231
|
+
const ordered = records
|
|
232
|
+
.map((record, index) => ({ record, index }))
|
|
233
|
+
.sort((a, b) => {
|
|
234
|
+
const left = typeof a.record.timestamp === 'string' ? a.record.timestamp : '';
|
|
235
|
+
const right = typeof b.record.timestamp === 'string' ? b.record.timestamp : '';
|
|
236
|
+
const byTimestamp = left < right ? -1 : left > right ? 1 : 0;
|
|
237
|
+
return byTimestamp === 0 ? a.index - b.index : byTimestamp;
|
|
238
|
+
});
|
|
239
|
+
const byStage = {};
|
|
240
|
+
const fromRecordIds = [];
|
|
241
|
+
for (const { record } of ordered) {
|
|
242
|
+
if (nonEmptyString(record.runId))
|
|
243
|
+
fromRecordIds.push(record.runId);
|
|
244
|
+
const models = isObject(record.result) ? record.result.modelsUsed : undefined;
|
|
245
|
+
if (!isObject(models))
|
|
246
|
+
continue;
|
|
247
|
+
for (const [stage, model] of Object.entries(models)) {
|
|
248
|
+
if (stage === '' || !nonEmptyString(model))
|
|
249
|
+
continue;
|
|
250
|
+
Object.defineProperty(byStage, stage, {
|
|
251
|
+
value: model,
|
|
252
|
+
writable: true,
|
|
253
|
+
enumerable: true,
|
|
254
|
+
configurable: true,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return { derived: true, rule: ATTRIBUTION_RULE, fromRecordIds, byStage };
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return { derived: false, reason: 'unreadable-runmeta' };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function emptyBundle() {
|
|
265
|
+
return {
|
|
266
|
+
schema: TRACE_BUNDLE_SCHEMA,
|
|
267
|
+
provenance: {
|
|
268
|
+
sourceRoot: '',
|
|
269
|
+
runAddress: '',
|
|
270
|
+
slug: null,
|
|
271
|
+
runId: null,
|
|
272
|
+
toolVersion: '',
|
|
273
|
+
createdAt: null,
|
|
274
|
+
},
|
|
275
|
+
trace: { present: false, reason: 'invalid-input' },
|
|
276
|
+
checkpoints: { present: false, reason: 'invalid-input' },
|
|
277
|
+
ledger: {
|
|
278
|
+
present: false,
|
|
279
|
+
scanned: 0,
|
|
280
|
+
matched: 0,
|
|
281
|
+
malformed: 0,
|
|
282
|
+
lines: [],
|
|
283
|
+
reason: 'invalid-input',
|
|
284
|
+
},
|
|
285
|
+
pairs: { included: false, reason: 'not-requested' },
|
|
286
|
+
runMeta: { resolved: false, reason: 'records-absent' },
|
|
287
|
+
attribution: { derived: false, reason: 'no-runmeta' },
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/** Assemble a bundle solely from facts the caller has already read. Malformed facts degrade safely. */
|
|
291
|
+
export function buildBundle(input) {
|
|
292
|
+
try {
|
|
293
|
+
const slug = typeof input.slug === 'string' ? input.slug : null;
|
|
294
|
+
const runId = typeof input.runId === 'string' ? input.runId : null;
|
|
295
|
+
const trace = normalizedSlot(input.trace, 'not-provided');
|
|
296
|
+
const checkpoints = normalizedSlot(input.checkpoints, 'not-provided');
|
|
297
|
+
let ledger;
|
|
298
|
+
if (Array.isArray(input.ledgerLines)) {
|
|
299
|
+
const selection = selectLedgerRows(input.ledgerLines, { runId, slug });
|
|
300
|
+
ledger = { present: true, ...selection };
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
ledger = {
|
|
304
|
+
present: false,
|
|
305
|
+
scanned: 0,
|
|
306
|
+
matched: 0,
|
|
307
|
+
malformed: 0,
|
|
308
|
+
lines: [],
|
|
309
|
+
reason: nonEmptyString(input.ledgerReason) ? input.ledgerReason : 'not-provided',
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
let pairs;
|
|
313
|
+
if (input.includePairs !== true) {
|
|
314
|
+
pairs = { included: false, reason: 'not-requested' };
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
const files = Array.isArray(input.pairFiles) ? input.pairFiles.filter(memberShape) : [];
|
|
318
|
+
pairs = files.length === 0
|
|
319
|
+
? { included: false, reason: 'no-pairs-found' }
|
|
320
|
+
: { included: true, files: [...files] };
|
|
321
|
+
}
|
|
322
|
+
const runMeta = resolveRunMeta(input.records, slug);
|
|
323
|
+
return {
|
|
324
|
+
schema: TRACE_BUNDLE_SCHEMA,
|
|
325
|
+
provenance: {
|
|
326
|
+
sourceRoot: typeof input.sourceRoot === 'string' ? input.sourceRoot : '',
|
|
327
|
+
runAddress: typeof input.runAddress === 'string' ? input.runAddress : '',
|
|
328
|
+
slug,
|
|
329
|
+
runId,
|
|
330
|
+
toolVersion: typeof input.toolVersion === 'string' ? input.toolVersion : '',
|
|
331
|
+
createdAt: typeof input.createdAt === 'string' ? input.createdAt : null,
|
|
332
|
+
},
|
|
333
|
+
trace,
|
|
334
|
+
checkpoints,
|
|
335
|
+
ledger,
|
|
336
|
+
pairs,
|
|
337
|
+
runMeta,
|
|
338
|
+
attribution: foldAttribution(runMeta.resolved ? runMeta.records : []),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return emptyBundle();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/** JSON escaping changes only the container representation; member content round-trips verbatim. */
|
|
346
|
+
export function serializeBundle(bundle) {
|
|
347
|
+
try {
|
|
348
|
+
const text = JSON.stringify(bundle);
|
|
349
|
+
return typeof text === 'string' ? text : '';
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return '';
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function provenanceShape(value) {
|
|
356
|
+
if (!isObject(value))
|
|
357
|
+
return false;
|
|
358
|
+
return (typeof value['sourceRoot'] === 'string' &&
|
|
359
|
+
typeof value['runAddress'] === 'string' &&
|
|
360
|
+
(typeof value['slug'] === 'string' || value['slug'] === null) &&
|
|
361
|
+
(typeof value['runId'] === 'string' || value['runId'] === null) &&
|
|
362
|
+
typeof value['toolVersion'] === 'string' &&
|
|
363
|
+
(typeof value['createdAt'] === 'string' || value['createdAt'] === null));
|
|
364
|
+
}
|
|
365
|
+
function ledgerShape(value) {
|
|
366
|
+
if (!isObject(value) || typeof value['present'] !== 'boolean')
|
|
367
|
+
return false;
|
|
368
|
+
if (!nonNegativeInteger(value['scanned']) || !nonNegativeInteger(value['matched']) || !nonNegativeInteger(value['malformed']))
|
|
369
|
+
return false;
|
|
370
|
+
if (!Array.isArray(value['lines']) || !value['lines'].every((line) => typeof line === 'string' && jsonObjectLine(line)))
|
|
371
|
+
return false;
|
|
372
|
+
if (value['matched'] !== value['lines'].length || value['scanned'] < value['matched'] + value['malformed'])
|
|
373
|
+
return false;
|
|
374
|
+
return value['present'] === true || nonEmptyString(value['reason']);
|
|
375
|
+
}
|
|
376
|
+
function jsonObjectLine(line) {
|
|
377
|
+
try {
|
|
378
|
+
return isObject(JSON.parse(line));
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function jsonlShape(content, validate) {
|
|
385
|
+
for (const line of content.split('\n')) {
|
|
386
|
+
if (line.trim() === '')
|
|
387
|
+
continue;
|
|
388
|
+
let value;
|
|
389
|
+
try {
|
|
390
|
+
value = JSON.parse(line);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
if (!validate(value))
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
function traceContentShape(slot) {
|
|
401
|
+
return !slot.present || jsonlShape(slot.member.content, (event) => traceValidateEvent(event) === null);
|
|
402
|
+
}
|
|
403
|
+
function checkpointContentShape(slot) {
|
|
404
|
+
return !slot.present || jsonlShape(slot.member.content, (entry) => (isObject(entry) &&
|
|
405
|
+
nonEmptyString(entry['stage']) &&
|
|
406
|
+
nonEmptyString(entry['inputHash']) &&
|
|
407
|
+
'result' in entry &&
|
|
408
|
+
entry['result'] !== null &&
|
|
409
|
+
entry['result'] !== undefined));
|
|
410
|
+
}
|
|
411
|
+
function pairContentShape(member) {
|
|
412
|
+
return jsonlShape(member.content, (pair) => (isObject(pair) &&
|
|
413
|
+
nonEmptyString(pair['schema']) &&
|
|
414
|
+
nonEmptyString(pair['slug']) &&
|
|
415
|
+
nonEmptyString(pair['stage']) &&
|
|
416
|
+
typeof pair['input'] === 'string' &&
|
|
417
|
+
typeof pair['output'] === 'string'));
|
|
418
|
+
}
|
|
419
|
+
function pairsShape(value) {
|
|
420
|
+
if (!isObject(value) || typeof value['included'] !== 'boolean')
|
|
421
|
+
return false;
|
|
422
|
+
if (value['included'] === false)
|
|
423
|
+
return value['reason'] === 'not-requested' || value['reason'] === 'no-pairs-found';
|
|
424
|
+
return Array.isArray(value['files']) && value['files'].length > 0 && value['files'].every((file) => memberShape(file) && pairContentShape(file));
|
|
425
|
+
}
|
|
426
|
+
function runMetaShape(value) {
|
|
427
|
+
if (!isObject(value) || typeof value['resolved'] !== 'boolean')
|
|
428
|
+
return false;
|
|
429
|
+
if (value['resolved'] === false) {
|
|
430
|
+
return value['reason'] === 'records-absent' || value['reason'] === 'no-match' || value['reason'] === 'unreadable' || value['reason'] === 'predates-model-routing' || value['reason'] === 'layout-unrecognised';
|
|
431
|
+
}
|
|
432
|
+
return Array.isArray(value['records']) && value['records'].every(harnessRecordShape);
|
|
433
|
+
}
|
|
434
|
+
function stringRecordShape(value) {
|
|
435
|
+
return isObject(value) && Object.entries(value).every(([key, item]) => key !== '' && typeof item === 'string');
|
|
436
|
+
}
|
|
437
|
+
function attributionShape(value) {
|
|
438
|
+
if (!isObject(value) || typeof value['derived'] !== 'boolean')
|
|
439
|
+
return false;
|
|
440
|
+
if (value['derived'] === false)
|
|
441
|
+
return nonEmptyString(value['reason']);
|
|
442
|
+
return (nonEmptyString(value['rule']) &&
|
|
443
|
+
Array.isArray(value['fromRecordIds']) &&
|
|
444
|
+
value['fromRecordIds'].every(nonEmptyString) &&
|
|
445
|
+
stringRecordShape(value['byStage']));
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Recognise the complete current format or refuse it. Validation finishes before the bundle is
|
|
449
|
+
* returned, so an importer can never receive a valid-looking subset of a corrupt artifact.
|
|
450
|
+
*/
|
|
451
|
+
export function parseBundle(text) {
|
|
452
|
+
let parsed;
|
|
453
|
+
try {
|
|
454
|
+
parsed = JSON.parse(text);
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
return { ok: false, reason: 'unparseable' };
|
|
458
|
+
}
|
|
459
|
+
if (!isObject(parsed))
|
|
460
|
+
return { ok: false, reason: 'unknown-schema', found: 'undefined' };
|
|
461
|
+
if (parsed['schema'] !== TRACE_BUNDLE_SCHEMA) {
|
|
462
|
+
let found;
|
|
463
|
+
try {
|
|
464
|
+
found = String(parsed['schema']);
|
|
465
|
+
}
|
|
466
|
+
catch {
|
|
467
|
+
found = 'unreadable';
|
|
468
|
+
}
|
|
469
|
+
return { ok: false, reason: 'unknown-schema', found };
|
|
470
|
+
}
|
|
471
|
+
if (!provenanceShape(parsed['provenance']))
|
|
472
|
+
return { ok: false, reason: 'member-shape', member: 'provenance' };
|
|
473
|
+
if (!memberSlotShape(parsed['trace']) || !traceContentShape(parsed['trace']))
|
|
474
|
+
return { ok: false, reason: 'member-shape', member: 'trace' };
|
|
475
|
+
if (!memberSlotShape(parsed['checkpoints']) || !checkpointContentShape(parsed['checkpoints']))
|
|
476
|
+
return { ok: false, reason: 'member-shape', member: 'checkpoints' };
|
|
477
|
+
if (!ledgerShape(parsed['ledger']))
|
|
478
|
+
return { ok: false, reason: 'member-shape', member: 'ledger' };
|
|
479
|
+
if (!pairsShape(parsed['pairs']))
|
|
480
|
+
return { ok: false, reason: 'member-shape', member: 'pairs' };
|
|
481
|
+
if (!runMetaShape(parsed['runMeta']))
|
|
482
|
+
return { ok: false, reason: 'member-shape', member: 'runMeta' };
|
|
483
|
+
if (!attributionShape(parsed['attribution']))
|
|
484
|
+
return { ok: false, reason: 'member-shape', member: 'attribution' };
|
|
485
|
+
return { ok: true, bundle: parsed };
|
|
486
|
+
}
|
|
487
|
+
function canonicalRunDir(bundle) {
|
|
488
|
+
if (nonEmptyString(bundle.provenance.slug) && safeRelativePath(bundle.provenance.slug)) {
|
|
489
|
+
return 'features/' + bundle.provenance.slug;
|
|
490
|
+
}
|
|
491
|
+
if (nonEmptyString(bundle.provenance.runId) && safeRelativePath(bundle.provenance.runId)) {
|
|
492
|
+
return '.dz/loop-trace/' + bundle.provenance.runId;
|
|
493
|
+
}
|
|
494
|
+
return null;
|
|
495
|
+
}
|
|
496
|
+
function mismatchReason(bundle, destination) {
|
|
497
|
+
if (destination === null)
|
|
498
|
+
return null;
|
|
499
|
+
const bundleSlug = bundle.provenance.slug;
|
|
500
|
+
const bundleRunId = bundle.provenance.runId;
|
|
501
|
+
if (destination.slug !== null && destination.slug !== bundleSlug) {
|
|
502
|
+
return `destination slug "${destination.slug}" disagrees with bundle provenance slug "${String(bundleSlug)}"`;
|
|
503
|
+
}
|
|
504
|
+
if (destination.runId !== null && destination.runId !== bundleRunId) {
|
|
505
|
+
return `destination runId "${destination.runId}" disagrees with bundle provenance runId "${String(bundleRunId)}"`;
|
|
506
|
+
}
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
function joinRelative(base, child) {
|
|
510
|
+
if (!safeRelativePath(base) || !safeRelativePath(child))
|
|
511
|
+
return null;
|
|
512
|
+
return base + '/' + child;
|
|
513
|
+
}
|
|
514
|
+
function listingHasRunContent(paths, runDir) {
|
|
515
|
+
if (paths === undefined)
|
|
516
|
+
return false;
|
|
517
|
+
for (const path of paths) {
|
|
518
|
+
if (path.startsWith(runDir + '/'))
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
function runMetaContent(bundle, bundleName) {
|
|
524
|
+
return JSON.stringify({
|
|
525
|
+
schema: TRACE_BUNDLE_SCHEMA,
|
|
526
|
+
sourceBundle: bundleName,
|
|
527
|
+
provenance: bundle.provenance,
|
|
528
|
+
runMeta: bundle.runMeta,
|
|
529
|
+
attribution: bundle.attribution,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Plan native-layout reconstruction without touching the destination. Every fatal check is
|
|
534
|
+
* completed before writes are returned, preserving the all-or-nothing refusal boundary.
|
|
535
|
+
*/
|
|
536
|
+
export function planImport(bundle, destFacts) {
|
|
537
|
+
const refusals = [];
|
|
538
|
+
try {
|
|
539
|
+
const canonical = canonicalRunDir(bundle);
|
|
540
|
+
const suppliedRunDir = nonEmptyString(destFacts.runDir) ? destFacts.runDir : null;
|
|
541
|
+
const runDir = suppliedRunDir ?? canonical;
|
|
542
|
+
if (runDir === null || !safeRelativePath(runDir)) {
|
|
543
|
+
refusals.push({ path: suppliedRunDir ?? '.', reason: 'bundle provenance does not identify a safe native run directory' });
|
|
544
|
+
}
|
|
545
|
+
else if (canonical !== null && suppliedRunDir !== null && suppliedRunDir !== canonical) {
|
|
546
|
+
refusals.push({ path: suppliedRunDir, reason: `bundle provenance identifies run directory "${canonical}", not "${suppliedRunDir}"` });
|
|
547
|
+
}
|
|
548
|
+
const mismatch = mismatchReason(bundle, destFacts.runIdentity);
|
|
549
|
+
if (mismatch !== null)
|
|
550
|
+
refusals.push({ path: runDir ?? '.', reason: mismatch });
|
|
551
|
+
const runDirHasContent = runDir !== null && (destFacts.runDirHasContent || listingHasRunContent(destFacts.existingPaths, runDir));
|
|
552
|
+
if (runDir !== null && runDirHasContent) {
|
|
553
|
+
if (destFacts.force !== true) {
|
|
554
|
+
refusals.push({ path: runDir, reason: 'destination run directory already has content; force is required for the bundle own run' });
|
|
555
|
+
}
|
|
556
|
+
else if (destFacts.runIdentity === null || (destFacts.runIdentity.slug === null && destFacts.runIdentity.runId === null)) {
|
|
557
|
+
refusals.push({ path: runDir, reason: 'destination identity is unavailable, so bundle ownership cannot be established even under force' });
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
if (!nonEmptyString(destFacts.bundleName)) {
|
|
561
|
+
refusals.push({ path: runDir ?? '.', reason: 'source bundle name is required for the run-meta sidecar' });
|
|
562
|
+
}
|
|
563
|
+
if (refusals.length > 0 || runDir === null)
|
|
564
|
+
return { writes: [], refusals, ok: false };
|
|
565
|
+
const writes = [];
|
|
566
|
+
const addRunMember = (slot, label) => {
|
|
567
|
+
if (!slot.present)
|
|
568
|
+
return;
|
|
569
|
+
const path = joinRelative(runDir, slot.member.origin);
|
|
570
|
+
if (path === null)
|
|
571
|
+
refusals.push({ path: slot.member.origin, reason: `${label} origin is not a safe relative path` });
|
|
572
|
+
else
|
|
573
|
+
writes.push({ path, content: slot.member.content });
|
|
574
|
+
};
|
|
575
|
+
addRunMember(bundle.trace, 'trace');
|
|
576
|
+
addRunMember(bundle.checkpoints, 'checkpoints');
|
|
577
|
+
if (bundle.ledger.present) {
|
|
578
|
+
writes.push({ path: TRACE_BUNDLE_LEDGER_PATH, content: bundle.ledger.lines.join('\n') });
|
|
579
|
+
}
|
|
580
|
+
if (bundle.pairs.included && destFacts.withPairs === true) {
|
|
581
|
+
for (const file of bundle.pairs.files) {
|
|
582
|
+
if (!memberShape(file))
|
|
583
|
+
refusals.push({ path: 'pairs', reason: 'pair origin is not a safe relative path' });
|
|
584
|
+
else
|
|
585
|
+
writes.push({ path: file.origin, content: file.content });
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
const runMetaPath = joinRelative(runDir, TRACE_BUNDLE_RUN_META_FILE);
|
|
589
|
+
if (runMetaPath === null)
|
|
590
|
+
refusals.push({ path: runDir, reason: 'run-meta path is not safe' });
|
|
591
|
+
else
|
|
592
|
+
writes.push({ path: runMetaPath, content: runMetaContent(bundle, destFacts.bundleName) });
|
|
593
|
+
if (refusals.length > 0)
|
|
594
|
+
return { writes: [], refusals, ok: false };
|
|
595
|
+
return { writes, refusals: [], ok: true };
|
|
596
|
+
}
|
|
597
|
+
catch {
|
|
598
|
+
return { writes: [], refusals: [{ path: '.', reason: 'destination facts are unreadable' }], ok: false };
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=trace-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-bundle.js","sourceRoot":"","sources":["../src/trace-bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/usage.d.ts
CHANGED
|
@@ -76,6 +76,13 @@ export interface WeeklyResetAnchor {
|
|
|
76
76
|
readonly weekday: number;
|
|
77
77
|
readonly hour: number;
|
|
78
78
|
readonly minute: number;
|
|
79
|
+
/** Explicit UTC offset in minutes (e.g. `+03:00` → 180). When present, the boundary is an
|
|
80
|
+
* ABSOLUTE instant, immune to the server's timezone. When absent (legacy `Wed 08:59`), the
|
|
81
|
+
* boundary is computed in server-local time — PROVEN wrong when the machine's tz differs from
|
|
82
|
+
* the account's reset tz (idea c8513be9: the same wall-clock instant produced window starts a
|
|
83
|
+
* WEEK apart under UTC vs Europe/Moscow, so the counter held the old week for hours after the
|
|
84
|
+
* real reset while printing the "correct" clock time). */
|
|
85
|
+
readonly offsetMinutes?: number;
|
|
79
86
|
}
|
|
80
87
|
/** Optional, plan-dependent calibration limits from `.dz/config.json`. Absent ⇒ pct is `null`. */
|
|
81
88
|
export interface UsageLimits {
|