@multiplayer-app/sandbox 0.0.32 → 0.0.33-beta.2

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 (116) hide show
  1. package/dist/agents/content-generator.agent.d.ts +8 -0
  2. package/dist/agents/content-generator.agent.d.ts.map +1 -1
  3. package/dist/agents/content-generator.agent.js +53 -6
  4. package/dist/agents/content-generator.agent.js.map +1 -1
  5. package/dist/agents/notebook.agent.d.ts.map +1 -1
  6. package/dist/agents/notebook.agent.js +2 -1
  7. package/dist/agents/notebook.agent.js.map +1 -1
  8. package/dist/agents/shared/build-plan.tools.d.ts.map +1 -1
  9. package/dist/agents/shared/build-plan.tools.js +4 -4
  10. package/dist/agents/shared/build-plan.tools.js.map +1 -1
  11. package/dist/agents/shared/content-generator-system-prompt.d.ts +3 -2
  12. package/dist/agents/shared/content-generator-system-prompt.d.ts.map +1 -1
  13. package/dist/agents/shared/content-generator-system-prompt.js +41 -24
  14. package/dist/agents/shared/content-generator-system-prompt.js.map +1 -1
  15. package/dist/agents/shared/publish-session-artifacts.tool.d.ts +5 -0
  16. package/dist/agents/shared/publish-session-artifacts.tool.d.ts.map +1 -1
  17. package/dist/agents/shared/publish-session-artifacts.tool.js +154 -15
  18. package/dist/agents/shared/publish-session-artifacts.tool.js.map +1 -1
  19. package/dist/agents/shared/session-quality-report.tool.js +1 -1
  20. package/dist/agents/shared/session-quality-report.tool.js.map +1 -1
  21. package/dist/agents/shared/update-session-artifacts.tool.d.ts +5 -0
  22. package/dist/agents/shared/update-session-artifacts.tool.d.ts.map +1 -1
  23. package/dist/agents/shared/update-session-artifacts.tool.js +136 -26
  24. package/dist/agents/shared/update-session-artifacts.tool.js.map +1 -1
  25. package/dist/agents/shared/validate-artifact-content.tools.d.ts +4 -0
  26. package/dist/agents/shared/validate-artifact-content.tools.d.ts.map +1 -1
  27. package/dist/agents/shared/validate-artifact-content.tools.js +24 -1
  28. package/dist/agents/shared/validate-artifact-content.tools.js.map +1 -1
  29. package/dist/agents/skills/designer.skill.d.ts.map +1 -1
  30. package/dist/agents/skills/designer.skill.js +75 -113
  31. package/dist/agents/skills/designer.skill.js.map +1 -1
  32. package/dist/agents/skills/skill-injection.d.ts.map +1 -1
  33. package/dist/agents/skills/skill-injection.js +9 -3
  34. package/dist/agents/skills/skill-injection.js.map +1 -1
  35. package/dist/context.d.ts +4 -0
  36. package/dist/context.d.ts.map +1 -1
  37. package/dist/context.js.map +1 -1
  38. package/dist/create-builder-api.d.ts +6 -0
  39. package/dist/create-builder-api.d.ts.map +1 -1
  40. package/dist/create-builder-api.js +2 -0
  41. package/dist/create-builder-api.js.map +1 -1
  42. package/dist/index.d.ts +4 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +6 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/lib/notebooks/notebook-storage-paths.d.ts +8 -0
  47. package/dist/lib/notebooks/notebook-storage-paths.d.ts.map +1 -0
  48. package/dist/lib/notebooks/notebook-storage-paths.js +22 -0
  49. package/dist/lib/notebooks/notebook-storage-paths.js.map +1 -0
  50. package/dist/lib/notebooks/notebook-yjs-content.d.ts +6 -0
  51. package/dist/lib/notebooks/notebook-yjs-content.d.ts.map +1 -0
  52. package/dist/lib/notebooks/notebook-yjs-content.js +42 -0
  53. package/dist/lib/notebooks/notebook-yjs-content.js.map +1 -0
  54. package/dist/lib/object-storage/keys.d.ts +1 -0
  55. package/dist/lib/object-storage/keys.d.ts.map +1 -1
  56. package/dist/lib/object-storage/keys.js +5 -0
  57. package/dist/lib/object-storage/keys.js.map +1 -1
  58. package/dist/lib/object-storage/named-snapshot-paths.d.ts +9 -0
  59. package/dist/lib/object-storage/named-snapshot-paths.d.ts.map +1 -0
  60. package/dist/lib/object-storage/named-snapshot-paths.js +39 -0
  61. package/dist/lib/object-storage/named-snapshot-paths.js.map +1 -0
  62. package/dist/lib/session-artifacts/hashline-diff-guide.d.ts +1 -1
  63. package/dist/lib/session-artifacts/hashline-diff-guide.d.ts.map +1 -1
  64. package/dist/lib/session-artifacts/hashline-diff-guide.js +9 -5
  65. package/dist/lib/session-artifacts/hashline-diff-guide.js.map +1 -1
  66. package/dist/lib/session-artifacts/parse-hashline-diff.d.ts +13 -0
  67. package/dist/lib/session-artifacts/parse-hashline-diff.d.ts.map +1 -1
  68. package/dist/lib/session-artifacts/parse-hashline-diff.js +72 -0
  69. package/dist/lib/session-artifacts/parse-hashline-diff.js.map +1 -1
  70. package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -1
  71. package/dist/lib/session-pages/artifact-quality-audit.js +19 -14
  72. package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -1
  73. package/dist/lib/session-pages/artifact-storage-paths.d.ts +1 -0
  74. package/dist/lib/session-pages/artifact-storage-paths.d.ts.map +1 -1
  75. package/dist/lib/session-pages/artifact-storage-paths.js +9 -5
  76. package/dist/lib/session-pages/artifact-storage-paths.js.map +1 -1
  77. package/dist/lib/session-pages/html-artifact-template.d.ts +16 -0
  78. package/dist/lib/session-pages/html-artifact-template.d.ts.map +1 -1
  79. package/dist/lib/session-pages/html-artifact-template.js +166 -10
  80. package/dist/lib/session-pages/html-artifact-template.js.map +1 -1
  81. package/dist/lib/session-pages/index.d.ts +4 -0
  82. package/dist/lib/session-pages/index.d.ts.map +1 -1
  83. package/dist/lib/session-pages/index.js +11 -1
  84. package/dist/lib/session-pages/index.js.map +1 -1
  85. package/dist/lib/session-pages/write-session-artifacts.d.ts +1 -0
  86. package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
  87. package/dist/lib/session-pages/write-session-artifacts.js +4 -1
  88. package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
  89. package/dist/lib/session-plans/build-plan.d.ts +13 -3
  90. package/dist/lib/session-plans/build-plan.d.ts.map +1 -1
  91. package/dist/lib/session-plans/build-plan.js +37 -6
  92. package/dist/lib/session-plans/build-plan.js.map +1 -1
  93. package/dist/lib/yjs-pending/flush-worker.d.ts +1 -1
  94. package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -1
  95. package/dist/lib/yjs-pending/flush-worker.js +3 -33
  96. package/dist/lib/yjs-pending/flush-worker.js.map +1 -1
  97. package/dist/lib/yjs-pending/snapshot-retention.d.ts +6 -0
  98. package/dist/lib/yjs-pending/snapshot-retention.d.ts.map +1 -0
  99. package/dist/lib/yjs-pending/snapshot-retention.js +33 -0
  100. package/dist/lib/yjs-pending/snapshot-retention.js.map +1 -0
  101. package/dist/lib/yjs-pending/yjs-persistence.d.ts +1 -0
  102. package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -1
  103. package/dist/lib/yjs-pending/yjs-persistence.js +36 -0
  104. package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -1
  105. package/dist/realtime/session-artifact-yjs-store.d.ts +21 -0
  106. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  107. package/dist/realtime/session-artifact-yjs-store.js +84 -0
  108. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  109. package/dist/routes/notebooks.d.ts.map +1 -1
  110. package/dist/routes/notebooks.js +2 -0
  111. package/dist/routes/notebooks.js.map +1 -1
  112. package/dist/routes/schemas.d.ts +2 -2
  113. package/dist/server.d.ts.map +1 -1
  114. package/dist/server.js +2 -0
  115. package/dist/server.js.map +1 -1
  116. package/package.json +4 -4
@@ -1,30 +1,151 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isHtmlFragment = isHtmlFragment;
4
+ exports.ensureWebFontHeadExtras = ensureWebFontHeadExtras;
4
5
  exports.wrapHtmlFragment = wrapHtmlFragment;
6
+ exports.stripEmojiIcons = stripEmojiIcons;
7
+ exports.stripTemplateCopyPhrases = stripTemplateCopyPhrases;
5
8
  exports.prepareHtmlArtifactContent = prepareHtmlArtifactContent;
6
- const PICO_CSS_URL = 'https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css';
9
+ const TAILWIND_CDN_URL = 'https://cdn.tailwindcss.com?plugins=forms,typography';
7
10
  const FULL_HTML_DOCUMENT_PATTERN = /<!DOCTYPE\s+html|<html[\s>]/i;
11
+ /** Fallback pairing when the model forgot fonts — never Inter. */
12
+ const DEFAULT_FONT_FAMILIES = ['Manrope', 'Source Sans 3'];
13
+ const GENERIC_FONT_TOKENS = new Set([
14
+ 'serif',
15
+ 'sans-serif',
16
+ 'monospace',
17
+ 'cursive',
18
+ 'fantasy',
19
+ 'system-ui',
20
+ 'ui-sans-serif',
21
+ 'ui-serif',
22
+ 'ui-monospace',
23
+ 'ui-rounded',
24
+ 'emoji',
25
+ 'math',
26
+ 'fangsong',
27
+ 'inherit',
28
+ 'initial',
29
+ 'unset',
30
+ 'revert',
31
+ 'arial',
32
+ 'helvetica',
33
+ 'times',
34
+ 'georgia',
35
+ 'verdana',
36
+ 'tahoma',
37
+ ]);
38
+ const OWN_MAIN_PATTERN = /<main[\s>]/i;
8
39
  function isHtmlFragment(content) {
9
40
  return !FULL_HTML_DOCUMENT_PATTERN.test(content.trim());
10
41
  }
42
+ /** Derive a document title from the fragment's first heading — a missing
43
+ * `title` field is deterministically fixable, never worth a rejection loop. */
44
+ function deriveTitle(fragment) {
45
+ var _a;
46
+ const heading = (_a = fragment.match(/<h1[^>]*>([\s\S]*?)<\/h1>/i)) === null || _a === void 0 ? void 0 : _a[1];
47
+ if (!heading)
48
+ return undefined;
49
+ const text = heading.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
50
+ return text ? text.slice(0, 80) : undefined;
51
+ }
52
+ function extractNamedFontFamilies(html) {
53
+ const families = [];
54
+ for (const match of html.matchAll(/font-family\s*:\s*([^;}{]+)/gi)) {
55
+ for (const part of match[1].split(',')) {
56
+ const name = part.replace(/["']/g, '').trim();
57
+ if (!name || GENERIC_FONT_TOKENS.has(name.toLowerCase()))
58
+ continue;
59
+ if (/^inter$/i.test(name))
60
+ continue;
61
+ if (!families.some((family) => family.toLowerCase() === name.toLowerCase())) {
62
+ families.push(name);
63
+ }
64
+ }
65
+ }
66
+ return families;
67
+ }
68
+ function hasWebFontLink(html) {
69
+ return /fonts\.googleapis\.com|fonts\.gstatic\.com|fonts\.bunny\.net/i.test(html);
70
+ }
71
+ function googleFontsStylesheetLink(families) {
72
+ const params = families
73
+ .slice(0, 3)
74
+ .map((family) => `family=${encodeURIComponent(family).replace(/%20/g, '+')}:wght@400;600;700;800`)
75
+ .join('&');
76
+ return `<link href="https://fonts.googleapis.com/css2?${params}&display=swap" rel="stylesheet">`;
77
+ }
78
+ /**
79
+ * Repair missing webfont loading. Models often set font-family without the
80
+ * matching <link> (or forget both) — rejecting that caused endless revise loops.
81
+ * Prefer families already named in CSS; otherwise a non-Inter default pairing.
82
+ */
83
+ function ensureWebFontHeadExtras(html) {
84
+ if (hasWebFontLink(html)) {
85
+ return [];
86
+ }
87
+ const named = extractNamedFontFamilies(html);
88
+ const families = named.length > 0 ? named : [...DEFAULT_FONT_FAMILIES];
89
+ const extras = [googleFontsStylesheetLink(families)];
90
+ if (named.length === 0 && !/font-family\s*:/i.test(html)) {
91
+ extras.push(`<style>body { font-family: '${DEFAULT_FONT_FAMILIES[0]}', '${DEFAULT_FONT_FAMILIES[1]}', sans-serif; }</style>`);
92
+ }
93
+ return extras;
94
+ }
95
+ /**
96
+ * Server-side completion: deterministically repair/complete everything
97
+ * rule-shaped so a first-pass model output plus this step equals a finished
98
+ * file — repair beats reject wherever repair is unambiguous.
99
+ */
100
+ function completeFragment(fragment) {
101
+ var _a, _b, _c, _d;
102
+ let body = fragment.trim();
103
+ const headExtras = [];
104
+ // Auto-close dangling <style>/<script> — unclosed tags swallow the rest of
105
+ // the document and were a repeat model failure.
106
+ const openStyles = ((_a = body.match(/<style[^>]*>/gi)) !== null && _a !== void 0 ? _a : []).length;
107
+ const closeStyles = ((_b = body.match(/<\/style>/gi)) !== null && _b !== void 0 ? _b : []).length;
108
+ if (openStyles > closeStyles)
109
+ body += '\n</style>'.repeat(openStyles - closeStyles);
110
+ const openScripts = ((_c = body.match(/<script[^>]*>/gi)) !== null && _c !== void 0 ? _c : []).length;
111
+ const closeScripts = ((_d = body.match(/<\/script>/gi)) !== null && _d !== void 0 ? _d : []).length;
112
+ if (openScripts > closeScripts)
113
+ body += '\n</script>'.repeat(openScripts - closeScripts);
114
+ headExtras.push(...ensureWebFontHeadExtras(body));
115
+ // Page-level background matching the page's own scheme, so gutters and
116
+ // overscroll never flash the wrong color. Dark when the first colored
117
+ // surface is a dark shade; model overrides win (body{background} in style).
118
+ const stylesBodyBg = /body\s*{[^}]*background/i.test(body);
119
+ if (!stylesBodyBg) {
120
+ const firstBg = body.match(/class="[^"]*\bbg-(?:slate|gray|zinc|neutral|stone)-(\d{3})\b/);
121
+ const dark = firstBg ? Number.parseInt(firstBg[1], 10) >= 800 : false;
122
+ headExtras.push(dark
123
+ ? '<style>body { background: #020617; } :root { color-scheme: dark; }</style>'
124
+ : '<style>body { background: #f8fafc; }</style>');
125
+ }
126
+ return { body, headExtras };
127
+ }
11
128
  function wrapHtmlFragment(fragment, options = {}) {
12
129
  var _a, _b;
13
130
  const lang = (_a = options.lang) !== null && _a !== void 0 ? _a : 'en';
14
- const title = ((_b = options.title) === null || _b === void 0 ? void 0 : _b.trim()) || 'Page';
15
- const body = fragment.trim();
131
+ const { body: completed, headExtras } = completeFragment(fragment);
132
+ const title = ((_b = options.title) === null || _b === void 0 ? void 0 : _b.trim()) || deriveTitle(completed) || 'Page';
133
+ // Bare <main> only — a constrained container here would clip full-bleed
134
+ // section backgrounds to the column and leave body-colored gutters.
135
+ const bodyContent = OWN_MAIN_PATTERN.test(completed) ? completed : ` <main>\n${completed}\n </main>`;
136
+ const extras = headExtras.length > 0 ? `\n ${headExtras.join('\n ')}` : '';
16
137
  return `<!DOCTYPE html>
17
138
  <html lang="${lang}">
18
139
  <head>
19
140
  <meta charset="utf-8">
20
141
  <meta name="viewport" content="width=device-width, initial-scale=1">
21
- <link rel="stylesheet" href="${PICO_CSS_URL}">
142
+ <meta name="color-scheme" content="light">
143
+ <script src="${TAILWIND_CDN_URL}"></script>
144
+ <script>tailwind.config = { darkMode: 'class' }</script>${extras}
22
145
  <title>${escapeHtml(title)}</title>
23
146
  </head>
24
147
  <body>
25
- <main class="container">
26
- ${body}
27
- </main>
148
+ ${bodyContent}
28
149
  </body>
29
150
  </html>
30
151
  `;
@@ -36,11 +157,46 @@ function escapeHtml(value) {
36
157
  .replace(/>/g, '&gt;')
37
158
  .replace(/"/g, '&quot;');
38
159
  }
160
+ /** Inject webfont <link> (+ body font-family if needed) into a full document. */
161
+ function ensureWebFontsInFullDocument(html) {
162
+ const extras = ensureWebFontHeadExtras(html);
163
+ if (extras.length === 0)
164
+ return html;
165
+ if (/<\/head>/i.test(html)) {
166
+ return html.replace(/<\/head>/i, ` ${extras.join('\n ')}\n</head>`);
167
+ }
168
+ return `${extras.join('\n')}\n${html}`;
169
+ }
170
+ const ALLOWED_SYMBOL_CHARS = new Set(['©', '®', '™', '°', '†', '‡', '§', '¶']);
171
+ /**
172
+ * Strip emoji-as-icons from markup. Models keep inserting 🚀/✨ then looping on
173
+ * the emoji-icons audit — repair beats reject.
174
+ */
175
+ function stripEmojiIcons(html) {
176
+ return html
177
+ .replace(/\p{Extended_Pictographic}/gu, (char) => (ALLOWED_SYMBOL_CHARS.has(char) ? char : ''))
178
+ .replace(/[ \t]+\n/g, '\n')
179
+ .replace(/\n{3,}/g, '\n\n');
180
+ }
181
+ /**
182
+ * Neutralize the most common "AI template" phrases that otherwise fail the
183
+ * template-copy audit and trigger revise loops.
184
+ */
185
+ function stripTemplateCopyPhrases(html) {
186
+ return html
187
+ .replace(/\bWelcome\s+to\s+(?:our|the)\s+/gi, '')
188
+ .replace(/\brevolutionary\b/gi, 'practical')
189
+ .replace(/\bseamless(?:ly)?\b/gi, 'straightforward')
190
+ .replace(/\bcutting-edge\b/gi, 'modern')
191
+ .replace(/\bunleash(?:ing|es|ed)?\b/gi, 'open')
192
+ .replace(/\bempower(?:ing|s|ed)?\b/gi, 'support');
193
+ }
39
194
  function prepareHtmlArtifactContent(content, options = {}) {
40
- const useFragment = options.fragment === true || (options.fragment !== false && isHtmlFragment(content));
195
+ const cleaned = stripTemplateCopyPhrases(stripEmojiIcons(content));
196
+ const useFragment = options.fragment === true || (options.fragment !== false && isHtmlFragment(cleaned));
41
197
  if (!useFragment) {
42
- return content;
198
+ return ensureWebFontsInFullDocument(cleaned);
43
199
  }
44
- return wrapHtmlFragment(content, { title: options.title, lang: options.lang });
200
+ return wrapHtmlFragment(cleaned, { title: options.title, lang: options.lang });
45
201
  }
46
202
  //# sourceMappingURL=html-artifact-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-artifact-template.js","sourceRoot":"","sources":["../../../src/lib/session-pages/html-artifact-template.ts"],"names":[],"mappings":";;AASA,wCAEC;AAED,4CAoBC;AAUD,gEAUC;AArDD,MAAM,YAAY,GAAG,+DAA+D,CAAA;AAEpF,MAAM,0BAA0B,GAAG,8BAA8B,CAAA;AAOjE,SAAgB,cAAc,CAAC,OAAe;IAC5C,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,UAAmC,EAAE;;IACtF,MAAM,IAAI,GAAG,MAAA,OAAO,CAAC,IAAI,mCAAI,IAAI,CAAA;IACjC,MAAM,KAAK,GAAG,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,IAAI,EAAE,KAAI,MAAM,CAAA;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE5B,OAAO;cACK,IAAI;;;;iCAIe,YAAY;WAClC,UAAU,CAAC,KAAK,CAAC;;;;EAI1B,IAAI;;;;CAIL,CAAA;AACD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED,SAAgB,0BAA0B,CACxC,OAAe,EACf,UAAiE,EAAE;IAEnE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IACxG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAChF,CAAC"}
1
+ {"version":3,"file":"html-artifact-template.js","sourceRoot":"","sources":["../../../src/lib/session-pages/html-artifact-template.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ export { listSessionArtifacts, type SessionArtifactEntry } from './list-session-
3
3
  export { readSessionArtifacts, sessionArtifactExists, type ReadSessionArtifactResult, } from './read-session-artifacts';
4
4
  export { deleteSessionArtifact, type DeleteSessionArtifactResult, } from './delete-session-artifact';
5
5
  export { resolveArtifactNotifyUserIds } from './resolve-artifact-notify-user-ids';
6
+ export { auditHtmlArtifact, type QualityAuditResult, type QualityFinding, } from './artifact-quality-audit';
7
+ export { auditSessionHtmlArtifacts, sessionQualityToAdvisoryLines, type SessionQualityIssue, type SessionQualityReport, } from './audit-session-html';
8
+ export { DEFERRED_QUALITY_RULES, isDeferredQualityRule } from './deferred-quality-rules';
6
9
  export { deleteAllSessionArtifacts, type DeleteAllSessionArtifactsResult, } from './delete-session-artifacts';
7
10
  export { writeSessionArtifacts, type SessionArtifactFile, type WriteSessionArtifactsInput, type WriteSessionArtifactsResult, } from './write-session-artifacts';
11
+ export { prepareHtmlArtifactContent } from './html-artifact-template';
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,yBAAyB,GAC/B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,GACjC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AACjF,OAAO,EACL,yBAAyB,EACzB,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,yBAAyB,GAC/B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,GACjC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AACjF,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,GACpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AACxF,OAAO,EACL,yBAAyB,EACzB,KAAK,+BAA+B,GACrC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.writeSessionArtifacts = exports.deleteAllSessionArtifacts = exports.resolveArtifactNotifyUserIds = exports.deleteSessionArtifact = exports.sessionArtifactExists = exports.readSessionArtifacts = exports.listSessionArtifacts = exports.resolveArtifactPath = exports.normalizeArtifactPath = exports.getSessionsRoot = exports.getSessionDir = void 0;
3
+ exports.prepareHtmlArtifactContent = exports.writeSessionArtifacts = exports.deleteAllSessionArtifacts = exports.isDeferredQualityRule = exports.DEFERRED_QUALITY_RULES = exports.sessionQualityToAdvisoryLines = exports.auditSessionHtmlArtifacts = exports.auditHtmlArtifact = exports.resolveArtifactNotifyUserIds = exports.deleteSessionArtifact = exports.sessionArtifactExists = exports.readSessionArtifacts = exports.listSessionArtifacts = exports.resolveArtifactPath = exports.normalizeArtifactPath = exports.getSessionsRoot = exports.getSessionDir = void 0;
4
4
  var paths_1 = require("./paths");
5
5
  Object.defineProperty(exports, "getSessionDir", { enumerable: true, get: function () { return paths_1.getSessionDir; } });
6
6
  Object.defineProperty(exports, "getSessionsRoot", { enumerable: true, get: function () { return paths_1.getSessionsRoot; } });
@@ -15,8 +15,18 @@ var delete_session_artifact_1 = require("./delete-session-artifact");
15
15
  Object.defineProperty(exports, "deleteSessionArtifact", { enumerable: true, get: function () { return delete_session_artifact_1.deleteSessionArtifact; } });
16
16
  var resolve_artifact_notify_user_ids_1 = require("./resolve-artifact-notify-user-ids");
17
17
  Object.defineProperty(exports, "resolveArtifactNotifyUserIds", { enumerable: true, get: function () { return resolve_artifact_notify_user_ids_1.resolveArtifactNotifyUserIds; } });
18
+ var artifact_quality_audit_1 = require("./artifact-quality-audit");
19
+ Object.defineProperty(exports, "auditHtmlArtifact", { enumerable: true, get: function () { return artifact_quality_audit_1.auditHtmlArtifact; } });
20
+ var audit_session_html_1 = require("./audit-session-html");
21
+ Object.defineProperty(exports, "auditSessionHtmlArtifacts", { enumerable: true, get: function () { return audit_session_html_1.auditSessionHtmlArtifacts; } });
22
+ Object.defineProperty(exports, "sessionQualityToAdvisoryLines", { enumerable: true, get: function () { return audit_session_html_1.sessionQualityToAdvisoryLines; } });
23
+ var deferred_quality_rules_1 = require("./deferred-quality-rules");
24
+ Object.defineProperty(exports, "DEFERRED_QUALITY_RULES", { enumerable: true, get: function () { return deferred_quality_rules_1.DEFERRED_QUALITY_RULES; } });
25
+ Object.defineProperty(exports, "isDeferredQualityRule", { enumerable: true, get: function () { return deferred_quality_rules_1.isDeferredQualityRule; } });
18
26
  var delete_session_artifacts_1 = require("./delete-session-artifacts");
19
27
  Object.defineProperty(exports, "deleteAllSessionArtifacts", { enumerable: true, get: function () { return delete_session_artifacts_1.deleteAllSessionArtifacts; } });
20
28
  var write_session_artifacts_1 = require("./write-session-artifacts");
21
29
  Object.defineProperty(exports, "writeSessionArtifacts", { enumerable: true, get: function () { return write_session_artifacts_1.writeSessionArtifacts; } });
30
+ var html_artifact_template_1 = require("./html-artifact-template");
31
+ Object.defineProperty(exports, "prepareHtmlArtifactContent", { enumerable: true, get: function () { return html_artifact_template_1.prepareHtmlArtifactContent; } });
22
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/session-pages/index.ts"],"names":[],"mappings":";;;AAAA,iCAKgB;AAJd,sGAAA,aAAa,OAAA;AACb,wGAAA,eAAe,OAAA;AACf,8GAAA,qBAAqB,OAAA;AACrB,4GAAA,mBAAmB,OAAA;AAErB,mEAA0F;AAAjF,8HAAA,oBAAoB,OAAA;AAC7B,mEAIiC;AAH/B,8HAAA,oBAAoB,OAAA;AACpB,+HAAA,qBAAqB,OAAA;AAGvB,qEAGkC;AAFhC,gIAAA,qBAAqB,OAAA;AAGvB,uFAAiF;AAAxE,gJAAA,4BAA4B,OAAA;AACrC,uEAGmC;AAFjC,qIAAA,yBAAyB,OAAA;AAG3B,qEAKkC;AAJhC,gIAAA,qBAAqB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/session-pages/index.ts"],"names":[],"mappings":";;;AAAA,iCAKgB;AAJd,sGAAA,aAAa,OAAA;AACb,wGAAA,eAAe,OAAA;AACf,8GAAA,qBAAqB,OAAA;AACrB,4GAAA,mBAAmB,OAAA;AAErB,mEAA0F;AAAjF,8HAAA,oBAAoB,OAAA;AAC7B,mEAIiC;AAH/B,8HAAA,oBAAoB,OAAA;AACpB,+HAAA,qBAAqB,OAAA;AAGvB,qEAGkC;AAFhC,gIAAA,qBAAqB,OAAA;AAGvB,uFAAiF;AAAxE,gJAAA,4BAA4B,OAAA;AACrC,mEAIiC;AAH/B,2HAAA,iBAAiB,OAAA;AAInB,2DAK6B;AAJ3B,+HAAA,yBAAyB,OAAA;AACzB,mIAAA,6BAA6B,OAAA;AAI/B,mEAAwF;AAA/E,gIAAA,sBAAsB,OAAA;AAAE,+HAAA,qBAAqB,OAAA;AACtD,uEAGmC;AAFjC,qIAAA,yBAAyB,OAAA;AAG3B,qEAKkC;AAJhC,gIAAA,qBAAqB,OAAA;AAKvB,mEAAqE;AAA5D,oIAAA,0BAA0B,OAAA"}
@@ -1,6 +1,7 @@
1
1
  export interface SessionArtifactFile {
2
2
  path: string;
3
3
  content: string;
4
+ /** For .html files: when true, content is a body/main fragment wrapped in a Tailwind shell server-side. */
4
5
  fragment?: boolean;
5
6
  title?: string;
6
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"write-session-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/write-session-artifacts.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,wBAAwB,EAAE,CAAA;CACtC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CAmCtC"}
1
+ {"version":3,"file":"write-session-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/write-session-artifacts.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,wBAAwB,EAAE,CAAA;CACtC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CAsCtC"}
@@ -21,7 +21,10 @@ async function writeSessionArtifacts(input) {
21
21
  title: file.title,
22
22
  })
23
23
  : file.content;
24
- const published = await store.initializeFromContent(input.sessionId, relativePath, content);
24
+ // Upsert: create-only conflict is enforced by publishSessionArtifacts
25
+ // (cross-subagent). Self-revision after an audit repair must overwrite —
26
+ // initializeFromContent threw "File already exists" and forced update loops.
27
+ const published = await store.upsertFromContent(input.sessionId, relativePath, content);
25
28
  artifacts.push({
26
29
  path: published.path,
27
30
  bytes: published.bytes,
@@ -1 +1 @@
1
- {"version":3,"file":"write-session-artifacts.js","sourceRoot":"","sources":["../../../src/lib/session-pages/write-session-artifacts.ts"],"names":[],"mappings":";;AA2BA,sDAqCC;AAhED,0FAAsF;AACtF,sEAAoE;AACpE,qEAAqE;AACrE,qEAA+D;AAC/D,mCAA+C;AAuBxC,KAAK,UAAU,qBAAqB,CACzC,KAAiC;;IAEjC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IAC1C,MAAM,SAAS,GAA+B,EAAE,CAAA;IAEhD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,OAAO,GACX,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1C,CAAC,CAAC,IAAA,mDAA0B,EAAC,IAAI,CAAC,OAAO,EAAE;gBACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YACF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAClB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;QAC3F,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,6CAAoB,EAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC5D,MAAM,WAAW,GACf,MAAA,MAAA,MAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,0CAAE,IAAI,mCACzD,MAAA,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,mCACjB,MAAA,SAAS,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAA;IACpB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAA,yCAAoB,EAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO;QACL,SAAS;KACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"write-session-artifacts.js","sourceRoot":"","sources":["../../../src/lib/session-pages/write-session-artifacts.ts"],"names":[],"mappings":";;AA4BA,sDAwCC;AApED,0FAAsF;AACtF,sEAAoE;AACpE,qEAAqE;AACrE,qEAA+D;AAC/D,mCAA+C;AAwBxC,KAAK,UAAU,qBAAqB,CACzC,KAAiC;;IAEjC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAC1B,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IAC1C,MAAM,SAAS,GAA+B,EAAE,CAAA;IAEhD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,OAAO,GACX,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1C,CAAC,CAAC,IAAA,mDAA0B,EAAC,IAAI,CAAC,OAAO,EAAE;gBACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YACF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAClB,sEAAsE;QACtE,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;QACvF,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,6CAAoB,EAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC5D,MAAM,WAAW,GACf,MAAA,MAAA,MAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,0CAAE,IAAI,mCACzD,MAAA,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,mCACjB,MAAA,SAAS,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAA;IACpB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAA,yCAAoB,EAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO;QACL,SAAS;KACV,CAAA;AACH,CAAC"}
@@ -17,8 +17,9 @@ export interface OpenAdvisory {
17
17
  }
18
18
  export interface BuildPlan {
19
19
  title: string;
20
- /** Design contract for the whole session: exact palette hexes, font pairing,
21
- * tone, layout pack. Injected into every artifact subagent. */
20
+ /** Design contract for the whole session: accent hexes, font pairing,
21
+ * layout pack, signature, radius/density, atmosphere, anti-cliché.
22
+ * Injected into every artifact subagent. */
22
23
  designBrief?: string;
23
24
  createdAt: string;
24
25
  updatedAt: string;
@@ -27,13 +28,22 @@ export interface BuildPlan {
27
28
  openAdvisories?: OpenAdvisory[];
28
29
  }
29
30
  export declare const BUILD_PLAN_PATH = "plan.json";
31
+ /**
32
+ * Layout packs the design brief may name. Keep in sync with designer.skill
33
+ * and extractDesignTokens.
34
+ */
35
+ export declare const LAYOUT_PACKS: readonly ["product", "launch", "editorial", "magazine", "split-hero", "dark-terminal", "bento", "brutalist", "workspace", "story"];
36
+ export type LayoutPack = (typeof LAYOUT_PACKS)[number];
37
+ /** Matches a layout pack token in free-text briefs (longest names first). */
38
+ export declare const LAYOUT_PACK_PATTERN: RegExp;
30
39
  /** Last task must be an explicit consistency/polish pass (enforced at create). */
31
40
  export declare function isConsistencyPassTask(task: {
32
41
  title: string;
33
42
  description: string;
34
43
  }): boolean;
35
44
  /**
36
- * designBrief must be specific enough to build from — accent hex, fonts, pack.
45
+ * designBrief must be specific enough to build a DISTINCT product — accent,
46
+ * pack, fonts, atmosphere, signature, radius/density, anti-cliché.
37
47
  * Vague briefs produce Inter/indigo template pages.
38
48
  */
39
49
  export declare function assertDesignBriefQuality(brief: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"build-plan.d.ts","sourceRoot":"","sources":["../../../src/lib/session-plans/build-plan.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAA;AAE5E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,eAAe,CAAA;IACvB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb;mEAC+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,qEAAqE;IACrE,cAAc,CAAC,EAAE,YAAY,EAAE,CAAA;CAChC;AAED,eAAO,MAAM,eAAe,cAAc,CAAA;AAE1C,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE3F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAwB5D;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,EACpD,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,CAcX;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM,GACV,SAAS,CAoBX;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,KAAK,CAAC,EAAE,MAAM,EAAE,EAChB,GAAG,CAAC,EAAE,MAAM,GACX,SAAS,CAUX;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUhE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,eAAe,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAclG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAEtE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGhG"}
1
+ {"version":3,"file":"build-plan.d.ts","sourceRoot":"","sources":["../../../src/lib/session-plans/build-plan.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BUILD_PLAN_PATH = void 0;
3
+ exports.LAYOUT_PACK_PATTERN = exports.LAYOUT_PACKS = exports.BUILD_PLAN_PATH = void 0;
4
4
  exports.isConsistencyPassTask = isConsistencyPassTask;
5
5
  exports.assertDesignBriefQuality = assertDesignBriefQuality;
6
6
  exports.createBuildPlan = createBuildPlan;
@@ -12,27 +12,58 @@ exports.applyTaskUpdate = applyTaskUpdate;
12
12
  exports.nextPendingTask = nextPendingTask;
13
13
  exports.planProgress = planProgress;
14
14
  exports.BUILD_PLAN_PATH = 'plan.json';
15
+ /**
16
+ * Layout packs the design brief may name. Keep in sync with designer.skill
17
+ * and extractDesignTokens.
18
+ */
19
+ exports.LAYOUT_PACKS = [
20
+ 'product',
21
+ 'launch',
22
+ 'editorial',
23
+ 'magazine',
24
+ 'split-hero',
25
+ 'dark-terminal',
26
+ 'bento',
27
+ 'brutalist',
28
+ 'workspace',
29
+ 'story',
30
+ ];
31
+ /** Matches a layout pack token in free-text briefs (longest names first). */
32
+ exports.LAYOUT_PACK_PATTERN = /\b(split-hero|dark-terminal|workspace|brutalist|magazine|editorial|product|launch|bento|story)\b/i;
33
+ const SIGNATURE_PATTERN = /\bsignature\b/i;
34
+ const RADIUS_OR_DENSITY_PATTERN = /\b(sharp|soft|pill|airy|comfortable|dense)\b/i;
35
+ const ANTI_CLICHE_PATTERN = /\b(anti-?clich[eé]|must not|must NOT|avoid|not look like|no indigo|no centered|never Inter)\b/i;
15
36
  /** Last task must be an explicit consistency/polish pass (enforced at create). */
16
37
  function isConsistencyPassTask(task) {
17
38
  return /\b(consistency|polish|qa|quality)\b/i.test(`${task.title} ${task.description}`);
18
39
  }
19
40
  /**
20
- * designBrief must be specific enough to build from — accent hex, fonts, pack.
41
+ * designBrief must be specific enough to build a DISTINCT product — accent,
42
+ * pack, fonts, atmosphere, signature, radius/density, anti-cliché.
21
43
  * Vague briefs produce Inter/indigo template pages.
22
44
  */
23
45
  function assertDesignBriefQuality(brief) {
24
46
  if (!/#[0-9a-fA-F]{3,8}\b/.test(brief)) {
25
47
  throw new Error('designBrief must include an exact accent hex (e.g. #0EA5E9). Pick a topic-fit color — avoid default indigo.');
26
48
  }
27
- if (!/\b(product|launch|editorial)\b/i.test(brief)) {
28
- throw new Error('designBrief must name a layout pack: product | launch | editorial.');
49
+ if (!exports.LAYOUT_PACK_PATTERN.test(brief)) {
50
+ throw new Error(`designBrief must name a layout pack: ${exports.LAYOUT_PACKS.join(' | ')}.`);
29
51
  }
30
52
  if (!/fonts\.googleapis\.com/i.test(brief) &&
31
53
  !/\b(?:fonts?|typeface|typography)\b/i.test(brief)) {
32
54
  throw new Error('designBrief must name a Google Font pairing (display + body), e.g. "Manrope + Source Sans 3".');
33
55
  }
34
- if (!/\b(?:atmosphere|wash|mesh|grain|glass|orb|blur|gradient)\b/i.test(brief)) {
35
- throw new Error('designBrief must include an atmosphere note (e.g. soft accent wash, blur orb, glass nav) so pages are not flat white.');
56
+ if (!/\b(?:atmosphere|wash|mesh|grain|glass|orb|blur|gradient|grid|noise|ink)\b/i.test(brief)) {
57
+ throw new Error('designBrief must include an atmosphere note (e.g. soft accent wash, hard grid, noise film) so pages are not flat.');
58
+ }
59
+ if (!SIGNATURE_PATTERN.test(brief)) {
60
+ throw new Error('designBrief must name a signature (layout/surface/motion), e.g. "signature: split + hard grid + scroll reveal".');
61
+ }
62
+ if (!RADIUS_OR_DENSITY_PATTERN.test(brief)) {
63
+ throw new Error('designBrief must set radius (sharp|soft|pill) and/or density (airy|comfortable|dense).');
64
+ }
65
+ if (!ANTI_CLICHE_PATTERN.test(brief)) {
66
+ throw new Error('designBrief must include an anti-cliché note (what this must NOT look like), e.g. "no centered blur-orb hero".');
36
67
  }
37
68
  }
38
69
  function createBuildPlan(title, tasks, now, designBrief) {
@@ -1 +1 @@
1
- {"version":3,"file":"build-plan.js","sourceRoot":"","sources":["../../../src/lib/session-plans/build-plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-plan.js","sourceRoot":"","sources":["../../../src/lib/session-plans/build-plan.ts"],"names":[],"mappings":";;;AAkEA,sDAEC;AAOD,4DAuCC;AAED,0CAmBC;AAGD,oDAwBC;AAGD,kDAcC;AAED,wCAUC;AAED,gDAEC;AAUD,0CAcC;AAED,0CAEC;AAED,oCAGC;AAnMY,QAAA,eAAe,GAAG,WAAW,CAAA;AAE1C;;;GAGG;AACU,QAAA,YAAY,GAAG;IAC1B,SAAS;IACT,QAAQ;IACR,WAAW;IACX,UAAU;IACV,YAAY;IACZ,eAAe;IACf,OAAO;IACP,WAAW;IACX,WAAW;IACX,OAAO;CACC,CAAA;AAIV,6EAA6E;AAChE,QAAA,mBAAmB,GAC9B,mGAAmG,CAAA;AAErG,MAAM,iBAAiB,GAAG,gBAAgB,CAAA;AAE1C,MAAM,yBAAyB,GAAG,+CAA+C,CAAA;AAEjF,MAAM,mBAAmB,GACvB,gGAAgG,CAAA;AAElG,kFAAkF;AAClF,SAAgB,qBAAqB,CAAC,IAA4C;IAChF,OAAO,sCAAsC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AACzF,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,KAAa;IACpD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAA;IACH,CAAC;IACD,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,wCAAwC,oBAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CACpE,CAAA;IACH,CAAC;IACD,IACE,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QACtC,CAAC,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,EAClD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,4EAA4E,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAA;IACH,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAA;IACH,CAAC;IACD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAA;IACH,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,gHAAgH,CACjH,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,KAAa,EACb,KAAoD,EACpD,GAAW,EACX,WAAoB;IAEpB,OAAO;QACL,KAAK;QACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,cAAc,EAAE,EAAE;KACnB,CAAA;AACH,CAAC;AAED,kFAAkF;AAClF,SAAgB,oBAAoB,CAClC,IAAe,EACf,UAAoB,EACpB,GAAW;;IAEX,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,QAAQ,IAAI,MAAA,IAAI,CAAC,cAAc,mCAAI,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,EAAE,CAAA;QACvC,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,MAAM,IAAI,GAAG,MAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI;QACJ,QAAQ;QACR,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC,CAAA;IACH,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;IACpB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,gFAAgF;AAChF,SAAgB,mBAAmB,CACjC,IAAe,EACf,KAAgB,EAChB,GAAY;;IAEZ,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,MAAM,CAAA;QAAE,OAAO,IAAI,CAAA;IAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAA;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACtE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACtF,CAAC;IACD,IAAI,GAAG;QAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAA;QAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAe;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACtC,CAAC;AASD,qEAAqE;AACrE,SAAgB,eAAe,CAAC,IAAe,EAAE,MAAkB,EAAE,GAAW;;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC3B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACzB,CAAC;IACD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;IACpB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,eAAe,CAAC,IAAe;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAA;AAC9F,CAAC;AAED,SAAgB,YAAY,CAAC,IAAe;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAA;IACpG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAA;AAChF,CAAC"}
@@ -1,5 +1,5 @@
1
+ export { sweepExpiredNamedSnapshotsForPrefix } from './snapshot-retention';
1
2
  export declare function runYjsFlushTick(): Promise<void>;
2
- export declare function sweepExpiredNamedSnapshotsForPrefix(prefix: string): Promise<number>;
3
3
  export declare function startYjsFlushWorker(): void;
4
4
  export declare function stopYjsFlushWorker(): void;
5
5
  //# sourceMappingURL=flush-worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flush-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":"AAyBA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAYrD;AAED,wBAAsB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAczF;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
1
+ {"version":3,"file":"flush-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mCAAmC,EAAE,MAAM,sBAAsB,CAAA;AAI1E,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAYrD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
@@ -1,30 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sweepExpiredNamedSnapshotsForPrefix = void 0;
3
4
  exports.runYjsFlushTick = runYjsFlushTick;
4
- exports.sweepExpiredNamedSnapshotsForPrefix = sweepExpiredNamedSnapshotsForPrefix;
5
5
  exports.startYjsFlushWorker = startYjsFlushWorker;
6
6
  exports.stopYjsFlushWorker = stopYjsFlushWorker;
7
7
  const context_1 = require("../../context");
8
8
  const logger_1 = require("../../logger");
9
- const artifact_storage_paths_1 = require("../session-pages/artifact-storage-paths");
10
- const s3_object_store_1 = require("../object-storage/s3-object-store");
11
9
  const yjs_persistence_1 = require("./yjs-persistence");
12
- const SNAPSHOT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
13
- const SNAPSHOT_SEGMENT = '.snapshot-';
10
+ var snapshot_retention_1 = require("./snapshot-retention");
11
+ Object.defineProperty(exports, "sweepExpiredNamedSnapshotsForPrefix", { enumerable: true, get: function () { return snapshot_retention_1.sweepExpiredNamedSnapshotsForPrefix; } });
14
12
  let flushTimer = null;
15
- function parseSnapshotTimestamp(key) {
16
- const idx = key.lastIndexOf(SNAPSHOT_SEGMENT);
17
- if (idx < 0) {
18
- return null;
19
- }
20
- const stamp = key.slice(idx + SNAPSHOT_SEGMENT.length);
21
- const match = /^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/.exec(stamp);
22
- if (!match) {
23
- return null;
24
- }
25
- const ms = Date.parse(`${match[1]}T${match[2]}:${match[3]}:${match[4]}.${match[5]}Z`);
26
- return Number.isFinite(ms) ? ms : null;
27
- }
28
13
  async function runYjsFlushTick() {
29
14
  if (!(0, context_1.getSharedRedisClient)()) {
30
15
  return;
@@ -39,21 +24,6 @@ async function runYjsFlushTick() {
39
24
  }
40
25
  }
41
26
  }
42
- async function sweepExpiredNamedSnapshotsForPrefix(prefix) {
43
- const cutoff = Date.now() - SNAPSHOT_RETENTION_MS;
44
- let deleted = 0;
45
- for (const { key } of await (0, s3_object_store_1.listKeysByPrefix)(prefix)) {
46
- if (!(0, artifact_storage_paths_1.isArtifactSnapshotPath)(key.slice(prefix.length))) {
47
- continue;
48
- }
49
- const ts = parseSnapshotTimestamp(key);
50
- if (ts !== null && ts < cutoff) {
51
- await (0, s3_object_store_1.deleteObject)(key);
52
- deleted += 1;
53
- }
54
- }
55
- return deleted;
56
- }
57
27
  function startYjsFlushWorker() {
58
28
  var _a, _b, _c;
59
29
  if (flushTimer) {
@@ -1 +1 @@
1
- {"version":3,"file":"flush-worker.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":";;AAyBA,0CAYC;AAED,kFAcC;AAED,kDAUC;AAED,gDAKC;AAxED,2CAA0G;AAC1G,yCAAkD;AAClD,oFAAgF;AAChF,uEAAkF;AAClF,uDAAqD;AAErD,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AACrD,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAErC,IAAI,UAAU,GAA0C,IAAI,CAAA;AAE5D,SAAS,sBAAsB,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAC7C,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,wDAAwD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACrF,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxC,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,IAAA,8BAAoB,GAAE,EAAE,CAAC;QAC5B,OAAM;IACR,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,IAAA,wCAA8B,GAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAA;IAC1F,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAA,mCAAiB,EAAC,UAAU,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,4BAAmB,GAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,qBAAqB,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,mCAAmC,CAAC,MAAc;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAA;IACjD,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,MAAM,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,IAAA,+CAAsB,EAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACtD,SAAQ;QACV,CAAC;QACD,MAAM,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAA,8BAAY,EAAC,GAAG,CAAC,CAAA;YACvB,OAAO,IAAI,CAAC,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAgB,mBAAmB;;IACjC,IAAI,UAAU,EAAE,CAAC;QACf,OAAM;IACR,CAAC;IACD,MAAM,UAAU,GAAG,MAAA,MAAA,IAAA,8BAAoB,GAAE,CAAC,MAAM,CAAC,cAAc,0CAAE,eAAe,mCAAI,IAAI,CAAA;IACxF,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,KAAK,eAAe,EAAE,CAAA;IACxB,CAAC,EAAE,UAAU,CAAC,CAAA;IACd,MAAA,UAAU,CAAC,KAAK,0DAAI,CAAA;IACpB,IAAA,4BAAmB,GAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,6BAA6B,CAAC,CAAA;AAC3E,CAAC;AAED,SAAgB,kBAAkB;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAA;QACzB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"flush-worker.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":";;;AAQA,0CAYC;AAED,kDAUC;AAED,gDAKC;AAvCD,2CAA0G;AAC1G,yCAAkD;AAClD,uDAAqD;AAErD,2DAA0E;AAAjE,yIAAA,mCAAmC,OAAA;AAE5C,IAAI,UAAU,GAA0C,IAAI,CAAA;AAErD,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,IAAA,8BAAoB,GAAE,EAAE,CAAC;QAC5B,OAAM;IACR,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,IAAA,wCAA8B,GAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAA;IAC1F,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAA,mCAAiB,EAAC,UAAU,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,4BAAmB,GAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,qBAAqB,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB;;IACjC,IAAI,UAAU,EAAE,CAAC;QACf,OAAM;IACR,CAAC;IACD,MAAM,UAAU,GAAG,MAAA,MAAA,IAAA,8BAAoB,GAAE,CAAC,MAAM,CAAC,cAAc,0CAAE,eAAe,mCAAI,IAAI,CAAA;IACxF,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,KAAK,eAAe,EAAE,CAAA;IACxB,CAAC,EAAE,UAAU,CAAC,CAAA;IACd,MAAA,UAAU,CAAC,KAAK,0DAAI,CAAA;IACpB,IAAA,4BAAmB,GAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,6BAA6B,CAAC,CAAA;AAC3E,CAAC;AAED,SAAgB,kBAAkB;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAA;QACzB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const SNAPSHOT_RETENTION_MS: number;
2
+ export declare function isNamedContentSnapshotPath(relativePath: string): boolean;
3
+ /** Deletes artifact and notebook named snapshots older than {@link SNAPSHOT_RETENTION_MS}. */
4
+ export declare function sweepExpiredNamedSnapshotsForPrefix(prefix: string, nowMs?: number): Promise<number>;
5
+ export { parseNamedSnapshotTimestamp as parseSnapshotTimestamp } from '../object-storage/named-snapshot-paths';
6
+ //# sourceMappingURL=snapshot-retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-retention.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/snapshot-retention.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qBAAqB,QAA0B,CAAA;AAE5D,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAExE;AAED,8FAA8F;AAC9F,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,OAAO,EAAE,2BAA2B,IAAI,sBAAsB,EAAE,MAAM,wCAAwC,CAAA"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSnapshotTimestamp = exports.SNAPSHOT_RETENTION_MS = void 0;
4
+ exports.isNamedContentSnapshotPath = isNamedContentSnapshotPath;
5
+ exports.sweepExpiredNamedSnapshotsForPrefix = sweepExpiredNamedSnapshotsForPrefix;
6
+ const notebook_storage_paths_1 = require("../notebooks/notebook-storage-paths");
7
+ const artifact_storage_paths_1 = require("../session-pages/artifact-storage-paths");
8
+ const s3_object_store_1 = require("../object-storage/s3-object-store");
9
+ const named_snapshot_paths_1 = require("../object-storage/named-snapshot-paths");
10
+ exports.SNAPSHOT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
11
+ function isNamedContentSnapshotPath(relativePath) {
12
+ return (0, artifact_storage_paths_1.isArtifactSnapshotPath)(relativePath) || (0, notebook_storage_paths_1.isNotebookSnapshotPath)(relativePath);
13
+ }
14
+ /** Deletes artifact and notebook named snapshots older than {@link SNAPSHOT_RETENTION_MS}. */
15
+ async function sweepExpiredNamedSnapshotsForPrefix(prefix, nowMs = Date.now()) {
16
+ const cutoff = nowMs - exports.SNAPSHOT_RETENTION_MS;
17
+ let deleted = 0;
18
+ for (const { key } of await (0, s3_object_store_1.listKeysByPrefix)(prefix)) {
19
+ const relative = key.slice(prefix.length);
20
+ if (!isNamedContentSnapshotPath(relative)) {
21
+ continue;
22
+ }
23
+ const ts = (0, named_snapshot_paths_1.parseNamedSnapshotTimestamp)(key);
24
+ if (ts !== null && ts < cutoff) {
25
+ await (0, s3_object_store_1.deleteObject)(key);
26
+ deleted += 1;
27
+ }
28
+ }
29
+ return deleted;
30
+ }
31
+ var named_snapshot_paths_2 = require("../object-storage/named-snapshot-paths");
32
+ Object.defineProperty(exports, "parseSnapshotTimestamp", { enumerable: true, get: function () { return named_snapshot_paths_2.parseNamedSnapshotTimestamp; } });
33
+ //# sourceMappingURL=snapshot-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-retention.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/snapshot-retention.ts"],"names":[],"mappings":";;;AAOA,gEAEC;AAGD,kFAkBC;AA9BD,gFAA4E;AAC5E,oFAAgF;AAChF,uEAAkF;AAClF,iFAAoF;AAEvE,QAAA,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAE5D,SAAgB,0BAA0B,CAAC,YAAoB;IAC7D,OAAO,IAAA,+CAAsB,EAAC,YAAY,CAAC,IAAI,IAAA,+CAAsB,EAAC,YAAY,CAAC,CAAA;AACrF,CAAC;AAED,8FAA8F;AACvF,KAAK,UAAU,mCAAmC,CACvD,MAAc,EACd,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,MAAM,MAAM,GAAG,KAAK,GAAG,6BAAqB,CAAA;IAC5C,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,MAAM,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,SAAQ;QACV,CAAC;QACD,MAAM,EAAE,GAAG,IAAA,kDAA2B,EAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAA,8BAAY,EAAC,GAAG,CAAC,CAAA;YACvB,OAAO,IAAI,CAAC,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,+EAA8G;AAArG,8HAAA,2BAA2B,OAA0B"}
@@ -13,6 +13,7 @@ export declare function readCommittedYjsState(parsed: ParsedDocumentTarget): Pro
13
13
  export declare function writeCommittedYjsState(parsed: ParsedDocumentTarget, state: Uint8Array): Promise<void>;
14
14
  export declare function writeCommittedContentSnapshot(parsed: ParsedDocumentTarget, content: string): Promise<void>;
15
15
  export declare function writeNamedSessionSnapshot(sessionId: string, artifactPath: string, content: string, at?: Date): Promise<string>;
16
+ export declare function writeNamedNotebookSnapshot(accountId: string, notebookId: string, content: string, at?: Date): Promise<string>;
16
17
  export declare function docTextContent(doc: Y.Doc): string;
17
18
  export declare function loadMergedState(documentIdentifier: string): Promise<Uint8Array | null>;
18
19
  export declare function hydrateEphemeralDoc(documentIdentifier: string): Promise<Y.Doc | null>;