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,425 @@
1
+ /**
2
+ * `zora-agent init` — Interactive setup wizard.
3
+ *
4
+ * Generates ~/.zora/config.toml, policy.toml, SOUL.md,
5
+ * and scaffolds the directory structure.
6
+ */
7
+ import path from 'node:path';
8
+ import os from 'node:os';
9
+ import fs from 'node:fs';
10
+ import * as clack from '@clack/prompts';
11
+ import { stringify as stringifyTOML } from 'smol-toml';
12
+ import { parse as parseTOML } from 'smol-toml';
13
+ import { PRESETS, TOOL_STACKS } from './presets.js';
14
+ import { runDoctorChecks } from './doctor.js';
15
+ const ZORA_DIR = path.join(os.homedir(), '.zora');
16
+ /**
17
+ * Directories to scaffold under ~/.zora/
18
+ */
19
+ const SCAFFOLD_DIRS = [
20
+ '', // ~/.zora/ itself
21
+ 'workspace',
22
+ 'memory',
23
+ 'memory/daily',
24
+ 'memory/items',
25
+ 'memory/categories',
26
+ 'audit',
27
+ ];
28
+ const SOUL_TEMPLATE = `# Zora — Soul File
29
+
30
+ You are Zora, a long-running autonomous personal AI agent.
31
+
32
+ ## Core Principles
33
+ - Be helpful, honest, and careful.
34
+ - Always respect the policy file boundaries.
35
+ - Ask for clarification when uncertain.
36
+ - Keep audit logs for all actions.
37
+
38
+ ## Owner Preferences
39
+ - (Add your preferences here)
40
+ `;
41
+ /**
42
+ * Generate policy.toml content from a preset, dev path, denied paths, and tool stacks.
43
+ */
44
+ export function generatePolicyToml(preset, devPath, deniedPaths, toolStacks) {
45
+ const base = structuredClone(PRESETS[preset]);
46
+ // Replace ~/Projects with user's dev path
47
+ base.filesystem.allowed_paths = base.filesystem.allowed_paths.map((p) => (p === '~/Projects' ? devPath : p));
48
+ // Merge additional denied paths (deduplicate)
49
+ const allDenied = new Set([...base.filesystem.denied_paths, ...deniedPaths]);
50
+ base.filesystem.denied_paths = [...allDenied];
51
+ // Merge tool stack commands into allowed_commands (only if shell isn't deny_all)
52
+ if (base.shell.mode !== 'deny_all') {
53
+ const extraCommands = toolStacks.flatMap((stack) => TOOL_STACKS[stack] ?? []);
54
+ const allCommands = new Set([...base.shell.allowed_commands, ...extraCommands]);
55
+ base.shell.allowed_commands = [...allCommands];
56
+ }
57
+ return policyToToml(base);
58
+ }
59
+ /**
60
+ * Serialize a ZoraPolicy to TOML string.
61
+ */
62
+ function policyToToml(policy) {
63
+ // smol-toml stringify works with plain objects
64
+ return stringifyTOML(policy);
65
+ }
66
+ /**
67
+ * Generate config.toml content based on doctor results.
68
+ */
69
+ export function generateConfigToml(doctor) {
70
+ const providers = [];
71
+ let rank = 1;
72
+ if (doctor.claude.found) {
73
+ providers.push(`[[providers]]
74
+ name = "claude"
75
+ type = "claude-sdk"
76
+ rank = ${rank}
77
+ capabilities = ["reasoning", "coding", "creative"]
78
+ cost_tier = "included"
79
+ enabled = true
80
+ auth_method = "mac_session"
81
+ model = "claude-sonnet-4-5"
82
+ max_turns = 200`);
83
+ rank++;
84
+ }
85
+ if (doctor.gemini.found) {
86
+ providers.push(`[[providers]]
87
+ name = "gemini"
88
+ type = "gemini-cli"
89
+ rank = ${rank}
90
+ capabilities = ["search", "structured-data", "large-context", "coding"]
91
+ cost_tier = "included"
92
+ enabled = true
93
+ auth_method = "workspace_sso"
94
+ cli_path = "gemini"
95
+ model = "gemini-2.5-pro"
96
+ max_turns = 100`);
97
+ }
98
+ const providerBlock = providers.length > 0
99
+ ? providers.join('\n\n')
100
+ : `# No providers detected. Add one manually:
101
+ # [[providers]]
102
+ # name = "claude"
103
+ # type = "claude-sdk"
104
+ # rank = 1
105
+ # capabilities = ["reasoning", "coding"]
106
+ # cost_tier = "included"
107
+ # enabled = true`;
108
+ return `# Zora Configuration — generated by \`zora-agent init\`
109
+
110
+ [agent]
111
+ name = "zora"
112
+ workspace = "~/.zora/workspace"
113
+ max_parallel_jobs = 3
114
+ default_timeout = "2h"
115
+ heartbeat_interval = "30m"
116
+ log_level = "info"
117
+
118
+ [agent.identity]
119
+ soul_file = "~/.zora/SOUL.md"
120
+
121
+ [agent.resources]
122
+ cpu_throttle_percent = 80
123
+ memory_limit_mb = 4096
124
+ throttle_check_interval = "10s"
125
+
126
+ ${providerBlock}
127
+
128
+ [routing]
129
+ mode = "respect_ranking"
130
+
131
+ [failover]
132
+ enabled = true
133
+ auto_handoff = true
134
+ max_handoff_context_tokens = 50000
135
+ retry_after_cooldown = true
136
+ max_retries = 3
137
+ checkpoint_on_auth_failure = true
138
+ notify_on_failover = true
139
+
140
+ [memory]
141
+ long_term_file = "~/.zora/memory/MEMORY.md"
142
+ daily_notes_dir = "~/.zora/memory/daily"
143
+ items_dir = "~/.zora/memory/items"
144
+ categories_dir = "~/.zora/memory/categories"
145
+ context_days = 7
146
+ max_context_items = 20
147
+ max_category_summaries = 5
148
+ auto_extract_interval = 10
149
+
150
+ [security]
151
+ policy_file = "~/.zora/policy.toml"
152
+ audit_log = "~/.zora/audit/audit.jsonl"
153
+ audit_hash_chain = true
154
+ audit_single_writer = true
155
+ integrity_check = true
156
+ integrity_interval = "30m"
157
+ integrity_includes_tool_registry = true
158
+ leak_detection = true
159
+ sanitize_untrusted_content = true
160
+ jit_secret_decryption = true
161
+
162
+ [steering]
163
+ enabled = true
164
+ poll_interval = "5s"
165
+ dashboard_port = 7070
166
+ notify_on_flag = true
167
+ flag_timeout = "10m"
168
+ auto_approve_low_risk = true
169
+ always_flag_irreversible = true
170
+
171
+ [notifications]
172
+ enabled = true
173
+ on_task_complete = true
174
+ on_error = true
175
+ on_failover = true
176
+ on_auth_expiry = true
177
+ on_all_providers_down = true
178
+ `;
179
+ }
180
+ /**
181
+ * Scaffold the ~/.zora directory structure.
182
+ */
183
+ export function scaffoldDirectories(baseDir) {
184
+ for (const dir of SCAFFOLD_DIRS) {
185
+ const fullPath = path.join(baseDir, dir);
186
+ if (!fs.existsSync(fullPath)) {
187
+ fs.mkdirSync(fullPath, { recursive: true });
188
+ }
189
+ }
190
+ }
191
+ /**
192
+ * Write the SOUL.md template if it doesn't exist.
193
+ */
194
+ export function writeSoulFile(baseDir) {
195
+ const soulPath = path.join(baseDir, 'SOUL.md');
196
+ if (!fs.existsSync(soulPath)) {
197
+ fs.writeFileSync(soulPath, SOUL_TEMPLATE, 'utf-8');
198
+ }
199
+ }
200
+ /**
201
+ * Detect a sensible default dev path.
202
+ */
203
+ function detectDevPath() {
204
+ const candidates = [
205
+ path.join(os.homedir(), 'Dev'),
206
+ path.join(os.homedir(), 'Projects'),
207
+ path.join(os.homedir(), 'Developer'),
208
+ path.join(os.homedir(), 'Code'),
209
+ path.join(os.homedir(), 'src'),
210
+ ];
211
+ for (const candidate of candidates) {
212
+ if (fs.existsSync(candidate)) {
213
+ return candidate.replace(os.homedir(), '~');
214
+ }
215
+ }
216
+ return '~/Projects';
217
+ }
218
+ /**
219
+ * Run the interactive wizard.
220
+ */
221
+ async function runWizard(opts) {
222
+ const configPath = path.join(ZORA_DIR, 'config.toml');
223
+ const policyPath = path.join(ZORA_DIR, 'policy.toml');
224
+ // Guard: refuse to overwrite unless --force
225
+ if (!opts.force && (fs.existsSync(configPath) || fs.existsSync(policyPath))) {
226
+ const existing = [
227
+ fs.existsSync(configPath) ? 'config.toml' : null,
228
+ fs.existsSync(policyPath) ? 'policy.toml' : null,
229
+ ].filter(Boolean).join(' and ');
230
+ console.error(`Existing ${existing} found in ${ZORA_DIR}.`);
231
+ console.error('Use --force to overwrite.');
232
+ process.exit(1);
233
+ }
234
+ // ── Step 1: Welcome + Trust explanation ──────────────────────────
235
+ clack.intro('Welcome to Zora');
236
+ if (!opts.yes) {
237
+ clack.note([
238
+ 'Zora starts LOCKED — zero access to your files or commands.',
239
+ 'This wizard grants the minimum permissions you choose.',
240
+ 'Every action is logged to a tamper-proof audit trail.',
241
+ 'You can expand permissions later without restarting.',
242
+ ].join('\n'), 'How Zora earns trust');
243
+ }
244
+ // ── Step 2: Detect CLI providers ─────────────────────────────────
245
+ const spin = clack.spinner();
246
+ spin.start('Checking environment...');
247
+ const doctor = await runDoctorChecks();
248
+ spin.stop('Environment checked');
249
+ const nodeStatus = doctor.node.found ? `Node.js ${doctor.node.version}` : 'Node.js < 20 (upgrade recommended)';
250
+ const claudeStatus = doctor.claude.found
251
+ ? `Claude CLI found — Zora will use your existing subscription`
252
+ : 'Claude CLI (not found)';
253
+ const geminiStatus = doctor.gemini.found
254
+ ? `Gemini CLI found — Zora will use your existing subscription`
255
+ : 'Gemini CLI (not found)';
256
+ clack.note([nodeStatus, claudeStatus, geminiStatus].join('\n'), 'Detected tools');
257
+ // ── Step 3: Permanent deny-list ──────────────────────────────────
258
+ let deniedPaths;
259
+ if (opts.yes) {
260
+ deniedPaths = ['~/.ssh', '~/.gnupg', '~/.aws'];
261
+ }
262
+ else {
263
+ const deniedChoices = await clack.multiselect({
264
+ message: 'These paths are ALWAYS off-limits (recommended defaults pre-selected):',
265
+ options: [
266
+ { value: '~/.ssh', label: '~/.ssh', hint: 'SSH keys — never grant access' },
267
+ { value: '~/.gnupg', label: '~/.gnupg', hint: 'GPG keys — never grant access' },
268
+ { value: '~/.aws', label: '~/.aws', hint: 'AWS credentials — never grant access' },
269
+ { value: '~/Documents', label: '~/Documents' },
270
+ { value: '~/Desktop', label: '~/Desktop' },
271
+ { value: '~/Downloads', label: '~/Downloads' },
272
+ { value: '~/Library', label: '~/Library', hint: 'macOS system' },
273
+ ],
274
+ initialValues: ['~/.ssh', '~/.gnupg', '~/.aws'],
275
+ });
276
+ if (clack.isCancel(deniedChoices)) {
277
+ clack.cancel('Setup cancelled.');
278
+ process.exit(0);
279
+ }
280
+ deniedPaths = deniedChoices;
281
+ }
282
+ // ── Step 4: First folder ─────────────────────────────────────────
283
+ let devPath;
284
+ const defaultDevPath = detectDevPath();
285
+ if (opts.devPath) {
286
+ devPath = opts.devPath.replace(os.homedir(), '~');
287
+ }
288
+ else if (opts.yes) {
289
+ devPath = defaultDevPath;
290
+ }
291
+ else {
292
+ const devPathInput = await clack.text({
293
+ message: 'Pick your first folder — where Zora can read and work:',
294
+ placeholder: defaultDevPath,
295
+ defaultValue: defaultDevPath,
296
+ });
297
+ if (clack.isCancel(devPathInput)) {
298
+ clack.cancel('Setup cancelled.');
299
+ process.exit(0);
300
+ }
301
+ devPath = devPathInput.replace(os.homedir(), '~');
302
+ }
303
+ // ── Step 5: Want to go further? ──────────────────────────────────
304
+ let preset;
305
+ let toolStacks;
306
+ if (opts.preset && (opts.preset === 'locked' || opts.preset === 'safe' || opts.preset === 'balanced' || opts.preset === 'power')) {
307
+ preset = opts.preset;
308
+ toolStacks = opts.yes ? ['general'] : [];
309
+ if (opts.yes && (doctor.claude.found || doctor.gemini.found))
310
+ toolStacks.push('node');
311
+ }
312
+ else if (opts.yes) {
313
+ preset = 'balanced';
314
+ toolStacks = ['general'];
315
+ if (doctor.claude.found || doctor.gemini.found)
316
+ toolStacks.push('node');
317
+ }
318
+ else {
319
+ const goFurther = await clack.select({
320
+ message: 'Want to go further, or is one folder enough for now?',
321
+ options: [
322
+ { value: 'minimal', label: "I'm good for now", hint: 'Read-only access to your folder, no shell commands' },
323
+ { value: 'balanced', label: 'Add shell commands too', hint: 'git, npm, ls — the standard dev toolkit (recommended)' },
324
+ { value: 'power', label: 'Full dev setup', hint: 'Expanded tools: python, find, sed, awk' },
325
+ ],
326
+ });
327
+ if (clack.isCancel(goFurther)) {
328
+ clack.cancel('Setup cancelled.');
329
+ process.exit(0);
330
+ }
331
+ if (goFurther === 'minimal') {
332
+ preset = 'safe';
333
+ toolStacks = [];
334
+ }
335
+ else {
336
+ preset = goFurther;
337
+ // Only ask about tool stacks when shell access is enabled
338
+ const stackChoices = await clack.multiselect({
339
+ message: 'Which tool stacks do you use?',
340
+ options: [
341
+ { value: 'node', label: 'Node.js', hint: 'node, npm, npx, tsc, vitest' },
342
+ { value: 'python', label: 'Python', hint: 'python3, pip, pip3' },
343
+ { value: 'rust', label: 'Rust', hint: 'cargo, rustc, rustup' },
344
+ { value: 'go', label: 'Go', hint: 'go' },
345
+ { value: 'general', label: 'General CLI', hint: 'ls, pwd, cat, head, grep, find, etc.' },
346
+ ],
347
+ initialValues: ['node', 'general'],
348
+ });
349
+ if (clack.isCancel(stackChoices)) {
350
+ clack.cancel('Setup cancelled.');
351
+ process.exit(0);
352
+ }
353
+ toolStacks = stackChoices;
354
+ }
355
+ }
356
+ // ── Step 6: Summary + confirm ────────────────────────────────────
357
+ if (!opts.yes) {
358
+ const providerList = [doctor.claude.found ? 'Claude' : null, doctor.gemini.found ? 'Gemini' : null].filter(Boolean).join(', ') || 'none detected';
359
+ const summary = [
360
+ `Preset: ${preset}`,
361
+ `Workspace: ${devPath}`,
362
+ `Denied: ${deniedPaths.join(', ')}`,
363
+ `Tool stacks: ${toolStacks.length > 0 ? toolStacks.join(', ') : 'none (shell disabled)'}`,
364
+ `Providers: ${providerList} (using your existing subscriptions)`,
365
+ ].join('\n');
366
+ clack.note(summary, 'Summary');
367
+ const confirmed = await clack.confirm({
368
+ message: 'Write configuration files?',
369
+ });
370
+ if (clack.isCancel(confirmed) || !confirmed) {
371
+ clack.cancel('Setup cancelled.');
372
+ process.exit(0);
373
+ }
374
+ }
375
+ // ── Generate and write files ─────────────────────────────────────
376
+ const policyToml = generatePolicyToml(preset, devPath, deniedPaths, toolStacks);
377
+ const configToml = generateConfigToml(doctor);
378
+ // Validate generated TOML parses cleanly
379
+ try {
380
+ parseTOML(policyToml);
381
+ }
382
+ catch (e) {
383
+ console.error('Generated policy.toml is invalid TOML:', e);
384
+ process.exit(1);
385
+ }
386
+ try {
387
+ parseTOML(configToml);
388
+ }
389
+ catch (e) {
390
+ console.error('Generated config.toml is invalid TOML:', e);
391
+ process.exit(1);
392
+ }
393
+ // Scaffold and write
394
+ scaffoldDirectories(ZORA_DIR);
395
+ writeSoulFile(ZORA_DIR);
396
+ fs.writeFileSync(policyPath, policyToml, 'utf-8');
397
+ fs.writeFileSync(configPath, configToml, 'utf-8');
398
+ clack.outro(`Zora is ready! Permissions can grow over time as you need them.
399
+
400
+ Try it:
401
+ zora-agent ask "What's in my ${devPath.replace('~', '~')} folder? Give me a one-line summary of each."
402
+
403
+ Or start the dashboard:
404
+ zora-agent start
405
+ Then open http://localhost:7070
406
+
407
+ To expand permissions later:
408
+ Edit ~/.zora/policy.toml or re-run: zora-agent init --force`);
409
+ }
410
+ /**
411
+ * Register the `zora-agent init` command on the commander program.
412
+ */
413
+ export function registerInitCommand(program) {
414
+ program
415
+ .command('init')
416
+ .description('Set up Zora — generate config, policy, and directory structure')
417
+ .option('--preset <preset>', 'Security preset: locked, safe, balanced, or power')
418
+ .option('--dev-path <path>', 'Path to your code directory')
419
+ .option('-y, --yes', 'Accept all defaults (non-interactive)')
420
+ .option('--force', 'Overwrite existing config files')
421
+ .action(async (opts) => {
422
+ await runWizard(opts);
423
+ });
424
+ }
425
+ //# sourceMappingURL=init-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Memory CLI Commands — search, forget, and list memory categories.
3
+ *
4
+ * Spec §5.9 "CLI Interface" — memory subcommands.
5
+ */
6
+ import type { Command } from 'commander';
7
+ import type { MemoryManager } from '../memory/memory-manager.js';
8
+ export declare function registerMemoryCommands(program: Command, setupContext: () => Promise<{
9
+ memoryManager: MemoryManager;
10
+ }>): void;
11
+ //# sourceMappingURL=memory-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-commands.d.ts","sourceRoot":"","sources":["../../src/cli/memory-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,OAAO,CAAC;IAAE,aAAa,EAAE,aAAa,CAAA;CAAE,CAAC,GAC5D,IAAI,CAwDN"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Memory CLI Commands — search, forget, and list memory categories.
3
+ *
4
+ * Spec §5.9 "CLI Interface" — memory subcommands.
5
+ */
6
+ export function registerMemoryCommands(program, setupContext) {
7
+ const memory = program.command('memory').description('Manage agent memory');
8
+ memory
9
+ .command('search <query>')
10
+ .description('Search memory items by keyword')
11
+ .option('-n, --limit <n>', 'Max results', '10')
12
+ .action(async (query, opts) => {
13
+ const { memoryManager } = await setupContext();
14
+ const results = await memoryManager.searchMemory(query, parseInt(opts.limit, 10));
15
+ if (results.length === 0) {
16
+ console.log('No memory items found.');
17
+ return;
18
+ }
19
+ console.log(`Found ${results.length} result(s):\n`);
20
+ for (const r of results) {
21
+ console.log(` [${r.itemId}] score=${r.score.toFixed(2)}`);
22
+ console.log(` access=${r.components.accessWeight.toFixed(2)} recency=${r.components.recencyDecay.toFixed(2)} relevance=${r.components.relevanceScore.toFixed(2)}`);
23
+ console.log();
24
+ }
25
+ });
26
+ memory
27
+ .command('forget <id>')
28
+ .description('Delete a memory item')
29
+ .action(async (id) => {
30
+ const { memoryManager } = await setupContext();
31
+ const deleted = await memoryManager.forgetItem(id);
32
+ if (deleted) {
33
+ console.log(`Deleted memory item: ${id}`);
34
+ }
35
+ else {
36
+ console.log(`Memory item not found: ${id}`);
37
+ }
38
+ });
39
+ memory
40
+ .command('categories')
41
+ .description('List memory categories')
42
+ .action(async () => {
43
+ const { memoryManager } = await setupContext();
44
+ const categories = await memoryManager.getCategories();
45
+ if (categories.length === 0) {
46
+ console.log('No categories found.');
47
+ return;
48
+ }
49
+ console.log(`${categories.length} categorie(s):\n`);
50
+ for (const cat of categories) {
51
+ console.log(` [${cat.category}] ${cat.item_count} items — ${cat.summary}`);
52
+ console.log(` last updated: ${cat.last_updated}`);
53
+ console.log();
54
+ }
55
+ });
56
+ }
57
+ //# sourceMappingURL=memory-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-commands.js","sourceRoot":"","sources":["../../src/cli/memory-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,YAA6D;IAE7D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAE5E,MAAM;SACH,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAuB,EAAE,EAAE;QACvD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAElF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtK,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC;QAEvD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,kBAAkB,CAAC,CAAC;QACpD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,UAAU,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Policy Presets — Safe, Balanced, Power.
3
+ *
4
+ * These match the spec presets in specs/v5/docs/POLICY_PRESETS.md.
5
+ * Used by `zora-agent init` to generate policy.toml.
6
+ */
7
+ import type { ZoraPolicy } from '../types.js';
8
+ export type PresetName = 'locked' | 'safe' | 'balanced' | 'power';
9
+ export declare const PRESETS: Record<PresetName, ZoraPolicy>;
10
+ export declare const TOOL_STACKS: Record<string, string[]>;
11
+ export declare const PRESET_DESCRIPTIONS: Record<PresetName, string>;
12
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/cli/presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAElE,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAuJlD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAMhD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAK1D,CAAC"}