@akagilnc/pi-workflow-roles 0.1.1751

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 (192) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +104 -0
  3. package/README.zh-CN.md +133 -0
  4. package/THIRD_PARTY_NOTICES.md +60 -0
  5. package/dist/activation-ledger-git.js +68 -0
  6. package/dist/activation-ledger-session.js +120 -0
  7. package/dist/activation-ledger-topology.js +239 -0
  8. package/dist/activation-reconciliation.js +61 -0
  9. package/dist/audit-escalation.js +108 -0
  10. package/dist/auditor-dossier-tool.js +35 -0
  11. package/dist/canonical-json.js +78 -0
  12. package/dist/compliance-transport.js +77 -0
  13. package/dist/doctor-contracts.js +172 -0
  14. package/dist/dossier-resolution.js +103 -0
  15. package/dist/evidence-child-executor.js +661 -0
  16. package/dist/exact-utf8.js +12 -0
  17. package/dist/git-object-id.js +7 -0
  18. package/dist/in-process-session.js +50 -0
  19. package/dist/merger-contracts.js +76 -0
  20. package/dist/navigator-attendance.js +995 -0
  21. package/dist/navigator-invocation-identity.js +220 -0
  22. package/dist/open-tool-schema.js +39 -0
  23. package/dist/package-contracts/collector-output.js +50 -0
  24. package/dist/package-contracts/fixer-output.js +72 -0
  25. package/dist/package-contracts/fixer-packet.js +77 -0
  26. package/dist/package-contracts/judge-output.js +17 -0
  27. package/dist/package-contracts/reviewer-output.js +82 -0
  28. package/dist/package-contracts/terminating-tools.js +173 -0
  29. package/dist/package-contracts/worker-output.js +13 -0
  30. package/dist/package-owned-tool-idle.js +104 -0
  31. package/dist/packaged-role-registry.js +34 -0
  32. package/dist/public-cli/main.js +23867 -0
  33. package/dist/public-command-renderer.js +20 -0
  34. package/dist/reviewer-agent.js +93 -0
  35. package/dist/reviewer-child-executor.js +23 -0
  36. package/dist/reviewer-construction.js +95 -0
  37. package/dist/reviewer-dispatch.js +77 -0
  38. package/dist/reviewer-execution-ledger.js +160 -0
  39. package/dist/reviewer-failure-diagnostic.js +17 -0
  40. package/dist/reviewer-git-snapshot.js +38 -0
  41. package/dist/reviewer-pinned-git.js +146 -0
  42. package/dist/reviewer-preflight-error.js +15 -0
  43. package/dist/reviewer-prompt-identity.js +10 -0
  44. package/dist/reviewer-scope-prompt.js +21 -0
  45. package/dist/reviewer-workspace.js +151 -0
  46. package/dist/sha256.js +5 -0
  47. package/dist/sitian-record-entry.js +33 -0
  48. package/dist/stderr-jsonl.js +26 -0
  49. package/dist/stream-idle-guard.js +75 -0
  50. package/dist/tool-execution-observation.js +141 -0
  51. package/dist/uuidv7.js +21 -0
  52. package/dist/work-subject-identity.js +53 -0
  53. package/extensions/role-runtime.ts +303 -0
  54. package/package.json +69 -0
  55. package/packets/fixer-prerequisites.json +6 -0
  56. package/packets/fixer-repair.md +5 -0
  57. package/packets/judge-apply.md +77 -0
  58. package/packets/judge-authority.md +64 -0
  59. package/packets/judge-plan.md +55 -0
  60. package/packets/judge-review.md +49 -0
  61. package/packets/judge-submission.md +34 -0
  62. package/resources/methods/code-review/SKILL.md +92 -0
  63. package/resources/methods/code-review/agents/openai.yaml +3 -0
  64. package/resources/methods/code-review/provenance.json +26 -0
  65. package/resources/methods/diagnosing-bugs/SKILL.md +134 -0
  66. package/resources/methods/diagnosing-bugs/agents/openai.yaml +3 -0
  67. package/resources/methods/diagnosing-bugs/provenance.json +31 -0
  68. package/resources/methods/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  69. package/resources/methods/resolving-merge-conflicts/SKILL.md +14 -0
  70. package/resources/methods/resolving-merge-conflicts/agents/openai.yaml +3 -0
  71. package/resources/methods/resolving-merge-conflicts/provenance.json +26 -0
  72. package/resources/methods/tdd/SKILL.md +38 -0
  73. package/resources/methods/tdd/agents/openai.yaml +3 -0
  74. package/resources/methods/tdd/mocking.md +59 -0
  75. package/resources/methods/tdd/provenance.json +36 -0
  76. package/resources/methods/tdd/tests.md +77 -0
  77. package/resources/navigator-route-playbook.md +32 -0
  78. package/schemas/tool-execution-observation.schema.json +107 -0
  79. package/scripts/build-package.mjs +65 -0
  80. package/scripts/generate-tool-execution-observation-schema.ts +7 -0
  81. package/souls/coder.md +10 -0
  82. package/souls/collector.md +11 -0
  83. package/souls/doctor-auditor.md +23 -0
  84. package/souls/doctor.md +8 -0
  85. package/souls/fixer-auditor.md +33 -0
  86. package/souls/fixer.md +13 -0
  87. package/souls/judge-auditor.md +33 -0
  88. package/souls/judge.md +74 -0
  89. package/souls/merger.md +5 -0
  90. package/souls/navigator.md +5 -0
  91. package/souls/reviewer-auditor.md +25 -0
  92. package/souls/reviewer.md +11 -0
  93. package/src/activation-ledger-git.ts +96 -0
  94. package/src/activation-ledger-session.ts +188 -0
  95. package/src/activation-ledger-topology.ts +301 -0
  96. package/src/activation-ledger.ts +240 -0
  97. package/src/activation-reconciliation.ts +163 -0
  98. package/src/activation-trace.ts +38 -0
  99. package/src/audit-escalation.ts +177 -0
  100. package/src/auditor-dossier-tool.ts +48 -0
  101. package/src/auditor-soul.ts +28 -0
  102. package/src/canonical-json.ts +74 -0
  103. package/src/canonical-skill-binding.ts +107 -0
  104. package/src/collector-config.ts +89 -0
  105. package/src/collector-evidence.ts +461 -0
  106. package/src/collector-github.ts +656 -0
  107. package/src/collector-identity.ts +161 -0
  108. package/src/collector-ledger.ts +827 -0
  109. package/src/collector-receipt.ts +87 -0
  110. package/src/collector-role.ts +592 -0
  111. package/src/collector-tool-schemas.ts +19 -0
  112. package/src/compliance-transport.ts +130 -0
  113. package/src/doctor-auditor.ts +53 -0
  114. package/src/doctor-contracts.ts +166 -0
  115. package/src/doctor-evidence.ts +47 -0
  116. package/src/doctor-role.ts +18 -0
  117. package/src/dossier-resolution.ts +137 -0
  118. package/src/evidence-child-executor.ts +775 -0
  119. package/src/exact-utf8.ts +9 -0
  120. package/src/factory-board.ts +1822 -0
  121. package/src/git-object-id.ts +11 -0
  122. package/src/human-format.ts +65 -0
  123. package/src/in-process-session.ts +78 -0
  124. package/src/judge-auditor.ts +55 -0
  125. package/src/judge-recording-anti-forge.ts +53 -0
  126. package/src/judge-role.ts +160 -0
  127. package/src/merger-contracts.ts +71 -0
  128. package/src/merger-git-state.ts +76 -0
  129. package/src/merger-role.ts +60 -0
  130. package/src/navigator-attendance.ts +1254 -0
  131. package/src/navigator-invocation-identity.ts +446 -0
  132. package/src/open-tool-schema.ts +46 -0
  133. package/src/package-contracts/collector-output.ts +109 -0
  134. package/src/package-contracts/fixer-output.ts +81 -0
  135. package/src/package-contracts/fixer-packet.ts +93 -0
  136. package/src/package-contracts/judge-output.ts +39 -0
  137. package/src/package-contracts/reviewer-output.ts +115 -0
  138. package/src/package-contracts/terminating-tools.ts +259 -0
  139. package/src/package-contracts/worker-output.ts +36 -0
  140. package/src/package-owned-tool-idle.ts +134 -0
  141. package/src/package-resources/method-skill-binding.ts +87 -0
  142. package/src/package-resources/method-skill.ts +358 -0
  143. package/src/packaged-role-registry.ts +36 -0
  144. package/src/public-cli/cli-errors.ts +11 -0
  145. package/src/public-cli/cli-io.ts +4 -0
  146. package/src/public-cli/cli.ts +912 -0
  147. package/src/public-cli/coder-run.ts +575 -0
  148. package/src/public-cli/collector-run.ts +375 -0
  149. package/src/public-cli/command-renderer.ts +8 -0
  150. package/src/public-cli/config.ts +346 -0
  151. package/src/public-cli/doctor-run.ts +355 -0
  152. package/src/public-cli/explicit-internal.ts +274 -0
  153. package/src/public-cli/fixer-run.ts +587 -0
  154. package/src/public-cli/host-pi-runtime.ts +112 -0
  155. package/src/public-cli/invocation.ts +1958 -0
  156. package/src/public-cli/judge-run.ts +507 -0
  157. package/src/public-cli/main.ts +15 -0
  158. package/src/public-cli/merger-run.ts +681 -0
  159. package/src/public-cli/public-run-credentials.ts +71 -0
  160. package/src/public-cli/registry.ts +153 -0
  161. package/src/public-cli/reviewer-run.ts +561 -0
  162. package/src/public-cli/run-lifecycle.ts +884 -0
  163. package/src/public-cli/settlement.ts +3765 -0
  164. package/src/public-cli/terminal.ts +325 -0
  165. package/src/public-command-renderer.ts +43 -0
  166. package/src/reviewer-agent.ts +94 -0
  167. package/src/reviewer-auditor.ts +53 -0
  168. package/src/reviewer-child-executor.ts +31 -0
  169. package/src/reviewer-construction.ts +137 -0
  170. package/src/reviewer-dispatch.ts +94 -0
  171. package/src/reviewer-execution-ledger.ts +206 -0
  172. package/src/reviewer-failure-diagnostic.ts +18 -0
  173. package/src/reviewer-git-snapshot.ts +53 -0
  174. package/src/reviewer-pinned-git.ts +144 -0
  175. package/src/reviewer-preflight-error.ts +14 -0
  176. package/src/reviewer-prompt-identity.ts +17 -0
  177. package/src/reviewer-role.ts +193 -0
  178. package/src/reviewer-scope-prompt.ts +24 -0
  179. package/src/reviewer-settlement.ts +63 -0
  180. package/src/reviewer-workspace.ts +111 -0
  181. package/src/role-runtime.ts +884 -0
  182. package/src/sha256.ts +6 -0
  183. package/src/sitian-record-entry.ts +57 -0
  184. package/src/stderr-jsonl.ts +28 -0
  185. package/src/stream-idle-guard.ts +98 -0
  186. package/src/ticket-snapshot.ts +662 -0
  187. package/src/ticket-trajectory.ts +1000 -0
  188. package/src/tool-execution-observation.ts +168 -0
  189. package/src/uuidv7.ts +1 -0
  190. package/src/work-subject-identity.ts +94 -0
  191. package/src/worker-role.ts +434 -0
  192. package/src/worker-submission-gates.ts +225 -0
@@ -0,0 +1,74 @@
1
+ export const CANONICAL_JSON_VALIDATION_ERROR_CODE = "canonical-json-invalid" as const;
2
+
3
+ export class CanonicalJsonValidationError extends Error {
4
+ readonly code = CANONICAL_JSON_VALIDATION_ERROR_CODE;
5
+
6
+ constructor(readonly path: string, readonly reason: string) {
7
+ super(`Canonical JSON validation failed at ${path}: ${reason}`);
8
+ this.name = "CanonicalJsonValidationError";
9
+ }
10
+ }
11
+
12
+ function childPath(path: string, segment: string | number): string {
13
+ return `${path}/${String(segment).replaceAll("~", "~0").replaceAll("/", "~1")}`;
14
+ }
15
+
16
+ function ownStringKeys(value: object, path: string): string[] {
17
+ const keys = Reflect.ownKeys(value);
18
+ if (keys.some((key) => typeof key === "symbol")) {
19
+ throw new CanonicalJsonValidationError(childPath(path, "<symbol>"), "symbol-keyed member is not a JSON member");
20
+ }
21
+ return keys as string[];
22
+ }
23
+
24
+ /** Deterministic serialization of the closed JSON value domain. */
25
+ export function canonicalJson(value: unknown): string {
26
+ const ancestors = new WeakSet<object>();
27
+
28
+ const serialize = (item: unknown, path: string): string => {
29
+ if (item === null) return "null";
30
+ switch (typeof item) {
31
+ case "boolean":
32
+ case "string":
33
+ return JSON.stringify(item);
34
+ case "number":
35
+ if (!Number.isFinite(item)) throw new CanonicalJsonValidationError(path, "number must be finite");
36
+ return JSON.stringify(item);
37
+ case "undefined":
38
+ case "function":
39
+ case "symbol":
40
+ case "bigint":
41
+ throw new CanonicalJsonValidationError(path, `${typeof item} is not a JSON value`);
42
+ case "object": {
43
+ if (ancestors.has(item)) throw new CanonicalJsonValidationError(path, "cycle is not a JSON value");
44
+ ancestors.add(item);
45
+ try {
46
+ if (Array.isArray(item)) {
47
+ if (Object.getPrototypeOf(item) !== Array.prototype) throw new CanonicalJsonValidationError(path, "array must not be a custom object");
48
+ const keys = ownStringKeys(item, path);
49
+ const extraKey = keys.find((key) => key !== "length" && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= item.length));
50
+ if (extraKey !== undefined) throw new CanonicalJsonValidationError(childPath(path, extraKey), "non-index array member is not a JSON member");
51
+ const values: string[] = [];
52
+ for (let index = 0; index < item.length; index += 1) {
53
+ if (!Object.hasOwn(item, index)) throw new CanonicalJsonValidationError(childPath(path, index), "sparse array slot is not a JSON value");
54
+ values.push(serialize(item[index], childPath(path, index)));
55
+ }
56
+ return `[${values.join(",")}]`;
57
+ }
58
+ const prototype = Object.getPrototypeOf(item);
59
+ if (prototype !== Object.prototype && prototype !== null) throw new CanonicalJsonValidationError(path, "object must be a plain record");
60
+ return `{${ownStringKeys(item, path).sort().map((key) => `${JSON.stringify(key)}:${serialize((item as Record<string, unknown>)[key], childPath(path, key))}`).join(",")}}`;
61
+ } finally {
62
+ ancestors.delete(item);
63
+ }
64
+ }
65
+ }
66
+ throw new Error("Unreachable canonical JSON value type");
67
+ };
68
+
69
+ return serialize(value, "$");
70
+ }
71
+
72
+ export function canonicalJsonBytes(value: unknown): Uint8Array {
73
+ return new TextEncoder().encode(canonicalJson(value));
74
+ }
@@ -0,0 +1,107 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, resolve } from "node:path";
4
+
5
+ import { parseSkillBlock, stripFrontmatter } from "@earendil-works/pi-coding-agent";
6
+ export type CanonicalSkillName = "tdd" | "code-review";
7
+
8
+ export type CanonicalSkillSnapshot = Readonly<{
9
+ raw: string;
10
+ path: string;
11
+ baseDir: string;
12
+ body: string;
13
+ /** Plain skill text — no length/digest identity shell (ADR 0031). */
14
+ snapshotIdentity: Readonly<{ text: string }>;
15
+ }>;
16
+
17
+ export type CanonicalSkillEvidence<Name extends CanonicalSkillName = CanonicalSkillName> = Readonly<{
18
+ name: Name;
19
+ location: string;
20
+ content: string;
21
+ userMessage: string;
22
+ }>;
23
+
24
+ export type CanonicalSkillBinding<Name extends CanonicalSkillName = CanonicalSkillName> = Readonly<{
25
+ name: Name;
26
+ snapshot: CanonicalSkillSnapshot;
27
+ invocation(originalRequest: string): string;
28
+ captureExpansion(
29
+ prompt: string,
30
+ originalRequest: string,
31
+ ): CanonicalSkillEvidence<Name> | undefined;
32
+ }>;
33
+
34
+ export type AnyCanonicalSkillBinding =
35
+ | CanonicalSkillBinding<"tdd">
36
+ | CanonicalSkillBinding<"code-review">;
37
+
38
+ export class CanonicalSkillUnavailableError extends Error {
39
+ readonly code = "canonical-skill-unavailable" as const;
40
+ constructor(readonly skillName: CanonicalSkillName, path: string, cause: unknown) {
41
+ super(`Canonical ${skillName} Skill is unavailable at ${path}`, { cause });
42
+ this.name = "CanonicalSkillUnavailableError";
43
+ }
44
+ }
45
+
46
+ export async function loadCanonicalSkillBinding(
47
+ name: CanonicalSkillName,
48
+ ): Promise<AnyCanonicalSkillBinding> {
49
+ const configuredPath = resolve(
50
+ homedir(),
51
+ `.agents/skills/${name}/SKILL.md`,
52
+ );
53
+ let path: string;
54
+ let raw: string;
55
+ try {
56
+ path = await realpath(configuredPath);
57
+ raw = await readFile(path, "utf8");
58
+ } catch (error) {
59
+ throw new CanonicalSkillUnavailableError(name, configuredPath, error);
60
+ }
61
+ const body = stripFrontmatter(raw).trim();
62
+ if (body.length === 0) {
63
+ throw new Error(`Canonical ${name} Skill is empty at ${path}`);
64
+ }
65
+ const snapshot: CanonicalSkillSnapshot = Object.freeze({
66
+ raw,
67
+ path,
68
+ baseDir: dirname(path),
69
+ body,
70
+ snapshotIdentity: Object.freeze({ text: raw }),
71
+ });
72
+ const binding: CanonicalSkillBinding<typeof name> = {
73
+ name,
74
+ snapshot,
75
+ invocation(originalRequest) {
76
+ return `/skill:${name} ${originalRequest}`;
77
+ },
78
+ captureExpansion(prompt, originalRequest) {
79
+ const parsed = parseSkillBlock(prompt);
80
+ const matchedPath =
81
+ parsed?.location === configuredPath
82
+ ? configuredPath
83
+ : parsed?.location === snapshot.path
84
+ ? snapshot.path
85
+ : undefined;
86
+ const expectedContent = matchedPath === undefined
87
+ ? undefined
88
+ : `References are relative to ${dirname(matchedPath)}.\n\n${snapshot.body}`;
89
+ const userMessage = parsed?.userMessage ?? "";
90
+ if (
91
+ parsed?.name !== name ||
92
+ matchedPath === undefined ||
93
+ parsed.content !== expectedContent ||
94
+ userMessage !== originalRequest
95
+ ) {
96
+ return undefined;
97
+ }
98
+ return Object.freeze({
99
+ name,
100
+ location: parsed.location,
101
+ content: parsed.content,
102
+ userMessage,
103
+ });
104
+ },
105
+ };
106
+ return Object.freeze(binding) as AnyCanonicalSkillBinding;
107
+ }
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+
4
+ export const COLLECTOR_HOST = "github.com" as const;
5
+ export const COLLECTOR_OWNER_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$/;
6
+ export const COLLECTOR_REPO_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,98}[A-Za-z0-9])?$/;
7
+ export const COLLECTOR_FIXED_KICKOFF =
8
+ "Start collection for the validated runtime-owned target. Observe GitHub materials and submit exactly one ak_collector_output when observation is complete.";
9
+
10
+ export type CollectorRepository = {
11
+ display: string;
12
+ canonical: string;
13
+ owner: string;
14
+ repo: string;
15
+ };
16
+
17
+ export type CollectorRequestConfig = { id: string; requestBody: string };
18
+ export type CollectorManifest = {
19
+ requests: readonly CollectorRequestConfig[];
20
+ canonicalJson: string;
21
+ digest: string;
22
+ sourcePath?: string;
23
+ };
24
+
25
+ function fail(message: string, cause?: unknown): never {
26
+ throw new Error(message, cause === undefined ? undefined : { cause });
27
+ }
28
+
29
+ function conservativeAscii(input: string): boolean {
30
+ for (let i = 0; i < input.length; i += 1) {
31
+ const code = input.charCodeAt(i);
32
+ if (code <= 0x1f || code === 0x7f || code > 0x7f) return false;
33
+ }
34
+ return true;
35
+ }
36
+
37
+ export function parseCollectorRepository(raw: unknown): CollectorRepository {
38
+ if (typeof raw !== "string" || raw.trim() !== raw || raw.length === 0) fail("Collector repository must be a string owner/repo");
39
+ if (!conservativeAscii(raw) || raw.includes("://") || /[?#@%\\ ]/.test(raw)) fail("Collector repository rejects URL syntax and non-identity bytes");
40
+ const parts = raw.split("/");
41
+ if (parts.length !== 2) fail("Collector repository must contain exactly one '/' separating owner and repo");
42
+ const [ownerDisplay, repoDisplay] = parts as [string, string];
43
+ if (!COLLECTOR_OWNER_PATTERN.test(ownerDisplay) || !COLLECTOR_REPO_PATTERN.test(repoDisplay)) fail("Collector repository does not match the conservative owner/repo grammar");
44
+ const owner = ownerDisplay.toLowerCase();
45
+ const repo = repoDisplay.toLowerCase();
46
+ return { display: raw, canonical: `${owner}/${repo}`, owner, repo };
47
+ }
48
+
49
+ export function parseCollectorPrNumber(raw: unknown): number {
50
+ if (typeof raw === "string" && !/^[1-9][0-9]*$/.test(raw)) fail("Collector pull request number must be a positive safe integer string");
51
+ if (typeof raw !== "string" && typeof raw !== "number") fail("Collector pull request number is required");
52
+ const value = Number(raw);
53
+ if (!Number.isSafeInteger(value) || value < 1) fail("Collector pull request number must be a positive safe integer");
54
+ return value;
55
+ }
56
+
57
+ function record(value: unknown): value is Record<string, unknown> {
58
+ return typeof value === "object" && value !== null && !Array.isArray(value);
59
+ }
60
+
61
+ function canonicalManifest(requests: readonly CollectorRequestConfig[]): string {
62
+ return `${JSON.stringify({ requests: requests.map((request) => ({ id: request.id, body: request.requestBody })) })}\n`;
63
+ }
64
+
65
+ export function emptyCollectorManifest(): CollectorManifest {
66
+ const canonicalJson = canonicalManifest([]);
67
+ return { requests: [], canonicalJson, digest: createHash("sha256").update(canonicalJson).digest("hex") };
68
+ }
69
+
70
+ /** Optional request configuration. It names requests, never expected observers. */
71
+ export async function loadCollectorManifest(path: string): Promise<CollectorManifest> {
72
+ let bytes: Buffer;
73
+ try { bytes = await readFile(path); } catch (error) { fail(`Collector request manifest is unreadable at ${path}`, error); }
74
+ let parsed: unknown;
75
+ try { parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)); } catch (error) { fail("Collector request manifest must be UTF-8 JSON", error); }
76
+ if (!record(parsed)) fail("Collector request manifest must be an object");
77
+ const rawRequests = parsed.requests ?? [];
78
+ if (!Array.isArray(rawRequests)) fail("Collector request manifest requests must be an array");
79
+ const requests: CollectorRequestConfig[] = [];
80
+ const ids = new Set<string>();
81
+ for (const [index, item] of rawRequests.entries()) {
82
+ if (!record(item) || typeof item.id !== "string" || item.id.length === 0 || typeof item.body !== "string" || item.body.trim() === "") fail(`Collector request manifest requests[${index}] is invalid`);
83
+ if (ids.has(item.id)) fail(`Collector request manifest has duplicate request id "${item.id}"`);
84
+ ids.add(item.id);
85
+ requests.push({ id: item.id, requestBody: item.body });
86
+ }
87
+ const canonicalJson = canonicalManifest(requests);
88
+ return { requests, canonicalJson, digest: createHash("sha256").update(canonicalJson).digest("hex"), sourcePath: path };
89
+ }