@intrect/openswarm 0.4.4 → 0.5.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 (125) hide show
  1. package/README.md +33 -16
  2. package/config.example.yaml +14 -8
  3. package/dist/adapters/agenticLoop.d.ts +30 -1
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +150 -60
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/codex.d.ts +1 -0
  8. package/dist/adapters/codex.d.ts.map +1 -1
  9. package/dist/adapters/codex.js +40 -5
  10. package/dist/adapters/codex.js.map +1 -1
  11. package/dist/adapters/gpt.d.ts.map +1 -1
  12. package/dist/adapters/gpt.js +18 -4
  13. package/dist/adapters/gpt.js.map +1 -1
  14. package/dist/adapters/index.d.ts +3 -2
  15. package/dist/adapters/index.d.ts.map +1 -1
  16. package/dist/adapters/index.js +8 -5
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/adapters/lmstudio.d.ts +8 -0
  19. package/dist/adapters/lmstudio.d.ts.map +1 -0
  20. package/dist/adapters/lmstudio.js +41 -0
  21. package/dist/adapters/lmstudio.js.map +1 -0
  22. package/dist/adapters/local.d.ts +16 -1
  23. package/dist/adapters/local.d.ts.map +1 -1
  24. package/dist/adapters/local.js +45 -13
  25. package/dist/adapters/local.js.map +1 -1
  26. package/dist/adapters/openrouter.d.ts +56 -0
  27. package/dist/adapters/openrouter.d.ts.map +1 -0
  28. package/dist/adapters/openrouter.js +294 -0
  29. package/dist/adapters/openrouter.js.map +1 -0
  30. package/dist/adapters/tools.d.ts +27 -2
  31. package/dist/adapters/tools.d.ts.map +1 -1
  32. package/dist/adapters/tools.js +99 -12
  33. package/dist/adapters/tools.js.map +1 -1
  34. package/dist/adapters/types.d.ts +20 -1
  35. package/dist/adapters/types.d.ts.map +1 -1
  36. package/dist/agents/draftAnalyzer.d.ts +1 -1
  37. package/dist/agents/draftAnalyzer.d.ts.map +1 -1
  38. package/dist/agents/draftAnalyzer.js +3 -3
  39. package/dist/agents/draftAnalyzer.js.map +1 -1
  40. package/dist/agents/pairPipeline.d.ts.map +1 -1
  41. package/dist/agents/pairPipeline.js +102 -3
  42. package/dist/agents/pairPipeline.js.map +1 -1
  43. package/dist/agents/worker.d.ts +6 -0
  44. package/dist/agents/worker.d.ts.map +1 -1
  45. package/dist/agents/worker.js +22 -2
  46. package/dist/agents/worker.js.map +1 -1
  47. package/dist/auth/index.d.ts +2 -1
  48. package/dist/auth/index.d.ts.map +1 -1
  49. package/dist/auth/index.js +2 -1
  50. package/dist/auth/index.js.map +1 -1
  51. package/dist/auth/oauthPkce.d.ts +4 -3
  52. package/dist/auth/oauthPkce.d.ts.map +1 -1
  53. package/dist/auth/oauthPkce.js +21 -7
  54. package/dist/auth/oauthPkce.js.map +1 -1
  55. package/dist/auth/oauthStore.d.ts +11 -1
  56. package/dist/auth/oauthStore.d.ts.map +1 -1
  57. package/dist/auth/oauthStore.js +4 -0
  58. package/dist/auth/oauthStore.js.map +1 -1
  59. package/dist/auth/openrouterPkce.d.ts +29 -0
  60. package/dist/auth/openrouterPkce.d.ts.map +1 -0
  61. package/dist/auth/openrouterPkce.js +222 -0
  62. package/dist/auth/openrouterPkce.js.map +1 -0
  63. package/dist/automation/autonomousRunner.d.ts +16 -6
  64. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  65. package/dist/automation/autonomousRunner.js +54 -57
  66. package/dist/automation/autonomousRunner.js.map +1 -1
  67. package/dist/automation/runnerExecution.js +1 -1
  68. package/dist/automation/runnerExecution.js.map +1 -1
  69. package/dist/automation/runnerTypes.d.ts +1 -1
  70. package/dist/automation/runnerTypes.d.ts.map +1 -1
  71. package/dist/cli/authHandler.d.ts +8 -5
  72. package/dist/cli/authHandler.d.ts.map +1 -1
  73. package/dist/cli/authHandler.js +95 -35
  74. package/dist/cli/authHandler.js.map +1 -1
  75. package/dist/cli.js +5 -4
  76. package/dist/cli.js.map +1 -1
  77. package/dist/core/config.d.ts +39 -13
  78. package/dist/core/config.d.ts.map +1 -1
  79. package/dist/core/config.js +33 -15
  80. package/dist/core/config.js.map +1 -1
  81. package/dist/core/eventHub.d.ts +22 -0
  82. package/dist/core/eventHub.d.ts.map +1 -1
  83. package/dist/core/eventHub.js.map +1 -1
  84. package/dist/core/service.js +2 -2
  85. package/dist/core/service.js.map +1 -1
  86. package/dist/core/types.d.ts +2 -2
  87. package/dist/core/types.d.ts.map +1 -1
  88. package/dist/discord/discordCore.d.ts.map +1 -1
  89. package/dist/discord/discordCore.js +16 -103
  90. package/dist/discord/discordCore.js.map +1 -1
  91. package/dist/locale/prompts/en.d.ts.map +1 -1
  92. package/dist/locale/prompts/en.js +26 -18
  93. package/dist/locale/prompts/en.js.map +1 -1
  94. package/dist/locale/prompts/ko.d.ts.map +1 -1
  95. package/dist/locale/prompts/ko.js +25 -18
  96. package/dist/locale/prompts/ko.js.map +1 -1
  97. package/dist/locale/types.d.ts +6 -0
  98. package/dist/locale/types.d.ts.map +1 -1
  99. package/dist/memory/repoKnowledge.d.ts +33 -0
  100. package/dist/memory/repoKnowledge.d.ts.map +1 -0
  101. package/dist/memory/repoKnowledge.js +97 -0
  102. package/dist/memory/repoKnowledge.js.map +1 -0
  103. package/dist/support/chat.js +8 -22
  104. package/dist/support/chat.js.map +1 -1
  105. package/dist/support/chatBackend.d.ts.map +1 -1
  106. package/dist/support/chatBackend.js +37 -83
  107. package/dist/support/chatBackend.js.map +1 -1
  108. package/dist/support/chatTui.d.ts.map +1 -1
  109. package/dist/support/chatTui.js +16 -19
  110. package/dist/support/chatTui.js.map +1 -1
  111. package/dist/support/dashboardHtml.d.ts +1 -1
  112. package/dist/support/dashboardHtml.d.ts.map +1 -1
  113. package/dist/support/dashboardHtml.js +318 -65
  114. package/dist/support/dashboardHtml.js.map +1 -1
  115. package/dist/support/projectMapper.d.ts.map +1 -1
  116. package/dist/support/projectMapper.js +29 -1
  117. package/dist/support/projectMapper.js.map +1 -1
  118. package/dist/support/repoMetadata.d.ts +44 -0
  119. package/dist/support/repoMetadata.d.ts.map +1 -0
  120. package/dist/support/repoMetadata.js +79 -0
  121. package/dist/support/repoMetadata.js.map +1 -0
  122. package/dist/support/web.d.ts.map +1 -1
  123. package/dist/support/web.js +53 -6
  124. package/dist/support/web.js.map +1 -1
  125. package/package.json +1 -1
package/README.md CHANGED
@@ -3,24 +3,18 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@intrect/openswarm.svg)](https://www.npmjs.com/package/@intrect/openswarm)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@intrect/openswarm.svg)](https://www.npmjs.com/package/@intrect/openswarm)
5
5
  [![license](https://img.shields.io/npm/l/@intrect/openswarm.svg)](LICENSE)
6
- [![ko-fi](https://img.shields.io/badge/Ko--fi-support-FF5E5B?logo=ko-fi&logoColor=white)](https://ko-fi.com/unohee)
6
+ [![SWE-bench Lite](https://img.shields.io/badge/SWE--bench_Lite-hybrid_3%2F3_resolved-2ea44f)](benchmarks/RUBRIC.md)
7
+ [![GitHub Discussions](https://img.shields.io/github/discussions/unohee/OpenSwarm?logo=github&label=discussions)](https://github.com/unohee/OpenSwarm/discussions)
7
8
 
8
- > Autonomous AI agent orchestrator — Claude, GPT, Codex, and local models (Ollama/LMStudio/llama.cpp)
9
+ > Autonomous AI agent orchestrator — Claude, GPT, Codex, **OpenRouter (any model)**, and local models (Ollama/LMStudio/llama.cpp)
9
10
 
10
- ## Sponsor
11
-
12
- OpenSwarm is developed and maintained in my spare time by a single author.
13
- If the project saves you time or money, please consider chipping in —
14
- it directly funds ongoing updates, bug fixes, and new adapters.
15
-
16
- [![Support on Ko-fi](https://img.shields.io/badge/Support%20on-Ko--fi-FF5E5B?logo=ko-fi&logoColor=white&style=for-the-badge)](https://ko-fi.com/unohee)
17
-
18
- One-off contributions are perfectly fine — there is no subscription
19
- tier and no feature is paywalled. Thank you.
11
+ > 💬 **Help shape OpenSwarm.** Share feature ideas, vote on the roadmap, and ask questions in [**GitHub Discussions**](https://github.com/unohee/OpenSwarm/discussions). The roadmap is built in the open — your feedback decides what ships next.
20
12
 
21
13
  ---
22
14
 
23
- OpenSwarm orchestrates multiple AI agents as autonomous code workers. It picks up Linear issues, runs Worker/Reviewer pair pipelines, reports to Discord, and retains long-term memory via LanceDB. Supports Claude Code, OpenAI GPT, Codex, and **local open-source models** via Ollama, LMStudio, or llama.cpp.
15
+ OpenSwarm orchestrates multiple AI agents as autonomous code workers. It picks up Linear issues, runs Worker/Reviewer pair pipelines, reports to Discord, and retains long-term memory via LanceDB. Workers run on Claude Code, OpenAI GPT, Codex, **any OpenRouter model**, or **local open-source models** (Ollama, LMStudio, llama.cpp) — with cost-aware routing measured on an L0–L6 benchmark ladder.
16
+
17
+ **Verified on real GitHub issues**: the agentic harness solves SWE-bench Lite instances graded by the official harness. Hybrid mode — a frontier model diagnoses read-only, a lightweight model implements with a verification loop — resolved **3/3 attempted instances** that every single lightweight model had failed, at a fraction of frontier-only cost. Workers also **learn each repository over time**: task outcomes are stored as per-repo knowledge and recalled into future prompts. ([benchmark rubric & results](benchmarks/RUBRIC.md))
24
18
 
25
19
  ## Quick Start
26
20
 
@@ -133,7 +127,7 @@ LINEAR_TEAM_ID=your-linear-team-id
133
127
  ### CLI Adapter (Provider)
134
128
 
135
129
  ```yaml
136
- adapter: claude # "claude" | "codex" | "gpt" | "local"
130
+ adapter: claude # "claude" | "codex" | "gpt" | "openrouter" | "local" | "lmstudio"
137
131
  ```
138
132
 
139
133
  Switch at runtime via Discord: `!provider codex` / `!provider claude`
@@ -143,9 +137,13 @@ Switch at runtime via Discord: `!provider codex` / `!provider claude`
143
137
  | `claude` | Claude Code CLI | sonnet-4, haiku-4.5, opus-4 | CLI auth |
144
138
  | `codex` | OpenAI Codex CLI | o3, o4-mini | CLI auth |
145
139
  | `gpt` | OpenAI API | gpt-4o, o3, gpt-4.1 | OAuth PKCE |
140
+ | `openrouter` | OpenRouter API (native agentic loop) | any OpenRouter model — gpt-5, gemini-2.5-flash, deepseek, glm, qwen, … | OAuth PKCE or `OPENROUTER_API` |
146
141
  | `local` | Ollama / LMStudio / llama.cpp | gemma4, llama3, mistral, qwen, etc. | None |
142
+ | `lmstudio` | LM Studio OpenAI-compatible API | loaded LM Studio model (`LMSTUDIO_MODEL`) | Optional API key |
143
+
144
+ The `openrouter` adapter runs OpenSwarm's own agentic tool loop (read/search/edit/bash with verification guards), enables ZDR (`data_collection: deny`) for non-OpenAI models, and applies Anthropic prompt caching automatically.
147
145
 
148
- Local models are auto-detected on standard ports (Ollama `:11434`, LMStudio `:1234`, llama.cpp `:8080`).
146
+ Local models are auto-detected on standard ports (Ollama `:11434`, LMStudio `:1234`, llama.cpp `:8080`). Use `lmstudio` for a dedicated LM Studio endpoint (`LMSTUDIO_BASE_URL`, default `http://localhost:1234`).
149
147
 
150
148
  Per-role adapter overrides:
151
149
 
@@ -250,13 +248,15 @@ docker compose up -d # Docker
250
248
 
251
249
  ## Features
252
250
 
253
- - **Multi-Provider Adapters** — Pluggable adapter system: **Claude Code**, **OpenAI GPT/Codex**, and **local models** (Ollama, LMStudio, llama.cpp) with runtime provider switching
251
+ - **Multi-Provider Adapters** — Pluggable adapter system: **Claude Code**, **OpenAI GPT/Codex**, **OpenRouter** (any model, native agentic loop), and **local models** (Ollama, LMStudio, llama.cpp) with runtime provider switching
254
252
  - **Code Registry** — SQLite-backed entity registry tracking every function/class/type across 8 languages, with complexity scoring, test mapping, and risk assessment
255
253
  - **BS Detector** — Built-in static analysis engine that detects bad code patterns (empty catch, hardcoded secrets, `as any`, etc.) with pipeline guard integration
256
254
  - **Autonomous Pipeline** — Cron-driven heartbeat fetches Linear issues, runs Worker/Reviewer pair loops, and updates issue state automatically
257
255
  - **Worker/Reviewer Pairs** — Multi-iteration code generation with automated review, testing, and documentation stages
258
256
  - **Decision Engine** — Scope validation, rate limiting, priority-based task selection, and workflow mapping
259
257
  - **Cognitive Memory** — LanceDB vector store with Xenova/multilingual-e5-base embeddings for long-term recall across sessions
258
+ - **Repo Knowledge Loop** — workers learn each repository over time: task outcomes (success patterns, review-rejection pitfalls) are stored per-repo and recalled into the next worker prompt
259
+ - **SWE-bench Verified** — the agentic harness solves real SWE-bench Lite issues, graded by the official harness; hybrid mode (frontier diagnosis + lightweight implementer) resolved 3/3 attempted instances ([benchmarks/RUBRIC.md](benchmarks/RUBRIC.md))
260
260
  - **Knowledge Graph** — Static code analysis, dependency mapping, impact analysis, and file-level conflict detection across concurrent tasks
261
261
  - **Discord Control** — Full command interface for monitoring, task dispatch, scheduling, provider switching, and pair session management
262
262
  - **Rich TUI Chat** — Claude Code inspired terminal interface with tabs, streaming responses, and geek-themed loading messages
@@ -294,6 +294,23 @@ Memory types: `belief` · `strategy` · `user_model` · `system_pattern` · `con
294
294
 
295
295
  Background: decay, consolidation, contradiction detection, distillation.
296
296
 
297
+ **Repo knowledge loop** — every completed task writes repo-scoped knowledge
298
+ (success → `system_pattern` with files changed + approach, review rejection →
299
+ `constraint` pitfall), and the next task on the same repo recalls the most
300
+ relevant entries into the worker prompt as a "Repository Knowledge" section.
301
+ Workers get better at a codebase the more they work on it.
302
+
303
+ ### Benchmarks (L0–L6)
304
+
305
+ `benchmarks/` contains a difficulty ladder for routing models by measured
306
+ capability — synthetic L0–L5 tasks with deterministic grading, and L6 = real
307
+ GitHub issues (SWE-bench Lite) solved by the OpenSwarm harness and graded by
308
+ the official swebench harness. Headline: **hybrid mode** (frontier read-only
309
+ diagnosis + lightweight implementer with a verification loop) resolved 3/3
310
+ attempted instances that every single lightweight model had failed. See
311
+ [benchmarks/RUBRIC.md](benchmarks/RUBRIC.md) for the rubric, measured results,
312
+ and the harness defects the benchmark uncovered.
313
+
297
314
  ---
298
315
 
299
316
  ## Discord Commands
@@ -3,9 +3,15 @@
3
3
  # Copy this file to config.yaml to use
4
4
 
5
5
  # Default CLI adapter for worker/reviewer stages
6
- # Options: claude, codex, gpt, local
7
- # For GPT: run `openswarm auth login --provider gpt` first
6
+ # Options: claude, codex, gpt, local, lmstudio, openrouter
7
+ # For GPT: run `openswarm auth login --provider gpt`
8
+ # (uses the public Codex OAuth client by default — no extra config needed)
9
+ # For OpenRouter: run `openswarm auth login --provider openrouter`
10
+ # (PKCE browser flow → stores a sk-or-* API key; falls back to manual paste)
8
11
  # For local: start Ollama, LMStudio, or llama.cpp server
12
+ # For lmstudio: start LM Studio Local Server (default http://localhost:1234)
13
+ # Optional env: LMSTUDIO_BASE_URL, LMSTUDIO_MODEL, LMSTUDIO_API_KEY
14
+ # If LMSTUDIO_MODEL is unset, the adapter auto-selects the first loaded model.
9
15
  adapter: claude
10
16
 
11
17
  discord:
@@ -49,7 +55,7 @@ autonomous:
49
55
  decomposition:
50
56
  enabled: true # Enable decomposition
51
57
  thresholdMinutes: 30 # Decompose if estimated time exceeds this
52
- plannerModel: claude-sonnet-4-20250514 # Planner model
58
+ plannerModel: claude-opus-4-7 # Planner model (Opus for deep decomposition)
53
59
 
54
60
  # Per-role settings
55
61
  # Hybrid config: Claude for complex coding, local model for review/docs ($0)
@@ -57,15 +63,15 @@ autonomous:
57
63
  worker:
58
64
  enabled: true
59
65
  adapter: claude
60
- model: claude-sonnet-4-20250514 # Sonnet for coding tasks
61
- escalateModel: claude-opus-4-6 # On failure: Opus
66
+ model: claude-sonnet-4-6 # Sonnet for coding tasks
67
+ escalateModel: claude-opus-4-7 # On failure: Opus
62
68
  escalateAfterIteration: 3
63
69
  timeoutMs: 1800000 # 30 minutes
64
70
  reviewer:
65
71
  enabled: true
66
72
  adapter: local # Local model — free, 7s response
67
73
  model: gemma-4-e4b-it # Gemma 4 e4b via LMStudio
68
- escalateModel: claude-sonnet-4-20250514 # Spot check: Sonnet reviews after N revisions
74
+ escalateModel: claude-sonnet-4-6 # Spot check: Sonnet reviews after N revisions
69
75
  escalateAfterIteration: 3 # Escalate from 3rd iteration
70
76
  timeoutMs: 60000 # 1 minute (local models are slower)
71
77
  tester:
@@ -105,8 +111,8 @@ autonomous:
105
111
  - name: deep-engineering
106
112
  minMinutes: 16
107
113
  roles:
108
- worker: claude-sonnet-4-20250514 # Sonnet for complex work
109
- reviewer: claude-sonnet-4-20250514 # Sonnet reviews Sonnet
114
+ worker: claude-sonnet-4-6 # Sonnet for complex work
115
+ reviewer: claude-sonnet-4-6 # Sonnet reviews Sonnet
110
116
 
111
117
  # Long-running task monitoring (RunPod training, batch processing, etc.)
112
118
  #
@@ -51,7 +51,7 @@ export interface AgenticLoopOptions {
51
51
  model: string;
52
52
  /** API 호출 함수 (어댑터별로 주입) */
53
53
  callApi: (messages: ChatMessage[], tools: ToolDefinition[]) => Promise<ChatCompletionResponse>;
54
- /** 최대 도구 사용 턴 수 (기본: 15) */
54
+ /** 최대 도구 사용 턴 수 (기본: 20) */
55
55
  maxTurns?: number;
56
56
  /** 전체 타임아웃 (ms, 기본: 300000) */
57
57
  timeoutMs?: number;
@@ -59,6 +59,23 @@ export interface AgenticLoopOptions {
59
59
  onLog?: (line: string) => void;
60
60
  /** 도구 사용 허용 여부 (기본: true) */
61
61
  enableTools?: boolean;
62
+ /** 토큰 기반 압축 트리거 임계값 (기본: 24000) */
63
+ compactTokenThreshold?: number;
64
+ /** 이 메시지 수를 넘어야 압축 후보 (VEGA compact_threshold, 기본: 24) */
65
+ compactAfterMessages?: number;
66
+ /** 압축 시 항상 원본 유지할 최근 메시지 수 (VEGA keep_recent, 기본: 8) */
67
+ keepRecentMessages?: number;
68
+ /**
69
+ * 수정이 필수인 작업의 no-edit 종료 가드. 모델이 edit/write 도구를 한 번도 안 쓰고
70
+ * 최종 텍스트로 끝내려 하면 "아직 수정 안 했다, 계속하라"고 N회까지 되민다.
71
+ * 경량 모델(gemini 등)이 탐색만 하고 일찍 결론 내는 패턴 차단 (SWE 하이브리드에서 발견).
72
+ * 기본 0 (비활성) — 수정 없는 작업(진단·분석)도 정상이므로 옵트인.
73
+ */
74
+ nudgeMaxOnNoEdit?: number;
75
+ /** Verification-harness files for which edit/write are refused (see tools.ts ToolExecOptions) */
76
+ protectedFiles?: string[];
77
+ /** bash tool timeout — docker-based tests need minutes (default 30s) */
78
+ bashTimeoutMs?: number;
62
79
  }
63
80
  /** 루프 실행 결과 */
64
81
  export interface AgenticLoopResult {
@@ -86,5 +103,17 @@ export declare function runAgenticLoop(options: AgenticLoopOptions): Promise<Age
86
103
  * AgenticLoopResult → CliRunResult 변환
87
104
  */
88
105
  export declare function loopResultToCliResult(result: AgenticLoopResult): CliRunResult;
106
+ /**
107
+ * 이전 턴(assistant+tool 쌍)을 요약 1줄로 교체.
108
+ * OpenAI API 제약: tool 메시지는 직전 assistant의 tool_call_id와 대응해야 하므로
109
+ * 오래된 assistant+tool 쌍은 텍스트 요약으로 대체해 API 오류를 방지.
110
+ *
111
+ * 보존 기준 (VEGA keep_recent): 최근 keepRecent개 메시지 블록은 항상 원본 유지.
112
+ * tool 메시지는 직전 assistant의 tool_call_id와 짝이 맞아야 하므로, 보존 경계는
113
+ * keepRecent 지점 이후 첫 assistant로 정렬해 짝이 깨진 tool 메시지가 남지 않게 한다.
114
+ * 기존 [Prior turns compacted] 요약이 있으면 새 요약에 합산 후 교체.
115
+ * (테스트를 위해 export — 외부에서 직접 호출할 일은 없음)
116
+ */
117
+ export declare function compactPriorTurns(messages: ChatMessage[], keepRecent?: number): void;
89
118
  export {};
90
119
  //# sourceMappingURL=agenticLoop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agenticLoop.d.ts","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACrH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,yCAAyC;AACzC,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,sBAAsB;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;SAC5B,CAAC;QACF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,iBAAiB;AACjB,MAAM,WAAW,kBAAkB;IACjC,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/F,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAe;AACf,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0H5F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAO7E"}
1
+ {"version":3,"file":"agenticLoop.d.ts","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,44 @@
1
1
  // ============================================
2
2
  // OpenSwarm - Agentic Tool Loop
3
3
  // Created: 2026-04-11
4
- // Purpose: GPT/Local 어댑터에 Claude CLI와 동등한 도구 사용 능력을 부여하는
5
- // 범용 에이전틱 루프 엔진.
4
+ // Purpose: Codex/OpenRouter/Local 어댑터용 범용 에이전틱 루프 엔진.
6
5
  // OpenAI function calling 포맷 기반.
6
+ // VEGA token_count.py 패턴 이식 — 토큰 기반 히스토리 압축.
7
7
  // ============================================
8
- import { TOOL_DEFINITIONS, executeToolCalls } from './tools.js';
8
+ import { TOOL_DEFINITIONS, executeToolCalls, createReadCache } from './tools.js';
9
+ // ============ 토큰 카운팅 (VEGA token_count.py 이식) ============
10
+ // cl100k_base 근사: 한국어 0.78t/char, 영어 0.27t/char
11
+ function countTokensApprox(text) {
12
+ if (!text)
13
+ return 0;
14
+ const hangul = [...text].filter(c => c >= '가' && c <= '힣').length;
15
+ const korRatio = hangul / Math.max(1, text.length);
16
+ const rate = 0.78 * korRatio + 0.27 * (1 - korRatio);
17
+ return Math.ceil(text.length * rate);
18
+ }
19
+ function countMessageTokens(messages) {
20
+ let total = 0;
21
+ for (const m of messages) {
22
+ const content = typeof m.content === 'string' ? m.content : '';
23
+ total += countTokensApprox(content);
24
+ total += 4; // role overhead
25
+ if ('tool_calls' in m && m.tool_calls) {
26
+ for (const tc of m.tool_calls) {
27
+ total += countTokensApprox(tc.function.arguments) + countTokensApprox(tc.function.name) + 8;
28
+ }
29
+ }
30
+ }
31
+ return total;
32
+ }
33
+ // 도구 결과 길이 제한: 너무 작게 자르면 모델이 파일 절반만 보고 잘못 수정한다.
34
+ // 코딩 작업에 맞춰 넉넉히 보존(2500자), 초과 시 앞 1500 + 뒤 700자 유지.
35
+ function truncateToolResult(content, maxLen = 2500) {
36
+ if (content.length <= maxLen)
37
+ return content;
38
+ const head = content.slice(0, 1500);
39
+ const tail = content.slice(-700);
40
+ return `${head}\n...[${content.length - 2200} chars truncated]...\n${tail}`;
41
+ }
9
42
  // ============ 에이전틱 루프 ============
10
43
  /**
11
44
  * 에이전틱 도구 루프 실행
@@ -16,7 +49,11 @@ import { TOOL_DEFINITIONS, executeToolCalls } from './tools.js';
16
49
  * 3. 응답에 tool_calls가 없으면 (finish_reason = 'stop') → 최종 텍스트 반환
17
50
  */
18
51
  export async function runAgenticLoop(options) {
19
- const { systemPrompt, prompt, cwd, callApi, maxTurns = 15, timeoutMs = 300000, onLog, enableTools = true, } = options;
52
+ const { systemPrompt, prompt, cwd, callApi, maxTurns = 20, timeoutMs = 300000, onLog, enableTools = true,
53
+ // 긴 작업(SWE-bench급 실전 repo)에서 압축이 너무 일찍·자주 터지면 모델이 읽은
54
+ // 파일 컨텍스트를 잃고 같은 파일을 반복 read하다 수정에 도달 못 한다(무한 탐색).
55
+ // 현대 모델 컨텍스트(128k+)에 맞춰 임계를 넉넉히, 최근 보존 블록도 늘린다.
56
+ compactTokenThreshold = 60000, compactAfterMessages = 60, keepRecentMessages = 16, nudgeMaxOnNoEdit = 0, protectedFiles, bashTimeoutMs, } = options;
20
57
  const startTime = Date.now();
21
58
  const deadline = startTime + timeoutMs;
22
59
  // 메시지 히스토리 구성
@@ -24,9 +61,19 @@ export async function runAgenticLoop(options) {
24
61
  if (systemPrompt) {
25
62
  messages.push({ role: 'system', content: systemPrompt });
26
63
  }
27
- messages.push({ role: 'user', content: prompt });
64
+ // 작업 루트(cwd)를 명시 — 모델이 모르면 '/' repo명 같은 절대경로를 추측해
65
+ // 경로 검증(project 밖 접근)에 막힌다. 실전 repo(pylint 등)에서 search_files가
66
+ // 전부 차단되던 결함(SWE-bench에서 발견). 도구는 이 루트 기준 상대경로를 쓰라고 안내.
67
+ const cwdNote = `# Working directory\n` +
68
+ `Your project root is: ${cwd}\n` +
69
+ `All file tools operate within this root. Use paths relative to it (e.g. "src/foo.ts" or ".") ` +
70
+ `or absolute paths under this root. Do NOT use "/" or a bare repo name — those are outside the project and will be rejected.\n\n`;
71
+ messages.push({ role: 'user', content: cwdNote + prompt });
28
72
  const tools = enableTools ? TOOL_DEFINITIONS : [];
73
+ const readCache = createReadCache(); // 루프 단위 read 캐시 (중복 read 차단)
29
74
  let toolCallCount = 0;
75
+ let editToolCount = 0; // edit_file/write_file 호출 수 (no-edit 가드용)
76
+ let nudgesUsed = 0;
30
77
  let apiCallCount = 0;
31
78
  let totalTokens = 0;
32
79
  let finalText = '';
@@ -36,9 +83,17 @@ export async function runAgenticLoop(options) {
36
83
  onLog?.(`⏰ Agentic loop timeout after ${turn} turns`);
37
84
  break;
38
85
  }
39
- // 매 턴 히스토리 압축 — 이전 턴의 tool call/result를 1줄 요약으로 교체
40
- if (turn >= 2) {
41
- compactPriorTurns(messages);
86
+ // 히스토리 압축 — VEGA compaction.py 패턴 이식.
87
+ // 트리거: 메시지 수가 compactAfterMessages를 넘고 + 토큰이 임계값 초과일 때만.
88
+ // 과거에는 turn>=2부터 매 턴 무조건 압축해 모델이 방금 읽은 파일·작업 맥락을
89
+ // 즉시 잃고 헛돌았다(루프 재발). 이제 정말 길어질 때만 압축하고, 압축해도
90
+ // 최근 keepRecentMessages 블록은 원본 유지한다.
91
+ if (messages.length > compactAfterMessages) {
92
+ const msgTokens = countMessageTokens(messages);
93
+ if (msgTokens > compactTokenThreshold) {
94
+ onLog?.(`📦 Compacting history (${messages.length} msgs, ${msgTokens} tokens > ${compactTokenThreshold})`);
95
+ compactPriorTurns(messages, keepRecentMessages);
96
+ }
42
97
  }
43
98
  // API 호출
44
99
  apiCallCount++;
@@ -65,6 +120,20 @@ export async function runAgenticLoop(options) {
65
120
  const assistantMsg = choice.message;
66
121
  // 도구 호출이 없으면 최종 응답
67
122
  if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {
123
+ // no-edit 종료 가드 — 수정 필수 작업인데 edit/write를 한 번도 안 하고 끝내려 하면
124
+ // 되밀어 계속하게 한다(경량 모델의 조기 결론 패턴 차단).
125
+ if (editToolCount === 0 && nudgesUsed < nudgeMaxOnNoEdit) {
126
+ nudgesUsed++;
127
+ onLog?.(`↩ No-edit guard: model tried to finish without editing (nudge ${nudgesUsed}/${nudgeMaxOnNoEdit})`);
128
+ messages.push({ role: 'assistant', content: assistantMsg.content ?? '' });
129
+ messages.push({
130
+ role: 'user',
131
+ content: 'You have not modified any files yet, but this task REQUIRES code changes. ' +
132
+ 'Do not conclude with analysis only. Apply the fix now with edit_file, then verify. ' +
133
+ 'Continue working.',
134
+ });
135
+ continue;
136
+ }
68
137
  finalText = assistantMsg.content ?? '';
69
138
  break;
70
139
  }
@@ -92,20 +161,48 @@ export async function runAgenticLoop(options) {
92
161
  onLog?.(` 🔧 ${tc.function.name}`);
93
162
  }
94
163
  }
95
- const results = await executeToolCalls(toolCalls, cwd);
164
+ const results = await executeToolCalls(toolCalls, cwd, readCache, { protectedFiles, bashTimeoutMs });
96
165
  toolCallCount += toolCalls.length;
97
- // 도구 결과를 메시지에 추가
166
+ // Count only SUCCESSFUL edits — a model whose edit_file calls all fail
167
+ // (old_string not found, protected file) has not modified anything, and
168
+ // counting attempts would let it slip past the no-edit guard.
169
+ editToolCount += toolCalls.filter((tc, i) => (tc.function.name === 'edit_file' || tc.function.name === 'write_file') && !results[i]?.is_error).length;
170
+ // 도구 결과를 메시지에 추가 (길이 초과 시 자동 truncate)
98
171
  for (const result of results) {
172
+ const content = truncateToolResult(result.content);
99
173
  messages.push({
100
174
  role: 'tool',
101
175
  tool_call_id: result.tool_call_id,
102
- content: result.content,
176
+ content,
103
177
  });
104
178
  if (result.is_error) {
105
- onLog?.(` ✖ ${result.content.slice(0, 100)}`);
179
+ onLog?.(` ✖ ${content.slice(0, 100)}`);
106
180
  }
107
181
  }
108
182
  }
183
+ // Final answer turn — maxTurns/타임아웃으로 끊겼는데 모델이 최종 텍스트를 못 낸 경우,
184
+ // 도구 없이 마지막 1회 호출로 결론을 강제한다. 이게 없으면 진단·분석형 작업이
185
+ // 끝까지 도구만 호출하다 빈 결과("(no summary)")로 끝난다 — SWE 하이브리드 진단
186
+ // 단계에서 발견된 결함.
187
+ if (!finalText && apiCallCount > 0) {
188
+ onLog?.('▸ Final answer turn (no tools) — loop ended without a final message');
189
+ messages.push({
190
+ role: 'user',
191
+ content: 'Tool budget exhausted. Based on everything you have learned above, give your final ' +
192
+ 'answer NOW as plain text. Do not request any more tools.',
193
+ });
194
+ try {
195
+ const response = await callApi(messages, []);
196
+ if (response.usage) {
197
+ totalTokens += response.usage.prompt_tokens + response.usage.completion_tokens;
198
+ }
199
+ apiCallCount++;
200
+ finalText = response.choices?.[0]?.message?.content ?? '';
201
+ }
202
+ catch (err) {
203
+ onLog?.(`✖ Final answer turn failed: ${err instanceof Error ? err.message : String(err)}`);
204
+ }
205
+ }
109
206
  return {
110
207
  text: finalText,
111
208
  toolCallCount,
@@ -125,75 +222,68 @@ export function loopResultToCliResult(result) {
125
222
  durationMs: result.durationMs,
126
223
  };
127
224
  }
128
- // ============ 히스토리 압축 ============
225
+ // ============ 히스토리 압축 (VEGA compaction.py 패턴 이식) ============
129
226
  /**
130
- * 최근 1턴(assistant + tool results) 원본 유지.
131
- * 이전 턴의 assistant+tool 쌍을 1줄 요약 assistant 메시지로 교체.
227
+ * 이전 턴(assistant+tool ) 요약 1줄로 교체.
228
+ * OpenAI API 제약: tool 메시지는 직전 assistant tool_call_id와 대응해야 하므로
229
+ * 오래된 assistant+tool 쌍은 텍스트 요약으로 대체해 API 오류를 방지.
132
230
  *
133
- * 구조 변환:
134
- * [system, user, asst(tool_calls), tool, tool, asst(tool_calls), tool, ...]
135
- * [system, user, asst("Prior: read_file→ok, edit→ok"), asst(latest_tool_calls), tool, ...]
136
- *
137
- * OpenAI API 제약: tool 메시지는 직전 assistant의 tool_call_id와 대응해야 함.
138
- * 따라서 오래된 tool 메시지는 삭제하고, 해당 assistant도 일반 텍스트로 교체.
231
+ * 보존 기준 (VEGA keep_recent): 최근 keepRecent개 메시지 블록은 항상 원본 유지.
232
+ * tool 메시지는 직전 assistant의 tool_call_id와 짝이 맞아야 하므로, 보존 경계는
233
+ * keepRecent 지점 이후 assistant로 정렬해 짝이 깨진 tool 메시지가 남지 않게 한다.
234
+ * 기존 [Prior turns compacted] 요약이 있으면 새 요약에 합산 후 교체.
235
+ * (테스트를 위해 export 외부에서 직접 호출할 일은 없음)
139
236
  */
140
- function compactPriorTurns(messages) {
237
+ export function compactPriorTurns(messages, keepRecent = 8) {
141
238
  const headerCount = messages[0]?.role === 'system' ? 2 : 1;
142
- // 마지막 assistant+tool 블록의 시작 인덱스 찾기
143
- let lastAssistantIdx = -1;
144
- for (let i = messages.length - 1; i >= headerCount; i--) {
145
- if (messages[i].role === 'assistant') {
146
- lastAssistantIdx = i;
147
- break;
148
- }
239
+ // 최근 keepRecent개 메시지는 보존 — 압축 상한 인덱스 산출
240
+ let boundary = Math.max(headerCount, messages.length - keepRecent);
241
+ // 보존 경계를 assistant 시작점으로 정렬 (orphan tool 메시지 방지)
242
+ while (boundary < messages.length && messages[boundary].role === 'tool') {
243
+ boundary++;
149
244
  }
150
- if (lastAssistantIdx <= headerCount)
151
- return; // 압축할 이전 턴이 없음
152
- // headerCount ~ lastAssistantIdx 사이의 모든 assistant+tool 쌍을 요약
245
+ if (boundary <= headerCount)
246
+ return;
153
247
  const summaryParts = [];
154
248
  const toRemove = [];
155
- for (let i = headerCount; i < lastAssistantIdx; i++) {
249
+ for (let i = headerCount; i < boundary; i++) {
156
250
  const msg = messages[i];
157
- if (msg.role === 'assistant' && msg.tool_calls && msg.tool_calls.length > 0) {
158
- // tool call 요약: "read_file(src/foo.ts), edit_file(src/foo.ts)"
159
- const callSummaries = msg.tool_calls.map(tc => {
160
- try {
161
- const args = JSON.parse(tc.function.arguments);
162
- const key = args.path || args.pattern || args.command;
163
- const short = typeof key === 'string' ? key.slice(0, 50) : '';
164
- return `${tc.function.name}(${short})`;
165
- }
166
- catch {
167
- return tc.function.name;
168
- }
169
- });
170
- summaryParts.push(callSummaries.join(', '));
251
+ if (msg.role === 'assistant') {
252
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
253
+ const calls = msg.tool_calls.map(tc => {
254
+ try {
255
+ const args = JSON.parse(tc.function.arguments);
256
+ const key = args.path || args.pattern || args.command;
257
+ const short = typeof key === 'string' ? key.slice(0, 40) : '';
258
+ return `${tc.function.name}(${short})`;
259
+ }
260
+ catch {
261
+ return tc.function.name;
262
+ }
263
+ });
264
+ summaryParts.push(calls.join(', '));
265
+ }
266
+ else {
267
+ // 기존 compacted 요약이면 내용 그대로 흡수, 아니면 어시스턴트 설명 텍스트 보존
268
+ const text = (msg.content ?? '').trim();
269
+ if (text)
270
+ summaryParts.push(text.startsWith('[Prior') ? text : `note: ${text.slice(0, 200)}`);
271
+ }
171
272
  toRemove.push(i);
172
273
  }
173
274
  else if (msg.role === 'tool') {
174
- // tool result → 성공/실패만 기록
175
275
  const ok = !msg.content.startsWith('BLOCKED') && !msg.content.startsWith('Tool error');
176
- const firstLine = msg.content.split('\n')[0].slice(0, 60);
177
- summaryParts.push(ok ? `→ok` : `→err: ${firstLine}`);
178
- toRemove.push(i);
179
- }
180
- else if (msg.role === 'assistant' && !msg.tool_calls) {
181
- // 일반 assistant 메시지 — 첫 줄만 유지
182
- const short = (msg.content ?? '').split('\n')[0].slice(0, 80);
183
- if (short)
184
- summaryParts.push(`note: ${short}`);
276
+ const firstLine = msg.content.split('\n')[0].slice(0, 50);
277
+ summaryParts.push(ok ? '→ok' : `→err: ${firstLine}`);
185
278
  toRemove.push(i);
186
279
  }
187
280
  }
188
281
  if (toRemove.length === 0)
189
282
  return;
190
- // 요약 메시지 생성
191
283
  const summaryText = `[Prior turns compacted] ${summaryParts.join(' | ')}`;
192
- // 역순으로 제거 (인덱스 안정성)
193
284
  for (let i = toRemove.length - 1; i >= 0; i--) {
194
285
  messages.splice(toRemove[i], 1);
195
286
  }
196
- // header 직후에 요약 삽입
197
287
  messages.splice(headerCount, 0, {
198
288
  role: 'assistant',
199
289
  content: summaryText,
@@ -1 +1 @@
1
- {"version":3,"file":"agenticLoop.js","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gCAAgC;AAChC,sBAAsB;AACtB,yDAAyD;AACzD,0BAA0B;AAC1B,0CAA0C;AAC1C,+CAA+C;AAE/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAuD,MAAM,YAAY,CAAC;AAyErH,oCAAoC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,MAAM,EACJ,YAAY,EACZ,MAAM,EACN,GAAG,EACH,OAAO,EACP,QAAQ,GAAG,EAAE,EACb,SAAS,GAAG,MAAM,EAClB,KAAK,EACL,WAAW,GAAG,IAAI,GACnB,GAAG,OAAO,CAAC;IAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAEvC,cAAc;IACd,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/C,UAAU;QACV,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,KAAK,EAAE,CAAC,gCAAgC,IAAI,QAAQ,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;QAED,mDAAmD;QACnD,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACd,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,SAAS;QACT,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,eAAe,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhF,IAAI,QAAgC,CAAC;QACrC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;YAC/B,SAAS,GAAG,cAAc,GAAG,EAAE,CAAC;YAChC,MAAM;QACR,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC,2BAA2B,CAAC,CAAC;YACrC,SAAS,GAAG,oBAAoB,CAAC;YACjC,MAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QAEpC,mBAAmB;QACnB,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,SAAS,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;YACvC,MAAM;QACR,CAAC;QAED,sCAAsC;QACtC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,UAAU,EAAE,YAAY,CAAC,UAAU;SACpC,CAAC,CAAC;QAEH,QAAQ;QACR,MAAM,SAAS,GAAe,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;gBACtB,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;aACjC;SACF,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAiB,MAAM,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACrE,aAAa,IAAI,SAAS,CAAC,MAAM,CAAC;QAElC,iBAAiB;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,oCAAoC;AAEpC;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,QAAuB;IAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,mCAAmC;IACnC,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,gBAAgB,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,IAAI,WAAW;QAAE,OAAO,CAAC,eAAe;IAE5D,6DAA6D;IAC7D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,+DAA+D;YAC/D,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAC5C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;oBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;oBACtD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,0BAA0B;YAC1B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACvD,6BAA6B;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,KAAK;gBAAE,YAAY,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,YAAY;IACZ,MAAM,WAAW,GAAG,2BAA2B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAE1E,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,mBAAmB;IACnB,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE;QAC9B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;AACL,CAAC;AAED,+BAA+B;AAE/B,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAA6B;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,YAAY;YACf,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,cAAc;YACjB,OAAO,IAAI,IAAI,CAAC,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agenticLoop.js","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gCAAgC;AAChC,sBAAsB;AACtB,sDAAsD;AACtD,0CAA0C;AAC1C,sDAAsD;AACtD,+CAA+C;AAE/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAuD,MAAM,YAAY,CAAC;AAGtI,4DAA4D;AAE5D,gDAAgD;AAChD,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAuB;IACjD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB;QAC5B,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC9B,KAAK,IAAI,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gDAAgD;AAChD,oDAAoD;AACpD,SAAS,kBAAkB,CAAC,OAAe,EAAE,MAAM,GAAG,IAAI;IACxD,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,IAAI,SAAS,OAAO,CAAC,MAAM,GAAG,IAAI,yBAAyB,IAAI,EAAE,CAAC;AAC9E,CAAC;AAyFD,oCAAoC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,MAAM,EACJ,YAAY,EACZ,MAAM,EACN,GAAG,EACH,OAAO,EACP,QAAQ,GAAG,EAAE,EACb,SAAS,GAAG,MAAM,EAClB,KAAK,EACL,WAAW,GAAG,IAAI;IAClB,qDAAqD;IACrD,mDAAmD;IACnD,gDAAgD;IAChD,qBAAqB,GAAG,KAAK,EAC7B,oBAAoB,GAAG,EAAE,EACzB,kBAAkB,GAAG,EAAE,EACvB,gBAAgB,GAAG,CAAC,EACpB,cAAc,EACd,aAAa,GACd,GAAG,OAAO,CAAC;IAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAEvC,cAAc;IACd,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,mDAAmD;IACnD,8DAA8D;IAC9D,wDAAwD;IACxD,MAAM,OAAO,GACX,uBAAuB;QACvB,yBAAyB,GAAG,IAAI;QAChC,+FAA+F;QAC/F,iIAAiI,CAAC;IACpI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;IAE3D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC,CAAC,6BAA6B;IAClE,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,0CAA0C;IACjE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/C,UAAU;QACV,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,KAAK,EAAE,CAAC,gCAAgC,IAAI,QAAQ,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;QAED,sCAAsC;QACtC,yDAAyD;QACzD,iDAAiD;QACjD,6CAA6C;QAC7C,qCAAqC;QACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,SAAS,GAAG,qBAAqB,EAAE,CAAC;gBACtC,KAAK,EAAE,CAAC,0BAA0B,QAAQ,CAAC,MAAM,UAAU,SAAS,aAAa,qBAAqB,GAAG,CAAC,CAAC;gBAC3G,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,SAAS;QACT,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,eAAe,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhF,IAAI,QAAgC,CAAC;QACrC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;YAC/B,SAAS,GAAG,cAAc,GAAG,EAAE,CAAC;YAChC,MAAM;QACR,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC,2BAA2B,CAAC,CAAC;YACrC,SAAS,GAAG,oBAAoB,CAAC;YACjC,MAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QAEpC,mBAAmB;QACnB,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,0DAA0D;YAC1D,mCAAmC;YACnC,IAAI,aAAa,KAAK,CAAC,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBACzD,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC,iEAAiE,UAAU,IAAI,gBAAgB,GAAG,CAAC,CAAC;gBAC5G,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1E,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EACL,4EAA4E;wBAC5E,qFAAqF;wBACrF,mBAAmB;iBACtB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,SAAS,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;YACvC,MAAM;QACR,CAAC;QAED,sCAAsC;QACtC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,UAAU,EAAE,YAAY,CAAC,UAAU;SACpC,CAAC,CAAC;QAEH,QAAQ;QACR,MAAM,SAAS,GAAe,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;gBACtB,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;aACjC;SACF,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAiB,MAAM,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACnH,aAAa,IAAI,SAAS,CAAC,MAAM,CAAC;QAClC,uEAAuE;QACvE,wEAAwE;QACxE,8DAA8D;QAC9D,aAAa,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAC1C,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CACjG,CAAC,MAAM,CAAC;QAET,uCAAuC;QACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO;aACR,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,+CAA+C;IAC/C,wDAAwD;IACxD,eAAe;IACf,IAAI,CAAC,SAAS,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,EAAE,CAAC,qEAAqE,CAAC,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EACL,qFAAqF;gBACrF,0DAA0D;SAC7D,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;YACjF,CAAC;YACD,YAAY,EAAE,CAAC;YACf,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,EAAE,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAuB,EAAE,UAAU,GAAG,CAAC;IACvE,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,wCAAwC;IACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IACnE,iDAAiD;IACjD,OAAO,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxE,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,IAAI,WAAW;QAAE,OAAO;IAEpC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBACpC,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;wBACtD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC9D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;oBACzC,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC1B,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxC,IAAI,IAAI;oBAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAChG,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,WAAW,GAAG,2BAA2B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAE1E,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE;QAC9B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;AACL,CAAC;AAED,+BAA+B;AAE/B,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAA6B;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,YAAY;YACf,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,cAAc;YACjB,OAAO,IAAI,IAAI,CAAC,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -11,4 +11,5 @@ export declare class CodexCliAdapter implements CliAdapter {
11
11
  parseWorkerOutput(raw: CliRunResult): WorkerResult;
12
12
  parseReviewerOutput(raw: CliRunResult): ReviewResult;
13
13
  }
14
+ export declare function coerceCodexModel(requested: string): string;
14
15
  //# sourceMappingURL=codex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAOzE,mBAAmB,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC7B,MAAM,GAAE,MAAW,GAClB,MAAM;IAcT,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAKlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAIrD"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAQzE,mBAAmB,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC7B,MAAM,GAAE,MAAW,GAClB,MAAM;IAcT,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAKlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAIrD;AAoBD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAU1D"}