@multiplayer-app/sandbox 0.0.31 → 0.0.32

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 (186) hide show
  1. package/dist/agents/html-generator.agent.d.ts +3 -1
  2. package/dist/agents/html-generator.agent.d.ts.map +1 -1
  3. package/dist/agents/html-generator.agent.js +90 -4
  4. package/dist/agents/html-generator.agent.js.map +1 -1
  5. package/dist/agents/markdown-generator.agent.d.ts.map +1 -1
  6. package/dist/agents/markdown-generator.agent.js +5 -10
  7. package/dist/agents/markdown-generator.agent.js.map +1 -1
  8. package/dist/agents/shared/app-vm.tools.d.ts +4 -0
  9. package/dist/agents/shared/app-vm.tools.d.ts.map +1 -0
  10. package/dist/agents/shared/app-vm.tools.js +105 -0
  11. package/dist/agents/shared/app-vm.tools.js.map +1 -0
  12. package/dist/agents/shared/build-plan.tools.d.ts +5 -0
  13. package/dist/agents/shared/build-plan.tools.d.ts.map +1 -0
  14. package/dist/agents/shared/build-plan.tools.js +176 -0
  15. package/dist/agents/shared/build-plan.tools.js.map +1 -0
  16. package/dist/agents/shared/session-quality-report.tool.d.ts +7 -0
  17. package/dist/agents/shared/session-quality-report.tool.d.ts.map +1 -0
  18. package/dist/agents/shared/session-quality-report.tool.js +97 -0
  19. package/dist/agents/shared/session-quality-report.tool.js.map +1 -0
  20. package/dist/agents/shared/session-vm-bridge.d.ts +49 -0
  21. package/dist/agents/shared/session-vm-bridge.d.ts.map +1 -0
  22. package/dist/agents/shared/session-vm-bridge.js +9 -0
  23. package/dist/agents/shared/session-vm-bridge.js.map +1 -0
  24. package/dist/agents/skills/a11y.skill.d.ts +3 -0
  25. package/dist/agents/skills/a11y.skill.d.ts.map +1 -0
  26. package/dist/agents/skills/a11y.skill.js +23 -0
  27. package/dist/agents/skills/a11y.skill.js.map +1 -0
  28. package/dist/agents/skills/account-skill-loader.d.ts +13 -0
  29. package/dist/agents/skills/account-skill-loader.d.ts.map +1 -0
  30. package/dist/agents/skills/account-skill-loader.js +42 -0
  31. package/dist/agents/skills/account-skill-loader.js.map +1 -0
  32. package/dist/agents/skills/app-scaffold.skill.d.ts +3 -0
  33. package/dist/agents/skills/app-scaffold.skill.d.ts.map +1 -0
  34. package/dist/agents/skills/app-scaffold.skill.js +30 -0
  35. package/dist/agents/skills/app-scaffold.skill.js.map +1 -0
  36. package/dist/agents/skills/copywriting.skill.d.ts +3 -0
  37. package/dist/agents/skills/copywriting.skill.d.ts.map +1 -0
  38. package/dist/agents/skills/copywriting.skill.js +35 -0
  39. package/dist/agents/skills/copywriting.skill.js.map +1 -0
  40. package/dist/agents/skills/custom-skill-repository.d.ts +40 -0
  41. package/dist/agents/skills/custom-skill-repository.d.ts.map +1 -0
  42. package/dist/agents/skills/custom-skill-repository.js +3 -0
  43. package/dist/agents/skills/custom-skill-repository.js.map +1 -0
  44. package/dist/agents/skills/data-viz.skill.d.ts +3 -0
  45. package/dist/agents/skills/data-viz.skill.d.ts.map +1 -0
  46. package/dist/agents/skills/data-viz.skill.js +42 -0
  47. package/dist/agents/skills/data-viz.skill.js.map +1 -0
  48. package/dist/agents/skills/designer.skill.d.ts +3 -0
  49. package/dist/agents/skills/designer.skill.d.ts.map +1 -0
  50. package/dist/agents/skills/designer.skill.js +139 -0
  51. package/dist/agents/skills/designer.skill.js.map +1 -0
  52. package/dist/agents/skills/forms.skill.d.ts +3 -0
  53. package/dist/agents/skills/forms.skill.d.ts.map +1 -0
  54. package/dist/agents/skills/forms.skill.js +37 -0
  55. package/dist/agents/skills/forms.skill.js.map +1 -0
  56. package/dist/agents/skills/index.d.ts +6 -0
  57. package/dist/agents/skills/index.d.ts.map +1 -0
  58. package/dist/agents/skills/index.js +18 -0
  59. package/dist/agents/skills/index.js.map +1 -0
  60. package/dist/agents/skills/interactions.skill.d.ts +3 -0
  61. package/dist/agents/skills/interactions.skill.d.ts.map +1 -0
  62. package/dist/agents/skills/interactions.skill.js +31 -0
  63. package/dist/agents/skills/interactions.skill.js.map +1 -0
  64. package/dist/agents/skills/registry.d.ts +23 -0
  65. package/dist/agents/skills/registry.d.ts.map +1 -0
  66. package/dist/agents/skills/registry.js +75 -0
  67. package/dist/agents/skills/registry.js.map +1 -0
  68. package/dist/agents/skills/skill-injection.d.ts +52 -0
  69. package/dist/agents/skills/skill-injection.d.ts.map +1 -0
  70. package/dist/agents/skills/skill-injection.js +210 -0
  71. package/dist/agents/skills/skill-injection.js.map +1 -0
  72. package/dist/agents/skills/types.d.ts +12 -0
  73. package/dist/agents/skills/types.d.ts.map +1 -0
  74. package/dist/agents/skills/types.js +3 -0
  75. package/dist/agents/skills/types.js.map +1 -0
  76. package/dist/builder-api-config.d.ts +7 -0
  77. package/dist/builder-api-config.d.ts.map +1 -1
  78. package/dist/builder-api-config.js.map +1 -1
  79. package/dist/context.d.ts +7 -0
  80. package/dist/context.d.ts.map +1 -1
  81. package/dist/context.js +19 -0
  82. package/dist/context.js.map +1 -1
  83. package/dist/create-builder-api.d.ts +2 -3
  84. package/dist/create-builder-api.d.ts.map +1 -1
  85. package/dist/create-builder-api.js +18 -0
  86. package/dist/create-builder-api.js.map +1 -1
  87. package/dist/index.d.ts +2 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +2 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/lib/library/list-library-items.d.ts +2 -2
  92. package/dist/lib/library/list-library-items.d.ts.map +1 -1
  93. package/dist/lib/library/list-library-items.js +49 -7
  94. package/dist/lib/library/list-library-items.js.map +1 -1
  95. package/dist/lib/object-storage/index.d.ts +3 -0
  96. package/dist/lib/object-storage/index.d.ts.map +1 -0
  97. package/dist/lib/object-storage/index.js +19 -0
  98. package/dist/lib/object-storage/index.js.map +1 -0
  99. package/dist/lib/object-storage/keys.d.ts +10 -0
  100. package/dist/lib/object-storage/keys.d.ts.map +1 -0
  101. package/dist/lib/object-storage/keys.js +51 -0
  102. package/dist/lib/object-storage/keys.js.map +1 -0
  103. package/dist/lib/object-storage/s3-object-store.d.ts +14 -0
  104. package/dist/lib/object-storage/s3-object-store.d.ts.map +1 -0
  105. package/dist/lib/object-storage/s3-object-store.js +64 -0
  106. package/dist/lib/object-storage/s3-object-store.js.map +1 -0
  107. package/dist/lib/session-pages/artifact-quality-audit.d.ts +16 -0
  108. package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -0
  109. package/dist/lib/session-pages/artifact-quality-audit.js +293 -0
  110. package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -0
  111. package/dist/lib/session-pages/artifact-storage.d.ts +3 -0
  112. package/dist/lib/session-pages/artifact-storage.d.ts.map +1 -1
  113. package/dist/lib/session-pages/artifact-storage.js +94 -85
  114. package/dist/lib/session-pages/artifact-storage.js.map +1 -1
  115. package/dist/lib/session-pages/audit-session-html.d.ts +23 -0
  116. package/dist/lib/session-pages/audit-session-html.d.ts.map +1 -0
  117. package/dist/lib/session-pages/audit-session-html.js +82 -0
  118. package/dist/lib/session-pages/audit-session-html.js.map +1 -0
  119. package/dist/lib/session-pages/contrast-check.d.ts +25 -0
  120. package/dist/lib/session-pages/contrast-check.d.ts.map +1 -0
  121. package/dist/lib/session-pages/contrast-check.js +290 -0
  122. package/dist/lib/session-pages/contrast-check.js.map +1 -0
  123. package/dist/lib/session-pages/deferred-quality-rules.d.ts +7 -0
  124. package/dist/lib/session-pages/deferred-quality-rules.d.ts.map +1 -0
  125. package/dist/lib/session-pages/deferred-quality-rules.js +25 -0
  126. package/dist/lib/session-pages/deferred-quality-rules.js.map +1 -0
  127. package/dist/lib/session-pages/delete-session-artifact.d.ts.map +1 -1
  128. package/dist/lib/session-pages/delete-session-artifact.js +12 -41
  129. package/dist/lib/session-pages/delete-session-artifact.js.map +1 -1
  130. package/dist/lib/session-pages/delete-session-artifacts.d.ts +0 -6
  131. package/dist/lib/session-pages/delete-session-artifacts.d.ts.map +1 -1
  132. package/dist/lib/session-pages/delete-session-artifacts.js +51 -15
  133. package/dist/lib/session-pages/delete-session-artifacts.js.map +1 -1
  134. package/dist/lib/session-pages/list-session-artifacts.d.ts.map +1 -1
  135. package/dist/lib/session-pages/list-session-artifacts.js +48 -48
  136. package/dist/lib/session-pages/list-session-artifacts.js.map +1 -1
  137. package/dist/lib/session-pages/read-session-artifacts.d.ts.map +1 -1
  138. package/dist/lib/session-pages/read-session-artifacts.js +4 -26
  139. package/dist/lib/session-pages/read-session-artifacts.js.map +1 -1
  140. package/dist/lib/session-pages/resolve-session-account-id.d.ts +3 -0
  141. package/dist/lib/session-pages/resolve-session-account-id.d.ts.map +1 -0
  142. package/dist/lib/session-pages/resolve-session-account-id.js +31 -0
  143. package/dist/lib/session-pages/resolve-session-account-id.js.map +1 -0
  144. package/dist/lib/session-pages/write-session-artifacts.d.ts +0 -2
  145. package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
  146. package/dist/lib/session-pages/write-session-artifacts.js +8 -0
  147. package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
  148. package/dist/lib/session-plans/build-plan.d.ts +64 -0
  149. package/dist/lib/session-plans/build-plan.d.ts.map +1 -0
  150. package/dist/lib/session-plans/build-plan.js +134 -0
  151. package/dist/lib/session-plans/build-plan.js.map +1 -0
  152. package/dist/lib/yjs-pending/flush-lock.d.ts +6 -0
  153. package/dist/lib/yjs-pending/flush-lock.d.ts.map +1 -0
  154. package/dist/lib/yjs-pending/flush-lock.js +43 -0
  155. package/dist/lib/yjs-pending/flush-lock.js.map +1 -0
  156. package/dist/lib/yjs-pending/flush-worker.d.ts +5 -0
  157. package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -0
  158. package/dist/lib/yjs-pending/flush-worker.js +75 -0
  159. package/dist/lib/yjs-pending/flush-worker.js.map +1 -0
  160. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts +22 -0
  161. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts.map +1 -0
  162. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js +3 -0
  163. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js.map +1 -0
  164. package/dist/lib/yjs-pending/yjs-persistence.d.ts +23 -0
  165. package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -0
  166. package/dist/lib/yjs-pending/yjs-persistence.js +222 -0
  167. package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -0
  168. package/dist/realtime/reset-session-artifact-y-docs.d.ts.map +1 -1
  169. package/dist/realtime/reset-session-artifact-y-docs.js +1 -6
  170. package/dist/realtime/reset-session-artifact-y-docs.js.map +1 -1
  171. package/dist/realtime/session-artifact-y-socket-io.d.ts +0 -5
  172. package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
  173. package/dist/realtime/session-artifact-y-socket-io.js +5 -69
  174. package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
  175. package/dist/realtime/session-artifact-yjs-store.d.ts +3 -35
  176. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  177. package/dist/realtime/session-artifact-yjs-store.js +75 -235
  178. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  179. package/dist/routes/sessions.d.ts.map +1 -1
  180. package/dist/routes/sessions.js +26 -6
  181. package/dist/routes/sessions.js.map +1 -1
  182. package/dist/routes/skills.d.ts +2 -0
  183. package/dist/routes/skills.d.ts.map +1 -0
  184. package/dist/routes/skills.js +140 -0
  185. package/dist/routes/skills.js.map +1 -0
  186. package/package.json +2 -2
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auditSessionHtmlArtifacts = auditSessionHtmlArtifacts;
4
+ exports.sessionQualityToAdvisoryLines = sessionQualityToAdvisoryLines;
5
+ const artifact_quality_audit_1 = require("./artifact-quality-audit");
6
+ const deferred_quality_rules_1 = require("./deferred-quality-rules");
7
+ const list_session_artifacts_1 = require("./list-session-artifacts");
8
+ const read_session_artifacts_1 = require("./read-session-artifacts");
9
+ /**
10
+ * Re-audit every HTML artifact in the session. Used by the consistency pass
11
+ * to prove polish work actually cleared quality findings.
12
+ */
13
+ async function auditSessionHtmlArtifacts(sessionId) {
14
+ const files = await (0, list_session_artifacts_1.listSessionArtifacts)(sessionId);
15
+ const htmlPaths = files
16
+ .map((file) => file.path)
17
+ .filter((path) => path.toLowerCase().endsWith('.html') && path !== 'plan.json');
18
+ if (htmlPaths.length === 0) {
19
+ // Empty HTML set used to report clean:true, which let the parent mark the
20
+ // whole plan done after a failed publish left only plan.json on disk.
21
+ const missing = {
22
+ rule: 'missing-html-pages',
23
+ severity: 'error',
24
+ message: 'No HTML artifacts published yet. Call publishSessionArtifacts to create index.html (updateSessionArtifact cannot create files).',
25
+ };
26
+ const issue = { path: '(session)', findings: [missing] };
27
+ return {
28
+ issues: [issue],
29
+ actionableIssues: [issue],
30
+ advisoryLines: [`[error] (session): [missing-html-pages] ${missing.message}`],
31
+ errorCount: 1,
32
+ warningCount: 0,
33
+ deferredWarningCount: 0,
34
+ };
35
+ }
36
+ const artifacts = await (0, read_session_artifacts_1.readSessionArtifacts)(sessionId, htmlPaths);
37
+ const issues = [];
38
+ const actionableIssues = [];
39
+ let errorCount = 0;
40
+ let warningCount = 0;
41
+ let deferredWarningCount = 0;
42
+ for (const artifact of artifacts) {
43
+ if (!artifact.found || !artifact.content)
44
+ continue;
45
+ const findings = (0, artifact_quality_audit_1.auditHtmlArtifact)(artifact.content).findings;
46
+ if (findings.length === 0)
47
+ continue;
48
+ issues.push({ path: artifact.path, findings });
49
+ const actionable = [];
50
+ for (const finding of findings) {
51
+ if (finding.severity === 'error') {
52
+ errorCount += 1;
53
+ actionable.push(finding);
54
+ }
55
+ else if ((0, deferred_quality_rules_1.isDeferredQualityRule)(finding.rule)) {
56
+ deferredWarningCount += 1;
57
+ }
58
+ else {
59
+ // Non-error warnings are informational only — never drive consistency
60
+ // subagents (that caused endless same-page update loops).
61
+ warningCount += 1;
62
+ }
63
+ }
64
+ if (actionable.length > 0) {
65
+ actionableIssues.push({ path: artifact.path, findings: actionable });
66
+ }
67
+ }
68
+ const advisoryLines = actionableIssues.flatMap((issue) => issue.findings.map((finding) => `[${finding.severity}] ${issue.path}: [${finding.rule}] ${finding.message}`));
69
+ return {
70
+ issues,
71
+ actionableIssues,
72
+ advisoryLines,
73
+ errorCount,
74
+ warningCount,
75
+ deferredWarningCount,
76
+ };
77
+ }
78
+ /** Compact path → finding lines for openAdvisories storage (actionable only). */
79
+ function sessionQualityToAdvisoryLines(report) {
80
+ return report.actionableIssues.flatMap((issue) => issue.findings.map((finding) => `${issue.path}: [${finding.rule}] ${finding.message}`));
81
+ }
82
+ //# sourceMappingURL=audit-session-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-session-html.js","sourceRoot":"","sources":["../../../src/lib/session-pages/audit-session-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Static WCAG contrast analysis for generated Tailwind pages.
3
+ *
4
+ * Walks the markup with a tag stack, tracking the effective text color and
5
+ * background inherited from Tailwind utility classes (default palette +
6
+ * arbitrary hex values). Every element that directly contains text gets its
7
+ * WCAG contrast ratio checked against the nearest known background.
8
+ *
9
+ * Deliberately conservative: anything unresolvable (CSS variables, gradients,
10
+ * low-alpha backgrounds, inline styles) suppresses checking for that subtree
11
+ * rather than guessing — the goal is zero false positives on egregious
12
+ * failures (white-on-white), not exhaustive coverage.
13
+ */
14
+ export interface ContrastIssue {
15
+ ratio: number;
16
+ textToken: string;
17
+ bgToken: string;
18
+ snippet: string;
19
+ severity: 'error' | 'warning';
20
+ }
21
+ export declare function contrastRatio(hexA: string, hexB: string): number | null;
22
+ /** CSS custom properties defined with plain hex values in <style> blocks. */
23
+ export declare function extractCssVarColors(html: string): Map<string, string>;
24
+ export declare function checkContrast(html: string): ContrastIssue[];
25
+ //# sourceMappingURL=contrast-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast-check.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/contrast-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAC9B;AA4DD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQvE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOrE;AAsGD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA6G3D"}
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * Static WCAG contrast analysis for generated Tailwind pages.
4
+ *
5
+ * Walks the markup with a tag stack, tracking the effective text color and
6
+ * background inherited from Tailwind utility classes (default palette +
7
+ * arbitrary hex values). Every element that directly contains text gets its
8
+ * WCAG contrast ratio checked against the nearest known background.
9
+ *
10
+ * Deliberately conservative: anything unresolvable (CSS variables, gradients,
11
+ * low-alpha backgrounds, inline styles) suppresses checking for that subtree
12
+ * rather than guessing — the goal is zero false positives on egregious
13
+ * failures (white-on-white), not exhaustive coverage.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.contrastRatio = contrastRatio;
17
+ exports.extractCssVarColors = extractCssVarColors;
18
+ exports.checkContrast = checkContrast;
19
+ const SHADES = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900', '950'];
20
+ // Tailwind v3 default palette.
21
+ const FAMILIES = {
22
+ slate: ['f8fafc', 'f1f5f9', 'e2e8f0', 'cbd5e1', '94a3b8', '64748b', '475569', '334155', '1e293b', '0f172a', '020617'],
23
+ gray: ['f9fafb', 'f3f4f6', 'e5e7eb', 'd1d5db', '9ca3af', '6b7280', '4b5563', '374151', '1f2937', '111827', '030712'],
24
+ zinc: ['fafafa', 'f4f4f5', 'e4e4e7', 'd4d4d8', 'a1a1aa', '71717a', '52525b', '3f3f46', '27272a', '18181b', '09090b'],
25
+ neutral: ['fafafa', 'f5f5f5', 'e5e5e5', 'd4d4d4', 'a3a3a3', '737373', '525252', '404040', '262626', '171717', '0a0a0a'],
26
+ stone: ['fafaf9', 'f5f5f4', 'e7e5e4', 'd6d3d1', 'a8a29e', '78716c', '57534e', '44403c', '292524', '1c1917', '0c0a09'],
27
+ red: ['fef2f2', 'fee2e2', 'fecaca', 'fca5a5', 'f87171', 'ef4444', 'dc2626', 'b91c1c', '991b1b', '7f1d1d', '450a0a'],
28
+ orange: ['fff7ed', 'ffedd5', 'fed7aa', 'fdba74', 'fb923c', 'f97316', 'ea580c', 'c2410c', '9a3412', '7c2d12', '431407'],
29
+ amber: ['fffbeb', 'fef3c7', 'fde68a', 'fcd34d', 'fbbf24', 'f59e0b', 'd97706', 'b45309', '92400e', '78350f', '451a03'],
30
+ yellow: ['fefce8', 'fef9c3', 'fef08a', 'fde047', 'facc15', 'eab308', 'ca8a04', 'a16207', '854d0e', '713f12', '422006'],
31
+ lime: ['f7fee7', 'ecfccb', 'd9f99d', 'bef264', 'a3e635', '84cc16', '65a30d', '4d7c0f', '3f6212', '365314', '1a2e05'],
32
+ green: ['f0fdf4', 'dcfce7', 'bbf7d0', '86efac', '4ade80', '22c55e', '16a34a', '15803d', '166534', '14532d', '052e16'],
33
+ emerald: ['ecfdf5', 'd1fae5', 'a7f3d0', '6ee7b7', '34d399', '10b981', '059669', '047857', '065f46', '064e3b', '022c22'],
34
+ teal: ['f0fdfa', 'ccfbf1', '99f6e4', '5eead4', '2dd4bf', '14b8a6', '0d9488', '0f766e', '115e59', '134e4a', '042f2e'],
35
+ cyan: ['ecfeff', 'cffafe', 'a5f3fc', '67e8f9', '22d3ee', '06b6d4', '0891b2', '0e7490', '155e75', '164e63', '083344'],
36
+ sky: ['f0f9ff', 'e0f2fe', 'bae6fd', '7dd3fc', '38bdf8', '0ea5e9', '0284c7', '0369a1', '075985', '0c4a6e', '082f49'],
37
+ blue: ['eff6ff', 'dbeafe', 'bfdbfe', '93c5fd', '60a5fa', '3b82f6', '2563eb', '1d4ed8', '1e40af', '1e3a8a', '172554'],
38
+ indigo: ['eef2ff', 'e0e7ff', 'c7d2fe', 'a5b4fc', '818cf8', '6366f1', '4f46e5', '4338ca', '3730a3', '312e81', '1e1b4b'],
39
+ violet: ['f5f3ff', 'ede9fe', 'ddd6fe', 'c4b5fd', 'a78bfa', '8b5cf6', '7c3aed', '6d28d9', '5b21b6', '4c1d95', '2e1065'],
40
+ purple: ['faf5ff', 'f3e8ff', 'e9d5ff', 'd8b4fe', 'c084fc', 'a855f7', '9333ea', '7e22ce', '6b21a8', '581c87', '3b0764'],
41
+ fuchsia: ['fdf4ff', 'fae8ff', 'f5d0fe', 'f0abfc', 'e879f9', 'd946ef', 'c026d3', 'a21caf', '86198f', '701a75', '4a044e'],
42
+ pink: ['fdf2f8', 'fce7f3', 'fbcfe8', 'f9a8d4', 'f472b6', 'ec4899', 'db2777', 'be185d', '9d174d', '831843', '500724'],
43
+ rose: ['fff1f2', 'ffe4e6', 'fecdd3', 'fda4af', 'fb7185', 'f43f5e', 'e11d48', 'be123c', '9f1239', '881337', '4c0519'],
44
+ };
45
+ const PALETTE = new Map();
46
+ for (const [family, hexes] of Object.entries(FAMILIES)) {
47
+ hexes.forEach((hex, index) => PALETTE.set(`${family}-${SHADES[index]}`, hex));
48
+ }
49
+ PALETTE.set('white', 'ffffff');
50
+ PALETTE.set('black', '000000');
51
+ /** UNKNOWN suppresses checks for the subtree (gradient, var(), low alpha…). */
52
+ const UNKNOWN = 'unknown';
53
+ function parseHex(hex) {
54
+ let value = hex.replace(/^#/, '').toLowerCase();
55
+ if (value.length === 3)
56
+ value = value.split('').map((c) => c + c).join('');
57
+ if (value.length === 8)
58
+ value = value.slice(0, 6);
59
+ if (!/^[0-9a-f]{6}$/.test(value))
60
+ return null;
61
+ return [
62
+ Number.parseInt(value.slice(0, 2), 16),
63
+ Number.parseInt(value.slice(2, 4), 16),
64
+ Number.parseInt(value.slice(4, 6), 16),
65
+ ];
66
+ }
67
+ function luminance(rgb) {
68
+ const [r, g, b] = rgb.map((channel) => {
69
+ const c = channel / 255;
70
+ return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
71
+ });
72
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
73
+ }
74
+ function contrastRatio(hexA, hexB) {
75
+ const a = parseHex(hexA);
76
+ const b = parseHex(hexB);
77
+ if (!a || !b)
78
+ return null;
79
+ const la = luminance(a);
80
+ const lb = luminance(b);
81
+ const [light, dark] = la >= lb ? [la, lb] : [lb, la];
82
+ return (light + 0.05) / (dark + 0.05);
83
+ }
84
+ /** CSS custom properties defined with plain hex values in <style> blocks. */
85
+ function extractCssVarColors(html) {
86
+ const vars = new Map();
87
+ const styles = [...html.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi)].map((m) => m[1]).join('\n');
88
+ for (const match of styles.matchAll(/(--[a-zA-Z0-9_-]+)\s*:\s*#([0-9a-fA-F]{3,8})\b/g)) {
89
+ vars.set(match[1], match[2]);
90
+ }
91
+ return vars;
92
+ }
93
+ /** Resolve a Tailwind color token ("slate-500", "white", "[#aabbcc]", "[var(--x)]") to hex. */
94
+ function resolveColorToken(token, cssVars) {
95
+ var _a;
96
+ const [base, alphaRaw] = token.split('/');
97
+ const alpha = alphaRaw !== undefined ? Number.parseInt(alphaRaw, 10) : 100;
98
+ const arbitrary = base.match(/^\[#([0-9a-fA-F]{3,8})\]$/);
99
+ if (arbitrary)
100
+ return { hex: arbitrary[1], alpha };
101
+ const varRef = base.match(/^\[var\((--[a-zA-Z0-9_-]+)\)\]$/);
102
+ if (varRef)
103
+ return { hex: (_a = cssVars.get(varRef[1])) !== null && _a !== void 0 ? _a : UNKNOWN, alpha };
104
+ if (base.startsWith('['))
105
+ return { hex: UNKNOWN, alpha };
106
+ const named = PALETTE.get(base);
107
+ return { hex: named !== null && named !== void 0 ? named : null, alpha };
108
+ }
109
+ const VOID_TAGS = new Set([
110
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr',
111
+ ]);
112
+ const SKIP_SUBTREES = new Set(['script', 'style', 'svg', 'head', 'title']);
113
+ const NON_COLOR_TEXT = /^text-(?:xs|sm|base|lg|[2-9]?xl|left|center|right|justify|start|end|wrap|nowrap|balance|pretty|clip|ellipsis)$/;
114
+ function classTokens(attrs) {
115
+ var _a, _b;
116
+ const match = attrs.match(/class\s*=\s*("([^"]*)"|'([^']*)')/i);
117
+ const raw = match ? ((_b = (_a = match[2]) !== null && _a !== void 0 ? _a : match[3]) !== null && _b !== void 0 ? _b : '') : '';
118
+ return raw.split(/\s+/).filter(Boolean);
119
+ }
120
+ function extractColors(tokens, cssVars) {
121
+ const result = {};
122
+ let hasGradient = false;
123
+ const gradientStops = [];
124
+ for (const token of tokens) {
125
+ // Variant-prefixed utilities (hover:, md:, dark:…) don't affect base state.
126
+ if (token.includes(':'))
127
+ continue;
128
+ if (token.startsWith('text-')) {
129
+ const rest = token.slice(5);
130
+ if (NON_COLOR_TEXT.test(token)) {
131
+ if (/^text-(?:[2-9]xl)$/.test(token))
132
+ result.large = true;
133
+ continue;
134
+ }
135
+ if (/^(?:transparent|current|inherit)/.test(rest))
136
+ continue;
137
+ const { hex } = resolveColorToken(rest, cssVars);
138
+ if (hex)
139
+ result.text = { hex, token };
140
+ }
141
+ else if (token.startsWith('from-') || token.startsWith('via-') || token.startsWith('to-')) {
142
+ // Gradient stops — collected as a multi-stop background approximation.
143
+ const rest = token.replace(/^(from|via|to)-/, '');
144
+ const { hex, alpha } = resolveColorToken(rest, cssVars);
145
+ if (hex && hex !== UNKNOWN && alpha >= 50)
146
+ gradientStops.push(hex);
147
+ }
148
+ else if (token.startsWith('bg-')) {
149
+ const rest = token.slice(3);
150
+ if (/^(?:gradient|none|cover|contain|center|top|bottom|left|right|repeat|no-repeat|fixed|local|scroll|origin|clip|auto)/.test(rest)) {
151
+ if (rest.startsWith('gradient'))
152
+ hasGradient = true;
153
+ continue;
154
+ }
155
+ if (/^(?:transparent|current|inherit)/.test(rest))
156
+ continue;
157
+ const { hex, alpha } = resolveColorToken(rest, cssVars);
158
+ if (!hex)
159
+ continue;
160
+ // Low-alpha backgrounds blend with the parent — treat as inherit.
161
+ if (alpha < 50) {
162
+ result.bg = { hex: '', token, keepParent: true };
163
+ continue;
164
+ }
165
+ result.bg = { hex, token };
166
+ }
167
+ }
168
+ // A gradient without a resolvable solid bg: approximate with ALL resolvable
169
+ // stops (text passes if readable against ANY of them); tint-only gradients
170
+ // (all stops low-alpha) inherit the parent; nothing resolvable → suppress.
171
+ if (hasGradient && !result.bg) {
172
+ result.bg =
173
+ gradientStops.length > 0
174
+ ? { hex: `grad:${gradientStops.join(',')}`, token: 'bg-gradient' }
175
+ : { hex: '', token: 'bg-gradient', keepParent: true };
176
+ }
177
+ return result;
178
+ }
179
+ const TAG_PATTERN = /<(\/)?([a-zA-Z][a-zA-Z0-9-]*)((?:[^>"']|"[^"]*"|'[^']*')*)>|([^<]+)/g;
180
+ const ERROR_THRESHOLD = 2.0;
181
+ const NORMAL_TEXT_THRESHOLD = 4.5;
182
+ const LARGE_TEXT_THRESHOLD = 3.0;
183
+ function checkContrast(html) {
184
+ var _a, _b, _c;
185
+ const issues = new Map();
186
+ const cssVars = extractCssVarColors(html);
187
+ // Shell default: light scheme, white canvas, near-black preflight text.
188
+ const stack = [{ tag: 'root', text: '000000', bg: 'ffffff', textToken: 'default', bgToken: 'page background', large: false, bgApprox: false }];
189
+ let skipDepth = 0;
190
+ let skipTag = '';
191
+ TAG_PATTERN.lastIndex = 0;
192
+ let match;
193
+ while ((match = TAG_PATTERN.exec(html)) !== null) {
194
+ const [, closing, tagRaw, attrs, textContent] = match;
195
+ if (textContent !== undefined) {
196
+ if (skipDepth > 0)
197
+ continue;
198
+ const trimmed = textContent.replace(/&[a-z#0-9]+;/gi, 'x').trim();
199
+ if (!trimmed)
200
+ continue;
201
+ const frame = stack[stack.length - 1];
202
+ if (!frame.text || !frame.bg || frame.text === UNKNOWN || frame.bg === UNKNOWN)
203
+ continue;
204
+ let ratio;
205
+ if (frame.bg.startsWith('grad:')) {
206
+ // Gradient: readable against ANY resolvable stop counts as readable.
207
+ const ratios = frame.bg
208
+ .slice(5)
209
+ .split(',')
210
+ .map((stop) => contrastRatio(frame.text, stop))
211
+ .filter((value) => value !== null);
212
+ ratio = ratios.length > 0 ? Math.max(...ratios) : null;
213
+ }
214
+ else {
215
+ ratio = contrastRatio(frame.text, frame.bg);
216
+ }
217
+ if (ratio === null)
218
+ continue;
219
+ const threshold = frame.large ? LARGE_TEXT_THRESHOLD : NORMAL_TEXT_THRESHOLD;
220
+ if (ratio >= threshold)
221
+ continue;
222
+ const key = `${frame.textToken}|${frame.bgToken}`;
223
+ if (!issues.has(key)) {
224
+ issues.set(key, {
225
+ ratio: Math.round(ratio * 100) / 100,
226
+ textToken: (_a = frame.textToken) !== null && _a !== void 0 ? _a : 'inherited',
227
+ bgToken: (_b = frame.bgToken) !== null && _b !== void 0 ? _b : 'inherited',
228
+ snippet: trimmed.slice(0, 60),
229
+ // Approximated backgrounds never block — advisory only.
230
+ severity: ratio < ERROR_THRESHOLD && !frame.bgApprox ? 'error' : 'warning',
231
+ });
232
+ }
233
+ continue;
234
+ }
235
+ const tag = tagRaw.toLowerCase();
236
+ if (skipDepth > 0) {
237
+ if (tag === skipTag)
238
+ skipDepth += closing ? -1 : 1;
239
+ continue;
240
+ }
241
+ if (closing) {
242
+ for (let i = stack.length - 1; i > 0; i--) {
243
+ if (stack[i].tag === tag) {
244
+ stack.length = i;
245
+ break;
246
+ }
247
+ }
248
+ continue;
249
+ }
250
+ if (SKIP_SUBTREES.has(tag)) {
251
+ if (!/\/\s*$/.test(attrs)) {
252
+ skipDepth = 1;
253
+ skipTag = tag;
254
+ }
255
+ continue;
256
+ }
257
+ if (VOID_TAGS.has(tag) || /\/\s*$/.test(attrs))
258
+ continue;
259
+ const parent = stack[stack.length - 1];
260
+ const tokens = classTokens(attrs);
261
+ const colors = extractColors(tokens, cssVars);
262
+ // Overlay pattern: an absolutely-positioned full-cover child with a
263
+ // background (hero overlays) becomes the EFFECTIVE background for its
264
+ // parent's later content — patch the parent frame to match render truth.
265
+ if (tokens.includes('absolute') &&
266
+ (tokens.includes('inset-0') || (tokens.includes('top-0') && tokens.includes('left-0'))) &&
267
+ colors.bg &&
268
+ !colors.bg.keepParent) {
269
+ parent.bg = colors.bg.hex;
270
+ parent.bgToken = colors.bg.token;
271
+ parent.bgApprox = true;
272
+ }
273
+ const bgIsApprox = colors.bg
274
+ ? colors.bg.keepParent
275
+ ? parent.bgApprox
276
+ : colors.bg.hex.startsWith('grad:')
277
+ : parent.bgApprox;
278
+ stack.push({
279
+ tag,
280
+ text: colors.text ? colors.text.hex : parent.text,
281
+ bg: colors.bg ? (colors.bg.keepParent ? parent.bg : colors.bg.hex) : parent.bg,
282
+ textToken: colors.text ? colors.text.token : parent.textToken,
283
+ bgToken: colors.bg && !colors.bg.keepParent ? colors.bg.token : parent.bgToken,
284
+ large: (_c = colors.large) !== null && _c !== void 0 ? _c : parent.large,
285
+ bgApprox: bgIsApprox,
286
+ });
287
+ }
288
+ return [...issues.values()];
289
+ }
290
+ //# sourceMappingURL=contrast-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast-check.js","sourceRoot":"","sources":["../../../src/lib/session-pages/contrast-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Warning rules that are heuristic and historically cause endless mid-build
2
+ * fix loops (static contrast especially). They remain visible in full audits
3
+ * but must NOT ride back as publish advisories or consistency openAdvisories
4
+ * that the parent treats as mandatory work. */
5
+ export declare const DEFERRED_QUALITY_RULES: Set<string>;
6
+ export declare function isDeferredQualityRule(rule: string): boolean;
7
+ //# sourceMappingURL=deferred-quality-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-quality-rules.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/deferred-quality-rules.ts"],"names":[],"mappings":"AAAA;;;+CAG+C;AAC/C,eAAO,MAAM,sBAAsB,aAYjC,CAAA;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFERRED_QUALITY_RULES = void 0;
4
+ exports.isDeferredQualityRule = isDeferredQualityRule;
5
+ /** Warning rules that are heuristic and historically cause endless mid-build
6
+ * fix loops (static contrast especially). They remain visible in full audits
7
+ * but must NOT ride back as publish advisories or consistency openAdvisories
8
+ * that the parent treats as mandatory work. */
9
+ exports.DEFERRED_QUALITY_RULES = new Set([
10
+ 'low-contrast',
11
+ 'unreadable-contrast',
12
+ 'ai-palette-cliche',
13
+ 'inert-dark-variants',
14
+ 'hard-coded-scheme-color',
15
+ 'dead-link',
16
+ 'thin-styling',
17
+ 'missing-reduced-motion',
18
+ 'inline-handler',
19
+ 'generic-title',
20
+ 'static-controls',
21
+ ]);
22
+ function isDeferredQualityRule(rule) {
23
+ return exports.DEFERRED_QUALITY_RULES.has(rule);
24
+ }
25
+ //# sourceMappingURL=deferred-quality-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deferred-quality-rules.js","sourceRoot":"","sources":["../../../src/lib/session-pages/deferred-quality-rules.ts"],"names":[],"mappings":";;;AAkBA,sDAEC;AApBD;;;+CAG+C;AAClC,QAAA,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,yBAAyB;IACzB,WAAW;IACX,cAAc;IACd,wBAAwB;IACxB,gBAAgB;IAChB,eAAe;IACf,iBAAiB;CAClB,CAAC,CAAA;AAEF,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,8BAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-session-artifact.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifact.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;CACb;AAqBD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA+BtC"}
1
+ {"version":3,"file":"delete-session-artifact.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifact.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,2BAA2B,CAAC,CAmBtC"}
@@ -1,56 +1,27 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.deleteSessionArtifact = deleteSessionArtifact;
7
- const promises_1 = __importDefault(require("node:fs/promises"));
8
- const node_path_1 = __importDefault(require("node:path"));
9
4
  const session_artifact_yjs_store_1 = require("../../realtime/session-artifact-yjs-store");
5
+ const list_library_items_1 = require("../library/list-library-items");
10
6
  const artifact_storage_1 = require("./artifact-storage");
7
+ const list_session_artifacts_1 = require("./list-session-artifacts");
11
8
  const paths_1 = require("./paths");
12
- async function pruneEmptyParentDirs(startDir, stopDir) {
13
- let current = startDir;
14
- const resolvedStop = node_path_1.default.resolve(stopDir);
15
- while (current !== resolvedStop && current.startsWith(`${resolvedStop}${node_path_1.default.sep}`)) {
16
- let entries;
17
- try {
18
- entries = await promises_1.default.readdir(current);
19
- }
20
- catch (_a) {
21
- break;
22
- }
23
- if (entries.length > 0) {
24
- break;
25
- }
26
- await promises_1.default.rmdir(current);
27
- current = node_path_1.default.dirname(current);
28
- }
29
- }
30
9
  async function deleteSessionArtifact(sessionId, artifactPath) {
10
+ var _a, _b;
31
11
  const normalizedPath = (0, paths_1.normalizeArtifactPath)(artifactPath);
32
- const sessionRoot = node_path_1.default.resolve((0, paths_1.getSessionDir)(sessionId));
33
- const [state, content] = await Promise.all([
34
- (0, artifact_storage_1.readArtifactLatestState)(sessionId, normalizedPath),
35
- (0, artifact_storage_1.readArtifactContentSnapshot)(sessionId, normalizedPath),
36
- ]);
37
- let exists = Boolean(state === null || state === void 0 ? void 0 : state.byteLength) || content !== null;
38
- if (!exists) {
39
- try {
40
- await promises_1.default.access((0, paths_1.resolveArtifactPath)(sessionId, normalizedPath));
41
- exists = true;
42
- }
43
- catch (_a) {
44
- exists = false;
45
- }
46
- }
47
- if (!exists) {
12
+ if (!(await (0, artifact_storage_1.sessionArtifactExistsOnStorage)(sessionId, normalizedPath))) {
48
13
  throw new Error(`Session artifact not found: ${normalizedPath}`);
49
14
  }
50
15
  (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().evictDocument(sessionId, normalizedPath);
51
16
  await (0, artifact_storage_1.deleteArtifactStorageFiles)(sessionId, normalizedPath);
52
- const contentParent = node_path_1.default.dirname(node_path_1.default.join(sessionRoot, normalizedPath));
53
- await pruneEmptyParentDirs(contentParent, sessionRoot);
17
+ const remaining = await (0, list_session_artifacts_1.listSessionArtifacts)(sessionId);
18
+ if (remaining.length === 0) {
19
+ await (0, list_library_items_1.clearChatHasArtifacts)(sessionId);
20
+ }
21
+ else {
22
+ const previewPath = (_b = (_a = remaining.find((file) => file.path === 'index.html')) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : remaining[0].path;
23
+ await (0, list_library_items_1.markChatHasArtifacts)(sessionId, previewPath, remaining.length);
24
+ }
54
25
  return { path: normalizedPath };
55
26
  }
56
27
  //# sourceMappingURL=delete-session-artifact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-session-artifact.js","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifact.ts"],"names":[],"mappings":";;;;;AAiCA,sDAkCC;AAnED,gEAAiC;AACjC,0DAA4B;AAC5B,0FAAsF;AACtF,yDAI2B;AAC3B,mCAAmF;AAMnF,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,OAAe;IACnE,IAAI,OAAO,GAAG,QAAQ,CAAA;IACtB,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,OAAO,OAAO,KAAK,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,mBAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QACpF,IAAI,OAAiB,CAAA;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC;QAAC,WAAM,CAAC;YACP,MAAK;QACP,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAK;QACP,CAAC;QACD,MAAM,kBAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACvB,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,YAAoB;IAEpB,MAAM,cAAc,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAA,qBAAa,EAAC,SAAS,CAAC,CAAC,CAAA;IAE1D,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,IAAA,0CAAuB,EAAC,SAAS,EAAE,cAAc,CAAC;QAClD,IAAA,8CAA2B,EAAC,SAAS,EAAE,cAAc,CAAC;KACvD,CAAC,CAAA;IAEF,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAC,IAAI,OAAO,KAAK,IAAI,CAAA;IAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,MAAM,CAAC,IAAA,2BAAmB,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;YAC/D,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,GAAG,KAAK,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,cAAc,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,IAAA,uDAA0B,GAAE,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAErE,MAAM,IAAA,6CAA0B,EAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAE3D,MAAM,aAAa,GAAG,mBAAI,CAAC,OAAO,CAAC,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAA;IAC1E,MAAM,oBAAoB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;IAEtD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;AACjC,CAAC"}
1
+ {"version":3,"file":"delete-session-artifact.js","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifact.ts"],"names":[],"mappings":";;AAaA,sDAsBC;AAnCD,0FAAsF;AACtF,sEAA2F;AAC3F,yDAG2B;AAC3B,qEAA+D;AAC/D,mCAA+C;AAMxC,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,YAAoB;;IAEpB,MAAM,cAAc,GAAG,IAAA,6BAAqB,EAAC,YAAY,CAAC,CAAA;IAC1D,IAAI,CAAC,CAAC,MAAM,IAAA,iDAA8B,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,+BAA+B,cAAc,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,IAAA,uDAA0B,GAAE,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IACrE,MAAM,IAAA,6CAA0B,EAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAE3D,MAAM,SAAS,GAAG,MAAM,IAAA,6CAAoB,EAAC,SAAS,CAAC,CAAA;IACvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAA,0CAAqB,EAAC,SAAS,CAAC,CAAA;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GACf,MAAA,MAAA,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,0CAAE,IAAI,mCAAI,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAA;QAClF,MAAM,IAAA,yCAAoB,EAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;AACjC,CAAC"}
@@ -1,11 +1,5 @@
1
1
  export interface DeleteAllSessionArtifactsResult {
2
2
  removed: string[];
3
3
  }
4
- /**
5
- * Remove every artifact of a session: evicts the Yjs documents from memory and
6
- * deletes the whole session directory (content, latest state, snapshots).
7
- * Used when a session/chat is deleted so test and abandoned sessions leave no
8
- * garbage on disk. Safe to call for sessions without artifacts.
9
- */
10
4
  export declare function deleteAllSessionArtifacts(sessionId: string): Promise<DeleteAllSessionArtifactsResult>;
11
5
  //# sourceMappingURL=delete-session-artifacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-session-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifacts.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAmB3G"}
1
+ {"version":3,"file":"delete-session-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/session-pages/delete-session-artifacts.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,+BAA+B,CAAC,CA6B1C"}