pi-harness-runtime 1.1.50 → 1.1.77

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 (202) hide show
  1. package/CHANGELOG.md +30 -9
  2. package/README.md +119 -0
  3. package/harness/langchain/agents.d.ts +143 -0
  4. package/harness/langchain/agents.test.d.ts +2 -0
  5. package/harness/langchain/agents.ts +196 -13
  6. package/harness/langchain/checkpointer.d.ts +48 -0
  7. package/harness/langchain/checkpointer.test.d.ts +8 -0
  8. package/harness/langchain/cron-cli.d.ts +12 -0
  9. package/harness/langchain/cron-cli.ts +169 -0
  10. package/harness/langchain/daemon.d.ts +161 -0
  11. package/harness/langchain/daemon.test.d.ts +11 -0
  12. package/harness/langchain/daemon.test.ts +3 -1
  13. package/harness/langchain/daemon.ts +230 -12
  14. package/harness/langchain/file-tools.d.ts +97 -0
  15. package/harness/langchain/file-tools.ts +14 -6
  16. package/harness/langchain/graph.d.ts +706 -0
  17. package/harness/langchain/graph.ts +158 -25
  18. package/harness/langchain/model-router.d.ts +63 -0
  19. package/harness/langchain/model-router.test.d.ts +2 -0
  20. package/harness/langchain/model-router.test.ts +191 -0
  21. package/harness/langchain/model-router.ts +188 -0
  22. package/harness/langchain/models.d.ts +72 -0
  23. package/harness/langchain/models.ts +111 -49
  24. package/harness/langchain/ping-pong-middleware.d.ts +28 -0
  25. package/harness/langchain/ping-pong-middleware.test.d.ts +2 -0
  26. package/harness/langchain/ping-pong-middleware.test.ts +69 -0
  27. package/harness/langchain/ping-pong-middleware.ts +204 -0
  28. package/harness/langchain/run.d.ts +15 -0
  29. package/harness/langchain/run.ts +15 -3
  30. package/harness/langchain/scoreboard.test.d.ts +13 -0
  31. package/harness/langchain/scoreboard.test.ts +23 -1
  32. package/harness/langchain/status-line.d.ts +91 -0
  33. package/harness/langchain/status-line.test.d.ts +8 -0
  34. package/harness/langchain/surge.d.ts +103 -0
  35. package/harness/langchain/surge.test.d.ts +10 -0
  36. package/harness/langchain/surge.test.ts +179 -0
  37. package/harness/langchain/surge.ts +188 -19
  38. package/harness/langchain/widget.d.ts +105 -0
  39. package/harness/langchain/widget.test.d.ts +8 -0
  40. package/harness/ssh-detach-interceptor.test.ts +263 -0
  41. package/harness/ssh-detach-interceptor.ts +438 -0
  42. package/index.ts +212 -47
  43. package/package.json +4 -2
  44. package/packages/a2a-adapter/package.json +1 -1
  45. package/packages/architecture-generator/package.json +1 -1
  46. package/packages/auth/package.json +1 -1
  47. package/packages/autonomous-refactor/package.json +1 -1
  48. package/packages/autonomous-runtime/package.json +1 -1
  49. package/packages/cache-strategy/package.json +1 -1
  50. package/packages/capability-registry/package.json +1 -1
  51. package/packages/checkpoint/package.json +1 -1
  52. package/packages/cli-plugin-sdk/package.json +1 -1
  53. package/packages/clipboard/package.json +1 -1
  54. package/packages/clipboard-plugin/package.json +1 -1
  55. package/packages/code-generation/package.json +1 -1
  56. package/packages/code-review/package.json +1 -1
  57. package/packages/codex-adapter/package.json +1 -1
  58. package/packages/config-capture/package.json +1 -1
  59. package/packages/context-compiler/package.json +1 -1
  60. package/packages/context-discovery/package.json +1 -1
  61. package/packages/context-manager/package.json +1 -1
  62. package/packages/cookie-sanitizer/package.json +1 -1
  63. package/packages/cost-optimizer/package.json +1 -1
  64. package/packages/dependency-analyzer/package.json +1 -1
  65. package/packages/django-plugin/package.json +1 -1
  66. package/packages/doc-generator/package.json +1 -1
  67. package/packages/evaluation-engine/package.json +1 -1
  68. package/packages/evaluation-runner/package.json +1 -1
  69. package/packages/event-bus/package.json +1 -1
  70. package/packages/event-store/package.json +1 -1
  71. package/packages/experience-replay/package.json +1 -1
  72. package/packages/feedback-collector/package.json +1 -1
  73. package/packages/file-copy-helper/package.json +1 -1
  74. package/packages/framework-detector/package.json +1 -1
  75. package/packages/framework-plugin-sdk/package.json +1 -1
  76. package/packages/frappe-plugin/package.json +1 -1
  77. package/packages/generic-web-plugin/package.json +1 -1
  78. package/packages/health-monitor/package.json +1 -1
  79. package/packages/intent-analyzer/dist/src/index.d.ts +2 -0
  80. package/packages/intent-analyzer/dist/src/index.d.ts.map +1 -1
  81. package/packages/intent-analyzer/dist/src/index.js +1 -0
  82. package/packages/intent-analyzer/dist/src/index.js.map +1 -1
  83. package/packages/intent-analyzer/dist/src/ping-pong.d.ts +56 -0
  84. package/packages/intent-analyzer/dist/src/ping-pong.d.ts.map +1 -0
  85. package/packages/intent-analyzer/dist/src/ping-pong.js +286 -0
  86. package/packages/intent-analyzer/dist/src/ping-pong.js.map +1 -0
  87. package/packages/intent-analyzer/package.json +1 -1
  88. package/packages/intent-analyzer/src/index.ts +13 -0
  89. package/packages/intent-analyzer/src/ping-pong.ts +387 -0
  90. package/packages/intent-analyzer/test/ping-pong.test.ts +96 -0
  91. package/packages/jev-judge/README.md +234 -0
  92. package/packages/jev-judge/dist/decision-engine.d.ts +100 -0
  93. package/packages/jev-judge/dist/decision-engine.d.ts.map +1 -0
  94. package/packages/jev-judge/dist/decision-engine.js +151 -0
  95. package/packages/jev-judge/dist/decision-engine.js.map +1 -0
  96. package/packages/jev-judge/dist/e2e-judge.d.ts +61 -0
  97. package/packages/jev-judge/dist/e2e-judge.d.ts.map +1 -0
  98. package/packages/jev-judge/dist/e2e-judge.js +268 -0
  99. package/packages/jev-judge/dist/e2e-judge.js.map +1 -0
  100. package/packages/jev-judge/dist/flaky-detector.d.ts +34 -0
  101. package/packages/jev-judge/dist/flaky-detector.d.ts.map +1 -0
  102. package/packages/jev-judge/dist/flaky-detector.js +154 -0
  103. package/packages/jev-judge/dist/flaky-detector.js.map +1 -0
  104. package/packages/jev-judge/dist/index.d.ts +77 -0
  105. package/packages/jev-judge/dist/index.d.ts.map +1 -0
  106. package/packages/jev-judge/dist/index.js +271 -0
  107. package/packages/jev-judge/dist/index.js.map +1 -0
  108. package/packages/jev-judge/dist/types.d.ts +97 -0
  109. package/packages/jev-judge/dist/types.d.ts.map +1 -0
  110. package/packages/jev-judge/dist/types.js +8 -0
  111. package/packages/jev-judge/dist/types.js.map +1 -0
  112. package/packages/jev-judge/package.json +46 -0
  113. package/packages/jev-judge/src/decision-engine.ts +231 -0
  114. package/packages/jev-judge/src/e2e-judge.ts +364 -0
  115. package/packages/jev-judge/src/flaky-detector.ts +190 -0
  116. package/packages/jev-judge/src/index.ts +345 -0
  117. package/packages/jev-judge/src/types.ts +131 -0
  118. package/packages/knowledge-graph/package.json +1 -1
  119. package/packages/knowledge-retrieval/package.json +1 -1
  120. package/packages/laravel-plugin/package.json +1 -1
  121. package/packages/learning-engine/package.json +1 -1
  122. package/packages/mcp-adapter/package.json +1 -1
  123. package/packages/memory-engine/package.json +1 -1
  124. package/packages/milestone-manager/package.json +1 -1
  125. package/packages/model-registry/package.json +1 -1
  126. package/packages/nextjs-plugin/package.json +1 -1
  127. package/packages/notification/package.json +1 -1
  128. package/packages/observability/package.json +1 -1
  129. package/packages/okf-indexer/package.json +1 -1
  130. package/packages/performance-optimizer/package.json +1 -1
  131. package/packages/privilege-broker/package.json +1 -1
  132. package/packages/project-analyzer/package.json +1 -1
  133. package/packages/project-bootstrap/package.json +1 -1
  134. package/packages/projection-engine/package.json +1 -1
  135. package/packages/prompt-compiler/package.json +1 -1
  136. package/packages/prompt-versioning/package.json +1 -1
  137. package/packages/provider-adapter-sdk/package.json +1 -1
  138. package/packages/provider-router/package.json +1 -1
  139. package/packages/provider-selector/package.json +1 -1
  140. package/packages/providers/package.json +1 -1
  141. package/packages/quota-manager/package.json +1 -1
  142. package/packages/rate-limiter/package.json +1 -1
  143. package/packages/react-vite-plugin/package.json +1 -1
  144. package/packages/release-manager/package.json +1 -1
  145. package/packages/requirement-compiler/package.json +1 -1
  146. package/packages/runtime/package.json +1 -1
  147. package/packages/scheduler/package.json +1 -1
  148. package/packages/scheduler-adapter/package.json +1 -1
  149. package/packages/session/package.json +1 -1
  150. package/packages/session-api/package.json +1 -1
  151. package/packages/session-export/package.json +1 -1
  152. package/packages/shared-context/package.json +1 -1
  153. package/packages/skill-mcp-client/package.json +1 -1
  154. package/packages/skill-registry/package.json +1 -1
  155. package/packages/sprint-planner/package.json +1 -1
  156. package/packages/subscription-engine/package.json +1 -1
  157. package/packages/task-compiler/package.json +1 -1
  158. package/packages/tencentdb-memory/package.json +1 -1
  159. package/packages/tencentdb-sync/package.json +1 -1
  160. package/packages/test-data-generator/package.json +1 -1
  161. package/packages/test-generator/package.json +1 -1
  162. package/packages/todo-bd-sync/README.md +71 -0
  163. package/packages/todo-bd-sync/package.json +1 -1
  164. package/packages/todo-bd-sync/src/extension.ts +16 -1
  165. package/packages/token-estimation/package.json +1 -1
  166. package/packages/token-optimizer/package.json +1 -1
  167. package/packages/trajectory/dist/src/approved-patterns.d.ts +51 -0
  168. package/packages/trajectory/dist/src/approved-patterns.d.ts.map +1 -0
  169. package/packages/trajectory/dist/src/approved-patterns.js +134 -0
  170. package/packages/trajectory/dist/src/approved-patterns.js.map +1 -0
  171. package/packages/trajectory/dist/src/index.d.ts +13 -0
  172. package/packages/trajectory/dist/src/index.d.ts.map +1 -0
  173. package/packages/trajectory/dist/src/index.js +12 -0
  174. package/packages/trajectory/dist/src/index.js.map +1 -0
  175. package/packages/trajectory/dist/src/store.d.ts +69 -0
  176. package/packages/trajectory/dist/src/store.d.ts.map +1 -0
  177. package/packages/trajectory/dist/src/store.js +253 -0
  178. package/packages/trajectory/dist/src/store.js.map +1 -0
  179. package/packages/trajectory/dist/src/types.d.ts +73 -0
  180. package/packages/trajectory/dist/src/types.d.ts.map +1 -0
  181. package/packages/trajectory/dist/src/types.js +9 -0
  182. package/packages/trajectory/dist/src/types.js.map +1 -0
  183. package/packages/trajectory/dist/test/store.test.d.ts +2 -0
  184. package/packages/trajectory/dist/test/store.test.d.ts.map +1 -0
  185. package/packages/trajectory/dist/test/store.test.js +228 -0
  186. package/packages/trajectory/dist/test/store.test.js.map +1 -0
  187. package/packages/trajectory/package.json +29 -0
  188. package/packages/trajectory/src/approved-patterns.ts +180 -0
  189. package/packages/trajectory/src/index.ts +26 -0
  190. package/packages/trajectory/src/store.ts +285 -0
  191. package/packages/trajectory/src/types.ts +84 -0
  192. package/packages/trajectory/test/store.test.d.ts +2 -0
  193. package/packages/trajectory/test/store.test.ts +250 -0
  194. package/packages/tui/package.json +1 -1
  195. package/packages/types/package.json +1 -1
  196. package/packages/workflow-events/package.json +1 -1
  197. package/packages/workspace-scanner/package.json +1 -1
  198. package/packages/worktree/package.json +1 -1
  199. package/packages/write-review/package.json +1 -1
  200. package/packages/write-review/src/blackboard.ts +24 -1
  201. package/packages/write-review/src/types.ts +13 -0
  202. package/skills/harness-runtime/SKILL.md +67 -4
@@ -0,0 +1,706 @@
1
+ /**
2
+ * Deterministic write-review loop as a LangGraph StateGraph.
3
+ *
4
+ * START → plan (GPT) → write (MiniMax) → review (GPT)
5
+ * ├─ approved / blocked / max-iter → finish
6
+ * └─ changes_requested → write (with comments)
7
+ *
8
+ * Unlike the supervisor variant (agents.ts, agents.py style) where an LLM
9
+ * decides routing, here the structured review verdict drives the conditional
10
+ * edge — the loop is guaranteed to terminate at maxIterations.
11
+ *
12
+ * Wiki: wiki/multi-agent-langchain.md
13
+ */
14
+ import { type ReviewVerdict } from "./agents.js";
15
+ import type { LoopWidget } from "./widget.js";
16
+ declare const LoopState: import("@langchain/langgraph").AnnotationRoot<{
17
+ /** Original user request */
18
+ request: {
19
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
20
+ (): import("@langchain/langgraph").LastValue<string>;
21
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
22
+ };
23
+ /** Plan produced by the GPT planner */
24
+ plan: {
25
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
26
+ (): import("@langchain/langgraph").LastValue<string>;
27
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
28
+ };
29
+ /** Current iteration (0 = first pass) */
30
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
31
+ /** Latest code output from the MiniMax coder */
32
+ code: {
33
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
34
+ (): import("@langchain/langgraph").LastValue<string>;
35
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
36
+ };
37
+ /** Latest structured review from the GPT reviewer */
38
+ review: {
39
+ (annotation: import("@langchain/langgraph").SingleReducer<{
40
+ verdict: "approved" | "blocked" | "changes_requested";
41
+ summary: string;
42
+ comments: {
43
+ file?: string | undefined;
44
+ comment: string;
45
+ severity?: "critical" | "major" | "minor" | undefined;
46
+ }[];
47
+ }, {
48
+ verdict: "approved" | "blocked" | "changes_requested";
49
+ summary: string;
50
+ comments: {
51
+ file?: string | undefined;
52
+ comment: string;
53
+ severity?: "critical" | "major" | "minor" | undefined;
54
+ }[];
55
+ }>): import("@langchain/langgraph").BaseChannel<{
56
+ verdict: "approved" | "blocked" | "changes_requested";
57
+ summary: string;
58
+ comments: {
59
+ file?: string | undefined;
60
+ comment: string;
61
+ severity?: "critical" | "major" | "minor" | undefined;
62
+ }[];
63
+ }, import("@langchain/langgraph").OverwriteValue<{
64
+ verdict: "approved" | "blocked" | "changes_requested";
65
+ summary: string;
66
+ comments: {
67
+ file?: string | undefined;
68
+ comment: string;
69
+ severity?: "critical" | "major" | "minor" | undefined;
70
+ }[];
71
+ }> | {
72
+ verdict: "approved" | "blocked" | "changes_requested";
73
+ summary: string;
74
+ comments: {
75
+ file?: string | undefined;
76
+ comment: string;
77
+ severity?: "critical" | "major" | "minor" | undefined;
78
+ }[];
79
+ }, unknown>;
80
+ (): import("@langchain/langgraph").LastValue<{
81
+ verdict: "approved" | "blocked" | "changes_requested";
82
+ summary: string;
83
+ comments: {
84
+ file?: string | undefined;
85
+ comment: string;
86
+ severity?: "critical" | "major" | "minor" | undefined;
87
+ }[];
88
+ }>;
89
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
90
+ };
91
+ /** Human-readable step log (reducer appends) */
92
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
93
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
94
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
95
+ /** Actual file contents written in the most recent write step.
96
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
97
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
98
+ }>;
99
+ export type LoopState = typeof LoopState.State;
100
+ export interface LoopDeps {
101
+ plan: (request: string) => Promise<string>;
102
+ write: (plan: string, review: ReviewVerdict | null) => Promise<string>;
103
+ review: (plan: string, code: string, writtenFiles?: Record<string, string>) => Promise<ReviewVerdict>;
104
+ maxIterations: number;
105
+ onStep?: (step: string, state: LoopState) => void;
106
+ /** Optional widget for TUI / status-line display (mirrors pi-lens footer style). */
107
+ widget?: LoopWidget;
108
+ }
109
+ export declare function buildWriteReviewLoop(deps: LoopDeps, opts?: {
110
+ checkpointer?: boolean | unknown;
111
+ }): import("@langchain/langgraph").CompiledStateGraph<{
112
+ request: string;
113
+ plan: string;
114
+ iteration: number;
115
+ code: string;
116
+ review: {
117
+ verdict: "approved" | "blocked" | "changes_requested";
118
+ summary: string;
119
+ comments: {
120
+ file?: string | undefined;
121
+ comment: string;
122
+ severity?: "critical" | "major" | "minor" | undefined;
123
+ }[];
124
+ };
125
+ log: string[];
126
+ prevCode: string | undefined;
127
+ writtenFiles: Record<string, string>;
128
+ }, {
129
+ request?: string | undefined;
130
+ plan?: string | undefined;
131
+ iteration?: number | import("@langchain/langgraph").OverwriteValue<number> | undefined;
132
+ code?: string | undefined;
133
+ review?: {
134
+ verdict: "approved" | "blocked" | "changes_requested";
135
+ summary: string;
136
+ comments: {
137
+ file?: string | undefined;
138
+ comment: string;
139
+ severity?: "critical" | "major" | "minor" | undefined;
140
+ }[];
141
+ } | undefined;
142
+ log?: string[] | import("@langchain/langgraph").OverwriteValue<string[]> | undefined;
143
+ prevCode?: string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined;
144
+ writtenFiles?: import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string> | undefined;
145
+ }, "__start__" | "finishStep" | "planStep" | "reviewStep" | "writeStep", {
146
+ /** Original user request */
147
+ request: {
148
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
149
+ (): import("@langchain/langgraph").LastValue<string>;
150
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
151
+ };
152
+ /** Plan produced by the GPT planner */
153
+ plan: {
154
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
155
+ (): import("@langchain/langgraph").LastValue<string>;
156
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
157
+ };
158
+ /** Current iteration (0 = first pass) */
159
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
160
+ /** Latest code output from the MiniMax coder */
161
+ code: {
162
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
163
+ (): import("@langchain/langgraph").LastValue<string>;
164
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
165
+ };
166
+ /** Latest structured review from the GPT reviewer */
167
+ review: {
168
+ (annotation: import("@langchain/langgraph").SingleReducer<{
169
+ verdict: "approved" | "blocked" | "changes_requested";
170
+ summary: string;
171
+ comments: {
172
+ file?: string | undefined;
173
+ comment: string;
174
+ severity?: "critical" | "major" | "minor" | undefined;
175
+ }[];
176
+ }, {
177
+ verdict: "approved" | "blocked" | "changes_requested";
178
+ summary: string;
179
+ comments: {
180
+ file?: string | undefined;
181
+ comment: string;
182
+ severity?: "critical" | "major" | "minor" | undefined;
183
+ }[];
184
+ }>): import("@langchain/langgraph").BaseChannel<{
185
+ verdict: "approved" | "blocked" | "changes_requested";
186
+ summary: string;
187
+ comments: {
188
+ file?: string | undefined;
189
+ comment: string;
190
+ severity?: "critical" | "major" | "minor" | undefined;
191
+ }[];
192
+ }, import("@langchain/langgraph").OverwriteValue<{
193
+ verdict: "approved" | "blocked" | "changes_requested";
194
+ summary: string;
195
+ comments: {
196
+ file?: string | undefined;
197
+ comment: string;
198
+ severity?: "critical" | "major" | "minor" | undefined;
199
+ }[];
200
+ }> | {
201
+ verdict: "approved" | "blocked" | "changes_requested";
202
+ summary: string;
203
+ comments: {
204
+ file?: string | undefined;
205
+ comment: string;
206
+ severity?: "critical" | "major" | "minor" | undefined;
207
+ }[];
208
+ }, unknown>;
209
+ (): import("@langchain/langgraph").LastValue<{
210
+ verdict: "approved" | "blocked" | "changes_requested";
211
+ summary: string;
212
+ comments: {
213
+ file?: string | undefined;
214
+ comment: string;
215
+ severity?: "critical" | "major" | "minor" | undefined;
216
+ }[];
217
+ }>;
218
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
219
+ };
220
+ /** Human-readable step log (reducer appends) */
221
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
222
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
223
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
224
+ /** Actual file contents written in the most recent write step.
225
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
226
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
227
+ }, {
228
+ /** Original user request */
229
+ request: {
230
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
231
+ (): import("@langchain/langgraph").LastValue<string>;
232
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
233
+ };
234
+ /** Plan produced by the GPT planner */
235
+ plan: {
236
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
237
+ (): import("@langchain/langgraph").LastValue<string>;
238
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
239
+ };
240
+ /** Current iteration (0 = first pass) */
241
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
242
+ /** Latest code output from the MiniMax coder */
243
+ code: {
244
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
245
+ (): import("@langchain/langgraph").LastValue<string>;
246
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
247
+ };
248
+ /** Latest structured review from the GPT reviewer */
249
+ review: {
250
+ (annotation: import("@langchain/langgraph").SingleReducer<{
251
+ verdict: "approved" | "blocked" | "changes_requested";
252
+ summary: string;
253
+ comments: {
254
+ file?: string | undefined;
255
+ comment: string;
256
+ severity?: "critical" | "major" | "minor" | undefined;
257
+ }[];
258
+ }, {
259
+ verdict: "approved" | "blocked" | "changes_requested";
260
+ summary: string;
261
+ comments: {
262
+ file?: string | undefined;
263
+ comment: string;
264
+ severity?: "critical" | "major" | "minor" | undefined;
265
+ }[];
266
+ }>): import("@langchain/langgraph").BaseChannel<{
267
+ verdict: "approved" | "blocked" | "changes_requested";
268
+ summary: string;
269
+ comments: {
270
+ file?: string | undefined;
271
+ comment: string;
272
+ severity?: "critical" | "major" | "minor" | undefined;
273
+ }[];
274
+ }, import("@langchain/langgraph").OverwriteValue<{
275
+ verdict: "approved" | "blocked" | "changes_requested";
276
+ summary: string;
277
+ comments: {
278
+ file?: string | undefined;
279
+ comment: string;
280
+ severity?: "critical" | "major" | "minor" | undefined;
281
+ }[];
282
+ }> | {
283
+ verdict: "approved" | "blocked" | "changes_requested";
284
+ summary: string;
285
+ comments: {
286
+ file?: string | undefined;
287
+ comment: string;
288
+ severity?: "critical" | "major" | "minor" | undefined;
289
+ }[];
290
+ }, unknown>;
291
+ (): import("@langchain/langgraph").LastValue<{
292
+ verdict: "approved" | "blocked" | "changes_requested";
293
+ summary: string;
294
+ comments: {
295
+ file?: string | undefined;
296
+ comment: string;
297
+ severity?: "critical" | "major" | "minor" | undefined;
298
+ }[];
299
+ }>;
300
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
301
+ };
302
+ /** Human-readable step log (reducer appends) */
303
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
304
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
305
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
306
+ /** Actual file contents written in the most recent write step.
307
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
308
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
309
+ }, import("@langchain/langgraph").StateDefinition, {
310
+ finishStep: Partial<import("@langchain/langgraph").StateType<{
311
+ /** Original user request */
312
+ request: {
313
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
314
+ (): import("@langchain/langgraph").LastValue<string>;
315
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
316
+ };
317
+ /** Plan produced by the GPT planner */
318
+ plan: {
319
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
320
+ (): import("@langchain/langgraph").LastValue<string>;
321
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
322
+ };
323
+ /** Current iteration (0 = first pass) */
324
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
325
+ /** Latest code output from the MiniMax coder */
326
+ code: {
327
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
328
+ (): import("@langchain/langgraph").LastValue<string>;
329
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
330
+ };
331
+ /** Latest structured review from the GPT reviewer */
332
+ review: {
333
+ (annotation: import("@langchain/langgraph").SingleReducer<{
334
+ verdict: "approved" | "blocked" | "changes_requested";
335
+ summary: string;
336
+ comments: {
337
+ file?: string | undefined;
338
+ comment: string;
339
+ severity?: "critical" | "major" | "minor" | undefined;
340
+ }[];
341
+ }, {
342
+ verdict: "approved" | "blocked" | "changes_requested";
343
+ summary: string;
344
+ comments: {
345
+ file?: string | undefined;
346
+ comment: string;
347
+ severity?: "critical" | "major" | "minor" | undefined;
348
+ }[];
349
+ }>): import("@langchain/langgraph").BaseChannel<{
350
+ verdict: "approved" | "blocked" | "changes_requested";
351
+ summary: string;
352
+ comments: {
353
+ file?: string | undefined;
354
+ comment: string;
355
+ severity?: "critical" | "major" | "minor" | undefined;
356
+ }[];
357
+ }, import("@langchain/langgraph").OverwriteValue<{
358
+ verdict: "approved" | "blocked" | "changes_requested";
359
+ summary: string;
360
+ comments: {
361
+ file?: string | undefined;
362
+ comment: string;
363
+ severity?: "critical" | "major" | "minor" | undefined;
364
+ }[];
365
+ }> | {
366
+ verdict: "approved" | "blocked" | "changes_requested";
367
+ summary: string;
368
+ comments: {
369
+ file?: string | undefined;
370
+ comment: string;
371
+ severity?: "critical" | "major" | "minor" | undefined;
372
+ }[];
373
+ }, unknown>;
374
+ (): import("@langchain/langgraph").LastValue<{
375
+ verdict: "approved" | "blocked" | "changes_requested";
376
+ summary: string;
377
+ comments: {
378
+ file?: string | undefined;
379
+ comment: string;
380
+ severity?: "critical" | "major" | "minor" | undefined;
381
+ }[];
382
+ }>;
383
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
384
+ };
385
+ /** Human-readable step log (reducer appends) */
386
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
387
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
388
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
389
+ /** Actual file contents written in the most recent write step.
390
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
391
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
392
+ }>>;
393
+ planStep: Partial<import("@langchain/langgraph").StateType<{
394
+ /** Original user request */
395
+ request: {
396
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
397
+ (): import("@langchain/langgraph").LastValue<string>;
398
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
399
+ };
400
+ /** Plan produced by the GPT planner */
401
+ plan: {
402
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
403
+ (): import("@langchain/langgraph").LastValue<string>;
404
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
405
+ };
406
+ /** Current iteration (0 = first pass) */
407
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
408
+ /** Latest code output from the MiniMax coder */
409
+ code: {
410
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
411
+ (): import("@langchain/langgraph").LastValue<string>;
412
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
413
+ };
414
+ /** Latest structured review from the GPT reviewer */
415
+ review: {
416
+ (annotation: import("@langchain/langgraph").SingleReducer<{
417
+ verdict: "approved" | "blocked" | "changes_requested";
418
+ summary: string;
419
+ comments: {
420
+ file?: string | undefined;
421
+ comment: string;
422
+ severity?: "critical" | "major" | "minor" | undefined;
423
+ }[];
424
+ }, {
425
+ verdict: "approved" | "blocked" | "changes_requested";
426
+ summary: string;
427
+ comments: {
428
+ file?: string | undefined;
429
+ comment: string;
430
+ severity?: "critical" | "major" | "minor" | undefined;
431
+ }[];
432
+ }>): import("@langchain/langgraph").BaseChannel<{
433
+ verdict: "approved" | "blocked" | "changes_requested";
434
+ summary: string;
435
+ comments: {
436
+ file?: string | undefined;
437
+ comment: string;
438
+ severity?: "critical" | "major" | "minor" | undefined;
439
+ }[];
440
+ }, import("@langchain/langgraph").OverwriteValue<{
441
+ verdict: "approved" | "blocked" | "changes_requested";
442
+ summary: string;
443
+ comments: {
444
+ file?: string | undefined;
445
+ comment: string;
446
+ severity?: "critical" | "major" | "minor" | undefined;
447
+ }[];
448
+ }> | {
449
+ verdict: "approved" | "blocked" | "changes_requested";
450
+ summary: string;
451
+ comments: {
452
+ file?: string | undefined;
453
+ comment: string;
454
+ severity?: "critical" | "major" | "minor" | undefined;
455
+ }[];
456
+ }, unknown>;
457
+ (): import("@langchain/langgraph").LastValue<{
458
+ verdict: "approved" | "blocked" | "changes_requested";
459
+ summary: string;
460
+ comments: {
461
+ file?: string | undefined;
462
+ comment: string;
463
+ severity?: "critical" | "major" | "minor" | undefined;
464
+ }[];
465
+ }>;
466
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
467
+ };
468
+ /** Human-readable step log (reducer appends) */
469
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
470
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
471
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
472
+ /** Actual file contents written in the most recent write step.
473
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
474
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
475
+ }>>;
476
+ reviewStep: Partial<import("@langchain/langgraph").StateType<{
477
+ /** Original user request */
478
+ request: {
479
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
480
+ (): import("@langchain/langgraph").LastValue<string>;
481
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
482
+ };
483
+ /** Plan produced by the GPT planner */
484
+ plan: {
485
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
486
+ (): import("@langchain/langgraph").LastValue<string>;
487
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
488
+ };
489
+ /** Current iteration (0 = first pass) */
490
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
491
+ /** Latest code output from the MiniMax coder */
492
+ code: {
493
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
494
+ (): import("@langchain/langgraph").LastValue<string>;
495
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
496
+ };
497
+ /** Latest structured review from the GPT reviewer */
498
+ review: {
499
+ (annotation: import("@langchain/langgraph").SingleReducer<{
500
+ verdict: "approved" | "blocked" | "changes_requested";
501
+ summary: string;
502
+ comments: {
503
+ file?: string | undefined;
504
+ comment: string;
505
+ severity?: "critical" | "major" | "minor" | undefined;
506
+ }[];
507
+ }, {
508
+ verdict: "approved" | "blocked" | "changes_requested";
509
+ summary: string;
510
+ comments: {
511
+ file?: string | undefined;
512
+ comment: string;
513
+ severity?: "critical" | "major" | "minor" | undefined;
514
+ }[];
515
+ }>): import("@langchain/langgraph").BaseChannel<{
516
+ verdict: "approved" | "blocked" | "changes_requested";
517
+ summary: string;
518
+ comments: {
519
+ file?: string | undefined;
520
+ comment: string;
521
+ severity?: "critical" | "major" | "minor" | undefined;
522
+ }[];
523
+ }, import("@langchain/langgraph").OverwriteValue<{
524
+ verdict: "approved" | "blocked" | "changes_requested";
525
+ summary: string;
526
+ comments: {
527
+ file?: string | undefined;
528
+ comment: string;
529
+ severity?: "critical" | "major" | "minor" | undefined;
530
+ }[];
531
+ }> | {
532
+ verdict: "approved" | "blocked" | "changes_requested";
533
+ summary: string;
534
+ comments: {
535
+ file?: string | undefined;
536
+ comment: string;
537
+ severity?: "critical" | "major" | "minor" | undefined;
538
+ }[];
539
+ }, unknown>;
540
+ (): import("@langchain/langgraph").LastValue<{
541
+ verdict: "approved" | "blocked" | "changes_requested";
542
+ summary: string;
543
+ comments: {
544
+ file?: string | undefined;
545
+ comment: string;
546
+ severity?: "critical" | "major" | "minor" | undefined;
547
+ }[];
548
+ }>;
549
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
550
+ };
551
+ /** Human-readable step log (reducer appends) */
552
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
553
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
554
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
555
+ /** Actual file contents written in the most recent write step.
556
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
557
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
558
+ }>>;
559
+ writeStep: Partial<import("@langchain/langgraph").StateType<{
560
+ /** Original user request */
561
+ request: {
562
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
563
+ (): import("@langchain/langgraph").LastValue<string>;
564
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
565
+ };
566
+ /** Plan produced by the GPT planner */
567
+ plan: {
568
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
569
+ (): import("@langchain/langgraph").LastValue<string>;
570
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
571
+ };
572
+ /** Current iteration (0 = first pass) */
573
+ iteration: import("@langchain/langgraph").BaseChannel<number, number | import("@langchain/langgraph").OverwriteValue<number>, unknown>;
574
+ /** Latest code output from the MiniMax coder */
575
+ code: {
576
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
577
+ (): import("@langchain/langgraph").LastValue<string>;
578
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
579
+ };
580
+ /** Latest structured review from the GPT reviewer */
581
+ review: {
582
+ (annotation: import("@langchain/langgraph").SingleReducer<{
583
+ verdict: "approved" | "blocked" | "changes_requested";
584
+ summary: string;
585
+ comments: {
586
+ file?: string | undefined;
587
+ comment: string;
588
+ severity?: "critical" | "major" | "minor" | undefined;
589
+ }[];
590
+ }, {
591
+ verdict: "approved" | "blocked" | "changes_requested";
592
+ summary: string;
593
+ comments: {
594
+ file?: string | undefined;
595
+ comment: string;
596
+ severity?: "critical" | "major" | "minor" | undefined;
597
+ }[];
598
+ }>): import("@langchain/langgraph").BaseChannel<{
599
+ verdict: "approved" | "blocked" | "changes_requested";
600
+ summary: string;
601
+ comments: {
602
+ file?: string | undefined;
603
+ comment: string;
604
+ severity?: "critical" | "major" | "minor" | undefined;
605
+ }[];
606
+ }, import("@langchain/langgraph").OverwriteValue<{
607
+ verdict: "approved" | "blocked" | "changes_requested";
608
+ summary: string;
609
+ comments: {
610
+ file?: string | undefined;
611
+ comment: string;
612
+ severity?: "critical" | "major" | "minor" | undefined;
613
+ }[];
614
+ }> | {
615
+ verdict: "approved" | "blocked" | "changes_requested";
616
+ summary: string;
617
+ comments: {
618
+ file?: string | undefined;
619
+ comment: string;
620
+ severity?: "critical" | "major" | "minor" | undefined;
621
+ }[];
622
+ }, unknown>;
623
+ (): import("@langchain/langgraph").LastValue<{
624
+ verdict: "approved" | "blocked" | "changes_requested";
625
+ summary: string;
626
+ comments: {
627
+ file?: string | undefined;
628
+ comment: string;
629
+ severity?: "critical" | "major" | "minor" | undefined;
630
+ }[];
631
+ }>;
632
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
633
+ };
634
+ /** Human-readable step log (reducer appends) */
635
+ log: import("@langchain/langgraph").BaseChannel<string[], string[] | import("@langchain/langgraph").OverwriteValue<string[]>, unknown>;
636
+ /** Code from the previous iteration. Used for stuck detection (P0-2). */
637
+ prevCode: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
638
+ /** Actual file contents written in the most recent write step.
639
+ * P1-1: used to pass real file contents to the reviewer instead of a summary. */
640
+ writtenFiles: import("@langchain/langgraph").BaseChannel<Record<string, string>, import("@langchain/langgraph").OverwriteValue<Record<string, string>> | Record<string, string>, unknown>;
641
+ }>>;
642
+ }, unknown, unknown, []>;
643
+ /** Inferred compiled-graph type (do not hand-roll langgraph generics). */
644
+ export type WriteReviewLoop = ReturnType<typeof buildWriteReviewLoop>;
645
+ export interface RealLoopOptions {
646
+ maxIterations?: number;
647
+ onStep?: (step: string, state: LoopState) => void;
648
+ /** Directory for .write-review/blackboard. Defaults to process.cwd(). */
649
+ blackboardDir?: string;
650
+ /**
651
+ * The request string. Used by the smart model router to determine which
652
+ * models to use for planner / reviewer / coder roles. Supports per-request
653
+ * directives in the prompt:
654
+ * [planner: gpt] [reviewer: GLM] [coder: MiniMax]
655
+ * "Use GPT as master reviewer" is also recognised.
656
+ * If omitted, defaults to env vars (PLANNER_*, GLM_*, MINIMAX_*).
657
+ */
658
+ request?: string;
659
+ importAgents?: () => Promise<{
660
+ createPlannerAgent: () => {
661
+ invoke: (input: {
662
+ messages: unknown[];
663
+ }) => Promise<{
664
+ messages: Array<{
665
+ content: unknown;
666
+ }>;
667
+ }>;
668
+ };
669
+ createCoderAgent: () => {
670
+ invoke: (input: {
671
+ messages: unknown[];
672
+ }) => Promise<{
673
+ messages: Array<{
674
+ content: unknown;
675
+ }>;
676
+ }>;
677
+ };
678
+ createReviewerAgent: () => {
679
+ invoke: (input: {
680
+ messages: unknown[];
681
+ }) => Promise<{
682
+ messages: Array<{
683
+ content: unknown;
684
+ }>;
685
+ structuredResponse?: ReviewVerdict;
686
+ }>;
687
+ };
688
+ }>;
689
+ }
690
+ /**
691
+ * Build LoopDeps backed by the real GPT/MiniMax agents from agents.ts.
692
+ * Kept lazy (dynamic import) so dry-run mode never touches API keys.
693
+ *
694
+ * The WriteReviewBlackboard is updated at each step and its markdown is
695
+ * injected into every agent prompt — so each agent sees the shared scoreboard
696
+ * naturally, without explicit prompt injection.
697
+ */
698
+ export declare function buildRealLoopDeps(options?: RealLoopOptions): Promise<LoopDeps>;
699
+ /** Deterministic stubs: iteration 1 requests changes, iteration 2 approves. */
700
+ export declare function buildDryRunDeps(options?: {
701
+ maxIterations?: number;
702
+ onStep?: LoopDeps["onStep"];
703
+ /** Directory for .write-review/blackboard. Defaults to process.cwd(). */
704
+ blackboardDir?: string;
705
+ }): LoopDeps;
706
+ //# sourceMappingURL=graph.d.ts.map