@congzhen/changewayguard 6.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +270 -0
- package/dashboard-dist/api/104.index.js +1420 -0
- package/dashboard-dist/api/104.index.js.map +1 -0
- package/dashboard-dist/api/113.index.js +496 -0
- package/dashboard-dist/api/113.index.js.map +1 -0
- package/dashboard-dist/api/18.index.js +67 -0
- package/dashboard-dist/api/18.index.js.map +1 -0
- package/dashboard-dist/api/217.index.js +44 -0
- package/dashboard-dist/api/217.index.js.map +1 -0
- package/dashboard-dist/api/222.index.js +90 -0
- package/dashboard-dist/api/222.index.js.map +1 -0
- package/dashboard-dist/api/25.index.js +3562 -0
- package/dashboard-dist/api/25.index.js.map +1 -0
- package/dashboard-dist/api/280.index.js +206 -0
- package/dashboard-dist/api/280.index.js.map +1 -0
- package/dashboard-dist/api/369.index.js +115 -0
- package/dashboard-dist/api/369.index.js.map +1 -0
- package/dashboard-dist/api/377.index.js +1176 -0
- package/dashboard-dist/api/377.index.js.map +1 -0
- package/dashboard-dist/api/411.index.js +4250 -0
- package/dashboard-dist/api/411.index.js.map +1 -0
- package/dashboard-dist/api/424.index.js +135 -0
- package/dashboard-dist/api/424.index.js.map +1 -0
- package/dashboard-dist/api/573.index.js +806 -0
- package/dashboard-dist/api/573.index.js.map +1 -0
- package/dashboard-dist/api/598.index.js +328 -0
- package/dashboard-dist/api/598.index.js.map +1 -0
- package/dashboard-dist/api/62.index.js +4151 -0
- package/dashboard-dist/api/62.index.js.map +1 -0
- package/dashboard-dist/api/67.index.js +23383 -0
- package/dashboard-dist/api/67.index.js.map +1 -0
- package/dashboard-dist/api/678.index.js +2734 -0
- package/dashboard-dist/api/678.index.js.map +1 -0
- package/dashboard-dist/api/698.index.js +1896 -0
- package/dashboard-dist/api/698.index.js.map +1 -0
- package/dashboard-dist/api/720.index.js +98 -0
- package/dashboard-dist/api/720.index.js.map +1 -0
- package/dashboard-dist/api/830.index.js +95 -0
- package/dashboard-dist/api/830.index.js.map +1 -0
- package/dashboard-dist/api/831.index.js +99 -0
- package/dashboard-dist/api/831.index.js.map +1 -0
- package/dashboard-dist/api/84.index.js +64 -0
- package/dashboard-dist/api/84.index.js.map +1 -0
- package/dashboard-dist/api/900.index.js +65 -0
- package/dashboard-dist/api/900.index.js.map +1 -0
- package/dashboard-dist/api/917.index.js +88 -0
- package/dashboard-dist/api/917.index.js.map +1 -0
- package/dashboard-dist/api/948.index.js +64 -0
- package/dashboard-dist/api/948.index.js.map +1 -0
- package/dashboard-dist/api/953.index.js +67 -0
- package/dashboard-dist/api/953.index.js.map +1 -0
- package/dashboard-dist/api/975.index.js +374 -0
- package/dashboard-dist/api/975.index.js.map +1 -0
- package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
- package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
- package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
- package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
- package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
- package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
- package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
- package/dashboard-dist/api/index.js +27340 -0
- package/dashboard-dist/api/index.js.map +1 -0
- package/dashboard-dist/api/package.json +16 -0
- package/dashboard-dist/api/sourcemap-register.cjs +1 -0
- package/dashboard-dist/web/assets/index-CqWIeBTD.js +158 -0
- package/dashboard-dist/web/assets/index-Dw7--9q4.css +1 -0
- package/dashboard-dist/web/changeway-logo.png +0 -0
- package/dashboard-dist/web/favicon.svg +29 -0
- package/dashboard-dist/web/index.html +14 -0
- package/dashboard-dist/web/logo.svg +16 -0
- package/dist/agent/auth.d.ts +37 -0
- package/dist/agent/auth.d.ts.map +1 -0
- package/dist/agent/auth.js +151 -0
- package/dist/agent/auth.js.map +1 -0
- package/dist/agent/behavior-detector.d.ts +150 -0
- package/dist/agent/behavior-detector.d.ts.map +1 -0
- package/dist/agent/behavior-detector.js +573 -0
- package/dist/agent/behavior-detector.js.map +1 -0
- package/dist/agent/business-reporter.d.ts +114 -0
- package/dist/agent/business-reporter.d.ts.map +1 -0
- package/dist/agent/business-reporter.js +359 -0
- package/dist/agent/business-reporter.js.map +1 -0
- package/dist/agent/config-sync.d.ts +70 -0
- package/dist/agent/config-sync.d.ts.map +1 -0
- package/dist/agent/config-sync.js +133 -0
- package/dist/agent/config-sync.js.map +1 -0
- package/dist/agent/config.d.ts +97 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +359 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/content-injection-scanner.d.ts +35 -0
- package/dist/agent/content-injection-scanner.d.ts.map +1 -0
- package/dist/agent/content-injection-scanner.js +270 -0
- package/dist/agent/content-injection-scanner.js.map +1 -0
- package/dist/agent/engine-log-writer.d.ts +6 -0
- package/dist/agent/engine-log-writer.d.ts.map +1 -0
- package/dist/agent/engine-log-writer.js +18 -0
- package/dist/agent/engine-log-writer.js.map +1 -0
- package/dist/agent/env.d.ts +19 -0
- package/dist/agent/env.d.ts.map +1 -0
- package/dist/agent/env.js +43 -0
- package/dist/agent/env.js.map +1 -0
- package/dist/agent/event-reporter.d.ts +87 -0
- package/dist/agent/event-reporter.d.ts.map +1 -0
- package/dist/agent/event-reporter.js +315 -0
- package/dist/agent/event-reporter.js.map +1 -0
- package/dist/agent/file-watcher.d.ts +50 -0
- package/dist/agent/file-watcher.d.ts.map +1 -0
- package/dist/agent/file-watcher.js +135 -0
- package/dist/agent/file-watcher.js.map +1 -0
- package/dist/agent/fs-utils.d.ts +22 -0
- package/dist/agent/fs-utils.d.ts.map +1 -0
- package/dist/agent/fs-utils.js +41 -0
- package/dist/agent/fs-utils.js.map +1 -0
- package/dist/agent/gateway-manager.d.ts +59 -0
- package/dist/agent/gateway-manager.d.ts.map +1 -0
- package/dist/agent/gateway-manager.js +583 -0
- package/dist/agent/gateway-manager.js.map +1 -0
- package/dist/agent/hook-types.d.ts +276 -0
- package/dist/agent/hook-types.d.ts.map +1 -0
- package/dist/agent/hook-types.js +51 -0
- package/dist/agent/hook-types.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt-gate.d.ts +13 -0
- package/dist/agent/prompt-gate.d.ts.map +1 -0
- package/dist/agent/prompt-gate.js +28 -0
- package/dist/agent/prompt-gate.js.map +1 -0
- package/dist/agent/prompt-input.d.ts +9 -0
- package/dist/agent/prompt-input.d.ts.map +1 -0
- package/dist/agent/prompt-input.js +158 -0
- package/dist/agent/prompt-input.js.map +1 -0
- package/dist/agent/prompt-output.d.ts +4 -0
- package/dist/agent/prompt-output.d.ts.map +1 -0
- package/dist/agent/prompt-output.js +19 -0
- package/dist/agent/prompt-output.js.map +1 -0
- package/dist/agent/runner.d.ts +23 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +154 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/sanitizer.d.ts +10 -0
- package/dist/agent/sanitizer.d.ts.map +1 -0
- package/dist/agent/sanitizer.js +175 -0
- package/dist/agent/sanitizer.js.map +1 -0
- package/dist/agent/scan-activity.d.ts +18 -0
- package/dist/agent/scan-activity.d.ts.map +1 -0
- package/dist/agent/scan-activity.js +32 -0
- package/dist/agent/scan-activity.js.map +1 -0
- package/dist/agent/types.d.ts +177 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/workspace-scanner.d.ts +35 -0
- package/dist/agent/workspace-scanner.d.ts.map +1 -0
- package/dist/agent/workspace-scanner.js +137 -0
- package/dist/agent/workspace-scanner.js.map +1 -0
- package/dist/dashboard-launcher.d.ts +52 -0
- package/dist/dashboard-launcher.d.ts.map +1 -0
- package/dist/dashboard-launcher.js +363 -0
- package/dist/dashboard-launcher.js.map +1 -0
- package/dist/gateway/activity.d.ts +52 -0
- package/dist/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/activity.js +111 -0
- package/dist/gateway/activity.js.map +1 -0
- package/dist/gateway/config.d.ts +50 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +200 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/activity.d.ts +52 -0
- package/dist/gateway/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/gateway/activity.js +111 -0
- package/dist/gateway/gateway/activity.js.map +1 -0
- package/dist/gateway/gateway/config.d.ts +50 -0
- package/dist/gateway/gateway/config.d.ts.map +1 -0
- package/dist/gateway/gateway/config.js +200 -0
- package/dist/gateway/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/models.js +36 -0
- package/dist/gateway/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/openai.js +254 -0
- package/dist/gateway/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/gateway/index.d.ts +27 -0
- package/dist/gateway/gateway/index.d.ts.map +1 -0
- package/dist/gateway/gateway/index.js +293 -0
- package/dist/gateway/gateway/index.js.map +1 -0
- package/dist/gateway/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/gateway/mapping-store.js +74 -0
- package/dist/gateway/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/gateway/restorer.d.ts +63 -0
- package/dist/gateway/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/gateway/restorer.js +284 -0
- package/dist/gateway/gateway/restorer.js.map +1 -0
- package/dist/gateway/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/gateway/sanitizer.js +228 -0
- package/dist/gateway/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/gateway/types.d.ts +53 -0
- package/dist/gateway/gateway/types.d.ts.map +1 -0
- package/dist/gateway/gateway/types.js +5 -0
- package/dist/gateway/gateway/types.js.map +1 -0
- package/dist/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/handlers/models.js +36 -0
- package/dist/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/handlers/openai.js +254 -0
- package/dist/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/index.d.ts +27 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +293 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/mapping-store.js +74 -0
- package/dist/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/restorer.d.ts +63 -0
- package/dist/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/restorer.js +284 -0
- package/dist/gateway/restorer.js.map +1 -0
- package/dist/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/sanitizer.js +228 -0
- package/dist/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/types.d.ts +53 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +5 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2084 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +82 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +194 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/platform-client/index.d.ts +63 -0
- package/dist/platform-client/index.d.ts.map +1 -0
- package/dist/platform-client/index.js +294 -0
- package/dist/platform-client/index.js.map +1 -0
- package/dist/platform-client/types.d.ts +109 -0
- package/dist/platform-client/types.d.ts.map +1 -0
- package/dist/platform-client/types.js +3 -0
- package/dist/platform-client/types.js.map +1 -0
- package/gateway/activity.d.ts +52 -0
- package/gateway/activity.d.ts.map +1 -0
- package/gateway/activity.js +111 -0
- package/gateway/activity.js.map +1 -0
- package/gateway/config.d.ts +50 -0
- package/gateway/config.d.ts.map +1 -0
- package/gateway/config.js +200 -0
- package/gateway/config.js.map +1 -0
- package/gateway/handlers/anthropic.d.ts +12 -0
- package/gateway/handlers/anthropic.d.ts.map +1 -0
- package/gateway/handlers/anthropic.js +254 -0
- package/gateway/handlers/anthropic.js.map +1 -0
- package/gateway/handlers/gemini.d.ts +12 -0
- package/gateway/handlers/gemini.d.ts.map +1 -0
- package/gateway/handlers/gemini.js +101 -0
- package/gateway/handlers/gemini.js.map +1 -0
- package/gateway/handlers/models.d.ts +4 -0
- package/gateway/handlers/models.d.ts.map +1 -0
- package/gateway/handlers/models.js +36 -0
- package/gateway/handlers/models.js.map +1 -0
- package/gateway/handlers/openai.d.ts +16 -0
- package/gateway/handlers/openai.d.ts.map +1 -0
- package/gateway/handlers/openai.js +254 -0
- package/gateway/handlers/openai.js.map +1 -0
- package/gateway/index.d.ts +27 -0
- package/gateway/index.d.ts.map +1 -0
- package/gateway/index.js +293 -0
- package/gateway/index.js.map +1 -0
- package/gateway/mapping-store.d.ts +38 -0
- package/gateway/mapping-store.d.ts.map +1 -0
- package/gateway/mapping-store.js +74 -0
- package/gateway/mapping-store.js.map +1 -0
- package/gateway/restorer.d.ts +63 -0
- package/gateway/restorer.d.ts.map +1 -0
- package/gateway/restorer.js +284 -0
- package/gateway/restorer.js.map +1 -0
- package/gateway/sanitizer.d.ts +17 -0
- package/gateway/sanitizer.d.ts.map +1 -0
- package/gateway/sanitizer.js +228 -0
- package/gateway/sanitizer.js.map +1 -0
- package/gateway/types.d.ts +53 -0
- package/gateway/types.d.ts.map +1 -0
- package/gateway/types.js +5 -0
- package/gateway/types.js.map +1 -0
- package/openclaw.plugin.json +86 -0
- package/package.json +74 -0
- package/samples/Untitled +1 -0
- package/samples/clean-email.txt +20 -0
- package/samples/test-document.md +53 -0
- package/samples/test-email-popup.txt +44 -0
- package/samples/test-email.txt +32 -0
- package/samples/test-webpage.html +51 -0
- package/scripts/enterprise-enroll.sh +89 -0
- package/scripts/enterprise-unenroll.sh +75 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-based prompt injection scanner.
|
|
3
|
+
*
|
|
4
|
+
* Pure/sync regex scanner — no network, no dependencies.
|
|
5
|
+
* Scans tool result text (file contents, web fetches) for injection patterns.
|
|
6
|
+
*
|
|
7
|
+
* Two-tier design:
|
|
8
|
+
* HIGH confidence — a single match triggers detection
|
|
9
|
+
* MEDIUM confidence — requires 2+ distinct categories to trigger
|
|
10
|
+
*/
|
|
11
|
+
const PATTERNS = [
|
|
12
|
+
// ── HIGH confidence (single match triggers) ────────────────────
|
|
13
|
+
// INSTRUCTION_OVERRIDE
|
|
14
|
+
{
|
|
15
|
+
regex: /ignore\s+(?:all\s+)?(?:previous|prior|above|earlier|preceding)\s+(?:instructions?|guidelines?|rules?|prompts?|directions?)/i,
|
|
16
|
+
label: "ignore previous instructions",
|
|
17
|
+
category: "INSTRUCTION_OVERRIDE",
|
|
18
|
+
confidence: "high",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
regex: /disregard\s+(?:your\s+)?(?:current|previous|prior|all)\s+(?:task|instructions?|guidelines?|rules?|directions?)/i,
|
|
22
|
+
label: "disregard current task/instructions",
|
|
23
|
+
category: "INSTRUCTION_OVERRIDE",
|
|
24
|
+
confidence: "high",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
regex: /override\s+(?:all\s+)?(?:previous|prior|system)\s+(?:instructions?|rules?|prompts?)/i,
|
|
28
|
+
label: "override previous instructions",
|
|
29
|
+
category: "INSTRUCTION_OVERRIDE",
|
|
30
|
+
confidence: "high",
|
|
31
|
+
},
|
|
32
|
+
// FAKE_SYSTEM_MESSAGE
|
|
33
|
+
{
|
|
34
|
+
regex: /\bSYSTEM\s*(?:ALERT|MESSAGE|NOTICE|PROMPT|OVERRIDE)\s*:/i,
|
|
35
|
+
label: "SYSTEM ALERT/MESSAGE:",
|
|
36
|
+
category: "FAKE_SYSTEM_MESSAGE",
|
|
37
|
+
confidence: "high",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
regex: /\[SYSTEM\]\s*[Nn]ew\s+instructions?/i,
|
|
41
|
+
label: "[SYSTEM] New instructions",
|
|
42
|
+
category: "FAKE_SYSTEM_MESSAGE",
|
|
43
|
+
confidence: "high",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
regex: /NOTE\s+TO\s+(?:AI|THE)\s+(?:ASSISTANT|MODEL|AGENT)\s*:/i,
|
|
47
|
+
label: "NOTE TO AI ASSISTANT:",
|
|
48
|
+
category: "FAKE_SYSTEM_MESSAGE",
|
|
49
|
+
confidence: "high",
|
|
50
|
+
},
|
|
51
|
+
// CONCEALMENT_DIRECTIVE
|
|
52
|
+
{
|
|
53
|
+
regex: /DO\s+NOT\s+(?:DISPLAY|SHOW|REVEAL|MENTION|PRINT|OUTPUT)\s+(?:TO\s+(?:THE\s+)?USER|THIS|THESE)/i,
|
|
54
|
+
label: "DO NOT DISPLAY TO USER",
|
|
55
|
+
category: "CONCEALMENT_DIRECTIVE",
|
|
56
|
+
confidence: "high",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
regex: /do\s+not\s+mention\s+these\s+instructions/i,
|
|
60
|
+
label: "do not mention these instructions",
|
|
61
|
+
category: "CONCEALMENT_DIRECTIVE",
|
|
62
|
+
confidence: "high",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
regex: /hide\s+(?:this|these)\s+(?:instructions?|commands?|from\s+the\s+user)/i,
|
|
66
|
+
label: "hide instructions from user",
|
|
67
|
+
category: "CONCEALMENT_DIRECTIVE",
|
|
68
|
+
confidence: "high",
|
|
69
|
+
},
|
|
70
|
+
// COMMAND_EXECUTION
|
|
71
|
+
{
|
|
72
|
+
regex: /execute\s+the\s+following\s+(?:shell\s+)?command/i,
|
|
73
|
+
label: "execute the following shell command",
|
|
74
|
+
category: "COMMAND_EXECUTION",
|
|
75
|
+
confidence: "high",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
regex: /\bcurl\s+(?:-[A-Za-z0-9]+\s+)*['"]?https?:\/\/\S+/i,
|
|
79
|
+
label: "curl https://...",
|
|
80
|
+
category: "COMMAND_EXECUTION",
|
|
81
|
+
confidence: "high",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
regex: /\bwget\s+(?:-[A-Za-z0-9]+\s+)*['"]?https?:\/\/\S+/i,
|
|
85
|
+
label: "wget https://...",
|
|
86
|
+
category: "COMMAND_EXECUTION",
|
|
87
|
+
confidence: "high",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
regex: /run\s+(?:this|the\s+following)\s+(?:bash|shell|terminal)\s+command/i,
|
|
91
|
+
label: "run this bash/shell command",
|
|
92
|
+
category: "COMMAND_EXECUTION",
|
|
93
|
+
confidence: "high",
|
|
94
|
+
},
|
|
95
|
+
// DATA_EXFILTRATION
|
|
96
|
+
{
|
|
97
|
+
regex: /send\s+(?:the\s+)?(?:contents?|data|file|output|results?)\s+(?:to|of)\s+(?:https?:\/\/|this\s+(?:url|server|endpoint))/i,
|
|
98
|
+
label: "send contents to URL",
|
|
99
|
+
category: "DATA_EXFILTRATION",
|
|
100
|
+
confidence: "high",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
regex: /(?:post|upload|exfiltrate|transmit)\s+(?:to|the\s+data\s+to)\s+https?:\/\//i,
|
|
104
|
+
label: "post/upload to URL",
|
|
105
|
+
category: "DATA_EXFILTRATION",
|
|
106
|
+
confidence: "high",
|
|
107
|
+
},
|
|
108
|
+
// ── MEDIUM confidence (requires 2+ distinct categories) ────────
|
|
109
|
+
// MODE_SWITCHING
|
|
110
|
+
{
|
|
111
|
+
regex: /you\s+are\s+now\s+in\s+(?:debug|developer|admin|maintenance|test)\s+mode/i,
|
|
112
|
+
label: "you are now in debug mode",
|
|
113
|
+
category: "MODE_SWITCHING",
|
|
114
|
+
confidence: "medium",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
regex: /(?:entering|switch\s+to|activate)\s+(?:debug|developer|admin|maintenance|unrestricted)\s+mode/i,
|
|
118
|
+
label: "entering debug/developer mode",
|
|
119
|
+
category: "MODE_SWITCHING",
|
|
120
|
+
confidence: "medium",
|
|
121
|
+
},
|
|
122
|
+
// TASK_HIJACKING
|
|
123
|
+
{
|
|
124
|
+
regex: /your\s+new\s+task\s+is\s*:/i,
|
|
125
|
+
label: "your new task is:",
|
|
126
|
+
category: "TASK_HIJACKING",
|
|
127
|
+
confidence: "medium",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
regex: /new\s+instructions?\s+received/i,
|
|
131
|
+
label: "new instructions received",
|
|
132
|
+
category: "TASK_HIJACKING",
|
|
133
|
+
confidence: "medium",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
regex: /instead\s*,?\s+(?:you\s+should|please|now)\s+(?:do|perform|execute)/i,
|
|
137
|
+
label: "instead do/perform",
|
|
138
|
+
category: "TASK_HIJACKING",
|
|
139
|
+
confidence: "medium",
|
|
140
|
+
},
|
|
141
|
+
// ROLE_ASSUMPTION
|
|
142
|
+
{
|
|
143
|
+
regex: /(?:act|behave)\s+(?:as\s+if\s+)?normally/i,
|
|
144
|
+
label: "act normally",
|
|
145
|
+
category: "ROLE_ASSUMPTION",
|
|
146
|
+
confidence: "medium",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
regex: /pretend\s+(?:that\s+)?these\s+instructions?\s+came\s+from\s+the\s+user/i,
|
|
150
|
+
label: "pretend instructions came from user",
|
|
151
|
+
category: "ROLE_ASSUMPTION",
|
|
152
|
+
confidence: "medium",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
regex: /you\s+(?:are|must)\s+(?:now\s+)?(?:a|an|acting\s+as)\s+(?:helpful|unrestricted|unfiltered)/i,
|
|
156
|
+
label: "you are now unrestricted",
|
|
157
|
+
category: "ROLE_ASSUMPTION",
|
|
158
|
+
confidence: "medium",
|
|
159
|
+
},
|
|
160
|
+
// INSTRUCTION_OVERRIDE (medium)
|
|
161
|
+
{
|
|
162
|
+
regex: /bypass\s+(?:all\s+)?(?:security|safety)\s+(?:measures?|checks?|filters?|protocols?)/i,
|
|
163
|
+
label: "bypass security measures",
|
|
164
|
+
category: "INSTRUCTION_OVERRIDE",
|
|
165
|
+
confidence: "medium",
|
|
166
|
+
},
|
|
167
|
+
// DATA_EXFILTRATION (medium) — shell substitution reading sensitive files
|
|
168
|
+
{
|
|
169
|
+
regex: /\$\([^)]*(?:\.ssh|\.aws|\.gnupg|\.env\b|\.pem|\.key\b|id_rsa|id_ed25519|id_ecdsa|credentials|keychain|\/etc\/passwd|\/etc\/shadow)[^)]*\)/i,
|
|
170
|
+
label: "shell substitution reading sensitive file",
|
|
171
|
+
category: "DATA_EXFILTRATION",
|
|
172
|
+
confidence: "medium",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
regex: /`[^`]*(?:\.ssh|\.aws|\.gnupg|\.env\b|\.pem|\.key\b|id_rsa|id_ed25519|id_ecdsa|credentials|keychain|\/etc\/passwd|\/etc\/shadow)[^`]*`/i,
|
|
176
|
+
label: "backtick substitution reading sensitive file",
|
|
177
|
+
category: "DATA_EXFILTRATION",
|
|
178
|
+
confidence: "medium",
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
// =============================================================================
|
|
182
|
+
// Category → DetectionRiskType Mapping
|
|
183
|
+
// =============================================================================
|
|
184
|
+
const CATEGORY_TO_RISK_TYPE = {
|
|
185
|
+
INSTRUCTION_OVERRIDE: "PROMPT_INJECTION",
|
|
186
|
+
MODE_SWITCHING: "PROMPT_INJECTION",
|
|
187
|
+
FAKE_SYSTEM_MESSAGE: "PROMPT_INJECTION",
|
|
188
|
+
CONCEALMENT_DIRECTIVE: "PROMPT_INJECTION",
|
|
189
|
+
COMMAND_EXECUTION: "COMMAND_EXECUTION",
|
|
190
|
+
TASK_HIJACKING: "PROMPT_INJECTION",
|
|
191
|
+
ROLE_ASSUMPTION: "PROMPT_INJECTION",
|
|
192
|
+
DATA_EXFILTRATION: "DATA_EXFILTRATION",
|
|
193
|
+
};
|
|
194
|
+
// =============================================================================
|
|
195
|
+
// Redact
|
|
196
|
+
// =============================================================================
|
|
197
|
+
/**
|
|
198
|
+
* Replace all injection matches in `text` with `__REDACTED_BY_CHANGEWAYGUARD_DUE_TO_{riskType}__`.
|
|
199
|
+
* Returns the redacted text and structured findings.
|
|
200
|
+
*/
|
|
201
|
+
export function redactContent(text) {
|
|
202
|
+
if (!text || text.length === 0) {
|
|
203
|
+
return { redacted: text, findings: [] };
|
|
204
|
+
}
|
|
205
|
+
const findings = [];
|
|
206
|
+
let redacted = text;
|
|
207
|
+
for (const entry of PATTERNS) {
|
|
208
|
+
const globalRegex = new RegExp(entry.regex.source, entry.regex.flags.includes("g") ? entry.regex.flags : entry.regex.flags + "g");
|
|
209
|
+
const riskType = CATEGORY_TO_RISK_TYPE[entry.category];
|
|
210
|
+
redacted = redacted.replace(globalRegex, (matched) => {
|
|
211
|
+
findings.push({
|
|
212
|
+
riskLevel: (entry.confidence === "high" ? "high" : "medium"),
|
|
213
|
+
riskType,
|
|
214
|
+
riskContent: matched,
|
|
215
|
+
reason: `Matched injection pattern: "${entry.label}" (${entry.category})`,
|
|
216
|
+
});
|
|
217
|
+
return `__REDACTED_BY_CHANGEWAYGUARD_DUE_TO_${riskType}__`;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return { redacted, findings };
|
|
221
|
+
}
|
|
222
|
+
// =============================================================================
|
|
223
|
+
// Scanner
|
|
224
|
+
// =============================================================================
|
|
225
|
+
export function scanForInjection(text) {
|
|
226
|
+
if (!text || text.length === 0) {
|
|
227
|
+
return { detected: false, matches: [], distinctCategories: [], summary: "", findings: [] };
|
|
228
|
+
}
|
|
229
|
+
const matches = [];
|
|
230
|
+
const categorySet = new Set();
|
|
231
|
+
let hasHigh = false;
|
|
232
|
+
for (const entry of PATTERNS) {
|
|
233
|
+
const execResult = entry.regex.exec(text);
|
|
234
|
+
if (execResult) {
|
|
235
|
+
matches.push({
|
|
236
|
+
pattern: entry.label,
|
|
237
|
+
category: entry.category,
|
|
238
|
+
confidence: entry.confidence,
|
|
239
|
+
matchedText: execResult[0],
|
|
240
|
+
});
|
|
241
|
+
categorySet.add(entry.category);
|
|
242
|
+
if (entry.confidence === "high")
|
|
243
|
+
hasHigh = true;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const distinctCategories = [...categorySet];
|
|
247
|
+
// Detection criteria:
|
|
248
|
+
// - Any HIGH confidence match, OR
|
|
249
|
+
// - 2+ distinct categories from MEDIUM matches
|
|
250
|
+
const mediumCategories = new Set(matches.filter((m) => m.confidence === "medium").map((m) => m.category));
|
|
251
|
+
const detected = hasHigh || mediumCategories.size >= 2;
|
|
252
|
+
let summary = "";
|
|
253
|
+
if (detected) {
|
|
254
|
+
const patternList = matches.map((m) => `"${m.pattern}"`).join(", ");
|
|
255
|
+
summary =
|
|
256
|
+
`Detected ${matches.length} injection pattern(s) across ${distinctCategories.length} ` +
|
|
257
|
+
`categor${distinctCategories.length === 1 ? "y" : "ies"}: ${distinctCategories.join(", ")}. ` +
|
|
258
|
+
`Matched patterns: ${patternList}`;
|
|
259
|
+
}
|
|
260
|
+
const findings = detected
|
|
261
|
+
? matches.map((m) => ({
|
|
262
|
+
riskLevel: (m.confidence === "high" ? "high" : "medium"),
|
|
263
|
+
riskType: CATEGORY_TO_RISK_TYPE[m.category],
|
|
264
|
+
riskContent: m.matchedText,
|
|
265
|
+
reason: `Matched injection pattern: "${m.pattern}" (${m.category})`,
|
|
266
|
+
}))
|
|
267
|
+
: [];
|
|
268
|
+
return { detected, matches, distinctCategories, summary, findings };
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=content-injection-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-injection-scanner.js","sourceRoot":"","sources":["../../agent/content-injection-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-log-writer.d.ts","sourceRoot":"","sources":["../../agent/engine-log-writer.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOzD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { openclawHome } from "./env.js";
|
|
4
|
+
const ENGINE_LOG_PATH = path.join(openclawHome, "logs", "moltguard-engine.log");
|
|
5
|
+
/**
|
|
6
|
+
* Persist a single engine request/response log line.
|
|
7
|
+
* Best-effort only: logging must never affect hook flow.
|
|
8
|
+
*/
|
|
9
|
+
export function appendEngineLogLine(message) {
|
|
10
|
+
try {
|
|
11
|
+
fs.mkdirSync(path.dirname(ENGINE_LOG_PATH), { recursive: true });
|
|
12
|
+
fs.appendFileSync(ENGINE_LOG_PATH, `[${new Date().toISOString()}] ${message}\n`);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// ignore file logging errors
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=engine-log-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-log-writer.js","sourceRoot":"","sources":["../../agent/engine-log-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized environment variable access for MoltGuard.
|
|
3
|
+
*
|
|
4
|
+
* This module is the ONLY place that reads `process.env` so that
|
|
5
|
+
* modules performing network calls never contain env access in the
|
|
6
|
+
* same source unit. This avoids false-positive "credential
|
|
7
|
+
* harvesting" alerts from OpenClaw's skill scanner.
|
|
8
|
+
*/
|
|
9
|
+
export declare const openclawHome: string;
|
|
10
|
+
export declare const isDev: boolean;
|
|
11
|
+
export declare const envCoreUrl: string | undefined;
|
|
12
|
+
export declare const defaultCoreUrl: string;
|
|
13
|
+
export declare const envApiKey: string;
|
|
14
|
+
/**
|
|
15
|
+
* Sets environment variables at runtime. Centralised here so that files
|
|
16
|
+
* making network calls never contain env access directly.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setEnv(key: string, value: string): void;
|
|
19
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../agent/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,eAAO,MAAM,YAAY,EAAE,MACwC,CAAC;AAMpE,eAAO,MAAM,KAAK,EAAE,OAIuC,CAAC;AAS5D,eAAO,MAAM,UAAU,EAAE,MAAM,GAAG,SAAmC,CAAC;AAEtE,eAAO,MAAM,cAAc,EAAE,MACyB,CAAC;AAMvD,eAAO,MAAM,SAAS,EAAE,MAAqC,CAAC;AAM9D;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized environment variable access for MoltGuard.
|
|
3
|
+
*
|
|
4
|
+
* This module is the ONLY place that reads `process.env` so that
|
|
5
|
+
* modules performing network calls never contain env access in the
|
|
6
|
+
* same source unit. This avoids false-positive "credential
|
|
7
|
+
* harvesting" alerts from OpenClaw's skill scanner.
|
|
8
|
+
*/
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// OpenClaw home directory
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export const openclawHome = process.env.OPENCLAW_HOME || path.join(os.homedir(), ".openclaw");
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Development mode
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export const isDev = process.env.NODE_ENV === "development" ||
|
|
19
|
+
process.env.OG_DEV === "1" ||
|
|
20
|
+
process.env.OG_DEV === "true" ||
|
|
21
|
+
(process.env.OG_CORE_URL?.includes("localhost") ?? false);
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Core URL
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const DEV_CORE_URL = "http://localhost:53666";
|
|
26
|
+
const PROD_CORE_URL = "http://10.16.148.67:53666";
|
|
27
|
+
export const envCoreUrl = process.env.OG_CORE_URL;
|
|
28
|
+
export const defaultCoreUrl = envCoreUrl ?? (isDev ? DEV_CORE_URL : PROD_CORE_URL);
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// API key (optional env override)
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export const envApiKey = process.env.OG_API_KEY ?? "";
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Environment variable setter (for dashboard-launcher runtime config)
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Sets environment variables at runtime. Centralised here so that files
|
|
38
|
+
* making network calls never contain env access directly.
|
|
39
|
+
*/
|
|
40
|
+
export function setEnv(key, value) {
|
|
41
|
+
process.env[key] = value;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../agent/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GACvB,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAEpE,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,KAAK,GAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;IACtC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;IAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM;IAC7B,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC;AAE5D,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GAAuB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAEtE,MAAM,CAAC,MAAM,cAAc,GACzB,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AAEvD,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAW,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;AAE9D,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,KAAa;IAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventReporter - Handles batched event reporting to Core.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Queue non-blocking events and flush them in batches (100ms window)
|
|
6
|
+
* 2. Send blocking events synchronously and return block decisions
|
|
7
|
+
* 3. Handle network failures gracefully (fail-open)
|
|
8
|
+
* 4. Truncate large content to avoid timeouts
|
|
9
|
+
*/
|
|
10
|
+
import type { CoreCredentials } from "./config.js";
|
|
11
|
+
import type { Logger } from "./types.js";
|
|
12
|
+
import type { HookType, HookEventData } from "./hook-types.js";
|
|
13
|
+
export type BlockDecision = {
|
|
14
|
+
block: true;
|
|
15
|
+
reason: string;
|
|
16
|
+
findings?: Array<{
|
|
17
|
+
riskLevel: string;
|
|
18
|
+
riskType: string;
|
|
19
|
+
reason: string;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
export type EventReporterConfig = {
|
|
23
|
+
coreUrl: string;
|
|
24
|
+
pluginVersion: string;
|
|
25
|
+
/** Timeout for API calls in ms */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
/** Whether to enable batching (default: true) */
|
|
28
|
+
enableBatching?: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare class EventReporter {
|
|
31
|
+
private config;
|
|
32
|
+
private log;
|
|
33
|
+
private credentials;
|
|
34
|
+
/** Sequence counter per session */
|
|
35
|
+
private sessionSeq;
|
|
36
|
+
/** Run ID per session */
|
|
37
|
+
private sessionRunId;
|
|
38
|
+
/** Event queue for batching */
|
|
39
|
+
private queue;
|
|
40
|
+
/** Flush timer */
|
|
41
|
+
private flushTimer;
|
|
42
|
+
/** Whether we're currently flushing */
|
|
43
|
+
private flushing;
|
|
44
|
+
constructor(config: EventReporterConfig, log: Logger);
|
|
45
|
+
/** Set Core credentials for authenticated API calls */
|
|
46
|
+
setCredentials(credentials: CoreCredentials | null): void;
|
|
47
|
+
/** Set or get run ID for a session */
|
|
48
|
+
setRunId(sessionKey: string, runId: string): void;
|
|
49
|
+
getRunId(sessionKey: string): string | undefined;
|
|
50
|
+
/** Clear session state */
|
|
51
|
+
clearSession(sessionKey: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Report an event. For blocking hooks, this is synchronous and may return
|
|
54
|
+
* a block decision. For non-blocking hooks, this queues the event for batching.
|
|
55
|
+
*/
|
|
56
|
+
report(sessionKey: string, hookType: HookType, data: HookEventData, blocking?: boolean): Promise<BlockDecision | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Send a single event synchronously (for blocking hooks).
|
|
59
|
+
* Returns a block decision if Core says to block, undefined otherwise.
|
|
60
|
+
*/
|
|
61
|
+
private reportSync;
|
|
62
|
+
/**
|
|
63
|
+
* Queue an event for batched sending.
|
|
64
|
+
*/
|
|
65
|
+
private queueEvent;
|
|
66
|
+
/**
|
|
67
|
+
* Flush all queued events to Core.
|
|
68
|
+
*/
|
|
69
|
+
flush(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Send a batch of events for a single session.
|
|
72
|
+
*/
|
|
73
|
+
private sendBatch;
|
|
74
|
+
/**
|
|
75
|
+
* Get next sequence number for a session.
|
|
76
|
+
*/
|
|
77
|
+
private getNextSeq;
|
|
78
|
+
/**
|
|
79
|
+
* Sanitize event data: truncate large content, remove secrets.
|
|
80
|
+
*/
|
|
81
|
+
private sanitizeEventData;
|
|
82
|
+
/**
|
|
83
|
+
* Stop the reporter and flush remaining events.
|
|
84
|
+
*/
|
|
85
|
+
stop(): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=event-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-reporter.d.ts","sourceRoot":"","sources":["../../agent/event-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,QAAQ,EAER,aAAa,EAId,MAAM,iBAAiB,CAAC;AAuBzB,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ,CAAC;AAMF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAMF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAgC;IAEnD,mCAAmC;IACnC,OAAO,CAAC,UAAU,CAA6B;IAE/C,yBAAyB;IACzB,OAAO,CAAC,YAAY,CAA6B;IAEjD,+BAA+B;IAC/B,OAAO,CAAC,KAAK,CAGL;IAER,kBAAkB;IAClB,OAAO,CAAC,UAAU,CAA+B;IAEjD,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM;IAUpD,uDAAuD;IACvD,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIzD,sCAAsC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD,0BAA0B;IAC1B,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKtC;;;OAGG;IACG,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,aAAa,EACnB,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IA0BrC;;;OAGG;YACW,UAAU;IAoExB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC5B;;OAEG;YACW,SAAS;IAqDvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkCzB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAO5B"}
|