clinkx 0.1.10 → 0.2.1

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 (179) hide show
  1. package/clinkx-workflows/dist/artifacts.d.ts +65 -0
  2. package/clinkx-workflows/dist/artifacts.js +268 -0
  3. package/clinkx-workflows/dist/artifacts.js.map +1 -0
  4. package/clinkx-workflows/dist/backend.d.ts +33 -0
  5. package/clinkx-workflows/dist/backend.js +9 -0
  6. package/clinkx-workflows/dist/backend.js.map +1 -0
  7. package/clinkx-workflows/dist/child-env.d.ts +23 -0
  8. package/clinkx-workflows/dist/child-env.js +53 -0
  9. package/clinkx-workflows/dist/child-env.js.map +1 -0
  10. package/clinkx-workflows/dist/clink-client.d.ts +51 -0
  11. package/clinkx-workflows/dist/clink-client.js +216 -0
  12. package/clinkx-workflows/dist/clink-client.js.map +1 -0
  13. package/clinkx-workflows/dist/config.d.ts +126 -0
  14. package/clinkx-workflows/dist/config.js +226 -0
  15. package/clinkx-workflows/dist/config.js.map +1 -0
  16. package/clinkx-workflows/dist/definition-normalizer.d.ts +59 -0
  17. package/clinkx-workflows/dist/definition-normalizer.js +75 -0
  18. package/clinkx-workflows/dist/definition-normalizer.js.map +1 -0
  19. package/clinkx-workflows/dist/engine.d.ts +235 -0
  20. package/clinkx-workflows/dist/engine.js +1044 -0
  21. package/clinkx-workflows/dist/engine.js.map +1 -0
  22. package/clinkx-workflows/dist/errors.d.ts +74 -0
  23. package/clinkx-workflows/dist/errors.js +84 -0
  24. package/clinkx-workflows/dist/errors.js.map +1 -0
  25. package/clinkx-workflows/dist/fidelity.d.ts +112 -0
  26. package/clinkx-workflows/dist/fidelity.js +140 -0
  27. package/clinkx-workflows/dist/fidelity.js.map +1 -0
  28. package/clinkx-workflows/dist/fingerprint.d.ts +69 -0
  29. package/clinkx-workflows/dist/fingerprint.js +143 -0
  30. package/clinkx-workflows/dist/fingerprint.js.map +1 -0
  31. package/clinkx-workflows/dist/index.d.ts +16 -0
  32. package/clinkx-workflows/dist/index.js +42 -0
  33. package/clinkx-workflows/dist/index.js.map +1 -0
  34. package/clinkx-workflows/dist/loader.d.ts +64 -0
  35. package/clinkx-workflows/dist/loader.js +371 -0
  36. package/clinkx-workflows/dist/loader.js.map +1 -0
  37. package/clinkx-workflows/dist/logger.d.ts +16 -0
  38. package/clinkx-workflows/dist/logger.js +31 -0
  39. package/clinkx-workflows/dist/logger.js.map +1 -0
  40. package/clinkx-workflows/dist/path-validation.d.ts +23 -0
  41. package/clinkx-workflows/dist/path-validation.js +73 -0
  42. package/clinkx-workflows/dist/path-validation.js.map +1 -0
  43. package/clinkx-workflows/dist/prompt-budget.d.ts +31 -0
  44. package/clinkx-workflows/dist/prompt-budget.js +78 -0
  45. package/clinkx-workflows/dist/prompt-budget.js.map +1 -0
  46. package/clinkx-workflows/dist/queue.d.ts +16 -0
  47. package/clinkx-workflows/dist/queue.js +46 -0
  48. package/clinkx-workflows/dist/queue.js.map +1 -0
  49. package/clinkx-workflows/dist/ranking-reducer.d.ts +11 -0
  50. package/clinkx-workflows/dist/ranking-reducer.js +245 -0
  51. package/clinkx-workflows/dist/ranking-reducer.js.map +1 -0
  52. package/clinkx-workflows/dist/reducers/index.d.ts +8 -0
  53. package/clinkx-workflows/dist/reducers/index.js +12 -0
  54. package/clinkx-workflows/dist/reducers/index.js.map +1 -0
  55. package/clinkx-workflows/dist/run-id.d.ts +17 -0
  56. package/clinkx-workflows/dist/run-id.js +26 -0
  57. package/clinkx-workflows/dist/run-id.js.map +1 -0
  58. package/clinkx-workflows/dist/run-summary/cards/council-answer.d.ts +8 -0
  59. package/clinkx-workflows/dist/run-summary/cards/council-answer.js +75 -0
  60. package/clinkx-workflows/dist/run-summary/cards/council-answer.js.map +1 -0
  61. package/clinkx-workflows/dist/run-summary/cards/council-code-review.d.ts +13 -0
  62. package/clinkx-workflows/dist/run-summary/cards/council-code-review.js +90 -0
  63. package/clinkx-workflows/dist/run-summary/cards/council-code-review.js.map +1 -0
  64. package/clinkx-workflows/dist/run-summary/cards/council-debug.d.ts +9 -0
  65. package/clinkx-workflows/dist/run-summary/cards/council-debug.js +79 -0
  66. package/clinkx-workflows/dist/run-summary/cards/council-debug.js.map +1 -0
  67. package/clinkx-workflows/dist/run-summary/cards/council-default.d.ts +11 -0
  68. package/clinkx-workflows/dist/run-summary/cards/council-default.js +57 -0
  69. package/clinkx-workflows/dist/run-summary/cards/council-default.js.map +1 -0
  70. package/clinkx-workflows/dist/run-summary/cards/council-discover.d.ts +10 -0
  71. package/clinkx-workflows/dist/run-summary/cards/council-discover.js +79 -0
  72. package/clinkx-workflows/dist/run-summary/cards/council-discover.js.map +1 -0
  73. package/clinkx-workflows/dist/run-summary/cards/generic.d.ts +2 -0
  74. package/clinkx-workflows/dist/run-summary/cards/generic.js +4 -0
  75. package/clinkx-workflows/dist/run-summary/cards/generic.js.map +1 -0
  76. package/clinkx-workflows/dist/run-summary/cards/index.d.ts +6 -0
  77. package/clinkx-workflows/dist/run-summary/cards/index.js +17 -0
  78. package/clinkx-workflows/dist/run-summary/cards/index.js.map +1 -0
  79. package/clinkx-workflows/dist/run-summary/utils.d.ts +6 -0
  80. package/clinkx-workflows/dist/run-summary/utils.js +30 -0
  81. package/clinkx-workflows/dist/run-summary/utils.js.map +1 -0
  82. package/clinkx-workflows/dist/run-summary-derived.d.ts +19 -0
  83. package/clinkx-workflows/dist/run-summary-derived.js +100 -0
  84. package/clinkx-workflows/dist/run-summary-derived.js.map +1 -0
  85. package/clinkx-workflows/dist/run-summary.d.ts +70 -0
  86. package/clinkx-workflows/dist/run-summary.js +125 -0
  87. package/clinkx-workflows/dist/run-summary.js.map +1 -0
  88. package/clinkx-workflows/dist/schema.d.ts +609 -0
  89. package/clinkx-workflows/dist/schema.js +123 -0
  90. package/clinkx-workflows/dist/schema.js.map +1 -0
  91. package/clinkx-workflows/dist/server.d.ts +16 -0
  92. package/clinkx-workflows/dist/server.js +33 -0
  93. package/clinkx-workflows/dist/server.js.map +1 -0
  94. package/clinkx-workflows/dist/shutdown.d.ts +54 -0
  95. package/clinkx-workflows/dist/shutdown.js +120 -0
  96. package/clinkx-workflows/dist/shutdown.js.map +1 -0
  97. package/clinkx-workflows/dist/state-schema.d.ts +141 -0
  98. package/clinkx-workflows/dist/state-schema.js +21 -0
  99. package/clinkx-workflows/dist/state-schema.js.map +1 -0
  100. package/clinkx-workflows/dist/state.d.ts +37 -0
  101. package/clinkx-workflows/dist/state.js +838 -0
  102. package/clinkx-workflows/dist/state.js.map +1 -0
  103. package/clinkx-workflows/dist/template-loader.d.ts +30 -0
  104. package/clinkx-workflows/dist/template-loader.js +77 -0
  105. package/clinkx-workflows/dist/template-loader.js.map +1 -0
  106. package/clinkx-workflows/dist/template.d.ts +54 -0
  107. package/clinkx-workflows/dist/template.js +128 -0
  108. package/clinkx-workflows/dist/template.js.map +1 -0
  109. package/clinkx-workflows/dist/transport.d.ts +91 -0
  110. package/clinkx-workflows/dist/transport.js +249 -0
  111. package/clinkx-workflows/dist/transport.js.map +1 -0
  112. package/clinkx-workflows/dist/types.d.ts +137 -0
  113. package/clinkx-workflows/dist/types.js +11 -0
  114. package/clinkx-workflows/dist/types.js.map +1 -0
  115. package/clinkx-workflows/dist/validators/council.d.ts +1488 -0
  116. package/clinkx-workflows/dist/validators/council.js +509 -0
  117. package/clinkx-workflows/dist/validators/council.js.map +1 -0
  118. package/clinkx-workflows/dist/validators/index.d.ts +40 -0
  119. package/clinkx-workflows/dist/validators/index.js +43 -0
  120. package/clinkx-workflows/dist/validators/index.js.map +1 -0
  121. package/clinkx-workflows/dist/workflow-receipt.d.ts +4 -0
  122. package/clinkx-workflows/dist/workflow-receipt.js +177 -0
  123. package/clinkx-workflows/dist/workflow-receipt.js.map +1 -0
  124. package/clinkx-workflows/dist/workflow-tools.d.ts +77 -0
  125. package/clinkx-workflows/dist/workflow-tools.js +1131 -0
  126. package/clinkx-workflows/dist/workflow-tools.js.map +1 -0
  127. package/clinkx-workflows/dist/workflows/council-default.d.ts +123 -0
  128. package/clinkx-workflows/dist/workflows/council-default.js +141 -0
  129. package/clinkx-workflows/dist/workflows/council-default.js.map +1 -0
  130. package/clinkx-workflows/dist/workflows/index.d.ts +12 -0
  131. package/clinkx-workflows/dist/workflows/index.js +15 -0
  132. package/clinkx-workflows/dist/workflows/index.js.map +1 -0
  133. package/conf/adapters/claude.json +13 -1
  134. package/conf/adapters/codex.json +11 -2
  135. package/conf/adapters/gemini.json +9 -0
  136. package/conf/adapters/glm.json +10 -0
  137. package/conf/adapters/hapi/claude.json +12 -2
  138. package/conf/adapters/hapi/codex.json +11 -2
  139. package/conf/adapters/hapi/gemini.json +9 -0
  140. package/conf/adapters/hapi/glm.json +10 -0
  141. package/conf/prompts/json-codereviewer.txt +6 -0
  142. package/conf/prompts/json-debug.txt +5 -0
  143. package/conf/prompts/json-default.txt +5 -0
  144. package/conf/prompts/json.txt +4 -1
  145. package/dist/config.d.ts +29 -4
  146. package/dist/config.js +23 -3
  147. package/dist/config.js.map +1 -1
  148. package/dist/handler.d.ts +2 -0
  149. package/dist/handler.js +2 -1
  150. package/dist/handler.js.map +1 -1
  151. package/dist/local-clink-backend.d.ts +30 -0
  152. package/dist/local-clink-backend.js +106 -0
  153. package/dist/local-clink-backend.js.map +1 -0
  154. package/dist/parsers/claude-stream-json.d.ts +1 -1
  155. package/dist/parsers/claude-stream-json.js +26 -8
  156. package/dist/parsers/claude-stream-json.js.map +1 -1
  157. package/dist/parsers/extract.d.ts +2 -0
  158. package/dist/parsers/extract.js +46 -20
  159. package/dist/parsers/extract.js.map +1 -1
  160. package/dist/pipeline.d.ts +2 -4
  161. package/dist/pipeline.js +246 -31
  162. package/dist/pipeline.js.map +1 -1
  163. package/dist/prompt.js +8 -1
  164. package/dist/prompt.js.map +1 -1
  165. package/dist/registry.d.ts +4 -0
  166. package/dist/registry.js +14 -0
  167. package/dist/registry.js.map +1 -1
  168. package/dist/result-contract.d.ts +6 -1
  169. package/dist/result-contract.js +10 -22
  170. package/dist/result-contract.js.map +1 -1
  171. package/dist/runner.js +59 -12
  172. package/dist/runner.js.map +1 -1
  173. package/dist/schema.d.ts +20 -0
  174. package/dist/schema.js +29 -2
  175. package/dist/schema.js.map +1 -1
  176. package/dist/server.d.ts +3 -3
  177. package/dist/server.js +119 -45
  178. package/dist/server.js.map +1 -1
  179. package/package.json +12 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import pino from "pino";
2
+ /**
3
+ * clinkx-workflows logger — writes exclusively to stderr (fd 2).
4
+ *
5
+ * STDIO correctness is a hard invariant: stdout is reserved for
6
+ * MCP JSON-RPC frames. All diagnostic output goes to stderr.
7
+ */
8
+ export declare const logger: pino.Logger<never, boolean>;
9
+ /**
10
+ * Startup self-check: verify logger writes to stderr, not stdout.
11
+ * Fails fast if the invariant is violated.
12
+ *
13
+ * We inspect the pino SonicBoom destination's `fd` property
14
+ * to confirm it points at fd 2 (stderr).
15
+ */
16
+ export declare function assertStderrLogger(): void;
@@ -0,0 +1,31 @@
1
+ import pino from "pino";
2
+ import { getLogLevel } from "./config.js";
3
+ const LOG_LEVEL = getLogLevel();
4
+ // Construct the stderr destination explicitly so we can inspect it.
5
+ const stderrDestination = pino.destination({ fd: 2, sync: false });
6
+ /**
7
+ * clinkx-workflows logger — writes exclusively to stderr (fd 2).
8
+ *
9
+ * STDIO correctness is a hard invariant: stdout is reserved for
10
+ * MCP JSON-RPC frames. All diagnostic output goes to stderr.
11
+ */
12
+ export const logger = pino({
13
+ name: "clinkx-workflows",
14
+ level: LOG_LEVEL,
15
+ }, stderrDestination);
16
+ /**
17
+ * Startup self-check: verify logger writes to stderr, not stdout.
18
+ * Fails fast if the invariant is violated.
19
+ *
20
+ * We inspect the pino SonicBoom destination's `fd` property
21
+ * to confirm it points at fd 2 (stderr).
22
+ */
23
+ export function assertStderrLogger() {
24
+ const dest = stderrDestination;
25
+ const fd = dest.fd;
26
+ if (fd !== 2) {
27
+ throw new Error(`FATAL: logger destination fd=${String(fd)}, expected fd=2 (stderr). ` +
28
+ "STDIO correctness requires all logging to stderr.");
29
+ }
30
+ }
31
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAEhC,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CACxB;IACE,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,SAAS;CACjB,EACD,iBAAiB,CAClB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,iBAA+C,CAAC;IAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,EAAE,CAAC,4BAA4B;YACpE,mDAAmD,CACtD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Dynamic path pre-validation for clinkx-workflows (2-9a-1).
3
+ *
4
+ * For calls using absolute_file_paths_from or images_from (variable-resolved paths),
5
+ * validates resolved paths against allowed roots BEFORE dispatching to child.
6
+ *
7
+ * Static absolute_file_paths and images remain child-validated,
8
+ * but dynamically resolved paths could be anything — preflight prevents
9
+ * wasting a child call on obviously invalid paths.
10
+ */
11
+ /**
12
+ * Validate that all resolved paths are within the allowed roots.
13
+ *
14
+ * @param paths - Resolved absolute paths to validate
15
+ * @param allowedRoots - Allowed root directories (comma-separated string or array)
16
+ * @param context - Description for error messages (e.g., "absolute_file_paths_from for call member_a")
17
+ * @throws WorkflowValidationError if any path escapes allowed roots
18
+ */
19
+ export declare function validateDynamicPaths(paths: readonly string[], allowedRoots: readonly string[], context: string): void;
20
+ /**
21
+ * Parse allowed roots from comma-separated string.
22
+ */
23
+ export declare function parseAllowedRoots(allowedRootsStr: string): string[];
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Dynamic path pre-validation for clinkx-workflows (2-9a-1).
3
+ *
4
+ * For calls using absolute_file_paths_from or images_from (variable-resolved paths),
5
+ * validates resolved paths against allowed roots BEFORE dispatching to child.
6
+ *
7
+ * Static absolute_file_paths and images remain child-validated,
8
+ * but dynamically resolved paths could be anything — preflight prevents
9
+ * wasting a child call on obviously invalid paths.
10
+ */
11
+ import { realpathSync } from "node:fs";
12
+ import { isAbsolute, resolve, relative } from "node:path";
13
+ import { WorkflowValidationError } from "./errors.js";
14
+ /**
15
+ * Validate that all resolved paths are within the allowed roots.
16
+ *
17
+ * @param paths - Resolved absolute paths to validate
18
+ * @param allowedRoots - Allowed root directories (comma-separated string or array)
19
+ * @param context - Description for error messages (e.g., "absolute_file_paths_from for call member_a")
20
+ * @throws WorkflowValidationError if any path escapes allowed roots
21
+ */
22
+ export function validateDynamicPaths(paths, allowedRoots, context) {
23
+ if (allowedRoots.length === 0) {
24
+ throw new WorkflowValidationError(`No allowed roots configured for dynamic path validation (${context})`);
25
+ }
26
+ for (const path of paths) {
27
+ validateSinglePath(path, allowedRoots, context);
28
+ }
29
+ }
30
+ /**
31
+ * Validate a single path against allowed roots.
32
+ */
33
+ function validateSinglePath(filePath, allowedRoots, context) {
34
+ // Must be absolute
35
+ if (!isAbsolute(filePath)) {
36
+ throw new WorkflowValidationError(`Dynamic path must be absolute: "${filePath}" (${context})`);
37
+ }
38
+ // Resolve symlinks for the path (best-effort — file may not exist yet at validation time)
39
+ let resolved;
40
+ try {
41
+ resolved = realpathSync(filePath);
42
+ }
43
+ catch {
44
+ // File doesn't exist yet — use resolve() for normalization
45
+ resolved = resolve(filePath);
46
+ }
47
+ // Check against each allowed root
48
+ const isAllowed = allowedRoots.some((root) => {
49
+ let realRoot;
50
+ try {
51
+ realRoot = realpathSync(root);
52
+ }
53
+ catch {
54
+ realRoot = resolve(root);
55
+ }
56
+ const rel = relative(realRoot, resolved);
57
+ return !rel.startsWith("..") && !rel.startsWith("/");
58
+ });
59
+ if (!isAllowed) {
60
+ throw new WorkflowValidationError(`Dynamic path "${filePath}" is outside all allowed roots ` +
61
+ `[${allowedRoots.join(", ")}] (${context})`);
62
+ }
63
+ }
64
+ /**
65
+ * Parse allowed roots from comma-separated string.
66
+ */
67
+ export function parseAllowedRoots(allowedRootsStr) {
68
+ return allowedRootsStr
69
+ .split(",")
70
+ .map((r) => r.trim())
71
+ .filter((r) => r.length > 0);
72
+ }
73
+ //# sourceMappingURL=path-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../src/path-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAwB,EACxB,YAA+B,EAC/B,OAAe;IAEf,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,uBAAuB,CAC/B,4DAA4D,OAAO,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,QAAgB,EAChB,YAA+B,EAC/B,OAAe;IAEf,mBAAmB;IACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,uBAAuB,CAC/B,mCAAmC,QAAQ,MAAM,OAAO,GAAG,CAC5D,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,uBAAuB,CAC/B,iBAAiB,QAAQ,iCAAiC;YACxD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,GAAG,CAC9C,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,eAAuB;IACvD,OAAO,eAAe;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Prompt budget estimation and guardrail.
3
+ *
4
+ * Estimates prompt size in UTF-8 bytes before dispatch using prompt text,
5
+ * context text, referenced files, images, and a reserve margin for child-side
6
+ * prompt assembly overhead.
7
+ */
8
+ export interface PromptBudgetContributor {
9
+ readonly label: string;
10
+ readonly kind: "prompt" | "context" | "file" | "image" | "reserve";
11
+ readonly bytes: number;
12
+ readonly path?: string | undefined;
13
+ }
14
+ export interface PromptBudgetEstimate {
15
+ readonly totalBytes: number;
16
+ readonly maxBytes: number;
17
+ readonly reserveBytes: number;
18
+ readonly exceeded: boolean;
19
+ readonly contributors: readonly PromptBudgetContributor[];
20
+ }
21
+ export interface PromptBudgetInput {
22
+ readonly promptText: string;
23
+ readonly contextText?: string | undefined;
24
+ readonly fileContributors?: readonly PromptBudgetContributor[] | undefined;
25
+ readonly imageContributors?: readonly PromptBudgetContributor[] | undefined;
26
+ readonly reserveBytes?: number | undefined;
27
+ readonly maxBytes?: number | undefined;
28
+ }
29
+ export declare function estimatePromptBudget(input: PromptBudgetInput): PromptBudgetEstimate;
30
+ export declare function createPathContributor(label: string, path: string, kind: "context" | "file" | "image"): PromptBudgetContributor;
31
+ export declare function enforcePromptBudget(estimate: PromptBudgetEstimate): void;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Prompt budget estimation and guardrail.
3
+ *
4
+ * Estimates prompt size in UTF-8 bytes before dispatch using prompt text,
5
+ * context text, referenced files, images, and a reserve margin for child-side
6
+ * prompt assembly overhead.
7
+ */
8
+ import { statSync } from "node:fs";
9
+ import { getMaxPromptBytes } from "./config.js";
10
+ import { WorkflowError } from "./errors.js";
11
+ const DEFAULT_RESERVE_BYTES = 100_000;
12
+ export function estimatePromptBudget(input) {
13
+ const contributors = [
14
+ {
15
+ label: "prompt",
16
+ kind: "prompt",
17
+ bytes: Buffer.byteLength(input.promptText, "utf-8"),
18
+ },
19
+ ];
20
+ if (input.contextText != null && input.contextText.length > 0) {
21
+ contributors.push({
22
+ label: "context",
23
+ kind: "context",
24
+ bytes: Buffer.byteLength(input.contextText, "utf-8"),
25
+ });
26
+ }
27
+ if (input.fileContributors != null) {
28
+ contributors.push(...input.fileContributors);
29
+ }
30
+ if (input.imageContributors != null) {
31
+ contributors.push(...input.imageContributors);
32
+ }
33
+ const reserveBytes = input.reserveBytes ?? DEFAULT_RESERVE_BYTES;
34
+ contributors.push({
35
+ label: "reserve",
36
+ kind: "reserve",
37
+ bytes: reserveBytes,
38
+ });
39
+ const totalBytes = contributors.reduce((sum, contributor) => sum + contributor.bytes, 0);
40
+ const maxBytes = input.maxBytes ?? getMaxPromptBytes();
41
+ return {
42
+ totalBytes,
43
+ maxBytes,
44
+ reserveBytes,
45
+ exceeded: totalBytes > maxBytes,
46
+ contributors,
47
+ };
48
+ }
49
+ export function createPathContributor(label, path, kind) {
50
+ return {
51
+ label,
52
+ kind,
53
+ path,
54
+ bytes: readPathSize(path),
55
+ };
56
+ }
57
+ export function enforcePromptBudget(estimate) {
58
+ if (!estimate.exceeded) {
59
+ return;
60
+ }
61
+ const largestContext = [...estimate.contributors]
62
+ .filter((contributor) => contributor.kind === "context" || contributor.kind === "file")
63
+ .sort((left, right) => right.bytes - left.bytes)[0];
64
+ const largestLabel = largestContext != null
65
+ ? `${largestContext.label} (${String(largestContext.bytes)} bytes)`
66
+ : "unknown";
67
+ throw new WorkflowError(`Prompt budget exceeded: estimated ${String(estimate.totalBytes)} bytes ` +
68
+ `> limit ${String(estimate.maxBytes)} bytes. Largest contributor: ${largestLabel}.`);
69
+ }
70
+ function readPathSize(path) {
71
+ try {
72
+ return statSync(path).size;
73
+ }
74
+ catch {
75
+ return 0;
76
+ }
77
+ }
78
+ //# sourceMappingURL=prompt-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget.js","sourceRoot":"","sources":["../src/prompt-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Token-based async dispatch queue for workflow stage fan-out.
3
+ *
4
+ * Depth is enforced locally so the workflow engine can feed the child
5
+ * incrementally instead of blasting `Promise.all()` requests in rounds.
6
+ */
7
+ export declare class DispatchQueue {
8
+ readonly depth: number;
9
+ private readonly pending;
10
+ private activeCount;
11
+ constructor(depth: number);
12
+ run<T>(task: () => Promise<T>): Promise<T>;
13
+ get active(): number;
14
+ get queued(): number;
15
+ private drain;
16
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Token-based async dispatch queue for workflow stage fan-out.
3
+ *
4
+ * Depth is enforced locally so the workflow engine can feed the child
5
+ * incrementally instead of blasting `Promise.all()` requests in rounds.
6
+ */
7
+ export class DispatchQueue {
8
+ depth;
9
+ pending = [];
10
+ activeCount = 0;
11
+ constructor(depth) {
12
+ this.depth = depth;
13
+ if (!Number.isInteger(depth) || depth <= 0) {
14
+ throw new Error(`DispatchQueue depth must be a positive integer, got ${String(depth)}`);
15
+ }
16
+ }
17
+ async run(task) {
18
+ return await new Promise((resolve, reject) => {
19
+ this.pending.push({ task: task, resolve: resolve, reject });
20
+ this.drain();
21
+ });
22
+ }
23
+ get active() {
24
+ return this.activeCount;
25
+ }
26
+ get queued() {
27
+ return this.pending.length;
28
+ }
29
+ drain() {
30
+ while (this.activeCount < this.depth) {
31
+ const next = this.pending.shift();
32
+ if (next == null) {
33
+ return;
34
+ }
35
+ this.activeCount += 1;
36
+ void Promise.resolve()
37
+ .then(next.task)
38
+ .then(next.resolve, next.reject)
39
+ .finally(() => {
40
+ this.activeCount -= 1;
41
+ this.drain();
42
+ });
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,OAAO,aAAa;IAIH;IAHJ,OAAO,GAAkB,EAAE,CAAC;IACrC,WAAW,GAAG,CAAC,CAAC;IAExB,YAAqB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAsB;QACjC,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAA8B,EAAE,OAAO,EAAE,OAAmC,EAAE,MAAM,EAAE,CAAC,CAAC;YAClH,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;YAEtB,KAAK,OAAO,CAAC,OAAO,EAAE;iBACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;iBAC/B,OAAO,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Deterministic ranking reducer for council workflows.
3
+ *
4
+ * Reads cross-review artifacts containing `ranking` arrays and computes
5
+ * structured consensus metadata using Borda count.
6
+ */
7
+ import type { ArtifactRecord } from "./artifacts.js";
8
+ /**
9
+ * Compute Borda count consensus ranking from cross-review ranking artifacts.
10
+ */
11
+ export declare function councilRankingReducer(artifacts: readonly ArtifactRecord[]): string;
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Deterministic ranking reducer for council workflows.
3
+ *
4
+ * Reads cross-review artifacts containing `ranking` arrays and computes
5
+ * structured consensus metadata using Borda count.
6
+ */
7
+ /**
8
+ * Extract ranking entries from a cross-review artifact.
9
+ * Different workflow presets use different ID field names
10
+ * (reviewer_id, analyst_id, debugger_id, specialist_id).
11
+ * This normalizes them all to candidate_id.
12
+ */
13
+ function extractRankings(parsed) {
14
+ if (parsed == null || typeof parsed !== "object")
15
+ return undefined;
16
+ const obj = parsed;
17
+ const ranking = obj["ranking"];
18
+ if (!Array.isArray(ranking) || ranking.length === 0)
19
+ return undefined;
20
+ const mapped = ranking
21
+ .map((entry) => {
22
+ if (entry == null || typeof entry !== "object") {
23
+ return undefined;
24
+ }
25
+ const e = entry;
26
+ // Require a valid positive integer rank
27
+ const rank = e["rank"];
28
+ if (typeof rank !== "number" || !Number.isInteger(rank) || rank < 1) {
29
+ return undefined;
30
+ }
31
+ // Prefer the canonical candidate_id field; fall back to any *_id key
32
+ let candidateId = "unknown";
33
+ if (typeof e["candidate_id"] === "string") {
34
+ candidateId = e["candidate_id"];
35
+ }
36
+ else {
37
+ for (const key of Object.keys(e)) {
38
+ if (key.endsWith("_id") && key !== "rank" && typeof e[key] === "string") {
39
+ candidateId = e[key];
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ return {
45
+ candidate_id: candidateId,
46
+ rank,
47
+ rationale: typeof e["rationale"] === "string" ? e["rationale"] : "",
48
+ };
49
+ })
50
+ .filter((entry) => entry != null);
51
+ // Deduplicate by candidate_id, keeping the first occurrence
52
+ const seen = new Set();
53
+ const deduplicated = [];
54
+ for (const entry of mapped) {
55
+ if (!seen.has(entry.candidate_id)) {
56
+ seen.add(entry.candidate_id);
57
+ deduplicated.push(entry);
58
+ }
59
+ }
60
+ return deduplicated;
61
+ }
62
+ function extractScores(parsed) {
63
+ const scoresByCandidate = new Map();
64
+ if (parsed == null || typeof parsed !== "object")
65
+ return scoresByCandidate;
66
+ const obj = parsed;
67
+ const scoreCollections = [
68
+ "member_evaluations",
69
+ "per_specialist_feedback",
70
+ "per_debugger_feedback",
71
+ "per_review_feedback",
72
+ "per_response_scores",
73
+ ];
74
+ // Deduplicate by candidate_id within this artifact, keeping the first occurrence
75
+ const seen = new Set();
76
+ for (const key of scoreCollections) {
77
+ const items = obj[key];
78
+ if (!Array.isArray(items))
79
+ continue;
80
+ for (const item of items) {
81
+ if (item == null || typeof item !== "object")
82
+ continue;
83
+ const entry = item;
84
+ const candidateId = entry["candidate_id"];
85
+ const score = entry["overall_score_100"];
86
+ if (typeof candidateId !== "string")
87
+ continue;
88
+ if (typeof score !== "number" || !Number.isFinite(score))
89
+ continue;
90
+ if (seen.has(candidateId))
91
+ continue;
92
+ seen.add(candidateId);
93
+ const existing = scoresByCandidate.get(candidateId) ?? [];
94
+ existing.push(score);
95
+ scoresByCandidate.set(candidateId, existing);
96
+ }
97
+ }
98
+ return scoresByCandidate;
99
+ }
100
+ /**
101
+ * Compute Borda count consensus ranking from cross-review ranking artifacts.
102
+ */
103
+ export function councilRankingReducer(artifacts) {
104
+ const allRankings = [];
105
+ let totalReviewers = artifacts.length;
106
+ for (const artifact of artifacts) {
107
+ const entries = extractRankings(artifact.parsed);
108
+ if (entries != null && entries.length > 0) {
109
+ allRankings.push({ reviewerId: artifact.callId, entries });
110
+ }
111
+ }
112
+ const scoreMap = new Map();
113
+ for (const artifact of artifacts) {
114
+ const artifactScores = extractScores(artifact.parsed);
115
+ for (const [candidateId, scores] of artifactScores.entries()) {
116
+ const existing = scoreMap.get(candidateId) ?? [];
117
+ existing.push(...scores);
118
+ scoreMap.set(candidateId, existing);
119
+ }
120
+ }
121
+ const reviewersWithRankings = allRankings.length;
122
+ const scoreSummaryEntries = [...scoreMap.entries()].map(([candidateId, scores]) => {
123
+ const total = scores.reduce((sum, score) => sum + score, 0);
124
+ const maxScore = Math.max(...scores);
125
+ const minScore = Math.min(...scores);
126
+ return {
127
+ candidate_id: candidateId,
128
+ mean_score: total / scores.length,
129
+ score_count: scores.length,
130
+ spread: maxScore - minScore,
131
+ };
132
+ });
133
+ let consensusRanking = [];
134
+ let minorityOpinions = [];
135
+ let rankingConflicts = [];
136
+ const consensusRankMap = new Map();
137
+ if (reviewersWithRankings > 0) {
138
+ // Collect all unique candidates
139
+ const candidateSet = new Set();
140
+ for (const { entries } of allRankings) {
141
+ for (const entry of entries) {
142
+ candidateSet.add(entry.candidate_id);
143
+ }
144
+ }
145
+ const numCandidates = candidateSet.size;
146
+ // Borda count: rank 1 = N points, rank 2 = N-1, etc.
147
+ const bordaScores = new Map();
148
+ for (const candidate of candidateSet) {
149
+ bordaScores.set(candidate, 0);
150
+ }
151
+ for (const { entries } of allRankings) {
152
+ for (const entry of entries) {
153
+ const currentScore = bordaScores.get(entry.candidate_id) ?? 0;
154
+ const points = Math.max(numCandidates - entry.rank + 1, 0);
155
+ bordaScores.set(entry.candidate_id, currentScore + points);
156
+ }
157
+ }
158
+ // Sort by Borda score descending, break ties alphabetically
159
+ const sortedCandidates = [...bordaScores.entries()]
160
+ .sort((a, b) => {
161
+ if (b[1] !== a[1])
162
+ return b[1] - a[1];
163
+ return a[0].localeCompare(b[0]);
164
+ });
165
+ consensusRanking = sortedCandidates.map(([candidateId, score], index) => ({
166
+ candidate_id: candidateId,
167
+ borda_score: score,
168
+ rank: index + 1,
169
+ }));
170
+ // Build consensus rank lookup
171
+ for (const entry of consensusRanking) {
172
+ consensusRankMap.set(entry.candidate_id, entry.rank);
173
+ }
174
+ // Minority opinions: reviewer rank diverges from consensus by >= 2
175
+ for (const { reviewerId, entries } of allRankings) {
176
+ for (const entry of entries) {
177
+ const consensusRank = consensusRankMap.get(entry.candidate_id) ?? entry.rank;
178
+ const divergence = Math.abs(entry.rank - consensusRank);
179
+ if (divergence >= 2) {
180
+ minorityOpinions.push({
181
+ reviewer_id: reviewerId,
182
+ candidate_id: entry.candidate_id,
183
+ reviewer_rank: entry.rank,
184
+ consensus_rank: consensusRank,
185
+ divergence,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ // Ranking conflicts: pairs where reviewers disagree on ordering
191
+ const candidates = [...candidateSet];
192
+ for (let i = 0; i < candidates.length; i++) {
193
+ for (let j = i + 1; j < candidates.length; j++) {
194
+ const a = candidates[i];
195
+ const b = candidates[j];
196
+ let aOverB = 0;
197
+ let bOverA = 0;
198
+ for (const { entries } of allRankings) {
199
+ const aEntry = entries.find((e) => e.candidate_id === a);
200
+ const bEntry = entries.find((e) => e.candidate_id === b);
201
+ if (aEntry != null && bEntry != null) {
202
+ if (aEntry.rank < bEntry.rank)
203
+ aOverB++;
204
+ else if (bEntry.rank < aEntry.rank)
205
+ bOverA++;
206
+ }
207
+ }
208
+ // Only record if there's actual disagreement
209
+ if (aOverB > 0 && bOverA > 0) {
210
+ rankingConflicts.push({
211
+ candidate_a: a,
212
+ candidate_b: b,
213
+ a_over_b_count: aOverB,
214
+ b_over_a_count: bOverA,
215
+ });
216
+ }
217
+ }
218
+ }
219
+ }
220
+ const scoreSummary = scoreSummaryEntries.sort((a, b) => {
221
+ const rankA = consensusRankMap.get(a.candidate_id);
222
+ const rankB = consensusRankMap.get(b.candidate_id);
223
+ if (rankA != null && rankB != null && rankA !== rankB)
224
+ return rankA - rankB;
225
+ if (rankA != null && rankB == null)
226
+ return -1;
227
+ if (rankA == null && rankB != null)
228
+ return 1;
229
+ if (b.mean_score !== a.mean_score)
230
+ return b.mean_score - a.mean_score;
231
+ return a.candidate_id.localeCompare(b.candidate_id);
232
+ });
233
+ const result = {
234
+ consensus_ranking: consensusRanking,
235
+ score_summary: scoreSummary,
236
+ minority_opinions: minorityOpinions,
237
+ ranking_conflicts: rankingConflicts,
238
+ quorum: {
239
+ total_reviewers: totalReviewers,
240
+ reviewers_with_rankings: reviewersWithRankings,
241
+ },
242
+ };
243
+ return JSON.stringify(result, null, 2);
244
+ }
245
+ //# sourceMappingURL=ranking-reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking-reducer.js","sourceRoot":"","sources":["../src/ranking-reducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Reducer registry for deterministic built-in call functions.
3
+ *
4
+ * Reducers run in place of LLM calls when a call specifies a `reducer` ID.
5
+ */
6
+ import type { ArtifactRecord } from "../artifacts.js";
7
+ export type ReducerFn = (artifacts: readonly ArtifactRecord[]) => string;
8
+ export declare function getReducer(id: string): ReducerFn | undefined;