zora-agent 0.9.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 (303) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/LICENSE +21 -0
  3. package/README.md +159 -0
  4. package/dist/cli/audit-commands.d.ts +8 -0
  5. package/dist/cli/audit-commands.d.ts.map +1 -0
  6. package/dist/cli/audit-commands.js +67 -0
  7. package/dist/cli/audit-commands.js.map +1 -0
  8. package/dist/cli/daemon.d.ts +9 -0
  9. package/dist/cli/daemon.d.ts.map +1 -0
  10. package/dist/cli/daemon.js +107 -0
  11. package/dist/cli/daemon.js.map +1 -0
  12. package/dist/cli/doctor.d.ts +21 -0
  13. package/dist/cli/doctor.d.ts.map +1 -0
  14. package/dist/cli/doctor.js +31 -0
  15. package/dist/cli/doctor.js.map +1 -0
  16. package/dist/cli/edit-commands.d.ts +8 -0
  17. package/dist/cli/edit-commands.d.ts.map +1 -0
  18. package/dist/cli/edit-commands.js +46 -0
  19. package/dist/cli/edit-commands.js.map +1 -0
  20. package/dist/cli/index.d.ts +11 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +319 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/init-command.d.ts +30 -0
  25. package/dist/cli/init-command.d.ts.map +1 -0
  26. package/dist/cli/init-command.js +425 -0
  27. package/dist/cli/init-command.js.map +1 -0
  28. package/dist/cli/memory-commands.d.ts +11 -0
  29. package/dist/cli/memory-commands.d.ts.map +1 -0
  30. package/dist/cli/memory-commands.js +57 -0
  31. package/dist/cli/memory-commands.js.map +1 -0
  32. package/dist/cli/presets.d.ts +12 -0
  33. package/dist/cli/presets.d.ts.map +1 -0
  34. package/dist/cli/presets.js +169 -0
  35. package/dist/cli/presets.js.map +1 -0
  36. package/dist/cli/skill-commands.d.ts +10 -0
  37. package/dist/cli/skill-commands.d.ts.map +1 -0
  38. package/dist/cli/skill-commands.js +73 -0
  39. package/dist/cli/skill-commands.js.map +1 -0
  40. package/dist/cli/steer-commands.d.ts +10 -0
  41. package/dist/cli/steer-commands.d.ts.map +1 -0
  42. package/dist/cli/steer-commands.js +92 -0
  43. package/dist/cli/steer-commands.js.map +1 -0
  44. package/dist/cli/team-commands.d.ts +8 -0
  45. package/dist/cli/team-commands.d.ts.map +1 -0
  46. package/dist/cli/team-commands.js +93 -0
  47. package/dist/cli/team-commands.js.map +1 -0
  48. package/dist/config/defaults.d.ts +26 -0
  49. package/dist/config/defaults.d.ts.map +1 -0
  50. package/dist/config/defaults.js +173 -0
  51. package/dist/config/defaults.js.map +1 -0
  52. package/dist/config/index.d.ts +3 -0
  53. package/dist/config/index.d.ts.map +1 -0
  54. package/dist/config/index.js +3 -0
  55. package/dist/config/index.js.map +1 -0
  56. package/dist/config/loader.d.ts +30 -0
  57. package/dist/config/loader.d.ts.map +1 -0
  58. package/dist/config/loader.js +130 -0
  59. package/dist/config/loader.js.map +1 -0
  60. package/dist/config/policy-loader.d.ts +18 -0
  61. package/dist/config/policy-loader.d.ts.map +1 -0
  62. package/dist/config/policy-loader.js +72 -0
  63. package/dist/config/policy-loader.js.map +1 -0
  64. package/dist/dashboard/auth-middleware.d.ts +15 -0
  65. package/dist/dashboard/auth-middleware.d.ts.map +1 -0
  66. package/dist/dashboard/auth-middleware.js +44 -0
  67. package/dist/dashboard/auth-middleware.js.map +1 -0
  68. package/dist/dashboard/frontend/vite.config.d.ts +3 -0
  69. package/dist/dashboard/frontend/vite.config.d.ts.map +1 -0
  70. package/dist/dashboard/frontend/vite.config.js +11 -0
  71. package/dist/dashboard/frontend/vite.config.js.map +1 -0
  72. package/dist/dashboard/server.d.ts +55 -0
  73. package/dist/dashboard/server.d.ts.map +1 -0
  74. package/dist/dashboard/server.js +254 -0
  75. package/dist/dashboard/server.js.map +1 -0
  76. package/dist/index.d.ts +20 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +19 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/memory/category-organizer.d.ts +33 -0
  81. package/dist/memory/category-organizer.d.ts.map +1 -0
  82. package/dist/memory/category-organizer.js +137 -0
  83. package/dist/memory/category-organizer.js.map +1 -0
  84. package/dist/memory/extraction-pipeline.d.ts +22 -0
  85. package/dist/memory/extraction-pipeline.d.ts.map +1 -0
  86. package/dist/memory/extraction-pipeline.js +156 -0
  87. package/dist/memory/extraction-pipeline.js.map +1 -0
  88. package/dist/memory/index.d.ts +7 -0
  89. package/dist/memory/index.d.ts.map +1 -0
  90. package/dist/memory/index.js +7 -0
  91. package/dist/memory/index.js.map +1 -0
  92. package/dist/memory/memory-manager.d.ts +56 -0
  93. package/dist/memory/memory-manager.d.ts.map +1 -0
  94. package/dist/memory/memory-manager.js +198 -0
  95. package/dist/memory/memory-manager.js.map +1 -0
  96. package/dist/memory/memory-types.d.ts +44 -0
  97. package/dist/memory/memory-types.d.ts.map +1 -0
  98. package/dist/memory/memory-types.js +8 -0
  99. package/dist/memory/memory-types.js.map +1 -0
  100. package/dist/memory/salience-scorer.d.ts +19 -0
  101. package/dist/memory/salience-scorer.d.ts.map +1 -0
  102. package/dist/memory/salience-scorer.js +72 -0
  103. package/dist/memory/salience-scorer.js.map +1 -0
  104. package/dist/memory/structured-memory.d.ts +28 -0
  105. package/dist/memory/structured-memory.d.ts.map +1 -0
  106. package/dist/memory/structured-memory.js +140 -0
  107. package/dist/memory/structured-memory.js.map +1 -0
  108. package/dist/orchestrator/auth-monitor.d.ts +28 -0
  109. package/dist/orchestrator/auth-monitor.d.ts.map +1 -0
  110. package/dist/orchestrator/auth-monitor.js +49 -0
  111. package/dist/orchestrator/auth-monitor.js.map +1 -0
  112. package/dist/orchestrator/execution-loop.d.ts +59 -0
  113. package/dist/orchestrator/execution-loop.d.ts.map +1 -0
  114. package/dist/orchestrator/execution-loop.js +94 -0
  115. package/dist/orchestrator/execution-loop.js.map +1 -0
  116. package/dist/orchestrator/failover-controller.d.ts +32 -0
  117. package/dist/orchestrator/failover-controller.d.ts.map +1 -0
  118. package/dist/orchestrator/failover-controller.js +111 -0
  119. package/dist/orchestrator/failover-controller.js.map +1 -0
  120. package/dist/orchestrator/index.d.ts +11 -0
  121. package/dist/orchestrator/index.d.ts.map +1 -0
  122. package/dist/orchestrator/index.js +11 -0
  123. package/dist/orchestrator/index.js.map +1 -0
  124. package/dist/orchestrator/orchestrator.d.ts +99 -0
  125. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  126. package/dist/orchestrator/orchestrator.js +456 -0
  127. package/dist/orchestrator/orchestrator.js.map +1 -0
  128. package/dist/orchestrator/retry-queue.d.ts +39 -0
  129. package/dist/orchestrator/retry-queue.d.ts.map +1 -0
  130. package/dist/orchestrator/retry-queue.js +99 -0
  131. package/dist/orchestrator/retry-queue.js.map +1 -0
  132. package/dist/orchestrator/router.d.ts +49 -0
  133. package/dist/orchestrator/router.d.ts.map +1 -0
  134. package/dist/orchestrator/router.js +167 -0
  135. package/dist/orchestrator/router.js.map +1 -0
  136. package/dist/orchestrator/session-manager.d.ts +39 -0
  137. package/dist/orchestrator/session-manager.d.ts.map +1 -0
  138. package/dist/orchestrator/session-manager.js +117 -0
  139. package/dist/orchestrator/session-manager.js.map +1 -0
  140. package/dist/providers/claude-provider.d.ts +182 -0
  141. package/dist/providers/claude-provider.d.ts.map +1 -0
  142. package/dist/providers/claude-provider.js +443 -0
  143. package/dist/providers/claude-provider.js.map +1 -0
  144. package/dist/providers/gemini-provider.d.ts +46 -0
  145. package/dist/providers/gemini-provider.d.ts.map +1 -0
  146. package/dist/providers/gemini-provider.js +336 -0
  147. package/dist/providers/gemini-provider.js.map +1 -0
  148. package/dist/providers/index.d.ts +10 -0
  149. package/dist/providers/index.d.ts.map +1 -0
  150. package/dist/providers/index.js +10 -0
  151. package/dist/providers/index.js.map +1 -0
  152. package/dist/providers/ollama-provider.d.ts +61 -0
  153. package/dist/providers/ollama-provider.d.ts.map +1 -0
  154. package/dist/providers/ollama-provider.js +319 -0
  155. package/dist/providers/ollama-provider.js.map +1 -0
  156. package/dist/routines/event-triggers.d.ts +34 -0
  157. package/dist/routines/event-triggers.d.ts.map +1 -0
  158. package/dist/routines/event-triggers.js +104 -0
  159. package/dist/routines/event-triggers.js.map +1 -0
  160. package/dist/routines/heartbeat.d.ts +35 -0
  161. package/dist/routines/heartbeat.d.ts.map +1 -0
  162. package/dist/routines/heartbeat.js +93 -0
  163. package/dist/routines/heartbeat.js.map +1 -0
  164. package/dist/routines/index.d.ts +7 -0
  165. package/dist/routines/index.d.ts.map +1 -0
  166. package/dist/routines/index.js +7 -0
  167. package/dist/routines/index.js.map +1 -0
  168. package/dist/routines/routine-manager.d.ts +62 -0
  169. package/dist/routines/routine-manager.d.ts.map +1 -0
  170. package/dist/routines/routine-manager.js +148 -0
  171. package/dist/routines/routine-manager.js.map +1 -0
  172. package/dist/security/audit-logger.d.ts +55 -0
  173. package/dist/security/audit-logger.d.ts.map +1 -0
  174. package/dist/security/audit-logger.js +252 -0
  175. package/dist/security/audit-logger.js.map +1 -0
  176. package/dist/security/capability-tokens.d.ts +30 -0
  177. package/dist/security/capability-tokens.d.ts.map +1 -0
  178. package/dist/security/capability-tokens.js +110 -0
  179. package/dist/security/capability-tokens.js.map +1 -0
  180. package/dist/security/index.d.ts +18 -0
  181. package/dist/security/index.d.ts.map +1 -0
  182. package/dist/security/index.js +12 -0
  183. package/dist/security/index.js.map +1 -0
  184. package/dist/security/integrity-guardian.d.ts +43 -0
  185. package/dist/security/integrity-guardian.d.ts.map +1 -0
  186. package/dist/security/integrity-guardian.js +103 -0
  187. package/dist/security/integrity-guardian.js.map +1 -0
  188. package/dist/security/intent-capsule.d.ts +52 -0
  189. package/dist/security/intent-capsule.d.ts.map +1 -0
  190. package/dist/security/intent-capsule.js +157 -0
  191. package/dist/security/intent-capsule.js.map +1 -0
  192. package/dist/security/leak-detector.d.ts +26 -0
  193. package/dist/security/leak-detector.d.ts.map +1 -0
  194. package/dist/security/leak-detector.js +75 -0
  195. package/dist/security/leak-detector.js.map +1 -0
  196. package/dist/security/policy-engine.d.ts +188 -0
  197. package/dist/security/policy-engine.d.ts.map +1 -0
  198. package/dist/security/policy-engine.js +799 -0
  199. package/dist/security/policy-engine.js.map +1 -0
  200. package/dist/security/prompt-defense.d.ts +30 -0
  201. package/dist/security/prompt-defense.d.ts.map +1 -0
  202. package/dist/security/prompt-defense.js +164 -0
  203. package/dist/security/prompt-defense.js.map +1 -0
  204. package/dist/security/secrets-manager.d.ts +47 -0
  205. package/dist/security/secrets-manager.d.ts.map +1 -0
  206. package/dist/security/secrets-manager.js +132 -0
  207. package/dist/security/secrets-manager.js.map +1 -0
  208. package/dist/security/security-types.d.ts +84 -0
  209. package/dist/security/security-types.d.ts.map +1 -0
  210. package/dist/security/security-types.js +8 -0
  211. package/dist/security/security-types.js.map +1 -0
  212. package/dist/skills/index.d.ts +5 -0
  213. package/dist/skills/index.d.ts.map +1 -0
  214. package/dist/skills/index.js +5 -0
  215. package/dist/skills/index.js.map +1 -0
  216. package/dist/skills/skill-loader.d.ts +25 -0
  217. package/dist/skills/skill-loader.d.ts.map +1 -0
  218. package/dist/skills/skill-loader.js +64 -0
  219. package/dist/skills/skill-loader.js.map +1 -0
  220. package/dist/steering/flag-manager.d.ts +52 -0
  221. package/dist/steering/flag-manager.d.ts.map +1 -0
  222. package/dist/steering/flag-manager.js +160 -0
  223. package/dist/steering/flag-manager.js.map +1 -0
  224. package/dist/steering/index.d.ts +8 -0
  225. package/dist/steering/index.d.ts.map +1 -0
  226. package/dist/steering/index.js +8 -0
  227. package/dist/steering/index.js.map +1 -0
  228. package/dist/steering/steer-injector.d.ts +15 -0
  229. package/dist/steering/steer-injector.d.ts.map +1 -0
  230. package/dist/steering/steer-injector.js +41 -0
  231. package/dist/steering/steer-injector.js.map +1 -0
  232. package/dist/steering/steering-manager.d.ts +33 -0
  233. package/dist/steering/steering-manager.d.ts.map +1 -0
  234. package/dist/steering/steering-manager.js +79 -0
  235. package/dist/steering/steering-manager.js.map +1 -0
  236. package/dist/steering/telegram-gateway.d.ts +27 -0
  237. package/dist/steering/telegram-gateway.d.ts.map +1 -0
  238. package/dist/steering/telegram-gateway.js +89 -0
  239. package/dist/steering/telegram-gateway.js.map +1 -0
  240. package/dist/steering/types.d.ts +54 -0
  241. package/dist/steering/types.d.ts.map +1 -0
  242. package/dist/steering/types.js +11 -0
  243. package/dist/steering/types.js.map +1 -0
  244. package/dist/teams/agent-loader.d.ts +38 -0
  245. package/dist/teams/agent-loader.d.ts.map +1 -0
  246. package/dist/teams/agent-loader.js +85 -0
  247. package/dist/teams/agent-loader.js.map +1 -0
  248. package/dist/teams/bridge-watchdog.d.ts +44 -0
  249. package/dist/teams/bridge-watchdog.d.ts.map +1 -0
  250. package/dist/teams/bridge-watchdog.js +118 -0
  251. package/dist/teams/bridge-watchdog.js.map +1 -0
  252. package/dist/teams/gemini-bridge.d.ts +43 -0
  253. package/dist/teams/gemini-bridge.d.ts.map +1 -0
  254. package/dist/teams/gemini-bridge.js +132 -0
  255. package/dist/teams/gemini-bridge.js.map +1 -0
  256. package/dist/teams/index.d.ts +11 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +11 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/mailbox.d.ts +33 -0
  261. package/dist/teams/mailbox.d.ts.map +1 -0
  262. package/dist/teams/mailbox.js +97 -0
  263. package/dist/teams/mailbox.js.map +1 -0
  264. package/dist/teams/pr-lifecycle.d.ts +47 -0
  265. package/dist/teams/pr-lifecycle.d.ts.map +1 -0
  266. package/dist/teams/pr-lifecycle.js +83 -0
  267. package/dist/teams/pr-lifecycle.js.map +1 -0
  268. package/dist/teams/team-manager.d.ts +57 -0
  269. package/dist/teams/team-manager.d.ts.map +1 -0
  270. package/dist/teams/team-manager.js +170 -0
  271. package/dist/teams/team-manager.js.map +1 -0
  272. package/dist/teams/team-types.d.ts +35 -0
  273. package/dist/teams/team-types.d.ts.map +1 -0
  274. package/dist/teams/team-types.js +9 -0
  275. package/dist/teams/team-types.js.map +1 -0
  276. package/dist/tools/index.d.ts +8 -0
  277. package/dist/tools/index.d.ts.map +1 -0
  278. package/dist/tools/index.js +8 -0
  279. package/dist/tools/index.js.map +1 -0
  280. package/dist/tools/notifications.d.ts +13 -0
  281. package/dist/tools/notifications.d.ts.map +1 -0
  282. package/dist/tools/notifications.js +30 -0
  283. package/dist/tools/notifications.js.map +1 -0
  284. package/dist/types.d.ts +311 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +8 -0
  287. package/dist/types.js.map +1 -0
  288. package/dist/utils/fs.d.ts +9 -0
  289. package/dist/utils/fs.d.ts.map +1 -0
  290. package/dist/utils/fs.js +31 -0
  291. package/dist/utils/fs.js.map +1 -0
  292. package/dist/utils/logger.d.ts +43 -0
  293. package/dist/utils/logger.d.ts.map +1 -0
  294. package/dist/utils/logger.js +139 -0
  295. package/dist/utils/logger.js.map +1 -0
  296. package/dist/wasm/wasmtime-spike.d.ts +19 -0
  297. package/dist/wasm/wasmtime-spike.d.ts.map +1 -0
  298. package/dist/wasm/wasmtime-spike.js +39 -0
  299. package/dist/wasm/wasmtime-spike.js.map +1 -0
  300. package/examples/routines/content-pipeline.toml +20 -0
  301. package/examples/routines/job-search.toml +19 -0
  302. package/examples/routines/repo-cleanup.toml +14 -0
  303. package/package.json +66 -0
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Default configuration values for Zora.
3
+ * These are applied when config.toml doesn't specify a value.
4
+ * Matches the spec §7 configuration reference and docs/CONFIGURATION.md.
5
+ */
6
+ export const DEFAULT_AGENT = {
7
+ name: 'zora-agent',
8
+ workspace: '~/.zora/workspace',
9
+ max_parallel_jobs: 3,
10
+ default_timeout: '2h',
11
+ heartbeat_interval: '30m',
12
+ log_level: 'info',
13
+ identity: {
14
+ soul_file: '~/.zora/workspace/SOUL.md',
15
+ },
16
+ resources: {
17
+ cpu_throttle_percent: 80,
18
+ memory_limit_mb: 4096,
19
+ throttle_check_interval: '10s',
20
+ },
21
+ };
22
+ export const DEFAULT_ROUTING = {
23
+ mode: 'respect_ranking',
24
+ };
25
+ export const DEFAULT_FAILOVER = {
26
+ enabled: true,
27
+ auto_handoff: true,
28
+ max_handoff_context_tokens: 50_000,
29
+ retry_after_cooldown: true,
30
+ max_retries: 3,
31
+ checkpoint_on_auth_failure: true,
32
+ notify_on_failover: true,
33
+ };
34
+ export const DEFAULT_MEMORY = {
35
+ long_term_file: '~/.zora/memory/MEMORY.md',
36
+ daily_notes_dir: '~/.zora/memory/daily',
37
+ items_dir: '~/.zora/memory/items',
38
+ categories_dir: '~/.zora/memory/categories',
39
+ context_days: 7,
40
+ max_context_items: 20,
41
+ max_category_summaries: 5,
42
+ auto_extract_interval: 10,
43
+ };
44
+ export const DEFAULT_SECURITY = {
45
+ policy_file: '~/.zora/policy.toml',
46
+ audit_log: '~/.zora/audit/audit.jsonl',
47
+ audit_hash_chain: true,
48
+ audit_single_writer: true,
49
+ integrity_check: true,
50
+ integrity_interval: '30m',
51
+ integrity_includes_tool_registry: true,
52
+ leak_detection: true,
53
+ sanitize_untrusted_content: true,
54
+ jit_secret_decryption: true,
55
+ };
56
+ export const DEFAULT_STEERING = {
57
+ enabled: true,
58
+ poll_interval: '5s',
59
+ dashboard_port: 7070,
60
+ notify_on_flag: true,
61
+ flag_timeout: '10m',
62
+ auto_approve_low_risk: true,
63
+ always_flag_irreversible: true,
64
+ telegram: {
65
+ enabled: false,
66
+ allowed_users: [],
67
+ rate_limit_per_min: 20
68
+ }
69
+ };
70
+ export const DEFAULT_NOTIFICATIONS = {
71
+ enabled: true,
72
+ on_task_complete: true,
73
+ on_error: true,
74
+ on_failover: true,
75
+ on_auth_expiry: true,
76
+ on_all_providers_down: true,
77
+ };
78
+ export const DEFAULT_MCP = {
79
+ servers: {},
80
+ };
81
+ export const DEFAULT_CONFIG = {
82
+ agent: DEFAULT_AGENT,
83
+ providers: [],
84
+ routing: DEFAULT_ROUTING,
85
+ failover: DEFAULT_FAILOVER,
86
+ memory: DEFAULT_MEMORY,
87
+ security: DEFAULT_SECURITY,
88
+ steering: DEFAULT_STEERING,
89
+ notifications: DEFAULT_NOTIFICATIONS,
90
+ mcp: DEFAULT_MCP,
91
+ };
92
+ /**
93
+ * Validates a provider config entry has all required fields and valid values.
94
+ * Returns an array of error messages (empty = valid).
95
+ */
96
+ export function validateProviderConfig(p, index) {
97
+ const errors = [];
98
+ const prefix = `providers[${index}]`;
99
+ if (!p.name || typeof p.name !== 'string') {
100
+ errors.push(`${prefix}.name is required and must be a string`);
101
+ }
102
+ if (!p.type || typeof p.type !== 'string') {
103
+ errors.push(`${prefix}.type is required and must be a string`);
104
+ }
105
+ if (p.rank == null || typeof p.rank !== 'number' || p.rank < 1) {
106
+ errors.push(`${prefix}.rank is required and must be a positive integer`);
107
+ }
108
+ if (!Array.isArray(p.capabilities) || p.capabilities.length === 0) {
109
+ errors.push(`${prefix}.capabilities must be a non-empty array of strings`);
110
+ }
111
+ const validCostTiers = ['free', 'included', 'metered', 'premium'];
112
+ if (!p.cost_tier || !validCostTiers.includes(p.cost_tier)) {
113
+ errors.push(`${prefix}.cost_tier must be one of: ${validCostTiers.join(', ')}`);
114
+ }
115
+ return errors;
116
+ }
117
+ /**
118
+ * Validates the full ZoraConfig.
119
+ * Returns an array of error messages (empty = valid).
120
+ */
121
+ export function validateConfig(config) {
122
+ const errors = [];
123
+ // Agent validation
124
+ if (!config.agent.name) {
125
+ errors.push('agent.name is required');
126
+ }
127
+ if (config.agent.max_parallel_jobs < 1) {
128
+ errors.push('agent.max_parallel_jobs must be >= 1');
129
+ }
130
+ if (config.agent.resources.cpu_throttle_percent < 1 || config.agent.resources.cpu_throttle_percent > 100) {
131
+ errors.push('agent.resources.cpu_throttle_percent must be 1-100');
132
+ }
133
+ if (config.agent.resources.memory_limit_mb < 256) {
134
+ errors.push('agent.resources.memory_limit_mb must be >= 256');
135
+ }
136
+ // Routing validation
137
+ const validModes = ['respect_ranking', 'optimize_cost', 'provider_only', 'round_robin'];
138
+ if (!validModes.includes(config.routing.mode)) {
139
+ errors.push(`routing.mode must be one of: ${validModes.join(', ')}`);
140
+ }
141
+ if (config.routing.mode === 'provider_only' && !config.routing.provider_only_name) {
142
+ errors.push('routing.provider_only_name is required when mode is provider_only');
143
+ }
144
+ // Provider validation
145
+ for (let i = 0; i < config.providers.length; i++) {
146
+ errors.push(...validateProviderConfig(config.providers[i], i));
147
+ }
148
+ // Check for duplicate provider names
149
+ const names = config.providers.map((p) => p.name);
150
+ const dupes = names.filter((n, i) => names.indexOf(n) !== i);
151
+ if (dupes.length > 0) {
152
+ errors.push(`Duplicate provider names: ${[...new Set(dupes)].join(', ')}`);
153
+ }
154
+ // Check for duplicate ranks
155
+ const ranks = config.providers.filter((p) => p.enabled).map((p) => p.rank);
156
+ const dupeRanks = ranks.filter((r, i) => ranks.indexOf(r) !== i);
157
+ if (dupeRanks.length > 0) {
158
+ errors.push(`Duplicate provider ranks among enabled providers: ${[...new Set(dupeRanks)].join(', ')}`);
159
+ }
160
+ // Failover validation
161
+ if (config.failover.max_retries < 0) {
162
+ errors.push('failover.max_retries must be >= 0');
163
+ }
164
+ if (config.failover.max_handoff_context_tokens < 1000) {
165
+ errors.push('failover.max_handoff_context_tokens must be >= 1000');
166
+ }
167
+ // Steering validation
168
+ if (config.steering.dashboard_port < 1 || config.steering.dashboard_port > 65535) {
169
+ errors.push('steering.dashboard_port must be 1-65535');
170
+ }
171
+ return errors;
172
+ }
173
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_CONFIG, validateConfig, validateProviderConfig } from './defaults.js';
2
+ export { loadConfig, loadConfigFromString, parseConfig, ConfigError } from './loader.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_CONFIG, validateConfig, validateProviderConfig } from './defaults.js';
2
+ export { loadConfig, loadConfigFromString, parseConfig, ConfigError } from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Config Loader — reads config.toml, merges with defaults, validates.
3
+ *
4
+ * Spec §4.2: Config system — TOML parser, defaults, validation.
5
+ * Uses smol-toml for zero-dependency TOML parsing.
6
+ */
7
+ import type { ZoraConfig, McpServerEntry } from '../types.js';
8
+ export declare class ConfigError extends Error {
9
+ readonly errors: string[];
10
+ constructor(message: string, errors: string[]);
11
+ }
12
+ /**
13
+ * Parse raw TOML data into a ZoraConfig, applying defaults for missing fields.
14
+ */
15
+ export declare function parseConfig(raw: Record<string, unknown>): ZoraConfig;
16
+ /**
17
+ * Load config from a TOML file path. Merges with defaults and validates.
18
+ * Throws ConfigError if validation fails.
19
+ */
20
+ export declare function loadConfig(configPath: string): Promise<ZoraConfig>;
21
+ /**
22
+ * Load config from a TOML string. Useful for testing.
23
+ */
24
+ export declare function loadConfigFromString(toml: string): ZoraConfig;
25
+ /**
26
+ * Converts Zora MCP server config to the SDK's McpServerConfig format.
27
+ * SDK types: McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig
28
+ */
29
+ export declare function toSdkMcpServers(servers: Record<string, McpServerEntry>): Record<string, Record<string, unknown>>;
30
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAC;AAG9E,qBAAa,WAAY,SAAQ,KAAK;aAGlB,MAAM,EAAE,MAAM,EAAE;gBADhC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EAAE;CAKnC;AAoCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAiCpE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcxE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAa7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8BzC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Config Loader — reads config.toml, merges with defaults, validates.
3
+ *
4
+ * Spec §4.2: Config system — TOML parser, defaults, validation.
5
+ * Uses smol-toml for zero-dependency TOML parsing.
6
+ */
7
+ import { readFile } from 'node:fs/promises';
8
+ import { parse as parseTOML } from 'smol-toml';
9
+ import { DEFAULT_CONFIG, validateConfig } from './defaults.js';
10
+ export class ConfigError extends Error {
11
+ errors;
12
+ constructor(message, errors) {
13
+ super(message);
14
+ this.errors = errors;
15
+ this.name = 'ConfigError';
16
+ }
17
+ }
18
+ /**
19
+ * Deep merge two objects. Arrays are replaced, not merged.
20
+ * Source values override target values.
21
+ */
22
+ function deepMerge(target, source) {
23
+ const result = { ...target };
24
+ for (const key of Object.keys(source)) {
25
+ const sourceVal = source[key];
26
+ const targetVal = result[key];
27
+ if (sourceVal !== null &&
28
+ typeof sourceVal === 'object' &&
29
+ !Array.isArray(sourceVal) &&
30
+ targetVal !== null &&
31
+ typeof targetVal === 'object' &&
32
+ !Array.isArray(targetVal)) {
33
+ result[key] = deepMerge(targetVal, sourceVal);
34
+ }
35
+ else {
36
+ result[key] = sourceVal;
37
+ }
38
+ }
39
+ return result;
40
+ }
41
+ /**
42
+ * Parse raw TOML data into a ZoraConfig, applying defaults for missing fields.
43
+ */
44
+ export function parseConfig(raw) {
45
+ // Start with defaults
46
+ const config = deepMerge(DEFAULT_CONFIG, raw);
47
+ // Providers are an array in TOML ([[providers]]), need special handling
48
+ if (Array.isArray(raw['providers'])) {
49
+ config.providers = raw['providers'].map((p) => ({
50
+ name: '',
51
+ type: '',
52
+ rank: 0,
53
+ capabilities: [],
54
+ cost_tier: 'metered',
55
+ enabled: true,
56
+ ...p,
57
+ }));
58
+ }
59
+ // Handle MCP config
60
+ if (raw['mcp'] && typeof raw['mcp'] === 'object') {
61
+ const mcpRaw = raw['mcp'];
62
+ if (mcpRaw['servers'] && typeof mcpRaw['servers'] === 'object') {
63
+ config.mcp = {
64
+ servers: mcpRaw['servers'],
65
+ };
66
+ }
67
+ }
68
+ return config;
69
+ }
70
+ /**
71
+ * Load config from a TOML file path. Merges with defaults and validates.
72
+ * Throws ConfigError if validation fails.
73
+ */
74
+ export async function loadConfig(configPath) {
75
+ const content = await readFile(configPath, 'utf-8');
76
+ const raw = parseTOML(content);
77
+ const config = parseConfig(raw);
78
+ const errors = validateConfig(config);
79
+ if (errors.length > 0) {
80
+ throw new ConfigError(`Invalid configuration (${errors.length} error${errors.length > 1 ? 's' : ''})`, errors);
81
+ }
82
+ return config;
83
+ }
84
+ /**
85
+ * Load config from a TOML string. Useful for testing.
86
+ */
87
+ export function loadConfigFromString(toml) {
88
+ const raw = parseTOML(toml);
89
+ const config = parseConfig(raw);
90
+ const errors = validateConfig(config);
91
+ if (errors.length > 0) {
92
+ throw new ConfigError(`Invalid configuration (${errors.length} error${errors.length > 1 ? 's' : ''})`, errors);
93
+ }
94
+ return config;
95
+ }
96
+ /**
97
+ * Converts Zora MCP server config to the SDK's McpServerConfig format.
98
+ * SDK types: McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig
99
+ */
100
+ export function toSdkMcpServers(servers) {
101
+ const result = {};
102
+ for (const [name, server] of Object.entries(servers)) {
103
+ if (server.type === 'stdio' || (!server.type && server.command)) {
104
+ // stdio transport
105
+ if (!server.command) {
106
+ console.warn(`Skipping MCP server "${name}": stdio transport requires a command`);
107
+ continue;
108
+ }
109
+ result[name] = {
110
+ command: server.command,
111
+ ...(server.args && { args: server.args }),
112
+ ...(server.env && { env: server.env }),
113
+ };
114
+ }
115
+ else {
116
+ // HTTP or SSE transport
117
+ if (!server.url) {
118
+ console.warn(`Skipping MCP server "${name}": http/sse transport requires a url`);
119
+ continue;
120
+ }
121
+ result[name] = {
122
+ type: server.type ?? 'http',
123
+ url: server.url,
124
+ ...(server.headers && { headers: server.headers }),
125
+ };
126
+ }
127
+ }
128
+ return result;
129
+ }
130
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Policy Loader — centralized TOML → ZoraPolicy parsing.
3
+ *
4
+ * Replaces duplicated policy parsing in cli/index.ts and cli/daemon.ts.
5
+ * Handles backward compatibility: missing sections use safe defaults.
6
+ */
7
+ import type { ZoraPolicy } from '../types.js';
8
+ /**
9
+ * Load and parse a ZoraPolicy from a TOML file.
10
+ * Throws if the file does not exist.
11
+ */
12
+ export declare function loadPolicy(policyPath: string): Promise<ZoraPolicy>;
13
+ /**
14
+ * Parse a ZoraPolicy from raw TOML data.
15
+ * Applies safe defaults for any missing sections or fields.
16
+ */
17
+ export declare function parsePolicy(raw: Record<string, unknown>): ZoraPolicy;
18
+ //# sourceMappingURL=policy-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-loader.d.ts","sourceRoot":"","sources":["../../src/config/policy-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQxE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAgDpE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Policy Loader — centralized TOML → ZoraPolicy parsing.
3
+ *
4
+ * Replaces duplicated policy parsing in cli/index.ts and cli/daemon.ts.
5
+ * Handles backward compatibility: missing sections use safe defaults.
6
+ */
7
+ import fs from 'node:fs';
8
+ /**
9
+ * Load and parse a ZoraPolicy from a TOML file.
10
+ * Throws if the file does not exist.
11
+ */
12
+ export async function loadPolicy(policyPath) {
13
+ if (!fs.existsSync(policyPath)) {
14
+ throw new Error(`Policy file not found at ${policyPath}. Run \`zora init\` first.`);
15
+ }
16
+ const { parse: parseTOML } = await import('smol-toml');
17
+ const raw = parseTOML(fs.readFileSync(policyPath, 'utf-8'));
18
+ return parsePolicy(raw);
19
+ }
20
+ /**
21
+ * Parse a ZoraPolicy from raw TOML data.
22
+ * Applies safe defaults for any missing sections or fields.
23
+ */
24
+ export function parsePolicy(raw) {
25
+ const fsPol = raw['filesystem'];
26
+ const shPol = raw['shell'];
27
+ const actPol = raw['actions'];
28
+ const netPol = raw['network'];
29
+ const budPol = raw['budget'];
30
+ const dryPol = raw['dry_run'];
31
+ return {
32
+ filesystem: {
33
+ allowed_paths: fsPol?.['allowed_paths'] ?? [],
34
+ denied_paths: fsPol?.['denied_paths'] ?? [],
35
+ resolve_symlinks: fsPol?.['resolve_symlinks'] ?? true,
36
+ follow_symlinks: fsPol?.['follow_symlinks'] ?? false,
37
+ },
38
+ shell: {
39
+ mode: shPol?.['mode'] ?? 'allowlist',
40
+ allowed_commands: shPol?.['allowed_commands'] ?? ['ls', 'npm', 'git'],
41
+ denied_commands: shPol?.['denied_commands'] ?? [],
42
+ split_chained_commands: shPol?.['split_chained_commands'] ?? true,
43
+ max_execution_time: shPol?.['max_execution_time'] ?? '1m',
44
+ },
45
+ actions: {
46
+ reversible: actPol?.['reversible'] ?? [],
47
+ irreversible: actPol?.['irreversible'] ?? [],
48
+ always_flag: actPol?.['always_flag'] ?? [],
49
+ },
50
+ network: {
51
+ allowed_domains: netPol?.['allowed_domains'] ?? [],
52
+ denied_domains: netPol?.['denied_domains'] ?? [],
53
+ max_request_size: netPol?.['max_request_size'] ?? '10mb',
54
+ },
55
+ ...(budPol ? {
56
+ budget: {
57
+ max_actions_per_session: budPol['max_actions_per_session'] ?? 0,
58
+ max_actions_per_type: budPol['max_actions_per_type'] ?? {},
59
+ token_budget: budPol['token_budget'] ?? 0,
60
+ on_exceed: budPol['on_exceed'] ?? 'block',
61
+ },
62
+ } : {}),
63
+ ...(dryPol ? {
64
+ dry_run: {
65
+ enabled: dryPol['enabled'] ?? false,
66
+ tools: dryPol['tools'] ?? [],
67
+ audit_dry_runs: dryPol['audit_dry_runs'] ?? true,
68
+ },
69
+ } : {}),
70
+ };
71
+ }
72
+ //# sourceMappingURL=policy-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-loader.js","sourceRoot":"","sources":["../../src/config/policy-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Auth Middleware — Bearer token authentication for the dashboard API.
3
+ *
4
+ * Spec v0.6 §5.8 "Dashboard Authentication":
5
+ * - Validates Authorization: Bearer <token> header.
6
+ * - Skips auth for the /health endpoint.
7
+ * - Token sourced from environment variable or static config.
8
+ */
9
+ import type { RequestHandler } from 'express';
10
+ export interface AuthMiddlewareOptions {
11
+ tokenEnvVar?: string;
12
+ staticToken?: string;
13
+ }
14
+ export declare function createAuthMiddleware(options: AuthMiddlewareOptions): RequestHandler;
15
+ //# sourceMappingURL=auth-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAE/E,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAwCnF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Auth Middleware — Bearer token authentication for the dashboard API.
3
+ *
4
+ * Spec v0.6 §5.8 "Dashboard Authentication":
5
+ * - Validates Authorization: Bearer <token> header.
6
+ * - Skips auth for the /health endpoint.
7
+ * - Token sourced from environment variable or static config.
8
+ */
9
+ import crypto from 'node:crypto';
10
+ export function createAuthMiddleware(options) {
11
+ return (req, res, next) => {
12
+ // Skip auth for health checks
13
+ if (req.path === '/health' || req.path === '/api/health') {
14
+ next();
15
+ return;
16
+ }
17
+ const expectedToken = options.staticToken
18
+ ?? (options.tokenEnvVar ? process.env[options.tokenEnvVar] : undefined);
19
+ if (!expectedToken) {
20
+ res.status(500).json({ error: 'Server misconfiguration: no auth token defined' });
21
+ return;
22
+ }
23
+ const authHeader = req.headers.authorization;
24
+ if (!authHeader) {
25
+ res.status(401).json({ error: 'Missing Authorization header' });
26
+ return;
27
+ }
28
+ // HTTP auth schemes are case-insensitive (RFC 7235)
29
+ if (!authHeader.toLowerCase().startsWith('bearer ')) {
30
+ res.status(401).json({ error: 'Invalid Authorization header format. Expected: Bearer <token>' });
31
+ return;
32
+ }
33
+ const token = authHeader.slice('bearer '.length);
34
+ // Use timing-safe comparison to prevent timing attacks
35
+ const tokenBuf = Buffer.from(token);
36
+ const expectedBuf = Buffer.from(expectedToken);
37
+ if (tokenBuf.length !== expectedBuf.length || !crypto.timingSafeEqual(tokenBuf, expectedBuf)) {
38
+ res.status(401).json({ error: 'Invalid token' });
39
+ return;
40
+ }
41
+ next();
42
+ };
43
+ }
44
+ //# sourceMappingURL=auth-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../src/dashboard/auth-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,8BAA8B;QAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACzD,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW;eACpC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE1E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+DAA+D,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjD,uDAAuD;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7F,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vite.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["../../../src/dashboard/frontend/vite.config.ts"],"names":[],"mappings":";AAIA,wBAMG"}
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ // https://vitejs.dev/config/
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ build: {
7
+ outDir: 'dist',
8
+ emptyOutDir: true,
9
+ },
10
+ });
11
+ //# sourceMappingURL=vite.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../../../src/dashboard/frontend/vite.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,6BAA6B;AAC7B,eAAe,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,IAAI;KAClB;CACF,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DashboardServer — Local API and static file server for the Zora UI.
3
+ *
4
+ * Spec §6.0 "Web Dashboard Spec":
5
+ * - Binds to localhost:7070 by default.
6
+ * - Serves as the primary ingress for async steering.
7
+ */
8
+ import type { ExecutionLoop } from '../orchestrator/execution-loop.js';
9
+ import type { SessionManager } from '../orchestrator/session-manager.js';
10
+ import type { SteeringManager } from '../steering/steering-manager.js';
11
+ import type { AuthMonitor } from '../orchestrator/auth-monitor.js';
12
+ import type { LLMProvider } from '../types.js';
13
+ export interface SubmitTaskFn {
14
+ (prompt: string): Promise<string>;
15
+ }
16
+ export interface DashboardOptions {
17
+ loop?: ExecutionLoop;
18
+ providers?: LLMProvider[];
19
+ sessionManager: SessionManager;
20
+ steeringManager: SteeringManager;
21
+ authMonitor: AuthMonitor;
22
+ submitTask?: SubmitTaskFn;
23
+ port?: number;
24
+ host?: string;
25
+ }
26
+ export declare class DashboardServer {
27
+ private readonly _app;
28
+ private readonly _options;
29
+ private _server;
30
+ private readonly _sseClients;
31
+ constructor(options: DashboardOptions);
32
+ /**
33
+ * Simple in-memory rate limiter (no external dependency).
34
+ * Limits to 100 requests per 15 minutes per IP.
35
+ * Prunes expired entries periodically to prevent unbounded memory growth.
36
+ */
37
+ private _createRateLimiter;
38
+ private _setupRoutes;
39
+ /**
40
+ * Broadcast an event to all connected SSE clients.
41
+ */
42
+ broadcastEvent(event: {
43
+ type: string;
44
+ data: unknown;
45
+ }): void;
46
+ /**
47
+ * Starts the dashboard server on localhost.
48
+ */
49
+ start(): Promise<void>;
50
+ /**
51
+ * Stops the dashboard server.
52
+ */
53
+ stop(): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AAItE,MAAM,WAAW,YAAY;IAC3B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;gBAEnD,OAAO,EAAE,gBAAgB;IAiBrC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,YAAY;IA2JpB;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAa5D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}