agent-bober 0.15.0 → 0.17.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 (301) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +127 -3
  5. package/agents/bober-architect.md +34 -0
  6. package/agents/bober-code-reviewer.md +2 -0
  7. package/agents/bober-curator.md +12 -0
  8. package/agents/bober-documenter.md +129 -0
  9. package/agents/bober-evaluator.md +46 -0
  10. package/agents/bober-generator.md +12 -0
  11. package/agents/bober-planner.md +8 -1
  12. package/dist/cli/commands/graph.js +3 -3
  13. package/dist/cli/commands/graph.js.map +1 -1
  14. package/dist/cli/commands/init.js +4 -0
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/memory.d.ts +14 -0
  17. package/dist/cli/commands/memory.d.ts.map +1 -0
  18. package/dist/cli/commands/memory.js +132 -0
  19. package/dist/cli/commands/memory.js.map +1 -0
  20. package/dist/cli/index.js +6 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/config/defaults.d.ts.map +1 -1
  23. package/dist/config/defaults.js +14 -3
  24. package/dist/config/defaults.js.map +1 -1
  25. package/dist/config/loader.d.ts.map +1 -1
  26. package/dist/config/loader.js +7 -0
  27. package/dist/config/loader.js.map +1 -1
  28. package/dist/config/role-providers.d.ts +29 -0
  29. package/dist/config/role-providers.d.ts.map +1 -0
  30. package/dist/config/role-providers.js +115 -0
  31. package/dist/config/role-providers.js.map +1 -0
  32. package/dist/config/schema.d.ts +383 -14
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js +42 -0
  35. package/dist/config/schema.js.map +1 -1
  36. package/dist/contracts/eval-result.d.ts +112 -56
  37. package/dist/contracts/eval-result.d.ts.map +1 -1
  38. package/dist/contracts/eval-result.js +3 -0
  39. package/dist/contracts/eval-result.js.map +1 -1
  40. package/dist/contracts/sprint-contract.d.ts +30 -30
  41. package/dist/fleet/aggregator.d.ts +5 -0
  42. package/dist/fleet/aggregator.d.ts.map +1 -0
  43. package/dist/fleet/aggregator.js +39 -0
  44. package/dist/fleet/aggregator.js.map +1 -0
  45. package/dist/fleet/child-config.d.ts +12 -0
  46. package/dist/fleet/child-config.d.ts.map +1 -0
  47. package/dist/fleet/child-config.js +38 -0
  48. package/dist/fleet/child-config.js.map +1 -0
  49. package/dist/fleet/coordinator.d.ts +25 -0
  50. package/dist/fleet/coordinator.d.ts.map +1 -0
  51. package/dist/fleet/coordinator.js +40 -0
  52. package/dist/fleet/coordinator.js.map +1 -0
  53. package/dist/fleet/index.d.ts +40 -0
  54. package/dist/fleet/index.d.ts.map +1 -0
  55. package/dist/fleet/index.js +117 -0
  56. package/dist/fleet/index.js.map +1 -0
  57. package/dist/fleet/manifest.d.ts +51 -0
  58. package/dist/fleet/manifest.d.ts.map +1 -0
  59. package/dist/fleet/manifest.js +32 -0
  60. package/dist/fleet/manifest.js.map +1 -0
  61. package/dist/fleet/reporter.d.ts +32 -0
  62. package/dist/fleet/reporter.d.ts.map +1 -0
  63. package/dist/fleet/reporter.js +71 -0
  64. package/dist/fleet/reporter.js.map +1 -0
  65. package/dist/fleet/runner.d.ts +48 -0
  66. package/dist/fleet/runner.d.ts.map +1 -0
  67. package/dist/fleet/runner.js +104 -0
  68. package/dist/fleet/runner.js.map +1 -0
  69. package/dist/fleet/scaffolder.d.ts +12 -0
  70. package/dist/fleet/scaffolder.d.ts.map +1 -0
  71. package/dist/fleet/scaffolder.js +82 -0
  72. package/dist/fleet/scaffolder.js.map +1 -0
  73. package/dist/fleet/types.d.ts +21 -0
  74. package/dist/fleet/types.d.ts.map +1 -0
  75. package/dist/fleet/types.js +2 -0
  76. package/dist/fleet/types.js.map +1 -0
  77. package/dist/graph/cli.d.ts +6 -2
  78. package/dist/graph/cli.d.ts.map +1 -1
  79. package/dist/graph/cli.js +53 -12
  80. package/dist/graph/cli.js.map +1 -1
  81. package/dist/graph/pipeline-lifecycle.d.ts +9 -0
  82. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -1
  83. package/dist/graph/pipeline-lifecycle.js +12 -0
  84. package/dist/graph/pipeline-lifecycle.js.map +1 -1
  85. package/dist/graph/preflight-injector.d.ts +14 -0
  86. package/dist/graph/preflight-injector.d.ts.map +1 -1
  87. package/dist/graph/preflight-injector.js +84 -4
  88. package/dist/graph/preflight-injector.js.map +1 -1
  89. package/dist/incident/types.d.ts +24 -24
  90. package/dist/mcp/tools/graph-schemas.d.ts +7 -7
  91. package/dist/mcp/tools/init.d.ts.map +1 -1
  92. package/dist/mcp/tools/init.js +2 -0
  93. package/dist/mcp/tools/init.js.map +1 -1
  94. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  95. package/dist/orchestrator/agent-loader.js +15 -1
  96. package/dist/orchestrator/agent-loader.js.map +1 -1
  97. package/dist/orchestrator/agentic-loop.d.ts +51 -0
  98. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  99. package/dist/orchestrator/agentic-loop.js +123 -4
  100. package/dist/orchestrator/agentic-loop.js.map +1 -1
  101. package/dist/orchestrator/arch-lenses.d.ts +7 -0
  102. package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
  103. package/dist/orchestrator/arch-lenses.js +22 -0
  104. package/dist/orchestrator/arch-lenses.js.map +1 -0
  105. package/dist/orchestrator/architect-agent.d.ts +16 -0
  106. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  107. package/dist/orchestrator/architect-agent.js +509 -1
  108. package/dist/orchestrator/architect-agent.js.map +1 -1
  109. package/dist/orchestrator/curator-agent.js +1 -1
  110. package/dist/orchestrator/curator-agent.js.map +1 -1
  111. package/dist/orchestrator/deploy/types.d.ts +2 -2
  112. package/dist/orchestrator/documenter-agent.d.ts +57 -0
  113. package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
  114. package/dist/orchestrator/documenter-agent.js +195 -0
  115. package/dist/orchestrator/documenter-agent.js.map +1 -0
  116. package/dist/orchestrator/environment.d.ts +45 -0
  117. package/dist/orchestrator/environment.d.ts.map +1 -0
  118. package/dist/orchestrator/environment.js +151 -0
  119. package/dist/orchestrator/environment.js.map +1 -0
  120. package/dist/orchestrator/eval-lenses.d.ts +7 -0
  121. package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
  122. package/dist/orchestrator/eval-lenses.js +19 -0
  123. package/dist/orchestrator/eval-lenses.js.map +1 -0
  124. package/dist/orchestrator/eval-persist.d.ts +25 -0
  125. package/dist/orchestrator/eval-persist.d.ts.map +1 -0
  126. package/dist/orchestrator/eval-persist.js +74 -0
  127. package/dist/orchestrator/eval-persist.js.map +1 -0
  128. package/dist/orchestrator/evaluator-agent.d.ts +23 -0
  129. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  130. package/dist/orchestrator/evaluator-agent.js +60 -3
  131. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  132. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  133. package/dist/orchestrator/generator-agent.js +32 -0
  134. package/dist/orchestrator/generator-agent.js.map +1 -1
  135. package/dist/orchestrator/memory/distill.d.ts +60 -0
  136. package/dist/orchestrator/memory/distill.d.ts.map +1 -0
  137. package/dist/orchestrator/memory/distill.js +177 -0
  138. package/dist/orchestrator/memory/distill.js.map +1 -0
  139. package/dist/orchestrator/memory/eval-source.d.ts +20 -0
  140. package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
  141. package/dist/orchestrator/memory/eval-source.js +88 -0
  142. package/dist/orchestrator/memory/eval-source.js.map +1 -0
  143. package/dist/orchestrator/memory/retrieve.d.ts +45 -0
  144. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
  145. package/dist/orchestrator/memory/retrieve.js +102 -0
  146. package/dist/orchestrator/memory/retrieve.js.map +1 -0
  147. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  148. package/dist/orchestrator/model-resolver.js +12 -0
  149. package/dist/orchestrator/model-resolver.js.map +1 -1
  150. package/dist/orchestrator/pipeline.d.ts +10 -0
  151. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  152. package/dist/orchestrator/pipeline.js +111 -3
  153. package/dist/orchestrator/pipeline.js.map +1 -1
  154. package/dist/orchestrator/planner-agent.d.ts +22 -1
  155. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  156. package/dist/orchestrator/planner-agent.js +160 -4
  157. package/dist/orchestrator/planner-agent.js.map +1 -1
  158. package/dist/orchestrator/research-agent.js +2 -2
  159. package/dist/orchestrator/research-agent.js.map +1 -1
  160. package/dist/orchestrator/tools/handlers.d.ts +14 -0
  161. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  162. package/dist/orchestrator/tools/handlers.js +29 -4
  163. package/dist/orchestrator/tools/handlers.js.map +1 -1
  164. package/dist/orchestrator/tools/schemas.js +5 -5
  165. package/dist/orchestrator/tools/schemas.js.map +1 -1
  166. package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
  167. package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
  168. package/dist/orchestrator/workflow/args-builder.js +142 -0
  169. package/dist/orchestrator/workflow/args-builder.js.map +1 -0
  170. package/dist/orchestrator/workflow/budget.d.ts +57 -0
  171. package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
  172. package/dist/orchestrator/workflow/budget.js +80 -0
  173. package/dist/orchestrator/workflow/budget.js.map +1 -0
  174. package/dist/orchestrator/workflow/conformance.d.ts +27 -0
  175. package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
  176. package/dist/orchestrator/workflow/conformance.js +111 -0
  177. package/dist/orchestrator/workflow/conformance.js.map +1 -0
  178. package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
  179. package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
  180. package/dist/orchestrator/workflow/eligibility.js +10 -0
  181. package/dist/orchestrator/workflow/eligibility.js.map +1 -0
  182. package/dist/orchestrator/workflow/engine.d.ts +10 -0
  183. package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
  184. package/dist/orchestrator/workflow/engine.js +2 -0
  185. package/dist/orchestrator/workflow/engine.js.map +1 -0
  186. package/dist/orchestrator/workflow/errors.d.ts +13 -0
  187. package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
  188. package/dist/orchestrator/workflow/errors.js +26 -0
  189. package/dist/orchestrator/workflow/errors.js.map +1 -0
  190. package/dist/orchestrator/workflow/flusher.d.ts +19 -0
  191. package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
  192. package/dist/orchestrator/workflow/flusher.js +81 -0
  193. package/dist/orchestrator/workflow/flusher.js.map +1 -0
  194. package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
  195. package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
  196. package/dist/orchestrator/workflow/interpreter.js +92 -0
  197. package/dist/orchestrator/workflow/interpreter.js.map +1 -0
  198. package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
  199. package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
  200. package/dist/orchestrator/workflow/pure-sprint.js +82 -0
  201. package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
  202. package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
  203. package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
  204. package/dist/orchestrator/workflow/reconciler.js +65 -0
  205. package/dist/orchestrator/workflow/reconciler.js.map +1 -0
  206. package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
  207. package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
  208. package/dist/orchestrator/workflow/resume-cursor.js +25 -0
  209. package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
  210. package/dist/orchestrator/workflow/retry.d.ts +50 -0
  211. package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
  212. package/dist/orchestrator/workflow/retry.js +100 -0
  213. package/dist/orchestrator/workflow/retry.js.map +1 -0
  214. package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
  215. package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
  216. package/dist/orchestrator/workflow/scheduler.js +158 -0
  217. package/dist/orchestrator/workflow/scheduler.js.map +1 -0
  218. package/dist/orchestrator/workflow/selector.d.ts +26 -0
  219. package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
  220. package/dist/orchestrator/workflow/selector.js +54 -0
  221. package/dist/orchestrator/workflow/selector.js.map +1 -0
  222. package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
  223. package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
  224. package/dist/orchestrator/workflow/synthesizer.js +75 -0
  225. package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
  226. package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
  227. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
  228. package/dist/orchestrator/workflow/ts-engine.js +14 -0
  229. package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
  230. package/dist/orchestrator/workflow/types.d.ts +55 -0
  231. package/dist/orchestrator/workflow/types.d.ts.map +1 -0
  232. package/dist/orchestrator/workflow/types.js +3 -0
  233. package/dist/orchestrator/workflow/types.js.map +1 -0
  234. package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
  235. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
  236. package/dist/orchestrator/workflow/workflow-engine.js +70 -0
  237. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
  238. package/dist/providers/anthropic.d.ts.map +1 -1
  239. package/dist/providers/anthropic.js +49 -6
  240. package/dist/providers/anthropic.js.map +1 -1
  241. package/dist/providers/claude-code.d.ts +44 -0
  242. package/dist/providers/claude-code.d.ts.map +1 -0
  243. package/dist/providers/claude-code.js +143 -0
  244. package/dist/providers/claude-code.js.map +1 -0
  245. package/dist/providers/factory.d.ts +16 -2
  246. package/dist/providers/factory.d.ts.map +1 -1
  247. package/dist/providers/factory.js +66 -12
  248. package/dist/providers/factory.js.map +1 -1
  249. package/dist/providers/google.d.ts.map +1 -1
  250. package/dist/providers/google.js +27 -3
  251. package/dist/providers/google.js.map +1 -1
  252. package/dist/providers/index.d.ts +3 -1
  253. package/dist/providers/index.d.ts.map +1 -1
  254. package/dist/providers/index.js +3 -1
  255. package/dist/providers/index.js.map +1 -1
  256. package/dist/providers/openai.d.ts.map +1 -1
  257. package/dist/providers/openai.js +24 -3
  258. package/dist/providers/openai.js.map +1 -1
  259. package/dist/providers/preflight.d.ts +22 -0
  260. package/dist/providers/preflight.d.ts.map +1 -0
  261. package/dist/providers/preflight.js +54 -0
  262. package/dist/providers/preflight.js.map +1 -0
  263. package/dist/providers/structured.d.ts +130 -0
  264. package/dist/providers/structured.d.ts.map +1 -0
  265. package/dist/providers/structured.js +205 -0
  266. package/dist/providers/structured.js.map +1 -0
  267. package/dist/providers/types.d.ts +28 -0
  268. package/dist/providers/types.d.ts.map +1 -1
  269. package/dist/state/history-rotation.d.ts +17 -0
  270. package/dist/state/history-rotation.d.ts.map +1 -0
  271. package/dist/state/history-rotation.js +84 -0
  272. package/dist/state/history-rotation.js.map +1 -0
  273. package/dist/state/history.d.ts +16 -4
  274. package/dist/state/history.d.ts.map +1 -1
  275. package/dist/state/history.js +62 -20
  276. package/dist/state/history.js.map +1 -1
  277. package/dist/state/index.d.ts +1 -1
  278. package/dist/state/index.d.ts.map +1 -1
  279. package/dist/state/index.js +1 -1
  280. package/dist/state/index.js.map +1 -1
  281. package/dist/state/memory.d.ts +60 -0
  282. package/dist/state/memory.d.ts.map +1 -0
  283. package/dist/state/memory.js +242 -0
  284. package/dist/state/memory.js.map +1 -0
  285. package/hooks/hooks.json +12 -2
  286. package/package.json +9 -5
  287. package/scripts/spike-claude-code-provider.mjs +66 -0
  288. package/scripts/spike-deepseek.mjs +63 -0
  289. package/scripts/sync-targets.json +12 -0
  290. package/scripts/update-all.mjs +255 -0
  291. package/skills/bober.architect/SKILL.md +13 -0
  292. package/skills/bober.architect/references/arch-lens-panel.md +126 -0
  293. package/skills/bober.eval/SKILL.md +9 -0
  294. package/skills/bober.eval/references/lens-panel.md +115 -0
  295. package/skills/bober.plan/SKILL.md +6 -0
  296. package/skills/bober.run/SKILL.md +23 -4
  297. package/skills/bober.run/references/lens-panel.md +115 -0
  298. package/skills/bober.sprint/SKILL.md +44 -2
  299. package/skills/bober.sprint/references/lens-panel.md +115 -0
  300. package/skills/shared/arch-lens-panel.md +126 -0
  301. package/skills/shared/lens-panel.md +115 -0
@@ -21,6 +21,22 @@ export interface AgenticLoopParams {
21
21
  onToolUse?: (name: string, input: unknown) => void;
22
22
  /** Called after each completed turn (for progress tracking). */
23
23
  onTurnComplete?: (turn: number, toolsCalled: string[]) => void;
24
+ /**
25
+ * Optional completion predicate. When the model ends a turn WITHOUT calling a
26
+ * tool, the loop normally treats that as "done". Some OpenAI-compatible models
27
+ * (e.g. DeepSeek) instead narrate intentions ("let me write the files...") and
28
+ * stop without calling any tool — which would end the loop with no work done.
29
+ *
30
+ * When this predicate is provided and returns `false` for a tool-less turn,
31
+ * the loop injects a nudge message (see `nudgeMessage`) and continues, up to
32
+ * `maxNudges` times, instead of returning prematurely. When omitted, behavior
33
+ * is unchanged (any tool-less turn ends the loop).
34
+ */
35
+ completionCheck?: (text: string) => boolean;
36
+ /** Max nudges before giving up on an apparently-incomplete tool-less turn. Default 2. */
37
+ maxNudges?: number;
38
+ /** The nudge text appended when `completionCheck` fails. A sensible default is used if omitted. */
39
+ nudgeMessage?: string;
24
40
  }
25
41
  export interface AgenticLoopResult {
26
42
  /** The final text response from the model. */
@@ -37,6 +53,41 @@ export interface AgenticLoopResult {
37
53
  /** The stop reason of the final API response. */
38
54
  stopReason: string;
39
55
  }
56
+ export interface CoerceJsonParams {
57
+ client: LLMClient;
58
+ model: string;
59
+ systemPrompt: string;
60
+ /** The original task/user message that started the loop. */
61
+ userMessage: string;
62
+ /** The (non-JSON / wrong-shape) text the agentic loop produced, fed back for context. */
63
+ priorText: string;
64
+ /**
65
+ * Final instruction telling the model EXACTLY what JSON to emit. Because we
66
+ * use the provider's loose json_object mode (not strict json_schema — DeepSeek
67
+ * rejects the latter), this instruction must spell out every required field;
68
+ * json_object mode only guarantees the output is *a* valid JSON object.
69
+ */
70
+ instruction: string;
71
+ maxTokens?: number;
72
+ }
73
+ /**
74
+ * Force a structured-JSON response after an agentic loop failed to produce the
75
+ * required object. Some OpenAI-compatible models (notably DeepSeek) either
76
+ * narrate prose instead of JSON, or emit valid JSON of the WRONG shape (e.g.
77
+ * following a short "summary" prompt instead of the full schema).
78
+ *
79
+ * Strategy: re-ask with `json_object` response_format (broadly supported,
80
+ * including DeepSeek) plus an explicit field-by-field instruction. If the
81
+ * provider rejects response_format at all (some servers 400 on it), fall back
82
+ * to a plain prompt-only call — the instruction itself demands JSON-only output.
83
+ *
84
+ * Provider-agnostic and meant as a *fallback* after a normal parse attempt
85
+ * fails, so it's a no-op for models that already comply (Claude).
86
+ *
87
+ * @returns The raw text of the coerced response (a JSON document). The caller
88
+ * still validates/repairs it against its domain schema.
89
+ */
90
+ export declare function coerceJsonOutput(params: CoerceJsonParams): Promise<string>;
40
91
  /**
41
92
  * Run a multi-turn agentic conversation loop.
42
93
  *
@@ -1 +1 @@
1
- {"version":3,"file":"agentic-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/agentic-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAA4D,MAAM,uBAAuB,CAAC;AAE1H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sDAAsD;IACtD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,8BAA8B;IAC9B,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAwJ5B"}
1
+ {"version":3,"file":"agentic-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/agentic-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAA4D,MAAM,uBAAuB,CAAC;AAE1H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sDAAsD;IACtD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC/D;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,8BAA8B;IAC9B,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAyED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA0L5B"}
@@ -1,4 +1,102 @@
1
1
  import { logger } from "../utils/logger.js";
2
+ // ── Transient-error retry ──────────────────────────────────────────
3
+ /** Max retry attempts for transient API failures before giving up. */
4
+ const MAX_CHAT_RETRIES = 5;
5
+ /**
6
+ * Substrings that mark a *transient* failure worth retrying. Slower
7
+ * OpenAI-compatible providers (e.g. DeepSeek) routinely drop a connection
8
+ * mid-request ("terminated") or return 429/5xx under load. Auth errors (401),
9
+ * bad requests (400), and the like are NOT listed here, so they fail fast.
10
+ */
11
+ const TRANSIENT_ERROR_PATTERNS = [
12
+ "terminated",
13
+ "econnreset",
14
+ "etimedout",
15
+ "enotfound",
16
+ "fetch failed",
17
+ "socket hang up",
18
+ "epipe",
19
+ "network",
20
+ "timeout",
21
+ "overloaded",
22
+ "rate limit",
23
+ "429",
24
+ "500",
25
+ "502",
26
+ "503",
27
+ "504",
28
+ ];
29
+ function isTransientError(message) {
30
+ const m = message.toLowerCase();
31
+ return TRANSIENT_ERROR_PATTERNS.some((p) => m.includes(p));
32
+ }
33
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
34
+ /**
35
+ * Call client.chat() with exponential backoff on transient errors.
36
+ * Non-transient errors are rethrown immediately (no point retrying a 401).
37
+ */
38
+ async function chatWithRetry(client, params, turn) {
39
+ let lastErr;
40
+ for (let attempt = 1; attempt <= MAX_CHAT_RETRIES; attempt++) {
41
+ try {
42
+ return await client.chat(params);
43
+ }
44
+ catch (err) {
45
+ lastErr = err;
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ if (!isTransientError(message) || attempt === MAX_CHAT_RETRIES) {
48
+ throw err;
49
+ }
50
+ const backoffMs = Math.min(1000 * 2 ** (attempt - 1), 30_000);
51
+ logger.warn(`Transient API error on turn ${turn} ` +
52
+ `(attempt ${attempt}/${MAX_CHAT_RETRIES}): ${message}. ` +
53
+ `Retrying in ${backoffMs}ms...`);
54
+ await sleep(backoffMs);
55
+ }
56
+ }
57
+ throw lastErr;
58
+ }
59
+ /**
60
+ * Force a structured-JSON response after an agentic loop failed to produce the
61
+ * required object. Some OpenAI-compatible models (notably DeepSeek) either
62
+ * narrate prose instead of JSON, or emit valid JSON of the WRONG shape (e.g.
63
+ * following a short "summary" prompt instead of the full schema).
64
+ *
65
+ * Strategy: re-ask with `json_object` response_format (broadly supported,
66
+ * including DeepSeek) plus an explicit field-by-field instruction. If the
67
+ * provider rejects response_format at all (some servers 400 on it), fall back
68
+ * to a plain prompt-only call — the instruction itself demands JSON-only output.
69
+ *
70
+ * Provider-agnostic and meant as a *fallback* after a normal parse attempt
71
+ * fails, so it's a no-op for models that already comply (Claude).
72
+ *
73
+ * @returns The raw text of the coerced response (a JSON document). The caller
74
+ * still validates/repairs it against its domain schema.
75
+ */
76
+ export async function coerceJsonOutput(params) {
77
+ const { client, model, systemPrompt, userMessage, priorText, instruction, maxTokens = 16384, } = params;
78
+ const messages = [
79
+ { role: "user", content: userMessage },
80
+ { role: "assistant", content: priorText || "(no output produced)" },
81
+ { role: "user", content: instruction },
82
+ ];
83
+ try {
84
+ const response = await chatWithRetry(client, { model, system: systemPrompt, messages, jsonObjectMode: true, maxTokens }, 0);
85
+ return response.text;
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ // Provider rejected response_format (e.g. DeepSeek 400 "response_format type
90
+ // is unavailable"). Retry without it — the instruction still demands JSON.
91
+ if (/response_format|json/i.test(message)) {
92
+ logger.warn(`Provider rejected json_object mode (${message}); ` +
93
+ `retrying coercion without response_format.`);
94
+ const response = await chatWithRetry(client, { model, system: systemPrompt, messages, maxTokens }, 0);
95
+ return response.text;
96
+ }
97
+ throw err;
98
+ }
99
+ }
2
100
  // ── Main loop ──────────────────────────────────────────────────────
3
101
  /**
4
102
  * Run a multi-turn agentic conversation loop.
@@ -14,7 +112,7 @@ import { logger } from "../utils/logger.js";
14
112
  * @returns The final text response and metadata about the conversation.
15
113
  */
16
114
  export async function runAgenticLoop(params) {
17
- const { client, model, systemPrompt, userMessage, tools, toolHandlers, maxTurns, maxTokens = 16384, onToolUse, onTurnComplete, } = params;
115
+ const { client, model, systemPrompt, userMessage, tools, toolHandlers, maxTurns, maxTokens = 16384, onToolUse, onTurnComplete, completionCheck, maxNudges = 2, nudgeMessage, } = params;
18
116
  const messages = [
19
117
  { role: "user", content: userMessage },
20
118
  ];
@@ -22,17 +120,18 @@ export async function runAgenticLoop(params) {
22
120
  let totalOutputTokens = 0;
23
121
  const allToolsCalled = [];
24
122
  let finalText = "";
123
+ let nudgesUsed = 0;
25
124
  for (let turn = 1; turn <= maxTurns; turn++) {
26
125
  logger.debug(`Agentic loop turn ${turn}/${maxTurns}...`);
27
126
  let response;
28
127
  try {
29
- response = await client.chat({
128
+ response = await chatWithRetry(client, {
30
129
  model,
31
130
  system: systemPrompt,
32
131
  messages,
33
132
  tools: tools.length > 0 ? tools : undefined,
34
133
  maxTokens,
35
- });
134
+ }, turn);
36
135
  }
37
136
  catch (err) {
38
137
  // Handle context window exhaustion or other API errors
@@ -53,9 +152,29 @@ export async function runAgenticLoop(params) {
53
152
  totalInputTokens += response.usage.inputTokens;
54
153
  totalOutputTokens += response.usage.outputTokens;
55
154
  const turnStopReason = response.stopReason;
56
- // If the model is done (no more tool use), return
155
+ // If the model is done (no more tool use), return — UNLESS a completion
156
+ // predicate says this tool-less turn isn't actually complete (model narrated
157
+ // intentions instead of acting). In that case, nudge it to act and continue.
57
158
  if (response.stopReason !== "tool_use") {
58
159
  finalText = response.text;
160
+ const incomplete = completionCheck !== undefined &&
161
+ !completionCheck(finalText) &&
162
+ nudgesUsed < maxNudges;
163
+ if (incomplete) {
164
+ nudgesUsed += 1;
165
+ logger.warn(`Model ended turn ${turn} without calling a tool and without ` +
166
+ `completing (nudge ${nudgesUsed}/${maxNudges}). Prompting it to continue.`);
167
+ messages.push({ role: "assistant", content: finalText });
168
+ messages.push({
169
+ role: "user",
170
+ content: nudgeMessage ??
171
+ "You stopped without calling any tool and without producing your " +
172
+ "final result. If work remains, CALL THE APPROPRIATE TOOL now to " +
173
+ "do it (do not describe what you would do — actually call the tool). " +
174
+ "If you are genuinely finished, output ONLY your final result now.",
175
+ });
176
+ continue;
177
+ }
59
178
  return {
60
179
  finalText,
61
180
  turnsUsed: turn,
@@ -1 +1 @@
1
- {"version":3,"file":"agentic-loop.js","sourceRoot":"","sources":["../../src/orchestrator/agentic-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentic-loop.js","sourceRoot":"","sources":["../../src/orchestrator/agentic-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve an architect lens name to its focus fragment.
3
+ * Returns the catalog entry for a known lens, or a generic non-empty
4
+ * fallback for any unknown custom string — never throws (C2).
5
+ */
6
+ export declare function resolveArchLensFocus(lens: string): string;
7
+ //# sourceMappingURL=arch-lenses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-lenses.d.ts","sourceRoot":"","sources":["../../src/orchestrator/arch-lenses.ts"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD"}
@@ -0,0 +1,22 @@
1
+ // ── Lens catalog ────────────────────────────────────────────────────
2
+ /** Built-in architect lens focus fragments. Each must be distinct and non-empty (C2). */
3
+ const ARCH_LENS_CATALOG = {
4
+ scalability: "Focus on whether the proposed architecture can handle projected load growth. Evaluate horizontal and vertical scaling paths, bottlenecks, stateful vs stateless components, and whether partitioning or sharding strategies are available when needed.",
5
+ security: "Focus on the threat surface introduced by this architecture. Evaluate trust boundaries, data flows across zones, authentication and authorisation enforcement points, secrets management, and exposure of internal services.",
6
+ cost: "Focus on the total cost of ownership implied by this architecture. Evaluate compute, storage, and egress costs at projected scale, licensing or SaaS subscription expenses, and the operational overhead of running, monitoring, and scaling the system.",
7
+ operability: "Focus on how easy it will be to operate this architecture in production. Evaluate observability (metrics, logs, traces), deployment complexity, rollout and rollback procedures, on-call burden, and the blast radius of common failure modes.",
8
+ maintainability: "Focus on how easy it will be to change and extend this architecture over time. Evaluate coupling between components, clarity of boundaries, documentation needs, onboarding friction for new contributors, and the risk of accruing technical debt.",
9
+ reversibility: "Focus on how difficult or costly it would be to undo or replace this architectural decision. Evaluate lock-in to vendors or proprietary technologies, data migration complexity, and whether a strangler-fig or incremental migration path exists if the approach needs to change.",
10
+ simplicity: "Focus on whether this is the simplest architecture that satisfies the Checkpoint 1 constraints. Challenge whether each component needs to exist, whether a native platform feature or an already-present dependency removes a proposed custom layer, whether two components should collapse into one, and whether any abstraction is speculative — added for a use case absent from the problem statement. Reward the smallest design that honours every hard constraint; penalise layers introduced for unproven future flexibility, but never at the expense of a stated constraint.",
11
+ };
12
+ // ── Resolver ────────────────────────────────────────────────────────
13
+ /**
14
+ * Resolve an architect lens name to its focus fragment.
15
+ * Returns the catalog entry for a known lens, or a generic non-empty
16
+ * fallback for any unknown custom string — never throws (C2).
17
+ */
18
+ export function resolveArchLensFocus(lens) {
19
+ return (ARCH_LENS_CATALOG[lens] ??
20
+ `Evaluate this architecture specifically through the '${lens}' lens.`);
21
+ }
22
+ //# sourceMappingURL=arch-lenses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-lenses.js","sourceRoot":"","sources":["../../src/orchestrator/arch-lenses.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,yFAAyF;AACzF,MAAM,iBAAiB,GAA2B;IAChD,WAAW,EACT,wPAAwP;IAC1P,QAAQ,EACN,8NAA8N;IAChO,IAAI,EACF,0PAA0P;IAC5P,WAAW,EACT,gPAAgP;IAClP,eAAe,EACb,qPAAqP;IACvP,aAAa,EACX,oRAAoR;IACtR,UAAU,EACR,wjBAAwjB;CAC3jB,CAAC;AAEF,uEAAuE;AAEvE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,CACL,iBAAiB,CAAC,IAAI,CAAC;QACvB,wDAAwD,IAAI,SAAS,CACtE,CAAC;AACJ,CAAC"}
@@ -15,6 +15,22 @@ export interface ArchitectResult {
15
15
  componentCount: number;
16
16
  /** Number of Architecture Decision Records produced. */
17
17
  decisionCount: number;
18
+ /** Per-lens scores from the panel path (additive, optional — absent on the off path). */
19
+ lensScores?: Array<{
20
+ lens: string;
21
+ scores: Record<string, number>;
22
+ }>;
23
+ /** The approach selected by synthesize().winner on the panel path (additive, optional — absent on the off path). */
24
+ selectedApproach?: string;
25
+ /** Per-lens CP5 review verdicts from the panel path (additive, optional — absent on the off path). */
26
+ lensReviews?: Array<{
27
+ lens: string;
28
+ passed: boolean;
29
+ summary: string;
30
+ feedback: string;
31
+ }>;
32
+ /** The reconciled panel verdict for CP5 (additive, optional). false = fail-closed. */
33
+ panelReviewPassed?: boolean;
18
34
  }
19
35
  /**
20
36
  * Run the 5-checkpoint architect flow in autonomous mode.
@@ -1 +1 @@
1
- {"version":3,"file":"architect-agent.d.ts","sourceRoot":"","sources":["../../src/orchestrator/architect-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkBvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;CACvB;AA6FD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CA2M1B"}
1
+ {"version":3,"file":"architect-agent.d.ts","sourceRoot":"","sources":["../../src/orchestrator/architect-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAuBvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACrE,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1F,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AA6FD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CAQ1B"}