@jterrats/open-orchestra 1.0.16 → 1.0.18
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/CHANGELOG.md +44 -0
- package/CLAUDE.md +25 -2
- package/README.md +32 -9
- package/dist/active-runtime-store.d.ts +18 -0
- package/dist/active-runtime-store.js +75 -0
- package/dist/active-runtime-store.js.map +1 -0
- package/dist/benchmark.js +65 -27
- package/dist/benchmark.js.map +1 -1
- package/dist/chat-api-errors.d.ts +7 -0
- package/dist/chat-api-errors.js +15 -0
- package/dist/chat-api-errors.js.map +1 -0
- package/dist/chat-api-message-persistence.d.ts +12 -0
- package/dist/chat-api-message-persistence.js +125 -0
- package/dist/chat-api-message-persistence.js.map +1 -0
- package/dist/chat-api-records.d.ts +35 -0
- package/dist/chat-api-records.js +94 -0
- package/dist/chat-api-records.js.map +1 -0
- package/dist/chat-api-service.d.ts +32 -0
- package/dist/chat-api-service.js +120 -0
- package/dist/chat-api-service.js.map +1 -0
- package/dist/chat-api-storage.d.ts +1 -0
- package/dist/chat-api-storage.js +14 -0
- package/dist/chat-api-storage.js.map +1 -0
- package/dist/chat-api-types.d.ts +81 -0
- package/dist/chat-api-types.js +2 -0
- package/dist/chat-api-types.js.map +1 -0
- package/dist/chat-compliance-service.d.ts +60 -0
- package/dist/chat-compliance-service.js +241 -0
- package/dist/chat-compliance-service.js.map +1 -0
- package/dist/chat-event-stream.d.ts +13 -0
- package/dist/chat-event-stream.js +124 -0
- package/dist/chat-event-stream.js.map +1 -0
- package/dist/chat-pagination.d.ts +6 -0
- package/dist/chat-pagination.js +64 -0
- package/dist/chat-pagination.js.map +1 -0
- package/dist/chat-storage-actor-validation.d.ts +4 -0
- package/dist/chat-storage-actor-validation.js +65 -0
- package/dist/chat-storage-actor-validation.js.map +1 -0
- package/dist/chat-storage-content-policy.d.ts +6 -0
- package/dist/chat-storage-content-policy.js +84 -0
- package/dist/chat-storage-content-policy.js.map +1 -0
- package/dist/chat-storage-errors.d.ts +20 -0
- package/dist/chat-storage-errors.js +17 -0
- package/dist/chat-storage-errors.js.map +1 -0
- package/dist/chat-storage-local-files.d.ts +17 -0
- package/dist/chat-storage-local-files.js +78 -0
- package/dist/chat-storage-local-files.js.map +1 -0
- package/dist/chat-storage-local-paths.d.ts +6 -0
- package/dist/chat-storage-local-paths.js +124 -0
- package/dist/chat-storage-local-paths.js.map +1 -0
- package/dist/chat-storage-local-projection.d.ts +10 -0
- package/dist/chat-storage-local-projection.js +55 -0
- package/dist/chat-storage-local-projection.js.map +1 -0
- package/dist/chat-storage-local-records.d.ts +13 -0
- package/dist/chat-storage-local-records.js +56 -0
- package/dist/chat-storage-local-records.js.map +1 -0
- package/dist/chat-storage-local.d.ts +6 -0
- package/dist/chat-storage-local.js +114 -0
- package/dist/chat-storage-local.js.map +1 -0
- package/dist/chat-storage-validation.d.ts +10 -0
- package/dist/chat-storage-validation.js +100 -0
- package/dist/chat-storage-validation.js.map +1 -0
- package/dist/chat-storage.d.ts +16 -0
- package/dist/chat-storage.js +4 -0
- package/dist/chat-storage.js.map +1 -0
- package/dist/chat-workflow-timeline.d.ts +17 -0
- package/dist/chat-workflow-timeline.js +210 -0
- package/dist/chat-workflow-timeline.js.map +1 -0
- package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
- package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
- package/dist/claude-settings.js.map +1 -0
- package/dist/command-init.d.ts +2 -0
- package/dist/command-init.js +150 -0
- package/dist/command-init.js.map +1 -0
- package/dist/command-manifest.js +1 -1
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +1 -1
- package/dist/commands.js +1 -140
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-runtime-preprocessor.d.ts +41 -0
- package/dist/context-runtime-preprocessor.js +199 -0
- package/dist/context-runtime-preprocessor.js.map +1 -0
- package/dist/cursor-settings.d.ts +25 -0
- package/dist/cursor-settings.js +72 -0
- package/dist/cursor-settings.js.map +1 -0
- package/dist/health-commands.js +43 -3
- package/dist/health-commands.js.map +1 -1
- package/dist/metrics-commands.js +3 -0
- package/dist/metrics-commands.js.map +1 -1
- package/dist/model-aliases.d.ts +5 -0
- package/dist/model-aliases.js +37 -0
- package/dist/model-aliases.js.map +1 -0
- package/dist/ollama-provider.js +25 -0
- package/dist/ollama-provider.js.map +1 -1
- package/dist/phase-playbooks.js +11 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/provider-agent-wrapper.js +14 -0
- package/dist/provider-agent-wrapper.js.map +1 -1
- package/dist/runtime-adapters.js +56 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +34 -11
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-capacity-policy.d.ts +38 -0
- package/dist/runtime-capacity-policy.js +117 -0
- package/dist/runtime-capacity-policy.js.map +1 -0
- package/dist/runtime-capacity-scheduler-helpers.d.ts +40 -0
- package/dist/runtime-capacity-scheduler-helpers.js +111 -0
- package/dist/runtime-capacity-scheduler-helpers.js.map +1 -0
- package/dist/runtime-capacity-scheduler-state.d.ts +44 -0
- package/dist/runtime-capacity-scheduler-state.js +128 -0
- package/dist/runtime-capacity-scheduler-state.js.map +1 -0
- package/dist/runtime-capacity-scheduler.d.ts +34 -0
- package/dist/runtime-capacity-scheduler.js +193 -0
- package/dist/runtime-capacity-scheduler.js.map +1 -0
- package/dist/runtime-capacity-snapshot.d.ts +14 -0
- package/dist/runtime-capacity-snapshot.js +87 -0
- package/dist/runtime-capacity-snapshot.js.map +1 -0
- package/dist/runtime-child-prompt.d.ts +2 -1
- package/dist/runtime-child-prompt.js +12 -1
- package/dist/runtime-child-prompt.js.map +1 -1
- package/dist/runtime-claude-native-bridge.js +2 -1
- package/dist/runtime-claude-native-bridge.js.map +1 -1
- package/dist/runtime-commands.js +6 -0
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-context-manifest.d.ts +4 -1
- package/dist/runtime-context-manifest.js +59 -3
- package/dist/runtime-context-manifest.js.map +1 -1
- package/dist/runtime-execution-adapters.js +19 -0
- package/dist/runtime-execution-adapters.js.map +1 -1
- package/dist/runtime-execution-renderer.js +4 -0
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.js +13 -82
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-hooks.d.ts +46 -0
- package/dist/runtime-hooks.js +95 -0
- package/dist/runtime-hooks.js.map +1 -0
- package/dist/runtime-lifecycle-watch.d.ts +5 -2
- package/dist/runtime-lifecycle-watch.js +19 -3
- package/dist/runtime-lifecycle-watch.js.map +1 -1
- package/dist/runtime-load-balancer.d.ts +12 -0
- package/dist/runtime-load-balancer.js +106 -0
- package/dist/runtime-load-balancer.js.map +1 -0
- package/dist/runtime-parent-actions.js +5 -0
- package/dist/runtime-parent-actions.js.map +1 -1
- package/dist/runtime-spawn-bridge.js +24 -0
- package/dist/runtime-spawn-bridge.js.map +1 -1
- package/dist/runtime-spawn-guidance.js +15 -46
- package/dist/runtime-spawn-guidance.js.map +1 -1
- package/dist/runtime-worker-registry.d.ts +19 -0
- package/dist/runtime-worker-registry.js +84 -0
- package/dist/runtime-worker-registry.js.map +1 -0
- package/dist/security/chat-guardrail-policy.d.ts +7 -0
- package/dist/security/chat-guardrail-policy.js +61 -0
- package/dist/security/chat-guardrail-policy.js.map +1 -0
- package/dist/security/chat-guardrail-types.d.ts +65 -0
- package/dist/security/chat-guardrail-types.js +2 -0
- package/dist/security/chat-guardrail-types.js.map +1 -0
- package/dist/security/chat-guardrail-validation.d.ts +9 -0
- package/dist/security/chat-guardrail-validation.js +64 -0
- package/dist/security/chat-guardrail-validation.js.map +1 -0
- package/dist/security/chat-guardrails.d.ts +3 -0
- package/dist/security/chat-guardrails.js +136 -0
- package/dist/security/chat-guardrails.js.map +1 -0
- package/dist/security/content-classifier.d.ts +2 -0
- package/dist/security/content-classifier.js +179 -0
- package/dist/security/content-classifier.js.map +1 -0
- package/dist/security/operation-contract-types.d.ts +28 -0
- package/dist/security/operation-contract-types.js +2 -0
- package/dist/security/operation-contract-types.js.map +1 -0
- package/dist/security/operation-contract.d.ts +2 -0
- package/dist/security/operation-contract.js +169 -0
- package/dist/security/operation-contract.js.map +1 -0
- package/dist/security/payment-card-detection.d.ts +3 -0
- package/dist/security/payment-card-detection.js +48 -0
- package/dist/security/payment-card-detection.js.map +1 -0
- package/dist/security/policy-engine.d.ts +2 -0
- package/dist/security/policy-engine.js +142 -0
- package/dist/security/policy-engine.js.map +1 -0
- package/dist/security/policy-types.d.ts +79 -0
- package/dist/security/policy-types.js +7 -0
- package/dist/security/policy-types.js.map +1 -0
- package/dist/security/prompt-intake.d.ts +13 -0
- package/dist/security/prompt-intake.js +33 -0
- package/dist/security/prompt-intake.js.map +1 -0
- package/dist/security/provider-egress-policy.d.ts +27 -0
- package/dist/security/provider-egress-policy.js +72 -0
- package/dist/security/provider-egress-policy.js.map +1 -0
- package/dist/security/public-api-auth.d.ts +20 -0
- package/dist/security/public-api-auth.js +55 -0
- package/dist/security/public-api-auth.js.map +1 -0
- package/dist/security/public-api-policy.d.ts +8 -0
- package/dist/security/public-api-policy.js +40 -0
- package/dist/security/public-api-policy.js.map +1 -0
- package/dist/security/redaction.d.ts +3 -0
- package/dist/security/redaction.js +95 -0
- package/dist/security/redaction.js.map +1 -0
- package/dist/security/restricted-content-quarantine.d.ts +17 -0
- package/dist/security/restricted-content-quarantine.js +50 -0
- package/dist/security/restricted-content-quarantine.js.map +1 -0
- package/dist/security/restricted-data-classifier.d.ts +9 -0
- package/dist/security/restricted-data-classifier.js +254 -0
- package/dist/security/restricted-data-classifier.js.map +1 -0
- package/dist/security/sink-encoding.d.ts +6 -0
- package/dist/security/sink-encoding.js +40 -0
- package/dist/security/sink-encoding.js.map +1 -0
- package/dist/skills-render.js +7 -14
- package/dist/skills-render.js.map +1 -1
- package/dist/sprint-commands.js +33 -22
- package/dist/sprint-commands.js.map +1 -1
- package/dist/telemetry-redaction.d.ts +2 -0
- package/dist/telemetry-redaction.js +25 -2
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/transcription-failures.d.ts +2 -0
- package/dist/transcription-failures.js +4 -0
- package/dist/transcription-failures.js.map +1 -0
- package/dist/transcription-media-preflight.d.ts +9 -0
- package/dist/transcription-media-preflight.js +147 -0
- package/dist/transcription-media-preflight.js.map +1 -0
- package/dist/transcription-request.d.ts +13 -0
- package/dist/transcription-request.js +150 -0
- package/dist/transcription-request.js.map +1 -0
- package/dist/transcription-source-policy.d.ts +4 -0
- package/dist/transcription-source-policy.js +43 -0
- package/dist/transcription-source-policy.js.map +1 -0
- package/dist/transcription-types.d.ts +161 -0
- package/dist/transcription-types.js +2 -0
- package/dist/transcription-types.js.map +1 -0
- package/dist/types/chat.d.ts +203 -0
- package/dist/types/chat.js +10 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/model-config.d.ts +4 -0
- package/dist/types/public-api.d.ts +75 -0
- package/dist/types/public-api.js +2 -0
- package/dist/types/public-api.js.map +1 -0
- package/dist/types/restricted-data.d.ts +69 -0
- package/dist/types/restricted-data.js +8 -0
- package/dist/types/restricted-data.js.map +1 -0
- package/dist/types/restricted-fragment.d.ts +82 -0
- package/dist/types/restricted-fragment.js +14 -0
- package/dist/types/restricted-fragment.js.map +1 -0
- package/dist/types/runtime.d.ts +159 -0
- package/dist/types.d.ts +9 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +24 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifact-parsers.d.ts +6 -0
- package/dist/web-artifact-parsers.js +244 -0
- package/dist/web-artifact-parsers.js.map +1 -0
- package/dist/web-artifact-types.d.ts +76 -0
- package/dist/web-artifact-types.js +2 -0
- package/dist/web-artifact-types.js.map +1 -0
- package/dist/web-artifacts.d.ts +2 -43
- package/dist/web-artifacts.js +73 -58
- package/dist/web-artifacts.js.map +1 -1
- package/dist/web-chat-route-inputs.d.ts +11 -0
- package/dist/web-chat-route-inputs.js +156 -0
- package/dist/web-chat-route-inputs.js.map +1 -0
- package/dist/web-chat-routes.d.ts +7 -0
- package/dist/web-chat-routes.js +213 -0
- package/dist/web-chat-routes.js.map +1 -0
- package/dist/web-console/assets/index-CJup1cIA.css +1 -0
- package/dist/web-console/assets/index-CVDOfipu.js +11 -0
- package/dist/web-console/index.html +2 -2
- package/dist/web-evidence.d.ts +1 -1
- package/dist/web-evidence.js +9 -2
- package/dist/web-evidence.js.map +1 -1
- package/dist/web-public-route-inputs.d.ts +14 -0
- package/dist/web-public-route-inputs.js +136 -0
- package/dist/web-public-route-inputs.js.map +1 -0
- package/dist/web-public-routes.d.ts +6 -0
- package/dist/web-public-routes.js +194 -0
- package/dist/web-public-routes.js.map +1 -0
- package/dist/web-public-service.d.ts +16 -0
- package/dist/web-public-service.js +154 -0
- package/dist/web-public-service.js.map +1 -0
- package/dist/workflow-phase-planner.js +5 -3
- package/dist/workflow-phase-planner.js.map +1 -1
- package/dist/workflow-phases.js +5 -0
- package/dist/workflow-phases.js.map +1 -1
- package/dist/workflow-run-commands.js +89 -10
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.js +5 -0
- package/dist/workflow-services.js.map +1 -1
- package/dist/workspace-runtime-bootstrap.js +15 -4
- package/dist/workspace-runtime-bootstrap.js.map +1 -1
- package/docs/audio-video-transcription-skill.md +102 -70
- package/docs/chat-audit-retention.md +76 -0
- package/docs/chat-provider-provenance-ledger.md +75 -0
- package/docs/context-runtime-preprocessing.md +37 -0
- package/docs/orchestra-mvp.md +8 -2
- package/docs/public-api-contract.md +43 -0
- package/docs/release-test-matrix.md +14 -14
- package/docs/restricted-fragment-storage-contract.md +147 -0
- package/docs/runtime-adapters.md +47 -7
- package/docs/runtime-capacity.md +57 -0
- package/docs/security-saas-orchestrator.md +368 -0
- package/docs/site-manifest.json +128 -30
- package/package.json +5 -2
- package/site/dist/_headers +9 -0
- package/site/dist/_redirects +2 -0
- package/site/dist/architecture.mmd +61 -0
- package/site/dist/assets/index-Bi8l6tCE.js +10 -0
- package/site/dist/assets/index-BsCLqY__.css +1 -0
- package/site/dist/favicon.svg +19 -0
- package/site/dist/index.html +28 -0
- package/site/package.json +19 -0
- package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
- package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
- package/dist/workspace-claude-settings.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-guardrails.js","sourceRoot":"","sources":["../../src/security/chat-guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { hasPaymentCardLikeValue } from "./payment-card-detection.js";
|
|
2
|
+
const promptInjectionPhrases = [
|
|
3
|
+
"ignore previous instructions",
|
|
4
|
+
"ignore all previous instructions",
|
|
5
|
+
"reveal the system prompt",
|
|
6
|
+
"disclose your system prompt",
|
|
7
|
+
"bypass policy",
|
|
8
|
+
"disable safety",
|
|
9
|
+
"developer message",
|
|
10
|
+
];
|
|
11
|
+
const indirectPromptMarkers = [
|
|
12
|
+
"```",
|
|
13
|
+
"<!--",
|
|
14
|
+
"[//]:",
|
|
15
|
+
"data:text/markdown",
|
|
16
|
+
];
|
|
17
|
+
const privateHostPatterns = [
|
|
18
|
+
"localhost",
|
|
19
|
+
"127.",
|
|
20
|
+
"10.",
|
|
21
|
+
"192.168.",
|
|
22
|
+
"169.254.",
|
|
23
|
+
"172.16.",
|
|
24
|
+
"172.17.",
|
|
25
|
+
"172.18.",
|
|
26
|
+
"172.19.",
|
|
27
|
+
"172.20.",
|
|
28
|
+
"172.21.",
|
|
29
|
+
"172.22.",
|
|
30
|
+
"172.23.",
|
|
31
|
+
"172.24.",
|
|
32
|
+
"172.25.",
|
|
33
|
+
"172.26.",
|
|
34
|
+
"172.27.",
|
|
35
|
+
"172.28.",
|
|
36
|
+
"172.29.",
|
|
37
|
+
"172.30.",
|
|
38
|
+
"172.31.",
|
|
39
|
+
"[::1]",
|
|
40
|
+
];
|
|
41
|
+
const piiRules = [
|
|
42
|
+
{
|
|
43
|
+
kind: "piiEmail",
|
|
44
|
+
ruleId: "content.pii.email",
|
|
45
|
+
severity: "high",
|
|
46
|
+
summary: "content contains an email address",
|
|
47
|
+
matches: (value) => /\b[a-z0-9._%+-]+@[a-z0-9.-]+[.][a-z]{2,}\b/i.test(value),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
kind: "piiPhone",
|
|
51
|
+
ruleId: "content.pii.phone",
|
|
52
|
+
severity: "high",
|
|
53
|
+
summary: "content contains a phone-number-like value",
|
|
54
|
+
matches: (value) => /(?:\+?1[\s.-]?)?(?:[(]\d{3}[)]|\b\d{3})[\s.-]?\d{3}[\s.-]?\d{4}\b/.test(value),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
kind: "piiSsn",
|
|
58
|
+
ruleId: "content.pii.ssn",
|
|
59
|
+
severity: "critical",
|
|
60
|
+
summary: "content contains an SSN-like identifier",
|
|
61
|
+
matches: (value) => /\b\d{3}-\d{2}-\d{4}\b/.test(value),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
kind: "piiPaymentCard",
|
|
65
|
+
ruleId: "content.pii.payment-card",
|
|
66
|
+
severity: "critical",
|
|
67
|
+
summary: "content contains a payment-card-like value",
|
|
68
|
+
matches: hasPaymentCardLikeValue,
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
const contentRules = [
|
|
72
|
+
{
|
|
73
|
+
kind: "promptInjection",
|
|
74
|
+
ruleId: "content.prompt-injection.directive",
|
|
75
|
+
severity: "critical",
|
|
76
|
+
summary: "instruction text attempts to override policy or reveal prompts",
|
|
77
|
+
matches: (value) => includesAny(value, promptInjectionPhrases),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
kind: "indirectPromptInjection",
|
|
81
|
+
ruleId: "content.prompt-injection.indirect-artifact",
|
|
82
|
+
severity: "critical",
|
|
83
|
+
summary: "artifact text hides instruction-like content in markup or code",
|
|
84
|
+
matches: (value) => includesAny(value, indirectPromptMarkers) &&
|
|
85
|
+
includesAny(value, promptInjectionPhrases),
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
kind: "sqlLike",
|
|
89
|
+
ruleId: "content.query.sql-like",
|
|
90
|
+
severity: "high",
|
|
91
|
+
summary: "content resembles SQL query or mutation text",
|
|
92
|
+
matches: (value) => /\b(select|insert|update|delete|drop|union)\b[\s\S]{0,80}\b(from|into|table|where|values)\b/i.test(value) || /'\s+or\s+'?1'?='?1/i.test(value),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
kind: "noSqlLike",
|
|
96
|
+
ruleId: "content.query.nosql-like",
|
|
97
|
+
severity: "high",
|
|
98
|
+
summary: "content resembles NoSQL operator or JavaScript query text",
|
|
99
|
+
matches: (value) => /[$](ne|gt|gte|lt|lte|where|regex)\b/i.test(value) ||
|
|
100
|
+
/\bdb[.][a-z0-9_-]+[.](find|update|remove|delete)/i.test(value),
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
kind: "shellLike",
|
|
104
|
+
ruleId: "content.executable.shell-like",
|
|
105
|
+
severity: "critical",
|
|
106
|
+
summary: "content resembles shell execution or command chaining text",
|
|
107
|
+
matches: (value) => /\b(rm\s+-rf|curl\s+|wget\s+|powershell\s+|bash\s+-c|sh\s+-c)\b/i.test(value) || /(\$\(|`[^`]+`|[;&|]{2})/.test(value),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
kind: "unsafeUrl",
|
|
111
|
+
ruleId: "content.url.unsafe-or-private",
|
|
112
|
+
severity: "critical",
|
|
113
|
+
summary: "URL is not https or targets a private host pattern",
|
|
114
|
+
matches: hasUnsafeUrl,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
kind: "pathTraversal",
|
|
118
|
+
ruleId: "content.path.traversal-like",
|
|
119
|
+
severity: "critical",
|
|
120
|
+
summary: "content contains path traversal or sensitive absolute path text",
|
|
121
|
+
matches: (value) => /(^|[/\\])[.][.]([/\\]|$)/.test(value) ||
|
|
122
|
+
/(^|\s)(\/etc\/passwd|\/proc\/self|[a-z]:\\windows\\system32)/i.test(value),
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
kind: "secretShaped",
|
|
126
|
+
ruleId: "content.secret.shaped-value",
|
|
127
|
+
severity: "critical",
|
|
128
|
+
summary: "content contains token, bearer credential, or password-shaped text",
|
|
129
|
+
matches: (value) => /\bbearer\s+[a-z0-9._-]{12,}/i.test(value) ||
|
|
130
|
+
/\b(api[_-]?key|password|secret|token)\s*[:=]\s*[^\s"']{12,}/i.test(value),
|
|
131
|
+
},
|
|
132
|
+
...piiRules,
|
|
133
|
+
];
|
|
134
|
+
export function classifyContent(text) {
|
|
135
|
+
const findings = contentRules
|
|
136
|
+
.filter((rule) => rule.matches(text))
|
|
137
|
+
.map(toFinding);
|
|
138
|
+
return {
|
|
139
|
+
classification: classificationForFindings(findings),
|
|
140
|
+
findings,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function toFinding(rule) {
|
|
144
|
+
return {
|
|
145
|
+
kind: rule.kind,
|
|
146
|
+
ruleId: rule.ruleId,
|
|
147
|
+
severity: rule.severity,
|
|
148
|
+
summary: rule.summary,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function classificationForFindings(findings) {
|
|
152
|
+
if (findings.some((finding) => finding.kind === "secretShaped" || finding.kind.startsWith("pii"))) {
|
|
153
|
+
return "restricted";
|
|
154
|
+
}
|
|
155
|
+
if (findings.length > 0) {
|
|
156
|
+
return "unknown";
|
|
157
|
+
}
|
|
158
|
+
return "internal";
|
|
159
|
+
}
|
|
160
|
+
function includesAny(value, needles) {
|
|
161
|
+
const normalized = value.toLowerCase();
|
|
162
|
+
return needles.some((needle) => normalized.includes(needle));
|
|
163
|
+
}
|
|
164
|
+
function hasUnsafeUrl(value) {
|
|
165
|
+
const urls = value.match(/\b[a-z][a-z0-9+.-]*:\/\/[^\s)>\]"]+/gi) ?? [];
|
|
166
|
+
return urls.some((rawUrl) => {
|
|
167
|
+
let parsed;
|
|
168
|
+
try {
|
|
169
|
+
parsed = new URL(rawUrl);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
175
|
+
return (parsed.protocol !== "https:" ||
|
|
176
|
+
privateHostPatterns.some((pattern) => hostname.startsWith(pattern)));
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=content-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-classifier.js","sourceRoot":"","sources":["../../src/security/content-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PolicyAction, PolicyDecision, PolicyResource, PolicySink, PolicySubject, SegmentKind } from "./policy-types.js";
|
|
2
|
+
export type OperationKind = "evidence" | "provider" | "pythonWorker" | "runtime" | "tool";
|
|
3
|
+
export interface OperationPayloadInput {
|
|
4
|
+
text?: string;
|
|
5
|
+
kind?: SegmentKind;
|
|
6
|
+
provenance?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PythonWorkerContractInput {
|
|
9
|
+
contract?: "json";
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
maxInputBytes?: number;
|
|
12
|
+
authorizes?: boolean;
|
|
13
|
+
network?: boolean;
|
|
14
|
+
filesystem?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface OperationPacketInput {
|
|
17
|
+
packetId?: string;
|
|
18
|
+
kind?: OperationKind;
|
|
19
|
+
subject?: Partial<PolicySubject>;
|
|
20
|
+
action?: PolicyAction;
|
|
21
|
+
resource?: Partial<PolicyResource>;
|
|
22
|
+
sink?: PolicySink;
|
|
23
|
+
payload?: OperationPayloadInput;
|
|
24
|
+
pythonWorker?: PythonWorkerContractInput;
|
|
25
|
+
}
|
|
26
|
+
export interface OperationValidationDecision extends PolicyDecision {
|
|
27
|
+
encodedPayload?: string;
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-contract-types.js","sourceRoot":"","sources":["../../src/security/operation-contract-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { encodeForSink } from "./sink-encoding.js";
|
|
2
|
+
import { evaluateSecurityPolicy } from "./policy-engine.js";
|
|
3
|
+
import { intakePromptSegment } from "./prompt-intake.js";
|
|
4
|
+
import { redactPromptSegments } from "./redaction.js";
|
|
5
|
+
const specs = {
|
|
6
|
+
evidence: {
|
|
7
|
+
action: "evidence.write",
|
|
8
|
+
resourceType: "evidence",
|
|
9
|
+
sink: "evidence",
|
|
10
|
+
segmentKind: "evidence",
|
|
11
|
+
},
|
|
12
|
+
provider: {
|
|
13
|
+
action: "provider.message",
|
|
14
|
+
resourceType: "prompt",
|
|
15
|
+
sink: "provider",
|
|
16
|
+
segmentKind: "data",
|
|
17
|
+
},
|
|
18
|
+
pythonWorker: {
|
|
19
|
+
action: "pythonWorker.process",
|
|
20
|
+
resourceType: "pythonWorker",
|
|
21
|
+
sink: "json",
|
|
22
|
+
segmentKind: "data",
|
|
23
|
+
},
|
|
24
|
+
runtime: {
|
|
25
|
+
action: "command.execute",
|
|
26
|
+
resourceType: "command",
|
|
27
|
+
sink: "log",
|
|
28
|
+
segmentKind: "instruction",
|
|
29
|
+
},
|
|
30
|
+
tool: {
|
|
31
|
+
action: "command.execute",
|
|
32
|
+
resourceType: "command",
|
|
33
|
+
sink: "log",
|
|
34
|
+
segmentKind: "toolInput",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
export function validateOperationPacket(input) {
|
|
38
|
+
const contractRules = validateContractShape(input);
|
|
39
|
+
if (contractRules.length > 0)
|
|
40
|
+
return contractDeny(input.packetId, contractRules);
|
|
41
|
+
const kind = input.kind;
|
|
42
|
+
const spec = specs[kind];
|
|
43
|
+
const packetId = input.packetId;
|
|
44
|
+
const subject = input.subject;
|
|
45
|
+
const action = input.action;
|
|
46
|
+
const resource = input.resource;
|
|
47
|
+
const sink = input.sink;
|
|
48
|
+
const semanticRules = [
|
|
49
|
+
exactRule("operation.contract.action", action, spec.action, "action"),
|
|
50
|
+
exactRule("operation.contract.resource", resource.resourceType, spec.resourceType, "resource type"),
|
|
51
|
+
exactRule("operation.contract.sink", sink, spec.sink, "sink"),
|
|
52
|
+
...validatePythonWorkerContract(input),
|
|
53
|
+
].filter((rule) => rule !== null);
|
|
54
|
+
if (semanticRules.length > 0)
|
|
55
|
+
return contractDeny(input.packetId, semanticRules);
|
|
56
|
+
const segment = normalizedSegment(input, spec, packetId, sink);
|
|
57
|
+
const redactionReport = redactPromptSegments([segment]);
|
|
58
|
+
const policySegment = redactedPolicySegment(input, spec, redactionReport, packetId, sink);
|
|
59
|
+
const policyDecision = evaluateSecurityPolicy({
|
|
60
|
+
requestId: packetId,
|
|
61
|
+
subject,
|
|
62
|
+
action,
|
|
63
|
+
resource,
|
|
64
|
+
sink,
|
|
65
|
+
dataClassification: policySegment.classification.classification,
|
|
66
|
+
segments: [policySegment],
|
|
67
|
+
redactionReport,
|
|
68
|
+
});
|
|
69
|
+
if (policyDecision.outcome === "deny")
|
|
70
|
+
return policyDecision;
|
|
71
|
+
return {
|
|
72
|
+
...policyDecision,
|
|
73
|
+
encodedPayload: encodeForSink(policySegment.text, sink).value,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function validateContractShape(input) {
|
|
77
|
+
return [
|
|
78
|
+
requiredRule("operation.contract.packet-id", "packet id", input.packetId),
|
|
79
|
+
requiredRule("operation.contract.kind", "operation kind", input.kind),
|
|
80
|
+
requiredRule("operation.contract.subject", "subject", input.subject),
|
|
81
|
+
requiredRule("operation.contract.action", "action", input.action),
|
|
82
|
+
requiredRule("operation.contract.resource", "resource", input.resource),
|
|
83
|
+
requiredRule("operation.contract.resource-type", "resource type", input.resource?.resourceType),
|
|
84
|
+
requiredRule("operation.contract.sink", "sink", input.sink),
|
|
85
|
+
requiredRule("operation.contract.payload", "payload", input.payload),
|
|
86
|
+
requiredRule("operation.contract.payload-text", "payload text", input.payload?.text),
|
|
87
|
+
].filter((rule) => rule !== null);
|
|
88
|
+
}
|
|
89
|
+
function validatePythonWorkerContract(input) {
|
|
90
|
+
if (input.kind !== "pythonWorker")
|
|
91
|
+
return [];
|
|
92
|
+
const worker = input.pythonWorker;
|
|
93
|
+
const rules = [
|
|
94
|
+
requiredRule("operation.python-worker.contract", "worker contract", worker),
|
|
95
|
+
exactRule("operation.python-worker.json-contract", worker?.contract, "json", "worker contract"),
|
|
96
|
+
falseRule("operation.python-worker.no-auth", "worker authorization authority", worker?.authorizes),
|
|
97
|
+
falseRule("operation.python-worker.no-network", "worker network access", worker?.network),
|
|
98
|
+
falseRule("operation.python-worker.no-filesystem", "worker filesystem access", worker?.filesystem),
|
|
99
|
+
boundedNumberRule("operation.python-worker.timeout", "worker timeout", worker?.timeoutMs, 1, 5000),
|
|
100
|
+
boundedNumberRule("operation.python-worker.input-bytes", "worker max input bytes", worker?.maxInputBytes, 1, 1_000_000),
|
|
101
|
+
jsonRule(input.payload?.text),
|
|
102
|
+
];
|
|
103
|
+
return rules.filter((rule) => rule !== null);
|
|
104
|
+
}
|
|
105
|
+
function normalizedSegment(input, spec, packetId, sink) {
|
|
106
|
+
return intakePromptSegment({
|
|
107
|
+
id: `${packetId}:payload`,
|
|
108
|
+
kind: input.payload?.kind ?? spec.segmentKind,
|
|
109
|
+
provenance: input.payload?.provenance ?? `${input.kind}:packet`,
|
|
110
|
+
sink,
|
|
111
|
+
text: input.payload?.text ?? "",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function redactedPolicySegment(input, spec, redactionReport, packetId, sink) {
|
|
115
|
+
return intakePromptSegment({
|
|
116
|
+
id: `${packetId}:payload:redacted`,
|
|
117
|
+
kind: input.payload?.kind ?? spec.segmentKind,
|
|
118
|
+
provenance: input.payload?.provenance ?? `${input.kind}:packet`,
|
|
119
|
+
sink,
|
|
120
|
+
text: redactionReport.redactedSegments[0]?.text ?? "",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function requiredRule(ruleId, label, value) {
|
|
124
|
+
if (value)
|
|
125
|
+
return null;
|
|
126
|
+
return { ruleId, reason: `missing ${label}` };
|
|
127
|
+
}
|
|
128
|
+
function exactRule(ruleId, actual, expected, label) {
|
|
129
|
+
if (actual === expected)
|
|
130
|
+
return null;
|
|
131
|
+
return { ruleId, reason: `ambiguous ${label}` };
|
|
132
|
+
}
|
|
133
|
+
function falseRule(ruleId, label, value) {
|
|
134
|
+
if (value === false)
|
|
135
|
+
return null;
|
|
136
|
+
return { ruleId, reason: `${label} must be disabled` };
|
|
137
|
+
}
|
|
138
|
+
function boundedNumberRule(ruleId, label, value, min, max) {
|
|
139
|
+
if (typeof value === "number" &&
|
|
140
|
+
Number.isInteger(value) &&
|
|
141
|
+
value >= min &&
|
|
142
|
+
value <= max) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return { ruleId, reason: `${label} must be between ${min} and ${max}` };
|
|
146
|
+
}
|
|
147
|
+
function jsonRule(text) {
|
|
148
|
+
try {
|
|
149
|
+
JSON.parse(text ?? "");
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return {
|
|
154
|
+
ruleId: "operation.python-worker.json-payload",
|
|
155
|
+
reason: "worker payload must be valid JSON",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function contractDeny(packetId, rules) {
|
|
160
|
+
return {
|
|
161
|
+
requestId: packetId ?? "unknown",
|
|
162
|
+
outcome: "deny",
|
|
163
|
+
matchedRuleIds: rules.map((rule) => rule.ruleId),
|
|
164
|
+
redactionStatus: "unsafeUnredacted",
|
|
165
|
+
sanitizedReasons: rules.map((rule) => rule.reason),
|
|
166
|
+
evidenceSummary: "deny: operation contract failed closed",
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=operation-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-contract.js","sourceRoot":"","sources":["../../src/security/operation-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const paymentCardCandidatePattern = /\b\d(?:[ -]?\d){12,18}\b/g;
|
|
2
|
+
export function hasPaymentCardLikeValue(value) {
|
|
3
|
+
return paymentCardCandidates(value).some(isPaymentCardLikeValue);
|
|
4
|
+
}
|
|
5
|
+
export function redactPaymentCardLikeValues(value, replacement) {
|
|
6
|
+
return value.replace(paymentCardCandidatePattern, (match, offset) => isPaymentCardLikeCandidate(value, match, offset) ? replacement : match);
|
|
7
|
+
}
|
|
8
|
+
export function isPaymentCardLikeValue(value) {
|
|
9
|
+
const digits = value.replace(/[ -]/g, "");
|
|
10
|
+
if (digits.length < 13 || digits.length > 19)
|
|
11
|
+
return false;
|
|
12
|
+
return luhnChecksum(digits);
|
|
13
|
+
}
|
|
14
|
+
function paymentCardCandidates(value) {
|
|
15
|
+
paymentCardCandidatePattern.lastIndex = 0;
|
|
16
|
+
return [...value.matchAll(paymentCardCandidatePattern)]
|
|
17
|
+
.filter((match) => isPaymentCardLikeCandidate(value, match[0], match.index ?? 0))
|
|
18
|
+
.map((match) => match[0]);
|
|
19
|
+
}
|
|
20
|
+
function isPaymentCardLikeCandidate(source, value, offset) {
|
|
21
|
+
if (!isPaymentCardLikeValue(value))
|
|
22
|
+
return false;
|
|
23
|
+
const before = source[offset - 1] ?? "";
|
|
24
|
+
const after = source[offset + value.length] ?? "";
|
|
25
|
+
return !isIdentifierBoundary(before) && !isIdentifierBoundary(after);
|
|
26
|
+
}
|
|
27
|
+
function isIdentifierBoundary(value) {
|
|
28
|
+
return /[A-Za-z0-9_-]/.test(value);
|
|
29
|
+
}
|
|
30
|
+
function luhnChecksum(value) {
|
|
31
|
+
let sum = 0;
|
|
32
|
+
let shouldDouble = false;
|
|
33
|
+
for (let index = value.length - 1; index >= 0; index -= 1) {
|
|
34
|
+
const digit = Number(value[index]);
|
|
35
|
+
if (!Number.isInteger(digit))
|
|
36
|
+
return false;
|
|
37
|
+
let contribution = digit;
|
|
38
|
+
if (shouldDouble) {
|
|
39
|
+
contribution = digit * 2;
|
|
40
|
+
if (contribution > 9)
|
|
41
|
+
contribution -= 9;
|
|
42
|
+
}
|
|
43
|
+
sum += contribution;
|
|
44
|
+
shouldDouble = !shouldDouble;
|
|
45
|
+
}
|
|
46
|
+
return sum > 0 && sum % 10 === 0;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=payment-card-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-card-detection.js","sourceRoot":"","sources":["../../src/security/payment-card-detection.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,2BAA2B,CAAC;AAEhE,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAa,EACb,WAAmB;IAEnB,OAAO,KAAK,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAClE,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,2BAA2B,CAAC,SAAS,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;SACpD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAChB,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAC9D;SACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,0BAA0B,CACjC,MAAc,EACd,KAAa,EACb,MAAc;IAEd,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;YACzB,IAAI,YAAY,GAAG,CAAC;gBAAE,YAAY,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,IAAI,YAAY,CAAC;QACpB,YAAY,GAAG,CAAC,YAAY,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
const sensitiveSinks = ["evidence", "log", "provider"];
|
|
2
|
+
export function evaluateSecurityPolicy(input) {
|
|
3
|
+
const validation = validatePolicyRequest(input);
|
|
4
|
+
if (validation.length > 0) {
|
|
5
|
+
return denyDecision(input.requestId, validation, "unsafeUnredacted");
|
|
6
|
+
}
|
|
7
|
+
const request = input;
|
|
8
|
+
const denied = deniedRules(request);
|
|
9
|
+
if (denied.length > 0) {
|
|
10
|
+
return denyDecision(request.requestId, denied, highestRedactionStatus(denied, request.redactionReport.status));
|
|
11
|
+
}
|
|
12
|
+
const quarantined = quarantineRules(request);
|
|
13
|
+
if (quarantined.length > 0) {
|
|
14
|
+
return quarantineDecision(request.requestId, quarantined, request.redactionReport.status);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
requestId: request.requestId,
|
|
18
|
+
outcome: "allow",
|
|
19
|
+
matchedRuleIds: ["policy.default.allow-after-rules"],
|
|
20
|
+
redactionStatus: request.redactionReport.status,
|
|
21
|
+
sanitizedReasons: ["request satisfied deterministic policy rules"],
|
|
22
|
+
evidenceSummary: "allow: deterministic security policy accepted request",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function validatePolicyRequest(input) {
|
|
26
|
+
const missing = [
|
|
27
|
+
requiredRule("policy.input.request-id", "request id", input.requestId),
|
|
28
|
+
requiredRule("policy.input.subject", "subject", input.subject),
|
|
29
|
+
requiredRule("policy.input.action", "action", input.action),
|
|
30
|
+
requiredRule("policy.input.resource", "resource", input.resource),
|
|
31
|
+
requiredRule("policy.input.sink", "sink", input.sink),
|
|
32
|
+
requiredRule("policy.input.data-classification", "data classification", input.dataClassification),
|
|
33
|
+
requiredRule("policy.input.redaction", "redaction report", input.redactionReport),
|
|
34
|
+
].filter((rule) => rule !== null);
|
|
35
|
+
if (missing.length > 0)
|
|
36
|
+
return missing;
|
|
37
|
+
const scoped = input.subject?.tenantId ?? input.subject?.workspaceId;
|
|
38
|
+
const resourceScoped = input.resource?.tenantId ?? input.resource?.workspaceId;
|
|
39
|
+
const scopeRules = [
|
|
40
|
+
requiredRule("policy.scope.subject", "subject tenant or workspace", scoped),
|
|
41
|
+
requiredRule("policy.scope.resource", "resource tenant or workspace", resourceScoped),
|
|
42
|
+
].filter((rule) => rule !== null);
|
|
43
|
+
if (scopeRules.length > 0)
|
|
44
|
+
return scopeRules;
|
|
45
|
+
if (input.subject?.tenantId && input.resource?.tenantId) {
|
|
46
|
+
if (input.subject.tenantId !== input.resource.tenantId) {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
ruleId: "policy.scope.tenant-mismatch",
|
|
50
|
+
reason: "subject and resource tenant scope do not match",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
function deniedRules(request) {
|
|
58
|
+
const rules = [];
|
|
59
|
+
if (request.redactionReport.status === "unsafeUnredacted") {
|
|
60
|
+
rules.push({
|
|
61
|
+
ruleId: "policy.redaction.fail-closed",
|
|
62
|
+
reason: "restricted content is not safely redacted",
|
|
63
|
+
redactionStatus: "unsafeUnredacted",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (request.action === "url.fetch" || request.sink === "url") {
|
|
67
|
+
rules.push(...findingRules(request, "unsafeUrl", "deny"));
|
|
68
|
+
}
|
|
69
|
+
if (request.action === "file.write") {
|
|
70
|
+
rules.push(...findingRules(request, "pathTraversal", "deny"));
|
|
71
|
+
}
|
|
72
|
+
return rules;
|
|
73
|
+
}
|
|
74
|
+
function quarantineRules(request) {
|
|
75
|
+
const rules = request.segments.flatMap((segment) => {
|
|
76
|
+
if (segment.kind === "unknown" && isSensitiveSink(request.sink)) {
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
ruleId: "policy.segment.unknown-sensitive-sink",
|
|
80
|
+
reason: `segment ${segment.id} is unknown for sensitive sink`,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
return segment.classification.findings
|
|
85
|
+
.filter((finding) => finding.severity === "critical" || finding.severity === "high")
|
|
86
|
+
.map((finding) => findingRule(segment.id, finding, "quarantine"));
|
|
87
|
+
});
|
|
88
|
+
if (request.dataClassification === "unknown" &&
|
|
89
|
+
isSensitiveSink(request.sink)) {
|
|
90
|
+
rules.push({
|
|
91
|
+
ruleId: "policy.data.unknown-sensitive-sink",
|
|
92
|
+
reason: "unknown data classification cannot reach sensitive sink",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return rules;
|
|
96
|
+
}
|
|
97
|
+
function findingRules(request, kind, disposition) {
|
|
98
|
+
return request.segments.flatMap((segment) => segment.classification.findings
|
|
99
|
+
.filter((finding) => finding.kind === kind)
|
|
100
|
+
.map((finding) => findingRule(segment.id, finding, disposition)));
|
|
101
|
+
}
|
|
102
|
+
function findingRule(segmentId, finding, disposition) {
|
|
103
|
+
return {
|
|
104
|
+
ruleId: `policy.${disposition}.${finding.kind}`,
|
|
105
|
+
reason: `segment ${segmentId} matched ${finding.summary}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function requiredRule(ruleId, label, value) {
|
|
109
|
+
if (value)
|
|
110
|
+
return null;
|
|
111
|
+
return {
|
|
112
|
+
ruleId,
|
|
113
|
+
reason: `missing ${label}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function denyDecision(requestId, rules, redactionStatus) {
|
|
117
|
+
return {
|
|
118
|
+
requestId: requestId ?? "unknown",
|
|
119
|
+
outcome: "deny",
|
|
120
|
+
matchedRuleIds: rules.map((rule) => rule.ruleId),
|
|
121
|
+
redactionStatus,
|
|
122
|
+
sanitizedReasons: rules.map((rule) => rule.reason),
|
|
123
|
+
evidenceSummary: "deny: deterministic security policy failed closed",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function quarantineDecision(requestId, rules, redactionStatus) {
|
|
127
|
+
return {
|
|
128
|
+
requestId,
|
|
129
|
+
outcome: "quarantine",
|
|
130
|
+
matchedRuleIds: rules.map((rule) => rule.ruleId),
|
|
131
|
+
redactionStatus,
|
|
132
|
+
sanitizedReasons: rules.map((rule) => rule.reason),
|
|
133
|
+
evidenceSummary: "quarantine: deterministic security policy isolated content",
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function highestRedactionStatus(rules, fallback) {
|
|
137
|
+
return (rules.find((rule) => rule.redactionStatus)?.redactionStatus ?? fallback);
|
|
138
|
+
}
|
|
139
|
+
function isSensitiveSink(sink) {
|
|
140
|
+
return sensitiveSinks.some((sensitiveSink) => sensitiveSink === sink);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=policy-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../src/security/policy-engine.ts"],"names":[],"mappings":"AAcA,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAU,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CACpC,KAAyB;IAEzB,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,KAAsB,CAAC;IACvC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,YAAY,CACjB,OAAO,CAAC,SAAS,EACjB,MAAM,EACN,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CACvB,OAAO,CAAC,SAAS,EACjB,WAAW,EACX,OAAO,CAAC,eAAe,CAAC,MAAM,CAC/B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,CAAC,kCAAkC,CAAC;QACpD,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM;QAC/C,gBAAgB,EAAE,CAAC,8CAA8C,CAAC;QAClE,eAAe,EAAE,uDAAuD;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,MAAM,OAAO,GAAG;QACd,YAAY,CAAC,yBAAyB,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;QACtE,YAAY,CAAC,sBAAsB,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;QAC9D,YAAY,CAAC,qBAAqB,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;QAC3D,YAAY,CAAC,uBAAuB,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;QACjE,YAAY,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;QACrD,YAAY,CACV,kCAAkC,EAClC,qBAAqB,EACrB,KAAK,CAAC,kBAAkB,CACzB;QACD,YAAY,CACV,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,CAAC,eAAe,CACtB;KACF,CAAC,MAAM,CAAC,CAAC,IAAI,EAA4B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC;IACrE,MAAM,cAAc,GAClB,KAAK,CAAC,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC1D,MAAM,UAAU,GAAG;QACjB,YAAY,CAAC,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,CAAC;QAC3E,YAAY,CACV,uBAAuB,EACvB,8BAA8B,EAC9B,cAAc,CACf;KACF,CAAC,MAAM,CAAC,CAAC,IAAI,EAA4B,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAE7C,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvD,OAAO;gBACL;oBACE,MAAM,EAAE,8BAA8B;oBACtC,MAAM,EAAE,gDAAgD;iBACzD;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,8BAA8B;YACtC,MAAM,EAAE,2CAA2C;YACnD,eAAe,EAAE,kBAAkB;SACpC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,OAAO;gBACL;oBACE,MAAM,EAAE,uCAAuC;oBAC/C,MAAM,EAAE,WAAW,OAAO,CAAC,EAAE,gCAAgC;iBAC9D;aACF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,cAAc,CAAC,QAAQ;aACnC,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CACjE;aACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,IACE,OAAO,CAAC,kBAAkB,KAAK,SAAS;QACxC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAC7B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,oCAAoC;YAC5C,MAAM,EAAE,yDAAyD;SAClE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CACnB,OAAsB,EACtB,IAA4B,EAC5B,WAAkC;IAElC,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1C,OAAO,CAAC,cAAc,CAAC,QAAQ;SAC5B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;SAC1C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,SAAiB,EACjB,OAAuB,EACvB,WAAkC;IAElC,OAAO;QACL,MAAM,EAAE,UAAU,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE;QAC/C,MAAM,EAAE,WAAW,SAAS,YAAY,OAAO,CAAC,OAAO,EAAE;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,MAAc,EACd,KAAa,EACb,KAAc;IAEd,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO;QACL,MAAM;QACN,MAAM,EAAE,WAAW,KAAK,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,SAA6B,EAC7B,KAAyB,EACzB,eAAgC;IAEhC,OAAO;QACL,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,eAAe;QACf,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAClD,eAAe,EAAE,mDAAmD;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,SAAiB,EACjB,KAAyB,EACzB,eAAgC;IAEhC,OAAO;QACL,SAAS;QACT,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,eAAe;QACf,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAClD,eAAe,EACb,4DAA4D;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAyB,EACzB,QAAyB;IAEzB,OAAO,CACL,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,IAAI,QAAQ,CACxE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;AACxE,CAAC"}
|