@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.
Files changed (156) hide show
  1. package/README.md +337 -0
  2. package/bin/overwatch +12 -0
  3. package/dist/auth/cli-oauth.d.ts +13 -0
  4. package/dist/auth/cli-oauth.d.ts.map +1 -0
  5. package/dist/auth/html-utils.d.ts +20 -0
  6. package/dist/auth/html-utils.d.ts.map +1 -0
  7. package/dist/auth/index.d.ts +10 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/oauth.d.ts +81 -0
  10. package/dist/auth/oauth.d.ts.map +1 -0
  11. package/dist/auth/pkce.d.ts +26 -0
  12. package/dist/auth/pkce.d.ts.map +1 -0
  13. package/dist/auth/token-store.d.ts +44 -0
  14. package/dist/auth/token-store.d.ts.map +1 -0
  15. package/dist/bin/overwatch +12 -0
  16. package/dist/cli.d.ts +6 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +5449 -0
  19. package/dist/cli.js.map +7 -0
  20. package/dist/config/index.d.ts +5 -0
  21. package/dist/config/index.d.ts.map +1 -0
  22. package/dist/config/manager.d.ts +54 -0
  23. package/dist/config/manager.d.ts.map +1 -0
  24. package/dist/daemon.d.ts +11 -0
  25. package/dist/daemon.d.ts.map +1 -0
  26. package/dist/daemon.js +6004 -0
  27. package/dist/daemon.js.map +7 -0
  28. package/dist/data/ingestor.d.ts +31 -0
  29. package/dist/data/ingestor.d.ts.map +1 -0
  30. package/dist/data/processor.d.ts +96 -0
  31. package/dist/data/processor.d.ts.map +1 -0
  32. package/dist/data/reader.d.ts +24 -0
  33. package/dist/data/reader.d.ts.map +1 -0
  34. package/dist/data/recorder.d.ts +12 -0
  35. package/dist/data/recorder.d.ts.map +1 -0
  36. package/dist/engines/cedar.d.ts +41 -0
  37. package/dist/engines/cedar.d.ts.map +1 -0
  38. package/dist/engines/remote.d.ts +21 -0
  39. package/dist/engines/remote.d.ts.map +1 -0
  40. package/dist/engines/yara.d.ts +12 -0
  41. package/dist/engines/yara.d.ts.map +1 -0
  42. package/dist/handlers/dashboard-handler.d.ts +7 -0
  43. package/dist/handlers/dashboard-handler.d.ts.map +1 -0
  44. package/dist/handlers/hook-handler.d.ts +23 -0
  45. package/dist/handlers/hook-handler.d.ts.map +1 -0
  46. package/dist/handlers/oauth-handler.d.ts +12 -0
  47. package/dist/handlers/oauth-handler.d.ts.map +1 -0
  48. package/dist/handlers/scan-handler.d.ts +13 -0
  49. package/dist/handlers/scan-handler.d.ts.map +1 -0
  50. package/dist/handlers/utils.d.ts +11 -0
  51. package/dist/handlers/utils.d.ts.map +1 -0
  52. package/dist/hooks/claudecode/hooks.json.template +20 -0
  53. package/dist/hooks/cursor/hooks.json.template +74 -0
  54. package/dist/hooks/universal-hook.sh +36 -0
  55. package/dist/http/server.d.ts +38 -0
  56. package/dist/http/server.d.ts.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +5941 -0
  60. package/dist/index.js.map +7 -0
  61. package/dist/installer.d.ts +25 -0
  62. package/dist/installer.d.ts.map +1 -0
  63. package/dist/javelin/admin-client.d.ts +75 -0
  64. package/dist/javelin/admin-client.d.ts.map +1 -0
  65. package/dist/javelin/client.d.ts +30 -0
  66. package/dist/javelin/client.d.ts.map +1 -0
  67. package/dist/javelin/config-reader.d.ts +70 -0
  68. package/dist/javelin/config-reader.d.ts.map +1 -0
  69. package/dist/javelin/index.d.ts +5 -0
  70. package/dist/javelin/index.d.ts.map +1 -0
  71. package/dist/javelin/types.d.ts +81 -0
  72. package/dist/javelin/types.d.ts.map +1 -0
  73. package/dist/lib/policy-engine.d.ts +34 -0
  74. package/dist/lib/policy-engine.d.ts.map +1 -0
  75. package/dist/lib/policy-manager.d.ts +86 -0
  76. package/dist/lib/policy-manager.d.ts.map +1 -0
  77. package/dist/module.d.ts +52 -0
  78. package/dist/module.d.ts.map +1 -0
  79. package/dist/pipeline/context-mapper.d.ts +16 -0
  80. package/dist/pipeline/context-mapper.d.ts.map +1 -0
  81. package/dist/pipeline/extractors/claude-extractor.d.ts +48 -0
  82. package/dist/pipeline/extractors/claude-extractor.d.ts.map +1 -0
  83. package/dist/pipeline/extractors/cursor-extractor.d.ts +44 -0
  84. package/dist/pipeline/extractors/cursor-extractor.d.ts.map +1 -0
  85. package/dist/pipeline/extractors/github-copilot-extractor.d.ts +49 -0
  86. package/dist/pipeline/extractors/github-copilot-extractor.d.ts.map +1 -0
  87. package/dist/pipeline/extractors/index.d.ts +47 -0
  88. package/dist/pipeline/extractors/index.d.ts.map +1 -0
  89. package/dist/pipeline/extractors/registry.d.ts +38 -0
  90. package/dist/pipeline/extractors/registry.d.ts.map +1 -0
  91. package/dist/pipeline/hook-pipeline.d.ts +25 -0
  92. package/dist/pipeline/hook-pipeline.d.ts.map +1 -0
  93. package/dist/policy.cedar +783 -0
  94. package/dist/rules/pre/command_injection.yar +60 -0
  95. package/dist/rules/pre/cross_origin_escalation.yar +106 -0
  96. package/dist/rules/pre/mcp_config_risk.yar +35 -0
  97. package/dist/rules/pre/path_traversal.yar +50 -0
  98. package/dist/rules/pre/prompt_injection.yar +101 -0
  99. package/dist/rules/pre/secrets_leakage.yar +100 -0
  100. package/dist/rules/pre/sql_injection.yar +65 -0
  101. package/dist/scanner.d.ts +80 -0
  102. package/dist/scanner.d.ts.map +1 -0
  103. package/dist/service.d.ts +18 -0
  104. package/dist/service.d.ts.map +1 -0
  105. package/dist/services/interface.d.ts +11 -0
  106. package/dist/services/interface.d.ts.map +1 -0
  107. package/dist/services/launchd.d.ts +12 -0
  108. package/dist/services/launchd.d.ts.map +1 -0
  109. package/dist/services/systemd.d.ts +12 -0
  110. package/dist/services/systemd.d.ts.map +1 -0
  111. package/dist/services/windows.d.ts +7 -0
  112. package/dist/services/windows.d.ts.map +1 -0
  113. package/dist/skills/index.d.ts +7 -0
  114. package/dist/skills/index.d.ts.map +1 -0
  115. package/dist/skills/scanner.d.ts +44 -0
  116. package/dist/skills/scanner.d.ts.map +1 -0
  117. package/dist/skills/types.d.ts +29 -0
  118. package/dist/skills/types.d.ts.map +1 -0
  119. package/dist/types/config.d.ts +165 -0
  120. package/dist/types/config.d.ts.map +1 -0
  121. package/dist/types/events.d.ts +225 -0
  122. package/dist/types/events.d.ts.map +1 -0
  123. package/dist/types/index.d.ts +6 -0
  124. package/dist/types/index.d.ts.map +1 -0
  125. package/dist/types/remote-policy.d.ts +129 -0
  126. package/dist/types/remote-policy.d.ts.map +1 -0
  127. package/dist/types/requests.d.ts +45 -0
  128. package/dist/types/requests.d.ts.map +1 -0
  129. package/dist/types/responses.d.ts +60 -0
  130. package/dist/types/responses.d.ts.map +1 -0
  131. package/dist/ui/images/highflame-mono.png +0 -0
  132. package/dist/ui/views/dashboard.ejs +301 -0
  133. package/dist/ui/views/dashboard.js +785 -0
  134. package/dist/ui/views/partials/commands-table.ejs +54 -0
  135. package/dist/ui/views/partials/events-table.ejs +36 -0
  136. package/dist/ui/views/partials/filter-dropdown.ejs +12 -0
  137. package/dist/ui/views/partials/overview-charts.ejs +149 -0
  138. package/dist/ui/views/partials/scans-table.ejs +136 -0
  139. package/dist/ui/views/partials/sessions-table.ejs +50 -0
  140. package/dist/ui/views/partials/stats-grid.ejs +23 -0
  141. package/dist/ui/views/partials/threats-table.ejs +60 -0
  142. package/dist/utils/index.d.ts +3 -0
  143. package/dist/utils/index.d.ts.map +1 -0
  144. package/dist/utils/logger.d.ts +28 -0
  145. package/dist/utils/logger.d.ts.map +1 -0
  146. package/dist/utils/performance.d.ts +26 -0
  147. package/dist/utils/performance.d.ts.map +1 -0
  148. package/dist/utils/port-manager.d.ts +6 -0
  149. package/dist/utils/port-manager.d.ts.map +1 -0
  150. package/dist/yara/engine.d.ts +58 -0
  151. package/dist/yara/engine.d.ts.map +1 -0
  152. package/dist/yara/index.d.ts +5 -0
  153. package/dist/yara/index.d.ts.map +1 -0
  154. package/lib/platform-loader.js +210 -0
  155. package/package.json +63 -0
  156. package/scripts/postinstall.js +121 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * GitHub Copilot Extractor
3
+ *
4
+ * Converts GitHub Copilot Agent hook payloads into canonical OverwatchEvent format.
5
+ * Handles GitHub Copilot hook events as defined in .github/hooks/hooks.json
6
+ *
7
+ * GitHub Copilot uses repository-based hooks (.github/hooks/hooks.json) rather than
8
+ * global IDE hooks. See: https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/use-hooks
9
+ */
10
+ import { IExtractor } from './index';
11
+ import { OverwatchEvent, IDESource } from '../../types/events';
12
+ export declare class GitHubCopilotExtractor implements IExtractor {
13
+ /**
14
+ * Check if the extractor can handle given event from GitHub Copilot
15
+ */
16
+ canHandle(event: string, source: IDESource): boolean;
17
+ /**
18
+ * Convert GitHub Copilot hook payload to canonical OverwatchEvent
19
+ */
20
+ toCanonical(event: string, input: Record<string, any>, source: IDESource): Promise<OverwatchEvent | null>;
21
+ /**
22
+ * Extract content to be scanned by security engines
23
+ */
24
+ private extractContent;
25
+ /**
26
+ * Extract tool name and MCP information
27
+ */
28
+ private extractToolInfo;
29
+ /**
30
+ * Extract file path from input
31
+ */
32
+ private extractFilePath;
33
+ /**
34
+ * Extract tool arguments
35
+ */
36
+ private extractArguments;
37
+ /**
38
+ * Resolve workspace root from various GitHub Copilot formats
39
+ */
40
+ private resolveWorkspaceRoot;
41
+ /**
42
+ * Generate default response format for GitHub Copilot
43
+ *
44
+ * GitHub Copilot hooks expect: { continue: boolean } for blocking hooks
45
+ * See: https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/use-hooks
46
+ */
47
+ getDefaultResponse(event: string, allowed: boolean, reason?: string): Record<string, any>;
48
+ }
49
+ //# sourceMappingURL=github-copilot-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot-extractor.d.ts","sourceRoot":"","sources":["../../../src/pipeline/extractors/github-copilot-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAkB,MAAM,oBAAoB,CAAC;AAG/E,qBAAa,sBAAuB,YAAW,UAAU;IACrD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO;IAmBpD;;OAEG;IACG,WAAW,CACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiEjC;;OAEG;IACH,OAAO,CAAC,cAAc;IA2DtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;;;;OAKG;IACH,kBAAkB,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAsBzB"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Input Extraction Layer - Core Interfaces
3
+ *
4
+ * This module defines the interfaces for extracting and normalizing
5
+ * diverse input payloads from various IDEs and AI agent frameworks
6
+ * into a canonical OverwatchEvent schema.
7
+ */
8
+ import { OverwatchEvent, IDESource } from "../../types/events";
9
+ export { CursorExtractor } from './cursor-extractor';
10
+ export { ClaudeExtractor } from './claude-extractor';
11
+ export { GitHubCopilotExtractor } from './github-copilot-extractor';
12
+ export { ExtractorRegistry } from './registry';
13
+ /**
14
+ * Extractor Interface
15
+ *
16
+ * Each IDE/framework provides an implementation of this interface
17
+ * to convert its native payload format into the canonical OverwatchEvent.
18
+ */
19
+ export interface IExtractor {
20
+ /**
21
+ * Convert a raw hook payload into a canonical OverwatchEvent
22
+ *
23
+ * @param event - The hook event name (e.g., "beforeShellExecution", "PreToolUse")
24
+ * @param input - The raw payload from the IDE/framework
25
+ * @param source - The source IDE/framework identifier
26
+ * @returns Canonical OverwatchEvent or null if event cannot be processed
27
+ */
28
+ toCanonical(event: string, input: Record<string, any>, source: IDESource): Promise<OverwatchEvent | null>;
29
+ /**
30
+ * Check if this extractor can handle the given event from the given source
31
+ *
32
+ * @param event - The hook event name
33
+ * @param source - The source IDE/framework identifier
34
+ * @returns true if this extractor can process the event
35
+ */
36
+ canHandle(event: string, source: IDESource): boolean;
37
+ /**
38
+ * Generate default response format for IDE/framework
39
+ *
40
+ * @param event - hook event name
41
+ * @param allowed - action allowed or denied
42
+ * @param reason - reason for denial
43
+ * @returns default response object in the format expected by the IDE/framework
44
+ */
45
+ getDefaultResponse(event: string, allowed: boolean, reason?: string): Record<string, any>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pipeline/extractors/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACvB;;;;;;;OAOG;IACH,WAAW,CACP,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAElC;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAErD;;;;;;;OAOG;IACH,kBAAkB,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1B"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Extractor Registry
3
+ *
4
+ * Factory pattern for managing and retrieving extractors for different IDE/framework sources.
5
+ * Provides a centralized way to register and access extractors.
6
+ */
7
+ import { IDESource } from '../../types/events';
8
+ import { IExtractor } from './index';
9
+ export declare class ExtractorRegistry {
10
+ private extractors;
11
+ /**
12
+ * Register an extractor for a source
13
+ */
14
+ register(source: IDESource, extractor: IExtractor): void;
15
+ /**
16
+ * Get extractor for source
17
+ * Returns null if no extractor is registered for the source
18
+ */
19
+ get(source: IDESource): IExtractor | null;
20
+ /**
21
+ * Find extractor that can handle the given event from the given source
22
+ * Checks both source match and canHandle() method
23
+ */
24
+ findExtractor(event: string, source: IDESource): IExtractor | null;
25
+ /**
26
+ * Check if an extractor is registered for the source
27
+ */
28
+ has(source: IDESource): boolean;
29
+ /**
30
+ * Get all registered sources
31
+ */
32
+ getRegisteredSources(): IDESource[];
33
+ /**
34
+ * Create a registry with default extractors (Cursor, Claude Code, GitHub Copilot)
35
+ */
36
+ static createDefault(): ExtractorRegistry;
37
+ }
38
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/pipeline/extractors/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,UAAU,CAAyC;IAE3D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI;IAIxD;;;OAGG;IACH,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI;IAIzC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI;IAQlE;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAI/B;;OAEG;IACH,oBAAoB,IAAI,SAAS,EAAE;IAInC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,iBAAiB;CAU5C"}
@@ -0,0 +1,25 @@
1
+ import { IDESource, HookEvent, DetectionResult, PolicyDecision, ThreatSummary, OverwatchEvent } from "../types";
2
+ import { YaraExecutor } from "../engines/yara";
3
+ import { RemoteExecutor } from "../engines/remote";
4
+ import { PolicyManager } from "../lib/policy-manager";
5
+ import { ExtractorRegistry } from "./extractors";
6
+ export interface PipelineResult {
7
+ response: Record<string, unknown>;
8
+ evaluations: DetectionResult[];
9
+ threat_summary: ThreatSummary;
10
+ decision: PolicyDecision;
11
+ allowed: boolean;
12
+ contentLength?: number;
13
+ overwatchEvent?: OverwatchEvent;
14
+ }
15
+ export declare class HookPipeline {
16
+ private yaraExecutor;
17
+ private remoteExecutor;
18
+ private policyManager;
19
+ private onFirstInstall;
20
+ private extractorRegistry;
21
+ constructor(yaraExecutor: YaraExecutor, remoteExecutor: RemoteExecutor, policyManager: PolicyManager, onFirstInstall: (source: IDESource) => void, extractorRegistry: ExtractorRegistry);
22
+ process(source: IDESource, event: HookEvent, input: Record<string, unknown>): Promise<PipelineResult>;
23
+ private buildThreatSummary;
24
+ }
25
+ //# sourceMappingURL=hook-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/hook-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,cAAc,EACd,aAAa,EAEb,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,cAAc,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBAJjB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,EAC3C,iBAAiB,EAAE,iBAAiB;IAGxC,OAAO,CACX,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,cAAc,CAAC;IAwI1B,OAAO,CAAC,kBAAkB;CA8D3B"}