appsec-agent 2.8.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +0 -18
  2. package/dist/bin/agent-run.js +14 -17
  3. package/dist/bin/agent-run.js.map +1 -1
  4. package/dist/src/__tests__/mocks/codex_sdk.d.ts +53 -0
  5. package/dist/src/__tests__/mocks/codex_sdk.d.ts.map +1 -0
  6. package/dist/src/__tests__/mocks/codex_sdk.js +8 -0
  7. package/dist/src/__tests__/mocks/codex_sdk.js.map +1 -0
  8. package/dist/src/agent_actions.d.ts +1 -1
  9. package/dist/src/agent_actions.d.ts.map +1 -1
  10. package/dist/src/agent_actions.js +41 -27
  11. package/dist/src/agent_actions.js.map +1 -1
  12. package/dist/src/agent_options.d.ts +17 -93
  13. package/dist/src/agent_options.d.ts.map +1 -1
  14. package/dist/src/agent_options.js +191 -310
  15. package/dist/src/agent_options.js.map +1 -1
  16. package/dist/src/llm_query.d.ts +4 -43
  17. package/dist/src/llm_query.d.ts.map +1 -1
  18. package/dist/src/llm_query.js +4 -145
  19. package/dist/src/llm_query.js.map +1 -1
  20. package/dist/src/main.d.ts.map +1 -1
  21. package/dist/src/main.js +1 -7
  22. package/dist/src/main.js.map +1 -1
  23. package/dist/src/mcp_internal.d.ts +13 -0
  24. package/dist/src/mcp_internal.d.ts.map +1 -0
  25. package/dist/src/mcp_internal.js +34 -0
  26. package/dist/src/mcp_internal.js.map +1 -0
  27. package/dist/src/providers/claude_provider.d.ts +18 -0
  28. package/dist/src/providers/claude_provider.d.ts.map +1 -0
  29. package/dist/src/providers/claude_provider.js +27 -0
  30. package/dist/src/providers/claude_provider.js.map +1 -0
  31. package/dist/src/providers/claude_role_spec.d.ts +10 -0
  32. package/dist/src/providers/claude_role_spec.d.ts.map +1 -0
  33. package/dist/src/providers/claude_role_spec.js +85 -0
  34. package/dist/src/providers/claude_role_spec.js.map +1 -0
  35. package/dist/src/providers/codex_model.d.ts +12 -0
  36. package/dist/src/providers/codex_model.d.ts.map +1 -0
  37. package/dist/src/providers/codex_model.js +45 -0
  38. package/dist/src/providers/codex_model.js.map +1 -0
  39. package/dist/src/providers/codex_provider.d.ts +30 -0
  40. package/dist/src/providers/codex_provider.d.ts.map +1 -0
  41. package/dist/src/providers/codex_provider.js +170 -0
  42. package/dist/src/providers/codex_provider.js.map +1 -0
  43. package/dist/src/providers/codex_role_spec.d.ts +16 -0
  44. package/dist/src/providers/codex_role_spec.d.ts.map +1 -0
  45. package/dist/src/providers/codex_role_spec.js +63 -0
  46. package/dist/src/providers/codex_role_spec.js.map +1 -0
  47. package/dist/src/providers/query_message.d.ts +45 -0
  48. package/dist/src/providers/query_message.d.ts.map +1 -0
  49. package/dist/src/providers/query_message.js +8 -0
  50. package/dist/src/providers/query_message.js.map +1 -0
  51. package/dist/src/providers/resolve_provider.d.ts +10 -0
  52. package/dist/src/providers/resolve_provider.d.ts.map +1 -0
  53. package/dist/src/providers/resolve_provider.js +29 -0
  54. package/dist/src/providers/resolve_provider.js.map +1 -0
  55. package/dist/src/providers/role_spec.d.ts +39 -0
  56. package/dist/src/providers/role_spec.d.ts.map +1 -0
  57. package/dist/src/providers/role_spec.js +8 -0
  58. package/dist/src/providers/role_spec.js.map +1 -0
  59. package/dist/src/providers/structured_output.d.ts +21 -0
  60. package/dist/src/providers/structured_output.d.ts.map +1 -0
  61. package/dist/src/providers/structured_output.js +61 -0
  62. package/dist/src/providers/structured_output.js.map +1 -0
  63. package/dist/src/providers/types.d.ts +18 -0
  64. package/dist/src/providers/types.d.ts.map +1 -0
  65. package/dist/src/providers/types.js +15 -0
  66. package/dist/src/providers/types.js.map +1 -0
  67. package/dist/src/utils.js +1 -1
  68. package/dist/src/utils.js.map +1 -1
  69. package/package.json +3 -3
  70. package/dist/src/openai_tools.d.ts +0 -26
  71. package/dist/src/openai_tools.d.ts.map +0 -1
  72. package/dist/src/openai_tools.js +0 -194
  73. package/dist/src/openai_tools.js.map +0 -1
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Map RoleSpec to Claude Agent SDK Options (golden-parity path for migrated roles).
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import { Options } from '@anthropic-ai/claude-agent-sdk';
7
+ import type { RoleSpec } from './role_spec';
8
+ /** Convert a RoleSpec into Claude SDK Options. */
9
+ export declare function roleSpecToClaudeOptions(spec: RoleSpec): Options;
10
+ //# sourceMappingURL=claude_role_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude_role_spec.d.ts","sourceRoot":"","sources":["../../../src/providers/claude_role_spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAmB,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2B5C,kDAAkD;AAClD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAkD/D"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Map RoleSpec to Claude Agent SDK Options (golden-parity path for migrated roles).
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.roleSpecToClaudeOptions = roleSpecToClaudeOptions;
9
+ function mcpNamespacedTools(spec) {
10
+ if (!spec.mcp)
11
+ return [];
12
+ return spec.mcp.toolNames.map((tool) => `mcp__${spec.mcp.name}__${tool}`);
13
+ }
14
+ function resolveClaudeTools(spec) {
15
+ if (spec.allowedTools) {
16
+ return [...spec.allowedTools];
17
+ }
18
+ if (spec.noTools) {
19
+ return [];
20
+ }
21
+ return capabilitiesToClaudeTools(spec.capabilities);
22
+ }
23
+ function capabilitiesToClaudeTools(capabilities) {
24
+ const tools = [];
25
+ if (capabilities.read)
26
+ tools.push('Read');
27
+ if (capabilities.grep)
28
+ tools.push('Grep');
29
+ if (capabilities.write)
30
+ tools.push('Write');
31
+ if (capabilities.shell)
32
+ tools.push('Bash');
33
+ if (capabilities.graphviz)
34
+ tools.push('Graphviz');
35
+ return tools;
36
+ }
37
+ /** Convert a RoleSpec into Claude SDK Options. */
38
+ function roleSpecToClaudeOptions(spec) {
39
+ let tools = resolveClaudeTools(spec);
40
+ if (spec.mcp) {
41
+ tools = [...tools, ...mcpNamespacedTools(spec)];
42
+ }
43
+ const options = {
44
+ permissionMode: spec.permissionMode ?? 'default',
45
+ };
46
+ if (spec.agentName) {
47
+ options.agents = {
48
+ [spec.agentName]: {
49
+ description: spec.agentDescription ?? spec.agentName,
50
+ prompt: spec.systemPrompt,
51
+ tools,
52
+ model: spec.model,
53
+ maxTurns: spec.maxTurns,
54
+ },
55
+ };
56
+ }
57
+ else {
58
+ options.systemPrompt = spec.systemPrompt;
59
+ options.maxTurns = spec.maxTurns;
60
+ if (tools.length > 0) {
61
+ options.allowedTools = tools;
62
+ }
63
+ }
64
+ if (spec.outputSchema) {
65
+ options.outputFormat = {
66
+ type: 'json_schema',
67
+ schema: spec.outputSchema,
68
+ };
69
+ }
70
+ if (spec.mcp) {
71
+ const httpEntry = {
72
+ type: 'http',
73
+ url: spec.mcp.url,
74
+ };
75
+ if (spec.mcp.bearer) {
76
+ httpEntry.headers = { Authorization: `Bearer ${spec.mcp.bearer}` };
77
+ }
78
+ options.mcpServers = {
79
+ ...(options.mcpServers ?? {}),
80
+ [spec.mcp.name]: httpEntry,
81
+ };
82
+ }
83
+ return options;
84
+ }
85
+ //# sourceMappingURL=claude_role_spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude_role_spec.js","sourceRoot":"","sources":["../../../src/providers/claude_role_spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Codex model id resolution from Claude-style model aliases.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ /** Map Claude family aliases / prefixes to Codex model ids. */
7
+ export declare function resolveCodexModel(claudeModel?: string): string;
8
+ export declare function estimateCodexCostUsd(model: string, usage: {
9
+ input_tokens: number;
10
+ output_tokens: number;
11
+ }): number;
12
+ //# sourceMappingURL=codex_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_model.d.ts","sourceRoot":"","sources":["../../../src/providers/codex_model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAuB9D;AAWD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrD,MAAM,CAKR"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * Codex model id resolution from Claude-style model aliases.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.resolveCodexModel = resolveCodexModel;
9
+ exports.estimateCodexCostUsd = estimateCodexCostUsd;
10
+ const CLAUDE_FAMILY_ALIASES = ['sonnet', 'opus', 'haiku'];
11
+ /** Map Claude family aliases / prefixes to Codex model ids. */
12
+ function resolveCodexModel(claudeModel) {
13
+ const raw = (claudeModel ?? 'opus').toLowerCase().trim();
14
+ if (CLAUDE_FAMILY_ALIASES.includes(raw)) {
15
+ const map = {
16
+ opus: 'o3',
17
+ sonnet: 'gpt-4.1',
18
+ haiku: 'gpt-4.1-mini',
19
+ };
20
+ return map[raw] ?? 'o3';
21
+ }
22
+ for (const family of CLAUDE_FAMILY_ALIASES) {
23
+ if (raw.startsWith(`${family}-`)) {
24
+ return resolveCodexModel(family);
25
+ }
26
+ }
27
+ if (raw.startsWith('gpt-') || /^o\d/.test(raw)) {
28
+ return raw;
29
+ }
30
+ return 'o3';
31
+ }
32
+ /** Per-million-token USD rates for Codex cost estimation (approximate; spike defaults). */
33
+ const CODEX_COST_PER_MILLION = {
34
+ o3: { input: 10, output: 40 },
35
+ 'gpt-4.1': { input: 2, output: 8 },
36
+ 'gpt-4.1-mini': { input: 0.4, output: 1.6 },
37
+ };
38
+ const DEFAULT_RATES = { input: 2, output: 8 };
39
+ function estimateCodexCostUsd(model, usage) {
40
+ const rates = CODEX_COST_PER_MILLION[model] ?? DEFAULT_RATES;
41
+ const inputCost = (usage.input_tokens / 1_000_000) * rates.input;
42
+ const outputCost = (usage.output_tokens / 1_000_000) * rates.output;
43
+ return inputCost + outputCost;
44
+ }
45
+ //# sourceMappingURL=codex_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_model.js","sourceRoot":"","sources":["../../../src/providers/codex_model.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAKH,8CAuBC;AAWD,oDAQC;AA7CD,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEnE,+DAA+D;AAC/D,SAAgB,iBAAiB,CAAC,WAAoB;IACpD,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEzD,IAAI,qBAAqB,CAAC,QAAQ,CAAC,GAA6C,CAAC,EAAE,CAAC;QAClF,MAAM,GAAG,GAA2B;YAClC,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,cAAc;SACtB,CAAC;QACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2FAA2F;AAC3F,MAAM,sBAAsB,GAAsD;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7B,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IAClC,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAC5C,CAAC;AAEF,MAAM,aAAa,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAE9C,SAAgB,oBAAoB,CAClC,KAAa,EACb,KAAsD;IAEtD,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC;IAC7D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACjE,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACpE,OAAO,SAAS,GAAG,UAAU,CAAC;AAChC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Codex provider: maps RoleSpec to @openai/codex-sdk and normalizes events to QueryMessage.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import type { Input, ThreadEvent, TurnOptions } from '@openai/codex-sdk';
7
+ import { ModelProvider } from './types';
8
+ import type { QueryMessage } from './query_message';
9
+ import type { RoleSpec } from './role_spec';
10
+ import { roleSpecToCodexThreadOptions } from './codex_role_spec';
11
+ export { roleSpecToCodexThreadOptions } from './codex_role_spec';
12
+ export interface CodexStreamClient {
13
+ startThread(options?: ReturnType<typeof roleSpecToCodexThreadOptions>): {
14
+ runStreamed(input: Input, turnOptions?: TurnOptions): Promise<{
15
+ events: AsyncGenerator<ThreadEvent>;
16
+ }>;
17
+ };
18
+ }
19
+ export type CodexClientFactory = (spec: RoleSpec, codexHome: string) => CodexStreamClient;
20
+ export declare class CodexProvider extends ModelProvider {
21
+ private readonly clientFactory;
22
+ readonly provider: "codex";
23
+ constructor(clientFactory?: CodexClientFactory);
24
+ run(params: {
25
+ prompt: string;
26
+ roleSpec: RoleSpec;
27
+ }): AsyncGenerator<QueryMessage>;
28
+ }
29
+ export declare const defaultCodexProvider: CodexProvider;
30
+ //# sourceMappingURL=codex_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_provider.d.ts","sourceRoot":"","sources":["../../../src/providers/codex_provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAGL,4BAA4B,EAC7B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,GAAG;QACtE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;YAC5D,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;SACrC,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,KACd,iBAAiB,CAAC;AAyBvB,qBAAa,aAAc,SAAQ,aAAa;IAI5C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;gBAGlB,aAAa,GAAE,kBAA8C;IAKzE,GAAG,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,cAAc,CAAC,YAAY,CAAC;CA8FjC;AAED,eAAO,MAAM,oBAAoB,eAAsB,CAAC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Codex provider: maps RoleSpec to @openai/codex-sdk and normalizes events to QueryMessage.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.defaultCodexProvider = exports.CodexProvider = exports.roleSpecToCodexThreadOptions = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ const codex_sdk_1 = require("@openai/codex-sdk");
46
+ const types_1 = require("./types");
47
+ const codex_model_1 = require("./codex_model");
48
+ const structured_output_1 = require("./structured_output");
49
+ const codex_role_spec_1 = require("./codex_role_spec");
50
+ var codex_role_spec_2 = require("./codex_role_spec");
51
+ Object.defineProperty(exports, "roleSpecToCodexThreadOptions", { enumerable: true, get: function () { return codex_role_spec_2.roleSpecToCodexThreadOptions; } });
52
+ function createIsolatedCodexHome() {
53
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'codex-home-'));
54
+ }
55
+ function buildCodexEnv(codexHome) {
56
+ const env = {};
57
+ for (const [key, value] of Object.entries(process.env)) {
58
+ if (value !== undefined) {
59
+ env[key] = value;
60
+ }
61
+ }
62
+ env.CODEX_HOME = codexHome;
63
+ return env;
64
+ }
65
+ function defaultCodexClientFactory(spec, codexHome) {
66
+ const { threadOptions, clientOptions } = (0, codex_role_spec_1.buildCodexRunOptions)(spec);
67
+ return new codex_sdk_1.Codex({
68
+ ...clientOptions,
69
+ env: buildCodexEnv(codexHome),
70
+ });
71
+ }
72
+ class CodexProvider extends types_1.ModelProvider {
73
+ clientFactory;
74
+ provider = 'codex';
75
+ constructor(clientFactory = defaultCodexClientFactory) {
76
+ super();
77
+ this.clientFactory = clientFactory;
78
+ }
79
+ async *run(params) {
80
+ const { prompt, roleSpec } = params;
81
+ const codexHome = createIsolatedCodexHome();
82
+ try {
83
+ const { threadOptions } = (0, codex_role_spec_1.buildCodexRunOptions)(roleSpec);
84
+ const client = this.clientFactory(roleSpec, codexHome);
85
+ const thread = client.startThread(threadOptions);
86
+ const turnOptions = roleSpec.outputSchema
87
+ ? { outputSchema: roleSpec.outputSchema }
88
+ : undefined;
89
+ const { events } = await thread.runStreamed((0, codex_role_spec_1.buildCodexInput)(roleSpec, prompt), turnOptions);
90
+ let assistantText = '';
91
+ let streamedLength = 0;
92
+ let usage = null;
93
+ let turnFailed = null;
94
+ for await (const event of events) {
95
+ switch (event.type) {
96
+ case 'item.updated':
97
+ case 'item.completed': {
98
+ const item = event.item;
99
+ if (item.type === 'agent_message') {
100
+ assistantText = item.text;
101
+ if (event.type === 'item.updated' && item.text.length > streamedLength) {
102
+ const delta = item.text.slice(streamedLength);
103
+ streamedLength = item.text.length;
104
+ yield {
105
+ type: 'stream_event',
106
+ event: {
107
+ type: 'content_block_delta',
108
+ delta: { type: 'text_delta', text: delta },
109
+ },
110
+ };
111
+ }
112
+ if (event.type === 'item.completed') {
113
+ yield {
114
+ type: 'assistant',
115
+ message: { content: [{ type: 'text', text: item.text }] },
116
+ };
117
+ }
118
+ }
119
+ break;
120
+ }
121
+ case 'turn.completed':
122
+ usage = {
123
+ input_tokens: event.usage.input_tokens,
124
+ output_tokens: event.usage.output_tokens,
125
+ };
126
+ break;
127
+ case 'turn.failed':
128
+ turnFailed = event.error.message;
129
+ break;
130
+ case 'error':
131
+ turnFailed = event.message;
132
+ break;
133
+ default:
134
+ break;
135
+ }
136
+ }
137
+ const model = (0, codex_model_1.resolveCodexModel)(roleSpec.model);
138
+ const result = {
139
+ type: 'result',
140
+ is_error: turnFailed !== null,
141
+ error_message: turnFailed ?? undefined,
142
+ };
143
+ if (usage) {
144
+ result.usage = usage;
145
+ const cost = (0, codex_model_1.estimateCodexCostUsd)(model, usage);
146
+ if (cost > 0) {
147
+ result.total_cost_usd = cost;
148
+ }
149
+ }
150
+ if (roleSpec.outputSchema && !turnFailed) {
151
+ const validation = (0, structured_output_1.parseAndValidateStructuredOutput)(assistantText, roleSpec.outputSchema);
152
+ if (validation.ok) {
153
+ result.structured_output = validation.value;
154
+ }
155
+ else {
156
+ result.is_error = true;
157
+ result.errors = validation.errors;
158
+ result.error_message = validation.errors.join('; ');
159
+ }
160
+ }
161
+ yield result;
162
+ }
163
+ finally {
164
+ fs.rmSync(codexHome, { recursive: true, force: true });
165
+ }
166
+ }
167
+ }
168
+ exports.CodexProvider = CodexProvider;
169
+ exports.defaultCodexProvider = new CodexProvider();
170
+ //# sourceMappingURL=codex_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_provider.js","sourceRoot":"","sources":["../../../src/providers/codex_provider.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,iDAA0C;AAC1C,mCAAwC;AAGxC,+CAAwE;AACxE,2DAAuE;AACvE,uDAI2B;AAE3B,qDAAiE;AAAxD,+HAAA,4BAA4B,OAAA;AAerC,SAAS,uBAAuB;IAC9B,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAc,EAAE,SAAiB;IAClE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAA,sCAAoB,EAAC,IAAI,CAAC,CAAC;IACpE,OAAO,IAAI,iBAAK,CAAC;QACf,GAAG,aAAa;QAChB,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC;KAC9B,CAAsB,CAAC;AAC1B,CAAC;AAED,MAAa,aAAc,SAAQ,qBAAa;IAI3B;IAHV,QAAQ,GAAG,OAAgB,CAAC;IAErC,YACmB,gBAAoC,yBAAyB;QAE9E,KAAK,EAAE,CAAC;QAFS,kBAAa,GAAb,aAAa,CAAgD;IAGhF,CAAC;IAED,KAAK,CAAC,CAAC,GAAG,CAAC,MAGV;QACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QACpC,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,sCAAoB,EAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,WAAW,GAA4B,QAAQ,CAAC,YAAY;gBAChE,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE;gBACzC,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAA,iCAAe,EAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;YAE5F,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,KAAK,GAA2D,IAAI,CAAC;YACzE,IAAI,UAAU,GAAkB,IAAI,CAAC;YAErC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,cAAc,CAAC;oBACpB,KAAK,gBAAgB,CAAC,CAAC,CAAC;wBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;wBACxB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;4BAClC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC;4BAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;gCACvE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gCAC9C,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gCAClC,MAAM;oCACJ,IAAI,EAAE,cAAc;oCACpB,KAAK,EAAE;wCACL,IAAI,EAAE,qBAAqB;wCAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE;qCAC3C;iCACc,CAAC;4BACpB,CAAC;4BACD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gCACpC,MAAM;oCACJ,IAAI,EAAE,WAAW;oCACjB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;iCAC1C,CAAC;4BACpB,CAAC;wBACH,CAAC;wBACD,MAAM;oBACR,CAAC;oBACD,KAAK,gBAAgB;wBACnB,KAAK,GAAG;4BACN,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY;4BACtC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;yBACzC,CAAC;wBACF,MAAM;oBACR,KAAK,aAAa;wBAChB,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;wBACjC,MAAM;oBACR,KAAK,OAAO;wBACV,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC3B,MAAM;oBACR;wBACE,MAAM;gBACV,CAAC;YACH,CAAC;YAED,MAAM,KAAK,GAAG,IAAA,+BAAiB,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,MAAM,GAAkB;gBAC5B,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,UAAU,KAAK,IAAI;gBAC7B,aAAa,EAAE,UAAU,IAAI,SAAS;aACvC,CAAC;YAEF,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,MAAM,IAAI,GAAG,IAAA,kCAAoB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,IAAA,oDAAgC,EAAC,aAAa,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAC1F,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;oBAClB,MAAM,CAAC,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACvB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;oBAClC,MAAM,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AA1GD,sCA0GC;AAEY,QAAA,oBAAoB,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Map RoleSpec to @openai/codex-sdk client/thread options (incl. MCP wiring).
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import type { CodexOptions, ThreadOptions } from '@openai/codex-sdk';
7
+ import type { RoleSpec } from './role_spec';
8
+ /** Map RoleSpec capabilities to Codex sandbox / approval settings. */
9
+ export declare function roleSpecToCodexThreadOptions(spec: RoleSpec): ThreadOptions;
10
+ export declare function roleSpecToCodexClientOptions(spec: RoleSpec): CodexOptions;
11
+ export declare function buildCodexRunOptions(spec: RoleSpec): {
12
+ threadOptions: ThreadOptions;
13
+ clientOptions: CodexOptions;
14
+ };
15
+ export declare function buildCodexInput(spec: RoleSpec, prompt: string): string;
16
+ //# sourceMappingURL=codex_role_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_role_spec.d.ts","sourceRoot":"","sources":["../../../src/providers/codex_role_spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,sEAAsE;AACtE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,CAc1E;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CA0BzE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG;IACpD,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,YAAY,CAAC;CAC7B,CASA;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * Map RoleSpec to @openai/codex-sdk client/thread options (incl. MCP wiring).
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.roleSpecToCodexThreadOptions = roleSpecToCodexThreadOptions;
9
+ exports.roleSpecToCodexClientOptions = roleSpecToCodexClientOptions;
10
+ exports.buildCodexRunOptions = buildCodexRunOptions;
11
+ exports.buildCodexInput = buildCodexInput;
12
+ const codex_model_1 = require("./codex_model");
13
+ /** Map RoleSpec capabilities to Codex sandbox / approval settings. */
14
+ function roleSpecToCodexThreadOptions(spec) {
15
+ const readOnly = !spec.capabilities.write &&
16
+ !spec.capabilities.shell &&
17
+ !spec.capabilities.graphviz &&
18
+ !spec.mcp;
19
+ return {
20
+ model: (0, codex_model_1.resolveCodexModel)(spec.model),
21
+ workingDirectory: spec.workingDirectory ?? process.cwd(),
22
+ skipGitRepoCheck: true,
23
+ sandboxMode: readOnly ? 'read-only' : 'workspace-write',
24
+ approvalPolicy: spec.permissionMode === 'bypassPermissions' ? 'never' : 'on-request',
25
+ };
26
+ }
27
+ function roleSpecToCodexClientOptions(spec) {
28
+ const options = {
29
+ apiKey: process.env.CODEX_API_KEY,
30
+ baseUrl: process.env.CODEX_BASE_URL,
31
+ };
32
+ if (!spec.mcp) {
33
+ return options;
34
+ }
35
+ const serverConfig = {
36
+ url: spec.mcp.url,
37
+ enabled: true,
38
+ };
39
+ if (spec.mcp.bearer) {
40
+ serverConfig.http_headers = { Authorization: `Bearer ${spec.mcp.bearer}` };
41
+ }
42
+ options.config = {
43
+ mcp_servers: {
44
+ [spec.mcp.name]: serverConfig,
45
+ },
46
+ sandbox_workspace_write: { network_access: true },
47
+ };
48
+ return options;
49
+ }
50
+ function buildCodexRunOptions(spec) {
51
+ const threadOptions = roleSpecToCodexThreadOptions(spec);
52
+ if (spec.mcp && threadOptions.sandboxMode === 'read-only') {
53
+ threadOptions.sandboxMode = 'workspace-write';
54
+ }
55
+ return {
56
+ threadOptions,
57
+ clientOptions: roleSpecToCodexClientOptions(spec),
58
+ };
59
+ }
60
+ function buildCodexInput(spec, prompt) {
61
+ return `${spec.systemPrompt}\n\n---\n\n${prompt}`;
62
+ }
63
+ //# sourceMappingURL=codex_role_spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex_role_spec.js","sourceRoot":"","sources":["../../../src/providers/codex_role_spec.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAOH,oEAcC;AAED,oEA0BC;AAED,oDAYC;AAED,0CAEC;AA/DD,+CAAkD;AAElD,sEAAsE;AACtE,SAAgB,4BAA4B,CAAC,IAAc;IACzD,MAAM,QAAQ,GACZ,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK;QACxB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK;QACxB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ;QAC3B,CAAC,IAAI,CAAC,GAAG,CAAC;IAEZ,OAAO;QACL,KAAK,EAAE,IAAA,+BAAiB,EAAC,IAAI,CAAC,KAAK,CAAC;QACpC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE;QACxD,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB;QACvD,cAAc,EAAE,IAAI,CAAC,cAAc,KAAK,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;KACrF,CAAC;AACJ,CAAC;AAED,SAAgB,4BAA4B,CAAC,IAAc;IACzD,MAAM,OAAO,GAAiB;QAC5B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACjC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;KACpC,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAA4B;QAC5C,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG;QACjB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACpB,YAAY,CAAC,YAAY,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,CAAC,MAAM,GAAG;QACf,WAAW,EAAE;YACX,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY;SAC9B;QACD,uBAAuB,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;KACxB,CAAC;IAE5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAc;IAIjD,MAAM,aAAa,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QAC1D,aAAa,CAAC,WAAW,GAAG,iBAAiB,CAAC;IAChD,CAAC;IACD,OAAO;QACL,aAAa;QACb,aAAa,EAAE,4BAA4B,CAAC,IAAI,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,IAAc,EAAE,MAAc;IAC5D,OAAO,GAAG,IAAI,CAAC,YAAY,cAAc,MAAM,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Normalized stream message types shared by all model providers.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ /** Message types yielded by providers; same shape as Claude SDK for compatibility. */
7
+ export type StreamEventMessage = {
8
+ type: 'stream_event';
9
+ event: {
10
+ type: string;
11
+ delta?: {
12
+ type: string;
13
+ text?: string;
14
+ };
15
+ };
16
+ };
17
+ export type AssistantMessage = {
18
+ type: 'assistant';
19
+ message: {
20
+ content: Array<{
21
+ type: 'text';
22
+ text: string;
23
+ }>;
24
+ };
25
+ };
26
+ export type ResultMessage = {
27
+ type: 'result';
28
+ is_error: boolean;
29
+ num_turns?: number;
30
+ total_cost_usd?: number;
31
+ subtype?: string;
32
+ errors?: unknown[];
33
+ error_message?: string;
34
+ structured_output?: unknown;
35
+ usage?: {
36
+ input_tokens?: number;
37
+ output_tokens?: number;
38
+ };
39
+ };
40
+ /** Passthrough for SDK-only types (e.g. tool_progress) when using Anthropic. */
41
+ export type QueryMessage = StreamEventMessage | AssistantMessage | ResultMessage | {
42
+ type: string;
43
+ [key: string]: unknown;
44
+ };
45
+ //# sourceMappingURL=query_message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_message.d.ts","sourceRoot":"","sources":["../../../src/providers/query_message.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAClE,CAAC;AACF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAC7D,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D,CAAC;AACF,gFAAgF;AAChF,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Normalized stream message types shared by all model providers.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=query_message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_message.js","sourceRoot":"","sources":["../../../src/providers/query_message.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve the active model provider from AGENT_PROVIDER env / CLI.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import { ModelProvider } from './types';
7
+ export type ProviderId = 'claude' | 'codex';
8
+ export declare function normalizeProviderId(raw: string | undefined): ProviderId;
9
+ export declare function resolveProvider(): ModelProvider;
10
+ //# sourceMappingURL=resolve_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve_provider.d.ts","sourceRoot":"","sources":["../../../src/providers/resolve_provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAI5C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAQvE;AAED,wBAAgB,eAAe,IAAI,aAAa,CAS/C"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Resolve the active model provider from AGENT_PROVIDER env / CLI.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.normalizeProviderId = normalizeProviderId;
9
+ exports.resolveProvider = resolveProvider;
10
+ const claude_provider_1 = require("./claude_provider");
11
+ const VALID_PROVIDERS = ['claude', 'codex'];
12
+ function normalizeProviderId(raw) {
13
+ const id = (raw ?? 'claude').toLowerCase().trim();
14
+ if (VALID_PROVIDERS.includes(id)) {
15
+ return id;
16
+ }
17
+ throw new Error(`Invalid provider "${raw}". Valid values: ${VALID_PROVIDERS.join(', ')}`);
18
+ }
19
+ function resolveProvider() {
20
+ const id = normalizeProviderId(process.env.AGENT_PROVIDER);
21
+ if (id === 'codex') {
22
+ // Lazy-load so Claude-only test runs do not require @openai/codex-sdk resolution.
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const { defaultCodexProvider } = require('./codex_provider');
25
+ return defaultCodexProvider;
26
+ }
27
+ return claude_provider_1.defaultClaudeProvider;
28
+ }
29
+ //# sourceMappingURL=resolve_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve_provider.js","sourceRoot":"","sources":["../../../src/providers/resolve_provider.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AASH,kDAQC;AAED,0CASC;AAzBD,uDAA0D;AAI1D,MAAM,eAAe,GAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAE1D,SAAgB,mBAAmB,CAAC,GAAuB;IACzD,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAgB,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,qBAAqB,GAAG,oBAAoB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,kFAAkF;QAClF,iEAAiE;QACjE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAsC,CAAC;QAClG,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,OAAO,uCAAqB,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Provider-neutral role specification (emerges from threat_modeler spike, Phase 3).
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ export interface RoleCapabilities {
7
+ read?: boolean;
8
+ write?: boolean;
9
+ grep?: boolean;
10
+ shell?: boolean;
11
+ graphviz?: boolean;
12
+ }
13
+ export interface RoleMcpConfig {
14
+ url: string;
15
+ name: string;
16
+ bearer?: string;
17
+ toolNames: string[];
18
+ }
19
+ /** Neutral role description consumed by ClaudeProvider and CodexProvider. */
20
+ export interface RoleSpec {
21
+ /** Role key for error messages and provider routing (e.g. threat_modeler). */
22
+ roleId: string;
23
+ systemPrompt: string;
24
+ maxTurns: number;
25
+ /** When set, ClaudeProvider emits the named subagent shape. */
26
+ agentName?: string;
27
+ agentDescription?: string;
28
+ capabilities: RoleCapabilities;
29
+ /** When set, overrides capability-derived Claude/Codex tool lists (e.g. diff noTools → Write only). */
30
+ allowedTools?: string[];
31
+ noTools?: boolean;
32
+ permissionMode?: 'bypassPermissions' | 'default';
33
+ mcp?: RoleMcpConfig;
34
+ outputSchema?: Record<string, unknown>;
35
+ model?: string;
36
+ /** Codex working directory; Claude ignores (uses process cwd). */
37
+ workingDirectory?: string;
38
+ }
39
+ //# sourceMappingURL=role_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role_spec.d.ts","sourceRoot":"","sources":["../../../src/providers/role_spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ;IACvB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Provider-neutral role specification (emerges from threat_modeler spike, Phase 3).
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=role_spec.js.map