@cdot65/prisma-airs-cli 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.
- package/README.md +42 -0
- package/dist/airs/management.d.ts +58 -0
- package/dist/airs/management.d.ts.map +1 -0
- package/dist/airs/management.js +287 -0
- package/dist/airs/management.js.map +1 -0
- package/dist/airs/modelsecurity.d.ts +74 -0
- package/dist/airs/modelsecurity.d.ts.map +1 -0
- package/dist/airs/modelsecurity.js +337 -0
- package/dist/airs/modelsecurity.js.map +1 -0
- package/dist/airs/promptsets.d.ts +50 -0
- package/dist/airs/promptsets.d.ts.map +1 -0
- package/dist/airs/promptsets.js +133 -0
- package/dist/airs/promptsets.js.map +1 -0
- package/dist/airs/redteam.d.ts +45 -0
- package/dist/airs/redteam.d.ts.map +1 -0
- package/dist/airs/redteam.js +219 -0
- package/dist/airs/redteam.js.map +1 -0
- package/dist/airs/runtime.d.ts +27 -0
- package/dist/airs/runtime.d.ts.map +1 -0
- package/dist/airs/runtime.js +158 -0
- package/dist/airs/runtime.js.map +1 -0
- package/dist/airs/scanner.d.ts +22 -0
- package/dist/airs/scanner.d.ts.map +1 -0
- package/dist/airs/scanner.js +62 -0
- package/dist/airs/scanner.js.map +1 -0
- package/dist/airs/types.d.ts +683 -0
- package/dist/airs/types.d.ts.map +1 -0
- package/dist/airs/types.js +6 -0
- package/dist/airs/types.js.map +1 -0
- package/dist/audit/evaluator.d.ts +17 -0
- package/dist/audit/evaluator.d.ts.map +1 -0
- package/dist/audit/evaluator.js +82 -0
- package/dist/audit/evaluator.js.map +1 -0
- package/dist/audit/report.d.ts +38 -0
- package/dist/audit/report.d.ts.map +1 -0
- package/dist/audit/report.js +141 -0
- package/dist/audit/report.js.map +1 -0
- package/dist/audit/runner.d.ts +18 -0
- package/dist/audit/runner.d.ts.map +1 -0
- package/dist/audit/runner.js +60 -0
- package/dist/audit/runner.js.map +1 -0
- package/dist/audit/types.d.ts +53 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +5 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/cli/bulk-scan-state.d.ts +15 -0
- package/dist/cli/bulk-scan-state.d.ts.map +1 -0
- package/dist/cli/bulk-scan-state.js +20 -0
- package/dist/cli/bulk-scan-state.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +113 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +231 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +23 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/modelsecurity.d.ts +4 -0
- package/dist/cli/commands/modelsecurity.d.ts.map +1 -0
- package/dist/cli/commands/modelsecurity.js +499 -0
- package/dist/cli/commands/modelsecurity.js.map +1 -0
- package/dist/cli/commands/redteam.d.ts +4 -0
- package/dist/cli/commands/redteam.d.ts.map +1 -0
- package/dist/cli/commands/redteam.js +630 -0
- package/dist/cli/commands/redteam.js.map +1 -0
- package/dist/cli/commands/report.d.ts +4 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +116 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +4 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +138 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/runtime.d.ts +3 -0
- package/dist/cli/commands/runtime.d.ts.map +1 -0
- package/dist/cli/commands/runtime.js +582 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +46 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parse-input.d.ts +9 -0
- package/dist/cli/parse-input.d.ts.map +1 -0
- package/dist/cli/parse-input.js +109 -0
- package/dist/cli/parse-input.js.map +1 -0
- package/dist/cli/prompts.d.ts +9 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +90 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/renderer/audit.d.ts +8 -0
- package/dist/cli/renderer/audit.d.ts.map +1 -0
- package/dist/cli/renderer/audit.js +44 -0
- package/dist/cli/renderer/audit.js.map +1 -0
- package/dist/cli/renderer/common.d.ts +3 -0
- package/dist/cli/renderer/common.d.ts.map +1 -0
- package/dist/cli/renderer/common.js +6 -0
- package/dist/cli/renderer/common.js.map +1 -0
- package/dist/cli/renderer/generate.d.ts +29 -0
- package/dist/cli/renderer/generate.d.ts.map +1 -0
- package/dist/cli/renderer/generate.js +132 -0
- package/dist/cli/renderer/generate.js.map +1 -0
- package/dist/cli/renderer/index.d.ts +7 -0
- package/dist/cli/renderer/index.d.ts.map +1 -0
- package/dist/cli/renderer/index.js +7 -0
- package/dist/cli/renderer/index.js.map +1 -0
- package/dist/cli/renderer/modelsecurity.d.ts +34 -0
- package/dist/cli/renderer/modelsecurity.d.ts.map +1 -0
- package/dist/cli/renderer/modelsecurity.js +285 -0
- package/dist/cli/renderer/modelsecurity.js.map +1 -0
- package/dist/cli/renderer/redteam.d.ts +152 -0
- package/dist/cli/renderer/redteam.d.ts.map +1 -0
- package/dist/cli/renderer/redteam.js +294 -0
- package/dist/cli/renderer/redteam.js.map +1 -0
- package/dist/cli/renderer/runtime.d.ts +87 -0
- package/dist/cli/renderer/runtime.d.ts.map +1 -0
- package/dist/cli/renderer/runtime.js +230 -0
- package/dist/cli/renderer/runtime.js.map +1 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +65 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +78 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +44 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/constraints.d.ts +18 -0
- package/dist/core/constraints.d.ts.map +1 -0
- package/dist/core/constraints.js +75 -0
- package/dist/core/constraints.js.map +1 -0
- package/dist/core/loop.d.ts +54 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +462 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/metrics.d.ts +13 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +73 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/types.d.ts +175 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/prompts/analyze-results.d.ts +3 -0
- package/dist/llm/prompts/analyze-results.d.ts.map +1 -0
- package/dist/llm/prompts/analyze-results.js +52 -0
- package/dist/llm/prompts/analyze-results.js.map +1 -0
- package/dist/llm/prompts/generate-companion.d.ts +3 -0
- package/dist/llm/prompts/generate-companion.d.ts.map +1 -0
- package/dist/llm/prompts/generate-companion.js +42 -0
- package/dist/llm/prompts/generate-companion.js.map +1 -0
- package/dist/llm/prompts/generate-tests.d.ts +3 -0
- package/dist/llm/prompts/generate-tests.d.ts.map +1 -0
- package/dist/llm/prompts/generate-tests.js +46 -0
- package/dist/llm/prompts/generate-tests.js.map +1 -0
- package/dist/llm/prompts/generate-topic.d.ts +4 -0
- package/dist/llm/prompts/generate-topic.d.ts.map +1 -0
- package/dist/llm/prompts/generate-topic.js +41 -0
- package/dist/llm/prompts/generate-topic.js.map +1 -0
- package/dist/llm/prompts/improve-topic.d.ts +3 -0
- package/dist/llm/prompts/improve-topic.d.ts.map +1 -0
- package/dist/llm/prompts/improve-topic.js +77 -0
- package/dist/llm/prompts/improve-topic.js.map +1 -0
- package/dist/llm/prompts/simplify-topic.d.ts +3 -0
- package/dist/llm/prompts/simplify-topic.d.ts.map +1 -0
- package/dist/llm/prompts/simplify-topic.js +50 -0
- package/dist/llm/prompts/simplify-topic.js.map +1 -0
- package/dist/llm/provider.d.ts +21 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +76 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/schemas.d.ts +97 -0
- package/dist/llm/schemas.d.ts.map +1 -0
- package/dist/llm/schemas.js +24 -0
- package/dist/llm/schemas.js.map +1 -0
- package/dist/llm/service.d.ts +30 -0
- package/dist/llm/service.d.ts.map +1 -0
- package/dist/llm/service.js +273 -0
- package/dist/llm/service.js.map +1 -0
- package/dist/memory/diff.d.ts +4 -0
- package/dist/memory/diff.d.ts.map +1 -0
- package/dist/memory/diff.js +24 -0
- package/dist/memory/diff.js.map +1 -0
- package/dist/memory/extractor.d.ts +15 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +133 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +22 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +90 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/prompts/extract-learnings.d.ts +3 -0
- package/dist/memory/prompts/extract-learnings.d.ts.map +1 -0
- package/dist/memory/prompts/extract-learnings.js +40 -0
- package/dist/memory/prompts/extract-learnings.js.map +1 -0
- package/dist/memory/schemas.d.ts +63 -0
- package/dist/memory/schemas.d.ts.map +1 -0
- package/dist/memory/schemas.js +13 -0
- package/dist/memory/schemas.js.map +1 -0
- package/dist/memory/store.d.ts +28 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +103 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +55 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/persistence/store.d.ts +21 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +77 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/persistence/types.d.ts +23 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +2 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/report/html.d.ts +6 -0
- package/dist/report/html.d.ts.map +1 -0
- package/dist/report/html.js +200 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/json.d.ts +11 -0
- package/dist/report/json.d.ts.map +1 -0
- package/dist/report/json.js +74 -0
- package/dist/report/json.js.map +1 -0
- package/dist/report/types.d.ts +58 -0
- package/dist/report/types.d.ts.map +1 -0
- package/dist/report/types.js +5 -0
- package/dist/report/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { SdkManagementService } from '../../airs/management.js';
|
|
4
|
+
import { AirsScanService } from '../../airs/scanner.js';
|
|
5
|
+
import { buildAuditReportHtml, buildAuditReportJson } from '../../audit/report.js';
|
|
6
|
+
import { runAudit } from '../../audit/runner.js';
|
|
7
|
+
import { loadConfig } from '../../config/loader.js';
|
|
8
|
+
import { createLlmProvider } from '../../llm/provider.js';
|
|
9
|
+
import { LangChainLlmService } from '../../llm/service.js';
|
|
10
|
+
import { renderAuditComplete, renderAuditTopics, renderConflicts, renderError, renderMetrics, } from '../renderer/index.js';
|
|
11
|
+
/** Register the `audit` command — evaluate all topics in a profile. */
|
|
12
|
+
export function registerAuditCommand(parent) {
|
|
13
|
+
parent
|
|
14
|
+
.command('audit <profileName>')
|
|
15
|
+
.description('Evaluate all topics in a security profile')
|
|
16
|
+
.option('--max-tests-per-topic <n>', 'Max tests per topic', '20')
|
|
17
|
+
.option('--format <format>', 'Output format: terminal, json, html', 'terminal')
|
|
18
|
+
.option('--output <path>', 'Output file path (json/html)')
|
|
19
|
+
.option('--provider <provider>', 'LLM provider override')
|
|
20
|
+
.option('--model <model>', 'LLM model override')
|
|
21
|
+
.action(async (profileName, opts) => {
|
|
22
|
+
try {
|
|
23
|
+
const config = await loadConfig({
|
|
24
|
+
llmProvider: opts.provider,
|
|
25
|
+
llmModel: opts.model,
|
|
26
|
+
});
|
|
27
|
+
const model = await createLlmProvider({
|
|
28
|
+
provider: config.llmProvider,
|
|
29
|
+
model: config.llmModel,
|
|
30
|
+
anthropicApiKey: config.anthropicApiKey,
|
|
31
|
+
googleApiKey: config.googleApiKey,
|
|
32
|
+
googleCloudProject: config.googleCloudProject,
|
|
33
|
+
googleCloudLocation: config.googleCloudLocation,
|
|
34
|
+
awsRegion: config.awsRegion,
|
|
35
|
+
awsAccessKeyId: config.awsAccessKeyId,
|
|
36
|
+
awsSecretAccessKey: config.awsSecretAccessKey,
|
|
37
|
+
});
|
|
38
|
+
const llm = new LangChainLlmService(model);
|
|
39
|
+
const management = new SdkManagementService({
|
|
40
|
+
clientId: config.mgmtClientId,
|
|
41
|
+
clientSecret: config.mgmtClientSecret,
|
|
42
|
+
tsgId: config.mgmtTsgId,
|
|
43
|
+
tokenEndpoint: config.mgmtTokenEndpoint,
|
|
44
|
+
});
|
|
45
|
+
if (!config.airsApiKey) {
|
|
46
|
+
renderError('PANW_AI_SEC_API_KEY is required');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const scanner = new AirsScanService(config.airsApiKey);
|
|
50
|
+
const format = opts.format;
|
|
51
|
+
console.log(chalk.bold.cyan('\n Prisma AIRS Profile Audit'));
|
|
52
|
+
console.log(chalk.dim(` Evaluating all topics in "${profileName}"\n`));
|
|
53
|
+
for await (const event of runAudit({
|
|
54
|
+
profileName,
|
|
55
|
+
maxTestsPerTopic: Number.parseInt(opts.maxTestsPerTopic, 10),
|
|
56
|
+
scanConcurrency: config.scanConcurrency,
|
|
57
|
+
}, { llm, management, scanner })) {
|
|
58
|
+
switch (event.type) {
|
|
59
|
+
case 'topics:loaded':
|
|
60
|
+
console.log(chalk.dim(` Found ${event.topics.length} topic(s) in profile\n`));
|
|
61
|
+
renderAuditTopics(event.topics);
|
|
62
|
+
break;
|
|
63
|
+
case 'tests:generated':
|
|
64
|
+
console.log(chalk.dim(` Generated ${event.count} tests for "${event.topicName}"`));
|
|
65
|
+
break;
|
|
66
|
+
case 'scan:progress':
|
|
67
|
+
console.log(chalk.dim(`\n Scanned ${event.completed}/${event.total} prompts`));
|
|
68
|
+
break;
|
|
69
|
+
case 'evaluate:complete':
|
|
70
|
+
break;
|
|
71
|
+
case 'audit:complete': {
|
|
72
|
+
const { result } = event;
|
|
73
|
+
if (format === 'json') {
|
|
74
|
+
const report = buildAuditReportJson(result);
|
|
75
|
+
const output = JSON.stringify(report, null, 2);
|
|
76
|
+
if (opts.output) {
|
|
77
|
+
await writeFile(opts.output, output, 'utf-8');
|
|
78
|
+
console.log(chalk.green(`\n Report written to ${opts.output}`));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(output);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (format === 'html') {
|
|
86
|
+
const html = buildAuditReportHtml(result);
|
|
87
|
+
const outputPath = opts.output ?? `audit-${profileName.replace(/\s+/g, '-')}.html`;
|
|
88
|
+
await writeFile(outputPath, html, 'utf-8');
|
|
89
|
+
console.log(chalk.green(`\n Report written to ${outputPath}`));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Terminal format
|
|
93
|
+
renderAuditComplete(result);
|
|
94
|
+
console.log(chalk.bold('\n Composite Metrics:'));
|
|
95
|
+
renderMetrics(result.compositeMetrics);
|
|
96
|
+
if (result.conflicts.length > 0) {
|
|
97
|
+
renderConflicts(result.conflicts);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(chalk.green('\n No cross-topic conflicts detected.\n'));
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
renderError(err instanceof Error ? err.message : String(err));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCzC,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAyP7D"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { SdkManagementService } from '../../airs/management.js';
|
|
4
|
+
import { SdkPromptSetService } from '../../airs/promptsets.js';
|
|
5
|
+
import { AirsScanService, DebugScanService } from '../../airs/scanner.js';
|
|
6
|
+
import { loadConfig } from '../../config/loader.js';
|
|
7
|
+
import { runLoop } from '../../core/loop.js';
|
|
8
|
+
import { createLlmProvider } from '../../llm/provider.js';
|
|
9
|
+
import { LangChainLlmService } from '../../llm/service.js';
|
|
10
|
+
import { LearningExtractor } from '../../memory/extractor.js';
|
|
11
|
+
import { MemoryInjector } from '../../memory/injector.js';
|
|
12
|
+
import { MemoryStore } from '../../memory/store.js';
|
|
13
|
+
import { JsonFileStore } from '../../persistence/store.js';
|
|
14
|
+
import { collectUserInput } from '../prompts.js';
|
|
15
|
+
import { renderAnalysis, renderCompanionTopic, renderError, renderHeader, renderIterationStart, renderIterationSummary, renderLoopComplete, renderMemoryExtracted, renderMemoryLoaded, renderMetrics, renderTestProgress, renderTestsAccumulated, renderTestsComposed, renderTopic, } from '../renderer/index.js';
|
|
16
|
+
/** Register the `generate` command — starts a new guardrail generation loop. */
|
|
17
|
+
export function registerGenerateCommand(parent) {
|
|
18
|
+
parent
|
|
19
|
+
.command('generate')
|
|
20
|
+
.description('Start a new guardrail generation loop')
|
|
21
|
+
.option('--provider <provider>', 'LLM provider')
|
|
22
|
+
.option('--model <model>', 'LLM model name')
|
|
23
|
+
.option('--profile <name>', 'AIRS security profile name')
|
|
24
|
+
.option('--topic <description>', 'Topic description')
|
|
25
|
+
.option('--intent <intent>', 'Intent: block or allow')
|
|
26
|
+
.option('--max-iterations <n>', 'Max iterations', '20')
|
|
27
|
+
.option('--target-coverage <n>', 'Target coverage %', '90')
|
|
28
|
+
.option('--max-regressions <n>', 'Stop after N consecutive coverage regressions (0 = disable)', '3')
|
|
29
|
+
.option('--plateau-window <n>', 'Iterations to check for plateau (0 = disable)', '0')
|
|
30
|
+
.option('--plateau-band <pct>', 'Max coverage variance for plateau detection', '0.05')
|
|
31
|
+
.option('--accumulate-tests', 'Carry forward test prompts across iterations', false)
|
|
32
|
+
.option('--max-accumulated-tests <n>', 'Max accumulated test count cap')
|
|
33
|
+
.option('--memory', 'Enable learning memory (default)')
|
|
34
|
+
.option('--no-memory', 'Disable learning memory')
|
|
35
|
+
.option('--debug-scans', 'Dump raw AIRS scan responses to JSONL for debugging', false)
|
|
36
|
+
.option('--create-prompt-set', 'Create custom prompt set from test cases after loop', false)
|
|
37
|
+
.option('--prompt-set-name <name>', 'Override auto-generated prompt set name')
|
|
38
|
+
.option('--save-tests <path>', 'Save best iteration test cases to CSV')
|
|
39
|
+
.action(async (opts) => {
|
|
40
|
+
try {
|
|
41
|
+
renderHeader();
|
|
42
|
+
const config = await loadConfig({
|
|
43
|
+
llmProvider: opts.provider,
|
|
44
|
+
llmModel: opts.model,
|
|
45
|
+
memoryEnabled: opts.memory !== undefined ? String(opts.memory) : undefined,
|
|
46
|
+
});
|
|
47
|
+
// Collect user input (interactive or from CLI flags)
|
|
48
|
+
let userInput;
|
|
49
|
+
if (opts.topic && opts.profile) {
|
|
50
|
+
userInput = {
|
|
51
|
+
topicDescription: opts.topic,
|
|
52
|
+
intent: (opts.intent ?? 'block'),
|
|
53
|
+
profileName: opts.profile,
|
|
54
|
+
maxIterations: Number.parseInt(opts.maxIterations, 10),
|
|
55
|
+
targetCoverage: Number.parseInt(opts.targetCoverage, 10) / 100,
|
|
56
|
+
maxRegressions: Number.parseInt(opts.maxRegressions, 10),
|
|
57
|
+
plateauWindow: Number.parseInt(opts.plateauWindow, 10),
|
|
58
|
+
plateauBand: Number.parseFloat(opts.plateauBand),
|
|
59
|
+
accumulateTests: opts.accumulateTests ?? false,
|
|
60
|
+
maxAccumulatedTests: opts.maxAccumulatedTests
|
|
61
|
+
? Number.parseInt(opts.maxAccumulatedTests, 10)
|
|
62
|
+
: undefined,
|
|
63
|
+
createPromptSet: opts.createPromptSet ?? false,
|
|
64
|
+
promptSetName: opts.promptSetName,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
userInput = await collectUserInput();
|
|
69
|
+
}
|
|
70
|
+
// Initialize services
|
|
71
|
+
const model = await createLlmProvider({
|
|
72
|
+
provider: config.llmProvider,
|
|
73
|
+
model: config.llmModel,
|
|
74
|
+
anthropicApiKey: config.anthropicApiKey,
|
|
75
|
+
googleApiKey: config.googleApiKey,
|
|
76
|
+
googleCloudProject: config.googleCloudProject,
|
|
77
|
+
googleCloudLocation: config.googleCloudLocation,
|
|
78
|
+
awsRegion: config.awsRegion,
|
|
79
|
+
awsAccessKeyId: config.awsAccessKeyId,
|
|
80
|
+
awsSecretAccessKey: config.awsSecretAccessKey,
|
|
81
|
+
});
|
|
82
|
+
// Set up memory system
|
|
83
|
+
const memoryEnabled = config.memoryEnabled;
|
|
84
|
+
const memoryStore = memoryEnabled ? new MemoryStore(config.memoryDir) : undefined;
|
|
85
|
+
const memoryInjector = memoryStore
|
|
86
|
+
? new MemoryInjector(memoryStore, config.maxMemoryChars)
|
|
87
|
+
: undefined;
|
|
88
|
+
const llm = new LangChainLlmService(model, memoryInjector);
|
|
89
|
+
if (!config.airsApiKey)
|
|
90
|
+
throw new Error('PANW_AI_SEC_API_KEY is required');
|
|
91
|
+
let scanner = new AirsScanService(config.airsApiKey);
|
|
92
|
+
if (opts.debugScans) {
|
|
93
|
+
const debugPath = path.join(config.dataDir, '..', `debug-scans-${Date.now()}.jsonl`);
|
|
94
|
+
scanner = new DebugScanService(scanner, debugPath);
|
|
95
|
+
}
|
|
96
|
+
const management = new SdkManagementService({
|
|
97
|
+
clientId: config.mgmtClientId,
|
|
98
|
+
clientSecret: config.mgmtClientSecret,
|
|
99
|
+
tsgId: config.mgmtTsgId,
|
|
100
|
+
apiEndpoint: config.mgmtEndpoint,
|
|
101
|
+
tokenEndpoint: config.mgmtTokenEndpoint,
|
|
102
|
+
});
|
|
103
|
+
const store = new JsonFileStore(config.dataDir);
|
|
104
|
+
// Load memory before loop
|
|
105
|
+
if (memoryEnabled) {
|
|
106
|
+
const learningCount = await llm.loadMemory(userInput.topicDescription);
|
|
107
|
+
renderMemoryLoaded(learningCount);
|
|
108
|
+
}
|
|
109
|
+
const memoryExtractor = memoryStore ? new LearningExtractor(model, memoryStore) : undefined;
|
|
110
|
+
// Set up prompt set service if requested
|
|
111
|
+
const promptSets = userInput.createPromptSet
|
|
112
|
+
? new SdkPromptSetService({
|
|
113
|
+
clientId: config.mgmtClientId,
|
|
114
|
+
clientSecret: config.mgmtClientSecret,
|
|
115
|
+
tsgId: config.mgmtTsgId,
|
|
116
|
+
tokenEndpoint: config.mgmtTokenEndpoint,
|
|
117
|
+
})
|
|
118
|
+
: undefined;
|
|
119
|
+
// Warn about allow-intent coverage expectations
|
|
120
|
+
if (userInput.intent === 'allow') {
|
|
121
|
+
console.log(' \u26A0 Allow-intent topics typically achieve 40\u201370% coverage due to AIRS semantic matching.');
|
|
122
|
+
console.log(' Consider using --target-coverage 65 for realistic expectations.');
|
|
123
|
+
console.log();
|
|
124
|
+
}
|
|
125
|
+
// Run the loop
|
|
126
|
+
for await (const event of runLoop(userInput, {
|
|
127
|
+
llm,
|
|
128
|
+
management,
|
|
129
|
+
scanner,
|
|
130
|
+
propagationDelayMs: config.propagationDelayMs,
|
|
131
|
+
memory: memoryExtractor ? { extractor: memoryExtractor } : undefined,
|
|
132
|
+
promptSets,
|
|
133
|
+
})) {
|
|
134
|
+
switch (event.type) {
|
|
135
|
+
case 'iteration:start':
|
|
136
|
+
renderIterationStart(event.iteration);
|
|
137
|
+
break;
|
|
138
|
+
case 'generate:complete':
|
|
139
|
+
renderTopic(event.topic);
|
|
140
|
+
break;
|
|
141
|
+
case 'companion:generated':
|
|
142
|
+
renderCompanionTopic(event.topic);
|
|
143
|
+
break;
|
|
144
|
+
case 'companion:created':
|
|
145
|
+
console.log(` \u2713 Companion allow topic created (${event.topicId})`);
|
|
146
|
+
break;
|
|
147
|
+
case 'tests:composed':
|
|
148
|
+
renderTestsComposed(event.generated, event.carriedFailures, event.regressionTier, event.total);
|
|
149
|
+
break;
|
|
150
|
+
case 'tests:accumulated':
|
|
151
|
+
renderTestsAccumulated(event.newCount, event.totalCount, event.droppedCount);
|
|
152
|
+
break;
|
|
153
|
+
case 'test:progress':
|
|
154
|
+
renderTestProgress(event.completed, event.total);
|
|
155
|
+
break;
|
|
156
|
+
case 'evaluate:complete':
|
|
157
|
+
renderMetrics(event.metrics);
|
|
158
|
+
break;
|
|
159
|
+
case 'analyze:complete':
|
|
160
|
+
renderAnalysis(event.analysis);
|
|
161
|
+
break;
|
|
162
|
+
case 'iteration:complete':
|
|
163
|
+
renderIterationSummary(event.result);
|
|
164
|
+
break;
|
|
165
|
+
case 'topic:reverted':
|
|
166
|
+
console.log(` ↩ Reverted to best definition (iteration ${event.revertedToIteration})`);
|
|
167
|
+
renderTopic(event.topic);
|
|
168
|
+
break;
|
|
169
|
+
case 'topic:simplified':
|
|
170
|
+
console.log(' ⚡ Topic simplified after consecutive regressions');
|
|
171
|
+
renderTopic(event.topic);
|
|
172
|
+
break;
|
|
173
|
+
case 'probe:waiting':
|
|
174
|
+
console.log(` ⏳ Waiting for topic propagation (attempt ${event.attempt}/${event.maxAttempts})...`);
|
|
175
|
+
break;
|
|
176
|
+
case 'probe:ready':
|
|
177
|
+
console.log(` ✓ Topic active after ${event.attempts} probe(s)`);
|
|
178
|
+
break;
|
|
179
|
+
case 'topic:duplicate':
|
|
180
|
+
console.log(` ⚠ Topic identical to iteration ${event.duplicateOfIteration} — skipping scan`);
|
|
181
|
+
break;
|
|
182
|
+
case 'loop:plateau':
|
|
183
|
+
console.log(` ⚠ Coverage plateaued at ${(event.band[0] * 100).toFixed(1)}–${(event.band[1] * 100).toFixed(1)}%`);
|
|
184
|
+
console.log(` Platform ceiling likely reached (best: ${(event.bestCoverage * 100).toFixed(1)}%)`);
|
|
185
|
+
break;
|
|
186
|
+
case 'memory:extracted':
|
|
187
|
+
renderMemoryExtracted(event.learningCount);
|
|
188
|
+
break;
|
|
189
|
+
case 'promptset:created':
|
|
190
|
+
console.log(` ✓ Custom prompt set created: ${event.promptSetName} (${event.promptCount} prompts)`);
|
|
191
|
+
break;
|
|
192
|
+
case 'loop:complete':
|
|
193
|
+
await store.save(event.runState);
|
|
194
|
+
renderLoopComplete(event.runState);
|
|
195
|
+
if (opts.saveTests) {
|
|
196
|
+
const bestIdx = event.runState.bestIteration > 0
|
|
197
|
+
? event.runState.bestIteration - 1
|
|
198
|
+
: event.runState.iterations.length - 1;
|
|
199
|
+
const best = event.runState.iterations[bestIdx];
|
|
200
|
+
if (best) {
|
|
201
|
+
const resultMap = new Map(best.testResults.map((r) => [r.testCase.prompt, r]));
|
|
202
|
+
const csvRows = [
|
|
203
|
+
'prompt,expected_triggered,category,source,actual_triggered,correct',
|
|
204
|
+
];
|
|
205
|
+
for (const tc of best.testCases) {
|
|
206
|
+
const tr = resultMap.get(tc.prompt);
|
|
207
|
+
const csvEscape = (s) => `"${s.replace(/"/g, '""')}"`;
|
|
208
|
+
csvRows.push([
|
|
209
|
+
csvEscape(tc.prompt),
|
|
210
|
+
tc.expectedTriggered,
|
|
211
|
+
csvEscape(tc.category),
|
|
212
|
+
tc.source ?? 'generated',
|
|
213
|
+
tr?.actualTriggered ?? '',
|
|
214
|
+
tr?.correct ?? '',
|
|
215
|
+
].join(','));
|
|
216
|
+
}
|
|
217
|
+
fs.writeFileSync(opts.saveTests, csvRows.join('\n'), 'utf-8');
|
|
218
|
+
console.log(` ✓ Test cases saved to ${opts.saveTests} (${best.testCases.length} rows)`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
renderError(err instanceof Error ? err.message : String(err));
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,SAAS,GAAG,IAAI,CAgB/E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loadConfig } from '../../config/loader.js';
|
|
2
|
+
import { JsonFileStore } from '../../persistence/store.js';
|
|
3
|
+
import { renderError, renderHeader, renderRunList } from '../renderer/index.js';
|
|
4
|
+
/** Register the `list` (or `runs`) command — lists all saved runs. */
|
|
5
|
+
export function registerListCommand(parent, commandName = 'list') {
|
|
6
|
+
parent
|
|
7
|
+
.command(commandName)
|
|
8
|
+
.description('List all saved generation runs')
|
|
9
|
+
.action(async () => {
|
|
10
|
+
try {
|
|
11
|
+
renderHeader();
|
|
12
|
+
const config = await loadConfig();
|
|
13
|
+
const store = new JsonFileStore(config.dataDir);
|
|
14
|
+
const runs = await store.list();
|
|
15
|
+
renderRunList(runs);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
renderError(err instanceof Error ? err.message : String(err));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEhF,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,MAAe,EAAE,WAAW,GAAG,MAAM;IACvE,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,YAAY,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelsecurity.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/modelsecurity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCzC,mDAAmD;AACnD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoenE"}
|