nexus-agents 2.73.0 → 2.75.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/dist/{adaptive-memory-UPE76IP6.js → adaptive-memory-OJY3IVNM.js} +3 -3
- package/dist/{child-mcp-config-5HRJGLCR.js → child-mcp-config-KMCKKPNY.js} +2 -2
- package/dist/{chunk-TF3GROMO.js → chunk-2SVS5WRV.js} +2 -2
- package/dist/{chunk-QECRZ3YA.js → chunk-3ESCBV47.js} +2 -2
- package/dist/{chunk-QL4HCYRD.js → chunk-3SZBDLFX.js} +3 -3
- package/dist/{chunk-VTVKC4FS.js → chunk-44MVIL3F.js} +4 -4
- package/dist/{chunk-BVETPIOQ.js → chunk-4K6L7RKC.js} +3 -3
- package/dist/chunk-4K6L7RKC.js.map +1 -0
- package/dist/{chunk-3FIDMWFC.js → chunk-BK54O5J5.js} +2 -2
- package/dist/chunk-BK54O5J5.js.map +1 -0
- package/dist/{chunk-L6N2S3UB.js → chunk-CCODJRS6.js} +2 -2
- package/dist/{chunk-DA5UDQYW.js → chunk-DGELGUZF.js} +2 -2
- package/dist/{chunk-2KB63QGE.js → chunk-EQHYXT56.js} +2 -2
- package/dist/{chunk-O725DS7Y.js → chunk-G5NSRX6Z.js} +1183 -1547
- package/dist/chunk-G5NSRX6Z.js.map +1 -0
- package/dist/{chunk-VPC3YNFR.js → chunk-G5VE2DZS.js} +2 -2
- package/dist/{chunk-2MD5MWCK.js → chunk-GS3GW7C7.js} +2 -2
- package/dist/{chunk-RPEOQYTO.js → chunk-JK3DIVQT.js} +4 -4
- package/dist/{chunk-ES6GFP35.js → chunk-NC2LECY6.js} +26 -9
- package/dist/chunk-NC2LECY6.js.map +1 -0
- package/dist/{chunk-5MHIWRKB.js → chunk-NQR7QAZX.js} +21 -2
- package/dist/chunk-NQR7QAZX.js.map +1 -0
- package/dist/{chunk-5WQ3SRSE.js → chunk-PAFH336F.js} +2 -2
- package/dist/{chunk-O4KUCF5S.js → chunk-Q3RFPJYK.js} +1325 -441
- package/dist/chunk-Q3RFPJYK.js.map +1 -0
- package/dist/{chunk-P5OFZWDW.js → chunk-Q6JDV36D.js} +13 -6
- package/dist/chunk-Q6JDV36D.js.map +1 -0
- package/dist/{chunk-A35XORXU.js → chunk-Q7FTNKPO.js} +2 -2
- package/dist/{chunk-JUM52GVN.js → chunk-QCKKDUNX.js} +11 -188
- package/dist/chunk-QCKKDUNX.js.map +1 -0
- package/dist/chunk-QON7LR7J.js +153 -0
- package/dist/chunk-QON7LR7J.js.map +1 -0
- package/dist/{chunk-53K3KEKT.js → chunk-T5VPZZYX.js} +1564 -848
- package/dist/chunk-T5VPZZYX.js.map +1 -0
- package/dist/{chunk-TQFRPFMG.js → chunk-TBRNRW2Q.js} +2 -2
- package/dist/{chunk-345KMHWH.js → chunk-UWJKMBPL.js} +6 -6
- package/dist/{chunk-V7ATY4BG.js → chunk-VJD5LANR.js} +14 -16
- package/dist/chunk-VJD5LANR.js.map +1 -0
- package/dist/{cli-circuit-breaker-GFF2RLBZ.js → cli-circuit-breaker-STXIH563.js} +4 -4
- package/dist/cli.d.ts +5 -2
- package/dist/cli.js +138 -106
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-33F3F74I.js → composite-router-7AHZN3VI.js} +2 -2
- package/dist/{consensus-vote-5V4KVHBE.js → consensus-vote-XY55C7WQ.js} +11 -10
- package/dist/consensus-vote-types-CoGbAEjf.d.ts +195 -0
- package/dist/{doctor-deep-AHDTNURD.js → doctor-deep-ONHJTGR4.js} +3 -3
- package/dist/{expert-bridge-DMDHHDEU.js → expert-bridge-3AWQHR65.js} +3 -3
- package/dist/{factory-FVD7PZ6S.js → factory-E5NMAMZC.js} +5 -5
- package/dist/{factory-VQS3HJ7V.js → factory-HWHQ44BB.js} +4 -4
- package/dist/index.d.ts +4086 -3696
- package/dist/index.js +85 -73
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-EIOIPVWL.js → init-opencode-Z7OQ5RCB.js} +5 -5
- package/dist/{issue-triage-HJUJWGAD.js → issue-triage-UWBHMQHC.js} +4 -4
- package/dist/{mobimem-BOJFXQ7B.js → mobimem-G4UXJTCV.js} +2 -2
- package/dist/{registry-command-NCWUJKAF.js → registry-command-HYWVRAHE.js} +5 -6
- package/dist/registry-command-HYWVRAHE.js.map +1 -0
- package/dist/{repo-security-plan-3J45VAD6.js → repo-security-plan-W35CXK3T.js} +3 -3
- package/dist/{research-helpers-synthesize-UGQHZZJN.js → research-helpers-synthesize-GUQORWL4.js} +3 -3
- package/dist/{routing-memory-NO7QEH7T.js → routing-memory-VOJBOX3X.js} +2 -2
- package/dist/{session-memory-DOXLEWEU.js → session-memory-B6LQMF4N.js} +3 -3
- package/dist/{setup-command-PLZIEFY5.js → setup-command-S2XCW7K5.js} +9 -8
- package/dist/{setup-config-E3JZYSLR.js → setup-config-53MHJA7S.js} +3 -3
- package/dist/{setup-custom-api-DHJ5DRH2.js → setup-custom-api-VD5W754A.js} +4 -4
- package/dist/{weather-report-FNN4OX3N.js → weather-report-APASTJDQ.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-3FIDMWFC.js.map +0 -1
- package/dist/chunk-53K3KEKT.js.map +0 -1
- package/dist/chunk-5MHIWRKB.js.map +0 -1
- package/dist/chunk-BVETPIOQ.js.map +0 -1
- package/dist/chunk-ES6GFP35.js.map +0 -1
- package/dist/chunk-JUM52GVN.js.map +0 -1
- package/dist/chunk-O4KUCF5S.js.map +0 -1
- package/dist/chunk-O725DS7Y.js.map +0 -1
- package/dist/chunk-P5OFZWDW.js.map +0 -1
- package/dist/chunk-V7ATY4BG.js.map +0 -1
- package/dist/model-capabilities-types-B57GZryc.d.ts +0 -18
- package/dist/registry-command-NCWUJKAF.js.map +0 -1
- /package/dist/{adaptive-memory-UPE76IP6.js.map → adaptive-memory-OJY3IVNM.js.map} +0 -0
- /package/dist/{child-mcp-config-5HRJGLCR.js.map → child-mcp-config-KMCKKPNY.js.map} +0 -0
- /package/dist/{chunk-TF3GROMO.js.map → chunk-2SVS5WRV.js.map} +0 -0
- /package/dist/{chunk-QECRZ3YA.js.map → chunk-3ESCBV47.js.map} +0 -0
- /package/dist/{chunk-QL4HCYRD.js.map → chunk-3SZBDLFX.js.map} +0 -0
- /package/dist/{chunk-VTVKC4FS.js.map → chunk-44MVIL3F.js.map} +0 -0
- /package/dist/{chunk-L6N2S3UB.js.map → chunk-CCODJRS6.js.map} +0 -0
- /package/dist/{chunk-DA5UDQYW.js.map → chunk-DGELGUZF.js.map} +0 -0
- /package/dist/{chunk-2KB63QGE.js.map → chunk-EQHYXT56.js.map} +0 -0
- /package/dist/{chunk-VPC3YNFR.js.map → chunk-G5VE2DZS.js.map} +0 -0
- /package/dist/{chunk-2MD5MWCK.js.map → chunk-GS3GW7C7.js.map} +0 -0
- /package/dist/{chunk-RPEOQYTO.js.map → chunk-JK3DIVQT.js.map} +0 -0
- /package/dist/{chunk-5WQ3SRSE.js.map → chunk-PAFH336F.js.map} +0 -0
- /package/dist/{chunk-A35XORXU.js.map → chunk-Q7FTNKPO.js.map} +0 -0
- /package/dist/{chunk-TQFRPFMG.js.map → chunk-TBRNRW2Q.js.map} +0 -0
- /package/dist/{chunk-345KMHWH.js.map → chunk-UWJKMBPL.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-GFF2RLBZ.js.map → cli-circuit-breaker-STXIH563.js.map} +0 -0
- /package/dist/{composite-router-33F3F74I.js.map → composite-router-7AHZN3VI.js.map} +0 -0
- /package/dist/{consensus-vote-5V4KVHBE.js.map → consensus-vote-XY55C7WQ.js.map} +0 -0
- /package/dist/{doctor-deep-AHDTNURD.js.map → doctor-deep-ONHJTGR4.js.map} +0 -0
- /package/dist/{expert-bridge-DMDHHDEU.js.map → expert-bridge-3AWQHR65.js.map} +0 -0
- /package/dist/{factory-FVD7PZ6S.js.map → factory-E5NMAMZC.js.map} +0 -0
- /package/dist/{factory-VQS3HJ7V.js.map → factory-HWHQ44BB.js.map} +0 -0
- /package/dist/{init-opencode-EIOIPVWL.js.map → init-opencode-Z7OQ5RCB.js.map} +0 -0
- /package/dist/{issue-triage-HJUJWGAD.js.map → issue-triage-UWBHMQHC.js.map} +0 -0
- /package/dist/{mobimem-BOJFXQ7B.js.map → mobimem-G4UXJTCV.js.map} +0 -0
- /package/dist/{repo-security-plan-3J45VAD6.js.map → repo-security-plan-W35CXK3T.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-UGQHZZJN.js.map → research-helpers-synthesize-GUQORWL4.js.map} +0 -0
- /package/dist/{routing-memory-NO7QEH7T.js.map → routing-memory-VOJBOX3X.js.map} +0 -0
- /package/dist/{session-memory-DOXLEWEU.js.map → session-memory-B6LQMF4N.js.map} +0 -0
- /package/dist/{setup-command-PLZIEFY5.js.map → setup-command-S2XCW7K5.js.map} +0 -0
- /package/dist/{setup-config-E3JZYSLR.js.map → setup-config-53MHJA7S.js.map} +0 -0
- /package/dist/{setup-custom-api-DHJ5DRH2.js.map → setup-custom-api-VD5W754A.js.map} +0 -0
- /package/dist/{weather-report-FNN4OX3N.js.map → weather-report-APASTJDQ.js.map} +0 -0
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
AdaptiveMemoryBackend,
|
|
3
3
|
DEFAULT_SCORING_CONFIG,
|
|
4
4
|
createAdaptiveMemory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3ESCBV47.js";
|
|
6
6
|
import "./chunk-633WH2ML.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-Q3RFPJYK.js";
|
|
8
8
|
import "./chunk-I7ORMAO7.js";
|
|
9
9
|
import "./chunk-GOT7OAL5.js";
|
|
10
10
|
import "./chunk-UP2VWCW5.js";
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
DEFAULT_SCORING_CONFIG,
|
|
14
14
|
createAdaptiveMemory
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=adaptive-memory-
|
|
16
|
+
//# sourceMappingURL=adaptive-memory-OJY3IVNM.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLogger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
4
4
|
import "./chunk-I7ORMAO7.js";
|
|
5
5
|
import "./chunk-GOT7OAL5.js";
|
|
6
6
|
import "./chunk-UP2VWCW5.js";
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
generateMcpConfig,
|
|
61
61
|
getDefaultAllowedTools
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=child-mcp-config-
|
|
63
|
+
//# sourceMappingURL=child-mcp-config-KMCKKPNY.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
createLogger,
|
|
3
3
|
err,
|
|
4
4
|
ok
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
6
6
|
|
|
7
7
|
// src/scm/token-resolver.ts
|
|
8
8
|
import { execFile } from "child_process";
|
|
@@ -87,4 +87,4 @@ export {
|
|
|
87
87
|
hasToken,
|
|
88
88
|
getTokenEnvVars
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-2SVS5WRV.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
formatZodError,
|
|
12
12
|
getTimeProvider,
|
|
13
13
|
ok
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
15
15
|
|
|
16
16
|
// src/context/memory-backend-types.ts
|
|
17
17
|
import { z } from "zod";
|
|
@@ -941,4 +941,4 @@ export {
|
|
|
941
941
|
AdaptiveMemoryBackend,
|
|
942
942
|
createAdaptiveMemory
|
|
943
943
|
};
|
|
944
|
-
//# sourceMappingURL=chunk-
|
|
944
|
+
//# sourceMappingURL=chunk-3ESCBV47.js.map
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
CircuitBreakerRegistry,
|
|
3
3
|
CircuitError,
|
|
4
4
|
mapCliErrorToCategory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TBRNRW2Q.js";
|
|
6
6
|
import {
|
|
7
7
|
createLogger,
|
|
8
8
|
err,
|
|
9
9
|
getFallbackChainForCategory,
|
|
10
10
|
getTimeProvider,
|
|
11
11
|
ok
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
13
13
|
|
|
14
14
|
// src/cli-adapters/cli-circuit-breaker.ts
|
|
15
15
|
var CATEGORY_TO_FALLBACK = {
|
|
@@ -152,4 +152,4 @@ export {
|
|
|
152
152
|
CliCircuitBreakerIntegration,
|
|
153
153
|
createCliCircuitBreakerIntegration
|
|
154
154
|
};
|
|
155
|
-
//# sourceMappingURL=chunk-
|
|
155
|
+
//# sourceMappingURL=chunk-3SZBDLFX.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveToken
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2SVS5WRV.js";
|
|
4
4
|
import {
|
|
5
5
|
GitHubProvider,
|
|
6
6
|
ScmError
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-BK54O5J5.js";
|
|
8
8
|
import {
|
|
9
9
|
err,
|
|
10
10
|
ok
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
12
12
|
|
|
13
13
|
// src/scm/factory.ts
|
|
14
14
|
async function createScmProvider(config) {
|
|
@@ -41,4 +41,4 @@ export {
|
|
|
41
41
|
createScmProvider,
|
|
42
42
|
createGitHubProvider
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-44MVIL3F.js.map
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
createStream,
|
|
4
4
|
requireApiKey,
|
|
5
5
|
validateApiKeyPresence
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NQR7QAZX.js";
|
|
7
7
|
import {
|
|
8
8
|
ModelCapability,
|
|
9
9
|
err,
|
|
10
10
|
getCliModelName,
|
|
11
11
|
getTokenEstimator,
|
|
12
12
|
ok
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
14
14
|
|
|
15
15
|
// src/adapters/openai-types.ts
|
|
16
16
|
var OPENAI_MODELS = {
|
|
@@ -553,4 +553,4 @@ export {
|
|
|
553
553
|
OpenAIAdapter,
|
|
554
554
|
createOpenAIAdapter
|
|
555
555
|
};
|
|
556
|
-
//# sourceMappingURL=chunk-
|
|
556
|
+
//# sourceMappingURL=chunk-4K6L7RKC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/openai-types.ts","../src/adapters/openai-adapter.ts","../src/adapters/openai-mappers.ts"],"sourcesContent":["/**\n * nexus-agents/adapters - OpenAI Type Helpers\n *\n * Type definitions and constants for the OpenAI direct-API SDK adapter.\n *\n * **Architectural boundary (#2200 Child 3):** these constants do NOT live\n * in `config/in-tree-data.ts`. The canonical registry's `cliName`\n * dimension targets CLI tools (`claude` / `gemini` / `codex` / `opencode`)\n * — there is no `openai` CLI binary. Adding `'openai'` to the CLI_NAMES\n * enum would force a fifth case in 4+ exhaustive switches across the\n * codebase, violating the semantic of \"CLI tool name.\"\n *\n * The OpenAI direct adapter is conceptually different from CLI adapters:\n * it talks to the OpenAI HTTPS API directly, not via a subprocess CLI.\n * Its model identifiers are OpenAI's own (`gpt-4o-2024-11-20`,\n * `gpt-3.5-turbo-0125`, etc.) — these are upstream API constants, not\n * versions WE chose. They drift only when OpenAI ships new dated releases.\n *\n * This file is the single source of truth for OpenAI direct-API model\n * identifiers. The model-string drift fitness-guard (#2199) treats it as\n * a documented architectural exception in the allowlist.\n */\n\nimport type { ModelCapability } from '../core/index.js';\nimport { ModelCapability as MC } from '../core/index.js';\nimport { getCliModelName } from '../config/model-config-helpers.js';\n\n/**\n * Supported OpenAI direct-API model identifiers (OpenAI's own dated names).\n *\n * GPT_5_2_CODEX derives from the canonical registry (codex-5.2's cliModelName)\n * because it overlaps with the Codex CLI; the rest are pure-API constants.\n */\nexport const OPENAI_MODELS = {\n GPT_5_2: 'gpt-5.2',\n GPT_5_2_INSTANT: 'gpt-5.2-chat-latest',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_2_CODEX: getCliModelName('codex-5.2'),\n GPT_4O: 'gpt-4o-2024-11-20',\n GPT_4O_MINI: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo-2024-04-09',\n GPT_35_TURBO: 'gpt-3.5-turbo-0125',\n} as const;\n\n/**\n * User-friendly OpenAI aliases → dated model identifiers.\n *\n * Identity-only mappings (e.g., `'gpt-5.2-pro' → 'gpt-5.2-pro'`) were\n * removed in #2200 Child 3 — `resolveModelId` already passes unknown ids\n * through unchanged via `?? modelId`. Only entries that translate a\n * shorthand into a dated version remain.\n */\nexport const OPENAI_MODEL_ALIASES: Record<string, string> = {\n 'gpt-5.2-instant': OPENAI_MODELS.GPT_5_2_INSTANT,\n 'gpt-4o': OPENAI_MODELS.GPT_4O,\n 'gpt-4o-mini': OPENAI_MODELS.GPT_4O_MINI,\n 'gpt-4-turbo': OPENAI_MODELS.GPT_4_TURBO,\n 'gpt-3.5-turbo': OPENAI_MODELS.GPT_35_TURBO,\n} as const;\n\n/**\n * Configuration specific to OpenAIAdapter.\n */\nexport interface OpenAIAdapterConfig {\n /** Model ID (e.g., 'gpt-4o' or full model identifier) */\n modelId: string;\n /** API key for OpenAI API (required) */\n apiKey: string;\n /** Base URL for API (optional, defaults to OpenAI's API) */\n baseUrl?: string;\n /** Request timeout in milliseconds (optional) */\n timeout?: number;\n /** Maximum retries for failed requests (optional) */\n maxRetries?: number;\n /** Organization ID (optional) */\n organization?: string;\n}\n\n// Note: Token estimation moved to core/token-estimator.ts (unified TokenEstimator)\n\n/**\n * Default maximum tokens for OpenAI models.\n */\nexport const DEFAULT_MAX_TOKENS = 4096;\n\n/**\n * Tool call type for extracting function info.\n */\nexport interface FunctionToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Type guard for function tool calls.\n * Note: typeof null === 'object' is true, so we need to check tc !== null\n */\nexport function isFunctionToolCall(toolCall: unknown): toolCall is FunctionToolCall {\n if (typeof toolCall !== 'object' || toolCall === null) {\n return false;\n }\n const tc = toolCall as Record<string, unknown>;\n return tc['type'] === 'function' && typeof tc['function'] === 'object' && tc['function'] !== null;\n}\n\n/**\n * Resolves model alias to full model identifier.\n */\nexport function resolveModelId(modelId: string): string {\n return OPENAI_MODEL_ALIASES[modelId] ?? modelId;\n}\n\n/**\n * Determines capabilities based on model ID.\n */\nexport function getModelCapabilities(modelId: string): readonly ModelCapability[] {\n const capabilities: ModelCapability[] = [MC.COMPLETION, MC.STREAMING, MC.TOOL_USE];\n\n const resolvedId = resolveModelId(modelId);\n\n // Vision is available on GPT-4o, GPT-4-turbo, and GPT-5.2 models\n if (\n resolvedId.includes('gpt-4o') ||\n resolvedId.includes('gpt-4-turbo') ||\n resolvedId.includes('gpt-5.2')\n ) {\n capabilities.push(MC.VISION);\n }\n\n // Extended thinking is available on GPT-5.2 models\n if (resolvedId.includes('gpt-5.2')) {\n capabilities.push(MC.EXTENDED_THINKING);\n }\n\n return capabilities;\n}\n","/**\n * nexus-agents/adapters - OpenAI Model Adapter\n *\n * Adapter for OpenAI models (GPT-4o, GPT-4-turbo, GPT-3.5-turbo).\n * Implements the IModelAdapter interface with streaming support, rate limiting,\n * and proper error handling.\n *\n * Verified 2026-01-03: openai@6.15.0 is current stable\n * (Source: npm registry)\n */\n\nimport OpenAI from 'openai';\nimport type { ChatCompletionMessageParam, ChatCompletion } from 'openai/resources/chat/completions';\nimport type {\n Result,\n CompletionRequest,\n CompletionResponse,\n ModelMetadata,\n StreamChunk,\n TokenUsage,\n} from '../core/index.js';\nimport { ok, err, ModelError, ConfigError, getTokenEstimator } from '../core/index.js';\nimport {\n BaseAdapter,\n type BaseAdapterConfig,\n requireApiKey,\n validateApiKeyPresence,\n} from './base-adapter.js';\nimport { createStream } from './streaming.js';\nimport {\n DEFAULT_MAX_TOKENS,\n resolveModelId,\n getModelCapabilities,\n type OpenAIAdapterConfig,\n} from './openai-types.js';\nimport {\n mapMessage,\n mapTool,\n mapStopReason,\n mapChoiceToContentBlocks,\n mapResponseUsage,\n mapStreamChunk,\n} from './openai-mappers.js';\n\n// Re-export types and constants for public API\nexport { OPENAI_MODELS, OPENAI_MODEL_ALIASES, type OpenAIAdapterConfig } from './openai-types.js';\n\n/**\n * OpenAI model adapter.\n *\n * Provides a unified interface for interacting with OpenAI's GPT models.\n * Supports completion, streaming, tool use, and vision capabilities.\n *\n * @example\n * ```typescript\n * const adapter = new OpenAIAdapter({\n * modelId: 'gpt-4o',\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * const result = await adapter.complete({\n * messages: [{ role: 'user', content: 'Hello!' }],\n * maxTokens: 1024,\n * });\n *\n * if (result.ok) {\n * console.log(result.value.content);\n * }\n * ```\n */\nexport class OpenAIAdapter extends BaseAdapter {\n private readonly client: OpenAI;\n private readonly resolvedModelId: string;\n\n /**\n * Creates a new OpenAIAdapter instance.\n *\n * @param config - OpenAI adapter configuration\n * @throws {ConfigError} If API key is missing\n */\n constructor(config: OpenAIAdapterConfig) {\n const resolvedModelId = resolveModelId(config.modelId);\n\n // Build baseConfig conditionally to satisfy exactOptionalPropertyTypes\n const baseConfig: BaseAdapterConfig = {\n providerId: 'openai',\n modelId: resolvedModelId,\n capabilities: getModelCapabilities(config.modelId),\n apiKey: config.apiKey,\n };\n\n // Only set optional properties if defined\n if (config.baseUrl !== undefined) {\n baseConfig.baseUrl = config.baseUrl;\n }\n if (config.timeout !== undefined) {\n baseConfig.timeout = config.timeout;\n }\n if (config.maxRetries !== undefined) {\n baseConfig.maxRetries = config.maxRetries;\n }\n\n super(baseConfig);\n\n this.resolvedModelId = resolvedModelId;\n\n // Validate API key presence\n requireApiKey(config.apiKey, 'OpenAI', config.modelId);\n\n this.client = this.createClient(config);\n }\n\n /**\n * Creates the OpenAI client with configuration.\n */\n private createClient(config: OpenAIAdapterConfig): OpenAI {\n const clientOptions: ConstructorParameters<typeof OpenAI>[0] = {\n apiKey: config.apiKey,\n maxRetries: config.maxRetries ?? 2,\n };\n\n if (config.baseUrl !== undefined) {\n clientOptions.baseURL = config.baseUrl;\n }\n if (config.timeout !== undefined) {\n clientOptions.timeout = config.timeout;\n }\n if (config.organization !== undefined) {\n clientOptions.organization = config.organization;\n }\n\n return new OpenAI(clientOptions);\n }\n\n /**\n * Validates adapter configuration.\n * Extends base validation with OpenAI-specific checks.\n */\n override validateConfig(): Result<void, ConfigError> {\n const baseResult = super.validateConfig();\n if (!baseResult.ok) {\n return baseResult;\n }\n\n // Validate API key is present\n const keyResult = validateApiKeyPresence(this.config.apiKey, this.providerId, this.modelId);\n if (!keyResult.ok) return keyResult;\n\n return ok(undefined);\n }\n\n /**\n * Send a completion request to OpenAI.\n *\n * @param request - The completion request\n * @returns Result with response or ModelError\n */\n async complete(request: CompletionRequest): Promise<Result<CompletionResponse, ModelError>> {\n this.logRequest(request);\n\n try {\n const response = await this.executeCompletion(request);\n this.logResponse(response);\n return ok(response);\n } catch (error) {\n return err(this.transformError(error));\n }\n }\n\n /**\n * Stream a completion request from OpenAI.\n *\n * @param request - The completion request\n * @yields StreamChunk objects as they arrive\n */\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n this.logRequest(request);\n\n const [controller, iterable] = createStream<StreamChunk>();\n\n // Start streaming in the background\n this.executeStream(request, controller).catch((error: unknown) => {\n const modelError = this.transformError(error);\n controller.error(modelError);\n });\n\n yield* iterable;\n }\n\n /**\n * Count tokens in text using OpenAI-specific estimation.\n *\n * @param text - Text to count tokens for\n * @returns Approximate token count\n */\n override countTokens(text: string): Promise<number> {\n // Use unified TokenEstimator with OpenAI-specific ratio (~4 chars/token)\n return Promise.resolve(getTokenEstimator().estimateText(text, 'openai'));\n }\n\n /**\n * Executes the completion request against the OpenAI API.\n */\n private async executeCompletion(request: CompletionRequest): Promise<CompletionResponse> {\n const params = this.buildRequestParams(request);\n const response = await this.client.chat.completions.create(params);\n return this.mapResponse(response);\n }\n\n /**\n * Executes streaming completion and pushes chunks to the controller.\n */\n private async executeStream(\n request: CompletionRequest,\n controller: {\n push: (chunk: StreamChunk) => Result<void, Error>;\n complete: () => void;\n error: (error: Error) => void;\n }\n ): Promise<void> {\n try {\n const params = this.buildRequestParams(request);\n const stream = await this.client.chat.completions.create({ ...params, stream: true });\n\n let contentIndex = 0;\n let hasStarted = false;\n\n for await (const chunk of stream) {\n const mappedChunks = mapStreamChunk(chunk, contentIndex, hasStarted);\n\n for (const mappedChunk of mappedChunks) {\n if (mappedChunk.type === 'message_start') {\n hasStarted = true;\n }\n if (mappedChunk.type === 'content_block_start') {\n contentIndex++;\n }\n controller.push(mappedChunk);\n }\n }\n\n controller.complete();\n } catch (error) {\n const modelError = this.transformError(error);\n controller.error(modelError);\n }\n }\n\n /**\n * Builds OpenAI API request parameters from our CompletionRequest.\n */\n private buildRequestParams(\n request: CompletionRequest\n ): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n const messages = this.buildMessages(request);\n\n const params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming = {\n model: this.resolvedModelId,\n messages,\n max_completion_tokens: request.maxTokens ?? DEFAULT_MAX_TOKENS,\n };\n\n this.addOptionalParams(params, request);\n return params;\n }\n\n /**\n * Builds the messages array for the request.\n */\n private buildMessages(request: CompletionRequest): ChatCompletionMessageParam[] {\n const messages: ChatCompletionMessageParam[] = [];\n\n // Add system prompt if provided explicitly\n if (request.systemPrompt !== undefined && request.systemPrompt !== '') {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n\n // Map and add all messages (filtering out system if already added via systemPrompt)\n for (const msg of request.messages) {\n if (msg.role === 'system' && request.systemPrompt !== undefined) {\n continue;\n }\n messages.push(mapMessage(msg));\n }\n\n return messages;\n }\n\n /**\n * Adds optional parameters to the request.\n */\n private addOptionalParams(\n params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n request: CompletionRequest\n ): void {\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.stop !== undefined && request.stop.length > 0) {\n params.stop = request.stop;\n }\n\n if (request.tools !== undefined && request.tools.length > 0) {\n params.tools = request.tools.map(mapTool);\n }\n\n this.addResponseFormat(params, request);\n }\n\n /**\n * Adds response format to the request if specified.\n */\n private addResponseFormat(\n params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n request: CompletionRequest\n ): void {\n if (request.responseFormat === undefined) {\n return;\n }\n\n if (request.responseFormat.type === 'json_object') {\n params.response_format = { type: 'json_object' };\n } else if (request.responseFormat.type === 'json_schema') {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: request.responseFormat.schema,\n },\n };\n }\n }\n\n /**\n * Maps OpenAI API response to our CompletionResponse format.\n */\n private mapResponse(response: ChatCompletion): CompletionResponse {\n const firstChoice = response.choices[0];\n\n // Handle case where no choices are returned\n if (firstChoice === undefined) {\n return this.createEmptyResponse(response);\n }\n\n const content = mapChoiceToContentBlocks(firstChoice);\n const usage: TokenUsage = mapResponseUsage(response);\n\n return {\n content,\n usage,\n stopReason: mapStopReason(firstChoice.finish_reason),\n model: response.model,\n };\n }\n\n /**\n * Creates an empty response when no choices are returned.\n */\n private createEmptyResponse(response: ChatCompletion): CompletionResponse {\n return {\n content: [{ type: 'text', text: '' }],\n usage: mapResponseUsage(response),\n stopReason: 'end_turn',\n model: response.model,\n };\n }\n\n /**\n * (#2529) List models served by this OpenAI-compatible endpoint.\n *\n * Wraps `GET /v1/models`. Result is cached for `LIST_MODELS_TTL_MS`\n * so identity resolution doesn't round-trip on every adapter.\n * Concurrent callers share the in-flight promise.\n *\n * Throws on non-2xx so the harness-side identity resolver knows to\n * fall back to modelId parsing — silent empty-list returns would be\n * indistinguishable from \"this gateway has no models\", which a\n * misconfigured endpoint shouldn't be allowed to claim.\n */\n async listModels(): Promise<readonly ModelMetadata[]> {\n const now = Date.now();\n if (this.modelsCache !== null && now - this.modelsCache.fetchedAt < LIST_MODELS_TTL_MS) {\n return this.modelsCache.value;\n }\n if (this.modelsInFlight !== null) {\n return this.modelsInFlight;\n }\n const inFlight = this.fetchModels();\n this.modelsInFlight = inFlight;\n try {\n const value = await inFlight;\n this.modelsCache = { value, fetchedAt: Date.now() };\n return value;\n } finally {\n this.modelsInFlight = null;\n }\n }\n\n private modelsCache: { value: readonly ModelMetadata[]; fetchedAt: number } | null = null;\n private modelsInFlight: Promise<readonly ModelMetadata[]> | null = null;\n\n private async fetchModels(): Promise<readonly ModelMetadata[]> {\n const list = await this.client.models.list();\n return list.data.map((m): ModelMetadata => {\n const meta: ModelMetadata = { id: m.id };\n if (typeof m.owned_by === 'string') {\n return { ...meta, ownedBy: m.owned_by, createdAt: m.created };\n }\n if (typeof m.created === 'number') {\n return { ...meta, createdAt: m.created };\n }\n return meta;\n });\n }\n}\n\nconst LIST_MODELS_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Creates an OpenAIAdapter with the specified configuration.\n * Factory function for cleaner API.\n *\n * @param config - OpenAI adapter configuration\n * @returns A configured OpenAIAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = createOpenAIAdapter({\n * modelId: 'gpt-4o',\n * apiKey: process.env.OPENAI_API_KEY!,\n * });\n * ```\n */\nexport function createOpenAIAdapter(config: OpenAIAdapterConfig): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","/**\n * nexus-agents/adapters - OpenAI Message Mappers\n *\n * Functions for mapping between Nexus and OpenAI message formats.\n */\n\nimport type OpenAI from 'openai';\nimport type {\n ChatCompletionMessageParam,\n ChatCompletionTool,\n ChatCompletion,\n ChatCompletionChunk,\n} from 'openai/resources/chat/completions';\nimport type {\n ContentBlock,\n Message,\n ToolDefinition,\n TokenUsage,\n StopReason,\n StreamChunk,\n} from '../core/index.js';\nimport { isFunctionToolCall } from './openai-types.js';\n\n/**\n * Maps OpenAI finish reasons to our StopReason type.\n */\nexport function mapStopReason(openaiReason: string | null | undefined): StopReason {\n switch (openaiReason) {\n case 'stop':\n return 'end_turn';\n case 'length':\n return 'max_tokens';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'content_filter':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Maps OpenAI choice to our ContentBlock array.\n */\nexport function mapChoiceToContentBlocks(choice: ChatCompletion.Choice): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n const message = choice.message;\n\n // Add text content if present\n if (message.content !== null && message.content !== '') {\n blocks.push({ type: 'text', text: message.content });\n }\n\n // Add tool calls if present\n if (message.tool_calls !== undefined && message.tool_calls.length > 0) {\n for (const toolCall of message.tool_calls) {\n if (isFunctionToolCall(toolCall)) {\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(toolCall.function.arguments) as unknown;\n } catch {\n parsedInput = { _raw: toolCall.function.arguments };\n }\n blocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: parsedInput,\n });\n }\n }\n }\n\n // If no content at all, return empty text block\n if (blocks.length === 0) {\n blocks.push({ type: 'text', text: '' });\n }\n\n return blocks;\n}\n\n/**\n * Maps our Message format to OpenAI's ChatCompletionMessageParam format.\n */\nexport function mapMessage(message: Message): ChatCompletionMessageParam {\n // Handle system messages\n if (message.role === 'system') {\n return mapSystemMessage(message);\n }\n\n // Handle user messages\n if (message.role === 'user') {\n return mapUserMessage(message);\n }\n\n // Handle assistant messages\n return mapAssistantMessage(message);\n}\n\n/**\n * Maps a system message.\n */\nfunction mapSystemMessage(message: Message): ChatCompletionMessageParam {\n const content =\n typeof message.content === 'string'\n ? message.content\n : message.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n return { role: 'system', content };\n}\n\n/**\n * Maps a user message.\n */\nfunction mapUserMessage(message: Message): ChatCompletionMessageParam {\n if (typeof message.content === 'string') {\n return { role: 'user', content: message.content };\n }\n\n // Check for tool results - these need special handling\n const toolResults = message.content.filter(\n (b): b is { type: 'tool_result'; tool_use_id: string; content: string; is_error?: boolean } =>\n b.type === 'tool_result'\n );\n\n if (toolResults.length > 0) {\n // Return first tool result as a tool message\n const firstResult = toolResults[0];\n if (firstResult !== undefined) {\n return {\n role: 'tool',\n tool_call_id: firstResult.tool_use_id,\n content: firstResult.content,\n };\n }\n }\n\n // Map to user message with content array\n const content = message.content.map((block) => {\n if (block.type === 'text') {\n return { type: 'text' as const, text: block.text };\n }\n if (block.type === 'image') {\n return {\n type: 'image_url' as const,\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n };\n }\n // Fallback for other types\n return { type: 'text' as const, text: '' };\n });\n\n return { role: 'user', content };\n}\n\n/**\n * Maps an assistant message.\n */\nfunction mapAssistantMessage(message: Message): ChatCompletionMessageParam {\n if (typeof message.content === 'string') {\n return { role: 'assistant', content: message.content };\n }\n\n // Check for tool uses in assistant message\n const toolUses = message.content.filter(\n (b): b is { type: 'tool_use'; id: string; name: string; input: unknown } =>\n b.type === 'tool_use'\n );\n\n const textContent = message.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join('');\n\n if (toolUses.length > 0) {\n const assistantMessage: ChatCompletionMessageParam = {\n role: 'assistant',\n content: textContent !== '' ? textContent : null,\n tool_calls: toolUses.map((tool) => ({\n id: tool.id,\n type: 'function' as const,\n function: {\n name: tool.name,\n arguments: JSON.stringify(tool.input),\n },\n })),\n };\n return assistantMessage;\n }\n\n return { role: 'assistant', content: textContent };\n}\n\n/**\n * Maps our ToolDefinition to OpenAI's tool format.\n */\nexport function mapTool(tool: ToolDefinition): ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n };\n}\n\n/**\n * Maps OpenAI API response to our CompletionResponse format.\n */\nexport function mapResponseUsage(response: ChatCompletion): TokenUsage {\n return {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n };\n}\n\n/**\n * Maps content delta from stream chunk.\n */\nfunction mapContentDelta(\n delta: OpenAI.Chat.ChatCompletionChunk.Choice.Delta,\n currentIndex: number,\n hasStarted: boolean\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (delta.content !== undefined && delta.content !== null && delta.content !== '') {\n // Start content block if this is the first content\n if (currentIndex === 0 && !hasStarted) {\n chunks.push({\n type: 'content_block_start',\n index: 0,\n contentBlock: { type: 'text', text: '' },\n });\n }\n\n chunks.push({\n type: 'content_block_delta',\n index: currentIndex,\n delta: { type: 'text_delta', text: delta.content },\n });\n }\n\n return chunks;\n}\n\n/**\n * Maps tool calls from stream chunk delta.\n */\nfunction mapToolCallsDelta(delta: OpenAI.Chat.ChatCompletionChunk.Choice.Delta): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (delta.tool_calls !== undefined && delta.tool_calls.length > 0) {\n for (const toolCall of delta.tool_calls) {\n if (toolCall.function?.name !== undefined) {\n chunks.push({\n type: 'content_block_start',\n index: toolCall.index,\n contentBlock: {\n type: 'tool_use',\n id: toolCall.id ?? '',\n name: toolCall.function.name,\n input: {},\n },\n });\n }\n }\n }\n\n return chunks;\n}\n\n/**\n * Maps finish reason from stream chunk.\n */\nfunction mapFinishChunks(\n choice: ChatCompletionChunk.Choice,\n chunk: ChatCompletionChunk,\n currentIndex: number\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (choice.finish_reason !== null) {\n // End current content block\n chunks.push({\n type: 'content_block_stop',\n index: currentIndex,\n });\n\n // Emit message_delta with stop reason\n chunks.push({\n type: 'message_delta',\n delta: { stop_reason: mapStopReason(choice.finish_reason) },\n usage: {\n inputTokens: 0,\n outputTokens: chunk.usage?.completion_tokens ?? 0,\n totalTokens: chunk.usage?.total_tokens ?? 0,\n },\n });\n\n // Emit message_stop\n chunks.push({ type: 'message_stop' });\n }\n\n return chunks;\n}\n\n/**\n * Maps OpenAI stream chunks to our StreamChunk format.\n */\nexport function mapStreamChunk(\n chunk: ChatCompletionChunk,\n currentIndex: number,\n hasStarted: boolean\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n const choice = chunk.choices[0];\n\n // Emit message_start on first chunk\n if (!hasStarted) {\n chunks.push({\n type: 'message_start',\n message: { model: chunk.model },\n });\n }\n\n if (choice === undefined) {\n return chunks;\n }\n\n const delta = choice.delta;\n\n // Map content delta\n chunks.push(...mapContentDelta(delta, currentIndex, hasStarted));\n\n // Map tool calls\n chunks.push(...mapToolCallsDelta(delta));\n\n // Map finish reason\n chunks.push(...mapFinishChunks(choice, chunk, currentIndex));\n\n return chunks;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
err,
|
|
4
4
|
getErrorMessage,
|
|
5
5
|
ok
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
7
7
|
|
|
8
8
|
// src/scm/types.ts
|
|
9
9
|
var ScmError = class extends Error {
|
|
@@ -243,4 +243,4 @@ export {
|
|
|
243
243
|
ScmError,
|
|
244
244
|
GitHubProvider
|
|
245
245
|
};
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
246
|
+
//# sourceMappingURL=chunk-BK54O5J5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scm/types.ts","../src/scm/github-provider.ts"],"sourcesContent":["/**\n * nexus-agents/scm - SCM Provider Types\n *\n * Shared types for the centralized SCM (Source Control Management) module.\n * Supports GitHub (REST API + gh CLI) with extensibility for GitLab/Gitea.\n *\n * @module scm/types\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport type { Result } from '../core/index.js';\n\n// ============================================================================\n// Token Types\n// ============================================================================\n\n/** Supported SCM platforms. */\nexport type ScmPlatform = 'github' | 'gitlab' | 'gitea';\n\n/** Token resolution strategy. */\nexport type TokenStrategy = 'env' | 'cli' | 'config';\n\n/** Resolved SCM token with metadata. */\nexport interface ScmToken {\n /** The raw token value */\n readonly value: string;\n /** How the token was resolved */\n readonly strategy: TokenStrategy;\n /** SCM platform this token is for */\n readonly platform: ScmPlatform;\n}\n\n/** Token resolution configuration. */\nexport interface TokenResolverConfig {\n /** Explicit token (highest priority) */\n readonly token?: string;\n /** SCM platform to resolve for */\n readonly platform?: ScmPlatform;\n /** Custom env var name override */\n readonly envVar?: string;\n}\n\n// ============================================================================\n// SCM Entity Types\n// ============================================================================\n\n/** SCM issue representation. */\nexport interface ScmIssue {\n readonly number: number;\n readonly title: string;\n readonly body: string;\n readonly labels: readonly string[];\n readonly author: string;\n readonly createdAt: string;\n}\n\n/** SCM pull/merge request representation. */\nexport interface ScmPullRequest {\n readonly number: number;\n readonly title: string;\n readonly body: string;\n readonly author: string;\n readonly base: string;\n readonly head: string;\n readonly url: string;\n}\n\n/** SCM comment representation. */\nexport interface ScmComment {\n readonly id: number;\n readonly body: string;\n readonly author: string;\n readonly createdAt: string;\n}\n\n/** PR creation options. */\nexport interface CreatePROptions {\n readonly title: string;\n readonly body: string;\n readonly head: string;\n readonly base: string;\n}\n\n/** PR merge options. */\nexport interface MergePROptions {\n readonly method?: 'merge' | 'squash' | 'rebase';\n readonly commitTitle?: string;\n readonly commitMessage?: string;\n readonly deleteBranch?: boolean;\n}\n\n/** PR status for merge eligibility. */\nexport interface PRStatus {\n readonly mergeable: boolean;\n readonly checksStatus: 'pending' | 'success' | 'failure';\n readonly reviewStatus: 'approved' | 'pending' | 'changes_requested';\n}\n\n/** Issue filter options. */\nexport interface IssueFilters {\n readonly labels?: readonly string[];\n readonly state?: 'open' | 'closed' | 'all';\n readonly limit?: number;\n}\n\n// ============================================================================\n// SCM Error\n// ============================================================================\n\n/** Unified SCM error with platform-aware context. */\nexport class ScmError extends Error {\n constructor(\n message: string,\n readonly platform: ScmPlatform,\n readonly statusCode?: number,\n readonly context?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'ScmError';\n }\n}\n\n// ============================================================================\n// Extended Entity Types (Trait support)\n// ============================================================================\n\n/** File change in a pull request. */\nexport interface ScmFileChange {\n readonly filename: string;\n readonly status: 'added' | 'removed' | 'modified' | 'renamed' | 'copied';\n readonly additions: number;\n readonly deletions: number;\n readonly patch?: string;\n readonly previousFilename?: string;\n}\n\n/** Extended PR with file diffs and stats. Used by IScmReviewer. */\nexport interface ScmPullRequestDetail extends ScmPullRequest {\n readonly draft: boolean;\n readonly authorAssociation: string;\n readonly labels: readonly string[];\n readonly files: readonly ScmFileChange[];\n readonly additions: number;\n readonly deletions: number;\n readonly headSha: string;\n}\n\n/** Extended issue with association and state. Used by IScmReviewer. */\nexport interface ScmIssueDetail extends ScmIssue {\n readonly authorAssociation: string;\n readonly state: string;\n readonly url: string;\n}\n\n/** Extended comment with author association. */\nexport interface ScmCommentDetail extends ScmComment {\n readonly authorAssociation: string;\n}\n\n/** Review decision for a pull request. */\nexport type ScmReviewDecision = 'approve' | 'request_changes' | 'comment';\n\n/** User metadata for reputation assessment. */\nexport interface ScmUserMetadata {\n readonly login: string;\n readonly name: string | null;\n readonly company: string | null;\n readonly followers: number;\n readonly following: number;\n readonly publicRepos: number;\n readonly createdAt: string;\n}\n\n// ============================================================================\n// Provider Interface (Core)\n// ============================================================================\n\n/**\n * Core SCM provider interface.\n *\n * All methods return `Result<T, ScmError>` for consistent error handling\n * across GitHub REST API, gh CLI, and future GitLab/Gitea backends.\n */\nexport interface IScmProvider {\n /** Platform identifier. */\n readonly platform: ScmPlatform;\n\n /** Repository in owner/repo format. */\n readonly repo: string;\n\n // Issues\n getIssue(number: number): Promise<Result<ScmIssue, ScmError>>;\n listIssues(filters?: IssueFilters): Promise<Result<readonly ScmIssue[], ScmError>>;\n createIssue(\n title: string,\n body: string,\n labels?: readonly string[]\n ): Promise<Result<ScmIssue, ScmError>>;\n addLabels(issueNumber: number, labels: readonly string[]): Promise<Result<void, ScmError>>;\n\n // Pull Requests\n createPR(options: CreatePROptions): Promise<Result<ScmPullRequest, ScmError>>;\n mergePR(prNumber: number, options?: MergePROptions): Promise<Result<void, ScmError>>;\n getPRStatus(prNumber: number): Promise<Result<PRStatus, ScmError>>;\n\n // Comments\n addComment(issueNumber: number, body: string): Promise<Result<void, ScmError>>;\n listComments(issueNumber: number): Promise<Result<readonly ScmComment[], ScmError>>;\n}\n\n// ============================================================================\n// Trait Interfaces (ISP — Interface Segregation Principle)\n// ============================================================================\n\n/**\n * Review trait — PR review capabilities.\n *\n * Implemented by platforms supporting code review workflows.\n * Consumers declare this trait when they need PR file diffs or review posting.\n */\nexport interface IScmReviewer {\n /** Fetch PR with full file diffs and stats. */\n getPullRequestDetail(prNumber: number): Promise<Result<ScmPullRequestDetail, ScmError>>;\n\n /** Post a review on a pull request. */\n createReview(\n prNumber: number,\n body: string,\n decision: ScmReviewDecision\n ): Promise<Result<void, ScmError>>;\n\n /** Fetch issue with author association and state. */\n getIssueDetail(issueNumber: number): Promise<Result<ScmIssueDetail, ScmError>>;\n\n /** List comments with author associations. */\n listCommentDetails(issueNumber: number): Promise<Result<readonly ScmCommentDetail[], ScmError>>;\n}\n\n/**\n * User info trait — user metadata for reputation assessment.\n *\n * Implemented by platforms supporting user profile queries.\n * Consumers declare this trait when they need author reputation data.\n */\nexport interface IScmUserInfo {\n /** Fetch user metadata for reputation assessment. */\n fetchUserMetadata(username: string): Promise<Result<ScmUserMetadata, ScmError>>;\n}\n\n/**\n * Convenience type: provider with review capabilities.\n * Used by PR review workflows.\n */\nexport type ReviewCapableProvider = IScmProvider & IScmReviewer;\n\n/**\n * Convenience type: provider with all capabilities.\n * Used by full triage workflows that need review + user info.\n */\nexport type FullCapableProvider = IScmProvider & IScmReviewer & IScmUserInfo;\n","/**\n * nexus-agents/scm - GitHub Provider\n *\n * Unified GitHub provider using gh CLI. Implements IScmProvider with\n * Result-based error handling. Replaced the prior dual-path GitHub\n * clients (dogfooding/github-client.ts deleted in #2553;\n * workflows/self-development/github-client.ts deleted in #2402).\n *\n * @module scm/github-provider\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Result } from '../core/index.js';\nimport { ok, err, createLogger, getErrorMessage } from '../core/index.js';\nimport type {\n IScmProvider,\n ScmIssue,\n ScmPullRequest,\n ScmComment,\n CreatePROptions,\n MergePROptions,\n PRStatus,\n IssueFilters,\n} from './types.js';\nimport { ScmError } from './types.js';\n\nconst execFileAsync = promisify(execFile);\nconst logger = createLogger({ component: 'GitHubProvider' });\n\n/** Max buffer for gh CLI output (10MB). */\nconst MAX_BUFFER = 10 * 1024 * 1024;\n\n/** gh CLI timeout in ms. */\nconst GH_TIMEOUT_MS = 30_000;\n\n// ============================================================================\n// gh CLI JSON types (internal)\n// ============================================================================\n\ninterface GhIssueJson {\n number: number;\n title: string;\n body: string | null;\n labels: Array<{ name: string }>;\n author: { login: string };\n createdAt: string;\n}\n\ninterface GhCommentJson {\n id: number;\n body: string;\n author: { login: string };\n createdAt: string;\n}\n\ninterface GhPrJson {\n number: number;\n title: string;\n body: string | null;\n url: string;\n author: { login: string };\n baseRefName: string;\n headRefName: string;\n}\n\ninterface GhPrStatusJson {\n mergeable: string;\n statusCheckRollup: Array<{ state: string }> | null;\n reviewDecision: string | null;\n}\n\n// ============================================================================\n// gh CLI executor\n// ============================================================================\n\nasync function execGh(args: readonly string[], repo: string): Promise<Result<string, ScmError>> {\n const fullArgs = [...args, '--repo', repo];\n\n try {\n const { stdout } = await execFileAsync('gh', fullArgs, {\n maxBuffer: MAX_BUFFER,\n timeout: GH_TIMEOUT_MS,\n });\n return ok(stdout.trim());\n } catch (error) {\n const execError = error as { message: string; stderr?: string };\n return err(\n new ScmError(`gh command failed: ${execError.message}`, 'github', undefined, {\n command: `gh ${fullArgs.join(' ')}`,\n stderr: execError.stderr,\n })\n );\n }\n}\n\n// ============================================================================\n// Mappers\n// ============================================================================\n\nfunction mapIssue(raw: GhIssueJson): ScmIssue {\n return {\n number: raw.number,\n title: raw.title,\n body: raw.body ?? '',\n labels: raw.labels.map((l) => l.name),\n author: raw.author.login,\n createdAt: raw.createdAt,\n };\n}\n\nfunction mapComment(raw: GhCommentJson): ScmComment {\n return {\n id: raw.id,\n body: raw.body,\n author: raw.author.login,\n createdAt: raw.createdAt,\n };\n}\n\nfunction mapPRStatus(raw: GhPrStatusJson): PRStatus {\n const mergeable = raw.mergeable === 'MERGEABLE';\n\n let checksStatus: 'pending' | 'success' | 'failure' = 'pending';\n if (raw.statusCheckRollup !== null && raw.statusCheckRollup.length > 0) {\n const hasFailure = raw.statusCheckRollup.some((c) => c.state === 'FAILURE');\n const allSuccess = raw.statusCheckRollup.every(\n (c) => c.state === 'SUCCESS' || c.state === 'NEUTRAL' || c.state === 'SKIPPED'\n );\n checksStatus = hasFailure ? 'failure' : allSuccess ? 'success' : 'pending';\n }\n\n let reviewStatus: 'approved' | 'pending' | 'changes_requested' = 'pending';\n if (raw.reviewDecision === 'APPROVED') reviewStatus = 'approved';\n else if (raw.reviewDecision === 'CHANGES_REQUESTED') reviewStatus = 'changes_requested';\n\n return { mergeable, checksStatus, reviewStatus };\n}\n\n// ============================================================================\n// Provider Implementation\n// ============================================================================\n\n/**\n * GitHub provider using the gh CLI.\n *\n * Requires: gh CLI installed and authenticated.\n */\nexport class GitHubProvider implements IScmProvider {\n readonly platform = 'github' as const;\n\n constructor(readonly repo: string) {}\n\n async getIssue(number: number): Promise<Result<ScmIssue, ScmError>> {\n const fields = 'number,title,body,labels,author,createdAt';\n const args = ['issue', 'view', String(number), '--json', fields];\n\n logger.debug('Getting issue', { repo: this.repo, number });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n return ok(mapIssue(JSON.parse(result.value) as GhIssueJson));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse issue JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async listIssues(filters?: IssueFilters): Promise<Result<readonly ScmIssue[], ScmError>> {\n const fields = 'number,title,body,labels,author,createdAt';\n const args = ['issue', 'list', '--json', fields];\n\n if (filters?.labels !== undefined && filters.labels.length > 0) {\n args.push('--label', filters.labels.join(','));\n }\n if (filters?.state !== undefined) {\n args.push('--state', filters.state);\n }\n args.push('--limit', String(filters?.limit ?? 50));\n\n logger.debug('Listing issues', { repo: this.repo, filters });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const issues = JSON.parse(result.value) as GhIssueJson[];\n return ok(issues.map(mapIssue));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse issues JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async addLabels(issueNumber: number, labels: readonly string[]): Promise<Result<void, ScmError>> {\n const args = ['issue', 'edit', String(issueNumber), '--add-label', labels.join(',')];\n\n logger.debug('Adding labels', { repo: this.repo, issueNumber, labels });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async createPR(options: CreatePROptions): Promise<Result<ScmPullRequest, ScmError>> {\n const fields = 'number,title,body,url,author,baseRefName,headRefName';\n const args = [\n 'pr',\n 'create',\n '--title',\n options.title,\n '--body',\n options.body,\n '--head',\n options.head,\n '--base',\n options.base,\n '--json',\n fields,\n ];\n\n logger.info('Creating PR', { repo: this.repo, title: options.title });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const raw = JSON.parse(result.value) as GhPrJson;\n return ok({\n number: raw.number,\n title: raw.title,\n body: raw.body ?? '',\n author: raw.author.login,\n base: raw.baseRefName,\n head: raw.headRefName,\n url: raw.url,\n });\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse PR JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async mergePR(prNumber: number, options?: MergePROptions): Promise<Result<void, ScmError>> {\n const method = options?.method ?? 'squash';\n const args = ['pr', 'merge', String(prNumber), `--${method}`];\n\n if (options?.commitTitle !== undefined) args.push('--subject', options.commitTitle);\n if (options?.commitMessage !== undefined) args.push('--body', options.commitMessage);\n if (options?.deleteBranch === true) args.push('--delete-branch');\n\n logger.info('Merging PR', { repo: this.repo, prNumber, method });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async getPRStatus(prNumber: number): Promise<Result<PRStatus, ScmError>> {\n const fields = 'mergeable,statusCheckRollup,reviewDecision';\n const args = ['pr', 'view', String(prNumber), '--json', fields];\n\n logger.debug('Getting PR status', { repo: this.repo, prNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n return ok(mapPRStatus(JSON.parse(result.value) as GhPrStatusJson));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse PR status JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n\n async createIssue(\n title: string,\n body: string,\n labels?: readonly string[]\n ): Promise<Result<ScmIssue, ScmError>> {\n const args = ['issue', 'create', '--title', title, '--body', body];\n if (labels !== undefined && labels.length > 0) args.push('--label', labels.join(','));\n logger.debug('Creating issue', { repo: this.repo, title });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n const url = result.value.trim();\n const match = /\\/(\\d+)$/.exec(url);\n const number = match?.[1] !== undefined ? parseInt(match[1], 10) : 0;\n return ok({\n number,\n title,\n body,\n labels: labels !== undefined ? [...labels] : [],\n author: 'pipeline',\n createdAt: new Date().toISOString(),\n });\n }\n\n async addComment(issueNumber: number, body: string): Promise<Result<void, ScmError>> {\n const args = ['issue', 'comment', String(issueNumber), '--body', body];\n\n logger.debug('Adding comment', { repo: this.repo, issueNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n return ok(undefined);\n }\n\n async listComments(issueNumber: number): Promise<Result<readonly ScmComment[], ScmError>> {\n const args = ['issue', 'view', String(issueNumber), '--json', 'comments', '--jq', '.comments'];\n\n logger.debug('Listing comments', { repo: this.repo, issueNumber });\n const result = await execGh(args, this.repo);\n if (!result.ok) return result;\n\n try {\n const comments = JSON.parse(result.value) as GhCommentJson[];\n return ok(comments.map(mapComment));\n } catch (error) {\n return err(\n new ScmError(\n `Failed to parse comments JSON: ${getErrorMessage(error)} — preview: ${result.value.slice(0, 120)}`,\n 'github'\n )\n );\n }\n }\n}\n"],"mappings":";;;;;;;;AA8GO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACS,UACA,YACA,SACT;AACA,UAAM,OAAO;AAJJ;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;;;AC5GA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAe1B,IAAM,gBAAgB,UAAU,QAAQ;AACxC,IAAM,SAAS,aAAa,EAAE,WAAW,iBAAiB,CAAC;AAG3D,IAAM,aAAa,KAAK,OAAO;AAG/B,IAAM,gBAAgB;AA0CtB,eAAe,OAAO,MAAyB,MAAiD;AAC9F,QAAM,WAAW,CAAC,GAAG,MAAM,UAAU,IAAI;AAEzC,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,UAAU;AAAA,MACrD,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AACD,WAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EACzB,SAAS,OAAO;AACd,UAAM,YAAY;AAClB,WAAO;AAAA,MACL,IAAI,SAAS,sBAAsB,UAAU,OAAO,IAAI,UAAU,QAAW;AAAA,QAC3E,SAAS,MAAM,SAAS,KAAK,GAAG,CAAC;AAAA,QACjC,QAAQ,UAAU;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAMA,SAAS,SAAS,KAA4B;AAC5C,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,MAAM,IAAI,QAAQ;AAAA,IAClB,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACpC,QAAQ,IAAI,OAAO;AAAA,IACnB,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,WAAW,KAAgC;AAClD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI,OAAO;AAAA,IACnB,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,YAAY,KAA+B;AAClD,QAAM,YAAY,IAAI,cAAc;AAEpC,MAAI,eAAkD;AACtD,MAAI,IAAI,sBAAsB,QAAQ,IAAI,kBAAkB,SAAS,GAAG;AACtE,UAAM,aAAa,IAAI,kBAAkB,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS;AAC1E,UAAM,aAAa,IAAI,kBAAkB;AAAA,MACvC,CAAC,MAAM,EAAE,UAAU,aAAa,EAAE,UAAU,aAAa,EAAE,UAAU;AAAA,IACvE;AACA,mBAAe,aAAa,YAAY,aAAa,YAAY;AAAA,EACnE;AAEA,MAAI,eAA6D;AACjE,MAAI,IAAI,mBAAmB,WAAY,gBAAe;AAAA,WAC7C,IAAI,mBAAmB,oBAAqB,gBAAe;AAEpE,SAAO,EAAE,WAAW,cAAc,aAAa;AACjD;AAWO,IAAM,iBAAN,MAA6C;AAAA,EAGlD,YAAqB,MAAc;AAAd;AAAA,EAAe;AAAA,EAF3B,WAAW;AAAA,EAIpB,MAAM,SAAS,QAAqD;AAClE,UAAM,SAAS;AACf,UAAM,OAAO,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG,UAAU,MAAM;AAE/D,WAAO,MAAM,iBAAiB,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC;AACzD,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,QAAI;AACF,aAAO,GAAG,SAAS,KAAK,MAAM,OAAO,KAAK,CAAgB,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,UACF,+BAA+B,gBAAgB,KAAK,CAAC,oBAAe,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,UAC9F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAwE;AACvF,UAAM,SAAS;AACf,UAAM,OAAO,CAAC,SAAS,QAAQ,UAAU,MAAM;AAE/C,QAAI,SAAS,WAAW,UAAa,QAAQ,OAAO,SAAS,GAAG;AAC9D,WAAK,KAAK,WAAW,QAAQ,OAAO,KAAK,GAAG,CAAC;AAAA,IAC/C;AACA,QAAI,SAAS,UAAU,QAAW;AAChC,WAAK,KAAK,WAAW,QAAQ,KAAK;AAAA,IACpC;AACA,SAAK,KAAK,WAAW,OAAO,SAAS,SAAS,EAAE,CAAC;AAEjD,WAAO,MAAM,kBAAkB,EAAE,MAAM,KAAK,MAAM,QAAQ,CAAC;AAC3D,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,KAAK;AACtC,aAAO,GAAG,OAAO,IAAI,QAAQ,CAAC;AAAA,IAChC,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,UACF,gCAAgC,gBAAgB,KAAK,CAAC,oBAAe,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,UAC/F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,aAAqB,QAA4D;AAC/F,UAAM,OAAO,CAAC,SAAS,QAAQ,OAAO,WAAW,GAAG,eAAe,OAAO,KAAK,GAAG,CAAC;AAEnF,WAAO,MAAM,iBAAiB,EAAE,MAAM,KAAK,MAAM,aAAa,OAAO,CAAC;AACtE,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AACvB,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,SAAqE;AAClF,UAAM,SAAS;AACf,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAEA,WAAO,KAAK,eAAe,EAAE,MAAM,KAAK,MAAM,OAAO,QAAQ,MAAM,CAAC;AACpE,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,OAAO,KAAK;AACnC,aAAO,GAAG;AAAA,QACR,QAAQ,IAAI;AAAA,QACZ,OAAO,IAAI;AAAA,QACX,MAAM,IAAI,QAAQ;AAAA,QAClB,QAAQ,IAAI,OAAO;AAAA,QACnB,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,KAAK,IAAI;AAAA,MACX,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,UACF,4BAA4B,gBAAgB,KAAK,CAAC,oBAAe,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,UAAkB,SAA2D;AACzF,UAAM,SAAS,SAAS,UAAU;AAClC,UAAM,OAAO,CAAC,MAAM,SAAS,OAAO,QAAQ,GAAG,KAAK,MAAM,EAAE;AAE5D,QAAI,SAAS,gBAAgB,OAAW,MAAK,KAAK,aAAa,QAAQ,WAAW;AAClF,QAAI,SAAS,kBAAkB,OAAW,MAAK,KAAK,UAAU,QAAQ,aAAa;AACnF,QAAI,SAAS,iBAAiB,KAAM,MAAK,KAAK,iBAAiB;AAE/D,WAAO,KAAK,cAAc,EAAE,MAAM,KAAK,MAAM,UAAU,OAAO,CAAC;AAC/D,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AACvB,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA,EAEA,MAAM,YAAY,UAAuD;AACvE,UAAM,SAAS;AACf,UAAM,OAAO,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG,UAAU,MAAM;AAE9D,WAAO,MAAM,qBAAqB,EAAE,MAAM,KAAK,MAAM,SAAS,CAAC;AAC/D,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,QAAI;AACF,aAAO,GAAG,YAAY,KAAK,MAAM,OAAO,KAAK,CAAmB,CAAC;AAAA,IACnE,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,UACF,mCAAmC,gBAAgB,KAAK,CAAC,oBAAe,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,UAClG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,OACA,MACA,QACqC;AACrC,UAAM,OAAO,CAAC,SAAS,UAAU,WAAW,OAAO,UAAU,IAAI;AACjE,QAAI,WAAW,UAAa,OAAO,SAAS,EAAG,MAAK,KAAK,WAAW,OAAO,KAAK,GAAG,CAAC;AACpF,WAAO,MAAM,kBAAkB,EAAE,MAAM,KAAK,MAAM,MAAM,CAAC;AACzD,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AACvB,UAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,UAAM,QAAQ,WAAW,KAAK,GAAG;AACjC,UAAM,SAAS,QAAQ,CAAC,MAAM,SAAY,SAAS,MAAM,CAAC,GAAG,EAAE,IAAI;AACnE,WAAO,GAAG;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,SAAY,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,MAC9C,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,aAAqB,MAA+C;AACnF,UAAM,OAAO,CAAC,SAAS,WAAW,OAAO,WAAW,GAAG,UAAU,IAAI;AAErE,WAAO,MAAM,kBAAkB,EAAE,MAAM,KAAK,MAAM,YAAY,CAAC;AAC/D,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AACvB,WAAO,GAAG,MAAS;AAAA,EACrB;AAAA,EAEA,MAAM,aAAa,aAAuE;AACxF,UAAM,OAAO,CAAC,SAAS,QAAQ,OAAO,WAAW,GAAG,UAAU,YAAY,QAAQ,WAAW;AAE7F,WAAO,MAAM,oBAAoB,EAAE,MAAM,KAAK,MAAM,YAAY,CAAC;AACjE,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK,IAAI;AAC3C,QAAI,CAAC,OAAO,GAAI,QAAO;AAEvB,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,OAAO,KAAK;AACxC,aAAO,GAAG,SAAS,IAAI,UAAU,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,UACF,kCAAkC,gBAAgB,KAAK,CAAC,oBAAe,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,UACjG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
createLogger,
|
|
6
6
|
getTimeProvider
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
8
8
|
|
|
9
9
|
// src/mcp/tools/scanner-registry-fetcher.ts
|
|
10
10
|
import { z } from "zod";
|
|
@@ -698,4 +698,4 @@ export {
|
|
|
698
698
|
generateSecurityPlan,
|
|
699
699
|
buildPlanFromAnalysis
|
|
700
700
|
};
|
|
701
|
-
//# sourceMappingURL=chunk-
|
|
701
|
+
//# sourceMappingURL=chunk-CCODJRS6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getErrorMessage
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/setup-config.ts
|
|
6
6
|
import { copyFileSync, existsSync, writeFileSync } from "fs";
|
|
@@ -74,4 +74,4 @@ function ensureBackup(outputPath) {
|
|
|
74
74
|
export {
|
|
75
75
|
runConfigInitSync
|
|
76
76
|
};
|
|
77
|
-
//# sourceMappingURL=chunk-
|
|
77
|
+
//# sourceMappingURL=chunk-DGELGUZF.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getErrorMessage,
|
|
5
5
|
getTimeProvider,
|
|
6
6
|
ok
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Q3RFPJYK.js";
|
|
8
8
|
|
|
9
9
|
// src/context/session-memory.ts
|
|
10
10
|
import * as fs from "fs";
|
|
@@ -351,4 +351,4 @@ export {
|
|
|
351
351
|
SessionMemory,
|
|
352
352
|
createSessionMemory
|
|
353
353
|
};
|
|
354
|
-
//# sourceMappingURL=chunk-
|
|
354
|
+
//# sourceMappingURL=chunk-EQHYXT56.js.map
|