appsec-agent 0.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.
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * Agent Options Management for AppSec AI Agent
4
+ *
5
+ * Author: Sam Li
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AgentOptions = void 0;
9
+ class AgentOptions {
10
+ confDict;
11
+ environment;
12
+ toolUsageLog = [];
13
+ constructor(confDict, environment) {
14
+ this.confDict = confDict;
15
+ this.environment = environment;
16
+ }
17
+ /**
18
+ * Tool permission callback to control tool access
19
+ */
20
+ toolPermissionCallback = async (toolName, inputData, options) => {
21
+ // Log the tool request
22
+ this.toolUsageLog.push({
23
+ tool: toolName,
24
+ input: inputData,
25
+ suggestions: options.suggestions ? JSON.stringify(options.suggestions) : ''
26
+ });
27
+ console.log(`\n🔧 Tool Permission Request: ${toolName}`);
28
+ console.log(` Input: ${JSON.stringify(inputData, null, 2)}`);
29
+ if (options.suggestions) {
30
+ console.log(` Suggestions: ${JSON.stringify(options.suggestions)}`);
31
+ }
32
+ console.log();
33
+ // Auto-approve all tools
34
+ return { behavior: 'allow', updatedInput: inputData };
35
+ };
36
+ /**
37
+ * Get options for simple query agent
38
+ */
39
+ getSimpleQueryAgentOptions(role = 'simple_query_agent') {
40
+ const roleConfig = this.confDict[this.environment]?.[role];
41
+ return {
42
+ systemPrompt: roleConfig?.options?.system_prompt || 'You are an AppSec expert assistant.',
43
+ maxTurns: roleConfig?.options?.max_turns || 1
44
+ };
45
+ }
46
+ /**
47
+ * Get options for code reviewer
48
+ */
49
+ getCodeReviewerOptions(role = 'code_reviewer') {
50
+ const roleConfig = this.confDict[this.environment]?.[role];
51
+ const systemPrompt = roleConfig?.options?.system_prompt ||
52
+ 'You are a code reviewer assistant. Review code for security and privacy issues.';
53
+ return {
54
+ agents: {
55
+ 'code-reviewer': {
56
+ description: 'Reviews code for best practices and potential security and privacy issues',
57
+ prompt: systemPrompt,
58
+ tools: ['Read', 'Grep', 'Write'],
59
+ model: 'sonnet'
60
+ }
61
+ },
62
+ permissionMode: 'bypassPermissions'
63
+ };
64
+ }
65
+ /**
66
+ * Get options for threat modeler
67
+ */
68
+ getThreatModelerOptions(role = 'threat_modeler') {
69
+ const roleConfig = this.confDict[this.environment]?.[role];
70
+ const systemPrompt = roleConfig?.options?.system_prompt ||
71
+ 'You are a code reviewer assistant. Perform risk assessment on source code for SOC2 type 2 compliance audit.';
72
+ return {
73
+ agents: {
74
+ 'code-reviewer': {
75
+ description: 'Threat modeler agent',
76
+ prompt: systemPrompt,
77
+ tools: ['Read', 'Grep', 'Write', 'Graphviz'],
78
+ model: 'sonnet'
79
+ }
80
+ },
81
+ permissionMode: 'bypassPermissions' // Skip all approval prompts - tools are pre-approved
82
+ };
83
+ }
84
+ }
85
+ exports.AgentOptions = AgentOptions;
86
+ //# sourceMappingURL=agent_options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_options.js","sourceRoot":"","sources":["../src/agent_options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Main entry point exports for AppSec AI Agent
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ export { AgentActions, AgentArgs } from './agent_actions';
7
+ export { AgentOptions, ToolUsageLog } from './agent_options';
8
+ export { main } from './main';
9
+ export * from './utils';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * Main entry point exports for AppSec AI Agent
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.main = exports.AgentOptions = exports.AgentActions = void 0;
23
+ var agent_actions_1 = require("./agent_actions");
24
+ Object.defineProperty(exports, "AgentActions", { enumerable: true, get: function () { return agent_actions_1.AgentActions; } });
25
+ var agent_options_1 = require("./agent_options");
26
+ Object.defineProperty(exports, "AgentOptions", { enumerable: true, get: function () { return agent_options_1.AgentOptions; } });
27
+ var main_1 = require("./main");
28
+ Object.defineProperty(exports, "main", { enumerable: true, get: function () { return main_1.main; } });
29
+ __exportStar(require("./utils"), exports);
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;AAEH,iDAA0D;AAAjD,6GAAA,YAAY,OAAA;AACrB,iDAA6D;AAApD,6GAAA,YAAY,OAAA;AACrB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,0CAAwB"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Main entry point for AppSec AI Agent
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ import { AgentArgs } from './agent_actions';
7
+ export declare function main(confDict: any, args: AgentArgs): Promise<void>;
8
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAgB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG1D,wBAAsB,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DxE"}
package/dist/main.js ADDED
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Main entry point for AppSec AI Agent
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.main = main;
42
+ const fs = __importStar(require("fs-extra"));
43
+ const agent_actions_1 = require("./agent_actions");
44
+ const utils_1 = require("./utils");
45
+ async function main(confDict, args) {
46
+ const agentActions = new agent_actions_1.AgentActions(confDict, args.environment, args);
47
+ if (args.role === 'simple_query_agent') {
48
+ console.log('Running Simple Query Agent');
49
+ const readline = require('readline');
50
+ const rl = readline.createInterface({
51
+ input: process.stdin,
52
+ output: process.stdout
53
+ });
54
+ const yourPrompt = await new Promise((resolve) => {
55
+ rl.question('Please enter your query: ', (answer) => {
56
+ rl.close();
57
+ resolve(answer);
58
+ });
59
+ });
60
+ await agentActions.simpleQueryClaudeWithOptions(yourPrompt);
61
+ }
62
+ else if (args.role === 'code_reviewer') {
63
+ console.log('Running Code Review Agent');
64
+ let userPrompt;
65
+ if (args.src_dir) {
66
+ const currentWorkingDir = process.cwd();
67
+ const tmpSrcDir = (0, utils_1.copyProjectSrcDir)(currentWorkingDir, args.src_dir);
68
+ userPrompt = `Review the code in the current working directory ${tmpSrcDir}, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${args.output_file} file under current working directory in ${args.output_format} format.`;
69
+ }
70
+ else {
71
+ userPrompt = `Review the code in the current working directory, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${args.output_file} file under current working directory in ${args.output_format} format.`;
72
+ }
73
+ await agentActions.codeReviewerWithOptions(userPrompt);
74
+ }
75
+ else if (args.role === 'threat_modeler') {
76
+ console.log('Running Threat Modeler');
77
+ const userPrompt0 = `Draw the ASCII text based Data Flow Diagram (DFD), with output format as <codebase_data_flow_diagram_text_timestamp>. Then proceeding to use STRIDE methodology to perform threat modeling on the DFD, without output report in the format <codebase_threat_model_timestamp>. Finally, provide a separate risk registry report including proposed remediation plan in the format <codebase_risk_registry_text_timestamp>. We're looking for 3 reports in the current working directory as the deliverable. Please write the threat modeler report in the ${args.output_file} file under current working directory in ${args.output_format} format.`;
78
+ let tmpSrcDir = null;
79
+ let userPrompt;
80
+ if (args.src_dir) {
81
+ const currentWorkingDir = process.cwd();
82
+ tmpSrcDir = (0, utils_1.copyProjectSrcDir)(currentWorkingDir, args.src_dir);
83
+ userPrompt = `Review the code in the ${tmpSrcDir} directory. ${userPrompt0}`;
84
+ }
85
+ else {
86
+ userPrompt = `Review the code in the current working directory. ${userPrompt0}`;
87
+ }
88
+ await agentActions.threatModelerAgentWithOptions(userPrompt);
89
+ // Clean up temporary source code directory
90
+ if (tmpSrcDir && fs.existsSync(tmpSrcDir)) {
91
+ fs.removeSync(tmpSrcDir);
92
+ }
93
+ }
94
+ else {
95
+ console.error(`Error: Invalid appsec AI agent role: ${args.role} - refer to 'appsec_agent.yaml' for available roles`);
96
+ process.exit(1);
97
+ }
98
+ process.exit(0);
99
+ }
100
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Utility functions for AppSec AI Agent
3
+ *
4
+ * Author: Sam Li
5
+ */
6
+ export interface ConfigDict {
7
+ [key: string]: any;
8
+ }
9
+ /**
10
+ * Check if a path is a valid directory
11
+ */
12
+ export declare function isDirectory(dirName: string): boolean;
13
+ /**
14
+ * Check if a path is a valid file
15
+ */
16
+ export declare function isFile(fileName: string): boolean;
17
+ /**
18
+ * Convert file rows to a list, filtering out comments
19
+ */
20
+ export declare function fileToList(file: string): string[];
21
+ /**
22
+ * Convert a list to a file, one row at a time
23
+ */
24
+ export declare function listToFile(list: string[], file: string): boolean;
25
+ /**
26
+ * Convert JSON file content to object
27
+ */
28
+ export declare function fileToJson(file: string): any;
29
+ /**
30
+ * Convert JSON data to a file
31
+ */
32
+ export declare function jsonToFile(jsonData: any, file: string): boolean;
33
+ /**
34
+ * Execute shell command and return code, stdout, stderr
35
+ */
36
+ export declare function runCommand(cmd: string): {
37
+ code: number;
38
+ stdout: string;
39
+ stderr: string;
40
+ };
41
+ /**
42
+ * Get the project root absolute path
43
+ */
44
+ export declare function getProjectRoot(): string;
45
+ export declare function loadYaml(confFile: string, verbose?: boolean): ConfigDict | null;
46
+ /**
47
+ * Get property value from package.json
48
+ */
49
+ export declare function getProperty(prop: string): string;
50
+ /**
51
+ * Copy project source code directory to current working directory
52
+ */
53
+ export declare function copyProjectSrcDir(currentWorkingDir: string, srcDir: string): string;
54
+ /**
55
+ * List all available roles
56
+ */
57
+ export declare function listRoles(confDict: ConfigDict, environment: string): void;
58
+ /**
59
+ * Print program version info
60
+ */
61
+ export declare function printVersionInfo(): void;
62
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAQ5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAWxF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAsED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,UAAU,GAAG,IAAI,CA2BtF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBnF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAUzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC"}
package/dist/utils.js ADDED
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ /**
3
+ * Utility functions for AppSec AI Agent
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.isDirectory = isDirectory;
42
+ exports.isFile = isFile;
43
+ exports.fileToList = fileToList;
44
+ exports.listToFile = listToFile;
45
+ exports.fileToJson = fileToJson;
46
+ exports.jsonToFile = jsonToFile;
47
+ exports.runCommand = runCommand;
48
+ exports.getProjectRoot = getProjectRoot;
49
+ exports.loadYaml = loadYaml;
50
+ exports.getProperty = getProperty;
51
+ exports.copyProjectSrcDir = copyProjectSrcDir;
52
+ exports.listRoles = listRoles;
53
+ exports.printVersionInfo = printVersionInfo;
54
+ const fs = __importStar(require("fs-extra"));
55
+ const path = __importStar(require("path"));
56
+ const yaml = __importStar(require("yaml"));
57
+ const child_process_1 = require("child_process");
58
+ /**
59
+ * Check if a path is a valid directory
60
+ */
61
+ function isDirectory(dirName) {
62
+ try {
63
+ return fs.existsSync(dirName) && fs.statSync(dirName).isDirectory();
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ /**
70
+ * Check if a path is a valid file
71
+ */
72
+ function isFile(fileName) {
73
+ try {
74
+ return fs.statSync(fileName).isFile();
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * Convert file rows to a list, filtering out comments
82
+ */
83
+ function fileToList(file) {
84
+ const commentPattern = /^#|^\s+#/;
85
+ const myList = [];
86
+ try {
87
+ const content = fs.readFileSync(file, 'utf-8');
88
+ const lines = content.split('\n');
89
+ for (const line of lines) {
90
+ const trimmed = line.trim();
91
+ if (trimmed && !commentPattern.test(trimmed)) {
92
+ myList.push(trimmed);
93
+ }
94
+ }
95
+ }
96
+ catch (error) {
97
+ console.error(`Error reading file ${file}:`, error);
98
+ }
99
+ return myList;
100
+ }
101
+ /**
102
+ * Convert a list to a file, one row at a time
103
+ */
104
+ function listToFile(list, file) {
105
+ try {
106
+ fs.writeFileSync(file, list.join('\n') + '\n');
107
+ return true;
108
+ }
109
+ catch (error) {
110
+ console.error('Error:', error);
111
+ return false;
112
+ }
113
+ }
114
+ /**
115
+ * Convert JSON file content to object
116
+ */
117
+ function fileToJson(file) {
118
+ try {
119
+ const content = fs.readFileSync(file, 'utf-8').replace(/\n/g, '');
120
+ return JSON.parse(content);
121
+ }
122
+ catch (error) {
123
+ console.error(`Error reading JSON file ${file}:`, error);
124
+ return {};
125
+ }
126
+ }
127
+ /**
128
+ * Convert JSON data to a file
129
+ */
130
+ function jsonToFile(jsonData, file) {
131
+ try {
132
+ fs.writeFileSync(file, JSON.stringify(jsonData, null, 4));
133
+ return true;
134
+ }
135
+ catch (error) {
136
+ console.error('Error:', error);
137
+ return false;
138
+ }
139
+ }
140
+ /**
141
+ * Execute shell command and return code, stdout, stderr
142
+ */
143
+ function runCommand(cmd) {
144
+ try {
145
+ const stdout = (0, child_process_1.execSync)(cmd, { encoding: 'utf-8' });
146
+ return { code: 0, stdout, stderr: '' };
147
+ }
148
+ catch (error) {
149
+ return {
150
+ code: error.status || 1,
151
+ stdout: error.stdout?.toString() || '',
152
+ stderr: error.stderr?.toString() || error.message || ''
153
+ };
154
+ }
155
+ }
156
+ /**
157
+ * Get the project root absolute path
158
+ */
159
+ function getProjectRoot() {
160
+ return path.resolve(__dirname, '..');
161
+ }
162
+ /**
163
+ * Process environment variable references in YAML
164
+ */
165
+ function processEnvVars(value) {
166
+ if (typeof value === 'string') {
167
+ const envPattern = /^<%= ENV\['(.*)'\] %>(.*)$/;
168
+ const match = value.match(envPattern);
169
+ if (match) {
170
+ return process.env[match[1]] || match[2] || '';
171
+ }
172
+ }
173
+ else if (Array.isArray(value)) {
174
+ return value.map(processEnvVars);
175
+ }
176
+ else if (typeof value === 'object' && value !== null) {
177
+ const processed = {};
178
+ for (const [key, val] of Object.entries(value)) {
179
+ processed[key] = processEnvVars(val);
180
+ }
181
+ return processed;
182
+ }
183
+ return value;
184
+ }
185
+ /**
186
+ * Load YAML configuration file
187
+ */
188
+ /**
189
+ * Expand YAML merge keys (<<: *anchor)
190
+ */
191
+ function expandMergeKeys(obj) {
192
+ if (obj === null || typeof obj !== 'object') {
193
+ return obj;
194
+ }
195
+ if (Array.isArray(obj)) {
196
+ return obj.map(expandMergeKeys);
197
+ }
198
+ const expanded = {};
199
+ // First, expand all merge keys
200
+ const mergeKeys = [];
201
+ for (const [key, value] of Object.entries(obj)) {
202
+ if (key === '<<') {
203
+ // Handle merge key - can be single object or array
204
+ const mergeValue = Array.isArray(value) ? value : [value];
205
+ mergeKeys.push(...mergeValue.map(expandMergeKeys));
206
+ }
207
+ else {
208
+ expanded[key] = expandMergeKeys(value);
209
+ }
210
+ }
211
+ // Merge all merge keys into the expanded object (later keys override earlier ones)
212
+ for (const mergeObj of mergeKeys) {
213
+ if (mergeObj && typeof mergeObj === 'object') {
214
+ Object.assign(expanded, mergeObj);
215
+ }
216
+ }
217
+ // Finally, apply the non-merge keys (they override merged values)
218
+ for (const [key, value] of Object.entries(obj)) {
219
+ if (key !== '<<') {
220
+ expanded[key] = expandMergeKeys(value);
221
+ }
222
+ }
223
+ return expanded;
224
+ }
225
+ function loadYaml(confFile, verbose = false) {
226
+ console.log(`Loading yaml configuration file: ${confFile}`);
227
+ if (!isFile(confFile)) {
228
+ console.error(`Error file not exist: ${confFile}`);
229
+ return null;
230
+ }
231
+ try {
232
+ const content = fs.readFileSync(confFile, 'utf-8');
233
+ const parsed = yaml.parse(content);
234
+ // Expand YAML merge keys first
235
+ const withMerges = expandMergeKeys(parsed);
236
+ // Process environment variable references
237
+ const processed = processEnvVars(withMerges);
238
+ if (verbose) {
239
+ console.log('conf_dict:', JSON.stringify(processed, null, 2));
240
+ }
241
+ return processed;
242
+ }
243
+ catch (error) {
244
+ console.error(`Error loading YAML file ${confFile}:`, error);
245
+ return null;
246
+ }
247
+ }
248
+ /**
249
+ * Get property value from package.json
250
+ */
251
+ function getProperty(prop) {
252
+ const packageJsonPath = path.join(getProjectRoot(), 'package.json');
253
+ try {
254
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
255
+ return packageJson[prop] || '';
256
+ }
257
+ catch {
258
+ return '';
259
+ }
260
+ }
261
+ /**
262
+ * Copy project source code directory to current working directory
263
+ */
264
+ function copyProjectSrcDir(currentWorkingDir, srcDir) {
265
+ if (!fs.existsSync(srcDir)) {
266
+ console.error(`Error: Source directory ${srcDir} does not exist`);
267
+ process.exit(1);
268
+ }
269
+ const srcDirList = srcDir.split(path.sep).filter(Boolean);
270
+ const tmpSrcDir = path.join(currentWorkingDir, '.' + srcDirList[srcDirList.length - 1]);
271
+ // Remove existing directory if it exists
272
+ if (fs.existsSync(tmpSrcDir) && fs.statSync(tmpSrcDir).isDirectory()) {
273
+ fs.removeSync(tmpSrcDir);
274
+ }
275
+ console.log(`Copying project source code directory from ${srcDir} to ${tmpSrcDir}`);
276
+ fs.copySync(srcDir, tmpSrcDir);
277
+ return tmpSrcDir;
278
+ }
279
+ /**
280
+ * List all available roles
281
+ */
282
+ function listRoles(confDict, environment) {
283
+ console.log('Available roles:');
284
+ if (confDict[environment]) {
285
+ for (const role of Object.keys(confDict[environment])) {
286
+ if (role !== 'options') {
287
+ console.log(`- ${role}`);
288
+ }
289
+ }
290
+ }
291
+ console.log();
292
+ }
293
+ /**
294
+ * Print program version info
295
+ */
296
+ function printVersionInfo() {
297
+ console.log(`AppSec AI Agent Version: ${getProperty('version')}`);
298
+ console.log(`AppSec AI Agent Release Date: ${getProperty('date') || 'Oct 27 2025'}`);
299
+ console.log(`AppSec AI Agent Author: ${getProperty('author')}`);
300
+ console.log();
301
+ }
302
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}