palaryn 0.1.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +243 -588
- package/dist/sdk/typescript/src/client.js +2 -2
- package/dist/sdk/typescript/src/client.js.map +1 -1
- package/dist/src/anomaly/detector.d.ts +7 -4
- package/dist/src/anomaly/detector.d.ts.map +1 -1
- package/dist/src/anomaly/detector.js +22 -12
- package/dist/src/anomaly/detector.js.map +1 -1
- package/dist/src/audit/logger.d.ts +10 -0
- package/dist/src/audit/logger.d.ts.map +1 -1
- package/dist/src/audit/logger.js +52 -38
- package/dist/src/audit/logger.js.map +1 -1
- package/dist/src/auth/routes.d.ts.map +1 -1
- package/dist/src/auth/routes.js +35 -0
- package/dist/src/auth/routes.js.map +1 -1
- package/dist/src/budget/manager.d.ts +5 -0
- package/dist/src/budget/manager.d.ts.map +1 -1
- package/dist/src/budget/manager.js +32 -0
- package/dist/src/budget/manager.js.map +1 -1
- package/dist/src/budget/model-pricing.d.ts +20 -0
- package/dist/src/budget/model-pricing.d.ts.map +1 -0
- package/dist/src/budget/model-pricing.js +107 -0
- package/dist/src/budget/model-pricing.js.map +1 -0
- package/dist/src/budget/usage-extractor.d.ts +3 -1
- package/dist/src/budget/usage-extractor.d.ts.map +1 -1
- package/dist/src/budget/usage-extractor.js +47 -3
- package/dist/src/budget/usage-extractor.js.map +1 -1
- package/dist/src/config/defaults.d.ts.map +1 -1
- package/dist/src/config/defaults.js +65 -13
- package/dist/src/config/defaults.js.map +1 -1
- package/dist/src/dlp/tool-patterns.d.ts +7 -0
- package/dist/src/dlp/tool-patterns.d.ts.map +1 -0
- package/dist/src/dlp/tool-patterns.js +34 -0
- package/dist/src/dlp/tool-patterns.js.map +1 -0
- package/dist/src/executor/filesystem-executor.d.ts +28 -0
- package/dist/src/executor/filesystem-executor.d.ts.map +1 -0
- package/dist/src/executor/filesystem-executor.js +192 -0
- package/dist/src/executor/filesystem-executor.js.map +1 -0
- package/dist/src/executor/http-executor.d.ts.map +1 -1
- package/dist/src/executor/http-executor.js +22 -2
- package/dist/src/executor/http-executor.js.map +1 -1
- package/dist/src/executor/index.d.ts +4 -0
- package/dist/src/executor/index.d.ts.map +1 -1
- package/dist/src/executor/index.js +9 -1
- package/dist/src/executor/index.js.map +1 -1
- package/dist/src/executor/shell-executor.d.ts +22 -0
- package/dist/src/executor/shell-executor.d.ts.map +1 -0
- package/dist/src/executor/shell-executor.js +119 -0
- package/dist/src/executor/shell-executor.js.map +1 -0
- package/dist/src/executor/sql-executor.d.ts +29 -0
- package/dist/src/executor/sql-executor.d.ts.map +1 -0
- package/dist/src/executor/sql-executor.js +114 -0
- package/dist/src/executor/sql-executor.js.map +1 -0
- package/dist/src/executor/websocket-executor.d.ts +26 -0
- package/dist/src/executor/websocket-executor.d.ts.map +1 -0
- package/dist/src/executor/websocket-executor.js +205 -0
- package/dist/src/executor/websocket-executor.js.map +1 -0
- package/dist/src/interceptor/index.d.ts +2 -0
- package/dist/src/interceptor/index.d.ts.map +1 -0
- package/dist/src/interceptor/index.js +6 -0
- package/dist/src/interceptor/index.js.map +1 -0
- package/dist/src/interceptor/provider-interceptor.d.ts +36 -0
- package/dist/src/interceptor/provider-interceptor.d.ts.map +1 -0
- package/dist/src/interceptor/provider-interceptor.js +302 -0
- package/dist/src/interceptor/provider-interceptor.js.map +1 -0
- package/dist/src/mcp/auth-verifier.d.ts.map +1 -1
- package/dist/src/mcp/auth-verifier.js +3 -2
- package/dist/src/mcp/auth-verifier.js.map +1 -1
- package/dist/src/mcp/bridge.d.ts +14 -10
- package/dist/src/mcp/bridge.d.ts.map +1 -1
- package/dist/src/mcp/bridge.js +51 -227
- package/dist/src/mcp/bridge.js.map +1 -1
- package/dist/src/mcp/http-transport.d.ts +2 -0
- package/dist/src/mcp/http-transport.d.ts.map +1 -1
- package/dist/src/mcp/http-transport.js +117 -66
- package/dist/src/mcp/http-transport.js.map +1 -1
- package/dist/src/mcp/internal-auth.d.ts +13 -0
- package/dist/src/mcp/internal-auth.d.ts.map +1 -0
- package/dist/src/mcp/internal-auth.js +12 -0
- package/dist/src/mcp/internal-auth.js.map +1 -0
- package/dist/src/mcp/tool-definitions.d.ts +41 -0
- package/dist/src/mcp/tool-definitions.d.ts.map +1 -0
- package/dist/src/mcp/tool-definitions.js +491 -0
- package/dist/src/mcp/tool-definitions.js.map +1 -0
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/middleware/session.js.map +1 -1
- package/dist/src/middleware/validate.d.ts +8 -0
- package/dist/src/middleware/validate.d.ts.map +1 -1
- package/dist/src/middleware/validate.js +45 -0
- package/dist/src/middleware/validate.js.map +1 -1
- package/dist/src/policy/engine.d.ts +4 -0
- package/dist/src/policy/engine.d.ts.map +1 -1
- package/dist/src/policy/engine.js +117 -0
- package/dist/src/policy/engine.js.map +1 -1
- package/dist/src/saas/routes.d.ts.map +1 -1
- package/dist/src/saas/routes.js +355 -22
- package/dist/src/saas/routes.js.map +1 -1
- package/dist/src/server/app.d.ts.map +1 -1
- package/dist/src/server/app.js +24 -3
- package/dist/src/server/app.js.map +1 -1
- package/dist/src/server/gateway.d.ts.map +1 -1
- package/dist/src/server/gateway.js +17 -0
- package/dist/src/server/gateway.js.map +1 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +18 -0
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/storage/interfaces.d.ts +14 -3
- package/dist/src/storage/interfaces.d.ts.map +1 -1
- package/dist/src/storage/memory.d.ts +2 -0
- package/dist/src/storage/memory.d.ts.map +1 -1
- package/dist/src/storage/memory.js +6 -0
- package/dist/src/storage/memory.js.map +1 -1
- package/dist/src/storage/postgres.d.ts +5 -0
- package/dist/src/storage/postgres.d.ts.map +1 -1
- package/dist/src/storage/postgres.js +16 -0
- package/dist/src/storage/postgres.js.map +1 -1
- package/dist/src/storage/redis.d.ts +10 -0
- package/dist/src/storage/redis.d.ts.map +1 -1
- package/dist/src/storage/redis.js +65 -0
- package/dist/src/storage/redis.js.map +1 -1
- package/dist/src/types/budget.d.ts +4 -0
- package/dist/src/types/budget.d.ts.map +1 -1
- package/dist/src/types/config.d.ts +58 -0
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +1 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/policy.d.ts +11 -1
- package/dist/src/types/policy.d.ts.map +1 -1
- package/dist/src/types/tool-result.d.ts +11 -0
- package/dist/src/types/tool-result.d.ts.map +1 -1
- package/dist/tests/unit/app-routes.test.d.ts +2 -0
- package/dist/tests/unit/app-routes.test.d.ts.map +1 -0
- package/dist/tests/unit/app-routes.test.js +715 -0
- package/dist/tests/unit/app-routes.test.js.map +1 -0
- package/dist/tests/unit/audit-logger.test.js +105 -0
- package/dist/tests/unit/audit-logger.test.js.map +1 -1
- package/dist/tests/unit/auth-providers.test.d.ts +2 -0
- package/dist/tests/unit/auth-providers.test.d.ts.map +1 -0
- package/dist/tests/unit/auth-providers.test.js +279 -0
- package/dist/tests/unit/auth-providers.test.js.map +1 -0
- package/dist/tests/unit/auth-routes-extended.test.d.ts +2 -0
- package/dist/tests/unit/auth-routes-extended.test.d.ts.map +1 -0
- package/dist/tests/unit/auth-routes-extended.test.js +993 -0
- package/dist/tests/unit/auth-routes-extended.test.js.map +1 -0
- package/dist/tests/unit/auth-verifier.test.d.ts +2 -0
- package/dist/tests/unit/auth-verifier.test.d.ts.map +1 -0
- package/dist/tests/unit/auth-verifier.test.js +505 -0
- package/dist/tests/unit/auth-verifier.test.js.map +1 -0
- package/dist/tests/unit/billing-routes.test.d.ts +2 -0
- package/dist/tests/unit/billing-routes.test.d.ts.map +1 -0
- package/dist/tests/unit/billing-routes.test.js +432 -0
- package/dist/tests/unit/billing-routes.test.js.map +1 -0
- package/dist/tests/unit/config-defaults.test.d.ts +2 -0
- package/dist/tests/unit/config-defaults.test.d.ts.map +1 -0
- package/dist/tests/unit/config-defaults.test.js +119 -0
- package/dist/tests/unit/config-defaults.test.js.map +1 -0
- package/dist/tests/unit/defaults.test.js +0 -10
- package/dist/tests/unit/defaults.test.js.map +1 -1
- package/dist/tests/unit/filesystem-executor.test.d.ts +2 -0
- package/dist/tests/unit/filesystem-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/filesystem-executor.test.js +280 -0
- package/dist/tests/unit/filesystem-executor.test.js.map +1 -0
- package/dist/tests/unit/gateway-branches.test.d.ts +2 -0
- package/dist/tests/unit/gateway-branches.test.d.ts.map +1 -0
- package/dist/tests/unit/gateway-branches.test.js +1039 -0
- package/dist/tests/unit/gateway-branches.test.js.map +1 -0
- package/dist/tests/unit/http-executor-branches.test.d.ts +2 -0
- package/dist/tests/unit/http-executor-branches.test.d.ts.map +1 -0
- package/dist/tests/unit/http-executor-branches.test.js +495 -0
- package/dist/tests/unit/http-executor-branches.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +2 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +97 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/unit/mcp-internal-auth.test.d.ts +2 -0
- package/dist/tests/unit/mcp-internal-auth.test.d.ts.map +1 -0
- package/dist/tests/unit/mcp-internal-auth.test.js +445 -0
- package/dist/tests/unit/mcp-internal-auth.test.js.map +1 -0
- package/dist/tests/unit/metrics.test.js +102 -0
- package/dist/tests/unit/metrics.test.js.map +1 -1
- package/dist/tests/unit/model-pricing.test.d.ts +2 -0
- package/dist/tests/unit/model-pricing.test.d.ts.map +1 -0
- package/dist/tests/unit/model-pricing.test.js +87 -0
- package/dist/tests/unit/model-pricing.test.js.map +1 -0
- package/dist/tests/unit/oauth-stores.test.d.ts +2 -0
- package/dist/tests/unit/oauth-stores.test.d.ts.map +1 -0
- package/dist/tests/unit/oauth-stores.test.js +260 -0
- package/dist/tests/unit/oauth-stores.test.js.map +1 -0
- package/dist/tests/unit/policy-engine.test.js +466 -0
- package/dist/tests/unit/policy-engine.test.js.map +1 -1
- package/dist/tests/unit/provider-interceptor.test.d.ts +2 -0
- package/dist/tests/unit/provider-interceptor.test.d.ts.map +1 -0
- package/dist/tests/unit/provider-interceptor.test.js +472 -0
- package/dist/tests/unit/provider-interceptor.test.js.map +1 -0
- package/dist/tests/unit/saas-routes-branches.test.d.ts +2 -0
- package/dist/tests/unit/saas-routes-branches.test.d.ts.map +1 -0
- package/dist/tests/unit/saas-routes-branches.test.js +2165 -0
- package/dist/tests/unit/saas-routes-branches.test.js.map +1 -0
- package/dist/tests/unit/saas-routes-crud.test.d.ts +2 -0
- package/dist/tests/unit/saas-routes-crud.test.d.ts.map +1 -0
- package/dist/tests/unit/saas-routes-crud.test.js +332 -0
- package/dist/tests/unit/saas-routes-crud.test.js.map +1 -0
- package/dist/tests/unit/saas-routes-data.test.d.ts +2 -0
- package/dist/tests/unit/saas-routes-data.test.d.ts.map +1 -0
- package/dist/tests/unit/saas-routes-data.test.js +405 -0
- package/dist/tests/unit/saas-routes-data.test.js.map +1 -0
- package/dist/tests/unit/saas-routes.test.js +3 -3
- package/dist/tests/unit/saas-routes.test.js.map +1 -1
- package/dist/tests/unit/shell-executor.test.d.ts +2 -0
- package/dist/tests/unit/shell-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/shell-executor.test.js +145 -0
- package/dist/tests/unit/shell-executor.test.js.map +1 -0
- package/dist/tests/unit/sql-executor.test.d.ts +2 -0
- package/dist/tests/unit/sql-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/sql-executor.test.js +177 -0
- package/dist/tests/unit/sql-executor.test.js.map +1 -0
- package/dist/tests/unit/stream-proxy.test.d.ts +2 -0
- package/dist/tests/unit/stream-proxy.test.d.ts.map +1 -0
- package/dist/tests/unit/stream-proxy.test.js +147 -0
- package/dist/tests/unit/stream-proxy.test.js.map +1 -0
- package/dist/tests/unit/tool-definitions.test.d.ts +2 -0
- package/dist/tests/unit/tool-definitions.test.d.ts.map +1 -0
- package/dist/tests/unit/tool-definitions.test.js +184 -0
- package/dist/tests/unit/tool-definitions.test.js.map +1 -0
- package/dist/tests/unit/usage-extractor.test.js +140 -0
- package/dist/tests/unit/usage-extractor.test.js.map +1 -1
- package/dist/tests/unit/webhook-handler.test.d.ts +2 -0
- package/dist/tests/unit/webhook-handler.test.d.ts.map +1 -0
- package/dist/tests/unit/webhook-handler.test.js +453 -0
- package/dist/tests/unit/webhook-handler.test.js.map +1 -0
- package/dist/tests/unit/webhook-routes.test.d.ts +2 -0
- package/dist/tests/unit/webhook-routes.test.d.ts.map +1 -0
- package/dist/tests/unit/webhook-routes.test.js +69 -0
- package/dist/tests/unit/webhook-routes.test.js.map +1 -0
- package/dist/tests/unit/websocket-executor.test.d.ts +2 -0
- package/dist/tests/unit/websocket-executor.test.d.ts.map +1 -0
- package/dist/tests/unit/websocket-executor.test.js +121 -0
- package/dist/tests/unit/websocket-executor.test.js.map +1 -0
- package/package.json +8 -2
- package/policy-packs/demo_fail.yaml +41 -0
- package/policy-packs/full_tools.yaml +136 -0
- package/src/admin/index.ts +1 -0
- package/src/admin/routes.ts +509 -0
- package/src/admin/templates.ts +572 -0
- package/src/anomaly/detector.ts +730 -0
- package/src/anomaly/index.ts +1 -0
- package/src/approval/manager.ts +569 -0
- package/src/approval/webhook.ts +133 -0
- package/src/audit/logger.ts +490 -0
- package/src/auth/index.ts +5 -0
- package/src/auth/password.ts +21 -0
- package/src/auth/pkce.ts +22 -0
- package/src/auth/providers.ts +208 -0
- package/src/auth/routes.ts +561 -0
- package/src/auth/session.ts +84 -0
- package/src/billing/index.ts +6 -0
- package/src/billing/plan-enforcer.ts +135 -0
- package/src/billing/routes.ts +229 -0
- package/src/billing/stripe-client.ts +58 -0
- package/src/billing/webhook-handler.ts +182 -0
- package/src/billing/webhook-routes.ts +28 -0
- package/src/budget/manager.ts +679 -0
- package/src/budget/model-pricing.ts +119 -0
- package/src/budget/usage-extractor.ts +214 -0
- package/src/cli.ts +91 -0
- package/src/config/defaults.ts +261 -0
- package/src/config/validate.ts +88 -0
- package/src/dlp/composite-scanner.ts +213 -0
- package/src/dlp/index.ts +9 -0
- package/src/dlp/interfaces.ts +34 -0
- package/src/dlp/patterns.ts +30 -0
- package/src/dlp/prompt-injection-backend.ts +181 -0
- package/src/dlp/prompt-injection-patterns.ts +302 -0
- package/src/dlp/regex-backend.ts +181 -0
- package/src/dlp/scanner.ts +502 -0
- package/src/dlp/text-normalizer.ts +225 -0
- package/src/dlp/tool-patterns.ts +35 -0
- package/src/dlp/trufflehog-backend.ts +190 -0
- package/src/executor/filesystem-executor.ts +196 -0
- package/src/executor/http-executor.ts +349 -0
- package/src/executor/index.ts +9 -0
- package/src/executor/interfaces.ts +11 -0
- package/src/executor/noop-executor.ts +23 -0
- package/src/executor/registry.ts +64 -0
- package/src/executor/shell-executor.ts +148 -0
- package/src/executor/slack-executor.ts +176 -0
- package/src/executor/sql-executor.ts +146 -0
- package/src/executor/websocket-executor.ts +211 -0
- package/src/index.ts +24 -0
- package/src/interceptor/index.ts +1 -0
- package/src/interceptor/provider-interceptor.ts +315 -0
- package/src/mcp/auth-verifier.ts +152 -0
- package/src/mcp/bridge.ts +703 -0
- package/src/mcp/http-transport.ts +698 -0
- package/src/mcp/index.ts +9 -0
- package/src/mcp/internal-auth.ts +14 -0
- package/src/mcp/oauth-pages.ts +139 -0
- package/src/mcp/oauth-postgres-stores.ts +278 -0
- package/src/mcp/oauth-provider.ts +536 -0
- package/src/mcp/oauth-stores.ts +202 -0
- package/src/mcp/server.ts +55 -0
- package/src/mcp/tool-definitions.ts +562 -0
- package/src/metrics/collector.ts +357 -0
- package/src/metrics/index.ts +1 -0
- package/src/middleware/auth.ts +814 -0
- package/src/middleware/session.ts +85 -0
- package/src/middleware/validate.ts +130 -0
- package/src/policy/engine.ts +815 -0
- package/src/policy/index.ts +2 -0
- package/src/policy/opa-engine.ts +829 -0
- package/src/proxy/forward-proxy.ts +649 -0
- package/src/proxy/index.ts +1 -0
- package/src/ratelimit/limiter.ts +196 -0
- package/src/replay/engine.ts +142 -0
- package/src/replay/index.ts +1 -0
- package/src/saas/index.ts +1 -0
- package/src/saas/routes.ts +2178 -0
- package/src/server/app.ts +985 -0
- package/src/server/errors.ts +49 -0
- package/src/server/gateway.ts +1130 -0
- package/src/server/index.ts +307 -0
- package/src/server/logger.ts +255 -0
- package/src/server/stream-proxy.ts +202 -0
- package/src/storage/file-persistence.ts +315 -0
- package/src/storage/index.ts +4 -0
- package/src/storage/interfaces.ts +287 -0
- package/src/storage/memory.ts +686 -0
- package/src/storage/postgres.ts +1831 -0
- package/src/storage/redis.ts +835 -0
- package/src/tracing/index.ts +1 -0
- package/src/tracing/provider.ts +100 -0
- package/src/trust/calculator.ts +141 -0
- package/src/trust/index.ts +7 -0
- package/src/types/budget.ts +36 -0
- package/src/types/config.ts +278 -0
- package/src/types/events.ts +41 -0
- package/src/types/express.d.ts +14 -0
- package/src/types/index.ts +7 -0
- package/src/types/policy.ts +83 -0
- package/src/types/stripe-config.ts +11 -0
- package/src/types/subscription.ts +59 -0
- package/src/types/tool-call.ts +47 -0
- package/src/types/tool-result.ts +82 -0
- package/src/types/user.ts +125 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { GatewayTracer, TracingConfig } from './provider';
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Tracer, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';
|
|
2
|
+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
|
3
|
+
import { BatchSpanProcessor, SimpleSpanProcessor, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
4
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
5
|
+
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
6
|
+
|
|
7
|
+
export { SpanKind, SpanStatusCode };
|
|
8
|
+
|
|
9
|
+
export interface TracingConfig {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/** Service name reported to the collector. Defaults to 'palaryn'. */
|
|
12
|
+
service_name?: string;
|
|
13
|
+
/** Service version reported to the collector. Defaults to '0.1.0'. */
|
|
14
|
+
service_version?: string;
|
|
15
|
+
/** Deployment environment (e.g. 'production', 'staging'). Defaults to 'development'. */
|
|
16
|
+
environment?: string;
|
|
17
|
+
/** OTLP HTTP endpoint for trace export. Defaults to 'http://localhost:4318/v1/traces'. */
|
|
18
|
+
otlp_endpoint?: string;
|
|
19
|
+
/** Use SimpleSpanProcessor instead of BatchSpanProcessor. Useful for testing. */
|
|
20
|
+
use_simple_processor?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* GatewayTracer wraps the OpenTelemetry SDK and provides a simple interface
|
|
25
|
+
* for the gateway pipeline to create spans. When tracing is disabled the
|
|
26
|
+
* class is a no-op — getTracer() returns undefined and all other methods
|
|
27
|
+
* are safe to call.
|
|
28
|
+
*/
|
|
29
|
+
export class GatewayTracer {
|
|
30
|
+
private provider?: NodeTracerProvider;
|
|
31
|
+
private tracer?: Tracer;
|
|
32
|
+
private config: TracingConfig;
|
|
33
|
+
|
|
34
|
+
constructor(config: TracingConfig) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the TracerProvider and register it globally.
|
|
40
|
+
* If config.enabled is false this is a no-op.
|
|
41
|
+
*/
|
|
42
|
+
setup(): void {
|
|
43
|
+
if (!this.config.enabled) {
|
|
44
|
+
// No-op mode — getTracer() will return undefined
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const resource = resourceFromAttributes({
|
|
49
|
+
'service.name': this.config.service_name || 'palaryn',
|
|
50
|
+
'service.version': this.config.service_version || '0.1.0',
|
|
51
|
+
'deployment.environment': this.config.environment || 'development',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const exporter = new OTLPTraceExporter({
|
|
55
|
+
url: this.config.otlp_endpoint || 'http://localhost:4318/v1/traces',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const processor: SpanProcessor = this.config.use_simple_processor
|
|
59
|
+
? new SimpleSpanProcessor(exporter)
|
|
60
|
+
: new BatchSpanProcessor(exporter);
|
|
61
|
+
|
|
62
|
+
this.provider = new NodeTracerProvider({
|
|
63
|
+
resource,
|
|
64
|
+
spanProcessors: [processor],
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
this.provider.register();
|
|
68
|
+
|
|
69
|
+
this.tracer = this.provider.getTracer(
|
|
70
|
+
this.config.service_name || 'palaryn',
|
|
71
|
+
this.config.service_version || '0.1.0',
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Return the active Tracer instance, or undefined when tracing is disabled.
|
|
77
|
+
* Callers should guard with `if (!tracer) ...` or optional chaining.
|
|
78
|
+
*/
|
|
79
|
+
getTracer(name?: string): Tracer | undefined {
|
|
80
|
+
if (!this.provider) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (name) {
|
|
84
|
+
return this.provider.getTracer(name);
|
|
85
|
+
}
|
|
86
|
+
return this.tracer;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Flush pending spans and shut down the provider.
|
|
91
|
+
* Safe to call even when tracing is disabled.
|
|
92
|
+
*/
|
|
93
|
+
async shutdown(): Promise<void> {
|
|
94
|
+
if (this.provider) {
|
|
95
|
+
await this.provider.shutdown();
|
|
96
|
+
this.provider = undefined;
|
|
97
|
+
this.tracer = undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { AnomalyDetector } from '../anomaly/detector';
|
|
2
|
+
import { AuditLogger } from '../audit/logger';
|
|
3
|
+
import { BudgetManager } from '../budget/manager';
|
|
4
|
+
|
|
5
|
+
export interface TrustScoreWeights {
|
|
6
|
+
anomaly_weight: number;
|
|
7
|
+
high_severity_weight: number;
|
|
8
|
+
dlp_weight: number;
|
|
9
|
+
dlp_high_weight: number;
|
|
10
|
+
error_rate_weight: number;
|
|
11
|
+
escalation_weight: number;
|
|
12
|
+
budget_velocity_weight: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TrustScoreBreakdown {
|
|
16
|
+
anomalies: { count: number; high_count: number; impact: number };
|
|
17
|
+
dlp: { detections: number; high_severity: number; impact: number };
|
|
18
|
+
error_rate: { pct: number; impact: number };
|
|
19
|
+
escalations: { count: number; impact: number };
|
|
20
|
+
budget_velocity: { current_rate: number; impact: number };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TrustScoreResult {
|
|
24
|
+
actor_id: string;
|
|
25
|
+
score: number;
|
|
26
|
+
risk_level: 'low' | 'medium' | 'high' | 'critical';
|
|
27
|
+
breakdown: TrustScoreBreakdown;
|
|
28
|
+
calculated_at: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const DEFAULT_WEIGHTS: TrustScoreWeights = {
|
|
32
|
+
anomaly_weight: 2,
|
|
33
|
+
high_severity_weight: 5,
|
|
34
|
+
dlp_weight: 3,
|
|
35
|
+
dlp_high_weight: 10,
|
|
36
|
+
error_rate_weight: 1,
|
|
37
|
+
escalation_weight: 15,
|
|
38
|
+
budget_velocity_weight: 20,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export class TrustScoreCalculator {
|
|
42
|
+
constructor(
|
|
43
|
+
private anomalyDetector: AnomalyDetector,
|
|
44
|
+
private auditLogger: AuditLogger,
|
|
45
|
+
private budgetManager: BudgetManager,
|
|
46
|
+
private weights: TrustScoreWeights = DEFAULT_WEIGHTS,
|
|
47
|
+
) {}
|
|
48
|
+
|
|
49
|
+
calculate(actorId: string): TrustScoreResult {
|
|
50
|
+
let score = 100;
|
|
51
|
+
|
|
52
|
+
// 1. Anomaly component
|
|
53
|
+
const actorAlerts = this.anomalyDetector.getAlertsForEntity('actor', actorId);
|
|
54
|
+
const highAlerts = actorAlerts.filter(a => a.severity === 'high');
|
|
55
|
+
const anomalyImpact =
|
|
56
|
+
actorAlerts.length * this.weights.anomaly_weight +
|
|
57
|
+
highAlerts.length * this.weights.high_severity_weight;
|
|
58
|
+
score -= anomalyImpact;
|
|
59
|
+
|
|
60
|
+
// 2. DLP component
|
|
61
|
+
const dlpEvents = this.auditLogger
|
|
62
|
+
.getEventsByType('DLP_SCANNED')
|
|
63
|
+
.filter(e => e.actor_id === actorId);
|
|
64
|
+
const dlpWithDetections = dlpEvents.filter(e => {
|
|
65
|
+
const detected = e.metadata?.detected as string[] | undefined;
|
|
66
|
+
return detected && detected.length > 0;
|
|
67
|
+
});
|
|
68
|
+
const dlpHighSeverity = dlpEvents.filter(e => e.metadata?.severity === 'high');
|
|
69
|
+
const dlpImpact =
|
|
70
|
+
dlpWithDetections.length * this.weights.dlp_weight +
|
|
71
|
+
dlpHighSeverity.length * this.weights.dlp_high_weight;
|
|
72
|
+
score -= dlpImpact;
|
|
73
|
+
|
|
74
|
+
// 3. Error rate component
|
|
75
|
+
const baseline = this.anomalyDetector.getBaseline('actor', actorId, 'error_rate');
|
|
76
|
+
const errorPct = baseline ? baseline.mean * 100 : 0;
|
|
77
|
+
const errorImpact = errorPct * this.weights.error_rate_weight;
|
|
78
|
+
score -= errorImpact;
|
|
79
|
+
|
|
80
|
+
// 4. Capability escalation component
|
|
81
|
+
const escalations = actorAlerts.filter(a => a.anomaly_type === 'capability_escalation');
|
|
82
|
+
const escalationImpact = escalations.length * this.weights.escalation_weight;
|
|
83
|
+
score -= escalationImpact;
|
|
84
|
+
|
|
85
|
+
// 5. Budget velocity component
|
|
86
|
+
const spending = this.budgetManager.getActorSpending(actorId);
|
|
87
|
+
// If daily spend is more than 2x the average per-task spend, flag it
|
|
88
|
+
let budgetVelocityRate = 0;
|
|
89
|
+
let budgetImpact = 0;
|
|
90
|
+
if (spending.task_count > 0 && spending.total_spend > 0) {
|
|
91
|
+
const avgPerTask = spending.total_spend / spending.task_count;
|
|
92
|
+
budgetVelocityRate = spending.daily_spend / avgPerTask;
|
|
93
|
+
if (budgetVelocityRate > 2) {
|
|
94
|
+
budgetImpact = this.weights.budget_velocity_weight;
|
|
95
|
+
score -= budgetImpact;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
score = Math.max(0, Math.min(100, score));
|
|
100
|
+
|
|
101
|
+
const risk_level: TrustScoreResult['risk_level'] =
|
|
102
|
+
score >= 80 ? 'low' : score >= 50 ? 'medium' : score >= 30 ? 'high' : 'critical';
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
actor_id: actorId,
|
|
106
|
+
score,
|
|
107
|
+
risk_level,
|
|
108
|
+
breakdown: {
|
|
109
|
+
anomalies: {
|
|
110
|
+
count: actorAlerts.length,
|
|
111
|
+
high_count: highAlerts.length,
|
|
112
|
+
impact: anomalyImpact,
|
|
113
|
+
},
|
|
114
|
+
dlp: {
|
|
115
|
+
detections: dlpWithDetections.length,
|
|
116
|
+
high_severity: dlpHighSeverity.length,
|
|
117
|
+
impact: dlpImpact,
|
|
118
|
+
},
|
|
119
|
+
error_rate: {
|
|
120
|
+
pct: errorPct,
|
|
121
|
+
impact: errorImpact,
|
|
122
|
+
},
|
|
123
|
+
escalations: {
|
|
124
|
+
count: escalations.length,
|
|
125
|
+
impact: escalationImpact,
|
|
126
|
+
},
|
|
127
|
+
budget_velocity: {
|
|
128
|
+
current_rate: budgetVelocityRate,
|
|
129
|
+
impact: budgetImpact,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
calculated_at: new Date().toISOString(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
getLeaderboard(actorIds: string[]): TrustScoreResult[] {
|
|
137
|
+
return actorIds
|
|
138
|
+
.map(id => this.calculate(id))
|
|
139
|
+
.sort((a, b) => b.score - a.score);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface TokenPricing {
|
|
2
|
+
input_per_token: number;
|
|
3
|
+
output_per_token: number;
|
|
4
|
+
/** Multiplier for cache creation tokens vs input price (default: 1.25) */
|
|
5
|
+
cache_creation_multiplier?: number;
|
|
6
|
+
/** Multiplier for cache read tokens vs input price (default: 0.1) */
|
|
7
|
+
cache_read_multiplier?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface BudgetConfig {
|
|
11
|
+
task_budget_usd?: number;
|
|
12
|
+
user_daily_budget_usd?: number;
|
|
13
|
+
user_monthly_budget_usd?: number;
|
|
14
|
+
workspace_daily_budget_usd?: number;
|
|
15
|
+
workspace_monthly_budget_usd?: number;
|
|
16
|
+
max_steps_per_task?: number;
|
|
17
|
+
max_retries_per_call?: number;
|
|
18
|
+
max_wall_clock_ms?: number;
|
|
19
|
+
cost_table?: Record<string, number>;
|
|
20
|
+
token_pricing?: Record<string, TokenPricing>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface BudgetState {
|
|
24
|
+
task_id: string;
|
|
25
|
+
workspace_id: string;
|
|
26
|
+
actor_id: string;
|
|
27
|
+
spent_usd: number;
|
|
28
|
+
steps: number;
|
|
29
|
+
started_at: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface CostEstimate {
|
|
33
|
+
tool_name: string;
|
|
34
|
+
capability: string;
|
|
35
|
+
estimated_cost_usd: number;
|
|
36
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { BudgetConfig } from './budget';
|
|
2
|
+
import { TracingConfig } from '../tracing';
|
|
3
|
+
import { AnomalyConfig } from '../anomaly';
|
|
4
|
+
import { OAuthConfig, FrontendConfig } from './user';
|
|
5
|
+
import { StripeConfig } from './stripe-config';
|
|
6
|
+
|
|
7
|
+
export interface GatewayConfig {
|
|
8
|
+
port: number;
|
|
9
|
+
host: string;
|
|
10
|
+
auth: AuthConfig;
|
|
11
|
+
policy: PolicyConfig;
|
|
12
|
+
dlp: DLPConfig;
|
|
13
|
+
budget: BudgetConfig;
|
|
14
|
+
audit: AuditConfig;
|
|
15
|
+
executor: ExecutorConfig;
|
|
16
|
+
approval: ApprovalConfig;
|
|
17
|
+
rate_limit?: RateLimitConfig;
|
|
18
|
+
tracing?: TracingConfig;
|
|
19
|
+
anomaly?: AnomalyConfig;
|
|
20
|
+
/** Rate limit for public endpoints (health, metrics). Default: 60 req/min */
|
|
21
|
+
public_rate_limit?: {
|
|
22
|
+
max_per_window: number;
|
|
23
|
+
window_ms: number;
|
|
24
|
+
};
|
|
25
|
+
/** Forward proxy configuration */
|
|
26
|
+
proxy?: ProxyConfig;
|
|
27
|
+
/** CORS allowed origins. Defaults to '*' in development, must be set in production. */
|
|
28
|
+
cors_origins?: string[];
|
|
29
|
+
/** OAuth configuration for SaaS login (Google/GitHub) */
|
|
30
|
+
oauth?: OAuthConfig;
|
|
31
|
+
/** Frontend SPA configuration */
|
|
32
|
+
frontend?: FrontendConfig;
|
|
33
|
+
/** Stripe billing configuration */
|
|
34
|
+
stripe?: StripeConfig;
|
|
35
|
+
/** MCP OAuth 2.0 configuration for Claude Code / MCP client auth */
|
|
36
|
+
mcp_oauth?: MCPOAuthConfig;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface MCPOAuthConfig {
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
/** Base URL for OAuth endpoints (default: derived from host + port) */
|
|
42
|
+
base_url?: string;
|
|
43
|
+
/** Access token TTL in seconds (default: 3600 = 1 hour) */
|
|
44
|
+
access_token_ttl?: number;
|
|
45
|
+
/** Refresh token TTL in seconds (default: 2592000 = 30 days) */
|
|
46
|
+
refresh_token_ttl?: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface AuthConfig {
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
|
|
52
|
+
// API Key auth (existing, enhanced)
|
|
53
|
+
api_keys: Record<string, ApiKeyConfig>;
|
|
54
|
+
|
|
55
|
+
// JWT/OIDC auth
|
|
56
|
+
jwt?: JWTAuthConfig;
|
|
57
|
+
|
|
58
|
+
// RBAC
|
|
59
|
+
rbac?: RBACConfig;
|
|
60
|
+
|
|
61
|
+
// Legacy field kept for backward compatibility
|
|
62
|
+
jwt_secret?: string;
|
|
63
|
+
|
|
64
|
+
/** Trusted proxy IPs/CIDRs. Only trust X-Forwarded-For from these sources. */
|
|
65
|
+
trusted_proxies?: string[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface ApiKeyConfig {
|
|
69
|
+
workspace_id: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
roles?: string[]; // Roles for RBAC
|
|
72
|
+
rate_limit_override?: number; // Per-key rate limit override
|
|
73
|
+
expires_at?: string; // ISO date, undefined = never expires
|
|
74
|
+
created_at?: string; // ISO date
|
|
75
|
+
last_used_at?: string; // ISO date, updated on use
|
|
76
|
+
revoked?: boolean; // Soft-revoke without deleting
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface JWTAuthConfig {
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
// Static secret (for simple setups)
|
|
82
|
+
secret?: string;
|
|
83
|
+
// JWKS endpoint (for OIDC providers like Auth0, Okta, etc.)
|
|
84
|
+
jwks_uri?: string;
|
|
85
|
+
// JWT validation options
|
|
86
|
+
issuer?: string; // Expected issuer
|
|
87
|
+
audience?: string; // Expected audience
|
|
88
|
+
algorithms?: string[]; // Allowed algorithms (default: ['RS256', 'HS256'])
|
|
89
|
+
// Claim mappings
|
|
90
|
+
workspace_claim?: string; // JWT claim for workspace_id (default: 'workspace_id')
|
|
91
|
+
roles_claim?: string; // JWT claim for roles (default: 'roles')
|
|
92
|
+
actor_claim?: string; // JWT claim for actor identity (default: 'sub')
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface RBACConfig {
|
|
96
|
+
enabled: boolean;
|
|
97
|
+
roles: Record<string, RoleDefinition>;
|
|
98
|
+
default_role?: string; // Role applied when no role is found
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface RoleDefinition {
|
|
102
|
+
description?: string;
|
|
103
|
+
permissions: Permission[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type Permission =
|
|
107
|
+
| 'tool:execute' // Can execute tool calls
|
|
108
|
+
| 'tool:execute:read' // Can execute read-only tool calls
|
|
109
|
+
| 'tool:execute:write' // Can execute write tool calls
|
|
110
|
+
| 'tool:execute:delete' // Can execute delete tool calls
|
|
111
|
+
| 'tool:execute:admin' // Can execute admin tool calls
|
|
112
|
+
| 'approval:manage' // Can approve/deny pending approvals
|
|
113
|
+
| 'policy:read' // Can view policies
|
|
114
|
+
| 'policy:write' // Can validate/update policies
|
|
115
|
+
| 'trace:read' // Can view audit traces
|
|
116
|
+
| 'admin:full' // Full admin access (everything)
|
|
117
|
+
| string; // Custom permissions
|
|
118
|
+
|
|
119
|
+
export interface PolicyConfig {
|
|
120
|
+
pack_path: string;
|
|
121
|
+
default_effect: 'ALLOW' | 'DENY';
|
|
122
|
+
hot_reload: boolean;
|
|
123
|
+
/** OPA policy engine configuration (optional, works alongside YAML engine) */
|
|
124
|
+
opa?: OPAConfig;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface OPAConfig {
|
|
128
|
+
enabled: boolean;
|
|
129
|
+
/** OPA server URL (e.g., 'http://localhost:8181') */
|
|
130
|
+
server_url?: string;
|
|
131
|
+
/** Policy path in OPA (e.g., 'v1/data/palaryn/policy') */
|
|
132
|
+
policy_path?: string;
|
|
133
|
+
/** Rego policy string (for inline/local evaluation without OPA server) */
|
|
134
|
+
rego_policy?: string;
|
|
135
|
+
/** Timeout for OPA requests in ms (default: 5000) */
|
|
136
|
+
timeout_ms?: number;
|
|
137
|
+
/** Fallback decision if OPA is unreachable (default: 'deny') */
|
|
138
|
+
fallback_decision?: 'allow' | 'deny' | 'transform' | 'require_approval';
|
|
139
|
+
/** Default Rego package name for inline policies (default: 'palaryn.policy') */
|
|
140
|
+
package_name?: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface DLPConfig {
|
|
144
|
+
enabled: boolean;
|
|
145
|
+
scan_args: boolean;
|
|
146
|
+
scan_output: boolean;
|
|
147
|
+
secrets_detection: boolean;
|
|
148
|
+
pii_detection: boolean;
|
|
149
|
+
prompt_injection_detection?: boolean;
|
|
150
|
+
/** Action when prompt injection is detected: 'log' (default), 'flag', or 'block' */
|
|
151
|
+
prompt_injection_action?: 'log' | 'flag' | 'block';
|
|
152
|
+
/** Minimum severity to trigger blocking (when action is 'block'). Default: 'high' */
|
|
153
|
+
prompt_injection_block_threshold?: 'medium' | 'high';
|
|
154
|
+
/** Response mode when injection is blocked: 'deny' (default), 'sanitize', or 'require_approval' */
|
|
155
|
+
prompt_injection_response?: 'deny' | 'sanitize' | 'require_approval';
|
|
156
|
+
default_redaction_method: 'mask' | 'hash' | 'drop' | 'tokenize';
|
|
157
|
+
trufflehog?: {
|
|
158
|
+
enabled: boolean;
|
|
159
|
+
binary_path?: string;
|
|
160
|
+
timeout_ms?: number;
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface AuditConfig {
|
|
165
|
+
enabled: boolean;
|
|
166
|
+
log_dir: string;
|
|
167
|
+
console_output: boolean;
|
|
168
|
+
retention_days: number;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export interface FilesystemExecutorConfig {
|
|
172
|
+
enabled: boolean;
|
|
173
|
+
/** Root directory for sandboxed file operations */
|
|
174
|
+
base_dir: string;
|
|
175
|
+
/** Allowed file extensions (e.g., ['.txt', '.json']). Empty = all allowed. */
|
|
176
|
+
allowed_extensions?: string[];
|
|
177
|
+
/** Maximum file size in bytes (default: 10MB) */
|
|
178
|
+
max_file_size_bytes: number;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface SQLExecutorConfig {
|
|
182
|
+
enabled: boolean;
|
|
183
|
+
/** PostgreSQL connection string */
|
|
184
|
+
connection_string: string;
|
|
185
|
+
/** Query timeout in milliseconds (default: 30000) */
|
|
186
|
+
timeout_ms: number;
|
|
187
|
+
/** If true, only SELECT statements are allowed (default: true) */
|
|
188
|
+
read_only: boolean;
|
|
189
|
+
/** Maximum number of rows returned (default: 1000) */
|
|
190
|
+
max_rows: number;
|
|
191
|
+
/** Table names to block from all queries */
|
|
192
|
+
blocked_tables?: string[];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export interface ShellExecutorConfig {
|
|
196
|
+
enabled: boolean;
|
|
197
|
+
/** Allowed commands (empty = nothing allowed) */
|
|
198
|
+
allowed_commands: string[];
|
|
199
|
+
/** Blocked commands/patterns (checked even if allowed) */
|
|
200
|
+
blocked_commands?: string[];
|
|
201
|
+
/** Command timeout in milliseconds (default: 30000) */
|
|
202
|
+
timeout_ms: number;
|
|
203
|
+
/** Working directory for command execution */
|
|
204
|
+
cwd?: string;
|
|
205
|
+
/** Maximum output size in bytes (default: 1MB) */
|
|
206
|
+
max_output_bytes: number;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export interface WebSocketExecutorConfig {
|
|
210
|
+
enabled: boolean;
|
|
211
|
+
/** Allowed WebSocket URLs (glob patterns) */
|
|
212
|
+
allowed_urls: string[];
|
|
213
|
+
/** Connection timeout in milliseconds (default: 10000) */
|
|
214
|
+
connect_timeout_ms: number;
|
|
215
|
+
/** Maximum message size in bytes (default: 1MB) */
|
|
216
|
+
max_message_size_bytes: number;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface ProviderInterceptConfig {
|
|
220
|
+
enabled: boolean;
|
|
221
|
+
/** URL patterns for AI provider APIs to intercept (regex strings) */
|
|
222
|
+
provider_url_patterns?: string[];
|
|
223
|
+
/** Scan tool inputs in request bodies */
|
|
224
|
+
scan_inputs: boolean;
|
|
225
|
+
/** Scan tool outputs in response bodies */
|
|
226
|
+
scan_outputs: boolean;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface ExecutorConfig {
|
|
230
|
+
http: {
|
|
231
|
+
timeout_ms: number;
|
|
232
|
+
max_retries: number;
|
|
233
|
+
backoff_base_ms: number;
|
|
234
|
+
};
|
|
235
|
+
cache: {
|
|
236
|
+
enabled: boolean;
|
|
237
|
+
ttl_ms: number;
|
|
238
|
+
};
|
|
239
|
+
filesystem?: FilesystemExecutorConfig;
|
|
240
|
+
sql?: SQLExecutorConfig;
|
|
241
|
+
shell?: ShellExecutorConfig;
|
|
242
|
+
websocket?: WebSocketExecutorConfig;
|
|
243
|
+
provider_intercept?: ProviderInterceptConfig;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export interface ApprovalConfig {
|
|
247
|
+
enabled: boolean;
|
|
248
|
+
token_secret: string;
|
|
249
|
+
default_ttl_seconds: number;
|
|
250
|
+
webhook_url?: string;
|
|
251
|
+
webhook_headers?: Record<string, string>;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export interface RateLimitConfig {
|
|
255
|
+
enabled: boolean;
|
|
256
|
+
/** Max requests per actor per window */
|
|
257
|
+
actor_max_per_window: number;
|
|
258
|
+
/** Max requests per workspace per window */
|
|
259
|
+
workspace_max_per_window: number;
|
|
260
|
+
/** Window duration in milliseconds */
|
|
261
|
+
window_ms: number;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export interface ProxyConfig {
|
|
265
|
+
enabled: boolean;
|
|
266
|
+
/** Port for the forward proxy server (default: 3128) */
|
|
267
|
+
port: number;
|
|
268
|
+
/** Domains to skip proxy pipeline for (e.g. palaryn's own domain) */
|
|
269
|
+
passthrough_domains?: string[];
|
|
270
|
+
/** Default workspace ID for sidecar mode (no per-request auth needed) */
|
|
271
|
+
default_workspace_id?: string;
|
|
272
|
+
/** Default actor ID for sidecar mode */
|
|
273
|
+
default_actor_id?: string;
|
|
274
|
+
/** Require Proxy-Authorization for every request (default: true unless sidecar defaults set) */
|
|
275
|
+
require_auth?: boolean;
|
|
276
|
+
/** Enable SSRF protection to block requests to private IPs (default: true) */
|
|
277
|
+
ssrf_protection?: boolean;
|
|
278
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type EventType =
|
|
2
|
+
| 'TOOL_CALL_RECEIVED'
|
|
3
|
+
| 'POLICY_DECIDED'
|
|
4
|
+
| 'DLP_SCANNED'
|
|
5
|
+
| 'BUDGET_CHECKED'
|
|
6
|
+
| 'TOOL_EXECUTED'
|
|
7
|
+
| 'TOOL_RESULT_RETURNED'
|
|
8
|
+
| 'APPROVAL_REQUESTED'
|
|
9
|
+
| 'APPROVAL_APPROVED'
|
|
10
|
+
| 'APPROVAL_DENIED'
|
|
11
|
+
| 'APPROVAL_EXPIRED'
|
|
12
|
+
| 'INCIDENT_RAISED'
|
|
13
|
+
| 'USAGE_REPORTED'
|
|
14
|
+
| 'POLICY_UPDATED'
|
|
15
|
+
| 'POLICY_RESET';
|
|
16
|
+
|
|
17
|
+
export type IncidentSeverity = 'low' | 'medium' | 'high' | 'critical';
|
|
18
|
+
|
|
19
|
+
export interface AuditEvent {
|
|
20
|
+
event_id: string;
|
|
21
|
+
event_type: EventType;
|
|
22
|
+
timestamp: string;
|
|
23
|
+
tool_call_id: string;
|
|
24
|
+
session_id?: string;
|
|
25
|
+
task_id: string;
|
|
26
|
+
workspace_id: string;
|
|
27
|
+
actor_id: string;
|
|
28
|
+
tool_name: string;
|
|
29
|
+
metadata: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface IncidentEvent extends AuditEvent {
|
|
33
|
+
event_type: 'INCIDENT_RAISED';
|
|
34
|
+
metadata: {
|
|
35
|
+
severity: IncidentSeverity;
|
|
36
|
+
incident_type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
recommended_action: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { User, Session } from './user';
|
|
2
|
+
|
|
3
|
+
declare module 'express-serve-static-core' {
|
|
4
|
+
interface Request {
|
|
5
|
+
/** Workspace ID set by auth middleware (backward compat) */
|
|
6
|
+
workspace_id?: string;
|
|
7
|
+
/** API key description set by auth middleware */
|
|
8
|
+
api_key_description?: string;
|
|
9
|
+
/** Authenticated user (set by session middleware) */
|
|
10
|
+
sessionUser?: User;
|
|
11
|
+
/** Session data (set by session middleware) */
|
|
12
|
+
sessionData?: Session;
|
|
13
|
+
}
|
|
14
|
+
}
|