@highflame/overwatch 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +337 -0
- package/bin/overwatch +12 -0
- package/dist/auth/cli-oauth.d.ts +13 -0
- package/dist/auth/cli-oauth.d.ts.map +1 -0
- package/dist/auth/html-utils.d.ts +20 -0
- package/dist/auth/html-utils.d.ts.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/oauth.d.ts +81 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/pkce.d.ts +26 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/token-store.d.ts +44 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/bin/overwatch +12 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5449 -0
- package/dist/cli.js.map +7 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/manager.d.ts +54 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/daemon.d.ts +11 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +6004 -0
- package/dist/daemon.js.map +7 -0
- package/dist/data/ingestor.d.ts +31 -0
- package/dist/data/ingestor.d.ts.map +1 -0
- package/dist/data/processor.d.ts +96 -0
- package/dist/data/processor.d.ts.map +1 -0
- package/dist/data/reader.d.ts +24 -0
- package/dist/data/reader.d.ts.map +1 -0
- package/dist/data/recorder.d.ts +12 -0
- package/dist/data/recorder.d.ts.map +1 -0
- package/dist/engines/cedar.d.ts +41 -0
- package/dist/engines/cedar.d.ts.map +1 -0
- package/dist/engines/remote.d.ts +21 -0
- package/dist/engines/remote.d.ts.map +1 -0
- package/dist/engines/yara.d.ts +12 -0
- package/dist/engines/yara.d.ts.map +1 -0
- package/dist/handlers/dashboard-handler.d.ts +7 -0
- package/dist/handlers/dashboard-handler.d.ts.map +1 -0
- package/dist/handlers/hook-handler.d.ts +23 -0
- package/dist/handlers/hook-handler.d.ts.map +1 -0
- package/dist/handlers/oauth-handler.d.ts +12 -0
- package/dist/handlers/oauth-handler.d.ts.map +1 -0
- package/dist/handlers/scan-handler.d.ts +13 -0
- package/dist/handlers/scan-handler.d.ts.map +1 -0
- package/dist/handlers/utils.d.ts +11 -0
- package/dist/handlers/utils.d.ts.map +1 -0
- package/dist/hooks/claudecode/hooks.json.template +20 -0
- package/dist/hooks/cursor/hooks.json.template +74 -0
- package/dist/hooks/universal-hook.sh +36 -0
- package/dist/http/server.d.ts +38 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5941 -0
- package/dist/index.js.map +7 -0
- package/dist/installer.d.ts +25 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/javelin/admin-client.d.ts +75 -0
- package/dist/javelin/admin-client.d.ts.map +1 -0
- package/dist/javelin/client.d.ts +30 -0
- package/dist/javelin/client.d.ts.map +1 -0
- package/dist/javelin/config-reader.d.ts +70 -0
- package/dist/javelin/config-reader.d.ts.map +1 -0
- package/dist/javelin/index.d.ts +5 -0
- package/dist/javelin/index.d.ts.map +1 -0
- package/dist/javelin/types.d.ts +81 -0
- package/dist/javelin/types.d.ts.map +1 -0
- package/dist/lib/policy-engine.d.ts +34 -0
- package/dist/lib/policy-engine.d.ts.map +1 -0
- package/dist/lib/policy-manager.d.ts +86 -0
- package/dist/lib/policy-manager.d.ts.map +1 -0
- package/dist/module.d.ts +52 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/pipeline/context-mapper.d.ts +16 -0
- package/dist/pipeline/context-mapper.d.ts.map +1 -0
- package/dist/pipeline/extractors/claude-extractor.d.ts +48 -0
- package/dist/pipeline/extractors/claude-extractor.d.ts.map +1 -0
- package/dist/pipeline/extractors/cursor-extractor.d.ts +44 -0
- package/dist/pipeline/extractors/cursor-extractor.d.ts.map +1 -0
- package/dist/pipeline/extractors/github-copilot-extractor.d.ts +49 -0
- package/dist/pipeline/extractors/github-copilot-extractor.d.ts.map +1 -0
- package/dist/pipeline/extractors/index.d.ts +47 -0
- package/dist/pipeline/extractors/index.d.ts.map +1 -0
- package/dist/pipeline/extractors/registry.d.ts +38 -0
- package/dist/pipeline/extractors/registry.d.ts.map +1 -0
- package/dist/pipeline/hook-pipeline.d.ts +25 -0
- package/dist/pipeline/hook-pipeline.d.ts.map +1 -0
- package/dist/policy.cedar +783 -0
- package/dist/rules/pre/command_injection.yar +60 -0
- package/dist/rules/pre/cross_origin_escalation.yar +106 -0
- package/dist/rules/pre/mcp_config_risk.yar +35 -0
- package/dist/rules/pre/path_traversal.yar +50 -0
- package/dist/rules/pre/prompt_injection.yar +101 -0
- package/dist/rules/pre/secrets_leakage.yar +100 -0
- package/dist/rules/pre/sql_injection.yar +65 -0
- package/dist/scanner.d.ts +80 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/service.d.ts +18 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/services/interface.d.ts +11 -0
- package/dist/services/interface.d.ts.map +1 -0
- package/dist/services/launchd.d.ts +12 -0
- package/dist/services/launchd.d.ts.map +1 -0
- package/dist/services/systemd.d.ts +12 -0
- package/dist/services/systemd.d.ts.map +1 -0
- package/dist/services/windows.d.ts +7 -0
- package/dist/services/windows.d.ts.map +1 -0
- package/dist/skills/index.d.ts +7 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/scanner.d.ts +44 -0
- package/dist/skills/scanner.d.ts.map +1 -0
- package/dist/skills/types.d.ts +29 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/types/config.d.ts +165 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/events.d.ts +225 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/remote-policy.d.ts +129 -0
- package/dist/types/remote-policy.d.ts.map +1 -0
- package/dist/types/requests.d.ts +45 -0
- package/dist/types/requests.d.ts.map +1 -0
- package/dist/types/responses.d.ts +60 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/ui/images/highflame-mono.png +0 -0
- package/dist/ui/views/dashboard.ejs +301 -0
- package/dist/ui/views/dashboard.js +785 -0
- package/dist/ui/views/partials/commands-table.ejs +54 -0
- package/dist/ui/views/partials/events-table.ejs +36 -0
- package/dist/ui/views/partials/filter-dropdown.ejs +12 -0
- package/dist/ui/views/partials/overview-charts.ejs +149 -0
- package/dist/ui/views/partials/scans-table.ejs +136 -0
- package/dist/ui/views/partials/sessions-table.ejs +50 -0
- package/dist/ui/views/partials/stats-grid.ejs +23 -0
- package/dist/ui/views/partials/threats-table.ejs +60 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +28 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/performance.d.ts +26 -0
- package/dist/utils/performance.d.ts.map +1 -0
- package/dist/utils/port-manager.d.ts +6 -0
- package/dist/utils/port-manager.d.ts.map +1 -0
- package/dist/yara/engine.d.ts +58 -0
- package/dist/yara/engine.d.ts.map +1 -0
- package/dist/yara/index.d.ts +5 -0
- package/dist/yara/index.d.ts.map +1 -0
- package/lib/platform-loader.js +210 -0
- package/package.json +63 -0
- package/scripts/postinstall.js +121 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback to resolve application ID from a record
|
|
3
|
+
* Returns the application UUID for the x-javelin-application header
|
|
4
|
+
*/
|
|
5
|
+
export type ApplicationIdResolver<T> = (record: T) => string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Generic admin API ingestor with retry support
|
|
8
|
+
* Sends records to configurable admin API endpoints
|
|
9
|
+
*/
|
|
10
|
+
export declare class AdminIngestor<T> {
|
|
11
|
+
private baseUrl;
|
|
12
|
+
private token;
|
|
13
|
+
private endpoint;
|
|
14
|
+
private pendingFile;
|
|
15
|
+
private deadLetterFile;
|
|
16
|
+
private retryTimer;
|
|
17
|
+
private applicationIdResolver;
|
|
18
|
+
constructor(baseUrl: string, token: string, endpoint: string, applicationIdResolver?: ApplicationIdResolver<T>);
|
|
19
|
+
start(): void;
|
|
20
|
+
stop(): void;
|
|
21
|
+
/** Fire-and-forget record ingestion */
|
|
22
|
+
ingest(record: T): void;
|
|
23
|
+
private send;
|
|
24
|
+
private saveForRetry;
|
|
25
|
+
private processQueue;
|
|
26
|
+
private loadPending;
|
|
27
|
+
private savePending;
|
|
28
|
+
private moveToDeadLetter;
|
|
29
|
+
private ensureDir;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ingestor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestor.d.ts","sourceRoot":"","sources":["../../src/data/ingestor.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAC;AAEpE;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,qBAAqB,CAAyC;gBAGpE,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC;IA2BlD,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;IAQZ,uCAAuC;IACvC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;YA2BT,IAAI;IA+DlB,OAAO,CAAC,YAAY;YAuBN,YAAY;IAiF1B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,SAAS;CAIlB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { EventRecord, ScanRecord } from "./reader";
|
|
2
|
+
export interface DashboardData {
|
|
3
|
+
stats: {
|
|
4
|
+
totalEvents: number;
|
|
5
|
+
blockedCalls: number;
|
|
6
|
+
totalThreats: number;
|
|
7
|
+
serversScanned: number;
|
|
8
|
+
activeSessions: number;
|
|
9
|
+
};
|
|
10
|
+
installation: {
|
|
11
|
+
cursor: {
|
|
12
|
+
installed: boolean;
|
|
13
|
+
version?: string;
|
|
14
|
+
lastSeen?: string;
|
|
15
|
+
};
|
|
16
|
+
claudecode: {
|
|
17
|
+
installed: boolean;
|
|
18
|
+
version?: string;
|
|
19
|
+
lastSeen?: string;
|
|
20
|
+
};
|
|
21
|
+
github_copilot: {
|
|
22
|
+
installed: boolean;
|
|
23
|
+
version?: string;
|
|
24
|
+
lastSeen?: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
activityTimeline: Array<{
|
|
28
|
+
date: string;
|
|
29
|
+
cursor: number;
|
|
30
|
+
claude: number;
|
|
31
|
+
github_copilot: number;
|
|
32
|
+
}>;
|
|
33
|
+
sessions: Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
source: string;
|
|
36
|
+
startTime: string;
|
|
37
|
+
eventCount: number;
|
|
38
|
+
threatCount: number;
|
|
39
|
+
allowed: boolean;
|
|
40
|
+
events: EventRecord[];
|
|
41
|
+
}>;
|
|
42
|
+
threats: Array<{
|
|
43
|
+
id: string;
|
|
44
|
+
timestamp: string;
|
|
45
|
+
source: string;
|
|
46
|
+
rule: string;
|
|
47
|
+
severity: string;
|
|
48
|
+
category: string;
|
|
49
|
+
content?: string;
|
|
50
|
+
rawEvent: EventRecord;
|
|
51
|
+
}>;
|
|
52
|
+
commands: Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
timestamp: string;
|
|
55
|
+
source: string;
|
|
56
|
+
command: string;
|
|
57
|
+
risk: "critical" | "high" | "medium" | "low";
|
|
58
|
+
reason: string;
|
|
59
|
+
allowed: boolean;
|
|
60
|
+
rawEvent: EventRecord;
|
|
61
|
+
}>;
|
|
62
|
+
topCursorHooks: Array<{
|
|
63
|
+
event: string;
|
|
64
|
+
count: number;
|
|
65
|
+
}>;
|
|
66
|
+
topClaudeTools: Array<{
|
|
67
|
+
tool: string;
|
|
68
|
+
count: number;
|
|
69
|
+
}>;
|
|
70
|
+
topGitHubCopilotHooks: Array<{
|
|
71
|
+
event: string;
|
|
72
|
+
count: number;
|
|
73
|
+
}>;
|
|
74
|
+
events: EventRecord[];
|
|
75
|
+
scans: Array<{
|
|
76
|
+
id: string;
|
|
77
|
+
timestamp: string;
|
|
78
|
+
source?: string;
|
|
79
|
+
total_servers: number;
|
|
80
|
+
total_issues: number;
|
|
81
|
+
max_severity?: string;
|
|
82
|
+
servers: Array<{
|
|
83
|
+
server_name: string;
|
|
84
|
+
url?: string;
|
|
85
|
+
issues: Array<{
|
|
86
|
+
severity: string;
|
|
87
|
+
rule_name?: string;
|
|
88
|
+
description?: string;
|
|
89
|
+
target_type?: string;
|
|
90
|
+
status?: string;
|
|
91
|
+
}>;
|
|
92
|
+
}>;
|
|
93
|
+
}>;
|
|
94
|
+
}
|
|
95
|
+
export declare function processDashboardData(events: EventRecord[], scans: ScanRecord[]): DashboardData;
|
|
96
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/data/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HookEventRecord } from "../types";
|
|
2
|
+
export type EventRecord = HookEventRecord & {
|
|
3
|
+
blocked_reason?: string;
|
|
4
|
+
guardrail?: {
|
|
5
|
+
called: boolean;
|
|
6
|
+
engine?: string;
|
|
7
|
+
duration_ms?: number;
|
|
8
|
+
response?: any;
|
|
9
|
+
threats?: string[];
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export interface ScanRecord {
|
|
14
|
+
id: string;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
source?: string;
|
|
17
|
+
total_servers: number;
|
|
18
|
+
total_issues: number;
|
|
19
|
+
max_severity?: string;
|
|
20
|
+
raw?: any;
|
|
21
|
+
}
|
|
22
|
+
export declare function readEvents(): EventRecord[];
|
|
23
|
+
export declare function readScans(): ScanRecord[];
|
|
24
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/data/reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAO3C,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,wBAAgB,UAAU,IAAI,WAAW,EAAE,CA4B1C;AAED,wBAAgB,SAAS,IAAI,UAAU,EAAE,CA4BxC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HookEventRecord, IDESource, DetectionResult, ThreatSummary, PolicyDecision, HookEvent, OverwatchEvent } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Record a hook event with the new evaluation structure
|
|
4
|
+
* - evaluations: Detection engine results (YARA, Javelin)
|
|
5
|
+
* - threat_summary: Aggregated threat data
|
|
6
|
+
* - decision: Cedar policy decision (separate from evaluations)
|
|
7
|
+
*
|
|
8
|
+
* Requires overwatchEvent - all recorded events must go through extractors.
|
|
9
|
+
* Returns the recorded event for ingestion to admin API.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordEvent(source: IDESource, event: HookEvent, response: Record<string, unknown>, evaluations: DetectionResult[], threatSummary: ThreatSummary, decision: PolicyDecision, finalAllowed: boolean, totalDuration: number, overwatchEvent: OverwatchEvent, contentLength?: number): HookEventRecord;
|
|
12
|
+
//# sourceMappingURL=recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/data/recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,SAAS,EACT,eAAe,EACf,aAAa,EACb,cAAc,EAEd,SAAS,EACT,cAAc,EACf,MAAM,UAAU,CAAC;AAgBlB;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,WAAW,EAAE,eAAe,EAAE,EAC9B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CA0DjB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { PolicyEngine } from "../lib/policy-engine";
|
|
2
|
+
import { PolicyDecision, PolicyMetadata } from "../types";
|
|
3
|
+
export interface CedarContext {
|
|
4
|
+
principalType: string;
|
|
5
|
+
principalId: string;
|
|
6
|
+
action: string;
|
|
7
|
+
resourceType: string;
|
|
8
|
+
resourceId: string;
|
|
9
|
+
contextData: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Threat context passed to Cedar for decision making
|
|
13
|
+
*/
|
|
14
|
+
export interface ThreatContext {
|
|
15
|
+
threats_detected: number;
|
|
16
|
+
highest_severity: string;
|
|
17
|
+
categories: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse Cedar policy content to extract policy metadata from comments.
|
|
21
|
+
* Cedar uses @compliance_id, @description, @severity, @category, @frameworks annotations.
|
|
22
|
+
*
|
|
23
|
+
* Returns a mapping from policy index (policy0, policy1, etc.) to PolicyMetadata.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parsePolicyContent(policyContent: string): Record<string, PolicyMetadata>;
|
|
26
|
+
export declare class CedarExecutor {
|
|
27
|
+
private engine;
|
|
28
|
+
private policyMetadata;
|
|
29
|
+
constructor(engine: PolicyEngine | undefined, policyContent?: string);
|
|
30
|
+
/**
|
|
31
|
+
* Update policy metadata (e.g., when policy content changes)
|
|
32
|
+
*/
|
|
33
|
+
updatePolicyContent(policyContent: string): void;
|
|
34
|
+
isAvailable(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Run Cedar policy evaluation
|
|
37
|
+
* Returns PolicyDecision (separate from detection results)
|
|
38
|
+
*/
|
|
39
|
+
run(ctx: CedarContext, threatContext: ThreatContext): Promise<PolicyDecision>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=cedar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cedar.d.ts","sourceRoot":"","sources":["../../src/engines/cedar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AAG/E,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA2HhC;AAwDD,qBAAa,aAAa;IAItB,OAAO,CAAC,MAAM;IAHhB,OAAO,CAAC,cAAc,CAAsC;gBAGlD,MAAM,EAAE,YAAY,GAAG,SAAS,EACxC,aAAa,CAAC,EAAE,MAAM;IAWxB;;OAEG;IACH,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAOhD,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,GAAG,CACP,GAAG,EAAE,YAAY,EACjB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,cAAc,CAAC;CA+E3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { JavelinClient } from "../javelin";
|
|
2
|
+
import { DetectionResult, IDESource } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Callback to resolve application ID from IDE source
|
|
5
|
+
*/
|
|
6
|
+
export type ApplicationIdResolver = (source: IDESource) => string | null;
|
|
7
|
+
export declare class RemoteExecutor {
|
|
8
|
+
private clients;
|
|
9
|
+
private applicationIdResolver;
|
|
10
|
+
constructor(clients: Map<IDESource, JavelinClient>, applicationIdResolver?: ApplicationIdResolver);
|
|
11
|
+
/**
|
|
12
|
+
* Update the application ID resolver
|
|
13
|
+
*/
|
|
14
|
+
setApplicationIdResolver(resolver: ApplicationIdResolver): void;
|
|
15
|
+
/**
|
|
16
|
+
* Run remote guardrails validation
|
|
17
|
+
* Returns DetectionResult (no decision field - that's for Cedar)
|
|
18
|
+
*/
|
|
19
|
+
run(source: IDESource, content: string, event: string, guardrailConfig: string, metadata: Record<string, unknown>): Promise<DetectionResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/engines/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAmB,SAAS,EAAE,MAAM,UAAU,CAAC;AAGvE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC;AAEzE,qBAAa,cAAc;IAIvB,OAAO,CAAC,OAAO;IAHjB,OAAO,CAAC,qBAAqB,CAAsC;gBAGzD,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,EAC9C,qBAAqB,CAAC,EAAE,qBAAqB;IAK/C;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAI/D;;;OAGG;IACG,GAAG,CACP,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;CA6D5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { YaraEngine as CoreYaraEngine } from "../yara";
|
|
2
|
+
import { DetectionResult } from "../types";
|
|
3
|
+
export declare class YaraExecutor {
|
|
4
|
+
private engine;
|
|
5
|
+
constructor(engine: CoreYaraEngine);
|
|
6
|
+
/**
|
|
7
|
+
* Run YARA scan on content
|
|
8
|
+
* Returns DetectionResult (no decision field - that's for Cedar)
|
|
9
|
+
*/
|
|
10
|
+
run(content: string): Promise<DetectionResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=yara.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yara.d.ts","sourceRoot":"","sources":["../../src/engines/yara.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,cAAc,EAAiB,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,eAAe,EAAmB,MAAM,UAAU,CAAC;AA8D5D,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;;OAGG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAkErD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
export declare class DashboardHandler {
|
|
3
|
+
handle(_req: http.IncomingMessage, res: http.ServerResponse): void;
|
|
4
|
+
handleJs(_req: http.IncomingMessage, res: http.ServerResponse): void;
|
|
5
|
+
handleImage(req: http.IncomingMessage, res: http.ServerResponse): void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=dashboard-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/dashboard-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;IAgGlE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;IA4CpE,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI;CAiFvE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
import { HookEventRecord } from "../types";
|
|
3
|
+
import { HookPipeline } from "../pipeline/hook-pipeline";
|
|
4
|
+
import { AdminIngestor } from "../data/ingestor";
|
|
5
|
+
export declare class HookHandler {
|
|
6
|
+
private pipeline;
|
|
7
|
+
private ingestor;
|
|
8
|
+
private eventCount;
|
|
9
|
+
private onProjectSkillsScan?;
|
|
10
|
+
constructor(pipeline: HookPipeline, ingestor: AdminIngestor<HookEventRecord> | null);
|
|
11
|
+
/**
|
|
12
|
+
* Set callback for project skills scanning
|
|
13
|
+
*/
|
|
14
|
+
setProjectSkillsScanCallback(callback: (workspace: string) => void): void;
|
|
15
|
+
getEventCount(): number;
|
|
16
|
+
handle(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Extract workspace path from event body
|
|
19
|
+
* Checks workspace_roots array first, then common fields: cwd, workingDirectory, workspace
|
|
20
|
+
*/
|
|
21
|
+
private extractWorkspace;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=hook-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/hook-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAwB,eAAe,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,mBAAmB,CAAC,CAA8B;gBAGhD,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,IAAI;IAGzD;;OAEG;IACH,4BAA4B,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIzE,aAAa,IAAI,MAAM;IAIjB,MAAM,CACV,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAsEhB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAkCzB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
import { OAuthState } from "../auth";
|
|
3
|
+
export declare class OAuthHandler {
|
|
4
|
+
private port;
|
|
5
|
+
private pendingOAuthStates;
|
|
6
|
+
private oauthStateTimeout;
|
|
7
|
+
constructor(port: number, pendingOAuthStates: Map<string, OAuthState>, oauthStateTimeout: number);
|
|
8
|
+
handleStart(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
9
|
+
handleCallback(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
10
|
+
handleStatus(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=oauth-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/oauth-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAML,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,qBAAa,YAAY;IAErB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,iBAAiB;gBAFjB,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC3C,iBAAiB,EAAE,MAAM;IAG7B,WAAW,CACf,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAmCV,cAAc,CAClB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAmEV,YAAY,CAChB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;CA8BjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
import { ScanRecord } from "../types";
|
|
3
|
+
import { MCPScanner } from "../scanner";
|
|
4
|
+
import { AdminIngestor } from "../data/ingestor";
|
|
5
|
+
export declare class ScanHandler {
|
|
6
|
+
private scanner;
|
|
7
|
+
private ingestor;
|
|
8
|
+
constructor(scanner: MCPScanner, ingestor: AdminIngestor<ScanRecord> | null);
|
|
9
|
+
handle(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
|
|
10
|
+
runInitialScan(): Promise<void>;
|
|
11
|
+
private recordScan;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=scan-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/scan-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAK7B,OAAO,EAAa,UAAU,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,qBAAa,WAAW;IAEpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI;IAG9C,MAAM,CACV,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAgCV,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC,OAAO,CAAC,UAAU;CA6EnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
/**
|
|
3
|
+
* Parse JSON body from HTTP request
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseBody(req: http.IncomingMessage): Promise<Record<string, unknown>>;
|
|
6
|
+
/**
|
|
7
|
+
* Get guardrail config name based on hook type
|
|
8
|
+
*/
|
|
9
|
+
export declare function getGuardrailConfig(event: string): string;
|
|
10
|
+
export declare function getDefaultResponse(event: string): Record<string, unknown>;
|
|
11
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/handlers/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;GAEG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,IAAI,CAAC,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAelC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmCxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCzE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"UserPromptSubmit": [
|
|
3
|
+
{
|
|
4
|
+
"command": "~/.overwatch/universal-hook.sh claudecode UserPromptSubmit",
|
|
5
|
+
"timeout": 10000
|
|
6
|
+
}
|
|
7
|
+
],
|
|
8
|
+
"PreToolUse": [
|
|
9
|
+
{
|
|
10
|
+
"command": "~/.overwatch/universal-hook.sh claudecode PreToolUse",
|
|
11
|
+
"timeout": 10000
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"PostToolUse": [
|
|
15
|
+
{
|
|
16
|
+
"command": "~/.overwatch/universal-hook.sh claudecode PostToolUse",
|
|
17
|
+
"timeout": 5000
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"beforeSubmitPrompt": [
|
|
3
|
+
{
|
|
4
|
+
"command": "~/.overwatch/universal-hook.sh cursor beforeSubmitPrompt",
|
|
5
|
+
"timeout": 10000
|
|
6
|
+
}
|
|
7
|
+
],
|
|
8
|
+
"beforeShellExecution": [
|
|
9
|
+
{
|
|
10
|
+
"command": "~/.overwatch/universal-hook.sh cursor beforeShellExecution",
|
|
11
|
+
"timeout": 10000
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"beforeMCPExecution": [
|
|
15
|
+
{
|
|
16
|
+
"command": "~/.overwatch/universal-hook.sh cursor beforeMCPExecution",
|
|
17
|
+
"timeout": 10000
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"beforeTabFileRead": [
|
|
21
|
+
{
|
|
22
|
+
"command": "~/.overwatch/universal-hook.sh cursor beforeTabFileRead",
|
|
23
|
+
"timeout": 10000
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"beforeReadFile": [
|
|
27
|
+
{
|
|
28
|
+
"command": "~/.overwatch/universal-hook.sh cursor beforeReadFile",
|
|
29
|
+
"timeout": 10000
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"afterShellExecution": [
|
|
33
|
+
{
|
|
34
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterShellExecution",
|
|
35
|
+
"timeout": 5000
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"afterMCPExecution": [
|
|
39
|
+
{
|
|
40
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterMCPExecution",
|
|
41
|
+
"timeout": 5000
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"afterFileEdit": [
|
|
45
|
+
{
|
|
46
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterFileEdit",
|
|
47
|
+
"timeout": 5000
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"afterTabFileEdit": [
|
|
51
|
+
{
|
|
52
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterTabFileEdit",
|
|
53
|
+
"timeout": 5000
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"afterAgentResponse": [
|
|
57
|
+
{
|
|
58
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterAgentResponse",
|
|
59
|
+
"timeout": 5000
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"afterAgentThought": [
|
|
63
|
+
{
|
|
64
|
+
"command": "~/.overwatch/universal-hook.sh cursor afterAgentThought",
|
|
65
|
+
"timeout": 5000
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"stop": [
|
|
69
|
+
{
|
|
70
|
+
"command": "~/.overwatch/universal-hook.sh cursor stop",
|
|
71
|
+
"timeout": 5000
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Overwatch Universal Hook Adapter
|
|
3
|
+
# This script handles communication between AI tools and the Guardian daemon.
|
|
4
|
+
# Usage: ./universal-hook.sh <source> <event> <default_json>
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
IDE_SOURCE=$1
|
|
9
|
+
HOOK_EVENT=$2
|
|
10
|
+
DEFAULT_RESPONSE=${3:-"{}"}
|
|
11
|
+
|
|
12
|
+
# Read guardian port from discovery file
|
|
13
|
+
GUARDIAN_PORT_FILE="$HOME/.overwatch/guardian_port"
|
|
14
|
+
|
|
15
|
+
# 1. Port Discovery
|
|
16
|
+
if [ ! -f "$GUARDIAN_PORT_FILE" ]; then
|
|
17
|
+
echo "$DEFAULT_RESPONSE"
|
|
18
|
+
exit 0
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
GUARDIAN_PORT=$(cat "$GUARDIAN_PORT_FILE" 2>/dev/null || echo "17580")
|
|
22
|
+
ENDPOINT="http://127.0.0.1:${GUARDIAN_PORT}/hook/${IDE_SOURCE}/${HOOK_EVENT}"
|
|
23
|
+
|
|
24
|
+
# 2. Health Check & Forward Payload
|
|
25
|
+
# We use a 1s timeout for the health check to avoid hanging if the daemon is dead.
|
|
26
|
+
if curl -s -f -m 1 "http://127.0.0.1:${GUARDIAN_PORT}/health" >/dev/null 2>&1; then
|
|
27
|
+
# Forward stdin to daemon and capture response
|
|
28
|
+
# Use a 10s timeout for processing
|
|
29
|
+
RESPONSE=$(cat | curl -s -m 10 -X POST "$ENDPOINT" \
|
|
30
|
+
-H "Content-Type: application/json" \
|
|
31
|
+
-d @- 2>/dev/null || echo "$DEFAULT_RESPONSE")
|
|
32
|
+
echo "$RESPONSE"
|
|
33
|
+
else
|
|
34
|
+
# Daemon is unreachable, return default "allow" response
|
|
35
|
+
echo "$DEFAULT_RESPONSE"
|
|
36
|
+
fi
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
type RequestListener = (req: http.IncomingMessage, res: http.ServerResponse) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight HTTP server for Guardian
|
|
5
|
+
*/
|
|
6
|
+
export declare class GuardianHttpServer {
|
|
7
|
+
private server;
|
|
8
|
+
private port;
|
|
9
|
+
private requestListeners;
|
|
10
|
+
private requestCount;
|
|
11
|
+
constructor(port: number);
|
|
12
|
+
/**
|
|
13
|
+
* Start the server
|
|
14
|
+
*/
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Stop the server
|
|
18
|
+
*/
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Register a request handler for a specific path
|
|
22
|
+
*/
|
|
23
|
+
on(path: string, listener: RequestListener): void;
|
|
24
|
+
/**
|
|
25
|
+
* Handle incoming requests
|
|
26
|
+
*/
|
|
27
|
+
private handleRequest;
|
|
28
|
+
/**
|
|
29
|
+
* Get the port the server is listening on
|
|
30
|
+
*/
|
|
31
|
+
getPort(): number;
|
|
32
|
+
/**
|
|
33
|
+
* Check if server is currently listening
|
|
34
|
+
*/
|
|
35
|
+
isListening(): boolean;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,KAAK,eAAe,GAAG,CACrB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,KACrB,IAAI,CAAC;AAEV;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,YAAY,CAAK;gBAEb,IAAI,EAAE,MAAM;IASxB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCtB;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrB;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAQjD;;OAEG;IACH,OAAO,CAAC,aAAa;IAwDrB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,WAAW,IAAI,OAAO;CAGvB"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,cAAc,SAAS,CAAC"}
|