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
@@ -1,43 +1,40 @@
1
1
  /**
2
- * Logger — Structured JSON logging with file rotation.
2
+ * Logger — Structured logging with pino.
3
3
  *
4
- * Remediation R23: Replace scattered console.* calls with structured logging.
5
- * - JSON-formatted log entries with timestamp, level, message, metadata
6
- * - File rotation by size (default 10MB, keep 5 rotated files)
7
- * - Configurable log level
4
+ * OPS-05 / LOG-01: Replace ad-hoc console.log with structured pino logger.
5
+ * - JSON output in production, pretty-print in development
6
+ * - Child loggers with module context
7
+ * - Log levels configurable via config.toml log_level
8
+ * - File transport via pino (optional)
8
9
  */
9
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
10
+ import pino from 'pino';
11
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
10
12
  export interface LoggerOptions {
11
13
  level?: LogLevel;
12
- logDir?: string;
13
- logFile?: string;
14
- maxFileSize?: number;
15
- maxFiles?: number;
16
- enableConsole?: boolean;
17
- enableFile?: boolean;
14
+ /** Module name for child logger context */
15
+ module?: string;
16
+ /** Enable pretty printing (auto-detected from NODE_ENV if unset) */
17
+ pretty?: boolean;
18
18
  }
19
- export interface LogEntry {
20
- timestamp: string;
21
- level: LogLevel;
22
- message: string;
23
- meta?: Record<string, unknown>;
24
- }
25
- export declare class Logger {
26
- private readonly _level;
27
- private readonly _logFilePath;
28
- private readonly _maxFileSize;
29
- private readonly _maxFiles;
30
- private readonly _enableConsole;
31
- private readonly _enableFile;
32
- constructor(options?: LoggerOptions);
33
- debug(message: string, meta?: Record<string, unknown>): void;
34
- info(message: string, meta?: Record<string, unknown>): void;
35
- warn(message: string, meta?: Record<string, unknown>): void;
36
- error(message: string, meta?: Record<string, unknown>): void;
37
- private _log;
38
- private _writeToFile;
39
- private _rotate;
40
- }
41
- export declare function getLogger(options?: LoggerOptions): Logger;
42
- export declare function setDefaultLogger(logger: Logger): void;
19
+ /**
20
+ * Initialize the root logger. Call once at startup with the config log_level.
21
+ * Subsequent calls are no-ops unless force=true.
22
+ */
23
+ export declare function initLogger(options?: LoggerOptions, force?: boolean): pino.Logger;
24
+ /**
25
+ * Get a child logger for a specific module.
26
+ * If the root logger hasn't been initialized, initializes with defaults.
27
+ */
28
+ export declare function getLogger(module?: string): pino.Logger;
29
+ /**
30
+ * Factory: create a child logger scoped to a module name.
31
+ * Alias for getLogger(moduleName).
32
+ */
33
+ export declare const createLogger: typeof getLogger;
34
+ /** Default root logger instance. */
35
+ export declare const logger: pino.Logger<never, boolean>;
36
+ /**
37
+ * Reset the root logger (for testing).
38
+ */
39
+ export declare function resetLogger(): void;
43
40
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;gBAE1B,OAAO,GAAE,aAAkB;IAkBvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,OAAO,CAAC,IAAI;IA8BZ,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,OAAO;CA2BhB;AAKD,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAKzD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAErD"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAaD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,aAAkB,EAAE,KAAK,UAAQ,GAAG,IAAI,CAAC,MAAM,CAyBlF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAMtD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,kBAAY,CAAC;AAEtC,oCAAoC;AACpC,eAAO,MAAM,MAAM,6BAAc,CAAC;AAElC;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -1,139 +1,69 @@
1
1
  /**
2
- * Logger — Structured JSON logging with file rotation.
2
+ * Logger — Structured logging with pino.
3
3
  *
4
- * Remediation R23: Replace scattered console.* calls with structured logging.
5
- * - JSON-formatted log entries with timestamp, level, message, metadata
6
- * - File rotation by size (default 10MB, keep 5 rotated files)
7
- * - Configurable log level
4
+ * OPS-05 / LOG-01: Replace ad-hoc console.log with structured pino logger.
5
+ * - JSON output in production, pretty-print in development
6
+ * - Child loggers with module context
7
+ * - Log levels configurable via config.toml log_level
8
+ * - File transport via pino (optional)
8
9
  */
9
- import fs from 'node:fs';
10
- import path from 'node:path';
11
- import os from 'node:os';
12
- const LOG_LEVELS = {
13
- debug: 0,
14
- info: 1,
15
- warn: 2,
16
- error: 3,
17
- };
18
- export class Logger {
19
- _level;
20
- _logFilePath;
21
- _maxFileSize;
22
- _maxFiles;
23
- _enableConsole;
24
- _enableFile;
25
- constructor(options = {}) {
26
- this._level = LOG_LEVELS[options.level ?? 'info'];
27
- const logDir = options.logDir ?? path.join(os.homedir(), '.zora', 'logs');
28
- this._logFilePath = options.logFile ?? path.join(logDir, 'zora.log');
29
- this._maxFileSize = options.maxFileSize ?? 10 * 1024 * 1024; // 10MB
30
- this._maxFiles = options.maxFiles ?? 5;
31
- this._enableConsole = options.enableConsole ?? true;
32
- this._enableFile = options.enableFile ?? true;
33
- if (this._enableFile) {
34
- try {
35
- fs.mkdirSync(path.dirname(this._logFilePath), { recursive: true, mode: 0o700 });
36
- }
37
- catch {
38
- // Directory may already exist
39
- }
40
- }
41
- }
42
- debug(message, meta) {
43
- this._log('debug', message, meta);
44
- }
45
- info(message, meta) {
46
- this._log('info', message, meta);
47
- }
48
- warn(message, meta) {
49
- this._log('warn', message, meta);
50
- }
51
- error(message, meta) {
52
- this._log('error', message, meta);
53
- }
54
- _log(level, message, meta) {
55
- if (LOG_LEVELS[level] < this._level)
56
- return;
57
- const entry = {
58
- timestamp: new Date().toISOString(),
59
- level,
60
- message,
61
- ...(meta && Object.keys(meta).length > 0 ? { meta } : {}),
62
- };
63
- const line = JSON.stringify(entry);
64
- if (this._enableConsole) {
65
- switch (level) {
66
- case 'error':
67
- console.error(line);
68
- break;
69
- case 'warn':
70
- console.warn(line);
71
- break;
72
- default:
73
- console.log(line);
74
- }
75
- }
76
- if (this._enableFile) {
77
- this._writeToFile(line);
78
- }
79
- }
80
- _writeToFile(line) {
81
- try {
82
- // Check if rotation is needed
83
- try {
84
- const stats = fs.statSync(this._logFilePath);
85
- if (stats.size >= this._maxFileSize) {
86
- this._rotate();
87
- }
88
- }
89
- catch {
90
- // File doesn't exist yet, no rotation needed
91
- }
92
- fs.appendFileSync(this._logFilePath, line + '\n', { mode: 0o600 });
93
- }
94
- catch (err) {
95
- // If we can't write to the log file, fall back to stderr
96
- console.error(`[Logger] Failed to write to log file: ${err instanceof Error ? err.message : String(err)}`);
97
- }
98
- }
99
- _rotate() {
100
- try {
101
- // Remove oldest rotated file
102
- const oldest = `${this._logFilePath}.${this._maxFiles}`;
103
- try {
104
- fs.unlinkSync(oldest);
105
- }
106
- catch {
107
- // File may not exist
108
- }
109
- // Shift existing rotated files
110
- for (let i = this._maxFiles - 1; i >= 1; i--) {
111
- const from = `${this._logFilePath}.${i}`;
112
- const to = `${this._logFilePath}.${i + 1}`;
113
- try {
114
- fs.renameSync(from, to);
115
- }
116
- catch {
117
- // File may not exist
118
- }
119
- }
120
- // Rotate current file
121
- fs.renameSync(this._logFilePath, `${this._logFilePath}.1`);
122
- }
123
- catch (err) {
124
- console.error(`[Logger] Failed to rotate log files: ${err instanceof Error ? err.message : String(err)}`);
10
+ import pino from 'pino';
11
+ // Detect if we should pretty-print: dev mode or TTY
12
+ function shouldPrettyPrint() {
13
+ return (process.env.NODE_ENV !== 'production' &&
14
+ process.env.ZORA_LOG_FORMAT !== 'json' &&
15
+ (process.stdout.isTTY === true || process.env.ZORA_LOG_PRETTY === '1'));
16
+ }
17
+ let _rootLogger = null;
18
+ /**
19
+ * Initialize the root logger. Call once at startup with the config log_level.
20
+ * Subsequent calls are no-ops unless force=true.
21
+ */
22
+ export function initLogger(options = {}, force = false) {
23
+ if (_rootLogger && !force)
24
+ return _rootLogger;
25
+ const level = options.level ?? process.env.ZORA_LOG_LEVEL ?? 'info';
26
+ const pretty = options.pretty ?? shouldPrettyPrint();
27
+ const transport = pretty
28
+ ? {
29
+ target: 'pino-pretty',
30
+ options: {
31
+ colorize: true,
32
+ translateTime: 'SYS:HH:MM:ss.l',
33
+ ignore: 'pid,hostname',
34
+ },
125
35
  }
126
- }
36
+ : undefined;
37
+ _rootLogger = pino({
38
+ level,
39
+ ...(transport ? { transport } : {}),
40
+ base: { name: 'zora' },
41
+ timestamp: pino.stdTimeFunctions.isoTime,
42
+ });
43
+ return _rootLogger;
127
44
  }
128
- // Default global logger instance
129
- let _defaultLogger = null;
130
- export function getLogger(options) {
131
- if (!_defaultLogger) {
132
- _defaultLogger = new Logger(options);
45
+ /**
46
+ * Get a child logger for a specific module.
47
+ * If the root logger hasn't been initialized, initializes with defaults.
48
+ */
49
+ export function getLogger(module) {
50
+ const root = _rootLogger ?? initLogger();
51
+ if (module) {
52
+ return root.child({ module });
133
53
  }
134
- return _defaultLogger;
54
+ return root;
135
55
  }
136
- export function setDefaultLogger(logger) {
137
- _defaultLogger = logger;
56
+ /**
57
+ * Factory: create a child logger scoped to a module name.
58
+ * Alias for getLogger(moduleName).
59
+ */
60
+ export const createLogger = getLogger;
61
+ /** Default root logger instance. */
62
+ export const logger = getLogger();
63
+ /**
64
+ * Reset the root logger (for testing).
65
+ */
66
+ export function resetLogger() {
67
+ _rootLogger = null;
138
68
  }
139
69
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,oDAAoD;AACpD,SAAS,iBAAiB;IACxB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;QACtC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,IAAI,WAAW,GAAuB,IAAI,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAyB,EAAE,EAAE,KAAK,GAAG,KAAK;IACnE,IAAI,WAAW,IAAI,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC;IAE9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAK,OAAO,CAAC,GAAG,CAAC,cAA2B,IAAI,MAAM,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAErD,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,gBAAgB;gBAC/B,MAAM,EAAE,cAAc;aACvB;SACF;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,WAAW,GAAG,IAAI,CAAC;QACjB,KAAK;QACL,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACtB,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;KACzC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAe;IACvC,MAAM,IAAI,GAAG,WAAW,IAAI,UAAU,EAAE,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AAEtC,oCAAoC;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Validates that a jobId is safe for use in file paths.
3
+ * Only allows alphanumeric characters, hyphens, and underscores.
4
+ */
5
+ export declare function validateJobId(jobId: string): void;
6
+ //# sourceMappingURL=validate-job-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-job-id.d.ts","sourceRoot":"","sources":["../../src/utils/validate-job-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIjD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Validates that a jobId is safe for use in file paths.
3
+ * Only allows alphanumeric characters, hyphens, and underscores.
4
+ */
5
+ export function validateJobId(jobId) {
6
+ if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {
7
+ throw new Error(`Invalid jobId: must contain only alphanumeric characters, hyphens, and underscores`);
8
+ }
9
+ }
10
+ //# sourceMappingURL=validate-job-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-job-id.js","sourceRoot":"","sources":["../../src/utils/validate-job-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zora-agent",
3
- "version": "0.9.4",
3
+ "version": "0.9.6",
4
4
  "description": "Long-running autonomous personal AI agent — multi-provider, capability-routed, memory-enriched",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -15,7 +15,10 @@
15
15
  "examples"
16
16
  ],
17
17
  "scripts": {
18
- "build": "tsc",
18
+ "build": "tsc && npm run build:frontend",
19
+ "build:backend": "tsc",
20
+ "build:frontend": "cd src/dashboard/frontend && (test -d node_modules || npm ci --ignore-scripts) && npm run build && mkdir -p ../../../dist/dashboard/frontend && cp -r dist ../../../dist/dashboard/frontend/",
21
+ "install:frontend": "cd src/dashboard/frontend && npm install --ignore-scripts",
19
22
  "dev": "tsx src/index.ts",
20
23
  "test": "npm run test:unit && npm run test:browser",
21
24
  "test:unit": "vitest run",
@@ -48,8 +51,11 @@
48
51
  "@clack/prompts": "^1.0.1",
49
52
  "commander": "^14.0.3",
50
53
  "express": "^4.21.2",
54
+ "minisearch": "^7.2.0",
51
55
  "node-cron": "^4.2.1",
52
- "smol-toml": "^1.3.1"
56
+ "pino": "^10.3.1",
57
+ "smol-toml": "^1.3.1",
58
+ "zod": "^4.3.6"
53
59
  },
54
60
  "peerDependencies": {
55
61
  "node-telegram-bot-api": "^0.67.0"
@@ -65,7 +71,10 @@
65
71
  "@types/node": "^22.19.11",
66
72
  "@types/node-cron": "^3.0.11",
67
73
  "@types/node-telegram-bot-api": "^0.64.13",
74
+ "@types/pino": "^7.0.4",
75
+ "pino-pretty": "^13.1.3",
68
76
  "playwright": "^1.58.2",
77
+ "supertest": "^7.2.2",
69
78
  "tsx": "^4.19.0",
70
79
  "typescript": "^5.7.0",
71
80
  "vitest": "^3.0.0"