pi-loop 0.1.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 (166) hide show
  1. package/agents/code-reviewer.md +82 -0
  2. package/agents/coder.md +82 -0
  3. package/agents/decomposer.md +55 -0
  4. package/agents/judge.md +90 -0
  5. package/agents/review-optimizer.md +44 -0
  6. package/dist/agents/adapter.d.ts +9 -0
  7. package/dist/agents/adapter.d.ts.map +1 -0
  8. package/dist/agents/adapter.js +41 -0
  9. package/dist/agents/adapter.js.map +1 -0
  10. package/dist/agents/factory.d.ts +7 -0
  11. package/dist/agents/factory.d.ts.map +1 -0
  12. package/dist/agents/factory.js +49 -0
  13. package/dist/agents/factory.js.map +1 -0
  14. package/dist/agents/registry.d.ts +4 -0
  15. package/dist/agents/registry.d.ts.map +1 -0
  16. package/dist/agents/registry.js +98 -0
  17. package/dist/agents/registry.js.map +1 -0
  18. package/dist/agents/types.d.ts +21 -0
  19. package/dist/agents/types.d.ts.map +1 -0
  20. package/dist/agents/types.js +39 -0
  21. package/dist/agents/types.js.map +1 -0
  22. package/dist/cli/args.d.ts +38 -0
  23. package/dist/cli/args.d.ts.map +1 -0
  24. package/dist/cli/args.js +160 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/commands.d.ts +29 -0
  27. package/dist/cli/commands.d.ts.map +1 -0
  28. package/dist/cli/commands.js +362 -0
  29. package/dist/cli/commands.js.map +1 -0
  30. package/dist/cli/output.d.ts +33 -0
  31. package/dist/cli/output.d.ts.map +1 -0
  32. package/dist/cli/output.js +99 -0
  33. package/dist/cli/output.js.map +1 -0
  34. package/dist/config/defaults.d.ts +3 -0
  35. package/dist/config/defaults.d.ts.map +1 -0
  36. package/dist/config/defaults.js +31 -0
  37. package/dist/config/defaults.js.map +1 -0
  38. package/dist/config/loader.d.ts +11 -0
  39. package/dist/config/loader.d.ts.map +1 -0
  40. package/dist/config/loader.js +70 -0
  41. package/dist/config/loader.js.map +1 -0
  42. package/dist/config/types.d.ts +41 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/checkpoint.d.ts +18 -0
  47. package/dist/core/checkpoint.d.ts.map +1 -0
  48. package/dist/core/checkpoint.js +32 -0
  49. package/dist/core/checkpoint.js.map +1 -0
  50. package/dist/core/judge.d.ts +11 -0
  51. package/dist/core/judge.d.ts.map +1 -0
  52. package/dist/core/judge.js +91 -0
  53. package/dist/core/judge.js.map +1 -0
  54. package/dist/core/learnings.d.ts +4 -0
  55. package/dist/core/learnings.d.ts.map +1 -0
  56. package/dist/core/learnings.js +33 -0
  57. package/dist/core/learnings.js.map +1 -0
  58. package/dist/core/orchestrator.d.ts +64 -0
  59. package/dist/core/orchestrator.d.ts.map +1 -0
  60. package/dist/core/orchestrator.js +499 -0
  61. package/dist/core/orchestrator.js.map +1 -0
  62. package/dist/core/plan.d.ts +7 -0
  63. package/dist/core/plan.d.ts.map +1 -0
  64. package/dist/core/plan.js +15 -0
  65. package/dist/core/plan.js.map +1 -0
  66. package/dist/core/readiness-policy.d.ts +11 -0
  67. package/dist/core/readiness-policy.d.ts.map +1 -0
  68. package/dist/core/readiness-policy.js +24 -0
  69. package/dist/core/readiness-policy.js.map +1 -0
  70. package/dist/core/scheduling-policy.d.ts +9 -0
  71. package/dist/core/scheduling-policy.d.ts.map +1 -0
  72. package/dist/core/scheduling-policy.js +56 -0
  73. package/dist/core/scheduling-policy.js.map +1 -0
  74. package/dist/core/task-backend.d.ts +55 -0
  75. package/dist/core/task-backend.d.ts.map +1 -0
  76. package/dist/core/task-backend.js +76 -0
  77. package/dist/core/task-backend.js.map +1 -0
  78. package/dist/core/task-state.d.ts +26 -0
  79. package/dist/core/task-state.d.ts.map +1 -0
  80. package/dist/core/task-state.js +182 -0
  81. package/dist/core/task-state.js.map +1 -0
  82. package/dist/core/wiring.d.ts +12 -0
  83. package/dist/core/wiring.d.ts.map +1 -0
  84. package/dist/core/wiring.js +131 -0
  85. package/dist/core/wiring.js.map +1 -0
  86. package/dist/git/conflict.d.ts +6 -0
  87. package/dist/git/conflict.d.ts.map +1 -0
  88. package/dist/git/conflict.js +25 -0
  89. package/dist/git/conflict.js.map +1 -0
  90. package/dist/git/repo.d.ts +13 -0
  91. package/dist/git/repo.d.ts.map +1 -0
  92. package/dist/git/repo.js +74 -0
  93. package/dist/git/repo.js.map +1 -0
  94. package/dist/git/same-branch.d.ts +9 -0
  95. package/dist/git/same-branch.d.ts.map +1 -0
  96. package/dist/git/same-branch.js +55 -0
  97. package/dist/git/same-branch.js.map +1 -0
  98. package/dist/git/worktree.d.ts +14 -0
  99. package/dist/git/worktree.d.ts.map +1 -0
  100. package/dist/git/worktree.js +78 -0
  101. package/dist/git/worktree.js.map +1 -0
  102. package/dist/index.d.ts +6 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +47 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/integrations/linear/backend.d.ts +38 -0
  107. package/dist/integrations/linear/backend.d.ts.map +1 -0
  108. package/dist/integrations/linear/backend.js +374 -0
  109. package/dist/integrations/linear/backend.js.map +1 -0
  110. package/dist/integrations/linear/client.d.ts +19 -0
  111. package/dist/integrations/linear/client.d.ts.map +1 -0
  112. package/dist/integrations/linear/client.js +86 -0
  113. package/dist/integrations/linear/client.js.map +1 -0
  114. package/dist/integrations/linear/comment-templates.d.ts +14 -0
  115. package/dist/integrations/linear/comment-templates.d.ts.map +1 -0
  116. package/dist/integrations/linear/comment-templates.js +50 -0
  117. package/dist/integrations/linear/comment-templates.js.map +1 -0
  118. package/dist/integrations/linear/contract.d.ts +15 -0
  119. package/dist/integrations/linear/contract.d.ts.map +1 -0
  120. package/dist/integrations/linear/contract.js +86 -0
  121. package/dist/integrations/linear/contract.js.map +1 -0
  122. package/dist/integrations/linear/types.d.ts +39 -0
  123. package/dist/integrations/linear/types.d.ts.map +1 -0
  124. package/dist/integrations/linear/types.js +2 -0
  125. package/dist/integrations/linear/types.js.map +1 -0
  126. package/dist/swarm/pool.d.ts +33 -0
  127. package/dist/swarm/pool.d.ts.map +1 -0
  128. package/dist/swarm/pool.js +182 -0
  129. package/dist/swarm/pool.js.map +1 -0
  130. package/dist/swarm/scheduler.d.ts +38 -0
  131. package/dist/swarm/scheduler.d.ts.map +1 -0
  132. package/dist/swarm/scheduler.js +191 -0
  133. package/dist/swarm/scheduler.js.map +1 -0
  134. package/dist/swarm/worker.d.ts +49 -0
  135. package/dist/swarm/worker.d.ts.map +1 -0
  136. package/dist/swarm/worker.js +180 -0
  137. package/dist/swarm/worker.js.map +1 -0
  138. package/dist/tools/bash-tool.d.ts +24 -0
  139. package/dist/tools/bash-tool.d.ts.map +1 -0
  140. package/dist/tools/bash-tool.js +177 -0
  141. package/dist/tools/bash-tool.js.map +1 -0
  142. package/dist/tools/file-tools.d.ts +3 -0
  143. package/dist/tools/file-tools.d.ts.map +1 -0
  144. package/dist/tools/file-tools.js +68 -0
  145. package/dist/tools/file-tools.js.map +1 -0
  146. package/dist/tools/git-tools.d.ts +3 -0
  147. package/dist/tools/git-tools.d.ts.map +1 -0
  148. package/dist/tools/git-tools.js +44 -0
  149. package/dist/tools/git-tools.js.map +1 -0
  150. package/dist/tools/learnings-tool.d.ts +3 -0
  151. package/dist/tools/learnings-tool.d.ts.map +1 -0
  152. package/dist/tools/learnings-tool.js +48 -0
  153. package/dist/tools/learnings-tool.js.map +1 -0
  154. package/dist/tools/plan-tool.d.ts +3 -0
  155. package/dist/tools/plan-tool.d.ts.map +1 -0
  156. package/dist/tools/plan-tool.js +24 -0
  157. package/dist/tools/plan-tool.js.map +1 -0
  158. package/dist/tools/task-tools.d.ts +3 -0
  159. package/dist/tools/task-tools.d.ts.map +1 -0
  160. package/dist/tools/task-tools.js +108 -0
  161. package/dist/tools/task-tools.js.map +1 -0
  162. package/dist/tools/test-tool.d.ts +3 -0
  163. package/dist/tools/test-tool.d.ts.map +1 -0
  164. package/dist/tools/test-tool.js +43 -0
  165. package/dist/tools/test-tool.js.map +1 -0
  166. package/package.json +47 -0
@@ -0,0 +1,39 @@
1
+ /** Mapping of tool names each agent role is allowed to use */
2
+ export const AGENT_TOOL_PERMISSIONS = {
3
+ decomposer: ["read_plan", "read_tasks", "update_task", "create_subtasks", "read_learnings"],
4
+ "review-optimizer": ["read_plan", "read_tasks", "update_task", "read_learnings"],
5
+ coder: [
6
+ "read_file",
7
+ "write_file",
8
+ "edit_file",
9
+ "bash",
10
+ "read_plan",
11
+ "read_tasks",
12
+ "update_task",
13
+ "read_learnings",
14
+ "append_learnings",
15
+ "run_tests",
16
+ "git_commit",
17
+ ],
18
+ "code-reviewer": [
19
+ "read_file",
20
+ "bash",
21
+ "read_plan",
22
+ "read_tasks",
23
+ "update_task",
24
+ "read_learnings",
25
+ "append_learnings",
26
+ "run_tests",
27
+ "git_diff",
28
+ ],
29
+ judge: [
30
+ "read_file",
31
+ "bash",
32
+ "read_plan",
33
+ "read_tasks",
34
+ "read_learnings",
35
+ "append_learnings",
36
+ "run_tests",
37
+ ],
38
+ };
39
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAsBA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAyC;IAC3E,UAAU,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;IAC3F,kBAAkB,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC;IAChF,KAAK,EAAE;QACN,WAAW;QACX,YAAY;QACZ,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;QACX,YAAY;KACZ;IACD,eAAe,EAAE;QAChB,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;QACX,UAAU;KACV;IACD,KAAK,EAAE;QACN,WAAW;QACX,MAAM;QACN,WAAW;QACX,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,WAAW;KACX;CACQ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CLI argument parsing from process.argv.
3
+ */
4
+ export interface ParsedArgs {
5
+ command: "run" | "resume" | "status" | "validate" | "clean" | "help";
6
+ planPath?: string;
7
+ options: {
8
+ model?: string;
9
+ concurrency?: number;
10
+ thinking?: string;
11
+ config?: string;
12
+ taskBackend?: string;
13
+ linearCycle?: string;
14
+ linearTeam?: string;
15
+ verbose?: boolean;
16
+ };
17
+ }
18
+ /**
19
+ * Parses argv (skipping first 2 entries for node and script).
20
+ *
21
+ * Supports:
22
+ * - pi-loop run <plan.md>
23
+ * - pi-loop resume
24
+ * - pi-loop status
25
+ * - pi-loop validate <plan.md>
26
+ * - pi-loop clean
27
+ * - --model provider:modelId
28
+ * - --concurrency N
29
+ * - --thinking level
30
+ * - --config path
31
+ * - --task-backend markdown|linear
32
+ * - --linear-cycle "Cycle Name"
33
+ * - --linear-team "TEAM"
34
+ * - --verbose
35
+ * - --help or no args → help command
36
+ */
37
+ export declare function parseArgs(argv: string[]): ParsedArgs;
38
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwFpD"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * CLI argument parsing from process.argv.
3
+ */
4
+ /**
5
+ * Parses argv (skipping first 2 entries for node and script).
6
+ *
7
+ * Supports:
8
+ * - pi-loop run <plan.md>
9
+ * - pi-loop resume
10
+ * - pi-loop status
11
+ * - pi-loop validate <plan.md>
12
+ * - pi-loop clean
13
+ * - --model provider:modelId
14
+ * - --concurrency N
15
+ * - --thinking level
16
+ * - --config path
17
+ * - --task-backend markdown|linear
18
+ * - --linear-cycle "Cycle Name"
19
+ * - --linear-team "TEAM"
20
+ * - --verbose
21
+ * - --help or no args → help command
22
+ */
23
+ export function parseArgs(argv) {
24
+ const args = argv.slice(2);
25
+ const result = {
26
+ command: "help",
27
+ options: {},
28
+ };
29
+ if (args.length === 0) {
30
+ return result;
31
+ }
32
+ let i = 0;
33
+ // Check for --help anywhere in args
34
+ if (args.includes("--help")) {
35
+ result.command = "help";
36
+ return result;
37
+ }
38
+ // First non-flag argument is the command
39
+ while (i < args.length && args[i].startsWith("--")) {
40
+ i = parseFlag(args, i, result);
41
+ }
42
+ if (i >= args.length) {
43
+ return result;
44
+ }
45
+ const command = args[i];
46
+ i++;
47
+ switch (command) {
48
+ case "run": {
49
+ result.command = "run";
50
+ // Next non-flag arg is planPath
51
+ while (i < args.length) {
52
+ if (args[i].startsWith("--")) {
53
+ i = parseFlag(args, i, result);
54
+ }
55
+ else {
56
+ result.planPath = args[i];
57
+ i++;
58
+ break;
59
+ }
60
+ }
61
+ break;
62
+ }
63
+ case "resume":
64
+ result.command = "resume";
65
+ break;
66
+ case "status":
67
+ result.command = "status";
68
+ break;
69
+ case "validate": {
70
+ result.command = "validate";
71
+ // Next non-flag arg is planPath
72
+ while (i < args.length) {
73
+ if (args[i].startsWith("--")) {
74
+ i = parseFlag(args, i, result);
75
+ }
76
+ else {
77
+ result.planPath = args[i];
78
+ i++;
79
+ break;
80
+ }
81
+ }
82
+ break;
83
+ }
84
+ case "clean":
85
+ result.command = "clean";
86
+ break;
87
+ case "help":
88
+ result.command = "help";
89
+ break;
90
+ default:
91
+ result.command = "help";
92
+ break;
93
+ }
94
+ // Parse remaining flags
95
+ while (i < args.length) {
96
+ if (args[i].startsWith("--")) {
97
+ i = parseFlag(args, i, result);
98
+ }
99
+ else {
100
+ i++;
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ function parseFlag(args, index, result) {
106
+ const flag = args[index];
107
+ switch (flag) {
108
+ case "--model":
109
+ if (index + 1 < args.length) {
110
+ result.options.model = args[index + 1];
111
+ return index + 2;
112
+ }
113
+ return index + 1;
114
+ case "--concurrency":
115
+ if (index + 1 < args.length) {
116
+ const parsed = Number.parseInt(args[index + 1], 10);
117
+ if (!Number.isNaN(parsed) && parsed > 0) {
118
+ result.options.concurrency = parsed;
119
+ }
120
+ return index + 2;
121
+ }
122
+ return index + 1;
123
+ case "--thinking":
124
+ if (index + 1 < args.length) {
125
+ result.options.thinking = args[index + 1];
126
+ return index + 2;
127
+ }
128
+ return index + 1;
129
+ case "--config":
130
+ if (index + 1 < args.length) {
131
+ result.options.config = args[index + 1];
132
+ return index + 2;
133
+ }
134
+ return index + 1;
135
+ case "--verbose":
136
+ result.options.verbose = true;
137
+ return index + 1;
138
+ case "--task-backend":
139
+ if (index + 1 < args.length) {
140
+ result.options.taskBackend = args[index + 1];
141
+ return index + 2;
142
+ }
143
+ return index + 1;
144
+ case "--linear-cycle":
145
+ if (index + 1 < args.length) {
146
+ result.options.linearCycle = args[index + 1];
147
+ return index + 2;
148
+ }
149
+ return index + 1;
150
+ case "--linear-team":
151
+ if (index + 1 < args.length) {
152
+ result.options.linearTeam = args[index + 1];
153
+ return index + 2;
154
+ }
155
+ return index + 1;
156
+ default:
157
+ return index + 1;
158
+ }
159
+ }
160
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Command handlers — wired to the orchestrator.
3
+ */
4
+ import type { ParsedArgs } from "./args.js";
5
+ /**
6
+ * Main execution: load config, create orchestrator, run.
7
+ */
8
+ export declare function runCommand(planPath: string, options: ParsedArgs["options"]): Promise<void>;
9
+ /**
10
+ * Load checkpoint, resume from where we left off.
11
+ */
12
+ export declare function resumeCommand(options: ParsedArgs["options"]): Promise<void>;
13
+ /**
14
+ * Read Tasks.md and display formatted task list.
15
+ */
16
+ export declare function statusCommand(): Promise<void>;
17
+ /**
18
+ * Dry run: load config, run decomposer + reviewer only, display results.
19
+ */
20
+ export declare function validateCommand(planPath: string, options: ParsedArgs["options"]): Promise<void>;
21
+ /**
22
+ * Remove .pi-loop/ directory and any .pi-loop-worktrees/ directories.
23
+ */
24
+ export declare function cleanCommand(): Promise<void>;
25
+ /**
26
+ * Print usage text.
27
+ */
28
+ export declare function helpCommand(): void;
29
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AA4D5C;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DhG;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDjF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA8EnD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFrG;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBlD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAuBlC"}
@@ -0,0 +1,362 @@
1
+ /**
2
+ * Command handlers — wired to the orchestrator.
3
+ */
4
+ import { existsSync } from "node:fs";
5
+ import { readFile } from "node:fs/promises";
6
+ import { rm } from "node:fs/promises";
7
+ import { resolve } from "node:path";
8
+ import { loadConfig } from "../config/loader.js";
9
+ import { loadCheckpoint } from "../core/checkpoint.js";
10
+ import { Orchestrator } from "../core/orchestrator.js";
11
+ import { evaluateTaskReadiness } from "../core/readiness-policy.js";
12
+ import { selectExecutionOrder } from "../core/scheduling-policy.js";
13
+ import { parseTasks } from "../core/task-state.js";
14
+ import { buildOrchestratorDeps } from "../core/wiring.js";
15
+ import { ensureRepo } from "../git/repo.js";
16
+ import { createLinearTaskBackend } from "../integrations/linear/backend.js";
17
+ import { logError, logPhase, logSuccess, logSummary, logTask, logVerbose } from "./output.js";
18
+ /**
19
+ * Builds CLI overrides into a partial PiLoopConfig.
20
+ */
21
+ function buildOverrides(options) {
22
+ const overrides = {};
23
+ if (options.model) {
24
+ const [provider, ...rest] = options.model.split(":");
25
+ const modelId = rest.join(":");
26
+ if (provider && modelId) {
27
+ overrides.defaultModel = { provider, modelId };
28
+ }
29
+ }
30
+ if (options.concurrency !== undefined) {
31
+ overrides.maxConcurrency = options.concurrency;
32
+ }
33
+ if (options.thinking) {
34
+ overrides.thinkingLevel = options.thinking;
35
+ }
36
+ if (options.taskBackend === "markdown" || options.taskBackend === "linear") {
37
+ overrides.taskBackend = options.taskBackend;
38
+ }
39
+ return overrides;
40
+ }
41
+ function applyLinearCliOverrides(config, options) {
42
+ if (options.linearCycle) {
43
+ config.linear.cycleName = options.linearCycle;
44
+ }
45
+ if (options.linearTeam) {
46
+ config.linear.teamId = options.linearTeam;
47
+ }
48
+ }
49
+ function validateLinearConfiguration(config) {
50
+ if (config.taskBackend !== "linear")
51
+ return [];
52
+ const errors = [];
53
+ if (!config.linear.enabled) {
54
+ errors.push("Linear backend selected but config.linear.enabled is false");
55
+ }
56
+ if (!config.linear.apiUrl.trim()) {
57
+ errors.push("Linear backend selected but config.linear.apiUrl is empty");
58
+ }
59
+ if (!config.linear.tokenEnvVar.trim()) {
60
+ errors.push("Linear backend selected but config.linear.tokenEnvVar is empty");
61
+ }
62
+ else if (!process.env[config.linear.tokenEnvVar]) {
63
+ errors.push(`Missing Linear token environment variable: ${config.linear.tokenEnvVar}`);
64
+ }
65
+ return errors;
66
+ }
67
+ /**
68
+ * Main execution: load config, create orchestrator, run.
69
+ */
70
+ export async function runCommand(planPath, options) {
71
+ logPhase("initializing");
72
+ const overrides = buildOverrides(options);
73
+ const config = await loadConfig(options.config, overrides);
74
+ applyLinearCliOverrides(config, options);
75
+ const linearErrors = validateLinearConfiguration(config);
76
+ if (linearErrors.length > 0) {
77
+ for (const err of linearErrors) {
78
+ logError(err);
79
+ }
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ logVerbose(`Model: ${config.defaultModel.provider}:${config.defaultModel.modelId}`, options.verbose ?? false);
84
+ logVerbose(`Concurrency: ${config.maxConcurrency}`, options.verbose ?? false);
85
+ logVerbose(`Thinking: ${config.thinkingLevel}`, options.verbose ?? false);
86
+ const resolvedPlan = resolve(planPath);
87
+ if (!existsSync(resolvedPlan)) {
88
+ logError(`Plan file not found: ${resolvedPlan}`);
89
+ process.exitCode = 1;
90
+ return;
91
+ }
92
+ logPhase("running");
93
+ logVerbose(`Plan: ${resolvedPlan}`, options.verbose ?? false);
94
+ const workDir = process.cwd();
95
+ await ensureRepo(workDir, config.git.autoInit);
96
+ const piLoopDir = resolve(workDir, ".pi-loop");
97
+ const tasksPath = resolve(piLoopDir, "Tasks.md");
98
+ const learningsPath = resolve(piLoopDir, "Learnings.md");
99
+ const deps = await buildOrchestratorDeps(config, resolvedPlan, tasksPath, learningsPath, workDir);
100
+ const orchestrator = new Orchestrator({
101
+ planPath: resolvedPlan,
102
+ tasksPath,
103
+ learningsPath,
104
+ config,
105
+ deps,
106
+ workDir,
107
+ });
108
+ const verdict = await orchestrator.run();
109
+ logPhase(verdict.status === "done" ? "completed" : "incomplete");
110
+ logSuccess(`Verdict: ${verdict.status}`);
111
+ if (verdict.feedback) {
112
+ logVerbose(`Feedback: ${verdict.feedback}`, true);
113
+ }
114
+ const completed = verdict.completedGoals.length;
115
+ const total = completed + verdict.remainingGoals.length;
116
+ logSummary(completed, total, 0);
117
+ if (verdict.status !== "done") {
118
+ process.exitCode = 1;
119
+ }
120
+ }
121
+ /**
122
+ * Load checkpoint, resume from where we left off.
123
+ */
124
+ export async function resumeCommand(options) {
125
+ logPhase("resuming");
126
+ const checkpoint = await loadCheckpoint();
127
+ if (!checkpoint) {
128
+ logError("No checkpoint found. Nothing to resume.");
129
+ process.exitCode = 1;
130
+ return;
131
+ }
132
+ const overrides = buildOverrides(options);
133
+ const config = await loadConfig(options.config, overrides);
134
+ applyLinearCliOverrides(config, options);
135
+ const linearErrors = validateLinearConfiguration(config);
136
+ if (linearErrors.length > 0) {
137
+ for (const err of linearErrors) {
138
+ logError(err);
139
+ }
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ logVerbose(`Resuming from phase: ${checkpoint.phase}, cycle: ${checkpoint.cycle}`, options.verbose ?? false);
144
+ logVerbose(`Config loaded: concurrency=${config.maxConcurrency}`, options.verbose ?? false);
145
+ const workDir = process.cwd();
146
+ const piLoopDir = resolve(workDir, ".pi-loop");
147
+ const tasksPath = resolve(piLoopDir, "Tasks.md");
148
+ const learningsPath = resolve(piLoopDir, "Learnings.md");
149
+ const deps = await buildOrchestratorDeps(config, checkpoint.planPath, tasksPath, learningsPath, workDir);
150
+ const orchestrator = new Orchestrator({
151
+ planPath: checkpoint.planPath,
152
+ tasksPath,
153
+ learningsPath,
154
+ config,
155
+ deps,
156
+ workDir,
157
+ });
158
+ const verdict = await orchestrator.resume(checkpoint);
159
+ logPhase(verdict.status === "done" ? "completed" : "incomplete");
160
+ logSuccess(`Verdict: ${verdict.status}`);
161
+ if (verdict.feedback) {
162
+ logVerbose(`Feedback: ${verdict.feedback}`, true);
163
+ }
164
+ if (verdict.status !== "done") {
165
+ process.exitCode = 1;
166
+ }
167
+ }
168
+ /**
169
+ * Read Tasks.md and display formatted task list.
170
+ */
171
+ export async function statusCommand() {
172
+ logPhase("status");
173
+ const config = await loadConfig();
174
+ logSuccess(`Task backend: ${config.taskBackend}`);
175
+ if (config.taskBackend === "linear") {
176
+ const linearErrors = validateLinearConfiguration(config);
177
+ if (linearErrors.length > 0) {
178
+ for (const err of linearErrors) {
179
+ logError(err);
180
+ }
181
+ process.exitCode = 1;
182
+ return;
183
+ }
184
+ const backend = createLinearTaskBackend(config.linear);
185
+ await backend.initializeCycle(0);
186
+ const ready = await backend.getReadyTasks("coder");
187
+ const scheduled = selectExecutionOrder(ready, {
188
+ role: "coder",
189
+ roleLabelPrefix: config.linear.roleLabelPrefix,
190
+ });
191
+ const skippedReasons = {};
192
+ const eligible = [];
193
+ for (const task of scheduled) {
194
+ const backendReadiness = await backend.validateDefinitionOfReady(task);
195
+ const readiness = evaluateTaskReadiness(task, backendReadiness, {
196
+ requireDescription: true,
197
+ disallowAmbiguousPlaceholders: true,
198
+ });
199
+ if (!readiness.ok) {
200
+ for (const reason of readiness.reasons) {
201
+ skippedReasons[reason] = (skippedReasons[reason] ?? 0) + 1;
202
+ }
203
+ continue;
204
+ }
205
+ eligible.push(task);
206
+ }
207
+ const snapshot = await backend.snapshotForJudge();
208
+ const doc = parseTasks(snapshot);
209
+ const blockedCount = doc.tasks.filter((task) => task.status === "rejected").length;
210
+ logSuccess(`Ready issues: ${ready.length}`);
211
+ logSuccess(`Eligible issues: ${eligible.length}`);
212
+ logSuccess(`Blocked issues: ${blockedCount}`);
213
+ if (eligible.length > 0) {
214
+ const next = eligible[0];
215
+ logVerbose(`Next candidate: ${next.id} ${next.title}`, true);
216
+ }
217
+ const skipEntries = Object.entries(skippedReasons).sort((a, b) => b[1] - a[1]);
218
+ if (skipEntries.length > 0) {
219
+ logVerbose("Skip reasons:", true);
220
+ for (const [reason, count] of skipEntries.slice(0, 5)) {
221
+ logVerbose(`- ${reason}: ${count}`, true);
222
+ }
223
+ }
224
+ return;
225
+ }
226
+ const locations = [resolve(".pi-loop", "Tasks.md"), resolve("Tasks.md")];
227
+ for (const loc of locations) {
228
+ if (existsSync(loc)) {
229
+ const content = await readFile(loc, "utf8");
230
+ const doc = parseTasks(content);
231
+ const completed = doc.tasks.filter((t) => t.status === "done").length;
232
+ for (const task of doc.tasks) {
233
+ logTask(task.id, task.title, task.status);
234
+ }
235
+ logSummary(completed, doc.tasks.length, doc.cycle);
236
+ return;
237
+ }
238
+ }
239
+ logError("No Tasks.md found in .pi-loop/ or current directory.");
240
+ process.exitCode = 1;
241
+ }
242
+ /**
243
+ * Dry run: load config, run decomposer + reviewer only, display results.
244
+ */
245
+ export async function validateCommand(planPath, options) {
246
+ logPhase("validating");
247
+ const overrides = buildOverrides(options);
248
+ const config = await loadConfig(options.config, overrides);
249
+ applyLinearCliOverrides(config, options);
250
+ const linearErrors = validateLinearConfiguration(config);
251
+ if (linearErrors.length > 0) {
252
+ for (const err of linearErrors) {
253
+ logError(err);
254
+ }
255
+ process.exitCode = 1;
256
+ return;
257
+ }
258
+ const resolvedPlan = resolve(planPath);
259
+ if (!existsSync(resolvedPlan)) {
260
+ logError(`Plan file not found: ${resolvedPlan}`);
261
+ process.exitCode = 1;
262
+ return;
263
+ }
264
+ logVerbose(`Validating plan: ${resolvedPlan}`, options.verbose ?? false);
265
+ logVerbose(`Model: ${config.defaultModel.provider}:${config.defaultModel.modelId}`, options.verbose ?? false);
266
+ logVerbose(`Concurrency: ${config.maxConcurrency}`, options.verbose ?? false);
267
+ logVerbose(`Thinking: ${config.thinkingLevel}`, options.verbose ?? false);
268
+ const workDir = process.cwd();
269
+ const piLoopDir = resolve(workDir, ".pi-loop");
270
+ const tasksPath = resolve(piLoopDir, "Tasks.md");
271
+ const learningsPath = resolve(piLoopDir, "Learnings.md");
272
+ const deps = await buildOrchestratorDeps(config, resolvedPlan, tasksPath, learningsPath, workDir);
273
+ if (config.taskBackend === "linear") {
274
+ logPhase("linear readiness dry run");
275
+ await deps.taskBackend.initializeCycle(0);
276
+ const ready = await deps.taskBackend.getReadyTasks("coder");
277
+ const scheduled = selectExecutionOrder(ready, {
278
+ role: "coder",
279
+ roleLabelPrefix: config.linear.roleLabelPrefix,
280
+ });
281
+ let eligible = 0;
282
+ let ineligible = 0;
283
+ for (const task of scheduled) {
284
+ const backendReadiness = await deps.taskBackend.validateDefinitionOfReady(task);
285
+ const readiness = evaluateTaskReadiness(task, backendReadiness, {
286
+ requireDescription: true,
287
+ disallowAmbiguousPlaceholders: true,
288
+ });
289
+ if (readiness.ok) {
290
+ eligible += 1;
291
+ logTask(task.id, task.title, "pending");
292
+ }
293
+ else {
294
+ ineligible += 1;
295
+ logTask(task.id, `${task.title} — ${readiness.reasons.join("; ")}`, "rejected");
296
+ }
297
+ }
298
+ logSuccess(`Linear validate complete: ${ready.length} ready, ${eligible} eligible, ${ineligible} ineligible`);
299
+ return;
300
+ }
301
+ // Dry run: decompose the plan and review, but don't execute
302
+ const plan = await readFile(resolvedPlan, "utf8");
303
+ const learnings = "";
304
+ logPhase("decomposing (dry run)");
305
+ const decomposer = await deps.createAgentFn("decomposer", learnings);
306
+ const tasksMarkdown = await decomposer.run(`Decompose the following plan into tasks in the Tasks.md format.\n\nPlan:\n${plan}`);
307
+ logPhase("reviewing (dry run)");
308
+ const reviewer = await deps.createAgentFn("review-optimizer", learnings);
309
+ const reviewedTasks = await reviewer.run(`Review and optimize the following task decomposition against the plan.\n\nPlan:\n${plan}\n\nTasks:\n${tasksMarkdown}`);
310
+ // Display reviewed tasks
311
+ const doc = parseTasks(reviewedTasks);
312
+ for (const task of doc.tasks) {
313
+ logTask(task.id, task.title, task.status);
314
+ }
315
+ logSuccess(`Validation complete: ${doc.tasks.length} tasks decomposed`);
316
+ }
317
+ /**
318
+ * Remove .pi-loop/ directory and any .pi-loop-worktrees/ directories.
319
+ */
320
+ export async function cleanCommand() {
321
+ logPhase("cleaning");
322
+ const targets = [resolve(".pi-loop"), resolve(".pi-loop-worktrees")];
323
+ let cleaned = false;
324
+ for (const target of targets) {
325
+ if (existsSync(target)) {
326
+ await rm(target, { recursive: true, force: true });
327
+ logSuccess(`Removed ${target}`);
328
+ cleaned = true;
329
+ }
330
+ }
331
+ if (!cleaned) {
332
+ logSuccess("Nothing to clean.");
333
+ }
334
+ }
335
+ /**
336
+ * Print usage text.
337
+ */
338
+ export function helpCommand() {
339
+ const text = `
340
+ pi-loop -- Autonomous coding loop CLI
341
+
342
+ Usage:
343
+ pi-loop run <plan.md> Execute a plan
344
+ pi-loop resume Resume from checkpoint
345
+ pi-loop status Show current task status
346
+ pi-loop validate <plan.md> Dry run -- decompose and review only
347
+ pi-loop clean Remove .pi-loop/ and worktree directories
348
+
349
+ Options:
350
+ --model <provider:modelId> Override default model
351
+ --concurrency <N> Max parallel workers
352
+ --thinking <level> Thinking level (off|minimal|low|medium|high|xhigh)
353
+ --task-backend <mode> Task backend (markdown|linear)
354
+ --linear-cycle <name> Override Linear cycle name
355
+ --linear-team <id> Override Linear team id
356
+ --config <path> Path to config file
357
+ --verbose Enable verbose output
358
+ --help Show this help
359
+ `;
360
+ process.stderr.write(text.trimStart());
361
+ }
362
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9F;;GAEG;AACH,SAAS,cAAc,CAAC,OAA8B;IACrD,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACzB,SAAS,CAAC,YAAY,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAChD,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC,QAAyB,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,UAAU,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC5E,SAAS,CAAC,WAAW,GAAG,OAAO,CAAC,WAA8B,CAAC;IAChE,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAoB,EAAE,OAA8B;IACpF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAC3C,CAAC;AACF,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAoB;IACxD,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,OAA8B;IAChF,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEzB,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,UAAU,CAAC,UAAU,MAAM,CAAC,YAAY,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC9G,UAAU,CAAC,gBAAgB,MAAM,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC9E,UAAU,CAAC,aAAa,MAAM,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAE1E,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpB,UAAU,CAAC,SAAS,YAAY,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAClG,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACrC,QAAQ,EAAE,YAAY;QACtB,SAAS;QACT,aAAa;QACb,MAAM;QACN,IAAI;QACJ,OAAO;KACP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC;IAEzC,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjE,UAAU,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,UAAU,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;IAChD,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;IACxD,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA8B;IACjE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,QAAQ,CAAC,yCAAyC,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,UAAU,CAAC,wBAAwB,UAAU,CAAC,KAAK,YAAY,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC7G,UAAU,CAAC,8BAA8B,MAAM,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAE5F,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACzG,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACrC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,SAAS;QACT,aAAa;QACb,MAAM;QACN,IAAI;QACJ,OAAO;KACP,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEtD,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjE,UAAU,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,UAAU,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IAClC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,UAAU,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE;YAC7C,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe;SAC9C,CAAC,CAAC;QACH,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE;gBAC/D,kBAAkB,EAAE,IAAI;gBACxB,6BAA6B,EAAE,IAAI;aACnC,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBACnB,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;oBACxC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC5D,CAAC;gBACD,SAAS;YACV,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACnF,UAAU,CAAC,iBAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,UAAU,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,UAAU,CAAC,mBAAmB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvD,UAAU,CAAC,KAAK,MAAM,KAAK,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;QACF,CAAC;QACD,OAAO;IACR,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAEtE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAED,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO;QACR,CAAC;IACF,CAAC;IAED,QAAQ,CAAC,sDAAsD,CAAC,CAAC;IACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAA8B;IACrF,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IAED,UAAU,CAAC,oBAAoB,YAAY,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IACzE,UAAU,CAAC,UAAU,MAAM,CAAC,YAAY,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC9G,UAAU,CAAC,gBAAgB,MAAM,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC9E,UAAU,CAAC,aAAa,MAAM,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAElG,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE;YAC7C,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe;SAC9C,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE;gBAC/D,kBAAkB,EAAE,IAAI;gBACxB,6BAA6B,EAAE,IAAI;aACnC,CAAC,CAAC;YAEH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,QAAQ,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACP,UAAU,IAAI,CAAC,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACjF,CAAC;QACF,CAAC;QAED,UAAU,CAAC,6BAA6B,KAAK,CAAC,MAAM,WAAW,QAAQ,cAAc,UAAU,aAAa,CAAC,CAAC;QAC9G,OAAO;IACR,CAAC;IAED,4DAA4D;IAC5D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,GAAG,CACzC,6EAA6E,IAAI,EAAE,CACnF,CAAC;IAEF,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,GAAG,CACvC,oFAAoF,IAAI,eAAe,aAAa,EAAE,CACtH,CAAC;IAEF,yBAAyB;IACzB,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,wBAAwB,GAAG,CAAC,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAErE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,UAAU,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;YAChC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;IACF,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,UAAU,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IAC1B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;CAoBb,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACxC,CAAC"}