@prism-d1/cli 1.2.0 → 1.4.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 (181) hide show
  1. package/dist/assets/github-workflows/prism-eval-gate-kiro.yml +2 -2
  2. package/dist/assets/infra/bin/app.ts +61 -37
  3. package/dist/assets/infra/lib/constructs/security-agent-construct.ts +35 -30
  4. package/dist/assets/infra/lib/metrics-pipeline-stack.ts +2 -110
  5. package/dist/assets/infra/lib/security-agent-resources.ts +136 -0
  6. package/dist/assets/infra/lib/security-agent-stack.ts +69 -0
  7. package/dist/assets/pentest-cdk/bin/app.ts +12 -0
  8. package/dist/assets/pentest-cdk/cdk.json +7 -0
  9. package/dist/assets/pentest-cdk/lib/pentest-target-stack.ts +206 -0
  10. package/dist/assets/pentest-cdk/package.json +18 -0
  11. package/dist/assets/pentest-cdk/tsconfig.json +12 -0
  12. package/dist/src/aws/advice.d.ts +33 -0
  13. package/dist/src/aws/advice.d.ts.map +1 -0
  14. package/dist/src/aws/advice.js +174 -0
  15. package/dist/src/aws/advice.js.map +1 -0
  16. package/dist/src/aws/check.d.ts +64 -0
  17. package/dist/src/aws/check.d.ts.map +1 -0
  18. package/dist/src/aws/check.js +269 -0
  19. package/dist/src/aws/check.js.map +1 -0
  20. package/dist/src/aws/connect.d.ts +65 -0
  21. package/dist/src/aws/connect.d.ts.map +1 -0
  22. package/dist/src/aws/connect.js +250 -0
  23. package/dist/src/aws/connect.js.map +1 -0
  24. package/dist/src/aws/connection.d.ts +67 -0
  25. package/dist/src/aws/connection.d.ts.map +1 -0
  26. package/dist/src/aws/connection.js +137 -0
  27. package/dist/src/aws/connection.js.map +1 -0
  28. package/dist/src/aws/recommend.d.ts +70 -0
  29. package/dist/src/aws/recommend.d.ts.map +1 -0
  30. package/dist/src/aws/recommend.js +244 -0
  31. package/dist/src/aws/recommend.js.map +1 -0
  32. package/dist/src/aws/run-check.d.ts +31 -0
  33. package/dist/src/aws/run-check.d.ts.map +1 -0
  34. package/dist/src/aws/run-check.js +91 -0
  35. package/dist/src/aws/run-check.js.map +1 -0
  36. package/dist/src/codewatch/results.d.ts +155 -4
  37. package/dist/src/codewatch/results.d.ts.map +1 -1
  38. package/dist/src/codewatch/results.js +12 -2
  39. package/dist/src/codewatch/results.js.map +1 -1
  40. package/dist/src/commands/_top/version.d.ts +62 -0
  41. package/dist/src/commands/_top/version.d.ts.map +1 -0
  42. package/dist/src/commands/_top/version.js +175 -0
  43. package/dist/src/commands/_top/version.js.map +1 -0
  44. package/dist/src/commands/aws/check.d.ts +25 -0
  45. package/dist/src/commands/aws/check.d.ts.map +1 -0
  46. package/dist/src/commands/aws/check.js +42 -0
  47. package/dist/src/commands/aws/check.js.map +1 -0
  48. package/dist/src/commands/aws/connect.d.ts +16 -0
  49. package/dist/src/commands/aws/connect.d.ts.map +1 -0
  50. package/dist/src/commands/aws/connect.js +39 -0
  51. package/dist/src/commands/aws/connect.js.map +1 -0
  52. package/dist/src/commands/aws/recommend.d.ts +12 -0
  53. package/dist/src/commands/aws/recommend.d.ts.map +1 -0
  54. package/dist/src/commands/aws/recommend.js +21 -0
  55. package/dist/src/commands/aws/recommend.js.map +1 -0
  56. package/dist/src/commands/bedrock-protection/scan-account.d.ts.map +1 -1
  57. package/dist/src/commands/bedrock-protection/scan-account.js +14 -35
  58. package/dist/src/commands/bedrock-protection/scan-account.js.map +1 -1
  59. package/dist/src/commands/bedrock-protection/scan-org.d.ts.map +1 -1
  60. package/dist/src/commands/bedrock-protection/scan-org.js +12 -5
  61. package/dist/src/commands/bedrock-protection/scan-org.js.map +1 -1
  62. package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts +12 -6
  63. package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -1
  64. package/dist/src/commands/bootstrapper/setup-otel-sync.js +18 -409
  65. package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -1
  66. package/dist/src/commands/enable/codeburn.d.ts +59 -0
  67. package/dist/src/commands/enable/codeburn.d.ts.map +1 -0
  68. package/dist/src/commands/enable/codeburn.js +531 -0
  69. package/dist/src/commands/enable/codeburn.js.map +1 -0
  70. package/dist/src/commands/enable/security.d.ts +41 -0
  71. package/dist/src/commands/enable/security.d.ts.map +1 -0
  72. package/dist/src/commands/enable/security.js +128 -0
  73. package/dist/src/commands/enable/security.js.map +1 -0
  74. package/dist/src/commands/export/otel.d.ts +31 -0
  75. package/dist/src/commands/export/otel.d.ts.map +1 -0
  76. package/dist/src/commands/export/otel.js +52 -0
  77. package/dist/src/commands/export/otel.js.map +1 -0
  78. package/dist/src/commands/security/code-review.d.ts +22 -0
  79. package/dist/src/commands/security/code-review.d.ts.map +1 -0
  80. package/dist/src/commands/security/code-review.js +44 -0
  81. package/dist/src/commands/security/code-review.js.map +1 -0
  82. package/dist/src/commands/security/findings.d.ts +15 -0
  83. package/dist/src/commands/security/findings.d.ts.map +1 -0
  84. package/dist/src/commands/security/findings.js +33 -0
  85. package/dist/src/commands/security/findings.js.map +1 -0
  86. package/dist/src/commands/security/pentest.d.ts +18 -0
  87. package/dist/src/commands/security/pentest.d.ts.map +1 -0
  88. package/dist/src/commands/security/pentest.js +33 -0
  89. package/dist/src/commands/security/pentest.js.map +1 -0
  90. package/dist/src/commands/security/threat-model.d.ts +16 -0
  91. package/dist/src/commands/security/threat-model.d.ts.map +1 -0
  92. package/dist/src/commands/security/threat-model.js +25 -0
  93. package/dist/src/commands/security/threat-model.js.map +1 -0
  94. package/dist/src/commands/security/threats.d.ts +12 -0
  95. package/dist/src/commands/security/threats.d.ts.map +1 -0
  96. package/dist/src/commands/security/threats.js +24 -0
  97. package/dist/src/commands/security/threats.js.map +1 -0
  98. package/dist/src/commands/securityagent/setup.d.ts +19 -5
  99. package/dist/src/commands/securityagent/setup.d.ts.map +1 -1
  100. package/dist/src/commands/securityagent/setup.js +25 -189
  101. package/dist/src/commands/securityagent/setup.js.map +1 -1
  102. package/dist/src/dashboard/aws.d.ts +39 -0
  103. package/dist/src/dashboard/aws.d.ts.map +1 -0
  104. package/dist/src/dashboard/aws.js +35 -0
  105. package/dist/src/dashboard/aws.js.map +1 -0
  106. package/dist/src/dashboard/codewatch.d.ts.map +1 -1
  107. package/dist/src/dashboard/codewatch.js +2 -1
  108. package/dist/src/dashboard/codewatch.js.map +1 -1
  109. package/dist/src/dashboard/page.d.ts.map +1 -1
  110. package/dist/src/dashboard/page.js +193 -5
  111. package/dist/src/dashboard/page.js.map +1 -1
  112. package/dist/src/dashboard/payload.d.ts +11 -5
  113. package/dist/src/dashboard/payload.d.ts.map +1 -1
  114. package/dist/src/dashboard/payload.js +7 -2
  115. package/dist/src/dashboard/payload.js.map +1 -1
  116. package/dist/src/dashboard/security.d.ts +130 -0
  117. package/dist/src/dashboard/security.d.ts.map +1 -0
  118. package/dist/src/dashboard/security.js +144 -0
  119. package/dist/src/dashboard/security.js.map +1 -0
  120. package/dist/src/dashboard/setup.d.ts +15 -0
  121. package/dist/src/dashboard/setup.d.ts.map +1 -1
  122. package/dist/src/dashboard/setup.js +20 -3
  123. package/dist/src/dashboard/setup.js.map +1 -1
  124. package/dist/src/dashboard/usage.js +1 -1
  125. package/dist/src/dashboard/usage.js.map +1 -1
  126. package/dist/src/index.d.ts.map +1 -1
  127. package/dist/src/index.js +9 -2
  128. package/dist/src/index.js.map +1 -1
  129. package/dist/src/security/cfn-diff.d.ts +57 -0
  130. package/dist/src/security/cfn-diff.d.ts.map +1 -0
  131. package/dist/src/security/cfn-diff.js +112 -0
  132. package/dist/src/security/cfn-diff.js.map +1 -0
  133. package/dist/src/security/errors.d.ts +45 -0
  134. package/dist/src/security/errors.d.ts.map +1 -0
  135. package/dist/src/security/errors.js +116 -0
  136. package/dist/src/security/errors.js.map +1 -0
  137. package/dist/src/security/marker.d.ts +46 -0
  138. package/dist/src/security/marker.d.ts.map +1 -0
  139. package/dist/src/security/marker.js +120 -0
  140. package/dist/src/security/marker.js.map +1 -0
  141. package/dist/src/security/pentest-dockerfile.d.ts +8 -0
  142. package/dist/src/security/pentest-dockerfile.d.ts.map +1 -0
  143. package/dist/src/security/pentest-dockerfile.js +163 -0
  144. package/dist/src/security/pentest-dockerfile.js.map +1 -0
  145. package/dist/src/security/pentest.d.ts +233 -0
  146. package/dist/src/security/pentest.d.ts.map +1 -0
  147. package/dist/src/security/pentest.js +1057 -0
  148. package/dist/src/security/pentest.js.map +1 -0
  149. package/dist/src/security/repo.d.ts +25 -0
  150. package/dist/src/security/repo.d.ts.map +1 -0
  151. package/dist/src/security/repo.js +38 -0
  152. package/dist/src/security/repo.js.map +1 -0
  153. package/dist/src/security/review.d.ts +202 -0
  154. package/dist/src/security/review.d.ts.map +1 -0
  155. package/dist/src/security/review.js +706 -0
  156. package/dist/src/security/review.js.map +1 -0
  157. package/dist/src/security/setup.d.ts +209 -0
  158. package/dist/src/security/setup.d.ts.map +1 -0
  159. package/dist/src/security/setup.js +742 -0
  160. package/dist/src/security/setup.js.map +1 -0
  161. package/dist/src/security/threat-model.d.ts +133 -0
  162. package/dist/src/security/threat-model.d.ts.map +1 -0
  163. package/dist/src/security/threat-model.js +653 -0
  164. package/dist/src/security/threat-model.js.map +1 -0
  165. package/dist/src/utils/audit-account.d.ts +50 -0
  166. package/dist/src/utils/audit-account.d.ts.map +1 -0
  167. package/dist/src/utils/audit-account.js +69 -0
  168. package/dist/src/utils/audit-account.js.map +1 -0
  169. package/dist/src/utils/audit-iam.d.ts +1 -1
  170. package/dist/src/utils/audit-iam.d.ts.map +1 -1
  171. package/dist/src/utils/audit-iam.js +11 -7
  172. package/dist/src/utils/audit-iam.js.map +1 -1
  173. package/dist/src/utils/exec.d.ts +6 -0
  174. package/dist/src/utils/exec.d.ts.map +1 -1
  175. package/dist/src/utils/exec.js +12 -1
  176. package/dist/src/utils/exec.js.map +1 -1
  177. package/dist/src/utils/otel-sync-schedule.d.ts +19 -0
  178. package/dist/src/utils/otel-sync-schedule.d.ts.map +1 -1
  179. package/dist/src/utils/otel-sync-schedule.js +24 -2
  180. package/dist/src/utils/otel-sync-schedule.js.map +1 -1
  181. package/package.json +3 -3
@@ -0,0 +1,31 @@
1
+ import type { RunResult } from '../utils/exec.js';
2
+ import { type PrismResult } from '../codewatch/results.js';
3
+ import { type SecurityOptions } from '../security/setup.js';
4
+ export declare const CHECK_NOTICE = "Read-only (aws check): every AWS call is a describe, get or list; nothing in AWS is changed. The result is saved to .prism/results/.";
5
+ export interface CheckOptions extends Pick<SecurityOptions, 'profile' | 'region' | 'profileSource' | 'connection'> {
6
+ section?: string[];
7
+ failOn?: string;
8
+ json?: boolean;
9
+ /** false: save the result but print no report (aws recommend --refresh --json). */
10
+ report?: boolean;
11
+ }
12
+ export interface CheckRunDeps {
13
+ env: NodeJS.ProcessEnv;
14
+ home: string;
15
+ cwd(): string;
16
+ configRegion(profile?: string): string | null;
17
+ awsVersion(): string | null;
18
+ git(args: string[]): RunResult;
19
+ log(line?: string): void;
20
+ err(line?: string): void;
21
+ now(): Date;
22
+ }
23
+ export interface CheckOutcome {
24
+ code: number;
25
+ result?: PrismResult;
26
+ path?: string;
27
+ }
28
+ /** Where results go: the repo of the working directory, else ~ (so ~/.prism/results/). */
29
+ export declare function resultsRoot(d: Pick<CheckRunDeps, 'cwd' | 'git' | 'home'>): string;
30
+ export declare function awsCheck(input: CheckOptions, d: CheckRunDeps): CheckOutcome;
31
+ //# sourceMappingURL=run-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-check.d.ts","sourceRoot":"","sources":["../../../src/aws/run-check.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvG,OAAO,EAAkE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI5H,eAAO,MAAM,YAAY,yIAAyI,CAAC;AAEnK,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,eAAe,GAAG,YAAY,CAAC;IAChH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,IAAI,MAAM,CAAC;IACd,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,UAAU,IAAI,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAEnF,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAEjF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,CA+D3E"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Runs `prism-cli aws check`: resolve the target, print the identity header,
3
+ * run the selected sections, save the result (kind aws-check) and print the
4
+ * report. Synchronous on purpose: every AWS call is a blocking CLI read, and
5
+ * the tests drive it through the fake `aws` binary.
6
+ */
7
+ import { aws } from '../utils/aws.js';
8
+ import { parseFailOn, renderReport } from '../utils/audit.js';
9
+ import { makeResult, writeResult } from '../codewatch/results.js';
10
+ import { NO_REGION_MESSAGE, printIdentity, resolveRegion } from '../security/setup.js';
11
+ import { repoRootOf } from './connection.js';
12
+ import { breaching, countFindings, failBySeverity, securityContext, selectSections } from './check.js';
13
+ export const CHECK_NOTICE = 'Read-only (aws check): every AWS call is a describe, get or list; nothing in AWS is changed. The result is saved to .prism/results/.';
14
+ /** Where results go: the repo of the working directory, else ~ (so ~/.prism/results/). */
15
+ export function resultsRoot(d) {
16
+ return repoRootOf(d.cwd(), d.git) ?? d.home;
17
+ }
18
+ export function awsCheck(input, d) {
19
+ const say = input.json ? d.err : d.log;
20
+ say(CHECK_NOTICE);
21
+ say('');
22
+ let failOn;
23
+ try {
24
+ failOn = parseFailOn(input.failOn);
25
+ }
26
+ catch (e) {
27
+ say(`Error: ${e.message}`);
28
+ return { code: 1 };
29
+ }
30
+ const sections = selectSections(input.section);
31
+ if ('error' in sections) {
32
+ say(`Error: ${sections.error}`);
33
+ return { code: 1 };
34
+ }
35
+ const r = resolveRegion(input, d);
36
+ if (!r) {
37
+ say(`Error: ${NO_REGION_MESSAGE} Or save one with prism-cli aws connect.`);
38
+ return { code: 1 };
39
+ }
40
+ const region = r.region;
41
+ // The region is pinned in the child env too, so global-endpoint calls (IAM, budgets) never depend on profile config.
42
+ const target = { profile: input.profile, env: { AWS_PAGER: '', AWS_REGION: region, AWS_DEFAULT_REGION: region } };
43
+ const who = aws(['sts', 'get-caller-identity'], target);
44
+ const account = who.ok ? String(who.json?.Account || '') : '';
45
+ if (!account) {
46
+ const why = who.errorCode || who.raw.split('\n').map((l) => l.trim()).filter(Boolean).pop() || 'no account in the response';
47
+ say(`Error: cannot resolve the AWS identity: ${why}. Sign in (e.g. aws sso login), pass --profile, or run prism-cli aws connect.`);
48
+ return { code: 1 };
49
+ }
50
+ const a = aws(['iam', 'list-account-aliases'], target);
51
+ const alias = a.ok && a.json?.AccountAliases?.[0] ? String(a.json.AccountAliases[0]) : null;
52
+ const opts = { ...input, region, regionSource: r.source };
53
+ const security = securityContext(opts, (args, rg) => aws([...args, '--region', rg], target), d.env, d.awsVersion, say);
54
+ printIdentity(security, { account, arn: String(who.json?.Arn || ''), alias });
55
+ say('');
56
+ const started = d.now().toISOString();
57
+ const ctx = { target, account, region, home: d.home, security };
58
+ const findings = sections.flatMap((s) => s.run(ctx));
59
+ const info = {
60
+ account, alias, region, profile: input.profile ?? null, profile_source: input.profileSource ?? null,
61
+ sections: sections.map((s) => s.name),
62
+ section_counts: Object.fromEntries(sections.map((s) => [s.name, countFindings(findings.filter((f) => f.category === s.name))])),
63
+ counts: countFindings(findings),
64
+ fail_by_severity: failBySeverity(findings),
65
+ checks: findings,
66
+ };
67
+ const result = makeResult({
68
+ kind: 'aws-check', hook: 'manual', tool: 'prism-cli', started_at: started, finished_at: d.now().toISOString(),
69
+ status: info.counts.fail || info.counts.indeterminate ? 'findings' : 'ok',
70
+ summary: `${info.counts.pass} pass, ${info.counts.fail} fail, ${info.counts.indeterminate} indeterminate`,
71
+ aws_check: info,
72
+ });
73
+ const path = writeResult(resultsRoot(d), result);
74
+ if (input.report !== false)
75
+ renderReport(findings, {
76
+ title: '☁️ AWS account check',
77
+ subtitle: `Account: ${account}${alias ? ` (${alias})` : ''} Region: ${region}`,
78
+ groups: sections.map((s) => [s.name, s.heading]),
79
+ json: !!input.json,
80
+ jsonContext: { account, alias, region, sections: info.sections, section_counts: info.section_counts, result_path: path },
81
+ });
82
+ say(`Saved ${path}`);
83
+ say('Next: prism-cli aws recommend (turns these results into a ranked fix list; no AWS calls).');
84
+ const breach = breaching(findings, failOn);
85
+ if (breach.length) {
86
+ d.err(`❌ ${breach.length} finding(s) at or above ${failOn}: ${breach.map((f) => f.id).join(', ')}`);
87
+ return { code: 1, result, path };
88
+ }
89
+ return { code: 0, result, path };
90
+ }
91
+ //# sourceMappingURL=run-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-check.js","sourceRoot":"","sources":["../../../src/aws/run-check.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { Finding as AuditFinding, Severity as AuditSeverity } from '../utils/audit.js';
1
2
  export declare const RESULT_SCHEMA_VERSION = 1;
2
3
  export declare const RESULTS_DIR = ".prism/results";
3
4
  /** Pre-commit ran with no gitleaks on PATH: the commit was allowed but not secret-scanned. */
@@ -12,17 +13,155 @@ export interface Finding {
12
13
  file: string;
13
14
  line: number | null;
14
15
  message: string;
16
+ /** security-review / security-pentest: the Security Agent risk level (CRITICAL ... UNKNOWN), finding title, CWE and id. */
17
+ risk_level?: string;
18
+ title?: string;
19
+ cwe?: string | null;
20
+ finding_id?: string;
21
+ /** security-review only: the path exactly as the service reported it (file is repo-relative). */
22
+ raw_file?: string;
23
+ /** security-threat-model only: the threat's id, STRIDE categories, mitigation and every evidence path (repo-relative). */
24
+ threat_id?: string;
25
+ stride?: string[];
26
+ recommendation?: string;
27
+ evidence?: string[];
28
+ /** security-pentest only: the agent's confidence (HIGH | MEDIUM | LOW | FALSE_POSITIVE). */
29
+ confidence?: string;
30
+ }
31
+ /**
32
+ * `secrets` = gitleaks; `review` = the reviewer (kiro-cli / Claude Code);
33
+ * `security-review` = an AWS Security Agent code review job;
34
+ * `security-threat-model` = an AWS Security Agent threat model job;
35
+ * `security-pentest` = an AWS Security Agent penetration test job.
36
+ */
37
+ export type ResultKind = 'secrets' | 'review' | 'security-review' | 'security-threat-model' | 'security-pentest' | 'aws-check';
38
+ /**
39
+ * aws-check only: one `prism-cli aws check` run. The audit findings live in
40
+ * `checks` (their shape differs from a code finding); `findings` stays empty.
41
+ */
42
+ export interface AwsCheckInfo {
43
+ account: string;
44
+ alias: string | null;
45
+ region: string;
46
+ profile: string | null;
47
+ /** Where the profile came from, e.g. "--profile" or "aws connect, user". */
48
+ profile_source: string | null;
49
+ /** The sections that ran, in order. */
50
+ sections: string[];
51
+ /** PASS / FAIL / INDETERMINATE counts per section. */
52
+ section_counts: Record<string, {
53
+ pass: number;
54
+ fail: number;
55
+ indeterminate: number;
56
+ }>;
57
+ counts: {
58
+ pass: number;
59
+ fail: number;
60
+ indeterminate: number;
61
+ };
62
+ /** FAIL findings per severity. */
63
+ fail_by_severity: Record<AuditSeverity, number>;
64
+ checks: AuditFinding[];
65
+ }
66
+ /** security-threat-model only: the job behind the result. */
67
+ export interface ThreatModelInfo {
68
+ job_id: string;
69
+ threat_model_id: string;
70
+ agent_space_id: string;
71
+ region: string;
72
+ account?: string;
73
+ job_status: string;
74
+ /** Threats per severity (CRITICAL ... INFO). */
75
+ counts: Record<string, number>;
76
+ /** Threats per STRIDE category. */
77
+ stride_counts: Record<string, number>;
78
+ /** Repo paths of the scope docs, as read from the commit. */
79
+ scope_docs: string[];
80
+ /** The agent's system overview, in full; null until the job completes. */
81
+ system_overview: string | null;
82
+ service_created_at?: string | null;
83
+ service_updated_at?: string | null;
84
+ }
85
+ /** security-review only: the job behind the result. */
86
+ export interface SecurityReviewInfo {
87
+ job_id: string;
88
+ code_review_id: string;
89
+ agent_space_id: string;
90
+ region: string;
91
+ /** The AWS account the job ran in, so `security findings` only completes its own account's pending records. */
92
+ account?: string;
93
+ /** diff: the branch diff base...tip. full: the whole repo at tip. unknown: fetched later by `security findings`. */
94
+ scope: 'diff' | 'full' | 'unknown';
95
+ /**
96
+ * The commit the code review's source asset (repo/<slug>/latest.zip) held
97
+ * when the job started: the code a diff job reads around the patch. null
98
+ * when unknown (a job `security findings` fetched with no pending record).
99
+ */
100
+ context_commit?: string | null;
101
+ job_status: string;
102
+ /** Findings per Security Agent risk level. */
103
+ counts: Record<string, number>;
104
+ /** The service's job timestamps, and updatedAt - createdAt (queue plus run time), when it reported them. */
105
+ service_created_at?: string | null;
106
+ service_updated_at?: string | null;
107
+ service_duration_s?: number | null;
108
+ /** Our wall time from starting the job to seeing it finish (code-review only; includes polling). */
109
+ wall_s?: number | null;
110
+ }
111
+ /**
112
+ * security-pentest only: the penetration-test job behind the result, and the
113
+ * temporary environment it ran against. Mirrors SecurityReviewInfo; a pentest
114
+ * finding has no file/line, carries a `confidence`, and the environment handle
115
+ * is what `security pentest --cleanup` tears down.
116
+ */
117
+ export interface PentestInfo {
118
+ job_id: string;
119
+ pentest_id: string;
120
+ agent_space_id: string;
121
+ /** True when this run created a dedicated agent space (teardown deletes it); false when it reused a shared one. */
122
+ agent_space_dedicated: boolean;
123
+ region: string;
124
+ /** The AWS account the job ran in, so findings only completes its own account's pending records. */
125
+ account?: string;
126
+ /** The verified target domain the pentest ran against (app.<zone>). */
127
+ target_host: string;
128
+ job_status: string;
129
+ /** Findings per Security Agent risk level, after dropping FALSE_POSITIVE confidence (unless --include-false-positives). */
130
+ counts: Record<string, number>;
131
+ /** First paragraph of the job's `overview` text, when the service reported one. */
132
+ overview?: string | null;
133
+ /** The CloudFormation stack and run slug of the temporary environment, for --cleanup. */
134
+ stack?: string | null;
135
+ slug?: string | null;
136
+ /** When the environment is set to auto-expire (the prism:expires-at tag), ISO. */
137
+ expires_at?: string | null;
138
+ /** The agent ENIs' security group id: teardown waits for its ENIs to drain before destroying the stack. */
139
+ agent_security_group_id?: string | null;
140
+ /** The app container's log group, for debugging hints. */
141
+ app_log_group?: string | null;
142
+ /** The PRIVATE_VPC target domain this run created; teardown deletes it. */
143
+ target_domain_id?: string | null;
144
+ /** Set when the last teardown left the stack up (destroy failed twice); --cleanup retries it. */
145
+ teardown_failed?: {
146
+ at: string;
147
+ reason: string;
148
+ } | null;
149
+ service_created_at?: string | null;
150
+ service_updated_at?: string | null;
151
+ service_duration_s?: number | null;
152
+ wall_s?: number | null;
15
153
  }
16
- /** `secrets` = gitleaks; `review` = the reviewer (kiro-cli / Claude Code). */
17
- export type ResultKind = 'secrets' | 'review';
18
154
  export type ResultHook = 'pre-commit' | 'pre-push' | 'ci' | 'manual';
19
155
  /**
20
156
  * ok ran, nothing found
21
157
  * findings ran, found something
22
158
  * error could not produce a verdict (tool missing, crashed, unparseable output)
23
159
  * skipped did not run: no changes to review, or the hook was bypassed (`--no-verify`)
160
+ * pending security-review / security-pentest: the job was started and has no
161
+ * verdict yet. finished_at equals started_at until the record is
162
+ * completed in place.
24
163
  */
25
- export type ResultStatus = 'ok' | 'findings' | 'error' | 'skipped';
164
+ export type ResultStatus = 'ok' | 'findings' | 'error' | 'skipped' | 'pending';
26
165
  export interface PrismResult {
27
166
  schema_version: typeof RESULT_SCHEMA_VERSION;
28
167
  kind: ResultKind;
@@ -55,6 +194,14 @@ export interface PrismResult {
55
194
  * consumers (the dashboard, CI) match on exactly: see REASON_*.
56
195
  */
57
196
  reason: string | null;
197
+ /** Present on kind security-review. */
198
+ security?: SecurityReviewInfo;
199
+ /** Present on kind security-threat-model. */
200
+ threat_model?: ThreatModelInfo;
201
+ /** Present on kind security-pentest. */
202
+ pentest?: PentestInfo;
203
+ /** Present on kind aws-check. */
204
+ aws_check?: AwsCheckInfo;
58
205
  }
59
206
  export type ResultInit = Omit<PrismResult, 'schema_version' | 'tool_version' | 'model' | 'commit' | 'tree' | 'branch' | 'upstream' | 'base' | 'summary' | 'score' | 'reason' | 'findings'> & Partial<Pick<PrismResult, 'tool_version' | 'model' | 'commit' | 'tree' | 'branch' | 'upstream' | 'base' | 'summary' | 'score' | 'reason' | 'findings'>>;
60
207
  export declare function makeResult(init: ResultInit): PrismResult;
@@ -76,7 +223,11 @@ export declare function resultFileName(r: PrismResult): string;
76
223
  * clean without touching any tracked file. Outside a git repo it does nothing.
77
224
  */
78
225
  export declare function ensureResultsExcluded(repoRoot: string): boolean;
79
- export declare function writeResult(repoRoot: string, r: PrismResult): string;
226
+ /**
227
+ * `id` (a ResultEntry id) rewrites that existing file in place instead of
228
+ * naming a new one: how a pending security-review record is completed.
229
+ */
230
+ export declare function writeResult(repoRoot: string, r: PrismResult, id?: string): string;
80
231
  export interface ResultEntry {
81
232
  /** File name without `.json`: the result's stable id (used by report links). */
82
233
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/codewatch/results.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/codewatch/results.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,10 @@ export function compactTimestamp(iso) {
47
47
  * no commit yet (pre-commit).
48
48
  */
49
49
  export function resultFileName(r) {
50
+ // An account check is not tied to a commit: `aws-<account>-<region>-<time>-aws-check.json`.
51
+ if (r.kind === 'aws-check' && r.aws_check) {
52
+ return `aws-${safePart(r.aws_check.account)}-${safePart(r.aws_check.region)}-${compactTimestamp(r.started_at)}-${safePart(r.kind)}.json`;
53
+ }
50
54
  const id = r.commit ? safePart(r.commit.slice(0, 12)) : r.tree ? `tree-${safePart(r.tree.slice(0, 12))}` : 'nocommit';
51
55
  return `${id}-${compactTimestamp(r.started_at)}-${safePart(r.hook)}-${safePart(r.kind)}.json`;
52
56
  }
@@ -72,7 +76,13 @@ export function ensureResultsExcluded(repoRoot) {
72
76
  appendFileSync(p.stdout, `${prefix}# prism-cli codewatch results (local)\n/${RESULTS_DIR}/\n`);
73
77
  return true;
74
78
  }
75
- export function writeResult(repoRoot, r) {
79
+ /**
80
+ * `id` (a ResultEntry id) rewrites that existing file in place instead of
81
+ * naming a new one: how a pending security-review record is completed.
82
+ */
83
+ export function writeResult(repoRoot, r, id) {
84
+ if (id !== undefined && !/^[A-Za-z0-9_-]{1,200}$/.test(id))
85
+ throw new Error(`invalid result id: ${id}`);
76
86
  const dir = resolve(repoRoot, RESULTS_DIR);
77
87
  if (!fileExists(dir)) {
78
88
  try {
@@ -81,7 +91,7 @@ export function writeResult(repoRoot, r) {
81
91
  catch { /* never fail a write over this */ }
82
92
  }
83
93
  mkdirSync(dir, { recursive: true });
84
- const dest = join(dir, resultFileName(r));
94
+ const dest = join(dir, id !== undefined ? `${id}.json` : resultFileName(r));
85
95
  const tmp = `${dest}.${process.pid}.tmp`;
86
96
  writeFileSync(tmp, JSON.stringify(r, null, 2) + '\n', { mode: 0o600 });
87
97
  renameSync(tmp, dest);
@@ -1 +1 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/codewatch/results.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/codewatch/results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export declare const PACKAGE_NAME = "@prism-d1/cli";
2
+ export interface Install {
3
+ /** The PATH entry. */
4
+ path: string;
5
+ /** Where it resolves after symlinks. */
6
+ realpath: string;
7
+ /** From the package.json next to it; null when it cannot be found. */
8
+ version: string | null;
9
+ /** True when it is this running CLI. */
10
+ isThis: boolean;
11
+ }
12
+ export interface VersionReport {
13
+ schema: 'prism.version.v1';
14
+ version: string;
15
+ node: string;
16
+ latest: string | null;
17
+ updateAvailable: boolean | null;
18
+ /** Why latest is null: 'offline', or the npm failure. */
19
+ latestNote: string | null;
20
+ onPath: Install[];
21
+ warnings: string[];
22
+ }
23
+ export interface VersionDeps {
24
+ /** The directory holding this CLI's package.json. */
25
+ ownPackageDir: string;
26
+ pathEnv: string;
27
+ /** `npm view @prism-d1/cli version`: the version, or an error message. */
28
+ npmLatest: () => {
29
+ version: string | null;
30
+ error?: string;
31
+ };
32
+ }
33
+ /** Walks up from `start` to the package.json of @prism-d1/cli, at most 6 levels. */
34
+ export declare function findPackageDir(start: string): string | null;
35
+ /** -1, 0 or 1, comparing dotted numeric versions; pre-release tags are ignored. */
36
+ export declare function compareVersions(a: string, b: string): number;
37
+ /**
38
+ * Every prism-cli on PATH, in PATH order, deduplicated by real path (e.g.
39
+ * /bin -> /usr/bin).
40
+ *
41
+ * shortcut: on Windows, npm's .cmd shims do not resolve to their package, so
42
+ * other installs there show version unknown; parse the shim if that matters.
43
+ */
44
+ export declare function installsOnPath(pathEnv: string, ownPackageDir: string): Install[];
45
+ export declare function buildReport(opts: {
46
+ offline?: boolean;
47
+ }, d: VersionDeps): VersionReport;
48
+ export declare function defaultDeps(): VersionDeps;
49
+ export declare function printReport(r: VersionReport, log?: (l: string) => void): void;
50
+ declare const _default: {
51
+ description: string;
52
+ options: {
53
+ flags: string;
54
+ description: string;
55
+ }[];
56
+ action(opts: {
57
+ json?: boolean;
58
+ offline?: boolean;
59
+ }): Promise<void>;
60
+ };
61
+ export default _default;
62
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/commands/_top/version.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAK5C,MAAM,WAAW,OAAO;IACtB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,yDAAyD;IACzD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc3D;AAWD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,EAAE,CAoBhF;AAMD,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,EAAE,WAAW,GAAG,aAAa,CA4BtF;AAeD,wBAAgB,WAAW,IAAI,WAAW,CAMzC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAkB,GAAG,IAAI,CAO1F;;;;;;;iBAQoB;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;;AAN1D,wBAWE"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * `prism-cli version`: this CLI's version, whether npm has a newer one, and
3
+ * any other prism-cli on PATH that shadows this one or differs from it (an old
4
+ * /usr/bin/prism-cli under a system Node is the usual case).
5
+ *
6
+ * The npm check never fails the command: a timeout, no network or no npm is
7
+ * reported as "not checked". `--offline` skips it. `prism-cli --version` stays
8
+ * the bare version string from commander.
9
+ */
10
+ import { spawnSync } from 'node:child_process';
11
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
12
+ import { delimiter, dirname, join, resolve } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ export const PACKAGE_NAME = '@prism-d1/cli';
15
+ const BIN_NAME = 'prism-cli';
16
+ /** Short: this runs on every `version` call and must not stall a terminal. */
17
+ const NPM_TIMEOUT_MS = 5000;
18
+ /** Walks up from `start` to the package.json of @prism-d1/cli, at most 6 levels. */
19
+ export function findPackageDir(start) {
20
+ let dir = start;
21
+ for (let i = 0; i < 6; i++) {
22
+ const pkg = join(dir, 'package.json');
23
+ if (existsSync(pkg)) {
24
+ try {
25
+ if (JSON.parse(readFileSync(pkg, 'utf8')).name === PACKAGE_NAME)
26
+ return dir;
27
+ }
28
+ catch { /* not ours */ }
29
+ }
30
+ const parent = dirname(dir);
31
+ if (parent === dir)
32
+ break;
33
+ dir = parent;
34
+ }
35
+ return null;
36
+ }
37
+ function packageVersion(dir) {
38
+ if (!dir)
39
+ return null;
40
+ try {
41
+ return String(JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')).version);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /** -1, 0 or 1, comparing dotted numeric versions; pre-release tags are ignored. */
48
+ export function compareVersions(a, b) {
49
+ const pa = a.split(/[.-]/).slice(0, 3).map((n) => parseInt(n, 10) || 0);
50
+ const pb = b.split(/[.-]/).slice(0, 3).map((n) => parseInt(n, 10) || 0);
51
+ for (let i = 0; i < 3; i++)
52
+ if (pa[i] !== pb[i])
53
+ return pa[i] > pb[i] ? 1 : -1;
54
+ return 0;
55
+ }
56
+ /**
57
+ * Every prism-cli on PATH, in PATH order, deduplicated by real path (e.g.
58
+ * /bin -> /usr/bin).
59
+ *
60
+ * shortcut: on Windows, npm's .cmd shims do not resolve to their package, so
61
+ * other installs there show version unknown; parse the shim if that matters.
62
+ */
63
+ export function installsOnPath(pathEnv, ownPackageDir) {
64
+ const seen = new Set();
65
+ const out = [];
66
+ const exts = process.platform === 'win32' ? ['.cmd', ''] : [''];
67
+ const own = realOrSelf(ownPackageDir);
68
+ for (const dir of pathEnv.split(delimiter)) {
69
+ if (!dir)
70
+ continue;
71
+ for (const ext of exts) {
72
+ const p = join(dir, BIN_NAME + ext);
73
+ try {
74
+ if (!statSync(p).isFile())
75
+ continue;
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ const real = realOrSelf(p);
81
+ if (seen.has(real))
82
+ continue;
83
+ seen.add(real);
84
+ const pkgDir = findPackageDir(dirname(real));
85
+ out.push({ path: p, realpath: real, version: packageVersion(pkgDir), isThis: !!pkgDir && realOrSelf(pkgDir) === own });
86
+ }
87
+ }
88
+ return out;
89
+ }
90
+ function realOrSelf(p) {
91
+ try {
92
+ return realpathSync(p);
93
+ }
94
+ catch {
95
+ return resolve(p);
96
+ }
97
+ }
98
+ export function buildReport(opts, d) {
99
+ const version = packageVersion(d.ownPackageDir) ?? 'unknown';
100
+ const warnings = [];
101
+ const onPath = installsOnPath(d.pathEnv, d.ownPackageDir);
102
+ const first = onPath[0];
103
+ if (!first) {
104
+ warnings.push(`${BIN_NAME} is not on PATH; this copy runs only by its full path.`);
105
+ }
106
+ else if (!first.isThis) {
107
+ warnings.push(`"${BIN_NAME}" on PATH runs ${first.path} (${first.version ?? 'version unknown'}), not this CLI (${version}, ${d.ownPackageDir}).`);
108
+ }
109
+ const others = onPath.filter((i, n) => !i.isThis && n > 0 && i.version !== version);
110
+ for (const o of others) {
111
+ warnings.push(`Another ${BIN_NAME} on PATH: ${o.path} (${o.version ?? 'version unknown'}), shadowed by ${first.path}. A different Node or shell may run it; remove it with that Node's "npm uninstall -g ${PACKAGE_NAME}".`);
112
+ }
113
+ let latest = null;
114
+ let latestNote = null;
115
+ if (opts.offline) {
116
+ latestNote = 'offline';
117
+ }
118
+ else {
119
+ const r = d.npmLatest();
120
+ latest = r.version;
121
+ if (!latest)
122
+ latestNote = r.error || 'npm returned no version';
123
+ }
124
+ const updateAvailable = latest && version !== 'unknown' ? compareVersions(latest, version) > 0 : null;
125
+ return { schema: 'prism.version.v1', version, node: process.version, latest, updateAvailable, latestNote, onPath, warnings };
126
+ }
127
+ function realNpmLatest() {
128
+ const o = { encoding: 'utf8', timeout: NPM_TIMEOUT_MS, stdio: ['ignore', 'pipe', 'pipe'] };
129
+ // Windows resolves npm.cmd only through a shell. The command is a constant
130
+ // with no user input, so the shell parses nothing it was given.
131
+ const r = process.platform === 'win32'
132
+ ? spawnSync(`npm view ${PACKAGE_NAME} version`, { ...o, shell: true })
133
+ : spawnSync('npm', ['view', PACKAGE_NAME, 'version'], o);
134
+ if (r.error)
135
+ return { version: null, error: r.error.code === 'ETIMEDOUT' ? `npm did not answer within ${NPM_TIMEOUT_MS / 1000}s` : r.error.message };
136
+ if (r.status !== 0)
137
+ return { version: null, error: (r.stderr || '').trim().split('\n')[0] || `npm exited ${r.status}` };
138
+ const v = (r.stdout || '').trim();
139
+ return /^\d+\.\d+\.\d+/.test(v) ? { version: v } : { version: null, error: 'unexpected npm output' };
140
+ }
141
+ export function defaultDeps() {
142
+ return {
143
+ ownPackageDir: findPackageDir(dirname(fileURLToPath(import.meta.url))) ?? process.cwd(),
144
+ pathEnv: process.env.PATH || '',
145
+ npmLatest: realNpmLatest,
146
+ };
147
+ }
148
+ export function printReport(r, log = console.log) {
149
+ log(`${BIN_NAME} ${r.version} (Node ${r.node})`);
150
+ if (r.updateAvailable)
151
+ log(`Update available: ${r.latest}. Run: npm install -g ${PACKAGE_NAME}`);
152
+ else if (r.latest)
153
+ log(`Up to date (latest on npm: ${r.latest}).`);
154
+ else if (r.latestNote === 'offline')
155
+ log('Update check skipped (--offline).');
156
+ else
157
+ log(`Update check: not checked (${r.latestNote}).`);
158
+ for (const w of r.warnings)
159
+ log(`⚠ ${w}`);
160
+ }
161
+ export default {
162
+ description: 'Print the CLI version, check npm for a newer release, and warn about other prism-cli copies on PATH',
163
+ options: [
164
+ { flags: '--json', description: 'Print the report as JSON' },
165
+ { flags: '--offline', description: 'Skip the npm check' },
166
+ ],
167
+ async action(opts) {
168
+ const report = buildReport(opts, defaultDeps());
169
+ if (opts.json)
170
+ console.log(JSON.stringify(report, null, 2));
171
+ else
172
+ printReport(report);
173
+ },
174
+ };
175
+ //# sourceMappingURL=version.js.map