omk-protocol 0.98.3 → 0.98.5

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 (41) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +44 -0
  3. package/dist/claims/claim-blocking-cut.d.ts +8 -15
  4. package/dist/claims/claim-blocking-cut.d.ts.map +1 -1
  5. package/dist/claims/claim-blocking-cut.js +161 -41
  6. package/dist/claims/claim-blocking-cut.js.map +1 -1
  7. package/dist/claims/claim-closure.d.ts.map +1 -1
  8. package/dist/claims/claim-closure.js +27 -6
  9. package/dist/claims/claim-closure.js.map +1 -1
  10. package/dist/claims/claim-types.d.ts +20 -2
  11. package/dist/claims/claim-types.d.ts.map +1 -1
  12. package/dist/claims/claim-types.js.map +1 -1
  13. package/dist/index.d.ts +7 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +6 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/run-contract.d.ts +58 -0
  18. package/dist/run-contract.d.ts.map +1 -0
  19. package/dist/run-contract.js +112 -0
  20. package/dist/run-contract.js.map +1 -0
  21. package/dist/run-dag.d.ts +18 -0
  22. package/dist/run-dag.d.ts.map +1 -0
  23. package/dist/run-dag.js +76 -0
  24. package/dist/run-dag.js.map +1 -0
  25. package/dist/run-parsing.d.ts +13 -0
  26. package/dist/run-parsing.d.ts.map +1 -0
  27. package/dist/run-parsing.js +81 -0
  28. package/dist/run-parsing.js.map +1 -0
  29. package/dist/run-resume.d.ts +15 -0
  30. package/dist/run-resume.d.ts.map +1 -0
  31. package/dist/run-resume.js +28 -0
  32. package/dist/run-resume.js.map +1 -0
  33. package/dist/run-task-retry.d.ts +8 -0
  34. package/dist/run-task-retry.d.ts.map +1 -0
  35. package/dist/run-task-retry.js +25 -0
  36. package/dist/run-task-retry.js.map +1 -0
  37. package/dist/run-writer-restart.d.ts +14 -0
  38. package/dist/run-writer-restart.d.ts.map +1 -0
  39. package/dist/run-writer-restart.js +27 -0
  40. package/dist/run-writer-restart.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ import { RunContractError, runArgv, runArray, runId, runObject, runRelativePath } from "./run-parsing.js";
2
+ export const MAX_RUN_DAG_TASKS = 16;
3
+ export const MAX_RUN_TASK_ATTEMPTS = 2;
4
+ /** Deterministic FIFO Kahn ordering. This orders artifacts, not tool resource-conflict claims. */
5
+ export function orderRunDag(tasks) {
6
+ const pending = new Map(tasks.map((task) => [task.id, task.dependsOn.length]));
7
+ const ready = tasks.filter((task) => task.dependsOn.length === 0);
8
+ const ordered = [];
9
+ for (let index = 0; index < ready.length; index++) {
10
+ const next = ready[index];
11
+ ordered.push(next);
12
+ for (const task of tasks) {
13
+ if (!task.dependsOn.includes(next.id))
14
+ continue;
15
+ const count = pending.get(task.id);
16
+ if (count === undefined)
17
+ throw new RunContractError("dependency");
18
+ pending.set(task.id, count - 1);
19
+ if (count === 1)
20
+ ready.push(task);
21
+ }
22
+ }
23
+ if (ordered.length !== tasks.length)
24
+ throw new RunContractError("cyclic dependency");
25
+ return Object.freeze(ordered);
26
+ }
27
+ /** Every ancestor material is an input; unrelated successful branches are deliberately excluded. */
28
+ export function runDagAncestors(tasks, taskId) {
29
+ if (!tasks.some((task) => task.id === taskId))
30
+ throw new RunContractError("taskId");
31
+ const order = orderRunDag(tasks);
32
+ const included = new Set([taskId]);
33
+ for (const task of [...order].reverse()) {
34
+ if (included.has(task.id))
35
+ for (const id of task.dependsOn)
36
+ included.add(id);
37
+ }
38
+ return Object.freeze(order.filter((task) => task.id !== taskId && included.has(task.id)));
39
+ }
40
+ export function parseRunDagWriter(value, writable) {
41
+ const raw = runObject(value, ["kind", "tasks"]);
42
+ if (raw.kind !== "command-dag")
43
+ throw new RunContractError("writer.kind");
44
+ const tasks = runArray(raw.tasks, (value) => {
45
+ const task = runObject(value, ["id", "dependsOn", "writablePaths", "attempts"]);
46
+ const dependsOn = Array.isArray(task.dependsOn) && task.dependsOn.length === 0
47
+ ? Object.freeze([])
48
+ : runArray(task.dependsOn, runId, MAX_RUN_DAG_TASKS);
49
+ if (new Set(dependsOn).size !== dependsOn.length)
50
+ throw new RunContractError("duplicate dependency");
51
+ return Object.freeze({
52
+ id: runId(task.id),
53
+ dependsOn,
54
+ writablePaths: runArray(task.writablePaths, runRelativePath, 128),
55
+ attempts: runArray(task.attempts, runArgv, MAX_RUN_TASK_ATTEMPTS),
56
+ });
57
+ }, MAX_RUN_DAG_TASKS);
58
+ const ids = new Set(tasks.map((task) => task.id));
59
+ if (ids.size !== tasks.length)
60
+ throw new RunContractError("duplicate task");
61
+ const scopes = [];
62
+ for (const task of tasks) {
63
+ if (task.dependsOn.some((id) => id === task.id || !ids.has(id)))
64
+ throw new RunContractError("dependency");
65
+ for (const path of task.writablePaths) {
66
+ if (!writable.some((scope) => path === scope || path.startsWith(`${scope}/`)))
67
+ throw new RunContractError("task scope");
68
+ if (scopes.some((scope) => path === scope || path.startsWith(`${scope}/`) || scope.startsWith(`${path}/`)))
69
+ throw new RunContractError("overlapping task scope");
70
+ scopes.push(path);
71
+ }
72
+ }
73
+ orderRunDag(tasks);
74
+ return Object.freeze({ kind: "command-dag", tasks });
75
+ }
76
+ //# sourceMappingURL=run-dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-dag.js","sourceRoot":"","sources":["../src/run-dag.ts"],"names":[],"mappings":"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","sourcesContent":["import { RunContractError, runArgv, runArray, runId, runObject, runRelativePath } from \"./run-parsing.ts\";\n\nexport const MAX_RUN_DAG_TASKS = 16;\nexport const MAX_RUN_TASK_ATTEMPTS = 2;\n\nexport interface RunDagTask {\n\treadonly id: string;\n\treadonly dependsOn: readonly string[];\n\treadonly writablePaths: readonly string[];\n\treadonly attempts: readonly (readonly string[])[];\n}\nexport interface RunDagWriter {\n\treadonly kind: \"command-dag\";\n\treadonly tasks: readonly RunDagTask[];\n}\n\n/** Deterministic FIFO Kahn ordering. This orders artifacts, not tool resource-conflict claims. */\nexport function orderRunDag(tasks: readonly RunDagTask[]): readonly RunDagTask[] {\n\tconst pending = new Map(tasks.map((task) => [task.id, task.dependsOn.length]));\n\tconst ready = tasks.filter((task) => task.dependsOn.length === 0);\n\tconst ordered: RunDagTask[] = [];\n\tfor (let index = 0; index < ready.length; index++) {\n\t\tconst next = ready[index];\n\t\tordered.push(next);\n\t\tfor (const task of tasks) {\n\t\t\tif (!task.dependsOn.includes(next.id)) continue;\n\t\t\tconst count = pending.get(task.id);\n\t\t\tif (count === undefined) throw new RunContractError(\"dependency\");\n\t\t\tpending.set(task.id, count - 1);\n\t\t\tif (count === 1) ready.push(task);\n\t\t}\n\t}\n\tif (ordered.length !== tasks.length) throw new RunContractError(\"cyclic dependency\");\n\treturn Object.freeze(ordered);\n}\n\n/** Every ancestor material is an input; unrelated successful branches are deliberately excluded. */\nexport function runDagAncestors(tasks: readonly RunDagTask[], taskId: string): readonly RunDagTask[] {\n\tif (!tasks.some((task) => task.id === taskId)) throw new RunContractError(\"taskId\");\n\tconst order = orderRunDag(tasks);\n\tconst included = new Set([taskId]);\n\tfor (const task of [...order].reverse()) {\n\t\tif (included.has(task.id)) for (const id of task.dependsOn) included.add(id);\n\t}\n\treturn Object.freeze(order.filter((task) => task.id !== taskId && included.has(task.id)));\n}\n\nexport function parseRunDagWriter(value: unknown, writable: readonly string[]): RunDagWriter {\n\tconst raw = runObject(value, [\"kind\", \"tasks\"]);\n\tif (raw.kind !== \"command-dag\") throw new RunContractError(\"writer.kind\");\n\tconst tasks = runArray(\n\t\traw.tasks,\n\t\t(value): RunDagTask => {\n\t\t\tconst task = runObject(value, [\"id\", \"dependsOn\", \"writablePaths\", \"attempts\"]);\n\t\t\tconst dependsOn =\n\t\t\t\tArray.isArray(task.dependsOn) && task.dependsOn.length === 0\n\t\t\t\t\t? Object.freeze([])\n\t\t\t\t\t: runArray(task.dependsOn, runId, MAX_RUN_DAG_TASKS);\n\t\t\tif (new Set(dependsOn).size !== dependsOn.length) throw new RunContractError(\"duplicate dependency\");\n\t\t\treturn Object.freeze({\n\t\t\t\tid: runId(task.id),\n\t\t\t\tdependsOn,\n\t\t\t\twritablePaths: runArray(task.writablePaths, runRelativePath, 128),\n\t\t\t\tattempts: runArray(task.attempts, runArgv, MAX_RUN_TASK_ATTEMPTS),\n\t\t\t});\n\t\t},\n\t\tMAX_RUN_DAG_TASKS,\n\t);\n\tconst ids = new Set(tasks.map((task) => task.id));\n\tif (ids.size !== tasks.length) throw new RunContractError(\"duplicate task\");\n\tconst scopes: string[] = [];\n\tfor (const task of tasks) {\n\t\tif (task.dependsOn.some((id) => id === task.id || !ids.has(id))) throw new RunContractError(\"dependency\");\n\t\tfor (const path of task.writablePaths) {\n\t\t\tif (!writable.some((scope) => path === scope || path.startsWith(`${scope}/`)))\n\t\t\t\tthrow new RunContractError(\"task scope\");\n\t\t\tif (scopes.some((scope) => path === scope || path.startsWith(`${scope}/`) || scope.startsWith(`${path}/`)))\n\t\t\t\tthrow new RunContractError(\"overlapping task scope\");\n\t\t\tscopes.push(path);\n\t\t}\n\t}\n\torderRunDag(tasks);\n\treturn Object.freeze({ kind: \"command-dag\", tasks });\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare class RunContractError extends Error {
2
+ constructor(field: string);
3
+ }
4
+ export declare function runObject(value: unknown, keys: readonly string[]): Record<string, unknown>;
5
+ export declare function runText(value: unknown, field: string, max?: number): string;
6
+ export declare function runId(value: unknown): string;
7
+ export declare function runDigest(value: unknown): string;
8
+ export declare function runLimit(value: unknown, field: string, max?: number): number;
9
+ export declare function runArray<T>(value: unknown, parse: (item: unknown) => T, max: number): readonly T[];
10
+ export declare function runRelativePath(value: unknown): string;
11
+ export declare function runAbsolutePath(value: unknown): string;
12
+ export declare function runArgv(value: unknown): readonly string[];
13
+ //# sourceMappingURL=run-parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-parsing.d.ts","sourceRoot":"","sources":["../src/run-parsing.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,YAAY,KAAK,EAAE,MAAM,EAGxB;CACD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa1F;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAO,GAAG,MAAM,CAIzE;AACD,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI5C;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGhD;AACD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAIhF;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,CASlG;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAatD;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAQzD","sourcesContent":["export class RunContractError extends Error {\n\tconstructor(field: string) {\n\t\tsuper(`Invalid verified-run field: ${field}`);\n\t\tthis.name = \"RunContractError\";\n\t}\n}\n\nexport function runObject(value: unknown, keys: readonly string[]): Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) throw new RunContractError(\"object\");\n\tif (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n\t\tthrow new RunContractError(\"prototype\");\n\tconst descriptors = Object.getOwnPropertyDescriptors(value);\n\tif (Reflect.ownKeys(value).length !== keys.length) throw new RunContractError(\"fields\");\n\tconst result: Record<string, unknown> = {};\n\tfor (const key of keys) {\n\t\tconst descriptor = descriptors[key];\n\t\tif (!descriptor || !(\"value\" in descriptor) || !descriptor.enumerable) throw new RunContractError(key);\n\t\tresult[key] = descriptor.value;\n\t}\n\treturn result;\n}\nexport function runText(value: unknown, field: string, max = 4096): string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > max || /[\\u0000\\ud800-\\udfff]/u.test(value))\n\t\tthrow new RunContractError(field);\n\treturn value;\n}\nexport function runId(value: unknown): string {\n\tconst id = runText(value, \"id\", 128);\n\tif (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(id)) throw new RunContractError(\"id\");\n\treturn id;\n}\nexport function runDigest(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) throw new RunContractError(\"digest\");\n\treturn value;\n}\nexport function runLimit(value: unknown, field: string, max = 2147483647): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0 || value > max)\n\t\tthrow new RunContractError(field);\n\treturn value;\n}\nexport function runArray<T>(value: unknown, parse: (item: unknown) => T, max: number): readonly T[] {\n\tif (!Array.isArray(value) || value.length === 0 || value.length > max) throw new RunContractError(\"array\");\n\tconst items: T[] = [];\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\tif (!descriptor || !(\"value\" in descriptor)) throw new RunContractError(\"array item\");\n\t\titems.push(parse(descriptor.value));\n\t}\n\treturn Object.freeze(items);\n}\nexport function runRelativePath(value: unknown): string {\n\tconst path = runText(value, \"path\", 1024);\n\tif (\n\t\t/[\\\\\\u0000-\\u001f\\u007f]/.test(path) ||\n\t\tpath.split(\"/\").some((part) => [\"\", \".\", \"..\", \".git\", \".omk\"].includes(part))\n\t)\n\t\tthrow new RunContractError(\"path\");\n\treturn path;\n}\nexport function runAbsolutePath(value: unknown): string {\n\tconst path = runText(value, \"absolute path\", 4096);\n\tif (\n\t\t!path.startsWith(\"/\") ||\n\t\tpath === \"/\" ||\n\t\tpath\n\t\t\t.slice(1)\n\t\t\t.split(\"/\")\n\t\t\t.some((part) => [\"\", \".\", \"..\"].includes(part)) ||\n\t\t/[\\\\\\u0000-\\u001f\\u007f]/.test(path)\n\t)\n\t\tthrow new RunContractError(\"absolute path\");\n\treturn path;\n}\nexport function runArgv(value: unknown): readonly string[] {\n\tconst args = runArray(\n\t\tvalue,\n\t\t(item) => (typeof item === \"string\" && item.length === 0 ? \"\" : runText(item, \"argv\", 16384)),\n\t\t128,\n\t);\n\trunAbsolutePath(args[0]);\n\treturn args;\n}\n"]}
@@ -0,0 +1,81 @@
1
+ export class RunContractError extends Error {
2
+ constructor(field) {
3
+ super(`Invalid verified-run field: ${field}`);
4
+ this.name = "RunContractError";
5
+ }
6
+ }
7
+ export function runObject(value, keys) {
8
+ if (typeof value !== "object" || value === null || Array.isArray(value))
9
+ throw new RunContractError("object");
10
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
11
+ throw new RunContractError("prototype");
12
+ const descriptors = Object.getOwnPropertyDescriptors(value);
13
+ if (Reflect.ownKeys(value).length !== keys.length)
14
+ throw new RunContractError("fields");
15
+ const result = {};
16
+ for (const key of keys) {
17
+ const descriptor = descriptors[key];
18
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable)
19
+ throw new RunContractError(key);
20
+ result[key] = descriptor.value;
21
+ }
22
+ return result;
23
+ }
24
+ export function runText(value, field, max = 4096) {
25
+ if (typeof value !== "string" || value.length === 0 || value.length > max || /[\u0000\ud800-\udfff]/u.test(value))
26
+ throw new RunContractError(field);
27
+ return value;
28
+ }
29
+ export function runId(value) {
30
+ const id = runText(value, "id", 128);
31
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(id))
32
+ throw new RunContractError("id");
33
+ return id;
34
+ }
35
+ export function runDigest(value) {
36
+ if (typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value))
37
+ throw new RunContractError("digest");
38
+ return value;
39
+ }
40
+ export function runLimit(value, field, max = 2147483647) {
41
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0 || value > max)
42
+ throw new RunContractError(field);
43
+ return value;
44
+ }
45
+ export function runArray(value, parse, max) {
46
+ if (!Array.isArray(value) || value.length === 0 || value.length > max)
47
+ throw new RunContractError("array");
48
+ const items = [];
49
+ for (let index = 0; index < value.length; index++) {
50
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
51
+ if (!descriptor || !("value" in descriptor))
52
+ throw new RunContractError("array item");
53
+ items.push(parse(descriptor.value));
54
+ }
55
+ return Object.freeze(items);
56
+ }
57
+ export function runRelativePath(value) {
58
+ const path = runText(value, "path", 1024);
59
+ if (/[\\\u0000-\u001f\u007f]/.test(path) ||
60
+ path.split("/").some((part) => ["", ".", "..", ".git", ".omk"].includes(part)))
61
+ throw new RunContractError("path");
62
+ return path;
63
+ }
64
+ export function runAbsolutePath(value) {
65
+ const path = runText(value, "absolute path", 4096);
66
+ if (!path.startsWith("/") ||
67
+ path === "/" ||
68
+ path
69
+ .slice(1)
70
+ .split("/")
71
+ .some((part) => ["", ".", ".."].includes(part)) ||
72
+ /[\\\u0000-\u001f\u007f]/.test(path))
73
+ throw new RunContractError("absolute path");
74
+ return path;
75
+ }
76
+ export function runArgv(value) {
77
+ const args = runArray(value, (item) => (typeof item === "string" && item.length === 0 ? "" : runText(item, "argv", 16384)), 128);
78
+ runAbsolutePath(args[0]);
79
+ return args;
80
+ }
81
+ //# sourceMappingURL=run-parsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-parsing.js","sourceRoot":"","sources":["../src/run-parsing.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,YAAY,KAAa,EAAE;QAC1B,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAAA,CAC/B;CACD;AAED,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAuB,EAA2B;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9G,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI;QAC7F,MAAM,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU;YAAE,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvG,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AACD,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,KAAa,EAAE,GAAG,GAAG,IAAI,EAAU;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;QAChH,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AAAA,CACb;AACD,MAAM,UAAU,KAAK,CAAC,KAAc,EAAU;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC;AAAA,CACV;AACD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAU;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC;AAAA,CACb;AACD,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,KAAa,EAAE,GAAG,GAAG,UAAU,EAAU;IACjF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG;QACzF,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AAAA,CACb;AACD,MAAM,UAAU,QAAQ,CAAI,KAAc,EAAE,KAA2B,EAAE,GAAW,EAAgB;IACnG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAQ,EAAE,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACtF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC5B;AACD,MAAM,UAAU,eAAe,CAAC,KAAc,EAAU;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,IACC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9E,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AAAA,CACZ;AACD,MAAM,UAAU,eAAe,CAAC,KAAc,EAAU;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IACnD,IACC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,IAAI,KAAK,GAAG;QACZ,IAAI;aACF,KAAK,CAAC,CAAC,CAAC;aACR,KAAK,CAAC,GAAG,CAAC;aACV,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAEpC,MAAM,IAAI,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AAAA,CACZ;AACD,MAAM,UAAU,OAAO,CAAC,KAAc,EAAqB;IAC1D,MAAM,IAAI,GAAG,QAAQ,CACpB,KAAK,EACL,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAC7F,GAAG,CACH,CAAC;IACF,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AAAA,CACZ","sourcesContent":["export class RunContractError extends Error {\n\tconstructor(field: string) {\n\t\tsuper(`Invalid verified-run field: ${field}`);\n\t\tthis.name = \"RunContractError\";\n\t}\n}\n\nexport function runObject(value: unknown, keys: readonly string[]): Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) throw new RunContractError(\"object\");\n\tif (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)\n\t\tthrow new RunContractError(\"prototype\");\n\tconst descriptors = Object.getOwnPropertyDescriptors(value);\n\tif (Reflect.ownKeys(value).length !== keys.length) throw new RunContractError(\"fields\");\n\tconst result: Record<string, unknown> = {};\n\tfor (const key of keys) {\n\t\tconst descriptor = descriptors[key];\n\t\tif (!descriptor || !(\"value\" in descriptor) || !descriptor.enumerable) throw new RunContractError(key);\n\t\tresult[key] = descriptor.value;\n\t}\n\treturn result;\n}\nexport function runText(value: unknown, field: string, max = 4096): string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > max || /[\\u0000\\ud800-\\udfff]/u.test(value))\n\t\tthrow new RunContractError(field);\n\treturn value;\n}\nexport function runId(value: unknown): string {\n\tconst id = runText(value, \"id\", 128);\n\tif (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(id)) throw new RunContractError(\"id\");\n\treturn id;\n}\nexport function runDigest(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) throw new RunContractError(\"digest\");\n\treturn value;\n}\nexport function runLimit(value: unknown, field: string, max = 2147483647): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0 || value > max)\n\t\tthrow new RunContractError(field);\n\treturn value;\n}\nexport function runArray<T>(value: unknown, parse: (item: unknown) => T, max: number): readonly T[] {\n\tif (!Array.isArray(value) || value.length === 0 || value.length > max) throw new RunContractError(\"array\");\n\tconst items: T[] = [];\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\tif (!descriptor || !(\"value\" in descriptor)) throw new RunContractError(\"array item\");\n\t\titems.push(parse(descriptor.value));\n\t}\n\treturn Object.freeze(items);\n}\nexport function runRelativePath(value: unknown): string {\n\tconst path = runText(value, \"path\", 1024);\n\tif (\n\t\t/[\\\\\\u0000-\\u001f\\u007f]/.test(path) ||\n\t\tpath.split(\"/\").some((part) => [\"\", \".\", \"..\", \".git\", \".omk\"].includes(part))\n\t)\n\t\tthrow new RunContractError(\"path\");\n\treturn path;\n}\nexport function runAbsolutePath(value: unknown): string {\n\tconst path = runText(value, \"absolute path\", 4096);\n\tif (\n\t\t!path.startsWith(\"/\") ||\n\t\tpath === \"/\" ||\n\t\tpath\n\t\t\t.slice(1)\n\t\t\t.split(\"/\")\n\t\t\t.some((part) => [\"\", \".\", \"..\"].includes(part)) ||\n\t\t/[\\\\\\u0000-\\u001f\\u007f]/.test(path)\n\t)\n\t\tthrow new RunContractError(\"absolute path\");\n\treturn path;\n}\nexport function runArgv(value: unknown): readonly string[] {\n\tconst args = runArray(\n\t\tvalue,\n\t\t(item) => (typeof item === \"string\" && item.length === 0 ? \"\" : runText(item, \"argv\", 16384)),\n\t\t128,\n\t);\n\trunAbsolutePath(args[0]);\n\treturn args;\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { VERIFIED_COMMAND_VERSION } from "./run-contract.ts";
2
+ export declare const MAX_VERIFIED_RUN_GENERATIONS = 3;
3
+ /** Explicit execution intent; the host authenticates approval separately from this JSON. */
4
+ export interface RunResumeCommand {
5
+ readonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;
6
+ readonly kind: "resume";
7
+ readonly runId: string;
8
+ readonly commandId: string;
9
+ readonly expectedRevision: number;
10
+ readonly expectedGeneration: number;
11
+ readonly contractDigest: string;
12
+ readonly candidateDigest: string;
13
+ }
14
+ export declare function parseRunResumeCommand(value: unknown): RunResumeCommand;
15
+ //# sourceMappingURL=run-resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-resume.d.ts","sourceRoot":"","sources":["../src/run-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,4FAA4F;AAC5F,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,aAAa,EAAE,OAAO,wBAAwB,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAuBtE","sourcesContent":["import { VERIFIED_COMMAND_VERSION } from \"./run-contract.ts\";\nimport { RunContractError, runDigest, runId, runLimit, runObject } from \"./run-parsing.ts\";\n\nexport const MAX_VERIFIED_RUN_GENERATIONS = 3;\n\n/** Explicit execution intent; the host authenticates approval separately from this JSON. */\nexport interface RunResumeCommand {\n\treadonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;\n\treadonly kind: \"resume\";\n\treadonly runId: string;\n\treadonly commandId: string;\n\treadonly expectedRevision: number;\n\treadonly expectedGeneration: number;\n\treadonly contractDigest: string;\n\treadonly candidateDigest: string;\n}\n\nexport function parseRunResumeCommand(value: unknown): RunResumeCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"candidateDigest\",\n\t]);\n\tif (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== \"resume\")\n\t\tthrow new RunContractError(\"resume version/kind\");\n\treturn Object.freeze({\n\t\tschemaVersion: VERIFIED_COMMAND_VERSION,\n\t\tkind: \"resume\",\n\t\trunId: runId(input.runId),\n\t\tcommandId: runId(input.commandId),\n\t\texpectedRevision: runLimit(input.expectedRevision, \"expectedRevision\", Number.MAX_SAFE_INTEGER),\n\t\texpectedGeneration: runLimit(input.expectedGeneration, \"expectedGeneration\", Number.MAX_SAFE_INTEGER),\n\t\tcontractDigest: runDigest(input.contractDigest),\n\t\tcandidateDigest: runDigest(input.candidateDigest),\n\t});\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { VERIFIED_COMMAND_VERSION } from "./run-contract.js";
2
+ import { RunContractError, runDigest, runId, runLimit, runObject } from "./run-parsing.js";
3
+ export const MAX_VERIFIED_RUN_GENERATIONS = 3;
4
+ export function parseRunResumeCommand(value) {
5
+ const input = runObject(value, [
6
+ "schemaVersion",
7
+ "kind",
8
+ "runId",
9
+ "commandId",
10
+ "expectedRevision",
11
+ "expectedGeneration",
12
+ "contractDigest",
13
+ "candidateDigest",
14
+ ]);
15
+ if (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== "resume")
16
+ throw new RunContractError("resume version/kind");
17
+ return Object.freeze({
18
+ schemaVersion: VERIFIED_COMMAND_VERSION,
19
+ kind: "resume",
20
+ runId: runId(input.runId),
21
+ commandId: runId(input.commandId),
22
+ expectedRevision: runLimit(input.expectedRevision, "expectedRevision", Number.MAX_SAFE_INTEGER),
23
+ expectedGeneration: runLimit(input.expectedGeneration, "expectedGeneration", Number.MAX_SAFE_INTEGER),
24
+ contractDigest: runDigest(input.contractDigest),
25
+ candidateDigest: runDigest(input.candidateDigest),
26
+ });
27
+ }
28
+ //# sourceMappingURL=run-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-resume.js","sourceRoot":"","sources":["../src/run-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE3F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAc9C,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAoB;IACvE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9B,eAAe;QACf,MAAM;QACN,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,oBAAoB;QACpB,gBAAgB;QAChB,iBAAiB;KACjB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,aAAa,KAAK,wBAAwB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9E,MAAM,IAAI,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,aAAa,EAAE,wBAAwB;QACvC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACzB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC;QAC/F,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC,gBAAgB,CAAC;QACrG,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/C,eAAe,EAAE,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC;KACjD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { VERIFIED_COMMAND_VERSION } from \"./run-contract.ts\";\nimport { RunContractError, runDigest, runId, runLimit, runObject } from \"./run-parsing.ts\";\n\nexport const MAX_VERIFIED_RUN_GENERATIONS = 3;\n\n/** Explicit execution intent; the host authenticates approval separately from this JSON. */\nexport interface RunResumeCommand {\n\treadonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;\n\treadonly kind: \"resume\";\n\treadonly runId: string;\n\treadonly commandId: string;\n\treadonly expectedRevision: number;\n\treadonly expectedGeneration: number;\n\treadonly contractDigest: string;\n\treadonly candidateDigest: string;\n}\n\nexport function parseRunResumeCommand(value: unknown): RunResumeCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"candidateDigest\",\n\t]);\n\tif (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== \"resume\")\n\t\tthrow new RunContractError(\"resume version/kind\");\n\treturn Object.freeze({\n\t\tschemaVersion: VERIFIED_COMMAND_VERSION,\n\t\tkind: \"resume\",\n\t\trunId: runId(input.runId),\n\t\tcommandId: runId(input.commandId),\n\t\texpectedRevision: runLimit(input.expectedRevision, \"expectedRevision\", Number.MAX_SAFE_INTEGER),\n\t\texpectedGeneration: runLimit(input.expectedGeneration, \"expectedGeneration\", Number.MAX_SAFE_INTEGER),\n\t\tcontractDigest: runDigest(input.contractDigest),\n\t\tcandidateDigest: runDigest(input.candidateDigest),\n\t});\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type RunWriterRestartCommand } from "./run-writer-restart.ts";
2
+ /** Select failed/interrupted task attempts; an empty selection only continues pending work. */
3
+ export interface RunTaskRetryCommand extends Omit<RunWriterRestartCommand, "kind"> {
4
+ readonly kind: "retry_tasks";
5
+ readonly taskIds: readonly string[];
6
+ }
7
+ export declare function parseRunTaskRetryCommand(value: unknown): RunTaskRetryCommand;
8
+ //# sourceMappingURL=run-task-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-task-retry.d.ts","sourceRoot":"","sources":["../src/run-task-retry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAErG,+FAA+F;AAC/F,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACjF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAmB5E","sourcesContent":["import { MAX_RUN_DAG_TASKS } from \"./run-dag.ts\";\nimport { RunContractError, runArray, runId, runObject } from \"./run-parsing.ts\";\nimport { parseRunWriterRestartCommand, type RunWriterRestartCommand } from \"./run-writer-restart.ts\";\n\n/** Select failed/interrupted task attempts; an empty selection only continues pending work. */\nexport interface RunTaskRetryCommand extends Omit<RunWriterRestartCommand, \"kind\"> {\n\treadonly kind: \"retry_tasks\";\n\treadonly taskIds: readonly string[];\n}\nexport function parseRunTaskRetryCommand(value: unknown): RunTaskRetryCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"baseDigest\",\n\t\t\"taskIds\",\n\t]);\n\tif (input.kind !== \"retry_tasks\") throw new RunContractError(\"task retry kind\");\n\tconst { taskIds: rawIds, ...fields } = input;\n\tconst taskIds =\n\t\tArray.isArray(rawIds) && rawIds.length === 0 ? Object.freeze([]) : runArray(rawIds, runId, MAX_RUN_DAG_TASKS);\n\tif (new Set(taskIds).size !== taskIds.length) throw new RunContractError(\"duplicate task\");\n\tconst base = parseRunWriterRestartCommand({ ...fields, kind: \"restart_writer\" });\n\treturn Object.freeze({ ...base, kind: \"retry_tasks\", taskIds });\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { MAX_RUN_DAG_TASKS } from "./run-dag.js";
2
+ import { RunContractError, runArray, runId, runObject } from "./run-parsing.js";
3
+ import { parseRunWriterRestartCommand } from "./run-writer-restart.js";
4
+ export function parseRunTaskRetryCommand(value) {
5
+ const input = runObject(value, [
6
+ "schemaVersion",
7
+ "kind",
8
+ "runId",
9
+ "commandId",
10
+ "expectedRevision",
11
+ "expectedGeneration",
12
+ "contractDigest",
13
+ "baseDigest",
14
+ "taskIds",
15
+ ]);
16
+ if (input.kind !== "retry_tasks")
17
+ throw new RunContractError("task retry kind");
18
+ const { taskIds: rawIds, ...fields } = input;
19
+ const taskIds = Array.isArray(rawIds) && rawIds.length === 0 ? Object.freeze([]) : runArray(rawIds, runId, MAX_RUN_DAG_TASKS);
20
+ if (new Set(taskIds).size !== taskIds.length)
21
+ throw new RunContractError("duplicate task");
22
+ const base = parseRunWriterRestartCommand({ ...fields, kind: "restart_writer" });
23
+ return Object.freeze({ ...base, kind: "retry_tasks", taskIds });
24
+ }
25
+ //# sourceMappingURL=run-task-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-task-retry.js","sourceRoot":"","sources":["../src/run-task-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAgC,MAAM,yBAAyB,CAAC;AAOrG,MAAM,UAAU,wBAAwB,CAAC,KAAc,EAAuB;IAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9B,eAAe;QACf,MAAM;QACN,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,oBAAoB;QACpB,gBAAgB;QAChB,YAAY;QACZ,SAAS;KACT,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAChF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,OAAO,GACZ,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC/G,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,4BAA4B,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;AAAA,CAChE","sourcesContent":["import { MAX_RUN_DAG_TASKS } from \"./run-dag.ts\";\nimport { RunContractError, runArray, runId, runObject } from \"./run-parsing.ts\";\nimport { parseRunWriterRestartCommand, type RunWriterRestartCommand } from \"./run-writer-restart.ts\";\n\n/** Select failed/interrupted task attempts; an empty selection only continues pending work. */\nexport interface RunTaskRetryCommand extends Omit<RunWriterRestartCommand, \"kind\"> {\n\treadonly kind: \"retry_tasks\";\n\treadonly taskIds: readonly string[];\n}\nexport function parseRunTaskRetryCommand(value: unknown): RunTaskRetryCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"baseDigest\",\n\t\t\"taskIds\",\n\t]);\n\tif (input.kind !== \"retry_tasks\") throw new RunContractError(\"task retry kind\");\n\tconst { taskIds: rawIds, ...fields } = input;\n\tconst taskIds =\n\t\tArray.isArray(rawIds) && rawIds.length === 0 ? Object.freeze([]) : runArray(rawIds, runId, MAX_RUN_DAG_TASKS);\n\tif (new Set(taskIds).size !== taskIds.length) throw new RunContractError(\"duplicate task\");\n\tconst base = parseRunWriterRestartCommand({ ...fields, kind: \"restart_writer\" });\n\treturn Object.freeze({ ...base, kind: \"retry_tasks\", taskIds });\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { VERIFIED_COMMAND_VERSION } from "./run-contract.ts";
2
+ /** Restart intent for an isolated writer, bound to its durable input checkpoint, not partial output. */
3
+ export interface RunWriterRestartCommand {
4
+ readonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;
5
+ readonly kind: "restart_writer";
6
+ readonly runId: string;
7
+ readonly commandId: string;
8
+ readonly expectedRevision: number;
9
+ readonly expectedGeneration: number;
10
+ readonly contractDigest: string;
11
+ readonly baseDigest: string;
12
+ }
13
+ export declare function parseRunWriterRestartCommand(value: unknown): RunWriterRestartCommand;
14
+ //# sourceMappingURL=run-writer-restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-writer-restart.d.ts","sourceRoot":"","sources":["../src/run-writer-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,wGAAwG;AACxG,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,aAAa,EAAE,OAAO,wBAAwB,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAuBpF","sourcesContent":["import { VERIFIED_COMMAND_VERSION } from \"./run-contract.ts\";\nimport { RunContractError, runDigest, runId, runLimit, runObject } from \"./run-parsing.ts\";\n\n/** Restart intent for an isolated writer, bound to its durable input checkpoint, not partial output. */\nexport interface RunWriterRestartCommand {\n\treadonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;\n\treadonly kind: \"restart_writer\";\n\treadonly runId: string;\n\treadonly commandId: string;\n\treadonly expectedRevision: number;\n\treadonly expectedGeneration: number;\n\treadonly contractDigest: string;\n\treadonly baseDigest: string;\n}\n\nexport function parseRunWriterRestartCommand(value: unknown): RunWriterRestartCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"baseDigest\",\n\t]);\n\tif (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== \"restart_writer\")\n\t\tthrow new RunContractError(\"writer restart version/kind\");\n\treturn Object.freeze({\n\t\tschemaVersion: VERIFIED_COMMAND_VERSION,\n\t\tkind: \"restart_writer\",\n\t\trunId: runId(input.runId),\n\t\tcommandId: runId(input.commandId),\n\t\texpectedRevision: runLimit(input.expectedRevision, \"expectedRevision\", Number.MAX_SAFE_INTEGER),\n\t\texpectedGeneration: runLimit(input.expectedGeneration, \"expectedGeneration\", Number.MAX_SAFE_INTEGER),\n\t\tcontractDigest: runDigest(input.contractDigest),\n\t\tbaseDigest: runDigest(input.baseDigest),\n\t});\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { VERIFIED_COMMAND_VERSION } from "./run-contract.js";
2
+ import { RunContractError, runDigest, runId, runLimit, runObject } from "./run-parsing.js";
3
+ export function parseRunWriterRestartCommand(value) {
4
+ const input = runObject(value, [
5
+ "schemaVersion",
6
+ "kind",
7
+ "runId",
8
+ "commandId",
9
+ "expectedRevision",
10
+ "expectedGeneration",
11
+ "contractDigest",
12
+ "baseDigest",
13
+ ]);
14
+ if (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== "restart_writer")
15
+ throw new RunContractError("writer restart version/kind");
16
+ return Object.freeze({
17
+ schemaVersion: VERIFIED_COMMAND_VERSION,
18
+ kind: "restart_writer",
19
+ runId: runId(input.runId),
20
+ commandId: runId(input.commandId),
21
+ expectedRevision: runLimit(input.expectedRevision, "expectedRevision", Number.MAX_SAFE_INTEGER),
22
+ expectedGeneration: runLimit(input.expectedGeneration, "expectedGeneration", Number.MAX_SAFE_INTEGER),
23
+ contractDigest: runDigest(input.contractDigest),
24
+ baseDigest: runDigest(input.baseDigest),
25
+ });
26
+ }
27
+ //# sourceMappingURL=run-writer-restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-writer-restart.js","sourceRoot":"","sources":["../src/run-writer-restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAc3F,MAAM,UAAU,4BAA4B,CAAC,KAAc,EAA2B;IACrF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;QAC9B,eAAe;QACf,MAAM;QACN,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,oBAAoB;QACpB,gBAAgB;QAChB,YAAY;KACZ,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,aAAa,KAAK,wBAAwB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QACtF,MAAM,IAAI,gBAAgB,CAAC,6BAA6B,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,aAAa,EAAE,wBAAwB;QACvC,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACzB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC;QAC/F,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,CAAC,gBAAgB,CAAC;QACrG,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/C,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;KACvC,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { VERIFIED_COMMAND_VERSION } from \"./run-contract.ts\";\nimport { RunContractError, runDigest, runId, runLimit, runObject } from \"./run-parsing.ts\";\n\n/** Restart intent for an isolated writer, bound to its durable input checkpoint, not partial output. */\nexport interface RunWriterRestartCommand {\n\treadonly schemaVersion: typeof VERIFIED_COMMAND_VERSION;\n\treadonly kind: \"restart_writer\";\n\treadonly runId: string;\n\treadonly commandId: string;\n\treadonly expectedRevision: number;\n\treadonly expectedGeneration: number;\n\treadonly contractDigest: string;\n\treadonly baseDigest: string;\n}\n\nexport function parseRunWriterRestartCommand(value: unknown): RunWriterRestartCommand {\n\tconst input = runObject(value, [\n\t\t\"schemaVersion\",\n\t\t\"kind\",\n\t\t\"runId\",\n\t\t\"commandId\",\n\t\t\"expectedRevision\",\n\t\t\"expectedGeneration\",\n\t\t\"contractDigest\",\n\t\t\"baseDigest\",\n\t]);\n\tif (input.schemaVersion !== VERIFIED_COMMAND_VERSION || input.kind !== \"restart_writer\")\n\t\tthrow new RunContractError(\"writer restart version/kind\");\n\treturn Object.freeze({\n\t\tschemaVersion: VERIFIED_COMMAND_VERSION,\n\t\tkind: \"restart_writer\",\n\t\trunId: runId(input.runId),\n\t\tcommandId: runId(input.commandId),\n\t\texpectedRevision: runLimit(input.expectedRevision, \"expectedRevision\", Number.MAX_SAFE_INTEGER),\n\t\texpectedGeneration: runLimit(input.expectedGeneration, \"expectedGeneration\", Number.MAX_SAFE_INTEGER),\n\t\tcontractDigest: runDigest(input.contractDigest),\n\t\tbaseDigest: runDigest(input.baseDigest),\n\t});\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omk-protocol",
3
- "version": "0.98.3",
3
+ "version": "0.98.5",
4
4
  "description": "Canonical OMK Run Protocol contracts and pure semantic reducers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",