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,33 @@
1
+ /**
2
+ * Terminal formatting utilities for CLI output.
3
+ */
4
+ /**
5
+ * Prints a colored phase header like:
6
+ * ━━━ DECOMPOSING ━━━
7
+ */
8
+ export declare function logPhase(phase: string): void;
9
+ /**
10
+ * Prints a task with a status icon.
11
+ */
12
+ export declare function logTask(taskId: string, title: string, status: string): void;
13
+ /**
14
+ * Prints an agent event in dim.
15
+ */
16
+ export declare function logAgentEvent(agentRole: string, event: string): void;
17
+ /**
18
+ * Prints a red error message.
19
+ */
20
+ export declare function logError(message: string): void;
21
+ /**
22
+ * Prints a green success message.
23
+ */
24
+ export declare function logSuccess(message: string): void;
25
+ /**
26
+ * Prints a final summary box.
27
+ */
28
+ export declare function logSummary(completed: number, total: number, cycles: number): void;
29
+ /**
30
+ * Only prints if verbose is true.
31
+ */
32
+ export declare function logVerbose(message: string, verbose: boolean): void;
33
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACZ,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAGlE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Terminal formatting utilities for CLI output.
3
+ */
4
+ const COLORS = {
5
+ reset: "\x1b[0m",
6
+ bold: "\x1b[1m",
7
+ dim: "\x1b[2m",
8
+ red: "\x1b[31m",
9
+ green: "\x1b[32m",
10
+ yellow: "\x1b[33m",
11
+ blue: "\x1b[34m",
12
+ magenta: "\x1b[35m",
13
+ cyan: "\x1b[36m",
14
+ };
15
+ const STATUS_ICONS = {
16
+ done: "\u2713",
17
+ "in-progress": "\u27F3",
18
+ pending: "\u25CB",
19
+ rejected: "\u2717",
20
+ "needs-decomposition": "\u25C8",
21
+ };
22
+ function write(text) {
23
+ process.stderr.write(text);
24
+ }
25
+ /**
26
+ * Prints a colored phase header like:
27
+ * ━━━ DECOMPOSING ━━━
28
+ */
29
+ export function logPhase(phase) {
30
+ write(`\n${COLORS.bold}${COLORS.cyan}\u2501\u2501\u2501 ${phase.toUpperCase()} \u2501\u2501\u2501${COLORS.reset}\n`);
31
+ }
32
+ /**
33
+ * Prints a task with a status icon.
34
+ */
35
+ export function logTask(taskId, title, status) {
36
+ const icon = STATUS_ICONS[status] ?? "\u25CB";
37
+ const color = getStatusColor(status);
38
+ write(` ${color}${icon}${COLORS.reset} ${COLORS.dim}[${taskId}]${COLORS.reset} ${title}\n`);
39
+ }
40
+ /**
41
+ * Prints an agent event in dim.
42
+ */
43
+ export function logAgentEvent(agentRole, event) {
44
+ write(`${COLORS.dim} [${agentRole}] ${event}${COLORS.reset}\n`);
45
+ }
46
+ /**
47
+ * Prints a red error message.
48
+ */
49
+ export function logError(message) {
50
+ write(`${COLORS.red}${COLORS.bold}Error:${COLORS.reset} ${COLORS.red}${message}${COLORS.reset}\n`);
51
+ }
52
+ /**
53
+ * Prints a green success message.
54
+ */
55
+ export function logSuccess(message) {
56
+ write(`${COLORS.green}${COLORS.bold}${message}${COLORS.reset}\n`);
57
+ }
58
+ /**
59
+ * Prints a final summary box.
60
+ */
61
+ export function logSummary(completed, total, cycles) {
62
+ const bar = "\u2501".repeat(40);
63
+ write(`\n${COLORS.bold}${bar}${COLORS.reset}\n`);
64
+ write(` ${COLORS.bold}Summary${COLORS.reset}\n`);
65
+ write(` Tasks: ${completed}/${total} completed\n`);
66
+ write(` Cycles: ${cycles}\n`);
67
+ if (completed === total) {
68
+ write(` ${COLORS.green}${COLORS.bold}All tasks completed!${COLORS.reset}\n`);
69
+ }
70
+ else {
71
+ write(` ${COLORS.yellow}${total - completed} task(s) remaining${COLORS.reset}\n`);
72
+ }
73
+ write(`${COLORS.bold}${bar}${COLORS.reset}\n`);
74
+ }
75
+ /**
76
+ * Only prints if verbose is true.
77
+ */
78
+ export function logVerbose(message, verbose) {
79
+ if (!verbose)
80
+ return;
81
+ write(`${COLORS.dim} ${message}${COLORS.reset}\n`);
82
+ }
83
+ function getStatusColor(status) {
84
+ switch (status) {
85
+ case "done":
86
+ return COLORS.green;
87
+ case "in-progress":
88
+ return COLORS.blue;
89
+ case "pending":
90
+ return COLORS.dim;
91
+ case "rejected":
92
+ return COLORS.red;
93
+ case "needs-decomposition":
94
+ return COLORS.magenta;
95
+ default:
96
+ return COLORS.dim;
97
+ }
98
+ }
99
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PiLoopConfig } from "./types.js";
2
+ export declare const DEFAULT_CONFIG: PiLoopConfig;
3
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,YA6B5B,CAAC"}
@@ -0,0 +1,31 @@
1
+ export const DEFAULT_CONFIG = {
2
+ defaultModel: {
3
+ provider: "anthropic",
4
+ modelId: "claude-sonnet-4-20250514",
5
+ },
6
+ agentsDir: "./agents",
7
+ maxConcurrency: 1,
8
+ maxCycles: 20,
9
+ thinkingLevel: "medium",
10
+ taskBackend: "markdown",
11
+ git: {
12
+ autoInit: true,
13
+ commitPrefix: "[pi-loop]",
14
+ worktreeBaseDir: ".pi-loop-worktrees",
15
+ },
16
+ linear: {
17
+ enabled: false,
18
+ apiUrl: "https://api.linear.app/graphql",
19
+ readyStateName: "Ready",
20
+ inProgressStateName: "In Progress",
21
+ inReviewStateName: "In Review",
22
+ doneStateName: "Done",
23
+ blockedStateName: "Blocked",
24
+ needsDecisionLabel: "needs:decision",
25
+ roleLabelPrefix: "agent:",
26
+ maxFilesPerIssue: 8,
27
+ driftStopThreshold: 5,
28
+ tokenEnvVar: "LINEAR_API_KEY",
29
+ },
30
+ };
31
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC3C,YAAY,EAAE;QACb,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,0BAA0B;KACnC;IACD,SAAS,EAAE,UAAU;IACrB,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,QAAQ;IACvB,WAAW,EAAE,UAAU;IACvB,GAAG,EAAE;QACJ,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,oBAAoB;KACrC;IACD,MAAM,EAAE;QACP,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,gCAAgC;QACxC,cAAc,EAAE,OAAO;QACvB,mBAAmB,EAAE,aAAa;QAClC,iBAAiB,EAAE,WAAW;QAC9B,aAAa,EAAE,MAAM;QACrB,gBAAgB,EAAE,SAAS;QAC3B,kBAAkB,EAAE,gBAAgB;QACpC,eAAe,EAAE,QAAQ;QACzB,gBAAgB,EAAE,CAAC;QACnB,kBAAkB,EAAE,CAAC;QACrB,WAAW,EAAE,gBAAgB;KAC7B;CACD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PiLoopConfig } from "./types.js";
2
+ /**
3
+ * Load config from file, merging with defaults.
4
+ * CLI flags take precedence over file config, which takes precedence over defaults.
5
+ */
6
+ export declare function loadConfig(configPath?: string, cliOverrides?: Partial<PiLoopConfig>): Promise<PiLoopConfig>;
7
+ /**
8
+ * Helper for users to define config with type safety.
9
+ */
10
+ export declare function defineConfig(config: Partial<PiLoopConfig>): Partial<PiLoopConfig>;
11
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBjH;AAgDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAEjF"}
@@ -0,0 +1,70 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { DEFAULT_CONFIG } from "./defaults.js";
5
+ const CONFIG_FILENAMES = ["pi-loop.config.ts", "pi-loop.config.js", "pi-loop.config.mjs"];
6
+ /**
7
+ * Load config from file, merging with defaults.
8
+ * CLI flags take precedence over file config, which takes precedence over defaults.
9
+ */
10
+ export async function loadConfig(configPath, cliOverrides) {
11
+ let fileConfig = {};
12
+ const resolvedPath = configPath ? resolve(configPath) : findConfigFile();
13
+ if (resolvedPath && existsSync(resolvedPath)) {
14
+ try {
15
+ const url = pathToFileURL(resolvedPath).href;
16
+ const mod = await import(url);
17
+ fileConfig = mod.default ?? mod;
18
+ }
19
+ catch {
20
+ // Config file exists but failed to load — use defaults
21
+ }
22
+ }
23
+ return mergeConfig(DEFAULT_CONFIG, fileConfig, cliOverrides ?? {});
24
+ }
25
+ function findConfigFile() {
26
+ for (const name of CONFIG_FILENAMES) {
27
+ const path = resolve(name);
28
+ if (existsSync(path))
29
+ return path;
30
+ }
31
+ return undefined;
32
+ }
33
+ function mergeConfig(defaults, file, cli) {
34
+ return {
35
+ defaultModel: cli.defaultModel ?? file.defaultModel ?? defaults.defaultModel,
36
+ agentsDir: cli.agentsDir ?? file.agentsDir ?? defaults.agentsDir,
37
+ maxConcurrency: cli.maxConcurrency ?? file.maxConcurrency ?? defaults.maxConcurrency,
38
+ maxCycles: cli.maxCycles ?? file.maxCycles ?? defaults.maxCycles,
39
+ thinkingLevel: cli.thinkingLevel ?? file.thinkingLevel ?? defaults.thinkingLevel,
40
+ taskBackend: cli.taskBackend ?? file.taskBackend ?? defaults.taskBackend,
41
+ git: {
42
+ autoInit: cli.git?.autoInit ?? file.git?.autoInit ?? defaults.git.autoInit,
43
+ commitPrefix: cli.git?.commitPrefix ?? file.git?.commitPrefix ?? defaults.git.commitPrefix,
44
+ worktreeBaseDir: cli.git?.worktreeBaseDir ?? file.git?.worktreeBaseDir ?? defaults.git.worktreeBaseDir,
45
+ },
46
+ linear: {
47
+ enabled: cli.linear?.enabled ?? file.linear?.enabled ?? defaults.linear.enabled,
48
+ apiUrl: cli.linear?.apiUrl ?? file.linear?.apiUrl ?? defaults.linear.apiUrl,
49
+ teamId: cli.linear?.teamId ?? file.linear?.teamId ?? defaults.linear.teamId,
50
+ cycleName: cli.linear?.cycleName ?? file.linear?.cycleName ?? defaults.linear.cycleName,
51
+ readyStateName: cli.linear?.readyStateName ?? file.linear?.readyStateName ?? defaults.linear.readyStateName,
52
+ inProgressStateName: cli.linear?.inProgressStateName ?? file.linear?.inProgressStateName ?? defaults.linear.inProgressStateName,
53
+ inReviewStateName: cli.linear?.inReviewStateName ?? file.linear?.inReviewStateName ?? defaults.linear.inReviewStateName,
54
+ doneStateName: cli.linear?.doneStateName ?? file.linear?.doneStateName ?? defaults.linear.doneStateName,
55
+ blockedStateName: cli.linear?.blockedStateName ?? file.linear?.blockedStateName ?? defaults.linear.blockedStateName,
56
+ needsDecisionLabel: cli.linear?.needsDecisionLabel ?? file.linear?.needsDecisionLabel ?? defaults.linear.needsDecisionLabel,
57
+ roleLabelPrefix: cli.linear?.roleLabelPrefix ?? file.linear?.roleLabelPrefix ?? defaults.linear.roleLabelPrefix,
58
+ maxFilesPerIssue: cli.linear?.maxFilesPerIssue ?? file.linear?.maxFilesPerIssue ?? defaults.linear.maxFilesPerIssue,
59
+ driftStopThreshold: cli.linear?.driftStopThreshold ?? file.linear?.driftStopThreshold ?? defaults.linear.driftStopThreshold,
60
+ tokenEnvVar: cli.linear?.tokenEnvVar ?? file.linear?.tokenEnvVar ?? defaults.linear.tokenEnvVar,
61
+ },
62
+ };
63
+ }
64
+ /**
65
+ * Helper for users to define config with type safety.
66
+ */
67
+ export function defineConfig(config) {
68
+ return config;
69
+ }
70
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Configuration types for pi-loop.
3
+ */
4
+ export interface ModelConfig {
5
+ provider: string;
6
+ modelId: string;
7
+ }
8
+ export interface GitConfig {
9
+ autoInit: boolean;
10
+ commitPrefix: string;
11
+ worktreeBaseDir: string;
12
+ }
13
+ export type TaskBackendMode = "markdown" | "linear";
14
+ export interface LinearConfig {
15
+ enabled: boolean;
16
+ apiUrl: string;
17
+ teamId?: string;
18
+ cycleName?: string;
19
+ readyStateName: string;
20
+ inProgressStateName: string;
21
+ inReviewStateName: string;
22
+ doneStateName: string;
23
+ blockedStateName: string;
24
+ needsDecisionLabel: string;
25
+ roleLabelPrefix: string;
26
+ maxFilesPerIssue: number;
27
+ driftStopThreshold: number;
28
+ tokenEnvVar: string;
29
+ }
30
+ export interface PiLoopConfig {
31
+ defaultModel: ModelConfig;
32
+ agentsDir: string;
33
+ maxConcurrency: number;
34
+ maxCycles: number;
35
+ thinkingLevel: ThinkingLevel;
36
+ git: GitConfig;
37
+ taskBackend: TaskBackendMode;
38
+ linear: LinearConfig;
39
+ }
40
+ export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,YAAY,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Configuration types for pi-loop.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,18 @@
1
+ export type OrchestratorPhase = "init" | "decomposing" | "reviewing-tasks" | "sub-decomposing" | "executing" | "judging" | "re-planning" | "completed";
2
+ export interface CheckpointState {
3
+ phase: OrchestratorPhase;
4
+ cycle: number;
5
+ planHash: string;
6
+ planPath: string;
7
+ tasksSnapshot: string;
8
+ backendContext?: {
9
+ currentTaskId?: string;
10
+ lastSyncedAt?: string;
11
+ reconciliationSummary?: string;
12
+ };
13
+ timestamp: string;
14
+ }
15
+ export declare function saveCheckpoint(state: CheckpointState, workDir?: string): Promise<void>;
16
+ export declare function loadCheckpoint(workDir?: string): Promise<CheckpointState | null>;
17
+ export declare function clearCheckpoint(workDir?: string): Promise<void>;
18
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/core/checkpoint.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAC1B,MAAM,GACN,aAAa,GACb,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,GACX,SAAS,GACT,aAAa,GACb,WAAW,CAAC;AAEf,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5F;AAED,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAStF;AAED,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE"}
@@ -0,0 +1,32 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ const CHECKPOINT_DIR = ".pi-loop";
5
+ const CHECKPOINT_FILE = "checkpoint.json";
6
+ function checkpointPath(workDir) {
7
+ const base = workDir ?? process.cwd();
8
+ return join(base, CHECKPOINT_DIR, CHECKPOINT_FILE);
9
+ }
10
+ export async function saveCheckpoint(state, workDir) {
11
+ const filePath = checkpointPath(workDir);
12
+ const dir = join(workDir ?? process.cwd(), CHECKPOINT_DIR);
13
+ if (!existsSync(dir)) {
14
+ await mkdir(dir, { recursive: true });
15
+ }
16
+ await writeFile(filePath, JSON.stringify(state, null, "\t"), "utf8");
17
+ }
18
+ export async function loadCheckpoint(workDir) {
19
+ const filePath = checkpointPath(workDir);
20
+ if (!existsSync(filePath)) {
21
+ return null;
22
+ }
23
+ const raw = await readFile(filePath, "utf8");
24
+ return JSON.parse(raw);
25
+ }
26
+ export async function clearCheckpoint(workDir) {
27
+ const filePath = checkpointPath(workDir);
28
+ if (existsSync(filePath)) {
29
+ await rm(filePath);
30
+ }
31
+ }
32
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/core/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA0BjC,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C,SAAS,cAAc,CAAC,OAAgB;IACvC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAsB,EAAE,OAAgB;IAC5E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAE3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface JudgeVerdict {
2
+ status: "done" | "not_done";
3
+ completedGoals: string[];
4
+ remainingGoals: string[];
5
+ driftDetected: boolean;
6
+ feedback: string;
7
+ testsPass: boolean;
8
+ }
9
+ export declare function buildJudgePrompt(plan: string, tasks: string, learnings: string, gitLog: string, testResults: string): string;
10
+ export declare function parseJudgeVerdict(response: string): JudgeVerdict;
11
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/core/judge.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GACjB,MAAM,CAqCR;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAoDhE"}
@@ -0,0 +1,91 @@
1
+ export function buildJudgePrompt(plan, tasks, learnings, gitLog, testResults) {
2
+ return `You are a project judge. Evaluate whether the plan goals have been fully achieved.
3
+
4
+ ## Plan
5
+ ${plan}
6
+
7
+ ## Current Tasks
8
+ ${tasks}
9
+
10
+ ## Learnings
11
+ ${learnings}
12
+
13
+ ## Recent Git Log
14
+ ${gitLog}
15
+
16
+ ## Test Results
17
+ ${testResults}
18
+
19
+ ## Instructions
20
+ Analyze the above and produce a JSON verdict inside a \`\`\`json code block with this exact shape:
21
+
22
+ \`\`\`json
23
+ {
24
+ "status": "done" | "not_done",
25
+ "completedGoals": ["list of completed goals"],
26
+ "remainingGoals": ["list of remaining goals"],
27
+ "driftDetected": false,
28
+ "feedback": "summary of what was accomplished and what remains",
29
+ "testsPass": true
30
+ }
31
+ \`\`\`
32
+
33
+ Rules:
34
+ - "status" is "done" only if ALL plan goals are met and tests pass.
35
+ - "driftDetected" is true if implementation has diverged from the plan.
36
+ - "feedback" should be actionable for the next cycle if status is "not_done".
37
+ - "testsPass" reflects whether the test results above indicate success.`;
38
+ }
39
+ export function parseJudgeVerdict(response) {
40
+ // Strategy 1: Extract JSON from a code block
41
+ const jsonBlockMatch = response.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);
42
+ if (jsonBlockMatch) {
43
+ try {
44
+ const parsed = JSON.parse(jsonBlockMatch[1]);
45
+ if (parsed.status === "done" || parsed.status === "not_done") {
46
+ return {
47
+ status: parsed.status,
48
+ completedGoals: Array.isArray(parsed.completedGoals) ? parsed.completedGoals : [],
49
+ remainingGoals: Array.isArray(parsed.remainingGoals) ? parsed.remainingGoals : [],
50
+ driftDetected: Boolean(parsed.driftDetected),
51
+ feedback: String(parsed.feedback ?? ""),
52
+ testsPass: Boolean(parsed.testsPass),
53
+ };
54
+ }
55
+ }
56
+ catch {
57
+ // JSON parse failed, fall through to heuristic
58
+ }
59
+ }
60
+ // Strategy 2: Look for inline JSON (no code block)
61
+ const inlineJsonMatch = response.match(/\{[\s\S]*"status"\s*:\s*"(done|not_done)"[\s\S]*\}/);
62
+ if (inlineJsonMatch) {
63
+ try {
64
+ const parsed = JSON.parse(inlineJsonMatch[0]);
65
+ return {
66
+ status: parsed.status,
67
+ completedGoals: Array.isArray(parsed.completedGoals) ? parsed.completedGoals : [],
68
+ remainingGoals: Array.isArray(parsed.remainingGoals) ? parsed.remainingGoals : [],
69
+ driftDetected: Boolean(parsed.driftDetected),
70
+ feedback: String(parsed.feedback ?? ""),
71
+ testsPass: Boolean(parsed.testsPass),
72
+ };
73
+ }
74
+ catch {
75
+ // JSON parse failed, fall through to heuristic
76
+ }
77
+ }
78
+ // Strategy 3: Keyword heuristic — if we can't parse JSON, infer from text
79
+ const upper = response.toUpperCase();
80
+ const hasDone = upper.includes("ALL GOALS") && (upper.includes("MET") || upper.includes("ACHIEVED") || upper.includes("COMPLETE"));
81
+ const hasNotDone = upper.includes("REMAINING") || upper.includes("NOT DONE") || upper.includes("NOT_DONE") || upper.includes("INCOMPLETE");
82
+ return {
83
+ status: hasDone && !hasNotDone ? "done" : "not_done",
84
+ completedGoals: [],
85
+ remainingGoals: [],
86
+ driftDetected: false,
87
+ feedback: `Judge response could not be parsed as JSON. Raw response: ${response.slice(0, 500)}`,
88
+ testsPass: false,
89
+ };
90
+ }
91
+ //# sourceMappingURL=judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/core/judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function readLearnings(path: string): Promise<string>;
2
+ export declare function appendLearning(path: string, entry: string): Promise<void>;
3
+ export declare function summarizeLearnings(content: string, maxLength: number): string;
4
+ //# sourceMappingURL=learnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learnings.d.ts","sourceRoot":"","sources":["../../src/core/learnings.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjE;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAsB7E"}
@@ -0,0 +1,33 @@
1
+ import { readFile, appendFile } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ export async function readLearnings(path) {
4
+ if (!existsSync(path)) {
5
+ return "";
6
+ }
7
+ return readFile(path, "utf8");
8
+ }
9
+ export async function appendLearning(path, entry) {
10
+ const timestamp = new Date().toISOString();
11
+ const formatted = `\n## ${timestamp}\n\n${entry}\n`;
12
+ await appendFile(path, formatted, "utf8");
13
+ }
14
+ export function summarizeLearnings(content, maxLength) {
15
+ if (content.length <= maxLength) {
16
+ return content;
17
+ }
18
+ // Split into individual entries by ## headings
19
+ const entries = content.split(/\n(?=## \d{4}-)/);
20
+ // Keep newest entries (they're at the end)
21
+ const kept = [];
22
+ let totalLength = 0;
23
+ for (let i = entries.length - 1; i >= 0; i--) {
24
+ const entry = entries[i];
25
+ if (totalLength + entry.length > maxLength && kept.length > 0) {
26
+ break;
27
+ }
28
+ kept.unshift(entry);
29
+ totalLength += entry.length;
30
+ }
31
+ return kept.join("\n");
32
+ }
33
+ //# sourceMappingURL=learnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learnings.js","sourceRoot":"","sources":["../../src/core/learnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IAC/D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,QAAQ,SAAS,OAAO,KAAK,IAAI,CAAC;IACpD,MAAM,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,SAAiB;IACpE,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,+CAA+C;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM;QACP,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { AgentDefinition, AgentRole } from "../agents/types.js";
2
+ import type { PiLoopConfig } from "../config/types.js";
3
+ import { type CheckpointState, type OrchestratorPhase } from "./checkpoint.js";
4
+ import { type JudgeVerdict } from "./judge.js";
5
+ import type { TaskBackend } from "./task-backend.js";
6
+ import { type Task } from "./task-state.js";
7
+ /**
8
+ * Minimal agent interface for orchestrator use.
9
+ * The full Agent implementation is provided via the factory function.
10
+ */
11
+ export interface Agent {
12
+ role: AgentRole;
13
+ definition: AgentDefinition;
14
+ run(prompt: string): Promise<string>;
15
+ }
16
+ export interface WorkerResult {
17
+ taskId: string;
18
+ success: boolean;
19
+ output: string;
20
+ commitHash?: string;
21
+ changedFiles?: string[];
22
+ }
23
+ export interface OrchestratorDeps {
24
+ createAgentFn: (role: AgentRole, learnings: string) => Promise<Agent>;
25
+ dispatchBatchFn: (tasks: Task[], config: PiLoopConfig) => Promise<WorkerResult[]>;
26
+ taskBackend: TaskBackend;
27
+ }
28
+ export interface OrchestratorOptions {
29
+ planPath: string;
30
+ tasksPath: string;
31
+ learningsPath: string;
32
+ config: PiLoopConfig;
33
+ deps: OrchestratorDeps;
34
+ workDir?: string;
35
+ }
36
+ export type { OrchestratorPhase };
37
+ export declare class Orchestrator {
38
+ private phase;
39
+ private cycle;
40
+ private planHash;
41
+ private readonly planPath;
42
+ private readonly tasksPath;
43
+ private readonly learningsPath;
44
+ private readonly config;
45
+ private readonly deps;
46
+ private readonly workDir;
47
+ constructor(options: OrchestratorOptions);
48
+ run(): Promise<JudgeVerdict>;
49
+ resume(checkpoint: CheckpointState): Promise<JudgeVerdict>;
50
+ private log;
51
+ private executeFromPhase;
52
+ private phaseInit;
53
+ private phaseDecompose;
54
+ private phaseReviewTasks;
55
+ private phaseSubDecompose;
56
+ private phaseExecute;
57
+ private phaseJudge;
58
+ private phaseRePlan;
59
+ private saveCurrentCheckpoint;
60
+ private withBackendRetry;
61
+ private safeMarkNeedsDecision;
62
+ private countRejectedTasks;
63
+ }
64
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAItB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,YAAY,EAAuC,MAAM,YAAY,CAAC;AAKpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,IAAI,EAA8C,MAAM,iBAAiB,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IACtE,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAClF,WAAW,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,qBAAa,YAAY;IACxB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,mBAAmB;IASlC,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IAU5B,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAShE,OAAO,CAAC,GAAG;YAKG,gBAAgB;YAgFhB,SAAS;YAOT,cAAc;YA8Dd,gBAAgB;YAmDhB,iBAAiB;YA8DjB,YAAY;YAqIZ,UAAU;YAuCV,WAAW;YASX,qBAAqB;YAqBrB,gBAAgB;YAqBhB,qBAAqB;IAYnC,OAAO,CAAC,kBAAkB;CAS1B"}