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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) 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/design-skills.d.ts +48 -0
  16. package/dist/agents/shared/design-skills.d.ts.map +1 -0
  17. package/dist/agents/shared/design-skills.js +230 -0
  18. package/dist/agents/shared/design-skills.js.map +1 -0
  19. package/dist/agents/shared/generate-session-images.tool.d.ts +15 -0
  20. package/dist/agents/shared/generate-session-images.tool.d.ts.map +1 -0
  21. package/dist/agents/shared/generate-session-images.tool.js +98 -0
  22. package/dist/agents/shared/generate-session-images.tool.js.map +1 -0
  23. package/dist/agents/shared/publish-session-artifacts.tool.d.ts +5 -0
  24. package/dist/agents/shared/publish-session-artifacts.tool.d.ts.map +1 -1
  25. package/dist/agents/shared/publish-session-artifacts.tool.js +154 -15
  26. package/dist/agents/shared/publish-session-artifacts.tool.js.map +1 -1
  27. package/dist/agents/shared/session-quality-report.tool.js +1 -1
  28. package/dist/agents/shared/session-quality-report.tool.js.map +1 -1
  29. package/dist/agents/shared/update-session-artifacts.tool.d.ts +5 -0
  30. package/dist/agents/shared/update-session-artifacts.tool.d.ts.map +1 -1
  31. package/dist/agents/shared/update-session-artifacts.tool.js +136 -26
  32. package/dist/agents/shared/update-session-artifacts.tool.js.map +1 -1
  33. package/dist/agents/shared/validate-artifact-content.tools.d.ts +4 -0
  34. package/dist/agents/shared/validate-artifact-content.tools.d.ts.map +1 -1
  35. package/dist/agents/shared/validate-artifact-content.tools.js +24 -1
  36. package/dist/agents/shared/validate-artifact-content.tools.js.map +1 -1
  37. package/dist/agents/skills/designer.skill.d.ts.map +1 -1
  38. package/dist/agents/skills/designer.skill.js +75 -113
  39. package/dist/agents/skills/designer.skill.js.map +1 -1
  40. package/dist/agents/skills/skill-injection.d.ts.map +1 -1
  41. package/dist/agents/skills/skill-injection.js +9 -3
  42. package/dist/agents/skills/skill-injection.js.map +1 -1
  43. package/dist/context.d.ts +4 -0
  44. package/dist/context.d.ts.map +1 -1
  45. package/dist/context.js.map +1 -1
  46. package/dist/create-builder-api.d.ts +6 -0
  47. package/dist/create-builder-api.d.ts.map +1 -1
  48. package/dist/create-builder-api.js +2 -0
  49. package/dist/create-builder-api.js.map +1 -1
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +6 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/session-artifacts/hashline-diff-guide.d.ts +1 -1
  55. package/dist/lib/session-artifacts/hashline-diff-guide.d.ts.map +1 -1
  56. package/dist/lib/session-artifacts/hashline-diff-guide.js +9 -5
  57. package/dist/lib/session-artifacts/hashline-diff-guide.js.map +1 -1
  58. package/dist/lib/session-artifacts/parse-hashline-diff.d.ts +13 -0
  59. package/dist/lib/session-artifacts/parse-hashline-diff.d.ts.map +1 -1
  60. package/dist/lib/session-artifacts/parse-hashline-diff.js +72 -0
  61. package/dist/lib/session-artifacts/parse-hashline-diff.js.map +1 -1
  62. package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -1
  63. package/dist/lib/session-pages/artifact-quality-audit.js +19 -14
  64. package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -1
  65. package/dist/lib/session-pages/html-artifact-template.d.ts +16 -0
  66. package/dist/lib/session-pages/html-artifact-template.d.ts.map +1 -1
  67. package/dist/lib/session-pages/html-artifact-template.js +166 -10
  68. package/dist/lib/session-pages/html-artifact-template.js.map +1 -1
  69. package/dist/lib/session-pages/index.d.ts +4 -0
  70. package/dist/lib/session-pages/index.d.ts.map +1 -1
  71. package/dist/lib/session-pages/index.js +11 -1
  72. package/dist/lib/session-pages/index.js.map +1 -1
  73. package/dist/lib/session-pages/write-binary-session-artifact.d.ts +12 -0
  74. package/dist/lib/session-pages/write-binary-session-artifact.d.ts.map +1 -0
  75. package/dist/lib/session-pages/write-binary-session-artifact.js +23 -0
  76. package/dist/lib/session-pages/write-binary-session-artifact.js.map +1 -0
  77. package/dist/lib/session-pages/write-session-artifacts.d.ts +1 -0
  78. package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
  79. package/dist/lib/session-pages/write-session-artifacts.js +4 -1
  80. package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
  81. package/dist/lib/session-plans/build-plan.d.ts +13 -3
  82. package/dist/lib/session-plans/build-plan.d.ts.map +1 -1
  83. package/dist/lib/session-plans/build-plan.js +37 -6
  84. package/dist/lib/session-plans/build-plan.js.map +1 -1
  85. package/dist/realtime/session-artifact-yjs-store.d.ts +18 -0
  86. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  87. package/dist/realtime/session-artifact-yjs-store.js +62 -0
  88. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  89. package/dist/server.d.ts.map +1 -1
  90. package/dist/server.js +2 -0
  91. package/dist/server.js.map +1 -1
  92. package/package.json +9 -9
  93. package/dist/agents/blocknote.agent.d.ts +0 -6
  94. package/dist/agents/blocknote.agent.d.ts.map +0 -1
  95. package/dist/agents/blocknote.agent.js +0 -18
  96. package/dist/agents/blocknote.agent.js.map +0 -1
  97. package/dist/agents/filingramp-fetch.agent.d.ts +0 -4
  98. package/dist/agents/filingramp-fetch.agent.d.ts.map +0 -1
  99. package/dist/agents/filingramp-fetch.agent.js +0 -195
  100. package/dist/agents/filingramp-fetch.agent.js.map +0 -1
  101. package/dist/agents/knowledge/filingramp-endpoints.d.ts +0 -23
  102. package/dist/agents/knowledge/filingramp-endpoints.d.ts.map +0 -1
  103. package/dist/agents/knowledge/filingramp-endpoints.js +0 -116
  104. package/dist/agents/knowledge/filingramp-endpoints.js.map +0 -1
  105. package/dist/agents/shared/blocknote-system-prompt.d.ts +0 -2
  106. package/dist/agents/shared/blocknote-system-prompt.d.ts.map +0 -1
  107. package/dist/agents/shared/blocknote-system-prompt.js +0 -40
  108. package/dist/agents/shared/blocknote-system-prompt.js.map +0 -1
  109. package/dist/agents/shared/get-latest-session-artifact.tool.d.ts +0 -7
  110. package/dist/agents/shared/get-latest-session-artifact.tool.d.ts.map +0 -1
  111. package/dist/agents/shared/get-latest-session-artifact.tool.js +0 -43
  112. package/dist/agents/shared/get-latest-session-artifact.tool.js.map +0 -1
  113. package/dist/agents/shared/get-session-artifact-content.tool.d.ts +0 -7
  114. package/dist/agents/shared/get-session-artifact-content.tool.d.ts.map +0 -1
  115. package/dist/agents/shared/get-session-artifact-content.tool.js +0 -44
  116. package/dist/agents/shared/get-session-artifact-content.tool.js.map +0 -1
  117. package/dist/agents/shared/list-session-artifact-paths.tool.d.ts +0 -5
  118. package/dist/agents/shared/list-session-artifact-paths.tool.d.ts.map +0 -1
  119. package/dist/agents/shared/list-session-artifact-paths.tool.js +0 -37
  120. package/dist/agents/shared/list-session-artifact-paths.tool.js.map +0 -1
  121. package/dist/lib/ai/agent-ai-service.d.ts +0 -3
  122. package/dist/lib/ai/agent-ai-service.d.ts.map +0 -1
  123. package/dist/lib/ai/agent-ai-service.js +0 -15
  124. package/dist/lib/ai/agent-ai-service.js.map +0 -1
  125. package/dist/lib/ai/ai-error-details.d.ts +0 -13
  126. package/dist/lib/ai/ai-error-details.d.ts.map +0 -1
  127. package/dist/lib/ai/ai-error-details.js +0 -84
  128. package/dist/lib/ai/ai-error-details.js.map +0 -1
  129. package/dist/lib/ai/generate-ai-text.d.ts +0 -12
  130. package/dist/lib/ai/generate-ai-text.d.ts.map +0 -1
  131. package/dist/lib/ai/generate-ai-text.js +0 -105
  132. package/dist/lib/ai/generate-ai-text.js.map +0 -1
  133. package/dist/lib/ai/run-explicit-agent.d.ts +0 -15
  134. package/dist/lib/ai/run-explicit-agent.d.ts.map +0 -1
  135. package/dist/lib/ai/run-explicit-agent.js +0 -30
  136. package/dist/lib/ai/run-explicit-agent.js.map +0 -1
  137. package/dist/lib/notebooks/notebook-sql-client.d.ts +0 -5
  138. package/dist/lib/notebooks/notebook-sql-client.d.ts.map +0 -1
  139. package/dist/lib/notebooks/notebook-sql-client.js +0 -37
  140. package/dist/lib/notebooks/notebook-sql-client.js.map +0 -1
  141. package/dist/lib/notebooks/notebook-sql-schema.d.ts +0 -16
  142. package/dist/lib/notebooks/notebook-sql-schema.d.ts.map +0 -1
  143. package/dist/lib/notebooks/notebook-sql-schema.js +0 -117
  144. package/dist/lib/notebooks/notebook-sql-schema.js.map +0 -1
  145. package/dist/lib/notebooks/notebook-sql.d.ts +0 -9
  146. package/dist/lib/notebooks/notebook-sql.d.ts.map +0 -1
  147. package/dist/lib/notebooks/notebook-sql.js +0 -36
  148. package/dist/lib/notebooks/notebook-sql.js.map +0 -1
  149. package/dist/lib/session-artifacts/apply-hashline-edits.d.ts +0 -3
  150. package/dist/lib/session-artifacts/apply-hashline-edits.d.ts.map +0 -1
  151. package/dist/lib/session-artifacts/apply-hashline-edits.js +0 -25
  152. package/dist/lib/session-artifacts/apply-hashline-edits.js.map +0 -1
  153. package/dist/lib/session-artifacts/artifact-text-edit.d.ts +0 -8
  154. package/dist/lib/session-artifacts/artifact-text-edit.d.ts.map +0 -1
  155. package/dist/lib/session-artifacts/artifact-text-edit.js +0 -23
  156. package/dist/lib/session-artifacts/artifact-text-edit.js.map +0 -1
  157. package/dist/lib/session-artifacts/hashline-tag.d.ts +0 -33
  158. package/dist/lib/session-artifacts/hashline-tag.d.ts.map +0 -1
  159. package/dist/lib/session-artifacts/hashline-tag.js +0 -80
  160. package/dist/lib/session-artifacts/hashline-tag.js.map +0 -1
  161. package/dist/lib/session-pages/inject-preview-error-reporter.d.ts +0 -3
  162. package/dist/lib/session-pages/inject-preview-error-reporter.d.ts.map +0 -1
  163. package/dist/lib/session-pages/inject-preview-error-reporter.js +0 -30
  164. package/dist/lib/session-pages/inject-preview-error-reporter.js.map +0 -1
  165. package/dist/lib/session-pages/read-session-artifact.d.ts +0 -7
  166. package/dist/lib/session-pages/read-session-artifact.d.ts.map +0 -1
  167. package/dist/lib/session-pages/read-session-artifact.js +0 -60
  168. package/dist/lib/session-pages/read-session-artifact.js.map +0 -1
  169. package/dist/lib/session-pages/session-pico-css.d.ts +0 -5
  170. package/dist/lib/session-pages/session-pico-css.d.ts.map +0 -1
  171. package/dist/lib/session-pages/session-pico-css.js +0 -11
  172. package/dist/lib/session-pages/session-pico-css.js.map +0 -1
  173. package/dist/realtime/realtime-auth.d.ts +0 -12
  174. package/dist/realtime/realtime-auth.d.ts.map +0 -1
  175. package/dist/realtime/realtime-auth.js +0 -25
  176. package/dist/realtime/realtime-auth.js.map +0 -1
  177. package/dist/realtime/yjs-account-namespace.d.ts +0 -5
  178. package/dist/realtime/yjs-account-namespace.d.ts.map +0 -1
  179. package/dist/realtime/yjs-account-namespace.js +0 -21
  180. package/dist/realtime/yjs-account-namespace.js.map +0 -1
  181. package/dist/routes/notebooks/sql-execute.d.ts +0 -3
  182. package/dist/routes/notebooks/sql-execute.d.ts.map +0 -1
  183. package/dist/routes/notebooks/sql-execute.js +0 -45
  184. package/dist/routes/notebooks/sql-execute.js.map +0 -1
  185. package/dist/routes/sql.d.ts +0 -2
  186. package/dist/routes/sql.d.ts.map +0 -1
  187. package/dist/routes/sql.js +0 -50
  188. package/dist/routes/sql.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateSessionArtifactsSubagentTool = exports.applySessionArtifactDiffTool = exports.getSessionArtifactLatestContentTool = exports.updateSessionArtifactInputSchema = exports.getSessionArtifactLatestContentInputSchema = exports.applySessionArtifactDiffInputSchema = void 0;
4
+ exports.shouldStopUpdateSubagent = shouldStopUpdateSubagent;
4
5
  exports.getUpdateSessionArtifactsSubagent = getUpdateSessionArtifactsSubagent;
5
6
  const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
6
7
  const zod_1 = require("zod");
@@ -9,9 +10,12 @@ const agent_context_1 = require("./agent-context");
9
10
  const artifact_events_1 = require("../../lib/socket/artifact-events");
10
11
  const hashline_diff_guide_1 = require("../../lib/session-artifacts/hashline-diff-guide");
11
12
  const hashline_tags_1 = require("../../lib/session-artifacts/hashline-tags");
13
+ const parse_hashline_diff_1 = require("../../lib/session-artifacts/parse-hashline-diff");
12
14
  const session_pages_1 = require("../../lib/session-pages");
13
15
  const session_artifact_yjs_store_1 = require("../../realtime/session-artifact-yjs-store");
14
16
  const logger_1 = require("../../logger");
17
+ const build_plan_1 = require("../../lib/session-plans/build-plan");
18
+ const skills_1 = require("../skills");
15
19
  exports.applySessionArtifactDiffInputSchema = zod_1.z.object({
16
20
  path: zod_1.z
17
21
  .string()
@@ -20,20 +24,47 @@ exports.applySessionArtifactDiffInputSchema = zod_1.z.object({
20
24
  diff: zod_1.z
21
25
  .string()
22
26
  .min(1)
23
- .describe('Hashline SEARCH/REPLACE blocks using tag ranges from latest content (<<<SEARCH ... >>>REPLACE ... <<<END).'),
27
+ .describe('Either (1) hashline SEARCH/REPLACE blocks with tags from getSessionArtifactLatestContent, or (2) the COMPLETE new file contents with no <<<SEARCH markers for a wholesale rewrite (preferred for structural/consistency fixes).'),
24
28
  });
25
29
  exports.getSessionArtifactLatestContentInputSchema = zod_1.z.object({
26
30
  path: zod_1.z.string().min(1).describe('Relative path of an existing session artifact'),
27
31
  });
28
32
  exports.updateSessionArtifactInputSchema = zod_1.z.object({
29
- parentContext: zod_1.z.string().min(1).describe('Additional context provided by the parent agent to help complete the task. May include project requirements, user requests, design decisions, architecture details, existing artifact summaries, related files, constraints, assumptions, acceptance criteria, prior conversation excerpts, or any other information relevant to implementing the requested changes.'),
30
- task: zod_1.z.string().min(1).describe('The specific work to be performed by the subagent. Describes the requested changes, desired outcome, scope of work, and any implementation requirements. This is the primary instruction that the subagent should execute using the provided context.'),
33
+ parentContext: zod_1.z
34
+ .string()
35
+ .min(1)
36
+ .describe('Context the editor cannot see: design brief tokens, exact findings to fix (consistency only), acceptance criteria. Keep short.'),
37
+ task: zod_1.z
38
+ .string()
39
+ .min(1)
40
+ .describe('Single edit instruction including the exact existing path. For HTML section/structural work say WHOLESALE rewrite of the complete page. One delegation per plan task — do not stack multiple updateSessionArtifact calls for the same task.'),
41
+ skills: zod_1.z
42
+ .array(zod_1.z.string())
43
+ .optional()
44
+ .describe('Relevant built-in and account skill guides are selected automatically. Pass [] for doc edits and read/Q&A tasks to skip dynamic skill guidance; otherwise omit this field.'),
31
45
  });
32
- async function assertExistingArtifactPath(sessionId, artifactPath) {
46
+ /** Missing-path attempts per subagent — the editor cannot create files, so
47
+ * retrying against a nonexistent path is always futile. */
48
+ const missingPathAttempts = new Map();
49
+ const MISSING_PATH_ATTEMPTS_LIMIT = 500;
50
+ async function assertExistingArtifactPath(sessionId, artifactPath, context) {
51
+ var _a, _b, _c;
33
52
  const normalizedPath = (0, session_pages_1.normalizeArtifactPath)(artifactPath);
34
53
  const [artifact] = await (0, session_pages_1.readSessionArtifacts)(sessionId, [normalizedPath]);
35
54
  if (!(artifact === null || artifact === void 0 ? void 0 : artifact.found)) {
36
- throw new Error(`Session artifact not found: ${normalizedPath}`);
55
+ const files = await (0, session_pages_1.listSessionArtifacts)(sessionId);
56
+ const key = `${String((_b = (_a = context === null || context === void 0 ? void 0 : context.data) === null || _a === void 0 ? void 0 : _a.subagentChatId) !== null && _b !== void 0 ? _b : sessionId)}:${normalizedPath}`;
57
+ const attempts = ((_c = missingPathAttempts.get(key)) !== null && _c !== void 0 ? _c : 0) + 1;
58
+ if (missingPathAttempts.size > MISSING_PATH_ATTEMPTS_LIMIT) {
59
+ const oldest = missingPathAttempts.keys().next().value;
60
+ if (oldest !== undefined)
61
+ missingPathAttempts.delete(oldest);
62
+ }
63
+ missingPathAttempts.set(key, attempts);
64
+ const escalation = attempts > 1
65
+ ? ' STOP — you were already told this file does not exist and you CANNOT create files. End your turn NOW with a short reply telling the parent to create it via publishSessionArtifacts.'
66
+ : ' You cannot create files — do not retry any tool against this path; reply to the parent that it must be created via publishSessionArtifacts.';
67
+ throw new Error(`Session artifact not found: ${normalizedPath}. Existing files: ${files.map((file) => file.path).join(', ') || '(none)'}.${escalation}`);
37
68
  }
38
69
  return normalizedPath;
39
70
  }
@@ -58,7 +89,7 @@ exports.getSessionArtifactLatestContentTool = {
58
89
  throw new Error('Session ID is required');
59
90
  }
60
91
  try {
61
- const path = await assertExistingArtifactPath(sessionId, input.path);
92
+ const path = await assertExistingArtifactPath(sessionId, input.path, context);
62
93
  const content = await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().getLatestText(sessionId, path);
63
94
  return {
64
95
  path,
@@ -84,13 +115,43 @@ exports.applySessionArtifactDiffTool = {
84
115
  path: zod_1.z.string(),
85
116
  }),
86
117
  execute: async (input, context) => {
118
+ var _a;
87
119
  const sessionId = (0, agent_context_1.getRootChatId)(context);
88
120
  if (!sessionId) {
89
121
  throw new Error('Session ID is required');
90
122
  }
91
123
  try {
92
- const path = await assertExistingArtifactPath(sessionId, input.path);
93
- const result = await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().applyPatchText(sessionId, path, input.diff);
124
+ const path = await assertExistingArtifactPath(sessionId, input.path, context);
125
+ const isHtml = path.toLowerCase().endsWith('.html');
126
+ const classification = (0, parse_hashline_diff_1.classifyArtifactDiff)(input.diff, { isHtml });
127
+ if (classification.kind === 'invalid') {
128
+ throw new Error(classification.reason);
129
+ }
130
+ const current = await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().getLatestText(sessionId, path);
131
+ const updated = classification.kind === 'replace'
132
+ ? isHtml
133
+ ? (0, session_pages_1.prepareHtmlArtifactContent)(classification.content, {})
134
+ : classification.content
135
+ : isHtml
136
+ ? (0, session_pages_1.prepareHtmlArtifactContent)((0, hashline_tags_1.joinContentLines)((0, parse_hashline_diff_1.applyPatchToLines)((0, hashline_tags_1.splitContentLines)(current), input.diff)), { fragment: false })
137
+ : (0, hashline_tags_1.joinContentLines)((0, parse_hashline_diff_1.applyPatchToLines)((0, hashline_tags_1.splitContentLines)(current), input.diff));
138
+ // Soft quality gate: reject edits that introduce NEW audit errors
139
+ // (legacy pages may carry old findings — those never block edits).
140
+ if (isHtml) {
141
+ const beforeErrorRules = new Set((0, session_pages_1.auditHtmlArtifact)(current).findings
142
+ .filter((finding) => finding.severity === 'error')
143
+ .map((finding) => finding.rule));
144
+ const introduced = (0, session_pages_1.auditHtmlArtifact)(updated).findings.filter((finding) => finding.severity === 'error' && !beforeErrorRules.has(finding.rule));
145
+ if (introduced.length > 0) {
146
+ throw new Error(`Edit rejected — it introduces quality errors: ${introduced
147
+ .map((finding) => `[${finding.rule}] ${finding.message}`)
148
+ .join(' ')}`);
149
+ }
150
+ }
151
+ // Always write the gated `updated` content. Never re-parse the raw
152
+ // diff via applyPatchText — that path threw on malformed SEARCH
153
+ // markers after partial retries and left duplicated sections.
154
+ const result = await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().replaceFromContent(sessionId, path, updated);
94
155
  const publishedAt = new Date().toISOString();
95
156
  const previewUrl = `${(0, context_1.getBuilderApiContext)().config.apiPrefix}/sessions/${sessionId}/${result.path}`;
96
157
  const socketPayload = {
@@ -101,10 +162,28 @@ exports.applySessionArtifactDiffTool = {
101
162
  };
102
163
  const notifyUserIds = await (0, session_pages_1.resolveArtifactNotifyUserIds)(sessionId, context);
103
164
  (0, artifact_events_1.emitArtifactUpdateToUsers)(notifyUserIds, socketPayload);
165
+ try {
166
+ const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
167
+ const plan = (0, build_plan_1.parseBuildPlan)(await store.getLatestText(sessionId, build_plan_1.BUILD_PLAN_PATH).catch(() => ''));
168
+ if ((_a = plan === null || plan === void 0 ? void 0 : plan.openAdvisories) === null || _a === void 0 ? void 0 : _a.some((entry) => entry.path === result.path)) {
169
+ (0, build_plan_1.clearOpenAdvisories)(plan, [result.path], publishedAt);
170
+ await store.upsertFromContent(sessionId, build_plan_1.BUILD_PLAN_PATH, (0, build_plan_1.serializeBuildPlan)(plan));
171
+ }
172
+ }
173
+ catch (err) {
174
+ (0, logger_1.getBuilderApiLogger)().warn(`[update] failed to clear openAdvisories: ${String(err)}`);
175
+ }
104
176
  return { path: result.path };
105
177
  }
106
178
  catch (err) {
107
179
  (0, logger_1.getBuilderApiLogger)().error({ err });
180
+ // Stale tags are the common failure loop: models resend the same diff
181
+ // instead of re-reading. Point them at a fresh read (do NOT embed the
182
+ // entire file — that encouraged broken wholesale pastes mid-hashline).
183
+ if (err instanceof Error && /hash mismatch|out of range/i.test(err.message)) {
184
+ const path = (0, session_pages_1.normalizeArtifactPath)(input.path);
185
+ throw new Error(`${err.message}\nDo NOT resend the same diff — its tags are stale. Call getSessionArtifactLatestContent("${path}") again, then either rebuild SEARCH/REPLACE from the new tags OR send the COMPLETE page as diff with no <<<SEARCH markers (preferred for structural fixes).`);
186
+ }
108
187
  throw err;
109
188
  }
110
189
  },
@@ -115,37 +194,44 @@ exports.updateSessionArtifactsSubagentTool = {
115
194
  userConfigurable: true,
116
195
  data: {
117
196
  title: 'updateSessionArtifact',
118
- description: 'Delegate read, Q&A, or edits for an existing session artifact.',
197
+ description: 'ONE edit (or read) of an existing artifact for the current plan task. Prefer wholesale HTML rewrites. Do not call repeatedly for the same task or for mid-build quality warnings.',
119
198
  inputSchema: exports.updateSessionArtifactInputSchema,
120
199
  subAgent: {
121
200
  name: 'artifact-editor',
122
- description: 'Reads existing session artifacts, answers questions (summaries, excerpts, explanations), and applies hashline edits when asked to change a file. Never returns a full file body.',
201
+ description: 'Reads an existing session artifact and applies one edit (wholesale preferred for HTML). Stops after one successful apply or one failed repair.',
123
202
  systemPrompt: `You work with a single existing file under the active session. The parent passes parentContext and task (include the artifact path in task).
124
203
 
125
204
  Decide mode from the task:
126
- - **Read / Q&A** — explain, summarize, locate, or quote what is in the file. No applySessionArtifactDiff.
127
- - **Edit** — change the file via hashline SEARCH/REPLACE. Use applySessionArtifactDiff when done.
205
+ - **Read / Q&A** — explain or quote briefly. No applySessionArtifactDiff.
206
+ - **Edit** — change the file once, then stop.
128
207
 
129
- Always start by calling getSessionArtifactLatestContent with the path from the task.
208
+ **Speed contract (mandatory)**
209
+ 1. Call getSessionArtifactLatestContent once.
210
+ 2. For HTML edits that add sections, fix structure, or touch more than a tiny localized tweak: WHOLESALE rewrite — pass the COMPLETE corrected page as \`diff\` with NO <<<SEARCH markers. Preserve existing good sections; add/change only what the task asks.
211
+ 3. Hashline SEARCH/REPLACE only for a tiny single-block tweak (one color, one label). If unsure, wholesale.
212
+ 4. Call applySessionArtifactDiff once. On success, reply with ONLY the updated path — do not re-read, re-apply, or "improve further".
213
+ 5. If apply is rejected (stale tags / malformed hashline / new audit errors): re-read once, WHOLESALE-rewrite the complete page once (no <<<SEARCH), then stop even if still failing. Never loop. Never retry broken hashline.
214
+ 6. Do not chase contrast/heuristic polish, emoji, or fonts unless the task explicitly lists blocking error rule names — the server strips emoji and injects fonts.
130
215
 
131
216
  **Read / Q&A workflow**
132
- 1. Use lines[].tag only internally if you later edit; for answers, cite short excerpts (a few lines or a function/block), bullet summaries, or direct answers.
133
- 2. Do not return the full file, a near-complete copy, or a line-by-line dump. Truncate long sections with "…" and name paths/line tags only when helpful for a follow-up edit.
134
- 3. Reply to the parent with the answer, summary, or relevant code chunks only.
217
+ 1. Cite short excerpts or bullet summaries only. Never dump the full file.
218
+ 2. Reply to the parent with the answer only.
135
219
 
136
- **Edit workflow**
137
- 1. Use returned lines[].tag values for diff ranges.
138
- 2. Produce hashline SEARCH/REPLACE blocks that implement the instruction.
139
- 3. For .html edits: keep Pico-friendly structure (semantic tags, container main); preserve any existing Pico CDN <link> unless the task removes styling. Prefer editing <script>/<style> or body content over replacing the whole document.
140
- 4. Validate before applying:
141
- - For .html paths, call validateHtml with the expected updated content.
142
- - For .md paths, call validateMarkdown with the expected updated content and path.
143
- 5. Call applySessionArtifactDiff with path and diff.
144
- 6. Reply to the parent with ONLY the updated path from applySessionArtifactDiff (no file body).
220
+ **Edit quality (single write)**
221
+ - Keep the established design system (fonts, accent hex, chrome, pack, signature). Raise quality in that one write — distinctive fonts (never Inter), topic-fit accent, atmosphere matching the signature (glass sticky nav only when the brief calls for soft glass), Lucide SVG icons, real copy. Never collapse the page into a generic centered blur-orb template.
222
+ - Keep the page's existing base-framework tag. On Tailwind pages style via utilities; every text color readable on its background.
223
+ - An "Account skill guides" / "Session design system" message may follow apply it in the same write.
145
224
 
146
225
  ${hashline_diff_guide_1.HASHLINE_DIFF_GUIDE}
226
+
227
+ # Generation skill guides
228
+ When editing .html, keep changes aligned with these guides (designer + a11y + copywriting always apply):
229
+
230
+ ${skills_1.STATIC_SKILL_GUIDES}
147
231
  `,
148
- stopWhen: () => false,
232
+ stopWhen: shouldStopUpdateSubagent,
233
+ maxOutputTokens: 16000,
234
+ prepareStep: (0, skills_1.createSkillInjectingPrepareStep)(),
149
235
  tools: [
150
236
  exports.getSessionArtifactLatestContentTool,
151
237
  exports.applySessionArtifactDiffTool,
@@ -153,6 +239,30 @@ ${hashline_diff_guide_1.HASHLINE_DIFF_GUIDE}
153
239
  },
154
240
  },
155
241
  };
242
+ const TERMINAL_UPDATE_FAILURES = [
243
+ 'Edit rejected',
244
+ 'Quality audit failed',
245
+ 'hash mismatch',
246
+ 'out of range',
247
+ 'Malformed hashline',
248
+ 'Artifact not found',
249
+ 'does not exist yet',
250
+ 'Invalid diff',
251
+ 'Session ID is required',
252
+ 'File already exists',
253
+ 'File not found',
254
+ 'Type validation failed',
255
+ ];
256
+ /** Read + apply (+ one repair) only. Absolute cap stops providers that ignore the budget. */
257
+ function shouldStopUpdateSubagent({ steps }) {
258
+ if (steps.length >= 4)
259
+ return true;
260
+ const rejectedWrites = steps.filter((step) => {
261
+ const serialized = JSON.stringify(step !== null && step !== void 0 ? step : {});
262
+ return TERMINAL_UPDATE_FAILURES.some((marker) => serialized.includes(marker));
263
+ }).length;
264
+ return rejectedWrites >= 2;
265
+ }
156
266
  function getUpdateSessionArtifactsSubagent() {
157
267
  return exports.updateSessionArtifactsSubagentTool;
158
268
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-session-artifacts.tool.js","sourceRoot":"","sources":["../../../src/agents/shared/update-session-artifacts.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-session-artifacts.tool.js","sourceRoot":"","sources":["../../../src/agents/shared/update-session-artifacts.tool.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,8 @@ export declare const validateMarkdownInputSchema: z.ZodObject<{
9
9
  }, z.core.$strip>;
10
10
  export declare const validateHtmlTool: AgentTool;
11
11
  export declare const validateMarkdownTool: AgentTool;
12
+ export declare const auditHtmlQualityInputSchema: z.ZodObject<{
13
+ html: z.ZodString;
14
+ }, z.core.$strip>;
15
+ export declare const auditHtmlQualityTool: AgentTool;
12
16
  //# sourceMappingURL=validate-artifact-content.tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-artifact-content.tools.d.ts","sourceRoot":"","sources":["../../../src/agents/shared/validate-artifact-content.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,uBAAuB;;iBAElC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;iBAMtC,CAAA;AAwGF,eAAO,MAAM,gBAAgB,EAAE,SAe9B,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,SAgBlC,CAAA"}
1
+ {"version":3,"file":"validate-artifact-content.tools.d.ts","sourceRoot":"","sources":["../../../src/agents/shared/validate-artifact-content.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,uBAAuB;;iBAElC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;iBAMtC,CAAA;AAwGF,eAAO,MAAM,gBAAgB,EAAE,SAe9B,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,SAgBlC,CAAA;AAED,eAAO,MAAM,2BAA2B;;iBAEtC,CAAA;AAEF,eAAO,MAAM,oBAAoB,EAAE,SAqBlC,CAAA"}
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateMarkdownTool = exports.validateHtmlTool = exports.validateMarkdownInputSchema = exports.validateHtmlInputSchema = void 0;
3
+ exports.auditHtmlQualityTool = exports.auditHtmlQualityInputSchema = exports.validateMarkdownTool = exports.validateHtmlTool = exports.validateMarkdownInputSchema = exports.validateHtmlInputSchema = void 0;
4
4
  const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
5
  const zod_1 = require("zod");
6
+ const session_pages_1 = require("../../lib/session-pages");
6
7
  exports.validateHtmlInputSchema = zod_1.z.object({
7
8
  html: zod_1.z.string().min(1).describe('HTML to validate'),
8
9
  });
@@ -128,4 +129,26 @@ exports.validateMarkdownTool = {
128
129
  execute: (input) => basicMarkdownValidation(input.markdown, input.path),
129
130
  },
130
131
  };
132
+ exports.auditHtmlQualityInputSchema = zod_1.z.object({
133
+ html: zod_1.z.string().min(1).describe('Full HTML page or fragment to audit'),
134
+ });
135
+ exports.auditHtmlQualityTool = {
136
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
137
+ userConfigurable: true,
138
+ data: {
139
+ title: 'auditHtmlQuality',
140
+ needsApproval: false,
141
+ description: 'Audit generated HTML against page-quality rules (external images, placeholder copy, scheme-breaking colors, missing motion guards, unlabeled inputs). Run before publishing and fix findings.',
142
+ inputSchema: exports.auditHtmlQualityInputSchema,
143
+ outputSchema: zod_1.z.object({
144
+ clean: zod_1.z.boolean(),
145
+ findings: zod_1.z.array(zod_1.z.object({
146
+ rule: zod_1.z.string(),
147
+ severity: zod_1.z.enum(['error', 'warning']),
148
+ message: zod_1.z.string(),
149
+ })),
150
+ }),
151
+ execute: (input) => (0, session_pages_1.auditHtmlArtifact)(input.html),
152
+ },
153
+ };
131
154
  //# sourceMappingURL=validate-artifact-content.tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-artifact-content.tools.js","sourceRoot":"","sources":["../../../src/agents/shared/validate-artifact-content.tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-artifact-content.tools.js","sourceRoot":"","sources":["../../../src/agents/shared/validate-artifact-content.tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"designer.skill.d.ts","sourceRoot":"","sources":["../../../src/agents/skills/designer.skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,eAAO,MAAM,aAAa,EAAE,eAsI3B,CAAA"}
1
+ {"version":3,"file":"designer.skill.d.ts","sourceRoot":"","sources":["../../../src/agents/skills/designer.skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,eAAO,MAAM,aAAa,EAAE,eAiG3B,CAAA"}
@@ -3,137 +3,99 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.designerSkill = void 0;
4
4
  exports.designerSkill = {
5
5
  name: 'designer',
6
- description: 'Visual design system: Tailwind utilities, tokens, layout packs, typography, atmosphere, polish',
6
+ description: 'Advanced visual design: diverse layout packs, signature systems, typography, atmosphere, polish — never a single SaaS template',
7
7
  whenToUse: 'Every UI/HTML page. Always include for any .html artifact.',
8
8
  instructions: `## designer
9
9
 
10
- Goal: every page should feel like a shipped 2025 product site distinctive, spacious, intentional never a Bootstrap doc or generic AI template. Tailwind Play CDN is on (preflight): bare elements are unstyled. Utility-class every visible element. Use a small <style> only for fonts, keyframes, and atmosphere (mesh/grain).
10
+ Goal: every session should feel like a distinct 2025–2026 product — rich, modern, and different from the last one. Tailwind Play CDN is on (preflight): utility-class every visible element. Use a small <style> only for fonts, keyframes, and atmosphere (mesh/grain/noise).
11
+
12
+ ### Diversity mandate (non-negotiable)
13
+ Do NOT invent from a mental default of "sticky glass nav + centered headline + blur orb + 3 feature cards". That skeleton is BANNED as a default.
14
+ 1. Read the brief's **layout pack** + **signature** first.
15
+ 2. Compose the first viewport to match THAT pack — invent structure; do not paste a generic template.
16
+ 3. Across sessions, vary composition deliberately. Same accent with the same centered blob hero = fail.
17
+ 4. Within a session, keep ONE design system (tokens, chrome, type) — diversity is across products, consistency is within a product.
11
18
 
12
19
  ### Design brief is law
13
- Use the brief's accent as LITERAL hex utilities (bg-[#0EA5E9] hover:bg-[#0284C7]) — same hex everywhere. One neutral scale (slate OR zinc OR stone). Never indigo/violet defaults unless the brief names them. Never Inter. Never bg-[var(--x)] class names (undefined vars fail the gate).
20
+ Use the brief's accent as LITERAL hex utilities (bg-[#0EA5E9] hover:bg-[#0284C7]) — same hex everywhere. One neutral scale (slate OR zinc OR stone OR neutral). Never indigo/violet defaults unless the brief names them. Never Inter. Never bg-[var(--x)] class names (undefined vars fail the gate).
21
+ Honor: **radius** (sharp | soft | pill), **density** (airy | comfortable | dense), **signature**, **atmosphere**, **anti-cliché**.
14
22
 
15
23
  ### Accent contrast (buttons & labels)
16
24
  Bright accents (#1DB954, lime, cyan-400, etc.) fail WCAG with white text and as body/eyebrow text on white. Prefer one of:
17
25
  - CTA: dark text on bright fill — e.g. \`bg-[#1DB954] text-slate-950\` (not text-white)
18
- - Or darken the fill for white text — e.g. \`bg-[#15803d] text-white\` (keep a brighter hover only if still AA)
19
- - Accent-as-text (eyebrows, links): use a darker shade of the brief accent (\`text-[#15803d]\`), not the bright fill hex on white
26
+ - Or darken the fill for white text — e.g. \`bg-[#15803d] text-white\`
27
+ - Accent-as-text: darker shade of the brief accent, not the bright fill hex on white
20
28
  Never waste turns "fixing contrast" by nudging slate body text — fix the accent/button pairing once.
21
29
 
22
- ### Brand-first first viewport
23
- ONE composition: brand/product name as a hero-level signal, one headline, one supporting sentence, one CTA pair, one dominant visual plane (gradient mesh, abstract SVG, or atmospheric wash). No KPI strips, promo chips, address blocks, or card grids in the first viewport.
24
- - Launch pages: full-bleed hero — section background edge-to-edge; max-w column INSIDE the section. Never put the hero inside a rounded card.
25
- - Brand must still read if the nav disappeared.
26
- - At most one quiet eyebrow line no floating stickers on hero media.
30
+ ### Layout packs — build the composition the pack implies
31
+ Pick (or follow) exactly one. Section rhythm and chrome must match the pack, not a generic launch page.
32
+
33
+ - **launch** Marketing narrative. Full-bleed hero edge-to-edge; brand-first; then 2–3 sections with alternating alignment (NOT everything centered); social proof; pricing or final CTA. Still invent a distinctive hero (split, offset type, framed UI mock) — not the default centered blob.
34
+ - **split-hero** First viewport is 50/50 (or 40/60) text + framed product UI / abstract SVG. Nav can be minimal. No centered single-column hero.
35
+ - **product** — App/dashboard density: glass or solid chrome header; KPI/toolbar row; card grid or sidebar+main; tables in cards. First viewport is the workspace, not a marketing hero.
36
+ - **workspace** — Persistent sidebar + main canvas from the first paint. Dense controls, quiet chrome. Marketing sections are out of place.
37
+ - **editorial** / **magazine** — Strong type hierarchy, asymmetric columns, pull quotes, accent border-l callouts, generous measure (max-w-2xl for body). Hero may be typographic only — huge display, little ornament.
38
+ - **bento** — Uneven modular grid (varied col/row spans). Modules have different jobs/sizes — never three equal cards in a row as the hero.
39
+ - **dark-terminal** — Near-black ground, mono or semi-mono accents, tight tracking, hard borders, minimal blur/glass. Green/amber/cyan terminal accents when topic-fit.
40
+ - **brutalist** — Hard edges (radius sharp), high contrast, visible structure, little or no blur/glass/orb. Typography does the work.
41
+ - **story** — Full-bleed stacked chapters, scroll narrative, minimal persistent nav. Each section is one beat; motion is scroll-tied (respect prefers-reduced-motion).
42
+
43
+ ### Signature system (required in brief — execute literally)
44
+ Name and ship ONE of each:
45
+ - **Signature layout**: asymmetric | split | stacked | bento | magazine | terminal-rail | sidebar-first
46
+ - **Signature surface**: paper grain | hard grid | ink wash | soft glass | flat ink | mesh drift | noise film — pick ONE primary; do not stack all
47
+ - **Signature motion** (2–3 max total on the page): hero entrance | card lift | scroll reveal | type stagger | mesh drift — behind prefers-reduced-motion; never decorative noise
48
+
49
+ ### Radius & density
50
+ - **sharp**: rounded-none / rounded-sm; hard separators
51
+ - **soft**: rounded-xl / rounded-2xl (default only when brief says soft)
52
+ - **pill**: rounded-full on controls and chips; keep cards softer or sharper per brief
53
+ - **airy**: py-24+, sparse; **comfortable**: py-16/20; **dense**: py-8–12, tighter gaps, compact type
27
54
 
28
- ### Atmosphere (required — flat white pages fail the bar)
29
- Give the page depth without clutter. Pick 1–2 of:
30
- - Soft accent-tint wash: bg-gradient-to-b from-[#ACCENT]/15 via-transparent to-transparent on the hero
31
- - Mesh blob: absolutely positioned blurred circles (blur-3xl opacity-30) behind hero content, pointer-events-none
32
- - Subtle grain: CSS repeating-radial-gradient noise at 3–5% opacity on a ::before (optional)
33
- - Glass chrome: sticky nav with bg-white/70 dark:bg-slate-950/70 backdrop-blur-xl border-b border-*/10
34
- Never neon saturated walls. Atmosphere supports content; it does not compete with it.
55
+ ### Brand-first first viewport
56
+ ONE composition: brand/product name as a hero-level signal (unless pack is product/workspace — then brand lives in chrome), one headline, one supporting sentence, one CTA pair (marketing packs), one dominant visual plane matching the signature surface.
57
+ - Launch/story/split-hero: full-bleed section background; max-w column INSIDE the section. Never put the hero inside a rounded card.
58
+ - Brand must still read if the nav disappeared (marketing packs).
59
+ - At most one quiet eyebrow no floating stickers, KPI strips, or promo chips on hero media.
60
+ - Product/workspace packs: first viewport IS the app chrome + primary content — skip marketing hero rules.
61
+
62
+ ### Atmosphere (required — flat white/black slabs fail)
63
+ Depth without clutter. Follow the brief's signature surface. Examples (pick what the brief named):
64
+ - Soft accent-tint wash on the hero
65
+ - Mesh blob (blur-3xl, low opacity) — ONLY when signature allows soft glass/mesh; banned for brutalist/terminal
66
+ - Subtle grain / noise film at 3–5% opacity
67
+ - Hard grid overlay (brutalist / terminal)
68
+ - Glass chrome when signature is soft glass — not mandatory for every pack
69
+ Never neon saturated walls. Atmosphere supports content.
35
70
 
36
71
  ### Typography
37
- Load the brief's Google Fonts <link> + wire font-family on body in <style>. Pairings: Manrope+Plus Jakarta Sans (product), Sora+Space Grotesk (tech), Fraunces+Newsreader (editorial), Outfit+DM Sans (friendly). Max two families.
38
- Scale: hero text-5xl sm:text-6xl lg:text-7xl font-extrabold tracking-tight section h2 text-3xl sm:text-4xl font-bold tracking-tight body text-base/lg text-slate-600. tabular-nums on metrics. Secondary text text-slate-500.
39
-
40
- ### Canonical patterns adapt hex/fonts/copy; do not invent a weaker layout from scratch
41
-
42
- Sticky glass nav:
43
- \`\`\`html
44
- <header class="sticky top-0 z-50 border-b border-slate-200/70 bg-white/70 backdrop-blur-xl">
45
- <div class="mx-auto flex h-16 max-w-6xl items-center justify-between px-4 sm:px-6">
46
- <a href="index.html" class="flex items-center gap-2.5 text-lg font-extrabold tracking-tight text-slate-900">
47
- <span class="inline-flex h-8 w-8 items-center justify-center rounded-lg bg-[#0EA5E9] text-white"><!-- lucide svg --></span>
48
- Brand
49
- </a>
50
- <nav class="hidden items-center gap-8 text-sm font-medium text-slate-600 md:flex">
51
- <a href="features.html" class="transition-colors hover:text-[#0EA5E9]">Features</a>
52
- <a href="pricing.html" class="transition-colors hover:text-[#0EA5E9]">Pricing</a>
53
- </nav>
54
- <div class="flex items-center gap-3">
55
- <button type="button" class="md:hidden inline-flex h-10 w-10 items-center justify-center rounded-lg text-slate-700" aria-label="Open menu"><!-- menu svg --></button>
56
- <a href="#cta" class="hidden sm:inline-flex items-center rounded-lg bg-[#0EA5E9] px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:bg-[#0284C7] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0EA5E9] focus-visible:ring-offset-2">Start free</a>
57
- </div>
58
- </div>
59
- </header>
60
- \`\`\`
61
- Include a mobile drawer/menu script for the md:hidden button — a sticky nav that does nothing on mobile looks unfinished.
62
-
63
- Launch hero:
64
- \`\`\`html
65
- <section class="relative overflow-hidden">
66
- <div class="pointer-events-none absolute -top-24 left-1/2 h-72 w-72 -translate-x-1/2 rounded-full bg-[#0EA5E9]/25 blur-3xl"></div>
67
- <div class="relative mx-auto max-w-6xl px-4 py-24 text-center sm:px-6 sm:py-32">
68
- <p class="text-sm font-semibold tracking-wide text-[#0EA5E9]">For ops teams who live in data</p>
69
- <h1 class="mt-4 text-5xl font-extrabold tracking-tight text-slate-900 sm:text-6xl lg:text-7xl">Ship clarity,<br><span class="text-[#0EA5E9]">not dashboards</span></h1>
70
- <p class="mx-auto mt-6 max-w-2xl text-lg text-slate-600">One sentence of concrete value for a named audience — not "welcome to our platform".</p>
71
- <div class="mt-10 flex flex-wrap items-center justify-center gap-4">
72
- <a href="#cta" class="inline-flex items-center rounded-lg bg-[#0EA5E9] px-6 py-3 text-sm font-semibold text-white shadow-lg shadow-[#0EA5E9]/25 transition hover:bg-[#0284C7]">Start free trial</a>
73
- <a href="features.html" class="inline-flex items-center rounded-lg border border-slate-200 bg-white px-6 py-3 text-sm font-semibold text-slate-800 transition hover:border-slate-300 hover:bg-slate-50">See how it works</a>
74
- </div>
75
- </div>
76
- </section>
77
- \`\`\`
78
-
79
- Feature row (alternate direction with lg:flex-row-reverse on odd sections):
80
- \`\`\`html
81
- <section class="border-t border-slate-100 py-20 sm:py-28">
82
- <div class="mx-auto grid max-w-6xl items-center gap-12 px-4 sm:px-6 lg:grid-cols-2">
83
- <div>
84
- <h2 class="text-3xl font-bold tracking-tight text-slate-900 sm:text-4xl">Outcome-led headline</h2>
85
- <p class="mt-4 text-lg text-slate-600">Benefit first, mechanism second. Two sentences max.</p>
86
- <ul class="mt-8 space-y-3 text-slate-700">
87
- <li class="flex gap-3"><span class="mt-0.5 text-[#0EA5E9]"><!-- check svg --></span>Concrete capability</li>
88
- </ul>
89
- </div>
90
- <div class="relative aspect-[4/3] overflow-hidden rounded-2xl border border-slate-200 bg-gradient-to-br from-[#0EA5E9]/10 to-slate-50 shadow-sm">
91
- <!-- abstract SVG illustration or UI mock framed here — never a hotlinked photo -->
92
- </div>
93
- </div>
94
- </section>
95
- \`\`\`
96
-
97
- KPI (product pack only — never in launch hero):
98
- \`\`\`html
99
- <div class="rounded-2xl border border-slate-200/80 bg-white p-5 shadow-sm transition hover:-translate-y-0.5 hover:shadow-lg">
100
- <div class="flex items-center justify-between">
101
- <span class="text-sm font-medium text-slate-500">Weekly active</span>
102
- <span class="inline-flex h-9 w-9 items-center justify-center rounded-xl bg-[#0EA5E9]/10 text-[#0EA5E9]"><!-- svg --></span>
103
- </div>
104
- <p class="mt-3 text-3xl font-bold tracking-tight tabular-nums text-slate-900">12,480</p>
105
- <p class="mt-1 text-sm font-medium text-emerald-600">↑ 12.4% vs last week</p>
106
- </div>
107
- \`\`\`
108
-
109
- Pricing highlight:
110
- \`\`\`html
111
- <div class="relative rounded-2xl border-2 border-[#0EA5E9] bg-white p-8 shadow-xl shadow-[#0EA5E9]/10">
112
- <span class="absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-[#0EA5E9] px-3 py-1 text-xs font-semibold text-white">Most popular</span>
113
- <h3 class="text-lg font-semibold text-slate-900">Growth</h3>
114
- <p class="mt-3"><span class="text-4xl font-extrabold tracking-tight tabular-nums">$149</span><span class="text-slate-500">/mo</span></p>
115
- <a href="#cta" class="mt-8 block rounded-lg bg-[#0EA5E9] py-2.5 text-center text-sm font-semibold text-white transition hover:bg-[#0284C7]">Start free trial</a>
116
- </div>
117
- \`\`\`
118
-
119
- ### Layout packs
120
- - **launch**: hero → 2–3 alternating features → social proof (logos or quote) → pricing or final CTA band. Section rhythm py-20 sm:py-28. Alternate alignment; not everything centered.
121
- - **product**: dense glass header; KPI row; card grid or sidebar+main; tables in cards with toolbar; space-y-6.
122
- - **editorial**: max-w-2xl measure, strong type, sticky TOC (lg+), accent border-l-4 callouts.
72
+ Load the brief's Google Fonts <link> + wire font-family on body in <style>. Max two families. Pair by intent (examples invent others when brief names them):
73
+ - Product: Manrope + Plus Jakarta Sans · Instrument Sans + Source Sans 3
74
+ - Tech: Sora + Space Grotesk · IBM Plex Sans + IBM Plex Mono
75
+ - Editorial: Fraunces + Newsreader · Libre Baskerville + Source Serif 4
76
+ - Friendly: Outfit + DM Sans · Nunito + Figtree
77
+ - Terminal: JetBrains Mono + IBM Plex Sans · Geist Mono + Satoshi-like via Space Grotesk
78
+ Never Inter. Scale: marketing heroes text-5xl→lg:text-7xl font-extrabold tracking-tight; editorial may go larger with serif; product/workspace use tighter display (text-2xl/3xl). Body text-base/lg; secondary text-slate-500 (or zinc/stone). tabular-nums on metrics.
79
+
80
+ ### Structural recipes (describe do NOT copy as fixed HTML)
81
+ Invent markup from the pack. These are jobs, not templates:
82
+ - **Nav**: sticky or static; glass OR solid OR invisible until scroll — match signature. Mobile drawer required when links collapse. Primary actions ≥44px.
83
+ - **Hero**: match pack (split / typographic / workspace shell / bento opener / story chapter 1). Dominant visual = abstract SVG, UI mock, grid, or type — never hotlinked photos.
84
+ - **Features**: alternate alignment, bento modules, or editorial callouts — not three identical icon cards unless the brief asks.
85
+ - **KPI / pricing**: product pack or pricing section only — never soup the marketing first viewport with KPIs.
86
+ - **Footer**: real product name + working relative links.
123
87
 
124
88
  ### Icons
125
- Inline Lucide/Heroicons SVG only (stroke="currentColor" stroke-width="2" class="h-5 w-5"). Never emoji. Feature icons sit in rounded-xl accent/10 badges.
89
+ Inline Lucide/Heroicons SVG only (stroke="currentColor" stroke-width="2" class="h-5 w-5"). Never emoji. Feature icons in rounded badges only when radius/signature allow.
126
90
 
127
- ### Interactions & polish (include in the same write — do not iterate)
128
- - Mobile nav works; primary actions 44px touch targets
129
- - Hover + focus-visible:ring-2 ring-offset-2 on every control; nav links transition-colors, no underline
130
- - 2–3 purposeful motions max (hero fade-in, card hover lift, scroll reveal) behind prefers-reduced-motion
131
- - body { background } set to match scheme; gutters never flash white on dark pages
132
- - Footer with real product name + working relative links
133
- - One <h1>; every section has a clear job; no dead href="#"; no lorem; no "Welcome to"
134
- - Mentally check 360px and 1280px — grids collapse, type stays readable
91
+ ### Interactions & polish (same write — do not iterate)
92
+ - Hover + focus-visible:ring-2 ring-offset-2 on controls; nav links transition-colors
93
+ - 2–3 purposeful motions max, matching signature motion
94
+ - body { background } matches scheme; gutters never flash wrong on dark pages
95
+ - One <h1>; every section one job; no dead href="#"; no lorem; no "Welcome to"
96
+ - Mentally check 360px and 1280px
135
97
 
136
98
  ### Automatic fails
137
- Indigo/violet-on-white gradient cliché · Inter · emoji icons · hero-in-a-card · first-viewport KPI soup · flat unstyled sections · external raster images · template adjectives (revolutionary/seamless/cutting-edge/unleash/empower)`,
99
+ Indigo/violet-on-white gradient cliché · Inter · emoji icons · hero-in-a-card · first-viewport KPI soup on marketing packs · flat unstyled sections · external raster images · template adjectives (revolutionary/seamless/cutting-edge/unleash/empower) · default centered blur-orb hero when the brief asked for another pack/signature · three equal feature cards as the whole personality of the page`,
138
100
  };
139
101
  //# sourceMappingURL=designer.skill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"designer.skill.js","sourceRoot":"","sources":["../../../src/agents/skills/designer.skill.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAoB;IAC5C,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,gGAAgG;IAC7G,SAAS,EAAE,4DAA4D;IACvE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sOAiIsN;CACrO,CAAA"}
1
+ {"version":3,"file":"designer.skill.js","sourceRoot":"","sources":["../../../src/agents/skills/designer.skill.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAoB;IAC5C,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,gIAAgI;IAClI,SAAS,EAAE,4DAA4D;IACvE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2YA2F2X;CAC1Y,CAAA"}