howone 0.1.28 → 0.1.30

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 (224) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
  3. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
  4. package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
  5. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
  6. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
  7. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
  8. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
  9. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
  10. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
  11. package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  12. package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  13. package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  14. package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  15. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
  16. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
  17. package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
  18. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
  19. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
  20. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
  21. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
  22. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
  23. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
  24. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
  25. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
  26. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
  27. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
  28. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
  29. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
  30. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
  31. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
  32. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
  33. package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
  34. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
  35. package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
  36. package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
  37. package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
  38. package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
  39. package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
  40. package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
  41. package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
  42. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
  43. package/templates/vite/.howone/skills/howone/03-sdk/07-ai-action-calls.md +28 -86
  44. package/templates/vite/.howone/skills/howone/03-sdk/09-workflow-execute-sse.md +105 -0
  45. package/templates/vite/.howone/skills/howone/04-ai/03-ai-sdk-handoff.md +15 -13
  46. package/templates/vite/.howone/skills/howone/SKILL.md +2 -2
  47. package/templates/vite/package.json +1 -1
  48. package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
  49. package/templates/vite/.howone/skills/hallmark/README.md +0 -147
  50. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
  51. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
  52. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  53. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  54. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  55. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  56. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  57. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  58. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  59. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  60. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
  61. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
  62. package/templates/vite/.howone/skills/hallmark/package.json +0 -36
  63. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  64. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
  65. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
  66. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
  67. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
  68. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
  69. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
  70. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
  71. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
  72. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
  73. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
  74. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
  75. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
  76. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
  77. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
  78. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
  79. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
  80. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
  81. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
  82. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
  83. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
  84. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
  85. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
  86. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
  87. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
  88. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
  89. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
  90. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
  91. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
  92. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
  93. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
  94. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  95. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  96. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  97. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  98. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  99. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  100. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  101. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  102. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  103. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  104. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  105. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  106. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  107. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  108. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  109. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  110. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  111. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  112. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  113. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  114. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  115. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
  136. package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
  137. package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
  138. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
  139. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
  140. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
  141. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
  142. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
  143. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
  144. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
  145. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
  146. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
  147. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
  148. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
  149. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
  150. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
  151. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
  152. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
  153. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
  154. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
  155. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
  156. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
  157. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
  158. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
  159. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
  160. package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
  161. package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
  162. package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
  163. package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
  164. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
  165. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
  166. package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
  167. package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
  168. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
  169. package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
  170. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
  171. package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
  172. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
  173. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
  174. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
  175. package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
  176. package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
  177. package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
  178. package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
  179. package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
  180. package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
  181. package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
  182. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
  183. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
  184. package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
  185. package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
  186. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
  187. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
  188. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
  189. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
  190. package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
  191. package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
  192. package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
  193. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
  194. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
  195. package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
  196. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
  197. package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
  198. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
  199. package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
  200. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
  201. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  202. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
  203. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
  204. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
  205. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
  206. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
  207. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
  208. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
  209. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
  210. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
  211. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
  212. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
  213. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
  214. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
  215. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
  216. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
  217. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
  218. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
  219. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
  220. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
  221. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
  222. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
  223. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  224. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
@@ -1,254 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { getLegacyLiveSessionsDir, getLiveSessionsDir } from './impeccable-paths.mjs';
4
-
5
- const COMPLETED_PHASES = new Set(['completed', 'discarded']);
6
-
7
- export function createLiveSessionStore({ cwd = process.cwd(), sessionId } = {}) {
8
- const rootDir = getLiveSessionsDir(cwd);
9
- const legacyRootDir = getLegacyLiveSessionsDir(cwd);
10
- fs.mkdirSync(rootDir, { recursive: true });
11
- const snapshotCache = new Map();
12
-
13
- function loadCachedOrRebuild(id) {
14
- const cached = snapshotCache.get(id);
15
- if (cached) return cached;
16
- const journalPath = getReadableJournalPath(id);
17
- const rebuilt = rebuildSnapshotFromJournal(journalPath, id);
18
- snapshotCache.set(id, rebuilt);
19
- return rebuilt;
20
- }
21
-
22
- function getReadableJournalPath(id) {
23
- const primary = getJournalPath(rootDir, id);
24
- if (fs.existsSync(primary)) return primary;
25
- const legacy = getJournalPath(legacyRootDir, id);
26
- if (fs.existsSync(legacy)) return legacy;
27
- return primary;
28
- }
29
-
30
- return {
31
- rootDir,
32
- legacyRootDir,
33
- appendEvent(event) {
34
- const normalized = normalizeEvent(event, sessionId);
35
- const journalPath = getJournalPath(rootDir, normalized.id);
36
- const snapshotPath = getSnapshotPath(rootDir, normalized.id);
37
- const legacyJournalPath = getJournalPath(legacyRootDir, normalized.id);
38
- if (!fs.existsSync(journalPath) && fs.existsSync(legacyJournalPath)) {
39
- fs.copyFileSync(legacyJournalPath, journalPath);
40
- }
41
- const prior = loadCachedOrRebuild(normalized.id);
42
- const seq = prior.nextSeq;
43
- const entry = {
44
- seq,
45
- id: normalized.id,
46
- type: normalized.type,
47
- ts: new Date().toISOString(),
48
- event: normalized,
49
- };
50
- fs.appendFileSync(journalPath, JSON.stringify(entry) + '\n');
51
- const next = applyEvent(prior.snapshot, entry, prior.diagnostics);
52
- snapshotCache.set(normalized.id, { snapshot: next, diagnostics: next.diagnostics || [], nextSeq: seq + 1 });
53
- writeSnapshot(snapshotPath, next);
54
- return next;
55
- },
56
- getSnapshot(id = sessionId, opts = {}) {
57
- if (!id) throw new Error('session id required');
58
- const journalPath = getReadableJournalPath(id);
59
- const snapshotPath = getSnapshotPath(rootDir, id);
60
- const rebuilt = rebuildSnapshotFromJournal(journalPath, id);
61
- snapshotCache.set(id, rebuilt);
62
- writeSnapshot(snapshotPath, rebuilt.snapshot);
63
- if (!opts.includeCompleted && COMPLETED_PHASES.has(rebuilt.snapshot.phase)) return null;
64
- return rebuilt.snapshot;
65
- },
66
- listActiveSessions() {
67
- const ids = new Set();
68
- for (const dir of [legacyRootDir, rootDir]) {
69
- if (!fs.existsSync(dir)) continue;
70
- for (const name of fs.readdirSync(dir)) {
71
- if (name.endsWith('.jsonl')) ids.add(name.slice(0, -'.jsonl'.length));
72
- }
73
- }
74
- return [...ids]
75
- .sort()
76
- .map((id) => this.getSnapshot(id))
77
- .filter(Boolean);
78
- },
79
- };
80
- }
81
-
82
- function normalizeEvent(event, fallbackId) {
83
- if (!event || typeof event !== 'object') throw new Error('event object required');
84
- const id = event.id || fallbackId;
85
- if (!id || typeof id !== 'string') throw new Error('event id required');
86
- if (!event.type || typeof event.type !== 'string') throw new Error('event type required');
87
- return { ...event, id };
88
- }
89
-
90
- function getJournalPath(rootDir, id) {
91
- return path.join(rootDir, safeSessionId(id) + '.jsonl');
92
- }
93
-
94
- function getSnapshotPath(rootDir, id) {
95
- return path.join(rootDir, safeSessionId(id) + '.snapshot.json');
96
- }
97
-
98
- function safeSessionId(id) {
99
- if (!/^[A-Za-z0-9_-]{1,128}$/.test(id)) throw new Error('invalid session id: ' + id);
100
- return id;
101
- }
102
-
103
- function baseSnapshot(id) {
104
- return {
105
- id,
106
- phase: 'new',
107
- pageUrl: null,
108
- sourceFile: null,
109
- expectedVariants: 0,
110
- arrivedVariants: 0,
111
- visibleVariant: null,
112
- paramValues: {},
113
- pendingEventSeq: null,
114
- pendingEvent: null,
115
- deliveryLease: null,
116
- checkpointRevision: 0,
117
- activeOwner: null,
118
- sourceMarkers: {},
119
- fallbackMode: null,
120
- annotationArtifacts: [],
121
- diagnostics: [],
122
- updatedAt: null,
123
- };
124
- }
125
-
126
- function rebuildSnapshotFromJournal(journalPath, id) {
127
- let snapshot = baseSnapshot(id);
128
- const diagnostics = [];
129
- let nextSeq = 1;
130
- if (!fs.existsSync(journalPath)) return { snapshot, diagnostics, nextSeq };
131
-
132
- const lines = fs.readFileSync(journalPath, 'utf-8').split('\n');
133
- for (let i = 0; i < lines.length; i++) {
134
- const line = lines[i];
135
- if (!line.trim()) continue;
136
- try {
137
- const entry = JSON.parse(line);
138
- if (!entry || typeof entry !== 'object') throw new Error('entry is not object');
139
- if (Number.isInteger(entry.seq)) nextSeq = Math.max(nextSeq, entry.seq + 1);
140
- snapshot = applyEvent(snapshot, entry);
141
- } catch (err) {
142
- diagnostics.push({
143
- error: 'journal_parse_failed',
144
- line: i + 1,
145
- message: err.message,
146
- });
147
- }
148
- }
149
- snapshot.diagnostics = [...snapshot.diagnostics, ...diagnostics];
150
- return { snapshot, diagnostics, nextSeq };
151
- }
152
-
153
- function applyEvent(snapshot, entry, inheritedDiagnostics = []) {
154
- const event = entry.event || entry;
155
- const next = {
156
- ...snapshot,
157
- paramValues: { ...(snapshot.paramValues || {}) },
158
- sourceMarkers: { ...(snapshot.sourceMarkers || {}) },
159
- annotationArtifacts: [...(snapshot.annotationArtifacts || [])],
160
- diagnostics: [...(snapshot.diagnostics || [])],
161
- updatedAt: entry.ts || new Date().toISOString(),
162
- };
163
-
164
- if (inheritedDiagnostics.length && next.diagnostics.length === 0) {
165
- next.diagnostics = [...inheritedDiagnostics];
166
- }
167
-
168
- switch (event.type) {
169
- case 'generate':
170
- next.phase = 'generate_requested';
171
- next.pageUrl = event.pageUrl ?? next.pageUrl;
172
- next.expectedVariants = event.count ?? next.expectedVariants;
173
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
174
- next.pendingEvent = toPendingEvent(event);
175
- if (event.screenshotPath) upsertArtifact(next.annotationArtifacts, { type: 'screenshot', path: event.screenshotPath });
176
- break;
177
- case 'variants_ready':
178
- case 'agent_done':
179
- next.phase = event.carbonize === true ? 'carbonize_required' : 'variants_ready';
180
- next.sourceFile = event.file ?? next.sourceFile;
181
- next.arrivedVariants = event.arrivedVariants ?? (next.arrivedVariants ?? next.expectedVariants);
182
- next.pendingEventSeq = null;
183
- next.pendingEvent = null;
184
- if (event.carbonize === true) {
185
- next.diagnostics.push({
186
- error: 'carbonize_cleanup_required',
187
- file: event.file || null,
188
- message: 'Accepted variant still has carbonize markers that must be folded into source CSS.',
189
- });
190
- }
191
- break;
192
- case 'checkpoint':
193
- if ((event.revision ?? 0) >= (next.checkpointRevision ?? 0)) {
194
- next.phase = event.phase ?? next.phase;
195
- next.checkpointRevision = event.revision ?? next.checkpointRevision;
196
- next.activeOwner = event.owner ?? next.activeOwner;
197
- next.arrivedVariants = event.arrivedVariants ?? next.arrivedVariants;
198
- next.visibleVariant = event.visibleVariant ?? next.visibleVariant;
199
- if (event.paramValues) next.paramValues = { ...event.paramValues };
200
- } else {
201
- next.diagnostics.push({ error: 'stale_checkpoint_ignored', revision: event.revision });
202
- }
203
- break;
204
- case 'accept':
205
- case 'accept_intent':
206
- next.phase = 'accept_requested';
207
- next.visibleVariant = Number(event.variantId ?? next.visibleVariant);
208
- if (event.paramValues) next.paramValues = { ...event.paramValues };
209
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
210
- next.pendingEvent = toPendingEvent(event);
211
- break;
212
- case 'discard':
213
- next.phase = 'discard_requested';
214
- next.pendingEventSeq = entry.seq ?? next.pendingEventSeq;
215
- next.pendingEvent = toPendingEvent(event);
216
- break;
217
- case 'discarded':
218
- next.phase = 'discarded';
219
- next.pendingEventSeq = null;
220
- next.pendingEvent = null;
221
- break;
222
- case 'complete':
223
- next.phase = 'completed';
224
- next.pendingEventSeq = null;
225
- next.pendingEvent = null;
226
- break;
227
- case 'agent_error':
228
- next.phase = 'agent_error';
229
- next.pendingEventSeq = null;
230
- next.pendingEvent = null;
231
- next.diagnostics.push({ error: 'agent_error', message: event.message || 'unknown agent error' });
232
- break;
233
- default:
234
- next.diagnostics.push({ error: 'unknown_event_type', type: event.type });
235
- break;
236
- }
237
- return next;
238
- }
239
-
240
- function toPendingEvent(event) {
241
- const pending = { ...event };
242
- delete pending.token;
243
- return pending;
244
- }
245
-
246
- function upsertArtifact(artifacts, artifact) {
247
- if (!artifacts.some((existing) => existing.path === artifact.path && existing.type === artifact.type)) {
248
- artifacts.push(artifact);
249
- }
250
- }
251
-
252
- function writeSnapshot(snapshotPath, snapshot) {
253
- fs.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2) + '\n');
254
- }
@@ -1,47 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Print durable recovery status for Impeccable live sessions.
4
- */
5
-
6
- import { createLiveSessionStore } from './live-session-store.mjs';
7
- import { readLiveServerInfo } from './impeccable-paths.mjs';
8
-
9
- function readServerInfo() {
10
- return readLiveServerInfo(process.cwd())?.info || null;
11
- }
12
-
13
- async function fetchServerStatus(info) {
14
- if (!info) return null;
15
- try {
16
- const res = await fetch(`http://localhost:${info.port}/status?token=${info.token}`);
17
- if (!res.ok) return null;
18
- return await res.json();
19
- } catch {
20
- return null;
21
- }
22
- }
23
-
24
- export async function statusCli() {
25
- const info = readServerInfo();
26
- const server = await fetchServerStatus(info);
27
- const store = createLiveSessionStore({ cwd: process.cwd() });
28
- const activeSessions = store.listActiveSessions();
29
- const payload = {
30
- liveServer: server ? {
31
- status: server.status,
32
- port: server.port,
33
- connectedClients: server.connectedClients,
34
- pendingEvents: server.pendingEvents,
35
- } : null,
36
- activeSessions: server?.activeSessions || activeSessions,
37
- recoveryHint: server
38
- ? 'Run live-poll.mjs to continue pending work, or live-complete.mjs --id <session> after manual cleanup.'
39
- : 'Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.',
40
- };
41
- console.log(JSON.stringify(payload, null, 2));
42
- }
43
-
44
- const _running = process.argv[1];
45
- if (_running?.endsWith('live-status.mjs') || _running?.endsWith('live-status.mjs/')) {
46
- statusCli();
47
- }