@neurosec/sentry 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/bin/cli.js +18 -0
  4. package/bin/sentryd.js +19 -0
  5. package/dist/api.d.ts +21 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +161 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/audit.d.ts +18 -0
  10. package/dist/audit.d.ts.map +1 -0
  11. package/dist/audit.js +114 -0
  12. package/dist/audit.js.map +1 -0
  13. package/dist/cli.d.ts +3 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +255 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +54 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +160 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/discovery.d.ts +5 -0
  22. package/dist/discovery.d.ts.map +1 -0
  23. package/dist/discovery.js +279 -0
  24. package/dist/discovery.js.map +1 -0
  25. package/dist/enforcement/enforcement-engine.d.ts +37 -0
  26. package/dist/enforcement/enforcement-engine.d.ts.map +1 -0
  27. package/dist/enforcement/enforcement-engine.js +325 -0
  28. package/dist/enforcement/enforcement-engine.js.map +1 -0
  29. package/dist/enforcement/file-monitor.d.ts +4 -0
  30. package/dist/enforcement/file-monitor.d.ts.map +1 -0
  31. package/dist/enforcement/file-monitor.js +114 -0
  32. package/dist/enforcement/file-monitor.js.map +1 -0
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +248 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/logger.d.ts +2 -0
  38. package/dist/logger.d.ts.map +1 -0
  39. package/dist/logger.js +17 -0
  40. package/dist/logger.js.map +1 -0
  41. package/dist/sandbox/index.d.ts +14 -0
  42. package/dist/sandbox/index.d.ts.map +1 -0
  43. package/dist/sandbox/index.js +91 -0
  44. package/dist/sandbox/index.js.map +1 -0
  45. package/dist/sandbox/linux-sandbox.d.ts +21 -0
  46. package/dist/sandbox/linux-sandbox.d.ts.map +1 -0
  47. package/dist/sandbox/linux-sandbox.js +186 -0
  48. package/dist/sandbox/linux-sandbox.js.map +1 -0
  49. package/dist/sandbox/macos-sandbox.d.ts +17 -0
  50. package/dist/sandbox/macos-sandbox.d.ts.map +1 -0
  51. package/dist/sandbox/macos-sandbox.js +145 -0
  52. package/dist/sandbox/macos-sandbox.js.map +1 -0
  53. package/dist/setup.d.ts +14 -0
  54. package/dist/setup.d.ts.map +1 -0
  55. package/dist/setup.js +220 -0
  56. package/dist/setup.js.map +1 -0
  57. package/dist/skill-authz/skill-evaluator.d.ts +20 -0
  58. package/dist/skill-authz/skill-evaluator.d.ts.map +1 -0
  59. package/dist/skill-authz/skill-evaluator.js +159 -0
  60. package/dist/skill-authz/skill-evaluator.js.map +1 -0
  61. package/dist/skill-authz/skill-scanner.d.ts +18 -0
  62. package/dist/skill-authz/skill-scanner.d.ts.map +1 -0
  63. package/dist/skill-authz/skill-scanner.js +169 -0
  64. package/dist/skill-authz/skill-scanner.js.map +1 -0
  65. package/dist/telemetry.d.ts +18 -0
  66. package/dist/telemetry.d.ts.map +1 -0
  67. package/dist/telemetry.js +106 -0
  68. package/dist/telemetry.js.map +1 -0
  69. package/dist/types.d.ts +127 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +209 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +69 -0
  74. package/scripts/install-sentry-macos.sh +238 -0
  75. package/scripts/install-sentry.sh +253 -0
  76. package/scripts/postinstall.js +191 -0
  77. package/scripts/prepack.js +33 -0
package/dist/types.js ADDED
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AGENT_SANDBOX_PROFILES = void 0;
4
+ exports.AGENT_SANDBOX_PROFILES = [
5
+ {
6
+ name: 'claude-code',
7
+ frameworkIds: ['claude-code', 'mcp-server'],
8
+ allowedSyscalls: [
9
+ 'read', 'write', 'open', 'openat', 'close', 'stat', 'fstat', 'lstat',
10
+ 'newfstatat', 'mmap', 'munmap', 'mprotect', 'brk', 'futex',
11
+ 'sched_yield', 'clock_gettime', 'nanosleep', 'getrandom',
12
+ 'exit_group', 'exit', 'clone', 'clone3', 'execve', 'execveat',
13
+ 'readlink', 'readlinkat', 'getdents', 'getdents64', 'lseek',
14
+ 'connect', 'sendto', 'recvfrom', 'sendmsg', 'recvmsg', 'bind',
15
+ 'getsockname', 'getpeername', 'setsockopt', 'getsockopt',
16
+ 'ioctl', 'fcntl', 'dup', 'dup2', 'dup3', 'pipe', 'pipe2',
17
+ 'socket', 'access', 'faccessat', 'faccessat2',
18
+ 'getcwd', 'chdir', 'fchdir',
19
+ 'getpid', 'getppid', 'gettid', 'getuid', 'getgid', 'geteuid', 'getegid',
20
+ 'writev', 'readv', 'pread64', 'pwrite64',
21
+ 'fallocate', 'ftruncate', 'truncate',
22
+ 'uname', 'sysinfo', 'prctl',
23
+ 'tgkill', 'rt_sigaction', 'rt_sigprocmask', 'rt_sigreturn',
24
+ 'wait4', 'waitid', 'poll', 'ppoll', 'select', 'epoll_create', 'epoll_ctl', 'epoll_wait',
25
+ 'eventfd2', 'timerfd_create', 'timerfd_settime',
26
+ 'sendfile', 'copy_file_range',
27
+ 'madvise', 'mlock', 'munlock',
28
+ ],
29
+ blockedSyscalls: [
30
+ 'ptrace', 'perf_event_open', 'bpf', 'kexec_load', 'swapon', 'swapoff',
31
+ 'reboot', 'init_module', 'finit_module', 'delete_module',
32
+ 'acct', 'setdomainname', 'sethostname',
33
+ 'pivot_root', 'chroot',
34
+ 'mount', 'umount', 'umount2',
35
+ 'setns', 'unshare',
36
+ 'iopl', 'ioperm',
37
+ 'stty',
38
+ ],
39
+ fsRules: [
40
+ { path: '/home/**', permissions: 'rw' },
41
+ { path: '/tmp/**', permissions: 'rw' },
42
+ { path: '/workspace/**', permissions: 'rw' },
43
+ { path: '/app/**', permissions: 'rw' },
44
+ { path: '/var/tmp/**', permissions: 'rw' },
45
+ { path: '/etc/**', permissions: 'r' },
46
+ { path: '/usr/**', permissions: 'r' },
47
+ { path: '/bin/**', permissions: 'rx' },
48
+ { path: '/lib/**', permissions: 'r' },
49
+ { path: '/lib64/**', permissions: 'r' },
50
+ { path: '/opt/**', permissions: 'r' },
51
+ { path: '/dev/**', permissions: 'none' },
52
+ { path: '/sys/**', permissions: 'none' },
53
+ { path: '/proc/**', permissions: 'r' },
54
+ { path: '/var/lib/**', permissions: 'none' },
55
+ { path: '/var/log/**', permissions: 'none' },
56
+ { path: '/run/**', permissions: 'none' },
57
+ { path: '/etc/shadow', permissions: 'none' },
58
+ { path: '/etc/sudoers', permissions: 'none' },
59
+ { path: '/etc/passwd', permissions: 'r' },
60
+ { path: '/home/**/.ssh/**', permissions: 'none' },
61
+ { path: '/home/**/.aws/**', permissions: 'none' },
62
+ { path: '/home/**/.config/gcloud/**', permissions: 'none' },
63
+ { path: '/home/**/.gnupg/**', permissions: 'none' },
64
+ { path: '/home/**/.kube/**', permissions: 'none' },
65
+ ],
66
+ networkRules: [
67
+ { direction: 'egress', host: 'api.anthropic.com', port: 443, action: 'allow' },
68
+ { direction: 'egress', host: '*.anthropic.com', port: 443, action: 'allow' },
69
+ { direction: 'egress', host: 'api.openai.com', port: 443, action: 'allow' },
70
+ { direction: 'egress', host: 'api.neurosec.ai', port: 443, action: 'allow' },
71
+ { direction: 'egress', host: '127.0.0.1', port: 9081, action: 'allow' },
72
+ { direction: 'egress', action: 'deny' },
73
+ { direction: 'ingress', action: 'deny' },
74
+ ],
75
+ retainedCapabilities: [],
76
+ cpuMax: '1.0',
77
+ memoryMax: '2GB',
78
+ pidMax: 200,
79
+ blockedCapabilities: [
80
+ 'CAP_NET_RAW', 'CAP_NET_ADMIN', 'CAP_SYS_ADMIN', 'CAP_SYS_PTRACE',
81
+ 'CAP_SYS_MODULE', 'CAP_SYS_BOOT', 'CAP_SYS_RAWIO',
82
+ 'CAP_SYS_ADMIN', 'CAP_AUDIT_CONTROL', 'CAP_SETUID', 'CAP_SETGID',
83
+ 'CAP_DAC_OVERRIDE', 'CAP_DAC_READ_SEARCH', 'CAP_FOWNER',
84
+ 'CAP_IPC_OWNER', 'CAP_KILL',
85
+ ],
86
+ },
87
+ {
88
+ name: 'langchain',
89
+ frameworkIds: ['langchain', 'langgraph', 'crewai', 'autogen', 'haystack', 'dspy'],
90
+ allowedSyscalls: [
91
+ 'read', 'write', 'open', 'openat', 'close', 'stat', 'fstat', 'lstat',
92
+ 'newfstatat', 'mmap', 'munmap', 'mprotect', 'brk', 'futex',
93
+ 'sched_yield', 'clock_gettime', 'nanosleep', 'getrandom',
94
+ 'exit_group', 'exit', 'clone', 'clone3', 'execve', 'execveat',
95
+ 'readlink', 'readlinkat', 'getdents', 'getdents64', 'lseek',
96
+ 'connect', 'sendto', 'recvfrom', 'sendmsg', 'recvmsg',
97
+ 'ioctl', 'fcntl', 'dup', 'dup2', 'dup3', 'pipe', 'pipe2',
98
+ 'socket', 'access', 'faccessat', 'faccessat2',
99
+ 'getcwd', 'chdir', 'fchdir',
100
+ 'getpid', 'getppid', 'gettid',
101
+ 'writev', 'readv', 'pread64', 'pwrite64',
102
+ 'uname', 'sysinfo', 'prctl',
103
+ 'rt_sigaction', 'rt_sigprocmask',
104
+ 'poll', 'ppoll', 'select', 'epoll_create', 'epoll_ctl', 'epoll_wait',
105
+ 'eventfd2',
106
+ 'madvise',
107
+ ],
108
+ blockedSyscalls: [
109
+ 'ptrace', 'perf_event_open', 'bpf', 'kexec_load', 'swapon', 'swapoff',
110
+ 'reboot', 'init_module', 'finit_module', 'delete_module',
111
+ 'mount', 'umount', 'umount2',
112
+ 'setns', 'unshare',
113
+ 'iopl', 'ioperm',
114
+ 'acct',
115
+ ],
116
+ fsRules: [
117
+ { path: '/workspace/**', permissions: 'rw' },
118
+ { path: '/home/**', permissions: 'rw' },
119
+ { path: '/tmp/**', permissions: 'rw' },
120
+ { path: '/app/**', permissions: 'rw' },
121
+ { path: '/usr/**', permissions: 'r' },
122
+ { path: '/etc/**', permissions: 'r' },
123
+ { path: '/bin/**', permissions: 'rx' },
124
+ { path: '/lib/**', permissions: 'r' },
125
+ { path: '/lib64/**', permissions: 'r' },
126
+ { path: '/dev/**', permissions: 'none' },
127
+ { path: '/sys/**', permissions: 'none' },
128
+ { path: '/proc/**', permissions: 'r' },
129
+ { path: '/var/lib/**', permissions: 'none' },
130
+ { path: '/var/log/**', permissions: 'none' },
131
+ { path: '/run/**', permissions: 'none' },
132
+ { path: '/home/**/.ssh/**', permissions: 'none' },
133
+ { path: '/home/**/.aws/**', permissions: 'none' },
134
+ { path: '/home/**/.config/gcloud/**', permissions: 'none' },
135
+ { path: '/home/**/.gnupg/**', permissions: 'none' },
136
+ { path: '/home/**/.kube/**', permissions: 'none' },
137
+ { path: '/etc/shadow', permissions: 'none' },
138
+ { path: '/etc/sudoers', permissions: 'none' },
139
+ ],
140
+ networkRules: [
141
+ { direction: 'egress', host: 'api.openai.com', port: 443, action: 'allow' },
142
+ { direction: 'egress', host: 'api.anthropic.com', port: 443, action: 'allow' },
143
+ { direction: 'egress', host: '*.openai.com', port: 443, action: 'allow' },
144
+ { direction: 'egress', host: '*.anthropic.com', port: 443, action: 'allow' },
145
+ { direction: 'egress', host: 'api.neurosec.ai', port: 443, action: 'allow' },
146
+ { direction: 'egress', host: '127.0.0.1', port: 9081, action: 'allow' },
147
+ { direction: 'egress', action: 'deny' },
148
+ { direction: 'ingress', action: 'deny' },
149
+ ],
150
+ retainedCapabilities: [],
151
+ cpuMax: '2.0',
152
+ memoryMax: '4GB',
153
+ pidMax: 500,
154
+ blockedCapabilities: [
155
+ 'CAP_NET_RAW', 'CAP_NET_ADMIN', 'CAP_SYS_ADMIN', 'CAP_SYS_PTRACE',
156
+ 'CAP_SYS_MODULE', 'CAP_SYS_BOOT', 'CAP_SYS_RAWIO',
157
+ 'CAP_AUDIT_CONTROL', 'CAP_SETUID', 'CAP_SETGID',
158
+ 'CAP_DAC_OVERRIDE', 'CAP_DAC_READ_SEARCH', 'CAP_FOWNER',
159
+ 'CAP_IPC_OWNER', 'CAP_KILL',
160
+ ],
161
+ },
162
+ {
163
+ name: 'default-restrictive',
164
+ frameworkIds: [],
165
+ allowedSyscalls: [
166
+ 'read', 'write', 'open', 'openat', 'close', 'stat', 'fstat',
167
+ 'mmap', 'munmap', 'brk', 'futex', 'exit_group', 'exit',
168
+ 'clock_gettime', 'nanosleep', 'getrandom', 'getpid', 'gettid',
169
+ 'connect', 'sendto', 'recvfrom',
170
+ 'socket', 'setsockopt',
171
+ 'rt_sigaction', 'rt_sigprocmask',
172
+ ],
173
+ blockedSyscalls: [
174
+ 'ptrace', 'perf_event_open', 'bpf', 'kexec_load', 'mount', 'umount',
175
+ 'init_module', 'delete_module', 'reboot', 'swapon',
176
+ 'clone', 'clone3', 'execve', 'execveat', 'fork', 'vfork',
177
+ 'setns', 'unshare', 'chroot', 'pivot_root',
178
+ ],
179
+ fsRules: [
180
+ { path: '/tmp/**', permissions: 'rw' },
181
+ { path: '/home/**', permissions: 'r' },
182
+ { path: '/usr/**', permissions: 'r' },
183
+ { path: '/dev/**', permissions: 'none' },
184
+ { path: '/sys/**', permissions: 'none' },
185
+ { path: '/proc/**', permissions: 'r' },
186
+ { path: '/etc/**', permissions: 'r' },
187
+ { path: '/etc/shadow', permissions: 'none' },
188
+ { path: '/etc/sudoers', permissions: 'none' },
189
+ ],
190
+ networkRules: [
191
+ { direction: 'egress', host: '127.0.0.1', port: 9081, action: 'allow' },
192
+ { direction: 'egress', action: 'deny' },
193
+ { direction: 'ingress', action: 'deny' },
194
+ ],
195
+ retainedCapabilities: [],
196
+ cpuMax: '0.5',
197
+ memoryMax: '512MB',
198
+ pidMax: 50,
199
+ blockedCapabilities: [
200
+ 'CAP_NET_RAW', 'CAP_NET_ADMIN', 'CAP_SYS_ADMIN', 'CAP_SYS_PTRACE',
201
+ 'CAP_SYS_MODULE', 'CAP_SYS_BOOT', 'CAP_SYS_RAWIO',
202
+ 'CAP_AUDIT_CONTROL', 'CAP_SETUID', 'CAP_SETGID',
203
+ 'CAP_DAC_OVERRIDE', 'CAP_DAC_READ_SEARCH', 'CAP_FOWNER',
204
+ 'CAP_IPC_OWNER', 'CAP_KILL', 'CAP_CHOWN', 'CAP_FSETID',
205
+ 'CAP_LINUX_IMMUTABLE', 'CAP_NET_BIND_SERVICE', 'CAP_NET_BROADCAST',
206
+ ],
207
+ },
208
+ ];
209
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@neurosec/sentry",
3
+ "version": "1.0.0",
4
+ "description": "NeuroShield Sentry — host-level agent protection daemon. Detects and blocks malicious AI agent actions at the OS level.",
5
+ "keywords": [
6
+ "ai-security",
7
+ "agent-security",
8
+ "llm-guard",
9
+ "neurosec",
10
+ "neuroshield",
11
+ "mcp-security",
12
+ "ai-governance"
13
+ ],
14
+ "homepage": "https://neurosec.ai/sentry",
15
+ "bugs": {
16
+ "url": "https://github.com/neurosec-ai/neurosec/issues"
17
+ },
18
+ "license": "MIT",
19
+ "author": "NeuroSec <dev@neurosec.ai> (https://neurosec.ai)",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/neurosec-ai/neurosec.git",
23
+ "directory": "packages/sentry"
24
+ },
25
+ "engines": {
26
+ "node": ">=20.0.0",
27
+ "npm": ">=9.0.0"
28
+ },
29
+ "os": [
30
+ "linux",
31
+ "darwin"
32
+ ],
33
+ "preferGlobal": true,
34
+ "bin": {
35
+ "neuroshield-sentryd": "./bin/sentryd.js",
36
+ "neuroshield-sentry": "./bin/cli.js"
37
+ },
38
+ "main": "dist/index.js",
39
+ "files": [
40
+ "bin/",
41
+ "dist/",
42
+ "scripts/",
43
+ "README.md",
44
+ "LICENSE"
45
+ ],
46
+ "scripts": {
47
+ "build": "tsc",
48
+ "start": "node bin/sentryd.js",
49
+ "dev": "ts-node src/index.ts",
50
+ "lint": "eslint src --ext .ts",
51
+ "test": "vitest run",
52
+ "prepack": "npm run build && node scripts/prepack.js",
53
+ "postinstall": "node scripts/postinstall.js"
54
+ },
55
+ "dependencies": {
56
+ "yaml": "^2.3.4",
57
+ "uuid": "^9.0.0",
58
+ "winston": "^3.11.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^20.0.0",
62
+ "typescript": "^5.3.0",
63
+ "vitest": "^1.0.0"
64
+ },
65
+ "publishConfig": {
66
+ "access": "public",
67
+ "registry": "https://registry.npmjs.org/"
68
+ }
69
+ }
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env bash
2
+ # NeuroShield Sentry Daemon — macOS launchd Installation Script
3
+ # Usage: sudo bash install-sentry-macos.sh [--mode enforce|monitor|quarantine]
4
+
5
+ set -euo pipefail
6
+
7
+ SENTRY_VERSION="${SENTRY_VERSION:-1.0.0}"
8
+ INSTALL_DIR="/usr/local/lib/neuroshield"
9
+ CONFIG_DIR="/etc/neuroshield"
10
+ STATE_DIR="/var/lib/neuroshield/sentry"
11
+ LOG_DIR="/var/log/neuroshield"
12
+ BIN_PATH="/usr/local/bin/neuroshield-sentryd"
13
+ CONFIG_PATH="${CONFIG_DIR}/sentry.yaml"
14
+ PLIST_LABEL="com.neuroshield.sentry"
15
+ PLIST_PATH="/Library/LaunchDaemons/${PLIST_LABEL}.plist"
16
+ ENFORCEMENT_MODE="monitor"
17
+
18
+ # Parse --mode flag
19
+ for arg in "$@"; do
20
+ case "${arg}" in
21
+ --mode=*) ENFORCEMENT_MODE="${arg#*=}" ;;
22
+ --mode) shift; ENFORCEMENT_MODE="$1" ;;
23
+ esac
24
+ done
25
+
26
+ echo "============================================"
27
+ echo " NeuroShield Sentry v${SENTRY_VERSION} Installer (macOS)"
28
+ echo " Mode: ${ENFORCEMENT_MODE}"
29
+ echo "============================================"
30
+
31
+ if [ "$EUID" -ne 0 ]; then
32
+ echo "Error: This script must be run as root (sudo)" >&2
33
+ exit 1
34
+ fi
35
+
36
+ if ! command -v node &>/dev/null; then
37
+ echo "Error: Node.js is required (>= 20)" >&2
38
+ exit 1
39
+ fi
40
+
41
+ NODE_VERSION=$(node -v | sed 's/v//' | cut -d. -f1)
42
+ if [ "${NODE_VERSION}" -lt 20 ]; then
43
+ echo "Error: Node.js >= 20 required (found v${NODE_VERSION})" >&2
44
+ exit 1
45
+ fi
46
+
47
+ # Create directories
48
+ echo "Creating directories..."
49
+ mkdir -p "${INSTALL_DIR}"
50
+ mkdir -p "${CONFIG_DIR}"
51
+ mkdir -p "${STATE_DIR}"
52
+ mkdir -p "${LOG_DIR}"
53
+ mkdir -p /var/run
54
+
55
+ # Build
56
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
57
+ PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
58
+ SENTRY_PACKAGE="${PROJECT_DIR}/packages/sentry"
59
+
60
+ if [ -f "${SENTRY_PACKAGE}/package.json" ]; then
61
+ echo "Building sentry daemon from source..."
62
+ cd "${SENTRY_PACKAGE}"
63
+ if [ ! -d "node_modules" ]; then
64
+ npm install --production
65
+ fi
66
+ npx tsc --outDir dist 2>/dev/null || true
67
+ cp -r dist "${INSTALL_DIR}/"
68
+ cp -r node_modules "${INSTALL_DIR}/"
69
+ cp package.json "${INSTALL_DIR}/"
70
+ fi
71
+
72
+ # Install binary wrapper
73
+ cat > "${BIN_PATH}" <<- 'BINEOF'
74
+ #!/usr/bin/env node
75
+ require('/usr/local/lib/neuroshield/dist/index.js');
76
+ BINEOF
77
+ chmod +x "${BIN_PATH}"
78
+
79
+ # Generate default config if not exists
80
+ if [ ! -f "${CONFIG_PATH}" ]; then
81
+ echo "Generating default config..."
82
+ cat > "${CONFIG_PATH}" <<- EOF
83
+ # NeuroShield Sentry Daemon Configuration (macOS)
84
+ sentry:
85
+ host_id: "$(scutil --get ComputerName 2>/dev/null || hostname)-sentry"
86
+ version: "${SENTRY_VERSION}"
87
+ health_port: 9190
88
+ api_port: 9191
89
+ state_dir: ${STATE_DIR}
90
+ pid_file_path: /var/run/neuroshield-sentry.pid
91
+
92
+ neurosec:
93
+ endpoint: "https://api.neurosec.ai"
94
+ org_id: "${NEUROSEC_ORG_ID:-}"
95
+ token_path: ${CONFIG_DIR}/sentry.token
96
+ tls_cert: ${CONFIG_DIR}/cert.pem
97
+ tls_key: ${CONFIG_DIR}/key.pem
98
+ sync_interval_ms: 30000
99
+ heartbeat_interval_ms: 300000
100
+
101
+ enforcement:
102
+ mode: "${ENFORCEMENT_MODE}"
103
+ sandbox_enabled: false
104
+ syscall_filter_enabled: false
105
+ network_filter_enabled: true
106
+ filesystem_filter_enabled: true
107
+
108
+ sandbox_defaults:
109
+ cpu_max: "0.5"
110
+ memory_max: "512MB"
111
+ pid_max: 100
112
+
113
+ network:
114
+ allow_hosts:
115
+ - "api.openai.com:443"
116
+ - "api.anthropic.com:443"
117
+ - "api.neurosec.ai:443"
118
+ block_hosts:
119
+ - "*.pastebin.com"
120
+ - "*.ngrok.io"
121
+ - "*.requestbin.net"
122
+ - "*.webhook.site"
123
+ allow_private: false
124
+ dns_monitor_enabled: true
125
+
126
+ skill_authz:
127
+ enabled: true
128
+ allow_unknown: false
129
+ require_approval:
130
+ - "shell_exec"
131
+ - "bash"
132
+ - "terminal"
133
+ - "run_command"
134
+
135
+ audit:
136
+ log_path: ${LOG_DIR}/sentry.log
137
+ retention_days: 90
138
+ max_size_mb: 500
139
+
140
+ discovery:
141
+ interval_ms: 30000
142
+ source_paths:
143
+ - /workspace
144
+ - /app
145
+ - /Users
146
+ - /tmp
147
+ EOF
148
+ echo " Config written to ${CONFIG_PATH}"
149
+ fi
150
+
151
+ # Create empty token file
152
+ if [ ! -f "${CONFIG_DIR}/sentry.token" ]; then
153
+ touch "${CONFIG_DIR}/sentry.token"
154
+ chmod 600 "${CONFIG_DIR}/sentry.token"
155
+ fi
156
+
157
+ # Install launchd plist
158
+ echo "Installing launchd service..."
159
+ cat > "${PLIST_PATH}" <<- EOF
160
+ <?xml version="1.0" encoding="UTF-8"?>
161
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
162
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
163
+ <plist version="1.0">
164
+ <dict>
165
+ <key>Label</key>
166
+ <string>${PLIST_LABEL}</string>
167
+
168
+ <key>ProgramArguments</key>
169
+ <array>
170
+ <string>${BIN_PATH}</string>
171
+ <string>${CONFIG_PATH}</string>
172
+ </array>
173
+
174
+ <key>RunAtLoad</key>
175
+ <true/>
176
+
177
+ <key>KeepAlive</key>
178
+ <dict>
179
+ <key>Crashed</key>
180
+ <true/>
181
+ <key>SuccessfulExit</key>
182
+ <false/>
183
+ </dict>
184
+
185
+ <key>ThrottleInterval</key>
186
+ <integer>10</integer>
187
+
188
+ <key>WorkingDirectory</key>
189
+ <string>${INSTALL_DIR}</string>
190
+
191
+ <key>StandardOutPath</key>
192
+ <string>${LOG_DIR}/sentry-stdout.log</string>
193
+
194
+ <key>StandardErrorPath</key>
195
+ <string>${LOG_DIR}/sentry-stderr.log</string>
196
+
197
+ <key>EnvironmentVariables</key>
198
+ <dict>
199
+ <key>NODE_ENV</key>
200
+ <string>production</string>
201
+ <key>SENTRY_CONFIG_PATH</key>
202
+ <string>${CONFIG_PATH}</string>
203
+ <key>LOG_LEVEL</key>
204
+ <string>info</string>
205
+ </dict>
206
+
207
+ <key>UserName</key>
208
+ <string>root</string>
209
+
210
+ <key>SessionCreate</key>
211
+ <true/>
212
+ </dict>
213
+ </plist>
214
+ EOF
215
+
216
+ chmod 644 "${PLIST_PATH}"
217
+ echo " Plist: ${PLIST_PATH}"
218
+
219
+ # Load the service
220
+ launchctl load "${PLIST_PATH}"
221
+
222
+ echo ""
223
+ echo "============================================"
224
+ echo " Installation Complete!"
225
+ echo "============================================"
226
+ echo ""
227
+ echo " Next steps:"
228
+ echo " 1. Edit ${CONFIG_PATH} with your NeuroSec org ID"
229
+ echo " 2. Set your sentry token: echo 'your-token' > ${CONFIG_DIR}/sentry.token"
230
+ echo " 3. Start the daemon: launchctl start ${PLIST_LABEL}"
231
+ echo " 4. Check status: launchctl list ${PLIST_LABEL}"
232
+ echo " 5. View logs: tail -f ${LOG_DIR}/sentry-stdout.log"
233
+ echo " 6. Local API: curl http://127.0.0.1:9191/api/v1/status"
234
+ echo ""
235
+ echo " To uninstall:"
236
+ echo " sudo launchctl unload ${PLIST_PATH}"
237
+ echo " sudo rm ${PLIST_PATH}"
238
+ echo ""