appsec-agent 2.7.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 (83) hide show
  1. package/README.md +57 -18
  2. package/conf/appsec_agent.yaml +13 -0
  3. package/dist/bin/agent-run.js +16 -18
  4. package/dist/bin/agent-run.js.map +1 -1
  5. package/dist/conf/appsec_agent.yaml +13 -0
  6. package/dist/src/__tests__/mocks/codex_sdk.d.ts +53 -0
  7. package/dist/src/__tests__/mocks/codex_sdk.d.ts.map +1 -0
  8. package/dist/src/__tests__/mocks/codex_sdk.js +8 -0
  9. package/dist/src/__tests__/mocks/codex_sdk.js.map +1 -0
  10. package/dist/src/agent_actions.d.ts +22 -2
  11. package/dist/src/agent_actions.d.ts.map +1 -1
  12. package/dist/src/agent_actions.js +144 -26
  13. package/dist/src/agent_actions.js.map +1 -1
  14. package/dist/src/agent_options.d.ts +43 -83
  15. package/dist/src/agent_options.d.ts.map +1 -1
  16. package/dist/src/agent_options.js +237 -280
  17. package/dist/src/agent_options.js.map +1 -1
  18. package/dist/src/index.d.ts +1 -0
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +7 -1
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/llm_query.d.ts +4 -43
  23. package/dist/src/llm_query.d.ts.map +1 -1
  24. package/dist/src/llm_query.js +4 -145
  25. package/dist/src/llm_query.js.map +1 -1
  26. package/dist/src/main.d.ts.map +1 -1
  27. package/dist/src/main.js +75 -7
  28. package/dist/src/main.js.map +1 -1
  29. package/dist/src/mcp_internal.d.ts +13 -0
  30. package/dist/src/mcp_internal.d.ts.map +1 -0
  31. package/dist/src/mcp_internal.js +34 -0
  32. package/dist/src/mcp_internal.js.map +1 -0
  33. package/dist/src/providers/claude_provider.d.ts +18 -0
  34. package/dist/src/providers/claude_provider.d.ts.map +1 -0
  35. package/dist/src/providers/claude_provider.js +27 -0
  36. package/dist/src/providers/claude_provider.js.map +1 -0
  37. package/dist/src/providers/claude_role_spec.d.ts +10 -0
  38. package/dist/src/providers/claude_role_spec.d.ts.map +1 -0
  39. package/dist/src/providers/claude_role_spec.js +85 -0
  40. package/dist/src/providers/claude_role_spec.js.map +1 -0
  41. package/dist/src/providers/codex_model.d.ts +12 -0
  42. package/dist/src/providers/codex_model.d.ts.map +1 -0
  43. package/dist/src/providers/codex_model.js +45 -0
  44. package/dist/src/providers/codex_model.js.map +1 -0
  45. package/dist/src/providers/codex_provider.d.ts +30 -0
  46. package/dist/src/providers/codex_provider.d.ts.map +1 -0
  47. package/dist/src/providers/codex_provider.js +170 -0
  48. package/dist/src/providers/codex_provider.js.map +1 -0
  49. package/dist/src/providers/codex_role_spec.d.ts +16 -0
  50. package/dist/src/providers/codex_role_spec.d.ts.map +1 -0
  51. package/dist/src/providers/codex_role_spec.js +63 -0
  52. package/dist/src/providers/codex_role_spec.js.map +1 -0
  53. package/dist/src/providers/query_message.d.ts +45 -0
  54. package/dist/src/providers/query_message.d.ts.map +1 -0
  55. package/dist/src/providers/query_message.js +8 -0
  56. package/dist/src/providers/query_message.js.map +1 -0
  57. package/dist/src/providers/resolve_provider.d.ts +10 -0
  58. package/dist/src/providers/resolve_provider.d.ts.map +1 -0
  59. package/dist/src/providers/resolve_provider.js +29 -0
  60. package/dist/src/providers/resolve_provider.js.map +1 -0
  61. package/dist/src/providers/role_spec.d.ts +39 -0
  62. package/dist/src/providers/role_spec.d.ts.map +1 -0
  63. package/dist/src/providers/role_spec.js +8 -0
  64. package/dist/src/providers/role_spec.js.map +1 -0
  65. package/dist/src/providers/structured_output.d.ts +21 -0
  66. package/dist/src/providers/structured_output.d.ts.map +1 -0
  67. package/dist/src/providers/structured_output.js +61 -0
  68. package/dist/src/providers/structured_output.js.map +1 -0
  69. package/dist/src/providers/types.d.ts +18 -0
  70. package/dist/src/providers/types.d.ts.map +1 -0
  71. package/dist/src/providers/types.js +15 -0
  72. package/dist/src/providers/types.js.map +1 -0
  73. package/dist/src/schemas/fp_adversary_pass.d.ts +188 -0
  74. package/dist/src/schemas/fp_adversary_pass.d.ts.map +1 -0
  75. package/dist/src/schemas/fp_adversary_pass.js +258 -0
  76. package/dist/src/schemas/fp_adversary_pass.js.map +1 -0
  77. package/dist/src/utils.js +1 -1
  78. package/dist/src/utils.js.map +1 -1
  79. package/package.json +4 -4
  80. package/dist/src/openai_tools.d.ts +0 -26
  81. package/dist/src/openai_tools.d.ts.map +0 -1
  82. package/dist/src/openai_tools.js +0 -194
  83. package/dist/src/openai_tools.js.map +0 -1
@@ -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":"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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role_spec.js","sourceRoot":"","sources":["../../../src/providers/role_spec.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Post-run structured output parsing and validation for non-Claude providers.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ export declare function extractJsonFromAssistantText(text: string): unknown | null;
7
+ /** Minimal JSON Schema required-field check (no external validator). */
8
+ export declare function validateRequiredJsonSchemaFields(value: unknown, schema: Record<string, unknown>): {
9
+ ok: true;
10
+ } | {
11
+ ok: false;
12
+ errors: string[];
13
+ };
14
+ export declare function parseAndValidateStructuredOutput(text: string, schema: Record<string, unknown>): {
15
+ ok: true;
16
+ value: unknown;
17
+ } | {
18
+ ok: false;
19
+ errors: string[];
20
+ };
21
+ //# sourceMappingURL=structured_output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured_output.d.ts","sourceRoot":"","sources":["../../../src/providers/structured_output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAqBzE;AAED,wEAAwE;AACxE,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBhD;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAUhE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Post-run structured output parsing and validation for non-Claude providers.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.extractJsonFromAssistantText = extractJsonFromAssistantText;
9
+ exports.validateRequiredJsonSchemaFields = validateRequiredJsonSchemaFields;
10
+ exports.parseAndValidateStructuredOutput = parseAndValidateStructuredOutput;
11
+ function extractJsonFromAssistantText(text) {
12
+ const trimmed = text.trim();
13
+ if (!trimmed)
14
+ return null;
15
+ const fenceMatch = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/i);
16
+ const candidate = fenceMatch ? fenceMatch[1].trim() : trimmed;
17
+ try {
18
+ return JSON.parse(candidate);
19
+ }
20
+ catch {
21
+ const start = candidate.indexOf('{');
22
+ const end = candidate.lastIndexOf('}');
23
+ if (start >= 0 && end > start) {
24
+ try {
25
+ return JSON.parse(candidate.slice(start, end + 1));
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ return null;
32
+ }
33
+ }
34
+ /** Minimal JSON Schema required-field check (no external validator). */
35
+ function validateRequiredJsonSchemaFields(value, schema) {
36
+ const errors = [];
37
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
38
+ return { ok: false, errors: ['root value must be a JSON object'] };
39
+ }
40
+ const required = schema.required;
41
+ if (Array.isArray(required)) {
42
+ for (const key of required) {
43
+ if (typeof key === 'string' && !(key in value)) {
44
+ errors.push(`missing required property: ${key}`);
45
+ }
46
+ }
47
+ }
48
+ return errors.length === 0 ? { ok: true } : { ok: false, errors };
49
+ }
50
+ function parseAndValidateStructuredOutput(text, schema) {
51
+ const parsed = extractJsonFromAssistantText(text);
52
+ if (parsed === null) {
53
+ return { ok: false, errors: ['assistant text is not valid JSON'] };
54
+ }
55
+ const validation = validateRequiredJsonSchemaFields(parsed, schema);
56
+ if (!validation.ok) {
57
+ return validation;
58
+ }
59
+ return { ok: true, value: parsed };
60
+ }
61
+ //# sourceMappingURL=structured_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured_output.js","sourceRoot":"","sources":["../../../src/providers/structured_output.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAEH,oEAqBC;AAGD,4EAmBC;AAED,4EAaC;AA1DD,SAAgB,4BAA4B,CAAC,IAAY;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAgB,gCAAgC,CAC9C,KAAc,EACd,MAA+B;IAE/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,kCAAkC,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAK,KAAiC,CAAC,EAAE,CAAC;gBAC5E,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED,SAAgB,gCAAgC,CAC9C,IAAY,EACZ,MAA+B;IAE/B,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,kCAAkC,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Model provider abstraction for pluggable LLM runtimes.
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import type { RoleSpec } from './role_spec';
7
+ import type { QueryMessage } from './query_message';
8
+ export type { QueryMessage } from './query_message';
9
+ export type { RoleSpec, RoleCapabilities, RoleMcpConfig } from './role_spec';
10
+ export declare abstract class ModelProvider {
11
+ abstract readonly provider: 'claude' | 'codex';
12
+ abstract run(params: {
13
+ prompt: string;
14
+ roleSpec: RoleSpec;
15
+ }): AsyncGenerator<QueryMessage>;
16
+ protected formatCostLine(usd: number): string;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7E,8BAAsB,aAAa;IACjC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAE/C,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,cAAc,CAAC,YAAY,CAAC;IAEhC,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG9C"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * Model provider abstraction for pluggable LLM runtimes.
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ModelProvider = void 0;
9
+ class ModelProvider {
10
+ formatCostLine(usd) {
11
+ return `\nCost: $${usd.toFixed(4)}`;
12
+ }
13
+ }
14
+ exports.ModelProvider = ModelProvider;
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAQH,MAAsB,aAAa;IAQvB,cAAc,CAAC,GAAW;QAClC,OAAO,YAAY,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;CACF;AAXD,sCAWC"}