@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.
- package/LICENSE +153 -0
- package/README.md +428 -0
- package/bin/jarvis.ts +449 -0
- package/package.json +79 -0
- package/roles/activity-observer.yaml +60 -0
- package/roles/ceo-founder.yaml +144 -0
- package/roles/chief-of-staff.yaml +158 -0
- package/roles/dev-lead.yaml +182 -0
- package/roles/executive-assistant.yaml +77 -0
- package/roles/marketing-director.yaml +168 -0
- package/roles/personal-assistant.yaml +266 -0
- package/roles/research-specialist.yaml +60 -0
- package/roles/specialists/content-writer.yaml +53 -0
- package/roles/specialists/customer-support.yaml +57 -0
- package/roles/specialists/data-analyst.yaml +57 -0
- package/roles/specialists/financial-analyst.yaml +56 -0
- package/roles/specialists/hr-specialist.yaml +55 -0
- package/roles/specialists/legal-advisor.yaml +58 -0
- package/roles/specialists/marketing-strategist.yaml +56 -0
- package/roles/specialists/project-coordinator.yaml +55 -0
- package/roles/specialists/research-analyst.yaml +58 -0
- package/roles/specialists/software-engineer.yaml +57 -0
- package/roles/specialists/system-administrator.yaml +57 -0
- package/roles/system-admin.yaml +76 -0
- package/scripts/ensure-bun.cjs +16 -0
- package/src/actions/README.md +421 -0
- package/src/actions/app-control/desktop-controller.test.ts +26 -0
- package/src/actions/app-control/desktop-controller.ts +438 -0
- package/src/actions/app-control/interface.ts +64 -0
- package/src/actions/app-control/linux.ts +273 -0
- package/src/actions/app-control/macos.ts +54 -0
- package/src/actions/app-control/sidecar-launcher.test.ts +23 -0
- package/src/actions/app-control/sidecar-launcher.ts +286 -0
- package/src/actions/app-control/windows.ts +44 -0
- package/src/actions/browser/cdp.ts +138 -0
- package/src/actions/browser/chrome-launcher.ts +261 -0
- package/src/actions/browser/session.ts +506 -0
- package/src/actions/browser/stealth.ts +49 -0
- package/src/actions/index.ts +20 -0
- package/src/actions/terminal/executor.ts +157 -0
- package/src/actions/terminal/wsl-bridge.ts +126 -0
- package/src/actions/test.ts +93 -0
- package/src/actions/tools/agents.ts +363 -0
- package/src/actions/tools/builtin.ts +950 -0
- package/src/actions/tools/commitments.ts +192 -0
- package/src/actions/tools/content.ts +217 -0
- package/src/actions/tools/delegate.ts +147 -0
- package/src/actions/tools/desktop.test.ts +55 -0
- package/src/actions/tools/desktop.ts +305 -0
- package/src/actions/tools/documents.ts +169 -0
- package/src/actions/tools/goals.ts +376 -0
- package/src/actions/tools/local-tools-guard.ts +31 -0
- package/src/actions/tools/registry.ts +173 -0
- package/src/actions/tools/research.ts +111 -0
- package/src/actions/tools/sidecar-list.ts +57 -0
- package/src/actions/tools/sidecar-route.ts +105 -0
- package/src/actions/tools/workflows.ts +216 -0
- package/src/agents/agent.ts +132 -0
- package/src/agents/delegation.ts +107 -0
- package/src/agents/hierarchy.ts +113 -0
- package/src/agents/index.ts +19 -0
- package/src/agents/messaging.ts +125 -0
- package/src/agents/orchestrator.ts +592 -0
- package/src/agents/role-discovery.ts +61 -0
- package/src/agents/sub-agent-runner.ts +309 -0
- package/src/agents/task-manager.ts +151 -0
- package/src/authority/approval-delivery.ts +59 -0
- package/src/authority/approval.ts +196 -0
- package/src/authority/audit.ts +158 -0
- package/src/authority/authority.test.ts +519 -0
- package/src/authority/deferred-executor.ts +103 -0
- package/src/authority/emergency.ts +66 -0
- package/src/authority/engine.ts +301 -0
- package/src/authority/index.ts +12 -0
- package/src/authority/learning.ts +111 -0
- package/src/authority/tool-action-map.ts +74 -0
- package/src/awareness/analytics.ts +466 -0
- package/src/awareness/awareness.test.ts +332 -0
- package/src/awareness/capture-engine.ts +305 -0
- package/src/awareness/context-graph.ts +130 -0
- package/src/awareness/context-tracker.ts +349 -0
- package/src/awareness/index.ts +25 -0
- package/src/awareness/intelligence.ts +321 -0
- package/src/awareness/ocr-engine.ts +88 -0
- package/src/awareness/service.ts +528 -0
- package/src/awareness/struggle-detector.ts +342 -0
- package/src/awareness/suggestion-engine.ts +476 -0
- package/src/awareness/types.ts +201 -0
- package/src/cli/autostart.ts +417 -0
- package/src/cli/deps.ts +449 -0
- package/src/cli/doctor.ts +238 -0
- package/src/cli/helpers.ts +401 -0
- package/src/cli/onboard.ts +827 -0
- package/src/cli/uninstall.test.ts +37 -0
- package/src/cli/uninstall.ts +202 -0
- package/src/comms/README.md +329 -0
- package/src/comms/auth-error.html +48 -0
- package/src/comms/channels/discord.ts +228 -0
- package/src/comms/channels/signal.ts +56 -0
- package/src/comms/channels/telegram.ts +316 -0
- package/src/comms/channels/whatsapp.ts +60 -0
- package/src/comms/channels.test.ts +173 -0
- package/src/comms/dashboard-auth.ts +75 -0
- package/src/comms/desktop-notify.ts +114 -0
- package/src/comms/example.ts +129 -0
- package/src/comms/index.ts +129 -0
- package/src/comms/streaming.ts +149 -0
- package/src/comms/voice.test.ts +504 -0
- package/src/comms/voice.ts +341 -0
- package/src/comms/websocket.test.ts +409 -0
- package/src/comms/websocket.ts +669 -0
- package/src/config/README.md +389 -0
- package/src/config/index.ts +6 -0
- package/src/config/loader.test.ts +183 -0
- package/src/config/loader.ts +148 -0
- package/src/config/types.ts +293 -0
- package/src/daemon/README.md +232 -0
- package/src/daemon/agent-service-interface.ts +9 -0
- package/src/daemon/agent-service.ts +667 -0
- package/src/daemon/api-routes.ts +3067 -0
- package/src/daemon/background-agent-service.ts +396 -0
- package/src/daemon/background-agent.test.ts +78 -0
- package/src/daemon/channel-service.ts +201 -0
- package/src/daemon/commitment-executor.ts +297 -0
- package/src/daemon/dashboard-auth.test.ts +170 -0
- package/src/daemon/event-classifier.ts +239 -0
- package/src/daemon/event-coalescer.ts +123 -0
- package/src/daemon/event-reactor.ts +214 -0
- package/src/daemon/flock.c +7 -0
- package/src/daemon/health.ts +220 -0
- package/src/daemon/index.ts +1070 -0
- package/src/daemon/llm-settings.test.ts +78 -0
- package/src/daemon/llm-settings.ts +450 -0
- package/src/daemon/observer-service.ts +150 -0
- package/src/daemon/pid.test.ts +283 -0
- package/src/daemon/pid.ts +224 -0
- package/src/daemon/research-queue.ts +155 -0
- package/src/daemon/services.ts +175 -0
- package/src/daemon/ws-service.ts +926 -0
- package/src/global.d.ts +4 -0
- package/src/goals/accountability.ts +240 -0
- package/src/goals/awareness-bridge.ts +185 -0
- package/src/goals/estimator.ts +185 -0
- package/src/goals/events.ts +28 -0
- package/src/goals/goals.test.ts +400 -0
- package/src/goals/integration.test.ts +329 -0
- package/src/goals/nl-builder.test.ts +220 -0
- package/src/goals/nl-builder.ts +256 -0
- package/src/goals/rhythm.test.ts +177 -0
- package/src/goals/rhythm.ts +275 -0
- package/src/goals/service.test.ts +135 -0
- package/src/goals/service.ts +407 -0
- package/src/goals/types.ts +106 -0
- package/src/goals/workflow-bridge.ts +96 -0
- package/src/integrations/google-api.ts +134 -0
- package/src/integrations/google-auth.ts +175 -0
- package/src/llm/README.md +291 -0
- package/src/llm/anthropic.ts +400 -0
- package/src/llm/gemini.ts +380 -0
- package/src/llm/groq.ts +406 -0
- package/src/llm/history.ts +147 -0
- package/src/llm/index.ts +21 -0
- package/src/llm/manager.ts +226 -0
- package/src/llm/ollama.ts +316 -0
- package/src/llm/openai.ts +411 -0
- package/src/llm/openrouter.ts +390 -0
- package/src/llm/provider.test.ts +487 -0
- package/src/llm/provider.ts +61 -0
- package/src/llm/test.ts +88 -0
- package/src/observers/README.md +278 -0
- package/src/observers/calendar.ts +113 -0
- package/src/observers/clipboard.ts +136 -0
- package/src/observers/email.ts +109 -0
- package/src/observers/example.ts +58 -0
- package/src/observers/file-watcher.ts +124 -0
- package/src/observers/index.ts +159 -0
- package/src/observers/notifications.ts +197 -0
- package/src/observers/observers.test.ts +203 -0
- package/src/observers/processes.ts +225 -0
- package/src/personality/README.md +61 -0
- package/src/personality/adapter.ts +196 -0
- package/src/personality/index.ts +20 -0
- package/src/personality/learner.ts +209 -0
- package/src/personality/model.ts +132 -0
- package/src/personality/personality.test.ts +236 -0
- package/src/roles/README.md +252 -0
- package/src/roles/authority.ts +120 -0
- package/src/roles/example-usage.ts +198 -0
- package/src/roles/index.ts +42 -0
- package/src/roles/loader.ts +143 -0
- package/src/roles/prompt-builder.ts +218 -0
- package/src/roles/test-multi.ts +102 -0
- package/src/roles/test-role.yaml +77 -0
- package/src/roles/test-utils.ts +93 -0
- package/src/roles/test.ts +106 -0
- package/src/roles/tool-guide.ts +195 -0
- package/src/roles/types.ts +36 -0
- package/src/roles/utils.ts +200 -0
- package/src/scripts/google-setup.ts +168 -0
- package/src/sidecar/connection.ts +179 -0
- package/src/sidecar/index.ts +6 -0
- package/src/sidecar/manager.ts +542 -0
- package/src/sidecar/protocol.ts +85 -0
- package/src/sidecar/rpc.ts +161 -0
- package/src/sidecar/scheduler.ts +136 -0
- package/src/sidecar/types.ts +112 -0
- package/src/sidecar/validator.ts +144 -0
- package/src/sites/builder-tools.ts +215 -0
- package/src/sites/dev-server-manager.ts +286 -0
- package/src/sites/fixtures/security-test-site/.jarvis-project.json +6 -0
- package/src/sites/fixtures/security-test-site/Makefile +15 -0
- package/src/sites/fixtures/security-test-site/README.md +18 -0
- package/src/sites/fixtures/security-test-site/index.html +12 -0
- package/src/sites/fixtures/security-test-site/index.ts +16 -0
- package/src/sites/fixtures/security-test-site/package.json +13 -0
- package/src/sites/fixtures/security-test-site/src/app.tsx +780 -0
- package/src/sites/fixtures/security-test-site/tsconfig.json +10 -0
- package/src/sites/git-manager.ts +240 -0
- package/src/sites/github-manager.ts +355 -0
- package/src/sites/index.ts +25 -0
- package/src/sites/project-manager.ts +389 -0
- package/src/sites/proxy.ts +133 -0
- package/src/sites/service.ts +136 -0
- package/src/sites/templates.ts +169 -0
- package/src/sites/types.ts +89 -0
- package/src/user/profile-followup.test.ts +84 -0
- package/src/user/profile-followup.ts +185 -0
- package/src/user/profile.ts +224 -0
- package/src/vault/README.md +110 -0
- package/src/vault/awareness.ts +341 -0
- package/src/vault/commitments.ts +299 -0
- package/src/vault/content-pipeline.ts +270 -0
- package/src/vault/conversations.ts +173 -0
- package/src/vault/dashboard-sessions.ts +44 -0
- package/src/vault/documents.ts +130 -0
- package/src/vault/entities.ts +185 -0
- package/src/vault/extractor.test.ts +356 -0
- package/src/vault/extractor.ts +345 -0
- package/src/vault/facts.ts +190 -0
- package/src/vault/goals.ts +477 -0
- package/src/vault/index.ts +87 -0
- package/src/vault/keychain.ts +99 -0
- package/src/vault/observations.ts +115 -0
- package/src/vault/relationships.ts +178 -0
- package/src/vault/retrieval.test.ts +139 -0
- package/src/vault/retrieval.ts +258 -0
- package/src/vault/schema.ts +709 -0
- package/src/vault/settings.ts +38 -0
- package/src/vault/user-profile.test.ts +113 -0
- package/src/vault/user-profile.ts +176 -0
- package/src/vault/vectors.ts +92 -0
- package/src/vault/webapp-template-seeds.ts +116 -0
- package/src/vault/webapp-templates.ts +244 -0
- package/src/vault/workflows.ts +403 -0
- package/src/workflows/auto-suggest.ts +290 -0
- package/src/workflows/engine.ts +366 -0
- package/src/workflows/events.ts +24 -0
- package/src/workflows/executor.ts +207 -0
- package/src/workflows/nl-builder.ts +198 -0
- package/src/workflows/nodes/actions/agent-task.ts +73 -0
- package/src/workflows/nodes/actions/calendar-action.ts +85 -0
- package/src/workflows/nodes/actions/code-execution.ts +73 -0
- package/src/workflows/nodes/actions/discord.ts +77 -0
- package/src/workflows/nodes/actions/file-write.ts +73 -0
- package/src/workflows/nodes/actions/gmail.ts +69 -0
- package/src/workflows/nodes/actions/http-request.ts +117 -0
- package/src/workflows/nodes/actions/notification.ts +85 -0
- package/src/workflows/nodes/actions/run-tool.ts +55 -0
- package/src/workflows/nodes/actions/send-message.ts +82 -0
- package/src/workflows/nodes/actions/shell-command.ts +76 -0
- package/src/workflows/nodes/actions/telegram.ts +60 -0
- package/src/workflows/nodes/builtin.ts +119 -0
- package/src/workflows/nodes/error/error-handler.ts +37 -0
- package/src/workflows/nodes/error/fallback.ts +47 -0
- package/src/workflows/nodes/error/retry.ts +82 -0
- package/src/workflows/nodes/logic/delay.ts +42 -0
- package/src/workflows/nodes/logic/if-else.ts +41 -0
- package/src/workflows/nodes/logic/loop.ts +90 -0
- package/src/workflows/nodes/logic/merge.ts +38 -0
- package/src/workflows/nodes/logic/race.ts +40 -0
- package/src/workflows/nodes/logic/switch.ts +59 -0
- package/src/workflows/nodes/logic/template-render.ts +53 -0
- package/src/workflows/nodes/logic/variable-get.ts +37 -0
- package/src/workflows/nodes/logic/variable-set.ts +59 -0
- package/src/workflows/nodes/registry.ts +99 -0
- package/src/workflows/nodes/transform/aggregate.ts +99 -0
- package/src/workflows/nodes/transform/csv-parse.ts +70 -0
- package/src/workflows/nodes/transform/json-parse.ts +63 -0
- package/src/workflows/nodes/transform/map-filter.ts +84 -0
- package/src/workflows/nodes/transform/regex-match.ts +89 -0
- package/src/workflows/nodes/triggers/calendar.ts +33 -0
- package/src/workflows/nodes/triggers/clipboard.ts +32 -0
- package/src/workflows/nodes/triggers/cron.ts +40 -0
- package/src/workflows/nodes/triggers/email.ts +40 -0
- package/src/workflows/nodes/triggers/file-change.ts +45 -0
- package/src/workflows/nodes/triggers/git.ts +46 -0
- package/src/workflows/nodes/triggers/manual.ts +23 -0
- package/src/workflows/nodes/triggers/poll.ts +81 -0
- package/src/workflows/nodes/triggers/process.ts +44 -0
- package/src/workflows/nodes/triggers/screen-event.ts +37 -0
- package/src/workflows/nodes/triggers/webhook.ts +39 -0
- package/src/workflows/safe-eval.ts +139 -0
- package/src/workflows/template.ts +118 -0
- package/src/workflows/triggers/cron.ts +311 -0
- package/src/workflows/triggers/manager.ts +285 -0
- package/src/workflows/triggers/observer-bridge.ts +172 -0
- package/src/workflows/triggers/poller.ts +201 -0
- package/src/workflows/triggers/screen-condition.ts +218 -0
- package/src/workflows/triggers/triggers.test.ts +740 -0
- package/src/workflows/triggers/webhook.ts +191 -0
- package/src/workflows/types.ts +133 -0
- package/src/workflows/variables.ts +72 -0
- package/src/workflows/workflows.test.ts +383 -0
- package/src/workflows/yaml.ts +104 -0
- package/ui/dist/index-3gr23jt9.js +112614 -0
- package/ui/dist/index-9vmj8127.css +14239 -0
- package/ui/dist/index-hy9pc1gm.js +112873 -0
- package/ui/dist/index-j2ep5d1w.js +112374 -0
- package/ui/dist/index-jt00vjqs.js +112858 -0
- package/ui/dist/index-k9ymx5qb.js +112374 -0
- package/ui/dist/index.html +16 -0
- package/ui/public/audio/pcm-capture-processor.js +11 -0
- package/ui/public/openwakeword/models/embedding_model.onnx +0 -0
- package/ui/public/openwakeword/models/hey_jarvis_v0.1.onnx +0 -0
- package/ui/public/openwakeword/models/melspectrogram.onnx +0 -0
- package/ui/public/openwakeword/models/silero_vad.onnx +0 -0
- package/ui/public/ort/ort-wasm-simd-threaded.jsep.mjs +106 -0
- package/ui/public/ort/ort-wasm-simd-threaded.jsep.wasm +0 -0
- package/ui/public/ort/ort-wasm-simd-threaded.mjs +59 -0
- 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
|
+
}
|