shieldcortex 2.13.2 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +174 -2
  2. package/dashboard/.next/standalone/dashboard/.next/BUILD_ID +1 -1
  3. package/dashboard/.next/standalone/dashboard/.next/build-manifest.json +2 -2
  4. package/dashboard/.next/standalone/dashboard/.next/prerender-manifest.json +3 -3
  5. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.html +2 -2
  6. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.rsc +1 -1
  7. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/dashboard/.next/standalone/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.html +1 -1
  13. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.rsc +1 -1
  14. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/dashboard/.next/standalone/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/dashboard/.next/standalone/dashboard/.next/server/app/index.html +1 -1
  21. package/dashboard/.next/standalone/dashboard/.next/server/app/index.rsc +1 -1
  22. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  23. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_full.segment.rsc +1 -1
  24. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  25. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_index.segment.rsc +1 -1
  26. package/dashboard/.next/standalone/dashboard/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  27. package/dashboard/.next/standalone/dashboard/.next/server/pages/404.html +1 -1
  28. package/dashboard/.next/standalone/dashboard/.next/server/pages/500.html +2 -2
  29. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.js +1 -1
  30. package/dashboard/.next/standalone/dashboard/.next/server/server-reference-manifest.json +1 -1
  31. package/dist/cli/iron-dome.d.ts +16 -0
  32. package/dist/cli/iron-dome.d.ts.map +1 -0
  33. package/dist/cli/iron-dome.js +219 -0
  34. package/dist/cli/iron-dome.js.map +1 -0
  35. package/dist/cloud/quarantine-sync.d.ts +1 -1
  36. package/dist/cloud/quarantine-sync.d.ts.map +1 -1
  37. package/dist/cloud/quarantine-sync.js +18 -2
  38. package/dist/cloud/quarantine-sync.js.map +1 -1
  39. package/dist/cloud/sync-queue.d.ts +18 -0
  40. package/dist/cloud/sync-queue.d.ts.map +1 -1
  41. package/dist/cloud/sync-queue.js +48 -4
  42. package/dist/cloud/sync-queue.js.map +1 -1
  43. package/dist/cloud/sync.d.ts +1 -1
  44. package/dist/cloud/sync.js +1 -1
  45. package/dist/defence/index.d.ts +2 -0
  46. package/dist/defence/index.d.ts.map +1 -1
  47. package/dist/defence/index.js +2 -0
  48. package/dist/defence/index.js.map +1 -1
  49. package/dist/defence/iron-dome/__tests__/action-gate.test.d.ts +5 -0
  50. package/dist/defence/iron-dome/__tests__/action-gate.test.d.ts.map +1 -0
  51. package/dist/defence/iron-dome/__tests__/action-gate.test.js +71 -0
  52. package/dist/defence/iron-dome/__tests__/action-gate.test.js.map +1 -0
  53. package/dist/defence/iron-dome/__tests__/gateway.test.d.ts +5 -0
  54. package/dist/defence/iron-dome/__tests__/gateway.test.d.ts.map +1 -0
  55. package/dist/defence/iron-dome/__tests__/gateway.test.js +60 -0
  56. package/dist/defence/iron-dome/__tests__/gateway.test.js.map +1 -0
  57. package/dist/defence/iron-dome/__tests__/injection-scanner.test.d.ts +7 -0
  58. package/dist/defence/iron-dome/__tests__/injection-scanner.test.d.ts.map +1 -0
  59. package/dist/defence/iron-dome/__tests__/injection-scanner.test.js +230 -0
  60. package/dist/defence/iron-dome/__tests__/injection-scanner.test.js.map +1 -0
  61. package/dist/defence/iron-dome/__tests__/pii-guard.test.d.ts +5 -0
  62. package/dist/defence/iron-dome/__tests__/pii-guard.test.d.ts.map +1 -0
  63. package/dist/defence/iron-dome/__tests__/pii-guard.test.js +130 -0
  64. package/dist/defence/iron-dome/__tests__/pii-guard.test.js.map +1 -0
  65. package/dist/defence/iron-dome/action-gate.d.ts +19 -0
  66. package/dist/defence/iron-dome/action-gate.d.ts.map +1 -0
  67. package/dist/defence/iron-dome/action-gate.js +92 -0
  68. package/dist/defence/iron-dome/action-gate.js.map +1 -0
  69. package/dist/defence/iron-dome/audit.d.ts +20 -0
  70. package/dist/defence/iron-dome/audit.d.ts.map +1 -0
  71. package/dist/defence/iron-dome/audit.js +34 -0
  72. package/dist/defence/iron-dome/audit.js.map +1 -0
  73. package/dist/defence/iron-dome/config.d.ts +28 -0
  74. package/dist/defence/iron-dome/config.d.ts.map +1 -0
  75. package/dist/defence/iron-dome/config.js +116 -0
  76. package/dist/defence/iron-dome/config.js.map +1 -0
  77. package/dist/defence/iron-dome/gateway.d.ts +24 -0
  78. package/dist/defence/iron-dome/gateway.d.ts.map +1 -0
  79. package/dist/defence/iron-dome/gateway.js +49 -0
  80. package/dist/defence/iron-dome/gateway.js.map +1 -0
  81. package/dist/defence/iron-dome/index.d.ts +40 -0
  82. package/dist/defence/iron-dome/index.d.ts.map +1 -0
  83. package/dist/defence/iron-dome/index.js +125 -0
  84. package/dist/defence/iron-dome/index.js.map +1 -0
  85. package/dist/defence/iron-dome/injection-scanner.d.ts +28 -0
  86. package/dist/defence/iron-dome/injection-scanner.d.ts.map +1 -0
  87. package/dist/defence/iron-dome/injection-scanner.js +117 -0
  88. package/dist/defence/iron-dome/injection-scanner.js.map +1 -0
  89. package/dist/defence/iron-dome/kill-switch.d.ts +16 -0
  90. package/dist/defence/iron-dome/kill-switch.d.ts.map +1 -0
  91. package/dist/defence/iron-dome/kill-switch.js +30 -0
  92. package/dist/defence/iron-dome/kill-switch.js.map +1 -0
  93. package/dist/defence/iron-dome/pii-guard.d.ts +22 -0
  94. package/dist/defence/iron-dome/pii-guard.d.ts.map +1 -0
  95. package/dist/defence/iron-dome/pii-guard.js +84 -0
  96. package/dist/defence/iron-dome/pii-guard.js.map +1 -0
  97. package/dist/embeddings/generator.d.ts.map +1 -1
  98. package/dist/embeddings/generator.js +28 -2
  99. package/dist/embeddings/generator.js.map +1 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +6 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/lib.d.ts +2 -0
  104. package/dist/lib.d.ts.map +1 -1
  105. package/dist/lib.js +2 -0
  106. package/dist/lib.js.map +1 -1
  107. package/dist/memory/store.d.ts.map +1 -1
  108. package/dist/memory/store.js +11 -1
  109. package/dist/memory/store.js.map +1 -1
  110. package/dist/server.d.ts.map +1 -1
  111. package/dist/server.js +93 -0
  112. package/dist/server.js.map +1 -1
  113. package/dist/tools/context.d.ts +1 -1
  114. package/package.json +2 -2
  115. /package/dashboard/.next/standalone/dashboard/.next/static/{hK5vjDheb2ytBlhBFJqor → V3kmn6wNste9-mE3bPDSl}/_buildManifest.js +0 -0
  116. /package/dashboard/.next/standalone/dashboard/.next/static/{hK5vjDheb2ytBlhBFJqor → V3kmn6wNste9-mE3bPDSl}/_clientMiddlewareManifest.json +0 -0
  117. /package/dashboard/.next/standalone/dashboard/.next/static/{hK5vjDheb2ytBlhBFJqor → V3kmn6wNste9-mE3bPDSl}/_ssgManifest.js +0 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Iron Dome CLI Commands
3
+ *
4
+ * Usage:
5
+ * shieldcortex iron-dome activate [--profile school|enterprise|personal|paranoid]
6
+ * shieldcortex iron-dome status
7
+ * shieldcortex iron-dome deactivate
8
+ * shieldcortex iron-dome scan --text "..."
9
+ * shieldcortex iron-dome scan --file <path>
10
+ * shieldcortex iron-dome audit [--tail] [--search <term>] [--date <date>]
11
+ */
12
+ import fs from 'fs';
13
+ import path from 'path';
14
+ import os from 'os';
15
+ import { initDatabase } from '../database/init.js';
16
+ import { activateIronDome, deactivateIronDome, getIronDomeStatus, scanForInjection, } from '../defence/iron-dome/index.js';
17
+ import { queryAuditLogs } from '../defence/audit/index.js';
18
+ const bold = '\x1b[1m';
19
+ const reset = '\x1b[0m';
20
+ const green = '\x1b[32m';
21
+ const red = '\x1b[31m';
22
+ const yellow = '\x1b[33m';
23
+ const cyan = '\x1b[36m';
24
+ const dim = '\x1b[2m';
25
+ /**
26
+ * Ensure database is initialised for CLI commands.
27
+ */
28
+ function ensureDb() {
29
+ const dbPath = process.env.CLAUDE_MEMORY_DB || path.join(os.homedir(), '.shieldcortex', 'memories.db');
30
+ initDatabase(dbPath);
31
+ }
32
+ /**
33
+ * Handle the `iron-dome` subcommand.
34
+ */
35
+ export async function handleIronDomeCommand(args) {
36
+ const subcommand = args[0];
37
+ if (!subcommand || subcommand === '--help' || subcommand === '-h') {
38
+ printUsage();
39
+ return;
40
+ }
41
+ ensureDb();
42
+ switch (subcommand) {
43
+ case 'activate':
44
+ handleActivate(args.slice(1));
45
+ break;
46
+ case 'status':
47
+ handleStatus();
48
+ break;
49
+ case 'deactivate':
50
+ handleDeactivate();
51
+ break;
52
+ case 'scan':
53
+ handleScan(args.slice(1));
54
+ break;
55
+ case 'audit':
56
+ handleAudit(args.slice(1));
57
+ break;
58
+ default:
59
+ console.error(`Unknown iron-dome command: ${subcommand}`);
60
+ printUsage();
61
+ process.exit(1);
62
+ }
63
+ }
64
+ function printUsage() {
65
+ console.log(`
66
+ ${bold}Iron Dome — Behaviour Protection Layer${reset}
67
+
68
+ ${bold}Usage:${reset}
69
+ shieldcortex iron-dome activate [--profile <profile>]
70
+ shieldcortex iron-dome status
71
+ shieldcortex iron-dome deactivate
72
+ shieldcortex iron-dome scan --text "..." | --file <path>
73
+ shieldcortex iron-dome audit [--tail] [--search <term>]
74
+
75
+ ${bold}Profiles:${reset}
76
+ school GDPR strict, pupil data locked
77
+ enterprise Financial protection, compliance
78
+ personal Lighter touch for personal use
79
+ paranoid Everything requires approval
80
+ `);
81
+ }
82
+ function handleActivate(args) {
83
+ let profile;
84
+ const profileIdx = args.indexOf('--profile');
85
+ if (profileIdx !== -1 && args[profileIdx + 1]) {
86
+ const p = args[profileIdx + 1];
87
+ if (!['school', 'enterprise', 'personal', 'paranoid'].includes(p)) {
88
+ console.error(`${red}Unknown profile: ${p}${reset}`);
89
+ console.error(`Available: school, enterprise, personal, paranoid`);
90
+ process.exit(1);
91
+ }
92
+ profile = p;
93
+ }
94
+ const config = activateIronDome(profile);
95
+ console.log(`
96
+ ${bold}${green}Iron Dome Activated${reset}
97
+
98
+ Profile: ${config.profile ?? 'default'}
99
+ Trusted channels: ${config.trustedChannels.join(', ')}
100
+ Kill phrase: "${config.killPhrase}"
101
+ Require approval: ${config.requireApproval.length} action type(s)
102
+ Auto-approve: ${config.autoApprove.length} action type(s)
103
+ PII never output: ${config.piiRules.neverOutput.length} categories
104
+ PII aggregates: ${config.piiRules.aggregatesOnly.length} categories
105
+ `);
106
+ }
107
+ function handleStatus() {
108
+ const status = getIronDomeStatus();
109
+ if (!status.enabled) {
110
+ console.log(`
111
+ ${bold}Iron Dome Status${reset}
112
+ ${'─'.repeat(40)}
113
+ Status: ${dim}INACTIVE${reset}
114
+
115
+ Run ${cyan}shieldcortex iron-dome activate${reset} to enable.
116
+ `);
117
+ return;
118
+ }
119
+ const c = status.config;
120
+ console.log(`
121
+ ${bold}Iron Dome Status${reset}
122
+ ${'─'.repeat(40)}
123
+ Status: ${green}ACTIVE${reset}
124
+ Profile: ${c.profile ?? 'custom'}
125
+ Trusted channels: ${c.trustedChannels.join(', ')}
126
+ Kill phrase: "${c.killPhrase}"
127
+ Require approval: ${c.requireApproval.join(', ')}
128
+ Auto-approve: ${c.autoApprove.join(', ')}
129
+ PII never output: ${c.piiRules.neverOutput.length > 0 ? c.piiRules.neverOutput.join(', ') : '(none)'}
130
+ PII aggregates: ${c.piiRules.aggregatesOnly.length > 0 ? c.piiRules.aggregatesOnly.join(', ') : '(none)'}
131
+ Sub-agent blocks: ${c.subAgentRestrictions.blockedOperations.length > 0 ? c.subAgentRestrictions.blockedOperations.join(', ') : '(none)'}
132
+ Sanitise context: ${c.subAgentRestrictions.sanitiseContext ? 'yes' : 'no'}
133
+ `);
134
+ }
135
+ function handleDeactivate() {
136
+ deactivateIronDome();
137
+ console.log(`${bold}Iron Dome deactivated.${reset}`);
138
+ }
139
+ function handleScan(args) {
140
+ let text;
141
+ const textIdx = args.indexOf('--text');
142
+ const fileIdx = args.indexOf('--file');
143
+ if (textIdx !== -1 && args[textIdx + 1]) {
144
+ text = args[textIdx + 1];
145
+ }
146
+ else if (fileIdx !== -1 && args[fileIdx + 1]) {
147
+ const filePath = args[fileIdx + 1];
148
+ try {
149
+ text = fs.readFileSync(filePath, 'utf-8');
150
+ }
151
+ catch (err) {
152
+ console.error(`${red}Error reading file: ${err.message}${reset}`);
153
+ process.exit(2);
154
+ }
155
+ }
156
+ if (!text) {
157
+ console.error('Usage: shieldcortex iron-dome scan --text "..." | --file <path>');
158
+ process.exit(1);
159
+ }
160
+ const result = scanForInjection(text);
161
+ if (result.clean) {
162
+ console.log(`${green}CLEAN${reset} — No injection patterns detected (${result.textLength} chars scanned)`);
163
+ process.exit(0);
164
+ }
165
+ console.log(`\n${'!'.repeat(3)} ${red}${bold}INJECTION DETECTED${reset} ${'!'.repeat(3)}`);
166
+ console.log(`Risk level: ${result.riskLevel}`);
167
+ console.log(`Detections: ${result.detections.length}`);
168
+ console.log(`Scanned: ${result.textLength} chars`);
169
+ console.log();
170
+ // Group by category
171
+ const byCat = {};
172
+ for (const d of result.detections) {
173
+ (byCat[d.category] ??= []).push(d);
174
+ }
175
+ for (const [cat, dets] of Object.entries(byCat).sort(([a], [b]) => a.localeCompare(b))) {
176
+ console.log(` ${bold}[${cat}]${reset}`);
177
+ for (const d of dets) {
178
+ const sColor = d.severity === 'critical' ? red : d.severity === 'high' ? red : d.severity === 'medium' ? yellow : cyan;
179
+ console.log(` ${sColor}[${d.severity.toUpperCase()}]${reset} ${d.pattern}: ${d.description}`);
180
+ const preview = d.match.slice(0, 120);
181
+ const suffix = d.match.length > 120 ? '...' : '';
182
+ console.log(` ${dim}matched: "${preview}${suffix}"${reset}`);
183
+ }
184
+ console.log();
185
+ }
186
+ process.exit(1);
187
+ }
188
+ function handleAudit(args) {
189
+ const searchIdx = args.indexOf('--search');
190
+ const search = searchIdx !== -1 ? args[searchIdx + 1] : undefined;
191
+ const tail = args.includes('--tail');
192
+ const logs = queryAuditLogs({
193
+ firewallResult: undefined,
194
+ limit: tail ? 20 : 50,
195
+ });
196
+ // Filter to iron-dome entries
197
+ const ironDomeLogs = logs.filter((log) => log.reason?.startsWith('[iron-dome:'));
198
+ if (search) {
199
+ const filtered = ironDomeLogs.filter((log) => log.reason?.toLowerCase().includes(search.toLowerCase()));
200
+ printAuditLogs(filtered);
201
+ }
202
+ else {
203
+ printAuditLogs(ironDomeLogs);
204
+ }
205
+ }
206
+ function printAuditLogs(logs) {
207
+ if (logs.length === 0) {
208
+ console.log(`${dim}No Iron Dome audit entries found.${reset}`);
209
+ return;
210
+ }
211
+ console.log(`\n${bold}Iron Dome Audit Log${reset} (${logs.length} entries)`);
212
+ console.log('─'.repeat(60));
213
+ for (const log of logs) {
214
+ const resultColor = log.firewall_result === 'ALLOW' ? green : red;
215
+ console.log(` ${dim}${log.timestamp}${reset} ${resultColor}${log.firewall_result}${reset} ${log.reason ?? ''}`);
216
+ }
217
+ console.log();
218
+ }
219
+ //# sourceMappingURL=iron-dome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iron-dome.js","sourceRoot":"","sources":["../../src/cli/iron-dome.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Fire-and-forget: sends quarantined content to ShieldCortex cloud.
3
- * Never blocks, never throws. Silently swallows all errors.
3
+ * Never blocks, never throws. Failed requests are logged and queued for retry.
4
4
  */
5
5
  export declare function syncQuarantineToCloud(entry: {
6
6
  original_content: string;
@@ -1 +1 @@
1
- {"version":3,"file":"quarantine-sync.d.ts","sourceRoot":"","sources":["../../src/cloud/quarantine-sync.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,IAAI,CA0BP"}
1
+ {"version":3,"file":"quarantine-sync.d.ts","sourceRoot":"","sources":["../../src/cloud/quarantine-sync.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,IAAI,CAmCP"}
@@ -1,7 +1,8 @@
1
1
  import { getCloudConfig, getDeviceId, getDeviceName } from './config.js';
2
+ import { enqueueFailedQuarantineSync } from './sync-queue.js';
2
3
  /**
3
4
  * Fire-and-forget: sends quarantined content to ShieldCortex cloud.
4
- * Never blocks, never throws. Silently swallows all errors.
5
+ * Never blocks, never throws. Failed requests are logged and queued for retry.
5
6
  */
6
7
  export function syncQuarantineToCloud(entry) {
7
8
  const config = getCloudConfig();
@@ -25,7 +26,22 @@ export function syncQuarantineToCloud(entry) {
25
26
  body: JSON.stringify(payload),
26
27
  signal: controller.signal,
27
28
  })
28
- .catch(() => { })
29
+ .then((res) => {
30
+ if (!res?.ok) {
31
+ console.error(`[shieldcortex] Quarantine sync failed: HTTP ${res.status}`);
32
+ try {
33
+ enqueueFailedQuarantineSync(payload);
34
+ }
35
+ catch { /* non-critical */ }
36
+ }
37
+ })
38
+ .catch((e) => {
39
+ console.error('[shieldcortex] Quarantine sync failed:', e instanceof Error ? e.message : String(e));
40
+ try {
41
+ enqueueFailedQuarantineSync(payload);
42
+ }
43
+ catch { /* non-critical */ }
44
+ })
29
45
  .finally(() => clearTimeout(timeout));
30
46
  }
31
47
  //# sourceMappingURL=quarantine-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quarantine-sync.js","sourceRoot":"","sources":["../../src/cloud/quarantine-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KASrC;IACC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO;IAExD,MAAM,OAAO,GAAG;QACd,GAAG,KAAK;QACR,SAAS,EAAE,WAAW,EAAE;QACxB,WAAW,EAAE,aAAa,EAAE;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,uBAAuB,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAE7D,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;SACC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACf,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"quarantine-sync.js","sourceRoot":"","sources":["../../src/cloud/quarantine-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KASrC;IACC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAO;IAExD,MAAM,OAAO,GAAG;QACd,GAAG,KAAK;QACR,SAAS,EAAE,WAAW,EAAE;QACxB,WAAW,EAAE,aAAa,EAAE;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,uBAAuB,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAE7D,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;SACC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC;gBAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC;YAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC5E,CAAC,CAAC;SACD,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Cloud Sync Retry Queue
3
3
  *
4
4
  * Replaces fire-and-forget cloud sync with a queue that retries failed syncs.
5
+ * Supports both audit metadata sync and quarantine content sync payloads.
5
6
  * Uses SQLite sync_queue table with exponential backoff.
6
7
  */
7
8
  export interface SyncEntry {
@@ -19,6 +20,19 @@ export interface SyncEntry {
19
20
  platform: string;
20
21
  timestamp: string;
21
22
  }
23
+ export interface QuarantineSyncEntry {
24
+ original_content: string;
25
+ original_title?: string;
26
+ source_type: string;
27
+ source_identifier: string;
28
+ reason: string;
29
+ threat_indicators: string[];
30
+ anomaly_score: number;
31
+ firewall_result: string;
32
+ device_id: string;
33
+ device_name: string;
34
+ timestamp: string;
35
+ }
22
36
  export interface QueueStats {
23
37
  pending: number;
24
38
  failed: number;
@@ -35,6 +49,10 @@ export interface SyncQueueResult {
35
49
  * INSERT into sync_queue with exponential backoff schedule.
36
50
  */
37
51
  export declare function enqueueFailedSync(entry: SyncEntry): void;
52
+ /**
53
+ * Enqueue a failed quarantine sync entry for later retry.
54
+ */
55
+ export declare function enqueueFailedQuarantineSync(entry: QuarantineSyncEntry): void;
38
56
  /**
39
57
  * Process pending items in the retry queue.
40
58
  * SELECT pending WHERE next_retry_at <= now, retry each (up to 10 per tick).
@@ -1 +1 @@
1
- {"version":3,"file":"sync-queue.d.ts","sourceRoot":"","sources":["../../src/cloud/sync-queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CASxD;AA8BD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,CAAC,CA8ElE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAiB1C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CASxC"}
1
+ {"version":3,"file":"sync-queue.d.ts","sourceRoot":"","sources":["../../src/cloud/sync-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAE5E;AAmFD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,CAAC,CA+ElE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAiB1C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CASxC"}
@@ -2,6 +2,7 @@
2
2
  * Cloud Sync Retry Queue
3
3
  *
4
4
  * Replaces fire-and-forget cloud sync with a queue that retries failed syncs.
5
+ * Supports both audit metadata sync and quarantine content sync payloads.
5
6
  * Uses SQLite sync_queue table with exponential backoff.
6
7
  */
7
8
  import { getDatabase } from '../database/init.js';
@@ -11,13 +12,55 @@ import { getCloudConfig, updateLastSyncAt } from './config.js';
11
12
  * INSERT into sync_queue with exponential backoff schedule.
12
13
  */
13
14
  export function enqueueFailedSync(entry) {
15
+ enqueuePayload({ kind: 'audit', entry });
16
+ }
17
+ /**
18
+ * Enqueue a failed quarantine sync entry for later retry.
19
+ */
20
+ export function enqueueFailedQuarantineSync(entry) {
21
+ enqueuePayload({ kind: 'quarantine', entry });
22
+ }
23
+ function enqueuePayload(payload) {
14
24
  const db = getDatabase();
15
- const payload = JSON.stringify(entry);
25
+ const payloadJson = JSON.stringify(payload);
16
26
  const nextRetryAt = new Date(Date.now() + 30_000).toISOString(); // First retry in 30s
17
27
  db.prepare(`
18
28
  INSERT INTO sync_queue (payload, attempts, next_retry_at, status)
19
29
  VALUES (?, 0, ?, 'pending')
20
- `).run(payload, nextRetryAt);
30
+ `).run(payloadJson, nextRetryAt);
31
+ }
32
+ function buildRetryRequest(payloadText) {
33
+ const parsed = JSON.parse(payloadText);
34
+ // Backwards compatibility with legacy queued audit entries (no envelope)
35
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && !('kind' in parsed)) {
36
+ return {
37
+ path: '/v1/audit/ingest',
38
+ body: JSON.stringify({ entries: [parsed] }),
39
+ };
40
+ }
41
+ if (parsed &&
42
+ typeof parsed === 'object' &&
43
+ !Array.isArray(parsed) &&
44
+ 'kind' in parsed &&
45
+ parsed.kind === 'audit') {
46
+ const payload = parsed;
47
+ return {
48
+ path: '/v1/audit/ingest',
49
+ body: JSON.stringify({ entries: [payload.entry] }),
50
+ };
51
+ }
52
+ if (parsed &&
53
+ typeof parsed === 'object' &&
54
+ !Array.isArray(parsed) &&
55
+ 'kind' in parsed &&
56
+ parsed.kind === 'quarantine') {
57
+ const payload = parsed;
58
+ return {
59
+ path: '/v1/quarantine/ingest',
60
+ body: JSON.stringify(payload.entry),
61
+ };
62
+ }
63
+ throw new Error('Unsupported sync queue payload');
21
64
  }
22
65
  /**
23
66
  * Mark a queue row as retrying (schedule next attempt) or permanently failed.
@@ -76,13 +119,14 @@ export async function processRetryQueue() {
76
119
  try {
77
120
  const controller = new AbortController();
78
121
  const timeoutId = setTimeout(() => controller.abort(), 10_000);
79
- const res = await fetch(`${config.cloudBaseUrl}/v1/audit/ingest`, {
122
+ const request = buildRetryRequest(row.payload);
123
+ const res = await fetch(`${config.cloudBaseUrl}${request.path}`, {
80
124
  method: 'POST',
81
125
  headers: {
82
126
  'Content-Type': 'application/json',
83
127
  'Authorization': `Bearer ${config.cloudApiKey}`,
84
128
  },
85
- body: JSON.stringify({ entries: [JSON.parse(row.payload)] }),
129
+ body: request.body,
86
130
  signal: controller.signal,
87
131
  });
88
132
  clearTimeout(timeoutId);
@@ -1 +1 @@
1
- {"version":3,"file":"sync-queue.js","sourceRoot":"","sources":["../../src/cloud/sync-queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-queue.js","sourceRoot":"","sources":["../../src/cloud/sync-queue.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import type { DefencePipelineResult, DefenceSource } from '../defence/types.js';
7
7
  export declare function sendHeartbeat(): void;
8
8
  /**
9
9
  * Fire-and-forget: sends audit data to ShieldCortex cloud.
10
- * Never blocks, never throws. Silently swallows all errors.
10
+ * Never blocks, never throws. Failed requests are logged and queued for retry.
11
11
  * Sends audit metadata ONLY — no content or titles.
12
12
  */
13
13
  export declare function syncToCloud(result: DefencePipelineResult, source: DefenceSource, durationMs: number): void;
@@ -30,7 +30,7 @@ export function sendHeartbeat() {
30
30
  }
31
31
  /**
32
32
  * Fire-and-forget: sends audit data to ShieldCortex cloud.
33
- * Never blocks, never throws. Silently swallows all errors.
33
+ * Never blocks, never throws. Failed requests are logged and queued for retry.
34
34
  * Sends audit metadata ONLY — no content or titles.
35
35
  */
36
36
  export function syncToCloud(result, source, durationMs) {
@@ -13,6 +13,8 @@ export type { CredentialScanResult, CredentialFinding, CredentialDetectionConfig
13
13
  export { logAudit, queryAuditLogs, getAuditStats } from './audit/index.js';
14
14
  export { scanSkill, scanSkillContent, discoverSkillFiles, detectFormat, detectFormatFromContent, parseSkillFile, readSkillFile } from './skill-scanner/index.js';
15
15
  export type { SkillScanResult, SkillScanOptions, SkillThreatFinding, ParsedSkill, SkillFormat } from './skill-scanner/index.js';
16
+ export { activateIronDome, deactivateIronDome, getIronDomeStatus, isChannelTrusted, isActionAllowed, scanForInjection, checkPII, handleKillPhrase, IRON_DOME_PROFILES, DEFAULT_IRON_DOME_CONFIG, } from './iron-dome/index.js';
17
+ export type { IronDomeConfig, IronDomeProfile, InjectionScanResult, InjectionDetection, InjectionSeverity, InjectionCategory, GatewayResult, ActionGateResult, ActionDecision, PiiCheckResult, PiiViolation, KillSwitchResult, } from './iron-dome/index.js';
16
18
  export { getCloudConfig, setCloudConfig, clearCloudConfigCache, getTrustedSkills, addTrustedSkill, removeTrustedSkill, getDeviceId, getDeviceName, getDefenceMode, setDefenceMode, isConfigTampered, getVerifyConfig, setVerifyConfig } from '../cloud/config.js';
17
19
  export type { CloudConfig, DefenceMode, VerifyConfig } from '../cloud/config.js';
18
20
  export { syncToCloud } from '../cloud/sync.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/defence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAGjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,+BAA+B,EAC/B,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG9F,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGxF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC9G,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGzJ,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGhI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClQ,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/defence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAGjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,+BAA+B,EAC/B,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG9F,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGxF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC9G,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGzJ,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGhI,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClQ,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -19,6 +19,8 @@ export { scanForCredentials, redactCredentials, DEFAULT_CREDENTIAL_CONFIG } from
19
19
  export { logAudit, queryAuditLogs, getAuditStats } from './audit/index.js';
20
20
  // Skill Scanner
21
21
  export { scanSkill, scanSkillContent, discoverSkillFiles, detectFormat, detectFormatFromContent, parseSkillFile, readSkillFile } from './skill-scanner/index.js';
22
+ // Iron Dome — Behaviour Protection Layer
23
+ export { activateIronDome, deactivateIronDome, getIronDomeStatus, isChannelTrusted, isActionAllowed, scanForInjection, checkPII, handleKillPhrase, IRON_DOME_PROFILES, DEFAULT_IRON_DOME_CONFIG, } from './iron-dome/index.js';
22
24
  // Cloud
23
25
  export { getCloudConfig, setCloudConfig, clearCloudConfigCache, getTrustedSkills, addTrustedSkill, removeTrustedSkill, getDeviceId, getDeviceName, getDefenceMode, setDefenceMode, isConfigTampered, getVerifyConfig, setVerifyConfig } from '../cloud/config.js';
24
26
  export { syncToCloud } from '../cloud/sync.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/defence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,WAAW;AACX,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAEjF,iBAAiB;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmBpD,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE9F,gBAAgB;AAChB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAExF,sCAAsC;AACtC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAG9G,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGjK,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElQ,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/defence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,WAAW;AACX,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAEjF,iBAAiB;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmBpD,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE9F,gBAAgB;AAChB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAExF,sCAAsC;AACtC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAG9G,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,uBAAuB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGjK,yCAAyC;AACzC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAgB9B,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElQ,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Iron Dome — Action Gate Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=action-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-gate.test.d.ts","sourceRoot":"","sources":["../../../../src/defence/iron-dome/__tests__/action-gate.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Iron Dome — Action Gate Tests
3
+ */
4
+ import { describe, it, expect, beforeEach } from '@jest/globals';
5
+ import { DEFAULT_IRON_DOME_CONFIG } from '../config.js';
6
+ describe('Action Gate', () => {
7
+ let activeConfig;
8
+ beforeEach(() => {
9
+ activeConfig = {
10
+ ...DEFAULT_IRON_DOME_CONFIG,
11
+ enabled: true,
12
+ requireApproval: ['send_email', 'delete_file', 'api_call', 'purchase'],
13
+ autoApprove: ['read_file', 'search', 'calculate'],
14
+ subAgentRestrictions: {
15
+ blockedOperations: ['export_data', 'bulk_email'],
16
+ sanitiseContext: true,
17
+ },
18
+ };
19
+ });
20
+ it('should auto-approve whitelisted actions', async () => {
21
+ const { isActionAllowed } = await import('../action-gate.js');
22
+ const result = isActionAllowed('read_file', activeConfig);
23
+ expect(result.decision).toBe('approved');
24
+ });
25
+ it('should require approval for restricted actions', async () => {
26
+ const { isActionAllowed } = await import('../action-gate.js');
27
+ const result = isActionAllowed('send_email', activeConfig);
28
+ expect(result.decision).toBe('requires_approval');
29
+ });
30
+ it('should approve unknown actions not in either list', async () => {
31
+ const { isActionAllowed } = await import('../action-gate.js');
32
+ const result = isActionAllowed('custom_action', activeConfig);
33
+ expect(result.decision).toBe('approved');
34
+ });
35
+ it('should block sub-agent restricted operations', async () => {
36
+ const { isActionAllowed } = await import('../action-gate.js');
37
+ const agentSource = { type: 'agent', identifier: 'sub-agent-1' };
38
+ const result = isActionAllowed('export_data', activeConfig, agentSource);
39
+ expect(result.decision).toBe('blocked');
40
+ });
41
+ it('should not block non-agent sources for sub-agent restrictions', async () => {
42
+ const { isActionAllowed } = await import('../action-gate.js');
43
+ const userSource = { type: 'user', identifier: 'direct' };
44
+ const result = isActionAllowed('export_data', activeConfig, userSource);
45
+ // Not in requireApproval or autoApprove, so should be approved
46
+ expect(result.decision).toBe('approved');
47
+ });
48
+ it('should be case-insensitive for action names', async () => {
49
+ const { isActionAllowed } = await import('../action-gate.js');
50
+ const result = isActionAllowed('Send_Email', activeConfig);
51
+ expect(result.decision).toBe('requires_approval');
52
+ });
53
+ it('should approve all actions when Iron Dome is disabled', async () => {
54
+ const { isActionAllowed } = await import('../action-gate.js');
55
+ const disabledConfig = { ...activeConfig, enabled: false };
56
+ const result = isActionAllowed('send_email', disabledConfig);
57
+ expect(result.decision).toBe('approved');
58
+ expect(result.reason).toContain('not active');
59
+ });
60
+ it('should include action name in result', async () => {
61
+ const { isActionAllowed } = await import('../action-gate.js');
62
+ const result = isActionAllowed('Delete_File', activeConfig);
63
+ expect(result.action).toBe('delete_file');
64
+ });
65
+ it('should match partial action names', async () => {
66
+ const { isActionAllowed } = await import('../action-gate.js');
67
+ const result = isActionAllowed('make_api_call', activeConfig);
68
+ expect(result.decision).toBe('requires_approval');
69
+ });
70
+ });
71
+ //# sourceMappingURL=action-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-gate.test.js","sourceRoot":"","sources":["../../../../src/defence/iron-dome/__tests__/action-gate.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,YAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACd,YAAY,GAAG;YACb,GAAG,wBAAwB;YAC3B,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;YACtE,WAAW,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC;YACjD,oBAAoB,EAAE;gBACpB,iBAAiB,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;gBAChD,eAAe,EAAE,IAAI;aACtB;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,OAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACxE,+DAA+D;QAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Iron Dome — Gateway Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=gateway.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.test.d.ts","sourceRoot":"","sources":["../../../../src/defence/iron-dome/__tests__/gateway.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}