frameyard 0.0.0-stage → 0.2.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 (131) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/GLOSSARY.md +145 -0
  3. package/LICENSE +21 -0
  4. package/README.md +311 -2
  5. package/dist/assets/executable.d.ts +16 -0
  6. package/dist/assets/executable.d.ts.map +1 -0
  7. package/dist/assets/executable.js +59 -0
  8. package/dist/assets/executable.js.map +1 -0
  9. package/dist/assets/files.d.ts +4 -0
  10. package/dist/assets/files.d.ts.map +1 -0
  11. package/dist/assets/files.js +30 -0
  12. package/dist/assets/files.js.map +1 -0
  13. package/dist/assets/integrations.d.ts +15 -0
  14. package/dist/assets/integrations.d.ts.map +1 -0
  15. package/dist/assets/integrations.js +15 -0
  16. package/dist/assets/integrations.js.map +1 -0
  17. package/dist/assets/process.d.ts +29 -0
  18. package/dist/assets/process.d.ts.map +1 -0
  19. package/dist/assets/process.js +97 -0
  20. package/dist/assets/process.js.map +1 -0
  21. package/dist/assets/provenance.d.ts +77 -0
  22. package/dist/assets/provenance.d.ts.map +1 -0
  23. package/dist/assets/provenance.js +302 -0
  24. package/dist/assets/provenance.js.map +1 -0
  25. package/dist/assets/transcribe.d.ts +38 -0
  26. package/dist/assets/transcribe.d.ts.map +1 -0
  27. package/dist/assets/transcribe.js +357 -0
  28. package/dist/assets/transcribe.js.map +1 -0
  29. package/dist/assets/tts.d.ts +29 -0
  30. package/dist/assets/tts.d.ts.map +1 -0
  31. package/dist/assets/tts.js +180 -0
  32. package/dist/assets/tts.js.map +1 -0
  33. package/dist/cli.d.ts +3 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +795 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/contracts.d.ts +106 -0
  38. package/dist/contracts.d.ts.map +1 -0
  39. package/dist/contracts.js +297 -0
  40. package/dist/contracts.js.map +1 -0
  41. package/dist/doctor.d.ts +56 -0
  42. package/dist/doctor.d.ts.map +1 -0
  43. package/dist/doctor.js +476 -0
  44. package/dist/doctor.js.map +1 -0
  45. package/dist/errors.d.ts +10 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +18 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/index.d.ts +8 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +5 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/preview/main.d.ts +19 -0
  54. package/dist/preview/main.d.ts.map +1 -0
  55. package/dist/preview/main.js +480 -0
  56. package/dist/preview/main.js.map +1 -0
  57. package/dist/project.d.ts +16 -0
  58. package/dist/project.d.ts.map +1 -0
  59. package/dist/project.js +88 -0
  60. package/dist/project.js.map +1 -0
  61. package/dist/renderer/audio.d.ts +31 -0
  62. package/dist/renderer/audio.d.ts.map +1 -0
  63. package/dist/renderer/audio.js +88 -0
  64. package/dist/renderer/audio.js.map +1 -0
  65. package/dist/renderer/browser.d.ts +22 -0
  66. package/dist/renderer/browser.d.ts.map +1 -0
  67. package/dist/renderer/browser.js +175 -0
  68. package/dist/renderer/browser.js.map +1 -0
  69. package/dist/renderer/ffmpeg.d.ts +58 -0
  70. package/dist/renderer/ffmpeg.d.ts.map +1 -0
  71. package/dist/renderer/ffmpeg.js +268 -0
  72. package/dist/renderer/ffmpeg.js.map +1 -0
  73. package/dist/renderer/index.d.ts +72 -0
  74. package/dist/renderer/index.d.ts.map +1 -0
  75. package/dist/renderer/index.js +281 -0
  76. package/dist/renderer/index.js.map +1 -0
  77. package/dist/renderer/transcripts.d.ts +30 -0
  78. package/dist/renderer/transcripts.d.ts.map +1 -0
  79. package/dist/renderer/transcripts.js +86 -0
  80. package/dist/renderer/transcripts.js.map +1 -0
  81. package/dist/runtime/clock.d.ts +5 -0
  82. package/dist/runtime/clock.d.ts.map +1 -0
  83. package/dist/runtime/clock.js +16 -0
  84. package/dist/runtime/clock.js.map +1 -0
  85. package/dist/runtime/index.d.ts +29 -0
  86. package/dist/runtime/index.d.ts.map +1 -0
  87. package/dist/runtime/index.js +289 -0
  88. package/dist/runtime/index.js.map +1 -0
  89. package/dist/runtime/random.d.ts +8 -0
  90. package/dist/runtime/random.d.ts.map +1 -0
  91. package/dist/runtime/random.js +21 -0
  92. package/dist/runtime/random.js.map +1 -0
  93. package/dist/scaffold.d.ts +3 -0
  94. package/dist/scaffold.d.ts.map +1 -0
  95. package/dist/scaffold.js +176 -0
  96. package/dist/scaffold.js.map +1 -0
  97. package/dist/server/preview-html.d.ts +2 -0
  98. package/dist/server/preview-html.d.ts.map +1 -0
  99. package/dist/server/preview-html.js +229 -0
  100. package/dist/server/preview-html.js.map +1 -0
  101. package/dist/server/server.d.ts +17 -0
  102. package/dist/server/server.d.ts.map +1 -0
  103. package/dist/server/server.js +237 -0
  104. package/dist/server/server.js.map +1 -0
  105. package/dist/transcript.d.ts +44 -0
  106. package/dist/transcript.d.ts.map +1 -0
  107. package/dist/transcript.js +130 -0
  108. package/dist/transcript.js.map +1 -0
  109. package/dist/version.d.ts +2 -0
  110. package/dist/version.d.ts.map +1 -0
  111. package/dist/version.js +2 -0
  112. package/dist/version.js.map +1 -0
  113. package/docs/adr/0001-keep-composition-authoring-web-native.md +3 -0
  114. package/docs/adr/0002-make-frame-and-props-the-only-animation-state.md +3 -0
  115. package/docs/adr/0003-render-browser-frames-offline.md +3 -0
  116. package/docs/adr/0004-produce-local-ai-assets-outside-rendering.md +3 -0
  117. package/docs/v0.1-design.md +238 -0
  118. package/examples/demo/README.md +24 -0
  119. package/examples/demo/assets/chime.wav +0 -0
  120. package/examples/demo/compositions/demo.js +206 -0
  121. package/examples/demo/props/demo.json +5 -0
  122. package/examples/demo/video.config.js +5 -0
  123. package/package.json +73 -3
  124. package/skills/frameyard/README.md +35 -0
  125. package/skills/frameyard/SKILL.md +60 -0
  126. package/skills/frameyard/references/audio-assets.md +86 -0
  127. package/skills/frameyard/references/deterministic-authoring.md +107 -0
  128. package/skills/frameyard/references/failure-recovery.md +57 -0
  129. package/skills/frameyard/references/json-results.md +203 -0
  130. package/skills/frameyard/references/subtitles-karaoke.md +95 -0
  131. package/skills/frameyard/scripts/frameyard.mjs +60 -0
@@ -0,0 +1,30 @@
1
+ import { access, stat } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import path from "node:path";
4
+ import { FrameyardError } from "../errors.js";
5
+ /** Fails early with an actionable error when an input file is missing or unreadable. */
6
+ export async function assertReadableFile(filePath, label) {
7
+ let info;
8
+ try {
9
+ info = await stat(filePath);
10
+ }
11
+ catch {
12
+ throw new FrameyardError("ASSET_NOT_FOUND", `${label} does not exist: ${filePath}`);
13
+ }
14
+ if (!info.isFile()) {
15
+ throw new FrameyardError("ASSET_NOT_FOUND", `${label} is not a file: ${filePath}`);
16
+ }
17
+ try {
18
+ await access(filePath, constants.R_OK);
19
+ }
20
+ catch {
21
+ throw new FrameyardError("ASSET_NOT_FOUND", `${label} is not readable: ${filePath}`);
22
+ }
23
+ return info.size;
24
+ }
25
+ export function requireExtension(filePath, extension, label) {
26
+ if (path.extname(filePath).toLowerCase() !== extension) {
27
+ throw new FrameyardError("USAGE", `${label} must use a ${extension} extension: ${filePath}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/assets/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAa;IACtE,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,GAAG,KAAK,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,GAAG,KAAK,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,GAAG,KAAK,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAiB,EAAE,KAAa;IACjF,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,GAAG,KAAK,eAAe,SAAS,eAAe,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const QWEN_TTS_ENV = "FRAMEYARD_QWEN_TTS";
2
+ export declare const WHISPER_CLI_ENV = "FRAMEYARD_WHISPER_CLI";
3
+ /**
4
+ * The qwentts.cpp and whisper.cpp revisions whose CLI surfaces this wrapper
5
+ * targets. Real-model integration tests are opt-in and must name the exact
6
+ * revision they exercise; doctor reports these values so generated provenance
7
+ * is interpretable.
8
+ */
9
+ export declare const QWEN_TTS_REFERENCE_REVISION = "5916bf7c79dbb4e66fc059cdc507a79a23a28bb4";
10
+ export declare const WHISPER_CPP_REFERENCE_REVISION = "284029c07012d2000941a08d38a31ffb71f4734e";
11
+ export declare const QWEN_TTS_COMMAND = "qwen-tts";
12
+ export declare const WHISPER_CLI_COMMAND = "whisper-cli";
13
+ export declare const QWEN_TTS_INSTALL_HINT = "Build qwentts.cpp and make its qwen-tts executable available on PATH.";
14
+ export declare const WHISPER_CLI_INSTALL_HINT = "Build whisper.cpp and make its whisper-cli executable available on PATH.";
15
+ //# sourceMappingURL=integrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/assets/integrations.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,uBAAuB,CAAC;AACjD,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,6CAA6C,CAAC;AACtF,eAAO,MAAM,8BAA8B,6CAA6C,CAAC;AAEzF,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAC3C,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,eAAO,MAAM,qBAAqB,0EAA0E,CAAC;AAC7G,eAAO,MAAM,wBAAwB,6EAA6E,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const QWEN_TTS_ENV = "FRAMEYARD_QWEN_TTS";
2
+ export const WHISPER_CLI_ENV = "FRAMEYARD_WHISPER_CLI";
3
+ /**
4
+ * The qwentts.cpp and whisper.cpp revisions whose CLI surfaces this wrapper
5
+ * targets. Real-model integration tests are opt-in and must name the exact
6
+ * revision they exercise; doctor reports these values so generated provenance
7
+ * is interpretable.
8
+ */
9
+ export const QWEN_TTS_REFERENCE_REVISION = "5916bf7c79dbb4e66fc059cdc507a79a23a28bb4";
10
+ export const WHISPER_CPP_REFERENCE_REVISION = "284029c07012d2000941a08d38a31ffb71f4734e";
11
+ export const QWEN_TTS_COMMAND = "qwen-tts";
12
+ export const WHISPER_CLI_COMMAND = "whisper-cli";
13
+ export const QWEN_TTS_INSTALL_HINT = "Build qwentts.cpp and make its qwen-tts executable available on PATH.";
14
+ export const WHISPER_CLI_INSTALL_HINT = "Build whisper.cpp and make its whisper-cli executable available on PATH.";
15
+ //# sourceMappingURL=integrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/assets/integrations.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,0CAA0C,CAAC;AACtF,MAAM,CAAC,MAAM,8BAA8B,GAAG,0CAA0C,CAAC;AAEzF,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,uEAAuE,CAAC;AAC7G,MAAM,CAAC,MAAM,wBAAwB,GAAG,0EAA0E,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type FrameyardErrorCode } from "../errors.js";
2
+ export interface RunChildOptions {
3
+ cwd?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ /** Text written to the child's stdin before it is closed. */
6
+ stdin?: string;
7
+ signal?: AbortSignal;
8
+ /** Forward child stdout/stderr to this process's stderr. Defaults to true. */
9
+ forwardOutput?: boolean;
10
+ /** Error code used for spawn/exit failures. */
11
+ errorCode?: FrameyardErrorCode;
12
+ /** Human label used in error messages. */
13
+ label?: string;
14
+ /** Actionable hint included when the executable cannot be found. */
15
+ executableHint?: string;
16
+ /** Resolve even when the child exits nonzero (for probing --help/--version). */
17
+ allowFailure?: boolean;
18
+ }
19
+ export interface RunChildResult {
20
+ stdout: string;
21
+ stderr: string;
22
+ code: number;
23
+ }
24
+ /**
25
+ * Runs one external integration process, captures its output tail, and
26
+ * terminates it when the operation is cancelled.
27
+ */
28
+ export declare function runChild(command: string, args: string[], options?: RunChildOptions): Promise<RunChildResult>;
29
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/assets/process.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIvE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAOD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA6GhH"}
@@ -0,0 +1,97 @@
1
+ import { spawn } from "node:child_process";
2
+ import { FrameyardError } from "../errors.js";
3
+ const TAIL_LIMIT = 64 * 1024;
4
+ function appendTail(current, chunk) {
5
+ const next = current + chunk.toString();
6
+ return next.length > TAIL_LIMIT ? next.slice(-TAIL_LIMIT) : next;
7
+ }
8
+ /**
9
+ * Runs one external integration process, captures its output tail, and
10
+ * terminates it when the operation is cancelled.
11
+ */
12
+ export function runChild(command, args, options = {}) {
13
+ const errorCode = options.errorCode ?? "INTERNAL";
14
+ const label = options.label ?? command;
15
+ if (options.signal?.aborted) {
16
+ return Promise.reject(new FrameyardError("CANCELLED", "Operation cancelled."));
17
+ }
18
+ return new Promise((resolve, reject) => {
19
+ let settled = false;
20
+ let stdout = "";
21
+ let stderr = "";
22
+ const finish = (action) => {
23
+ if (settled) {
24
+ return;
25
+ }
26
+ settled = true;
27
+ options.signal?.removeEventListener("abort", onAbort);
28
+ action();
29
+ };
30
+ let child;
31
+ try {
32
+ child = spawn(command, args, {
33
+ cwd: options.cwd,
34
+ env: options.env,
35
+ stdio: ["pipe", "pipe", "pipe"],
36
+ });
37
+ }
38
+ catch (error) {
39
+ reject(new FrameyardError(errorCode, `Could not start ${label}: ${error.message}`, {
40
+ cause: error,
41
+ }));
42
+ return;
43
+ }
44
+ function onAbort() {
45
+ child.kill("SIGKILL");
46
+ finish(() => reject(new FrameyardError("CANCELLED", "Operation cancelled.")));
47
+ }
48
+ options.signal?.addEventListener("abort", onAbort, { once: true });
49
+ if (options.signal?.aborted) {
50
+ onAbort();
51
+ return;
52
+ }
53
+ child.stdout?.on("data", (chunk) => {
54
+ stdout = appendTail(stdout, chunk);
55
+ if (options.forwardOutput !== false) {
56
+ process.stderr.write(chunk);
57
+ }
58
+ });
59
+ child.stderr?.on("data", (chunk) => {
60
+ stderr = appendTail(stderr, chunk);
61
+ if (options.forwardOutput !== false) {
62
+ process.stderr.write(chunk);
63
+ }
64
+ });
65
+ // A failed child may close stdin while input is still being written.
66
+ child.stdin?.on("error", () => undefined);
67
+ child.once("error", (error) => {
68
+ if (error.code === "ENOENT") {
69
+ const hint = options.executableHint ? ` ${options.executableHint}` : "";
70
+ finish(() => reject(new FrameyardError("EXECUTABLE_NOT_FOUND", `Executable not found: ${command}.${hint}`, { cause: error })));
71
+ return;
72
+ }
73
+ finish(() => reject(new FrameyardError(errorCode, `Could not start ${label}: ${error.message}`, {
74
+ cause: error,
75
+ })));
76
+ });
77
+ child.once("close", (code, closeSignal) => {
78
+ const exitCode = code ?? -1;
79
+ if (options.signal?.aborted) {
80
+ finish(() => reject(new FrameyardError("CANCELLED", "Operation cancelled.")));
81
+ return;
82
+ }
83
+ if (exitCode !== 0) {
84
+ const detail = stderr.trim();
85
+ if (options.allowFailure === true) {
86
+ finish(() => resolve({ stdout, stderr, code: exitCode }));
87
+ return;
88
+ }
89
+ finish(() => reject(new FrameyardError(errorCode, `${label} exited with ${code === null ? `signal ${closeSignal ?? "unknown"}` : `code ${code}`}${detail ? `:\n${detail}` : "."}`)));
90
+ return;
91
+ }
92
+ finish(() => resolve({ stdout, stderr, code: exitCode }));
93
+ });
94
+ child.stdin?.end(options.stdin ?? "");
95
+ });
96
+ }
97
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/assets/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type JsonValue } from "../contracts.js";
2
+ export declare const MANIFEST_SCHEMA_VERSION = 1;
3
+ export declare const MANIFEST_FILENAME = "frameyard.assets.json";
4
+ export interface ManifestGenerator {
5
+ name: "frameyard";
6
+ version: string;
7
+ command: "tts" | "transcribe";
8
+ executable: string;
9
+ integration: "qwentts.cpp" | "whisper.cpp";
10
+ referenceRevision: string;
11
+ }
12
+ export interface ManifestModel {
13
+ role: string;
14
+ path: string;
15
+ sha256: string;
16
+ bytes: number;
17
+ }
18
+ export interface ManifestSource {
19
+ path: string;
20
+ sha256: string;
21
+ bytes: number;
22
+ }
23
+ export interface ManifestDerived {
24
+ path: string;
25
+ format: "srt" | "vtt";
26
+ sha256: string;
27
+ bytes: number;
28
+ }
29
+ export interface ManifestArtifact {
30
+ path: string;
31
+ kind: "audio" | "transcript";
32
+ operation: "tts" | "transcribe";
33
+ sha256: string;
34
+ bytes: number;
35
+ createdAt: string;
36
+ generator: ManifestGenerator;
37
+ models: ManifestModel[];
38
+ parameters: Record<string, JsonValue>;
39
+ source?: ManifestSource;
40
+ derived?: ManifestDerived[];
41
+ }
42
+ export interface Manifest {
43
+ schemaVersion: typeof MANIFEST_SCHEMA_VERSION;
44
+ artifacts: ManifestArtifact[];
45
+ }
46
+ export interface StagedFile {
47
+ tempPath: string;
48
+ path: string;
49
+ label: string;
50
+ /** Allow replacing an existing file even when the operation is not forced (used for the manifest). */
51
+ overwrite?: boolean;
52
+ }
53
+ export declare function defaultManifestPath(projectRoot: string): string;
54
+ export declare function resolveManifestPath(projectRoot: string, requested?: string): string;
55
+ export declare function projectRelativePath(projectRoot: string, absolutePath: string): string;
56
+ export declare function temporaryPath(destination: string, label?: string): string;
57
+ export declare function hashFile(filePath: string, options?: {
58
+ signal?: AbortSignal;
59
+ label?: string;
60
+ }): Promise<{
61
+ sha256: string;
62
+ bytes: number;
63
+ }>;
64
+ export declare function hashText(text: string): string;
65
+ export declare function readManifest(manifestPath: string): Promise<Manifest>;
66
+ export declare function upsertArtifact(manifest: Manifest, artifact: ManifestArtifact): Manifest;
67
+ export declare function stageManifest(manifest: Manifest, manifestPath: string): Promise<string>;
68
+ /** Fails before doing inference work when an output cannot be replaced. */
69
+ export declare function assertOutputAvailable(paths: readonly string[], force: boolean): Promise<void>;
70
+ /**
71
+ * Publishes staged files atomically. Existing destinations are backed up and
72
+ * restored if any part of the transaction fails.
73
+ */
74
+ export declare function publishStagedFiles(files: StagedFile[], options: {
75
+ force: boolean;
76
+ }): Promise<void>;
77
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/assets/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { link, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { isPlainObject } from "../contracts.js";
6
+ import { FrameyardError } from "../errors.js";
7
+ export const MANIFEST_SCHEMA_VERSION = 1;
8
+ export const MANIFEST_FILENAME = "frameyard.assets.json";
9
+ const SHA256 = /^[a-f0-9]{64}$/i;
10
+ function manifestError(message) {
11
+ throw new FrameyardError("MANIFEST_INVALID", message);
12
+ }
13
+ function requireString(value, label) {
14
+ if (typeof value !== "string" || value.length === 0) {
15
+ manifestError(`${label} must be a non-empty string.`);
16
+ }
17
+ return value;
18
+ }
19
+ function requireInteger(value, label) {
20
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
21
+ manifestError(`${label} must be a non-negative integer.`);
22
+ }
23
+ return value;
24
+ }
25
+ function parseIdentity(value, label) {
26
+ if (!isPlainObject(value)) {
27
+ manifestError(`${label} must be a plain object.`);
28
+ }
29
+ const sha256 = requireString(value.sha256, `${label}.sha256`);
30
+ if (!SHA256.test(sha256)) {
31
+ manifestError(`${label}.sha256 must be a 64-character SHA-256 hex digest.`);
32
+ }
33
+ return {
34
+ path: requireString(value.path, `${label}.path`),
35
+ sha256,
36
+ bytes: requireInteger(value.bytes, `${label}.bytes`),
37
+ };
38
+ }
39
+ function parseManifest(value) {
40
+ if (!isPlainObject(value)) {
41
+ manifestError("The provenance manifest must be a plain JSON object.");
42
+ }
43
+ if (value.schemaVersion !== MANIFEST_SCHEMA_VERSION) {
44
+ manifestError(`Unsupported provenance manifest schemaVersion ${String(value.schemaVersion)}; expected ${MANIFEST_SCHEMA_VERSION}.`);
45
+ }
46
+ if (!Array.isArray(value.artifacts)) {
47
+ manifestError("Provenance manifest artifacts must be an array.");
48
+ }
49
+ const artifacts = [];
50
+ for (const [index, item] of value.artifacts.entries()) {
51
+ const label = `Provenance manifest artifacts[${index}]`;
52
+ if (!isPlainObject(item)) {
53
+ manifestError(`${label} must be a plain object.`);
54
+ }
55
+ if (item.kind !== "audio" && item.kind !== "transcript") {
56
+ manifestError(`${label}.kind must be "audio" or "transcript".`);
57
+ }
58
+ if (item.operation !== "tts" && item.operation !== "transcribe") {
59
+ manifestError(`${label}.operation must be "tts" or "transcribe".`);
60
+ }
61
+ if (!isPlainObject(item.generator)) {
62
+ manifestError(`${label}.generator must be a plain object.`);
63
+ }
64
+ const generator = {
65
+ name: "frameyard",
66
+ version: requireString(item.generator.version, `${label}.generator.version`),
67
+ command: item.generator.command === "tts" || item.generator.command === "transcribe"
68
+ ? item.generator.command
69
+ : manifestError(`${label}.generator.command must be "tts" or "transcribe".`),
70
+ executable: requireString(item.generator.executable, `${label}.generator.executable`),
71
+ integration: item.generator.integration === "qwentts.cpp" || item.generator.integration === "whisper.cpp"
72
+ ? item.generator.integration
73
+ : manifestError(`${label}.generator.integration must be "qwentts.cpp" or "whisper.cpp".`),
74
+ referenceRevision: requireString(item.generator.referenceRevision, `${label}.generator.referenceRevision`),
75
+ };
76
+ if (!Array.isArray(item.models)) {
77
+ manifestError(`${label}.models must be an array.`);
78
+ }
79
+ const models = item.models.map((model, modelIndex) => {
80
+ if (!isPlainObject(model)) {
81
+ manifestError(`${label}.models[${modelIndex}] must be a plain object.`);
82
+ }
83
+ const identity = parseIdentity(model, `${label}.models[${modelIndex}]`);
84
+ return {
85
+ role: requireString(model.role, `${label}.models[${modelIndex}].role`),
86
+ ...identity,
87
+ };
88
+ });
89
+ if (!isPlainObject(item.parameters)) {
90
+ manifestError(`${label}.parameters must be a plain object.`);
91
+ }
92
+ const artifactIdentity = parseIdentity(item, label);
93
+ const artifact = {
94
+ path: artifactIdentity.path,
95
+ kind: item.kind,
96
+ operation: item.operation,
97
+ sha256: artifactIdentity.sha256,
98
+ bytes: artifactIdentity.bytes,
99
+ createdAt: requireString(item.createdAt, `${label}.createdAt`),
100
+ generator,
101
+ models,
102
+ parameters: item.parameters,
103
+ };
104
+ if (item.source !== undefined) {
105
+ artifact.source = parseIdentity(item.source, `${label}.source`);
106
+ }
107
+ if (item.derived !== undefined) {
108
+ if (!Array.isArray(item.derived)) {
109
+ manifestError(`${label}.derived must be an array.`);
110
+ }
111
+ artifact.derived = item.derived.map((entry, entryIndex) => {
112
+ if (!isPlainObject(entry)) {
113
+ manifestError(`${label}.derived[${entryIndex}] must be a plain object.`);
114
+ }
115
+ if (entry.format !== "srt" && entry.format !== "vtt") {
116
+ manifestError(`${label}.derived[${entryIndex}].format must be "srt" or "vtt".`);
117
+ }
118
+ return {
119
+ format: entry.format,
120
+ ...parseIdentity(entry, `${label}.derived[${entryIndex}]`),
121
+ };
122
+ });
123
+ }
124
+ artifacts.push(artifact);
125
+ }
126
+ return { schemaVersion: MANIFEST_SCHEMA_VERSION, artifacts };
127
+ }
128
+ export function defaultManifestPath(projectRoot) {
129
+ return path.join(projectRoot, MANIFEST_FILENAME);
130
+ }
131
+ export function resolveManifestPath(projectRoot, requested) {
132
+ return requested === undefined ? defaultManifestPath(projectRoot) : path.resolve(process.cwd(), requested);
133
+ }
134
+ export function projectRelativePath(projectRoot, absolutePath) {
135
+ const relative = path.relative(projectRoot, absolutePath);
136
+ if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative)) {
137
+ return absolutePath;
138
+ }
139
+ return relative.split(path.sep).join("/");
140
+ }
141
+ export function temporaryPath(destination, label = "tmp") {
142
+ const extension = path.extname(destination);
143
+ const base = path.basename(destination, extension);
144
+ return path.join(path.dirname(destination), `.${base}.frameyard-${label}-${process.pid}-${randomUUID()}${extension}`);
145
+ }
146
+ export async function hashFile(filePath, options = {}) {
147
+ const label = options.label ?? "file";
148
+ let bytes = 0;
149
+ const hash = createHash("sha256");
150
+ try {
151
+ const stream = createReadStream(filePath);
152
+ for await (const chunk of stream) {
153
+ if (options.signal?.aborted) {
154
+ throw new FrameyardError("CANCELLED", "Operation cancelled.");
155
+ }
156
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
157
+ bytes += buffer.length;
158
+ hash.update(buffer);
159
+ }
160
+ }
161
+ catch (error) {
162
+ if (error instanceof FrameyardError) {
163
+ throw error;
164
+ }
165
+ if (error.code === "ENOENT") {
166
+ throw new FrameyardError("ASSET_NOT_FOUND", `Could not read ${label}: ${filePath}`, { cause: error });
167
+ }
168
+ throw new FrameyardError("OUTPUT_FAILED", `Could not hash ${label} ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
169
+ }
170
+ return { sha256: hash.digest("hex"), bytes };
171
+ }
172
+ export function hashText(text) {
173
+ return createHash("sha256").update(text, "utf8").digest("hex");
174
+ }
175
+ export async function readManifest(manifestPath) {
176
+ let text;
177
+ try {
178
+ text = await readFile(manifestPath, "utf8");
179
+ }
180
+ catch (error) {
181
+ if (error.code === "ENOENT") {
182
+ return { schemaVersion: MANIFEST_SCHEMA_VERSION, artifacts: [] };
183
+ }
184
+ throw new FrameyardError("MANIFEST_INVALID", `Could not read provenance manifest ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
185
+ }
186
+ let parsed;
187
+ try {
188
+ parsed = JSON.parse(text);
189
+ }
190
+ catch (error) {
191
+ throw new FrameyardError("MANIFEST_INVALID", `Provenance manifest ${manifestPath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
192
+ }
193
+ try {
194
+ return parseManifest(parsed);
195
+ }
196
+ catch (error) {
197
+ if (error instanceof FrameyardError) {
198
+ throw new FrameyardError(error.code, `${manifestPath}: ${error.message}`, { cause: error });
199
+ }
200
+ throw error;
201
+ }
202
+ }
203
+ export function upsertArtifact(manifest, artifact) {
204
+ const artifacts = manifest.artifacts.filter((entry) => entry.path !== artifact.path);
205
+ artifacts.push(artifact);
206
+ artifacts.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
207
+ return { schemaVersion: MANIFEST_SCHEMA_VERSION, artifacts };
208
+ }
209
+ export async function stageManifest(manifest, manifestPath) {
210
+ await mkdir(path.dirname(manifestPath), { recursive: true });
211
+ const tempPath = temporaryPath(manifestPath, "manifest");
212
+ await writeFile(tempPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
213
+ return tempPath;
214
+ }
215
+ /** Fails before doing inference work when an output cannot be replaced. */
216
+ export async function assertOutputAvailable(paths, force) {
217
+ for (const outputPath of paths) {
218
+ const kind = await fileKind(outputPath);
219
+ if (kind === "file" && !force) {
220
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${outputPath}. Pass --force to replace it.`);
221
+ }
222
+ }
223
+ }
224
+ async function fileKind(filePath) {
225
+ try {
226
+ const info = await stat(filePath);
227
+ if (!info.isFile()) {
228
+ throw new FrameyardError("OUTPUT_FAILED", `Output path is not a regular file: ${filePath}`);
229
+ }
230
+ return "file";
231
+ }
232
+ catch (error) {
233
+ if (error instanceof FrameyardError) {
234
+ throw error;
235
+ }
236
+ if (error.code === "ENOENT") {
237
+ return "missing";
238
+ }
239
+ throw new FrameyardError("OUTPUT_FAILED", `Could not inspect output path ${filePath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
240
+ }
241
+ }
242
+ /**
243
+ * Publishes staged files atomically. Existing destinations are backed up and
244
+ * restored if any part of the transaction fails.
245
+ */
246
+ export async function publishStagedFiles(files, options) {
247
+ const backups = new Map();
248
+ const published = [];
249
+ const originallyMissing = new Set();
250
+ try {
251
+ for (const file of files) {
252
+ await mkdir(path.dirname(file.path), { recursive: true });
253
+ const kind = await fileKind(file.path);
254
+ if (kind === "missing") {
255
+ originallyMissing.add(file.path);
256
+ continue;
257
+ }
258
+ if (!options.force && file.overwrite !== true) {
259
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${file.path} (${file.label}). Pass --force to replace it.`);
260
+ }
261
+ const backup = temporaryPath(file.path, "backup");
262
+ await rename(file.path, backup);
263
+ backups.set(file.path, backup);
264
+ }
265
+ for (const file of files) {
266
+ if (originallyMissing.has(file.path)) {
267
+ try {
268
+ await link(file.tempPath, file.path);
269
+ }
270
+ catch (error) {
271
+ if (error.code === "EEXIST") {
272
+ throw new FrameyardError("OUTPUT_EXISTS", `Output already exists: ${file.path} (${file.label}). Pass --force to replace it.`, { cause: error });
273
+ }
274
+ throw error;
275
+ }
276
+ await rm(file.tempPath, { force: true });
277
+ }
278
+ else {
279
+ await rename(file.tempPath, file.path);
280
+ }
281
+ published.push(file.path);
282
+ }
283
+ }
284
+ catch (error) {
285
+ for (const publishedPath of published.reverse()) {
286
+ await rm(publishedPath, { force: true }).catch(() => undefined);
287
+ }
288
+ for (const [destination, backup] of backups) {
289
+ await rename(backup, destination).catch(() => undefined);
290
+ }
291
+ if (error instanceof FrameyardError) {
292
+ throw error;
293
+ }
294
+ throw new FrameyardError("OUTPUT_FAILED", `Could not publish generated assets: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
295
+ }
296
+ finally {
297
+ for (const backup of backups.values()) {
298
+ await rm(backup, { force: true }).catch(() => undefined);
299
+ }
300
+ }
301
+ }
302
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/assets/provenance.ts"],"names":[],"mappings":"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"}