@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.
Files changed (164) hide show
  1. package/dist/animation-editor/index.cjs +63 -55
  2. package/dist/animation-editor/index.cjs.map +1 -1
  3. package/dist/animation-editor/index.d.cts +8 -5
  4. package/dist/animation-editor/index.d.ts +8 -5
  5. package/dist/animation-editor/index.js +10 -2
  6. package/dist/animation-editor/index.js.map +1 -1
  7. package/dist/{bezier-J8i4uqSH.d.cts → bezier-CZ2AhjID.d.cts} +1 -1
  8. package/dist/{bezier-lNEOp0Jx.d.ts → bezier-Dywv3Bw8.d.ts} +1 -1
  9. package/dist/blending-D7jCmjO6.d.cts +1026 -0
  10. package/dist/blending-NgF3qo3d.d.ts +1026 -0
  11. package/dist/brushes-CnvZSYYU.d.cts +744 -0
  12. package/dist/brushes-DJmUbIgz.d.ts +744 -0
  13. package/dist/{brushstrokeRender-SII6MG4R.js → brushstrokeRender-2FAXA3XC.js} +13 -16
  14. package/dist/{brushstrokeRender-SII6MG4R.js.map → brushstrokeRender-2FAXA3XC.js.map} +1 -1
  15. package/dist/{brushstrokeRender-JNHVEUFG.cjs → brushstrokeRender-IMFY3FF6.cjs} +16 -19
  16. package/dist/brushstrokeRender-IMFY3FF6.cjs.map +1 -0
  17. package/dist/canvas/index.cjs +10 -10
  18. package/dist/canvas/index.cjs.map +1 -1
  19. package/dist/canvas/index.d.cts +10 -7
  20. package/dist/canvas/index.d.ts +10 -7
  21. package/dist/canvas/index.js +4 -4
  22. package/dist/{chunk-W4LNKTHT.cjs → chunk-2XS6LTUP.cjs} +63 -63
  23. package/dist/{chunk-W4LNKTHT.cjs.map → chunk-2XS6LTUP.cjs.map} +1 -1
  24. package/dist/{chunk-HHTCDFZC.js → chunk-3D77LOBM.js} +234 -136
  25. package/dist/chunk-3D77LOBM.js.map +1 -0
  26. package/dist/{chunk-BR7EKQUP.js → chunk-3G6J7UFV.js} +322 -2
  27. package/dist/chunk-3G6J7UFV.js.map +1 -0
  28. package/dist/{chunk-62XUO5LB.js → chunk-3X6IAJUQ.js} +2 -2
  29. package/dist/{chunk-EM3FMJWE.js → chunk-5FSRTP6E.js} +320 -3
  30. package/dist/chunk-5FSRTP6E.js.map +1 -0
  31. package/dist/{chunk-Z2H7KECK.cjs → chunk-5OOIUXNJ.cjs} +345 -247
  32. package/dist/chunk-5OOIUXNJ.cjs.map +1 -0
  33. package/dist/{chunk-7RJ6P7MI.js → chunk-6S6362D2.js} +2 -2
  34. package/dist/chunk-A3BVTI3G.js +150 -0
  35. package/dist/chunk-A3BVTI3G.js.map +1 -0
  36. package/dist/{chunk-24ATT2PE.cjs → chunk-AEAAN4AD.cjs} +120 -120
  37. package/dist/{chunk-24ATT2PE.cjs.map → chunk-AEAAN4AD.cjs.map} +1 -1
  38. package/dist/chunk-ECCXGELC.cjs +727 -0
  39. package/dist/chunk-ECCXGELC.cjs.map +1 -0
  40. package/dist/{chunk-SVYE5HIM.js → chunk-EQQMGO42.js} +2 -2
  41. package/dist/{chunk-FHPVDTI2.cjs → chunk-F2Y4E4GU.cjs} +22 -22
  42. package/dist/{chunk-FHPVDTI2.cjs.map → chunk-F2Y4E4GU.cjs.map} +1 -1
  43. package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
  44. package/dist/{chunk-UYQUPUR6.js → chunk-HUO3TI4C.js} +3 -3
  45. package/dist/chunk-I52DRGGJ.js +727 -0
  46. package/dist/chunk-I52DRGGJ.js.map +1 -0
  47. package/dist/{chunk-DDSO4HS7.cjs → chunk-KEENUAFN.cjs} +2 -2
  48. package/dist/{chunk-DDSO4HS7.cjs.map → chunk-KEENUAFN.cjs.map} +1 -1
  49. package/dist/{chunk-2HC4DRF4.js → chunk-LLFHCSU2.js} +2 -2
  50. package/dist/{chunk-J5BA3BQ6.cjs → chunk-O7LUD7MH.cjs} +323 -3
  51. package/dist/chunk-O7LUD7MH.cjs.map +1 -0
  52. package/dist/{chunk-ILYFOJUN.js → chunk-OIBIRXRG.js} +3 -3
  53. package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
  54. package/dist/{chunk-T6TV6HY6.cjs → chunk-PRSRYHQD.cjs} +36 -36
  55. package/dist/{chunk-T6TV6HY6.cjs.map → chunk-PRSRYHQD.cjs.map} +1 -1
  56. package/dist/chunk-Q6OUXEK3.cjs +150 -0
  57. package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
  58. package/dist/{chunk-6GFRKLLS.cjs → chunk-QBWEH3IM.cjs} +429 -112
  59. package/dist/chunk-QBWEH3IM.cjs.map +1 -0
  60. package/dist/{chunk-ESIWZMMK.js → chunk-SYT2TLQF.js} +35 -37
  61. package/dist/{chunk-ESIWZMMK.js.map → chunk-SYT2TLQF.js.map} +1 -1
  62. package/dist/{chunk-YT3JL7YM.cjs → chunk-TLCTTQFF.cjs} +53 -53
  63. package/dist/{chunk-YT3JL7YM.cjs.map → chunk-TLCTTQFF.cjs.map} +1 -1
  64. package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
  65. package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
  66. package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
  67. package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
  68. package/dist/{chunk-YAFS2QFZ.cjs → chunk-XN2NBLV5.cjs} +313 -315
  69. package/dist/chunk-XN2NBLV5.cjs.map +1 -0
  70. package/dist/effects/index.d.cts +7 -4
  71. package/dist/effects/index.d.ts +7 -4
  72. package/dist/{export-DMeG6E06.d.ts → export-41rL6Cne.d.ts} +1 -1
  73. package/dist/{export-AZSwX087.d.cts → export-CyJdfP_Z.d.cts} +5 -4
  74. package/dist/{export-KzubBKo7.d.cts → export-D9mXp05Q.d.cts} +1 -1
  75. package/dist/{export-BDkyDNM8.d.ts → export-DwnZ_hvQ.d.ts} +5 -4
  76. package/dist/extensions/index.cjs +3 -3
  77. package/dist/extensions/index.cjs.map +1 -1
  78. package/dist/extensions/index.js +2 -2
  79. package/dist/generation/index.cjs +150 -945
  80. package/dist/generation/index.cjs.map +1 -1
  81. package/dist/generation/index.d.cts +3 -423
  82. package/dist/generation/index.d.ts +3 -423
  83. package/dist/generation/index.js +59 -854
  84. package/dist/generation/index.js.map +1 -1
  85. package/dist/grammar/index.cjs +3 -3
  86. package/dist/grammar/index.cjs.map +1 -1
  87. package/dist/grammar/index.js +2 -2
  88. package/dist/{helpers-Coa4e2j_.d.ts → helpers-C-RgeyvH.d.ts} +25 -8
  89. package/dist/{helpers-DHl28yLO.d.cts → helpers-v6GMazzg.d.cts} +25 -8
  90. package/dist/image-editor/index.cjs +986 -986
  91. package/dist/image-editor/index.cjs.map +1 -1
  92. package/dist/image-editor/index.d.cts +15 -11
  93. package/dist/image-editor/index.d.ts +15 -11
  94. package/dist/image-editor/index.js +94 -94
  95. package/dist/index.cjs +28 -28
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.js +36 -36
  98. package/dist/{opentype-BWR7Qv8W.d.cts → opentype-KR_jj6b_.d.cts} +1 -1
  99. package/dist/{opentype-Dfcx6wFx.d.ts → opentype-a1KAW-qs.d.ts} +1 -1
  100. package/dist/paint/index.cjs +5 -8
  101. package/dist/paint/index.cjs.map +1 -1
  102. package/dist/paint/index.d.cts +4 -2
  103. package/dist/paint/index.d.ts +4 -2
  104. package/dist/paint/index.js +15 -18
  105. package/dist/paint-editor/index.cjs +405 -403
  106. package/dist/paint-editor/index.cjs.map +1 -1
  107. package/dist/paint-editor/index.d.cts +15 -748
  108. package/dist/paint-editor/index.d.ts +15 -748
  109. package/dist/paint-editor/index.js +79 -77
  110. package/dist/paint-editor/index.js.map +1 -1
  111. package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-BHS4vQNm.d.cts} +1 -1
  112. package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-BVvTIBMo.d.ts} +1 -1
  113. package/dist/{pool-8JZGWHvR.d.ts → pool-CZQOrSXZ.d.ts} +1 -1
  114. package/dist/{pool-BfuxBKTd.d.cts → pool-FjZZmZ80.d.cts} +1 -1
  115. package/dist/provenance-DmlcgdzT.d.cts +426 -0
  116. package/dist/provenance-uh5r2TQ8.d.ts +426 -0
  117. package/dist/rand-8xbUb6ur.d.ts +1118 -0
  118. package/dist/rand-Cw9VLrVC.d.cts +1118 -0
  119. package/dist/raster/index.cjs +17 -19
  120. package/dist/raster/index.cjs.map +1 -1
  121. package/dist/raster/index.js +9 -11
  122. package/dist/raster/index.js.map +1 -1
  123. package/dist/{svg-CxxqG3_W.d.ts → svg-CSz3mzkw.d.ts} +2 -2
  124. package/dist/{svg-pwXWq6s2.d.cts → svg-DTb40ICU.d.cts} +2 -2
  125. package/dist/{tools-y1M6O3UT.d.ts → tools-B0wXP5cF.d.ts} +1 -1
  126. package/dist/{tools-3EBjR91b.d.cts → tools-Ca0kI1qo.d.cts} +1 -1
  127. package/dist/vector/index.cjs +2698 -1674
  128. package/dist/vector/index.cjs.map +1 -1
  129. package/dist/vector/index.d.cts +390 -72
  130. package/dist/vector/index.d.ts +390 -72
  131. package/dist/vector/index.js +1665 -641
  132. package/dist/vector/index.js.map +1 -1
  133. package/dist/video-editor/index.d.cts +7 -4
  134. package/dist/video-editor/index.d.ts +7 -4
  135. package/dist/{warp-Ceqdz7kj.d.cts → warp-DTOp0lON.d.cts} +1 -1
  136. package/dist/{warp-C1gwu2G_.d.ts → warp-pd7hrH4T.d.ts} +1 -1
  137. package/package.json +1 -1
  138. package/skills/pixerate-vector/SKILL.md +22 -0
  139. package/dist/brushstrokeRender-JNHVEUFG.cjs.map +0 -1
  140. package/dist/chunk-64PYNEHJ.js +0 -340
  141. package/dist/chunk-64PYNEHJ.js.map +0 -1
  142. package/dist/chunk-6GFRKLLS.cjs.map +0 -1
  143. package/dist/chunk-7QN76ESJ.js +0 -323
  144. package/dist/chunk-7QN76ESJ.js.map +0 -1
  145. package/dist/chunk-BR7EKQUP.js.map +0 -1
  146. package/dist/chunk-DCLJNVZS.cjs +0 -323
  147. package/dist/chunk-DCLJNVZS.cjs.map +0 -1
  148. package/dist/chunk-EM3FMJWE.js.map +0 -1
  149. package/dist/chunk-HHTCDFZC.js.map +0 -1
  150. package/dist/chunk-J5BA3BQ6.cjs.map +0 -1
  151. package/dist/chunk-YAFS2QFZ.cjs.map +0 -1
  152. package/dist/chunk-Z2H7KECK.cjs.map +0 -1
  153. package/dist/chunk-Z6OUCS2K.cjs +0 -340
  154. package/dist/chunk-Z6OUCS2K.cjs.map +0 -1
  155. package/dist/rand-BszBST4s.d.ts +0 -2140
  156. package/dist/rand-DOH_aMvm.d.cts +0 -2140
  157. /package/dist/{chunk-62XUO5LB.js.map → chunk-3X6IAJUQ.js.map} +0 -0
  158. /package/dist/{chunk-7RJ6P7MI.js.map → chunk-6S6362D2.js.map} +0 -0
  159. /package/dist/{chunk-SVYE5HIM.js.map → chunk-EQQMGO42.js.map} +0 -0
  160. /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
  161. /package/dist/{chunk-UYQUPUR6.js.map → chunk-HUO3TI4C.js.map} +0 -0
  162. /package/dist/{chunk-2HC4DRF4.js.map → chunk-LLFHCSU2.js.map} +0 -0
  163. /package/dist/{chunk-ILYFOJUN.js.map → chunk-OIBIRXRG.js.map} +0 -0
  164. /package/dist/{chunk-FWEO3HSL.js.map → chunk-PQQF5KOW.js.map} +0 -0
@@ -0,0 +1,150 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+
6
+ var _chunkFD4LPFAEcjs = require('./chunk-FD4LPFAE.cjs');
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 _chunkFD4LPFAEcjs.tokenizePrompt.call(void 0, 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 = _chunkFD4LPFAEcjs.getTemplateBody.call(void 0, 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) : _chunkFD4LPFAEcjs.getLatestVersion.call(void 0, template);
32
+ const isVersioned = !!_optionalChain([template, 'access', _ => _.versions, 'optionalAccess', _2 => _2.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: _nullishCoalesce(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 = _nullishCoalesce(options.templates, () => ( []));
57
+ const maxDepth = _nullishCoalesce(options.maxDepth, () => ( 10));
58
+ const resolved = _chunkFD4LPFAEcjs.resolvePrompt.call(void 0, options.rawPrompt, templates, {
59
+ bindings: options.bindings,
60
+ values: options.values,
61
+ maxDepth
62
+ });
63
+ const pinned = pinTemplates(options.rawPrompt, templates, _nullishCoalesce(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(_nullishCoalesce(_nullishCoalesce(_optionalChain([options, 'access', _3 => _3.plan, 'optionalAccess', _4 => _4.request]), () => ( options.request)), () => ( {})));
68
+ request.model = modelId;
69
+ if (request.prompt === void 0) request.prompt = resolved.text;
70
+ const adjustments = clone(_nullishCoalesce(_nullishCoalesce(options.adjustments, () => ( _optionalChain([options, 'access', _5 => _5.plan, 'optionalAccess', _6 => _6.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: (_nullishCoalesce(request.references, () => ( []))).map(({ id, role }) => ({ id, role })),
87
+ createdAt: toIso(_nullishCoalesce(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 (e) {
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 = _chunkFD4LPFAEcjs.resolvePrompt.call(void 0, 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
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+ exports.PROVENANCE_FORMAT = PROVENANCE_FORMAT; exports.PROVENANCE_VERSION = PROVENANCE_VERSION; exports.ProvenanceParseError = ProvenanceParseError; exports.pinnedTemplatesToTemplates = pinnedTemplatesToTemplates; exports.createProvenance = createProvenance; exports.serializeProvenance = serializeProvenance; exports.parseProvenance = parseProvenance; exports.replayProvenancePrompt = replayProvenancePrompt;
150
+ //# sourceMappingURL=chunk-Q6OUXEK3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-Q6OUXEK3.cjs","../src/generation/provenance.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-Q6OUXEK3.cjs","sourcesContent":[null,"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"]}