@pixerate/editor 0.135.0 → 0.137.0
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/animation-editor/index.cjs +63 -55
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +8 -5
- package/dist/animation-editor/index.d.ts +8 -5
- package/dist/animation-editor/index.js +10 -2
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{bezier-J8i4uqSH.d.cts → bezier-CZ2AhjID.d.cts} +1 -1
- package/dist/{bezier-lNEOp0Jx.d.ts → bezier-Dywv3Bw8.d.ts} +1 -1
- package/dist/blending-D7jCmjO6.d.cts +1026 -0
- package/dist/blending-NgF3qo3d.d.ts +1026 -0
- package/dist/brushes-CnvZSYYU.d.cts +744 -0
- package/dist/brushes-DJmUbIgz.d.ts +744 -0
- package/dist/{brushstrokeRender-SII6MG4R.js → brushstrokeRender-2FAXA3XC.js} +13 -16
- package/dist/{brushstrokeRender-SII6MG4R.js.map → brushstrokeRender-2FAXA3XC.js.map} +1 -1
- package/dist/{brushstrokeRender-JNHVEUFG.cjs → brushstrokeRender-IMFY3FF6.cjs} +16 -19
- package/dist/brushstrokeRender-IMFY3FF6.cjs.map +1 -0
- package/dist/canvas/index.cjs +10 -10
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +10 -7
- package/dist/canvas/index.d.ts +10 -7
- package/dist/canvas/index.js +4 -4
- package/dist/{chunk-W4LNKTHT.cjs → chunk-2XS6LTUP.cjs} +63 -63
- package/dist/{chunk-W4LNKTHT.cjs.map → chunk-2XS6LTUP.cjs.map} +1 -1
- package/dist/{chunk-HHTCDFZC.js → chunk-3D77LOBM.js} +234 -136
- package/dist/chunk-3D77LOBM.js.map +1 -0
- package/dist/{chunk-BR7EKQUP.js → chunk-3G6J7UFV.js} +322 -2
- package/dist/chunk-3G6J7UFV.js.map +1 -0
- package/dist/{chunk-62XUO5LB.js → chunk-3X6IAJUQ.js} +2 -2
- package/dist/{chunk-EM3FMJWE.js → chunk-5FSRTP6E.js} +320 -3
- package/dist/chunk-5FSRTP6E.js.map +1 -0
- package/dist/{chunk-Z2H7KECK.cjs → chunk-5OOIUXNJ.cjs} +345 -247
- package/dist/chunk-5OOIUXNJ.cjs.map +1 -0
- package/dist/{chunk-7RJ6P7MI.js → chunk-6S6362D2.js} +2 -2
- package/dist/chunk-A3BVTI3G.js +150 -0
- package/dist/chunk-A3BVTI3G.js.map +1 -0
- package/dist/{chunk-24ATT2PE.cjs → chunk-AEAAN4AD.cjs} +120 -120
- package/dist/{chunk-24ATT2PE.cjs.map → chunk-AEAAN4AD.cjs.map} +1 -1
- package/dist/chunk-ECCXGELC.cjs +727 -0
- package/dist/chunk-ECCXGELC.cjs.map +1 -0
- package/dist/{chunk-SVYE5HIM.js → chunk-EQQMGO42.js} +2 -2
- package/dist/{chunk-FHPVDTI2.cjs → chunk-F2Y4E4GU.cjs} +22 -22
- package/dist/{chunk-FHPVDTI2.cjs.map → chunk-F2Y4E4GU.cjs.map} +1 -1
- package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
- package/dist/{chunk-UYQUPUR6.js → chunk-HUO3TI4C.js} +3 -3
- package/dist/chunk-I52DRGGJ.js +727 -0
- package/dist/chunk-I52DRGGJ.js.map +1 -0
- package/dist/{chunk-DDSO4HS7.cjs → chunk-KEENUAFN.cjs} +2 -2
- package/dist/{chunk-DDSO4HS7.cjs.map → chunk-KEENUAFN.cjs.map} +1 -1
- package/dist/{chunk-2HC4DRF4.js → chunk-LLFHCSU2.js} +2 -2
- package/dist/{chunk-J5BA3BQ6.cjs → chunk-O7LUD7MH.cjs} +323 -3
- package/dist/chunk-O7LUD7MH.cjs.map +1 -0
- package/dist/{chunk-ILYFOJUN.js → chunk-OIBIRXRG.js} +3 -3
- package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
- package/dist/{chunk-T6TV6HY6.cjs → chunk-PRSRYHQD.cjs} +36 -36
- package/dist/{chunk-T6TV6HY6.cjs.map → chunk-PRSRYHQD.cjs.map} +1 -1
- package/dist/chunk-Q6OUXEK3.cjs +150 -0
- package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
- package/dist/{chunk-6GFRKLLS.cjs → chunk-QBWEH3IM.cjs} +429 -112
- package/dist/chunk-QBWEH3IM.cjs.map +1 -0
- package/dist/{chunk-ESIWZMMK.js → chunk-SYT2TLQF.js} +35 -37
- package/dist/{chunk-ESIWZMMK.js.map → chunk-SYT2TLQF.js.map} +1 -1
- package/dist/{chunk-YT3JL7YM.cjs → chunk-TLCTTQFF.cjs} +53 -53
- package/dist/{chunk-YT3JL7YM.cjs.map → chunk-TLCTTQFF.cjs.map} +1 -1
- package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
- package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
- package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
- package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
- package/dist/{chunk-YAFS2QFZ.cjs → chunk-XN2NBLV5.cjs} +313 -315
- package/dist/chunk-XN2NBLV5.cjs.map +1 -0
- package/dist/effects/index.d.cts +7 -4
- package/dist/effects/index.d.ts +7 -4
- package/dist/{export-DMeG6E06.d.ts → export-41rL6Cne.d.ts} +1 -1
- package/dist/{export-AZSwX087.d.cts → export-CyJdfP_Z.d.cts} +5 -4
- package/dist/{export-KzubBKo7.d.cts → export-D9mXp05Q.d.cts} +1 -1
- package/dist/{export-BDkyDNM8.d.ts → export-DwnZ_hvQ.d.ts} +5 -4
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/generation/index.cjs +150 -945
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +3 -423
- package/dist/generation/index.d.ts +3 -423
- package/dist/generation/index.js +59 -854
- package/dist/generation/index.js.map +1 -1
- package/dist/grammar/index.cjs +3 -3
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.js +2 -2
- package/dist/{helpers-Coa4e2j_.d.ts → helpers-C-RgeyvH.d.ts} +25 -8
- package/dist/{helpers-DHl28yLO.d.cts → helpers-v6GMazzg.d.cts} +25 -8
- package/dist/image-editor/index.cjs +986 -986
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +15 -11
- package/dist/image-editor/index.d.ts +15 -11
- package/dist/image-editor/index.js +94 -94
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -36
- package/dist/{opentype-BWR7Qv8W.d.cts → opentype-KR_jj6b_.d.cts} +1 -1
- package/dist/{opentype-Dfcx6wFx.d.ts → opentype-a1KAW-qs.d.ts} +1 -1
- package/dist/paint/index.cjs +5 -8
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +4 -2
- package/dist/paint/index.d.ts +4 -2
- package/dist/paint/index.js +15 -18
- package/dist/paint-editor/index.cjs +405 -403
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +15 -748
- package/dist/paint-editor/index.d.ts +15 -748
- package/dist/paint-editor/index.js +79 -77
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-BHS4vQNm.d.cts} +1 -1
- package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-BVvTIBMo.d.ts} +1 -1
- package/dist/{pool-8JZGWHvR.d.ts → pool-CZQOrSXZ.d.ts} +1 -1
- package/dist/{pool-BfuxBKTd.d.cts → pool-FjZZmZ80.d.cts} +1 -1
- package/dist/provenance-DmlcgdzT.d.cts +426 -0
- package/dist/provenance-uh5r2TQ8.d.ts +426 -0
- package/dist/rand-8xbUb6ur.d.ts +1118 -0
- package/dist/rand-Cw9VLrVC.d.cts +1118 -0
- package/dist/raster/index.cjs +17 -19
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.js +9 -11
- package/dist/raster/index.js.map +1 -1
- package/dist/{svg-CxxqG3_W.d.ts → svg-CSz3mzkw.d.ts} +2 -2
- package/dist/{svg-pwXWq6s2.d.cts → svg-DTb40ICU.d.cts} +2 -2
- package/dist/{tools-y1M6O3UT.d.ts → tools-B0wXP5cF.d.ts} +1 -1
- package/dist/{tools-3EBjR91b.d.cts → tools-Ca0kI1qo.d.cts} +1 -1
- package/dist/vector/index.cjs +2698 -1674
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +390 -72
- package/dist/vector/index.d.ts +390 -72
- package/dist/vector/index.js +1665 -641
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.d.cts +7 -4
- package/dist/video-editor/index.d.ts +7 -4
- package/dist/{warp-Ceqdz7kj.d.cts → warp-DTOp0lON.d.cts} +1 -1
- package/dist/{warp-C1gwu2G_.d.ts → warp-pd7hrH4T.d.ts} +1 -1
- package/package.json +1 -1
- package/skills/pixerate-vector/SKILL.md +22 -0
- package/dist/brushstrokeRender-JNHVEUFG.cjs.map +0 -1
- package/dist/chunk-64PYNEHJ.js +0 -340
- package/dist/chunk-64PYNEHJ.js.map +0 -1
- package/dist/chunk-6GFRKLLS.cjs.map +0 -1
- package/dist/chunk-7QN76ESJ.js +0 -323
- package/dist/chunk-7QN76ESJ.js.map +0 -1
- package/dist/chunk-BR7EKQUP.js.map +0 -1
- package/dist/chunk-DCLJNVZS.cjs +0 -323
- package/dist/chunk-DCLJNVZS.cjs.map +0 -1
- package/dist/chunk-EM3FMJWE.js.map +0 -1
- package/dist/chunk-HHTCDFZC.js.map +0 -1
- package/dist/chunk-J5BA3BQ6.cjs.map +0 -1
- package/dist/chunk-YAFS2QFZ.cjs.map +0 -1
- package/dist/chunk-Z2H7KECK.cjs.map +0 -1
- package/dist/chunk-Z6OUCS2K.cjs +0 -340
- package/dist/chunk-Z6OUCS2K.cjs.map +0 -1
- package/dist/rand-BszBST4s.d.ts +0 -2140
- package/dist/rand-DOH_aMvm.d.cts +0 -2140
- /package/dist/{chunk-62XUO5LB.js.map → chunk-3X6IAJUQ.js.map} +0 -0
- /package/dist/{chunk-7RJ6P7MI.js.map → chunk-6S6362D2.js.map} +0 -0
- /package/dist/{chunk-SVYE5HIM.js.map → chunk-EQQMGO42.js.map} +0 -0
- /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
- /package/dist/{chunk-UYQUPUR6.js.map → chunk-HUO3TI4C.js.map} +0 -0
- /package/dist/{chunk-2HC4DRF4.js.map → chunk-LLFHCSU2.js.map} +0 -0
- /package/dist/{chunk-ILYFOJUN.js.map → chunk-OIBIRXRG.js.map} +0 -0
- /package/dist/{chunk-FWEO3HSL.js.map → chunk-PQQF5KOW.js.map} +0 -0
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
unionBounds,
|
|
19
19
|
vectorGradientPoints,
|
|
20
20
|
widthProfileAt
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-3D77LOBM.js";
|
|
22
22
|
import {
|
|
23
23
|
segmentLength,
|
|
24
24
|
segmentParamAtLength,
|
|
@@ -750,4 +750,4 @@ export {
|
|
|
750
750
|
interpolateVectorPaths,
|
|
751
751
|
evaluateVectorPathKeyframes
|
|
752
752
|
};
|
|
753
|
-
//# sourceMappingURL=chunk-
|
|
753
|
+
//# sourceMappingURL=chunk-6S6362D2.js.map
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getLatestVersion,
|
|
3
|
+
getTemplateBody,
|
|
4
|
+
resolvePrompt,
|
|
5
|
+
tokenizePrompt
|
|
6
|
+
} from "./chunk-FPENXAEJ.js";
|
|
7
|
+
|
|
8
|
+
// src/generation/provenance.ts
|
|
9
|
+
var PROVENANCE_FORMAT = "pixerate.generation-provenance";
|
|
10
|
+
var PROVENANCE_VERSION = 1;
|
|
11
|
+
var ProvenanceParseError = class extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "ProvenanceParseError";
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var toIso = (value) => new Date(value).toISOString();
|
|
18
|
+
var clone = (value) => value === void 0 ? value : JSON.parse(JSON.stringify(value));
|
|
19
|
+
function pinTemplates(rawPrompt, templates, bindings, maxDepth) {
|
|
20
|
+
const byName = new Map(templates.map((t) => [t.name, t]));
|
|
21
|
+
const pinned = /* @__PURE__ */ new Map();
|
|
22
|
+
const visit = (text, depth) => {
|
|
23
|
+
if (depth > maxDepth) return;
|
|
24
|
+
for (const token of tokenizePrompt(text)) {
|
|
25
|
+
if (token.type !== "template" || pinned.has(token.value)) continue;
|
|
26
|
+
const template = byName.get(token.value);
|
|
27
|
+
if (!template) continue;
|
|
28
|
+
const body = getTemplateBody(template, bindings);
|
|
29
|
+
if (body === void 0) continue;
|
|
30
|
+
const bound = bindings[template.name];
|
|
31
|
+
const version = bound && template.versions ? template.versions.find((v) => v.id === bound || v.version === bound) : getLatestVersion(template);
|
|
32
|
+
const isVersioned = !!template.versions?.length && !!version;
|
|
33
|
+
pinned.set(template.name, {
|
|
34
|
+
name: template.name,
|
|
35
|
+
...template.id !== void 0 ? { templateId: template.id } : {},
|
|
36
|
+
...isVersioned ? { versionId: version.id, version: version.version } : {},
|
|
37
|
+
body
|
|
38
|
+
});
|
|
39
|
+
visit(body, depth + 1);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
visit(rawPrompt, 0);
|
|
43
|
+
return [...pinned.values()];
|
|
44
|
+
}
|
|
45
|
+
function pinnedTemplatesToTemplates(pinned) {
|
|
46
|
+
return pinned.map(
|
|
47
|
+
(p) => p.versionId !== void 0 ? {
|
|
48
|
+
...p.templateId !== void 0 ? { id: p.templateId } : {},
|
|
49
|
+
name: p.name,
|
|
50
|
+
latestVersion: p.version,
|
|
51
|
+
versions: [{ id: p.versionId, version: p.version ?? p.versionId, body: p.body }]
|
|
52
|
+
} : { ...p.templateId !== void 0 ? { id: p.templateId } : {}, name: p.name, body: p.body }
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function createProvenance(options) {
|
|
56
|
+
const templates = options.templates ?? [];
|
|
57
|
+
const maxDepth = options.maxDepth ?? 10;
|
|
58
|
+
const resolved = resolvePrompt(options.rawPrompt, templates, {
|
|
59
|
+
bindings: options.bindings,
|
|
60
|
+
values: options.values,
|
|
61
|
+
maxDepth
|
|
62
|
+
});
|
|
63
|
+
const pinned = pinTemplates(options.rawPrompt, templates, options.bindings ?? {}, maxDepth);
|
|
64
|
+
const bindings = {};
|
|
65
|
+
for (const p of pinned) if (p.versionId !== void 0) bindings[p.name] = p.versionId;
|
|
66
|
+
const modelId = typeof options.model === "string" ? options.model : options.model.id;
|
|
67
|
+
const request = clone(options.plan?.request ?? options.request ?? {});
|
|
68
|
+
request.model = modelId;
|
|
69
|
+
if (request.prompt === void 0) request.prompt = resolved.text;
|
|
70
|
+
const adjustments = clone(options.adjustments ?? options.plan?.adjustments ?? []);
|
|
71
|
+
return {
|
|
72
|
+
format: PROVENANCE_FORMAT,
|
|
73
|
+
version: PROVENANCE_VERSION,
|
|
74
|
+
rawPrompt: options.rawPrompt,
|
|
75
|
+
templates: pinned,
|
|
76
|
+
bindings,
|
|
77
|
+
values: options.values ? clone(options.values) : null,
|
|
78
|
+
resolvedPrompt: resolved.text,
|
|
79
|
+
sourceMap: resolved.map.map((segment) => {
|
|
80
|
+
const { locked: _locked, ...rest } = segment;
|
|
81
|
+
return rest;
|
|
82
|
+
}),
|
|
83
|
+
modelId,
|
|
84
|
+
request,
|
|
85
|
+
adjustments,
|
|
86
|
+
references: (request.references ?? []).map(({ id, role }) => ({ id, role })),
|
|
87
|
+
createdAt: toIso(options.createdAt ?? Date.now()),
|
|
88
|
+
...options.startedAt !== void 0 ? { startedAt: toIso(options.startedAt) } : {},
|
|
89
|
+
...options.completedAt !== void 0 ? { completedAt: toIso(options.completedAt) } : {},
|
|
90
|
+
...options.outputIds ? { outputIds: [...options.outputIds] } : {},
|
|
91
|
+
...options.meta ? { meta: clone(options.meta) } : {}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function serializeProvenance(provenance) {
|
|
95
|
+
return JSON.stringify(provenance);
|
|
96
|
+
}
|
|
97
|
+
var isRecord = (value) => !!value && typeof value === "object" && !Array.isArray(value);
|
|
98
|
+
function parseProvenance(input) {
|
|
99
|
+
let data = input;
|
|
100
|
+
if (typeof input === "string") {
|
|
101
|
+
try {
|
|
102
|
+
data = JSON.parse(input);
|
|
103
|
+
} catch {
|
|
104
|
+
throw new ProvenanceParseError("Provenance is not valid JSON.");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!isRecord(data) || data.format !== PROVENANCE_FORMAT) {
|
|
108
|
+
throw new ProvenanceParseError("Not a generation provenance record.");
|
|
109
|
+
}
|
|
110
|
+
if (typeof data.version !== "number" || data.version > PROVENANCE_VERSION) {
|
|
111
|
+
throw new ProvenanceParseError(`Unsupported provenance version ${JSON.stringify(data.version)}.`);
|
|
112
|
+
}
|
|
113
|
+
const checks = [
|
|
114
|
+
["rawPrompt", typeof data.rawPrompt === "string"],
|
|
115
|
+
["resolvedPrompt", typeof data.resolvedPrompt === "string"],
|
|
116
|
+
["modelId", typeof data.modelId === "string"],
|
|
117
|
+
["createdAt", typeof data.createdAt === "string"],
|
|
118
|
+
["request", isRecord(data.request)],
|
|
119
|
+
["templates", Array.isArray(data.templates) && data.templates.every((t) => isRecord(t) && typeof t.name === "string" && typeof t.body === "string")],
|
|
120
|
+
["sourceMap", Array.isArray(data.sourceMap)],
|
|
121
|
+
["adjustments", Array.isArray(data.adjustments)],
|
|
122
|
+
["references", Array.isArray(data.references)]
|
|
123
|
+
];
|
|
124
|
+
const bad = checks.find(([, ok]) => !ok);
|
|
125
|
+
if (bad) throw new ProvenanceParseError(`Invalid provenance field "${bad[0]}".`);
|
|
126
|
+
return {
|
|
127
|
+
...data,
|
|
128
|
+
bindings: isRecord(data.bindings) ? data.bindings : {},
|
|
129
|
+
values: isRecord(data.values) ? data.values : null
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function replayProvenancePrompt(provenance) {
|
|
133
|
+
const result = resolvePrompt(provenance.rawPrompt, pinnedTemplatesToTemplates(provenance.templates), {
|
|
134
|
+
bindings: provenance.bindings,
|
|
135
|
+
...provenance.values ? { values: provenance.values } : {}
|
|
136
|
+
});
|
|
137
|
+
return { text: result.text, map: result.map, matches: result.text === provenance.resolvedPrompt };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export {
|
|
141
|
+
PROVENANCE_FORMAT,
|
|
142
|
+
PROVENANCE_VERSION,
|
|
143
|
+
ProvenanceParseError,
|
|
144
|
+
pinnedTemplatesToTemplates,
|
|
145
|
+
createProvenance,
|
|
146
|
+
serializeProvenance,
|
|
147
|
+
parseProvenance,
|
|
148
|
+
replayProvenancePrompt
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=chunk-A3BVTI3G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/generation/provenance.ts"],"sourcesContent":["import { getLatestVersion, getTemplateBody, resolvePrompt } from '../grammar/engine.js';\nimport type { SourceMapSegment } from '../grammar/sourcemap.js';\nimport { tokenizePrompt } from '../grammar/tokenizer.js';\nimport type { PromptValues, Template } from '../grammar/tokens.js';\nimport type { GenerationRequest, ModelCapabilities, ReferenceRole } from './capabilities.js';\nimport type { GenerationPlan, PlanAdjustment } from './plan.js';\n\nexport const PROVENANCE_FORMAT = 'pixerate.generation-provenance';\nexport const PROVENANCE_VERSION = 1;\n\n/** The exact template body a generation used. */\nexport interface PinnedTemplate {\n\tname: string;\n\ttemplateId?: string;\n\t/** Version id or version label the body came from (absent for unversioned templates). */\n\tversionId?: string;\n\tversion?: string | number;\n\tbody: string;\n}\n\n/** Everything needed to explain and reproduce one generation. */\nexport interface GenerationProvenance {\n\tformat: typeof PROVENANCE_FORMAT;\n\tversion: typeof PROVENANCE_VERSION;\n\t/** Raw prompt as typed, with `{{templates}}` and `{variables}`. */\n\trawPrompt: string;\n\t/** Every template the prompt reached (recursively), pinned to the body used. */\n\ttemplates: PinnedTemplate[];\n\t/** Version bindings in effect (`{ templateName: versionId }`) for every pinned versioned template. */\n\tbindings: Record<string, string>;\n\t/** Variable values, or `null` when variables were left unresolved. */\n\tvalues: PromptValues | null;\n\tresolvedPrompt: string;\n\tsourceMap: SourceMapSegment[];\n\tmodelId: string;\n\t/** The planned (adjusted) request that was sent. */\n\trequest: GenerationRequest;\n\tadjustments: PlanAdjustment[];\n\treferences: { id: string; role: ReferenceRole }[];\n\t/** ISO timestamps. */\n\tcreatedAt: string;\n\tstartedAt?: string;\n\tcompletedAt?: string;\n\t/** Ids of the outputs this generation produced. */\n\toutputIds?: string[];\n\tmeta?: Record<string, unknown>;\n}\n\nexport interface CreateProvenanceOptions {\n\trawPrompt: string;\n\ttemplates?: Template[];\n\t/** Template version bindings (`{ templateName: versionIdOrVersion }`). */\n\tbindings?: Record<string, string>;\n\tvalues?: PromptValues;\n\tmodel: string | ModelCapabilities;\n\t/** The plan the request came from (its request and adjustments are recorded) … */\n\tplan?: GenerationPlan;\n\t/** … or the request that was sent. */\n\trequest?: GenerationRequest;\n\tadjustments?: PlanAdjustment[];\n\t/** Creation time (default `Date.now()`). */\n\tcreatedAt?: Date | number | string;\n\tstartedAt?: Date | number | string;\n\tcompletedAt?: Date | number | string;\n\toutputIds?: string[];\n\tmeta?: Record<string, unknown>;\n\tmaxDepth?: number;\n}\n\nexport class ProvenanceParseError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = 'ProvenanceParseError';\n\t}\n}\n\nconst toIso = (value: Date | number | string) => new Date(value).toISOString();\nconst clone = <T>(value: T): T => (value === undefined ? value : JSON.parse(JSON.stringify(value)));\n\n/** Collects the templates a prompt reaches, with the body each one resolves to. */\nfunction pinTemplates(\n\trawPrompt: string,\n\ttemplates: Template[],\n\tbindings: Record<string, string>,\n\tmaxDepth: number\n): PinnedTemplate[] {\n\tconst byName = new Map(templates.map((t) => [t.name, t]));\n\tconst pinned = new Map<string, PinnedTemplate>();\n\tconst visit = (text: string, depth: number) => {\n\t\tif (depth > maxDepth) return;\n\t\tfor (const token of tokenizePrompt(text)) {\n\t\t\tif (token.type !== 'template' || pinned.has(token.value)) continue;\n\t\t\tconst template = byName.get(token.value);\n\t\t\tif (!template) continue;\n\t\t\t// Mirror `getTemplateBody` so the pinned body is the one `resolvePrompt` used.\n\t\t\tconst body = getTemplateBody(template, bindings);\n\t\t\tif (body === undefined) continue;\n\t\t\tconst bound = bindings[template.name];\n\t\t\tconst version =\n\t\t\t\tbound && template.versions\n\t\t\t\t\t? template.versions.find((v) => v.id === bound || v.version === bound)\n\t\t\t\t\t: getLatestVersion(template);\n\t\t\tconst isVersioned = !!template.versions?.length && !!version;\n\t\t\tpinned.set(template.name, {\n\t\t\t\tname: template.name,\n\t\t\t\t...(template.id !== undefined ? { templateId: template.id } : {}),\n\t\t\t\t...(isVersioned ? { versionId: version!.id, version: version!.version } : {}),\n\t\t\t\tbody\n\t\t\t});\n\t\t\tvisit(body, depth + 1);\n\t\t}\n\t};\n\tvisit(rawPrompt, 0);\n\treturn [...pinned.values()];\n}\n\n/** Templates that reproduce the pinned bodies exactly (one single-version template each). */\nexport function pinnedTemplatesToTemplates(pinned: readonly PinnedTemplate[]): Template[] {\n\treturn pinned.map((p) =>\n\t\tp.versionId !== undefined\n\t\t\t? {\n\t\t\t\t\t...(p.templateId !== undefined ? { id: p.templateId } : {}),\n\t\t\t\t\tname: p.name,\n\t\t\t\t\tlatestVersion: p.version,\n\t\t\t\t\tversions: [{ id: p.versionId, version: p.version ?? p.versionId, body: p.body }]\n\t\t\t\t}\n\t\t\t: { ...(p.templateId !== undefined ? { id: p.templateId } : {}), name: p.name, body: p.body }\n\t);\n}\n\n/**\n * Records what produced an output: the raw prompt, the exact template bodies\n * and versions it reached, variable values, the resolved prompt and its\n * source map, the model, the planned settings and adjustments, and the\n * references by role.\n */\nexport function createProvenance(options: CreateProvenanceOptions): GenerationProvenance {\n\tconst templates = options.templates ?? [];\n\tconst maxDepth = options.maxDepth ?? 10;\n\tconst resolved = resolvePrompt(options.rawPrompt, templates, {\n\t\tbindings: options.bindings,\n\t\tvalues: options.values,\n\t\tmaxDepth\n\t});\n\tconst pinned = pinTemplates(options.rawPrompt, templates, options.bindings ?? {}, maxDepth);\n\tconst bindings: Record<string, string> = {};\n\tfor (const p of pinned) if (p.versionId !== undefined) bindings[p.name] = p.versionId;\n\n\tconst modelId = typeof options.model === 'string' ? options.model : options.model.id;\n\tconst request: GenerationRequest = clone(options.plan?.request ?? options.request ?? {});\n\trequest.model = modelId;\n\tif (request.prompt === undefined) request.prompt = resolved.text;\n\tconst adjustments = clone(options.adjustments ?? options.plan?.adjustments ?? []);\n\n\treturn {\n\t\tformat: PROVENANCE_FORMAT,\n\t\tversion: PROVENANCE_VERSION,\n\t\trawPrompt: options.rawPrompt,\n\t\ttemplates: pinned,\n\t\tbindings,\n\t\tvalues: options.values ? clone(options.values) : null,\n\t\tresolvedPrompt: resolved.text,\n\t\tsourceMap: resolved.map.map((segment) => {\n\t\t\tconst { locked: _locked, ...rest } = segment as SourceMapSegment & { locked?: boolean };\n\t\t\treturn rest;\n\t\t}),\n\t\tmodelId,\n\t\trequest,\n\t\tadjustments,\n\t\treferences: (request.references ?? []).map(({ id, role }) => ({ id, role })),\n\t\tcreatedAt: toIso(options.createdAt ?? Date.now()),\n\t\t...(options.startedAt !== undefined ? { startedAt: toIso(options.startedAt) } : {}),\n\t\t...(options.completedAt !== undefined ? { completedAt: toIso(options.completedAt) } : {}),\n\t\t...(options.outputIds ? { outputIds: [...options.outputIds] } : {}),\n\t\t...(options.meta ? { meta: clone(options.meta) } : {})\n\t};\n}\n\n/** Versioned JSON for storage next to an output. */\nexport function serializeProvenance(provenance: GenerationProvenance): string {\n\treturn JSON.stringify(provenance);\n}\n\nconst isRecord = (value: unknown): value is Record<string, any> =>\n\t!!value && typeof value === 'object' && !Array.isArray(value);\n\n/** Parses and checks serialized provenance. Throws {@link ProvenanceParseError}. */\nexport function parseProvenance(input: string | unknown): GenerationProvenance {\n\tlet data: unknown = input;\n\tif (typeof input === 'string') {\n\t\ttry {\n\t\t\tdata = JSON.parse(input);\n\t\t} catch {\n\t\t\tthrow new ProvenanceParseError('Provenance is not valid JSON.');\n\t\t}\n\t}\n\tif (!isRecord(data) || data.format !== PROVENANCE_FORMAT) {\n\t\tthrow new ProvenanceParseError('Not a generation provenance record.');\n\t}\n\tif (typeof data.version !== 'number' || data.version > PROVENANCE_VERSION) {\n\t\tthrow new ProvenanceParseError(`Unsupported provenance version ${JSON.stringify(data.version)}.`);\n\t}\n\tconst checks: [string, boolean][] = [\n\t\t['rawPrompt', typeof data.rawPrompt === 'string'],\n\t\t['resolvedPrompt', typeof data.resolvedPrompt === 'string'],\n\t\t['modelId', typeof data.modelId === 'string'],\n\t\t['createdAt', typeof data.createdAt === 'string'],\n\t\t['request', isRecord(data.request)],\n\t\t['templates', Array.isArray(data.templates) && data.templates.every((t: any) => isRecord(t) && typeof t.name === 'string' && typeof t.body === 'string')],\n\t\t['sourceMap', Array.isArray(data.sourceMap)],\n\t\t['adjustments', Array.isArray(data.adjustments)],\n\t\t['references', Array.isArray(data.references)]\n\t];\n\tconst bad = checks.find(([, ok]) => !ok);\n\tif (bad) throw new ProvenanceParseError(`Invalid provenance field \"${bad[0]}\".`);\n\treturn {\n\t\t...(data as GenerationProvenance),\n\t\tbindings: isRecord(data.bindings) ? data.bindings : {},\n\t\tvalues: isRecord(data.values) ? data.values : null\n\t};\n}\n\n/**\n * Re-resolves the raw prompt against the pinned template bodies and values,\n * e.g. to check a record or to open it in an editor with its source map.\n */\nexport function replayProvenancePrompt(provenance: GenerationProvenance): {\n\ttext: string;\n\tmap: SourceMapSegment[];\n\tmatches: boolean;\n} {\n\tconst result = resolvePrompt(provenance.rawPrompt, pinnedTemplatesToTemplates(provenance.templates), {\n\t\tbindings: provenance.bindings,\n\t\t...(provenance.values ? { values: provenance.values } : {})\n\t});\n\treturn { text: result.text, map: result.map, matches: result.text === provenance.resolvedPrompt };\n}\n"],"mappings":"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","names":[]}
|