zora-agent 0.9.4 → 0.9.6

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 (245) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +103 -92
  3. package/dist/cli/audit-commands.d.ts.map +1 -1
  4. package/dist/cli/audit-commands.js +3 -1
  5. package/dist/cli/audit-commands.js.map +1 -1
  6. package/dist/cli/daemon.js +86 -28
  7. package/dist/cli/daemon.js.map +1 -1
  8. package/dist/cli/edit-commands.d.ts.map +1 -1
  9. package/dist/cli/edit-commands.js +3 -1
  10. package/dist/cli/edit-commands.js.map +1 -1
  11. package/dist/cli/hook-commands.d.ts +9 -0
  12. package/dist/cli/hook-commands.d.ts.map +1 -0
  13. package/dist/cli/hook-commands.js +106 -0
  14. package/dist/cli/hook-commands.js.map +1 -0
  15. package/dist/cli/index.js +87 -35
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/init-command.d.ts.map +1 -1
  18. package/dist/cli/init-command.js +108 -9
  19. package/dist/cli/init-command.js.map +1 -1
  20. package/dist/cli/memory-commands.d.ts +1 -1
  21. package/dist/cli/memory-commands.d.ts.map +1 -1
  22. package/dist/cli/memory-commands.js +213 -1
  23. package/dist/cli/memory-commands.js.map +1 -1
  24. package/dist/cli/presets.d.ts.map +1 -1
  25. package/dist/cli/presets.js +2 -1
  26. package/dist/cli/presets.js.map +1 -1
  27. package/dist/cli/skill-commands.d.ts.map +1 -1
  28. package/dist/cli/skill-commands.js +4 -2
  29. package/dist/cli/skill-commands.js.map +1 -1
  30. package/dist/cli/steer-commands.d.ts.map +1 -1
  31. package/dist/cli/steer-commands.js +6 -4
  32. package/dist/cli/steer-commands.js.map +1 -1
  33. package/dist/cli/team-commands.d.ts.map +1 -1
  34. package/dist/cli/team-commands.js +3 -1
  35. package/dist/cli/team-commands.js.map +1 -1
  36. package/dist/config/defaults.d.ts.map +1 -1
  37. package/dist/config/defaults.js +12 -2
  38. package/dist/config/defaults.js.map +1 -1
  39. package/dist/config/loader.d.ts +23 -0
  40. package/dist/config/loader.d.ts.map +1 -1
  41. package/dist/config/loader.js +64 -3
  42. package/dist/config/loader.js.map +1 -1
  43. package/dist/config/policy-loader.d.ts +14 -0
  44. package/dist/config/policy-loader.d.ts.map +1 -1
  45. package/dist/config/policy-loader.js +33 -0
  46. package/dist/config/policy-loader.js.map +1 -1
  47. package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
  48. package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
  49. package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
  50. package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
  51. package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
  52. package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
  53. package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
  54. package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
  55. package/dist/dashboard/frontend/dist/index.html +17 -0
  56. package/dist/dashboard/server.d.ts +19 -2
  57. package/dist/dashboard/server.d.ts.map +1 -1
  58. package/dist/dashboard/server.js +121 -20
  59. package/dist/dashboard/server.js.map +1 -1
  60. package/dist/hooks/hook-runner.d.ts +55 -0
  61. package/dist/hooks/hook-runner.d.ts.map +1 -0
  62. package/dist/hooks/hook-runner.js +120 -0
  63. package/dist/hooks/hook-runner.js.map +1 -0
  64. package/dist/hooks/hook-types.d.ts +82 -0
  65. package/dist/hooks/hook-types.d.ts.map +1 -0
  66. package/dist/hooks/hook-types.js +20 -0
  67. package/dist/hooks/hook-types.js.map +1 -0
  68. package/dist/hooks/index.d.ts +6 -0
  69. package/dist/hooks/index.d.ts.map +1 -0
  70. package/dist/hooks/index.js +6 -0
  71. package/dist/hooks/index.js.map +1 -0
  72. package/dist/memory/context-compressor.d.ts +108 -0
  73. package/dist/memory/context-compressor.d.ts.map +1 -0
  74. package/dist/memory/context-compressor.js +307 -0
  75. package/dist/memory/context-compressor.js.map +1 -0
  76. package/dist/memory/index.d.ts +1 -0
  77. package/dist/memory/index.d.ts.map +1 -1
  78. package/dist/memory/index.js +1 -0
  79. package/dist/memory/index.js.map +1 -1
  80. package/dist/memory/memory-manager.d.ts +88 -4
  81. package/dist/memory/memory-manager.d.ts.map +1 -1
  82. package/dist/memory/memory-manager.js +299 -7
  83. package/dist/memory/memory-manager.js.map +1 -1
  84. package/dist/memory/observation-store.d.ts +75 -0
  85. package/dist/memory/observation-store.d.ts.map +1 -0
  86. package/dist/memory/observation-store.js +162 -0
  87. package/dist/memory/observation-store.js.map +1 -0
  88. package/dist/memory/observer-worker.d.ts +34 -0
  89. package/dist/memory/observer-worker.d.ts.map +1 -0
  90. package/dist/memory/observer-worker.js +161 -0
  91. package/dist/memory/observer-worker.js.map +1 -0
  92. package/dist/memory/reflector-worker.d.ts +40 -0
  93. package/dist/memory/reflector-worker.d.ts.map +1 -0
  94. package/dist/memory/reflector-worker.js +185 -0
  95. package/dist/memory/reflector-worker.js.map +1 -0
  96. package/dist/memory/salience-scorer.d.ts +16 -6
  97. package/dist/memory/salience-scorer.d.ts.map +1 -1
  98. package/dist/memory/salience-scorer.js +42 -22
  99. package/dist/memory/salience-scorer.js.map +1 -1
  100. package/dist/memory/structured-memory.d.ts +36 -1
  101. package/dist/memory/structured-memory.d.ts.map +1 -1
  102. package/dist/memory/structured-memory.js +207 -8
  103. package/dist/memory/structured-memory.js.map +1 -1
  104. package/dist/memory/token-estimator.d.ts +31 -0
  105. package/dist/memory/token-estimator.d.ts.map +1 -0
  106. package/dist/memory/token-estimator.js +77 -0
  107. package/dist/memory/token-estimator.js.map +1 -0
  108. package/dist/memory/validation-pipeline.d.ts +37 -0
  109. package/dist/memory/validation-pipeline.d.ts.map +1 -0
  110. package/dist/memory/validation-pipeline.js +106 -0
  111. package/dist/memory/validation-pipeline.js.map +1 -0
  112. package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
  113. package/dist/orchestrator/auth-monitor.js +3 -1
  114. package/dist/orchestrator/auth-monitor.js.map +1 -1
  115. package/dist/orchestrator/execution-loop.d.ts +23 -0
  116. package/dist/orchestrator/execution-loop.d.ts.map +1 -1
  117. package/dist/orchestrator/execution-loop.js +60 -19
  118. package/dist/orchestrator/execution-loop.js.map +1 -1
  119. package/dist/orchestrator/failover-controller.d.ts +26 -2
  120. package/dist/orchestrator/failover-controller.d.ts.map +1 -1
  121. package/dist/orchestrator/failover-controller.js +143 -23
  122. package/dist/orchestrator/failover-controller.js.map +1 -1
  123. package/dist/orchestrator/orchestrator.d.ts +70 -7
  124. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  125. package/dist/orchestrator/orchestrator.js +416 -92
  126. package/dist/orchestrator/orchestrator.js.map +1 -1
  127. package/dist/orchestrator/retry-queue.d.ts.map +1 -1
  128. package/dist/orchestrator/retry-queue.js +24 -9
  129. package/dist/orchestrator/retry-queue.js.map +1 -1
  130. package/dist/orchestrator/router.d.ts +16 -1
  131. package/dist/orchestrator/router.d.ts.map +1 -1
  132. package/dist/orchestrator/router.js +79 -20
  133. package/dist/orchestrator/router.js.map +1 -1
  134. package/dist/orchestrator/session-manager.d.ts +26 -1
  135. package/dist/orchestrator/session-manager.d.ts.map +1 -1
  136. package/dist/orchestrator/session-manager.js +88 -4
  137. package/dist/orchestrator/session-manager.js.map +1 -1
  138. package/dist/providers/circuit-breaker.d.ts +78 -0
  139. package/dist/providers/circuit-breaker.d.ts.map +1 -0
  140. package/dist/providers/circuit-breaker.js +129 -0
  141. package/dist/providers/circuit-breaker.js.map +1 -0
  142. package/dist/providers/claude-provider.d.ts +27 -11
  143. package/dist/providers/claude-provider.d.ts.map +1 -1
  144. package/dist/providers/claude-provider.js +161 -46
  145. package/dist/providers/claude-provider.js.map +1 -1
  146. package/dist/providers/gemini-provider.d.ts +9 -1
  147. package/dist/providers/gemini-provider.d.ts.map +1 -1
  148. package/dist/providers/gemini-provider.js +97 -48
  149. package/dist/providers/gemini-provider.js.map +1 -1
  150. package/dist/providers/index.d.ts +1 -0
  151. package/dist/providers/index.d.ts.map +1 -1
  152. package/dist/providers/index.js +1 -0
  153. package/dist/providers/index.js.map +1 -1
  154. package/dist/providers/ollama-provider.d.ts +7 -0
  155. package/dist/providers/ollama-provider.d.ts.map +1 -1
  156. package/dist/providers/ollama-provider.js +89 -18
  157. package/dist/providers/ollama-provider.js.map +1 -1
  158. package/dist/routines/heartbeat.d.ts +10 -2
  159. package/dist/routines/heartbeat.d.ts.map +1 -1
  160. package/dist/routines/heartbeat.js +42 -5
  161. package/dist/routines/heartbeat.js.map +1 -1
  162. package/dist/routines/routine-manager.d.ts.map +1 -1
  163. package/dist/routines/routine-manager.js +22 -15
  164. package/dist/routines/routine-manager.js.map +1 -1
  165. package/dist/security/audit-logger.d.ts.map +1 -1
  166. package/dist/security/audit-logger.js +5 -7
  167. package/dist/security/audit-logger.js.map +1 -1
  168. package/dist/security/policy-engine.d.ts +28 -17
  169. package/dist/security/policy-engine.d.ts.map +1 -1
  170. package/dist/security/policy-engine.js +42 -185
  171. package/dist/security/policy-engine.js.map +1 -1
  172. package/dist/security/policy-serializer.d.ts +19 -0
  173. package/dist/security/policy-serializer.d.ts.map +1 -0
  174. package/dist/security/policy-serializer.js +100 -0
  175. package/dist/security/policy-serializer.js.map +1 -0
  176. package/dist/security/shell-validator.d.ts +42 -0
  177. package/dist/security/shell-validator.d.ts.map +1 -0
  178. package/dist/security/shell-validator.js +231 -0
  179. package/dist/security/shell-validator.js.map +1 -0
  180. package/dist/skills/index.d.ts +1 -0
  181. package/dist/skills/index.d.ts.map +1 -1
  182. package/dist/skills/index.js +1 -0
  183. package/dist/skills/index.js.map +1 -1
  184. package/dist/skills/skill-loader.d.ts +38 -2
  185. package/dist/skills/skill-loader.d.ts.map +1 -1
  186. package/dist/skills/skill-loader.js +83 -2
  187. package/dist/skills/skill-loader.js.map +1 -1
  188. package/dist/skills/subagent-loader.d.ts +66 -0
  189. package/dist/skills/subagent-loader.d.ts.map +1 -0
  190. package/dist/skills/subagent-loader.js +143 -0
  191. package/dist/skills/subagent-loader.js.map +1 -0
  192. package/dist/steering/flag-manager.d.ts +20 -0
  193. package/dist/steering/flag-manager.d.ts.map +1 -1
  194. package/dist/steering/flag-manager.js +94 -11
  195. package/dist/steering/flag-manager.js.map +1 -1
  196. package/dist/steering/steering-manager.d.ts +11 -0
  197. package/dist/steering/steering-manager.d.ts.map +1 -1
  198. package/dist/steering/steering-manager.js +23 -0
  199. package/dist/steering/steering-manager.js.map +1 -1
  200. package/dist/steering/telegram-gateway.d.ts +4 -1
  201. package/dist/steering/telegram-gateway.d.ts.map +1 -1
  202. package/dist/steering/telegram-gateway.js +49 -10
  203. package/dist/steering/telegram-gateway.js.map +1 -1
  204. package/dist/teams/bridge-watchdog.d.ts.map +1 -1
  205. package/dist/teams/bridge-watchdog.js +5 -3
  206. package/dist/teams/bridge-watchdog.js.map +1 -1
  207. package/dist/teams/gemini-bridge.d.ts.map +1 -1
  208. package/dist/teams/gemini-bridge.js +9 -4
  209. package/dist/teams/gemini-bridge.js.map +1 -1
  210. package/dist/tools/index.d.ts +2 -0
  211. package/dist/tools/index.d.ts.map +1 -1
  212. package/dist/tools/index.js +2 -0
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/memory-tools.d.ts +16 -0
  215. package/dist/tools/memory-tools.d.ts.map +1 -0
  216. package/dist/tools/memory-tools.js +207 -0
  217. package/dist/tools/memory-tools.js.map +1 -0
  218. package/dist/tools/notifications.d.ts.map +1 -1
  219. package/dist/tools/notifications.js +3 -1
  220. package/dist/tools/notifications.js.map +1 -1
  221. package/dist/tools/tool-factory.d.ts +36 -0
  222. package/dist/tools/tool-factory.d.ts.map +1 -0
  223. package/dist/tools/tool-factory.js +55 -0
  224. package/dist/tools/tool-factory.js.map +1 -0
  225. package/dist/types.d.ts +205 -1
  226. package/dist/types.d.ts.map +1 -1
  227. package/dist/types.js +47 -1
  228. package/dist/types.js.map +1 -1
  229. package/dist/utils/errors.d.ts +21 -0
  230. package/dist/utils/errors.d.ts.map +1 -0
  231. package/dist/utils/errors.js +29 -0
  232. package/dist/utils/errors.js.map +1 -0
  233. package/dist/utils/event-filter.d.ts +25 -0
  234. package/dist/utils/event-filter.d.ts.map +1 -0
  235. package/dist/utils/event-filter.js +61 -0
  236. package/dist/utils/event-filter.js.map +1 -0
  237. package/dist/utils/logger.d.ts +33 -36
  238. package/dist/utils/logger.d.ts.map +1 -1
  239. package/dist/utils/logger.js +60 -130
  240. package/dist/utils/logger.js.map +1 -1
  241. package/dist/utils/validate-job-id.d.ts +6 -0
  242. package/dist/utils/validate-job-id.d.ts.map +1 -0
  243. package/dist/utils/validate-job-id.js +10 -0
  244. package/dist/utils/validate-job-id.js.map +1 -0
  245. package/package.json +12 -3
package/CHANGELOG.md CHANGED
@@ -118,7 +118,7 @@ This release addresses critical security gaps identified in a comprehensive audi
118
118
  - Routine manager with TOML-defined tasks and node-cron scheduling
119
119
  - Heartbeat system with markdown task parsing and completion marking
120
120
  - Event trigger manager with fs.stat polling and glob pattern matching
121
- - Dashboard server on localhost:7070 with Express, steering API, and health endpoint
121
+ - Dashboard server on localhost:8070 with Express, steering API, and health endpoint
122
122
  - Auth middleware with timing-safe Bearer token comparison
123
123
  - Skill loader for dynamic ~/.claude/skills/ discovery
124
124
  - CLI with `ask`, `status`, `start`, `stop` commands plus memory, audit, edit, team, steer, and skill subcommands
package/README.md CHANGED
@@ -1,14 +1,16 @@
1
- ![Zora Header](specs/v5/assets/zora_lcars_header.png)
1
+ ![Zora Header](docs/archive/v5-spec/assets/zora_lcars_header.png)
2
2
 
3
3
  # Zora
4
4
 
5
- **An autonomous AI agent that runs on your computer and gets work done.** Give it a task in plain English, and it uses Claude and Gemini to execute multi-step workflows while you focus on other things.
5
+ **Your personal AI assistant that actually does things.** Tell it what you need in plain English — organize files, summarize documents, automate repetitive tasks and it handles it while you do something else.
6
+
7
+ Unlike chatbots that just talk, Zora runs on your computer and takes action. It reads files, runs commands, remembers your preferences, and works within safety boundaries you control.
6
8
 
7
9
  ---
8
10
 
9
- ![Divider](specs/v5/assets/lcars_divider.svg)
11
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
10
12
 
11
- ## Install
13
+ ## Get Started in 5 Minutes
12
14
 
13
15
  ```bash
14
16
  npm i -g zora-agent
@@ -16,135 +18,144 @@ zora-agent init
16
18
  zora-agent ask "summarize files in ~/Projects"
17
19
  ```
18
20
 
19
- That's it. Three commands from zero to productive.
21
+ That's it. Three commands and Zora is working for you.
22
+
23
+ > **Note:** The npm package may lag behind the latest release. To install from source: `git clone https://github.com/ryaker/zora && cd zora && npm install && npm link`
24
+
25
+ **New to the terminal?** See our [step-by-step Setup Guide](SETUP_GUIDE.md) — it assumes zero technical experience.
20
26
 
21
27
  ---
22
28
 
23
- ![Divider](specs/v5/assets/lcars_divider.svg)
29
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
30
+
31
+ ## How Does It Work?
24
32
 
25
- ## What It Can Do
33
+ You type a request. Zora figures out what needs to happen, does it, and shows you the result.
26
34
 
27
- 🚀 **Multi-Model with Automatic Failover** Claude (Opus/Sonnet/Haiku), Gemini, and Ollama (local models). Pick the right model per taskOpus for hard problems, Haiku for cheap content, Ollama for zero-cost local work. Use `--max-cost-tier` to cap routing by cost budget. Failover is automatic.
35
+ Behind the scenes, Zora uses AI (Claude or Gemini) to understand your request, then uses tools on your computerreading files, running safe commands, searching the web to complete the task. Everything stays within safety rules you set up during installation.
28
36
 
29
- 🛡️ **Policy-Enforced Autonomy** — Work freely within boundaries you define. The security engine enforces strict allow/deny rules for filesystem, shell, and network with action budgets, dry-run preview mode, and intent verification. [OWASP LLM Top 10 and Agentic Top 10 hardened](SECURITY.md).
37
+ **No API keys. No surprise bills.** Zora authenticates through your existing Claude Code or Gemini CLI session. No per-token charges it uses the subscription you already pay for.
30
38
 
31
- 🧠 **Hierarchical Memory** — Zora remembers your preferences, past work, and project context across sessions. Long-term memory + daily rolling notes.
39
+ ---
32
40
 
33
- 🕹️ **Web Dashboard** — A local web interface for monitoring tasks, viewing provider status and quota usage, and injecting course-corrections into running workflows. Live metrics via SSE, auto-opens on `zora-agent start`.
41
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
34
42
 
35
- **Scheduled Routines** Define recurring tasks in TOML that run automatically — daily reports, weekly cleanups, nightly code reviews. Supports `model_preference` and `max_cost_tier` per routine. Trigger manually with `RoutineManager.runRoutine()`.
43
+ ## What Can Zora Do?
36
44
 
37
- 🔄 **Persistent Retry Queue** — Failed tasks are persisted to disk and retried with intelligent backoff. Resilient to transient errors.
45
+ Here are real things you can ask Zora right now:
38
46
 
39
- ### Real Examples
47
+ - **"Sort my Downloads folder by type and archive anything older than 30 days"** — File organization on autopilot
48
+ - **"Find all TODO comments in my project and create a summary"** — Code analysis in seconds
49
+ - **"Draft a changelog from my last 10 commits"** — Content generation with context
50
+ - **"What changed in my repos this week? Give me a summary"** — Stay on top of your work
51
+ - **"Find and summarize the latest React 19 migration guides"** — Research without tab-hopping
40
52
 
41
- - **File organization** `zora-agent ask "Sort ~/Downloads by project and archive older than 30 days"`
42
- - **Code review** — `zora-agent ask "Check all PRs in my repos and comment on style issues"`
43
- - **Email drafting** — `zora-agent ask "Draft replies to unread emails about the product launch"`
44
- - **Git management** — `zora-agent ask "Create feature branches from all open issues labeled 'sprint-12'"`
45
- - **Web research** — `zora-agent ask "Find and summarize the latest React 19 migration guides"`
46
- - **Multi-step workflows** — `zora-agent ask "Find all TODOs in my project, create a summary, and open a GitHub issue with it."`
53
+ Zora remembers your preferences across sessions. Tell it once that you prefer TypeScript over JavaScript, and it remembers forever.
47
54
 
48
55
  ---
49
56
 
50
- ![Divider](specs/v5/assets/lcars_divider.svg)
57
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
58
+
59
+ ## Is It Safe?
51
60
 
52
- ## How Security Works
61
+ Yes. Zora was built with safety as a core feature, not an afterthought.
53
62
 
54
- Zora operates within strict boundaries you define. A policy file (`~/.zora/policy.toml`) specifies allowed filesystem paths, shell commands, and network access. The agent self-corrects when it hits policy limits — no data leaves your machine except API calls to Claude/Gemini. Every action is logged to a tamper-proof audit trail.
63
+ **You're always in control.** During setup, you choose what Zora can and can't do:
55
64
 
56
- **Security Hardening** Audited against OWASP LLM Top 10 (2025) and OWASP Agentic Top 10 (ASI-2026):
65
+ - **Which folders** it can access (and which are off-limits, like your SSH keys)
66
+ - **Which commands** it can run (safe ones like `git` and `ls`, never destructive ones like `sudo`)
67
+ - **How much autonomy** it gets — from "ask me before doing anything" to "handle it yourself"
57
68
 
58
- | Defense | What It Does |
59
- |---------|-------------|
60
- | **Action Budgets** | Per-session limits on tool invocations and token spend prevent unbounded loops |
61
- | **Dry-Run Mode** | Preview write operations without executing — test policies safely |
62
- | **Intent Capsules** | HMAC-SHA256 signed mandates detect goal hijacking from injected instructions |
63
- | **RAG Injection Defense** | 20+ patterns detect prompt injection in tool outputs and RAG documents |
64
- | **Hash-Chain Audit** | SHA-256 chained append-only log with tamper detection |
65
- | **AES-256-GCM Secrets** | Encrypted credential storage with PBKDF2 key derivation |
69
+ Every action Zora takes is recorded in a tamper-proof audit log you can review anytime. If something looks wrong, you'll know exactly what happened and when.
66
70
 
67
- See **[SECURITY.md](SECURITY.md)** for the full security guide and OWASP compliance matrix.
71
+ For the security-minded: Zora is hardened against the [OWASP LLM Top 10](https://owasp.org/www-project-top-10-for-large-language-model-applications/) and [OWASP Agentic Top 10](https://owasp.org/www-project-agentic-ai-threats/). See [SECURITY.md](SECURITY.md) for the full technical breakdown.
68
72
 
69
73
  ---
70
74
 
71
- ![Divider](specs/v5/assets/lcars_divider.svg)
75
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
72
76
 
73
- ## Architecture
77
+ ## The Dashboard
74
78
 
75
- ```
76
- ┌─────────────────────────────────────────────────┐
77
- │ ORCHESTRATOR CORE │
78
- │ Router → Execution Loop → Failover Controller │
79
- │ Retry Queue │ Session Manager │
80
- ├─────────────────────────────────────────────────┤
81
- │ LLM PROVIDER REGISTRY │
82
- │ Claude Opus/Sonnet/Haiku │ Gemini │ Ollama │
83
- │ Agent SDK (Native) CLI (Sub) REST (Local) │
84
- ├─────────────────────────────────────────────────┤
85
- │ Tools │ Memory │ Security │
86
- │ Shell │ MEMORY.md │ Policy Engine │
87
- │ Filesystem │ Daily Notes │ Audit Log │
88
- │ Web │ Context Loader │ Restrictive FS │
89
- └─────────────────────────────────────────────────┘
79
+ Zora includes a local web dashboard where you can watch tasks happen in real time, check on your AI providers, and send course-corrections to running jobs.
80
+
81
+ ```bash
82
+ zora-agent start
90
83
  ```
91
84
 
85
+ Your browser opens automatically to `http://localhost:8070`. First-time users see a guided welcome screen with ready-to-go task templates.
86
+
92
87
  ---
93
88
 
94
- ![Divider](specs/v5/assets/lcars_divider.svg)
89
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
95
90
 
96
- ## Project Status
91
+ ## Multiple AI Brains, One Interface
97
92
 
98
- Zora is in active development (v0.9.0). This table reflects what actually works today.
99
-
100
- | Component | Status |
101
- |-----------|--------|
102
- | Multi-model orchestration (Claude Opus/Sonnet/Haiku + Gemini + Ollama) | ✅ Working |
103
- | Automatic failover on quota/auth errors | ✅ Working |
104
- | Policy-based security engine (path + command enforcement) | Working |
105
- | Action budgets (per-session + per-type limits) | ✅ Working |
106
- | Dry-run preview mode (test without executing) | ✅ Working |
107
- | Intent capsules (HMAC-SHA256 goal drift detection) | ✅ Working |
108
- | RAG/tool-output injection defense (20+ patterns) | ✅ Working |
109
- | Policy-aware agent (checks permissions before acting) | ✅ Working |
110
- | SOUL.md personality loading | ✅ Working |
111
- | Hierarchical memory (long-term + daily notes) | ✅ Working |
112
- | Scheduled routines via cron | ✅ Working |
113
- | Web dashboard with live SSE feed, task submission, and onboarding | ✅ Working |
114
- | Provider quota/usage tracking in dashboard | ✅ Working |
115
- | Cost-aware routing via `--max-cost-tier` | ✅ Working |
116
- | Manual routine execution (`runRoutine()`) | ✅ Working |
117
- | Persistent retry queue with backoff | ✅ Working |
118
- | Docker containerization for integration testing | ✅ Working |
119
- | Interactive approval for flagged actions (`always_flag`) | 🚧 Config parsed, enforcement in progress |
120
- | Runtime permission expansion (grant access mid-task) | 🚧 Planned |
121
- | Cross-platform support (macOS, Linux, Windows) | 🚧 macOS tested, others in progress |
93
+ Zora works with multiple AI providers and picks the best one for each task:
94
+
95
+ - **Claude** (primary) Deep reasoning, coding, creative work
96
+ - **Gemini** (backup) — Search, large documents, structured data
97
+ - **Ollama** (optional, local) Zero-cost, fully offline, complete privacy
98
+
99
+ If one provider is unavailable, Zora automatically fails over to the next one. You never have to manage this yourself.
122
100
 
123
101
  ---
124
102
 
125
- ![Divider](specs/v5/assets/lcars_divider.svg)
103
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
104
+
105
+ ## Scheduled Tasks
126
106
 
127
- ## Dashboard
107
+ Set up recurring tasks that run automatically:
128
108
 
129
- After starting the agent, the dashboard auto-opens at `http://localhost:7070`. Submit tasks, monitor live progress via SSE, view provider quota/usage, and send course-corrections to running jobs. First-time users see a guided onboarding screen with quick-start examples.
109
+ - "Every morning at 8am, check for new issues assigned to me"
110
+ - "Every Friday, generate a weekly project report"
111
+ - "Every night, check for outdated dependencies"
130
112
 
131
- New to Zora? Use our **[AI Setup Assistant](docs/AI_SETUP_ASSISTANT.md)** — paste the prompt into any AI chatbot (ChatGPT, Claude, Gemini) for a guided walkthrough of installation and configuration.
113
+ See the [Routines Cookbook](ROUTINES_COOKBOOK.md) for templates.
132
114
 
133
115
  ---
134
116
 
135
- ![Divider](specs/v5/assets/lcars_divider.svg)
117
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
118
+
119
+ ## Architecture
120
+
121
+ ![Zora Architecture Diagram](docs/architecture.svg)
122
+
123
+ ---
124
+
125
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
136
126
 
137
127
  ## Documentation
138
128
 
139
- | Document | Description |
140
- |----------|-------------|
141
- | **[QUICKSTART.md](QUICKSTART.md)** | Get up and running in 5 minutes |
142
- | **[USE_CASES.md](USE_CASES.md)** | Real-world examples and workflow patterns |
143
- | **[SECURITY.md](SECURITY.md)** | Policy configuration and audit logging |
144
- | **[ROUTINES_COOKBOOK.md](ROUTINES_COOKBOOK.md)** | Recipes for scheduled tasks |
145
- | **[SETUP_GUIDE.md](SETUP_GUIDE.md)** | Detailed installation and configuration |
146
- | **[docs/BEGINNERS_GUIDE.md](docs/BEGINNERS_GUIDE.md)** | In-depth usage guide |
147
- | **[docs/AI_SETUP_ASSISTANT.md](docs/AI_SETUP_ASSISTANT.md)** | Interactive AI-guided setup |
129
+ | Guide | Who It's For |
130
+ |-------|-------------|
131
+ | **[Quick Start](QUICKSTART.md)** | Get running in 5 minutes (some terminal comfort) |
132
+ | **[Setup Guide](SETUP_GUIDE.md)** | Complete walkthrough for first-time users |
133
+ | **[What Is Zora?](WHAT_IS_ZORA.md)** | Plain-English explainer for non-technical users |
134
+ | **[FAQ](FAQ.md)** | Common questions answered simply |
135
+ | **[Use Cases](USE_CASES.md)** | Real-world examples and workflow ideas |
136
+ | **[Security Guide](SECURITY.md)** | How the safety system works (technical) |
137
+ | **[Routines Cookbook](ROUTINES_COOKBOOK.md)** | Templates for scheduled tasks |
138
+
139
+ ---
140
+
141
+ ![Divider](docs/archive/v5-spec/assets/lcars_divider.svg)
142
+
143
+ ## Project Status
144
+
145
+ Zora is in active development (v0.9.6). The core features work reliably today.
146
+
147
+ | Feature | Status |
148
+ |---------|--------|
149
+ | Task execution via Claude and Gemini | ✅ Working |
150
+ | Automatic failover between providers | ✅ Working |
151
+ | Safety system (file/command/network boundaries) | ✅ Working |
152
+ | Long-term memory across sessions | ✅ Working |
153
+ | Web dashboard with live monitoring | ✅ Working |
154
+ | Scheduled routines (cron-based) | ✅ Working |
155
+ | Failed task retry with backoff | ✅ Working |
156
+ | Cross-platform (macOS, Linux, Windows) | 🚧 macOS tested, others in progress |
157
+
158
+ ---
148
159
 
149
160
  ## Contributing
150
161
 
@@ -152,8 +163,8 @@ Contributions are welcome. Open an issue to discuss features or bugs before subm
152
163
 
153
164
  ## License
154
165
 
155
- MIT License - see [LICENSE](LICENSE) for details.
166
+ MIT License see [LICENSE](LICENSE) for details.
156
167
 
157
168
  ---
158
169
 
159
- *Local first. Works for you.*
170
+ *Local first. No surprise bills. Works for you.*
@@ -1 +1 @@
1
- {"version":3,"file":"audit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,MAAM,MAAM,GAC5B,IAAI,CA6CN"}
1
+ {"version":3,"file":"audit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,MAAM,MAAM,GAC5B,IAAI,CA6CN"}
@@ -4,6 +4,8 @@
4
4
  * Spec §5.9 "CLI Interface" — audit subcommand.
5
5
  */
6
6
  import { AuditLogger } from '../security/audit-logger.js';
7
+ import { createLogger } from '../utils/logger.js';
8
+ const log = createLogger('audit-commands');
7
9
  function parseDuration(duration) {
8
10
  const match = /^(\d+)(h|d|m)$/.exec(duration);
9
11
  if (!match)
@@ -37,7 +39,7 @@ export function registerAuditCommands(program, getAuditLogPath) {
37
39
  console.log(`Audit chain verified: ${result.entries} entries, all valid.`);
38
40
  }
39
41
  else {
40
- console.error(`Audit chain BROKEN at entry ${result.brokenAt}: ${result.reason}`);
42
+ log.error({ brokenAt: result.brokenAt, reason: result.reason }, 'Audit chain BROKEN');
41
43
  process.exitCode = 1;
42
44
  }
43
45
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"audit-commands.js","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-commands.js","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"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"}
@@ -8,12 +8,17 @@
8
8
  import path from 'node:path';
9
9
  import os from 'node:os';
10
10
  import fs from 'node:fs';
11
- import { loadConfig } from '../config/loader.js';
11
+ import crypto from 'node:crypto';
12
+ import { resolveConfig } from '../config/loader.js';
13
+ import { resolvePolicy } from '../config/policy-loader.js';
12
14
  import { Orchestrator } from '../orchestrator/orchestrator.js';
13
15
  import { DashboardServer } from '../dashboard/server.js';
14
16
  import { ClaudeProvider } from '../providers/claude-provider.js';
15
17
  import { GeminiProvider } from '../providers/gemini-provider.js';
16
18
  import { OllamaProvider } from '../providers/ollama-provider.js';
19
+ import { createLogger } from '../utils/logger.js';
20
+ import { TelegramGateway } from '../steering/telegram-gateway.js';
21
+ const log = createLogger('daemon');
17
22
  function createProviders(config) {
18
23
  const providers = [];
19
24
  for (const pConfig of config.providers) {
@@ -34,26 +39,35 @@ function createProviders(config) {
34
39
  return providers;
35
40
  }
36
41
  async function main() {
37
- const configDir = path.join(os.homedir(), '.zora');
38
- const configPath = path.join(configDir, 'config.toml');
39
- const policyPath = path.join(configDir, 'policy.toml');
40
- if (!fs.existsSync(configPath)) {
41
- console.error('Config not found. Run `zora-agent init` first.');
42
+ // Resolve project directory from env (set by CLI start command) or cwd
43
+ const projectDir = process.env.ZORA_PROJECT_DIR ?? process.cwd();
44
+ // Three-layer config resolution: defaults → global → project
45
+ let config;
46
+ let sources;
47
+ try {
48
+ const resolved = await resolveConfig({ projectDir });
49
+ config = resolved.config;
50
+ sources = resolved.sources;
51
+ }
52
+ catch (err) {
53
+ log.error({ err }, 'Config resolution failed. Run `zora-agent init` first.');
42
54
  process.exit(1);
43
55
  }
44
- const config = await loadConfig(configPath);
45
- // Load policy from TOML using centralized loader
46
- const { loadPolicy } = await import('../config/policy-loader.js');
56
+ log.info({ sources }, 'Config resolved');
57
+ // Two-layer policy resolution: global project
47
58
  let policy;
48
59
  try {
49
- policy = await loadPolicy(policyPath);
60
+ policy = await resolvePolicy({ projectDir });
50
61
  }
51
62
  catch {
52
- console.error('Policy not found at ~/.zora/policy.toml. Run `zora-agent init` first.');
63
+ log.error('Policy not found at ~/.zora/policy.toml. Run `zora-agent init` first.');
53
64
  process.exit(1);
54
65
  }
66
+ // Determine baseDir: project .zora/ if it exists, else global
67
+ const projectZora = path.join(projectDir, '.zora');
68
+ const configDir = fs.existsSync(projectZora) ? projectZora : path.join(os.homedir(), '.zora');
55
69
  const providers = createProviders(config);
56
- const orchestrator = new Orchestrator({ config, policy, providers });
70
+ const orchestrator = new Orchestrator({ config, policy, providers, baseDir: configDir });
57
71
  await orchestrator.boot();
58
72
  // Start dashboard server
59
73
  const dashboard = new DashboardServer({
@@ -63,31 +77,48 @@ async function main() {
63
77
  authMonitor: orchestrator.authMonitor,
64
78
  submitTask: async (prompt) => {
65
79
  // Generate jobId immediately and kick off task in background (don't await)
66
- const jobId = `job_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
80
+ const jobId = `job_${crypto.randomUUID()}`;
67
81
  orchestrator.submitTask({ prompt, jobId, onEvent: (event) => {
68
82
  dashboard.broadcastEvent({ type: event.type, data: event.content });
69
83
  } }).catch(err => {
70
- console.error(`[Daemon] Task ${jobId} failed:`, err);
84
+ log.error({ jobId, err }, 'Task failed');
71
85
  dashboard.broadcastEvent({ type: 'job_failed', data: { jobId, error: err instanceof Error ? err.message : String(err) } });
72
86
  });
73
87
  return jobId;
74
88
  },
75
- port: config.steering.dashboard_port ?? 7070,
89
+ port: config.steering.dashboard_port ?? 8070,
76
90
  host: process.env.ZORA_BIND_HOST,
77
91
  });
78
92
  await dashboard.start();
79
- console.log('[Daemon] Zora daemon is running.');
80
- // Graceful shutdown handler
81
- const shutdown = async (signal) => {
82
- console.log(`[Daemon] Received ${signal}, shutting down...`);
83
- try {
84
- await dashboard.stop();
85
- await orchestrator.shutdown();
93
+ // Initialize Telegram gateway if enabled and configured
94
+ let telegramGateway;
95
+ const telegramConfig = config.steering.telegram;
96
+ if (telegramConfig?.enabled) {
97
+ const token = telegramConfig.bot_token || process.env.TELEGRAM_BOT_TOKEN;
98
+ if (!token) {
99
+ log.warn('Telegram enabled but no bot_token configured and TELEGRAM_BOT_TOKEN not set. Skipping.');
86
100
  }
87
- catch (err) {
88
- console.error(`[Daemon] Error during shutdown:`, err instanceof Error ? err.message : String(err));
101
+ else {
102
+ log.warn('Telegram: Ensure you are using a dedicated bot token for this Zora instance. ' +
103
+ 'Sharing a bot token across multiple processes causes polling conflicts and lost messages.');
104
+ try {
105
+ const fullTelegramConfig = {
106
+ ...config.steering,
107
+ ...telegramConfig,
108
+ bot_token: token,
109
+ };
110
+ telegramGateway = await TelegramGateway.create(fullTelegramConfig, orchestrator.steeringManager);
111
+ log.info({ mode: telegramConfig.mode ?? 'polling' }, 'Telegram gateway started');
112
+ }
113
+ catch (err) {
114
+ log.error({ err }, 'Failed to start Telegram gateway');
115
+ }
89
116
  }
90
- // Remove pidfile
117
+ }
118
+ log.info('Zora daemon is running');
119
+ // Graceful shutdown handler with 30-second timeout
120
+ const SHUTDOWN_TIMEOUT_MS = 30_000;
121
+ const cleanupPidFile = () => {
91
122
  const pidFile = path.join(configDir, 'state', 'daemon.pid');
92
123
  try {
93
124
  fs.unlinkSync(pidFile);
@@ -95,13 +126,40 @@ async function main() {
95
126
  catch {
96
127
  // Already removed
97
128
  }
129
+ };
130
+ const shutdown = async (signal) => {
131
+ log.info({ signal }, 'Received signal, shutting down');
132
+ const graceful = async () => {
133
+ try {
134
+ if (telegramGateway) {
135
+ await telegramGateway.stop();
136
+ }
137
+ await dashboard.stop();
138
+ await orchestrator.shutdown();
139
+ }
140
+ catch (err) {
141
+ log.error({ err: err instanceof Error ? err.message : String(err) }, 'Error during shutdown');
142
+ }
143
+ };
144
+ const timeout = new Promise((_, reject) => {
145
+ setTimeout(() => reject(new Error('Shutdown timed out after 30 seconds')), SHUTDOWN_TIMEOUT_MS);
146
+ });
147
+ try {
148
+ await Promise.race([graceful(), timeout]);
149
+ }
150
+ catch (err) {
151
+ log.error({ err: err instanceof Error ? err.message : String(err) }, 'Shutdown timeout — forcing exit');
152
+ cleanupPidFile();
153
+ process.exit(1);
154
+ }
155
+ cleanupPidFile();
98
156
  process.exit(0);
99
157
  };
100
- process.on('SIGTERM', () => { shutdown('SIGTERM').catch(err => { console.error('[Daemon] Shutdown error:', err); process.exit(1); }); });
101
- process.on('SIGINT', () => { shutdown('SIGINT').catch(err => { console.error('[Daemon] Shutdown error:', err); process.exit(1); }); });
158
+ process.on('SIGTERM', () => { shutdown('SIGTERM').catch(err => { log.error({ err }, 'Shutdown error'); process.exit(1); }); });
159
+ process.on('SIGINT', () => { shutdown('SIGINT').catch(err => { log.error({ err }, 'Shutdown error'); process.exit(1); }); });
102
160
  }
103
161
  main().catch((err) => {
104
- console.error('[Daemon] Fatal error:', err);
162
+ log.fatal({ err }, 'Fatal error');
105
163
  process.exit(1);
106
164
  });
107
165
  //# sourceMappingURL=daemon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC,SAAS,eAAe,CAAC,MAAkB;IACzC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,SAAS;QAC/B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,YAAY;gBACf,SAAS,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,YAAY;gBACf,SAAS,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,QAAQ;gBACX,SAAS,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxD,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEjE,6DAA6D;IAC7D,IAAI,MAAkB,CAAC;IACvB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QACzB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,wDAAwD,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAEzC,gDAAgD;IAChD,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACzF,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAE1B,yBAAyB;IACzB,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;QACpC,SAAS;QACT,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,eAAe,EAAE,YAAY,CAAC,eAAe;QAC7C,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,UAAU,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YACnC,2EAA2E;YAC3E,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YAC3C,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC1D,SAAS,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACf,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;gBACzC,SAAS,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7H,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI;QAC5C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;KACjC,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAExB,wDAAwD;IACxD,IAAI,eAA4C,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChD,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CACN,+EAA+E;gBAC/E,2FAA2F,CAC5F,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,kBAAkB,GAAmB;oBACzC,GAAG,MAAM,CAAC,QAAQ;oBAClB,GAAG,cAAc;oBACjB,SAAS,EAAE,KAAK;iBACjB,CAAC;gBACF,eAAe,GAAG,MAAM,eAAe,CAAC,MAAM,CAC5C,kBAAkB,EAClB,YAAY,CAAC,eAAe,CAC7B,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,IAAI,SAAS,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAEnC,mDAAmD;IACnD,MAAM,mBAAmB,GAAG,MAAM,CAAC;IAEnC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC/B,CAAC;gBACD,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvB,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAChG,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;YACxG,cAAc,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/H,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/H,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAmCN"}
1
+ {"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAmCN"}
@@ -6,6 +6,8 @@
6
6
  import { spawn } from 'node:child_process';
7
7
  import path from 'node:path';
8
8
  import fs from 'node:fs';
9
+ import { createLogger } from '../utils/logger.js';
10
+ const log = createLogger('edit-commands');
9
11
  const EDITABLE_FILES = {
10
12
  config: 'config.toml',
11
13
  policy: 'policy.toml',
@@ -20,7 +22,7 @@ export function registerEditCommands(program, configDir) {
20
22
  .action(async () => {
21
23
  const filePath = path.join(configDir, filename);
22
24
  if (!fs.existsSync(filePath)) {
23
- console.error(`File not found: ${filePath}`);
25
+ log.error({ filePath }, 'File not found');
24
26
  process.exitCode = 1;
25
27
  return;
26
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,cAAc,GAA2B;IAC7C,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAAiB;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAEpE,GAAG;aACA,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,QAAQ,QAAQ,aAAa,CAAC;aAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;YAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAE3D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAC1C,MAAM,cAAc,GAA2B;IAC7C,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAAiB;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAEpE,GAAG;aACA,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,QAAQ,QAAQ,aAAa,CAAC;aAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAC1C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;YAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAE3D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Hook CLI Commands — ORCH-13
3
+ *
4
+ * Provides `zora hooks list` and `zora hooks test` commands
5
+ * for inspecting and testing registered lifecycle hooks.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerHookCommands(program: Command, configDir: string): void;
9
+ //# sourceMappingURL=hook-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-commands.d.ts","sourceRoot":"","sources":["../../src/cli/hook-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAuF9E"}