infinity-harness 2.8.9 → 2.8.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. package/src/ui/wizard.ts +10 -5
@@ -0,0 +1,309 @@
1
+ /**
2
+ * infinity-harness — the brief.
3
+ *
4
+ * The brief answers one question: "what do I do right now?" It is injected at
5
+ * session start and after every phase change, so it has to be complete enough
6
+ * that an agent needs no other context, and short enough that it does not
7
+ * crowd out the work. Everything in it is derived from state on disk — the
8
+ * brief never invents a plan.
9
+ */
10
+ import { PHASE_ROLE } from "./types.js";
11
+ import { loadConfig, getRetryConfig, isRetryExhausted } from "./config.js";
12
+ import { loadFeatureList, computeProgress, nextActionableTask, findFeature, flattenTasks, } from "./featureList.js";
13
+ import { runChecks } from "./gates.js";
14
+ import { getPhaseOrder, nextPhase, isFinalPhase } from "./phases.js";
15
+ import * as P from "./paths.js";
16
+ import { readText } from "./fsx.js";
17
+ import { loadSkills, matchSkills } from "./skills.js";
18
+ /**
19
+ * What the agent calls to have its work judged.
20
+ *
21
+ * This said `harness validate` for a long time — a command line that has not
22
+ * existed since the CLI was ported into `src/`. A brief that ends by telling
23
+ * the model to run a command that does not exist is a brief that ends in a
24
+ * failed shell call and a confused retry, every single turn.
25
+ */
26
+ const VALIDATE_TOOL = "infinity_validate";
27
+ /**
28
+ * Two is the number that gets read. One hides a better match; five is a
29
+ * reading list, and a reading list is a thing you skip.
30
+ */
31
+ const SKILL_SUGGESTIONS = 2;
32
+ const PHASE_INTENT = {
33
+ init: "Set up the project skeleton and confirm the harness can see it.",
34
+ research: "Find out what this actually has to be. Prior art, constraints, options with costs, a recommendation, and the questions only the human can answer. Write harness/docs/RESEARCH.md. No code.",
35
+ define: "Write down what is being built and how you will know it is done. Acceptance criteria per feature.",
36
+ plan: "Break each feature into ordered, dependency-aware tasks. No code yet.",
37
+ build: "Implement the current task. One task at a time, tests alongside.",
38
+ verify: "Prove the work behaves. Run the suite, look for what the tests do not cover.",
39
+ simplify: "Delete more than you add. Collapse duplication, drop dead paths.",
40
+ review: "Judge this as if someone else wrote it. Score it against the rubric.",
41
+ ship: "Tag, changelog, and leave the tree clean.",
42
+ };
43
+ export async function buildBrief(targetDir, options = {}) {
44
+ const { config, ok } = loadConfig(targetDir);
45
+ const { list } = loadFeatureList(targetDir);
46
+ const progress = computeProgress(list);
47
+ const phase = config.currentPhase;
48
+ const role = phase ? PHASE_ROLE[phase] : null;
49
+ const notes = [];
50
+ if (!ok)
51
+ notes.push("harness/config.json is missing or unreadable — run init.");
52
+ // The human rejected this phase and said why. Repeating the phase without
53
+ // repeating their words produces the same output and the same rejection.
54
+ if (phase) {
55
+ const rejections = rejectionNotes(config, phase);
56
+ const last = rejections[rejections.length - 1];
57
+ if (last) {
58
+ notes.push(`A human reviewed ${phase.toUpperCase()} and sent it back. Address this before validating again: ${last.note}`);
59
+ }
60
+ }
61
+ if (config.awaitingApproval) {
62
+ notes.push(`${String(config.awaitingApproval).toUpperCase()} is waiting for a human signature. ` +
63
+ "Do not start the next phase — stop and let them answer.");
64
+ }
65
+ const phaseTask = phase ? nextActionableTask(list, phase) : null;
66
+ const nextTask = phaseTask ?? nextActionableTask(list);
67
+ const feature = nextTask ? findFeature(list, nextTask.featureId) : null;
68
+ let gate = null;
69
+ if (options.includeGate && phase) {
70
+ gate = await runChecks(targetDir, phase, { record: false });
71
+ }
72
+ const retry = getRetryConfig(config);
73
+ const exhausted = isRetryExhausted(config);
74
+ if (exhausted.exhausted) {
75
+ notes.push(`Retry budget for ${exhausted.which} is exhausted. Stop and escalate to the human rather than retrying again.`);
76
+ }
77
+ const blockedTasks = flattenTasks(list).filter((t) => t.status === "blocked");
78
+ if (blockedTasks.length > 0) {
79
+ notes.push(`${blockedTasks.length} task(s) are blocked: ${blockedTasks.map((t) => t.compositeKey).join(", ")}`);
80
+ }
81
+ // A second pass at a goal is not the same as a first pass at one, and the
82
+ // agent has no way to tell unless the brief says so. Without this the model
83
+ // re-plans from scratch and rebuilds what the last review already accepted.
84
+ const remaining = Array.isArray(config.remainingWork)
85
+ ? config.remainingWork.filter((w) => typeof w === "string" && w.trim() !== "")
86
+ : [];
87
+ if (remaining.length > 0) {
88
+ const pass = typeof config.goalPass === "number" ? `pass ${config.goalPass}` : "this pass";
89
+ notes.push(`The goal was reviewed and judged not yet met. ${remaining.length} item(s) remain for ${pass} — ` +
90
+ `plan for these, not for the whole goal again: ${remaining.join("; ")}`);
91
+ }
92
+ const complete = isFinalPhase(phase, config.phases?.enabled) && progress.tasksDone === progress.tasksTotal;
93
+ return {
94
+ phase,
95
+ role,
96
+ paused: Boolean(config.paused),
97
+ complete,
98
+ // The plan's goal is what the agent wrote down; the intake brief is what
99
+ // the human actually said. Before a plan exists, the second is all there
100
+ // is — and a run that starts with neither invents its own scope, which is
101
+ // exactly the failure this field was added to stop.
102
+ goal: (list.goals ?? [])[0]?.title ?? intakeBrief(config),
103
+ feature: feature ? { id: feature.id, name: feature.name } : null,
104
+ task: nextTask
105
+ ? {
106
+ id: nextTask.id,
107
+ key: nextTask.compositeKey,
108
+ description: nextTask.description,
109
+ status: nextTask.status,
110
+ }
111
+ : null,
112
+ criteria: collectCriteria(feature, nextTask?.criteria),
113
+ validateCommand: VALIDATE_TOOL,
114
+ gate,
115
+ progress: {
116
+ tasksDone: progress.tasksDone,
117
+ tasksTotal: progress.tasksTotal,
118
+ featuresDone: progress.featuresDone,
119
+ featuresTotal: progress.featuresTotal,
120
+ },
121
+ retries: {
122
+ task: config.taskRetryCount ?? 0,
123
+ feature: config.featureRetryCount ?? 0,
124
+ phase: config.phaseRetryCount ?? 0,
125
+ max: retry.tasks.max,
126
+ },
127
+ skills: suggestSkills(phase, {
128
+ goal: (list.goals ?? [])[0]?.title ?? intakeBrief(config),
129
+ feature: feature?.name ?? null,
130
+ task: nextTask?.description ?? null,
131
+ criteria: collectCriteria(feature, nextTask?.criteria),
132
+ }),
133
+ notes,
134
+ };
135
+ }
136
+ /**
137
+ * Which craft skills to point at, given what is being worked on.
138
+ *
139
+ * The skills ship with the package, so this works in an install with no
140
+ * project-level setup. If they are missing — someone vendored `src/` alone —
141
+ * the brief simply has no SKILLS section rather than failing to build.
142
+ */
143
+ function suggestSkills(phase, work) {
144
+ const text = [work.task, work.feature, work.goal, ...work.criteria].filter(Boolean).join(" \n ");
145
+ try {
146
+ return matchSkills(loadSkills(), { phase, text, limit: SKILL_SUGGESTIONS }).map((m) => ({
147
+ name: m.skill.name,
148
+ description: m.skill.description,
149
+ why: m.why,
150
+ }));
151
+ }
152
+ catch {
153
+ return [];
154
+ }
155
+ }
156
+ /**
157
+ * Notes a human left when they sent a phase back.
158
+ *
159
+ * Read here rather than imported from `src/approval.ts` on purpose: `core/`
160
+ * owns the config file format and must not depend on the layer above it.
161
+ */
162
+ function rejectionNotes(config, phase) {
163
+ const raw = Array.isArray(config.approvalNotes) ? config.approvalNotes : [];
164
+ return raw.filter((n) => typeof n === "object" &&
165
+ n !== null &&
166
+ n.phase === phase &&
167
+ typeof n.note === "string");
168
+ }
169
+ /** What the human typed into the start-up wizard, if anything. */
170
+ function intakeBrief(config) {
171
+ const intake = config.intake;
172
+ const brief = intake?.brief;
173
+ return typeof brief === "string" && brief.trim() ? brief.trim() : null;
174
+ }
175
+ function collectCriteria(feature, taskCriteria) {
176
+ const out = [];
177
+ if (Array.isArray(taskCriteria))
178
+ out.push(...taskCriteria);
179
+ if (out.length === 0 && Array.isArray(feature?.criteria))
180
+ out.push(...feature.criteria);
181
+ return out;
182
+ }
183
+ // ── Rendering ───────────────────────────────────────────────────────────────
184
+ const RULE = "─".repeat(64);
185
+ /**
186
+ * Render the brief as the text injected into the agent's context.
187
+ * Deliberately plain: this is read by a model, not a terminal, so it carries
188
+ * no colour and no box drawing that would waste tokens.
189
+ */
190
+ export function renderBrief(brief, config) {
191
+ const L = [];
192
+ const phase = (brief.phase ?? "not started").toUpperCase();
193
+ if (brief.paused) {
194
+ L.push("HARNESS PAUSED");
195
+ L.push("");
196
+ L.push("The pipeline is paused. Do not continue autonomously — tell the human and stop.");
197
+ return L.join("\n");
198
+ }
199
+ if (brief.complete) {
200
+ L.push("PIPELINE COMPLETE");
201
+ L.push("");
202
+ L.push(`All ${brief.progress.tasksTotal} task(s) across ${brief.progress.featuresTotal} feature(s) are done`);
203
+ L.push("and the final phase has passed. Report to the human; do not start new work.");
204
+ return L.join("\n");
205
+ }
206
+ L.push(RULE);
207
+ const head = [`NEXT STEP · ${phase}`];
208
+ if (brief.feature)
209
+ head.push(brief.feature.id);
210
+ if (brief.task)
211
+ head.push(brief.task.key);
212
+ L.push(head.join(" · "));
213
+ L.push(RULE);
214
+ L.push("");
215
+ if (brief.goal) {
216
+ L.push(`GOAL ${brief.goal}`);
217
+ }
218
+ if (brief.role) {
219
+ L.push(`ROLE ${brief.role} — ${PHASE_INTENT[brief.phase]}`);
220
+ }
221
+ if (brief.feature) {
222
+ L.push(`FEATURE ${brief.feature.id} · ${brief.feature.name}`);
223
+ }
224
+ if (brief.task) {
225
+ L.push(`TASK ${brief.task.key} [${brief.task.status}]`);
226
+ L.push(` ${brief.task.description}`);
227
+ }
228
+ else {
229
+ L.push("TASK (none actionable — every remaining task is blocked or the plan is empty)");
230
+ }
231
+ L.push("");
232
+ L.push(`PROGRESS ${brief.progress.tasksDone}/${brief.progress.tasksTotal} tasks · ` +
233
+ `${brief.progress.featuresDone}/${brief.progress.featuresTotal} features · ` +
234
+ `retries ${brief.retries.task}/${brief.retries.max}`);
235
+ if (config) {
236
+ const order = getPhaseOrder(config.phases?.enabled);
237
+ const marked = order
238
+ .map((p) => (p === brief.phase ? `[${p.toUpperCase()}]` : p))
239
+ .join(" → ");
240
+ L.push(`PIPELINE ${marked}`);
241
+ }
242
+ if (brief.criteria.length) {
243
+ L.push("");
244
+ L.push("ACCEPTANCE CRITERIA");
245
+ for (const c of brief.criteria)
246
+ L.push(` - ${c}`);
247
+ }
248
+ if (brief.skills.length) {
249
+ L.push("");
250
+ L.push("SKILLS read before you start — invoke by name");
251
+ for (const s of brief.skills) {
252
+ L.push(` - ${s.name} — ${s.description}`);
253
+ if (s.why)
254
+ L.push(` (${s.why})`);
255
+ }
256
+ }
257
+ if (brief.gate) {
258
+ L.push("");
259
+ L.push(`GATE ${brief.gate.overall ? "PASS" : "FAIL"}`);
260
+ for (const c of brief.gate.checks) {
261
+ const mark = c.advisory ? "·" : c.pass ? "+" : "x";
262
+ L.push(` ${mark} ${c.name}: ${c.detail}`);
263
+ }
264
+ }
265
+ if (brief.notes.length) {
266
+ L.push("");
267
+ L.push("ATTENTION");
268
+ for (const n of brief.notes)
269
+ L.push(` ! ${n}`);
270
+ }
271
+ L.push("");
272
+ L.push("THE LOOP");
273
+ L.push(" 1. Do the work described above.");
274
+ L.push(` 2. Call the ${brief.validateCommand} tool (a human types /infinity:validate).`);
275
+ L.push(" 3. FAIL → fix the listed checks and validate again.");
276
+ L.push(" 4. PASS → the harness advances the phase and issues the next brief.");
277
+ L.push("");
278
+ L.push("Do not edit harness/config.json by hand and do not mark your own work complete.");
279
+ L.push("The gate is the only referee.");
280
+ return L.join("\n");
281
+ }
282
+ /** One-line status suitable for a status bar. */
283
+ export function renderBriefLine(brief) {
284
+ if (brief.paused)
285
+ return "paused";
286
+ if (brief.complete)
287
+ return "complete";
288
+ const bits = [brief.phase ?? "—"];
289
+ if (brief.task)
290
+ bits.push(brief.task.key);
291
+ bits.push(`${brief.progress.tasksDone}/${brief.progress.tasksTotal}`);
292
+ return bits.join(" · ");
293
+ }
294
+ /** Phase doc + craft skill the brief points at, when present in the project. */
295
+ export function referencedDocs(targetDir, phase) {
296
+ if (!phase)
297
+ return [];
298
+ const out = [];
299
+ const pd = P.phaseDocPath(targetDir, phase);
300
+ if (readText(pd) !== null)
301
+ out.push(pd);
302
+ const role = PHASE_ROLE[phase];
303
+ const ad = P.agentDocPath(targetDir, role);
304
+ if (readText(ad) !== null)
305
+ out.push(ad);
306
+ return out;
307
+ }
308
+ export { nextPhase };
309
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../../src/core/brief.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAE1C;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,YAAY,GAA0B;IAC1C,IAAI,EAAE,iEAAiE;IACvE,QAAQ,EACN,4LAA4L;IAC9L,MAAM,EAAE,mGAAmG;IAC3G,IAAI,EAAE,uEAAuE;IAC7E,KAAK,EAAE,kEAAkE;IACzE,MAAM,EAAE,8EAA8E;IACtF,QAAQ,EAAE,kEAAkE;IAC5E,MAAM,EAAE,sEAAsE;IAC9E,IAAI,EAAE,2CAA2C;CAClD,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,UAA6B,EAAE;IACjF,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAEhF,0EAA0E;IAC1E,yEAAyE;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CACR,oBAAoB,KAAK,CAAC,WAAW,EAAE,4DAA4D,IAAI,CAAC,IAAI,EAAE,CAC/G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,qCAAqC;YACnF,yDAAyD,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,IAAI,IAAI,GAAsB,IAAI,CAAC;IACnC,IAAI,OAAO,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC;QACjC,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,oBAAoB,SAAS,CAAC,KAAK,2EAA2E,CAC/G,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,yBAAyB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;QACnD,CAAC,CAAE,MAAM,CAAC,aAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QAC1G,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3F,KAAK,CAAC,IAAI,CACR,iDAAiD,SAAS,CAAC,MAAM,uBAAuB,IAAI,KAAK;YAC/F,iDAAiD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,UAAU,CAAC;IAE3G,OAAO;QACL,KAAK;QACL,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9B,QAAQ;QACR,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,oDAAoD;QACpD,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC;QACzD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QAChE,IAAI,EAAE,QAAQ;YACZ,CAAC,CAAC;gBACE,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,GAAG,EAAE,QAAQ,CAAC,YAAY;gBAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB;YACH,CAAC,CAAC,IAAI;QACR,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACtD,eAAe,EAAE,aAAa;QAC9B,IAAI;QACJ,QAAQ,EAAE;YACR,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;SACtC;QACD,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,iBAAiB,IAAI,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,eAAe,IAAI,CAAC;YAClC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;SACrB;QACD,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE;YAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;YAC9B,IAAI,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI;YACnC,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;SACvD,CAAC;QACF,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CACpB,KAAmB,EACnB,IAA8F;IAE9F,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjG,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;YAClB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW;YAChC,GAAG,EAAE,CAAC,CAAC,GAAG;SACX,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,MAAqB,EAAE,KAAY;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,CAAC,EAAwC,EAAE,CAC1C,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACT,CAAyB,CAAC,KAAK,KAAK,KAAK;QAC1C,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ,CACrD,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,SAAS,WAAW,CAAC,MAAqB;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAyC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CACtB,OAAuC,EACvC,YAAkC;IAElC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAE/E,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,MAAsB;IAC9D,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC1F,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,mBAAmB,KAAK,CAAC,QAAQ,CAAC,aAAa,sBAAsB,CAAC,CAAC;QAC9G,CAAC,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QACtF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,IAAI,GAAG,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,MAAM,YAAY,CAAC,KAAK,CAAC,KAAM,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAC9F,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,CAAC,CAAC,IAAI,CACJ,YAAY,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,WAAW;QAC1E,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,cAAc;QAC5E,WAAW,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CACvD,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,KAAK;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5D,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;YAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,GAAG;gBAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK;YAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnB,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,eAAe,2CAA2C,CAAC,CAAC;IAC1F,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IAChE,CAAC,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAChF,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,CAAC,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC1F,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAExC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAmB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,EAAE,CAAC,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,EAAE,CAAC,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}