@multiplayer-app/sandbox 0.0.30 → 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 (201) 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/notebooks/notebook-assistant.d.ts +12 -0
  96. package/dist/lib/notebooks/notebook-assistant.d.ts.map +1 -1
  97. package/dist/lib/notebooks/notebook-assistant.js +35 -8
  98. package/dist/lib/notebooks/notebook-assistant.js.map +1 -1
  99. package/dist/lib/object-storage/index.d.ts +3 -0
  100. package/dist/lib/object-storage/index.d.ts.map +1 -0
  101. package/dist/lib/object-storage/index.js +19 -0
  102. package/dist/lib/object-storage/index.js.map +1 -0
  103. package/dist/lib/object-storage/keys.d.ts +10 -0
  104. package/dist/lib/object-storage/keys.d.ts.map +1 -0
  105. package/dist/lib/object-storage/keys.js +51 -0
  106. package/dist/lib/object-storage/keys.js.map +1 -0
  107. package/dist/lib/object-storage/s3-object-store.d.ts +14 -0
  108. package/dist/lib/object-storage/s3-object-store.d.ts.map +1 -0
  109. package/dist/lib/object-storage/s3-object-store.js +64 -0
  110. package/dist/lib/object-storage/s3-object-store.js.map +1 -0
  111. package/dist/lib/session-pages/artifact-quality-audit.d.ts +16 -0
  112. package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -0
  113. package/dist/lib/session-pages/artifact-quality-audit.js +293 -0
  114. package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -0
  115. package/dist/lib/session-pages/artifact-storage.d.ts +3 -0
  116. package/dist/lib/session-pages/artifact-storage.d.ts.map +1 -1
  117. package/dist/lib/session-pages/artifact-storage.js +94 -85
  118. package/dist/lib/session-pages/artifact-storage.js.map +1 -1
  119. package/dist/lib/session-pages/audit-session-html.d.ts +23 -0
  120. package/dist/lib/session-pages/audit-session-html.d.ts.map +1 -0
  121. package/dist/lib/session-pages/audit-session-html.js +82 -0
  122. package/dist/lib/session-pages/audit-session-html.js.map +1 -0
  123. package/dist/lib/session-pages/contrast-check.d.ts +25 -0
  124. package/dist/lib/session-pages/contrast-check.d.ts.map +1 -0
  125. package/dist/lib/session-pages/contrast-check.js +290 -0
  126. package/dist/lib/session-pages/contrast-check.js.map +1 -0
  127. package/dist/lib/session-pages/deferred-quality-rules.d.ts +7 -0
  128. package/dist/lib/session-pages/deferred-quality-rules.d.ts.map +1 -0
  129. package/dist/lib/session-pages/deferred-quality-rules.js +25 -0
  130. package/dist/lib/session-pages/deferred-quality-rules.js.map +1 -0
  131. package/dist/lib/session-pages/delete-session-artifact.d.ts.map +1 -1
  132. package/dist/lib/session-pages/delete-session-artifact.js +12 -41
  133. package/dist/lib/session-pages/delete-session-artifact.js.map +1 -1
  134. package/dist/lib/session-pages/delete-session-artifacts.d.ts +0 -6
  135. package/dist/lib/session-pages/delete-session-artifacts.d.ts.map +1 -1
  136. package/dist/lib/session-pages/delete-session-artifacts.js +51 -15
  137. package/dist/lib/session-pages/delete-session-artifacts.js.map +1 -1
  138. package/dist/lib/session-pages/list-session-artifacts.d.ts.map +1 -1
  139. package/dist/lib/session-pages/list-session-artifacts.js +48 -48
  140. package/dist/lib/session-pages/list-session-artifacts.js.map +1 -1
  141. package/dist/lib/session-pages/read-session-artifacts.d.ts.map +1 -1
  142. package/dist/lib/session-pages/read-session-artifacts.js +4 -26
  143. package/dist/lib/session-pages/read-session-artifacts.js.map +1 -1
  144. package/dist/lib/session-pages/resolve-session-account-id.d.ts +3 -0
  145. package/dist/lib/session-pages/resolve-session-account-id.d.ts.map +1 -0
  146. package/dist/lib/session-pages/resolve-session-account-id.js +31 -0
  147. package/dist/lib/session-pages/resolve-session-account-id.js.map +1 -0
  148. package/dist/lib/session-pages/write-session-artifacts.d.ts +0 -2
  149. package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
  150. package/dist/lib/session-pages/write-session-artifacts.js +8 -0
  151. package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
  152. package/dist/lib/session-plans/build-plan.d.ts +64 -0
  153. package/dist/lib/session-plans/build-plan.d.ts.map +1 -0
  154. package/dist/lib/session-plans/build-plan.js +134 -0
  155. package/dist/lib/session-plans/build-plan.js.map +1 -0
  156. package/dist/lib/yjs-pending/flush-lock.d.ts +6 -0
  157. package/dist/lib/yjs-pending/flush-lock.d.ts.map +1 -0
  158. package/dist/lib/yjs-pending/flush-lock.js +43 -0
  159. package/dist/lib/yjs-pending/flush-lock.js.map +1 -0
  160. package/dist/lib/yjs-pending/flush-worker.d.ts +5 -0
  161. package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -0
  162. package/dist/lib/yjs-pending/flush-worker.js +75 -0
  163. package/dist/lib/yjs-pending/flush-worker.js.map +1 -0
  164. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts +22 -0
  165. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts.map +1 -0
  166. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js +3 -0
  167. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js.map +1 -0
  168. package/dist/lib/yjs-pending/yjs-persistence.d.ts +23 -0
  169. package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -0
  170. package/dist/lib/yjs-pending/yjs-persistence.js +222 -0
  171. package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -0
  172. package/dist/realtime/reset-session-artifact-y-docs.d.ts.map +1 -1
  173. package/dist/realtime/reset-session-artifact-y-docs.js +1 -6
  174. package/dist/realtime/reset-session-artifact-y-docs.js.map +1 -1
  175. package/dist/realtime/session-artifact-y-socket-io.d.ts +0 -5
  176. package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
  177. package/dist/realtime/session-artifact-y-socket-io.js +5 -69
  178. package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
  179. package/dist/realtime/session-artifact-yjs-store.d.ts +3 -35
  180. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  181. package/dist/realtime/session-artifact-yjs-store.js +75 -235
  182. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  183. package/dist/routes/chats/multiUserMessages.d.ts.map +1 -1
  184. package/dist/routes/chats/multiUserMessages.js +2 -1
  185. package/dist/routes/chats/multiUserMessages.js.map +1 -1
  186. package/dist/routes/chats/stream.d.ts.map +1 -1
  187. package/dist/routes/chats/stream.js +2 -1
  188. package/dist/routes/chats/stream.js.map +1 -1
  189. package/dist/routes/notebooks/assistant-generate.d.ts.map +1 -1
  190. package/dist/routes/notebooks/assistant-generate.js +3 -1
  191. package/dist/routes/notebooks/assistant-generate.js.map +1 -1
  192. package/dist/routes/sessions.d.ts.map +1 -1
  193. package/dist/routes/sessions.js +26 -6
  194. package/dist/routes/sessions.js.map +1 -1
  195. package/dist/routes/skills.d.ts +2 -0
  196. package/dist/routes/skills.d.ts.map +1 -0
  197. package/dist/routes/skills.js +140 -0
  198. package/dist/routes/skills.js.map +1 -0
  199. package/dist/routes/tenants/credentials.js +3 -3
  200. package/dist/routes/tenants/credentials.js.map +1 -1
  201. package/package.json +4 -4
@@ -1,2 +1,4 @@
1
- export { createContentGeneratorAgent, createContentGeneratorAgent as createHtmlGeneratorAgent, } from './content-generator.agent';
1
+ import type { AgentConfig } from '@multiplayer-app/ai-agent-types';
2
+ import type { BuilderApiAgentDeps } from '../builder-api-config';
3
+ export declare function createHtmlGeneratorAgent(deps: BuilderApiAgentDeps): AgentConfig;
2
4
  //# sourceMappingURL=html-generator.agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-generator.agent.d.ts","sourceRoot":"","sources":["../../src/agents/html-generator.agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,IAAI,wBAAwB,GACxD,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"html-generator.agent.d.ts","sourceRoot":"","sources":["../../src/agents/html-generator.agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AA0DhE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAwC/E"}
@@ -1,7 +1,93 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createHtmlGeneratorAgent = exports.createContentGeneratorAgent = void 0;
4
- var content_generator_agent_1 = require("./content-generator.agent");
5
- Object.defineProperty(exports, "createContentGeneratorAgent", { enumerable: true, get: function () { return content_generator_agent_1.createContentGeneratorAgent; } });
6
- Object.defineProperty(exports, "createHtmlGeneratorAgent", { enumerable: true, get: function () { return content_generator_agent_1.createContentGeneratorAgent; } });
3
+ exports.createHtmlGeneratorAgent = createHtmlGeneratorAgent;
4
+ const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
+ const zod_1 = require("zod");
6
+ const publish_session_artifacts_tool_1 = require("./shared/publish-session-artifacts.tool");
7
+ const validateHtmlInputSchema = zod_1.z.object({
8
+ html: zod_1.z.string().min(1).describe('HTML to validate'),
9
+ });
10
+ function basicHtmlValidation(html) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ if (!html.trim()) {
14
+ errors.push('HTML is empty');
15
+ }
16
+ const openTags = [...html.matchAll(/<([a-z][a-z0-9]*)\b[^>]*(?<!\/)>/gi)];
17
+ const closeTags = [...html.matchAll(/<\/([a-z][a-z0-9]*)\s*>/gi)];
18
+ const stack = [];
19
+ for (const match of openTags) {
20
+ const tag = match[1].toLowerCase();
21
+ if (![
22
+ 'area',
23
+ 'base',
24
+ 'br',
25
+ 'col',
26
+ 'embed',
27
+ 'hr',
28
+ 'img',
29
+ 'input',
30
+ 'link',
31
+ 'meta',
32
+ 'param',
33
+ 'source',
34
+ 'track',
35
+ 'wbr',
36
+ ].includes(tag)) {
37
+ stack.push(tag);
38
+ }
39
+ }
40
+ for (const match of closeTags) {
41
+ const tag = match[1].toLowerCase();
42
+ const last = stack.pop();
43
+ if (last !== tag) {
44
+ warnings.push(`Possible mismatched closing tag </${tag}>`);
45
+ }
46
+ }
47
+ if (stack.length > 0) {
48
+ warnings.push(`Unclosed elements: ${stack.join(', ')}`);
49
+ }
50
+ return { valid: errors.length === 0, warnings, errors };
51
+ }
52
+ function createHtmlGeneratorAgent(deps) {
53
+ return {
54
+ name: 'html-generator',
55
+ description: 'Builds session previews: HTML dashboards, CSS, JavaScript, and data files',
56
+ defaultModel: deps.defaultModel,
57
+ systemPrompt: `You build data dashboards and previews for user data. Every response that produces or updates UI MUST end with publishSessionArtifacts — nothing is saved until you publish.
58
+
59
+ Workflow:
60
+ 1. Generate artifacts — typically index.html, styles.css, script.js, and optional JSON under data/.
61
+ 2. Keep paths relative (no leading slash). Link assets from HTML with relative URLs (./styles.css, ./script.js, ./data/metrics.json).
62
+ 3. Put layout/styling in styles.css and data fetching or rendering in script.js.
63
+ 4. For dashboards: use a shell with sidebar + main, KPI cards (.metrics article), and tables (.data-table).
64
+ 5. Call validateHtml on index.html when markup is non-trivial.
65
+ 6. Always call publishSessionArtifacts in the same turn. Include only files you created or modified in this turn — omit unchanged files; they remain on disk.
66
+ 7. Tell the user the previewUrl from the publish result so they can open App Preview.
67
+
68
+ Base styles are merged into styles.css automatically unless includeBaseStyles is false.`,
69
+ stopWhen: () => false,
70
+ tools: [
71
+ { type: ai_agent_types_1.AgentToolType.WEB_SEARCH, userConfigurable: true },
72
+ { type: ai_agent_types_1.AgentToolType.REQUEST_CLARIFICATION, userConfigurable: true },
73
+ {
74
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
75
+ userConfigurable: true,
76
+ data: {
77
+ title: 'validateHtml',
78
+ needsApproval: false,
79
+ description: 'Run basic structural checks on HTML before publishing',
80
+ inputSchema: validateHtmlInputSchema,
81
+ outputSchema: zod_1.z.object({
82
+ valid: zod_1.z.boolean(),
83
+ warnings: zod_1.z.array(zod_1.z.string()),
84
+ errors: zod_1.z.array(zod_1.z.string()),
85
+ }),
86
+ execute: (input) => basicHtmlValidation(input.html),
87
+ },
88
+ },
89
+ (0, publish_session_artifacts_tool_1.createPublishSessionArtifactsTool)({ needsApproval: false, validateIndexHtml: true }),
90
+ ],
91
+ };
92
+ }
7
93
  //# sourceMappingURL=html-generator.agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-generator.agent.js","sourceRoot":"","sources":["../../src/agents/html-generator.agent.ts"],"names":[],"mappings":";;;AAAA,qEAGkC;AAFhC,sIAAA,2BAA2B,OAAA;AAC3B,mIAAA,2BAA2B,OAA4B"}
1
+ {"version":3,"file":"html-generator.agent.js","sourceRoot":"","sources":["../../src/agents/html-generator.agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-generator.agent.d.ts","sourceRoot":"","sources":["../../src/agents/markdown-generator.agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAgEhE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAiDnF"}
1
+ {"version":3,"file":"markdown-generator.agent.d.ts","sourceRoot":"","sources":["../../src/agents/markdown-generator.agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AA8DhE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CA8CnF"}
@@ -3,9 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMarkdownGeneratorAgent = createMarkdownGeneratorAgent;
4
4
  const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
5
  const zod_1 = require("zod");
6
- const list_session_artifact_paths_tool_1 = require("./shared/list-session-artifact-paths.tool");
7
6
  const publish_session_artifacts_tool_1 = require("./shared/publish-session-artifacts.tool");
8
- const update_session_artifacts_tool_1 = require("./shared/update-session-artifacts.tool");
9
7
  const validateMarkdownInputSchema = zod_1.z.object({
10
8
  markdown: zod_1.z.string().min(1).describe('Markdown source to validate'),
11
9
  path: zod_1.z
@@ -59,17 +57,16 @@ function createMarkdownGeneratorAgent(deps) {
59
57
  name: 'markdown-generator',
60
58
  description: 'Writes and updates Markdown documentation in the session artifact store',
61
59
  defaultModel: deps.defaultModel,
62
- systemPrompt: `You create and refine Markdown (.md) documents for the active session. New files use publishSessionArtifacts; changes to existing files use updateSessionArtifact.
60
+ systemPrompt: `You create and refine Markdown (.md) documents for the active session. Every response that produces or updates docs MUST end with publishSessionArtifacts nothing is saved until you publish.
63
61
 
64
62
  Workflow:
65
63
  1. Clarify purpose (README, design doc, runbook, release notes, API summary, etc.).
66
64
  2. Write valid GitHub-Flavored Markdown (GFM): headings, lists, tables, fenced code blocks with language tags, links, blockquotes.
67
65
  3. Use session-relative paths without a leading slash, e.g. README.md, docs/architecture.md, notes/todo.md.
68
66
  4. Call validateMarkdown on substantial content before publishing.
69
- 5. New paths: call publishSessionArtifacts with sessionId and only files that do not exist yet.
70
- 6. Existing paths: call updateSessionArtifact with sessionId, path, and a clear instruction.
71
- 7. Set previewPath to your primary doc (e.g. README.md) when publishing markdown-only artifacts.
72
- 8. Summarize what was published or which path was updated (Code tab / file explorer).
67
+ 5. Call publishSessionArtifacts in the same turn. Include only files you created or modified — omit unchanged files; they remain on disk.
68
+ 6. Set previewPath to your primary doc (e.g. README.md) when publishing markdown-only artifacts.
69
+ 7. Summarize what was published and where the user can read it (Code tab / file explorer).
73
70
 
74
71
  Style:
75
72
  - Prefer one H1 per document; use ## / ### for structure.
@@ -97,9 +94,7 @@ Style:
97
94
  execute: (input) => basicMarkdownValidation(input.markdown, input.path),
98
95
  },
99
96
  },
100
- (0, list_session_artifact_paths_tool_1.getListSessionArtifactPathsTool)(),
101
- publish_session_artifacts_tool_1.publishSessionArtifactsSubagentTool,
102
- update_session_artifacts_tool_1.updateSessionArtifactsSubagentTool,
97
+ (0, publish_session_artifacts_tool_1.createPublishSessionArtifactsTool)({ needsApproval: false, validateIndexHtml: false }),
103
98
  ],
104
99
  };
105
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-generator.agent.js","sourceRoot":"","sources":["../../src/agents/markdown-generator.agent.ts"],"names":[],"mappings":";;AAmEA,oEAiDC;AAnHD,oEAA+D;AAC/D,6BAAuB;AAEvB,gGAA2F;AAC3F,4FAA6F;AAC7F,0FAA2F;AAE3F,MAAM,2BAA2B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACnE,IAAI,EAAE,OAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;CAC3E,CAAC,CAAA;AAEF,SAAS,uBAAuB,CAC9B,QAAgB,EAChB,IAAa;IAEb,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,OAAO,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,IAAI,OAAO;YAAE,SAAQ;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC/C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC/C,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,KAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACjF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;IACjF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AACzD,CAAC;AAED,SAAgB,4BAA4B,CAAC,IAAyB;IACpE,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,yEAAyE;QACtF,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,YAAY,EAAE;;;;;;;;;;;;;;;;;0GAiBwF;QACtG,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,8BAAa,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE;YAC1D,EAAE,IAAI,EAAE,8BAAa,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,IAAI,EAAE;YACrE;gBACE,IAAI,EAAE,8BAAa,CAAC,cAAc;gBAClC,gBAAgB,EAAE,IAAI;gBACtB,IAAI,EAAE;oBACJ,KAAK,EAAE,kBAAkB;oBACzB,aAAa,EAAE,KAAK;oBACpB,WAAW,EAAE,2DAA2D;oBACxE,WAAW,EAAE,2BAA2B;oBACxC,YAAY,EAAE,OAAC,CAAC,MAAM,CAAC;wBACrB,KAAK,EAAE,OAAC,CAAC,OAAO,EAAE;wBAClB,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;wBAC7B,MAAM,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;qBAC5B,CAAC;oBACF,OAAO,EAAE,CAAC,KAAkD,EAAE,EAAE,CAC9D,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;iBACtD;aACF;YACD,IAAA,kEAA+B,GAAE;YACjC,oEAAmC;YACnC,kEAAkC;SACnC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"markdown-generator.agent.js","sourceRoot":"","sources":["../../src/agents/markdown-generator.agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AgentTool } from '@multiplayer-app/ai-agent-types';
2
+ export declare const writeAppFilesTool: AgentTool;
3
+ export declare const runAppCommandTool: AgentTool;
4
+ //# sourceMappingURL=app-vm.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-vm.tools.d.ts","sourceRoot":"","sources":["../../../src/agents/shared/app-vm.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAsCnF,eAAO,MAAM,iBAAiB,EAAE,SA4B/B,CAAA;AASD,eAAO,MAAM,iBAAiB,EAAE,SAqC/B,CAAA"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAppCommandTool = exports.writeAppFilesTool = void 0;
4
+ const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
+ const zod_1 = require("zod");
6
+ const context_1 = require("../../context");
7
+ const logger_1 = require("../../logger");
8
+ const agent_context_1 = require("./agent-context");
9
+ const STACKS = ['node', 'python', 'generic'];
10
+ function requireBridgeAndSession(context) {
11
+ const bridge = (0, context_1.getBuilderApiContext)().sessionVmBridge;
12
+ if (!bridge) {
13
+ throw new Error('App workspaces are not available in this deployment — build with session artifacts (publishSessionArtifacts) instead.');
14
+ }
15
+ const sessionId = (0, agent_context_1.getRootChatId)(context);
16
+ if (!sessionId) {
17
+ throw new Error('Session ID is required');
18
+ }
19
+ return { bridge, sessionId };
20
+ }
21
+ const writeAppFilesInputSchema = zod_1.z.object({
22
+ files: zod_1.z
23
+ .array(zod_1.z.object({
24
+ path: zod_1.z.string().min(1).max(500).describe('Workspace-relative path, e.g. index.html, src/main.js, package.json'),
25
+ content: zod_1.z.string().describe('File contents'),
26
+ encoding: zod_1.z.enum(['utf8', 'base64']).optional().describe('base64 for binary files; utf8 default'),
27
+ }))
28
+ .min(1)
29
+ .max(64),
30
+ stack: zod_1.z.enum(STACKS).optional().describe('VM stack when the workspace does not exist yet (default node)'),
31
+ });
32
+ exports.writeAppFilesTool = {
33
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
34
+ userConfigurable: true,
35
+ data: {
36
+ needsApproval: false,
37
+ title: 'writeAppFiles',
38
+ description: "Write files into the session's app workspace (an isolated per-session VM). Creates the workspace on first use. Static files are served immediately at the returned previewUrl.",
39
+ inputSchema: writeAppFilesInputSchema,
40
+ outputSchema: zod_1.z.object({
41
+ vmId: zod_1.z.string(),
42
+ previewUrl: zod_1.z.string().optional(),
43
+ written: zod_1.z.array(zod_1.z.object({ path: zod_1.z.string(), bytes: zod_1.z.number() })),
44
+ }),
45
+ execute: async (input, context) => {
46
+ try {
47
+ const { bridge, sessionId } = requireBridgeAndSession(context);
48
+ if (input.stack) {
49
+ await bridge.ensureVm(sessionId, input.stack);
50
+ }
51
+ const { vm, written } = await bridge.writeFiles(sessionId, input.files);
52
+ return { vmId: vm.vmId, previewUrl: vm.previewUrl, written };
53
+ }
54
+ catch (err) {
55
+ (0, logger_1.getBuilderApiLogger)().error({ err });
56
+ throw err;
57
+ }
58
+ },
59
+ },
60
+ };
61
+ const runAppCommandInputSchema = zod_1.z.object({
62
+ command: zod_1.z.string().min(1).max(4000).describe('Shell command run in the workspace root (or cwd)'),
63
+ cwd: zod_1.z.string().max(500).optional().describe('Workspace-relative working directory'),
64
+ timeoutMs: zod_1.z.number().int().positive().max(300000).optional().describe('Wall-clock limit, default 60000'),
65
+ stack: zod_1.z.enum(STACKS).optional().describe('VM stack when the workspace does not exist yet (default node)'),
66
+ });
67
+ exports.runAppCommandTool = {
68
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
69
+ userConfigurable: true,
70
+ data: {
71
+ needsApproval: false,
72
+ title: 'runAppCommand',
73
+ description: "Run a shell command inside the session's app workspace VM (npm install, build steps, node scripts). Returns exit code and captured output. Creates the workspace on first use.",
74
+ inputSchema: runAppCommandInputSchema,
75
+ outputSchema: zod_1.z.object({
76
+ vmId: zod_1.z.string(),
77
+ previewUrl: zod_1.z.string().optional(),
78
+ exitCode: zod_1.z.number(),
79
+ stdout: zod_1.z.string(),
80
+ stderr: zod_1.z.string(),
81
+ durationMs: zod_1.z.number(),
82
+ truncated: zod_1.z.boolean(),
83
+ timedOut: zod_1.z.boolean(),
84
+ }),
85
+ execute: async (input, context) => {
86
+ try {
87
+ const { bridge, sessionId } = requireBridgeAndSession(context);
88
+ if (input.stack) {
89
+ await bridge.ensureVm(sessionId, input.stack);
90
+ }
91
+ const { vm, result } = await bridge.exec(sessionId, {
92
+ command: input.command,
93
+ cwd: input.cwd,
94
+ timeoutMs: input.timeoutMs,
95
+ });
96
+ return { vmId: vm.vmId, previewUrl: vm.previewUrl, ...result };
97
+ }
98
+ catch (err) {
99
+ (0, logger_1.getBuilderApiLogger)().error({ err });
100
+ throw err;
101
+ }
102
+ },
103
+ },
104
+ };
105
+ //# sourceMappingURL=app-vm.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-vm.tools.js","sourceRoot":"","sources":["../../../src/agents/shared/app-vm.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AgentTool } from '@multiplayer-app/ai-agent-types';
2
+ export declare const createBuildPlanTool: AgentTool;
3
+ export declare const updateBuildTaskTool: AgentTool;
4
+ export declare const getBuildPlanTool: AgentTool;
5
+ //# sourceMappingURL=build-plan.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-plan.tools.d.ts","sourceRoot":"","sources":["../../../src/agents/shared/build-plan.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAmGnF,eAAO,MAAM,mBAAmB,EAAE,SA6BjC,CAAA;AASD,eAAO,MAAM,mBAAmB,EAAE,SA8DjC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,SAkB9B,CAAA"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBuildPlanTool = exports.updateBuildTaskTool = exports.createBuildPlanTool = void 0;
4
+ const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
+ const zod_1 = require("zod");
6
+ const agent_context_1 = require("./agent-context");
7
+ const logger_1 = require("../../logger");
8
+ const session_artifact_yjs_store_1 = require("../../realtime/session-artifact-yjs-store");
9
+ const build_plan_1 = require("../../lib/session-plans/build-plan");
10
+ const session_pages_1 = require("../../lib/session-pages");
11
+ function requireSessionId(context) {
12
+ const sessionId = (0, agent_context_1.getRootChatId)(context);
13
+ if (!sessionId) {
14
+ throw new Error('Session ID is required');
15
+ }
16
+ return sessionId;
17
+ }
18
+ async function readPlan(sessionId) {
19
+ try {
20
+ const content = await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().getLatestText(sessionId, build_plan_1.BUILD_PLAN_PATH);
21
+ return (0, build_plan_1.parseBuildPlan)(content);
22
+ }
23
+ catch (_a) {
24
+ return null;
25
+ }
26
+ }
27
+ async function writePlan(sessionId, plan) {
28
+ await (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)().initializeFromContent(sessionId, build_plan_1.BUILD_PLAN_PATH, (0, build_plan_1.serializeBuildPlan)(plan));
29
+ }
30
+ const openAdvisorySchema = zod_1.z.object({
31
+ path: zod_1.z.string(),
32
+ findings: zod_1.z.array(zod_1.z.string()),
33
+ recordedAt: zod_1.z.string(),
34
+ });
35
+ function planSummary(plan) {
36
+ var _a;
37
+ const next = (0, build_plan_1.nextPendingTask)(plan);
38
+ return {
39
+ title: plan.title,
40
+ progress: (0, build_plan_1.planProgress)(plan),
41
+ nextTask: next ? { id: next.id, title: next.title, description: next.description, status: next.status } : null,
42
+ tasks: plan.tasks.map((task) => ({ id: task.id, title: task.title, status: task.status })),
43
+ openAdvisories: (_a = plan.openAdvisories) !== null && _a !== void 0 ? _a : [],
44
+ };
45
+ }
46
+ const planSummarySchema = zod_1.z.object({
47
+ title: zod_1.z.string(),
48
+ progress: zod_1.z.object({ done: zod_1.z.number(), total: zod_1.z.number(), remaining: zod_1.z.number() }),
49
+ nextTask: zod_1.z.object({ id: zod_1.z.string(), title: zod_1.z.string(), description: zod_1.z.string(), status: zod_1.z.string() }).nullable(),
50
+ tasks: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), title: zod_1.z.string(), status: zod_1.z.string() })),
51
+ openAdvisories: zod_1.z.array(openAdvisorySchema),
52
+ });
53
+ const createPlanInputSchema = zod_1.z.object({
54
+ title: zod_1.z.string().min(1).max(200).describe('Short name of what is being built'),
55
+ designBrief: zod_1.z
56
+ .string()
57
+ .min(80)
58
+ .max(900)
59
+ .describe('Session-wide design contract BEFORE building. MUST include: (1) accent hex + darker hover hex (topic-fit, never default indigo), (2) neutral scale slate/zinc/stone, (3) Google Font pairing by name (Manrope/Sora/Fraunces/Outfit — never Inter), (4) tone, (5) layout pack product|launch|editorial, (6) light/dark strategy, (7) atmosphere (e.g. soft accent wash + blur orb / glass nav), (8) anti-cliché note (what this must NOT look like).'),
60
+ tasks: zod_1.z
61
+ .array(zod_1.z.object({
62
+ title: zod_1.z.string().min(1).max(120).describe('One concrete deliverable, e.g. "Landing page hero + nav"'),
63
+ description: zod_1.z.string().min(1).max(1000).describe('What this task produces: artifact paths, sections, behaviors'),
64
+ }))
65
+ .min(2)
66
+ .max(6)
67
+ .describe('Ordered tasks. Prefer 2–3 for a landing page (complete index.html publish + consistency). Max 6. Last must be consistency/polish.'),
68
+ });
69
+ exports.createBuildPlanTool = {
70
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
71
+ userConfigurable: true,
72
+ data: {
73
+ needsApproval: false,
74
+ title: 'createBuildPlan',
75
+ description: 'Create the build plan for this session: an ordered task list that will be executed one task at a time. Replaces any previous plan. The plan is stored as plan.json and visible to the user. Last task must be a consistency/polish pass.',
76
+ inputSchema: createPlanInputSchema,
77
+ outputSchema: planSummarySchema,
78
+ execute: async (input, context) => {
79
+ try {
80
+ const sessionId = requireSessionId(context);
81
+ (0, build_plan_1.assertDesignBriefQuality)(input.designBrief);
82
+ const last = input.tasks[input.tasks.length - 1];
83
+ if (!last || !(0, build_plan_1.isConsistencyPassTask)(last)) {
84
+ throw new Error('The last task MUST be a consistency/polish pass (title or description must mention consistency, polish, qa, or quality). Prefer a light error check — do not end the plan on a new page.');
85
+ }
86
+ const plan = (0, build_plan_1.createBuildPlan)(input.title, input.tasks, new Date().toISOString(), input.designBrief);
87
+ await writePlan(sessionId, plan);
88
+ return planSummary(plan);
89
+ }
90
+ catch (err) {
91
+ (0, logger_1.getBuilderApiLogger)().error({ err });
92
+ throw err;
93
+ }
94
+ },
95
+ },
96
+ };
97
+ const updateTaskInputSchema = zod_1.z.object({
98
+ taskId: zod_1.z.string().min(1).describe('Task id from the plan, e.g. t1'),
99
+ status: zod_1.z.enum(['in_progress', 'done', 'skipped']),
100
+ paths: zod_1.z.array(zod_1.z.string()).optional().describe('Artifact paths this task produced or edited'),
101
+ note: zod_1.z.string().max(500).optional().describe('Short outcome note, e.g. the previewUrl or why skipped'),
102
+ });
103
+ exports.updateBuildTaskTool = {
104
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
105
+ userConfigurable: true,
106
+ data: {
107
+ needsApproval: false,
108
+ title: 'updateBuildTask',
109
+ description: 'Update a build-plan task status. Returns remaining progress, openAdvisories, and the next pending task — when nextTask is not null, continue building it immediately.',
110
+ inputSchema: updateTaskInputSchema,
111
+ outputSchema: planSummarySchema,
112
+ execute: async (input, context) => {
113
+ var _a;
114
+ try {
115
+ const sessionId = requireSessionId(context);
116
+ const plan = await readPlan(sessionId);
117
+ if (!plan) {
118
+ throw new Error('No build plan exists — call createBuildPlan first');
119
+ }
120
+ const task = plan.tasks.find((candidate) => candidate.id === input.taskId);
121
+ const now = new Date().toISOString();
122
+ // Never mark a task done for HTML paths that were never published.
123
+ // (Parent previously claimed index.html after a failed publish.)
124
+ if (input.status === 'done' && ((_a = input.paths) === null || _a === void 0 ? void 0 : _a.length)) {
125
+ const existing = new Set((await (0, session_pages_1.listSessionArtifacts)(sessionId)).map((file) => file.path));
126
+ const missing = input.paths.filter((path) => path.toLowerCase().endsWith('.html') && path !== 'plan.json' && !existing.has(path));
127
+ if (missing.length > 0) {
128
+ throw new Error(`Cannot mark task done — claimed path(s) do not exist: ${missing.join(', ')}. Successful publishSessionArtifacts must return a previewUrl first. If publish failed, re-call publishSessionArtifacts (not updateSessionArtifact).`);
129
+ }
130
+ }
131
+ // Consistency pass cannot close while HTML still has blocking audit errors
132
+ // (including missing-html-pages when nothing was published).
133
+ if (input.status === 'done' && task && (0, build_plan_1.isConsistencyPassTask)(task)) {
134
+ const report = await (0, session_pages_1.auditSessionHtmlArtifacts)(sessionId);
135
+ if (report.errorCount > 0) {
136
+ (0, build_plan_1.clearOpenAdvisories)(plan, undefined, now);
137
+ (0, build_plan_1.recordOpenAdvisories)(plan, (0, session_pages_1.sessionQualityToAdvisoryLines)(report), now);
138
+ await writePlan(sessionId, plan);
139
+ const blocking = report.advisoryLines.filter((line) => line.startsWith('[error]')).slice(0, 8);
140
+ throw new Error(`Consistency pass incomplete — ${report.errorCount} blocking quality error(s) remain across ${report.issues.length} page(s). If missing-html-pages: call publishSessionArtifacts. Otherwise updateSessionArtifact per path. Remaining:\n${blocking.join('\n')}${report.errorCount > 8 ? '\n…' : ''}`);
141
+ }
142
+ (0, build_plan_1.clearOpenAdvisories)(plan, undefined, now);
143
+ }
144
+ const updated = (0, build_plan_1.applyTaskUpdate)(plan, input, now);
145
+ if (!updated) {
146
+ throw new Error(`Unknown task id: ${input.taskId}`);
147
+ }
148
+ await writePlan(sessionId, updated);
149
+ return planSummary(updated);
150
+ }
151
+ catch (err) {
152
+ (0, logger_1.getBuilderApiLogger)().error({ err });
153
+ throw err;
154
+ }
155
+ },
156
+ },
157
+ };
158
+ exports.getBuildPlanTool = {
159
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
160
+ userConfigurable: true,
161
+ data: {
162
+ needsApproval: false,
163
+ title: 'getBuildPlan',
164
+ description: 'Read the current build plan, progress, and openAdvisories for this session (null when no plan exists yet).',
165
+ inputSchema: zod_1.z.object({}),
166
+ outputSchema: zod_1.z.object({
167
+ plan: planSummarySchema.nullable(),
168
+ }),
169
+ execute: async (_input, context) => {
170
+ const sessionId = requireSessionId(context);
171
+ const plan = await readPlan(sessionId);
172
+ return { plan: plan ? planSummary(plan) : null };
173
+ },
174
+ },
175
+ };
176
+ //# sourceMappingURL=build-plan.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-plan.tools.js","sourceRoot":"","sources":["../../../src/agents/shared/build-plan.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentTool } from '@multiplayer-app/ai-agent-types';
2
+ /**
3
+ * Parent-orchestrator tool: re-audit every HTML page and refresh plan.openAdvisories.
4
+ * Call only during the consistency/polish pass — never mid-build.
5
+ */
6
+ export declare const getSessionQualityReportTool: AgentTool;
7
+ //# sourceMappingURL=session-quality-report.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-quality-report.tool.d.ts","sourceRoot":"","sources":["../../../src/agents/shared/session-quality-report.tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAkBnF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,SA4FzC,CAAA"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSessionQualityReportTool = void 0;
4
+ const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
5
+ const zod_1 = require("zod");
6
+ const agent_context_1 = require("./agent-context");
7
+ const logger_1 = require("../../logger");
8
+ const session_pages_1 = require("../../lib/session-pages");
9
+ const build_plan_1 = require("../../lib/session-plans/build-plan");
10
+ const session_artifact_yjs_store_1 = require("../../realtime/session-artifact-yjs-store");
11
+ /**
12
+ * Parent-orchestrator tool: re-audit every HTML page and refresh plan.openAdvisories.
13
+ * Call only during the consistency/polish pass — never mid-build.
14
+ */
15
+ exports.getSessionQualityReportTool = {
16
+ type: ai_agent_types_1.AgentToolType.LOCAL_FUNCTION,
17
+ userConfigurable: true,
18
+ data: {
19
+ needsApproval: false,
20
+ title: 'getSessionQualityReport',
21
+ description: 'Re-audit every HTML artifact. Call ONLY during the consistency/polish pass (never mid-build). Returns errorCount (blocking) and actionable warnings. Deferred heuristics like low-contrast are counted separately and do NOT need mid-build fixes. When errorCount===0 after at most one consistency fix round, mark consistency done.',
22
+ inputSchema: zod_1.z.object({}),
23
+ outputSchema: zod_1.z.object({
24
+ clean: zod_1.z.boolean(),
25
+ errorCount: zod_1.z.number(),
26
+ warningCount: zod_1.z.number(),
27
+ deferredWarningCount: zod_1.z.number(),
28
+ actionRequired: zod_1.z.boolean(),
29
+ guidance: zod_1.z.string(),
30
+ issues: zod_1.z.array(zod_1.z.object({
31
+ path: zod_1.z.string(),
32
+ findings: zod_1.z.array(zod_1.z.object({
33
+ rule: zod_1.z.string(),
34
+ severity: zod_1.z.enum(['error', 'warning']),
35
+ message: zod_1.z.string(),
36
+ })),
37
+ })),
38
+ actionableIssues: zod_1.z.array(zod_1.z.object({
39
+ path: zod_1.z.string(),
40
+ findings: zod_1.z.array(zod_1.z.object({
41
+ rule: zod_1.z.string(),
42
+ severity: zod_1.z.enum(['error', 'warning']),
43
+ message: zod_1.z.string(),
44
+ })),
45
+ })),
46
+ openAdvisories: zod_1.z.array(zod_1.z.object({
47
+ path: zod_1.z.string(),
48
+ findings: zod_1.z.array(zod_1.z.string()),
49
+ recordedAt: zod_1.z.string(),
50
+ })),
51
+ }),
52
+ execute: async (_input, context) => {
53
+ var _a;
54
+ const sessionId = (0, agent_context_1.getRootChatId)(context);
55
+ if (!sessionId) {
56
+ throw new Error('Session ID is required');
57
+ }
58
+ try {
59
+ const report = await (0, session_pages_1.auditSessionHtmlArtifacts)(sessionId);
60
+ const now = new Date().toISOString();
61
+ const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
62
+ const plan = (0, build_plan_1.parseBuildPlan)(await store.getLatestText(sessionId, build_plan_1.BUILD_PLAN_PATH).catch(() => ''));
63
+ let openAdvisories = [];
64
+ if (plan) {
65
+ (0, build_plan_1.clearOpenAdvisories)(plan, undefined, now);
66
+ const lines = (0, session_pages_1.sessionQualityToAdvisoryLines)(report);
67
+ if (lines.length > 0) {
68
+ (0, build_plan_1.recordOpenAdvisories)(plan, lines, now);
69
+ }
70
+ await store.initializeFromContent(sessionId, build_plan_1.BUILD_PLAN_PATH, (0, build_plan_1.serializeBuildPlan)(plan));
71
+ openAdvisories = (_a = plan.openAdvisories) !== null && _a !== void 0 ? _a : [];
72
+ }
73
+ const actionRequired = report.errorCount > 0;
74
+ return {
75
+ clean: report.actionableIssues.length === 0,
76
+ errorCount: report.errorCount,
77
+ warningCount: report.warningCount,
78
+ deferredWarningCount: report.deferredWarningCount,
79
+ actionRequired,
80
+ guidance: actionRequired
81
+ ? report.actionableIssues.some((issue) => issue.findings.some((finding) => finding.rule === 'missing-html-pages'))
82
+ ? 'No HTML pages on disk. Call publishSessionArtifacts to create index.html — updateSessionArtifact cannot create files. Then getSessionQualityReport again.'
83
+ : 'Blocking errors remain — call updateSessionArtifact once per path in actionableIssues, then getSessionQualityReport again. Mark consistency done only when errorCount===0.'
84
+ : 'No blocking errors. Do NOT start updateSessionArtifact for warnings. Mark the consistency task done and finish the plan.',
85
+ issues: report.issues,
86
+ actionableIssues: report.actionableIssues,
87
+ openAdvisories,
88
+ };
89
+ }
90
+ catch (err) {
91
+ (0, logger_1.getBuilderApiLogger)().error({ err });
92
+ throw err;
93
+ }
94
+ },
95
+ },
96
+ };
97
+ //# sourceMappingURL=session-quality-report.tool.js.map