@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.
Files changed (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +270 -0
  3. package/dashboard-dist/api/104.index.js +1420 -0
  4. package/dashboard-dist/api/104.index.js.map +1 -0
  5. package/dashboard-dist/api/113.index.js +496 -0
  6. package/dashboard-dist/api/113.index.js.map +1 -0
  7. package/dashboard-dist/api/18.index.js +67 -0
  8. package/dashboard-dist/api/18.index.js.map +1 -0
  9. package/dashboard-dist/api/217.index.js +44 -0
  10. package/dashboard-dist/api/217.index.js.map +1 -0
  11. package/dashboard-dist/api/222.index.js +90 -0
  12. package/dashboard-dist/api/222.index.js.map +1 -0
  13. package/dashboard-dist/api/25.index.js +3562 -0
  14. package/dashboard-dist/api/25.index.js.map +1 -0
  15. package/dashboard-dist/api/280.index.js +206 -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/377.index.js +1176 -0
  20. package/dashboard-dist/api/377.index.js.map +1 -0
  21. package/dashboard-dist/api/411.index.js +4250 -0
  22. package/dashboard-dist/api/411.index.js.map +1 -0
  23. package/dashboard-dist/api/424.index.js +135 -0
  24. package/dashboard-dist/api/424.index.js.map +1 -0
  25. package/dashboard-dist/api/573.index.js +806 -0
  26. package/dashboard-dist/api/573.index.js.map +1 -0
  27. package/dashboard-dist/api/598.index.js +328 -0
  28. package/dashboard-dist/api/598.index.js.map +1 -0
  29. package/dashboard-dist/api/62.index.js +4151 -0
  30. package/dashboard-dist/api/62.index.js.map +1 -0
  31. package/dashboard-dist/api/67.index.js +23383 -0
  32. package/dashboard-dist/api/67.index.js.map +1 -0
  33. package/dashboard-dist/api/678.index.js +2734 -0
  34. package/dashboard-dist/api/678.index.js.map +1 -0
  35. package/dashboard-dist/api/698.index.js +1896 -0
  36. package/dashboard-dist/api/698.index.js.map +1 -0
  37. package/dashboard-dist/api/720.index.js +98 -0
  38. package/dashboard-dist/api/720.index.js.map +1 -0
  39. package/dashboard-dist/api/830.index.js +95 -0
  40. package/dashboard-dist/api/830.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 +65 -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/948.index.js +64 -0
  50. package/dashboard-dist/api/948.index.js.map +1 -0
  51. package/dashboard-dist/api/953.index.js +67 -0
  52. package/dashboard-dist/api/953.index.js.map +1 -0
  53. package/dashboard-dist/api/975.index.js +374 -0
  54. package/dashboard-dist/api/975.index.js.map +1 -0
  55. package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
  56. package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
  57. package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
  58. package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
  59. package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
  60. package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
  61. package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
  62. package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
  63. package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
  64. package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
  65. package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
  66. package/dashboard-dist/api/index.js +27340 -0
  67. package/dashboard-dist/api/index.js.map +1 -0
  68. package/dashboard-dist/api/package.json +16 -0
  69. package/dashboard-dist/api/sourcemap-register.cjs +1 -0
  70. package/dashboard-dist/web/assets/index-CqWIeBTD.js +158 -0
  71. package/dashboard-dist/web/assets/index-Dw7--9q4.css +1 -0
  72. package/dashboard-dist/web/changeway-logo.png +0 -0
  73. package/dashboard-dist/web/favicon.svg +29 -0
  74. package/dashboard-dist/web/index.html +14 -0
  75. package/dashboard-dist/web/logo.svg +16 -0
  76. package/dist/agent/auth.d.ts +37 -0
  77. package/dist/agent/auth.d.ts.map +1 -0
  78. package/dist/agent/auth.js +151 -0
  79. package/dist/agent/auth.js.map +1 -0
  80. package/dist/agent/behavior-detector.d.ts +150 -0
  81. package/dist/agent/behavior-detector.d.ts.map +1 -0
  82. package/dist/agent/behavior-detector.js +573 -0
  83. package/dist/agent/behavior-detector.js.map +1 -0
  84. package/dist/agent/business-reporter.d.ts +114 -0
  85. package/dist/agent/business-reporter.d.ts.map +1 -0
  86. package/dist/agent/business-reporter.js +359 -0
  87. package/dist/agent/business-reporter.js.map +1 -0
  88. package/dist/agent/config-sync.d.ts +70 -0
  89. package/dist/agent/config-sync.d.ts.map +1 -0
  90. package/dist/agent/config-sync.js +133 -0
  91. package/dist/agent/config-sync.js.map +1 -0
  92. package/dist/agent/config.d.ts +97 -0
  93. package/dist/agent/config.d.ts.map +1 -0
  94. package/dist/agent/config.js +359 -0
  95. package/dist/agent/config.js.map +1 -0
  96. package/dist/agent/content-injection-scanner.d.ts +35 -0
  97. package/dist/agent/content-injection-scanner.d.ts.map +1 -0
  98. package/dist/agent/content-injection-scanner.js +270 -0
  99. package/dist/agent/content-injection-scanner.js.map +1 -0
  100. package/dist/agent/engine-log-writer.d.ts +6 -0
  101. package/dist/agent/engine-log-writer.d.ts.map +1 -0
  102. package/dist/agent/engine-log-writer.js +18 -0
  103. package/dist/agent/engine-log-writer.js.map +1 -0
  104. package/dist/agent/env.d.ts +19 -0
  105. package/dist/agent/env.d.ts.map +1 -0
  106. package/dist/agent/env.js +43 -0
  107. package/dist/agent/env.js.map +1 -0
  108. package/dist/agent/event-reporter.d.ts +87 -0
  109. package/dist/agent/event-reporter.d.ts.map +1 -0
  110. package/dist/agent/event-reporter.js +315 -0
  111. package/dist/agent/event-reporter.js.map +1 -0
  112. package/dist/agent/file-watcher.d.ts +50 -0
  113. package/dist/agent/file-watcher.d.ts.map +1 -0
  114. package/dist/agent/file-watcher.js +135 -0
  115. package/dist/agent/file-watcher.js.map +1 -0
  116. package/dist/agent/fs-utils.d.ts +22 -0
  117. package/dist/agent/fs-utils.d.ts.map +1 -0
  118. package/dist/agent/fs-utils.js +41 -0
  119. package/dist/agent/fs-utils.js.map +1 -0
  120. package/dist/agent/gateway-manager.d.ts +59 -0
  121. package/dist/agent/gateway-manager.d.ts.map +1 -0
  122. package/dist/agent/gateway-manager.js +583 -0
  123. package/dist/agent/gateway-manager.js.map +1 -0
  124. package/dist/agent/hook-types.d.ts +276 -0
  125. package/dist/agent/hook-types.d.ts.map +1 -0
  126. package/dist/agent/hook-types.js +51 -0
  127. package/dist/agent/hook-types.js.map +1 -0
  128. package/dist/agent/index.d.ts +8 -0
  129. package/dist/agent/index.d.ts.map +1 -0
  130. package/dist/agent/index.js +8 -0
  131. package/dist/agent/index.js.map +1 -0
  132. package/dist/agent/prompt-gate.d.ts +13 -0
  133. package/dist/agent/prompt-gate.d.ts.map +1 -0
  134. package/dist/agent/prompt-gate.js +28 -0
  135. package/dist/agent/prompt-gate.js.map +1 -0
  136. package/dist/agent/prompt-input.d.ts +9 -0
  137. package/dist/agent/prompt-input.d.ts.map +1 -0
  138. package/dist/agent/prompt-input.js +158 -0
  139. package/dist/agent/prompt-input.js.map +1 -0
  140. package/dist/agent/prompt-output.d.ts +4 -0
  141. package/dist/agent/prompt-output.d.ts.map +1 -0
  142. package/dist/agent/prompt-output.js +19 -0
  143. package/dist/agent/prompt-output.js.map +1 -0
  144. package/dist/agent/runner.d.ts +23 -0
  145. package/dist/agent/runner.d.ts.map +1 -0
  146. package/dist/agent/runner.js +154 -0
  147. package/dist/agent/runner.js.map +1 -0
  148. package/dist/agent/sanitizer.d.ts +10 -0
  149. package/dist/agent/sanitizer.d.ts.map +1 -0
  150. package/dist/agent/sanitizer.js +175 -0
  151. package/dist/agent/sanitizer.js.map +1 -0
  152. package/dist/agent/scan-activity.d.ts +18 -0
  153. package/dist/agent/scan-activity.d.ts.map +1 -0
  154. package/dist/agent/scan-activity.js +32 -0
  155. package/dist/agent/scan-activity.js.map +1 -0
  156. package/dist/agent/types.d.ts +177 -0
  157. package/dist/agent/types.d.ts.map +1 -0
  158. package/dist/agent/types.js +5 -0
  159. package/dist/agent/types.js.map +1 -0
  160. package/dist/agent/workspace-scanner.d.ts +35 -0
  161. package/dist/agent/workspace-scanner.d.ts.map +1 -0
  162. package/dist/agent/workspace-scanner.js +137 -0
  163. package/dist/agent/workspace-scanner.js.map +1 -0
  164. package/dist/dashboard-launcher.d.ts +52 -0
  165. package/dist/dashboard-launcher.d.ts.map +1 -0
  166. package/dist/dashboard-launcher.js +363 -0
  167. package/dist/dashboard-launcher.js.map +1 -0
  168. package/dist/gateway/activity.d.ts +52 -0
  169. package/dist/gateway/activity.d.ts.map +1 -0
  170. package/dist/gateway/activity.js +111 -0
  171. package/dist/gateway/activity.js.map +1 -0
  172. package/dist/gateway/config.d.ts +50 -0
  173. package/dist/gateway/config.d.ts.map +1 -0
  174. package/dist/gateway/config.js +200 -0
  175. package/dist/gateway/config.js.map +1 -0
  176. package/dist/gateway/gateway/activity.d.ts +52 -0
  177. package/dist/gateway/gateway/activity.d.ts.map +1 -0
  178. package/dist/gateway/gateway/activity.js +111 -0
  179. package/dist/gateway/gateway/activity.js.map +1 -0
  180. package/dist/gateway/gateway/config.d.ts +50 -0
  181. package/dist/gateway/gateway/config.d.ts.map +1 -0
  182. package/dist/gateway/gateway/config.js +200 -0
  183. package/dist/gateway/gateway/config.js.map +1 -0
  184. package/dist/gateway/gateway/handlers/anthropic.d.ts +12 -0
  185. package/dist/gateway/gateway/handlers/anthropic.d.ts.map +1 -0
  186. package/dist/gateway/gateway/handlers/anthropic.js +254 -0
  187. package/dist/gateway/gateway/handlers/anthropic.js.map +1 -0
  188. package/dist/gateway/gateway/handlers/gemini.d.ts +12 -0
  189. package/dist/gateway/gateway/handlers/gemini.d.ts.map +1 -0
  190. package/dist/gateway/gateway/handlers/gemini.js +101 -0
  191. package/dist/gateway/gateway/handlers/gemini.js.map +1 -0
  192. package/dist/gateway/gateway/handlers/models.d.ts +4 -0
  193. package/dist/gateway/gateway/handlers/models.d.ts.map +1 -0
  194. package/dist/gateway/gateway/handlers/models.js +36 -0
  195. package/dist/gateway/gateway/handlers/models.js.map +1 -0
  196. package/dist/gateway/gateway/handlers/openai.d.ts +16 -0
  197. package/dist/gateway/gateway/handlers/openai.d.ts.map +1 -0
  198. package/dist/gateway/gateway/handlers/openai.js +254 -0
  199. package/dist/gateway/gateway/handlers/openai.js.map +1 -0
  200. package/dist/gateway/gateway/index.d.ts +27 -0
  201. package/dist/gateway/gateway/index.d.ts.map +1 -0
  202. package/dist/gateway/gateway/index.js +293 -0
  203. package/dist/gateway/gateway/index.js.map +1 -0
  204. package/dist/gateway/gateway/mapping-store.d.ts +38 -0
  205. package/dist/gateway/gateway/mapping-store.d.ts.map +1 -0
  206. package/dist/gateway/gateway/mapping-store.js +74 -0
  207. package/dist/gateway/gateway/mapping-store.js.map +1 -0
  208. package/dist/gateway/gateway/restorer.d.ts +63 -0
  209. package/dist/gateway/gateway/restorer.d.ts.map +1 -0
  210. package/dist/gateway/gateway/restorer.js +284 -0
  211. package/dist/gateway/gateway/restorer.js.map +1 -0
  212. package/dist/gateway/gateway/sanitizer.d.ts +17 -0
  213. package/dist/gateway/gateway/sanitizer.d.ts.map +1 -0
  214. package/dist/gateway/gateway/sanitizer.js +228 -0
  215. package/dist/gateway/gateway/sanitizer.js.map +1 -0
  216. package/dist/gateway/gateway/types.d.ts +53 -0
  217. package/dist/gateway/gateway/types.d.ts.map +1 -0
  218. package/dist/gateway/gateway/types.js +5 -0
  219. package/dist/gateway/gateway/types.js.map +1 -0
  220. package/dist/gateway/handlers/anthropic.d.ts +12 -0
  221. package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
  222. package/dist/gateway/handlers/anthropic.js +254 -0
  223. package/dist/gateway/handlers/anthropic.js.map +1 -0
  224. package/dist/gateway/handlers/gemini.d.ts +12 -0
  225. package/dist/gateway/handlers/gemini.d.ts.map +1 -0
  226. package/dist/gateway/handlers/gemini.js +101 -0
  227. package/dist/gateway/handlers/gemini.js.map +1 -0
  228. package/dist/gateway/handlers/models.d.ts +4 -0
  229. package/dist/gateway/handlers/models.d.ts.map +1 -0
  230. package/dist/gateway/handlers/models.js +36 -0
  231. package/dist/gateway/handlers/models.js.map +1 -0
  232. package/dist/gateway/handlers/openai.d.ts +16 -0
  233. package/dist/gateway/handlers/openai.d.ts.map +1 -0
  234. package/dist/gateway/handlers/openai.js +254 -0
  235. package/dist/gateway/handlers/openai.js.map +1 -0
  236. package/dist/gateway/index.d.ts +27 -0
  237. package/dist/gateway/index.d.ts.map +1 -0
  238. package/dist/gateway/index.js +293 -0
  239. package/dist/gateway/index.js.map +1 -0
  240. package/dist/gateway/mapping-store.d.ts +38 -0
  241. package/dist/gateway/mapping-store.d.ts.map +1 -0
  242. package/dist/gateway/mapping-store.js +74 -0
  243. package/dist/gateway/mapping-store.js.map +1 -0
  244. package/dist/gateway/restorer.d.ts +63 -0
  245. package/dist/gateway/restorer.d.ts.map +1 -0
  246. package/dist/gateway/restorer.js +284 -0
  247. package/dist/gateway/restorer.js.map +1 -0
  248. package/dist/gateway/sanitizer.d.ts +17 -0
  249. package/dist/gateway/sanitizer.d.ts.map +1 -0
  250. package/dist/gateway/sanitizer.js +228 -0
  251. package/dist/gateway/sanitizer.js.map +1 -0
  252. package/dist/gateway/types.d.ts +53 -0
  253. package/dist/gateway/types.d.ts.map +1 -0
  254. package/dist/gateway/types.js +5 -0
  255. package/dist/gateway/types.js.map +1 -0
  256. package/dist/index.d.ts +19 -0
  257. package/dist/index.d.ts.map +1 -0
  258. package/dist/index.js +2084 -0
  259. package/dist/index.js.map +1 -0
  260. package/dist/memory/index.d.ts +5 -0
  261. package/dist/memory/index.d.ts.map +1 -0
  262. package/dist/memory/index.js +5 -0
  263. package/dist/memory/index.js.map +1 -0
  264. package/dist/memory/store.d.ts +82 -0
  265. package/dist/memory/store.d.ts.map +1 -0
  266. package/dist/memory/store.js +194 -0
  267. package/dist/memory/store.js.map +1 -0
  268. package/dist/platform-client/index.d.ts +63 -0
  269. package/dist/platform-client/index.d.ts.map +1 -0
  270. package/dist/platform-client/index.js +294 -0
  271. package/dist/platform-client/index.js.map +1 -0
  272. package/dist/platform-client/types.d.ts +109 -0
  273. package/dist/platform-client/types.d.ts.map +1 -0
  274. package/dist/platform-client/types.js +3 -0
  275. package/dist/platform-client/types.js.map +1 -0
  276. package/gateway/activity.d.ts +52 -0
  277. package/gateway/activity.d.ts.map +1 -0
  278. package/gateway/activity.js +111 -0
  279. package/gateway/activity.js.map +1 -0
  280. package/gateway/config.d.ts +50 -0
  281. package/gateway/config.d.ts.map +1 -0
  282. package/gateway/config.js +200 -0
  283. package/gateway/config.js.map +1 -0
  284. package/gateway/handlers/anthropic.d.ts +12 -0
  285. package/gateway/handlers/anthropic.d.ts.map +1 -0
  286. package/gateway/handlers/anthropic.js +254 -0
  287. package/gateway/handlers/anthropic.js.map +1 -0
  288. package/gateway/handlers/gemini.d.ts +12 -0
  289. package/gateway/handlers/gemini.d.ts.map +1 -0
  290. package/gateway/handlers/gemini.js +101 -0
  291. package/gateway/handlers/gemini.js.map +1 -0
  292. package/gateway/handlers/models.d.ts +4 -0
  293. package/gateway/handlers/models.d.ts.map +1 -0
  294. package/gateway/handlers/models.js +36 -0
  295. package/gateway/handlers/models.js.map +1 -0
  296. package/gateway/handlers/openai.d.ts +16 -0
  297. package/gateway/handlers/openai.d.ts.map +1 -0
  298. package/gateway/handlers/openai.js +254 -0
  299. package/gateway/handlers/openai.js.map +1 -0
  300. package/gateway/index.d.ts +27 -0
  301. package/gateway/index.d.ts.map +1 -0
  302. package/gateway/index.js +293 -0
  303. package/gateway/index.js.map +1 -0
  304. package/gateway/mapping-store.d.ts +38 -0
  305. package/gateway/mapping-store.d.ts.map +1 -0
  306. package/gateway/mapping-store.js +74 -0
  307. package/gateway/mapping-store.js.map +1 -0
  308. package/gateway/restorer.d.ts +63 -0
  309. package/gateway/restorer.d.ts.map +1 -0
  310. package/gateway/restorer.js +284 -0
  311. package/gateway/restorer.js.map +1 -0
  312. package/gateway/sanitizer.d.ts +17 -0
  313. package/gateway/sanitizer.d.ts.map +1 -0
  314. package/gateway/sanitizer.js +228 -0
  315. package/gateway/sanitizer.js.map +1 -0
  316. package/gateway/types.d.ts +53 -0
  317. package/gateway/types.d.ts.map +1 -0
  318. package/gateway/types.js +5 -0
  319. package/gateway/types.js.map +1 -0
  320. package/openclaw.plugin.json +86 -0
  321. package/package.json +74 -0
  322. package/samples/Untitled +1 -0
  323. package/samples/clean-email.txt +20 -0
  324. package/samples/test-document.md +53 -0
  325. package/samples/test-email-popup.txt +44 -0
  326. package/samples/test-email.txt +32 -0
  327. package/samples/test-webpage.html +51 -0
  328. package/scripts/enterprise-enroll.sh +89 -0
  329. package/scripts/enterprise-unenroll.sh +75 -0
@@ -0,0 +1,284 @@
1
+ /**
2
+ * AI Security Gateway - Content Restorer
3
+ *
4
+ * Restores sanitized placeholders back to original values.
5
+ * Handles LLM corruption patterns (missing underscores, case variations).
6
+ *
7
+ * Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
8
+ */
9
+ /**
10
+ * Build a map from placeholder patterns to original values
11
+ * Handles variations that LLMs might produce
12
+ */
13
+ function buildRestorationMap(mappingTable) {
14
+ const restorationMap = new Map();
15
+ for (const [placeholder, originalValue] of mappingTable.entries()) {
16
+ // Extract the core pattern from placeholder like __PII_EMAIL_ADDRESS_00000001__
17
+ const match = placeholder.match(/^__PII_([A-Z_]+)_(\d+)__$/);
18
+ if (!match) {
19
+ // Fallback: exact match only
20
+ restorationMap.set(new RegExp(escapeRegex(placeholder), "g"), originalValue);
21
+ continue;
22
+ }
23
+ const entityType = match[1];
24
+ const serialId = match[2];
25
+ // Create flexible pattern that handles LLM corruption:
26
+ // - Missing leading/trailing underscores
27
+ // - Case variations
28
+ // - Extra spaces
29
+ const flexiblePattern = new RegExp(`_?_?PII[_\\s]*${entityType}[_\\s]*${serialId}_?_?`, "gi");
30
+ restorationMap.set(flexiblePattern, originalValue);
31
+ }
32
+ return restorationMap;
33
+ }
34
+ /**
35
+ * Escape special regex characters
36
+ */
37
+ function escapeRegex(str) {
38
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
39
+ }
40
+ /**
41
+ * Restore placeholders in a string
42
+ */
43
+ function restoreText(text, mappingTable) {
44
+ if (mappingTable.size === 0)
45
+ return text;
46
+ let restored = text;
47
+ // First pass: exact matches (fastest)
48
+ for (const [placeholder, originalValue] of mappingTable.entries()) {
49
+ if (restored.includes(placeholder)) {
50
+ restored = restored.split(placeholder).join(originalValue);
51
+ }
52
+ }
53
+ // Second pass: flexible patterns for LLM corruption
54
+ const restorationMap = buildRestorationMap(mappingTable);
55
+ for (const [pattern, originalValue] of restorationMap.entries()) {
56
+ restored = restored.replace(pattern, originalValue);
57
+ }
58
+ // Third pass: handle "leaked ID suffix" pattern
59
+ // LLM might output: "original_value_00000001" instead of just "original_value"
60
+ for (const [placeholder, originalValue] of mappingTable.entries()) {
61
+ const match = placeholder.match(/^__PII_[A-Z_]+_(\d+)__$/);
62
+ if (match) {
63
+ const serialId = match[1];
64
+ // Pattern: original value followed by underscore and serial ID
65
+ const leakedPattern = new RegExp(escapeRegex(originalValue) + `[_\\s]*${serialId}`, "g");
66
+ restored = restored.replace(leakedPattern, originalValue);
67
+ }
68
+ }
69
+ return restored;
70
+ }
71
+ /**
72
+ * Recursively restore any value (string, object, array)
73
+ */
74
+ function restoreValue(value, mappingTable) {
75
+ if (typeof value === "string") {
76
+ return restoreText(value, mappingTable);
77
+ }
78
+ if (Array.isArray(value)) {
79
+ return value.map((item) => restoreValue(item, mappingTable));
80
+ }
81
+ if (value !== null && typeof value === "object") {
82
+ const restored = {};
83
+ for (const [key, val] of Object.entries(value)) {
84
+ restored[key] = restoreValue(val, mappingTable);
85
+ }
86
+ return restored;
87
+ }
88
+ return value;
89
+ }
90
+ /**
91
+ * Restore any content (object, array, string) using the mapping table
92
+ */
93
+ export function restore(content, mappingTable) {
94
+ if (mappingTable.size === 0)
95
+ return content;
96
+ return restoreValue(content, mappingTable);
97
+ }
98
+ /**
99
+ * Restore a JSON string
100
+ * Useful for SSE streaming where each chunk is a JSON string
101
+ */
102
+ export function restoreJSON(jsonString, mappingTable) {
103
+ if (mappingTable.size === 0)
104
+ return jsonString;
105
+ try {
106
+ const parsed = JSON.parse(jsonString);
107
+ const restored = restore(parsed, mappingTable);
108
+ return JSON.stringify(restored);
109
+ }
110
+ catch {
111
+ // If not valid JSON, treat as plain text
112
+ return restoreText(jsonString, mappingTable);
113
+ }
114
+ }
115
+ /**
116
+ * Restore SSE data line (for streaming responses)
117
+ * Format: "data: {...}\n"
118
+ */
119
+ export function restoreSSELine(line, mappingTable) {
120
+ if (mappingTable.size === 0)
121
+ return line;
122
+ if (!line.startsWith("data: "))
123
+ return line;
124
+ const dataContent = line.slice(6); // Remove "data: " prefix
125
+ if (dataContent === "[DONE]")
126
+ return line;
127
+ try {
128
+ const parsed = JSON.parse(dataContent);
129
+ const restored = restore(parsed, mappingTable);
130
+ return `data: ${JSON.stringify(restored)}`;
131
+ }
132
+ catch {
133
+ // Fallback to text restoration
134
+ return `data: ${restoreText(dataContent, mappingTable)}`;
135
+ }
136
+ }
137
+ // =============================================================================
138
+ // Streaming Restoration with Smart Buffering
139
+ // =============================================================================
140
+ // Max placeholder length: __PII_VERIFICATION_CODE_00000001__ ≈ 40 chars
141
+ const MAX_PLACEHOLDER_LENGTH = 50;
142
+ // Pattern to match complete placeholders
143
+ const PLACEHOLDER_PATTERN = /__PII_[A-Z_]+_\d{8}__/g;
144
+ /**
145
+ * StreamRestorer - Stateful streaming restoration with smart buffering
146
+ *
147
+ * Only buffers when `__` is detected (potential placeholder start).
148
+ * Otherwise streams through immediately for best UX.
149
+ */
150
+ export class StreamRestorer {
151
+ buffer = "";
152
+ mappingTable;
153
+ constructor(mappingTable) {
154
+ this.mappingTable = mappingTable;
155
+ }
156
+ /**
157
+ * Process incoming text chunk
158
+ * Returns text that can be safely output (already restored or confirmed non-placeholder)
159
+ */
160
+ process(chunk) {
161
+ // If no mappings, pass through directly
162
+ if (this.mappingTable.size === 0) {
163
+ return chunk;
164
+ }
165
+ this.buffer += chunk;
166
+ return this.flush();
167
+ }
168
+ /**
169
+ * Flush what we can safely output
170
+ * Keeps potential incomplete placeholders in buffer
171
+ */
172
+ flush() {
173
+ let output = "";
174
+ while (this.buffer.length > 0) {
175
+ // Find position of `__` in buffer
176
+ const underscorePos = this.buffer.indexOf("__");
177
+ if (underscorePos === -1) {
178
+ // No `__` found - check if buffer ends with single `_`
179
+ if (this.buffer.endsWith("_")) {
180
+ // Keep the trailing `_` in case next chunk starts with `_`
181
+ output += this.buffer.slice(0, -1);
182
+ this.buffer = "_";
183
+ }
184
+ else {
185
+ // Safe to output entire buffer
186
+ output += this.buffer;
187
+ this.buffer = "";
188
+ }
189
+ break;
190
+ }
191
+ // Output everything before the `__`
192
+ if (underscorePos > 0) {
193
+ output += this.buffer.slice(0, underscorePos);
194
+ this.buffer = this.buffer.slice(underscorePos);
195
+ }
196
+ // Now buffer starts with `__`
197
+ // Check if we have a complete placeholder
198
+ PLACEHOLDER_PATTERN.lastIndex = 0;
199
+ const match = PLACEHOLDER_PATTERN.exec(this.buffer);
200
+ if (match && match.index === 0) {
201
+ // Found complete placeholder at start of buffer
202
+ const placeholder = match[0];
203
+ const original = this.mappingTable.get(placeholder);
204
+ if (original) {
205
+ // Restore and output
206
+ output += original;
207
+ }
208
+ else {
209
+ // Not in mapping table, output as-is
210
+ output += placeholder;
211
+ }
212
+ this.buffer = this.buffer.slice(placeholder.length);
213
+ }
214
+ else {
215
+ // Check if buffer could be an incomplete placeholder
216
+ if (this.couldBePlaceholder(this.buffer)) {
217
+ // Keep buffering - might be incomplete placeholder
218
+ if (this.buffer.length > MAX_PLACEHOLDER_LENGTH) {
219
+ // Too long to be a placeholder - flush the `__` and continue
220
+ output += "__";
221
+ this.buffer = this.buffer.slice(2);
222
+ }
223
+ else {
224
+ // Wait for more data
225
+ break;
226
+ }
227
+ }
228
+ else {
229
+ // Definitely not a placeholder - output the `__`
230
+ output += "__";
231
+ this.buffer = this.buffer.slice(2);
232
+ }
233
+ }
234
+ }
235
+ return output;
236
+ }
237
+ /**
238
+ * Check if text could be the start of a placeholder
239
+ * Returns true if it matches the beginning of __PII_<TYPE>_<ID>__
240
+ */
241
+ couldBePlaceholder(text) {
242
+ // Must start with __
243
+ if (!text.startsWith("__"))
244
+ return false;
245
+ // Check partial patterns
246
+ const partialPatterns = [
247
+ /^__$/,
248
+ /^__P$/,
249
+ /^__PI$/,
250
+ /^__PII$/,
251
+ /^__PII_$/,
252
+ /^__PII_[A-Z_]*$/,
253
+ /^__PII_[A-Z_]+_$/,
254
+ /^__PII_[A-Z_]+_\d*$/,
255
+ /^__PII_[A-Z_]+_\d+_?$/,
256
+ ];
257
+ return partialPatterns.some(pattern => pattern.test(text));
258
+ }
259
+ /**
260
+ * Finalize stream - flush any remaining buffer
261
+ * Call this at end of stream to ensure nothing is lost
262
+ */
263
+ finalize() {
264
+ if (this.buffer.length === 0)
265
+ return "";
266
+ // Try to restore any remaining buffer
267
+ const result = restoreText(this.buffer, this.mappingTable);
268
+ this.buffer = "";
269
+ return result;
270
+ }
271
+ /**
272
+ * Check if there's pending data in buffer
273
+ */
274
+ hasPendingData() {
275
+ return this.buffer.length > 0;
276
+ }
277
+ }
278
+ /**
279
+ * Create a streaming restorer for a response
280
+ */
281
+ export function createStreamRestorer(mappingTable) {
282
+ return new StreamRestorer(mappingTable);
283
+ }
284
+ //# sourceMappingURL=restorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * AI Security Gateway - Content Sanitizer
3
+ *
4
+ * Sanitizes sensitive data in a single request-response cycle.
5
+ * Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
6
+ */
7
+ import type { SanitizeResult } from "./types.js";
8
+ /**
9
+ * Sanitize any content (messages array, object, string)
10
+ * Returns sanitized content and mapping table for restoration
11
+ */
12
+ export declare function sanitize(content: unknown): SanitizeResult;
13
+ /**
14
+ * Sanitize messages array (common case for LLM APIs)
15
+ */
16
+ export declare function sanitizeMessages(messages: unknown[]): SanitizeResult;
17
+ //# sourceMappingURL=sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AA4Q/D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAWzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAEpE"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * AI Security Gateway - Content Sanitizer
3
+ *
4
+ * Sanitizes sensitive data in a single request-response cycle.
5
+ * Placeholder format: __PII_<ENTITY_TYPE>_<SERIAL_ID>__
6
+ */
7
+ // =============================================================================
8
+ // Detection Patterns
9
+ // =============================================================================
10
+ const ENTITY_PATTERNS = [
11
+ // PEM Private Keys
12
+ {
13
+ type: "PRIVATE_KEY",
14
+ pattern: /-----BEGIN (?:OPENSSH |RSA |EC |DSA )?PRIVATE KEY-----[\s\S]*?-----END (?:OPENSSH |RSA |EC |DSA )?PRIVATE KEY-----/g,
15
+ score: 0.95,
16
+ },
17
+ // Email addresses
18
+ {
19
+ type: "EMAIL_ADDRESS",
20
+ pattern: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,
21
+ score: 0.90,
22
+ },
23
+ // URLs
24
+ {
25
+ type: "URL_ADDRESS",
26
+ pattern: /https?:\/\/[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=%-]+/g,
27
+ score: 0.80,
28
+ },
29
+ // Known API key prefixes
30
+ {
31
+ type: "API_KEY",
32
+ pattern: /\b(?:sk-[A-Za-z0-9]{20,}|sk_(?:live|test)_[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36,}|gho_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{22,}|AKIA[A-Z0-9]{16}|xox[baprs]-[A-Za-z0-9-]+|SG\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+|hf_[A-Za-z0-9]{30,})\b/g,
33
+ score: 0.90,
34
+ },
35
+ // Bearer tokens
36
+ {
37
+ type: "API_KEY",
38
+ pattern: /Bearer\s+[A-Za-z0-9\-_.~+/]{20,}={0,3}/g,
39
+ score: 0.85,
40
+ },
41
+ // Hex private keys (64 hex chars)
42
+ {
43
+ type: "PRIVATE_KEY",
44
+ pattern: /\b[0-9a-fA-F]{64}\b/g,
45
+ score: 0.75,
46
+ },
47
+ // Labeled password patterns
48
+ {
49
+ type: "PASSWORD",
50
+ pattern: /(?:password|passwd|pwd|pass|passcode)\s*[:=]\s*["']?(\S+)["']?/gi,
51
+ score: 0.80,
52
+ captureGroup: 1,
53
+ },
54
+ // Labeled API key patterns
55
+ {
56
+ type: "API_KEY",
57
+ pattern: /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token|auth[_-]?token)\s*[:=]\s*["']?([A-Za-z0-9\-_.~+/]{16,})["']?/gi,
58
+ score: 0.85,
59
+ captureGroup: 1,
60
+ },
61
+ // Phone numbers
62
+ {
63
+ type: "PHONE_NUMBER",
64
+ pattern: /\+?\d{1,3}[-.\s]?\(?\d{2,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}/g,
65
+ score: 0.70,
66
+ },
67
+ // Credit card numbers
68
+ {
69
+ type: "CREDIT_CARD",
70
+ pattern: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
71
+ score: 0.85,
72
+ },
73
+ // Bank account numbers
74
+ {
75
+ type: "BANK_NUMBER",
76
+ pattern: /\b\d{12,19}\b/g,
77
+ score: 0.60,
78
+ },
79
+ // SSN
80
+ {
81
+ type: "SSN",
82
+ pattern: /\b\d{3}-\d{2}-\d{4}\b/g,
83
+ score: 0.85,
84
+ },
85
+ // IP addresses
86
+ {
87
+ type: "IP_ADDRESS",
88
+ pattern: /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g,
89
+ score: 0.70,
90
+ },
91
+ // Labeled verification codes
92
+ {
93
+ type: "VERIFICATION_CODE",
94
+ pattern: /(?:verification\s*code|verify\s*code|otp|2fa\s*code|auth(?:entication)?\s*code)\s*[:=\-]?\s*([A-Za-z0-9]{4,12})/gi,
95
+ score: 0.80,
96
+ captureGroup: 1,
97
+ },
98
+ ];
99
+ function collectMatches(content) {
100
+ const matches = [];
101
+ for (const entity of ENTITY_PATTERNS) {
102
+ entity.pattern.lastIndex = 0;
103
+ let m;
104
+ while ((m = entity.pattern.exec(content)) !== null) {
105
+ let matchedText;
106
+ let start;
107
+ if (entity.captureGroup !== undefined && m[entity.captureGroup]) {
108
+ matchedText = m[entity.captureGroup];
109
+ start = m.index + m[0].indexOf(matchedText);
110
+ }
111
+ else {
112
+ matchedText = m[0];
113
+ start = m.index;
114
+ }
115
+ matches.push({
116
+ originalText: matchedText,
117
+ type: entity.type,
118
+ score: entity.score,
119
+ start,
120
+ end: start + matchedText.length,
121
+ });
122
+ }
123
+ }
124
+ return matches;
125
+ }
126
+ // =============================================================================
127
+ // Span Merging
128
+ // =============================================================================
129
+ function mergeSpans(matches) {
130
+ if (matches.length === 0)
131
+ return [];
132
+ matches.sort((a, b) => {
133
+ if (a.start !== b.start)
134
+ return a.start - b.start;
135
+ const lenDiff = (b.end - b.start) - (a.end - a.start);
136
+ if (lenDiff !== 0)
137
+ return lenDiff;
138
+ return b.score - a.score;
139
+ });
140
+ const merged = [];
141
+ let current = matches[0];
142
+ for (let i = 1; i < matches.length; i++) {
143
+ const next = matches[i];
144
+ if (next.start < current.end) {
145
+ const currentLen = current.end - current.start;
146
+ const nextLen = next.end - next.start;
147
+ if (next.score > current.score || (next.score === current.score && nextLen > currentLen)) {
148
+ current = next;
149
+ }
150
+ }
151
+ else {
152
+ merged.push(current);
153
+ current = next;
154
+ }
155
+ }
156
+ merged.push(current);
157
+ return merged;
158
+ }
159
+ // =============================================================================
160
+ // Text Sanitization
161
+ // =============================================================================
162
+ function sanitizeText(text, mappingTable, typeCounters) {
163
+ const matches = collectMatches(text);
164
+ if (matches.length === 0)
165
+ return text;
166
+ const merged = mergeSpans(matches);
167
+ const textToPlaceholder = new Map();
168
+ for (const match of merged) {
169
+ if (!textToPlaceholder.has(match.originalText)) {
170
+ const counter = (typeCounters.get(match.type) ?? 0) + 1;
171
+ typeCounters.set(match.type, counter);
172
+ const paddedId = counter.toString().padStart(8, "0");
173
+ const placeholder = `__PII_${match.type}_${paddedId}__`;
174
+ textToPlaceholder.set(match.originalText, placeholder);
175
+ mappingTable.set(placeholder, match.originalText);
176
+ }
177
+ }
178
+ let sanitized = text;
179
+ const sortedMatches = [...merged].sort((a, b) => b.start - a.start);
180
+ for (const match of sortedMatches) {
181
+ const placeholder = textToPlaceholder.get(match.originalText);
182
+ sanitized = sanitized.slice(0, match.start) + placeholder + sanitized.slice(match.end);
183
+ }
184
+ return sanitized;
185
+ }
186
+ // =============================================================================
187
+ // Recursive Sanitization
188
+ // =============================================================================
189
+ function sanitizeValue(value, mappingTable, typeCounters) {
190
+ if (typeof value === "string") {
191
+ return sanitizeText(value, mappingTable, typeCounters);
192
+ }
193
+ if (Array.isArray(value)) {
194
+ return value.map((item) => sanitizeValue(item, mappingTable, typeCounters));
195
+ }
196
+ if (value !== null && typeof value === "object") {
197
+ const sanitized = {};
198
+ for (const [key, val] of Object.entries(value)) {
199
+ sanitized[key] = sanitizeValue(val, mappingTable, typeCounters);
200
+ }
201
+ return sanitized;
202
+ }
203
+ return value;
204
+ }
205
+ // =============================================================================
206
+ // Public API
207
+ // =============================================================================
208
+ /**
209
+ * Sanitize any content (messages array, object, string)
210
+ * Returns sanitized content and mapping table for restoration
211
+ */
212
+ export function sanitize(content) {
213
+ const mappingTable = new Map();
214
+ const typeCounters = new Map();
215
+ const sanitized = sanitizeValue(content, mappingTable, typeCounters);
216
+ return {
217
+ sanitized,
218
+ mappingTable,
219
+ redactionCount: mappingTable.size,
220
+ };
221
+ }
222
+ /**
223
+ * Sanitize messages array (common case for LLM APIs)
224
+ */
225
+ export function sanitizeMessages(messages) {
226
+ return sanitize(messages);
227
+ }
228
+ //# sourceMappingURL=sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * AI Security Gateway types
3
+ */
4
+ export type MappingTable = Map<string, string>;
5
+ export type SanitizeResult = {
6
+ sanitized: any;
7
+ mappingTable: MappingTable;
8
+ redactionCount: number;
9
+ };
10
+ export type ApiType = "anthropic" | "openai" | "gemini";
11
+ export type BackendConfig = {
12
+ baseUrl: string;
13
+ apiKey: string;
14
+ type?: ApiType;
15
+ pathPrefix?: string;
16
+ models?: string[];
17
+ referer?: string;
18
+ title?: string;
19
+ };
20
+ export type GatewayConfig = {
21
+ port: number;
22
+ backends: {
23
+ [name: string]: BackendConfig;
24
+ };
25
+ routing?: {
26
+ [path: string]: string;
27
+ };
28
+ defaultBackends?: {
29
+ anthropic?: string;
30
+ openai?: string;
31
+ gemini?: string;
32
+ };
33
+ };
34
+ export type EntityMatch = {
35
+ originalText: string;
36
+ category: string;
37
+ placeholder: string;
38
+ };
39
+ export type GatewayActivityEvent = {
40
+ id: string;
41
+ timestamp: string;
42
+ requestId: string;
43
+ type: "sanitize" | "restore";
44
+ direction: "request" | "response";
45
+ backend: string;
46
+ endpoint: string;
47
+ model?: string;
48
+ redactionCount: number;
49
+ categories: Record<string, number>;
50
+ durationMs?: number;
51
+ };
52
+ export type ActivityListener = (event: GatewayActivityEvent) => void;
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAG/C,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAGxD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;KAC/B,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;IAEF,eAAe,CAAC,EAAE;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * AI Security Gateway types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * OpenGuardrails Plugin for OpenClaw
3
+ *
4
+ * Responsibilities:
5
+ * 1. Load credentials from disk on startup (no network)
6
+ * 2. Fall back to local MAC identity when no saved credentials exist
7
+ * 3. Detect behavioral anomalies at before_tool_call (block / alert)
8
+ * 4. Expose /og_status, /og_upgrade, /og_config commands
9
+ */
10
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
11
+ declare const openClawGuardPlugin: {
12
+ id: string;
13
+ name: string;
14
+ description: string;
15
+ register(api: OpenClawPluginApi): void;
16
+ unregister(): Promise<void>;
17
+ };
18
+ export default openClawGuardPlugin;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AA2X7D,QAAA,MAAM,mBAAmB;;;;kBAKT,iBAAiB;;CAogEhC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}