@jevitate/cli 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.js +40 -30
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.d.ts +4 -0
  5. package/dist/author-journey-cli.js +109 -0
  6. package/dist/author-journey-cli.js.map +1 -0
  7. package/dist/bin.js +58077 -22454
  8. package/dist/bin.js.map +1 -1
  9. package/dist/browser-run-options.d.ts +58 -0
  10. package/dist/browser-run-options.js +106 -0
  11. package/dist/browser-run-options.js.map +1 -0
  12. package/dist/build-info.generated.d.ts +2 -0
  13. package/dist/build-info.generated.js +10 -0
  14. package/dist/build-info.generated.js.map +1 -0
  15. package/dist/check-api.d.ts +5 -0
  16. package/dist/check-api.js +233 -0
  17. package/dist/check-api.js.map +1 -0
  18. package/dist/check-budget.d.ts +26 -0
  19. package/dist/check-budget.js +89 -0
  20. package/dist/check-budget.js.map +1 -0
  21. package/dist/check-cli.d.ts +31 -0
  22. package/dist/check-cli.js +109 -0
  23. package/dist/check-cli.js.map +1 -0
  24. package/dist/check-execute.d.ts +25 -0
  25. package/dist/check-execute.js +385 -0
  26. package/dist/check-execute.js.map +1 -0
  27. package/dist/check-plan.d.ts +113 -0
  28. package/dist/check-plan.js +448 -0
  29. package/dist/check-plan.js.map +1 -0
  30. package/dist/check-suite.d.ts +171 -0
  31. package/dist/check-suite.js +515 -0
  32. package/dist/check-suite.js.map +1 -0
  33. package/dist/check-types.d.ts +181 -0
  34. package/dist/check-types.js +35 -0
  35. package/dist/check-types.js.map +1 -0
  36. package/dist/cli-args.d.ts +26 -0
  37. package/dist/cli-args.js +50 -0
  38. package/dist/cli-args.js.map +1 -0
  39. package/dist/cli-output.d.ts +102 -0
  40. package/dist/cli-output.js +516 -0
  41. package/dist/cli-output.js.map +1 -0
  42. package/dist/cli-reference.d.ts +3 -0
  43. package/dist/cli-reference.js +81 -0
  44. package/dist/cli-reference.js.map +1 -0
  45. package/dist/cli-refusal.d.ts +12 -0
  46. package/dist/cli-refusal.js +52 -0
  47. package/dist/cli-refusal.js.map +1 -0
  48. package/dist/cli-shared.d.ts +330 -0
  49. package/dist/cli-shared.js +492 -0
  50. package/dist/cli-shared.js.map +1 -0
  51. package/dist/cli-surface.d.ts +33 -0
  52. package/dist/cli-surface.js +48 -0
  53. package/dist/cli-surface.js.map +1 -0
  54. package/dist/conversation-options.d.ts +15 -0
  55. package/dist/conversation-options.js +10 -0
  56. package/dist/conversation-options.js.map +1 -0
  57. package/dist/credentials-file.d.ts +15 -0
  58. package/dist/credentials-file.js +56 -0
  59. package/dist/credentials-file.js.map +1 -0
  60. package/dist/data-dir.d.ts +1 -1
  61. package/dist/data-dir.js +1 -1
  62. package/dist/defect-evidence.d.ts +141 -0
  63. package/dist/defect-evidence.js +502 -0
  64. package/dist/defect-evidence.js.map +1 -0
  65. package/dist/demo-aspect-api.d.ts +209 -0
  66. package/dist/demo-aspect-api.js +397 -0
  67. package/dist/demo-aspect-api.js.map +1 -0
  68. package/dist/demo-aspect-cli.d.ts +3 -0
  69. package/dist/demo-aspect-cli.js +241 -0
  70. package/dist/demo-aspect-cli.js.map +1 -0
  71. package/dist/demo-capture.d.ts +108 -0
  72. package/dist/demo-capture.js +438 -0
  73. package/dist/demo-capture.js.map +1 -0
  74. package/dist/engine.d.ts +35 -0
  75. package/dist/engine.js +25 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/environments.d.ts +155 -0
  78. package/dist/environments.js +364 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/exit-codes.d.ts +46 -0
  81. package/dist/exit-codes.js +91 -0
  82. package/dist/exit-codes.js.map +1 -0
  83. package/dist/explore-adversarial.d.ts +137 -0
  84. package/dist/explore-adversarial.js +218 -0
  85. package/dist/explore-adversarial.js.map +1 -0
  86. package/dist/explore-api.d.ts +7 -187
  87. package/dist/explore-api.js +7 -301
  88. package/dist/explore-api.js.map +1 -1
  89. package/dist/explore-author.d.ts +79 -0
  90. package/dist/explore-author.js +86 -0
  91. package/dist/explore-author.js.map +1 -0
  92. package/dist/explore-cli.d.ts +7 -0
  93. package/dist/explore-cli.js +963 -0
  94. package/dist/explore-cli.js.map +1 -0
  95. package/dist/explore-coverage.d.ts +158 -0
  96. package/dist/explore-coverage.js +240 -0
  97. package/dist/explore-coverage.js.map +1 -0
  98. package/dist/explore-feature.d.ts +127 -0
  99. package/dist/explore-feature.js +220 -0
  100. package/dist/explore-feature.js.map +1 -0
  101. package/dist/explore-goal.d.ts +253 -0
  102. package/dist/explore-goal.js +374 -0
  103. package/dist/explore-goal.js.map +1 -0
  104. package/dist/explore-shared.d.ts +152 -0
  105. package/dist/explore-shared.js +129 -0
  106. package/dist/explore-shared.js.map +1 -0
  107. package/dist/explore-specs.d.ts +53 -0
  108. package/dist/explore-specs.js +333 -0
  109. package/dist/explore-specs.js.map +1 -0
  110. package/dist/findings-filing.d.ts +64 -0
  111. package/dist/findings-filing.js +108 -0
  112. package/dist/findings-filing.js.map +1 -0
  113. package/dist/fixture-auth.d.ts +52 -0
  114. package/dist/fixture-auth.js +82 -0
  115. package/dist/fixture-auth.js.map +1 -0
  116. package/dist/fixture-cli.d.ts +70 -0
  117. package/dist/fixture-cli.js +178 -0
  118. package/dist/fixture-cli.js.map +1 -0
  119. package/dist/github-issue-filer.d.ts +62 -0
  120. package/dist/github-issue-filer.js +188 -0
  121. package/dist/github-issue-filer.js.map +1 -0
  122. package/dist/host-health-run.d.ts +24 -0
  123. package/dist/host-health-run.js +27 -0
  124. package/dist/host-health-run.js.map +1 -0
  125. package/dist/http-5xx-outcome.d.ts +6 -0
  126. package/dist/http-5xx-outcome.js +39 -0
  127. package/dist/http-5xx-outcome.js.map +1 -0
  128. package/dist/inbox-cli.d.ts +7 -0
  129. package/dist/inbox-cli.js +197 -0
  130. package/dist/inbox-cli.js.map +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/init-cli.d.ts +4 -0
  135. package/dist/init-cli.js +127 -0
  136. package/dist/init-cli.js.map +1 -0
  137. package/dist/init-keys.d.ts +19 -2
  138. package/dist/init-keys.js +15 -4
  139. package/dist/init-keys.js.map +1 -1
  140. package/dist/init-next-steps.d.ts +35 -0
  141. package/dist/init-next-steps.js +79 -0
  142. package/dist/init-next-steps.js.map +1 -0
  143. package/dist/invariants-file.d.ts +34 -0
  144. package/dist/invariants-file.js +68 -0
  145. package/dist/invariants-file.js.map +1 -0
  146. package/dist/invariants-validate.d.ts +30 -0
  147. package/dist/invariants-validate.js +105 -0
  148. package/dist/invariants-validate.js.map +1 -0
  149. package/dist/journey-annotate-api.d.ts +76 -0
  150. package/dist/journey-annotate-api.js +256 -0
  151. package/dist/journey-annotate-api.js.map +1 -0
  152. package/dist/journey-annotate-cli.d.ts +9 -0
  153. package/dist/journey-annotate-cli.js +179 -0
  154. package/dist/journey-annotate-cli.js.map +1 -0
  155. package/dist/journey-api.d.ts +79 -2
  156. package/dist/journey-api.js +136 -19
  157. package/dist/journey-api.js.map +1 -1
  158. package/dist/journey-cli.d.ts +4 -0
  159. package/dist/journey-cli.js +370 -0
  160. package/dist/journey-cli.js.map +1 -0
  161. package/dist/journey-demo-api.d.ts +112 -0
  162. package/dist/journey-demo-api.js +392 -0
  163. package/dist/journey-demo-api.js.map +1 -0
  164. package/dist/journey-demo-cli.d.ts +10 -0
  165. package/dist/journey-demo-cli.js +155 -0
  166. package/dist/journey-demo-cli.js.map +1 -0
  167. package/dist/kill-signal.d.ts +193 -0
  168. package/dist/kill-signal.js +284 -0
  169. package/dist/kill-signal.js.map +1 -0
  170. package/dist/launch-armed.d.ts +37 -0
  171. package/dist/launch-armed.js +31 -0
  172. package/dist/launch-armed.js.map +1 -0
  173. package/dist/ledger-api.d.ts +106 -0
  174. package/dist/ledger-api.js +237 -0
  175. package/dist/ledger-api.js.map +1 -0
  176. package/dist/ledger-cli.d.ts +18 -0
  177. package/dist/ledger-cli.js +107 -0
  178. package/dist/ledger-cli.js.map +1 -0
  179. package/dist/load-api.d.ts +29 -11
  180. package/dist/load-api.js +23 -15
  181. package/dist/load-api.js.map +1 -1
  182. package/dist/load-cli.d.ts +4 -0
  183. package/dist/load-cli.js +97 -0
  184. package/dist/load-cli.js.map +1 -0
  185. package/dist/log-correlation.d.ts +147 -0
  186. package/dist/log-correlation.js +325 -0
  187. package/dist/log-correlation.js.map +1 -0
  188. package/dist/log-lines.d.ts +131 -0
  189. package/dist/log-lines.js +389 -0
  190. package/dist/log-lines.js.map +1 -0
  191. package/dist/log-sources.d.ts +71 -0
  192. package/dist/log-sources.js +235 -0
  193. package/dist/log-sources.js.map +1 -0
  194. package/dist/logs-cli.d.ts +3 -0
  195. package/dist/logs-cli.js +51 -0
  196. package/dist/logs-cli.js.map +1 -0
  197. package/dist/logs-retention.d.ts +28 -0
  198. package/dist/logs-retention.js +84 -0
  199. package/dist/logs-retention.js.map +1 -0
  200. package/dist/mcp-api.d.ts +89 -1
  201. package/dist/mcp-api.js +472 -18
  202. package/dist/mcp-api.js.map +1 -1
  203. package/dist/mcp-args.d.ts +38 -0
  204. package/dist/mcp-args.js +131 -0
  205. package/dist/mcp-args.js.map +1 -0
  206. package/dist/mcp-cli-bridge.d.ts +34 -0
  207. package/dist/mcp-cli-bridge.js +62 -0
  208. package/dist/mcp-cli-bridge.js.map +1 -0
  209. package/dist/mcp-cli-runner.d.ts +29 -0
  210. package/dist/mcp-cli-runner.js +44 -0
  211. package/dist/mcp-cli-runner.js.map +1 -0
  212. package/dist/mcp-cli-tools.d.ts +125 -0
  213. package/dist/mcp-cli-tools.js +680 -0
  214. package/dist/mcp-cli-tools.js.map +1 -0
  215. package/dist/mcp-paths.d.ts +28 -0
  216. package/dist/mcp-paths.js +76 -0
  217. package/dist/mcp-paths.js.map +1 -0
  218. package/dist/mission-actors.d.ts +40 -0
  219. package/dist/mission-actors.js +72 -0
  220. package/dist/mission-actors.js.map +1 -0
  221. package/dist/mission-api.d.ts +35 -0
  222. package/dist/mission-api.js +58 -2
  223. package/dist/mission-api.js.map +1 -1
  224. package/dist/mission-cli.d.ts +4 -0
  225. package/dist/mission-cli.js +247 -0
  226. package/dist/mission-cli.js.map +1 -0
  227. package/dist/mission-exit.d.ts +22 -0
  228. package/dist/mission-exit.js +26 -0
  229. package/dist/mission-exit.js.map +1 -0
  230. package/dist/mission-fixtures.d.ts +225 -0
  231. package/dist/mission-fixtures.js +828 -0
  232. package/dist/mission-fixtures.js.map +1 -0
  233. package/dist/mission-journal.d.ts +60 -0
  234. package/dist/mission-journal.js +115 -0
  235. package/dist/mission-journal.js.map +1 -0
  236. package/dist/mission-queue-cli.d.ts +10 -0
  237. package/dist/mission-queue-cli.js +198 -0
  238. package/dist/mission-queue-cli.js.map +1 -0
  239. package/dist/mission-queue-runner.d.ts +126 -0
  240. package/dist/mission-queue-runner.js +397 -0
  241. package/dist/mission-queue-runner.js.map +1 -0
  242. package/dist/multi-run-cli.d.ts +37 -0
  243. package/dist/multi-run-cli.js +110 -0
  244. package/dist/multi-run-cli.js.map +1 -0
  245. package/dist/multi-run.d.ts +339 -0
  246. package/dist/multi-run.js +619 -0
  247. package/dist/multi-run.js.map +1 -0
  248. package/dist/openrouter-call.d.ts +22 -0
  249. package/dist/openrouter-call.js +63 -0
  250. package/dist/openrouter-call.js.map +1 -0
  251. package/dist/profile-cli.d.ts +4 -0
  252. package/dist/profile-cli.js +57 -0
  253. package/dist/profile-cli.js.map +1 -0
  254. package/dist/program.d.ts +3 -75
  255. package/dist/program.js +119 -1921
  256. package/dist/program.js.map +1 -1
  257. package/dist/project-dir.d.ts +96 -0
  258. package/dist/project-dir.js +220 -0
  259. package/dist/project-dir.js.map +1 -0
  260. package/dist/record-api.d.ts +10 -6
  261. package/dist/record-api.js +39 -28
  262. package/dist/record-api.js.map +1 -1
  263. package/dist/record-cli.d.ts +4 -0
  264. package/dist/record-cli.js +64 -0
  265. package/dist/record-cli.js.map +1 -0
  266. package/dist/recording-cli.d.ts +4 -0
  267. package/dist/recording-cli.js +248 -0
  268. package/dist/recording-cli.js.map +1 -0
  269. package/dist/regression-api.d.ts +101 -0
  270. package/dist/regression-api.js +384 -5
  271. package/dist/regression-api.js.map +1 -1
  272. package/dist/regression-cli.d.ts +4 -0
  273. package/dist/regression-cli.js +232 -0
  274. package/dist/regression-cli.js.map +1 -0
  275. package/dist/report-api.d.ts +146 -0
  276. package/dist/report-api.js +430 -0
  277. package/dist/report-api.js.map +1 -0
  278. package/dist/report-cli.d.ts +12 -0
  279. package/dist/report-cli.js +147 -0
  280. package/dist/report-cli.js.map +1 -0
  281. package/dist/result-schema.d.ts +22 -0
  282. package/dist/result-schema.js +28 -0
  283. package/dist/result-schema.js.map +1 -0
  284. package/dist/run-index.d.ts +29 -0
  285. package/dist/run-index.js +70 -0
  286. package/dist/run-index.js.map +1 -0
  287. package/dist/run-screenshots.d.ts +123 -0
  288. package/dist/run-screenshots.js +229 -0
  289. package/dist/run-screenshots.js.map +1 -0
  290. package/dist/runtime-env.d.ts +8 -0
  291. package/dist/runtime-env.js +22 -0
  292. package/dist/runtime-env.js.map +1 -0
  293. package/dist/secret-args.d.ts +23 -0
  294. package/dist/secret-args.js +45 -0
  295. package/dist/secret-args.js.map +1 -0
  296. package/dist/serve-cli.d.ts +4 -0
  297. package/dist/serve-cli.js +95 -0
  298. package/dist/serve-cli.js.map +1 -0
  299. package/dist/server-log-verify.d.ts +34 -0
  300. package/dist/server-log-verify.js +115 -0
  301. package/dist/server-log-verify.js.map +1 -0
  302. package/dist/session-check.d.ts +14 -0
  303. package/dist/session-check.js +44 -0
  304. package/dist/session-check.js.map +1 -0
  305. package/dist/site-cli.d.ts +4 -0
  306. package/dist/site-cli.js +127 -0
  307. package/dist/site-cli.js.map +1 -0
  308. package/dist/site-gate-cli.d.ts +28 -0
  309. package/dist/site-gate-cli.js +58 -0
  310. package/dist/site-gate-cli.js.map +1 -0
  311. package/dist/source-api.js +18 -3
  312. package/dist/source-api.js.map +1 -1
  313. package/dist/source-cli.d.ts +4 -0
  314. package/dist/source-cli.js +284 -0
  315. package/dist/source-cli.js.map +1 -0
  316. package/dist/source-run-api.d.ts +27 -1
  317. package/dist/source-run-api.js +22 -11
  318. package/dist/source-run-api.js.map +1 -1
  319. package/dist/storage-state-snapshot.d.ts +50 -0
  320. package/dist/storage-state-snapshot.js +87 -0
  321. package/dist/storage-state-snapshot.js.map +1 -0
  322. package/dist/suite-explore-options.d.ts +289 -0
  323. package/dist/suite-explore-options.js +140 -0
  324. package/dist/suite-explore-options.js.map +1 -0
  325. package/dist/target-config.d.ts +109 -0
  326. package/dist/target-config.js +216 -0
  327. package/dist/target-config.js.map +1 -0
  328. package/dist/transcript-file.d.ts +12 -0
  329. package/dist/transcript-file.js +23 -0
  330. package/dist/transcript-file.js.map +1 -0
  331. package/dist/ui-api.d.ts +3 -0
  332. package/dist/ui-api.js +7 -1
  333. package/dist/ui-api.js.map +1 -1
  334. package/dist/usability-capture.d.ts +43 -0
  335. package/dist/usability-capture.js +326 -0
  336. package/dist/usability-capture.js.map +1 -0
  337. package/dist/usage-config.d.ts +36 -0
  338. package/dist/usage-config.js +114 -0
  339. package/dist/usage-config.js.map +1 -0
  340. package/dist/ux-api.d.ts +3 -75
  341. package/dist/ux-api.js +3 -220
  342. package/dist/ux-api.js.map +1 -1
  343. package/dist/ux-cli.d.ts +4 -0
  344. package/dist/ux-cli.js +102 -0
  345. package/dist/ux-cli.js.map +1 -0
  346. package/dist/ux-config.d.ts +29 -0
  347. package/dist/ux-config.js +103 -0
  348. package/dist/ux-config.js.map +1 -0
  349. package/dist/ux-evidence.d.ts +54 -0
  350. package/dist/ux-evidence.js +197 -0
  351. package/dist/ux-evidence.js.map +1 -0
  352. package/dist/ux-review.d.ts +112 -0
  353. package/dist/ux-review.js +151 -0
  354. package/dist/ux-review.js.map +1 -0
  355. package/dist/ux-usability.d.ts +238 -0
  356. package/dist/ux-usability.js +494 -0
  357. package/dist/ux-usability.js.map +1 -0
  358. package/dist/verify-fix-api.d.ts +173 -0
  359. package/dist/verify-fix-api.js +454 -0
  360. package/dist/verify-fix-api.js.map +1 -0
  361. package/dist/verify-fix-cli.d.ts +4 -0
  362. package/dist/verify-fix-cli.js +110 -0
  363. package/dist/verify-fix-cli.js.map +1 -0
  364. package/package.json +19 -14
  365. package/skills/jevitate-ci-check/SKILL.md +77 -0
  366. package/skills/jevitate-demo/SKILL.md +61 -0
  367. package/skills/jevitate-explore/SKILL.md +88 -87
  368. package/skills/jevitate-getting-started/SKILL.md +88 -0
  369. package/skills/jevitate-load-test/SKILL.md +11 -2
  370. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  371. package/skills/jevitate-record/SKILL.md +23 -5
  372. package/skills/jevitate-run-journey/SKILL.md +61 -17
  373. package/skills/jevitate-sources/SKILL.md +57 -14
  374. package/skills/jevitate-ux-review/SKILL.md +106 -16
  375. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,389 @@
1
+ import { messageClass, normalizeRoute } from "@jevitate/explore";
2
+ import { contentHash } from "@jevitate/domain";
3
+ const LEVEL_RANK = { unknown: 0, debug: 1, info: 2, warn: 3, error: 4 };
4
+ /** True when `a` is at least as severe as `b`. `unknown` is never >= a NAMED level (fail closed). */
5
+ export function levelAtLeast(a, b) {
6
+ if (b === "unknown")
7
+ return true;
8
+ if (a === "unknown")
9
+ return false;
10
+ return LEVEL_RANK[a] >= LEVEL_RANK[b];
11
+ }
12
+ function normalizeLevelName(raw) {
13
+ const v = raw.trim().toLowerCase();
14
+ // "fail"/"crit" are .NET's `Microsoft.Extensions.Logging` console-formatter tokens (#165): `fail`
15
+ // maps to `error`, and `crit`("critical") also maps to `error` — this LogLevel enum has no
16
+ // separate "critical" tier, so both collapse the same way `fatal` already did. "err"/"ftl" are
17
+ // Serilog's own 3-letter abbreviations (its default console theme: VRB/DBG/INF/WRN/ERR/FTL).
18
+ if (v === "error" || v === "err" || v === "fatal" || v === "critical" || v === "crit" || v === "fail" || v === "ftl")
19
+ return "error";
20
+ if (v === "warn" || v === "warning" || v === "wrn")
21
+ return "warn";
22
+ if (v === "info" || v === "notice" || v === "inf")
23
+ return "info";
24
+ // "dbug"/"trce" are .NET's own short tokens for debug/trace; "dbg"/"vrb" are Serilog's.
25
+ if (v === "debug" || v === "trace" || v === "verbose" || v === "dbug" || v === "trce" || v === "dbg" || v === "vrb")
26
+ return "debug";
27
+ return "unknown";
28
+ }
29
+ const ISO_TS_SRC = String.raw `\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?`;
30
+ const ISO_TS = new RegExp(ISO_TS_SRC);
31
+ /** Seconds vs ms heuristic: a value under 10^10 is (almost) certainly seconds — ms would be before
32
+ * 2001-09-09, never a real log line's own timestamp — so it is scaled up. */
33
+ function parseTimeValue(v) {
34
+ if (typeof v === "number" && Number.isFinite(v))
35
+ return v < 10_000_000_000 ? v * 1000 : v;
36
+ if (typeof v === "string") {
37
+ const t = Date.parse(v);
38
+ return Number.isNaN(t) ? null : t;
39
+ }
40
+ return null;
41
+ }
42
+ function firstDefined(obj, keys) {
43
+ for (const k of keys)
44
+ if (obj[k] !== undefined)
45
+ return obj[k];
46
+ return undefined;
47
+ }
48
+ const LEVEL_KEYS = ["level", "severity", "loglevel", "log_level", "LogLevel"];
49
+ // "Timestamp" (capital T, #165/#169): the .NET JSON console formatter's own key
50
+ // (`{"Timestamp":…,"LogLevel":"Error","Category":…,"Message":…}`).
51
+ const TIME_KEYS = ["time", "timestamp", "ts", "@timestamp", "Timestamp"];
52
+ /** Top-level message-ish keys, highest priority first. */
53
+ const TOP_MESSAGE_KEYS = ["message", "msg", "Message"];
54
+ /** `fields.<key>` — Rust `tracing`/`tracing-subscriber`'s JSON formatter (#169) nests the actual
55
+ * message under `fields`, not at the top level; the top-level object is otherwise just envelope
56
+ * (timestamp/level/target/span). */
57
+ const NESTED_FIELD_KEYS = ["fields"];
58
+ const NESTED_MESSAGE_KEYS = ["message", "msg"];
59
+ const FALLBACK_MESSAGE_KEYS = ["@message", "error", "err"];
60
+ const TARGET_KEYS = ["target", "logger", "Category"];
61
+ /**
62
+ * The human message of a JSON log line (#169): `message`/`msg` at the top level, else
63
+ * `fields.message`/`fields.msg` (tracing-subscriber), else `@message`, else `error`/`err` as a last
64
+ * resort for a line with no explicit message key. Anything else (a whole nested object with no
65
+ * string message anywhere) falls back to the raw line in the caller, rather than JSON.stringify-ing
66
+ * an object through `messageClass` into unreadable `{<s>:<s>…}` noise.
67
+ */
68
+ function extractMessage(rec) {
69
+ const top = firstDefined(rec, TOP_MESSAGE_KEYS);
70
+ if (typeof top === "string")
71
+ return top;
72
+ for (const fk of NESTED_FIELD_KEYS) {
73
+ const nestedObj = rec[fk];
74
+ if (nestedObj !== null && typeof nestedObj === "object" && !Array.isArray(nestedObj)) {
75
+ const nested = firstDefined(nestedObj, NESTED_MESSAGE_KEYS);
76
+ if (typeof nested === "string")
77
+ return nested;
78
+ }
79
+ }
80
+ const fallback = firstDefined(rec, FALLBACK_MESSAGE_KEYS);
81
+ return typeof fallback === "string" ? fallback : undefined;
82
+ }
83
+ function parseJsonLine(trimmed, source, arrivalEpochMs) {
84
+ let obj;
85
+ try {
86
+ obj = JSON.parse(trimmed);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ if (obj === null || typeof obj !== "object" || Array.isArray(obj))
92
+ return null;
93
+ const rec = obj;
94
+ const levelRaw = firstDefined(rec, LEVEL_KEYS);
95
+ const level = typeof levelRaw === "string" || typeof levelRaw === "number" ? normalizeLevelName(String(levelRaw)) : "unknown";
96
+ const parsedTime = parseTimeValue(firstDefined(rec, TIME_KEYS));
97
+ const message = extractMessage(rec);
98
+ const targetRaw = firstDefined(rec, TARGET_KEYS);
99
+ const target = typeof targetRaw === "string" && targetRaw !== "" ? targetRaw : undefined;
100
+ return {
101
+ level,
102
+ message: message ?? trimmed,
103
+ raw: trimmed,
104
+ epochMs: parsedTime ?? arrivalEpochMs,
105
+ ownTimestamp: parsedTime !== null,
106
+ source,
107
+ ...(target === undefined ? {} : { target }),
108
+ };
109
+ }
110
+ /** `key=value key2="quoted value" level=error` — a bare word with no `=` is not a pair. */
111
+ const LOGFMT_PAIR = /([a-zA-Z_][\w.-]*)=("(?:[^"\\]|\\.)*"|\S+)/g;
112
+ function parseLogfmtLine(trimmed, source, arrivalEpochMs) {
113
+ const pairs = {};
114
+ let matched = 0;
115
+ for (const m of trimmed.matchAll(LOGFMT_PAIR)) {
116
+ matched += 1;
117
+ const key = (m[1] ?? "").toLowerCase();
118
+ let value = m[2] ?? "";
119
+ if (value.startsWith('"') && value.endsWith('"')) {
120
+ try {
121
+ value = JSON.parse(value);
122
+ }
123
+ catch {
124
+ value = value.slice(1, -1);
125
+ }
126
+ }
127
+ pairs[key] = value;
128
+ }
129
+ // Require at least two pairs AND a level or message key — a stray "a=b" inside free text is not logfmt.
130
+ if (matched < 2 || (pairs.level === undefined && pairs.severity === undefined && pairs.msg === undefined && pairs.message === undefined)) {
131
+ return null;
132
+ }
133
+ const levelRaw = firstDefined(pairs, LEVEL_KEYS);
134
+ const level = typeof levelRaw === "string" ? normalizeLevelName(levelRaw) : "unknown";
135
+ const parsedTime = parseTimeValue(firstDefined(pairs, TIME_KEYS));
136
+ const msgRaw = firstDefined(pairs, [...TOP_MESSAGE_KEYS, ...FALLBACK_MESSAGE_KEYS]);
137
+ return {
138
+ level,
139
+ message: typeof msgRaw === "string" ? msgRaw : trimmed,
140
+ raw: trimmed,
141
+ epochMs: parsedTime ?? arrivalEpochMs,
142
+ ownTimestamp: parsedTime !== null,
143
+ source,
144
+ };
145
+ }
146
+ /**
147
+ * The .NET default console formatter's entry header (#165, `Microsoft.Extensions.Logging`):
148
+ * `lvl: Category.Name[EventId]`, e.g. `fail: OutboundLabs...StripeReconciliationHostedService[0]`.
149
+ * The message is on the following indented line(s) — see `DotnetEntryGrouper`, which joins them
150
+ * into one multi-line entry BEFORE it reaches this parser.
151
+ */
152
+ const DOTNET_HEADER_RE = /^(trce|dbug|info|warn|fail|crit):\s+(.+)\[(-?\d+)\]\s*$/i;
153
+ /**
154
+ * Parses an entry already joined by `DotnetEntryGrouper` (header line + its indented continuation
155
+ * lines, `\n`-separated) — or a bare header line with no continuation, for direct unit testing.
156
+ * `null` when the first line is not a `lvl: Category[id]` header, so this format never claims a
157
+ * line meant for another parser.
158
+ */
159
+ function parseDotnetLine(trimmedWhole, source, arrivalEpochMs) {
160
+ const lines = trimmedWhole.split("\n");
161
+ const headerLine = (lines[0] ?? "").trim();
162
+ const m = DOTNET_HEADER_RE.exec(headerLine);
163
+ if (m === null)
164
+ return null;
165
+ const level = normalizeLevelName(m[1] ?? "");
166
+ const category = (m[2] ?? "").trim();
167
+ // Continuation lines (the message, and any exception stack trace) are dedented and collapsed into
168
+ // one message string — `normalizeLogMessage`/`messageClass` collapse whitespace anyway, and a
169
+ // single-line message reads better in `topMessages`/a defect title than a raw multi-line blob.
170
+ const body = lines
171
+ .slice(1)
172
+ .map((l) => l.trim())
173
+ .filter((l) => l !== "")
174
+ .join(" ");
175
+ return {
176
+ level,
177
+ message: body !== "" ? body : category,
178
+ raw: trimmedWhole,
179
+ epochMs: arrivalEpochMs,
180
+ ownTimestamp: false,
181
+ source,
182
+ ...(category === "" ? {} : { target: category }),
183
+ };
184
+ }
185
+ /**
186
+ * Serilog's default console theme: `[HH:mm:ss(.fff) LVL] rest`, `LVL` one of its 3-letter
187
+ * abbreviations (VRB/DBG/INF/WRN/ERR/FTL). A custom output template commonly puts `SourceContext`
188
+ * right after the bracket (`[10:00:00 ERR] MyApp.Services.FooService request failed`) — detected as
189
+ * a dotted identifier with no spaces, immediately followed by the rest of the message.
190
+ */
191
+ const SERILOG_RE = /^\[(\d{1,2}:\d{2}:\d{2}(?:\.\d+)?)\s+(VRB|DBG|INF|WRN|ERR|FTL)\]\s*(.*)$/i;
192
+ const SERILOG_SOURCE_CONTEXT_RE = /^([A-Za-z_][\w]*(?:\.[A-Za-z_][\w]*)+)\s+(.+)$/;
193
+ function parseSerilogLine(trimmed, source, arrivalEpochMs) {
194
+ const m = SERILOG_RE.exec(trimmed);
195
+ if (m === null)
196
+ return null;
197
+ const level = normalizeLevelName(m[2] ?? "");
198
+ const rest = (m[3] ?? "").trim();
199
+ const scMatch = SERILOG_SOURCE_CONTEXT_RE.exec(rest);
200
+ const target = scMatch === null ? undefined : scMatch[1];
201
+ const message = scMatch === null ? rest : (scMatch[2] ?? "").trim();
202
+ return {
203
+ level,
204
+ message: message !== "" ? message : rest,
205
+ raw: trimmed,
206
+ // Serilog's default theme has no date, only a time-of-day — too ambiguous to trust as the
207
+ // line's own epoch (which day?); the arrival time is the honest choice.
208
+ epochMs: arrivalEpochMs,
209
+ ownTimestamp: false,
210
+ source,
211
+ ...(target === undefined ? {} : { target }),
212
+ };
213
+ }
214
+ const BRACKETED_LEVEL = /\[(ERROR|ERR|FATAL|CRITICAL|CRIT|WARN(?:ING)?|INFO|NOTICE|DEBUG|TRACE)\]/i;
215
+ const BARE_LEVEL = /\b(ERROR|FATAL|WARN(?:ING)?|INFO|DEBUG|TRACE)\b:?/;
216
+ function parseBracketedLine(trimmed, source, arrivalEpochMs) {
217
+ const tsMatch = ISO_TS.exec(trimmed);
218
+ const parsedTime = tsMatch === null ? null : parseTimeValue(tsMatch[0]);
219
+ const levelMatch = BRACKETED_LEVEL.exec(trimmed) ?? BARE_LEVEL.exec(trimmed);
220
+ const level = levelMatch === null ? "unknown" : normalizeLevelName(levelMatch[1] ?? levelMatch[0]);
221
+ return { level, message: trimmed, raw: trimmed, epochMs: parsedTime ?? arrivalEpochMs, ownTimestamp: parsedTime !== null, source };
222
+ }
223
+ /**
224
+ * Parses one raw log line — or, for the .NET console format (#165), one already-grouped multi-line
225
+ * entry (see `DotnetEntryGrouper`): JSON (`level`/`severity` + `time`/`timestamp`/`ts`), then logfmt
226
+ * (`level=error msg="…" time=…`), then the .NET default console formatter (`lvl: Category[id]` +
227
+ * indented continuation lines), then Serilog's bracketed console theme (`[HH:mm:ss ERR] …`), then a
228
+ * generic bracketed/bare level with an optional leading ISO timestamp, else falls back to the line
229
+ * verbatim with an `unknown` level and the arrival time. Never throws.
230
+ */
231
+ export function parseLogLine(raw, arrivalEpochMs, source) {
232
+ const trimmed = raw.trim();
233
+ if (trimmed === "")
234
+ return { level: "unknown", message: "", raw, epochMs: arrivalEpochMs, ownTimestamp: false, source };
235
+ return (parseJsonLine(trimmed, source, arrivalEpochMs) ??
236
+ parseLogfmtLine(trimmed, source, arrivalEpochMs) ??
237
+ parseDotnetLine(trimmed, source, arrivalEpochMs) ??
238
+ parseSerilogLine(trimmed, source, arrivalEpochMs) ??
239
+ parseBracketedLine(trimmed, source, arrivalEpochMs));
240
+ }
241
+ /** A line that only extends a pending .NET entry when one is open: indented and non-blank. */
242
+ function isDotnetContinuation(line) {
243
+ return /^[ \t]/.test(line) && line.trim() !== "";
244
+ }
245
+ /**
246
+ * Groups the .NET default console formatter's multi-line entries (#165) — a `lvl: Category[id]`
247
+ * header followed by one or more indented message/exception-stack-trace lines — into ONE logical
248
+ * entry before it reaches `parseLogLine`. Stateful and meant for ONE `--log-source` (`log-
249
+ * correlation.ts` keeps one instance per source): lines arrive one at a time, in order, from `log-
250
+ * sources.ts`'s line splitter.
251
+ *
252
+ * A header line always starts a NEW pending entry (flushing whatever was pending first); an
253
+ * indented, non-blank line — while an entry is pending — extends it instead of starting its own;
254
+ * anything else (not indented, not itself a header) is its own one-line entry. Every other log
255
+ * format (JSON, logfmt, bracketed/bare) never triggers buffering: `feed` only holds a line back
256
+ * when it is itself a header or it is indented AND a header is already pending, so a single
257
+ * already-indented stray line with no pending entry passes straight through unchanged.
258
+ */
259
+ export class DotnetEntryGrouper {
260
+ #pending;
261
+ #pendingEpochMs = 0;
262
+ /** Feed one raw line. Returns the entries this line completed — usually 0 or 1, occasionally 2
263
+ * (a pending entry flushed by, immediately followed by, this line's own one-line entry). */
264
+ feed(raw, epochMs) {
265
+ const isHeader = DOTNET_HEADER_RE.test(raw.trim());
266
+ if (this.#pending !== undefined && !isHeader && isDotnetContinuation(raw)) {
267
+ this.#pending.push(raw);
268
+ return [];
269
+ }
270
+ const out = [];
271
+ if (this.#pending !== undefined) {
272
+ out.push({ raw: this.#pending.join("\n"), epochMs: this.#pendingEpochMs });
273
+ this.#pending = undefined;
274
+ }
275
+ if (isHeader) {
276
+ this.#pending = [raw];
277
+ this.#pendingEpochMs = epochMs;
278
+ return out;
279
+ }
280
+ out.push({ raw, epochMs });
281
+ return out;
282
+ }
283
+ /** Flushes a still-pending entry (call when the source is closing: the log's last entry has no
284
+ * following header/non-continuation line to trigger its own flush). `undefined` when idle. */
285
+ flush() {
286
+ if (this.#pending === undefined)
287
+ return undefined;
288
+ const out = { raw: this.#pending.join("\n"), epochMs: this.#pendingEpochMs };
289
+ this.#pending = undefined;
290
+ return out;
291
+ }
292
+ }
293
+ const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;
294
+ const ISO_TS_G = new RegExp(ISO_TS_SRC, "g");
295
+ /**
296
+ * The CLASS of a log message, for correlation-noise dedup and the `server-log` defect fingerprint:
297
+ * an ISO timestamp, then a uuid, are replaced by placeholders first (so a timestamp's own digits
298
+ * don't collide with the generic number-stripping below), then `@jevitate/explore`'s `messageClass`
299
+ * strips URLs, quoted values, long hex ids and remaining numbers. Two occurrences of one bug that
300
+ * differ only in an id, a count or a timestamp share a class.
301
+ */
302
+ export function normalizeLogMessage(message) {
303
+ return messageClass(message.replace(ISO_TS_G, "<ts>").replace(UUID_RE, "<uuid>"));
304
+ }
305
+ /**
306
+ * A `server-log` defect's fingerprint (#142): the templated route the line correlated to, plus the
307
+ * normalized message class, plus — when known (#169) — the logger's own `target`/`logger`/category
308
+ * (Rust `tracing`'s `target`, a JSON log's `logger`, a .NET entry's category). Two lines whose
309
+ * message happens to normalize the same, from two different loggers/modules, are DISTINCT defects:
310
+ * without `target` they would collapse into one fingerprint, hiding one of the two real bugs.
311
+ * Unattributed lines (outside every step window) are fingerprinted with `route = "(run)"` — still
312
+ * stable across repeated occurrences of the same line.
313
+ */
314
+ export function serverLogFingerprint(route, normalizedMessage, target) {
315
+ const targetPart = target === undefined || target === "" ? "" : `|${target}`;
316
+ return contentHash(`server-log|${route === "(run)" ? route : normalizeRoute(route)}|${normalizedMessage}${targetPart}`).slice(0, 16);
317
+ }
318
+ export class LogSpecError extends Error {
319
+ code = "E_LOG_SPEC";
320
+ constructor(message) {
321
+ super(message);
322
+ this.name = "LogSpecError";
323
+ }
324
+ }
325
+ const REGEX_SPEC = /^\/(.*)\/([a-z]*)$/s;
326
+ const MAX_PATTERN_LENGTH = 500;
327
+ /**
328
+ * Parses one `--log-defect` value: `/pattern/flags` (bounded length, compiled once via `new
329
+ * RegExp` — never `eval`ed) or a level name (`error`, `warn`, `info`, `debug`), matched as
330
+ * `level >= this`. Throws `LogSpecError` on anything else, so a bad spec is refused before any
331
+ * browser opens (the same fail-closed discipline as `--invariants`).
332
+ */
333
+ export function parseLogDefectSpec(raw) {
334
+ const m = REGEX_SPEC.exec(raw);
335
+ if (m !== null) {
336
+ const pattern = m[1] ?? "";
337
+ const flags = m[2] ?? "";
338
+ if (pattern.length > MAX_PATTERN_LENGTH) {
339
+ throw new LogSpecError(`--log-defect pattern is too long (max ${MAX_PATTERN_LENGTH} chars): ${raw.slice(0, 40)}…`);
340
+ }
341
+ try {
342
+ return { kind: "pattern", re: new RegExp(pattern, flags), raw };
343
+ }
344
+ catch (e) {
345
+ throw new LogSpecError(`--log-defect: invalid regex ${JSON.stringify(raw)}: ${e instanceof Error ? e.message : String(e)}`);
346
+ }
347
+ }
348
+ const level = normalizeLevelName(raw);
349
+ if (level === "unknown") {
350
+ throw new LogSpecError(`--log-defect must be a level (error|warn|info|debug) or a /regex/: got ${JSON.stringify(raw)}`);
351
+ }
352
+ return { kind: "level", level, raw };
353
+ }
354
+ /** Whether a parsed line matches a `--log-defect` matcher. */
355
+ export function matchesLogDefect(line, matcher) {
356
+ return matcher.kind === "level" ? levelAtLeast(line.level, matcher.level) : matcher.re.test(line.raw);
357
+ }
358
+ const MAX_IGNORE_LENGTH = 500;
359
+ /**
360
+ * Parses one `--log-ignore` value: `/pattern/flags` (bounded length, compiled once via `new RegExp`
361
+ * — never `eval`ed) or a plain substring, matched against the line's RAW text. Throws `LogSpecError`
362
+ * on anything empty/invalid/too long, failing closed before any browser opens.
363
+ */
364
+ export function parseLogIgnoreSpec(raw) {
365
+ const m = REGEX_SPEC.exec(raw);
366
+ if (m !== null) {
367
+ const pattern = m[1] ?? "";
368
+ const flags = m[2] ?? "";
369
+ if (pattern.length > MAX_IGNORE_LENGTH) {
370
+ throw new LogSpecError(`--log-ignore pattern is too long (max ${MAX_IGNORE_LENGTH} chars): ${raw.slice(0, 40)}…`);
371
+ }
372
+ try {
373
+ return { kind: "pattern", re: new RegExp(pattern, flags), raw };
374
+ }
375
+ catch (e) {
376
+ throw new LogSpecError(`--log-ignore: invalid regex ${JSON.stringify(raw)}: ${e instanceof Error ? e.message : String(e)}`);
377
+ }
378
+ }
379
+ if (raw === "")
380
+ throw new LogSpecError("--log-ignore: empty pattern");
381
+ if (raw.length > MAX_IGNORE_LENGTH)
382
+ throw new LogSpecError(`--log-ignore substring is too long (max ${MAX_IGNORE_LENGTH} chars)`);
383
+ return { kind: "substring", value: raw, raw };
384
+ }
385
+ /** Whether a parsed line matches a `--log-ignore` matcher (substring/regex over the RAW line). */
386
+ export function matchesLogIgnore(line, matcher) {
387
+ return matcher.kind === "pattern" ? matcher.re.test(line.raw) : line.raw.includes(matcher.value);
388
+ }
389
+ //# sourceMappingURL=log-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-lines.js","sourceRoot":"","sources":["../src/log-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Backend log sources (#142): operator-declared, read-only, bounded. `file:<path>` tails from the
3
+ * CURRENT end (never a file's history); `docker:<container>` spawns `docker logs -f --since 0s
4
+ * <container>`; `cmd:<command>` streams an arbitrary command's stdout/stderr, refused unless the
5
+ * caller opted in (`--allow-log-cmd`) — a bigger trust step than reading a file or a container's
6
+ * own logs, since it runs a process. A source is NEVER chosen by the model: every spec comes from
7
+ * the CLI invocation only (never MissionRequest/MCP — see `packages/missions/src/schema.ts`).
8
+ *
9
+ * Bounded and non-blocking: a source never gates a mission's own progress (lines are delivered via
10
+ * callback, not awaited), and each source stops accepting lines past `maxLines` (`truncated: true`)
11
+ * rather than growing without bound on a noisy log.
12
+ */
13
+ export type LogSourceSpec = {
14
+ readonly kind: "file";
15
+ readonly path: string;
16
+ readonly raw: string;
17
+ } | {
18
+ readonly kind: "docker";
19
+ readonly container: string;
20
+ readonly raw: string;
21
+ } | {
22
+ readonly kind: "cmd";
23
+ readonly command: string;
24
+ readonly raw: string;
25
+ };
26
+ export declare class LogSourceSpecError extends Error {
27
+ readonly code: "E_LOG_SOURCE_SPEC";
28
+ constructor(message: string);
29
+ }
30
+ /** Parses one `--log-source` value. Throws `LogSourceSpecError` on an unrecognized/empty spec. */
31
+ export declare function parseLogSourceSpec(raw: string): LogSourceSpec;
32
+ /**
33
+ * Validates every spec up front, INCLUDING the `cmd:` + `--allow-log-cmd` gate — so a run refuses
34
+ * before any browser opens, the same fail-closed discipline as `--invariants`.
35
+ */
36
+ export declare function parseLogSourceSpecs(raw: readonly string[], allowLogCmd: boolean): LogSourceSpec[];
37
+ export interface LogSourceOpenOptions {
38
+ /** Called for every raw line, in arrival order. Must not throw; never awaited. */
39
+ readonly onLine: (raw: string, arrivalEpochMs: number) => void;
40
+ /** File tail poll interval (ms). Default 250. */
41
+ readonly filePollMs?: number;
42
+ /** Max lines delivered per source before later ones are dropped (`truncated` becomes true). */
43
+ readonly maxLines?: number;
44
+ }
45
+ export interface LogSourceHandle {
46
+ readonly spec: LogSourceSpec;
47
+ /** True once the source is confirmed open (file exists / process spawned without an immediate error). */
48
+ opened: boolean;
49
+ /** Lines delivered so far. */
50
+ linesRead: number;
51
+ /** Set once `maxLines` was hit: later lines are dropped, not delivered. */
52
+ truncated: boolean;
53
+ /** The open/spawn error, when the source never became readable. */
54
+ error?: string;
55
+ /** Stops tailing / kills the child process group. Idempotent; never throws. */
56
+ close(): Promise<void>;
57
+ /**
58
+ * Synchronous best-effort kill (a `docker`/`cmd:` child only; a no-op for `file:`) — for use from
59
+ * a `process.on("exit", …)` handler, where async work is not possible. Idempotent.
60
+ */
61
+ killSync(): void;
62
+ }
63
+ /**
64
+ * Opens one already-validated `--log-source`. Never throws: an unreadable/unspawnable source comes
65
+ * back with `.error` set rather than aborting a run that has other sources (the caller decides
66
+ * whether that's fatal — a `--log-defect` oracle must not count an unreadable source as "held").
67
+ */
68
+ export declare function openLogSource(spec: LogSourceSpec, opts: LogSourceOpenOptions): LogSourceHandle;
69
+ export declare function openLogSources(specs: readonly LogSourceSpec[], opts: LogSourceOpenOptions): LogSourceHandle[];
70
+ /** Closes every handle, best-effort, in parallel. Never throws. */
71
+ export declare function closeLogSources(handles: readonly LogSourceHandle[]): Promise<void>;