@intrect/openswarm 0.4.4 → 0.8.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 (259) hide show
  1. package/README.md +46 -26
  2. package/config.example.yaml +22 -10
  3. package/dist/adapters/agenticLoop.d.ts +45 -2
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +209 -61
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/chatStream.d.ts +55 -0
  8. package/dist/adapters/chatStream.d.ts.map +1 -0
  9. package/dist/adapters/chatStream.js +116 -0
  10. package/dist/adapters/chatStream.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +7 -0
  12. package/dist/adapters/codex.d.ts.map +1 -1
  13. package/dist/adapters/codex.js +67 -6
  14. package/dist/adapters/codex.js.map +1 -1
  15. package/dist/adapters/codexModels.d.ts +20 -0
  16. package/dist/adapters/codexModels.d.ts.map +1 -0
  17. package/dist/adapters/codexModels.js +195 -0
  18. package/dist/adapters/codexModels.js.map +1 -0
  19. package/dist/adapters/codexResponses.d.ts +97 -0
  20. package/dist/adapters/codexResponses.d.ts.map +1 -0
  21. package/dist/adapters/codexResponses.js +302 -0
  22. package/dist/adapters/codexResponses.js.map +1 -0
  23. package/dist/adapters/gpt.d.ts.map +1 -1
  24. package/dist/adapters/gpt.js +20 -120
  25. package/dist/adapters/gpt.js.map +1 -1
  26. package/dist/adapters/index.d.ts +10 -2
  27. package/dist/adapters/index.d.ts.map +1 -1
  28. package/dist/adapters/index.js +19 -5
  29. package/dist/adapters/index.js.map +1 -1
  30. package/dist/adapters/lmstudio.d.ts +8 -0
  31. package/dist/adapters/lmstudio.d.ts.map +1 -0
  32. package/dist/adapters/lmstudio.js +41 -0
  33. package/dist/adapters/lmstudio.js.map +1 -0
  34. package/dist/adapters/local.d.ts +16 -1
  35. package/dist/adapters/local.d.ts.map +1 -1
  36. package/dist/adapters/local.js +51 -127
  37. package/dist/adapters/local.js.map +1 -1
  38. package/dist/adapters/openrouter.d.ts +37 -0
  39. package/dist/adapters/openrouter.d.ts.map +1 -0
  40. package/dist/adapters/openrouter.js +193 -0
  41. package/dist/adapters/openrouter.js.map +1 -0
  42. package/dist/adapters/resultParsing.d.ts +6 -0
  43. package/dist/adapters/resultParsing.d.ts.map +1 -0
  44. package/dist/adapters/resultParsing.js +139 -0
  45. package/dist/adapters/resultParsing.js.map +1 -0
  46. package/dist/adapters/tools.d.ts +21 -2
  47. package/dist/adapters/tools.d.ts.map +1 -1
  48. package/dist/adapters/tools.js +153 -12
  49. package/dist/adapters/tools.js.map +1 -1
  50. package/dist/adapters/types.d.ts +40 -1
  51. package/dist/adapters/types.d.ts.map +1 -1
  52. package/dist/adapters/webTools.d.ts +9 -0
  53. package/dist/adapters/webTools.d.ts.map +1 -0
  54. package/dist/adapters/webTools.js +195 -0
  55. package/dist/adapters/webTools.js.map +1 -0
  56. package/dist/agents/draftAnalyzer.d.ts +1 -1
  57. package/dist/agents/draftAnalyzer.d.ts.map +1 -1
  58. package/dist/agents/draftAnalyzer.js +3 -3
  59. package/dist/agents/draftAnalyzer.js.map +1 -1
  60. package/dist/agents/pairPipeline.d.ts +26 -1
  61. package/dist/agents/pairPipeline.d.ts.map +1 -1
  62. package/dist/agents/pairPipeline.js +184 -17
  63. package/dist/agents/pairPipeline.js.map +1 -1
  64. package/dist/agents/reflection.d.ts +56 -0
  65. package/dist/agents/reflection.d.ts.map +1 -0
  66. package/dist/agents/reflection.js +120 -0
  67. package/dist/agents/reflection.js.map +1 -0
  68. package/dist/agents/worker.d.ts +8 -0
  69. package/dist/agents/worker.d.ts.map +1 -1
  70. package/dist/agents/worker.js +23 -2
  71. package/dist/agents/worker.js.map +1 -1
  72. package/dist/auth/index.d.ts +3 -1
  73. package/dist/auth/index.d.ts.map +1 -1
  74. package/dist/auth/index.js +3 -1
  75. package/dist/auth/index.js.map +1 -1
  76. package/dist/auth/linearPkce.d.ts +22 -0
  77. package/dist/auth/linearPkce.d.ts.map +1 -0
  78. package/dist/auth/linearPkce.js +208 -0
  79. package/dist/auth/linearPkce.js.map +1 -0
  80. package/dist/auth/oauthPkce.d.ts +4 -3
  81. package/dist/auth/oauthPkce.d.ts.map +1 -1
  82. package/dist/auth/oauthPkce.js +39 -12
  83. package/dist/auth/oauthPkce.js.map +1 -1
  84. package/dist/auth/oauthStore.d.ts +11 -1
  85. package/dist/auth/oauthStore.d.ts.map +1 -1
  86. package/dist/auth/oauthStore.js +14 -2
  87. package/dist/auth/oauthStore.js.map +1 -1
  88. package/dist/auth/openrouterPkce.d.ts +29 -0
  89. package/dist/auth/openrouterPkce.d.ts.map +1 -0
  90. package/dist/auth/openrouterPkce.js +222 -0
  91. package/dist/auth/openrouterPkce.js.map +1 -0
  92. package/dist/automation/autonomousRunner.d.ts +17 -7
  93. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  94. package/dist/automation/autonomousRunner.js +69 -70
  95. package/dist/automation/autonomousRunner.js.map +1 -1
  96. package/dist/automation/backlogGrooming.d.ts +21 -0
  97. package/dist/automation/backlogGrooming.d.ts.map +1 -0
  98. package/dist/automation/backlogGrooming.js +80 -0
  99. package/dist/automation/backlogGrooming.js.map +1 -0
  100. package/dist/automation/localCI.d.ts +24 -0
  101. package/dist/automation/localCI.d.ts.map +1 -0
  102. package/dist/automation/localCI.js +84 -0
  103. package/dist/automation/localCI.js.map +1 -0
  104. package/dist/automation/runnerExecution.d.ts +33 -7
  105. package/dist/automation/runnerExecution.d.ts.map +1 -1
  106. package/dist/automation/runnerExecution.js +202 -154
  107. package/dist/automation/runnerExecution.js.map +1 -1
  108. package/dist/automation/runnerTypes.d.ts +5 -1
  109. package/dist/automation/runnerTypes.d.ts.map +1 -1
  110. package/dist/automation/taskSource.d.ts +101 -0
  111. package/dist/automation/taskSource.d.ts.map +1 -0
  112. package/dist/automation/taskSource.js +136 -0
  113. package/dist/automation/taskSource.js.map +1 -0
  114. package/dist/automation/workerAuditLog.d.ts +29 -0
  115. package/dist/automation/workerAuditLog.d.ts.map +1 -0
  116. package/dist/automation/workerAuditLog.js +82 -0
  117. package/dist/automation/workerAuditLog.js.map +1 -0
  118. package/dist/cli/authHandler.d.ts +14 -5
  119. package/dist/cli/authHandler.d.ts.map +1 -1
  120. package/dist/cli/authHandler.js +131 -36
  121. package/dist/cli/authHandler.js.map +1 -1
  122. package/dist/cli/daemon.d.ts +5 -0
  123. package/dist/cli/daemon.d.ts.map +1 -1
  124. package/dist/cli/daemon.js +13 -0
  125. package/dist/cli/daemon.js.map +1 -1
  126. package/dist/cli/doctorHandler.d.ts +2 -0
  127. package/dist/cli/doctorHandler.d.ts.map +1 -0
  128. package/dist/cli/doctorHandler.js +114 -0
  129. package/dist/cli/doctorHandler.js.map +1 -0
  130. package/dist/cli/initWizard.d.ts +13 -0
  131. package/dist/cli/initWizard.d.ts.map +1 -0
  132. package/dist/cli/initWizard.js +314 -0
  133. package/dist/cli/initWizard.js.map +1 -0
  134. package/dist/cli.js +112 -38
  135. package/dist/cli.js.map +1 -1
  136. package/dist/core/config.d.ts +89 -15
  137. package/dist/core/config.d.ts.map +1 -1
  138. package/dist/core/config.js +100 -23
  139. package/dist/core/config.js.map +1 -1
  140. package/dist/core/envFile.d.ts +6 -0
  141. package/dist/core/envFile.d.ts.map +1 -1
  142. package/dist/core/envFile.js +39 -1
  143. package/dist/core/envFile.js.map +1 -1
  144. package/dist/core/eventHub.d.ts +22 -0
  145. package/dist/core/eventHub.d.ts.map +1 -1
  146. package/dist/core/eventHub.js.map +1 -1
  147. package/dist/core/providerOverride.d.ts +6 -0
  148. package/dist/core/providerOverride.d.ts.map +1 -0
  149. package/dist/core/providerOverride.js +37 -0
  150. package/dist/core/providerOverride.js.map +1 -0
  151. package/dist/core/service.d.ts.map +1 -1
  152. package/dist/core/service.js +43 -20
  153. package/dist/core/service.js.map +1 -1
  154. package/dist/core/types.d.ts +16 -2
  155. package/dist/core/types.d.ts.map +1 -1
  156. package/dist/discord/discordCore.d.ts.map +1 -1
  157. package/dist/discord/discordCore.js +16 -103
  158. package/dist/discord/discordCore.js.map +1 -1
  159. package/dist/discord/discordHandlers.d.ts.map +1 -1
  160. package/dist/discord/discordHandlers.js +15 -12
  161. package/dist/discord/discordHandlers.js.map +1 -1
  162. package/dist/index.js +12 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/issues/sqliteStore.d.ts.map +1 -1
  165. package/dist/issues/sqliteStore.js +7 -2
  166. package/dist/issues/sqliteStore.js.map +1 -1
  167. package/dist/knowledge/scanner.d.ts.map +1 -1
  168. package/dist/knowledge/scanner.js +5 -0
  169. package/dist/knowledge/scanner.js.map +1 -1
  170. package/dist/linear/linear.d.ts +45 -2
  171. package/dist/linear/linear.d.ts.map +1 -1
  172. package/dist/linear/linear.js +154 -3
  173. package/dist/linear/linear.js.map +1 -1
  174. package/dist/locale/prompts/en.d.ts.map +1 -1
  175. package/dist/locale/prompts/en.js +40 -20
  176. package/dist/locale/prompts/en.js.map +1 -1
  177. package/dist/locale/prompts/ko.d.ts.map +1 -1
  178. package/dist/locale/prompts/ko.js +39 -20
  179. package/dist/locale/prompts/ko.js.map +1 -1
  180. package/dist/locale/types.d.ts +6 -0
  181. package/dist/locale/types.d.ts.map +1 -1
  182. package/dist/mcp/mcpClient.d.ts +27 -0
  183. package/dist/mcp/mcpClient.d.ts.map +1 -0
  184. package/dist/mcp/mcpClient.js +145 -0
  185. package/dist/mcp/mcpClient.js.map +1 -0
  186. package/dist/memory/memoryCore.d.ts.map +1 -1
  187. package/dist/memory/memoryCore.js +8 -2
  188. package/dist/memory/memoryCore.js.map +1 -1
  189. package/dist/memory/repoKnowledge.d.ts +33 -0
  190. package/dist/memory/repoKnowledge.d.ts.map +1 -0
  191. package/dist/memory/repoKnowledge.js +97 -0
  192. package/dist/memory/repoKnowledge.js.map +1 -0
  193. package/dist/notify/notifier.d.ts +26 -0
  194. package/dist/notify/notifier.d.ts.map +1 -0
  195. package/dist/notify/notifier.js +131 -0
  196. package/dist/notify/notifier.js.map +1 -0
  197. package/dist/orchestration/conflictDetector.d.ts +5 -2
  198. package/dist/orchestration/conflictDetector.d.ts.map +1 -1
  199. package/dist/orchestration/conflictDetector.js +35 -6
  200. package/dist/orchestration/conflictDetector.js.map +1 -1
  201. package/dist/orchestration/decisionEngine.d.ts +20 -0
  202. package/dist/orchestration/decisionEngine.d.ts.map +1 -1
  203. package/dist/orchestration/decisionEngine.js +45 -0
  204. package/dist/orchestration/decisionEngine.js.map +1 -1
  205. package/dist/support/banner.d.ts +7 -0
  206. package/dist/support/banner.d.ts.map +1 -0
  207. package/dist/support/banner.js +32 -0
  208. package/dist/support/banner.js.map +1 -0
  209. package/dist/support/chat.js +36 -27
  210. package/dist/support/chat.js.map +1 -1
  211. package/dist/support/chatBackend.d.ts +6 -0
  212. package/dist/support/chatBackend.d.ts.map +1 -1
  213. package/dist/support/chatBackend.js +105 -83
  214. package/dist/support/chatBackend.js.map +1 -1
  215. package/dist/support/chatTui.d.ts.map +1 -1
  216. package/dist/support/chatTui.js +217 -27
  217. package/dist/support/chatTui.js.map +1 -1
  218. package/dist/support/colors.d.ts +15 -0
  219. package/dist/support/colors.d.ts.map +1 -0
  220. package/dist/support/colors.js +23 -0
  221. package/dist/support/colors.js.map +1 -0
  222. package/dist/support/dashboardHtml.d.ts +1 -1
  223. package/dist/support/dashboardHtml.d.ts.map +1 -1
  224. package/dist/support/dashboardHtml.js +318 -65
  225. package/dist/support/dashboardHtml.js.map +1 -1
  226. package/dist/support/planCommand.d.ts +17 -0
  227. package/dist/support/planCommand.d.ts.map +1 -0
  228. package/dist/support/planCommand.js +114 -0
  229. package/dist/support/planCommand.js.map +1 -0
  230. package/dist/support/planner.d.ts +9 -2
  231. package/dist/support/planner.d.ts.map +1 -1
  232. package/dist/support/planner.js +43 -111
  233. package/dist/support/planner.js.map +1 -1
  234. package/dist/support/projectMapper.d.ts.map +1 -1
  235. package/dist/support/projectMapper.js +29 -1
  236. package/dist/support/projectMapper.js.map +1 -1
  237. package/dist/support/promptHelper.d.ts +24 -0
  238. package/dist/support/promptHelper.d.ts.map +1 -0
  239. package/dist/support/promptHelper.js +94 -0
  240. package/dist/support/promptHelper.js.map +1 -0
  241. package/dist/support/rateLimiter.d.ts.map +1 -1
  242. package/dist/support/rateLimiter.js +6 -0
  243. package/dist/support/rateLimiter.js.map +1 -1
  244. package/dist/support/repoMetadata.d.ts +51 -0
  245. package/dist/support/repoMetadata.d.ts.map +1 -0
  246. package/dist/support/repoMetadata.js +91 -0
  247. package/dist/support/repoMetadata.js.map +1 -0
  248. package/dist/support/web.d.ts.map +1 -1
  249. package/dist/support/web.js +196 -71
  250. package/dist/support/web.js.map +1 -1
  251. package/dist/support/worktreeManager.d.ts +6 -1
  252. package/dist/support/worktreeManager.d.ts.map +1 -1
  253. package/dist/support/worktreeManager.js +23 -1
  254. package/dist/support/worktreeManager.js.map +1 -1
  255. package/dist/taskState/store.d.ts +1 -0
  256. package/dist/taskState/store.d.ts.map +1 -1
  257. package/dist/taskState/store.js +22 -1
  258. package/dist/taskState/store.js.map +1 -1
  259. package/package.json +3 -1
@@ -1,11 +1,45 @@
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
+ import { WEB_TOOL_DEFINITIONS } from './webTools.js';
10
+ // ============ 토큰 카운팅 (VEGA token_count.py 이식) ============
11
+ // cl100k_base 근사: 한국어 0.78t/char, 영어 0.27t/char
12
+ function countTokensApprox(text) {
13
+ if (!text)
14
+ return 0;
15
+ const hangul = [...text].filter(c => c >= '가' && c <= '힣').length;
16
+ const korRatio = hangul / Math.max(1, text.length);
17
+ const rate = 0.78 * korRatio + 0.27 * (1 - korRatio);
18
+ return Math.ceil(text.length * rate);
19
+ }
20
+ function countMessageTokens(messages) {
21
+ let total = 0;
22
+ for (const m of messages) {
23
+ const content = typeof m.content === 'string' ? m.content : '';
24
+ total += countTokensApprox(content);
25
+ total += 4; // role overhead
26
+ if ('tool_calls' in m && m.tool_calls) {
27
+ for (const tc of m.tool_calls) {
28
+ total += countTokensApprox(tc.function.arguments) + countTokensApprox(tc.function.name) + 8;
29
+ }
30
+ }
31
+ }
32
+ return total;
33
+ }
34
+ // 도구 결과 길이 제한: 너무 작게 자르면 모델이 파일 절반만 보고 잘못 수정한다.
35
+ // 코딩 작업에 맞춰 넉넉히 보존(2500자), 초과 시 앞 1500 + 뒤 700자 유지.
36
+ function truncateToolResult(content, maxLen = 2500) {
37
+ if (content.length <= maxLen)
38
+ return content;
39
+ const head = content.slice(0, 1500);
40
+ const tail = content.slice(-700);
41
+ return `${head}\n...[${content.length - 2200} chars truncated]...\n${tail}`;
42
+ }
9
43
  // ============ 에이전틱 루프 ============
10
44
  /**
11
45
  * 에이전틱 도구 루프 실행
@@ -16,7 +50,11 @@ import { TOOL_DEFINITIONS, executeToolCalls } from './tools.js';
16
50
  * 3. 응답에 tool_calls가 없으면 (finish_reason = 'stop') → 최종 텍스트 반환
17
51
  */
18
52
  export async function runAgenticLoop(options) {
19
- const { systemPrompt, prompt, cwd, callApi, maxTurns = 15, timeoutMs = 300000, onLog, enableTools = true, } = options;
53
+ const { systemPrompt, prompt, cwd, callApi, maxTurns = 20, timeoutMs = 300000, onLog, enableTools = true,
54
+ // 긴 작업(SWE-bench급 실전 repo)에서 압축이 너무 일찍·자주 터지면 모델이 읽은
55
+ // 파일 컨텍스트를 잃고 같은 파일을 반복 read하다 수정에 도달 못 한다(무한 탐색).
56
+ // 현대 모델 컨텍스트(128k+)에 맞춰 임계를 넉넉히, 최근 보존 블록도 늘린다.
57
+ compactTokenThreshold = 60000, compactAfterMessages = 60, keepRecentMessages = 16, nudgeMaxOnNoEdit = 0, protectedFiles, bashTimeoutMs, webTools = true, mcpTools, signal, } = options;
20
58
  const startTime = Date.now();
21
59
  const deadline = startTime + timeoutMs;
22
60
  // 메시지 히스토리 구성
@@ -24,21 +62,57 @@ export async function runAgenticLoop(options) {
24
62
  if (systemPrompt) {
25
63
  messages.push({ role: 'system', content: systemPrompt });
26
64
  }
27
- messages.push({ role: 'user', content: prompt });
28
- const tools = enableTools ? TOOL_DEFINITIONS : [];
65
+ // 작업 루트(cwd)를 명시 — 모델이 모르면 '/' repo명 같은 절대경로를 추측해
66
+ // 경로 검증(project 접근)에 막힌다. 실전 repo(pylint 등)에서 search_files가
67
+ // 전부 차단되던 결함(SWE-bench에서 발견). 도구는 이 루트 기준 상대경로를 쓰라고 안내.
68
+ const cwdNote = `# Working directory\n` +
69
+ `Your project root is: ${cwd}\n` +
70
+ `All file tools operate within this root. Use paths relative to it (e.g. "src/foo.ts" or ".") ` +
71
+ `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`;
72
+ messages.push({ role: 'user', content: cwdNote + prompt });
73
+ const tools = enableTools
74
+ ? [
75
+ ...TOOL_DEFINITIONS,
76
+ ...(webTools ? WEB_TOOL_DEFINITIONS : []),
77
+ ...(mcpTools ?? []),
78
+ ]
79
+ : [];
80
+ const readCache = createReadCache(); // 루프 단위 read 캐시 (중복 read 차단)
29
81
  let toolCallCount = 0;
82
+ let editToolCount = 0; // edit_file/write_file 호출 수 (no-edit 가드용)
83
+ // 진전 정체 감지: 이번 턴의 도구 호출이 모두 이전과 동일(name+args)하면 새 정보·변경
84
+ // 없는 반복이다. N턴 연속이면 루프로 보고 조기 종료한다 — 고정 turn 한도(작업 제한)가
85
+ // 아니라 진전 기반 중단. maxTurns는 비상 천장으로만 남는다.
86
+ const seenToolCalls = new Set();
87
+ let noProgressTurns = 0;
88
+ const NO_PROGRESS_LIMIT = 3;
89
+ let nudgesUsed = 0;
30
90
  let apiCallCount = 0;
31
91
  let totalTokens = 0;
32
92
  let finalText = '';
33
93
  for (let turn = 0; turn < maxTurns + 1; turn++) {
94
+ // 사용자 중단 (Esc/Ctrl+C) — 현재 텍스트가 있으면 유지, 없으면 표시만.
95
+ if (signal?.aborted) {
96
+ onLog?.('■ Stopped by user');
97
+ finalText = finalText || '(stopped)';
98
+ break;
99
+ }
34
100
  // 타임아웃 체크
35
101
  if (Date.now() > deadline) {
36
102
  onLog?.(`⏰ Agentic loop timeout after ${turn} turns`);
37
103
  break;
38
104
  }
39
- // 매 턴 히스토리 압축 — 이전 턴의 tool call/result를 1줄 요약으로 교체
40
- if (turn >= 2) {
41
- compactPriorTurns(messages);
105
+ // 히스토리 압축 — VEGA compaction.py 패턴 이식.
106
+ // 트리거: 메시지 수가 compactAfterMessages를 넘고 + 토큰이 임계값 초과일 때만.
107
+ // 과거에는 turn>=2부터 매 턴 무조건 압축해 모델이 방금 읽은 파일·작업 맥락을
108
+ // 즉시 잃고 헛돌았다(루프 재발). 이제 정말 길어질 때만 압축하고, 압축해도
109
+ // 최근 keepRecentMessages 블록은 원본 유지한다.
110
+ if (messages.length > compactAfterMessages) {
111
+ const msgTokens = countMessageTokens(messages);
112
+ if (msgTokens > compactTokenThreshold) {
113
+ onLog?.(`📦 Compacting history (${messages.length} msgs, ${msgTokens} tokens > ${compactTokenThreshold})`);
114
+ compactPriorTurns(messages, keepRecentMessages);
115
+ }
42
116
  }
43
117
  // API 호출
44
118
  apiCallCount++;
@@ -48,6 +122,12 @@ export async function runAgenticLoop(options) {
48
122
  response = await callApi(messages, tools);
49
123
  }
50
124
  catch (err) {
125
+ // User abort (Esc/Ctrl+C) surfaces as the fetch being aborted.
126
+ if (signal?.aborted || (err instanceof Error && err.name === 'AbortError')) {
127
+ onLog?.('■ Stopped by user');
128
+ finalText = finalText || '(stopped)';
129
+ break;
130
+ }
51
131
  const msg = err instanceof Error ? err.message : String(err);
52
132
  onLog?.(`✖ API error: ${msg}`);
53
133
  finalText = `API error: ${msg}`;
@@ -65,6 +145,20 @@ export async function runAgenticLoop(options) {
65
145
  const assistantMsg = choice.message;
66
146
  // 도구 호출이 없으면 최종 응답
67
147
  if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {
148
+ // no-edit 종료 가드 — 수정 필수 작업인데 edit/write를 한 번도 안 하고 끝내려 하면
149
+ // 되밀어 계속하게 한다(경량 모델의 조기 결론 패턴 차단).
150
+ if (editToolCount === 0 && nudgesUsed < nudgeMaxOnNoEdit) {
151
+ nudgesUsed++;
152
+ onLog?.(`↩ No-edit guard: model tried to finish without editing (nudge ${nudgesUsed}/${nudgeMaxOnNoEdit})`);
153
+ messages.push({ role: 'assistant', content: assistantMsg.content ?? '' });
154
+ messages.push({
155
+ role: 'user',
156
+ content: 'You have not modified any files yet, but this task REQUIRES code changes. ' +
157
+ 'Do not conclude with analysis only. Apply the fix now with edit_file, then verify. ' +
158
+ 'Continue working.',
159
+ });
160
+ continue;
161
+ }
68
162
  finalText = assistantMsg.content ?? '';
69
163
  break;
70
164
  }
@@ -92,20 +186,67 @@ export async function runAgenticLoop(options) {
92
186
  onLog?.(` 🔧 ${tc.function.name}`);
93
187
  }
94
188
  }
95
- const results = await executeToolCalls(toolCalls, cwd);
189
+ const results = await executeToolCalls(toolCalls, cwd, readCache, { protectedFiles, bashTimeoutMs });
96
190
  toolCallCount += toolCalls.length;
97
- // 도구 결과를 메시지에 추가
191
+ // Count only SUCCESSFUL edits — a model whose edit_file calls all fail
192
+ // (old_string not found, protected file) has not modified anything, and
193
+ // counting attempts would let it slip past the no-edit guard.
194
+ editToolCount += toolCalls.filter((tc, i) => (tc.function.name === 'edit_file' || tc.function.name === 'write_file') && !results[i]?.is_error).length;
195
+ // Progress-based stop: if every tool call this turn repeats a prior one
196
+ // (same name+args → no new info or change), count it as a stalled turn.
197
+ // N consecutive stalled turns → wrap up via the final-answer turn.
198
+ if (allToolCallsSeen(toolCalls, seenToolCalls)) {
199
+ noProgressTurns++;
200
+ if (noProgressTurns >= NO_PROGRESS_LIMIT) {
201
+ onLog?.(`⚠ No new progress for ${NO_PROGRESS_LIMIT} turns (repeated tool calls) — wrapping up`);
202
+ break;
203
+ }
204
+ }
205
+ else {
206
+ noProgressTurns = 0;
207
+ }
208
+ for (const tc of toolCalls)
209
+ seenToolCalls.add(toolCallKey(tc));
210
+ // 도구 결과를 메시지에 추가 (길이 초과 시 자동 truncate)
98
211
  for (const result of results) {
212
+ const content = truncateToolResult(result.content);
99
213
  messages.push({
100
214
  role: 'tool',
101
215
  tool_call_id: result.tool_call_id,
102
- content: result.content,
216
+ content,
103
217
  });
104
218
  if (result.is_error) {
105
- onLog?.(` ✖ ${result.content.slice(0, 100)}`);
219
+ onLog?.(` ✖ ${content.slice(0, 100)}`);
106
220
  }
107
221
  }
108
222
  }
223
+ // Final answer turn — maxTurns/타임아웃으로 끊겼는데 모델이 최종 텍스트를 못 낸 경우,
224
+ // 도구 없이 마지막 1회 호출로 결론을 강제한다. 이게 없으면 진단·분석형 작업이
225
+ // 끝까지 도구만 호출하다 빈 결과("(no summary)")로 끝난다 — SWE 하이브리드 진단
226
+ // 단계에서 발견된 결함.
227
+ // Note: an empty-string finalText ('') intentionally triggers this too — an
228
+ // empty final answer is worthless, so the one extra call to salvage a real
229
+ // conclusion is the whole point, not an accidental cost (INT-1442 part 3).
230
+ if (!finalText && apiCallCount > 0) {
231
+ onLog?.('▸ Final answer turn (no tools) — loop ended without a final message');
232
+ messages.push({
233
+ role: 'user',
234
+ content: "You've reached this turn's step limit, so stop calling tools now. Using everything " +
235
+ 'above, write your final answer as plain text — what you accomplished, the key result, ' +
236
+ 'and anything still left to do. Do not mention step/tool limits or "budget" to the user.',
237
+ });
238
+ try {
239
+ const response = await callApi(messages, []);
240
+ if (response.usage) {
241
+ totalTokens += response.usage.prompt_tokens + response.usage.completion_tokens;
242
+ }
243
+ apiCallCount++;
244
+ finalText = response.choices?.[0]?.message?.content ?? '';
245
+ }
246
+ catch (err) {
247
+ onLog?.(`✖ Final answer turn failed: ${err instanceof Error ? err.message : String(err)}`);
248
+ }
249
+ }
109
250
  return {
110
251
  text: finalText,
111
252
  toolCallCount,
@@ -125,75 +266,82 @@ export function loopResultToCliResult(result) {
125
266
  durationMs: result.durationMs,
126
267
  };
127
268
  }
128
- // ============ 히스토리 압축 ============
269
+ /** Stable key for a tool call (name + args) — used to detect repeated calls. */
270
+ export function toolCallKey(tc) {
271
+ return `${tc.function.name}:${tc.function.arguments}`;
272
+ }
129
273
  /**
130
- * 최근 1턴(assistant + tool results) 원본 유지.
131
- * 이전 턴의 assistant+tool 쌍을 1줄 요약 assistant 메시지로 교체.
132
- *
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, ...]
274
+ * True when every tool call this turn was already seen (same name+args), i.e.
275
+ * pure repetition with no new info or change a stalled turn. Empty turns are
276
+ * not stalls (the model produced no tool calls, which ends the loop normally).
277
+ */
278
+ export function allToolCallsSeen(toolCalls, seen) {
279
+ if (toolCalls.length === 0)
280
+ return false;
281
+ return toolCalls.every((tc) => seen.has(toolCallKey(tc)));
282
+ }
283
+ // ============ 히스토리 압축 (VEGA compaction.py 패턴 이식) ============
284
+ /**
285
+ * 이전 턴(assistant+tool 쌍)을 요약 1줄로 교체.
286
+ * OpenAI API 제약: tool 메시지는 직전 assistant의 tool_call_id와 대응해야 하므로
287
+ * 오래된 assistant+tool 쌍은 텍스트 요약으로 대체해 API 오류를 방지.
136
288
  *
137
- * OpenAI API 제약: tool 메시지는 직전 assistant의 tool_call_id와 대응해야 함.
138
- * 따라서 오래된 tool 메시지는 삭제하고, 해당 assistant 일반 텍스트로 교체.
289
+ * 보존 기준 (VEGA keep_recent): 최근 keepRecent개 메시지 블록은 항상 원본 유지.
290
+ * tool 메시지는 직전 assistant tool_call_id와 짝이 맞아야 하므로, 보존 경계는
291
+ * keepRecent 지점 이후 첫 assistant로 정렬해 짝이 깨진 tool 메시지가 남지 않게 한다.
292
+ * 기존 [Prior turns compacted] 요약이 있으면 새 요약에 합산 후 교체.
293
+ * (테스트를 위해 export — 외부에서 직접 호출할 일은 없음)
139
294
  */
140
- function compactPriorTurns(messages) {
295
+ export function compactPriorTurns(messages, keepRecent = 8) {
141
296
  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
- }
297
+ // 최근 keepRecent개 메시지는 보존 — 압축 상한 인덱스 산출
298
+ let boundary = Math.max(headerCount, messages.length - keepRecent);
299
+ // 보존 경계를 assistant 시작점으로 정렬 (orphan tool 메시지 방지)
300
+ while (boundary < messages.length && messages[boundary].role === 'tool') {
301
+ boundary++;
149
302
  }
150
- if (lastAssistantIdx <= headerCount)
151
- return; // 압축할 이전 턴이 없음
152
- // headerCount ~ lastAssistantIdx 사이의 모든 assistant+tool 쌍을 요약
303
+ if (boundary <= headerCount)
304
+ return;
153
305
  const summaryParts = [];
154
306
  const toRemove = [];
155
- for (let i = headerCount; i < lastAssistantIdx; i++) {
307
+ for (let i = headerCount; i < boundary; i++) {
156
308
  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(', '));
309
+ if (msg.role === 'assistant') {
310
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
311
+ const calls = msg.tool_calls.map(tc => {
312
+ try {
313
+ const args = JSON.parse(tc.function.arguments);
314
+ const key = args.path || args.pattern || args.command;
315
+ const short = typeof key === 'string' ? key.slice(0, 40) : '';
316
+ return `${tc.function.name}(${short})`;
317
+ }
318
+ catch {
319
+ return tc.function.name;
320
+ }
321
+ });
322
+ summaryParts.push(calls.join(', '));
323
+ }
324
+ else {
325
+ // 기존 compacted 요약이면 내용 그대로 흡수, 아니면 어시스턴트 설명 텍스트 보존
326
+ const text = (msg.content ?? '').trim();
327
+ if (text)
328
+ summaryParts.push(text.startsWith('[Prior') ? text : `note: ${text.slice(0, 200)}`);
329
+ }
171
330
  toRemove.push(i);
172
331
  }
173
332
  else if (msg.role === 'tool') {
174
- // tool result → 성공/실패만 기록
175
333
  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}`);
334
+ const firstLine = msg.content.split('\n')[0].slice(0, 50);
335
+ summaryParts.push(ok ? '→ok' : `→err: ${firstLine}`);
185
336
  toRemove.push(i);
186
337
  }
187
338
  }
188
339
  if (toRemove.length === 0)
189
340
  return;
190
- // 요약 메시지 생성
191
341
  const summaryText = `[Prior turns compacted] ${summaryParts.join(' | ')}`;
192
- // 역순으로 제거 (인덱스 안정성)
193
342
  for (let i = toRemove.length - 1; i >= 0; i--) {
194
343
  messages.splice(toRemove[i], 1);
195
344
  }
196
- // header 직후에 요약 삽입
197
345
  messages.splice(headerCount, 0, {
198
346
  role: 'assistant',
199
347
  content: summaryText,
@@ -1 +1 @@
1
- {"version":3,"file":"agenticLoop.js","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agenticLoop.js","sourceRoot":"","sources":["../../src/adapters/agenticLoop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /** A chat-completions tool call (same shape the non-streaming path returns). */
2
+ export interface StreamToolCall {
3
+ id: string;
4
+ type: 'function';
5
+ function: {
6
+ name: string;
7
+ arguments: string;
8
+ };
9
+ }
10
+ export interface ChatCompletionLike {
11
+ choices: Array<{
12
+ message: {
13
+ role: string;
14
+ content: string | null;
15
+ tool_calls?: StreamToolCall[];
16
+ };
17
+ finish_reason: string;
18
+ }>;
19
+ usage?: {
20
+ prompt_tokens: number;
21
+ completion_tokens: number;
22
+ total_tokens: number;
23
+ };
24
+ }
25
+ interface StreamChunk {
26
+ choices?: Array<{
27
+ delta?: {
28
+ content?: string | null;
29
+ tool_calls?: Array<{
30
+ index?: number;
31
+ id?: string;
32
+ function?: {
33
+ name?: string;
34
+ arguments?: string;
35
+ };
36
+ }>;
37
+ };
38
+ finish_reason?: string | null;
39
+ }>;
40
+ usage?: {
41
+ prompt_tokens?: number;
42
+ completion_tokens?: number;
43
+ total_tokens?: number;
44
+ } | null;
45
+ }
46
+ /**
47
+ * Reduce parsed SSE chunks → a chat-completions response. Exported so the
48
+ * content/tool-call accumulation is unit-testable without a live stream.
49
+ * `onToken` is called for each content delta in order.
50
+ */
51
+ export declare function reduceChatChunks(chunks: StreamChunk[], onToken?: (delta: string) => void): ChatCompletionLike;
52
+ /** Read a chat/completions SSE body and reduce it, emitting content deltas live. */
53
+ export declare function consumeChatCompletionsStream(res: Response, onToken?: (delta: string) => void): Promise<ChatCompletionLike>;
54
+ export {};
55
+ //# sourceMappingURL=chatStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatStream.d.ts","sourceRoot":"","sources":["../../src/adapters/chatStream.ts"],"names":[],"mappings":"AAWA,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAA;SAAE,CAAC;QACjF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACpF;AAED,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACxB,UAAU,CAAC,EAAE,KAAK,CAAC;gBAAE,KAAK,CAAC,EAAE,MAAM,CAAC;gBAAC,EAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE;oBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;oBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,CAAC,CAAC;SACvG,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,kBAAkB,CAoD7G;AAeD,oFAAoF;AACpF,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,QAAQ,EACb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAyB7B"}
@@ -0,0 +1,116 @@
1
+ // ============================================
2
+ // OpenSwarm - chat/completions SSE streaming
3
+ // ============================================
4
+ //
5
+ // Shared streaming parser for the OpenAI chat/completions-style adapters
6
+ // (gpt / openrouter / local). With `stream: true` the server emits SSE chunks
7
+ // whose `choices[0].delta` carry incremental content + tool-call fragments;
8
+ // this reduces them back into the same shape `res.json()` would have produced
9
+ // (so the agentic loop is unaffected) while emitting each content delta via
10
+ // `onToken` for live chat streaming. Mirrors vega-agent streaming.py.
11
+ /**
12
+ * Reduce parsed SSE chunks → a chat-completions response. Exported so the
13
+ * content/tool-call accumulation is unit-testable without a live stream.
14
+ * `onToken` is called for each content delta in order.
15
+ */
16
+ export function reduceChatChunks(chunks, onToken) {
17
+ let content = '';
18
+ let sawContent = false;
19
+ let finishReason = 'stop';
20
+ let usage;
21
+ // Tool calls accumulate by their streaming index (id/name arrive once, arguments stream).
22
+ const calls = new Map();
23
+ for (const chunk of chunks) {
24
+ if (chunk.usage) {
25
+ const pt = chunk.usage.prompt_tokens ?? 0;
26
+ const ct = chunk.usage.completion_tokens ?? 0;
27
+ usage = { prompt_tokens: pt, completion_tokens: ct, total_tokens: chunk.usage.total_tokens ?? pt + ct };
28
+ }
29
+ const choice = chunk.choices?.[0];
30
+ if (!choice)
31
+ continue;
32
+ const delta = choice.delta ?? {};
33
+ if (typeof delta.content === 'string' && delta.content) {
34
+ content += delta.content;
35
+ sawContent = true;
36
+ onToken?.(delta.content);
37
+ }
38
+ for (const tc of delta.tool_calls ?? []) {
39
+ const idx = tc.index ?? 0;
40
+ const cur = calls.get(idx) ?? { id: '', name: '', args: '' };
41
+ if (tc.id)
42
+ cur.id = tc.id;
43
+ if (tc.function?.name)
44
+ cur.name = tc.function.name;
45
+ if (tc.function?.arguments)
46
+ cur.args += tc.function.arguments;
47
+ calls.set(idx, cur);
48
+ }
49
+ if (choice.finish_reason)
50
+ finishReason = choice.finish_reason;
51
+ }
52
+ const toolCalls = [...calls.values()].map((c) => ({
53
+ id: c.id,
54
+ type: 'function',
55
+ function: { name: c.name, arguments: c.args },
56
+ }));
57
+ return {
58
+ choices: [
59
+ {
60
+ message: {
61
+ role: 'assistant',
62
+ content: sawContent ? content : null,
63
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
64
+ },
65
+ finish_reason: toolCalls.length > 0 ? 'tool_calls' : finishReason,
66
+ },
67
+ ],
68
+ usage,
69
+ };
70
+ }
71
+ /** Parse one `data: {json}` SSE line into a chunk, or null for [DONE]/keep-alives. */
72
+ function parseChunkLine(line) {
73
+ const trimmed = line.trim();
74
+ if (!trimmed.startsWith('data:'))
75
+ return null;
76
+ const data = trimmed.slice(5).trim();
77
+ if (!data || data === '[DONE]')
78
+ return null;
79
+ try {
80
+ return JSON.parse(data);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /** Read a chat/completions SSE body and reduce it, emitting content deltas live. */
87
+ export async function consumeChatCompletionsStream(res, onToken) {
88
+ const reader = res.body?.getReader();
89
+ if (!reader)
90
+ throw new Error('chat stream: empty response body');
91
+ const chunks = [];
92
+ const decoder = new TextDecoder();
93
+ let buffer = '';
94
+ const handle = (c) => {
95
+ if (!c)
96
+ return;
97
+ const delta = c.choices?.[0]?.delta?.content;
98
+ if (onToken && typeof delta === 'string' && delta)
99
+ onToken(delta);
100
+ chunks.push(c);
101
+ };
102
+ for (;;) {
103
+ const { done, value } = await reader.read();
104
+ if (done)
105
+ break;
106
+ buffer += decoder.decode(value, { stream: true });
107
+ const lines = buffer.split('\n');
108
+ buffer = lines.pop() ?? '';
109
+ for (const line of lines)
110
+ handle(parseChunkLine(line));
111
+ }
112
+ handle(parseChunkLine(buffer));
113
+ // Final reduce WITHOUT onToken (already emitted above) to assemble the result.
114
+ return reduceChatChunks(chunks);
115
+ }
116
+ //# sourceMappingURL=chatStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatStream.js","sourceRoot":"","sources":["../../src/adapters/chatStream.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,12 @@ export declare class CodexCliAdapter implements CliAdapter {
3
3
  readonly name = "codex";
4
4
  readonly capabilities: AdapterCapabilities;
5
5
  isAvailable(): Promise<boolean>;
6
+ /**
7
+ * List the Codex models this account can use. Tries the live Codex OAuth
8
+ * backend (when authenticated via `openswarm auth login --provider gpt`),
9
+ * falling back to the local ~/.codex sources and a curated default list.
10
+ */
11
+ listModels(): Promise<string[]>;
6
12
  buildCommand(options: CliRunOptions): {
7
13
  command: string;
8
14
  args: string[];
@@ -11,4 +17,5 @@ export declare class CodexCliAdapter implements CliAdapter {
11
17
  parseWorkerOutput(raw: CliRunResult): WorkerResult;
12
18
  parseReviewerOutput(raw: CliRunResult): ReviewResult;
13
19
  }
20
+ export declare function coerceCodexModel(requested: string): string;
14
21
  //# 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;AAWpB,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAarC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAWzE,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"}