@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.
- package/README.md +46 -26
- package/config.example.yaml +22 -10
- package/dist/adapters/agenticLoop.d.ts +45 -2
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +209 -61
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/chatStream.d.ts +55 -0
- package/dist/adapters/chatStream.d.ts.map +1 -0
- package/dist/adapters/chatStream.js +116 -0
- package/dist/adapters/chatStream.js.map +1 -0
- package/dist/adapters/codex.d.ts +7 -0
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +67 -6
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexModels.d.ts +20 -0
- package/dist/adapters/codexModels.d.ts.map +1 -0
- package/dist/adapters/codexModels.js +195 -0
- package/dist/adapters/codexModels.js.map +1 -0
- package/dist/adapters/codexResponses.d.ts +97 -0
- package/dist/adapters/codexResponses.d.ts.map +1 -0
- package/dist/adapters/codexResponses.js +302 -0
- package/dist/adapters/codexResponses.js.map +1 -0
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +20 -120
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/index.d.ts +10 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +19 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/lmstudio.d.ts +8 -0
- package/dist/adapters/lmstudio.d.ts.map +1 -0
- package/dist/adapters/lmstudio.js +41 -0
- package/dist/adapters/lmstudio.js.map +1 -0
- package/dist/adapters/local.d.ts +16 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +51 -127
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts +37 -0
- package/dist/adapters/openrouter.d.ts.map +1 -0
- package/dist/adapters/openrouter.js +193 -0
- package/dist/adapters/openrouter.js.map +1 -0
- package/dist/adapters/resultParsing.d.ts +6 -0
- package/dist/adapters/resultParsing.d.ts.map +1 -0
- package/dist/adapters/resultParsing.js +139 -0
- package/dist/adapters/resultParsing.js.map +1 -0
- package/dist/adapters/tools.d.ts +21 -2
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +153 -12
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +40 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/webTools.d.ts +9 -0
- package/dist/adapters/webTools.d.ts.map +1 -0
- package/dist/adapters/webTools.js +195 -0
- package/dist/adapters/webTools.js.map +1 -0
- package/dist/agents/draftAnalyzer.d.ts +1 -1
- package/dist/agents/draftAnalyzer.d.ts.map +1 -1
- package/dist/agents/draftAnalyzer.js +3 -3
- package/dist/agents/draftAnalyzer.js.map +1 -1
- package/dist/agents/pairPipeline.d.ts +26 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +184 -17
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/reflection.d.ts +56 -0
- package/dist/agents/reflection.d.ts.map +1 -0
- package/dist/agents/reflection.js +120 -0
- package/dist/agents/reflection.js.map +1 -0
- package/dist/agents/worker.d.ts +8 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +23 -2
- package/dist/agents/worker.js.map +1 -1
- package/dist/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/linearPkce.d.ts +22 -0
- package/dist/auth/linearPkce.d.ts.map +1 -0
- package/dist/auth/linearPkce.js +208 -0
- package/dist/auth/linearPkce.js.map +1 -0
- package/dist/auth/oauthPkce.d.ts +4 -3
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +39 -12
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts +11 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +14 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/auth/openrouterPkce.d.ts +29 -0
- package/dist/auth/openrouterPkce.d.ts.map +1 -0
- package/dist/auth/openrouterPkce.js +222 -0
- package/dist/auth/openrouterPkce.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +17 -7
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +69 -70
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +21 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +80 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/localCI.d.ts +24 -0
- package/dist/automation/localCI.d.ts.map +1 -0
- package/dist/automation/localCI.js +84 -0
- package/dist/automation/localCI.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +33 -7
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +202 -154
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +5 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +101 -0
- package/dist/automation/taskSource.d.ts.map +1 -0
- package/dist/automation/taskSource.js +136 -0
- package/dist/automation/taskSource.js.map +1 -0
- package/dist/automation/workerAuditLog.d.ts +29 -0
- package/dist/automation/workerAuditLog.d.ts.map +1 -0
- package/dist/automation/workerAuditLog.js +82 -0
- package/dist/automation/workerAuditLog.js.map +1 -0
- package/dist/cli/authHandler.d.ts +14 -5
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +131 -36
- package/dist/cli/authHandler.js.map +1 -1
- package/dist/cli/daemon.d.ts +5 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +13 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctorHandler.d.ts +2 -0
- package/dist/cli/doctorHandler.d.ts.map +1 -0
- package/dist/cli/doctorHandler.js +114 -0
- package/dist/cli/doctorHandler.js.map +1 -0
- package/dist/cli/initWizard.d.ts +13 -0
- package/dist/cli/initWizard.d.ts.map +1 -0
- package/dist/cli/initWizard.js +314 -0
- package/dist/cli/initWizard.js.map +1 -0
- package/dist/cli.js +112 -38
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +89 -15
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +100 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/envFile.d.ts +6 -0
- package/dist/core/envFile.d.ts.map +1 -1
- package/dist/core/envFile.js +39 -1
- package/dist/core/envFile.js.map +1 -1
- package/dist/core/eventHub.d.ts +22 -0
- package/dist/core/eventHub.d.ts.map +1 -1
- package/dist/core/eventHub.js.map +1 -1
- package/dist/core/providerOverride.d.ts +6 -0
- package/dist/core/providerOverride.d.ts.map +1 -0
- package/dist/core/providerOverride.js +37 -0
- package/dist/core/providerOverride.js.map +1 -0
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +43 -20
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +16 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/discord/discordCore.d.ts.map +1 -1
- package/dist/discord/discordCore.js +16 -103
- package/dist/discord/discordCore.js.map +1 -1
- package/dist/discord/discordHandlers.d.ts.map +1 -1
- package/dist/discord/discordHandlers.js +15 -12
- package/dist/discord/discordHandlers.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/issues/sqliteStore.d.ts.map +1 -1
- package/dist/issues/sqliteStore.js +7 -2
- package/dist/issues/sqliteStore.js.map +1 -1
- package/dist/knowledge/scanner.d.ts.map +1 -1
- package/dist/knowledge/scanner.js +5 -0
- package/dist/knowledge/scanner.js.map +1 -1
- package/dist/linear/linear.d.ts +45 -2
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +154 -3
- package/dist/linear/linear.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +40 -20
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +39 -20
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/locale/types.d.ts +6 -0
- package/dist/locale/types.d.ts.map +1 -1
- package/dist/mcp/mcpClient.d.ts +27 -0
- package/dist/mcp/mcpClient.d.ts.map +1 -0
- package/dist/mcp/mcpClient.js +145 -0
- package/dist/mcp/mcpClient.js.map +1 -0
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +8 -2
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/memory/repoKnowledge.d.ts +33 -0
- package/dist/memory/repoKnowledge.d.ts.map +1 -0
- package/dist/memory/repoKnowledge.js +97 -0
- package/dist/memory/repoKnowledge.js.map +1 -0
- package/dist/notify/notifier.d.ts +26 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +131 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/orchestration/conflictDetector.d.ts +5 -2
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +35 -6
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +20 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +45 -0
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/support/banner.d.ts +7 -0
- package/dist/support/banner.d.ts.map +1 -0
- package/dist/support/banner.js +32 -0
- package/dist/support/banner.js.map +1 -0
- package/dist/support/chat.js +36 -27
- package/dist/support/chat.js.map +1 -1
- package/dist/support/chatBackend.d.ts +6 -0
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +105 -83
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +217 -27
- package/dist/support/chatTui.js.map +1 -1
- package/dist/support/colors.d.ts +15 -0
- package/dist/support/colors.d.ts.map +1 -0
- package/dist/support/colors.js +23 -0
- package/dist/support/colors.js.map +1 -0
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +318 -65
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/planCommand.d.ts +17 -0
- package/dist/support/planCommand.d.ts.map +1 -0
- package/dist/support/planCommand.js +114 -0
- package/dist/support/planCommand.js.map +1 -0
- package/dist/support/planner.d.ts +9 -2
- package/dist/support/planner.d.ts.map +1 -1
- package/dist/support/planner.js +43 -111
- package/dist/support/planner.js.map +1 -1
- package/dist/support/projectMapper.d.ts.map +1 -1
- package/dist/support/projectMapper.js +29 -1
- package/dist/support/projectMapper.js.map +1 -1
- package/dist/support/promptHelper.d.ts +24 -0
- package/dist/support/promptHelper.d.ts.map +1 -0
- package/dist/support/promptHelper.js +94 -0
- package/dist/support/promptHelper.js.map +1 -0
- package/dist/support/rateLimiter.d.ts.map +1 -1
- package/dist/support/rateLimiter.js +6 -0
- package/dist/support/rateLimiter.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +51 -0
- package/dist/support/repoMetadata.d.ts.map +1 -0
- package/dist/support/repoMetadata.js +91 -0
- package/dist/support/repoMetadata.js.map +1 -0
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +196 -71
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +6 -1
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +23 -1
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts +1 -0
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +22 -1
- package/dist/taskState/store.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LocalModelAdapter } from './local.js';
|
|
2
|
+
import type { CliRunOptions, CliRunResult } from './types.js';
|
|
3
|
+
export declare class LmStudioAdapter extends LocalModelAdapter {
|
|
4
|
+
constructor();
|
|
5
|
+
run(options: CliRunOptions): Promise<CliRunResult>;
|
|
6
|
+
private resolveModel;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=lmstudio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../src/adapters/lmstudio.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D,qBAAa,eAAgB,SAAQ,iBAAiB;;IAY9C,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAK1C,YAAY;CAO3B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - LM Studio Adapter
|
|
3
|
+
// Created: 2026-05-13
|
|
4
|
+
// Purpose: Dedicated OpenAI-compatible adapter for LM Studio local server
|
|
5
|
+
// Dependencies: LocalModelAdapter
|
|
6
|
+
// Test Status: Covered by src/adapters/lmstudio.test.ts
|
|
7
|
+
// ============================================
|
|
8
|
+
import { LocalModelAdapter } from './local.js';
|
|
9
|
+
const DEFAULT_LMSTUDIO_BASE_URL = 'http://localhost:1234';
|
|
10
|
+
const DEFAULT_LMSTUDIO_MODEL = 'local-model';
|
|
11
|
+
function normalizeBaseUrl(url) {
|
|
12
|
+
return url.replace(/\/+$/, '');
|
|
13
|
+
}
|
|
14
|
+
export class LmStudioAdapter extends LocalModelAdapter {
|
|
15
|
+
constructor() {
|
|
16
|
+
super({
|
|
17
|
+
name: 'lmstudio',
|
|
18
|
+
endpoints: [normalizeBaseUrl(process.env.LMSTUDIO_BASE_URL ?? DEFAULT_LMSTUDIO_BASE_URL)],
|
|
19
|
+
defaultModel: normalizeValue(process.env.LMSTUDIO_MODEL) ?? DEFAULT_LMSTUDIO_MODEL,
|
|
20
|
+
apiKey: process.env.LMSTUDIO_API_KEY,
|
|
21
|
+
logPrefix: 'LMStudio',
|
|
22
|
+
noServerMessage: 'No LM Studio server found. Start LM Studio Local Server first, or set LMSTUDIO_BASE_URL.',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async run(options) {
|
|
26
|
+
const model = await this.resolveModel(options.model);
|
|
27
|
+
return super.run({ ...options, model });
|
|
28
|
+
}
|
|
29
|
+
async resolveModel(requestedModel) {
|
|
30
|
+
const explicitModel = normalizeValue(requestedModel) ?? normalizeValue(process.env.LMSTUDIO_MODEL);
|
|
31
|
+
if (explicitModel)
|
|
32
|
+
return explicitModel;
|
|
33
|
+
const loadedModels = await this.listModels();
|
|
34
|
+
return loadedModels[0] ?? DEFAULT_LMSTUDIO_MODEL;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function normalizeValue(value) {
|
|
38
|
+
const trimmed = value?.trim();
|
|
39
|
+
return trimmed ? trimmed : undefined;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=lmstudio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lmstudio.js","sourceRoot":"","sources":["../../src/adapters/lmstudio.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,gCAAgC;AAChC,sBAAsB;AACtB,0EAA0E;AAC1E,kCAAkC;AAClC,wDAAwD;AACxD,+CAA+C;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAC1D,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAE7C,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IACpD;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,yBAAyB,CAAC,CAAC;YACzF,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,sBAAsB;YAClF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpC,SAAS,EAAE,UAAU;YACrB,eAAe,EAAE,0FAA0F;SAC5G,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAsB;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,cAAuB;QAChD,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnG,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QAExC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC;IACnD,CAAC;CACF;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC"}
|
package/dist/adapters/local.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, WorkerResult, ReviewResult } from './types.js';
|
|
2
|
+
export interface LocalModelAdapterOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
endpoints?: string[];
|
|
5
|
+
defaultModel?: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
logPrefix?: string;
|
|
8
|
+
noServerMessage?: string;
|
|
9
|
+
}
|
|
2
10
|
export declare class LocalModelAdapter implements CliAdapter {
|
|
3
|
-
readonly name
|
|
11
|
+
readonly name: string;
|
|
4
12
|
readonly capabilities: AdapterCapabilities;
|
|
5
13
|
private activeUrl;
|
|
6
14
|
private configuredUrl;
|
|
15
|
+
private readonly endpoints;
|
|
16
|
+
private readonly defaultModel;
|
|
17
|
+
private readonly apiKey?;
|
|
18
|
+
private readonly logPrefix;
|
|
19
|
+
private readonly noServerMessage;
|
|
20
|
+
constructor(options?: LocalModelAdapterOptions);
|
|
7
21
|
/** config.yaml에서 baseUrl을 주입받을 때 사용 */
|
|
8
22
|
setBaseUrl(url: string): void;
|
|
9
23
|
isAvailable(): Promise<boolean>;
|
|
@@ -25,6 +39,7 @@ export declare class LocalModelAdapter implements CliAdapter {
|
|
|
25
39
|
* 로컬 API 호출 함수 생성 (에이전틱 루프에 주입)
|
|
26
40
|
*/
|
|
27
41
|
private createApiCaller;
|
|
42
|
+
private buildHeaders;
|
|
28
43
|
parseWorkerOutput(raw: CliRunResult): WorkerResult;
|
|
29
44
|
parseReviewerOutput(raw: CliRunResult): ReviewResult;
|
|
30
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,UAAU;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAGF,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,GAAE,wBAA6B;IASlD,uCAAuC;IACvC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC,6BAA6B;IAC7B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,sBAAsB;IAChB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkExD;;;OAGG;YACW,gBAAgB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,YAAY;IAQpB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAGrD"}
|
package/dist/adapters/local.js
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
// Created: 2026-04-10
|
|
4
4
|
// Purpose: Ollama, LMStudio, llama.cpp 등 로컬 OpenAI 호환 서버 지원
|
|
5
5
|
// ============================================
|
|
6
|
-
import { t } from '../locale/index.js';
|
|
7
6
|
import { runAgenticLoop, loopResultToCliResult } from './agenticLoop.js';
|
|
7
|
+
import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
|
|
8
|
+
import { consumeChatCompletionsStream } from './chatStream.js';
|
|
8
9
|
// 로컬 프로바이더 기본 URL 후보 (우선순위 순)
|
|
9
10
|
const DEFAULT_ENDPOINTS = [
|
|
10
11
|
'http://localhost:11434', // Ollama
|
|
@@ -14,7 +15,7 @@ const DEFAULT_ENDPOINTS = [
|
|
|
14
15
|
const DEFAULT_MODEL = 'gemma3:4b';
|
|
15
16
|
const HEALTH_CHECK_TIMEOUT_MS = 2000;
|
|
16
17
|
export class LocalModelAdapter {
|
|
17
|
-
name
|
|
18
|
+
name;
|
|
18
19
|
capabilities = {
|
|
19
20
|
supportsStreaming: false,
|
|
20
21
|
supportsJsonOutput: true,
|
|
@@ -25,17 +26,31 @@ export class LocalModelAdapter {
|
|
|
25
26
|
// 활성 서버 URL (isAvailable에서 감지, run에서 사용)
|
|
26
27
|
activeUrl = null;
|
|
27
28
|
configuredUrl = null;
|
|
29
|
+
endpoints;
|
|
30
|
+
defaultModel;
|
|
31
|
+
apiKey;
|
|
32
|
+
logPrefix;
|
|
33
|
+
noServerMessage;
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.name = options.name ?? 'local';
|
|
36
|
+
this.endpoints = options.endpoints ?? DEFAULT_ENDPOINTS;
|
|
37
|
+
this.defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
38
|
+
this.apiKey = options.apiKey;
|
|
39
|
+
this.logPrefix = options.logPrefix ?? 'Local';
|
|
40
|
+
this.noServerMessage = options.noServerMessage ?? 'No local model server found. Start Ollama, LMStudio, or llama.cpp server first.';
|
|
41
|
+
}
|
|
28
42
|
/** config.yaml에서 baseUrl을 주입받을 때 사용 */
|
|
29
43
|
setBaseUrl(url) {
|
|
30
44
|
this.configuredUrl = url;
|
|
31
45
|
}
|
|
32
46
|
async isAvailable() {
|
|
33
47
|
const candidates = this.configuredUrl
|
|
34
|
-
? [this.configuredUrl, ...
|
|
35
|
-
:
|
|
48
|
+
? [this.configuredUrl, ...this.endpoints]
|
|
49
|
+
: this.endpoints;
|
|
36
50
|
for (const url of candidates) {
|
|
37
51
|
try {
|
|
38
52
|
const res = await fetch(`${url}/v1/models`, {
|
|
53
|
+
headers: this.buildHeaders(),
|
|
39
54
|
signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),
|
|
40
55
|
});
|
|
41
56
|
if (res.ok) {
|
|
@@ -62,6 +77,7 @@ export class LocalModelAdapter {
|
|
|
62
77
|
}
|
|
63
78
|
try {
|
|
64
79
|
const res = await fetch(`${this.activeUrl}/v1/models`, {
|
|
80
|
+
headers: this.buildHeaders(),
|
|
65
81
|
signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),
|
|
66
82
|
});
|
|
67
83
|
if (!res.ok)
|
|
@@ -85,18 +101,18 @@ export class LocalModelAdapter {
|
|
|
85
101
|
return {
|
|
86
102
|
exitCode: 1,
|
|
87
103
|
stdout: '',
|
|
88
|
-
stderr:
|
|
89
|
-
`Checked: ${(this.configuredUrl ? [this.configuredUrl, ...
|
|
104
|
+
stderr: `${this.noServerMessage}\n` +
|
|
105
|
+
`Checked: ${(this.configuredUrl ? [this.configuredUrl, ...this.endpoints] : this.endpoints).join(', ')}`,
|
|
90
106
|
durationMs: Date.now() - startTime,
|
|
91
107
|
};
|
|
92
108
|
}
|
|
93
109
|
}
|
|
94
|
-
const model = options.model ??
|
|
110
|
+
const model = options.model ?? this.defaultModel;
|
|
95
111
|
const baseUrl = this.activeUrl;
|
|
96
112
|
// 도구 지원 여부 감지 (모델에 따라 다를 수 있음)
|
|
97
113
|
const supportsTools = await this.checkToolSupport(baseUrl, model);
|
|
98
114
|
// 에이전틱 루프로 실행
|
|
99
|
-
const callApi = this.createApiCaller(baseUrl, model);
|
|
115
|
+
const callApi = this.createApiCaller(baseUrl, model, options.onToken, options.signal);
|
|
100
116
|
const loopOptions = {
|
|
101
117
|
systemPrompt: options.systemPrompt,
|
|
102
118
|
prompt: options.prompt,
|
|
@@ -106,13 +122,19 @@ export class LocalModelAdapter {
|
|
|
106
122
|
maxTurns: options.maxTurns ?? 15,
|
|
107
123
|
timeoutMs: options.timeoutMs || 300000,
|
|
108
124
|
onLog: options.onLog,
|
|
109
|
-
enableTools: supportsTools,
|
|
125
|
+
enableTools: (options.enableTools ?? true) && supportsTools,
|
|
126
|
+
nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
|
|
127
|
+
protectedFiles: options.protectedFiles,
|
|
128
|
+
bashTimeoutMs: options.bashTimeoutMs,
|
|
129
|
+
webTools: options.webTools,
|
|
130
|
+
mcpTools: options.mcpTools,
|
|
131
|
+
signal: options.signal,
|
|
110
132
|
};
|
|
111
133
|
try {
|
|
112
134
|
const result = await runAgenticLoop(loopOptions);
|
|
113
135
|
if (options.onLog) {
|
|
114
136
|
const toolInfo = supportsTools ? `${result.toolCallCount} tool uses` : 'no tools';
|
|
115
|
-
options.onLog(`[
|
|
137
|
+
options.onLog(`[${this.logPrefix}] ${result.apiCallCount} API calls, ${toolInfo}, ${result.totalTokens} tokens`);
|
|
116
138
|
}
|
|
117
139
|
return loopResultToCliResult(result);
|
|
118
140
|
}
|
|
@@ -152,7 +174,7 @@ export class LocalModelAdapter {
|
|
|
152
174
|
try {
|
|
153
175
|
const res = await fetch(`${baseUrl}/v1/chat/completions`, {
|
|
154
176
|
method: 'POST',
|
|
155
|
-
headers:
|
|
177
|
+
headers: this.buildHeaders(),
|
|
156
178
|
body: JSON.stringify({
|
|
157
179
|
model,
|
|
158
180
|
messages: [{ role: 'user', content: 'hi' }],
|
|
@@ -171,21 +193,23 @@ export class LocalModelAdapter {
|
|
|
171
193
|
/**
|
|
172
194
|
* 로컬 API 호출 함수 생성 (에이전틱 루프에 주입)
|
|
173
195
|
*/
|
|
174
|
-
createApiCaller(baseUrl, model) {
|
|
196
|
+
createApiCaller(baseUrl, model, onToken, signal) {
|
|
175
197
|
return async (messages, tools) => {
|
|
176
198
|
const body = {
|
|
177
199
|
model,
|
|
178
200
|
messages,
|
|
179
201
|
temperature: 0.2,
|
|
180
|
-
stream:
|
|
202
|
+
stream: true,
|
|
203
|
+
stream_options: { include_usage: true },
|
|
181
204
|
};
|
|
182
205
|
if (tools.length > 0) {
|
|
183
206
|
body.tools = tools;
|
|
184
207
|
}
|
|
185
208
|
const res = await fetch(`${baseUrl}/v1/chat/completions`, {
|
|
186
209
|
method: 'POST',
|
|
187
|
-
headers:
|
|
210
|
+
headers: this.buildHeaders(),
|
|
188
211
|
body: JSON.stringify(body),
|
|
212
|
+
signal,
|
|
189
213
|
});
|
|
190
214
|
if (!res.ok) {
|
|
191
215
|
const errText = await res.text().catch(() => '');
|
|
@@ -198,124 +222,24 @@ export class LocalModelAdapter {
|
|
|
198
222
|
}
|
|
199
223
|
throw new Error(`Local API error (${res.status}): ${errText.slice(0, 500)}`);
|
|
200
224
|
}
|
|
201
|
-
return (
|
|
225
|
+
return consumeChatCompletionsStream(res, onToken);
|
|
202
226
|
};
|
|
203
227
|
}
|
|
228
|
+
buildHeaders() {
|
|
229
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
230
|
+
if (this.apiKey) {
|
|
231
|
+
headers.Authorization = `Bearer ${this.apiKey}`;
|
|
232
|
+
}
|
|
233
|
+
return headers;
|
|
234
|
+
}
|
|
204
235
|
parseWorkerOutput(raw) {
|
|
205
|
-
|
|
206
|
-
return extractWorkerResultJson(text) ?? extractWorkerFromText(text);
|
|
236
|
+
return parseWorkerResult(raw.stdout);
|
|
207
237
|
}
|
|
208
238
|
parseReviewerOutput(raw) {
|
|
209
|
-
|
|
210
|
-
return extractReviewerResultJson(text) ?? extractReviewerFromText(text);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Worker/Reviewer 출력 파싱 (GPT 어댑터와 동일 로직)
|
|
214
|
-
function extractWorkerResultJson(text) {
|
|
215
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
216
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"success"');
|
|
217
|
-
if (!jsonStr)
|
|
218
|
-
return null;
|
|
219
|
-
try {
|
|
220
|
-
const parsed = JSON.parse(jsonStr);
|
|
221
|
-
return {
|
|
222
|
-
success: Boolean(parsed.success),
|
|
223
|
-
summary: parsed.summary || t('common.fallback.noSummary'),
|
|
224
|
-
filesChanged: Array.isArray(parsed.filesChanged) ? parsed.filesChanged : [],
|
|
225
|
-
commands: Array.isArray(parsed.commands) ? parsed.commands : [],
|
|
226
|
-
output: text,
|
|
227
|
-
error: parsed.error,
|
|
228
|
-
confidencePercent: typeof parsed.confidencePercent === 'number'
|
|
229
|
-
? parsed.confidencePercent : undefined,
|
|
230
|
-
haltReason: parsed.haltReason || undefined,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
function extractWorkerFromText(text) {
|
|
238
|
-
const hasError = /error|fail|exception|cannot/i.test(text);
|
|
239
|
-
const hasSuccess = /success|completed|done|finished/i.test(text);
|
|
240
|
-
return {
|
|
241
|
-
success: !hasError || hasSuccess,
|
|
242
|
-
summary: extractSummary(text),
|
|
243
|
-
filesChanged: [],
|
|
244
|
-
commands: [],
|
|
245
|
-
output: text,
|
|
246
|
-
error: hasError ? extractErrorMessage(text) : undefined,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
function extractReviewerResultJson(text) {
|
|
250
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
251
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"decision"');
|
|
252
|
-
if (!jsonStr)
|
|
253
|
-
return null;
|
|
254
|
-
try {
|
|
255
|
-
const parsed = JSON.parse(jsonStr);
|
|
256
|
-
const decision = parsed.decision === 'approve' || parsed.decision === 'reject'
|
|
257
|
-
? parsed.decision
|
|
258
|
-
: 'revise';
|
|
259
|
-
return {
|
|
260
|
-
decision,
|
|
261
|
-
feedback: typeof parsed.feedback === 'string' ? parsed.feedback : t('common.fallback.noSummary'),
|
|
262
|
-
issues: Array.isArray(parsed.issues)
|
|
263
|
-
? parsed.issues.filter((v) => typeof v === 'string')
|
|
264
|
-
: [],
|
|
265
|
-
suggestions: Array.isArray(parsed.suggestions)
|
|
266
|
-
? parsed.suggestions.filter((v) => typeof v === 'string')
|
|
267
|
-
: [],
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
return null;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
function extractReviewerFromText(text) {
|
|
275
|
-
const lower = text.toLowerCase();
|
|
276
|
-
const decision = lower.includes('approve')
|
|
277
|
-
? 'approve'
|
|
278
|
-
: lower.includes('reject')
|
|
279
|
-
? 'reject'
|
|
280
|
-
: 'revise';
|
|
281
|
-
return {
|
|
282
|
-
decision,
|
|
283
|
-
feedback: extractSummary(text),
|
|
284
|
-
issues: [],
|
|
285
|
-
suggestions: [],
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
function findJsonObject(text, marker) {
|
|
289
|
-
const idx = text.indexOf(marker);
|
|
290
|
-
if (idx < 0)
|
|
291
|
-
return null;
|
|
292
|
-
let start = text.lastIndexOf('{', idx);
|
|
293
|
-
if (start < 0)
|
|
294
|
-
return null;
|
|
295
|
-
let depth = 0;
|
|
296
|
-
for (let i = start; i < text.length; i++) {
|
|
297
|
-
if (text[i] === '{')
|
|
298
|
-
depth++;
|
|
299
|
-
if (text[i] === '}') {
|
|
300
|
-
depth--;
|
|
301
|
-
if (depth === 0)
|
|
302
|
-
return text.slice(start, i + 1);
|
|
303
|
-
}
|
|
239
|
+
return parseReviewerResult(raw.stdout);
|
|
304
240
|
}
|
|
305
|
-
return null;
|
|
306
|
-
}
|
|
307
|
-
function extractSummary(text) {
|
|
308
|
-
const lines = text.split('\n').filter(l => l.trim().length > 10);
|
|
309
|
-
if (lines.length === 0)
|
|
310
|
-
return t('common.fallback.noSummary');
|
|
311
|
-
const summary = lines[0].trim();
|
|
312
|
-
return summary.length > 200 ? `${summary.slice(0, 200)}...` : summary;
|
|
313
|
-
}
|
|
314
|
-
function extractErrorMessage(text) {
|
|
315
|
-
const errorMatch = text.match(/(?:error|exception|failed?):\s*(.+)/i);
|
|
316
|
-
if (errorMatch)
|
|
317
|
-
return errorMatch[1].slice(0, 200);
|
|
318
|
-
const lines = text.split('\n').filter(l => /error|fail/i.test(l));
|
|
319
|
-
return lines.length > 0 ? lines[0].slice(0, 200) : 'Unknown error';
|
|
320
241
|
}
|
|
242
|
+
// Streamed chat/completions responses are parsed by consumeChatCompletionsStream.
|
|
243
|
+
// Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
|
|
244
|
+
// gpt, openrouter, and codex adapters — INT-1441).
|
|
321
245
|
//# sourceMappingURL=local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/adapters/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
export interface ApiCallerOptions {
|
|
17
|
+
/** worker 등 기계적 역할: 추론 토큰 비활성화 (지원 모델 한정) */
|
|
18
|
+
disableReasoning?: boolean;
|
|
19
|
+
/** 스트리밍 토큰 콜백 (chat TUI). 없으면 비스트리밍과 동일하게 동작. */
|
|
20
|
+
onToken?: (delta: string) => void;
|
|
21
|
+
/** 사용자 중단(Esc/Ctrl+C) — fetch에 전달. */
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}
|
|
24
|
+
export declare function createApiCaller(apiKey: string, model: string, opts?: ApiCallerOptions): (messages: ChatMessage[], tools: ToolDefinition[]) => Promise<import("./chatStream.js").ChatCompletionLike>;
|
|
25
|
+
/**
|
|
26
|
+
* Prompt caching breakpoint 삽입.
|
|
27
|
+
*
|
|
28
|
+
* OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
|
|
29
|
+
* Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
|
|
30
|
+
* 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
|
|
31
|
+
* 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
|
|
32
|
+
*
|
|
33
|
+
* breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
|
|
34
|
+
* Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyPromptCaching(messages: ChatMessage[], model: string): unknown[];
|
|
37
|
+
//# 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;AAEpB,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAG1B,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;IA4DxD,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAGrD;AAKD,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sCAAsC;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,IAC1E,UAAU,WAAW,EAAE,EAAE,OAAO,cAAc,EAAE,2DA8C/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBpF"}
|
|
@@ -0,0 +1,193 @@
|
|
|
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 { runAgenticLoop, loopResultToCliResult, } from './agenticLoop.js';
|
|
8
|
+
import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
|
|
9
|
+
import { consumeChatCompletionsStream } from './chatStream.js';
|
|
10
|
+
const OPENROUTER_API_BASE = 'https://openrouter.ai/api/v1';
|
|
11
|
+
const DEFAULT_MODEL = 'openai/gpt-5';
|
|
12
|
+
const PROFILE_KEY = 'openrouter:default';
|
|
13
|
+
/** OPENROUTER_API_KEY env var (legacy: OPENROUTER_API) → immediate API key (no PKCE needed). */
|
|
14
|
+
function getEnvApiKey() {
|
|
15
|
+
return process.env.OPENROUTER_API_KEY?.trim() || process.env.OPENROUTER_API?.trim() || undefined;
|
|
16
|
+
}
|
|
17
|
+
// Attribution headers — OpenRouter surfaces these in its analytics UI so
|
|
18
|
+
// model providers can see traffic originating from OpenSwarm.
|
|
19
|
+
const ATTRIBUTION_HEADERS = {
|
|
20
|
+
'HTTP-Referer': 'https://github.com/unohee/openswarm',
|
|
21
|
+
'X-Title': 'OpenSwarm',
|
|
22
|
+
};
|
|
23
|
+
export class OpenRouterCliAdapter {
|
|
24
|
+
name = 'openrouter';
|
|
25
|
+
capabilities = {
|
|
26
|
+
supportsStreaming: false,
|
|
27
|
+
supportsJsonOutput: true,
|
|
28
|
+
supportsModelSelection: true,
|
|
29
|
+
managedGit: false,
|
|
30
|
+
supportedSkills: [],
|
|
31
|
+
};
|
|
32
|
+
async isAvailable() {
|
|
33
|
+
if (getEnvApiKey())
|
|
34
|
+
return true;
|
|
35
|
+
try {
|
|
36
|
+
const store = new AuthProfileStore();
|
|
37
|
+
return store.getProfile(PROFILE_KEY) !== null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
buildCommand(_options) {
|
|
44
|
+
// 어댑터가 직접 fetch하므로 spawn 진입점은 미사용.
|
|
45
|
+
return { command: 'echo', args: ['"OpenRouter adapter uses run() — not shell spawn"'] };
|
|
46
|
+
}
|
|
47
|
+
async run(options) {
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
// Prefer OPENROUTER_API_KEY env var (auto-loaded from .env by the CLI entrypoint)
|
|
50
|
+
let apiKey = getEnvApiKey();
|
|
51
|
+
if (!apiKey) {
|
|
52
|
+
const store = new AuthProfileStore();
|
|
53
|
+
try {
|
|
54
|
+
apiKey = await ensureValidToken(store, PROFILE_KEY);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return {
|
|
58
|
+
exitCode: 1,
|
|
59
|
+
stdout: '',
|
|
60
|
+
stderr: `Auth error: ${err instanceof Error ? err.message : String(err)}. Set OPENROUTER_API_KEY env var or run: openswarm auth login --provider openrouter`,
|
|
61
|
+
durationMs: Date.now() - startTime,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const model = options.model ?? DEFAULT_MODEL;
|
|
66
|
+
const callApi = createApiCaller(apiKey, model, {
|
|
67
|
+
disableReasoning: options.disableReasoning,
|
|
68
|
+
onToken: options.onToken,
|
|
69
|
+
signal: options.signal,
|
|
70
|
+
});
|
|
71
|
+
const loopOptions = {
|
|
72
|
+
systemPrompt: options.systemPrompt,
|
|
73
|
+
prompt: options.prompt,
|
|
74
|
+
cwd: options.cwd ?? process.cwd(),
|
|
75
|
+
model,
|
|
76
|
+
callApi,
|
|
77
|
+
maxTurns: options.maxTurns ?? 20,
|
|
78
|
+
timeoutMs: options.timeoutMs || 300000,
|
|
79
|
+
onLog: options.onLog,
|
|
80
|
+
enableTools: options.enableTools ?? true,
|
|
81
|
+
nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
|
|
82
|
+
protectedFiles: options.protectedFiles,
|
|
83
|
+
bashTimeoutMs: options.bashTimeoutMs,
|
|
84
|
+
webTools: options.webTools,
|
|
85
|
+
mcpTools: options.mcpTools,
|
|
86
|
+
signal: options.signal,
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
const result = await runAgenticLoop(loopOptions);
|
|
90
|
+
options.onLog?.(`[OpenRouter] ${result.apiCallCount} API calls, ${result.toolCallCount} tool uses, ${result.totalTokens} tokens`);
|
|
91
|
+
return loopResultToCliResult(result);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return {
|
|
95
|
+
exitCode: 1,
|
|
96
|
+
stdout: '',
|
|
97
|
+
stderr: `OpenRouter agentic loop failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
+
durationMs: Date.now() - startTime,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
parseWorkerOutput(raw) {
|
|
103
|
+
return parseWorkerResult(raw.stdout);
|
|
104
|
+
}
|
|
105
|
+
parseReviewerOutput(raw) {
|
|
106
|
+
return parseReviewerResult(raw.stdout);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function createApiCaller(apiKey, model, opts = {}) {
|
|
110
|
+
return async (messages, tools) => {
|
|
111
|
+
const body = {
|
|
112
|
+
model,
|
|
113
|
+
messages: applyPromptCaching(messages, model),
|
|
114
|
+
temperature: 0.2,
|
|
115
|
+
max_tokens: 16384,
|
|
116
|
+
stream: true,
|
|
117
|
+
stream_options: { include_usage: true },
|
|
118
|
+
};
|
|
119
|
+
// ZDR(Zero Data Retention) — 데이터를 보존하지 않는 provider로만 라우팅.
|
|
120
|
+
// 단, OpenAI provider는 data_collection:deny 플래그를 거부("Provider returned
|
|
121
|
+
// error")하므로 제외한다. OpenAI는 API 데이터를 학습에 쓰지 않아(정책상) ZDR
|
|
122
|
+
// 강제가 불필요하다. non-OpenAI 모델에만 적용한다.
|
|
123
|
+
if (!/^openai\//i.test(model)) {
|
|
124
|
+
body.provider = { data_collection: 'deny' };
|
|
125
|
+
}
|
|
126
|
+
// 추론 불필요 역할은 reasoning 토큰을 끈다. glm-4.7-flash처럼 non-thinking
|
|
127
|
+
// 모델엔 무영향, 추론형 모델(glm-5 등)을 worker로 바꿔도 토큰 낭비를 막는다.
|
|
128
|
+
// 단, OpenAI 추론 모델(gpt-5 등)은 "Reasoning is mandatory"로 이 플래그를
|
|
129
|
+
// 거부하므로 제외한다 — worker escalate 대상이 gpt-5라 이걸 안 빼면 escalation이
|
|
130
|
+
// 항상 깨진다. OpenAI는 단순 작업엔 추론을 자동 최소화하므로 끌 필요도 없다.
|
|
131
|
+
if (opts.disableReasoning && !/^openai\//i.test(model)) {
|
|
132
|
+
body.reasoning = { enabled: false };
|
|
133
|
+
}
|
|
134
|
+
if (tools.length > 0) {
|
|
135
|
+
body.tools = tools;
|
|
136
|
+
}
|
|
137
|
+
const res = await fetch(`${OPENROUTER_API_BASE}/chat/completions`, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: {
|
|
140
|
+
Authorization: `Bearer ${apiKey}`,
|
|
141
|
+
'Content-Type': 'application/json',
|
|
142
|
+
...ATTRIBUTION_HEADERS,
|
|
143
|
+
},
|
|
144
|
+
body: JSON.stringify(body),
|
|
145
|
+
signal: opts.signal,
|
|
146
|
+
});
|
|
147
|
+
if (!res.ok) {
|
|
148
|
+
const errText = await res.text().catch(() => '');
|
|
149
|
+
throw new Error(`OpenRouter API error (${res.status}): ${errText.slice(0, 500)}`);
|
|
150
|
+
}
|
|
151
|
+
return consumeChatCompletionsStream(res, opts.onToken);
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Prompt caching breakpoint 삽입.
|
|
156
|
+
*
|
|
157
|
+
* OpenAI/Gemini 모델은 OpenRouter가 자동 캐싱하므로 메시지를 건드리지 않는다.
|
|
158
|
+
* Anthropic 모델은 명시적 cache_control breakpoint가 필요하다 — 매 API 호출마다
|
|
159
|
+
* 전체 히스토리가 재전송되는데, 시스템 프롬프트 + 직전 누적 히스토리는 턴마다
|
|
160
|
+
* 거의 동일하므로 그 경계에 ephemeral 캐시 마커를 두면 입력 토큰이 ~90% 할인된다.
|
|
161
|
+
*
|
|
162
|
+
* breakpoint 2개: (1) 시스템 메시지 끝, (2) 마지막 user/tool 메시지 직전 경계.
|
|
163
|
+
* Anthropic은 최대 4개 breakpoint를 허용하므로 2개는 안전하다.
|
|
164
|
+
*/
|
|
165
|
+
export function applyPromptCaching(messages, model) {
|
|
166
|
+
// OpenAI/Gemini 등은 자동 캐싱 — 변환 불필요 (cache_control을 넣으면 거부될 수 있음)
|
|
167
|
+
if (!/anthropic\/|claude/i.test(model)) {
|
|
168
|
+
return messages;
|
|
169
|
+
}
|
|
170
|
+
// 캐시 마커를 달 인덱스: 시스템 메시지(있으면) + 마지막 직전 메시지.
|
|
171
|
+
// 마지막 메시지(가장 최근 tool 결과)는 매 턴 바뀌므로 캐시하지 않는다.
|
|
172
|
+
const cacheable = new Set();
|
|
173
|
+
if (messages[0]?.role === 'system')
|
|
174
|
+
cacheable.add(0);
|
|
175
|
+
if (messages.length >= 2)
|
|
176
|
+
cacheable.add(messages.length - 2);
|
|
177
|
+
return messages.map((m, i) => {
|
|
178
|
+
if (!cacheable.has(i) || typeof m.content !== 'string' || !m.content) {
|
|
179
|
+
return m;
|
|
180
|
+
}
|
|
181
|
+
// string content → content-part 배열로 변환하며 마지막 파트에 cache_control 부착
|
|
182
|
+
return {
|
|
183
|
+
...m,
|
|
184
|
+
content: [
|
|
185
|
+
{ type: 'text', text: m.content, cache_control: { type: 'ephemeral' } },
|
|
186
|
+
],
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// ----- Worker/Reviewer output parsing (mirrors gpt.ts) -----
|
|
191
|
+
// Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
|
|
192
|
+
// gpt, local, and codex adapters — INT-1441).
|
|
193
|
+
//# sourceMappingURL=openrouter.js.map
|