@intrect/openswarm 0.4.3 → 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 +4 -1
@@ -0,0 +1,56 @@
1
+ import type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, WorkerResult, ReviewResult } from './types.js';
2
+ import { type ChatMessage } from './agenticLoop.js';
3
+ import type { ToolDefinition } from './tools.js';
4
+ export declare class OpenRouterCliAdapter implements CliAdapter {
5
+ readonly name = "openrouter";
6
+ readonly capabilities: AdapterCapabilities;
7
+ isAvailable(): Promise<boolean>;
8
+ buildCommand(_options: CliRunOptions): {
9
+ command: string;
10
+ args: string[];
11
+ };
12
+ run(options: CliRunOptions): Promise<CliRunResult>;
13
+ parseWorkerOutput(raw: CliRunResult): WorkerResult;
14
+ parseReviewerOutput(raw: CliRunResult): ReviewResult;
15
+ }
16
+ interface OpenRouterChatResponse {
17
+ choices: Array<{
18
+ message: {
19
+ content: string | null;
20
+ role: string;
21
+ tool_calls?: Array<{
22
+ id: string;
23
+ type: 'function';
24
+ function: {
25
+ name: string;
26
+ arguments: string;
27
+ };
28
+ }>;
29
+ };
30
+ finish_reason: string;
31
+ }>;
32
+ usage?: {
33
+ prompt_tokens: number;
34
+ completion_tokens: number;
35
+ total_tokens: number;
36
+ };
37
+ }
38
+ export interface ApiCallerOptions {
39
+ /** worker 등 기계적 역할: 추론 토큰 비활성화 (지원 모델 한정) */
40
+ disableReasoning?: boolean;
41
+ }
42
+ export declare function createApiCaller(apiKey: string, model: string, opts?: ApiCallerOptions): (messages: ChatMessage[], tools: ToolDefinition[]) => Promise<OpenRouterChatResponse>;
43
+ /**
44
+ * Prompt caching breakpoint 삽입.
45
+ *
46
+ * OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
47
+ * Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
48
+ * 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
49
+ * 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
50
+ *
51
+ * breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
52
+ * Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
53
+ */
54
+ export declare function applyPromptCaching(messages: ChatMessage[], model: string): unknown[];
55
+ export {};
56
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/adapters/openrouter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBjD,qBAAa,oBAAqB,YAAW,UAAU;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAKpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAuDxD,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAGrD;AAID,UAAU,sBAAsB;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,CAAC,EAAE,KAAK,CAAC;gBACjB,EAAE,EAAE,MAAM,CAAC;gBACX,IAAI,EAAE,UAAU,CAAC;gBACjB,QAAQ,EAAE;oBAAE,IAAI,EAAE,MAAM,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAA;iBAAE,CAAC;aAC/C,CAAC,CAAC;SACJ,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,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,IAC1E,UAAU,WAAW,EAAE,EAAE,OAAO,cAAc,EAAE,qCA2C/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBpF"}
@@ -0,0 +1,294 @@
1
+ // ============================================
2
+ // OpenSwarm - OpenRouter CLI Adapter
3
+ // Calls the OpenRouter Chat Completions API (OpenAI-compatible schema)
4
+ // using a stored sk-or-* key from `openswarm auth login --provider openrouter`.
5
+ // ============================================
6
+ import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
7
+ import { t } from '../locale/index.js';
8
+ import { runAgenticLoop, loopResultToCliResult, } from './agenticLoop.js';
9
+ const OPENROUTER_API_BASE = 'https://openrouter.ai/api/v1';
10
+ const DEFAULT_MODEL = 'openai/gpt-5';
11
+ const PROFILE_KEY = 'openrouter:default';
12
+ /** OPENROUTER_API env var → immediate API key (no PKCE needed). */
13
+ function getEnvApiKey() {
14
+ return process.env.OPENROUTER_API?.trim() || undefined;
15
+ }
16
+ // Attribution headers — OpenRouter surfaces these in its analytics UI so
17
+ // model providers can see traffic originating from OpenSwarm.
18
+ const ATTRIBUTION_HEADERS = {
19
+ 'HTTP-Referer': 'https://github.com/unohee/openswarm',
20
+ 'X-Title': 'OpenSwarm',
21
+ };
22
+ export class OpenRouterCliAdapter {
23
+ name = 'openrouter';
24
+ capabilities = {
25
+ supportsStreaming: false,
26
+ supportsJsonOutput: true,
27
+ supportsModelSelection: true,
28
+ managedGit: false,
29
+ supportedSkills: [],
30
+ };
31
+ async isAvailable() {
32
+ if (getEnvApiKey())
33
+ return true;
34
+ try {
35
+ const store = new AuthProfileStore();
36
+ return store.getProfile(PROFILE_KEY) !== null;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ buildCommand(_options) {
43
+ // 어댑터가 직접 fetch하므로 spawn 진입점은 미사용.
44
+ return { command: 'echo', args: ['"OpenRouter adapter uses run() — not shell spawn"'] };
45
+ }
46
+ async run(options) {
47
+ const startTime = Date.now();
48
+ // Prefer OPENROUTER_API env var (e.g. sourced from VEGA .env)
49
+ let apiKey = getEnvApiKey();
50
+ if (!apiKey) {
51
+ const store = new AuthProfileStore();
52
+ try {
53
+ apiKey = await ensureValidToken(store, PROFILE_KEY);
54
+ }
55
+ catch (err) {
56
+ return {
57
+ exitCode: 1,
58
+ stdout: '',
59
+ stderr: `Auth error: ${err instanceof Error ? err.message : String(err)}. Set OPENROUTER_API env var or run: openswarm auth login --provider openrouter`,
60
+ durationMs: Date.now() - startTime,
61
+ };
62
+ }
63
+ }
64
+ const model = options.model ?? DEFAULT_MODEL;
65
+ const callApi = createApiCaller(apiKey, model, {
66
+ disableReasoning: options.disableReasoning,
67
+ });
68
+ const loopOptions = {
69
+ systemPrompt: options.systemPrompt,
70
+ prompt: options.prompt,
71
+ cwd: options.cwd ?? process.cwd(),
72
+ model,
73
+ callApi,
74
+ maxTurns: options.maxTurns ?? 20,
75
+ timeoutMs: options.timeoutMs || 300000,
76
+ onLog: options.onLog,
77
+ enableTools: true,
78
+ nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
79
+ protectedFiles: options.protectedFiles,
80
+ bashTimeoutMs: options.bashTimeoutMs,
81
+ };
82
+ try {
83
+ const result = await runAgenticLoop(loopOptions);
84
+ options.onLog?.(`[OpenRouter] ${result.apiCallCount} API calls, ${result.toolCallCount} tool uses, ${result.totalTokens} tokens`);
85
+ return loopResultToCliResult(result);
86
+ }
87
+ catch (err) {
88
+ return {
89
+ exitCode: 1,
90
+ stdout: '',
91
+ stderr: `OpenRouter agentic loop failed: ${err instanceof Error ? err.message : String(err)}`,
92
+ durationMs: Date.now() - startTime,
93
+ };
94
+ }
95
+ }
96
+ parseWorkerOutput(raw) {
97
+ return extractWorkerResultJson(raw.stdout) ?? extractWorkerFromText(raw.stdout);
98
+ }
99
+ parseReviewerOutput(raw) {
100
+ return extractReviewerResultJson(raw.stdout) ?? extractReviewerFromText(raw.stdout);
101
+ }
102
+ }
103
+ export function createApiCaller(apiKey, model, opts = {}) {
104
+ return async (messages, tools) => {
105
+ const body = {
106
+ model,
107
+ messages: applyPromptCaching(messages, model),
108
+ temperature: 0.2,
109
+ max_tokens: 16384,
110
+ };
111
+ // ZDR(Zero Data Retention) — 데이터를 보존하지 않는 provider로만 라우팅.
112
+ // 단, OpenAI provider는 data_collection:deny 플래그를 거부("Provider returned
113
+ // error")하므로 제외한다. OpenAI는 API 데이터를 학습에 쓰지 않아(정책상) ZDR
114
+ // 강제가 불필요하다. non-OpenAI 모델에만 적용한다.
115
+ if (!/^openai\//i.test(model)) {
116
+ body.provider = { data_collection: 'deny' };
117
+ }
118
+ // 추론 불필요 역할은 reasoning 토큰을 끈다. glm-4.7-flash처럼 non-thinking
119
+ // 모델엔 무영향, 추론형 모델(glm-5 등)을 worker로 바꿔도 토큰 낭비를 막는다.
120
+ // 단, OpenAI 추론 모델(gpt-5 등)은 "Reasoning is mandatory"로 이 플래그를
121
+ // 거부하므로 제외한다 — worker escalate 대상이 gpt-5라 이걸 안 빼면 escalation이
122
+ // 항상 깨진다. OpenAI는 단순 작업엔 추론을 자동 최소화하므로 끌 필요도 없다.
123
+ if (opts.disableReasoning && !/^openai\//i.test(model)) {
124
+ body.reasoning = { enabled: false };
125
+ }
126
+ if (tools.length > 0) {
127
+ body.tools = tools;
128
+ }
129
+ const res = await fetch(`${OPENROUTER_API_BASE}/chat/completions`, {
130
+ method: 'POST',
131
+ headers: {
132
+ Authorization: `Bearer ${apiKey}`,
133
+ 'Content-Type': 'application/json',
134
+ ...ATTRIBUTION_HEADERS,
135
+ },
136
+ body: JSON.stringify(body),
137
+ });
138
+ if (!res.ok) {
139
+ const errText = await res.text().catch(() => '');
140
+ throw new Error(`OpenRouter API error (${res.status}): ${errText.slice(0, 500)}`);
141
+ }
142
+ return (await res.json());
143
+ };
144
+ }
145
+ /**
146
+ * Prompt caching breakpoint 삽입.
147
+ *
148
+ * OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
149
+ * Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
150
+ * 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
151
+ * 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
152
+ *
153
+ * breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
154
+ * Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
155
+ */
156
+ export function applyPromptCaching(messages, model) {
157
+ // OpenAI/Gemini 등은 자동 캐싱 — 변환 불필요 (cache_control을 넣으면 거부될 수 있음)
158
+ if (!/anthropic\/|claude/i.test(model)) {
159
+ return messages;
160
+ }
161
+ // 캐시 마커를 달 인덱스: 시스템 메시지(있으면) + 마지막 직전 메시지.
162
+ // 마지막 메시지(가장 최근 tool 결과)는 매 턴 바뀌므로 캐시하지 않는다.
163
+ const cacheable = new Set();
164
+ if (messages[0]?.role === 'system')
165
+ cacheable.add(0);
166
+ if (messages.length >= 2)
167
+ cacheable.add(messages.length - 2);
168
+ return messages.map((m, i) => {
169
+ if (!cacheable.has(i) || typeof m.content !== 'string' || !m.content) {
170
+ return m;
171
+ }
172
+ // string content → content-part 배열로 변환하며 마지막 파트에 cache_control 부착
173
+ return {
174
+ ...m,
175
+ content: [
176
+ { type: 'text', text: m.content, cache_control: { type: 'ephemeral' } },
177
+ ],
178
+ };
179
+ });
180
+ }
181
+ // ----- Worker/Reviewer output parsing (mirrors gpt.ts) -----
182
+ function extractWorkerResultJson(text) {
183
+ const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
184
+ const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"success"');
185
+ if (!jsonStr)
186
+ return null;
187
+ try {
188
+ const parsed = JSON.parse(jsonStr);
189
+ return {
190
+ success: Boolean(parsed.success),
191
+ summary: parsed.summary || t('common.fallback.noSummary'),
192
+ filesChanged: Array.isArray(parsed.filesChanged) ? parsed.filesChanged : [],
193
+ commands: Array.isArray(parsed.commands) ? parsed.commands : [],
194
+ output: text,
195
+ error: parsed.error,
196
+ confidencePercent: typeof parsed.confidencePercent === 'number' ? parsed.confidencePercent : undefined,
197
+ haltReason: parsed.haltReason || undefined,
198
+ };
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ }
204
+ function extractWorkerFromText(text) {
205
+ // Only an explicit failure phrase marks the run as failed (see gpt.ts).
206
+ // git-diff promotion in worker.ts is the real success signal.
207
+ const failed = isExplicitFailure(text);
208
+ return {
209
+ success: !failed,
210
+ summary: extractSummary(text),
211
+ filesChanged: [],
212
+ commands: [],
213
+ output: text,
214
+ error: failed ? extractErrorMessage(text) : undefined,
215
+ };
216
+ }
217
+ function extractReviewerResultJson(text) {
218
+ const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
219
+ const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"decision"');
220
+ if (!jsonStr)
221
+ return null;
222
+ try {
223
+ const parsed = JSON.parse(jsonStr);
224
+ const decision = parsed.decision === 'approve' || parsed.decision === 'reject' ? parsed.decision : 'revise';
225
+ return {
226
+ decision,
227
+ feedback: typeof parsed.feedback === 'string' ? parsed.feedback : t('common.fallback.noSummary'),
228
+ issues: Array.isArray(parsed.issues)
229
+ ? parsed.issues.filter((v) => typeof v === 'string')
230
+ : [],
231
+ suggestions: Array.isArray(parsed.suggestions)
232
+ ? parsed.suggestions.filter((v) => typeof v === 'string')
233
+ : [],
234
+ };
235
+ }
236
+ catch {
237
+ return null;
238
+ }
239
+ }
240
+ function extractReviewerFromText(text) {
241
+ const lower = text.toLowerCase();
242
+ const decision = lower.includes('approve')
243
+ ? 'approve'
244
+ : lower.includes('reject')
245
+ ? 'reject'
246
+ : 'revise';
247
+ return {
248
+ decision,
249
+ feedback: extractSummary(text),
250
+ issues: [],
251
+ suggestions: [],
252
+ };
253
+ }
254
+ function findJsonObject(text, marker) {
255
+ const idx = text.indexOf(marker);
256
+ if (idx < 0)
257
+ return null;
258
+ const start = text.lastIndexOf('{', idx);
259
+ if (start < 0)
260
+ return null;
261
+ let depth = 0;
262
+ for (let i = start; i < text.length; i++) {
263
+ if (text[i] === '{')
264
+ depth++;
265
+ if (text[i] === '}') {
266
+ depth--;
267
+ if (depth === 0) {
268
+ return text.slice(start, i + 1);
269
+ }
270
+ }
271
+ }
272
+ return null;
273
+ }
274
+ // Detect a real failure declaration, not incidental "error"/"fail" prose (see gpt.ts).
275
+ function isExplicitFailure(text) {
276
+ if (/"success"\s*:\s*false/i.test(text))
277
+ return true;
278
+ return /\b(failed to|unable to|could not|couldn['’]t|cannot (?:complete|finish|proceed|continue)|giving up|abort(?:ed|ing))\b/i.test(text);
279
+ }
280
+ function extractSummary(text) {
281
+ const lines = text.split('\n').filter((l) => l.trim().length > 10);
282
+ if (lines.length === 0)
283
+ return t('common.fallback.noSummary');
284
+ const summary = lines[0].trim();
285
+ return summary.length > 200 ? `${summary.slice(0, 200)}...` : summary;
286
+ }
287
+ function extractErrorMessage(text) {
288
+ const errorMatch = text.match(/(?:error|exception|failed?):\s*(.+)/i);
289
+ if (errorMatch)
290
+ return errorMatch[1].slice(0, 200);
291
+ const lines = text.split('\n').filter((l) => /error|fail/i.test(l));
292
+ return lines.length > 0 ? lines[0].slice(0, 200) : 'Unknown error';
293
+ }
294
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/adapters/openrouter.ts"],"names":[],"mappings":"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"}
@@ -19,12 +19,37 @@ export interface ToolResult {
19
19
  content: string;
20
20
  is_error: boolean;
21
21
  }
22
+ /**
23
+ * 루프 단위 read 캐시. 같은 작업 루프 안에서 동일 파일을 반복 read하면
24
+ * (모델이 edit 후 "고쳐졌나?" 확인하려 재read하는 패턴) 디스크를 다시 읽지 않고
25
+ * 캐시된 내용 + "변경 없음" 힌트를 반환해 토큰·턴 낭비를 줄인다.
26
+ * edit_file/write_file 성공 시 해당 경로를 무효화해 stale read를 막는다.
27
+ */
28
+ export interface ReadCache {
29
+ store: Map<string, string>;
30
+ }
31
+ export declare function createReadCache(): ReadCache;
32
+ /**
33
+ * Tool execution options — verification-harness protection.
34
+ * Found in SWE hybrid runs: the implementer model misattributed test failures
35
+ * to the verification script (run_tests.sh) and edited the script itself five
36
+ * times, destroying verification integrity. Protected files reject edit/write.
37
+ * The bash timeout is also configurable — the 30s default dies silently on
38
+ * docker-based test runs (minutes), which made models conclude "the
39
+ * environment is broken".
40
+ */
41
+ export interface ToolExecOptions {
42
+ /** Filenames (matched by path suffix) for which edit_file/write_file are refused */
43
+ protectedFiles?: string[];
44
+ /** bash tool timeout (default DEFAULT_BASH_TIMEOUT_MS) */
45
+ bashTimeoutMs?: number;
46
+ }
22
47
  /**
23
48
  * 단일 도구 호출 실행
24
49
  */
25
- export declare function executeTool(toolCall: ToolCall, cwd: string): Promise<ToolResult>;
50
+ export declare function executeTool(toolCall: ToolCall, cwd: string, cache?: ReadCache, execOptions?: ToolExecOptions): Promise<ToolResult>;
26
51
  /**
27
52
  * 여러 도구 호출을 병렬 실행
28
53
  */
29
- export declare function executeToolCalls(toolCalls: ToolCall[], cwd: string): Promise<ToolResult[]>;
54
+ export declare function executeToolCalls(toolCalls: ToolCall[], cwd: string, cache?: ReadCache, execOptions?: ToolExecOptions): Promise<ToolResult[]>;
30
55
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/adapters/tools.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA8E5C,CAAC;AAwBF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CAiGrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,QAAQ,EAAE,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,EAAE,CAAC,CAEvB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/adapters/tools.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA8E5C,CAAC;AAwBF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAUD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwBD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,SAAS,EACjB,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,UAAU,CAAC,CAqKrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,QAAQ,EAAE,EACrB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,SAAS,EACjB,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC,CAEvB"}
@@ -105,19 +105,40 @@ const BLOCKED_COMMANDS = [
105
105
  function isCommandBlocked(command) {
106
106
  return BLOCKED_COMMANDS.some(pattern => pattern.test(command));
107
107
  }
108
+ export function createReadCache() {
109
+ return { store: new Map() };
110
+ }
111
+ /** 캐시에서 한 파일의 모든 범위 엔트리를 제거 (edit/write 후 stale 방지) */
112
+ function invalidateCache(cache, filePath) {
113
+ if (!cache)
114
+ return;
115
+ for (const key of cache.store.keys()) {
116
+ if (key.startsWith(`${filePath}#`))
117
+ cache.store.delete(key);
118
+ }
119
+ }
120
+ const DEFAULT_BASH_TIMEOUT_MS = 30000;
121
+ function isProtected(resolved, protectedFiles) {
122
+ if (!protectedFiles?.length)
123
+ return false;
124
+ return protectedFiles.some((p) => resolved === p || resolved.endsWith(`/${p}`));
125
+ }
108
126
  /** 프로젝트 경로 내로 접근을 제한하는 경로 검증 */
109
127
  function validatePath(filePath, cwd) {
110
128
  const resolved = path.resolve(cwd, filePath);
111
129
  // cwd 하위이거나, /tmp 하위만 허용
112
130
  if (!resolved.startsWith(cwd) && !resolved.startsWith('/tmp')) {
113
- throw new Error(`Path outside project: ${resolved} (cwd: ${cwd})`);
131
+ // 모델이 자가수정하도록 안내 그냥 거부만 하면 같은 실수를 반복한다.
132
+ throw new Error(`Path "${filePath}" is outside the project root (${cwd}). ` +
133
+ `Use a path relative to the project root instead, e.g. "." for the whole project or "src/...". ` +
134
+ `Do not use "/" or absolute paths outside ${cwd}.`);
114
135
  }
115
136
  return resolved;
116
137
  }
117
138
  /**
118
139
  * 단일 도구 호출 실행
119
140
  */
120
- export async function executeTool(toolCall, cwd) {
141
+ export async function executeTool(toolCall, cwd, cache, execOptions) {
121
142
  const { name, arguments: argsJson } = toolCall.function;
122
143
  const callId = toolCall.id;
123
144
  try {
@@ -125,26 +146,55 @@ export async function executeTool(toolCall, cwd) {
125
146
  switch (name) {
126
147
  case 'read_file': {
127
148
  const filePath = validatePath(args.path, cwd);
128
- const content = await fs.readFile(filePath, 'utf-8');
129
- const lines = content.split('\n');
130
149
  const offset = args.offset ?? 0;
131
150
  const limit = args.limit ?? 500;
151
+ const cacheKey = `${filePath}#${offset}:${limit}`;
152
+ // 같은 루프에서 이미 같은 범위를 읽었으면 디스크 재접근 없이 캐시 반환.
153
+ // 모델에게 "변경 없음"을 알려 추가 확인 read를 유도하지 않는다.
154
+ if (cache?.store.has(cacheKey)) {
155
+ return {
156
+ tool_call_id: callId,
157
+ content: `(unchanged since last read — cached)\n${cache.store.get(cacheKey)}`,
158
+ is_error: false,
159
+ };
160
+ }
161
+ const content = await fs.readFile(filePath, 'utf-8');
162
+ const lines = content.split('\n');
132
163
  const slice = lines.slice(offset, offset + limit);
133
164
  const numbered = slice.map((line, i) => `${offset + i + 1}\t${line}`).join('\n');
134
165
  const truncated = lines.length > offset + limit
135
166
  ? `\n... (${lines.length - offset - limit} more lines)`
136
167
  : '';
137
- return { tool_call_id: callId, content: numbered + truncated, is_error: false };
168
+ const result = numbered + truncated;
169
+ cache?.store.set(cacheKey, result);
170
+ return { tool_call_id: callId, content: result, is_error: false };
138
171
  }
139
172
  case 'write_file': {
140
173
  const filePath = validatePath(args.path, cwd);
174
+ if (isProtected(filePath, execOptions?.protectedFiles)) {
175
+ return {
176
+ tool_call_id: callId,
177
+ content: `PROTECTED: ${args.path} is part of the verification harness and must not be modified. ` +
178
+ `If tests fail, the cause is in the SOURCE code (or your fix) — debug from the test output instead.`,
179
+ is_error: true,
180
+ };
181
+ }
141
182
  // 디렉토리 자동 생성
142
183
  await fs.mkdir(path.dirname(filePath), { recursive: true });
143
184
  await fs.writeFile(filePath, args.content, 'utf-8');
185
+ invalidateCache(cache, filePath);
144
186
  return { tool_call_id: callId, content: `Written: ${filePath}`, is_error: false };
145
187
  }
146
188
  case 'edit_file': {
147
189
  const filePath = validatePath(args.path, cwd);
190
+ if (isProtected(filePath, execOptions?.protectedFiles)) {
191
+ return {
192
+ tool_call_id: callId,
193
+ content: `PROTECTED: ${args.path} is part of the verification harness and must not be modified. ` +
194
+ `If tests fail, the cause is in the SOURCE code (or your fix) — debug from the test output instead.`,
195
+ is_error: true,
196
+ };
197
+ }
148
198
  const original = await fs.readFile(filePath, 'utf-8');
149
199
  const occurrences = original.split(args.old_string).length - 1;
150
200
  if (occurrences === 0) {
@@ -155,7 +205,21 @@ export async function executeTool(toolCall, cwd) {
155
205
  }
156
206
  const updated = original.replace(args.old_string, args.new_string);
157
207
  await fs.writeFile(filePath, updated, 'utf-8');
158
- return { tool_call_id: callId, content: `Edited: ${filePath}`, is_error: false };
208
+ invalidateCache(cache, filePath);
209
+ // Return the changed region so the model can verify without a re-read.
210
+ // Locate the edit via old_string's position in the ORIGINAL (guaranteed
211
+ // unique above) — indexOf(new_string) on the updated text could match an
212
+ // earlier pre-existing occurrence and show the wrong region.
213
+ const newLines = updated.split('\n');
214
+ const editLine = original.slice(0, original.indexOf(args.old_string)).split('\n').length - 1;
215
+ const from = Math.max(0, editLine - 3);
216
+ const to = Math.min(newLines.length, editLine + args.new_string.split('\n').length + 3);
217
+ const snippet = newLines.slice(from, to).map((l, i) => `${from + i + 1}\t${l}`).join('\n');
218
+ return {
219
+ tool_call_id: callId,
220
+ content: `Edited: ${filePath}\nResulting region:\n${snippet}`,
221
+ is_error: false,
222
+ };
159
223
  }
160
224
  case 'search_files': {
161
225
  const searchPath = validatePath(args.path, cwd);
@@ -184,7 +248,7 @@ export async function executeTool(toolCall, cwd) {
184
248
  try {
185
249
  const { stdout, stderr } = await execFileAsync('bash', ['-c', command], {
186
250
  cwd,
187
- timeout: 30000,
251
+ timeout: execOptions?.bashTimeoutMs ?? DEFAULT_BASH_TIMEOUT_MS,
188
252
  maxBuffer: 1024 * 512,
189
253
  env: process.env,
190
254
  });
@@ -192,13 +256,36 @@ export async function executeTool(toolCall, cwd) {
192
256
  // 출력이 너무 길면 잘라냄
193
257
  return {
194
258
  tool_call_id: callId,
195
- content: output.length > 8000 ? output.slice(0, 8000) + '\n... (truncated)' : output,
259
+ content: output.length > 8000 ? output.slice(0, 8000) + '\n... (truncated)' : output || '(no output, exit 0)',
196
260
  is_error: false,
197
261
  };
198
262
  }
199
263
  catch (err) {
200
- const msg = err instanceof Error ? err.message : String(err);
201
- return { tool_call_id: callId, content: `Command failed: ${msg.slice(0, 2000)}`, is_error: true };
264
+ // exit code != 0 execFile이 throw. 하지만 grep/find 등은 "매치 없음"으로
265
+ // exit 1을 내며 이건 정상이다. 실제 stdout/stderr + exit code를 모델에게 줘서
266
+ // "no match"인지 진짜 에러인지 스스로 판단하게 한다(이게 없으면 같은 명령 반복).
267
+ const e = err;
268
+ const out = (e.stdout ?? '') + (e.stderr ? `\n[stderr] ${e.stderr}` : '');
269
+ const code = typeof e.code === 'number' ? e.code : '?';
270
+ // Make timeout kills explicit — a silent no-output failure leads the
271
+ // model to conclude "the verification environment is broken" and start
272
+ // dismantling the harness (observed in SWE runs).
273
+ if (e.killed && e.signal) {
274
+ const limit = execOptions?.bashTimeoutMs ?? DEFAULT_BASH_TIMEOUT_MS;
275
+ return {
276
+ tool_call_id: callId,
277
+ content: `TIMEOUT: command exceeded ${Math.round(limit / 1000)}s and was killed (${e.signal}). ` +
278
+ `The command may simply be slow — this is NOT evidence that the environment or script is broken. ` +
279
+ `Partial output:\n${out.slice(0, 2000) || '(none)'}`,
280
+ is_error: true,
281
+ };
282
+ }
283
+ const body = out.trim()
284
+ ? `exit ${code}:\n${out.slice(0, 4000)}`
285
+ : `exit ${code} (no output) — likely no matches or a non-fatal nonzero exit, not necessarily an error.`;
286
+ // exit 1 + 출력 없음은 보통 무해(grep no-match) → is_error를 false로 둬 모델이 안 헤매게.
287
+ const benign = e.code === 1 && !out.trim();
288
+ return { tool_call_id: callId, content: body, is_error: !benign };
202
289
  }
203
290
  }
204
291
  default:
@@ -213,7 +300,7 @@ export async function executeTool(toolCall, cwd) {
213
300
  /**
214
301
  * 여러 도구 호출을 병렬 실행
215
302
  */
216
- export async function executeToolCalls(toolCalls, cwd) {
217
- return Promise.all(toolCalls.map(tc => executeTool(tc, cwd)));
303
+ export async function executeToolCalls(toolCalls, cwd, cache, execOptions) {
304
+ return Promise.all(toolCalls.map(tc => executeTool(tc, cwd, cache, execOptions)));
218
305
  }
219
306
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/adapters/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/adapters/tools.ts"],"names":[],"mappings":"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"}