@vibesdotdev/security 0.0.0-stage → 1.0.0-rc.5
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/LICENSE +18 -0
- package/README.md +109 -2
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plugin.d.ts +15 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +25 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli/read-lockfile.d.ts +4 -0
- package/dist/cli/read-lockfile.d.ts.map +1 -0
- package/dist/cli/read-lockfile.js +74 -0
- package/dist/cli/read-lockfile.js.map +1 -0
- package/dist/cli/report-output.d.ts +20 -0
- package/dist/cli/report-output.d.ts.map +1 -0
- package/dist/cli/report-output.js +27 -0
- package/dist/cli/report-output.js.map +1 -0
- package/dist/cli/shield.cli-group.descriptor.d.ts +9 -0
- package/dist/cli/shield.cli-group.descriptor.d.ts.map +1 -0
- package/dist/cli/shield.cli-group.descriptor.js +16 -0
- package/dist/cli/shield.cli-group.descriptor.js.map +1 -0
- package/dist/cli/shield.deps.cli-group.descriptor.d.ts +9 -0
- package/dist/cli/shield.deps.cli-group.descriptor.d.ts.map +1 -0
- package/dist/cli/shield.deps.cli-group.descriptor.js +17 -0
- package/dist/cli/shield.deps.cli-group.descriptor.js.map +1 -0
- package/dist/cli/shield.deps.gate.descriptor.d.ts +10 -0
- package/dist/cli/shield.deps.gate.descriptor.d.ts.map +1 -0
- package/dist/cli/shield.deps.gate.descriptor.js +25 -0
- package/dist/cli/shield.deps.gate.descriptor.js.map +1 -0
- package/dist/cli/shield.deps.gate.impl.consumer.d.ts +18 -0
- package/dist/cli/shield.deps.gate.impl.consumer.d.ts.map +1 -0
- package/dist/cli/shield.deps.gate.impl.consumer.js +42 -0
- package/dist/cli/shield.deps.gate.impl.consumer.js.map +1 -0
- package/dist/cli/shield.deps.scan.descriptor.d.ts +10 -0
- package/dist/cli/shield.deps.scan.descriptor.d.ts.map +1 -0
- package/dist/cli/shield.deps.scan.descriptor.js +25 -0
- package/dist/cli/shield.deps.scan.descriptor.js.map +1 -0
- package/dist/cli/shield.deps.scan.impl.consumer.d.ts +16 -0
- package/dist/cli/shield.deps.scan.impl.consumer.d.ts.map +1 -0
- package/dist/cli/shield.deps.scan.impl.consumer.js +35 -0
- package/dist/cli/shield.deps.scan.impl.consumer.js.map +1 -0
- package/dist/helpers/constant-time.d.ts +18 -0
- package/dist/helpers/constant-time.d.ts.map +1 -0
- package/dist/helpers/constant-time.js +49 -0
- package/dist/helpers/constant-time.js.map +1 -0
- package/dist/helpers/filename-sanitizer.d.ts +2 -0
- package/dist/helpers/filename-sanitizer.d.ts.map +1 -0
- package/dist/helpers/filename-sanitizer.js +18 -0
- package/dist/helpers/filename-sanitizer.js.map +1 -0
- package/dist/helpers/forwardable-auth-headers.d.ts +8 -0
- package/dist/helpers/forwardable-auth-headers.d.ts.map +1 -0
- package/dist/helpers/forwardable-auth-headers.js +44 -0
- package/dist/helpers/forwardable-auth-headers.js.map +1 -0
- package/dist/helpers/index.d.ts +7 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +7 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/ip-range.d.ts +3 -0
- package/dist/helpers/ip-range.d.ts.map +1 -0
- package/dist/helpers/ip-range.js +55 -0
- package/dist/helpers/ip-range.js.map +1 -0
- package/dist/helpers/mime-classifier.d.ts +3 -0
- package/dist/helpers/mime-classifier.d.ts.map +1 -0
- package/dist/helpers/mime-classifier.js +29 -0
- package/dist/helpers/mime-classifier.js.map +1 -0
- package/dist/helpers/pattern-matcher.d.ts +13 -0
- package/dist/helpers/pattern-matcher.d.ts.map +1 -0
- package/dist/helpers/pattern-matcher.js +29 -0
- package/dist/helpers/pattern-matcher.js.map +1 -0
- package/dist/implementations/cli-types.d.ts +2 -0
- package/dist/implementations/cli-types.d.ts.map +1 -0
- package/dist/implementations/cli-types.js +2 -0
- package/dist/implementations/cli-types.js.map +1 -0
- package/dist/implementations/encryption.d.ts +21 -0
- package/dist/implementations/encryption.d.ts.map +1 -0
- package/dist/implementations/encryption.js +154 -0
- package/dist/implementations/encryption.js.map +1 -0
- package/dist/implementations/errors.d.ts +17 -0
- package/dist/implementations/errors.d.ts.map +1 -0
- package/dist/implementations/errors.js +23 -0
- package/dist/implementations/errors.js.map +1 -0
- package/dist/implementations/keys.d.ts +24 -0
- package/dist/implementations/keys.d.ts.map +1 -0
- package/dist/implementations/keys.js +114 -0
- package/dist/implementations/keys.js.map +1 -0
- package/dist/implementations/redaction-admission.d.ts +24 -0
- package/dist/implementations/redaction-admission.d.ts.map +1 -0
- package/dist/implementations/redaction-admission.js +44 -0
- package/dist/implementations/redaction-admission.js.map +1 -0
- package/dist/implementations/redaction.d.ts +32 -0
- package/dist/implementations/redaction.d.ts.map +1 -0
- package/dist/implementations/redaction.js +47 -0
- package/dist/implementations/redaction.js.map +1 -0
- package/dist/implementations/redactor.inprocess.impl.d.ts +30 -0
- package/dist/implementations/redactor.inprocess.impl.d.ts.map +1 -0
- package/dist/implementations/redactor.inprocess.impl.js +26 -0
- package/dist/implementations/redactor.inprocess.impl.js.map +1 -0
- package/dist/implementations/redactor.subprocess.impl.d.ts +25 -0
- package/dist/implementations/redactor.subprocess.impl.d.ts.map +1 -0
- package/dist/implementations/redactor.subprocess.impl.js +42 -0
- package/dist/implementations/redactor.subprocess.impl.js.map +1 -0
- package/dist/implementations/scanner.impl.d.ts +7 -0
- package/dist/implementations/scanner.impl.d.ts.map +1 -0
- package/dist/implementations/scanner.impl.js +166 -0
- package/dist/implementations/scanner.impl.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/kinds/auditor.kind.d.ts +31 -0
- package/dist/kinds/auditor.kind.d.ts.map +1 -0
- package/dist/kinds/auditor.kind.js +48 -0
- package/dist/kinds/auditor.kind.js.map +1 -0
- package/dist/kinds/dep-scanner.kind.d.ts +27 -0
- package/dist/kinds/dep-scanner.kind.d.ts.map +1 -0
- package/dist/kinds/dep-scanner.kind.js +29 -0
- package/dist/kinds/dep-scanner.kind.js.map +1 -0
- package/dist/kinds/freshness-policy.kind.d.ts +34 -0
- package/dist/kinds/freshness-policy.kind.d.ts.map +1 -0
- package/dist/kinds/freshness-policy.kind.js +47 -0
- package/dist/kinds/freshness-policy.kind.js.map +1 -0
- package/dist/kinds/index.d.ts +9 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +9 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/ioc-feed.kind.d.ts +35 -0
- package/dist/kinds/ioc-feed.kind.d.ts.map +1 -0
- package/dist/kinds/ioc-feed.kind.js +36 -0
- package/dist/kinds/ioc-feed.kind.js.map +1 -0
- package/dist/kinds/policy.kind.d.ts +42 -0
- package/dist/kinds/policy.kind.d.ts.map +1 -0
- package/dist/kinds/policy.kind.js +23 -0
- package/dist/kinds/policy.kind.js.map +1 -0
- package/dist/kinds/redactor.kind.d.ts +30 -0
- package/dist/kinds/redactor.kind.d.ts.map +1 -0
- package/dist/kinds/redactor.kind.js +25 -0
- package/dist/kinds/redactor.kind.js.map +1 -0
- package/dist/kinds/scanner.kind.d.ts +35 -0
- package/dist/kinds/scanner.kind.d.ts.map +1 -0
- package/dist/kinds/scanner.kind.js +26 -0
- package/dist/kinds/scanner.kind.js.map +1 -0
- package/dist/schemas/AuditEvent.d.ts +30 -0
- package/dist/schemas/AuditEvent.d.ts.map +1 -0
- package/dist/schemas/AuditEvent.js +17 -0
- package/dist/schemas/AuditEvent.js.map +1 -0
- package/dist/schemas/RedactionRule.d.ts +16 -0
- package/dist/schemas/RedactionRule.d.ts.map +1 -0
- package/dist/schemas/RedactionRule.js +10 -0
- package/dist/schemas/RedactionRule.js.map +1 -0
- package/dist/schemas/SecurityPolicy.d.ts +21 -0
- package/dist/schemas/SecurityPolicy.d.ts.map +1 -0
- package/dist/schemas/SecurityPolicy.js +9 -0
- package/dist/schemas/SecurityPolicy.js.map +1 -0
- package/dist/schemas/ThreatReport.d.ts +25 -0
- package/dist/schemas/ThreatReport.d.ts.map +1 -0
- package/dist/schemas/ThreatReport.js +14 -0
- package/dist/schemas/ThreatReport.js.map +1 -0
- package/dist/schemas/contracts/auditor.d.ts +68 -0
- package/dist/schemas/contracts/auditor.d.ts.map +1 -0
- package/dist/schemas/contracts/auditor.js +13 -0
- package/dist/schemas/contracts/auditor.js.map +1 -0
- package/dist/schemas/contracts/card.d.ts +106 -0
- package/dist/schemas/contracts/card.d.ts.map +1 -0
- package/dist/schemas/contracts/card.js +73 -0
- package/dist/schemas/contracts/card.js.map +1 -0
- package/dist/schemas/contracts/dep-scanner.d.ts +91 -0
- package/dist/schemas/contracts/dep-scanner.d.ts.map +1 -0
- package/dist/schemas/contracts/dep-scanner.js +27 -0
- package/dist/schemas/contracts/dep-scanner.js.map +1 -0
- package/dist/schemas/contracts/freshness-policy.d.ts +99 -0
- package/dist/schemas/contracts/freshness-policy.d.ts.map +1 -0
- package/dist/schemas/contracts/freshness-policy.js +31 -0
- package/dist/schemas/contracts/freshness-policy.js.map +1 -0
- package/dist/schemas/contracts/ioc-feed.d.ts +85 -0
- package/dist/schemas/contracts/ioc-feed.d.ts.map +1 -0
- package/dist/schemas/contracts/ioc-feed.js +28 -0
- package/dist/schemas/contracts/ioc-feed.js.map +1 -0
- package/dist/schemas/contracts/misc.d.ts +11 -0
- package/dist/schemas/contracts/misc.d.ts.map +1 -0
- package/dist/schemas/contracts/misc.js +4 -0
- package/dist/schemas/contracts/misc.js.map +1 -0
- package/dist/schemas/contracts/policy.d.ts +93 -0
- package/dist/schemas/contracts/policy.d.ts.map +1 -0
- package/dist/schemas/contracts/policy.js +25 -0
- package/dist/schemas/contracts/policy.js.map +1 -0
- package/dist/schemas/contracts/redactor.d.ts +99 -0
- package/dist/schemas/contracts/redactor.d.ts.map +1 -0
- package/dist/schemas/contracts/redactor.js +34 -0
- package/dist/schemas/contracts/redactor.js.map +1 -0
- package/dist/schemas/contracts/scanner.d.ts +112 -0
- package/dist/schemas/contracts/scanner.d.ts.map +1 -0
- package/dist/schemas/contracts/scanner.js +40 -0
- package/dist/schemas/contracts/scanner.js.map +1 -0
- package/dist/schemas/contracts/widget.d.ts +19 -0
- package/dist/schemas/contracts/widget.d.ts.map +1 -0
- package/dist/schemas/contracts/widget.js +10 -0
- package/dist/schemas/contracts/widget.js.map +1 -0
- package/dist/schemas/encryption.d.ts +25 -0
- package/dist/schemas/encryption.d.ts.map +1 -0
- package/dist/schemas/encryption.js +35 -0
- package/dist/schemas/encryption.js.map +1 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +6 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/policy.d.ts +2 -0
- package/dist/schemas/policy.d.ts.map +1 -0
- package/dist/schemas/policy.js +2 -0
- package/dist/schemas/policy.js.map +1 -0
- package/dist/schemas/redactor.d.ts +2 -0
- package/dist/schemas/redactor.d.ts.map +1 -0
- package/dist/schemas/redactor.js +2 -0
- package/dist/schemas/redactor.js.map +1 -0
- package/dist/schemas/report-event.d.ts +29 -0
- package/dist/schemas/report-event.d.ts.map +1 -0
- package/dist/schemas/report-event.js +19 -0
- package/dist/schemas/report-event.js.map +1 -0
- package/dist/schemas/scanner.d.ts +2 -0
- package/dist/schemas/scanner.d.ts.map +1 -0
- package/dist/schemas/scanner.js +2 -0
- package/dist/schemas/scanner.js.map +1 -0
- package/dist/security-client/index.d.ts +3 -0
- package/dist/security-client/index.d.ts.map +1 -0
- package/dist/security-client/index.js +2 -0
- package/dist/security-client/index.js.map +1 -0
- package/dist/security-client/security-client.d.ts +34 -0
- package/dist/security-client/security-client.d.ts.map +1 -0
- package/dist/security-client/security-client.js +54 -0
- package/dist/security-client/security-client.js.map +1 -0
- package/dist/security.consumer.plugin.d.ts +3 -0
- package/dist/security.consumer.plugin.d.ts.map +1 -0
- package/dist/security.consumer.plugin.js +28 -0
- package/dist/security.consumer.plugin.js.map +1 -0
- package/dist/security.plugin.d.ts +16 -0
- package/dist/security.plugin.d.ts.map +1 -0
- package/dist/security.plugin.js +78 -0
- package/dist/security.plugin.js.map +1 -0
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +2 -0
- package/dist/svelte/security-svelte.plugin.d.ts +5 -0
- package/dist/svelte/security-svelte.plugin.d.ts.map +1 -0
- package/dist/svelte/security-svelte.plugin.js +49 -0
- package/dist/svelte/styles.css +8 -0
- package/dist/svelte/tool-widgets/SecurityToolCard.svelte +140 -0
- package/dist/svelte/tool-widgets/SecurityToolCard.svelte.d.ts +5 -0
- package/dist/svelte/tool-widgets/SecurityToolCard.svelte.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/index.d.ts +2 -0
- package/dist/svelte/tool-widgets/index.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/index.js +6 -0
- package/dist/tools/check-policy/check-policy.descriptor.d.ts +37 -0
- package/dist/tools/check-policy/check-policy.descriptor.d.ts.map +1 -0
- package/dist/tools/check-policy/check-policy.descriptor.js +21 -0
- package/dist/tools/check-policy/check-policy.descriptor.js.map +1 -0
- package/dist/tools/check-policy/check-policy.impl.consumer.d.ts +7 -0
- package/dist/tools/check-policy/check-policy.impl.consumer.d.ts.map +1 -0
- package/dist/tools/check-policy/check-policy.impl.consumer.js +21 -0
- package/dist/tools/check-policy/check-policy.impl.consumer.js.map +1 -0
- package/dist/tools/check-policy/index.d.ts +3 -0
- package/dist/tools/check-policy/index.d.ts.map +1 -0
- package/dist/tools/check-policy/index.js +2 -0
- package/dist/tools/check-policy/index.js.map +1 -0
- package/dist/tools/check-policy/schemas.d.ts +23 -0
- package/dist/tools/check-policy/schemas.d.ts.map +1 -0
- package/dist/tools/check-policy/schemas.js +13 -0
- package/dist/tools/check-policy/schemas.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/redact-output/index.d.ts +3 -0
- package/dist/tools/redact-output/index.d.ts.map +1 -0
- package/dist/tools/redact-output/index.js +2 -0
- package/dist/tools/redact-output/index.js.map +1 -0
- package/dist/tools/redact-output/redact-output.descriptor.d.ts +42 -0
- package/dist/tools/redact-output/redact-output.descriptor.d.ts.map +1 -0
- package/dist/tools/redact-output/redact-output.descriptor.js +21 -0
- package/dist/tools/redact-output/redact-output.descriptor.js.map +1 -0
- package/dist/tools/redact-output/redact-output.impl.consumer.d.ts +7 -0
- package/dist/tools/redact-output/redact-output.impl.consumer.d.ts.map +1 -0
- package/dist/tools/redact-output/redact-output.impl.consumer.js +18 -0
- package/dist/tools/redact-output/redact-output.impl.consumer.js.map +1 -0
- package/dist/tools/redact-output/schemas.d.ts +28 -0
- package/dist/tools/redact-output/schemas.d.ts.map +1 -0
- package/dist/tools/redact-output/schemas.js +13 -0
- package/dist/tools/redact-output/schemas.js.map +1 -0
- package/dist/tools/report-event/index.d.ts +3 -0
- package/dist/tools/report-event/index.d.ts.map +1 -0
- package/dist/tools/report-event/index.js +2 -0
- package/dist/tools/report-event/index.js.map +1 -0
- package/dist/tools/report-event/report-event.descriptor.d.ts +43 -0
- package/dist/tools/report-event/report-event.descriptor.d.ts.map +1 -0
- package/dist/tools/report-event/report-event.descriptor.js +21 -0
- package/dist/tools/report-event/report-event.descriptor.js.map +1 -0
- package/dist/tools/report-event/report-event.impl.consumer.d.ts +24 -0
- package/dist/tools/report-event/report-event.impl.consumer.d.ts.map +1 -0
- package/dist/tools/report-event/report-event.impl.consumer.js +61 -0
- package/dist/tools/report-event/report-event.impl.consumer.js.map +1 -0
- package/dist/tools/report-event/schemas.d.ts +2 -0
- package/dist/tools/report-event/schemas.d.ts.map +1 -0
- package/dist/tools/report-event/schemas.js +3 -0
- package/dist/tools/report-event/schemas.js.map +1 -0
- package/dist/tools/scan-input/index.d.ts +3 -0
- package/dist/tools/scan-input/index.d.ts.map +1 -0
- package/dist/tools/scan-input/index.js +2 -0
- package/dist/tools/scan-input/index.js.map +1 -0
- package/dist/tools/scan-input/scan-input.descriptor.d.ts +49 -0
- package/dist/tools/scan-input/scan-input.descriptor.d.ts.map +1 -0
- package/dist/tools/scan-input/scan-input.descriptor.js +21 -0
- package/dist/tools/scan-input/scan-input.descriptor.js.map +1 -0
- package/dist/tools/scan-input/scan-input.impl.consumer.d.ts +7 -0
- package/dist/tools/scan-input/scan-input.impl.consumer.d.ts.map +1 -0
- package/dist/tools/scan-input/scan-input.impl.consumer.js +22 -0
- package/dist/tools/scan-input/scan-input.impl.consumer.js.map +1 -0
- package/dist/tools/scan-input/schemas.d.ts +36 -0
- package/dist/tools/scan-input/schemas.d.ts.map +1 -0
- package/dist/tools/scan-input/schemas.js +15 -0
- package/dist/tools/scan-input/schemas.js.map +1 -0
- package/dist/tools/security-tool-card.d.ts +13 -0
- package/dist/tools/security-tool-card.d.ts.map +1 -0
- package/dist/tools/security-tool-card.js +171 -0
- package/dist/tools/security-tool-card.js.map +1 -0
- package/dist/tools/security.docs.descriptor.d.ts +17 -0
- package/dist/tools/security.docs.descriptor.d.ts.map +1 -0
- package/dist/tools/security.docs.descriptor.js +49 -0
- package/dist/tools/security.docs.descriptor.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/security-tui.plugin.d.ts +3 -0
- package/dist/tui/security-tui.plugin.d.ts.map +1 -0
- package/dist/tui/security-tui.plugin.js +31 -0
- package/dist/tui/security-tui.plugin.js.map +1 -0
- package/dist/tui/tool-widgets/SecurityToolWidget.impl.consumer.d.ts +5 -0
- package/dist/tui/tool-widgets/SecurityToolWidget.impl.consumer.d.ts.map +1 -0
- package/dist/tui/tool-widgets/SecurityToolWidget.impl.consumer.js +37 -0
- package/dist/tui/tool-widgets/SecurityToolWidget.impl.consumer.js.map +1 -0
- package/docs/host-boundary.md +186 -0
- package/docs/scanner-work.md +29 -0
- package/package.json +245 -4
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SecurityContentSchema, SecurityScannerOverridesSchema, SecurityScannerResultSchema, ThreatMatchSchema } from "../../schemas/scanner.js";
|
|
2
|
+
import * as z from 'zod/v4';
|
|
3
|
+
export { MAX_SCANNABLE_CONTENT_LENGTH } from "../../schemas/contracts/scanner.js";
|
|
4
|
+
export const ScanInputInputSchema = z.object({
|
|
5
|
+
content: SecurityContentSchema
|
|
6
|
+
.describe('Content to scan for threats'),
|
|
7
|
+
options: SecurityScannerOverridesSchema.optional(),
|
|
8
|
+
});
|
|
9
|
+
export const ScanInputOutputSchema = SecurityScannerResultSchema.omit({ scanAvailable: true }).extend({
|
|
10
|
+
threats: z.array(SecurityScannerResultSchema.shape.threats.element.extend({
|
|
11
|
+
matches: z.array(ThreatMatchSchema.omit({ pattern: true }).extend({ rule: z.string() }))
|
|
12
|
+
})),
|
|
13
|
+
scannerAvailable: z.boolean()
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/tools/scan-input/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjJ,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,qBAAqB;SAC5B,QAAQ,CAAC,6BAA6B,CAAC;IACzC,OAAO,EAAE,8BAA8B,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACrG,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACzE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC,CAAC;KACpF,CAAC,CAAC;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;CAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type SecurityToolId, type PolicyDecision, type SecurityToolCardTone, type SecurityToolCardRow, type SecurityToolCardModel } from '../schemas/contracts/card.ts';
|
|
2
|
+
export { SECURITY_TOOL_IDS, type SecurityToolId, type PolicyDecision, type SecurityToolCardTone, type SecurityToolThreat, type SecurityToolCardRow, type SecurityToolCardModel } from '../schemas/contracts/card.ts';
|
|
3
|
+
export declare function isSecurityToolId(id: string): id is SecurityToolId;
|
|
4
|
+
export declare function securityToolIcon(toolId: string): string;
|
|
5
|
+
export declare function decisionTone(decision: PolicyDecision | null): SecurityToolCardTone;
|
|
6
|
+
export declare function securityToolCardModel(input: {
|
|
7
|
+
name: string;
|
|
8
|
+
input?: unknown;
|
|
9
|
+
output?: unknown;
|
|
10
|
+
error?: string;
|
|
11
|
+
}): SecurityToolCardModel;
|
|
12
|
+
export declare function securityToolCardRows(model: SecurityToolCardModel): SecurityToolCardRow[];
|
|
13
|
+
//# sourceMappingURL=security-tool-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tool-card.d.ts","sourceRoot":"","sources":["../../src/tools/security-tool-card.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EACnE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EACpD,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAC9F,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAC7E,MAAM,8BAA8B,CAAC;AAyBtC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,cAAc,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,oBAAoB,CAKlF;AAeD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,qBAAqB,CAuDxB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,EAAE,CAkBxF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { SECURITY_TOOL_IDS, CardArgsSchema, CardOutputSchema, StringField } from "../schemas/contracts/card.js";
|
|
2
|
+
export { SECURITY_TOOL_IDS } from "../schemas/contracts/card.js";
|
|
3
|
+
const TOOL_ICONS = {
|
|
4
|
+
'security.check-policy': 'lucide:shield-check',
|
|
5
|
+
'security.scan-input': 'lucide:scan-search',
|
|
6
|
+
'security.redact-output': 'lucide:eye-off',
|
|
7
|
+
'security.report-event': 'lucide:clipboard-list',
|
|
8
|
+
};
|
|
9
|
+
const TOOL_TITLES = {
|
|
10
|
+
'security.check-policy': 'Check policy',
|
|
11
|
+
'security.scan-input': 'Scan input',
|
|
12
|
+
'security.redact-output': 'Redact output',
|
|
13
|
+
'security.report-event': 'Audit event',
|
|
14
|
+
};
|
|
15
|
+
const DECISION_LABELS = {
|
|
16
|
+
allow: 'Allowed',
|
|
17
|
+
deny: 'Denied',
|
|
18
|
+
review: 'Review',
|
|
19
|
+
};
|
|
20
|
+
const PREVIEW_LIMIT = 240;
|
|
21
|
+
export function isSecurityToolId(id) {
|
|
22
|
+
return SECURITY_TOOL_IDS.some((toolId) => toolId === id);
|
|
23
|
+
}
|
|
24
|
+
export function securityToolIcon(toolId) {
|
|
25
|
+
return isSecurityToolId(toolId) ? TOOL_ICONS[toolId] : 'lucide:shield';
|
|
26
|
+
}
|
|
27
|
+
export function decisionTone(decision) {
|
|
28
|
+
if (decision === 'allow')
|
|
29
|
+
return 'success';
|
|
30
|
+
if (decision === 'deny')
|
|
31
|
+
return 'danger';
|
|
32
|
+
if (decision === 'review')
|
|
33
|
+
return 'warning';
|
|
34
|
+
return 'default';
|
|
35
|
+
}
|
|
36
|
+
function availabilityFrom(output) {
|
|
37
|
+
if (!output)
|
|
38
|
+
return null;
|
|
39
|
+
if (output.engineAvailable !== undefined)
|
|
40
|
+
return output.engineAvailable;
|
|
41
|
+
if (output.scannerAvailable !== undefined)
|
|
42
|
+
return output.scannerAvailable;
|
|
43
|
+
if (output.redactorAvailable !== undefined)
|
|
44
|
+
return output.redactorAvailable;
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function previewStr(text) {
|
|
48
|
+
if (!text)
|
|
49
|
+
return null;
|
|
50
|
+
return text.length > PREVIEW_LIMIT ? `${text.slice(0, PREVIEW_LIMIT)}…` : text;
|
|
51
|
+
}
|
|
52
|
+
export function securityToolCardModel(input) {
|
|
53
|
+
const args = CardArgsSchema.parse(input.input);
|
|
54
|
+
const output = CardOutputSchema.parse(input.output);
|
|
55
|
+
const event = args?.event;
|
|
56
|
+
const policyName = output?.policyId ?? args?.policyId ?? null;
|
|
57
|
+
const decision = output?.outcome ?? event?.outcome ?? null;
|
|
58
|
+
const eventType = event?.action ?? null;
|
|
59
|
+
const recorded = output?.recorded ?? null;
|
|
60
|
+
const eventId = output?.eventId ?? event?.id ?? null;
|
|
61
|
+
const actor = event?.actor ?? null;
|
|
62
|
+
const resource = event?.resource ?? null;
|
|
63
|
+
const reason = output?.reason ?? null;
|
|
64
|
+
const error = StringField.parse(input.error) ?? output?.error ?? null;
|
|
65
|
+
const available = availabilityFrom(output);
|
|
66
|
+
const threats = output?.threats ?? [];
|
|
67
|
+
const rawMatches = output?.matches;
|
|
68
|
+
const matchCount = rawMatches ? rawMatches.length : null;
|
|
69
|
+
const redactedPreview = previewStr(output?.redacted);
|
|
70
|
+
const title = titleFor({
|
|
71
|
+
toolId: input.name,
|
|
72
|
+
policyName,
|
|
73
|
+
decision,
|
|
74
|
+
eventType,
|
|
75
|
+
recorded,
|
|
76
|
+
threats,
|
|
77
|
+
matchCount,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
toolId: input.name,
|
|
81
|
+
title,
|
|
82
|
+
icon: securityToolIcon(input.name),
|
|
83
|
+
policyName,
|
|
84
|
+
decision,
|
|
85
|
+
decisionLabel: decision ? DECISION_LABELS[decision] : null,
|
|
86
|
+
eventType,
|
|
87
|
+
recorded,
|
|
88
|
+
eventId,
|
|
89
|
+
actor,
|
|
90
|
+
resource,
|
|
91
|
+
reason,
|
|
92
|
+
error,
|
|
93
|
+
available,
|
|
94
|
+
availabilityLabel: availabilityLabel(input.name, available),
|
|
95
|
+
threats,
|
|
96
|
+
matchCount,
|
|
97
|
+
redactedPreview,
|
|
98
|
+
defaultOpen: decision === 'deny' ||
|
|
99
|
+
decision === 'review' ||
|
|
100
|
+
recorded === false ||
|
|
101
|
+
threats.length > 0 ||
|
|
102
|
+
Boolean(error),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function securityToolCardRows(model) {
|
|
106
|
+
const rows = [];
|
|
107
|
+
pushRow(rows, 'Policy', model.policyName);
|
|
108
|
+
pushRow(rows, 'Decision', model.decisionLabel, decisionTone(model.decision));
|
|
109
|
+
pushRow(rows, 'Event', model.eventType);
|
|
110
|
+
pushRow(rows, 'Actor', model.actor);
|
|
111
|
+
pushRow(rows, 'Resource', model.resource);
|
|
112
|
+
pushRow(rows, 'Event ID', model.eventId);
|
|
113
|
+
if (model.recorded !== null) {
|
|
114
|
+
pushRow(rows, 'Recorded', model.recorded ? 'yes' : 'no', model.recorded ? 'success' : 'danger');
|
|
115
|
+
}
|
|
116
|
+
pushRow(rows, 'Reason', model.reason);
|
|
117
|
+
pushRow(rows, 'Engine', model.availabilityLabel, 'muted');
|
|
118
|
+
if (model.matchCount !== null) {
|
|
119
|
+
pushRow(rows, 'Matches', String(model.matchCount));
|
|
120
|
+
}
|
|
121
|
+
pushRow(rows, 'Error', model.error, 'danger');
|
|
122
|
+
return rows;
|
|
123
|
+
}
|
|
124
|
+
function availabilityLabel(toolId, available) {
|
|
125
|
+
if (available === null)
|
|
126
|
+
return null;
|
|
127
|
+
if (toolId === 'security.check-policy') {
|
|
128
|
+
return available ? 'policy engine registered' : 'policy engine unavailable';
|
|
129
|
+
}
|
|
130
|
+
if (toolId === 'security.scan-input') {
|
|
131
|
+
return available ? 'scanner registered' : 'scanner unavailable';
|
|
132
|
+
}
|
|
133
|
+
if (toolId === 'security.redact-output') {
|
|
134
|
+
return available ? 'redactor registered' : 'redactor unavailable';
|
|
135
|
+
}
|
|
136
|
+
return available ? 'available' : 'unavailable';
|
|
137
|
+
}
|
|
138
|
+
function titleFor(input) {
|
|
139
|
+
if (input.toolId === 'security.check-policy') {
|
|
140
|
+
if (input.policyName && input.decision) {
|
|
141
|
+
return `${DECISION_LABELS[input.decision]} · ${input.policyName}`;
|
|
142
|
+
}
|
|
143
|
+
if (input.policyName)
|
|
144
|
+
return `Policy ${input.policyName}`;
|
|
145
|
+
}
|
|
146
|
+
if (input.toolId === 'security.report-event') {
|
|
147
|
+
if (input.eventType) {
|
|
148
|
+
return input.recorded === false ? `Event ${input.eventType} failed` : `Event ${input.eventType}`;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (input.toolId === 'security.scan-input') {
|
|
152
|
+
if (input.threats.length === 0)
|
|
153
|
+
return 'No threats found';
|
|
154
|
+
return input.threats.length === 1 ? '1 threat found' : `${input.threats.length} threats found`;
|
|
155
|
+
}
|
|
156
|
+
if (input.toolId === 'security.redact-output') {
|
|
157
|
+
if (input.matchCount === 0)
|
|
158
|
+
return 'No redactions';
|
|
159
|
+
if (input.matchCount === 1)
|
|
160
|
+
return 'Redacted 1 match';
|
|
161
|
+
if (input.matchCount !== null)
|
|
162
|
+
return `Redacted ${input.matchCount} matches`;
|
|
163
|
+
}
|
|
164
|
+
return isSecurityToolId(input.toolId) ? TOOL_TITLES[input.toolId] : 'Security tool';
|
|
165
|
+
}
|
|
166
|
+
function pushRow(rows, label, value, tone = 'default') {
|
|
167
|
+
if (!value)
|
|
168
|
+
return;
|
|
169
|
+
rows.push({ label, value, tone });
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=security-tool-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tool-card.js","sourceRoot":"","sources":["../../src/tools/security-tool-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
kind: "docs/topic";
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
summary: string;
|
|
6
|
+
body: {
|
|
7
|
+
type: "markdown";
|
|
8
|
+
sourceType: "raw";
|
|
9
|
+
source: string;
|
|
10
|
+
};
|
|
11
|
+
tags: string[];
|
|
12
|
+
surfaces: ("cli" | "web" | "in-app")[];
|
|
13
|
+
hardware: ("consumer" | "cloud")[];
|
|
14
|
+
enabled: true;
|
|
15
|
+
};
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=security.docs.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.docs.descriptor.d.ts","sourceRoot":"","sources":["../../src/tools/security.docs.descriptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,wBA+CgC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
kind: 'docs/topic',
|
|
3
|
+
id: 'security',
|
|
4
|
+
title: 'Security assessment',
|
|
5
|
+
summary: 'Runtime scanners, redactors, policy engines, audit sinks and compatibility encryption.',
|
|
6
|
+
body: {
|
|
7
|
+
type: 'markdown', sourceType: 'raw',
|
|
8
|
+
source: `# Security
|
|
9
|
+
Compose securityPlugin from @vibesdotdev/security/plugin for universal kinds and descriptors.
|
|
10
|
+
Consumer tool hosts also compose securityConsumerPlugin from @vibesdotdev/security/consumer.plugin and the Tools owner.
|
|
11
|
+
Shield CLI hosts also compose securityCliPlugin from @vibesdotdev/security/cli/plugin and the CLI owner.
|
|
12
|
+
Browser and cloud hosts use the universal slice; Svelte and TUI plugins provide result cards without execution loaders.
|
|
13
|
+
The package consumer workspace explicitly composes all five slices in its hand-owned vibes.config.ts.
|
|
14
|
+
Report-event schemas live in ./schemas/report-event; the existing tool schema module remains a compatible re-export.
|
|
15
|
+
Existing tools, CLI, kinds and schemas entrypoints remain supported. Built-in scanning and redaction load lazily.
|
|
16
|
+
Direct resolution selects one enabled scanner; security.scan-input aggregates all enabled scanners through resolveAll().
|
|
17
|
+
The runtime selects the redactor. Policies and audit sinks are composed by hosts.
|
|
18
|
+
The universal plugin registers runtime/client id security: activate with getVibesClient<SecurityClient>('security', runtime).
|
|
19
|
+
Use tryGetVibesClient for synchronous post-activation access; the kernel owns reuse and runtime isolation.
|
|
20
|
+
SecurityClient.emit(event) and queryAuditEvents(options = {}) resolve the selected enabled security/auditor on every call.
|
|
21
|
+
AuditEventSchema and AuditQueryOptionsSchema reject malformed arguments with ZodError before sink resolution.
|
|
22
|
+
No enabled auditor throws CapabilityError UNAVAILABLE/security-auditor-unavailable; loader and sink failures propagate.
|
|
23
|
+
Direct auditor calls share the sink; the client has no second audit store. Persistence belongs to the composed sink.
|
|
24
|
+
Direct built-in scans and tools validate the 262,144-unit content cap; supplied booleans alone override descriptor settings.
|
|
25
|
+
Built-in scans, descriptor-only defaults and scan-input tools share optional overrides: omission and undefined are allowed;
|
|
26
|
+
null, non-object options and mistyped known fields reject with ZodError.
|
|
27
|
+
Freshness rejects invalid timestamps before age or allowlist evaluation; Shield rejects invalid reports before stdout.
|
|
28
|
+
These boundary refusals are canonical ZodErrors, with no successful assessment.
|
|
29
|
+
Missing policies deny and report unavailable; implementation failures propagate.
|
|
30
|
+
Descriptor-only IOC sync, query and getStatus throw CapabilityError UNAVAILABLE with reason ioc-feed-unavailable.
|
|
31
|
+
Register an enabled IOC descriptor and implementation for real synchronization, query and status results.
|
|
32
|
+
Descriptor-only redactors validate original string content and optional RedactionRuleSchema rules before
|
|
33
|
+
returning unchanged content, empty matches and redactorAvailable:false. Omitted and undefined rules are valid;
|
|
34
|
+
null, non-array rules and malformed fields reject with ZodError. No patterns execute in this default.
|
|
35
|
+
Built-in content and rule-count execution limits do not apply to descriptor-only admission.
|
|
36
|
+
Built-in redaction uses original UTF-16 coordinates, literal replacements, earliest-start/caller-order overlap precedence,
|
|
37
|
+
and zero-width insertion. Cloud and browser runtimes redact in-process; consumer hardware runs regex work in a supervised runtime/execution Node child.
|
|
38
|
+
The dependency scanner reports unknown until a real implementation is composed.
|
|
39
|
+
Synchronous AES-256-GCM compatibility APIs retain raw and stored formats, explicit and persistent keys.
|
|
40
|
+
Their host migration is still open: synchronous crypto and key persistence currently use Node APIs.
|
|
41
|
+
INVALID_INPUT encryption-key-invalid and ciphertext-invalid refuse malformed data before decoding.
|
|
42
|
+
INVALID_INPUT redaction-pattern-invalid refuses invalid regex source; UNAVAILABLE redaction-budget-exceeded
|
|
43
|
+
means the call passed the candidate budget or execution deadline. Compose execution for consumer redaction and filesystem for Shield reads.
|
|
44
|
+
Run bun run check, bun run test and bun run build; source checks alone do not certify the host migration.`
|
|
45
|
+
},
|
|
46
|
+
tags: ['security'], surfaces: ['cli', 'web', 'in-app'],
|
|
47
|
+
hardware: ['consumer', 'cloud'], enabled: true
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=security.docs.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.docs.descriptor.js","sourceRoot":"","sources":["../../src/tools/security.docs.descriptor.ts"],"names":[],"mappings":"AAEA,eAAe;IACd,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,qBAAqB;IAC5B,OAAO,EAAE,wFAAwF;IACjG,IAAI,EAAE;QACL,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK;QACnC,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0GAoCgG;KACxG;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;IACtD,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI;CAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tui.plugin.d.ts","sourceRoot":"","sources":["../../src/tui/security-tui.plugin.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,iBAAiB,6CAgB5B,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createRuntimeImplementation, createRuntimePlugin, loader } from '@vibesdotdev/kernel';
|
|
2
|
+
import { SECURITY_TOOL_IDS } from "../tools/security-tool-card.js";
|
|
3
|
+
const widgets = SECURITY_TOOL_IDS.map((toolId) => ({
|
|
4
|
+
id: `${toolId}.tui-widget`,
|
|
5
|
+
kind: 'tools/ui',
|
|
6
|
+
name: `${toolId} TUI Widget`,
|
|
7
|
+
description: `Renders ${toolId} results (policy name, allow/deny, event type).`,
|
|
8
|
+
surfaces: ['tui'],
|
|
9
|
+
role: 'widget',
|
|
10
|
+
targetToolId: toolId,
|
|
11
|
+
targetId: toolId,
|
|
12
|
+
tags: ['security', 'tui'],
|
|
13
|
+
enabled: true
|
|
14
|
+
}));
|
|
15
|
+
export const securityTuiPlugin = createRuntimePlugin({
|
|
16
|
+
id: '@vibesdotdev/security/tui',
|
|
17
|
+
name: 'Security TUI',
|
|
18
|
+
description: 'Terminal tool-result cards for security agent tools.',
|
|
19
|
+
dependencies: ['tui'],
|
|
20
|
+
descriptors: widgets,
|
|
21
|
+
loaders: widgets.map((descriptor) => loader(descriptor.id, { kind: 'tools/ui' }, async () => {
|
|
22
|
+
const mod = await import("./tool-widgets/SecurityToolWidget.impl.consumer.js");
|
|
23
|
+
return createRuntimeImplementation({
|
|
24
|
+
kind: 'tools/ui',
|
|
25
|
+
id: descriptor.id,
|
|
26
|
+
implementation: { tui: { component: mod.default } }
|
|
27
|
+
});
|
|
28
|
+
}))
|
|
29
|
+
});
|
|
30
|
+
export default securityTuiPlugin;
|
|
31
|
+
//# sourceMappingURL=security-tui.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tui.plugin.js","sourceRoot":"","sources":["../../src/tui/security-tui.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,EAAE,EAAE,GAAG,MAAM,aAAa;IAC1B,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,GAAG,MAAM,aAAa;IAC5B,WAAW,EAAE,WAAW,MAAM,iDAAiD;IAC/E,QAAQ,EAAE,CAAC,KAAK,CAAC;IACjB,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC;IACzB,OAAO,EAAE,IAAI;CACH,CAAA,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;IACpD,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,sDAAsD;IACnE,YAAY,EAAE,CAAC,KAAK,CAAC;IACrB,WAAW,EAAE,OAAO;IACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CACnC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oDAAqD,CAAC,CAAC;QAChF,OAAO,2BAA2B,CAAC;YAClC,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE;SACnD,CAAC,CAAC;IACJ,CAAC,CAAC,CACF;CACD,CAAC,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SecurityToolWidgetProps } from '../../schemas/contracts/widget.ts';
|
|
2
|
+
export type { SecurityToolValue, SecurityToolWidgetProps } from '../../schemas/contracts/widget.ts';
|
|
3
|
+
import { type ReactNode } from 'react';
|
|
4
|
+
export default function SecurityToolWidget(tool: SecurityToolWidgetProps): ReactNode;
|
|
5
|
+
//# sourceMappingURL=SecurityToolWidget.impl.consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityToolWidget.impl.consumer.d.ts","sourceRoot":"","sources":["../../../src/tui/tool-widgets/SecurityToolWidget.impl.consumer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACpG,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgCjD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,SAAS,CAiDnF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { WidgetContainer, WidgetContent, WidgetHeader } from '@vibesdotdev/tui';
|
|
4
|
+
import { VStack } from '@vibesdotdev/tui/components/layout';
|
|
5
|
+
import { dsBase, dsColors, dsSpace } from '@vibesdotdev/tui/theme';
|
|
6
|
+
import { decisionTone, securityToolCardModel, securityToolCardRows } from "../../tools/security-tool-card.js";
|
|
7
|
+
const TONE_FG = {
|
|
8
|
+
default: dsBase.foreground,
|
|
9
|
+
success: dsColors.success.solid,
|
|
10
|
+
danger: dsColors.danger.solid,
|
|
11
|
+
warning: dsColors.warning.solid,
|
|
12
|
+
muted: dsBase.mutedForeground
|
|
13
|
+
};
|
|
14
|
+
function widgetStatus(status, hasError) {
|
|
15
|
+
if (status === 'failed' || hasError)
|
|
16
|
+
return 'error';
|
|
17
|
+
if (status === 'done')
|
|
18
|
+
return 'success';
|
|
19
|
+
if (status === 'awaiting_approval')
|
|
20
|
+
return 'warning';
|
|
21
|
+
if (status === 'pending')
|
|
22
|
+
return 'pending';
|
|
23
|
+
return 'running';
|
|
24
|
+
}
|
|
25
|
+
export default function SecurityToolWidget(tool) {
|
|
26
|
+
const model = securityToolCardModel({
|
|
27
|
+
name: tool.toolCall?.tool ?? '',
|
|
28
|
+
input: tool.args,
|
|
29
|
+
output: tool.output,
|
|
30
|
+
error: tool.error ?? undefined
|
|
31
|
+
});
|
|
32
|
+
const rows = securityToolCardRows(model);
|
|
33
|
+
const status = widgetStatus(tool.status, Boolean(tool.error));
|
|
34
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
35
|
+
return (_jsxs(WidgetContainer, { status: status, marginTop: 1, children: [_jsx(WidgetHeader, { title: model.title, status: status, statusText: status === 'error' ? 'Failed' : 'Completed', isCollapsed: collapsed, onToggle: () => setCollapsed((v) => !v), showClose: false, bottomBorder: false, compact: true }), !collapsed && (_jsx(WidgetContent, { children: _jsxs(VStack, { gap: dsSpace.xs, children: [model.decisionLabel || model.eventType || model.policyName ? (_jsx("text", { style: { fg: TONE_FG[decisionTone(model.decision)] }, children: [model.decisionLabel, model.policyName, model.eventType].filter(Boolean).join(' · ') })) : null, rows.map((row) => (_jsxs("text", { style: { fg: TONE_FG[row.tone] }, children: [row.label, ": ", row.value] }, row.label))), model.threats.slice(0, 5).map((threat, index) => (_jsxs("text", { style: { fg: dsBase.foreground }, children: [threat.severity, " \u00B7 ", threat.kind.replaceAll('_', ' '), " \u2014 ", threat.description] }, `${threat.kind}-${index}`))), model.redactedPreview ? (_jsx("text", { style: { fg: dsBase.mutedForeground }, children: model.redactedPreview })) : null] }) }))] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=SecurityToolWidget.impl.consumer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityToolWidget.impl.consumer.js","sourceRoot":"","sources":["../../../src/tui/tool-widgets/SecurityToolWidget.impl.consumer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Synchronous encryption owner prerequisite
|
|
2
|
+
|
|
3
|
+
This is an unresolved prerequisite, not acceptance of the host boundary.
|
|
4
|
+
|
|
5
|
+
Inspected public contracts:
|
|
6
|
+
|
|
7
|
+
| Owner export | Current contract | Missing capability |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| @vibesdotdev/crypto/encryption | EncryptionImplementation.encrypt and decrypt return Promises (crypto/src/schemas/encryption.ts). IV length 16 and AAD are supported asynchronously. | Runtime-resolved synchronous AES-256-GCM seal/open, including authentication, 16-byte IV/tag and optional AAD. |
|
|
10
|
+
| @vibesdotdev/filesystem | getSynchronousReadPort exposes read-only namespace access. FileSystemHostSyncCalls has stat, lstat, realpath, directory entries, open/read/close (filesystem/src/schemas/host-adapter.ts). | Public runtime-resolved synchronous directory creation and exclusive key creation (wx, 0600), with errno-preserving read/write results and concurrent-winner reuse. |
|
|
11
|
+
| @vibesdotdev/host-node/filesystem | Host primitives implement that read port. Async file handles provide writes; no public synchronous write service is exported. | Host implementation of the preceding writable synchronous contract. |
|
|
12
|
+
| @vibesdotdev/kernel/credentials | Credential references resolve through runtime.resolveCredential and secrets/store. | A credential lookup cannot supply the encrypted store's own key without recursion; retain the separate asynchronous boundEncryptionKeyHex path. |
|
|
13
|
+
|
|
14
|
+
Once compatible owners exist, synchronous post-activation resolution must use
|
|
15
|
+
tryGetVibesClient from @vibesdotdev/kernel/client. It cannot make asynchronous
|
|
16
|
+
crypto or persistence synchronous.
|
|
17
|
+
|
|
18
|
+
Affected security callers: SecretEncryption byte/string/stored methods,
|
|
19
|
+
generateEncryptionKey, explicit-key encryptStringWithKey/decryptToStringWithKey,
|
|
20
|
+
readOrCreateKeyFile, resolveEncryptionKeyHex and resolveEncryptionKeyHexForBase.
|
|
21
|
+
The secrets encrypted-local backend calls the base-specific resolver and
|
|
22
|
+
explicit-key helpers from backends/encrypted-local/encrypted-local.impl.local.ts
|
|
23
|
+
(load/decrypt near line 145; save/encrypt near line 177). Those contracts must
|
|
24
|
+
continue working without resolving their own store credential.
|
|
25
|
+
|
|
26
|
+
Current implementation evidence: implementations/encryption.ts obtains Node
|
|
27
|
+
crypto synchronously through process.getBuiltinModule and caches runtime keys;
|
|
28
|
+
implementations/keys.ts obtains Node filesystem synchronously, creates keys
|
|
29
|
+
exclusively, reuses concurrent winners and refuses unreadable existing keys.
|
|
30
|
+
Replacing these with Promise-returning ports would break supported callers.
|
|
31
|
+
No such substitution is made in this repair. Universal import initialization
|
|
32
|
+
and reachable crypto-unavailable refusal are distinct from host-operation
|
|
33
|
+
migration. The owner prerequisites remain unresolved.
|
|
34
|
+
|
|
35
|
+
Historical package-check findings from earlier runs: workspace-rules reported
|
|
36
|
+
correct/host-apis-in-host-packages at encryption.ts:18; the declared oxlint
|
|
37
|
+
ratchet reported no-env-branch-in-isomorphic-code and no-runtime-typeof at
|
|
38
|
+
encryption.ts:23 and keys.ts:26. These results predate this repair and are not
|
|
39
|
+
current check results. They reflect the unresolved owner contracts above. No
|
|
40
|
+
check is weakened or suppressed.
|
|
41
|
+
|
|
42
|
+
## Historical sibling composition failure
|
|
43
|
+
|
|
44
|
+
An earlier run failed because tui/src/schemas/widgets.ts imported the absent
|
|
45
|
+
ReadonlyJsonObjectSchema value from @vibesdotdev/kernel/schemas/json (TS2724).
|
|
46
|
+
The review at framework revision cf9fa626f240604c0ae40ba1344b2398b50cd508
|
|
47
|
+
observed JsonValueFromReaderSchema in the source and cited a receipt with
|
|
48
|
+
passing typecheck, 226 tests and build. That receipt predates the extended
|
|
49
|
+
extracted-widget probe; it does not prove extracted widget resolution.
|
|
50
|
+
|
|
51
|
+
The subsequent review at revision 570e6eb1f474772bf6b38d6d5fb9b7933aa8242c
|
|
52
|
+
reports passing typecheck and build, with 225 tests passing and one failing.
|
|
53
|
+
Source widget resolution passed; extracted widget resolution was attempted
|
|
54
|
+
and blocked before resolution by the LocalDB artifact described below.
|
|
55
|
+
The earlier TUI schema failure is historical. The synchronous host prerequisite
|
|
56
|
+
above remains unresolved regardless of these results.
|
|
57
|
+
|
|
58
|
+
## Historical extracted surface composition receipt
|
|
59
|
+
|
|
60
|
+
A prior offline probe registered Kernel, Logging, Tools, TUI and Node test
|
|
61
|
+
plugins before attempting extracted widget resolution. Source TUI widget
|
|
62
|
+
resolution passed. The extracted composition was blocked before resolution:
|
|
63
|
+
LocalDB's emitted sqlite-driver.base.js imported @vibesdotdev/runtime, absent
|
|
64
|
+
from its declared installed closure. This remains a historical artifact
|
|
65
|
+
observation and an external LocalDB owner follow-up. The current in-process
|
|
66
|
+
packed.test.ts does not perform this probe or establish extracted resolution.
|
|
67
|
+
|
|
68
|
+
## Historical verification: 2026-10-14
|
|
69
|
+
|
|
70
|
+
Framework HEAD was adb0749f4a8ee6fefc54596a2528a7ff38aad39c before these
|
|
71
|
+
commands and advanced in another lane during verification. The security
|
|
72
|
+
working-tree candidate plus the historical-evidence correction produced:
|
|
73
|
+
|
|
74
|
+
| Command | Observed result |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `bun run --cwd repos/platform/framework/security check` | Exit 2: TUI terminal-output-redirect.ts:88 passes Uint8Array<ArrayBufferLike> to a writer accepting only string or Uint8Array<ArrayBuffer> (TS2345). Svelte check did not run after that failure. |
|
|
77
|
+
| `bun run --cwd repos/platform/framework/security test` | Exit 1: 225 pass, one packed surface-composition failure, 785 assertions across 28 files. |
|
|
78
|
+
| `bun run --cwd repos/platform/framework/security build` | Exit 0: emitted core and Svelte artifacts. |
|
|
79
|
+
| `workspace-rules check`, scoped to security | One host-boundary error at implementations/encryption.ts:18. |
|
|
80
|
+
| Declared `internal-oxlint-toolchain/ratchet.mjs`, from security | Exit 1: four findings at encryption.ts:23 and keys.ts:26, listed above. |
|
|
81
|
+
|
|
82
|
+
The packed test reached and passed its universal graph/crypto refusal, emitted
|
|
83
|
+
public imports, export-target/document inventory and strict public declaration
|
|
84
|
+
assertions before failing at the extracted surface composition. This does not
|
|
85
|
+
establish successful extracted widget resolution. Source widget resolution and
|
|
86
|
+
the other 225 tests passed.
|
|
87
|
+
|
|
88
|
+
The accepted scanner-admission task supplies a later authoritative receipt with
|
|
89
|
+
passing typecheck and build, and failed rules, lint and packed-artifact testing.
|
|
90
|
+
That receipt supersedes the TS2345 result above as current typecheck evidence;
|
|
91
|
+
it does not identify a candidate hash or exact command output. The TUI byte-view
|
|
92
|
+
failure above is historical, not an undifferentiated current blocker.
|
|
93
|
+
LocalDB's owner must still correct its emitted dependency closure as described
|
|
94
|
+
above. Neither owner is changed by this package-scoped task. The synchronous
|
|
95
|
+
crypto and writable-filesystem prerequisite remains blocking; a passing build
|
|
96
|
+
or typecheck does not close rules, lint or distributed composition acceptance.
|
|
97
|
+
|
|
98
|
+
## Round-three scanner-admission receipt: 2026-10-14 (Phoenix)
|
|
99
|
+
|
|
100
|
+
The runtime tools observed framework HEAD
|
|
101
|
+
`de1e598d9e366679dd205af717595b6c43308106` before the direct checks.
|
|
102
|
+
The selected working-tree candidate contained 128 tracked or unignored files,
|
|
103
|
+
with SHA-256 `cd0d9f95f22fdd737322d4ba07bce4d00b32c8c9b4aef938ebe9b9544b69df22`.
|
|
104
|
+
The digest hashes sorted existing package paths, each followed by NUL, file
|
|
105
|
+
bytes and NUL; it precedes this verification-document append. It includes the
|
|
106
|
+
transferred correctness work and this scanner repair, and is not a commit id.
|
|
107
|
+
|
|
108
|
+
| Exact invocation | Observed result |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `git {action:"commit",cwd:"repos/platform/framework",paths:["security"],message:commitMessage}` (exact message below) | Exit 1 at commit; no checkpoint created. The tool truncated stderr, so the specific hook diagnostic was not available. The installed pre-commit hook executes `vibes --finite dev check --staged`; it was not bypassed. |
|
|
111
|
+
| `workspace-rules {action:"check",paths:["repos/platform/framework/security"]}` | One error: correct/host-apis-in-host-packages, encryption.ts:18. |
|
|
112
|
+
| `node ../node_modules/@vibesdotdev/internal-oxlint-toolchain/ratchet.mjs`, cwd security | Exit 1: four findings at encryption.ts:23 and keys.ts:26, as listed above. |
|
|
113
|
+
| `bun run --cwd repos/platform/framework/security check` | Exit 2: eight TUI source diagnostics below. Svelte check did not run. |
|
|
114
|
+
| `bun run --cwd repos/platform/framework/security test` | Exit 1: 225 pass, one packed-test failure, 745 assertions across 28 files. All three admission tests passed, including built-in, descriptor-only default and public tool option boundaries. |
|
|
115
|
+
| `bun run --cwd repos/platform/framework/security build` | Exit 2: the same eight TUI diagnostics; core compilation prevented the Svelte packaging step. |
|
|
116
|
+
|
|
117
|
+
The commitMessage supplied to the runtime Git tool was:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
fix(security): converge scanner options admission
|
|
121
|
+
|
|
122
|
+
Preserve and checkpoint the transferred security correctness work, including
|
|
123
|
+
schema ownership, runtime compositions, artifact isolation and host evidence.
|
|
124
|
+
Validate scanner overrides before defaulting; prove malformed and valid
|
|
125
|
+
options through the built-in scanner, descriptor-only kind and public tool.
|
|
126
|
+
Distinguish historical TUI failures from later passing typecheck evidence.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
The final scoped commit attempt after this documentation update also exited 1
|
|
130
|
+
at commit with the same truncated diagnostic. No hook was bypassed; the candidate
|
|
131
|
+
remains uncommitted, with package custody retained pending a checkpoint.
|
|
132
|
+
|
|
133
|
+
These round-three TUI findings differ from both historical TUI failures above.
|
|
134
|
+
The TUI owner must repair relocated imports in
|
|
135
|
+
`src/components/content/code/schemas/diffUtils.types.ts:13–14` (backend),
|
|
136
|
+
`src/components/content/schemas/identity/Badge.types.ts:2` and
|
|
137
|
+
`src/components/content/schemas/surfaces/Panel.types.ts:9–10` (theme), and
|
|
138
|
+
`src/shell/schemas/TuiAppShell.ts:9` (ErrorBoundary), plus restore the missing
|
|
139
|
+
`VirtualListContextValue` type at `src/components/data/VirtualList.tsx:147`
|
|
140
|
+
(TS2304), and correct the nullable value assignment at
|
|
141
|
+
`src/components/form/controls/SearchSelect.tsx:188` (TS2322). Six diagnostics are
|
|
142
|
+
TS2307, for eight diagnostics in total.
|
|
143
|
+
|
|
144
|
+
The offline packed test failed in its disposable staging build at these TUI
|
|
145
|
+
errors. Packing, extracted imports, declaration checks and extracted widget
|
|
146
|
+
resolution were not reached in this run. The earlier failed LocalDB emitted
|
|
147
|
+
composition receipt remains unresolved; it is not the demonstrated cause of
|
|
148
|
+
that staging-compilation failure and has no later passing receipt.
|
|
149
|
+
No artifact-isolation change or undeclared dependency was introduced.
|
|
150
|
+
Scanner behavior is observed through real owned compositions; complete package
|
|
151
|
+
typechecking, build, artifact acceptance and independent review remain open.
|
|
152
|
+
The synchronous crypto/write owner prerequisites remain blocking.
|
|
153
|
+
|
|
154
|
+
## Completion verification: 2026-10-14 (Phoenix)
|
|
155
|
+
|
|
156
|
+
The complete staged package contained 128 files with no untracked files or
|
|
157
|
+
index/working-tree differences. Its staged patch SHA-256 was
|
|
158
|
+
`d8879895710fa42eac692475be377bb1ea9e598ed192db47d602dbeeb0153155`.
|
|
159
|
+
This identifies the observed staged patch, not a commit or a published artifact.
|
|
160
|
+
Only README, SPEC and this document were subsequently reconciled with these results.
|
|
161
|
+
|
|
162
|
+
| Exact invocation | Observed result |
|
|
163
|
+
| --- | --- |
|
|
164
|
+
| `bun run --cwd repos/platform/framework/security check` | Exit 0; TypeScript passed, Svelte reported zero errors and zero warnings. |
|
|
165
|
+
| `bun run --cwd repos/platform/framework/security build` | Exit 0; core and Svelte emitted. |
|
|
166
|
+
| `bun run --cwd repos/platform/framework/security test` | Exit 1; 225 pass, one fail, 829 assertions across 28 files. All three scanner/freshness admission tests passed. |
|
|
167
|
+
| `workspace-rules {action:"check",paths:["repos/platform/framework/security"]}` | One host-boundary error at encryption.ts:18. |
|
|
168
|
+
| `node ../node_modules/@vibesdotdev/internal-oxlint-toolchain/ratchet.mjs`, cwd security | Exit 1; the same four encryption.ts:23 / keys.ts:26 findings. |
|
|
169
|
+
|
|
170
|
+
This packed attempt completed the staging build, offline Bun pack, tar extraction,
|
|
171
|
+
universal graph/crypto refusal, emitted public imports, export/document inventory
|
|
172
|
+
and strict public declarations. Extracted surface composition then failed:
|
|
173
|
+
LocalDB's emitted sqlite-driver.base.js imports undeclared @vibesdotdev/runtime.
|
|
174
|
+
This is a new observation of that artifact failure; it does not change the
|
|
175
|
+
round-three failure's earlier stage or cause. Source surface tests passed.
|
|
176
|
+
The TUI diagnostics above belong to the supplied round-three receipt; this run's
|
|
177
|
+
source check/build passed against the live sibling composition.
|
|
178
|
+
|
|
179
|
+
That completion run's checkpoint attempts encountered a framework index lock
|
|
180
|
+
(Git exit 128) and a runtime Git-tool timeout after 65 seconds. These were not a
|
|
181
|
+
captured hook refusal. All required additions stayed staged, while its final
|
|
182
|
+
README, SPEC and receipt updates awaited staging. The captured Git error was:
|
|
183
|
+
Unable to create framework/.git/index.lock: File exists. This is historical
|
|
184
|
+
checkpoint evidence; no committed-artifact claim follows from those checks.
|
|
185
|
+
Crypto/filesystem host contracts and LocalDB's emitted closure remain owner
|
|
186
|
+
handoffs. Package acceptance and independent artifact review remain open.
|