@telora/factory 0.4.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 (301) hide show
  1. package/dist/audit.d.ts +69 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +376 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/builder-completion.d.ts +35 -0
  6. package/dist/builder-completion.d.ts.map +1 -0
  7. package/dist/builder-completion.js +375 -0
  8. package/dist/builder-completion.js.map +1 -0
  9. package/dist/builder-spawner.d.ts +40 -0
  10. package/dist/builder-spawner.d.ts.map +1 -0
  11. package/dist/builder-spawner.js +493 -0
  12. package/dist/builder-spawner.js.map +1 -0
  13. package/dist/completion-gate.d.ts +52 -0
  14. package/dist/completion-gate.d.ts.map +1 -0
  15. package/dist/completion-gate.js +336 -0
  16. package/dist/completion-gate.js.map +1 -0
  17. package/dist/completion-report.d.ts +36 -0
  18. package/dist/completion-report.d.ts.map +1 -0
  19. package/dist/completion-report.js +348 -0
  20. package/dist/completion-report.js.map +1 -0
  21. package/dist/completion.d.ts +58 -0
  22. package/dist/completion.d.ts.map +1 -0
  23. package/dist/completion.js +287 -0
  24. package/dist/completion.js.map +1 -0
  25. package/dist/config.d.ts +16 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +57 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/context-manager.d.ts +152 -0
  30. package/dist/context-manager.d.ts.map +1 -0
  31. package/dist/context-manager.js +421 -0
  32. package/dist/context-manager.js.map +1 -0
  33. package/dist/crash-detection.d.ts +70 -0
  34. package/dist/crash-detection.d.ts.map +1 -0
  35. package/dist/crash-detection.js +123 -0
  36. package/dist/crash-detection.js.map +1 -0
  37. package/dist/crash-recovery.d.ts +83 -0
  38. package/dist/crash-recovery.d.ts.map +1 -0
  39. package/dist/crash-recovery.js +522 -0
  40. package/dist/crash-recovery.js.map +1 -0
  41. package/dist/crash-resolution.d.ts +34 -0
  42. package/dist/crash-resolution.d.ts.map +1 -0
  43. package/dist/crash-resolution.js +382 -0
  44. package/dist/crash-resolution.js.map +1 -0
  45. package/dist/escalation.d.ts +150 -0
  46. package/dist/escalation.d.ts.map +1 -0
  47. package/dist/escalation.js +352 -0
  48. package/dist/escalation.js.map +1 -0
  49. package/dist/execution-target.d.ts +31 -0
  50. package/dist/execution-target.d.ts.map +1 -0
  51. package/dist/execution-target.js +71 -0
  52. package/dist/execution-target.js.map +1 -0
  53. package/dist/execution-unit-init.d.ts +28 -0
  54. package/dist/execution-unit-init.d.ts.map +1 -0
  55. package/dist/execution-unit-init.js +115 -0
  56. package/dist/execution-unit-init.js.map +1 -0
  57. package/dist/execution.d.ts +17 -0
  58. package/dist/execution.d.ts.map +1 -0
  59. package/dist/execution.js +20 -0
  60. package/dist/execution.js.map +1 -0
  61. package/dist/factory-engine.d.ts +100 -0
  62. package/dist/factory-engine.d.ts.map +1 -0
  63. package/dist/factory-engine.js +243 -0
  64. package/dist/factory-engine.js.map +1 -0
  65. package/dist/gap-detection.d.ts +43 -0
  66. package/dist/gap-detection.d.ts.map +1 -0
  67. package/dist/gap-detection.js +149 -0
  68. package/dist/gap-detection.js.map +1 -0
  69. package/dist/gate-context.d.ts +23 -0
  70. package/dist/gate-context.d.ts.map +1 -0
  71. package/dist/gate-context.js +63 -0
  72. package/dist/gate-context.js.map +1 -0
  73. package/dist/gate-engine.d.ts +55 -0
  74. package/dist/gate-engine.d.ts.map +1 -0
  75. package/dist/gate-engine.js +191 -0
  76. package/dist/gate-engine.js.map +1 -0
  77. package/dist/gates/adversarial.d.ts +59 -0
  78. package/dist/gates/adversarial.d.ts.map +1 -0
  79. package/dist/gates/adversarial.js +426 -0
  80. package/dist/gates/adversarial.js.map +1 -0
  81. package/dist/gates/adversary-spawner.d.ts +35 -0
  82. package/dist/gates/adversary-spawner.d.ts.map +1 -0
  83. package/dist/gates/adversary-spawner.js +286 -0
  84. package/dist/gates/adversary-spawner.js.map +1 -0
  85. package/dist/gates/adversary-test-dir.d.ts +41 -0
  86. package/dist/gates/adversary-test-dir.d.ts.map +1 -0
  87. package/dist/gates/adversary-test-dir.js +150 -0
  88. package/dist/gates/adversary-test-dir.js.map +1 -0
  89. package/dist/gates/behavioral-parser.d.ts +32 -0
  90. package/dist/gates/behavioral-parser.d.ts.map +1 -0
  91. package/dist/gates/behavioral-parser.js +190 -0
  92. package/dist/gates/behavioral-parser.js.map +1 -0
  93. package/dist/gates/behavioral-runner.d.ts +36 -0
  94. package/dist/gates/behavioral-runner.d.ts.map +1 -0
  95. package/dist/gates/behavioral-runner.js +306 -0
  96. package/dist/gates/behavioral-runner.js.map +1 -0
  97. package/dist/gates/behavioral.d.ts +37 -0
  98. package/dist/gates/behavioral.d.ts.map +1 -0
  99. package/dist/gates/behavioral.js +485 -0
  100. package/dist/gates/behavioral.js.map +1 -0
  101. package/dist/gates/deterministic.d.ts +24 -0
  102. package/dist/gates/deterministic.d.ts.map +1 -0
  103. package/dist/gates/deterministic.js +186 -0
  104. package/dist/gates/deterministic.js.map +1 -0
  105. package/dist/git-factory.d.ts +59 -0
  106. package/dist/git-factory.d.ts.map +1 -0
  107. package/dist/git-factory.js +102 -0
  108. package/dist/git-factory.js.map +1 -0
  109. package/dist/guard-evaluation.d.ts +48 -0
  110. package/dist/guard-evaluation.d.ts.map +1 -0
  111. package/dist/guard-evaluation.js +416 -0
  112. package/dist/guard-evaluation.js.map +1 -0
  113. package/dist/index.d.ts +30 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +39 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/instance-completion.d.ts +34 -0
  118. package/dist/instance-completion.d.ts.map +1 -0
  119. package/dist/instance-completion.js +366 -0
  120. package/dist/instance-completion.js.map +1 -0
  121. package/dist/instance-lifecycle.d.ts +15 -0
  122. package/dist/instance-lifecycle.d.ts.map +1 -0
  123. package/dist/instance-lifecycle.js +18 -0
  124. package/dist/instance-lifecycle.js.map +1 -0
  125. package/dist/instance-phase-dispatch.d.ts +75 -0
  126. package/dist/instance-phase-dispatch.d.ts.map +1 -0
  127. package/dist/instance-phase-dispatch.js +674 -0
  128. package/dist/instance-phase-dispatch.js.map +1 -0
  129. package/dist/instance-poll-loop.d.ts +43 -0
  130. package/dist/instance-poll-loop.d.ts.map +1 -0
  131. package/dist/instance-poll-loop.js +360 -0
  132. package/dist/instance-poll-loop.js.map +1 -0
  133. package/dist/instance-state-machine.d.ts +52 -0
  134. package/dist/instance-state-machine.d.ts.map +1 -0
  135. package/dist/instance-state-machine.js +235 -0
  136. package/dist/instance-state-machine.js.map +1 -0
  137. package/dist/log-manager.d.ts +28 -0
  138. package/dist/log-manager.d.ts.map +1 -0
  139. package/dist/log-manager.js +71 -0
  140. package/dist/log-manager.js.map +1 -0
  141. package/dist/pipeline-evaluator.d.ts +61 -0
  142. package/dist/pipeline-evaluator.d.ts.map +1 -0
  143. package/dist/pipeline-evaluator.js +107 -0
  144. package/dist/pipeline-evaluator.js.map +1 -0
  145. package/dist/pipeline-metrics.d.ts +52 -0
  146. package/dist/pipeline-metrics.d.ts.map +1 -0
  147. package/dist/pipeline-metrics.js +40 -0
  148. package/dist/pipeline-metrics.js.map +1 -0
  149. package/dist/pipeline-traversal.d.ts +43 -0
  150. package/dist/pipeline-traversal.d.ts.map +1 -0
  151. package/dist/pipeline-traversal.js +68 -0
  152. package/dist/pipeline-traversal.js.map +1 -0
  153. package/dist/plan-parser.d.ts +76 -0
  154. package/dist/plan-parser.d.ts.map +1 -0
  155. package/dist/plan-parser.js +223 -0
  156. package/dist/plan-parser.js.map +1 -0
  157. package/dist/planning-phase.d.ts +52 -0
  158. package/dist/planning-phase.d.ts.map +1 -0
  159. package/dist/planning-phase.js +444 -0
  160. package/dist/planning-phase.js.map +1 -0
  161. package/dist/planning-prompt.d.ts +64 -0
  162. package/dist/planning-prompt.d.ts.map +1 -0
  163. package/dist/planning-prompt.js +251 -0
  164. package/dist/planning-prompt.js.map +1 -0
  165. package/dist/planning.d.ts +16 -0
  166. package/dist/planning.d.ts.map +1 -0
  167. package/dist/planning.js +17 -0
  168. package/dist/planning.js.map +1 -0
  169. package/dist/process-runner.d.ts +41 -0
  170. package/dist/process-runner.d.ts.map +1 -0
  171. package/dist/process-runner.js +81 -0
  172. package/dist/process-runner.js.map +1 -0
  173. package/dist/product-config.d.ts +34 -0
  174. package/dist/product-config.d.ts.map +1 -0
  175. package/dist/product-config.js +43 -0
  176. package/dist/product-config.js.map +1 -0
  177. package/dist/queries/cycle-evaluations.d.ts +23 -0
  178. package/dist/queries/cycle-evaluations.d.ts.map +1 -0
  179. package/dist/queries/cycle-evaluations.js +37 -0
  180. package/dist/queries/cycle-evaluations.js.map +1 -0
  181. package/dist/queries/escalations.d.ts +30 -0
  182. package/dist/queries/escalations.d.ts.map +1 -0
  183. package/dist/queries/escalations.js +42 -0
  184. package/dist/queries/escalations.js.map +1 -0
  185. package/dist/queries/execution-units.d.ts +76 -0
  186. package/dist/queries/execution-units.d.ts.map +1 -0
  187. package/dist/queries/execution-units.js +109 -0
  188. package/dist/queries/execution-units.js.map +1 -0
  189. package/dist/queries/gate-results.d.ts +32 -0
  190. package/dist/queries/gate-results.d.ts.map +1 -0
  191. package/dist/queries/gate-results.js +44 -0
  192. package/dist/queries/gate-results.js.map +1 -0
  193. package/dist/queries/instances.d.ts +51 -0
  194. package/dist/queries/instances.d.ts.map +1 -0
  195. package/dist/queries/instances.js +77 -0
  196. package/dist/queries/instances.js.map +1 -0
  197. package/dist/queries/sessions.d.ts +50 -0
  198. package/dist/queries/sessions.d.ts.map +1 -0
  199. package/dist/queries/sessions.js +81 -0
  200. package/dist/queries/sessions.js.map +1 -0
  201. package/dist/queries/shared.d.ts +38 -0
  202. package/dist/queries/shared.d.ts.map +1 -0
  203. package/dist/queries/shared.js +119 -0
  204. package/dist/queries/shared.js.map +1 -0
  205. package/dist/queries/specs.d.ts +12 -0
  206. package/dist/queries/specs.d.ts.map +1 -0
  207. package/dist/queries/specs.js +21 -0
  208. package/dist/queries/specs.js.map +1 -0
  209. package/dist/queries/strategies.d.ts +14 -0
  210. package/dist/queries/strategies.d.ts.map +1 -0
  211. package/dist/queries/strategies.js +18 -0
  212. package/dist/queries/strategies.js.map +1 -0
  213. package/dist/queries/work-units.d.ts +42 -0
  214. package/dist/queries/work-units.d.ts.map +1 -0
  215. package/dist/queries/work-units.js +57 -0
  216. package/dist/queries/work-units.js.map +1 -0
  217. package/dist/queries/workflows.d.ts +29 -0
  218. package/dist/queries/workflows.d.ts.map +1 -0
  219. package/dist/queries/workflows.js +103 -0
  220. package/dist/queries/workflows.js.map +1 -0
  221. package/dist/remediation-units.d.ts +40 -0
  222. package/dist/remediation-units.d.ts.map +1 -0
  223. package/dist/remediation-units.js +263 -0
  224. package/dist/remediation-units.js.map +1 -0
  225. package/dist/replanning.d.ts +72 -0
  226. package/dist/replanning.d.ts.map +1 -0
  227. package/dist/replanning.js +403 -0
  228. package/dist/replanning.js.map +1 -0
  229. package/dist/resource-limits.d.ts +62 -0
  230. package/dist/resource-limits.d.ts.map +1 -0
  231. package/dist/resource-limits.js +322 -0
  232. package/dist/resource-limits.js.map +1 -0
  233. package/dist/scheduler.d.ts +98 -0
  234. package/dist/scheduler.d.ts.map +1 -0
  235. package/dist/scheduler.js +203 -0
  236. package/dist/scheduler.js.map +1 -0
  237. package/dist/session-adapter.d.ts +89 -0
  238. package/dist/session-adapter.d.ts.map +1 -0
  239. package/dist/session-adapter.js +108 -0
  240. package/dist/session-adapter.js.map +1 -0
  241. package/dist/sop-generator.d.ts +29 -0
  242. package/dist/sop-generator.d.ts.map +1 -0
  243. package/dist/sop-generator.js +235 -0
  244. package/dist/sop-generator.js.map +1 -0
  245. package/dist/spec-profiles.d.ts +41 -0
  246. package/dist/spec-profiles.d.ts.map +1 -0
  247. package/dist/spec-profiles.js +131 -0
  248. package/dist/spec-profiles.js.map +1 -0
  249. package/dist/strategy-design-graph.d.ts +23 -0
  250. package/dist/strategy-design-graph.d.ts.map +1 -0
  251. package/dist/strategy-design-graph.js +205 -0
  252. package/dist/strategy-design-graph.js.map +1 -0
  253. package/dist/strategy-design-prompt.d.ts +28 -0
  254. package/dist/strategy-design-prompt.d.ts.map +1 -0
  255. package/dist/strategy-design-prompt.js +108 -0
  256. package/dist/strategy-design-prompt.js.map +1 -0
  257. package/dist/strategy-design-schema.d.ts +767 -0
  258. package/dist/strategy-design-schema.d.ts.map +1 -0
  259. package/dist/strategy-design-schema.js +126 -0
  260. package/dist/strategy-design-schema.js.map +1 -0
  261. package/dist/strategy-design.d.ts +69 -0
  262. package/dist/strategy-design.d.ts.map +1 -0
  263. package/dist/strategy-design.js +411 -0
  264. package/dist/strategy-design.js.map +1 -0
  265. package/dist/strategy-gating.d.ts +31 -0
  266. package/dist/strategy-gating.d.ts.map +1 -0
  267. package/dist/strategy-gating.js +276 -0
  268. package/dist/strategy-gating.js.map +1 -0
  269. package/dist/team-prompt-builder.d.ts +47 -0
  270. package/dist/team-prompt-builder.d.ts.map +1 -0
  271. package/dist/team-prompt-builder.js +362 -0
  272. package/dist/team-prompt-builder.js.map +1 -0
  273. package/dist/trace-engine.d.ts +40 -0
  274. package/dist/trace-engine.d.ts.map +1 -0
  275. package/dist/trace-engine.js +344 -0
  276. package/dist/trace-engine.js.map +1 -0
  277. package/dist/types.d.ts +612 -0
  278. package/dist/types.d.ts.map +1 -0
  279. package/dist/types.js +9 -0
  280. package/dist/types.js.map +1 -0
  281. package/dist/unit-session-lifecycle.d.ts +78 -0
  282. package/dist/unit-session-lifecycle.d.ts.map +1 -0
  283. package/dist/unit-session-lifecycle.js +141 -0
  284. package/dist/unit-session-lifecycle.js.map +1 -0
  285. package/dist/unit-session.d.ts +30 -0
  286. package/dist/unit-session.d.ts.map +1 -0
  287. package/dist/unit-session.js +370 -0
  288. package/dist/unit-session.js.map +1 -0
  289. package/dist/watchdogs.d.ts +33 -0
  290. package/dist/watchdogs.d.ts.map +1 -0
  291. package/dist/watchdogs.js +170 -0
  292. package/dist/watchdogs.js.map +1 -0
  293. package/dist/work-unit-scheduler.d.ts +34 -0
  294. package/dist/work-unit-scheduler.d.ts.map +1 -0
  295. package/dist/work-unit-scheduler.js +91 -0
  296. package/dist/work-unit-scheduler.js.map +1 -0
  297. package/dist/workflow-transition.d.ts +90 -0
  298. package/dist/workflow-transition.d.ts.map +1 -0
  299. package/dist/workflow-transition.js +340 -0
  300. package/dist/workflow-transition.js.map +1 -0
  301. package/package.json +65 -0
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Pure guard condition evaluation functions for the factory engine.
3
+ *
4
+ * These are extracted from packages/daemon/src/guard-engine.ts and kept
5
+ * in sync. They evaluate guard condition trees against an EvaluationContext
6
+ * without any database dependencies -- all data must be pre-fetched.
7
+ */
8
+ // ============================================================================
9
+ // Comparison helper
10
+ // ============================================================================
11
+ function compareValues(observed, operator, expected) {
12
+ switch (operator) {
13
+ case 'eq': return observed === expected;
14
+ case 'neq': return observed !== expected;
15
+ case 'lt': return observed < expected;
16
+ case 'lte': return observed <= expected;
17
+ case 'gt': return observed > expected;
18
+ case 'gte': return observed >= expected;
19
+ default: return observed === expected;
20
+ }
21
+ }
22
+ /**
23
+ * Safely coerce a JSONB value to a number.
24
+ * Returns null if the value is not a valid finite number.
25
+ */
26
+ function toSafeNumber(value) {
27
+ if (value === null || value === undefined)
28
+ return null;
29
+ const num = typeof value === 'number' ? value : Number(value);
30
+ return Number.isFinite(num) ? num : null;
31
+ }
32
+ // ============================================================================
33
+ // Leaf condition evaluator
34
+ // ============================================================================
35
+ function evaluateLeafCondition(node, nodeId, ctx) {
36
+ const expr = node.expression ?? {};
37
+ const conditionType = node.condition_type ?? 'unknown';
38
+ switch (conditionType) {
39
+ case 'open_issues_count': {
40
+ const statuses = expr.statuses ?? ['To Do', 'In Progress', 'Blocked'];
41
+ const operator = expr.operator ?? 'eq';
42
+ const expected = toSafeNumber(expr.value) ?? 0;
43
+ let observed = 0;
44
+ for (const status of statuses) {
45
+ observed += ctx.issuesByStatus[status] ?? 0;
46
+ }
47
+ const passed = compareValues(observed, operator, expected);
48
+ return {
49
+ condition_id: nodeId, condition_type: conditionType, passed,
50
+ observed_value: observed, expected_value: `${operator} ${expected}`,
51
+ message: passed
52
+ ? `Open issues count (${observed}) satisfies ${operator} ${expected}`
53
+ : `Open issues count (${observed}) does not satisfy ${operator} ${expected}`,
54
+ };
55
+ }
56
+ case 'all_issues_done': {
57
+ const passed = ctx.openIssueCount === 0 && ctx.totalIssueCount > 0;
58
+ return {
59
+ condition_id: nodeId, condition_type: conditionType, passed,
60
+ observed_value: ctx.openIssueCount, expected_value: 0,
61
+ message: passed ? 'All issues are Done'
62
+ : ctx.totalIssueCount === 0 ? 'No issues exist on this delivery'
63
+ : `${ctx.openIssueCount} issue(s) are not Done`,
64
+ };
65
+ }
66
+ case 'agent_exit_code': {
67
+ const operator = expr.operator ?? 'eq';
68
+ const expected = toSafeNumber(expr.value) ?? 0;
69
+ const passed = compareValues(ctx.lastExitCode, operator, expected);
70
+ return {
71
+ condition_id: nodeId, condition_type: conditionType, passed,
72
+ observed_value: ctx.lastExitCode, expected_value: `${operator} ${expected}`,
73
+ message: passed
74
+ ? `Agent exit code (${ctx.lastExitCode}) satisfies ${operator} ${expected}`
75
+ : `Agent exit code (${ctx.lastExitCode}) does not satisfy ${operator} ${expected}`,
76
+ };
77
+ }
78
+ case 'gate_result': {
79
+ const gateType = expr.gate_type;
80
+ if (!gateType) {
81
+ return {
82
+ condition_id: nodeId, condition_type: conditionType, passed: false,
83
+ observed_value: null, expected_value: 'gate_type required',
84
+ message: 'gate_result condition missing required gate_type in expression',
85
+ };
86
+ }
87
+ const scope = expr.scope ?? 'strategy';
88
+ const operator = expr.operator ?? 'eq';
89
+ const expectedValue = expr.value ?? 'passed';
90
+ const strategyId = expr.strategy_id;
91
+ const results = ctx.gateResults ?? [];
92
+ let filtered = results.filter(r => r.gateType === gateType);
93
+ if (scope === 'strategy' && strategyId) {
94
+ filtered = filtered.filter(r => r.strategyId === strategyId);
95
+ }
96
+ if (filtered.length === 0) {
97
+ return {
98
+ condition_id: nodeId, condition_type: conditionType, passed: false,
99
+ observed_value: 'no_results', expected_value: `${operator} ${expectedValue}`,
100
+ message: `No gate results found for gate_type "${gateType}" (gate hasn't run yet)`,
101
+ };
102
+ }
103
+ const latest = filtered[filtered.length - 1];
104
+ const observedState = latest.passed ? 'passed' : 'failed';
105
+ const passed = operator === 'neq' ? observedState !== expectedValue : observedState === expectedValue;
106
+ return {
107
+ condition_id: nodeId, condition_type: conditionType, passed,
108
+ observed_value: observedState, expected_value: `${operator} ${expectedValue}`,
109
+ message: passed
110
+ ? `Gate ${gateType} result (${observedState}) satisfies ${operator} ${expectedValue}`
111
+ : `Gate ${gateType} result (${observedState}) does not satisfy ${operator} ${expectedValue}`,
112
+ };
113
+ }
114
+ case 'token_budget': {
115
+ if (ctx.tokensUsed === undefined) {
116
+ return {
117
+ condition_id: nodeId, condition_type: conditionType, passed: true,
118
+ observed_value: null, expected_value: null,
119
+ message: 'No factory context -- token_budget skipped',
120
+ };
121
+ }
122
+ const mode = expr.mode ?? 'percentage';
123
+ const operator = expr.operator ?? 'lt';
124
+ const expected = toSafeNumber(expr.value);
125
+ if (expected === null) {
126
+ return {
127
+ condition_id: nodeId, condition_type: conditionType, passed: false,
128
+ observed_value: ctx.tokensUsed, expected_value: 'value required',
129
+ message: 'token_budget condition missing or invalid value in expression',
130
+ };
131
+ }
132
+ let observed;
133
+ if (mode === 'percentage') {
134
+ if (ctx.tokenBudget == null) {
135
+ return {
136
+ condition_id: nodeId, condition_type: conditionType, passed: true,
137
+ observed_value: 0, expected_value: `${operator} ${expected}%`,
138
+ message: 'Token budget is unlimited -- percentage check passes',
139
+ };
140
+ }
141
+ if (ctx.tokenBudget === 0) {
142
+ // Zero budget means no tokens allowed -- usage is always 100%
143
+ observed = ctx.tokensUsed > 0 ? 100 : 0;
144
+ }
145
+ else {
146
+ observed = (ctx.tokensUsed / ctx.tokenBudget) * 100;
147
+ }
148
+ }
149
+ else {
150
+ observed = ctx.tokensUsed;
151
+ }
152
+ const passed = compareValues(observed, operator, expected);
153
+ const unit = mode === 'percentage' ? '%' : ' tokens';
154
+ return {
155
+ condition_id: nodeId, condition_type: conditionType, passed,
156
+ observed_value: Math.round(observed * 100) / 100,
157
+ expected_value: `${operator} ${expected}${unit}`,
158
+ message: passed
159
+ ? `Token usage (${Math.round(observed)}${unit}) satisfies ${operator} ${expected}${unit}`
160
+ : `Token usage (${Math.round(observed)}${unit}) does not satisfy ${operator} ${expected}${unit}`,
161
+ };
162
+ }
163
+ case 'work_unit_state': {
164
+ const statuses = expr.statuses;
165
+ if (!statuses || statuses.length === 0) {
166
+ return {
167
+ condition_id: nodeId, condition_type: conditionType, passed: false,
168
+ observed_value: null, expected_value: 'statuses required',
169
+ message: 'work_unit_state condition missing required statuses in expression',
170
+ };
171
+ }
172
+ const operator = expr.operator ?? 'eq';
173
+ const expected = toSafeNumber(expr.value);
174
+ if (expected === null) {
175
+ return {
176
+ condition_id: nodeId, condition_type: conditionType, passed: false,
177
+ observed_value: null, expected_value: 'value required',
178
+ message: 'work_unit_state condition missing or invalid value in expression',
179
+ };
180
+ }
181
+ const wuByStatus = ctx.workUnitsByStatus ?? {};
182
+ let observed = 0;
183
+ for (const status of statuses) {
184
+ observed += wuByStatus[status] ?? 0;
185
+ }
186
+ const passed = compareValues(observed, operator, expected);
187
+ return {
188
+ condition_id: nodeId, condition_type: conditionType, passed,
189
+ observed_value: observed, expected_value: `${operator} ${expected}`,
190
+ message: passed
191
+ ? `Work units in [${statuses.join(', ')}] (${observed}) satisfies ${operator} ${expected}`
192
+ : `Work units in [${statuses.join(', ')}] (${observed}) does not satisfy ${operator} ${expected}`,
193
+ };
194
+ }
195
+ case 'all_work_units_completed': {
196
+ const wuByStatus = ctx.workUnitsByStatus ?? {};
197
+ const total = ctx.totalWorkUnitCount ?? 0;
198
+ const completed = wuByStatus['completed'] ?? 0;
199
+ const passed = completed === total && total > 0;
200
+ return {
201
+ condition_id: nodeId, condition_type: conditionType, passed,
202
+ observed_value: completed, expected_value: total,
203
+ message: passed ? `All ${total} work units are completed`
204
+ : total === 0 ? 'No work units exist'
205
+ : `${completed} of ${total} work units are completed`,
206
+ };
207
+ }
208
+ case 'cycle_count': {
209
+ if (ctx.cycleCount === undefined) {
210
+ return {
211
+ condition_id: nodeId, condition_type: conditionType, passed: true,
212
+ observed_value: null, expected_value: null,
213
+ message: 'No factory context -- cycle_count skipped',
214
+ };
215
+ }
216
+ const operator = expr.operator ?? 'lt';
217
+ // Support dynamic values via value_from (reads from ctx.configValues)
218
+ const rawExpected = expr.value_from
219
+ ? (ctx.configValues?.[expr.value_from] ?? toSafeNumber(expr.value))
220
+ : toSafeNumber(expr.value);
221
+ if (rawExpected === null || rawExpected === undefined) {
222
+ return {
223
+ condition_id: nodeId, condition_type: conditionType, passed: false,
224
+ observed_value: ctx.cycleCount, expected_value: 'value required',
225
+ message: 'cycle_count condition missing or invalid value in expression',
226
+ };
227
+ }
228
+ const expected = rawExpected;
229
+ const passed = compareValues(ctx.cycleCount, operator, expected);
230
+ return {
231
+ condition_id: nodeId, condition_type: conditionType, passed,
232
+ observed_value: ctx.cycleCount, expected_value: `${operator} ${expected}`,
233
+ message: passed
234
+ ? `Cycle count (${ctx.cycleCount}) satisfies ${operator} ${expected}`
235
+ : `Cycle count (${ctx.cycleCount}) does not satisfy ${operator} ${expected}`,
236
+ };
237
+ }
238
+ case 'wall_clock': {
239
+ if (ctx.wallClockSeconds === undefined) {
240
+ return {
241
+ condition_id: nodeId, condition_type: conditionType, passed: true,
242
+ observed_value: null, expected_value: null,
243
+ message: 'No factory context -- wall_clock skipped',
244
+ };
245
+ }
246
+ const mode = expr.mode ?? 'percentage';
247
+ const operator = expr.operator ?? 'lt';
248
+ const expected = toSafeNumber(expr.value);
249
+ if (expected === null) {
250
+ return {
251
+ condition_id: nodeId, condition_type: conditionType, passed: false,
252
+ observed_value: ctx.wallClockSeconds, expected_value: 'value required',
253
+ message: 'wall_clock condition missing or invalid value in expression',
254
+ };
255
+ }
256
+ let observed;
257
+ if (mode === 'percentage') {
258
+ if (ctx.wallClockLimitSeconds == null) {
259
+ return {
260
+ condition_id: nodeId, condition_type: conditionType, passed: true,
261
+ observed_value: 0, expected_value: `${operator} ${expected}%`,
262
+ message: 'Wall clock limit is unlimited -- percentage check passes',
263
+ };
264
+ }
265
+ if (ctx.wallClockLimitSeconds === 0) {
266
+ // Zero time limit means no time allowed -- elapsed is always 100%
267
+ observed = ctx.wallClockSeconds > 0 ? 100 : 0;
268
+ }
269
+ else {
270
+ observed = (ctx.wallClockSeconds / ctx.wallClockLimitSeconds) * 100;
271
+ }
272
+ }
273
+ else {
274
+ observed = ctx.wallClockSeconds;
275
+ }
276
+ const passed = compareValues(observed, operator, expected);
277
+ const unit = mode === 'percentage' ? '%' : 's';
278
+ return {
279
+ condition_id: nodeId, condition_type: conditionType, passed,
280
+ observed_value: Math.round(observed * 100) / 100,
281
+ expected_value: `${operator} ${expected}${unit}`,
282
+ message: passed
283
+ ? `Wall clock (${Math.round(observed)}${unit}) satisfies ${operator} ${expected}${unit}`
284
+ : `Wall clock (${Math.round(observed)}${unit}) does not satisfy ${operator} ${expected}${unit}`,
285
+ };
286
+ }
287
+ default:
288
+ console.warn(`[guard] Unknown condition type "${conditionType}" -- blocking (possible misconfiguration)`);
289
+ return {
290
+ condition_id: nodeId, condition_type: conditionType, passed: false,
291
+ observed_value: null, expected_value: null,
292
+ message: `Unknown condition type "${conditionType}" -- blocked (unrecognized type)`,
293
+ };
294
+ }
295
+ }
296
+ // ============================================================================
297
+ // Condition tree evaluator
298
+ // ============================================================================
299
+ function evaluateConditionNode(node, ctx, details, nodeCounter) {
300
+ const children = node.children ?? [];
301
+ if (children.length > 0) {
302
+ const operator = node.logical_operator ?? 'AND';
303
+ const childResults = children.map(child => evaluateConditionNode(child, ctx, details, nodeCounter));
304
+ return operator === 'AND'
305
+ ? childResults.every(r => r)
306
+ : childResults.some(r => r);
307
+ }
308
+ const nodeId = `cond-${nodeCounter.value++}`;
309
+ const evalResult = evaluateLeafCondition(node, nodeId, ctx);
310
+ details.push(evalResult);
311
+ return evalResult.passed;
312
+ }
313
+ /**
314
+ * Evaluate a JSONB condition tree for a guard.
315
+ * Root-level nodes are combined with AND.
316
+ */
317
+ export function evaluateGuardConditionTree(conditions, ctx) {
318
+ if (conditions.length === 0) {
319
+ return { passed: true, details: [] };
320
+ }
321
+ const details = [];
322
+ const nodeCounter = { value: 0 };
323
+ const rootResults = conditions.map(node => evaluateConditionNode(node, ctx, details, nodeCounter));
324
+ const passed = rootResults.every(r => r);
325
+ return { passed, details };
326
+ }
327
+ // ============================================================================
328
+ // Factory evaluation context builder (pure)
329
+ // ============================================================================
330
+ /**
331
+ * Build factory evaluation context from in-memory state.
332
+ * Pure function -- no database queries.
333
+ */
334
+ export function buildFactoryEvaluationContext(params) {
335
+ const { instanceState, blueprint, workUnits, gateResults, strategyId } = params;
336
+ const workUnitsByStatus = {};
337
+ for (const wu of workUnits) {
338
+ workUnitsByStatus[wu.status] = (workUnitsByStatus[wu.status] ?? 0) + 1;
339
+ }
340
+ let wallClockSeconds = 0;
341
+ if (instanceState.wallClockStartedAt) {
342
+ wallClockSeconds = Math.floor((Date.now() - new Date(instanceState.wallClockStartedAt).getTime()) / 1000);
343
+ }
344
+ const wallClockLimitSeconds = blueprint.maxWallClockHours != null
345
+ ? blueprint.maxWallClockHours * 3600 : null;
346
+ const scopedGateResults = strategyId
347
+ ? gateResults.filter(r => r.strategyId === strategyId)
348
+ : gateResults;
349
+ // Build configValues for dynamic guard thresholds
350
+ const configValues = {};
351
+ if (blueprint.maxInstanceIterations != null) {
352
+ configValues.max_instance_iterations = blueprint.maxInstanceIterations;
353
+ }
354
+ return {
355
+ deliveryId: '',
356
+ openIssueCount: 0,
357
+ totalIssueCount: 0,
358
+ issuesByStatus: {},
359
+ issuesByPriority: {},
360
+ lastExitCode: 0,
361
+ sessionCount: 0,
362
+ gateResults: scopedGateResults,
363
+ tokensUsed: instanceState.tokensUsed,
364
+ tokenBudget: blueprint.maxTokenBudget,
365
+ workUnitsByStatus,
366
+ totalWorkUnitCount: workUnits.length,
367
+ cycleCount: instanceState.completionGateIterations,
368
+ wallClockSeconds,
369
+ wallClockLimitSeconds,
370
+ configValues,
371
+ };
372
+ }
373
+ // ============================================================================
374
+ // Template interpolation
375
+ // ============================================================================
376
+ /**
377
+ * Interpolate guard and factory template variables.
378
+ */
379
+ export function interpolateTemplate(template, evalResult, factoryCtx) {
380
+ if (!template)
381
+ return '';
382
+ let result = template;
383
+ if (evalResult) {
384
+ const conditionSummary = evalResult.condition_details
385
+ .filter(d => !d.passed)
386
+ .map(d => d.message)
387
+ .join('\n- ');
388
+ const observedValues = evalResult.condition_details
389
+ .map(d => `${d.condition_type}: ${String(d.observed_value)}`)
390
+ .join(', ');
391
+ result = result
392
+ .replace(/\{\{guard_name\}\}/g, evalResult.guard_name)
393
+ .replace(/\{\{policy_name\}\}/g, evalResult.guard_name)
394
+ .replace(/\{\{condition_summary\}\}/g, conditionSummary || 'No failed conditions')
395
+ .replace(/\{\{observed_values\}\}/g, observedValues || 'No values');
396
+ }
397
+ const fCtx = factoryCtx ?? {};
398
+ const MAX_GATE_OUTPUT = 2000;
399
+ const gateOutput = fCtx.gateOutput
400
+ ? (fCtx.gateOutput.length > MAX_GATE_OUTPUT
401
+ ? fCtx.gateOutput.slice(0, MAX_GATE_OUTPUT) + '... (truncated)'
402
+ : fCtx.gateOutput)
403
+ : '';
404
+ result = result
405
+ .replace(/\{\{instance_id\}\}/g, fCtx.instanceId ?? '')
406
+ .replace(/\{\{work_unit_title\}\}/g, fCtx.workUnitTitle ?? '')
407
+ .replace(/\{\{work_unit_description\}\}/g, fCtx.workUnitDescription ?? '')
408
+ .replace(/\{\{cycle_number\}\}/g, fCtx.cycleNumber != null ? String(fCtx.cycleNumber) : '')
409
+ .replace(/\{\{gate_type\}\}/g, fCtx.gateType ?? '')
410
+ .replace(/\{\{gate_output\}\}/g, gateOutput)
411
+ .replace(/\{\{tokens_used\}\}/g, fCtx.tokensUsed != null ? String(fCtx.tokensUsed) : '')
412
+ .replace(/\{\{token_budget\}\}/g, fCtx.tokenBudget != null ? String(fCtx.tokenBudget) : 'unlimited')
413
+ .replace(/\{\{wall_clock_elapsed\}\}/g, fCtx.wallClockElapsed ?? '');
414
+ return result;
415
+ }
416
+ //# sourceMappingURL=guard-evaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-evaluation.js","sourceRoot":"","sources":["../src/guard-evaluation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAAgB;IACzE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC;QACxC,KAAK,KAAK,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC;QACzC,KAAK,IAAI,CAAC,CAAC,OAAO,QAAQ,GAAG,QAAQ,CAAC;QACtC,KAAK,KAAK,CAAC,CAAC,OAAO,QAAQ,IAAI,QAAQ,CAAC;QACxC,KAAK,IAAI,CAAC,CAAC,OAAO,QAAQ,GAAG,QAAQ,CAAC;QACtC,KAAK,KAAK,CAAC,CAAC,OAAO,QAAQ,IAAI,QAAQ,CAAC;QACxC,OAAO,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,SAAS,qBAAqB,CAC5B,IAAwB,EACxB,MAAc,EACd,GAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC;IAEvD,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAiC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YAChG,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,QAAQ,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;gBACnE,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,sBAAsB,QAAQ,eAAe,QAAQ,IAAI,QAAQ,EAAE;oBACrE,CAAC,CAAC,sBAAsB,QAAQ,sBAAsB,QAAQ,IAAI,QAAQ,EAAE;aAC/E,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;YACnE,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC;gBACrD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,qBAAqB;oBACrC,CAAC,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,kCAAkC;wBAChE,CAAC,CAAC,GAAG,GAAG,CAAC,cAAc,wBAAwB;aAClD,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACnE,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;gBAC3E,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,oBAAoB,GAAG,CAAC,YAAY,eAAe,QAAQ,IAAI,QAAQ,EAAE;oBAC3E,CAAC,CAAC,oBAAoB,GAAG,CAAC,YAAY,sBAAsB,QAAQ,IAAI,QAAQ,EAAE;aACrF,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAA+B,CAAC;YACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,oBAAoB;oBAC1D,OAAO,EAAE,gEAAgE;iBAC1E,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAI,IAAI,CAAC,KAA4B,IAAI,UAAU,CAAC;YAC/D,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,aAAa,GAAI,IAAI,CAAC,KAA4B,IAAI,QAAQ,CAAC;YACrE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAiC,CAAC;YAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YACtC,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAC5D,IAAI,KAAK,KAAK,UAAU,IAAI,UAAU,EAAE,CAAC;gBACvC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,aAAa,EAAE;oBAC5E,OAAO,EAAE,wCAAwC,QAAQ,yBAAyB;iBACnF,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC1D,MAAM,MAAM,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC;YACtG,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,aAAa,EAAE;gBAC7E,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,QAAQ,QAAQ,YAAY,aAAa,eAAe,QAAQ,IAAI,aAAa,EAAE;oBACrF,CAAC,CAAC,QAAQ,QAAQ,YAAY,aAAa,sBAAsB,QAAQ,IAAI,aAAa,EAAE;aAC/F,CAAC;QACJ,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI;oBACjE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;oBAC1C,OAAO,EAAE,4CAA4C;iBACtD,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAI,IAAI,CAAC,IAA2B,IAAI,YAAY,CAAC;YAC/D,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,gBAAgB;oBAChE,OAAO,EAAE,+DAA+D;iBACzE,CAAC;YACJ,CAAC;YACD,IAAI,QAAgB,CAAC;YACrB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;oBAC5B,OAAO;wBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI;wBACjE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,GAAG;wBAC7D,OAAO,EAAE,sDAAsD;qBAChE,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;oBAC1B,8DAA8D;oBAC9D,QAAQ,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5B,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;gBAChD,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;gBAChD,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,eAAe,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;oBACzF,CAAC,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,sBAAsB,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;aACnG,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAgC,CAAC;YACvD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB;oBACzD,OAAO,EAAE,mEAAmE;iBAC7E,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB;oBACtD,OAAO,EAAE,kEAAkE;iBAC5E,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;YAC/C,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;gBACnE,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,kBAAkB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,eAAe,QAAQ,IAAI,QAAQ,EAAE;oBAC1F,CAAC,CAAC,kBAAkB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,sBAAsB,QAAQ,IAAI,QAAQ,EAAE;aACpG,CAAC;QACJ,CAAC;QAED,KAAK,0BAA0B,CAAC,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,SAAS,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;YAChD,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK;gBAChD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,2BAA2B;oBACvD,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB;wBACrC,CAAC,CAAC,GAAG,SAAS,OAAO,KAAK,2BAA2B;aACxD,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI;oBACjE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;oBAC1C,OAAO,EAAE,2CAA2C;iBACrD,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,sEAAsE;YACtE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU;gBACjC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,UAAoB,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7E,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,gBAAgB;oBAChE,OAAO,EAAE,8DAA8D;iBACxE,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,WAAW,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjE,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;gBACzE,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,gBAAgB,GAAG,CAAC,UAAU,eAAe,QAAQ,IAAI,QAAQ,EAAE;oBACrE,CAAC,CAAC,gBAAgB,GAAG,CAAC,UAAU,sBAAsB,QAAQ,IAAI,QAAQ,EAAE;aAC/E,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,GAAG,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI;oBACjE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;oBAC1C,OAAO,EAAE,0CAA0C;iBACpD,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAI,IAAI,CAAC,IAA2B,IAAI,YAAY,CAAC;YAC/D,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA+B,IAAI,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO;oBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;oBAClE,cAAc,EAAE,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE,gBAAgB;oBACtE,OAAO,EAAE,6DAA6D;iBACvE,CAAC;YACJ,CAAC;YACD,IAAI,QAAgB,CAAC;YACrB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,qBAAqB,IAAI,IAAI,EAAE,CAAC;oBACtC,OAAO;wBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI;wBACjE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,GAAG;wBAC7D,OAAO,EAAE,0DAA0D;qBACpE,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,CAAC,qBAAqB,KAAK,CAAC,EAAE,CAAC;oBACpC,kEAAkE;oBAClE,QAAQ,GAAG,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC;gBACtE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAClC,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/C,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM;gBAC3D,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;gBAChD,cAAc,EAAE,GAAG,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;gBAChD,OAAO,EAAE,MAAM;oBACb,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,eAAe,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;oBACxF,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,sBAAsB,QAAQ,IAAI,QAAQ,GAAG,IAAI,EAAE;aAClG,CAAC;QACJ,CAAC;QAED;YACE,OAAO,CAAC,IAAI,CAAC,mCAAmC,aAAa,2CAA2C,CAAC,CAAC;YAC1G,OAAO;gBACL,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK;gBAClE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;gBAC1C,OAAO,EAAE,2BAA2B,aAAa,kCAAkC;aACpF,CAAC;IACN,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,SAAS,qBAAqB,CAC5B,IAAwB,EACxB,GAAsB,EACtB,OAA8B,EAC9B,WAA8B;IAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACxC,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CACxD,CAAC;QACF,OAAO,QAAQ,KAAK,KAAK;YACvB,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAgC,EAChC,GAAsB;IAEtB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACxC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CACvD,CAAC;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAe7C;IACC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEhF,MAAM,iBAAiB,GAA2B,EAAE,CAAC;IACrD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,iBAAiB,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACrC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAC3B,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,qBAAqB,GAAG,SAAS,CAAC,iBAAiB,IAAI,IAAI;QAC/D,CAAC,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9C,MAAM,iBAAiB,GAAG,UAAU;QAClC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;QACtD,CAAC,CAAC,WAAW,CAAC;IAEhB,kDAAkD;IAClD,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,IAAI,SAAS,CAAC,qBAAqB,IAAI,IAAI,EAAE,CAAC;QAC5C,YAAY,CAAC,uBAAuB,GAAG,SAAS,CAAC,qBAAqB,CAAC;IACzE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,EAAE;QACd,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,EAAE;QAClB,gBAAgB,EAAE,EAAE;QACpB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,iBAAiB;QAC9B,UAAU,EAAE,aAAa,CAAC,UAAU;QACpC,WAAW,EAAE,SAAS,CAAC,cAAc;QACrC,iBAAiB;QACjB,kBAAkB,EAAE,SAAS,CAAC,MAAM;QACpC,UAAU,EAAE,aAAa,CAAC,wBAAwB;QAClD,gBAAgB;QAChB,qBAAqB;QACrB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAuB,EACvB,UAAkC,EAClC,UAA0C;IAE1C,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,gBAAgB,GAAG,UAAU,CAAC,iBAAiB;aAClD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACnB,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,cAAc,GAAG,UAAU,CAAC,iBAAiB;aAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;aAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,GAAG,MAAM;aACZ,OAAO,CAAC,qBAAqB,EAAE,UAAU,CAAC,UAAU,CAAC;aACrD,OAAO,CAAC,sBAAsB,EAAE,UAAU,CAAC,UAAU,CAAC;aACtD,OAAO,CAAC,4BAA4B,EAAE,gBAAgB,IAAI,sBAAsB,CAAC;aACjF,OAAO,CAAC,0BAA0B,EAAE,cAAc,IAAI,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,IAAI,EAAE,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;QAChC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,eAAe;YACzC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,iBAAiB;YAC/D,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACpB,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,GAAG,MAAM;SACZ,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;SACtD,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;SAC7D,OAAO,CAAC,gCAAgC,EAAE,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC;SACzE,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1F,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;SAClD,OAAO,CAAC,sBAAsB,EAAE,UAAU,CAAC;SAC3C,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;SACnG,OAAO,CAAC,6BAA6B,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAEvE,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @telora/factory -- library barrel export.
3
+ *
4
+ * The factory engine is managed by the unified daemon process shell.
5
+ * This module re-exports the public API that the daemon and other
6
+ * consumers need to drive the factory engine.
7
+ */
8
+ export { FactoryEngine } from './factory-engine.js';
9
+ export { startPollLoop, stopPollLoop, getActiveInstances, setShuttingDown, setFactoryGovernor, handleInstanceFailure, } from './instance-lifecycle.js';
10
+ export { recoverFromCrash } from './crash-recovery.js';
11
+ export type { RecoveryResult, RecoveryAction, OrphanedWorktree } from './crash-recovery.js';
12
+ export { initApiClient, validateTrackerAuth } from './queries/shared.js';
13
+ export { validateConfig } from './config.js';
14
+ export { configForFactoryProduct, findFactoryProduct } from './product-config.js';
15
+ export { findReadyWorkUnits } from './execution.js';
16
+ export type { StrategyDependencyMap } from './execution.js';
17
+ export { evaluateStrategyGates } from './strategy-gating.js';
18
+ export { cleanupAdversaryTestDir, getAdversaryTestDir } from './gates/adversarial.js';
19
+ export { spawnUnitSession, terminateUnitSession, terminateAllUnits, shouldResumeSession, validateSessionForResume } from './unit-session.js';
20
+ export type { UnitStrategyContext } from './unit-session.js';
21
+ export { McpAdapter } from './session-adapter.js';
22
+ export type { SessionCommunicationAdapter } from './session-adapter.js';
23
+ export { initializeExecutionUnits, restoreExecutionUnits } from './execution-unit-init.js';
24
+ export { computeAssignments, runSchedulerCycle, createSchedulerDeps } from './scheduler.js';
25
+ export type { SchedulerStrategy, SchedulerUnit, SchedulerAssignment, SchedulerDeps, SchedulerCycleResult } from './scheduler.js';
26
+ export { collectMetrics, DEFAULT_METRICS, type PipelineExecutionMetrics, type MetricCollectorInput, } from './pipeline-metrics.js';
27
+ export { evaluateCondition, findNextNode, isTerminalNode, findEntryNode, } from './pipeline-evaluator.js';
28
+ export { advancePipeline, getNodeLabel, usesPipeline, type PipelineAdvanceResult, } from './pipeline-traversal.js';
29
+ export type { FactoryConfig, FactoryTelemetryConfig, FactoryInstanceState, FactoryInstance, FactoryBlueprint, FactoryWorkUnit, FactoryGateResult, FactorySession, FactoryCompletionReport, InstanceStatus, WorkUnitStatus, GateType, SessionType, FactorySessionStatus, BuilderState, ExecutionUnitState, ExecutionUnitStatus, ExecutionUnit, ExecutionUnitConfig, AdversaryState, GateRunState, GateCheckResult, WorkPlan, WorkPlanUnit, AuditReport, AuditEntry, AuditConflict, CompletionGateResult, CompletionGap, FactoryCycleEvaluation, DimensionScore, SpecQualityAssessment, StrategyScore, StrategyDesignAssessment, ExecutionMetrics, TraceCheckType, TraceCheckConfig, TraceCheck, TraceMiss, TraceResult, SpecType, ResolvedFactoryWorkflow, WorkflowStage, WorkflowTransition, WorkflowGuard, WorkflowTrigger, TransitionGuardResult, GuardEvalResult, ConditionEvalResult, GuardConditionNode, GuardEnforcement, TriggerEvent, TriggerActionType, DecisionPath, EvaluationContext, FactoryTemplateContext, TriggerExecutionTarget, ContextDirective, ContextOperation, ContextPayload, ContextOperationResult, ContextManager, ContextContractItem, DeterministicGateConfig, BehavioralGateConfig, AdversarialGateConfig, TransitionEvaluationRecord, PipelineGraph, PipelineNode, PipelineEdge, EdgeCondition, } from './types.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @telora/factory -- library barrel export.
3
+ *
4
+ * The factory engine is managed by the unified daemon process shell.
5
+ * This module re-exports the public API that the daemon and other
6
+ * consumers need to drive the factory engine.
7
+ */
8
+ // Engine adapter (ExecutionEngine implementation)
9
+ export { FactoryEngine } from './factory-engine.js';
10
+ // Instance lifecycle (poll loop control)
11
+ export { startPollLoop, stopPollLoop, getActiveInstances, setShuttingDown, setFactoryGovernor, handleInstanceFailure, } from './instance-lifecycle.js';
12
+ // Crash recovery
13
+ export { recoverFromCrash } from './crash-recovery.js';
14
+ // API client initialization
15
+ export { initApiClient, validateTrackerAuth } from './queries/shared.js';
16
+ // Configuration validation (daemon constructs FactoryConfig, factory validates it)
17
+ export { validateConfig } from './config.js';
18
+ export { configForFactoryProduct, findFactoryProduct } from './product-config.js';
19
+ // Execution helpers
20
+ export { findReadyWorkUnits } from './execution.js';
21
+ // Strategy gate evaluation
22
+ export { evaluateStrategyGates } from './strategy-gating.js';
23
+ // Adversarial test isolation
24
+ export { cleanupAdversaryTestDir, getAdversaryTestDir } from './gates/adversarial.js';
25
+ // Unit session lifecycle (per-execution-unit session management)
26
+ export { spawnUnitSession, terminateUnitSession, terminateAllUnits, shouldResumeSession, validateSessionForResume } from './unit-session.js';
27
+ // Session communication adapter
28
+ export { McpAdapter } from './session-adapter.js';
29
+ // Execution unit initialization
30
+ export { initializeExecutionUnits, restoreExecutionUnits } from './execution-unit-init.js';
31
+ // DAG-aware scheduler
32
+ export { computeAssignments, runSchedulerCycle, createSchedulerDeps } from './scheduler.js';
33
+ // Pipeline metrics collector
34
+ export { collectMetrics, DEFAULT_METRICS, } from './pipeline-metrics.js';
35
+ // Pipeline condition evaluator
36
+ export { evaluateCondition, findNextNode, isTerminalNode, findEntryNode, } from './pipeline-evaluator.js';
37
+ // Pipeline traversal (node advance logic)
38
+ export { advancePipeline, getNodeLabel, usesPipeline, } from './pipeline-traversal.js';
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kDAAkD;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,yCAAyC;AACzC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,mFAAmF;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAElF,oBAAoB;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,6BAA6B;AAC7B,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAG7I,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,gCAAgC;AAChC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAE3F,sBAAsB;AACtB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG5F,6BAA6B;AAC7B,OAAO,EACL,cAAc,EACd,eAAe,GAGhB,MAAM,uBAAuB,CAAC;AAE/B,+BAA+B;AAC/B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,0CAA0C;AAC1C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,YAAY,GAEb,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Factory instance completion detection and gap evaluation.
3
+ *
4
+ * Handles the checkInstanceCompletion flow (strategy-level terminal detection,
5
+ * pipeline advance logic) and the runCompletionSequence flow (completion gate,
6
+ * report generation, finalization).
7
+ *
8
+ * Imports from instance-state-machine (leaf) but NOT from instance-poll-loop
9
+ * or instance-phase-dispatch, so no circular dependencies.
10
+ */
11
+ import type { ResourceGovernor } from '@telora/daemon-core';
12
+ import type { FactoryConfig, FactoryInstanceState } from './types.js';
13
+ /**
14
+ * Detect strategies where all work units have reached a terminal state.
15
+ *
16
+ * For each in_progress or gate_fix_pending strategy, if all its work units
17
+ * are completed or failed, transition the strategy to the appropriate next state.
18
+ */
19
+ export declare function detectStrategyCompletion(state: FactoryInstanceState): Promise<void>;
20
+ /**
21
+ * Check whether the instance has completed (all strategies terminal).
22
+ *
23
+ * If all strategies are completed or failed, finalize the instance.
24
+ * Uses strategy-level completion (not work-unit level) for DAG-aware instances.
25
+ *
26
+ * The `runDesigningFn` and `runPlanningFn` callbacks allow the poll loop
27
+ * to inject the phase dispatch functions without creating a circular import.
28
+ */
29
+ export declare function checkInstanceCompletion(state: FactoryInstanceState, config: FactoryConfig | null, runDesigningFn: (s: FactoryInstanceState) => Promise<void>, runPlanningFn: (s: FactoryInstanceState) => Promise<void>): Promise<void>;
30
+ /**
31
+ * Run the completion sequence: completion gate, report, workflow transition.
32
+ */
33
+ export declare function runCompletionSequence(state: FactoryInstanceState, config: FactoryConfig | null, governor?: ResourceGovernor | null): Promise<void>;
34
+ //# sourceMappingURL=instance-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-completion.d.ts","sourceRoot":"","sources":["../src/instance-completion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAiCpB;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzF;AAMD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,cAAc,EAAE,CAAC,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1D,aAAa,EAAE,CAAC,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,GACxD,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAkJD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC,CAyIf"}