@vibesdotdev/logging 0.0.1

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 (393) hide show
  1. package/README.md +80 -0
  2. package/SPEC.md +65 -0
  3. package/dist/audit/audit.descriptor.d.ts +11 -0
  4. package/dist/audit/audit.descriptor.d.ts.map +1 -0
  5. package/dist/audit/audit.descriptor.js +40 -0
  6. package/dist/audit/audit.descriptor.js.map +1 -0
  7. package/dist/audit/audit.storage.schema.d.ts +79 -0
  8. package/dist/audit/audit.storage.schema.d.ts.map +1 -0
  9. package/dist/audit/audit.storage.schema.js +33 -0
  10. package/dist/audit/audit.storage.schema.js.map +1 -0
  11. package/dist/audit/index.d.ts +2 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit/index.js +2 -0
  14. package/dist/audit/index.js.map +1 -0
  15. package/dist/cli/logs.descriptor.d.ts +9 -0
  16. package/dist/cli/logs.descriptor.d.ts.map +1 -0
  17. package/dist/cli/logs.descriptor.js +16 -0
  18. package/dist/cli/logs.descriptor.js.map +1 -0
  19. package/dist/cli/logs.list.descriptor.d.ts +9 -0
  20. package/dist/cli/logs.list.descriptor.d.ts.map +1 -0
  21. package/dist/cli/logs.list.descriptor.js +23 -0
  22. package/dist/cli/logs.list.descriptor.js.map +1 -0
  23. package/dist/cli/logs.list.impl.d.ts +13 -0
  24. package/dist/cli/logs.list.impl.d.ts.map +1 -0
  25. package/dist/cli/logs.list.impl.js +81 -0
  26. package/dist/cli/logs.list.impl.js.map +1 -0
  27. package/dist/cli/logs.rotate.descriptor.d.ts +9 -0
  28. package/dist/cli/logs.rotate.descriptor.d.ts.map +1 -0
  29. package/dist/cli/logs.rotate.descriptor.js +34 -0
  30. package/dist/cli/logs.rotate.descriptor.js.map +1 -0
  31. package/dist/cli/logs.rotate.impl.d.ts +17 -0
  32. package/dist/cli/logs.rotate.impl.d.ts.map +1 -0
  33. package/dist/cli/logs.rotate.impl.js +48 -0
  34. package/dist/cli/logs.rotate.impl.js.map +1 -0
  35. package/dist/cli/logs.search.descriptor.d.ts +9 -0
  36. package/dist/cli/logs.search.descriptor.d.ts.map +1 -0
  37. package/dist/cli/logs.search.descriptor.js +55 -0
  38. package/dist/cli/logs.search.descriptor.js.map +1 -0
  39. package/dist/cli/logs.search.impl.d.ts +22 -0
  40. package/dist/cli/logs.search.impl.d.ts.map +1 -0
  41. package/dist/cli/logs.search.impl.js +145 -0
  42. package/dist/cli/logs.search.impl.js.map +1 -0
  43. package/dist/cli/logs.tail.descriptor.d.ts +9 -0
  44. package/dist/cli/logs.tail.descriptor.d.ts.map +1 -0
  45. package/dist/cli/logs.tail.descriptor.js +43 -0
  46. package/dist/cli/logs.tail.descriptor.js.map +1 -0
  47. package/dist/cli/logs.tail.impl.d.ts +19 -0
  48. package/dist/cli/logs.tail.impl.d.ts.map +1 -0
  49. package/dist/cli/logs.tail.impl.js +78 -0
  50. package/dist/cli/logs.tail.impl.js.map +1 -0
  51. package/dist/cli/logs.view.descriptor.d.ts +9 -0
  52. package/dist/cli/logs.view.descriptor.d.ts.map +1 -0
  53. package/dist/cli/logs.view.descriptor.js +51 -0
  54. package/dist/cli/logs.view.descriptor.js.map +1 -0
  55. package/dist/cli/logs.view.impl.d.ts +21 -0
  56. package/dist/cli/logs.view.impl.d.ts.map +1 -0
  57. package/dist/cli/logs.view.impl.js +85 -0
  58. package/dist/cli/logs.view.impl.js.map +1 -0
  59. package/dist/cli/types.d.ts +57 -0
  60. package/dist/cli/types.d.ts.map +1 -0
  61. package/dist/cli/types.js +9 -0
  62. package/dist/cli/types.js.map +1 -0
  63. package/dist/contexts/audit.d.ts +34 -0
  64. package/dist/contexts/audit.d.ts.map +1 -0
  65. package/dist/contexts/audit.js +13 -0
  66. package/dist/contexts/audit.js.map +1 -0
  67. package/dist/contexts/fallback-logger.d.ts +3 -0
  68. package/dist/contexts/fallback-logger.d.ts.map +1 -0
  69. package/dist/contexts/fallback-logger.js +67 -0
  70. package/dist/contexts/fallback-logger.js.map +1 -0
  71. package/dist/contexts/index.d.ts +8 -0
  72. package/dist/contexts/index.d.ts.map +1 -0
  73. package/dist/contexts/index.js +9 -0
  74. package/dist/contexts/index.js.map +1 -0
  75. package/dist/contexts/logger.d.ts +26 -0
  76. package/dist/contexts/logger.d.ts.map +1 -0
  77. package/dist/contexts/logger.js +88 -0
  78. package/dist/contexts/logger.js.map +1 -0
  79. package/dist/core/index.d.ts +9 -0
  80. package/dist/core/index.d.ts.map +1 -0
  81. package/dist/core/index.js +10 -0
  82. package/dist/core/index.js.map +1 -0
  83. package/dist/core/logger.d.ts +3 -0
  84. package/dist/core/logger.d.ts.map +1 -0
  85. package/dist/core/logger.js +118 -0
  86. package/dist/core/logger.js.map +1 -0
  87. package/dist/core/namespace.d.ts +69 -0
  88. package/dist/core/namespace.d.ts.map +1 -0
  89. package/dist/core/namespace.js +136 -0
  90. package/dist/core/namespace.js.map +1 -0
  91. package/dist/core/parsing.d.ts +3 -0
  92. package/dist/core/parsing.d.ts.map +1 -0
  93. package/dist/core/parsing.js +25 -0
  94. package/dist/core/parsing.js.map +1 -0
  95. package/dist/core/types.d.ts +69 -0
  96. package/dist/core/types.d.ts.map +1 -0
  97. package/dist/core/types.js +7 -0
  98. package/dist/core/types.js.map +1 -0
  99. package/dist/docs/levels.docs.descriptor.d.ts +4 -0
  100. package/dist/docs/levels.docs.descriptor.d.ts.map +1 -0
  101. package/dist/docs/levels.docs.descriptor.js +342 -0
  102. package/dist/docs/levels.docs.descriptor.js.map +1 -0
  103. package/dist/docs/structured.docs.descriptor.d.ts +4 -0
  104. package/dist/docs/structured.docs.descriptor.d.ts.map +1 -0
  105. package/dist/docs/structured.docs.descriptor.js +442 -0
  106. package/dist/docs/structured.docs.descriptor.js.map +1 -0
  107. package/dist/docs/transports.docs.descriptor.d.ts +4 -0
  108. package/dist/docs/transports.docs.descriptor.d.ts.map +1 -0
  109. package/dist/docs/transports.docs.descriptor.js +426 -0
  110. package/dist/docs/transports.docs.descriptor.js.map +1 -0
  111. package/dist/formatters/index.d.ts +7 -0
  112. package/dist/formatters/index.d.ts.map +1 -0
  113. package/dist/formatters/index.js +8 -0
  114. package/dist/formatters/index.js.map +1 -0
  115. package/dist/formatters/json/json.formatters.descriptor.d.ts +9 -0
  116. package/dist/formatters/json/json.formatters.descriptor.d.ts.map +1 -0
  117. package/dist/formatters/json/json.formatters.descriptor.js +22 -0
  118. package/dist/formatters/json/json.formatters.descriptor.js.map +1 -0
  119. package/dist/formatters/json/json.impl.d.ts +22 -0
  120. package/dist/formatters/json/json.impl.d.ts.map +1 -0
  121. package/dist/formatters/json/json.impl.js +32 -0
  122. package/dist/formatters/json/json.impl.js.map +1 -0
  123. package/dist/formatters/json5/json5.descriptor.d.ts +9 -0
  124. package/dist/formatters/json5/json5.descriptor.d.ts.map +1 -0
  125. package/dist/formatters/json5/json5.descriptor.js +22 -0
  126. package/dist/formatters/json5/json5.descriptor.js.map +1 -0
  127. package/dist/formatters/json5/json5.impl.d.ts +23 -0
  128. package/dist/formatters/json5/json5.impl.d.ts.map +1 -0
  129. package/dist/formatters/json5/json5.impl.js +34 -0
  130. package/dist/formatters/json5/json5.impl.js.map +1 -0
  131. package/dist/formatters/jsonl/jsonl.descriptor.d.ts +10 -0
  132. package/dist/formatters/jsonl/jsonl.descriptor.d.ts.map +1 -0
  133. package/dist/formatters/jsonl/jsonl.descriptor.js +23 -0
  134. package/dist/formatters/jsonl/jsonl.descriptor.js.map +1 -0
  135. package/dist/formatters/jsonl/jsonl.impl.d.ts +21 -0
  136. package/dist/formatters/jsonl/jsonl.impl.d.ts.map +1 -0
  137. package/dist/formatters/jsonl/jsonl.impl.js +30 -0
  138. package/dist/formatters/jsonl/jsonl.impl.js.map +1 -0
  139. package/dist/formatters/pretty/pretty.descriptor.d.ts +9 -0
  140. package/dist/formatters/pretty/pretty.descriptor.d.ts.map +1 -0
  141. package/dist/formatters/pretty/pretty.descriptor.js +23 -0
  142. package/dist/formatters/pretty/pretty.descriptor.js.map +1 -0
  143. package/dist/formatters/pretty/pretty.impl.cli.d.ts +23 -0
  144. package/dist/formatters/pretty/pretty.impl.cli.d.ts.map +1 -0
  145. package/dist/formatters/pretty/pretty.impl.cli.js +81 -0
  146. package/dist/formatters/pretty/pretty.impl.cli.js.map +1 -0
  147. package/dist/index.d.ts +67 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +97 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/kinds/audit.d.ts +85 -0
  152. package/dist/kinds/audit.d.ts.map +1 -0
  153. package/dist/kinds/audit.js +71 -0
  154. package/dist/kinds/audit.js.map +1 -0
  155. package/dist/kinds/contexts.d.ts +21 -0
  156. package/dist/kinds/contexts.d.ts.map +1 -0
  157. package/dist/kinds/contexts.js +8 -0
  158. package/dist/kinds/contexts.js.map +1 -0
  159. package/dist/kinds/formatter.d.ts +42 -0
  160. package/dist/kinds/formatter.d.ts.map +1 -0
  161. package/dist/kinds/formatter.js +69 -0
  162. package/dist/kinds/formatter.js.map +1 -0
  163. package/dist/kinds/index.d.ts +13 -0
  164. package/dist/kinds/index.d.ts.map +1 -0
  165. package/dist/kinds/index.js +13 -0
  166. package/dist/kinds/index.js.map +1 -0
  167. package/dist/kinds/logger.contracts.d.ts +16 -0
  168. package/dist/kinds/logger.contracts.d.ts.map +1 -0
  169. package/dist/kinds/logger.contracts.js +9 -0
  170. package/dist/kinds/logger.contracts.js.map +1 -0
  171. package/dist/kinds/logger.d.ts +15 -0
  172. package/dist/kinds/logger.d.ts.map +1 -0
  173. package/dist/kinds/logger.impl.d.ts +40 -0
  174. package/dist/kinds/logger.impl.d.ts.map +1 -0
  175. package/dist/kinds/logger.impl.js +139 -0
  176. package/dist/kinds/logger.impl.js.map +1 -0
  177. package/dist/kinds/logger.js +28 -0
  178. package/dist/kinds/logger.js.map +1 -0
  179. package/dist/kinds/logger.utils.d.ts +15 -0
  180. package/dist/kinds/logger.utils.d.ts.map +1 -0
  181. package/dist/kinds/logger.utils.js +55 -0
  182. package/dist/kinds/logger.utils.js.map +1 -0
  183. package/dist/kinds/output.contracts.d.ts +50 -0
  184. package/dist/kinds/output.contracts.d.ts.map +1 -0
  185. package/dist/kinds/output.contracts.js +10 -0
  186. package/dist/kinds/output.contracts.js.map +1 -0
  187. package/dist/kinds/output.d.ts +20 -0
  188. package/dist/kinds/output.d.ts.map +1 -0
  189. package/dist/kinds/output.impl.d.ts +22 -0
  190. package/dist/kinds/output.impl.d.ts.map +1 -0
  191. package/dist/kinds/output.impl.js +84 -0
  192. package/dist/kinds/output.impl.js.map +1 -0
  193. package/dist/kinds/output.js +29 -0
  194. package/dist/kinds/output.js.map +1 -0
  195. package/dist/kinds/output.types.d.ts +92 -0
  196. package/dist/kinds/output.types.d.ts.map +1 -0
  197. package/dist/kinds/output.types.js +7 -0
  198. package/dist/kinds/output.types.js.map +1 -0
  199. package/dist/kinds/sink.d.ts +40 -0
  200. package/dist/kinds/sink.d.ts.map +1 -0
  201. package/dist/kinds/sink.js +61 -0
  202. package/dist/kinds/sink.js.map +1 -0
  203. package/dist/logger.context.descriptor.d.ts +21 -0
  204. package/dist/logger.context.descriptor.d.ts.map +1 -0
  205. package/dist/logger.context.descriptor.js +12 -0
  206. package/dist/logger.context.descriptor.js.map +1 -0
  207. package/dist/logging.cli.plugin.d.ts +20 -0
  208. package/dist/logging.cli.plugin.d.ts.map +1 -0
  209. package/dist/logging.cli.plugin.js +39 -0
  210. package/dist/logging.cli.plugin.js.map +1 -0
  211. package/dist/logging.plugin.d.ts +16 -0
  212. package/dist/logging.plugin.d.ts.map +1 -0
  213. package/dist/logging.plugin.js +83 -0
  214. package/dist/logging.plugin.js.map +1 -0
  215. package/dist/outputs/index.d.ts +7 -0
  216. package/dist/outputs/index.d.ts.map +1 -0
  217. package/dist/outputs/index.js +8 -0
  218. package/dist/outputs/index.js.map +1 -0
  219. package/dist/outputs/remote/remote.descriptor.d.ts +10 -0
  220. package/dist/outputs/remote/remote.descriptor.d.ts.map +1 -0
  221. package/dist/outputs/remote/remote.descriptor.js +24 -0
  222. package/dist/outputs/remote/remote.descriptor.js.map +1 -0
  223. package/dist/outputs/remote/remote.impl.d.ts +50 -0
  224. package/dist/outputs/remote/remote.impl.d.ts.map +1 -0
  225. package/dist/outputs/remote/remote.impl.js +178 -0
  226. package/dist/outputs/remote/remote.impl.js.map +1 -0
  227. package/dist/outputs.context.descriptor.d.ts +19 -0
  228. package/dist/outputs.context.descriptor.d.ts.map +1 -0
  229. package/dist/outputs.context.descriptor.js +9 -0
  230. package/dist/outputs.context.descriptor.js.map +1 -0
  231. package/dist/outputs.context.impl.d.ts +9 -0
  232. package/dist/outputs.context.impl.d.ts.map +1 -0
  233. package/dist/outputs.context.impl.js +18 -0
  234. package/dist/outputs.context.impl.js.map +1 -0
  235. package/dist/paths.d.ts +8 -0
  236. package/dist/paths.d.ts.map +1 -0
  237. package/dist/paths.js +10 -0
  238. package/dist/paths.js.map +1 -0
  239. package/dist/schemas/audit.d.ts +133 -0
  240. package/dist/schemas/audit.d.ts.map +1 -0
  241. package/dist/schemas/audit.js +80 -0
  242. package/dist/schemas/audit.js.map +1 -0
  243. package/dist/schemas/entry.d.ts +74 -0
  244. package/dist/schemas/entry.d.ts.map +1 -0
  245. package/dist/schemas/entry.js +62 -0
  246. package/dist/schemas/entry.js.map +1 -0
  247. package/dist/schemas/formatter.d.ts +46 -0
  248. package/dist/schemas/formatter.d.ts.map +1 -0
  249. package/dist/schemas/formatter.js +31 -0
  250. package/dist/schemas/formatter.js.map +1 -0
  251. package/dist/schemas/index.d.ts +12 -0
  252. package/dist/schemas/index.d.ts.map +1 -0
  253. package/dist/schemas/index.js +18 -0
  254. package/dist/schemas/index.js.map +1 -0
  255. package/dist/schemas/logger.d.ts +48 -0
  256. package/dist/schemas/logger.d.ts.map +1 -0
  257. package/dist/schemas/logger.js +27 -0
  258. package/dist/schemas/logger.js.map +1 -0
  259. package/dist/schemas/output.d.ts +68 -0
  260. package/dist/schemas/output.d.ts.map +1 -0
  261. package/dist/schemas/output.js +48 -0
  262. package/dist/schemas/output.js.map +1 -0
  263. package/dist/schemas/sink.d.ts +52 -0
  264. package/dist/schemas/sink.d.ts.map +1 -0
  265. package/dist/schemas/sink.js +30 -0
  266. package/dist/schemas/sink.js.map +1 -0
  267. package/dist/sinks/buffer/buffer.descriptor.d.ts +4 -0
  268. package/dist/sinks/buffer/buffer.descriptor.d.ts.map +1 -0
  269. package/dist/sinks/buffer/buffer.descriptor.js +11 -0
  270. package/dist/sinks/buffer/buffer.descriptor.js.map +1 -0
  271. package/dist/sinks/buffer/buffer.impl.cli.d.ts +21 -0
  272. package/dist/sinks/buffer/buffer.impl.cli.d.ts.map +1 -0
  273. package/dist/sinks/buffer/buffer.impl.cli.js +34 -0
  274. package/dist/sinks/buffer/buffer.impl.cli.js.map +1 -0
  275. package/dist/sinks/console/console.descriptor.d.ts +10 -0
  276. package/dist/sinks/console/console.descriptor.d.ts.map +1 -0
  277. package/dist/sinks/console/console.descriptor.js +17 -0
  278. package/dist/sinks/console/console.descriptor.js.map +1 -0
  279. package/dist/sinks/console/console.impl.browser.d.ts +21 -0
  280. package/dist/sinks/console/console.impl.browser.d.ts.map +1 -0
  281. package/dist/sinks/console/console.impl.browser.js +57 -0
  282. package/dist/sinks/console/console.impl.browser.js.map +1 -0
  283. package/dist/sinks/console/console.impl.cli.d.ts +21 -0
  284. package/dist/sinks/console/console.impl.cli.d.ts.map +1 -0
  285. package/dist/sinks/console/console.impl.cli.js +57 -0
  286. package/dist/sinks/console/console.impl.cli.js.map +1 -0
  287. package/dist/sinks/index.d.ts +8 -0
  288. package/dist/sinks/index.d.ts.map +1 -0
  289. package/dist/sinks/index.js +8 -0
  290. package/dist/sinks/index.js.map +1 -0
  291. package/dist/sinks/memory/memory.descriptor.d.ts +10 -0
  292. package/dist/sinks/memory/memory.descriptor.d.ts.map +1 -0
  293. package/dist/sinks/memory/memory.descriptor.js +17 -0
  294. package/dist/sinks/memory/memory.descriptor.js.map +1 -0
  295. package/dist/sinks/memory/memory.impl.d.ts +50 -0
  296. package/dist/sinks/memory/memory.impl.d.ts.map +1 -0
  297. package/dist/sinks/memory/memory.impl.js +88 -0
  298. package/dist/sinks/memory/memory.impl.js.map +1 -0
  299. package/dist/sinks/stdout/stdout.descriptor.d.ts +4 -0
  300. package/dist/sinks/stdout/stdout.descriptor.d.ts.map +1 -0
  301. package/dist/sinks/stdout/stdout.descriptor.js +11 -0
  302. package/dist/sinks/stdout/stdout.descriptor.js.map +1 -0
  303. package/dist/sinks/stdout/stdout.impl.cli.d.ts +10 -0
  304. package/dist/sinks/stdout/stdout.impl.cli.d.ts.map +1 -0
  305. package/dist/sinks/stdout/stdout.impl.cli.js +21 -0
  306. package/dist/sinks/stdout/stdout.impl.cli.js.map +1 -0
  307. package/dist/sinks.context.descriptor.d.ts +19 -0
  308. package/dist/sinks.context.descriptor.d.ts.map +1 -0
  309. package/dist/sinks.context.descriptor.js +9 -0
  310. package/dist/sinks.context.descriptor.js.map +1 -0
  311. package/dist/sinks.context.impl.d.ts +9 -0
  312. package/dist/sinks.context.impl.d.ts.map +1 -0
  313. package/dist/sinks.context.impl.js +18 -0
  314. package/dist/sinks.context.impl.js.map +1 -0
  315. package/package.json +331 -0
  316. package/src/audit/audit.descriptor.ts +45 -0
  317. package/src/audit/audit.storage.schema.ts +57 -0
  318. package/src/audit/index.ts +8 -0
  319. package/src/cli/logs.descriptor.ts +19 -0
  320. package/src/cli/logs.list.descriptor.ts +28 -0
  321. package/src/cli/logs.list.impl.ts +93 -0
  322. package/src/cli/logs.rotate.descriptor.ts +40 -0
  323. package/src/cli/logs.rotate.impl.ts +61 -0
  324. package/src/cli/logs.search.descriptor.ts +61 -0
  325. package/src/cli/logs.search.impl.ts +173 -0
  326. package/src/cli/logs.tail.descriptor.ts +49 -0
  327. package/src/cli/logs.tail.impl.ts +105 -0
  328. package/src/cli/logs.view.descriptor.ts +57 -0
  329. package/src/cli/logs.view.impl.ts +108 -0
  330. package/src/cli/types.ts +59 -0
  331. package/src/contexts/audit.ts +36 -0
  332. package/src/contexts/fallback-logger.ts +80 -0
  333. package/src/contexts/index.ts +23 -0
  334. package/src/contexts/logger.ts +119 -0
  335. package/src/core/index.ts +32 -0
  336. package/src/core/logger.ts +150 -0
  337. package/src/core/namespace.ts +195 -0
  338. package/src/core/parsing.ts +21 -0
  339. package/src/core/types.ts +82 -0
  340. package/src/docs/levels.docs.descriptor.ts +344 -0
  341. package/src/docs/structured.docs.descriptor.ts +444 -0
  342. package/src/docs/transports.docs.descriptor.ts +428 -0
  343. package/src/formatters/index.ts +6 -0
  344. package/src/formatters/json/json.formatters.descriptor.ts +25 -0
  345. package/src/formatters/json/json.impl.ts +41 -0
  346. package/src/formatters/json5/json5.descriptor.ts +25 -0
  347. package/src/formatters/json5/json5.impl.ts +43 -0
  348. package/src/formatters/jsonl/jsonl.descriptor.ts +26 -0
  349. package/src/formatters/jsonl/jsonl.impl.ts +39 -0
  350. package/src/formatters/pretty/pretty.descriptor.ts +26 -0
  351. package/src/formatters/pretty/pretty.impl.cli.ts +101 -0
  352. package/src/index.ts +190 -0
  353. package/src/kinds/audit.ts +169 -0
  354. package/src/kinds/contexts.ts +22 -0
  355. package/src/kinds/formatter.ts +117 -0
  356. package/src/kinds/index.ts +25 -0
  357. package/src/kinds/logger.contracts.ts +17 -0
  358. package/src/kinds/logger.impl.ts +206 -0
  359. package/src/kinds/logger.ts +46 -0
  360. package/src/kinds/logger.utils.ts +91 -0
  361. package/src/kinds/output.contracts.ts +54 -0
  362. package/src/kinds/output.impl.ts +118 -0
  363. package/src/kinds/output.ts +59 -0
  364. package/src/kinds/output.types.ts +105 -0
  365. package/src/kinds/sink.ts +100 -0
  366. package/src/logger.context.descriptor.ts +13 -0
  367. package/src/logging.cli.plugin.ts +43 -0
  368. package/src/logging.plugin.ts +93 -0
  369. package/src/outputs/index.ts +6 -0
  370. package/src/outputs/remote/remote.descriptor.ts +27 -0
  371. package/src/outputs/remote/remote.impl.ts +218 -0
  372. package/src/outputs.context.descriptor.ts +10 -0
  373. package/src/outputs.context.impl.ts +30 -0
  374. package/src/paths.ts +10 -0
  375. package/src/schemas/audit.ts +98 -0
  376. package/src/schemas/entry.ts +88 -0
  377. package/src/schemas/formatter.ts +37 -0
  378. package/src/schemas/index.ts +80 -0
  379. package/src/schemas/logger.ts +38 -0
  380. package/src/schemas/output.ts +62 -0
  381. package/src/schemas/sink.ts +39 -0
  382. package/src/sinks/buffer/buffer.descriptor.ts +13 -0
  383. package/src/sinks/buffer/buffer.impl.cli.ts +49 -0
  384. package/src/sinks/console/console.descriptor.ts +20 -0
  385. package/src/sinks/console/console.impl.browser.ts +69 -0
  386. package/src/sinks/console/console.impl.cli.ts +71 -0
  387. package/src/sinks/index.ts +8 -0
  388. package/src/sinks/memory/memory.descriptor.ts +20 -0
  389. package/src/sinks/memory/memory.impl.ts +119 -0
  390. package/src/sinks/stdout/stdout.descriptor.ts +13 -0
  391. package/src/sinks/stdout/stdout.impl.cli.ts +27 -0
  392. package/src/sinks.context.descriptor.ts +10 -0
  393. package/src/sinks.context.impl.ts +30 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Logging Sink Kind Definition
3
+ *
4
+ * Sinks are output destinations for log entries.
5
+ */
6
+
7
+ import type { RuntimeKindDescriptor, KindContext, RuntimeDescriptor } from '@vibesdotdev/runtime/schemas/kind';
8
+ import type { RuntimeScope } from '@vibesdotdev/runtime/schemas/scope';
9
+ import { SinkDescriptorSchema, type SinkDescriptor } from '../schemas/sink.ts';
10
+ import type { RuntimeLogEntry } from '../schemas/entry.ts';
11
+
12
+ /**
13
+ * Sink implementation interface.
14
+ * Implementations emit log entries to their destination.
15
+ */
16
+ export interface SinkImplementation {
17
+ /** Emit a log entry to this sink */
18
+ emit(entry: RuntimeLogEntry): void | Promise<void>;
19
+ /** Flush any buffered entries */
20
+ flush?(): Promise<void>;
21
+ /** Close the sink and release resources */
22
+ close?(): Promise<void>;
23
+ }
24
+
25
+ /**
26
+ * Context provided to sink implementations.
27
+ */
28
+ export interface SinkContext extends KindContext {
29
+ /** Runtime reference */
30
+ readonly runtime: unknown;
31
+ }
32
+
33
+ /**
34
+ * Default sink implementation - console output.
35
+ * Used when no specific implementation is registered.
36
+ */
37
+ class DefaultSinkImplementation implements SinkImplementation {
38
+ readonly id: string;
39
+ readonly descriptor: SinkDescriptor;
40
+
41
+ constructor(descriptor: RuntimeDescriptor, _context: SinkContext) {
42
+ this.id = descriptor.id;
43
+ this.descriptor = descriptor as SinkDescriptor;
44
+ }
45
+
46
+ emit(entry: RuntimeLogEntry): void {
47
+ const { level, namespace, message, context } = entry;
48
+ const prefix = `[${namespace}]`;
49
+ const payload = JSON.stringify(context);
50
+ const line = `[${level.toUpperCase()}] ${prefix} ${message} ${payload}`;
51
+ console.error(line);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Sink kind resolution logic.
57
+ * Selects sink based on hardware compatibility.
58
+ */
59
+ function resolveSink(
60
+ candidates: RuntimeDescriptor[],
61
+ scope: RuntimeScope,
62
+ _context: KindContext
63
+ ): SinkDescriptor | undefined {
64
+ const typed = candidates as SinkDescriptor[];
65
+ if (typed.length === 0) return undefined;
66
+ if (typed.length === 1) return typed[0];
67
+
68
+ const hardware = scope.hardware;
69
+
70
+ // Filter by hardware compatibility
71
+ const matching = typed.filter((d) => {
72
+ if (!d.hardware || d.hardware.length === 0) return true;
73
+ return d.hardware.includes(hardware);
74
+ });
75
+
76
+ if (matching.length === 0) return undefined;
77
+
78
+ // Prefer sinks with explicit hardware match
79
+ const explicit = matching.filter((d) => d.hardware && d.hardware.length > 0);
80
+ if (explicit.length > 0) return explicit[0];
81
+
82
+ return matching[0];
83
+ }
84
+
85
+ /**
86
+ * Sink kind definition for runtime registration.
87
+ */
88
+ export const sinkKind: RuntimeKindDescriptor<SinkDescriptor, SinkImplementation, SinkContext> = {
89
+ id: 'logging/sink',
90
+ descriptorSchema: SinkDescriptorSchema,
91
+ defaultImplementation: DefaultSinkImplementation,
92
+ resolve: resolveSink,
93
+ contexts: []
94
+ };
95
+
96
+ declare module '@vibesdotdev/runtime/schemas/kind-types' {
97
+ interface KindTypeMap {
98
+ 'logging/sink': { descriptor: SinkDescriptor; impl: SinkImplementation };
99
+ }
100
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CLI Logger Context Descriptor
3
+ *
4
+ * Provides logger instance for CLI surface.
5
+ */
6
+
7
+ import { createContextDescriptor } from '@vibesdotdev/runtime/factory/context';
8
+
9
+ export default createContextDescriptor({
10
+ id: 'cli/logger',
11
+ description: 'Logger instance for CLI and terminal output.',
12
+ hardware: ['consumer']
13
+ });
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Logging CLI Slice Plugin
3
+ *
4
+ * Registers the `vibes logs *` CLI surface (group + commands) against the
5
+ * `cli/group` and `cli/command` kinds owned by `@vibesdotdev/cli`.
6
+ *
7
+ * Per docs/architecture/RUNTIME-FIRST-MODULES.md §What Surfaces Are Allowed To Do
8
+ * and §Plugin Composition Rules, CLI is a surface adapter. The core
9
+ * `@vibesdotdev/logging/plugin` registers logging kinds and sinks/formatters/
10
+ * outputs that every consumer needs; this slice plugin layers the CLI surface
11
+ * on top so SSR/web/worker apps can consume logging without dragging the CLI
12
+ * machinery into their plugin chain.
13
+ *
14
+ * Apps that ship a CLI surface (account, ai, tools, cli-bin, etc.) should
15
+ * include both `@vibesdotdev/cli/cli.plugin` and `@vibesdotdev/logging/cli.plugin`
16
+ * after the core logging plugin in their `vibes.config.ts`.
17
+ */
18
+
19
+ import { createRuntimePlugin, loader } from '@vibesdotdev/runtime';
20
+
21
+ import logsGroup from './cli/logs.descriptor';
22
+ import logsList from './cli/logs.list.descriptor';
23
+ import logsSearch from './cli/logs.search.descriptor';
24
+ import logsTail from './cli/logs.tail.descriptor';
25
+ import logsRotate from './cli/logs.rotate.descriptor';
26
+ import logsView from './cli/logs.view.descriptor';
27
+
28
+ export default createRuntimePlugin({
29
+ id: 'logging.cli',
30
+ name: 'Logging CLI Surface',
31
+ description: '`vibes logs *` CLI commands for viewing, searching, tailing, rotating logs',
32
+ dependencies: ['logging', 'cli'],
33
+
34
+ descriptors: [logsGroup, logsList, logsSearch, logsTail, logsRotate, logsView],
35
+
36
+ loaders: [
37
+ loader('logs.list', { kind: 'cli/command' }, () => import('./cli/logs.list.impl.ts')),
38
+ loader('logs.search', { kind: 'cli/command' }, () => import('./cli/logs.search.impl.ts')),
39
+ loader('logs.tail', { kind: 'cli/command' }, () => import('./cli/logs.tail.impl.ts')),
40
+ loader('logs.rotate', { kind: 'cli/command' }, () => import('./cli/logs.rotate.impl.ts')),
41
+ loader('logs.view', { kind: 'cli/command' }, () => import('./cli/logs.view.impl.ts'))
42
+ ]
43
+ });
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Logging Plugin
3
+ *
4
+ * Registers logging kinds (sink, formatter, output, audit, logger) with the
5
+ * runtime. Context providers for 'logging/sinks' and 'logging/outputs' are
6
+ * autoloaded.
7
+ *
8
+ * Surface-neutral: depends only on `context`. Apps that ship a CLI surface
9
+ * (cli-bin, account, ai, tools) layer `@vibesdotdev/logging/cli.plugin` on
10
+ * top to register the `vibes logs *` commands. SSR/web/worker apps where
11
+ * `@vibesdotdev/cli` is shimmed out by the cloud build must NOT pull in the
12
+ * CLI slice — see logging.cli.plugin.ts.
13
+ */
14
+
15
+ import {
16
+ createRuntimePlugin,
17
+ type AnyRuntimeKindDescriptor
18
+ } from '@vibesdotdev/runtime';
19
+ import { loader } from '@vibesdotdev/runtime';
20
+ import { sinkKind, formatterKind, outputKind, auditKind, loggerKind } from './kinds/index.ts';
21
+ import sinksContextDescriptor from './sinks.context.descriptor';
22
+ import outputsContextDescriptor from './outputs.context.descriptor';
23
+ import cliLoggerContextDescriptor from './logger.context.descriptor';
24
+ import consoleSinkDescriptor from './sinks/console/console.descriptor';
25
+ import bufferSinkDescriptor from './sinks/buffer/buffer.descriptor';
26
+ import stdoutSinkDescriptor from './sinks/stdout/stdout.descriptor';
27
+ import memorySinkDescriptor from './sinks/memory/memory.descriptor';
28
+ import prettyFormatterDescriptor from './formatters/pretty/pretty.descriptor';
29
+ import json5FormatterDescriptor from './formatters/json5/json5.descriptor';
30
+ import jsonlFormatterDescriptor from './formatters/jsonl/jsonl.descriptor';
31
+ import jsonFormatterDescriptor from './formatters/json/json.formatters.descriptor';
32
+ import remoteOutputDescriptor from './outputs/remote/remote.descriptor';
33
+ import defaultAuditDescriptor, { authenticationAuditDescriptor, securityAuditDescriptor } from './audit/audit.descriptor';
34
+
35
+ // Docs
36
+ import levelsDescriptor from './docs/levels.docs.descriptor';
37
+ import transportsDescriptor from './docs/transports.docs.descriptor';
38
+ import structuredDescriptor from './docs/structured.docs.descriptor';
39
+
40
+ export default createRuntimePlugin({
41
+ id: 'logging',
42
+ name: 'Logging Module',
43
+ description: 'Structured logging with sinks, formatters, outputs, and audit trails',
44
+ dependencies: ['context'],
45
+
46
+ // Cast required: kind descriptors use specific TDescriptor types which are
47
+ // contravariant in the defaultImplementation constructor parameter.
48
+ kinds: [
49
+ sinkKind,
50
+ formatterKind,
51
+ outputKind,
52
+ auditKind,
53
+ loggerKind
54
+ ] as AnyRuntimeKindDescriptor[],
55
+
56
+ descriptors: [
57
+ sinksContextDescriptor,
58
+ outputsContextDescriptor,
59
+ cliLoggerContextDescriptor,
60
+ consoleSinkDescriptor,
61
+ bufferSinkDescriptor,
62
+ stdoutSinkDescriptor,
63
+ memorySinkDescriptor,
64
+ prettyFormatterDescriptor,
65
+ json5FormatterDescriptor,
66
+ jsonlFormatterDescriptor,
67
+ jsonFormatterDescriptor,
68
+ remoteOutputDescriptor,
69
+ defaultAuditDescriptor,
70
+ authenticationAuditDescriptor,
71
+ securityAuditDescriptor,
72
+ levelsDescriptor,
73
+ transportsDescriptor,
74
+ structuredDescriptor
75
+ ],
76
+
77
+ loaders: [
78
+ loader(sinksContextDescriptor.id, { kind: 'context' }, () => import('./sinks.context.impl.ts')),
79
+ loader(outputsContextDescriptor.id, { kind: 'context' }, () =>
80
+ import('./outputs.context.impl.ts')
81
+ ),
82
+ loader('console', { kind: 'logging/sink' }, () => import('./sinks/console/console.impl.cli.ts')),
83
+ loader('console', { kind: 'logging/sink', scope: 'browser' }, () => import('./sinks/console/console.impl.browser.ts')),
84
+ loader('buffer', { kind: 'logging/sink' }, () => import('./sinks/buffer/buffer.impl.cli.ts')),
85
+ loader('stdout', { kind: 'logging/sink' }, () => import('./sinks/stdout/stdout.impl.cli.ts')),
86
+ loader('memory', { kind: 'logging/sink' }, () => import('./sinks/memory/memory.impl.ts')),
87
+ loader('pretty', { kind: 'logging/formatter' }, () => import('./formatters/pretty/pretty.impl.cli.ts')),
88
+ loader('json5', { kind: 'logging/formatter' }, () => import('./formatters/json5/json5.impl.ts')),
89
+ loader('jsonl', { kind: 'logging/formatter' }, () => import('./formatters/jsonl/jsonl.impl.ts')),
90
+ loader('json', { kind: 'logging/formatter' }, () => import('./formatters/json/json.impl.ts')),
91
+ loader('remote', { kind: 'logging/output' }, () => import('./outputs/remote/remote.impl.ts'))
92
+ ]
93
+ });
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Logging Outputs
3
+ *
4
+ * Descriptors and implementations are autoloaded by the runtime.
5
+ * No public API — use the runtime to resolve output implementations.
6
+ */
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Remote Output Descriptor
3
+ *
4
+ * Sends logs to a remote HTTP endpoint.
5
+ * Cloud hardware target.
6
+ */
7
+
8
+ import type { OutputDescriptor } from '../../schemas/output.ts';
9
+
10
+ export const remoteOutputDescriptor: OutputDescriptor = {
11
+ kind: 'logging/output',
12
+ id: 'remote',
13
+ name: 'Remote Output',
14
+ description: 'Sends logs to a remote HTTP endpoint',
15
+ tags: ['cloud', 'centralized'],
16
+ hardware: ['cloud'],
17
+ storage: 'remote',
18
+ format: 'jsonl',
19
+ buffering: {
20
+ enabled: true,
21
+ size: 16384,
22
+ flushInterval: 5000,
23
+ maxBufferEntries: 5000
24
+ }
25
+ };
26
+
27
+ export default remoteOutputDescriptor;
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Remote Output Implementation
3
+ *
4
+ * Batched HTTP delivery to a logging endpoint.
5
+ */
6
+
7
+ import type {
8
+ OutputImplementation,
9
+ OutputContext,
10
+ OutputReadOptions,
11
+ OutputTailOptions,
12
+ TailHandle,
13
+ OutputStats
14
+ } from '../../kinds/output.ts';
15
+ import type { OutputDescriptor, OutputBuffering } from '../../schemas/output.ts';
16
+ import type { RuntimeLogEntry } from '../../schemas/entry.ts';
17
+ import type { FormatterImplementation } from '../../kinds/formatter.ts';
18
+ import { getDefaultLogger } from '../../contexts/logger.ts';
19
+ const logger = getDefaultLogger();
20
+
21
+ /** Default remote endpoint */
22
+ const DEFAULT_ENDPOINT = 'http://localhost:3000/api/logs';
23
+
24
+ /** Metrics for buffer operations */
25
+ interface BufferMetrics {
26
+ /** Total entries added to buffer */
27
+ added: number;
28
+ /** Total entries sent successfully */
29
+ sent: number;
30
+ /** Total entries dropped due to buffer overflow */
31
+ dropped: number;
32
+ /** Total failed sends that were re-buffered for retry */
33
+ retried: number;
34
+ }
35
+
36
+ /**
37
+ * Remote output - sends logs via HTTP.
38
+ */
39
+ export default class RemoteOutput implements OutputImplementation {
40
+ readonly id: string;
41
+ readonly descriptor: OutputDescriptor;
42
+ private readonly formatter: FormatterImplementation;
43
+ private readonly endpoint: string;
44
+ private readonly buffering: OutputBuffering;
45
+ private readonly maxBufferEntries: number;
46
+
47
+ private buffer: RuntimeLogEntry[] = [];
48
+ private flushTimer: ReturnType<typeof setInterval> | null = null;
49
+ private isFlushing = false;
50
+ private metrics: BufferMetrics = { added: 0, sent: 0, dropped: 0, retried: 0 };
51
+
52
+ constructor(descriptor: OutputDescriptor, context: OutputContext) {
53
+ this.id = descriptor.id;
54
+ this.descriptor = descriptor;
55
+
56
+ // Use formatter from context or create default
57
+ this.formatter = context.formatter ?? {
58
+ format: (e: RuntimeLogEntry) => JSON.stringify(e),
59
+ parse: (s: string) => JSON.parse(s) as RuntimeLogEntry,
60
+ formatBatch: (entries: RuntimeLogEntry[]) => entries.map((e) => JSON.stringify(e)).join('\n')
61
+ };
62
+
63
+ // Configuration
64
+ this.endpoint = descriptor.endpoint ?? DEFAULT_ENDPOINT;
65
+ this.buffering = descriptor.buffering ?? {
66
+ enabled: true,
67
+ size: 16384,
68
+ flushInterval: 5000,
69
+ maxBufferEntries: 10000
70
+ };
71
+ this.maxBufferEntries = this.buffering.maxBufferEntries ?? 10000;
72
+
73
+ // Start flush timer if buffering enabled
74
+ if (this.buffering.enabled && this.buffering.flushInterval) {
75
+ this.flushTimer = setInterval(() => {
76
+ this.flush().catch((err) => logger.error('Remote output flush error', { error: err }));
77
+ }, this.buffering.flushInterval);
78
+ this.flushTimer.unref?.();
79
+ }
80
+ }
81
+
82
+ /** Get current buffer metrics */
83
+ getMetrics(): BufferMetrics {
84
+ return { ...this.metrics };
85
+ }
86
+
87
+ /** Get current buffer size */
88
+ getBufferSize(): number {
89
+ return this.buffer.length;
90
+ }
91
+
92
+ private addToBuffer(entries: RuntimeLogEntry[]): void {
93
+ const spaceAvailable = this.maxBufferEntries - this.buffer.length;
94
+
95
+ if (entries.length <= spaceAvailable) {
96
+ // All entries fit
97
+ this.buffer.push(...entries);
98
+ this.metrics.added += entries.length;
99
+ } else if (spaceAvailable > 0) {
100
+ // Partial fit - add what we can, drop the oldest to make room for rest
101
+ const toAdd = entries.slice(-spaceAvailable); // Keep newest entries
102
+ const toDrop = entries.slice(0, entries.length - spaceAvailable);
103
+ this.buffer.push(...toAdd);
104
+ this.metrics.added += toAdd.length;
105
+ this.metrics.dropped += toDrop.length;
106
+ } else {
107
+ // No space - drop oldest entries to make room for newest
108
+ const dropCount = Math.min(entries.length, this.maxBufferEntries);
109
+ this.buffer.splice(0, dropCount); // Remove oldest
110
+ this.metrics.dropped += dropCount;
111
+ this.buffer.push(...entries);
112
+ this.metrics.added += entries.length;
113
+ }
114
+ }
115
+
116
+ async write(entry: RuntimeLogEntry): Promise<void> {
117
+ if (this.buffering.enabled) {
118
+ this.addToBuffer([entry]);
119
+
120
+ // Flush if buffer is large enough
121
+ const estimatedSize = JSON.stringify(this.buffer).length;
122
+ if (estimatedSize >= this.buffering.size) {
123
+ await this.flush();
124
+ }
125
+ } else {
126
+ await this.send([entry]);
127
+ }
128
+ }
129
+
130
+ async writeBatch(entries: RuntimeLogEntry[]): Promise<void> {
131
+ if (this.buffering.enabled) {
132
+ this.addToBuffer(entries);
133
+
134
+ const estimatedSize = JSON.stringify(this.buffer).length;
135
+ if (estimatedSize >= this.buffering.size) {
136
+ await this.flush();
137
+ }
138
+ } else {
139
+ await this.send(entries);
140
+ }
141
+ }
142
+
143
+ async flush(): Promise<void> {
144
+ if (this.buffer.length === 0 || this.isFlushing) return;
145
+
146
+ this.isFlushing = true;
147
+ try {
148
+ const entries = this.buffer.splice(0);
149
+ await this.send(entries);
150
+ } finally {
151
+ this.isFlushing = false;
152
+ }
153
+ }
154
+
155
+ async read(_options?: OutputReadOptions): Promise<string[]> {
156
+ // Remote outputs do not support reading
157
+ return [];
158
+ }
159
+
160
+ tail(_callback: (line: string) => void, _options?: OutputTailOptions): TailHandle {
161
+ // Remote outputs do not support tailing
162
+ return { close: () => {} };
163
+ }
164
+
165
+ async stats(): Promise<OutputStats> {
166
+ return { size: 0, exists: true };
167
+ }
168
+
169
+ async close(): Promise<void> {
170
+ // Clear flush timer
171
+ if (this.flushTimer) {
172
+ clearInterval(this.flushTimer);
173
+ this.flushTimer = null;
174
+ }
175
+
176
+ // Flush remaining buffer
177
+ await this.flush();
178
+ }
179
+
180
+ private async send(entries: RuntimeLogEntry[]): Promise<void> {
181
+ if (entries.length === 0) return;
182
+
183
+ const body = this.formatter.formatBatch
184
+ ? this.formatter.formatBatch(entries)
185
+ : entries.map((e) => this.formatter.format(e)).join('\n');
186
+
187
+ try {
188
+ const response = await fetch(this.endpoint, {
189
+ method: 'POST',
190
+ headers: {
191
+ 'Content-Type': 'application/x-ndjson'
192
+ },
193
+ body
194
+ });
195
+
196
+ if (!response.ok) {
197
+ logger.error('Failed to send logs to remote endpoint', {
198
+ status: response.status,
199
+ statusText: response.statusText,
200
+ endpoint: this.endpoint
201
+ });
202
+ // Re-add failed entries to buffer for retry
203
+ this.addToBuffer(entries);
204
+ this.metrics.retried += entries.length;
205
+ } else {
206
+ this.metrics.sent += entries.length;
207
+ }
208
+ } catch (error) {
209
+ logger.error('Network error sending logs to remote endpoint', {
210
+ error: error instanceof Error ? error.message : String(error),
211
+ endpoint: this.endpoint
212
+ });
213
+ // Re-add failed entries to buffer for retry
214
+ this.addToBuffer(entries);
215
+ this.metrics.retried += entries.length;
216
+ }
217
+ }
218
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Logging Outputs Context Descriptor
3
+ */
4
+
5
+ import { createContextDescriptor } from '@vibesdotdev/runtime/factory/context';
6
+
7
+ export default createContextDescriptor({
8
+ id: 'logging/outputs',
9
+ description: 'Map of resolved logging output implementations by ID.'
10
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Logging Outputs Context Implementation
3
+ */
4
+ import type { OutputImplementation } from './kinds/output.ts';
5
+
6
+ export default {
7
+ provide: async (runtime: unknown) => {
8
+ const rt = runtime as {
9
+ hasKind(k: string): boolean;
10
+ query(k: string): {
11
+ descriptors(): { id: string }[];
12
+ withId(id: string): { resolve(): Promise<unknown> };
13
+ };
14
+ };
15
+ const map = new Map<string, OutputImplementation>();
16
+ if (rt.hasKind('logging/output')) {
17
+ for (const desc of rt.query('logging/output').descriptors()) {
18
+ try {
19
+ map.set(
20
+ desc.id,
21
+ (await rt.query('logging/output').withId(desc.id).resolve()) as OutputImplementation
22
+ );
23
+ } catch {
24
+ // Skip outputs that fail to resolve
25
+ }
26
+ }
27
+ }
28
+ return map;
29
+ }
30
+ };
package/src/paths.ts ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Log path utilities (string-only, universal-isomorphic).
3
+ *
4
+ * FS-backed path resolution (getVibesGlobalLogDir, resolveLogPathFromDescriptorPath)
5
+ * lives in @vibesdotdev/logging-fs.
6
+ */
7
+
8
+ export function uniqueLogPaths(paths: Array<string | null | undefined>): string[] {
9
+ return Array.from(new Set(paths.filter((path): path is string => Boolean(path))));
10
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Audit Logging Descriptor Schema
3
+ *
4
+ * Audit logging for compliance and security events.
5
+ * Entries are immutable and stored with integrity guarantees.
6
+ */
7
+
8
+ import * as z from 'zod/v4';
9
+ import { RuntimeDescriptorSchema } from '@vibesdotdev/runtime/schemas/descriptor';
10
+
11
+ /** Audit event categories */
12
+ export const AuditCategorySchema = z.enum([
13
+ 'authentication',
14
+ 'authorization',
15
+ 'data_access',
16
+ 'data_modification',
17
+ 'configuration',
18
+ 'system',
19
+ 'security'
20
+ ]);
21
+ export type AuditCategory = z.infer<typeof AuditCategorySchema>;
22
+
23
+ /** Audit event severity levels */
24
+ export const AuditSeveritySchema = z.enum(['low', 'medium', 'high', 'critical']);
25
+ export type AuditSeverity = z.infer<typeof AuditSeveritySchema>;
26
+
27
+ /** Audit event outcome */
28
+ export const AuditOutcomeSchema = z.enum(['success', 'failure', 'error', 'unknown']);
29
+ export type AuditOutcome = z.infer<typeof AuditOutcomeSchema>;
30
+
31
+ /** Actor who triggered the audit event */
32
+ export const AuditActorSchema = z.object({
33
+ /** Actor identifier */
34
+ id: z.string(),
35
+ /** Actor type (user, service, system) */
36
+ type: z.enum(['user', 'service', 'system']),
37
+ /** Human-readable name */
38
+ name: z.string().optional(),
39
+ /** IP address */
40
+ ip: z.string().optional(),
41
+ /** User agent */
42
+ userAgent: z.string().optional()
43
+ });
44
+ export type AuditActor = z.infer<typeof AuditActorSchema>;
45
+
46
+ /** Target of the audit event */
47
+ export const AuditTargetSchema = z.object({
48
+ /** Target identifier */
49
+ id: z.string(),
50
+ /** Target type (e.g., 'user', 'document', 'api') */
51
+ type: z.string(),
52
+ /** Human-readable name */
53
+ name: z.string().optional()
54
+ });
55
+ export type AuditTarget = z.infer<typeof AuditTargetSchema>;
56
+
57
+ /** Single audit log entry */
58
+ export const AuditEntrySchema = z.object({
59
+ /** Unique entry ID */
60
+ id: z.string(),
61
+ /** Timestamp (ISO 8601) */
62
+ timestamp: z.string(),
63
+ /** Event category */
64
+ category: AuditCategorySchema,
65
+ /** Severity level */
66
+ severity: AuditSeveritySchema,
67
+ /** Action performed */
68
+ action: z.string(),
69
+ /** Who triggered the event */
70
+ actor: AuditActorSchema,
71
+ /** What was affected */
72
+ target: AuditTargetSchema.optional(),
73
+ /** Event outcome */
74
+ outcome: AuditOutcomeSchema,
75
+ /** Additional context */
76
+ context: z.record(z.string(), z.unknown()).optional(),
77
+ /** Error details (for failure/error outcomes) */
78
+ error: z.string().optional()
79
+ });
80
+ export type AuditEntry = z.infer<typeof AuditEntrySchema>;
81
+
82
+ /** Audit descriptor schema */
83
+ export const AuditDescriptorSchema = RuntimeDescriptorSchema.extend({
84
+ kind: z.literal('logging/audit'),
85
+
86
+ /** Event category this audit config handles */
87
+ category: AuditCategorySchema,
88
+
89
+ /** Minimum severity to log */
90
+ severity: AuditSeveritySchema.default('low'),
91
+
92
+ /** Retention period (e.g., '90d', '1y') */
93
+ retention: z.string().default('90d'),
94
+
95
+ /** Whether entries are immutable (append-only) */
96
+ immutable: z.boolean().default(true)
97
+ });
98
+ export type AuditDescriptor = z.infer<typeof AuditDescriptorSchema>;