@shykaruu/jarvis-brain 0.4.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 (330) hide show
  1. package/LICENSE +153 -0
  2. package/README.md +428 -0
  3. package/bin/jarvis.ts +449 -0
  4. package/package.json +79 -0
  5. package/roles/activity-observer.yaml +60 -0
  6. package/roles/ceo-founder.yaml +144 -0
  7. package/roles/chief-of-staff.yaml +158 -0
  8. package/roles/dev-lead.yaml +182 -0
  9. package/roles/executive-assistant.yaml +77 -0
  10. package/roles/marketing-director.yaml +168 -0
  11. package/roles/personal-assistant.yaml +266 -0
  12. package/roles/research-specialist.yaml +60 -0
  13. package/roles/specialists/content-writer.yaml +53 -0
  14. package/roles/specialists/customer-support.yaml +57 -0
  15. package/roles/specialists/data-analyst.yaml +57 -0
  16. package/roles/specialists/financial-analyst.yaml +56 -0
  17. package/roles/specialists/hr-specialist.yaml +55 -0
  18. package/roles/specialists/legal-advisor.yaml +58 -0
  19. package/roles/specialists/marketing-strategist.yaml +56 -0
  20. package/roles/specialists/project-coordinator.yaml +55 -0
  21. package/roles/specialists/research-analyst.yaml +58 -0
  22. package/roles/specialists/software-engineer.yaml +57 -0
  23. package/roles/specialists/system-administrator.yaml +57 -0
  24. package/roles/system-admin.yaml +76 -0
  25. package/scripts/ensure-bun.cjs +16 -0
  26. package/src/actions/README.md +421 -0
  27. package/src/actions/app-control/desktop-controller.test.ts +26 -0
  28. package/src/actions/app-control/desktop-controller.ts +438 -0
  29. package/src/actions/app-control/interface.ts +64 -0
  30. package/src/actions/app-control/linux.ts +273 -0
  31. package/src/actions/app-control/macos.ts +54 -0
  32. package/src/actions/app-control/sidecar-launcher.test.ts +23 -0
  33. package/src/actions/app-control/sidecar-launcher.ts +286 -0
  34. package/src/actions/app-control/windows.ts +44 -0
  35. package/src/actions/browser/cdp.ts +138 -0
  36. package/src/actions/browser/chrome-launcher.ts +261 -0
  37. package/src/actions/browser/session.ts +506 -0
  38. package/src/actions/browser/stealth.ts +49 -0
  39. package/src/actions/index.ts +20 -0
  40. package/src/actions/terminal/executor.ts +157 -0
  41. package/src/actions/terminal/wsl-bridge.ts +126 -0
  42. package/src/actions/test.ts +93 -0
  43. package/src/actions/tools/agents.ts +363 -0
  44. package/src/actions/tools/builtin.ts +950 -0
  45. package/src/actions/tools/commitments.ts +192 -0
  46. package/src/actions/tools/content.ts +217 -0
  47. package/src/actions/tools/delegate.ts +147 -0
  48. package/src/actions/tools/desktop.test.ts +55 -0
  49. package/src/actions/tools/desktop.ts +305 -0
  50. package/src/actions/tools/documents.ts +169 -0
  51. package/src/actions/tools/goals.ts +376 -0
  52. package/src/actions/tools/local-tools-guard.ts +31 -0
  53. package/src/actions/tools/registry.ts +173 -0
  54. package/src/actions/tools/research.ts +111 -0
  55. package/src/actions/tools/sidecar-list.ts +57 -0
  56. package/src/actions/tools/sidecar-route.ts +105 -0
  57. package/src/actions/tools/workflows.ts +216 -0
  58. package/src/agents/agent.ts +132 -0
  59. package/src/agents/delegation.ts +107 -0
  60. package/src/agents/hierarchy.ts +113 -0
  61. package/src/agents/index.ts +19 -0
  62. package/src/agents/messaging.ts +125 -0
  63. package/src/agents/orchestrator.ts +592 -0
  64. package/src/agents/role-discovery.ts +61 -0
  65. package/src/agents/sub-agent-runner.ts +309 -0
  66. package/src/agents/task-manager.ts +151 -0
  67. package/src/authority/approval-delivery.ts +59 -0
  68. package/src/authority/approval.ts +196 -0
  69. package/src/authority/audit.ts +158 -0
  70. package/src/authority/authority.test.ts +519 -0
  71. package/src/authority/deferred-executor.ts +103 -0
  72. package/src/authority/emergency.ts +66 -0
  73. package/src/authority/engine.ts +301 -0
  74. package/src/authority/index.ts +12 -0
  75. package/src/authority/learning.ts +111 -0
  76. package/src/authority/tool-action-map.ts +74 -0
  77. package/src/awareness/analytics.ts +466 -0
  78. package/src/awareness/awareness.test.ts +332 -0
  79. package/src/awareness/capture-engine.ts +305 -0
  80. package/src/awareness/context-graph.ts +130 -0
  81. package/src/awareness/context-tracker.ts +349 -0
  82. package/src/awareness/index.ts +25 -0
  83. package/src/awareness/intelligence.ts +321 -0
  84. package/src/awareness/ocr-engine.ts +88 -0
  85. package/src/awareness/service.ts +528 -0
  86. package/src/awareness/struggle-detector.ts +342 -0
  87. package/src/awareness/suggestion-engine.ts +476 -0
  88. package/src/awareness/types.ts +201 -0
  89. package/src/cli/autostart.ts +417 -0
  90. package/src/cli/deps.ts +449 -0
  91. package/src/cli/doctor.ts +238 -0
  92. package/src/cli/helpers.ts +401 -0
  93. package/src/cli/onboard.ts +827 -0
  94. package/src/cli/uninstall.test.ts +37 -0
  95. package/src/cli/uninstall.ts +202 -0
  96. package/src/comms/README.md +329 -0
  97. package/src/comms/auth-error.html +48 -0
  98. package/src/comms/channels/discord.ts +228 -0
  99. package/src/comms/channels/signal.ts +56 -0
  100. package/src/comms/channels/telegram.ts +316 -0
  101. package/src/comms/channels/whatsapp.ts +60 -0
  102. package/src/comms/channels.test.ts +173 -0
  103. package/src/comms/dashboard-auth.ts +75 -0
  104. package/src/comms/desktop-notify.ts +114 -0
  105. package/src/comms/example.ts +129 -0
  106. package/src/comms/index.ts +129 -0
  107. package/src/comms/streaming.ts +149 -0
  108. package/src/comms/voice.test.ts +504 -0
  109. package/src/comms/voice.ts +341 -0
  110. package/src/comms/websocket.test.ts +409 -0
  111. package/src/comms/websocket.ts +669 -0
  112. package/src/config/README.md +389 -0
  113. package/src/config/index.ts +6 -0
  114. package/src/config/loader.test.ts +183 -0
  115. package/src/config/loader.ts +148 -0
  116. package/src/config/types.ts +293 -0
  117. package/src/daemon/README.md +232 -0
  118. package/src/daemon/agent-service-interface.ts +9 -0
  119. package/src/daemon/agent-service.ts +667 -0
  120. package/src/daemon/api-routes.ts +3067 -0
  121. package/src/daemon/background-agent-service.ts +396 -0
  122. package/src/daemon/background-agent.test.ts +78 -0
  123. package/src/daemon/channel-service.ts +201 -0
  124. package/src/daemon/commitment-executor.ts +297 -0
  125. package/src/daemon/dashboard-auth.test.ts +170 -0
  126. package/src/daemon/event-classifier.ts +239 -0
  127. package/src/daemon/event-coalescer.ts +123 -0
  128. package/src/daemon/event-reactor.ts +214 -0
  129. package/src/daemon/flock.c +7 -0
  130. package/src/daemon/health.ts +220 -0
  131. package/src/daemon/index.ts +1070 -0
  132. package/src/daemon/llm-settings.test.ts +78 -0
  133. package/src/daemon/llm-settings.ts +450 -0
  134. package/src/daemon/observer-service.ts +150 -0
  135. package/src/daemon/pid.test.ts +283 -0
  136. package/src/daemon/pid.ts +224 -0
  137. package/src/daemon/research-queue.ts +155 -0
  138. package/src/daemon/services.ts +175 -0
  139. package/src/daemon/ws-service.ts +926 -0
  140. package/src/global.d.ts +4 -0
  141. package/src/goals/accountability.ts +240 -0
  142. package/src/goals/awareness-bridge.ts +185 -0
  143. package/src/goals/estimator.ts +185 -0
  144. package/src/goals/events.ts +28 -0
  145. package/src/goals/goals.test.ts +400 -0
  146. package/src/goals/integration.test.ts +329 -0
  147. package/src/goals/nl-builder.test.ts +220 -0
  148. package/src/goals/nl-builder.ts +256 -0
  149. package/src/goals/rhythm.test.ts +177 -0
  150. package/src/goals/rhythm.ts +275 -0
  151. package/src/goals/service.test.ts +135 -0
  152. package/src/goals/service.ts +407 -0
  153. package/src/goals/types.ts +106 -0
  154. package/src/goals/workflow-bridge.ts +96 -0
  155. package/src/integrations/google-api.ts +134 -0
  156. package/src/integrations/google-auth.ts +175 -0
  157. package/src/llm/README.md +291 -0
  158. package/src/llm/anthropic.ts +400 -0
  159. package/src/llm/gemini.ts +380 -0
  160. package/src/llm/groq.ts +406 -0
  161. package/src/llm/history.ts +147 -0
  162. package/src/llm/index.ts +21 -0
  163. package/src/llm/manager.ts +226 -0
  164. package/src/llm/ollama.ts +316 -0
  165. package/src/llm/openai.ts +411 -0
  166. package/src/llm/openrouter.ts +390 -0
  167. package/src/llm/provider.test.ts +487 -0
  168. package/src/llm/provider.ts +61 -0
  169. package/src/llm/test.ts +88 -0
  170. package/src/observers/README.md +278 -0
  171. package/src/observers/calendar.ts +113 -0
  172. package/src/observers/clipboard.ts +136 -0
  173. package/src/observers/email.ts +109 -0
  174. package/src/observers/example.ts +58 -0
  175. package/src/observers/file-watcher.ts +124 -0
  176. package/src/observers/index.ts +159 -0
  177. package/src/observers/notifications.ts +197 -0
  178. package/src/observers/observers.test.ts +203 -0
  179. package/src/observers/processes.ts +225 -0
  180. package/src/personality/README.md +61 -0
  181. package/src/personality/adapter.ts +196 -0
  182. package/src/personality/index.ts +20 -0
  183. package/src/personality/learner.ts +209 -0
  184. package/src/personality/model.ts +132 -0
  185. package/src/personality/personality.test.ts +236 -0
  186. package/src/roles/README.md +252 -0
  187. package/src/roles/authority.ts +120 -0
  188. package/src/roles/example-usage.ts +198 -0
  189. package/src/roles/index.ts +42 -0
  190. package/src/roles/loader.ts +143 -0
  191. package/src/roles/prompt-builder.ts +218 -0
  192. package/src/roles/test-multi.ts +102 -0
  193. package/src/roles/test-role.yaml +77 -0
  194. package/src/roles/test-utils.ts +93 -0
  195. package/src/roles/test.ts +106 -0
  196. package/src/roles/tool-guide.ts +195 -0
  197. package/src/roles/types.ts +36 -0
  198. package/src/roles/utils.ts +200 -0
  199. package/src/scripts/google-setup.ts +168 -0
  200. package/src/sidecar/connection.ts +179 -0
  201. package/src/sidecar/index.ts +6 -0
  202. package/src/sidecar/manager.ts +542 -0
  203. package/src/sidecar/protocol.ts +85 -0
  204. package/src/sidecar/rpc.ts +161 -0
  205. package/src/sidecar/scheduler.ts +136 -0
  206. package/src/sidecar/types.ts +112 -0
  207. package/src/sidecar/validator.ts +144 -0
  208. package/src/sites/builder-tools.ts +215 -0
  209. package/src/sites/dev-server-manager.ts +286 -0
  210. package/src/sites/fixtures/security-test-site/.jarvis-project.json +6 -0
  211. package/src/sites/fixtures/security-test-site/Makefile +15 -0
  212. package/src/sites/fixtures/security-test-site/README.md +18 -0
  213. package/src/sites/fixtures/security-test-site/index.html +12 -0
  214. package/src/sites/fixtures/security-test-site/index.ts +16 -0
  215. package/src/sites/fixtures/security-test-site/package.json +13 -0
  216. package/src/sites/fixtures/security-test-site/src/app.tsx +780 -0
  217. package/src/sites/fixtures/security-test-site/tsconfig.json +10 -0
  218. package/src/sites/git-manager.ts +240 -0
  219. package/src/sites/github-manager.ts +355 -0
  220. package/src/sites/index.ts +25 -0
  221. package/src/sites/project-manager.ts +389 -0
  222. package/src/sites/proxy.ts +133 -0
  223. package/src/sites/service.ts +136 -0
  224. package/src/sites/templates.ts +169 -0
  225. package/src/sites/types.ts +89 -0
  226. package/src/user/profile-followup.test.ts +84 -0
  227. package/src/user/profile-followup.ts +185 -0
  228. package/src/user/profile.ts +224 -0
  229. package/src/vault/README.md +110 -0
  230. package/src/vault/awareness.ts +341 -0
  231. package/src/vault/commitments.ts +299 -0
  232. package/src/vault/content-pipeline.ts +270 -0
  233. package/src/vault/conversations.ts +173 -0
  234. package/src/vault/dashboard-sessions.ts +44 -0
  235. package/src/vault/documents.ts +130 -0
  236. package/src/vault/entities.ts +185 -0
  237. package/src/vault/extractor.test.ts +356 -0
  238. package/src/vault/extractor.ts +345 -0
  239. package/src/vault/facts.ts +190 -0
  240. package/src/vault/goals.ts +477 -0
  241. package/src/vault/index.ts +87 -0
  242. package/src/vault/keychain.ts +99 -0
  243. package/src/vault/observations.ts +115 -0
  244. package/src/vault/relationships.ts +178 -0
  245. package/src/vault/retrieval.test.ts +139 -0
  246. package/src/vault/retrieval.ts +258 -0
  247. package/src/vault/schema.ts +709 -0
  248. package/src/vault/settings.ts +38 -0
  249. package/src/vault/user-profile.test.ts +113 -0
  250. package/src/vault/user-profile.ts +176 -0
  251. package/src/vault/vectors.ts +92 -0
  252. package/src/vault/webapp-template-seeds.ts +116 -0
  253. package/src/vault/webapp-templates.ts +244 -0
  254. package/src/vault/workflows.ts +403 -0
  255. package/src/workflows/auto-suggest.ts +290 -0
  256. package/src/workflows/engine.ts +366 -0
  257. package/src/workflows/events.ts +24 -0
  258. package/src/workflows/executor.ts +207 -0
  259. package/src/workflows/nl-builder.ts +198 -0
  260. package/src/workflows/nodes/actions/agent-task.ts +73 -0
  261. package/src/workflows/nodes/actions/calendar-action.ts +85 -0
  262. package/src/workflows/nodes/actions/code-execution.ts +73 -0
  263. package/src/workflows/nodes/actions/discord.ts +77 -0
  264. package/src/workflows/nodes/actions/file-write.ts +73 -0
  265. package/src/workflows/nodes/actions/gmail.ts +69 -0
  266. package/src/workflows/nodes/actions/http-request.ts +117 -0
  267. package/src/workflows/nodes/actions/notification.ts +85 -0
  268. package/src/workflows/nodes/actions/run-tool.ts +55 -0
  269. package/src/workflows/nodes/actions/send-message.ts +82 -0
  270. package/src/workflows/nodes/actions/shell-command.ts +76 -0
  271. package/src/workflows/nodes/actions/telegram.ts +60 -0
  272. package/src/workflows/nodes/builtin.ts +119 -0
  273. package/src/workflows/nodes/error/error-handler.ts +37 -0
  274. package/src/workflows/nodes/error/fallback.ts +47 -0
  275. package/src/workflows/nodes/error/retry.ts +82 -0
  276. package/src/workflows/nodes/logic/delay.ts +42 -0
  277. package/src/workflows/nodes/logic/if-else.ts +41 -0
  278. package/src/workflows/nodes/logic/loop.ts +90 -0
  279. package/src/workflows/nodes/logic/merge.ts +38 -0
  280. package/src/workflows/nodes/logic/race.ts +40 -0
  281. package/src/workflows/nodes/logic/switch.ts +59 -0
  282. package/src/workflows/nodes/logic/template-render.ts +53 -0
  283. package/src/workflows/nodes/logic/variable-get.ts +37 -0
  284. package/src/workflows/nodes/logic/variable-set.ts +59 -0
  285. package/src/workflows/nodes/registry.ts +99 -0
  286. package/src/workflows/nodes/transform/aggregate.ts +99 -0
  287. package/src/workflows/nodes/transform/csv-parse.ts +70 -0
  288. package/src/workflows/nodes/transform/json-parse.ts +63 -0
  289. package/src/workflows/nodes/transform/map-filter.ts +84 -0
  290. package/src/workflows/nodes/transform/regex-match.ts +89 -0
  291. package/src/workflows/nodes/triggers/calendar.ts +33 -0
  292. package/src/workflows/nodes/triggers/clipboard.ts +32 -0
  293. package/src/workflows/nodes/triggers/cron.ts +40 -0
  294. package/src/workflows/nodes/triggers/email.ts +40 -0
  295. package/src/workflows/nodes/triggers/file-change.ts +45 -0
  296. package/src/workflows/nodes/triggers/git.ts +46 -0
  297. package/src/workflows/nodes/triggers/manual.ts +23 -0
  298. package/src/workflows/nodes/triggers/poll.ts +81 -0
  299. package/src/workflows/nodes/triggers/process.ts +44 -0
  300. package/src/workflows/nodes/triggers/screen-event.ts +37 -0
  301. package/src/workflows/nodes/triggers/webhook.ts +39 -0
  302. package/src/workflows/safe-eval.ts +139 -0
  303. package/src/workflows/template.ts +118 -0
  304. package/src/workflows/triggers/cron.ts +311 -0
  305. package/src/workflows/triggers/manager.ts +285 -0
  306. package/src/workflows/triggers/observer-bridge.ts +172 -0
  307. package/src/workflows/triggers/poller.ts +201 -0
  308. package/src/workflows/triggers/screen-condition.ts +218 -0
  309. package/src/workflows/triggers/triggers.test.ts +740 -0
  310. package/src/workflows/triggers/webhook.ts +191 -0
  311. package/src/workflows/types.ts +133 -0
  312. package/src/workflows/variables.ts +72 -0
  313. package/src/workflows/workflows.test.ts +383 -0
  314. package/src/workflows/yaml.ts +104 -0
  315. package/ui/dist/index-3gr23jt9.js +112614 -0
  316. package/ui/dist/index-9vmj8127.css +14239 -0
  317. package/ui/dist/index-hy9pc1gm.js +112873 -0
  318. package/ui/dist/index-j2ep5d1w.js +112374 -0
  319. package/ui/dist/index-jt00vjqs.js +112858 -0
  320. package/ui/dist/index-k9ymx5qb.js +112374 -0
  321. package/ui/dist/index.html +16 -0
  322. package/ui/public/audio/pcm-capture-processor.js +11 -0
  323. package/ui/public/openwakeword/models/embedding_model.onnx +0 -0
  324. package/ui/public/openwakeword/models/hey_jarvis_v0.1.onnx +0 -0
  325. package/ui/public/openwakeword/models/melspectrogram.onnx +0 -0
  326. package/ui/public/openwakeword/models/silero_vad.onnx +0 -0
  327. package/ui/public/ort/ort-wasm-simd-threaded.jsep.mjs +106 -0
  328. package/ui/public/ort/ort-wasm-simd-threaded.jsep.wasm +0 -0
  329. package/ui/public/ort/ort-wasm-simd-threaded.mjs +59 -0
  330. package/ui/public/ort/ort-wasm-simd-threaded.wasm +0 -0
@@ -0,0 +1,120 @@
1
+ import type { RoleDefinition } from './types.ts';
2
+
3
+ export type ActionCategory =
4
+ | 'read_data' | 'write_data' | 'delete_data'
5
+ | 'send_message' | 'send_email'
6
+ | 'execute_command' | 'install_software'
7
+ | 'make_payment' | 'modify_settings'
8
+ | 'spawn_agent' | 'terminate_agent'
9
+ | 'access_browser' | 'control_app';
10
+
11
+ /**
12
+ * Maps action categories to minimum required authority level
13
+ *
14
+ * Authority levels:
15
+ * - 1-2: Read only (read_data)
16
+ * - 3-4: Read + write + send messages (write_data, send_message)
17
+ * - 5-6: + execute commands, control apps (execute_command, access_browser, control_app)
18
+ * - 1+: spawn agents (spawn_agent) — always allowed
19
+ * - 7-8: + send email, install software (send_email, install_software)
20
+ * - 9-10: Full access including payments and settings (make_payment, modify_settings, delete_data, terminate_agent)
21
+ */
22
+ export const AUTHORITY_REQUIREMENTS: Record<ActionCategory, number> = {
23
+ // Level 1-2: Read only
24
+ 'read_data': 1,
25
+
26
+ // Level 3-4: Read + write + send messages
27
+ 'write_data': 3,
28
+ 'send_message': 3,
29
+
30
+ // Level 5-6: + execute commands, control apps
31
+ 'execute_command': 5,
32
+ 'access_browser': 5,
33
+ 'control_app': 5,
34
+
35
+ // Level 7-8: + spawn agents, send email, install software
36
+ 'spawn_agent': 1,
37
+ 'send_email': 7,
38
+ 'install_software': 7,
39
+
40
+ // Level 9-10: Full access including payments and settings
41
+ 'make_payment': 9,
42
+ 'modify_settings': 9,
43
+ 'delete_data': 9,
44
+ 'terminate_agent': 9,
45
+ };
46
+
47
+ /**
48
+ * Check if a role can perform a specific action
49
+ */
50
+ export function canPerform(role: RoleDefinition, action: ActionCategory): boolean {
51
+ const requiredLevel = AUTHORITY_REQUIREMENTS[action];
52
+ return role.authority_level >= requiredLevel;
53
+ }
54
+
55
+ /**
56
+ * Get the required authority level for an action
57
+ */
58
+ export function getRequiredLevel(action: ActionCategory): number {
59
+ return AUTHORITY_REQUIREMENTS[action];
60
+ }
61
+
62
+ /**
63
+ * List all actions a role is allowed to perform
64
+ */
65
+ export function listAllowedActions(role: RoleDefinition): ActionCategory[] {
66
+ const actions = Object.keys(AUTHORITY_REQUIREMENTS) as ActionCategory[];
67
+ return actions.filter(action => canPerform(role, action));
68
+ }
69
+
70
+ /**
71
+ * List all actions a role is NOT allowed to perform
72
+ */
73
+ export function listDeniedActions(role: RoleDefinition): ActionCategory[] {
74
+ const actions = Object.keys(AUTHORITY_REQUIREMENTS) as ActionCategory[];
75
+ return actions.filter(action => !canPerform(role, action));
76
+ }
77
+
78
+ /**
79
+ * Get a human-readable description of what an authority level allows
80
+ */
81
+ export function describeAuthorityLevel(level: number): string {
82
+ if (level < 1 || level > 10) {
83
+ return 'Invalid authority level';
84
+ }
85
+
86
+ if (level <= 2) {
87
+ return 'Read-only access. Can read data but cannot modify anything.';
88
+ }
89
+
90
+ if (level <= 4) {
91
+ return 'Read and write access. Can read/write data and send messages.';
92
+ }
93
+
94
+ if (level <= 6) {
95
+ return 'Command execution. Can execute commands, control apps, and access browser.';
96
+ }
97
+
98
+ if (level <= 8) {
99
+ return 'Agent management. Can spawn agents, send emails, and install software.';
100
+ }
101
+
102
+ return 'Full access. Can make payments, modify settings, delete data, and terminate agents.';
103
+ }
104
+
105
+ /**
106
+ * Get a summary of a role's permissions
107
+ */
108
+ export function getRolePermissionsSummary(role: RoleDefinition): {
109
+ level: number;
110
+ description: string;
111
+ allowed: ActionCategory[];
112
+ denied: ActionCategory[];
113
+ } {
114
+ return {
115
+ level: role.authority_level,
116
+ description: describeAuthorityLevel(role.authority_level),
117
+ allowed: listAllowedActions(role),
118
+ denied: listDeniedActions(role),
119
+ };
120
+ }
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Example usage of the Role Engine in a real application
4
+ *
5
+ * This demonstrates how to integrate the Role Engine with an agent system
6
+ */
7
+
8
+ import {
9
+ loadRolesFromDir,
10
+ buildSystemPrompt,
11
+ canPerform,
12
+ getRolePermissionsSummary,
13
+ type RoleDefinition,
14
+ type ActionCategory,
15
+ } from './index.ts';
16
+
17
+ // Mock agent state
18
+ interface AgentState {
19
+ id: string;
20
+ role: RoleDefinition;
21
+ currentTask?: string;
22
+ commitments: string[];
23
+ observations: string[];
24
+ }
25
+
26
+ /**
27
+ * Initialize the role system and load all available roles
28
+ */
29
+ function initializeRoleSystem(rolesDir: string): Map<string, RoleDefinition> {
30
+ console.log('🔧 Initializing Role System...');
31
+ const roles = loadRolesFromDir(rolesDir);
32
+ console.log(`✅ Loaded ${roles.size} roles`);
33
+
34
+ // Display loaded roles
35
+ for (const [id, role] of roles) {
36
+ console.log(` - ${role.name} (authority: ${role.authority_level}/10)`);
37
+ }
38
+
39
+ return roles;
40
+ }
41
+
42
+ /**
43
+ * Create an agent with a specific role
44
+ */
45
+ function createAgent(
46
+ agentId: string,
47
+ roleId: string,
48
+ roles: Map<string, RoleDefinition>
49
+ ): AgentState | null {
50
+ const role = roles.get(roleId);
51
+
52
+ if (!role) {
53
+ console.error(`❌ Role '${roleId}' not found`);
54
+ return null;
55
+ }
56
+
57
+ console.log(`\n🤖 Creating agent '${agentId}' with role '${role.name}'`);
58
+
59
+ const agent: AgentState = {
60
+ id: agentId,
61
+ role,
62
+ commitments: [],
63
+ observations: [],
64
+ };
65
+
66
+ // Display agent capabilities
67
+ const permissions = getRolePermissionsSummary(role);
68
+ console.log(` Authority: ${permissions.level}/10`);
69
+ console.log(` ${permissions.description}`);
70
+ console.log(` Allowed actions: ${permissions.allowed.join(', ')}`);
71
+
72
+ return agent;
73
+ }
74
+
75
+ /**
76
+ * Check if an agent can perform an action, with logging
77
+ */
78
+ function checkAction(agent: AgentState, action: ActionCategory): boolean {
79
+ const can = canPerform(agent.role, action);
80
+ const status = can ? '✅' : '❌';
81
+ console.log(` ${status} ${action}: ${can ? 'ALLOWED' : 'DENIED'}`);
82
+ return can;
83
+ }
84
+
85
+ /**
86
+ * Generate system prompt for an agent
87
+ */
88
+ function generateAgentPrompt(agent: AgentState, userName: string): string {
89
+ console.log(`\n📝 Generating system prompt for ${agent.id}...`);
90
+
91
+ const prompt = buildSystemPrompt(agent.role, {
92
+ userName,
93
+ currentTime: new Date().toLocaleString(),
94
+ activeCommitments: agent.commitments,
95
+ recentObservations: agent.observations,
96
+ agentHierarchy: 'You are a top-level agent',
97
+ });
98
+
99
+ console.log(` Generated ${prompt.length} characters`);
100
+ return prompt;
101
+ }
102
+
103
+ /**
104
+ * Simulate an agent attempting various actions
105
+ */
106
+ function simulateAgentActions(agent: AgentState) {
107
+ console.log(`\n🎬 Simulating actions for ${agent.role.name}...`);
108
+
109
+ const actions: ActionCategory[] = [
110
+ 'read_data',
111
+ 'write_data',
112
+ 'send_message',
113
+ 'execute_command',
114
+ 'spawn_agent',
115
+ 'send_email',
116
+ 'make_payment',
117
+ 'delete_data',
118
+ ];
119
+
120
+ for (const action of actions) {
121
+ checkAction(agent, action);
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Main demonstration
127
+ */
128
+ async function main() {
129
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
130
+ console.log(' J.A.R.V.I.S. Role Engine - Usage Example');
131
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
132
+
133
+ // 1. Initialize role system
134
+ const { join } = await import('path');
135
+ const roles = initializeRoleSystem(join(import.meta.dir, '../../roles'));
136
+
137
+ // 2. Create different agents with different roles
138
+ const execAgent = createAgent('agent-001', 'executive_assistant', roles);
139
+ const researchAgent = createAgent('agent-002', 'research_specialist', roles);
140
+ const observerAgent = createAgent('agent-003', 'activity_observer', roles);
141
+ const sysAdminAgent = createAgent('agent-004', 'system_admin', roles);
142
+
143
+ if (!execAgent || !researchAgent || !observerAgent || !sysAdminAgent) {
144
+ console.error('Failed to create agents');
145
+ return;
146
+ }
147
+
148
+ // 3. Add some state to the executive agent
149
+ execAgent.commitments = [
150
+ 'Prepare board meeting presentation',
151
+ 'Review quarterly reports',
152
+ ];
153
+ execAgent.observations = [
154
+ 'User has 3 meetings tomorrow morning',
155
+ 'User prefers detailed reports',
156
+ ];
157
+
158
+ // 4. Generate system prompts
159
+ const execPrompt = generateAgentPrompt(execAgent, 'Alice Johnson');
160
+
161
+ // 5. Test permission boundaries
162
+ console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
163
+ console.log(' Permission Testing');
164
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
165
+
166
+ simulateAgentActions(execAgent);
167
+ simulateAgentActions(observerAgent);
168
+ simulateAgentActions(sysAdminAgent);
169
+
170
+ // 6. Show a snippet of the generated prompt
171
+ console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
172
+ console.log(' Sample System Prompt');
173
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
174
+ console.log(execPrompt.substring(0, 600) + '...\n');
175
+
176
+ // 7. Compare roles
177
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
178
+ console.log(' Role Comparison');
179
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
180
+
181
+ const agents = [execAgent, researchAgent, observerAgent, sysAdminAgent];
182
+
183
+ console.log('Role | Auth | Can Execute? | Can Pay? | Tools');
184
+ console.log('──────────────────────|──────|──────────────|──────────|──────');
185
+
186
+ for (const agent of agents) {
187
+ const name = agent.role.name.padEnd(21);
188
+ const auth = `${agent.role.authority_level}/10`.padEnd(4);
189
+ const canExec = canPerform(agent.role, 'execute_command') ? '✅ Yes' : '❌ No ';
190
+ const canPay = canPerform(agent.role, 'make_payment') ? '✅ Yes' : '❌ No ';
191
+ const tools = agent.role.tools.length;
192
+ console.log(`${name} | ${auth} | ${canExec} | ${canPay} | ${tools}`);
193
+ }
194
+
195
+ console.log('\n✅ Example complete!\n');
196
+ }
197
+
198
+ main().catch(console.error);
@@ -0,0 +1,42 @@
1
+ // Type definitions
2
+ export type {
3
+ KPI,
4
+ CommunicationStyle,
5
+ SubRoleTemplate,
6
+ RoleDefinition,
7
+ } from './types.ts';
8
+
9
+ // Loader functions
10
+ export {
11
+ loadRole,
12
+ loadRolesFromDir,
13
+ validateRole,
14
+ } from './loader.ts';
15
+
16
+ // Prompt builder
17
+ export type { PromptContext } from './prompt-builder.ts';
18
+ export { buildSystemPrompt } from './prompt-builder.ts';
19
+
20
+ // Authority system
21
+ export type { ActionCategory } from './authority.ts';
22
+ export {
23
+ AUTHORITY_REQUIREMENTS,
24
+ canPerform,
25
+ getRequiredLevel,
26
+ listAllowedActions,
27
+ listDeniedActions,
28
+ describeAuthorityLevel,
29
+ getRolePermissionsSummary,
30
+ } from './authority.ts';
31
+
32
+ // Utility functions
33
+ export {
34
+ findRolesWithPermission,
35
+ findMinimalRoleForAction,
36
+ compareRoles,
37
+ getRoleHierarchy,
38
+ canSpawnRole,
39
+ findSpawnersOfRole,
40
+ validateRoleHierarchy,
41
+ getRoleStats,
42
+ } from './utils.ts';
@@ -0,0 +1,143 @@
1
+ import YAML from 'yaml';
2
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
3
+ import { join, extname } from 'node:path';
4
+ import type { RoleDefinition, KPI, CommunicationStyle, SubRoleTemplate } from './types.ts';
5
+
6
+ /**
7
+ * Load a role from a YAML file
8
+ */
9
+ export function loadRole(filePath: string): RoleDefinition {
10
+ const content = readFileSync(filePath, 'utf-8');
11
+ const data = YAML.parse(content);
12
+
13
+ if (!validateRole(data)) {
14
+ throw new Error(`Invalid role definition in ${filePath}`);
15
+ }
16
+
17
+ return data;
18
+ }
19
+
20
+ /**
21
+ * Load all roles from a directory
22
+ */
23
+ export function loadRolesFromDir(dirPath: string): Map<string, RoleDefinition> {
24
+ const roles = new Map<string, RoleDefinition>();
25
+
26
+ try {
27
+ const files = readdirSync(dirPath);
28
+
29
+ for (const file of files) {
30
+ const filePath = join(dirPath, file);
31
+ const stat = statSync(filePath);
32
+
33
+ if (stat.isFile() && (extname(file) === '.yaml' || extname(file) === '.yml')) {
34
+ try {
35
+ const role = loadRole(filePath);
36
+ roles.set(role.id, role);
37
+ } catch (error) {
38
+ console.error(`Failed to load role from ${file}:`, error);
39
+ // Continue loading other roles
40
+ }
41
+ }
42
+ }
43
+ } catch (error) {
44
+ console.error(`Failed to read roles directory ${dirPath}:`, error);
45
+ }
46
+
47
+ return roles;
48
+ }
49
+
50
+ /**
51
+ * Validate a role definition (check required fields)
52
+ */
53
+ export function validateRole(role: unknown): role is RoleDefinition {
54
+ if (!role || typeof role !== 'object') {
55
+ return false;
56
+ }
57
+
58
+ const r = role as Record<string, unknown>;
59
+
60
+ // Check required string fields
61
+ if (typeof r.id !== 'string' || !r.id) return false;
62
+ if (typeof r.name !== 'string' || !r.name) return false;
63
+ if (typeof r.description !== 'string' || !r.description) return false;
64
+ if (typeof r.heartbeat_instructions !== 'string' || !r.heartbeat_instructions) return false;
65
+
66
+ // Check required arrays
67
+ if (!Array.isArray(r.responsibilities)) return false;
68
+ if (!Array.isArray(r.autonomous_actions)) return false;
69
+ if (!Array.isArray(r.approval_required)) return false;
70
+ if (!Array.isArray(r.kpis)) return false;
71
+ if (!Array.isArray(r.sub_roles)) return false;
72
+ if (!Array.isArray(r.tools)) return false;
73
+
74
+ // Validate authority_level
75
+ if (typeof r.authority_level !== 'number') return false;
76
+ if (r.authority_level < 1 || r.authority_level > 10) return false;
77
+
78
+ // Validate string arrays
79
+ if (!r.responsibilities.every((item) => typeof item === 'string')) return false;
80
+ if (!r.autonomous_actions.every((item) => typeof item === 'string')) return false;
81
+ if (!r.approval_required.every((item) => typeof item === 'string')) return false;
82
+ if (!r.tools.every((item) => typeof item === 'string')) return false;
83
+
84
+ // Validate KPIs
85
+ if (!r.kpis.every(validateKPI)) return false;
86
+
87
+ // Validate communication_style
88
+ if (!validateCommunicationStyle(r.communication_style)) return false;
89
+
90
+ // Validate sub_roles
91
+ if (!r.sub_roles.every(validateSubRoleTemplate)) return false;
92
+
93
+ return true;
94
+ }
95
+
96
+ /**
97
+ * Validate a KPI object
98
+ */
99
+ function validateKPI(kpi: unknown): kpi is KPI {
100
+ if (!kpi || typeof kpi !== 'object') return false;
101
+
102
+ const k = kpi as Record<string, unknown>;
103
+
104
+ return (
105
+ typeof k.name === 'string' &&
106
+ typeof k.metric === 'string' &&
107
+ typeof k.target === 'string' &&
108
+ typeof k.check_interval === 'string'
109
+ );
110
+ }
111
+
112
+ /**
113
+ * Validate a CommunicationStyle object
114
+ */
115
+ function validateCommunicationStyle(style: unknown): style is CommunicationStyle {
116
+ if (!style || typeof style !== 'object') return false;
117
+
118
+ const s = style as Record<string, unknown>;
119
+
120
+ return (
121
+ typeof s.tone === 'string' &&
122
+ (s.verbosity === 'concise' || s.verbosity === 'detailed' || s.verbosity === 'adaptive') &&
123
+ (s.formality === 'formal' || s.formality === 'casual' || s.formality === 'adaptive')
124
+ );
125
+ }
126
+
127
+ /**
128
+ * Validate a SubRoleTemplate object
129
+ */
130
+ function validateSubRoleTemplate(template: unknown): template is SubRoleTemplate {
131
+ if (!template || typeof template !== 'object') return false;
132
+
133
+ const t = template as Record<string, unknown>;
134
+
135
+ return (
136
+ typeof t.role_id === 'string' &&
137
+ typeof t.name === 'string' &&
138
+ typeof t.description === 'string' &&
139
+ typeof t.spawned_by === 'string' &&
140
+ typeof t.reports_to === 'string' &&
141
+ typeof t.max_budget_per_task === 'number'
142
+ );
143
+ }