@phenixstar/talon 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/.env.example +72 -0
  2. package/Dockerfile +161 -0
  3. package/Dockerfile.router +16 -0
  4. package/LICENSE +661 -0
  5. package/README.md +709 -0
  6. package/bin/talon.js +96 -0
  7. package/bin/talon.mjs +96 -0
  8. package/configs/config-schema.json +160 -0
  9. package/configs/example-config.yaml +50 -0
  10. package/configs/mcp-allowlist.json +47 -0
  11. package/configs/model-routing.yaml +39 -0
  12. package/configs/router-config.json +73 -0
  13. package/configs/talon-seccomp.json +89 -0
  14. package/dist/cli/dependency-checker.d.ts +25 -0
  15. package/dist/cli/dependency-checker.d.ts.map +1 -0
  16. package/dist/cli/dependency-checker.js +165 -0
  17. package/dist/cli/dependency-checker.js.map +1 -0
  18. package/dist/cli/doctor.d.ts +2 -0
  19. package/dist/cli/doctor.d.ts.map +1 -0
  20. package/dist/cli/doctor.js +127 -0
  21. package/dist/cli/doctor.js.map +1 -0
  22. package/dist/cli/env-configurator.d.ts +27 -0
  23. package/dist/cli/env-configurator.d.ts.map +1 -0
  24. package/dist/cli/env-configurator.js +115 -0
  25. package/dist/cli/env-configurator.js.map +1 -0
  26. package/dist/cli/setup-renderer.d.ts +23 -0
  27. package/dist/cli/setup-renderer.d.ts.map +1 -0
  28. package/dist/cli/setup-renderer.js +71 -0
  29. package/dist/cli/setup-renderer.js.map +1 -0
  30. package/dist/cli/setup.d.ts +2 -0
  31. package/dist/cli/setup.d.ts.map +1 -0
  32. package/dist/cli/setup.js +302 -0
  33. package/dist/cli/setup.js.map +1 -0
  34. package/dist/types/activity-logger.d.ts +10 -0
  35. package/dist/types/activity-logger.d.ts.map +1 -0
  36. package/dist/types/activity-logger.js +7 -0
  37. package/dist/types/activity-logger.js.map +1 -0
  38. package/dist/types/agents.d.ts +39 -0
  39. package/dist/types/agents.d.ts.map +1 -0
  40. package/dist/types/agents.js +28 -0
  41. package/dist/types/agents.js.map +1 -0
  42. package/dist/types/audit.d.ts +28 -0
  43. package/dist/types/audit.d.ts.map +1 -0
  44. package/dist/types/audit.js +7 -0
  45. package/dist/types/audit.js.map +1 -0
  46. package/dist/types/backtesting.d.ts +45 -0
  47. package/dist/types/backtesting.d.ts.map +1 -0
  48. package/dist/types/backtesting.js +3 -0
  49. package/dist/types/backtesting.js.map +1 -0
  50. package/dist/types/config.d.ts +48 -0
  51. package/dist/types/config.d.ts.map +1 -0
  52. package/dist/types/config.js +7 -0
  53. package/dist/types/config.js.map +1 -0
  54. package/dist/types/errors.d.ts +55 -0
  55. package/dist/types/errors.d.ts.map +1 -0
  56. package/dist/types/errors.js +41 -0
  57. package/dist/types/errors.js.map +1 -0
  58. package/dist/types/evolution.d.ts +36 -0
  59. package/dist/types/evolution.d.ts.map +1 -0
  60. package/dist/types/evolution.js +14 -0
  61. package/dist/types/evolution.js.map +1 -0
  62. package/dist/types/index.d.ts +11 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +16 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/types/metrics.d.ts +13 -0
  67. package/dist/types/metrics.d.ts.map +1 -0
  68. package/dist/types/metrics.js +7 -0
  69. package/dist/types/metrics.js.map +1 -0
  70. package/dist/types/resilience.d.ts +30 -0
  71. package/dist/types/resilience.d.ts.map +1 -0
  72. package/dist/types/resilience.js +7 -0
  73. package/dist/types/resilience.js.map +1 -0
  74. package/dist/types/result.d.ts +42 -0
  75. package/dist/types/result.d.ts.map +1 -0
  76. package/dist/types/result.js +30 -0
  77. package/dist/types/result.js.map +1 -0
  78. package/docker-compose.yml +91 -0
  79. package/package.json +75 -0
  80. package/prompts/exploit-auth.txt +423 -0
  81. package/prompts/exploit-authz.txt +425 -0
  82. package/prompts/exploit-injection.txt +452 -0
  83. package/prompts/exploit-ssrf.txt +502 -0
  84. package/prompts/exploit-xss.txt +442 -0
  85. package/prompts/pipeline-testing/exploit-auth.txt +31 -0
  86. package/prompts/pipeline-testing/exploit-authz.txt +31 -0
  87. package/prompts/pipeline-testing/exploit-injection.txt +31 -0
  88. package/prompts/pipeline-testing/exploit-ssrf.txt +31 -0
  89. package/prompts/pipeline-testing/exploit-xss.txt +31 -0
  90. package/prompts/pipeline-testing/pre-recon-code.txt +1 -0
  91. package/prompts/pipeline-testing/recon.txt +1 -0
  92. package/prompts/pipeline-testing/report-executive.txt +1 -0
  93. package/prompts/pipeline-testing/vuln-auth.txt +13 -0
  94. package/prompts/pipeline-testing/vuln-authz.txt +13 -0
  95. package/prompts/pipeline-testing/vuln-injection.txt +13 -0
  96. package/prompts/pipeline-testing/vuln-ssrf.txt +13 -0
  97. package/prompts/pipeline-testing/vuln-xss.txt +13 -0
  98. package/prompts/pre-recon-code.txt +403 -0
  99. package/prompts/recon.txt +382 -0
  100. package/prompts/report-executive.txt +126 -0
  101. package/prompts/shared/_exploit-scope.txt +14 -0
  102. package/prompts/shared/_rules.txt +2 -0
  103. package/prompts/shared/_target.txt +1 -0
  104. package/prompts/shared/_vuln-scope.txt +1 -0
  105. package/prompts/shared/login-instructions.txt +82 -0
  106. package/prompts/vuln-auth.txt +268 -0
  107. package/prompts/vuln-authz.txt +373 -0
  108. package/prompts/vuln-injection.txt +380 -0
  109. package/prompts/vuln-ssrf.txt +315 -0
  110. package/prompts/vuln-xss.txt +304 -0
  111. package/talon +459 -0
  112. package/talon.ps1 +348 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-checker.d.ts","sourceRoot":"","sources":["../../src/cli/dependency-checker.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAW9C,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvD;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAU1E;AAwFD,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAgBhD;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAYtE;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,OAAO,CAGvC;AAED,sCAAsC;AACtC,wBAAgB,WAAW,IAAI,OAAO,CAErC"}
@@ -0,0 +1,165 @@
1
+ // Copyright (C) 2025 PhenixStar (Alaa Qweider)
2
+ //
3
+ // This program is free software: you can redistribute it and/or modify
4
+ // it under the terms of the GNU Affero General Public License version 3
5
+ // as published by the Free Software Foundation.
6
+ import { execSync } from 'node:child_process';
7
+ import os from 'node:os';
8
+ import fs from 'node:fs';
9
+ /** Run a command silently and return stdout, or null on failure */
10
+ function execSilent(cmd) {
11
+ try {
12
+ return execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 10_000 }).trim();
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /** Parse a version string like "v22.11.0" or "Docker version 27.5.1, build abc" into semver parts */
19
+ export function parseVersion(raw) {
20
+ const match = raw.match(/(\d+\.\d+(?:\.\d+)?)/);
21
+ return match ? match[1] : null;
22
+ }
23
+ /** Compare two semver strings: returns true if actual >= required */
24
+ export function versionSatisfies(actual, required) {
25
+ const aParts = actual.split('.').map(Number);
26
+ const rParts = required.split('.').map(Number);
27
+ for (let i = 0; i < Math.max(aParts.length, rParts.length); i++) {
28
+ const a = aParts[i] ?? 0;
29
+ const r = rParts[i] ?? 0;
30
+ if (a > r)
31
+ return true;
32
+ if (a < r)
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ function getInstallHint(dep) {
38
+ const platform = os.platform();
39
+ const hints = {
40
+ docker: {
41
+ linux: 'sudo apt install docker.io OR https://docs.docker.com/engine/install/',
42
+ darwin: 'brew install --cask docker OR https://docker.com/products/docker-desktop',
43
+ win32: 'winget install Docker.DockerDesktop OR https://docker.com/products/docker-desktop',
44
+ },
45
+ 'docker-compose': {
46
+ linux: 'Docker Compose v2 is included with Docker Engine 20.10+',
47
+ darwin: 'Included with Docker Desktop',
48
+ win32: 'Included with Docker Desktop',
49
+ },
50
+ node: {
51
+ linux: 'curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt install nodejs',
52
+ darwin: 'brew install node@22 OR https://nodejs.org/en/download',
53
+ win32: 'winget install OpenJS.NodeJS.LTS OR https://nodejs.org/en/download',
54
+ },
55
+ git: {
56
+ linux: 'sudo apt install git',
57
+ darwin: 'brew install git OR xcode-select --install',
58
+ win32: 'winget install Git.Git',
59
+ },
60
+ };
61
+ const depHints = hints[dep];
62
+ if (!depHints)
63
+ return `Install ${dep} manually`;
64
+ return depHints[platform] ?? depHints['linux'] ?? `Install ${dep} manually`;
65
+ }
66
+ function checkDocker() {
67
+ const raw = execSilent('docker --version');
68
+ const version = raw ? parseVersion(raw) : null;
69
+ return {
70
+ name: 'Docker',
71
+ required: true,
72
+ installed: version !== null,
73
+ version,
74
+ minVersion: '20.10',
75
+ versionOk: version !== null && versionSatisfies(version, '20.10'),
76
+ installHint: getInstallHint('docker'),
77
+ };
78
+ }
79
+ function checkDockerCompose() {
80
+ const raw = execSilent('docker compose version');
81
+ const version = raw ? parseVersion(raw) : null;
82
+ return {
83
+ name: 'Docker Compose',
84
+ required: true,
85
+ installed: version !== null,
86
+ version,
87
+ minVersion: '2.0',
88
+ versionOk: version !== null && versionSatisfies(version, '2.0'),
89
+ installHint: getInstallHint('docker-compose'),
90
+ };
91
+ }
92
+ function checkNode() {
93
+ const raw = execSilent('node --version');
94
+ const version = raw ? parseVersion(raw) : null;
95
+ return {
96
+ name: 'Node.js',
97
+ required: true,
98
+ installed: version !== null,
99
+ version,
100
+ minVersion: '22.0',
101
+ versionOk: version !== null && versionSatisfies(version, '22.0'),
102
+ installHint: getInstallHint('node'),
103
+ };
104
+ }
105
+ function checkGit() {
106
+ const raw = execSilent('git --version');
107
+ const version = raw ? parseVersion(raw) : null;
108
+ return {
109
+ name: 'git',
110
+ required: true,
111
+ installed: version !== null,
112
+ version,
113
+ minVersion: '2.0',
114
+ versionOk: version !== null && versionSatisfies(version, '2.0'),
115
+ installHint: getInstallHint('git'),
116
+ };
117
+ }
118
+ /** Check if Docker daemon is running (not just installed) */
119
+ export function isDockerRunning() {
120
+ return execSilent('docker info') !== null;
121
+ }
122
+ /** Check available disk space in GB */
123
+ export function checkDiskSpaceGb() {
124
+ const platform = os.platform();
125
+ if (platform === 'win32') {
126
+ const raw = execSilent('wmic logicaldisk where "DeviceID=\'C:\'" get FreeSpace /value');
127
+ if (!raw)
128
+ return null;
129
+ const match = raw.match(/FreeSpace=(\d+)/);
130
+ if (!match)
131
+ return null;
132
+ return Math.floor(Number(match[1]) / (1024 * 1024 * 1024));
133
+ }
134
+ const raw = execSilent('df -BG . 2>/dev/null | tail -1');
135
+ if (!raw)
136
+ return null;
137
+ const parts = raw.split(/\s+/);
138
+ const avail = parts[3];
139
+ if (!avail)
140
+ return null;
141
+ return parseInt(avail.replace('G', ''), 10);
142
+ }
143
+ /** Run all dependency checks for the given run mode */
144
+ export function checkAllDependencies(mode) {
145
+ if (mode === 'docker') {
146
+ return [checkDocker(), checkDockerCompose(), checkGit()];
147
+ }
148
+ // Bare-metal mode needs Node.js + git, Docker optional
149
+ const docker = checkDocker();
150
+ return [
151
+ { ...docker, required: false },
152
+ checkNode(),
153
+ checkGit(),
154
+ ];
155
+ }
156
+ /** Detect recommended run mode based on available tools */
157
+ export function detectRunMode() {
158
+ const dockerAvailable = execSilent('docker --version') !== null;
159
+ return dockerAvailable ? 'docker' : 'bare-metal';
160
+ }
161
+ /** Check if repos directory exists */
162
+ export function hasReposDir() {
163
+ return fs.existsSync('repos') && fs.statSync('repos').isDirectory();
164
+ }
165
+ //# sourceMappingURL=dependency-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-checker.js","sourceRoot":"","sources":["../../src/cli/dependency-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ // Copyright (C) 2025 PhenixStar (Alaa Qweider)
2
+ //
3
+ // This program is free software: you can redistribute it and/or modify
4
+ // it under the terms of the GNU Affero General Public License version 3
5
+ // as published by the Free Software Foundation.
6
+ /**
7
+ * Talon Doctor — Post-setup validation.
8
+ *
9
+ * Checks dependencies, .env configuration, Docker status,
10
+ * and disk space. Reports all results with clear status indicators.
11
+ * Invoked via `./talon doctor`.
12
+ */
13
+ import chalk from 'chalk';
14
+ import fs from 'node:fs';
15
+ import { execSync } from 'node:child_process';
16
+ import { showBanner, showDependencyTable } from './setup-renderer.js';
17
+ import { readEnvFile } from './env-configurator.js';
18
+ import { checkAllDependencies, isDockerRunning, checkDiskSpaceGb } from './dependency-checker.js';
19
+ function checkEnvFile() {
20
+ if (!fs.existsSync('.env')) {
21
+ return { name: '.env file', ok: false, message: 'Not found — run ./talon setup' };
22
+ }
23
+ const env = readEnvFile('.env');
24
+ if (env.size === 0) {
25
+ return { name: '.env file', ok: false, message: 'Empty — run ./talon setup' };
26
+ }
27
+ const hasAuth = env.has('ANTHROPIC_API_KEY')
28
+ || env.has('CLAUDE_CODE_OAUTH_TOKEN')
29
+ || env.get('CLAUDE_CODE_USE_BEDROCK') === '1'
30
+ || env.get('CLAUDE_CODE_USE_VERTEX') === '1'
31
+ || env.get('ROUTER') === 'true';
32
+ if (!hasAuth) {
33
+ return { name: '.env file', ok: false, message: 'No auth credentials configured — run ./talon setup' };
34
+ }
35
+ return { name: '.env file', ok: true, message: `${env.size} variables configured` };
36
+ }
37
+ function checkDockerDaemon() {
38
+ if (!isDockerRunning()) {
39
+ return { name: 'Docker daemon', ok: false, message: 'Not running — start with: sudo systemctl start docker' };
40
+ }
41
+ return { name: 'Docker daemon', ok: true, message: 'Running' };
42
+ }
43
+ function checkDockerImages() {
44
+ try {
45
+ const output = execSync('docker compose images 2>/dev/null', {
46
+ encoding: 'utf-8',
47
+ stdio: ['pipe', 'pipe', 'pipe'],
48
+ timeout: 10_000,
49
+ });
50
+ const lines = output.trim().split('\n').filter(l => l.trim().length > 0);
51
+ // First line is header
52
+ const imageCount = Math.max(0, lines.length - 1);
53
+ if (imageCount === 0) {
54
+ return { name: 'Docker images', ok: false, message: 'Not built — will build on first ./talon start' };
55
+ }
56
+ return { name: 'Docker images', ok: true, message: `${imageCount} images built` };
57
+ }
58
+ catch {
59
+ return { name: 'Docker images', ok: false, message: 'Not built — will build on first ./talon start' };
60
+ }
61
+ }
62
+ function checkReposDir() {
63
+ if (!fs.existsSync('repos')) {
64
+ return { name: 'repos/ directory', ok: false, message: 'Not found — create it and clone a target repo' };
65
+ }
66
+ try {
67
+ const entries = fs.readdirSync('repos').filter(e => {
68
+ const stat = fs.statSync(`repos/${e}`);
69
+ return stat.isDirectory();
70
+ });
71
+ if (entries.length === 0) {
72
+ return { name: 'repos/ directory', ok: false, message: 'Empty — clone a target repo into repos/' };
73
+ }
74
+ return { name: 'repos/ directory', ok: true, message: `${entries.length} repo(s): ${entries.join(', ')}` };
75
+ }
76
+ catch {
77
+ return { name: 'repos/ directory', ok: false, message: 'Cannot read — check permissions' };
78
+ }
79
+ }
80
+ function checkDiskSpace() {
81
+ const gb = checkDiskSpaceGb();
82
+ if (gb === null) {
83
+ return { name: 'Disk space', ok: true, message: 'Could not determine (skipped)' };
84
+ }
85
+ if (gb < 10) {
86
+ return { name: 'Disk space', ok: false, message: `${gb}GB available (10GB recommended)` };
87
+ }
88
+ return { name: 'Disk space', ok: true, message: `${gb}GB available` };
89
+ }
90
+ function main() {
91
+ showBanner();
92
+ console.log(chalk.bold(' Running diagnostics...\n'));
93
+ // 1. Dependency check
94
+ const deps = checkAllDependencies('docker');
95
+ showDependencyTable(deps);
96
+ // 2. System checks
97
+ const checks = [
98
+ checkEnvFile(),
99
+ checkDockerDaemon(),
100
+ checkDockerImages(),
101
+ checkReposDir(),
102
+ checkDiskSpace(),
103
+ ];
104
+ console.log(chalk.bold(' System Checks:\n'));
105
+ let hasFailure = false;
106
+ for (const check of checks) {
107
+ const icon = check.ok ? chalk.green('✓') : chalk.red('✗');
108
+ const msg = check.ok ? check.message : chalk.red(check.message);
109
+ console.log(` ${icon} ${check.name}: ${msg}`);
110
+ if (!check.ok)
111
+ hasFailure = true;
112
+ }
113
+ // 3. Summary
114
+ const depFailures = deps.filter(d => d.required && (!d.installed || !d.versionOk));
115
+ const totalIssues = depFailures.length + checks.filter(c => !c.ok).length;
116
+ console.log();
117
+ if (totalIssues === 0) {
118
+ console.log(chalk.green(' All checks passed. Ready to run:\n'));
119
+ console.log(chalk.cyan(' ./talon start URL=<url> REPO=<name>\n'));
120
+ }
121
+ else {
122
+ console.log(chalk.yellow(` ${totalIssues} issue(s) found. Fix them and run ./talon doctor again.\n`));
123
+ }
124
+ process.exit(hasFailure || depFailures.length > 0 ? 1 : 0);
125
+ }
126
+ main();
127
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface EnvEntry {
2
+ key: string;
3
+ value: string;
4
+ }
5
+ interface ParsedLine {
6
+ type: 'entry' | 'comment' | 'blank';
7
+ raw: string;
8
+ key?: string;
9
+ value?: string;
10
+ }
11
+ /** Parse a .env file into structured lines, preserving comments and blanks */
12
+ export declare function parseEnvFile(content: string): ParsedLine[];
13
+ /** Read an existing .env file into a key-value map */
14
+ export declare function readEnvFile(envPath: string): Map<string, string>;
15
+ /** Merge new values into existing, preserving user-set values not in newValues */
16
+ export declare function mergeEnv(existing: Map<string, string>, newValues: readonly EnvEntry[]): Map<string, string>;
17
+ /** Backup existing .env to .env.backup.<timestamp> */
18
+ export declare function backupEnvFile(envPath: string): string | null;
19
+ /** Write a Map of env vars to a .env file with section headers */
20
+ export declare function writeEnvFile(envPath: string, values: Map<string, string>): void;
21
+ export type AuthMode = 'api-key' | 'oauth' | 'bedrock' | 'vertex' | 'router';
22
+ /** Get required env keys for a given auth mode */
23
+ export declare function getRequiredKeys(mode: AuthMode): string[];
24
+ /** Validate that all required keys for the auth mode are present and non-empty */
25
+ export declare function validateEnv(values: Map<string, string>, mode: AuthMode): string[];
26
+ export {};
27
+ //# sourceMappingURL=env-configurator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-configurator.d.ts","sourceRoot":"","sources":["../../src/cli/env-configurator.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAa1D;AAED,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhE;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMrB;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO5D;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAyC/E;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7E,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAQxD;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CASjF"}
@@ -0,0 +1,115 @@
1
+ // Copyright (C) 2025 PhenixStar (Alaa Qweider)
2
+ //
3
+ // This program is free software: you can redistribute it and/or modify
4
+ // it under the terms of the GNU Affero General Public License version 3
5
+ // as published by the Free Software Foundation.
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ /** Parse a .env file into structured lines, preserving comments and blanks */
9
+ export function parseEnvFile(content) {
10
+ return content.split('\n').map(raw => {
11
+ const trimmed = raw.trim();
12
+ if (trimmed === '')
13
+ return { type: 'blank', raw };
14
+ if (trimmed.startsWith('#'))
15
+ return { type: 'comment', raw };
16
+ const match = trimmed.match(/^([^=]+?)=(.*)$/);
17
+ if (!match)
18
+ return { type: 'comment', raw };
19
+ const key = match[1].trim();
20
+ const value = match[2].trim().replace(/^["']|["']$/g, '');
21
+ return { type: 'entry', raw, key, value };
22
+ });
23
+ }
24
+ /** Read an existing .env file into a key-value map */
25
+ export function readEnvFile(envPath) {
26
+ const map = new Map();
27
+ if (!fs.existsSync(envPath))
28
+ return map;
29
+ const content = fs.readFileSync(envPath, 'utf-8');
30
+ for (const line of parseEnvFile(content)) {
31
+ if (line.type === 'entry' && line.key && line.value !== undefined) {
32
+ map.set(line.key, line.value);
33
+ }
34
+ }
35
+ return map;
36
+ }
37
+ /** Merge new values into existing, preserving user-set values not in newValues */
38
+ export function mergeEnv(existing, newValues) {
39
+ const merged = new Map(existing);
40
+ for (const { key, value } of newValues) {
41
+ merged.set(key, value);
42
+ }
43
+ return merged;
44
+ }
45
+ /** Backup existing .env to .env.backup.<timestamp> */
46
+ export function backupEnvFile(envPath) {
47
+ if (!fs.existsSync(envPath))
48
+ return null;
49
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
50
+ const backupPath = `${envPath}.backup.${timestamp}`;
51
+ fs.copyFileSync(envPath, backupPath);
52
+ return backupPath;
53
+ }
54
+ /** Write a Map of env vars to a .env file with section headers */
55
+ export function writeEnvFile(envPath, values) {
56
+ // Group keys by section
57
+ const sections = [
58
+ { header: 'Authentication', keys: ['ANTHROPIC_API_KEY', 'CLAUDE_CODE_OAUTH_TOKEN'] },
59
+ { header: 'AWS Bedrock', keys: ['CLAUDE_CODE_USE_BEDROCK', 'AWS_REGION', 'AWS_BEARER_TOKEN_BEDROCK'] },
60
+ { header: 'Google Vertex AI', keys: ['CLAUDE_CODE_USE_VERTEX', 'CLOUD_ML_REGION', 'ANTHROPIC_VERTEX_PROJECT_ID', 'GOOGLE_APPLICATION_CREDENTIALS'] },
61
+ { header: 'Model Configuration', keys: ['ANTHROPIC_SMALL_MODEL', 'ANTHROPIC_MEDIUM_MODEL', 'ANTHROPIC_LARGE_MODEL'] },
62
+ { header: 'Router', keys: ['ROUTER', 'TALON_ROUTER_KEY', 'ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ROUTER_DEFAULT'] },
63
+ { header: 'Provider API Keys', keys: ['OPENAI_API_KEY', 'OPENROUTER_API_KEY', 'GROQ_API_KEY', 'XAI_API_KEY', 'KIMI_API_KEY', 'MINIMAX_HIGHSPEED_API_KEY', 'ZAI_CODING_PLAN_API_KEY'] },
64
+ { header: 'Runtime', keys: ['CLAUDE_CODE_MAX_OUTPUT_TOKENS', 'TALON_MAX_TURNS', 'TALON_PERMISSION_MODE', 'PIPELINE_TESTING'] },
65
+ ];
66
+ const written = new Set();
67
+ const lines = ['# Talon Configuration', `# Generated by ./talon setup on ${new Date().toISOString().slice(0, 10)}`, ''];
68
+ for (const section of sections) {
69
+ const sectionEntries = section.keys.filter(k => values.has(k));
70
+ if (sectionEntries.length === 0)
71
+ continue;
72
+ lines.push(`# ${section.header}`);
73
+ for (const key of sectionEntries) {
74
+ const val = values.get(key);
75
+ lines.push(`${key}=${val}`);
76
+ written.add(key);
77
+ }
78
+ lines.push('');
79
+ }
80
+ // Write any remaining keys not in known sections
81
+ const remaining = [...values.entries()].filter(([k]) => !written.has(k));
82
+ if (remaining.length > 0) {
83
+ lines.push('# Other');
84
+ for (const [key, val] of remaining) {
85
+ lines.push(`${key}=${val}`);
86
+ }
87
+ lines.push('');
88
+ }
89
+ const dir = path.dirname(envPath);
90
+ if (!fs.existsSync(dir))
91
+ fs.mkdirSync(dir, { recursive: true });
92
+ fs.writeFileSync(envPath, lines.join('\n'), 'utf-8');
93
+ }
94
+ /** Get required env keys for a given auth mode */
95
+ export function getRequiredKeys(mode) {
96
+ switch (mode) {
97
+ case 'api-key': return ['ANTHROPIC_API_KEY'];
98
+ case 'oauth': return ['CLAUDE_CODE_OAUTH_TOKEN'];
99
+ case 'bedrock': return ['CLAUDE_CODE_USE_BEDROCK', 'AWS_REGION', 'AWS_BEARER_TOKEN_BEDROCK', 'ANTHROPIC_SMALL_MODEL', 'ANTHROPIC_MEDIUM_MODEL', 'ANTHROPIC_LARGE_MODEL'];
100
+ case 'vertex': return ['CLAUDE_CODE_USE_VERTEX', 'CLOUD_ML_REGION', 'ANTHROPIC_VERTEX_PROJECT_ID', 'GOOGLE_APPLICATION_CREDENTIALS', 'ANTHROPIC_SMALL_MODEL', 'ANTHROPIC_MEDIUM_MODEL', 'ANTHROPIC_LARGE_MODEL'];
101
+ case 'router': return ['ROUTER'];
102
+ }
103
+ }
104
+ /** Validate that all required keys for the auth mode are present and non-empty */
105
+ export function validateEnv(values, mode) {
106
+ const missing = [];
107
+ for (const key of getRequiredKeys(mode)) {
108
+ const val = values.get(key);
109
+ if (!val || val.trim() === '') {
110
+ missing.push(key);
111
+ }
112
+ }
113
+ return missing;
114
+ }
115
+ //# sourceMappingURL=env-configurator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-configurator.js","sourceRoot":"","sources":["../../src/cli/env-configurator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare function showBanner(): void;
2
+ export interface SummaryConfig {
3
+ authMode: string;
4
+ envPath: string;
5
+ runMode: string;
6
+ values: Array<{
7
+ key: string;
8
+ value: string;
9
+ masked?: boolean;
10
+ }>;
11
+ }
12
+ export declare function showSummary(config: SummaryConfig): void;
13
+ export declare function showSuccess(envPath: string): void;
14
+ export declare function showError(message: string): void;
15
+ export interface DepStatus {
16
+ name: string;
17
+ installed: boolean;
18
+ version: string | null;
19
+ versionOk: boolean;
20
+ required: boolean;
21
+ }
22
+ export declare function showDependencyTable(deps: readonly DepStatus[]): void;
23
+ //# sourceMappingURL=setup-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBvD;AAOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CASjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAqBpE"}
@@ -0,0 +1,71 @@
1
+ // Copyright (C) 2025 PhenixStar (Alaa Qweider)
2
+ //
3
+ // This program is free software: you can redistribute it and/or modify
4
+ // it under the terms of the GNU Affero General Public License version 3
5
+ // as published by the Free Software Foundation.
6
+ import chalk from 'chalk';
7
+ import boxen from 'boxen';
8
+ import gradient from 'gradient-string';
9
+ import figlet from 'figlet';
10
+ const TALON_GRADIENT = gradient(['#ff6b6b', '#feca57', '#48dbfb']);
11
+ export function showBanner() {
12
+ const ascii = figlet.textSync('TALON', { font: 'ANSI Shadow' });
13
+ console.log(TALON_GRADIENT(ascii));
14
+ console.log(chalk.dim(' AI Penetration Testing Framework — Setup Wizard\n'));
15
+ }
16
+ export function showSummary(config) {
17
+ const lines = [
18
+ `${chalk.bold('Auth Mode:')} ${config.authMode}`,
19
+ `${chalk.bold('Run Mode:')} ${config.runMode}`,
20
+ '',
21
+ chalk.bold('Environment Variables:'),
22
+ ...config.values.map(({ key, value, masked }) => {
23
+ const display = masked ? maskValue(value) : value;
24
+ return ` ${chalk.cyan(key)}=${display}`;
25
+ }),
26
+ ];
27
+ console.log(boxen(lines.join('\n'), {
28
+ title: 'Configuration Summary',
29
+ padding: 1,
30
+ borderColor: 'cyan',
31
+ borderStyle: 'round',
32
+ }));
33
+ }
34
+ function maskValue(value) {
35
+ if (value.length <= 8)
36
+ return '••••••••';
37
+ return value.slice(0, 4) + '••••' + value.slice(-4);
38
+ }
39
+ export function showSuccess(envPath) {
40
+ console.log();
41
+ console.log(chalk.green(' ✓ Configuration saved to ') + chalk.bold(envPath));
42
+ console.log();
43
+ console.log(chalk.bold(' Next steps:'));
44
+ console.log(chalk.dim(' 1.') + ' Clone a target repo: ' + chalk.cyan('git clone <url> ./repos/<name>'));
45
+ console.log(chalk.dim(' 2.') + ' Run a pentest: ' + chalk.cyan('./talon start URL=<url> REPO=<name>'));
46
+ console.log(chalk.dim(' 3.') + ' Monitor progress: ' + chalk.cyan('http://localhost:8233'));
47
+ console.log();
48
+ }
49
+ export function showError(message) {
50
+ console.error(chalk.red(`\n ✗ ${message}\n`));
51
+ }
52
+ export function showDependencyTable(deps) {
53
+ console.log(chalk.bold('\n Dependency Check:\n'));
54
+ for (const dep of deps) {
55
+ const icon = dep.installed && dep.versionOk
56
+ ? chalk.green('✓')
57
+ : dep.required
58
+ ? chalk.red('✗')
59
+ : chalk.yellow('⚠');
60
+ const version = dep.version ? chalk.dim(` (${dep.version})`) : '';
61
+ const status = !dep.installed
62
+ ? chalk.dim(' — not found')
63
+ : !dep.versionOk
64
+ ? chalk.yellow(' — version too old')
65
+ : '';
66
+ const req = dep.required ? '' : chalk.dim(' [optional]');
67
+ console.log(` ${icon} ${dep.name}${version}${status}${req}`);
68
+ }
69
+ console.log();
70
+ }
71
+ //# sourceMappingURL=setup-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-renderer.js","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":""}