@yan162/changewayguard 6.8.25

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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/OpenClaw-linux_Mac-Guide-zh.md +89 -0
  3. package/dashboard-dist/api/122.index.js +95 -0
  4. package/dashboard-dist/api/122.index.js.map +1 -0
  5. package/dashboard-dist/api/143.index.js +2734 -0
  6. package/dashboard-dist/api/143.index.js.map +1 -0
  7. package/dashboard-dist/api/154.index.js +4151 -0
  8. package/dashboard-dist/api/154.index.js.map +1 -0
  9. package/dashboard-dist/api/173.index.js +24112 -0
  10. package/dashboard-dist/api/173.index.js.map +1 -0
  11. package/dashboard-dist/api/217.index.js +44 -0
  12. package/dashboard-dist/api/217.index.js.map +1 -0
  13. package/dashboard-dist/api/222.index.js +90 -0
  14. package/dashboard-dist/api/222.index.js.map +1 -0
  15. package/dashboard-dist/api/280.index.js +213 -0
  16. package/dashboard-dist/api/280.index.js.map +1 -0
  17. package/dashboard-dist/api/369.index.js +115 -0
  18. package/dashboard-dist/api/369.index.js.map +1 -0
  19. package/dashboard-dist/api/374.index.js +1896 -0
  20. package/dashboard-dist/api/374.index.js.map +1 -0
  21. package/dashboard-dist/api/424.index.js +135 -0
  22. package/dashboard-dist/api/424.index.js.map +1 -0
  23. package/dashboard-dist/api/445.index.js +3562 -0
  24. package/dashboard-dist/api/445.index.js.map +1 -0
  25. package/dashboard-dist/api/555.index.js +496 -0
  26. package/dashboard-dist/api/555.index.js.map +1 -0
  27. package/dashboard-dist/api/573.index.js +806 -0
  28. package/dashboard-dist/api/573.index.js.map +1 -0
  29. package/dashboard-dist/api/580.index.js +1420 -0
  30. package/dashboard-dist/api/580.index.js.map +1 -0
  31. package/dashboard-dist/api/581.index.js +67 -0
  32. package/dashboard-dist/api/581.index.js.map +1 -0
  33. package/dashboard-dist/api/598.index.js +328 -0
  34. package/dashboard-dist/api/598.index.js.map +1 -0
  35. package/dashboard-dist/api/720.index.js +105 -0
  36. package/dashboard-dist/api/720.index.js.map +1 -0
  37. package/dashboard-dist/api/744.index.js +333 -0
  38. package/dashboard-dist/api/744.index.js.map +1 -0
  39. package/dashboard-dist/api/818.index.js +374 -0
  40. package/dashboard-dist/api/818.index.js.map +1 -0
  41. package/dashboard-dist/api/831.index.js +99 -0
  42. package/dashboard-dist/api/831.index.js.map +1 -0
  43. package/dashboard-dist/api/84.index.js +64 -0
  44. package/dashboard-dist/api/84.index.js.map +1 -0
  45. package/dashboard-dist/api/900.index.js +81 -0
  46. package/dashboard-dist/api/900.index.js.map +1 -0
  47. package/dashboard-dist/api/917.index.js +88 -0
  48. package/dashboard-dist/api/917.index.js.map +1 -0
  49. package/dashboard-dist/api/927.index.js +4250 -0
  50. package/dashboard-dist/api/927.index.js.map +1 -0
  51. package/dashboard-dist/api/948.index.js +64 -0
  52. package/dashboard-dist/api/948.index.js.map +1 -0
  53. package/dashboard-dist/api/982.index.js +67 -0
  54. package/dashboard-dist/api/982.index.js.map +1 -0
  55. package/dashboard-dist/api/99.index.js +1176 -0
  56. package/dashboard-dist/api/99.index.js.map +1 -0
  57. package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
  58. package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
  59. package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
  60. package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
  61. package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
  62. package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
  63. package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
  64. package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
  65. package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
  66. package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
  67. package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
  68. package/dashboard-dist/api/index.js +28482 -0
  69. package/dashboard-dist/api/index.js.map +1 -0
  70. package/dashboard-dist/api/package.json +16 -0
  71. package/dashboard-dist/api/sourcemap-register.cjs +1 -0
  72. package/dashboard-dist/web/assets/index-BKUfzbIg.js +148 -0
  73. package/dashboard-dist/web/assets/index-rHRH99IQ.css +1 -0
  74. package/dashboard-dist/web/changeway-logo.png +0 -0
  75. package/dashboard-dist/web/favicon.svg +29 -0
  76. package/dashboard-dist/web/index.html +15 -0
  77. package/dashboard-dist/web/logo.svg +16 -0
  78. package/dist/agent/activation.d.ts +21 -0
  79. package/dist/agent/activation.d.ts.map +1 -0
  80. package/dist/agent/activation.js +94 -0
  81. package/dist/agent/activation.js.map +1 -0
  82. package/dist/agent/auth.d.ts +73 -0
  83. package/dist/agent/auth.d.ts.map +1 -0
  84. package/dist/agent/auth.js +363 -0
  85. package/dist/agent/auth.js.map +1 -0
  86. package/dist/agent/behavior-detector.d.ts +150 -0
  87. package/dist/agent/behavior-detector.d.ts.map +1 -0
  88. package/dist/agent/behavior-detector.js +559 -0
  89. package/dist/agent/behavior-detector.js.map +1 -0
  90. package/dist/agent/business-reporter.d.ts +114 -0
  91. package/dist/agent/business-reporter.d.ts.map +1 -0
  92. package/dist/agent/business-reporter.js +359 -0
  93. package/dist/agent/business-reporter.js.map +1 -0
  94. package/dist/agent/config-sync.d.ts +70 -0
  95. package/dist/agent/config-sync.d.ts.map +1 -0
  96. package/dist/agent/config-sync.js +133 -0
  97. package/dist/agent/config-sync.js.map +1 -0
  98. package/dist/agent/config.d.ts +98 -0
  99. package/dist/agent/config.d.ts.map +1 -0
  100. package/dist/agent/config.js +348 -0
  101. package/dist/agent/config.js.map +1 -0
  102. package/dist/agent/content-injection-scanner.d.ts +35 -0
  103. package/dist/agent/content-injection-scanner.d.ts.map +1 -0
  104. package/dist/agent/content-injection-scanner.js +270 -0
  105. package/dist/agent/content-injection-scanner.js.map +1 -0
  106. package/dist/agent/engine-log-writer.d.ts +6 -0
  107. package/dist/agent/engine-log-writer.d.ts.map +1 -0
  108. package/dist/agent/engine-log-writer.js +18 -0
  109. package/dist/agent/engine-log-writer.js.map +1 -0
  110. package/dist/agent/env.d.ts +19 -0
  111. package/dist/agent/env.d.ts.map +1 -0
  112. package/dist/agent/env.js +44 -0
  113. package/dist/agent/env.js.map +1 -0
  114. package/dist/agent/event-reporter.d.ts +87 -0
  115. package/dist/agent/event-reporter.d.ts.map +1 -0
  116. package/dist/agent/event-reporter.js +306 -0
  117. package/dist/agent/event-reporter.js.map +1 -0
  118. package/dist/agent/file-watcher.d.ts +50 -0
  119. package/dist/agent/file-watcher.d.ts.map +1 -0
  120. package/dist/agent/file-watcher.js +135 -0
  121. package/dist/agent/file-watcher.js.map +1 -0
  122. package/dist/agent/fs-utils.d.ts +22 -0
  123. package/dist/agent/fs-utils.d.ts.map +1 -0
  124. package/dist/agent/fs-utils.js +41 -0
  125. package/dist/agent/fs-utils.js.map +1 -0
  126. package/dist/agent/gateway-manager.d.ts +59 -0
  127. package/dist/agent/gateway-manager.d.ts.map +1 -0
  128. package/dist/agent/gateway-manager.js +583 -0
  129. package/dist/agent/gateway-manager.js.map +1 -0
  130. package/dist/agent/hook-types.d.ts +276 -0
  131. package/dist/agent/hook-types.d.ts.map +1 -0
  132. package/dist/agent/hook-types.js +51 -0
  133. package/dist/agent/hook-types.js.map +1 -0
  134. package/dist/agent/http-client.d.ts +19 -0
  135. package/dist/agent/http-client.d.ts.map +1 -0
  136. package/dist/agent/http-client.js +37 -0
  137. package/dist/agent/http-client.js.map +1 -0
  138. package/dist/agent/index.d.ts +8 -0
  139. package/dist/agent/index.d.ts.map +1 -0
  140. package/dist/agent/index.js +8 -0
  141. package/dist/agent/index.js.map +1 -0
  142. package/dist/agent/openclaw-hybrid-audit-changeway.js +1447 -0
  143. package/dist/agent/prompt-gate.d.ts +16 -0
  144. package/dist/agent/prompt-gate.d.ts.map +1 -0
  145. package/dist/agent/prompt-gate.js +58 -0
  146. package/dist/agent/prompt-gate.js.map +1 -0
  147. package/dist/agent/prompt-input.d.ts +9 -0
  148. package/dist/agent/prompt-input.d.ts.map +1 -0
  149. package/dist/agent/prompt-input.js +173 -0
  150. package/dist/agent/prompt-input.js.map +1 -0
  151. package/dist/agent/prompt-output.d.ts +4 -0
  152. package/dist/agent/prompt-output.d.ts.map +1 -0
  153. package/dist/agent/prompt-output.js +19 -0
  154. package/dist/agent/prompt-output.js.map +1 -0
  155. package/dist/agent/runner.d.ts +23 -0
  156. package/dist/agent/runner.d.ts.map +1 -0
  157. package/dist/agent/runner.js +165 -0
  158. package/dist/agent/runner.js.map +1 -0
  159. package/dist/agent/runtime-mode.d.ts +10 -0
  160. package/dist/agent/runtime-mode.d.ts.map +1 -0
  161. package/dist/agent/runtime-mode.js +19 -0
  162. package/dist/agent/runtime-mode.js.map +1 -0
  163. package/dist/agent/sanitizer.d.ts +10 -0
  164. package/dist/agent/sanitizer.d.ts.map +1 -0
  165. package/dist/agent/sanitizer.js +175 -0
  166. package/dist/agent/sanitizer.js.map +1 -0
  167. package/dist/agent/scan-activity.d.ts +19 -0
  168. package/dist/agent/scan-activity.d.ts.map +1 -0
  169. package/dist/agent/scan-activity.js +34 -0
  170. package/dist/agent/scan-activity.js.map +1 -0
  171. package/dist/agent/types.d.ts +177 -0
  172. package/dist/agent/types.d.ts.map +1 -0
  173. package/dist/agent/types.js +5 -0
  174. package/dist/agent/types.js.map +1 -0
  175. package/dist/agent/workspace-scanner.d.ts +35 -0
  176. package/dist/agent/workspace-scanner.d.ts.map +1 -0
  177. package/dist/agent/workspace-scanner.js +137 -0
  178. package/dist/agent/workspace-scanner.js.map +1 -0
  179. package/dist/dashboard-launcher.d.ts +52 -0
  180. package/dist/dashboard-launcher.d.ts.map +1 -0
  181. package/dist/dashboard-launcher.js +363 -0
  182. package/dist/dashboard-launcher.js.map +1 -0
  183. package/dist/gateway/activity.d.ts +52 -0
  184. package/dist/gateway/activity.d.ts.map +1 -0
  185. package/dist/gateway/activity.js +111 -0
  186. package/dist/gateway/activity.js.map +1 -0
  187. package/dist/gateway/config.d.ts +50 -0
  188. package/dist/gateway/config.d.ts.map +1 -0
  189. package/dist/gateway/config.js +200 -0
  190. package/dist/gateway/config.js.map +1 -0
  191. package/dist/gateway/handlers/anthropic.d.ts +12 -0
  192. package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
  193. package/dist/gateway/handlers/anthropic.js +254 -0
  194. package/dist/gateway/handlers/anthropic.js.map +1 -0
  195. package/dist/gateway/handlers/gemini.d.ts +12 -0
  196. package/dist/gateway/handlers/gemini.d.ts.map +1 -0
  197. package/dist/gateway/handlers/gemini.js +101 -0
  198. package/dist/gateway/handlers/gemini.js.map +1 -0
  199. package/dist/gateway/handlers/models.d.ts +4 -0
  200. package/dist/gateway/handlers/models.d.ts.map +1 -0
  201. package/dist/gateway/handlers/models.js +36 -0
  202. package/dist/gateway/handlers/models.js.map +1 -0
  203. package/dist/gateway/handlers/openai.d.ts +16 -0
  204. package/dist/gateway/handlers/openai.d.ts.map +1 -0
  205. package/dist/gateway/handlers/openai.js +254 -0
  206. package/dist/gateway/handlers/openai.js.map +1 -0
  207. package/dist/gateway/index.d.ts +27 -0
  208. package/dist/gateway/index.d.ts.map +1 -0
  209. package/dist/gateway/index.js +290 -0
  210. package/dist/gateway/index.js.map +1 -0
  211. package/dist/gateway/mapping-store.d.ts +38 -0
  212. package/dist/gateway/mapping-store.d.ts.map +1 -0
  213. package/dist/gateway/mapping-store.js +74 -0
  214. package/dist/gateway/mapping-store.js.map +1 -0
  215. package/dist/gateway/restorer.d.ts +63 -0
  216. package/dist/gateway/restorer.d.ts.map +1 -0
  217. package/dist/gateway/restorer.js +284 -0
  218. package/dist/gateway/restorer.js.map +1 -0
  219. package/dist/gateway/sanitizer.d.ts +17 -0
  220. package/dist/gateway/sanitizer.d.ts.map +1 -0
  221. package/dist/gateway/sanitizer.js +228 -0
  222. package/dist/gateway/sanitizer.js.map +1 -0
  223. package/dist/gateway/types.d.ts +53 -0
  224. package/dist/gateway/types.d.ts.map +1 -0
  225. package/dist/gateway/types.js +5 -0
  226. package/dist/gateway/types.js.map +1 -0
  227. package/dist/index.d.ts +19 -0
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +2990 -0
  230. package/dist/index.js.map +1 -0
  231. package/dist/memory/index.d.ts +5 -0
  232. package/dist/memory/index.d.ts.map +1 -0
  233. package/dist/memory/index.js +5 -0
  234. package/dist/memory/index.js.map +1 -0
  235. package/dist/memory/store.d.ts +82 -0
  236. package/dist/memory/store.d.ts.map +1 -0
  237. package/dist/memory/store.js +194 -0
  238. package/dist/memory/store.js.map +1 -0
  239. package/dist/platform-client/index.d.ts +63 -0
  240. package/dist/platform-client/index.d.ts.map +1 -0
  241. package/dist/platform-client/index.js +294 -0
  242. package/dist/platform-client/index.js.map +1 -0
  243. package/dist/platform-client/types.d.ts +109 -0
  244. package/dist/platform-client/types.d.ts.map +1 -0
  245. package/dist/platform-client/types.js +3 -0
  246. package/dist/platform-client/types.js.map +1 -0
  247. package/dist/workspace-agents-guide.d.ts +22 -0
  248. package/dist/workspace-agents-guide.d.ts.map +1 -0
  249. package/dist/workspace-agents-guide.js +92 -0
  250. package/dist/workspace-agents-guide.js.map +1 -0
  251. package/dist/workspace-agents-sync.d.ts +24 -0
  252. package/dist/workspace-agents-sync.d.ts.map +1 -0
  253. package/dist/workspace-agents-sync.js +41 -0
  254. package/dist/workspace-agents-sync.js.map +1 -0
  255. package/dist/workspace-agents-watcher.d.ts +23 -0
  256. package/dist/workspace-agents-watcher.d.ts.map +1 -0
  257. package/dist/workspace-agents-watcher.js +152 -0
  258. package/dist/workspace-agents-watcher.js.map +1 -0
  259. package/dist/workspace-discovery.d.ts +11 -0
  260. package/dist/workspace-discovery.d.ts.map +1 -0
  261. package/dist/workspace-discovery.js +116 -0
  262. package/dist/workspace-discovery.js.map +1 -0
  263. package/gateway/package-lock.json +597 -0
  264. package/gateway/package.json +57 -0
  265. package/gateway/pnpm-lock.yaml +342 -0
  266. package/gateway/src/activity.ts +142 -0
  267. package/gateway/src/config.ts +246 -0
  268. package/gateway/src/handlers/anthropic.ts +328 -0
  269. package/gateway/src/handlers/gemini.ts +122 -0
  270. package/gateway/src/handlers/models.ts +45 -0
  271. package/gateway/src/handlers/openai.ts +333 -0
  272. package/gateway/src/index.ts +344 -0
  273. package/gateway/src/mapping-store.ts +88 -0
  274. package/gateway/src/restorer.ts +322 -0
  275. package/gateway/src/sanitizer.ts +298 -0
  276. package/gateway/src/types.ts +73 -0
  277. package/gateway/tsconfig.json +20 -0
  278. package/openclaw.plugin.json +86 -0
  279. package/package.json +74 -0
  280. package/samples/Untitled +1 -0
  281. package/samples/clean-email.txt +20 -0
  282. package/samples/test-document.md +53 -0
  283. package/samples/test-email-popup.txt +44 -0
  284. package/samples/test-email.txt +32 -0
  285. package/samples/test-webpage.html +51 -0
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Local content sanitizer — strips PII and secrets before sending to API.
3
+ *
4
+ * Inspired by n8n's guardrails implementation (MIT).
5
+ * Replaces sensitive data with category placeholders while preserving
6
+ * the structure and context needed for injection detection.
7
+ */
8
+ const ENTITIES = [
9
+ // URLs (must come before email to avoid partial matches on domain parts)
10
+ {
11
+ category: "URL",
12
+ placeholder: "<URL>",
13
+ pattern: /https?:\/\/[^\s<>"{}|\\^`\[\]]+/g,
14
+ },
15
+ // Email
16
+ {
17
+ category: "EMAIL",
18
+ placeholder: "<EMAIL>",
19
+ pattern: /[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}/g,
20
+ },
21
+ // Credit Card (4 groups of 4 digits)
22
+ {
23
+ category: "CREDIT_CARD",
24
+ placeholder: "<CREDIT_CARD>",
25
+ pattern: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
26
+ },
27
+ // SSN (###-##-####)
28
+ {
29
+ category: "SSN",
30
+ placeholder: "<SSN>",
31
+ pattern: /\b\d{3}-\d{2}-\d{4}\b/g,
32
+ },
33
+ // IBAN
34
+ {
35
+ category: "IBAN",
36
+ placeholder: "<IBAN>",
37
+ pattern: /\b[A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}[A-Z0-9]{0,16}\b/g,
38
+ },
39
+ // IP Address
40
+ {
41
+ category: "IP_ADDRESS",
42
+ placeholder: "<IP_ADDRESS>",
43
+ pattern: /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,
44
+ },
45
+ // Phone numbers (US/intl formats)
46
+ {
47
+ category: "PHONE",
48
+ placeholder: "<PHONE>",
49
+ pattern: /[+]?[(]?[0-9]{3}[)]?[-\s.][0-9]{3}[-\s.][0-9]{4,6}\b/g,
50
+ },
51
+ ];
52
+ // Known secret prefixes
53
+ const SECRET_PREFIXES = [
54
+ "sk-",
55
+ "sk_",
56
+ "pk_",
57
+ "ghp_",
58
+ "AKIA",
59
+ "xox",
60
+ "SG.",
61
+ "hf_",
62
+ "api-",
63
+ "token-",
64
+ "secret-",
65
+ ];
66
+ const BEARER_PATTERN = /Bearer\s+[A-Za-z0-9\-_.~+/]+=*/g;
67
+ // Secret-like tokens: known prefix followed by alphanumeric/special chars
68
+ const SECRET_PREFIX_PATTERN = new RegExp(`(?:${SECRET_PREFIXES.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})[A-Za-z0-9\\-_.~+/]{8,}=*`, "g");
69
+ // =============================================================================
70
+ // Shannon Entropy
71
+ // =============================================================================
72
+ function shannonEntropy(s) {
73
+ if (s.length === 0)
74
+ return 0;
75
+ const freq = new Map();
76
+ for (const ch of s) {
77
+ freq.set(ch, (freq.get(ch) ?? 0) + 1);
78
+ }
79
+ let entropy = 0;
80
+ for (const count of freq.values()) {
81
+ const p = count / s.length;
82
+ entropy -= p * Math.log2(p);
83
+ }
84
+ return entropy;
85
+ }
86
+ function collectMatches(content) {
87
+ const matches = [];
88
+ // Regex-based entities
89
+ for (const entity of ENTITIES) {
90
+ // Reset lastIndex for global regexes
91
+ entity.pattern.lastIndex = 0;
92
+ let m;
93
+ while ((m = entity.pattern.exec(content)) !== null) {
94
+ matches.push({
95
+ text: m[0],
96
+ category: entity.category,
97
+ placeholder: entity.placeholder,
98
+ });
99
+ }
100
+ }
101
+ // Secret prefixes
102
+ SECRET_PREFIX_PATTERN.lastIndex = 0;
103
+ let m;
104
+ while ((m = SECRET_PREFIX_PATTERN.exec(content)) !== null) {
105
+ matches.push({
106
+ text: m[0],
107
+ category: "SECRET",
108
+ placeholder: "<SECRET>",
109
+ });
110
+ }
111
+ // Bearer tokens
112
+ BEARER_PATTERN.lastIndex = 0;
113
+ while ((m = BEARER_PATTERN.exec(content)) !== null) {
114
+ matches.push({
115
+ text: m[0],
116
+ category: "SECRET",
117
+ placeholder: "<SECRET>",
118
+ });
119
+ }
120
+ // High-entropy tokens (catch API keys/secrets that don't have known prefixes)
121
+ // Look for standalone tokens that look like secrets: 20+ chars, high entropy
122
+ const tokenPattern = /\b[A-Za-z0-9\-_.~+/]{20,}={0,3}\b/g;
123
+ tokenPattern.lastIndex = 0;
124
+ while ((m = tokenPattern.exec(content)) !== null) {
125
+ const token = m[0];
126
+ // Skip if already matched by another pattern
127
+ if (matches.some((existing) => existing.text === token))
128
+ continue;
129
+ // Skip if it looks like a normal word (all lowercase alpha, no digits/special)
130
+ if (/^[a-z]+$/.test(token))
131
+ continue;
132
+ // High entropy threshold (typical for random keys/tokens)
133
+ if (shannonEntropy(token) >= 4.0) {
134
+ matches.push({
135
+ text: token,
136
+ category: "SECRET",
137
+ placeholder: "<SECRET>",
138
+ });
139
+ }
140
+ }
141
+ return matches;
142
+ }
143
+ // =============================================================================
144
+ // Main Sanitizer
145
+ // =============================================================================
146
+ export function sanitizeContent(content) {
147
+ const matches = collectMatches(content);
148
+ if (matches.length === 0) {
149
+ return { sanitized: content, redactions: {}, totalRedactions: 0 };
150
+ }
151
+ // Deduplicate matches by text
152
+ const unique = new Map();
153
+ for (const match of matches) {
154
+ // Keep the first match for each text (preserves priority from entity order)
155
+ if (!unique.has(match.text)) {
156
+ unique.set(match.text, match);
157
+ }
158
+ }
159
+ // Sort by length descending — prevents partial matches corrupting longer ones
160
+ const sorted = [...unique.values()].sort((a, b) => b.text.length - a.text.length);
161
+ // Replace using split/join — safe against regex special chars in matched text
162
+ let sanitized = content;
163
+ const redactions = {};
164
+ for (const match of sorted) {
165
+ const parts = sanitized.split(match.text);
166
+ const count = parts.length - 1;
167
+ if (count > 0) {
168
+ sanitized = parts.join(match.placeholder);
169
+ redactions[match.category] = (redactions[match.category] ?? 0) + count;
170
+ }
171
+ }
172
+ const totalRedactions = Object.values(redactions).reduce((a, b) => a + b, 0);
173
+ return { sanitized, redactions, totalRedactions };
174
+ }
175
+ //# sourceMappingURL=sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../agent/sanitizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ToolCallObservationRequest } from "../platform-client/types.js";
2
+ type ScanSource = "prompt" | "content";
3
+ type ScanAction = "allow" | "alert" | "block" | string | undefined;
4
+ export type ScanActivityInput = {
5
+ source: ScanSource;
6
+ action: ScanAction;
7
+ agentId: string;
8
+ sessionKey?: string;
9
+ riskLevel?: string;
10
+ confidence?: number;
11
+ categories?: string[];
12
+ explanation?: string;
13
+ latencyMs?: number;
14
+ scannedToolName?: string;
15
+ violatingInput?: string;
16
+ };
17
+ export declare function buildScanActivityObservation(input: ScanActivityInput): ToolCallObservationRequest | null;
18
+ export {};
19
+ //# sourceMappingURL=scan-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-activity.d.ts","sourceRoot":"","sources":["../../agent/scan-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,KAAK,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AACvC,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,GAAG,0BAA0B,GAAG,IAAI,CAmCxG"}
@@ -0,0 +1,34 @@
1
+ export function buildScanActivityObservation(input) {
2
+ if (input.action !== "block" && input.action !== "alert") {
3
+ return null;
4
+ }
5
+ const confidencePercent = typeof input.confidence === "number"
6
+ ? `${Math.round(input.confidence * 100)}%`
7
+ : null;
8
+ const reasonParts = [
9
+ `${input.source}_scan`,
10
+ `action=${input.action}`,
11
+ input.riskLevel ? `risk=${input.riskLevel}` : null,
12
+ confidencePercent ? `confidence=${confidencePercent}` : null,
13
+ input.explanation ? `reason=${input.explanation}` : null,
14
+ input.source === "prompt" && input.violatingInput ? `input=${input.violatingInput}` : null,
15
+ ].filter((part) => !!part);
16
+ return {
17
+ agentId: input.agentId,
18
+ sessionKey: input.sessionKey,
19
+ toolName: input.source === "prompt" ? "security_prompt_scan" : "security_content_scan",
20
+ params: {
21
+ source: input.source,
22
+ scanAction: input.action,
23
+ riskLevel: input.riskLevel ?? null,
24
+ categories: input.categories ?? [],
25
+ ...(input.source === "prompt" && input.violatingInput ? { violatingInput: input.violatingInput } : {}),
26
+ ...(input.scannedToolName ? { scannedToolName: input.scannedToolName } : {}),
27
+ },
28
+ phase: "after",
29
+ blocked: true,
30
+ blockReason: reasonParts.join(" | "),
31
+ durationMs: input.latencyMs,
32
+ };
33
+ }
34
+ //# sourceMappingURL=scan-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-activity.js","sourceRoot":"","sources":["../../agent/scan-activity.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,4BAA4B,CAAC,KAAwB;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QAC5D,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG;QAC1C,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,WAAW,GAAG;QAClB,GAAG,KAAK,CAAC,MAAM,OAAO;QACtB,UAAU,KAAK,CAAC,MAAM,EAAE;QACxB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;QAClD,iBAAiB,CAAC,CAAC,CAAC,cAAc,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI;QAC5D,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;QACxD,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI;KAC3F,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,uBAAuB;QACtF,MAAM,EAAE;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E;QACD,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,UAAU,EAAE,KAAK,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Type definitions for OpenGuardrails Plugin
3
+ */
4
+ export type OpenClawGuardConfig = {
5
+ enabled?: boolean;
6
+ blockOnRisk?: boolean;
7
+ /** Optional API key override for configured Core endpoint. */
8
+ apiKey?: string;
9
+ timeoutMs?: number;
10
+ /** Core API URL (behavior detection).
11
+ * Default: http://10.16.148.67:53666 */
12
+ coreUrl?: string;
13
+ /** Agent name for dashboard metadata */
14
+ agentName?: string;
15
+ /** Deployment plan. Set to "enterprise" for self-hosted enterprise deployment.
16
+ * When "enterprise", coreUrl must point to the enterprise Core instance.
17
+ * Core API calls go to the enterprise coreUrl; dashboard reports to both
18
+ * local and enterprise Core for centralized security management. */
19
+ plan?: "enterprise";
20
+ };
21
+ export type AnalysisTarget = {
22
+ type: "message" | "tool_call" | "tool_result";
23
+ content: string;
24
+ toolName?: string;
25
+ toolParams?: Record<string, unknown>;
26
+ metadata?: Record<string, unknown>;
27
+ };
28
+ export type Finding = {
29
+ suspiciousContent: string;
30
+ reason: string;
31
+ confidence: number;
32
+ location?: {
33
+ start: number;
34
+ end: number;
35
+ };
36
+ };
37
+ export type AnalysisVerdict = {
38
+ isInjection: boolean;
39
+ confidence: number;
40
+ reason: string;
41
+ findings: Finding[];
42
+ chunksAnalyzed: number;
43
+ };
44
+ export type OpenGuardrailsApiResponse = {
45
+ ok: boolean;
46
+ verdict: {
47
+ isInjection: boolean;
48
+ confidence: number;
49
+ reason: string;
50
+ findings: Array<{
51
+ suspiciousContent: string;
52
+ reason: string;
53
+ confidence: number;
54
+ }>;
55
+ };
56
+ error?: string;
57
+ };
58
+ export type AnalysisLogEntry = {
59
+ id: number;
60
+ timestamp: string;
61
+ targetType: string;
62
+ contentLength: number;
63
+ chunksAnalyzed: number;
64
+ verdict: AnalysisVerdict;
65
+ durationMs: number;
66
+ blocked: boolean;
67
+ };
68
+ export type Logger = {
69
+ info: (msg: string) => void;
70
+ warn: (msg: string) => void;
71
+ error: (msg: string) => void;
72
+ debug?: (msg: string) => void;
73
+ };
74
+ export type SanitizeResult = {
75
+ sanitized: string;
76
+ redactions: Record<string, number>;
77
+ totalRedactions: number;
78
+ };
79
+ export type RiskLevel = "no_risk" | "low" | "medium" | "high" | "critical";
80
+ export type AssessAction = "allow" | "alert" | "block";
81
+ export type DetectionRiskType = "PROMPT_INJECTION" | "DATA_EXFILTRATION" | "COMMAND_EXECUTION";
82
+ export type DetectionFinding = {
83
+ riskLevel: RiskLevel;
84
+ riskType: DetectionRiskType;
85
+ riskContent: string;
86
+ reason: string;
87
+ };
88
+ export type ToolChainEntry = {
89
+ seq: number;
90
+ toolName: string;
91
+ sanitizedParams: Record<string, string>;
92
+ outcome: "success" | "error" | "timeout";
93
+ durationMs: number;
94
+ resultCategory: "text_small" | "text_large" | "binary" | "empty" | "error";
95
+ resultSizeBytes: number;
96
+ dataFlowFrom?: string;
97
+ };
98
+ export type PendingToolCall = {
99
+ toolName: string;
100
+ params: Record<string, string>;
101
+ };
102
+ export type ContentInjectionFinding = {
103
+ category: string;
104
+ confidence: "high" | "medium";
105
+ matchedText: string;
106
+ pattern: string;
107
+ };
108
+ export type BehaviorAssessRequest = {
109
+ agentId: string;
110
+ sessionKey: string;
111
+ runId: string;
112
+ userIntent: string;
113
+ toolChain: ToolChainEntry[];
114
+ /** The tool call about to execute — Core classifies and evaluates it. */
115
+ pendingTool?: PendingToolCall;
116
+ /** Content injection findings from local regex scanner. */
117
+ contentFindings?: ContentInjectionFinding[];
118
+ context: {
119
+ messageHistoryLength: number;
120
+ recentUserMessages: string[];
121
+ };
122
+ /**
123
+ * Client-supplied metadata for server-side correlation.
124
+ * Server merges these with its own fields (sourceIp, apiKey ref, serverTimestamp)
125
+ * before storing in behavior_events and surfacing in the dashboard.
126
+ */
127
+ meta: {
128
+ pluginVersion: string;
129
+ clientTimestamp: string;
130
+ };
131
+ };
132
+ export type BehaviorAssessResponse = {
133
+ behaviorId: string;
134
+ riskLevel: RiskLevel;
135
+ anomalyTypes: string[];
136
+ confidence: number;
137
+ action: AssessAction;
138
+ explanation: string;
139
+ affectedTools: number[];
140
+ findings?: DetectionFinding[];
141
+ };
142
+ export type PromptScanRequest = {
143
+ agentId: string;
144
+ sessionKey: string;
145
+ runId: string;
146
+ prompt: string;
147
+ role: "user";
148
+ source: "message_received";
149
+ context: {
150
+ messageHistoryLength: number;
151
+ recentUserMessages: string[];
152
+ userIntent: string;
153
+ };
154
+ meta: {
155
+ pluginVersion: string;
156
+ clientTimestamp: string;
157
+ };
158
+ };
159
+ export type PromptScanFinding = {
160
+ riskType: DetectionRiskType | string;
161
+ reason: string;
162
+ matchedText?: string;
163
+ confidence?: "high" | "medium" | "low" | number;
164
+ };
165
+ export type PromptScanResponse = {
166
+ promptId: string;
167
+ riskLevel: RiskLevel;
168
+ action: AssessAction;
169
+ confidence: number;
170
+ categories: string[];
171
+ findings?: PromptScanFinding[];
172
+ explanation: string;
173
+ latency_ms: number;
174
+ };
175
+ export type { HookType, HookEvent, HookEventData, EventStreamRequest, EventStreamResponse, BeforeAgentStartData, AgentEndData, SessionStartData, SessionEndData, MessageReceivedData, MessageSendingData, MessageSentData, BeforeMessageWriteData, BeforeModelResolveData, BeforePromptBuildData, LlmInputData, LlmOutputData, BeforeToolCallData, AfterToolCallData, ToolResultPersistData, BeforeCompactionData, AfterCompactionData, BeforeResetData, SubagentSpawningData, SubagentDeliveryTargetData, SubagentSpawnedData, SubagentEndedData, GatewayStartData, GatewayStopData, } from "./hook-types.js";
176
+ export { isBlockingHook, BLOCKING_HOOKS } from "./hook-types.js";
177
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../agent/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for OpenGuardrails Plugin
3
+ */
4
+ export { isBlockingHook, BLOCKING_HOOKS } from "./hook-types.js";
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../agent/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiQH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Workspace MD File Scanner
3
+ *
4
+ * Scans OpenClaw workspace for all .md files and categorizes them:
5
+ * - soul.md (agent personality)
6
+ * - agent.md (agent configuration)
7
+ * - memories/*.md (conversation memories)
8
+ * - heartbeat.md (task scheduler)
9
+ * - Other md files in workspace root
10
+ */
11
+ export type FileType = "soul" | "agent" | "memory" | "task" | "skill" | "plugin" | "other";
12
+ export interface WorkspaceFile {
13
+ path: string;
14
+ absolutePath: string;
15
+ content: string;
16
+ type: FileType;
17
+ sizeBytes: number;
18
+ }
19
+ /**
20
+ * Scan workspace for all .md files
21
+ */
22
+ export declare function scanWorkspaceMdFiles(): Promise<WorkspaceFile[]>;
23
+ /**
24
+ * Scan specific file types
25
+ */
26
+ export declare function scanFilesByType(types: FileType[]): Promise<WorkspaceFile[]>;
27
+ /**
28
+ * Get summary of workspace files
29
+ */
30
+ export declare function getWorkspaceSummary(): Promise<{
31
+ totalFiles: number;
32
+ byType: Record<FileType, number>;
33
+ totalSizeBytes: number;
34
+ }>;
35
+ //# sourceMappingURL=workspace-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-scanner.d.ts","sourceRoot":"","sources":["../../agent/workspace-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAqED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CA2BrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAyBD"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Workspace MD File Scanner
3
+ *
4
+ * Scans OpenClaw workspace for all .md files and categorizes them:
5
+ * - soul.md (agent personality)
6
+ * - agent.md (agent configuration)
7
+ * - memories/*.md (conversation memories)
8
+ * - heartbeat.md (task scheduler)
9
+ * - Other md files in workspace root
10
+ */
11
+ import fs from "node:fs";
12
+ import path from "node:path";
13
+ import { openclawHome } from "./env.js";
14
+ /**
15
+ * Get OpenClaw workspace directory
16
+ */
17
+ function getWorkspaceDir() {
18
+ return openclawHome;
19
+ }
20
+ /**
21
+ * Categorize file by path
22
+ */
23
+ function categorizeFile(relativePath) {
24
+ const lower = relativePath.toLowerCase();
25
+ if (lower === "soul.md")
26
+ return "soul";
27
+ if (lower === "agent.md")
28
+ return "agent";
29
+ if (lower === "heartbeat.md")
30
+ return "task";
31
+ if (lower.startsWith("memories/") || lower.startsWith("memories\\"))
32
+ return "memory";
33
+ if (lower.startsWith("skills/") || lower.startsWith("skills\\"))
34
+ return "skill";
35
+ if (lower.startsWith("plugins/") || lower.startsWith("plugins\\"))
36
+ return "plugin";
37
+ return "other";
38
+ }
39
+ /**
40
+ * Recursively find all .md files in a directory
41
+ */
42
+ async function findMdFiles(dir, baseDir) {
43
+ const files = [];
44
+ try {
45
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
46
+ for (const entry of entries) {
47
+ const fullPath = path.join(dir, entry.name);
48
+ if (entry.isDirectory()) {
49
+ // Skip node_modules, .git, dist, build directories
50
+ if (["node_modules", ".git", "dist", "build", ".cache"].includes(entry.name)) {
51
+ continue;
52
+ }
53
+ // Recursively scan subdirectories
54
+ const subFiles = await findMdFiles(fullPath, baseDir);
55
+ files.push(...subFiles);
56
+ }
57
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
58
+ const relativePath = path.relative(baseDir, fullPath);
59
+ files.push(relativePath);
60
+ }
61
+ }
62
+ }
63
+ catch {
64
+ // Ignore permission errors, etc.
65
+ }
66
+ return files;
67
+ }
68
+ /**
69
+ * Read file content safely
70
+ */
71
+ async function readFileSafe(filePath) {
72
+ try {
73
+ return await fs.promises.readFile(filePath, "utf-8");
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ /**
80
+ * Scan workspace for all .md files
81
+ */
82
+ export async function scanWorkspaceMdFiles() {
83
+ const workspaceDir = getWorkspaceDir();
84
+ const files = [];
85
+ // Find all .md files
86
+ const mdFiles = await findMdFiles(workspaceDir, workspaceDir);
87
+ // Read each file
88
+ for (const relativePath of mdFiles) {
89
+ const absolutePath = path.join(workspaceDir, relativePath);
90
+ const content = await readFileSafe(absolutePath);
91
+ if (content === null)
92
+ continue; // Skip unreadable files
93
+ const type = categorizeFile(relativePath);
94
+ const sizeBytes = Buffer.byteLength(content, "utf-8");
95
+ files.push({
96
+ path: relativePath,
97
+ absolutePath,
98
+ content,
99
+ type,
100
+ sizeBytes,
101
+ });
102
+ }
103
+ return files;
104
+ }
105
+ /**
106
+ * Scan specific file types
107
+ */
108
+ export async function scanFilesByType(types) {
109
+ const allFiles = await scanWorkspaceMdFiles();
110
+ return allFiles.filter(f => types.includes(f.type));
111
+ }
112
+ /**
113
+ * Get summary of workspace files
114
+ */
115
+ export async function getWorkspaceSummary() {
116
+ const files = await scanWorkspaceMdFiles();
117
+ const byType = {
118
+ soul: 0,
119
+ agent: 0,
120
+ memory: 0,
121
+ task: 0,
122
+ skill: 0,
123
+ plugin: 0,
124
+ other: 0,
125
+ };
126
+ let totalSizeBytes = 0;
127
+ for (const file of files) {
128
+ byType[file.type]++;
129
+ totalSizeBytes += file.sizeBytes;
130
+ }
131
+ return {
132
+ totalFiles: files.length,
133
+ byType,
134
+ totalSizeBytes,
135
+ };
136
+ }
137
+ //# sourceMappingURL=workspace-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-scanner.js","sourceRoot":"","sources":["../../agent/workspace-scanner.ts"],"names":[],"mappings":"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"}