@haoyiyin/workflow 0.2.0

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 (223) hide show
  1. package/README.md +168 -0
  2. package/SETUP.md +71 -0
  3. package/SKILL.md +68 -0
  4. package/USAGE.md +152 -0
  5. package/dist/bin/yi-workflow.d.ts +3 -0
  6. package/dist/bin/yi-workflow.d.ts.map +1 -0
  7. package/dist/bin/yi-workflow.js +39 -0
  8. package/dist/bin/yi-workflow.js.map +1 -0
  9. package/dist/src/agents/contracts.d.ts +120 -0
  10. package/dist/src/agents/contracts.d.ts.map +1 -0
  11. package/dist/src/agents/contracts.js +431 -0
  12. package/dist/src/agents/contracts.js.map +1 -0
  13. package/dist/src/agents/dispatcher-enhanced.d.ts +68 -0
  14. package/dist/src/agents/dispatcher-enhanced.d.ts.map +1 -0
  15. package/dist/src/agents/dispatcher-enhanced.js +290 -0
  16. package/dist/src/agents/dispatcher-enhanced.js.map +1 -0
  17. package/dist/src/agents/dispatcher.d.ts +107 -0
  18. package/dist/src/agents/dispatcher.d.ts.map +1 -0
  19. package/dist/src/agents/dispatcher.js +454 -0
  20. package/dist/src/agents/dispatcher.js.map +1 -0
  21. package/dist/src/agents/index.d.ts +11 -0
  22. package/dist/src/agents/index.d.ts.map +1 -0
  23. package/dist/src/agents/index.js +10 -0
  24. package/dist/src/agents/index.js.map +1 -0
  25. package/dist/src/agents/resilience.d.ts +86 -0
  26. package/dist/src/agents/resilience.d.ts.map +1 -0
  27. package/dist/src/agents/resilience.js +183 -0
  28. package/dist/src/agents/resilience.js.map +1 -0
  29. package/dist/src/agents/token-budget.d.ts +47 -0
  30. package/dist/src/agents/token-budget.d.ts.map +1 -0
  31. package/dist/src/agents/token-budget.js +63 -0
  32. package/dist/src/agents/token-budget.js.map +1 -0
  33. package/dist/src/agents/types.d.ts +59 -0
  34. package/dist/src/agents/types.d.ts.map +1 -0
  35. package/dist/src/agents/types.js +5 -0
  36. package/dist/src/agents/types.js.map +1 -0
  37. package/dist/src/guard/main-agent.d.ts +72 -0
  38. package/dist/src/guard/main-agent.d.ts.map +1 -0
  39. package/dist/src/guard/main-agent.js +184 -0
  40. package/dist/src/guard/main-agent.js.map +1 -0
  41. package/dist/src/hooks/builtin/index.d.ts +9 -0
  42. package/dist/src/hooks/builtin/index.d.ts.map +1 -0
  43. package/dist/src/hooks/builtin/index.js +9 -0
  44. package/dist/src/hooks/builtin/index.js.map +1 -0
  45. package/dist/src/hooks/builtin/on-error.d.ts +7 -0
  46. package/dist/src/hooks/builtin/on-error.d.ts.map +1 -0
  47. package/dist/src/hooks/builtin/on-error.js +15 -0
  48. package/dist/src/hooks/builtin/on-error.js.map +1 -0
  49. package/dist/src/hooks/builtin/post-execute.d.ts +7 -0
  50. package/dist/src/hooks/builtin/post-execute.d.ts.map +1 -0
  51. package/dist/src/hooks/builtin/post-execute.js +30 -0
  52. package/dist/src/hooks/builtin/post-execute.js.map +1 -0
  53. package/dist/src/hooks/builtin/post-plan.d.ts +7 -0
  54. package/dist/src/hooks/builtin/post-plan.d.ts.map +1 -0
  55. package/dist/src/hooks/builtin/post-plan.js +15 -0
  56. package/dist/src/hooks/builtin/post-plan.js.map +1 -0
  57. package/dist/src/hooks/builtin/pre-execute.d.ts +7 -0
  58. package/dist/src/hooks/builtin/pre-execute.d.ts.map +1 -0
  59. package/dist/src/hooks/builtin/pre-execute.js +22 -0
  60. package/dist/src/hooks/builtin/pre-execute.js.map +1 -0
  61. package/dist/src/hooks/builtin/pre-plan.d.ts +7 -0
  62. package/dist/src/hooks/builtin/pre-plan.d.ts.map +1 -0
  63. package/dist/src/hooks/builtin/pre-plan.js +19 -0
  64. package/dist/src/hooks/builtin/pre-plan.js.map +1 -0
  65. package/dist/src/hooks/index.d.ts +8 -0
  66. package/dist/src/hooks/index.d.ts.map +1 -0
  67. package/dist/src/hooks/index.js +4 -0
  68. package/dist/src/hooks/index.js.map +1 -0
  69. package/dist/src/hooks/loader.d.ts +16 -0
  70. package/dist/src/hooks/loader.d.ts.map +1 -0
  71. package/dist/src/hooks/loader.js +77 -0
  72. package/dist/src/hooks/loader.js.map +1 -0
  73. package/dist/src/hooks/manager.d.ts +20 -0
  74. package/dist/src/hooks/manager.d.ts.map +1 -0
  75. package/dist/src/hooks/manager.js +76 -0
  76. package/dist/src/hooks/manager.js.map +1 -0
  77. package/dist/src/hooks/types-enhanced.d.ts +30 -0
  78. package/dist/src/hooks/types-enhanced.d.ts.map +1 -0
  79. package/dist/src/hooks/types-enhanced.js +22 -0
  80. package/dist/src/hooks/types-enhanced.js.map +1 -0
  81. package/dist/src/hooks/types.d.ts +27 -0
  82. package/dist/src/hooks/types.d.ts.map +1 -0
  83. package/dist/src/hooks/types.js +2 -0
  84. package/dist/src/hooks/types.js.map +1 -0
  85. package/dist/src/index.d.ts +43 -0
  86. package/dist/src/index.d.ts.map +1 -0
  87. package/dist/src/index.js +41 -0
  88. package/dist/src/index.js.map +1 -0
  89. package/dist/src/persistence/index.d.ts +7 -0
  90. package/dist/src/persistence/index.d.ts.map +1 -0
  91. package/dist/src/persistence/index.js +6 -0
  92. package/dist/src/persistence/index.js.map +1 -0
  93. package/dist/src/persistence/plan-md.d.ts +11 -0
  94. package/dist/src/persistence/plan-md.d.ts.map +1 -0
  95. package/dist/src/persistence/plan-md.js +125 -0
  96. package/dist/src/persistence/plan-md.js.map +1 -0
  97. package/dist/src/persistence/state-md.d.ts +17 -0
  98. package/dist/src/persistence/state-md.d.ts.map +1 -0
  99. package/dist/src/persistence/state-md.js +143 -0
  100. package/dist/src/persistence/state-md.js.map +1 -0
  101. package/dist/src/persistence/types.d.ts +85 -0
  102. package/dist/src/persistence/types.d.ts.map +1 -0
  103. package/dist/src/persistence/types.js +5 -0
  104. package/dist/src/persistence/types.js.map +1 -0
  105. package/dist/src/router/classifier.d.ts +108 -0
  106. package/dist/src/router/classifier.d.ts.map +1 -0
  107. package/dist/src/router/classifier.js +476 -0
  108. package/dist/src/router/classifier.js.map +1 -0
  109. package/dist/src/router/guard.d.ts +128 -0
  110. package/dist/src/router/guard.d.ts.map +1 -0
  111. package/dist/src/router/guard.js +370 -0
  112. package/dist/src/router/guard.js.map +1 -0
  113. package/dist/src/router/index.d.ts +10 -0
  114. package/dist/src/router/index.d.ts.map +1 -0
  115. package/dist/src/router/index.js +8 -0
  116. package/dist/src/router/index.js.map +1 -0
  117. package/dist/src/router/router.d.ts +58 -0
  118. package/dist/src/router/router.d.ts.map +1 -0
  119. package/dist/src/router/router.js +78 -0
  120. package/dist/src/router/router.js.map +1 -0
  121. package/dist/src/router/types.d.ts +100 -0
  122. package/dist/src/router/types.d.ts.map +1 -0
  123. package/dist/src/router/types.js +24 -0
  124. package/dist/src/router/types.js.map +1 -0
  125. package/dist/src/skills/agents-md/index.d.ts +9 -0
  126. package/dist/src/skills/agents-md/index.d.ts.map +1 -0
  127. package/dist/src/skills/agents-md/index.js +28 -0
  128. package/dist/src/skills/agents-md/index.js.map +1 -0
  129. package/dist/src/skills/execute-plan/index.d.ts +141 -0
  130. package/dist/src/skills/execute-plan/index.d.ts.map +1 -0
  131. package/dist/src/skills/execute-plan/index.js +784 -0
  132. package/dist/src/skills/execute-plan/index.js.map +1 -0
  133. package/dist/src/skills/index.d.ts +14 -0
  134. package/dist/src/skills/index.d.ts.map +1 -0
  135. package/dist/src/skills/index.js +10 -0
  136. package/dist/src/skills/index.js.map +1 -0
  137. package/dist/src/skills/quick-task/index.d.ts +75 -0
  138. package/dist/src/skills/quick-task/index.d.ts.map +1 -0
  139. package/dist/src/skills/quick-task/index.js +284 -0
  140. package/dist/src/skills/quick-task/index.js.map +1 -0
  141. package/dist/src/skills/registry.d.ts +15 -0
  142. package/dist/src/skills/registry.d.ts.map +1 -0
  143. package/dist/src/skills/registry.js +44 -0
  144. package/dist/src/skills/registry.js.map +1 -0
  145. package/dist/src/skills/review-diff/index.d.ts +96 -0
  146. package/dist/src/skills/review-diff/index.d.ts.map +1 -0
  147. package/dist/src/skills/review-diff/index.js +316 -0
  148. package/dist/src/skills/review-diff/index.js.map +1 -0
  149. package/dist/src/skills/skill.d.ts +24 -0
  150. package/dist/src/skills/skill.d.ts.map +1 -0
  151. package/dist/src/skills/skill.js +39 -0
  152. package/dist/src/skills/skill.js.map +1 -0
  153. package/dist/src/skills/systematic-debugging/index.d.ts +90 -0
  154. package/dist/src/skills/systematic-debugging/index.d.ts.map +1 -0
  155. package/dist/src/skills/systematic-debugging/index.js +305 -0
  156. package/dist/src/skills/systematic-debugging/index.js.map +1 -0
  157. package/dist/src/skills/tdd/index.d.ts +103 -0
  158. package/dist/src/skills/tdd/index.d.ts.map +1 -0
  159. package/dist/src/skills/tdd/index.js +338 -0
  160. package/dist/src/skills/tdd/index.js.map +1 -0
  161. package/dist/src/skills/to-plan/index-enhanced.d.ts +100 -0
  162. package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -0
  163. package/dist/src/skills/to-plan/index-enhanced.js +452 -0
  164. package/dist/src/skills/to-plan/index-enhanced.js.map +1 -0
  165. package/dist/src/skills/to-plan/index.d.ts +131 -0
  166. package/dist/src/skills/to-plan/index.d.ts.map +1 -0
  167. package/dist/src/skills/to-plan/index.js +460 -0
  168. package/dist/src/skills/to-plan/index.js.map +1 -0
  169. package/dist/src/skills/types.d.ts +44 -0
  170. package/dist/src/skills/types.d.ts.map +1 -0
  171. package/dist/src/skills/types.js +2 -0
  172. package/dist/src/skills/types.js.map +1 -0
  173. package/dist/src/state/cleanup.d.ts +22 -0
  174. package/dist/src/state/cleanup.d.ts.map +1 -0
  175. package/dist/src/state/cleanup.js +87 -0
  176. package/dist/src/state/cleanup.js.map +1 -0
  177. package/dist/src/state/index.d.ts +9 -0
  178. package/dist/src/state/index.d.ts.map +1 -0
  179. package/dist/src/state/index.js +5 -0
  180. package/dist/src/state/index.js.map +1 -0
  181. package/dist/src/state/manager.d.ts +15 -0
  182. package/dist/src/state/manager.d.ts.map +1 -0
  183. package/dist/src/state/manager.js +73 -0
  184. package/dist/src/state/manager.js.map +1 -0
  185. package/dist/src/state/persistence.d.ts +13 -0
  186. package/dist/src/state/persistence.d.ts.map +1 -0
  187. package/dist/src/state/persistence.js +68 -0
  188. package/dist/src/state/persistence.js.map +1 -0
  189. package/dist/src/state/types.d.ts +26 -0
  190. package/dist/src/state/types.d.ts.map +1 -0
  191. package/dist/src/state/types.js +2 -0
  192. package/dist/src/state/types.js.map +1 -0
  193. package/dist/src/state/validator.d.ts +12 -0
  194. package/dist/src/state/validator.d.ts.map +1 -0
  195. package/dist/src/state/validator.js +56 -0
  196. package/dist/src/state/validator.js.map +1 -0
  197. package/dist/src/types.d.ts +83 -0
  198. package/dist/src/types.d.ts.map +1 -0
  199. package/dist/src/types.js +5 -0
  200. package/dist/src/types.js.map +1 -0
  201. package/dist/src/utils/compress.d.ts +37 -0
  202. package/dist/src/utils/compress.d.ts.map +1 -0
  203. package/dist/src/utils/compress.js +298 -0
  204. package/dist/src/utils/compress.js.map +1 -0
  205. package/dist/src/utils/git.d.ts +9 -0
  206. package/dist/src/utils/git.d.ts.map +1 -0
  207. package/dist/src/utils/git.js +81 -0
  208. package/dist/src/utils/git.js.map +1 -0
  209. package/dist/src/utils/index.d.ts +7 -0
  210. package/dist/src/utils/index.d.ts.map +1 -0
  211. package/dist/src/utils/index.js +7 -0
  212. package/dist/src/utils/index.js.map +1 -0
  213. package/dist/src/utils/logger.d.ts +6 -0
  214. package/dist/src/utils/logger.d.ts.map +1 -0
  215. package/dist/src/utils/logger.js +19 -0
  216. package/dist/src/utils/logger.js.map +1 -0
  217. package/dist/src/utils/paths.d.ts +12 -0
  218. package/dist/src/utils/paths.d.ts.map +1 -0
  219. package/dist/src/utils/paths.js +44 -0
  220. package/dist/src/utils/paths.js.map +1 -0
  221. package/package.json +76 -0
  222. package/scripts/postinstall.js +69 -0
  223. package/yi-workflow.js +17 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * yi-workflow - Production workflow skills for coding agents
3
+ *
4
+ * Core Architecture:
5
+ * 1. Main Agent = Orchestrator only (NEVER executes work)
6
+ * 2. Router = Classifies ALL user input and dispatches to subagents
7
+ * 3. Subagents = Do ALL actual work
8
+ * 4. Guard = Enforces Main Agent never does prohibited operations
9
+ */
10
+ // Export hooks
11
+ export { HookManager, createHookManager } from './hooks/manager.js';
12
+ export { HookLoader, createHookLoader } from './hooks/loader.js';
13
+ // Export state
14
+ export { StateManagerImpl, createStateManager } from './state/manager.js';
15
+ export { FilePersistence, createPersistence } from './state/persistence.js';
16
+ export { validateState, isValidState, sanitizeState } from './state/validator.js';
17
+ export { cleanupOldStates, cleanupEmptyDirs, getStateStats } from './state/cleanup.js';
18
+ // Export skills
19
+ export { Skill } from './skills/skill.js';
20
+ export { Registry, createRegistry } from './skills/registry.js';
21
+ export { toPlanSkill } from './skills/to-plan/index.js';
22
+ export { executePlanSkill } from './skills/execute-plan/index.js';
23
+ export { quickTaskSkill } from './skills/quick-task/index.js';
24
+ export { reviewDiffSkill } from './skills/review-diff/index.js';
25
+ export { tddSkill } from './skills/tdd/index.js';
26
+ export { systematicDebuggingSkill } from './skills/systematic-debugging/index.js';
27
+ export { agentsMdSkill } from './skills/agents-md/index.js';
28
+ // Export agents - dispatcher
29
+ export { SubagentDispatcher, createDispatcher, createProcessExecutor } from './agents/dispatcher.js';
30
+ // Export agents - contracts
31
+ export { explorerContract, implementerContract, reviewerContract, debuggerContract, verifierContract, } from './agents/contracts.js';
32
+ // Export router
33
+ export { createRouter } from './router/router.js';
34
+ export { ROUTE_KEYWORDS, MAIN_AGENT_PROHIBITED } from './router/types.js';
35
+ // Export guard
36
+ export { createMainAgentGuard } from './guard/main-agent.js';
37
+ // Export utils
38
+ export { createLogger } from './utils/logger.js';
39
+ export { getCurrentBranch, getBaseBranch, isWorktree } from './utils/git.js';
40
+ export { getPlansPath, getStatePath } from './utils/paths.js';
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAQhE,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOtF,gBAAgB;AAChB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAQ3D,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAkBpG,4BAA4B;AAC5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAS9B,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAYzE,eAAe;AACf,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAQ5D,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Persistence layer exports
3
+ */
4
+ export { StateMdManager } from './state-md.js';
5
+ export { PlanMdManager } from './plan-md.js';
6
+ export type { Task, Wave, Plan, TaskResult, VerificationResult, DimensionResult, WorkflowState, StateMdManager as IStateMdManager, PlanMdManager as IPlanMdManager, PersistenceManager } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,cAAc,IAAI,eAAe,EACjC,aAAa,IAAI,cAAc,EAC/B,kBAAkB,EACnB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Persistence layer exports
3
+ */
4
+ export { StateMdManager } from './state-md.js';
5
+ export { PlanMdManager } from './plan-md.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { Plan, PlanMdManager as IPlanMdManager } from './types.js';
2
+ export declare class PlanMdManager implements IPlanMdManager {
3
+ private planPath;
4
+ constructor(planPath?: string);
5
+ writePlan(plan: Plan): Promise<void>;
6
+ readPlan(): Promise<Plan>;
7
+ updateTaskStatus(taskId: string, status: 'pending' | 'in_progress' | 'complete'): Promise<void>;
8
+ private generatePlanMarkdown;
9
+ private parsePlan;
10
+ }
11
+ //# sourceMappingURL=plan-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-md.d.ts","sourceRoot":"","sources":["../../../src/persistence/plan-md.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAQ,aAAa,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7E,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,QAAQ,GAAE,MAA4B;IAI5C,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrG,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,SAAS;CAwElB"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * PLAN.md manager for execution plan persistence
3
+ */
4
+ import { promises as fs } from 'fs';
5
+ import { dirname } from 'path';
6
+ export class PlanMdManager {
7
+ planPath;
8
+ constructor(planPath = '.pi/state/PLAN.md') {
9
+ this.planPath = planPath;
10
+ }
11
+ async writePlan(plan) {
12
+ // Ensure directory exists
13
+ await fs.mkdir(dirname(this.planPath), { recursive: true });
14
+ const content = this.generatePlanMarkdown(plan);
15
+ await fs.writeFile(this.planPath, content, 'utf-8');
16
+ }
17
+ async readPlan() {
18
+ const content = await fs.readFile(this.planPath, 'utf-8');
19
+ return this.parsePlan(content);
20
+ }
21
+ async updateTaskStatus(taskId, status) {
22
+ const content = await fs.readFile(this.planPath, 'utf-8');
23
+ const statusChar = status === 'complete' ? 'x' : status === 'in_progress' ? '~' : ' ';
24
+ const updated = content.replace(new RegExp(`- \\[.] ${taskId}:`), `- [${statusChar}] ${taskId}:`);
25
+ await fs.writeFile(this.planPath, updated, 'utf-8');
26
+ }
27
+ generatePlanMarkdown(plan) {
28
+ return `# Execution Plan
29
+
30
+ ## Goal
31
+ ${plan.goal}
32
+
33
+ ## Tasks
34
+ ${plan.tasks.map(t => `- [ ] ${t.id}: ${t.description} (${t.estimatedComplexity})`).join('\n')}
35
+
36
+ ## Dependencies
37
+ ${Object.entries(plan.dependencies).length > 0
38
+ ? Object.entries(plan.dependencies).map(([task, deps]) => `- ${task}: ${deps.join(', ')}`).join('\n')
39
+ : '- No dependencies'}
40
+
41
+ ## Waves
42
+ ${plan.waves.map(w => `- ${w.id}: ${w.tasks.join(', ')}`).join('\n')}
43
+
44
+ ## Verification Criteria
45
+ ${plan.verificationCriteria.map(c => `- ${c}`).join('\n')}
46
+
47
+ ## Estimated Effort
48
+ - Total Tasks: ${plan.tasks.length}
49
+ - Parallel Waves: ${plan.waves.length}
50
+ - Estimated Duration: ${plan.estimatedDuration}ms
51
+
52
+ ## Rationale
53
+ ${plan.rationale}
54
+ `;
55
+ }
56
+ parsePlan(content) {
57
+ const goalMatch = content.match(/## Goal\n(.+)/);
58
+ const tasksMatch = content.match(/## Tasks\n([\s\S]*?)(?=\n## |$)/);
59
+ const depsMatch = content.match(/## Dependencies\n([\s\S]*?)(?=\n## |$)/);
60
+ const wavesMatch = content.match(/## Waves\n([\s\S]*?)(?=\n## |$)/);
61
+ const criteriaMatch = content.match(/## Verification Criteria\n([\s\S]*?)(?=\n## |$)/);
62
+ const durationMatch = content.match(/- Estimated Duration: (\d+)/);
63
+ const rationaleMatch = content.match(/## Rationale\n([\s\S]*?)(?=\n## |$)/);
64
+ // Parse tasks
65
+ const tasks = [];
66
+ if (tasksMatch) {
67
+ const taskLines = tasksMatch[1].split('\n').filter(l => l.trim().startsWith('- ['));
68
+ for (const line of taskLines) {
69
+ const match = line.match(/- \[[x\s~]]\s+(\w+):\s+(.+)\s+\((\w+)\)/);
70
+ if (match) {
71
+ tasks.push({
72
+ id: match[1],
73
+ description: match[2],
74
+ estimatedComplexity: match[3]
75
+ });
76
+ }
77
+ }
78
+ }
79
+ // Parse dependencies
80
+ const dependencies = {};
81
+ if (depsMatch && depsMatch[1].trim() !== '- No dependencies') {
82
+ const depLines = depsMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
83
+ for (const line of depLines) {
84
+ const match = line.match(/- (\w+):\s*(.+)/);
85
+ if (match) {
86
+ dependencies[match[1]] = match[2].split(',').map(s => s.trim()).filter(s => s);
87
+ }
88
+ }
89
+ }
90
+ // Parse waves
91
+ const waves = [];
92
+ if (wavesMatch) {
93
+ const waveLines = wavesMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
94
+ for (const line of waveLines) {
95
+ const match = line.match(/- (\w+):\s*(.+)/);
96
+ if (match) {
97
+ waves.push({
98
+ id: match[1],
99
+ tasks: match[2].split(',').map(s => s.trim()).filter(s => s)
100
+ });
101
+ }
102
+ }
103
+ }
104
+ // Parse verification criteria
105
+ const verificationCriteria = [];
106
+ if (criteriaMatch) {
107
+ const criteriaLines = criteriaMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
108
+ for (const line of criteriaLines) {
109
+ const criterion = line.replace(/^- /, '').trim();
110
+ if (criterion)
111
+ verificationCriteria.push(criterion);
112
+ }
113
+ }
114
+ return {
115
+ goal: goalMatch?.[1] || '',
116
+ tasks,
117
+ dependencies,
118
+ waves,
119
+ verificationCriteria,
120
+ estimatedDuration: durationMatch ? parseInt(durationMatch[1], 10) : 0,
121
+ rationale: rationaleMatch?.[1]?.trim() || ''
122
+ };
123
+ }
124
+ }
125
+ //# sourceMappingURL=plan-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-md.js","sourceRoot":"","sources":["../../../src/persistence/plan-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { WorkflowState, Plan, TaskResult, VerificationResult, StateMdManager as IStateMdManager } from './types.js';
2
+ export declare class StateMdManager implements IStateMdManager {
3
+ private statePath;
4
+ constructor(statePath?: string);
5
+ initialize(goal: string): Promise<void>;
6
+ updatePhase(phase: WorkflowState['phase']): Promise<void>;
7
+ recordPlan(plan: Plan): Promise<void>;
8
+ recordTaskComplete(taskId: string, result: TaskResult): Promise<void>;
9
+ recordVerification(verification: VerificationResult): Promise<void>;
10
+ readCurrentState(): Promise<WorkflowState>;
11
+ private formatPlanSection;
12
+ private formatVerificationSection;
13
+ private replaceSection;
14
+ private appendToSection;
15
+ private parseState;
16
+ }
17
+ //# sourceMappingURL=state-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-md.d.ts","sourceRoot":"","sources":["../../../src/persistence/state-md.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,IAAI,eAAe,EAAE,MAAM,YAAY,CAAA;AAExH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,SAAS,CAAQ;gBAEb,SAAS,GAAE,MAA6B;IAI9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAKhD,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;CA2BnB"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * STATE.md manager for workflow state persistence
3
+ */
4
+ import { promises as fs } from 'fs';
5
+ import { dirname } from 'path';
6
+ export class StateMdManager {
7
+ statePath;
8
+ constructor(statePath = '.pi/state/STATE.md') {
9
+ this.statePath = statePath;
10
+ }
11
+ async initialize(goal) {
12
+ // Ensure directory exists
13
+ await fs.mkdir(dirname(this.statePath), { recursive: true });
14
+ const content = `# Workflow State
15
+
16
+ ## Goal
17
+ ${goal}
18
+
19
+ ## Status
20
+ - Phase: planning
21
+ - Started: ${new Date().toISOString()}
22
+ - Last Updated: ${new Date().toISOString()}
23
+
24
+ ## Plan
25
+ <!-- Populated by plan skill -->
26
+
27
+ ## Completed Tasks
28
+ <!-- Updated during execution -->
29
+
30
+ ## Verification Results
31
+ <!-- Populated by verify phase -->
32
+
33
+ ## Token Usage
34
+ - Plan Phase: 0
35
+ - Execute Phase: 0
36
+ - Verify Phase: 0
37
+ - Total: 0 / 1000000
38
+ `;
39
+ await fs.writeFile(this.statePath, content, 'utf-8');
40
+ }
41
+ async updatePhase(phase) {
42
+ const content = await fs.readFile(this.statePath, 'utf-8');
43
+ const updated = content.replace(/- Phase: .*/, `- Phase: ${phase}`).replace(/- Last Updated: .*/, `- Last Updated: ${new Date().toISOString()}`);
44
+ await fs.writeFile(this.statePath, updated, 'utf-8');
45
+ }
46
+ async recordPlan(plan) {
47
+ const content = await fs.readFile(this.statePath, 'utf-8');
48
+ const planSection = this.formatPlanSection(plan);
49
+ const updated = this.replaceSection(content, 'Plan', planSection);
50
+ await fs.writeFile(this.statePath, updated, 'utf-8');
51
+ }
52
+ async recordTaskComplete(taskId, result) {
53
+ const content = await fs.readFile(this.statePath, 'utf-8');
54
+ const entry = `- [x] ${taskId}: ${result.success ? '✓' : '✗'} (${result.duration}ms) - ${result.notes || ''}\n`;
55
+ const updated = this.appendToSection(content, 'Completed Tasks', entry);
56
+ await fs.writeFile(this.statePath, updated, 'utf-8');
57
+ }
58
+ async recordVerification(verification) {
59
+ const content = await fs.readFile(this.statePath, 'utf-8');
60
+ const verificationSection = this.formatVerificationSection(verification);
61
+ const updated = this.replaceSection(content, 'Verification Results', verificationSection);
62
+ await fs.writeFile(this.statePath, updated, 'utf-8');
63
+ }
64
+ async readCurrentState() {
65
+ const content = await fs.readFile(this.statePath, 'utf-8');
66
+ return this.parseState(content);
67
+ }
68
+ formatPlanSection(plan) {
69
+ return `
70
+ ### Goal
71
+ ${plan.goal}
72
+
73
+ ### Tasks (${plan.tasks.length})
74
+ ${plan.tasks.map(t => `- ${t.id}: ${t.description} (${t.estimatedComplexity})`).join('\n')}
75
+
76
+ ### Waves (${plan.waves.length})
77
+ ${plan.waves.map(w => `- ${w.id}: ${w.tasks.join(', ')}`).join('\n')}
78
+
79
+ ### Verification Criteria
80
+ ${plan.verificationCriteria.map(c => `- ${c}`).join('\n')}
81
+
82
+ ### Estimated Duration
83
+ ${plan.estimatedDuration}ms
84
+
85
+ ### Rationale
86
+ ${plan.rationale}
87
+ `;
88
+ }
89
+ formatVerificationSection(verification) {
90
+ const results = [];
91
+ if (verification.dimensions.goals) {
92
+ results.push(`- Goals: ${verification.dimensions.goals.success ? '✓ PASS' : '✗ FAIL'}`);
93
+ }
94
+ if (verification.dimensions.quality) {
95
+ results.push(`- Quality: ${verification.dimensions.quality.success ? '✓ PASS' : '✗ FAIL'}`);
96
+ }
97
+ if (verification.dimensions.tests) {
98
+ results.push(`- Tests: ${verification.dimensions.tests.success ? '✓ PASS' : '✗ FAIL'}`);
99
+ }
100
+ results.push(`- Overall: ${verification.success ? '✓ PASSED' : '✗ FAILED'}`);
101
+ return `
102
+ ${results.join('\n')}
103
+ `;
104
+ }
105
+ replaceSection(content, sectionName, newContent) {
106
+ const pattern = new RegExp(`(## ${sectionName}\\n)([\\s\\S]*?)(?=\\n## |$)`, 'g');
107
+ return content.replace(pattern, `## ${sectionName}\n${newContent}\n`);
108
+ }
109
+ appendToSection(content, sectionName, entry) {
110
+ const pattern = new RegExp(`(## ${sectionName}\\n)([\\s\\S]*?)(?=\\n## |$)`, 'g');
111
+ const match = pattern.exec(content);
112
+ if (match) {
113
+ const current = match[2] || '';
114
+ return content.replace(pattern, `## ${sectionName}\n${current}${entry}`);
115
+ }
116
+ return content;
117
+ }
118
+ parseState(content) {
119
+ const phaseMatch = content.match(/- Phase: (\w+)/);
120
+ const goalMatch = content.match(/## Goal\n(.+)/);
121
+ const startedMatch = content.match(/- Started: (.+)/);
122
+ const totalMatch = content.match(/### Tasks \((\d+)\)/);
123
+ const completedMatch = content.match(/## Completed Tasks\n([\s\S]*?)(?=\n## |$)/);
124
+ const completedTasks = completedMatch
125
+ ? completedMatch[1].split('\n').filter(l => l.trim().startsWith('- [x]')).length
126
+ : 0;
127
+ const totalTasks = totalMatch ? parseInt(totalMatch[1], 10) : 0;
128
+ return {
129
+ goal: goalMatch?.[1] || '',
130
+ phase: phaseMatch?.[1] || 'planning',
131
+ started: startedMatch?.[1] || new Date().toISOString(),
132
+ lastUpdated: new Date().toISOString(),
133
+ totalTasks,
134
+ completedTasks: [],
135
+ tokenUsage: {
136
+ used: 0,
137
+ limit: 1000000,
138
+ percentage: 0
139
+ }
140
+ };
141
+ }
142
+ }
143
+ //# sourceMappingURL=state-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-md.js","sourceRoot":"","sources":["../../../src/persistence/state-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Persistence layer types for STATE.md and PLAN.md
3
+ */
4
+ export interface Task {
5
+ id: string;
6
+ description: string;
7
+ estimatedComplexity: 'low' | 'medium' | 'high';
8
+ relatedFiles?: string[];
9
+ verificationCriteria?: string[];
10
+ }
11
+ export interface Wave {
12
+ id: string;
13
+ tasks: string[];
14
+ }
15
+ export interface Plan {
16
+ goal: string;
17
+ tasks: Task[];
18
+ dependencies: Record<string, string[]>;
19
+ waves: Wave[];
20
+ verificationCriteria: string[];
21
+ estimatedDuration: number;
22
+ rationale: string;
23
+ }
24
+ export interface TaskResult {
25
+ taskId: string;
26
+ success: boolean;
27
+ filesModified: string[];
28
+ testsAdded: string[];
29
+ duration: number;
30
+ notes: string;
31
+ error?: string;
32
+ phases?: {
33
+ phase: string;
34
+ status: string;
35
+ command?: string;
36
+ evidence?: string;
37
+ }[];
38
+ worktreePath?: string;
39
+ branchName?: string;
40
+ }
41
+ export interface VerificationResult {
42
+ success: boolean;
43
+ dimensions: {
44
+ goals?: DimensionResult;
45
+ quality?: DimensionResult;
46
+ tests?: DimensionResult;
47
+ };
48
+ }
49
+ export interface DimensionResult {
50
+ success: boolean;
51
+ details?: unknown;
52
+ evidence?: string[];
53
+ gaps?: string[];
54
+ }
55
+ export interface WorkflowState {
56
+ goal: string;
57
+ phase: 'planning' | 'executing' | 'verifying' | 'complete';
58
+ started: string;
59
+ lastUpdated: string;
60
+ totalTasks: number;
61
+ completedTasks: TaskResult[];
62
+ tokenUsage: {
63
+ used: number;
64
+ limit: number;
65
+ percentage: number;
66
+ };
67
+ }
68
+ export interface StateMdManager {
69
+ initialize(goal: string): Promise<void>;
70
+ updatePhase(phase: WorkflowState['phase']): Promise<void>;
71
+ recordPlan(plan: Plan): Promise<void>;
72
+ recordTaskComplete(taskId: string, result: TaskResult): Promise<void>;
73
+ recordVerification(verification: VerificationResult): Promise<void>;
74
+ readCurrentState(): Promise<WorkflowState>;
75
+ }
76
+ export interface PlanMdManager {
77
+ writePlan(plan: Plan): Promise<void>;
78
+ readPlan(): Promise<Plan>;
79
+ updateTaskStatus(taskId: string, status: 'pending' | 'in_progress' | 'complete'): Promise<void>;
80
+ }
81
+ export interface PersistenceManager {
82
+ state: StateMdManager;
83
+ plan: PlanMdManager;
84
+ }
85
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/persistence/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Persistence layer types for STATE.md and PLAN.md
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/persistence/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Request Classifier - determines what type of subagent should handle a request.
3
+ *
4
+ * Analyzes user request text and contextual signals to produce an
5
+ * IntentClassification, then builds a RoutingDecision with the appropriate
6
+ * SubagentConfig and SubagentContract.
7
+ *
8
+ * Classification follows a priority-ordered chain:
9
+ * 1. execute (plan file exists / mid-execution)
10
+ * 2. quick-task (trivial typo/whitespace, small scoped change)
11
+ * 3. review (code review request)
12
+ * 4. debug (root cause analysis)
13
+ * 5. tdd (test-driven development request)
14
+ * 6. plan (new feature / significant change)
15
+ * 7. general (catch-all)
16
+ */
17
+ import type { SubagentConfig } from '../agents/types.js';
18
+ import type { IntentType, IntentClassification, RoutingDecision, PermissionSet, RouterConfig } from './types.js';
19
+ /** Context signals used alongside the raw request text. */
20
+ export interface ClassificationContext {
21
+ /** Whether a plan file already exists for this task/feature */
22
+ planFileExists: boolean;
23
+ /** Whether the user is in the middle of executing a plan */
24
+ isExecutingPlan: boolean;
25
+ /** Whether there are uncommitted changes in the working tree */
26
+ hasUncommittedChanges: boolean;
27
+ /** The current branch name (if available) */
28
+ currentBranch?: string;
29
+ /** Any files the user explicitly mentioned */
30
+ mentionedFiles: string[];
31
+ }
32
+ /** Extended classification result with diagnostic metadata. */
33
+ export interface ClassifierResult {
34
+ /** The intent classification */
35
+ classification: IntentClassification;
36
+ /** The full routing decision (contract + config) */
37
+ routing: RoutingDecision;
38
+ /** Confidence score 0-1 */
39
+ confidence: number;
40
+ /** Which rule matched */
41
+ matchedRule: string;
42
+ /** Alternative classifications that were considered */
43
+ alternatives: Array<{
44
+ type: IntentType;
45
+ confidence: number;
46
+ }>;
47
+ }
48
+ /**
49
+ * Analyzes user requests and produces routing decisions.
50
+ *
51
+ * Classification runs through a priority-ordered chain:
52
+ * 1. Context-based: plan exists → 'execute'
53
+ * 2. Pattern-based: trivial-edit → quick-task, review, debug, tdd, plan, general
54
+ * 3. Fallback: 'general'
55
+ *
56
+ * Usage:
57
+ * ```typescript
58
+ * const classifier = new RequestClassifier(config)
59
+ * const result = classifier.classify("Fix the typo in src/utils.ts", {
60
+ * planFileExists: false,
61
+ * isExecutingPlan: false,
62
+ * hasUncommittedChanges: true,
63
+ * mentionedFiles: ['src/utils.ts'],
64
+ * })
65
+ * // result.classification.type === 'quick-task'
66
+ * ```
67
+ */
68
+ export declare class RequestClassifier {
69
+ private readonly config;
70
+ /** Priority-ordered classification rules. */
71
+ private readonly rules;
72
+ constructor(config: RouterConfig);
73
+ /**
74
+ * If a plan file exists or we are mid-execution, route to execute.
75
+ */
76
+ private checkContextExecute;
77
+ /**
78
+ * Classify a user request and produce a full routing decision.
79
+ *
80
+ * @param request - Raw user request text
81
+ * @param context - Contextual signals to improve accuracy
82
+ * @returns ClassifierResult with classification metadata and routing decision
83
+ */
84
+ classify(request: string, context: ClassificationContext): ClassifierResult;
85
+ /**
86
+ * Classify intent only (without building a full routing decision).
87
+ */
88
+ classifyIntent(request: string, context: ClassificationContext): IntentClassification;
89
+ /**
90
+ * Produce just the routing decision.
91
+ */
92
+ route(request: string, context: ClassificationContext): RoutingDecision;
93
+ /** Get recommended token budget for an intent type. */
94
+ getTokenBudget(type: IntentType): number;
95
+ /** Get subagent role for an intent type. */
96
+ getSubagentRole(type: IntentType): SubagentConfig['role'];
97
+ /** Get default permissions for an intent type (returns a copy). */
98
+ getSubagentPermissions(type: IntentType): PermissionSet;
99
+ /**
100
+ * Generate a human-readable classification summary for logging.
101
+ */
102
+ describeClassification(result: ClassifierResult): string;
103
+ /**
104
+ * Compute alternative classifications based on the winning type.
105
+ */
106
+ private computeAlternatives;
107
+ }
108
+ //# sourceMappingURL=classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/router/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,eAAe,EAEf,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAA;AAOnB,2DAA2D;AAC3D,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAA;IACvB,4DAA4D;IAC5D,eAAe,EAAE,OAAO,CAAA;IACxB,gEAAgE;IAChE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,cAAc,EAAE,oBAAoB,CAAA;IACpC,oDAAoD;IACpD,OAAO,EAAE,eAAe,CAAA;IACxB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC9D;AAuVD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAE/C,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;gBAEU,MAAM,EAAE,YAAY;IAchC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,gBAAgB;IAqD3E;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,oBAAoB;IAIrF;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,eAAe;IAQvE,uDAAuD;IACvD,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIxC,4CAA4C;IAC5C,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;IAIzD,mEAAmE;IACnE,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa;IAQvD;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAmBxD;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAa5B"}