create-yss-spec 3.5.2 → 3.5.3

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 (438) hide show
  1. package/package.json +1 -1
  2. package/src/template/asset-runtime.js +3 -1
  3. package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
  4. package/template/.agents/skills/codebase-design/SKILL.md +4 -0
  5. package/template/{.codex/skills/improve-codebase-architecture/SKILL.md → .agents/skills/codebase-design/references/architecture-audit.md} +3 -9
  6. package/template/.agents/skills/frontend-commit/SKILL.md +4 -93
  7. package/template/.agents/skills/git-commit-core/SKILL.md +18 -0
  8. package/template/.agents/skills/java-backend-commit/SKILL.md +4 -96
  9. package/template/.agents/skills/llm-wiki/SKILL.md +12 -13
  10. package/template/.agents/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  11. package/template/.agents/skills/llm-wiki/references/compile.md +21 -114
  12. package/template/.agents/skills/llm-wiki/references/ingest.md +8 -33
  13. package/template/.agents/skills/llm-wiki/references/lint.md +9 -46
  14. package/template/.agents/skills/llm-wiki/references/query.md +9 -18
  15. package/template/.agents/skills/llm-wiki/references/schema.md +56 -29
  16. package/template/.agents/skills/llm-wiki/references/transactions.md +48 -0
  17. package/template/.agents/skills/llm-wiki/references/writing.md +4 -4
  18. package/template/.agents/skills/llm-wiki/scripts/advise.mjs +46 -58
  19. package/template/.agents/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  20. package/template/.agents/skills/llm-wiki/scripts/core.mjs +262 -0
  21. package/template/.agents/skills/llm-wiki/scripts/extract.mjs +35 -18
  22. package/template/.agents/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  23. package/template/.agents/skills/llm-wiki/scripts/feedback.mjs +51 -0
  24. package/template/.agents/skills/llm-wiki/scripts/inventory.mjs +43 -171
  25. package/template/.agents/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  26. package/template/.agents/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  27. package/template/.agents/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  28. package/template/.agents/skills/llm-wiki/scripts/migrate.mjs +51 -0
  29. package/template/.agents/skills/llm-wiki/scripts/query.mjs +149 -0
  30. package/template/.agents/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  31. package/template/.agents/skills/llm-wiki/scripts/sources.mjs +166 -0
  32. package/template/.agents/skills/llm-wiki/scripts/transaction.mjs +384 -0
  33. package/template/.agents/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  34. package/template/.agents/skills/prototype/LOGIC.md +1 -1
  35. package/template/.agents/skills/prototype/SKILL.md +5 -19
  36. package/template/.agents/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  37. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  38. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  39. package/template/.agents/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  40. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +8 -8
  41. package/template/.agents/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  42. package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  43. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  44. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  45. package/template/.agents/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  46. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
  47. package/template/.agents/skills/yss-research/SKILL.md +4 -0
  48. package/template/.codex/skills/codebase-design/SKILL.md +4 -0
  49. package/template/{.pi/skills/improve-codebase-architecture/SKILL.md → .codex/skills/codebase-design/references/architecture-audit.md} +3 -9
  50. package/template/.codex/skills/frontend-commit/SKILL.md +4 -93
  51. package/template/.codex/skills/git-commit-core/SKILL.md +18 -0
  52. package/template/.codex/skills/java-backend-commit/SKILL.md +4 -96
  53. package/template/.codex/skills/llm-wiki/SKILL.md +12 -13
  54. package/template/.codex/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  55. package/template/.codex/skills/llm-wiki/references/compile.md +21 -114
  56. package/template/.codex/skills/llm-wiki/references/ingest.md +8 -33
  57. package/template/.codex/skills/llm-wiki/references/lint.md +9 -46
  58. package/template/.codex/skills/llm-wiki/references/query.md +9 -18
  59. package/template/.codex/skills/llm-wiki/references/schema.md +56 -29
  60. package/template/.codex/skills/llm-wiki/references/transactions.md +48 -0
  61. package/template/.codex/skills/llm-wiki/references/writing.md +4 -4
  62. package/template/.codex/skills/llm-wiki/scripts/advise.mjs +46 -58
  63. package/template/.codex/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  64. package/template/.codex/skills/llm-wiki/scripts/core.mjs +262 -0
  65. package/template/.codex/skills/llm-wiki/scripts/extract.mjs +35 -18
  66. package/template/.codex/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  67. package/template/.codex/skills/llm-wiki/scripts/feedback.mjs +51 -0
  68. package/template/.codex/skills/llm-wiki/scripts/inventory.mjs +43 -171
  69. package/template/.codex/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  70. package/template/.codex/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  71. package/template/.codex/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  72. package/template/.codex/skills/llm-wiki/scripts/migrate.mjs +51 -0
  73. package/template/.codex/skills/llm-wiki/scripts/query.mjs +149 -0
  74. package/template/.codex/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  75. package/template/.codex/skills/llm-wiki/scripts/sources.mjs +166 -0
  76. package/template/.codex/skills/llm-wiki/scripts/transaction.mjs +384 -0
  77. package/template/.codex/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  78. package/template/.codex/skills/prototype/LOGIC.md +1 -1
  79. package/template/.codex/skills/prototype/SKILL.md +5 -19
  80. package/template/.codex/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  81. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  82. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  83. package/template/.codex/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  84. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +8 -8
  85. package/template/.codex/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  86. package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  87. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  88. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  89. package/template/.codex/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  90. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
  91. package/template/.codex/skills/yss-research/SKILL.md +4 -0
  92. package/template/.cursor/skills/codebase-design/SKILL.md +4 -0
  93. package/template/.cursor/skills/{improve-codebase-architecture/SKILL.md → codebase-design/references/architecture-audit.md} +3 -9
  94. package/template/.cursor/skills/frontend-commit/SKILL.md +4 -93
  95. package/template/.cursor/skills/git-commit-core/SKILL.md +18 -0
  96. package/template/.cursor/skills/java-backend-commit/SKILL.md +4 -96
  97. package/template/.cursor/skills/llm-wiki/SKILL.md +12 -13
  98. package/template/.cursor/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  99. package/template/.cursor/skills/llm-wiki/references/compile.md +21 -114
  100. package/template/.cursor/skills/llm-wiki/references/ingest.md +8 -33
  101. package/template/.cursor/skills/llm-wiki/references/lint.md +9 -46
  102. package/template/.cursor/skills/llm-wiki/references/query.md +9 -18
  103. package/template/.cursor/skills/llm-wiki/references/schema.md +56 -29
  104. package/template/.cursor/skills/llm-wiki/references/transactions.md +48 -0
  105. package/template/.cursor/skills/llm-wiki/references/writing.md +4 -4
  106. package/template/.cursor/skills/llm-wiki/scripts/advise.mjs +46 -58
  107. package/template/.cursor/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  108. package/template/.cursor/skills/llm-wiki/scripts/core.mjs +262 -0
  109. package/template/.cursor/skills/llm-wiki/scripts/extract.mjs +35 -18
  110. package/template/.cursor/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  111. package/template/.cursor/skills/llm-wiki/scripts/feedback.mjs +51 -0
  112. package/template/.cursor/skills/llm-wiki/scripts/inventory.mjs +43 -171
  113. package/template/.cursor/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  114. package/template/.cursor/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  115. package/template/.cursor/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  116. package/template/.cursor/skills/llm-wiki/scripts/migrate.mjs +51 -0
  117. package/template/.cursor/skills/llm-wiki/scripts/query.mjs +149 -0
  118. package/template/.cursor/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  119. package/template/.cursor/skills/llm-wiki/scripts/sources.mjs +166 -0
  120. package/template/.cursor/skills/llm-wiki/scripts/transaction.mjs +384 -0
  121. package/template/.cursor/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  122. package/template/.cursor/skills/prototype/LOGIC.md +1 -1
  123. package/template/.cursor/skills/prototype/SKILL.md +5 -19
  124. package/template/.cursor/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  125. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  126. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  127. package/template/.cursor/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  128. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +8 -8
  129. package/template/.cursor/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  130. package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  131. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  132. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  133. package/template/.cursor/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  134. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
  135. package/template/.cursor/skills/yss-research/SKILL.md +4 -0
  136. package/template/.pi/skills/codebase-design/SKILL.md +4 -0
  137. package/template/{.agents/skills/improve-codebase-architecture/SKILL.md → .pi/skills/codebase-design/references/architecture-audit.md} +3 -9
  138. package/template/.pi/skills/frontend-commit/SKILL.md +4 -93
  139. package/template/.pi/skills/git-commit-core/SKILL.md +18 -0
  140. package/template/.pi/skills/java-backend-commit/SKILL.md +4 -96
  141. package/template/.pi/skills/llm-wiki/SKILL.md +12 -13
  142. package/template/.pi/skills/llm-wiki/assets/CLAUDE.md.template +7 -1
  143. package/template/.pi/skills/llm-wiki/references/compile.md +21 -114
  144. package/template/.pi/skills/llm-wiki/references/ingest.md +8 -33
  145. package/template/.pi/skills/llm-wiki/references/lint.md +9 -46
  146. package/template/.pi/skills/llm-wiki/references/query.md +9 -18
  147. package/template/.pi/skills/llm-wiki/references/schema.md +56 -29
  148. package/template/.pi/skills/llm-wiki/references/transactions.md +48 -0
  149. package/template/.pi/skills/llm-wiki/references/writing.md +4 -4
  150. package/template/.pi/skills/llm-wiki/scripts/advise.mjs +46 -58
  151. package/template/.pi/skills/llm-wiki/scripts/advise.test.mjs +11 -16
  152. package/template/.pi/skills/llm-wiki/scripts/core.mjs +262 -0
  153. package/template/.pi/skills/llm-wiki/scripts/extract.mjs +35 -18
  154. package/template/.pi/skills/llm-wiki/scripts/extract.test.mjs +5 -8
  155. package/template/.pi/skills/llm-wiki/scripts/feedback.mjs +51 -0
  156. package/template/.pi/skills/llm-wiki/scripts/inventory.mjs +43 -171
  157. package/template/.pi/skills/llm-wiki/scripts/inventory.test.mjs +25 -18
  158. package/template/.pi/skills/llm-wiki/scripts/lint-wikilinks.mjs +69 -92
  159. package/template/.pi/skills/llm-wiki/scripts/lint-wikilinks.test.mjs +25 -37
  160. package/template/.pi/skills/llm-wiki/scripts/migrate.mjs +51 -0
  161. package/template/.pi/skills/llm-wiki/scripts/query.mjs +149 -0
  162. package/template/.pi/skills/llm-wiki/scripts/regressions.test.mjs +101 -0
  163. package/template/.pi/skills/llm-wiki/scripts/sources.mjs +166 -0
  164. package/template/.pi/skills/llm-wiki/scripts/transaction.mjs +384 -0
  165. package/template/.pi/skills/llm-wiki/scripts/v2.test.mjs +354 -0
  166. package/template/.pi/skills/prototype/LOGIC.md +1 -1
  167. package/template/.pi/skills/prototype/SKILL.md +5 -19
  168. package/template/.pi/skills/setup-matt-pocock-skills/SKILL.md +3 -3
  169. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  170. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +2 -3
  171. package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +14 -0
  172. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +8 -8
  173. package/template/.pi/skills/yss-product-lifecycle/references/external-input-questionnaire.md +19 -0
  174. package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +5 -5
  175. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +20 -4
  176. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  177. package/template/.pi/skills/yss-product-lifecycle/references/plan-requirements.md +10 -0
  178. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
  179. package/template/.pi/skills/yss-research/SKILL.md +4 -0
  180. package/template/.template-spec/agents/README.md +1 -1
  181. package/template/.template-spec/agents/digital-human-roles.yaml +1 -1
  182. package/template/.template-spec/agents/skill-migrations.md +15 -0
  183. package/template/.template-spec/agents/yss-skill-registry.yaml +10 -29
  184. package/template/.template-spec/architecture/README.md +3 -34
  185. package/template/.template-spec/plan/templates/competitive-analysis-template.md +2 -2
  186. package/template/.template-spec/process/contract-reading.md +24 -0
  187. package/template/.template-spec/process/lifecycle-registry-baseline.json +3 -1
  188. package/template/.template-spec/process/lifecycle-registry.yaml +6 -0
  189. package/template/.template-spec/process/research-completion.md +23 -0
  190. package/template/.template-spec/process/schemas/digital-human-task-package.schema.json +202 -12
  191. package/template/.template-spec/process/schemas/frontend-implementation-evidence.schema.json +7 -15
  192. package/template/.template-spec/process/subagent-collaboration.md +8 -0
  193. package/template/.template-spec/process/templates/frontend-implementation-verification-template.yaml +15 -1
  194. package/template/AGENTS.md +1 -1
  195. package/template/CONTEXT.md +5 -1
  196. package/template/README.md +12 -24
  197. package/template/scripts/contract +5 -5
  198. package/template/scripts/lib/contract-views.mjs +57 -2
  199. package/template/scripts/lib/execution-evidence.mjs +51 -0
  200. package/template/scripts/lib/harness-execution-scope.mjs +1 -1
  201. package/template/scripts/lib/implementation-contract-compiler.mjs +2 -0
  202. package/template/scripts/lib/lifecycle-context-query.mjs +15 -3
  203. package/template/scripts/lib/lifecycle-status.mjs +32 -6
  204. package/template/scripts/lib/lifecycle-transition.mjs +19 -1
  205. package/template/scripts/lib/maintenance-research.mjs +63 -0
  206. package/template/scripts/lib/read-only-intake.mjs +132 -0
  207. package/template/scripts/lib/skill-registry.mjs +2 -1
  208. package/template/scripts/lib/skill-supply-chain.mjs +4 -0
  209. package/template/scripts/lib/slice-task-package.mjs +1 -1
  210. package/template/scripts/lib/task-package.mjs +9 -2
  211. package/template/scripts/lifecycle-status +2 -2
  212. package/template/scripts/prepare-read-only-intake +16 -0
  213. package/template/scripts/run-read-only-intake +14 -0
  214. package/template/scripts/verify-digital-human-task-package +2 -2
  215. package/template/scripts/verify-frontend-implementation-evidence +24 -1
  216. package/template/scripts/verify-maintenance-research +13 -0
  217. package/template/skills-lock.json +19 -76
  218. package/template.manifest.json +118 -29
  219. package/template.snapshot.json +5 -6
  220. package/template/.agents/skills/grill-with-docs/SKILL.md +0 -20
  221. package/template/.agents/skills/grill-with-docs/agents/openai.yaml +0 -5
  222. package/template/.agents/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  223. package/template/.agents/skills/prototype/UI.md +0 -112
  224. package/template/.agents/skills/setup-matt-pocock-skills/domain.md +0 -37
  225. package/template/.agents/skills/to-questionnaire/SKILL.md +0 -55
  226. package/template/.agents/skills/to-questionnaire/agents/openai.yaml +0 -5
  227. package/template/.agents/skills/wait-what/SKILL.md +0 -7
  228. package/template/.agents/skills/wait-what/agents/openai.yaml +0 -5
  229. package/template/.codex/skills/data-analytics/.app.json +0 -84
  230. package/template/.codex/skills/data-analytics/.codex-plugin/plugin.json +0 -66
  231. package/template/.codex/skills/data-analytics/.mcp.json +0 -30
  232. package/template/.codex/skills/data-analytics/AGENTS.md +0 -20
  233. package/template/.codex/skills/data-analytics/DEPENDENCIES.MD +0 -27
  234. package/template/.codex/skills/data-analytics/README.md +0 -60
  235. package/template/.codex/skills/data-analytics/__yss_dotfile__.gitignore +0 -2
  236. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html +0 -16
  237. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part001 +0 -1
  238. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part002 +0 -1
  239. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part003 +0 -1
  240. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part004 +0 -1
  241. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part005 +0 -1
  242. package/template/.codex/skills/data-analytics/assets/datascience-artifact-widget.html.gz.b64.part006 +0 -1
  243. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html +0 -16
  244. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part001 +0 -1
  245. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part002 +0 -1
  246. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part003 +0 -1
  247. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part004 +0 -1
  248. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part005 +0 -1
  249. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part006 +0 -1
  250. package/template/.codex/skills/data-analytics/assets/datascience-chart-widget.html.gz.b64.part007 +0 -1
  251. package/template/.codex/skills/data-analytics/assets/datascience-small.svg +0 -5
  252. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html +0 -16
  253. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part001 +0 -1
  254. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part002 +0 -1
  255. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part003 +0 -1
  256. package/template/.codex/skills/data-analytics/assets/datascience-table-widget.html.gz.b64.part004 +0 -1
  257. package/template/.codex/skills/data-analytics/assets/datascience.png +0 -0
  258. package/template/.codex/skills/data-analytics/assets/datascience.svg +0 -10
  259. package/template/.codex/skills/data-analytics/mcp/server.cjs +0 -2964
  260. package/template/.codex/skills/data-analytics/package-lock.json +0 -3048
  261. package/template/.codex/skills/data-analytics/package.json +0 -43
  262. package/template/.codex/skills/data-analytics/scripts/normalize-widget-assets.mjs +0 -75
  263. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/SKILL.md +0 -137
  264. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/agents/openai.yaml +0 -6
  265. package/template/.codex/skills/data-analytics/skills/analyze-data-quality/references/quality-checks.md +0 -29
  266. package/template/.codex/skills/data-analytics/skills/build-dashboard/SKILL.md +0 -148
  267. package/template/.codex/skills/data-analytics/skills/build-dashboard/agents/openai.yaml +0 -6
  268. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/bi-platform-dashboard.md +0 -18
  269. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/html-dashboard.md +0 -24
  270. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/mcp-artifact-dashboard.md +0 -71
  271. package/template/.codex/skills/data-analytics/skills/build-dashboard/specifications/streamlit-dashboard.md +0 -85
  272. package/template/.codex/skills/data-analytics/skills/build-report/SKILL.md +0 -207
  273. package/template/.codex/skills/data-analytics/skills/build-report/agents/openai.yaml +0 -6
  274. package/template/.codex/skills/data-analytics/skills/build-report/assets/executive-report-shell.html +0 -70
  275. package/template/.codex/skills/data-analytics/skills/build-report/assets/technical-report-shell.html +0 -66
  276. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/SKILL.md +0 -108
  277. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/agents/openai.yaml +0 -6
  278. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/__init__.py +0 -1
  279. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/cli.py +0 -52
  280. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/constants.py +0 -61
  281. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/docx_writer.py +0 -362
  282. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/html_parser.py +0 -829
  283. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/model.py +0 -30
  284. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/plan.py +0 -127
  285. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/quality.py +0 -374
  286. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/rendering.py +0 -613
  287. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/table_utils.py +0 -54
  288. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc/utils.py +0 -16
  289. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/scripts/report_to_google_doc_plan.py +0 -9
  290. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-doc/tests/test_delivery_plan.py +0 -45
  291. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/SKILL.md +0 -77
  292. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/agents/openai.yaml +0 -6
  293. package/template/.codex/skills/data-analytics/skills/build-report/report-to-google-slides/scripts/report_to_google_slides.py +0 -2379
  294. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/SKILL.md +0 -88
  295. package/template/.codex/skills/data-analytics/skills/build-report/report-to-pdf/agents/openai.yaml +0 -6
  296. package/template/.codex/skills/data-analytics/skills/build-report/specifications/executive-report.md +0 -97
  297. package/template/.codex/skills/data-analytics/skills/build-report/specifications/mcp-app-report.md +0 -59
  298. package/template/.codex/skills/data-analytics/skills/build-report/specifications/technical-report.md +0 -75
  299. package/template/.codex/skills/data-analytics/skills/design-kpis/SKILL.md +0 -103
  300. package/template/.codex/skills/data-analytics/skills/design-kpis/agents/openai.yaml +0 -6
  301. package/template/.codex/skills/data-analytics/skills/gather-business-context/SKILL.md +0 -68
  302. package/template/.codex/skills/data-analytics/skills/gather-business-context/agents/openai.yaml +0 -6
  303. package/template/.codex/skills/data-analytics/skills/index/SKILL.md +0 -251
  304. package/template/.codex/skills/data-analytics/skills/index/agents/openai.yaml +0 -6
  305. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/SKILL.md +0 -131
  306. package/template/.codex/skills/data-analytics/skills/jupyter-notebooks/agents/openai.yaml +0 -6
  307. package/template/.codex/skills/data-analytics/skills/kpi-reporting/SKILL.md +0 -141
  308. package/template/.codex/skills/data-analytics/skills/kpi-reporting/agents/openai.yaml +0 -6
  309. package/template/.codex/skills/data-analytics/skills/kpi-reporting/references/report-templates.md +0 -32
  310. package/template/.codex/skills/data-analytics/skills/market-sizing/SKILL.md +0 -106
  311. package/template/.codex/skills/data-analytics/skills/market-sizing/agents/openai.yaml +0 -6
  312. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/SKILL.md +0 -130
  313. package/template/.codex/skills/data-analytics/skills/metric-diagnostics/agents/openai.yaml +0 -6
  314. package/template/.codex/skills/data-analytics/skills/product-business-analysis/SKILL.md +0 -141
  315. package/template/.codex/skills/data-analytics/skills/product-business-analysis/agents/openai.yaml +0 -6
  316. package/template/.codex/skills/data-analytics/skills/spreadsheets/SKILL.md +0 -178
  317. package/template/.codex/skills/data-analytics/skills/spreadsheets/agents/openai.yaml +0 -9
  318. package/template/.codex/skills/data-analytics/skills/spreadsheets/assets/file-spreadsheet.png +0 -0
  319. package/template/.codex/skills/data-analytics/skills/spreadsheets/charts.md +0 -31
  320. package/template/.codex/skills/data-analytics/skills/spreadsheets/references/artifact_tool_api.md +0 -466
  321. package/template/.codex/skills/data-analytics/skills/spreadsheets/style_guidelines.md +0 -99
  322. package/template/.codex/skills/data-analytics/skills/user-context/SKILL.md +0 -197
  323. package/template/.codex/skills/data-analytics/skills/user-context/agents/openai.yaml +0 -6
  324. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/automation-config.md +0 -26
  325. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/source-category-config.json +0 -51
  326. package/template/.codex/skills/data-analytics/skills/user-context/plugin-author-config/user-context-config.md +0 -66
  327. package/template/.codex/skills/data-analytics/skills/user-context/references/automation.md +0 -69
  328. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-examples.md +0 -204
  329. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding-state-template.json +0 -87
  330. package/template/.codex/skills/data-analytics/skills/user-context/references/onboarding.md +0 -497
  331. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/connector-playbook.md +0 -74
  332. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/setup.md +0 -65
  333. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/skill-template.md +0 -160
  334. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/source-intake.md +0 -75
  335. package/template/.codex/skills/data-analytics/skills/user-context/references/semantic-layer/weekly-polling-automation.md +0 -96
  336. package/template/.codex/skills/data-analytics/skills/user-context/references/source-category-runtime.md +0 -263
  337. package/template/.codex/skills/data-analytics/skills/user-context/scripts/data_analytics_preflight.py +0 -1462
  338. package/template/.codex/skills/data-analytics/skills/user-context/scripts/init_user_context_state.py +0 -128
  339. package/template/.codex/skills/data-analytics/skills/user-context/scripts/reset_user_context_state.py +0 -101
  340. package/template/.codex/skills/data-analytics/skills/user-context/scripts/validate_user_context_preflight.py +0 -499
  341. package/template/.codex/skills/data-analytics/skills/user-context/tests/test_state_helpers.py +0 -978
  342. package/template/.codex/skills/data-analytics/skills/validate-data/SKILL.md +0 -126
  343. package/template/.codex/skills/data-analytics/skills/validate-data/agents/openai.yaml +0 -6
  344. package/template/.codex/skills/data-analytics/skills/validate-data/references/validation-methods.md +0 -70
  345. package/template/.codex/skills/data-analytics/skills/visualize-data/SKILL.md +0 -157
  346. package/template/.codex/skills/data-analytics/skills/visualize-data/agents/openai.yaml +0 -6
  347. package/template/.codex/skills/data-analytics/skills/visualize-data/references/seaborn-templates.md +0 -774
  348. package/template/.codex/skills/data-analytics/src/DESIGN.md +0 -222
  349. package/template/.codex/skills/data-analytics/src/analytics-app/App.tsx +0 -3666
  350. package/template/.codex/skills/data-analytics/src/analytics-app/analytics-layout.test.mjs +0 -136
  351. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartFrame.tsx +0 -54
  352. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartLegend.tsx +0 -96
  353. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartRenderer.tsx +0 -1647
  354. package/template/.codex/skills/data-analytics/src/analytics-app/charting/ChartTooltip.tsx +0 -245
  355. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-app-helpers.tsx +0 -462
  356. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-capabilities.ts +0 -107
  357. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-compatibility.ts +0 -164
  358. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-contract.ts +0 -192
  359. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-theme.ts +0 -203
  360. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-tokens.css +0 -619
  361. package/template/.codex/skills/data-analytics/src/analytics-app/charting/chart-transforms.ts +0 -402
  362. package/template/.codex/skills/data-analytics/src/analytics-app/fonts/SystemSansVariableVF.woff2 +0 -0
  363. package/template/.codex/skills/data-analytics/src/analytics-app/imageExport.ts +0 -370
  364. package/template/.codex/skills/data-analytics/src/analytics-app/layout/AnalyticsLayoutCanvas.tsx +0 -536
  365. package/template/.codex/skills/data-analytics/src/analytics-app/layout/RichMarkdown.tsx +0 -681
  366. package/template/.codex/skills/data-analytics/src/analytics-app/layout/analyticsLayoutCore.ts +0 -164
  367. package/template/.codex/skills/data-analytics/src/analytics-app/main.tsx +0 -21
  368. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/chart_contract.py +0 -472
  369. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/check_analytics_app_runtime_links.py +0 -75
  370. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/design_contract.py +0 -142
  371. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/package_utils.py +0 -142
  372. package/template/.codex/skills/data-analytics/src/analytics-app/scripts/tests/test_package_utils.py +0 -377
  373. package/template/.codex/skills/data-analytics/src/analytics-app/styles.css +0 -3468
  374. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.d.ts +0 -44
  375. package/template/.codex/skills/data-analytics/src/analytics-app/tables/DataTable.jsx +0 -639
  376. package/template/.codex/skills/data-analytics/src/analytics-app/tables/data-table.css +0 -327
  377. package/template/.codex/skills/data-analytics/src/analytics-app/tokens.css +0 -225
  378. package/template/.codex/skills/data-analytics/src/analytics-app/types.ts +0 -204
  379. package/template/.codex/skills/data-analytics/src/analytics-app-core.md +0 -85
  380. package/template/.codex/skills/data-analytics/src/codex-style-contract.md +0 -30
  381. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.html +0 -12
  382. package/template/.codex/skills/data-analytics/src/datascience-artifact-widget.jsx +0 -1008
  383. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.css +0 -2117
  384. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.html +0 -122
  385. package/template/.codex/skills/data-analytics/src/datascience-chart-widget.js +0 -3588
  386. package/template/.codex/skills/data-analytics/src/datascience-table-widget.css +0 -483
  387. package/template/.codex/skills/data-analytics/src/datascience-table-widget.html +0 -32
  388. package/template/.codex/skills/data-analytics/src/datascience-table-widget.js +0 -333
  389. package/template/.codex/skills/data-analytics/src/mcp-host.js +0 -153
  390. package/template/.codex/skills/data-analytics/src/recharts-config.js +0 -315
  391. package/template/.codex/skills/data-analytics/src/recharts-renderer.jsx +0 -294
  392. package/template/.codex/skills/data-analytics/src/sql-source-view.css +0 -33
  393. package/template/.codex/skills/data-analytics/src/sql-source-view.js +0 -157
  394. package/template/.codex/skills/data-analytics/src/styles/codex-theme.css +0 -121
  395. package/template/.codex/skills/data-analytics/src/table-renderer.jsx +0 -28
  396. package/template/.codex/skills/data-analytics/tests/chart-transforms.test.mjs +0 -87
  397. package/template/.codex/skills/data-analytics/tests/funnel-smoke.html +0 -105
  398. package/template/.codex/skills/data-analytics/tests/inline-widget-compare.html +0 -233
  399. package/template/.codex/skills/data-analytics/tests/mcp-server.test.mjs +0 -1500
  400. package/template/.codex/skills/data-analytics/tests/native-style-contract.test.mjs +0 -219
  401. package/template/.codex/skills/data-analytics/tests/recharts-config.test.mjs +0 -144
  402. package/template/.codex/skills/data-analytics/tests/recharts-renderer.test.mjs +0 -11
  403. package/template/.codex/skills/data-analytics/tests/rich-markdown.test.mjs +0 -54
  404. package/template/.codex/skills/data-analytics/tests/widget-render-harness.html +0 -321
  405. package/template/.codex/skills/data-analytics/tsconfig.json +0 -19
  406. package/template/.codex/skills/data-analytics/vite.config.ts +0 -46
  407. package/template/.codex/skills/grill-with-docs/SKILL.md +0 -20
  408. package/template/.codex/skills/grill-with-docs/agents/openai.yaml +0 -5
  409. package/template/.codex/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  410. package/template/.codex/skills/prototype/UI.md +0 -112
  411. package/template/.codex/skills/setup-matt-pocock-skills/domain.md +0 -37
  412. package/template/.codex/skills/to-questionnaire/SKILL.md +0 -55
  413. package/template/.codex/skills/to-questionnaire/agents/openai.yaml +0 -5
  414. package/template/.codex/skills/wait-what/SKILL.md +0 -7
  415. package/template/.codex/skills/wait-what/agents/openai.yaml +0 -5
  416. package/template/.cursor/skills/grill-with-docs/SKILL.md +0 -20
  417. package/template/.cursor/skills/grill-with-docs/agents/openai.yaml +0 -5
  418. package/template/.cursor/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  419. package/template/.cursor/skills/prototype/UI.md +0 -112
  420. package/template/.cursor/skills/setup-matt-pocock-skills/domain.md +0 -37
  421. package/template/.cursor/skills/to-questionnaire/SKILL.md +0 -55
  422. package/template/.cursor/skills/to-questionnaire/agents/openai.yaml +0 -5
  423. package/template/.cursor/skills/wait-what/SKILL.md +0 -7
  424. package/template/.cursor/skills/wait-what/agents/openai.yaml +0 -5
  425. package/template/.pi/skills/grill-with-docs/SKILL.md +0 -20
  426. package/template/.pi/skills/grill-with-docs/agents/openai.yaml +0 -5
  427. package/template/.pi/skills/improve-codebase-architecture/agents/openai.yaml +0 -5
  428. package/template/.pi/skills/prototype/UI.md +0 -112
  429. package/template/.pi/skills/setup-matt-pocock-skills/domain.md +0 -37
  430. package/template/.pi/skills/to-questionnaire/SKILL.md +0 -55
  431. package/template/.pi/skills/to-questionnaire/agents/openai.yaml +0 -5
  432. package/template/.pi/skills/wait-what/SKILL.md +0 -7
  433. package/template/.pi/skills/wait-what/agents/openai.yaml +0 -5
  434. package/template/.template-spec/agents/domain.md +0 -31
  435. /package/template/.agents/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  436. /package/template/.codex/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  437. /package/template/.cursor/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
  438. /package/template/.pi/skills/{improve-codebase-architecture → codebase-design/references}/HTML-REPORT.md +0 -0
@@ -1,1008 +0,0 @@
1
- import React, { StrictMode, useEffect, useLayoutEffect, useMemo, useState } from "react";
2
- import { createRoot } from "react-dom/client";
3
-
4
- import { connectMcpWidgetHost } from "./mcp-host.js";
5
- import AnalyticsApp from "./analytics-app/App";
6
- import "./styles/codex-theme.css";
7
- import "./analytics-app/tokens.css";
8
- import "./analytics-app/charting/chart-tokens.css";
9
- import "./analytics-app/styles.css";
10
-
11
- const CHART_WIDGET_RESOURCE_URI = "ui://widget/datascience-chart.html";
12
- const ARTIFACT_BLOCK_TYPES = new Set(["markdown", "metric-strip", "chart", "table", "html"]);
13
- let chartWidgetHtmlPromise = null;
14
-
15
- const artifactApp = connectMcpWidgetHost({
16
- name: "Data Analytics Artifact App",
17
- version: "0.1.8",
18
- availableDisplayModes: ["inline", "fullscreen"],
19
- initialDisplayMode: "fullscreen",
20
- });
21
-
22
- const fallbackPayload = {
23
- ok: true,
24
- widget_type: "artifact",
25
- surface: "report",
26
- manifest: {
27
- version: 1,
28
- surface: "report",
29
- title: "Core Business Metrics Trend Readout",
30
- description: "Fallback report payload for local widget development.",
31
- generatedAt: "2026-05-08T00:00:00Z",
32
- blocks: [
33
- {
34
- id: "summary_text",
35
- type: "markdown",
36
- layout: "full",
37
- body:
38
- "## Executive Summary\n\nThis fallback verifies that MCP artifact payloads render with the full report app shell.",
39
- },
40
- {
41
- id: "revenue_metrics",
42
- type: "metric-strip",
43
- layout: "full",
44
- cardIds: ["revenue_card"],
45
- },
46
- {
47
- id: "revenue_chart_block",
48
- type: "chart",
49
- layout: "full",
50
- chartId: "revenue_chart",
51
- },
52
- {
53
- id: "revenue_table_block",
54
- type: "table",
55
- layout: "full",
56
- tableId: "revenue_table",
57
- },
58
- ],
59
- cards: [
60
- {
61
- id: "revenue_card",
62
- dataset: "weekly_revenue",
63
- metrics: [
64
- { label: "Revenue", field: "revenue_m", format: "currency" },
65
- { label: "WoW", field: "wow", format: "percent", signed: true },
66
- ],
67
- },
68
- ],
69
- charts: [
70
- {
71
- id: "revenue_chart",
72
- title: "Revenue Trend",
73
- type: "line",
74
- dataset: "weekly_revenue_trend",
75
- sourceId: "snapshot",
76
- encodings: {
77
- x: { field: "week", type: "ordinal" },
78
- y: { field: "revenue_m", type: "quantitative", label: "Revenue", format: "currency" },
79
- color: { field: "series", type: "nominal" },
80
- },
81
- valueFormat: "currency",
82
- layout: "full",
83
- },
84
- ],
85
- tables: [
86
- {
87
- id: "revenue_table",
88
- title: "Revenue Segment Detail",
89
- dataset: "revenue_segment_detail",
90
- sourceId: "snapshot",
91
- columns: [
92
- { field: "reporting_week", label: "Reporting week" },
93
- { field: "segment", label: "Customer segment" },
94
- { field: "gross_revenue_m", label: "Gross revenue", format: "currency" },
95
- { field: "year_over_year_growth_rate", label: "Year-over-year growth rate", format: "percent" },
96
- { field: "estimated_pipeline_coverage_ratio", label: "Estimated pipeline coverage ratio" },
97
- { field: "customer_activation_rate", label: "Customer activation rate", format: "percent" },
98
- { field: "operating_margin_rate", label: "Operating margin rate", format: "percent" },
99
- ],
100
- },
101
- ],
102
- sources: [{ id: "snapshot", label: "Fallback snapshot", path: "data/snapshot.json" }],
103
- },
104
- snapshot: {
105
- version: 1,
106
- generatedAt: "2026-05-08T00:00:00Z",
107
- status: "fixture",
108
- datasets: {
109
- weekly_revenue: [
110
- { week: "Apr 27", revenue_m: 12, wow: "+8% w/w" },
111
- { week: "May 04", revenue_m: 18, wow: "+16% w/w" },
112
- ],
113
- weekly_revenue_trend: [
114
- { week: "Apr 27", series: "Actual", revenue_m: 12 },
115
- { week: "May 04", series: "Actual", revenue_m: 18 },
116
- { week: "Apr 27", series: "Target", revenue_m: 14 },
117
- { week: "May 04", series: "Target", revenue_m: 16 },
118
- ],
119
- revenue_segment_detail: [
120
- { reporting_week: "2026-04-27", segment: "Enterprise", gross_revenue_m: 8.2, year_over_year_growth_rate: 0.31, estimated_pipeline_coverage_ratio: "4.3x", customer_activation_rate: 0.67, operating_margin_rate: 0.42 },
121
- { reporting_week: "2026-05-04", segment: "Self-serve", gross_revenue_m: 9.8, year_over_year_growth_rate: 0.28, estimated_pipeline_coverage_ratio: "3.8x", customer_activation_rate: 0.61, operating_margin_rate: 0.39 },
122
- ],
123
- },
124
- },
125
- package_info: {
126
- manifestPath: "tool payload",
127
- root: "mcp://datascience-artifact",
128
- snapshotPath: "tool payload",
129
- },
130
- };
131
-
132
- const hostedEmptyPayload = {
133
- ok: false,
134
- widget_type: "artifact",
135
- surface: "report",
136
- manifest: {
137
- version: 1,
138
- surface: "report",
139
- title: "Data Analytics artifact",
140
- description: "Waiting for an artifact payload.",
141
- blocks: [
142
- {
143
- id: "empty_state",
144
- type: "markdown",
145
- layout: "full",
146
- body:
147
- "## Waiting for Data\n\nThis hosted artifact has not received a manifest and bounded snapshot yet.",
148
- },
149
- ],
150
- sources: [],
151
- },
152
- snapshot: {
153
- version: 1,
154
- status: "blocked",
155
- datasets: {},
156
- accessIssues: [
157
- {
158
- id: "missing_artifact_payload",
159
- message: "The hosted widget has not received a Data Analytics artifact payload yet.",
160
- },
161
- ],
162
- },
163
- sources: [],
164
- package_info: {
165
- manifestPath: "tool payload",
166
- root: "mcp://datascience-artifact",
167
- snapshotPath: "tool payload",
168
- },
169
- };
170
-
171
- function createMemoryStorage() {
172
- const values = new Map();
173
- return {
174
- get length() {
175
- return values.size;
176
- },
177
- clear() {
178
- values.clear();
179
- },
180
- getItem(key) {
181
- const normalizedKey = String(key);
182
- return values.has(normalizedKey) ? values.get(normalizedKey) : null;
183
- },
184
- key(index) {
185
- return Array.from(values.keys())[index] ?? null;
186
- },
187
- removeItem(key) {
188
- values.delete(String(key));
189
- },
190
- setItem(key, value) {
191
- values.set(String(key), String(value));
192
- },
193
- };
194
- }
195
-
196
- function storageWorks(storage) {
197
- if (!storage) return false;
198
- const key = "__datascience_artifact_storage_probe__";
199
- try {
200
- storage.setItem(key, "1");
201
- storage.removeItem(key);
202
- return true;
203
- } catch {
204
- return false;
205
- }
206
- }
207
-
208
- function installStorageFallback() {
209
- if (typeof window === "undefined") return;
210
- try {
211
- if (storageWorks(window.localStorage)) return;
212
- } catch {
213
- // Accessing localStorage can throw in sandboxed MCP iframes.
214
- }
215
-
216
- const storage = window.__datascienceArtifactMemoryStorage || createMemoryStorage();
217
- window.__datascienceArtifactMemoryStorage = storage;
218
- try {
219
- Object.defineProperty(window, "localStorage", {
220
- configurable: true,
221
- value: storage,
222
- });
223
- } catch {
224
- // If the host prevents overriding localStorage, the fallback is still
225
- // available for future wrapper code through __datascienceArtifactMemoryStorage.
226
- }
227
- }
228
-
229
- function isArtifactPayload(value) {
230
- return Boolean(
231
- value &&
232
- typeof value === "object" &&
233
- value.widget_type === "artifact" &&
234
- value.manifest &&
235
- value.snapshot,
236
- );
237
- }
238
-
239
- function decodePayload(raw) {
240
- if (typeof raw !== "string") return raw;
241
- try {
242
- return JSON.parse(raw);
243
- } catch {
244
- return null;
245
- }
246
- }
247
-
248
- function pickPayload(raw) {
249
- raw = decodePayload(raw);
250
- if (!raw || typeof raw !== "object") return null;
251
- if (Array.isArray(raw.content)) {
252
- for (const item of raw.content) {
253
- const found = pickPayload(item && (item.text || item));
254
- if (found) return found;
255
- }
256
- }
257
- if (isArtifactPayload(raw)) return raw;
258
- if (raw.structuredContent && typeof raw.structuredContent === "object") {
259
- return pickPayload(raw.structuredContent);
260
- }
261
- if (raw.payload && typeof raw.payload === "object") {
262
- return pickPayload(raw.payload);
263
- }
264
- if (raw.toolOutput && typeof raw.toolOutput === "object") {
265
- return pickPayload(raw.toolOutput);
266
- }
267
- if (raw.toolResponseMetadata && typeof raw.toolResponseMetadata === "object") {
268
- return pickPayload(raw.toolResponseMetadata);
269
- }
270
- if (raw.detail && typeof raw.detail === "object") return pickPayload(raw.detail);
271
- if (raw.globals && typeof raw.globals === "object") return pickPayload(raw.globals);
272
- return null;
273
- }
274
-
275
- function isPlainObject(value) {
276
- return Boolean(value && typeof value === "object" && !Array.isArray(value));
277
- }
278
-
279
- function hasOwn(value, key) {
280
- return isPlainObject(value) && Object.prototype.hasOwnProperty.call(value, key);
281
- }
282
-
283
- function validateDatasetRows(rows, path, issues) {
284
- if (!Array.isArray(rows)) {
285
- issues.push(`${path} must be an array of row objects.`);
286
- return [];
287
- }
288
- rows.forEach((row, index) => {
289
- if (!isPlainObject(row)) {
290
- issues.push(`${path}[${index}] must be an object.`);
291
- }
292
- });
293
- return rows.filter(isPlainObject);
294
- }
295
-
296
- function validateFieldReference(rows, field, path, issues) {
297
- if (typeof field !== "string" || !field.trim()) {
298
- issues.push(`${path} must be a non-empty field name.`);
299
- return;
300
- }
301
- if (!rows.length) return;
302
- if (!rows.some((row) => hasOwn(row, field))) {
303
- issues.push(`${path} references "${field}", but no sampled row contains that field.`);
304
- }
305
- }
306
-
307
- function chartEncoding(chart, role) {
308
- return isPlainObject(chart.encodings) && isPlainObject(chart.encodings[role]) ? chart.encodings[role] : {};
309
- }
310
-
311
- function chartEncodingField(chart, role) {
312
- const field = chartEncoding(chart, role).field;
313
- return typeof field === "string" && field.trim() ? field : null;
314
- }
315
-
316
- function chartEncodingFields(chart, role) {
317
- const fields = chartEncoding(chart, role).fields;
318
- return Array.isArray(fields) ? fields.filter((field) => typeof field === "string" && field.trim()) : [];
319
- }
320
-
321
- function hasChartEncodingSpec(chart) {
322
- return Boolean(
323
- isPlainObject(chart.encodings) &&
324
- chartEncodingField(chart, "x") &&
325
- (chartEncodingField(chart, "y") || chartEncodingFields(chart, "y").length),
326
- );
327
- }
328
-
329
- function validateEncodedChartFields(rows, chart, path, issues) {
330
- if (chart.xField != null) {
331
- issues.push(`${path}.xField is not supported for artifact charts; use encodings.`);
332
- }
333
- if (chart.series != null) {
334
- issues.push(`${path}.series is not supported for artifact charts; use encodings.`);
335
- }
336
- if (!hasChartEncodingSpec(chart)) {
337
- issues.push(`${path}.encodings must declare x and y fields before rendering.`);
338
- return;
339
- }
340
- validateFieldReference(rows, chartEncodingField(chart, "x"), `${path}.encodings.x.field`, issues);
341
- const yField = chartEncodingField(chart, "y");
342
- if (yField) validateFieldReference(rows, yField, `${path}.encodings.y.field`, issues);
343
- chartEncodingFields(chart, "y").forEach((field, fieldIndex) => {
344
- validateFieldReference(rows, field, `${path}.encodings.y.fields[${fieldIndex}]`, issues);
345
- });
346
- ["color", "size", "facet", "label"].forEach((role) => {
347
- const field = chartEncodingField(chart, role);
348
- if (field) validateFieldReference(rows, field, `${path}.encodings.${role}.field`, issues);
349
- });
350
- }
351
-
352
- function validateArtifactPayload(payload) {
353
- const issues = [];
354
- if (!isPlainObject(payload)) {
355
- return ["Artifact payload must be an object."];
356
- }
357
-
358
- const manifest = payload.manifest;
359
- const snapshot = payload.snapshot;
360
- if (!isPlainObject(manifest)) issues.push("manifest must be an object.");
361
- if (!isPlainObject(snapshot)) issues.push("snapshot must be an object.");
362
- if (!isPlainObject(manifest) || !isPlainObject(snapshot)) return issues;
363
- if (typeof manifest.title !== "string" || !manifest.title.trim()) {
364
- issues.push("manifest.title is required for artifact rendering.");
365
- }
366
-
367
- const datasets = snapshot.datasets;
368
- if (!isPlainObject(datasets)) {
369
- issues.push("snapshot.datasets must be an object keyed by dataset id.");
370
- }
371
- const datasetRows = new Map();
372
- if (isPlainObject(datasets)) {
373
- Object.entries(datasets).forEach(([datasetId, rows]) => {
374
- datasetRows.set(datasetId, validateDatasetRows(rows, `snapshot.datasets.${datasetId}`, issues));
375
- });
376
- }
377
-
378
- const blocks = manifest.blocks;
379
- if (!Array.isArray(blocks)) issues.push("manifest.blocks must be an array.");
380
-
381
- if (Array.isArray(blocks)) {
382
- blocks.forEach((block, index) => {
383
- if (!isPlainObject(block)) {
384
- issues.push(`manifest.blocks[${index}] must be an object.`);
385
- return;
386
- }
387
- if (typeof block.id !== "string" || !block.id.trim()) {
388
- issues.push(`manifest.blocks[${index}].id must be a non-empty string.`);
389
- }
390
- if (typeof block.type !== "string" || !block.type.trim()) {
391
- issues.push(`manifest.blocks[${index}].type must be a non-empty string.`);
392
- } else if (!ARTIFACT_BLOCK_TYPES.has(block.type)) {
393
- issues.push(`manifest.blocks[${index}].type is not supported.`);
394
- }
395
- if (block.type === "markdown" && (typeof block.body !== "string" || !block.body.trim())) {
396
- issues.push(`manifest.blocks[${index}].body must be a non-empty Markdown string.`);
397
- }
398
- if (block.type === "html" && (typeof block.body !== "string" || !block.body.trim())) {
399
- issues.push(`manifest.blocks[${index}].body must be a non-empty HTML string.`);
400
- }
401
- });
402
- }
403
-
404
- const charts = Array.isArray(manifest.charts) ? manifest.charts : [];
405
- const chartIds = new Set();
406
- if (manifest.charts != null && !Array.isArray(manifest.charts)) {
407
- issues.push("manifest.charts must be an array when provided.");
408
- }
409
- charts.forEach((chart, index) => {
410
- const path = `manifest.charts[${index}]`;
411
- if (!isPlainObject(chart)) {
412
- issues.push(`${path} must be an object.`);
413
- return;
414
- }
415
- if (typeof chart.id !== "string" || !chart.id.trim()) {
416
- issues.push(`${path}.id must be a non-empty string.`);
417
- } else {
418
- chartIds.add(chart.id);
419
- }
420
- if (typeof chart.dataset !== "string" || !chart.dataset.trim()) {
421
- issues.push(`${path}.dataset must be a non-empty string.`);
422
- return;
423
- }
424
- const rows = datasetRows.get(chart.dataset);
425
- if (!rows) {
426
- issues.push(`${path}.dataset references missing dataset "${chart.dataset}".`);
427
- return;
428
- }
429
- validateEncodedChartFields(rows, chart, path, issues);
430
- });
431
-
432
- const cards = Array.isArray(manifest.cards) ? manifest.cards : [];
433
- const cardIds = new Set();
434
- if (manifest.cards != null && !Array.isArray(manifest.cards)) {
435
- issues.push("manifest.cards must be an array when provided.");
436
- }
437
- cards.forEach((card, index) => {
438
- const path = `manifest.cards[${index}]`;
439
- if (!isPlainObject(card)) {
440
- issues.push(`${path} must be an object.`);
441
- return;
442
- }
443
- if (typeof card.id !== "string" || !card.id.trim()) {
444
- issues.push(`${path}.id must be a non-empty string.`);
445
- } else {
446
- cardIds.add(card.id);
447
- }
448
- if (typeof card.dataset !== "string" || !card.dataset.trim()) {
449
- issues.push(`${path}.dataset must be a non-empty string.`);
450
- return;
451
- }
452
- const rows = datasetRows.get(card.dataset);
453
- if (!rows) {
454
- issues.push(`${path}.dataset references missing dataset "${card.dataset}".`);
455
- return;
456
- }
457
- ["valueField", "format", "label", "title", "indicators", "deltaField", "deltaLabel"].forEach((removedField) => {
458
- if (hasOwn(card, removedField)) {
459
- issues.push(`${path}.${removedField} is not supported; use metrics[].`);
460
- }
461
- });
462
- if (!Array.isArray(card.metrics) || !card.metrics.length) {
463
- issues.push(`${path}.metrics must contain at least one metric.`);
464
- }
465
- const metrics = Array.isArray(card.metrics) ? card.metrics : [];
466
- metrics.forEach((metric, metricIndex) => {
467
- const metricPath = `${path}.metrics[${metricIndex}]`;
468
- if (!isPlainObject(metric)) {
469
- issues.push(`${metricPath} must be an object.`);
470
- return;
471
- }
472
- if (typeof metric.label !== "string" || !metric.label.trim()) {
473
- issues.push(`${metricPath}.label must be a non-empty string.`);
474
- }
475
- validateFieldReference(rows, metric.field, `${metricPath}.field`, issues);
476
- if (metric.format != null && typeof metric.format !== "string") {
477
- issues.push(`${metricPath}.format must be a string when provided.`);
478
- }
479
- if (metric.signed != null && typeof metric.signed !== "boolean") {
480
- issues.push(`${metricPath}.signed must be a boolean when provided.`);
481
- }
482
- if (hasOwn(metric, "movement")) {
483
- issues.push(`${metricPath}.movement is not supported; use signed.`);
484
- }
485
- });
486
- });
487
-
488
- const tables = Array.isArray(manifest.tables) ? manifest.tables : [];
489
- const tableIds = new Set();
490
- if (manifest.tables != null && !Array.isArray(manifest.tables)) {
491
- issues.push("manifest.tables must be an array when provided.");
492
- }
493
- tables.forEach((table, index) => {
494
- const path = `manifest.tables[${index}]`;
495
- if (!isPlainObject(table)) {
496
- issues.push(`${path} must be an object.`);
497
- return;
498
- }
499
- if (typeof table.id !== "string" || !table.id.trim()) {
500
- issues.push(`${path}.id must be a non-empty string.`);
501
- } else {
502
- tableIds.add(table.id);
503
- }
504
- if (typeof table.dataset !== "string" || !table.dataset.trim()) {
505
- issues.push(`${path}.dataset must be a non-empty string.`);
506
- return;
507
- }
508
- const rows = datasetRows.get(table.dataset);
509
- if (!rows) {
510
- issues.push(`${path}.dataset references missing dataset "${table.dataset}".`);
511
- return;
512
- }
513
- if (!Array.isArray(table.columns) || !table.columns.length) {
514
- issues.push(`${path}.columns must be a non-empty array.`);
515
- return;
516
- }
517
- table.columns.forEach((column, columnIndex) => {
518
- if (!isPlainObject(column)) {
519
- issues.push(`${path}.columns[${columnIndex}] must be an object.`);
520
- return;
521
- }
522
- validateFieldReference(rows, column.field, `${path}.columns[${columnIndex}].field`, issues);
523
- });
524
- });
525
-
526
- if (Array.isArray(blocks)) {
527
- blocks.forEach((block, index) => {
528
- if (!isPlainObject(block)) return;
529
- if (block.type === "chart" && !chartIds.has(block.chartId)) {
530
- issues.push(`manifest.blocks[${index}].chartId references a missing chart.`);
531
- }
532
- if (block.type === "metric-strip") {
533
- if (!Array.isArray(block.cardIds) || !block.cardIds.length) {
534
- issues.push(`manifest.blocks[${index}].cardIds must reference at least one metric card.`);
535
- } else {
536
- block.cardIds.forEach((cardId, cardIndex) => {
537
- if (!cardIds.has(cardId)) {
538
- issues.push(`manifest.blocks[${index}].cardIds[${cardIndex}] references a missing metric card.`);
539
- }
540
- });
541
- }
542
- }
543
- if (block.type === "table" && !tableIds.has(block.tableId)) {
544
- issues.push(`manifest.blocks[${index}].tableId references a missing table.`);
545
- }
546
- });
547
- }
548
-
549
- return issues;
550
- }
551
-
552
- function InvalidArtifactPayload({ issues, surface }) {
553
- const visibleIssues = Array.isArray(issues) ? issues.slice(0, 8) : [];
554
- const issueCount = Array.isArray(issues) ? issues.length : visibleIssues.length;
555
- const artifactLabel =
556
- surface === "dashboard" || surface === "report" ? surface : "artifact";
557
- return (
558
- <main
559
- style={{
560
- background: "#fff",
561
- color: "#111827",
562
- fontFamily: "Inter, system-ui, sans-serif",
563
- minHeight: "100vh",
564
- padding: 24,
565
- }}
566
- >
567
- <section
568
- style={{
569
- border: "1px solid #e5e7eb",
570
- borderRadius: 12,
571
- maxWidth: 760,
572
- padding: 20,
573
- }}
574
- >
575
- <h1 style={{ fontSize: 18, lineHeight: "24px", margin: "0 0 8px" }}>
576
- Artifact validation failed
577
- </h1>
578
- <p style={{ color: "#4b5563", fontSize: 14, lineHeight: "20px", margin: "0 0 16px" }}>
579
- The {artifactLabel} was blocked before rendering because its manifest or snapshot does not match
580
- the Data Analytics artifact contract.
581
- </p>
582
- <ul style={{ color: "#374151", fontSize: 13, lineHeight: "20px", margin: 0, paddingLeft: 20 }}>
583
- {visibleIssues.map((issue, index) => (
584
- <li key={`${issue}-${index}`}>{issue}</li>
585
- ))}
586
- </ul>
587
- {issueCount > visibleIssues.length ? (
588
- <p style={{ color: "#6b7280", fontSize: 12, margin: "12px 0 0" }}>
589
- {issueCount - visibleIssues.length} more validation issue
590
- {issueCount - visibleIssues.length === 1 ? "" : "s"} hidden.
591
- </p>
592
- ) : null}
593
- </section>
594
- </main>
595
- );
596
- }
597
-
598
- function currentHostPayload() {
599
- if (typeof window === "undefined") return null;
600
- return (
601
- pickPayload(window.openai?.toolOutput) ||
602
- pickPayload(window.openai?.toolResponseMetadata) ||
603
- pickPayload(window.openai)
604
- );
605
- }
606
-
607
- function fallbackForEnvironment() {
608
- if (typeof window !== "undefined" && window.openai) return hostedEmptyPayload;
609
- return fallbackPayload;
610
- }
611
-
612
- function artifactIdentity(payload) {
613
- const manifest = payload?.manifest || {};
614
- const snapshot = payload?.snapshot || {};
615
- return [
616
- manifest.title || "artifact",
617
- manifest.generatedAt || "",
618
- snapshot.generatedAt || "",
619
- payload?.surface || manifest.surface || "artifact",
620
- ].join(":");
621
- }
622
-
623
- function jsonResponse(body, init = {}) {
624
- return new Response(JSON.stringify(body), {
625
- status: init.status || 200,
626
- headers: {
627
- "content-type": "application/json; charset=utf-8",
628
- ...(init.headers || {}),
629
- },
630
- });
631
- }
632
-
633
- function textResponse(body, init = {}) {
634
- return new Response(String(body ?? ""), {
635
- status: init.status || 200,
636
- headers: {
637
- "content-type": "text/plain; charset=utf-8",
638
- ...(init.headers || {}),
639
- },
640
- });
641
- }
642
-
643
- function htmlResponse(body, init = {}) {
644
- return new Response(String(body ?? ""), {
645
- status: init.status || 200,
646
- headers: {
647
- "content-type": "text/html; charset=utf-8",
648
- ...(init.headers || {}),
649
- },
650
- });
651
- }
652
-
653
- function readChartWidgetHtml() {
654
- if (!chartWidgetHtmlPromise) {
655
- chartWidgetHtmlPromise = (async () => {
656
- await artifactApp.ready;
657
- const resource = await artifactApp.readServerResource({
658
- uri: CHART_WIDGET_RESOURCE_URI,
659
- });
660
- const content = Array.isArray(resource?.contents)
661
- ? resource.contents.find((entry) => typeof entry?.text === "string")
662
- : null;
663
- if (!content?.text) {
664
- throw new Error("The shared chart detail resource did not include HTML.");
665
- }
666
- return content.text;
667
- })();
668
- }
669
- return chartWidgetHtmlPromise;
670
- }
671
-
672
- function sourceTextForPath(payload, sourcePath) {
673
- const manifestSources = Array.isArray(payload?.manifest?.sources)
674
- ? payload.manifest.sources
675
- : [];
676
- const inlineSources = Array.isArray(payload?.sources) ? payload.sources : [];
677
- const declared = [...manifestSources, ...inlineSources].find((source) => {
678
- if (!source || typeof source !== "object") return false;
679
- return source.path === sourcePath || source.id === sourcePath || source.href === sourcePath;
680
- });
681
- if (typeof declared?.query?.sql === "string") return declared.query.sql;
682
- return null;
683
- }
684
-
685
- function installMcpFetchShim(payload) {
686
- window.__datascienceArtifactPayload = payload;
687
- if (window.__datascienceArtifactFetchShimInstalled) return;
688
-
689
- const nativeFetch = window.fetch.bind(window);
690
- window.__datascienceArtifactFetchShimInstalled = true;
691
- window.fetch = async (input, init) => {
692
- const requestUrl = typeof input === "string" ? input : input?.url;
693
- const url = new URL(requestUrl || "", window.location.origin);
694
- const currentPayload = window.__datascienceArtifactPayload || fallbackForEnvironment();
695
-
696
- if (url.origin === window.location.origin && url.pathname === "/api/manifest") {
697
- return jsonResponse(currentPayload.manifest || {});
698
- }
699
- if (url.origin === window.location.origin && url.pathname === "/api/snapshot") {
700
- return jsonResponse(currentPayload.snapshot || {});
701
- }
702
- if (url.origin === window.location.origin && url.pathname === "/api/package") {
703
- return jsonResponse(
704
- currentPayload.package_info ||
705
- currentPayload.packageInfo || {
706
- manifestPath: "tool payload",
707
- root: "mcp://datascience-artifact",
708
- snapshotPath: "tool payload",
709
- },
710
- );
711
- }
712
- if (url.origin === window.location.origin && url.pathname === "/api/inline-chart-widget") {
713
- try {
714
- return htmlResponse(await readChartWidgetHtml());
715
- } catch (error) {
716
- return textResponse(error instanceof Error ? error.message : "Inline chart widget asset is unavailable.", {
717
- status: 503,
718
- });
719
- }
720
- }
721
- if (
722
- url.origin === window.location.origin &&
723
- (url.pathname === "/api/source-file" || url.pathname === "/api/source")
724
- ) {
725
- const sourcePath = url.searchParams.get("path") || "";
726
- const text = sourceTextForPath(currentPayload, sourcePath);
727
- if (text != null) return textResponse(text);
728
- return textResponse("Source text was not included in this hosted artifact.", {
729
- status: 404,
730
- });
731
- }
732
-
733
- return nativeFetch(input, init);
734
- };
735
- }
736
-
737
- function displayModeFromPayload(payload) {
738
- return (
739
- normalizeDisplayMode(
740
- payload?.displayMode ||
741
- payload?.display_mode ||
742
- payload?.manifest?.displayMode ||
743
- payload?.manifest?.display_mode,
744
- ) || "inline"
745
- );
746
- }
747
-
748
- function normalizeDisplayMode(mode) {
749
- return mode === "inline" || mode === "fullscreen" || mode === "pip" ? mode : "";
750
- }
751
-
752
- function readUrlDisplayMode() {
753
- if (typeof window === "undefined") return "";
754
- try {
755
- const params = new URLSearchParams(window.location.search);
756
- const hashParams = new URLSearchParams(window.location.hash.replace(/^#/, ""));
757
- const raw = (
758
- params.get("displayMode") ||
759
- params.get("display_mode") ||
760
- params.get("preview") ||
761
- hashParams.get("displayMode") ||
762
- hashParams.get("display_mode") ||
763
- hashParams.get("preview") ||
764
- ""
765
- ).toLowerCase();
766
- if (raw === "fullscreen" || raw === "full" || raw === "expanded") return "fullscreen";
767
- if (raw === "inline" || raw === "compact") return "inline";
768
- } catch {
769
- // Ignore malformed URLs from host previews.
770
- }
771
- return "";
772
- }
773
-
774
- function pickDisplayMode(raw) {
775
- const value = decodePayload(raw);
776
- if (!value || typeof value !== "object") return "";
777
- if (value.type === "datascience-chart-widget-display-mode") return "";
778
- return normalizeDisplayMode(
779
- value.displayMode ||
780
- value.display_mode ||
781
- value.mode ||
782
- value.view?.displayMode ||
783
- value.hostContext?.displayMode ||
784
- value.host?.displayMode ||
785
- value.globals?.displayMode ||
786
- value.globals?.view?.displayMode ||
787
- value.globals?.hostContext?.displayMode,
788
- );
789
- }
790
-
791
- function currentHostDisplayMode() {
792
- if (typeof window === "undefined") return "inline";
793
- const hostApi = window.openai || {};
794
- return (
795
- readUrlDisplayMode() ||
796
- normalizeDisplayMode(
797
- hostApi.displayMode ||
798
- hostApi.view?.displayMode ||
799
- hostApi.hostContext?.displayMode ||
800
- hostApi.host?.displayMode,
801
- ) ||
802
- "inline"
803
- );
804
- }
805
-
806
- function hostSupportsDisplayMode() {
807
- if (typeof window === "undefined") return false;
808
- const hostApi = window.openai || {};
809
- const availableDisplayModes =
810
- hostApi.availableDisplayModes ||
811
- hostApi.hostContext?.availableDisplayModes ||
812
- hostApi.view?.availableDisplayModes;
813
- if (Array.isArray(availableDisplayModes) && availableDisplayModes.includes("fullscreen")) {
814
- return true;
815
- }
816
- return Boolean(window.openai) || typeof hostApi.requestDisplayMode === "function";
817
- }
818
-
819
- function applyDocumentDisplayMode(mode) {
820
- if (typeof document === "undefined") return;
821
- const normalized = normalizeDisplayMode(mode) || "inline";
822
- document.documentElement.dataset.displayMode = normalized;
823
- document.body.dataset.displayMode = normalized;
824
- }
825
-
826
- function useHostPayload() {
827
- const [payload, setPayload] = useState(() => currentHostPayload() || fallbackForEnvironment());
828
-
829
- useEffect(() => {
830
- function apply(raw) {
831
- const next = pickPayload(raw);
832
- if (next) setPayload(next);
833
- }
834
- function handleMessage(event) {
835
- apply(event.data);
836
- }
837
- function handleToolResult(event) {
838
- apply(event.detail);
839
- }
840
- function handleGlobals(event) {
841
- apply(event.detail?.globals);
842
- }
843
-
844
- apply(currentHostPayload());
845
- window.addEventListener("message", handleMessage);
846
- window.addEventListener("datascience-widget-tool-result", handleToolResult);
847
- window.addEventListener("openai:set_globals", handleGlobals);
848
- return () => {
849
- window.removeEventListener("message", handleMessage);
850
- window.removeEventListener("datascience-widget-tool-result", handleToolResult);
851
- window.removeEventListener("openai:set_globals", handleGlobals);
852
- };
853
- }, []);
854
-
855
- return payload;
856
- }
857
-
858
- function useHostDisplayMode() {
859
- const [displayMode, setDisplayMode] = useState(() => currentHostDisplayMode());
860
-
861
- useEffect(() => {
862
- function apply(raw) {
863
- const next = pickDisplayMode(raw);
864
- if (next) setDisplayMode(next);
865
- }
866
- function handleMessage(event) {
867
- apply(event.data);
868
- }
869
- function handleGlobals(event) {
870
- apply(event.detail?.globals || event.detail);
871
- }
872
-
873
- setDisplayMode(currentHostDisplayMode());
874
- applyDocumentDisplayMode(currentHostDisplayMode());
875
- window.addEventListener("message", handleMessage);
876
- window.addEventListener("openai:set_globals", handleGlobals);
877
- return () => {
878
- window.removeEventListener("message", handleMessage);
879
- window.removeEventListener("openai:set_globals", handleGlobals);
880
- };
881
- }, []);
882
-
883
- useEffect(() => {
884
- applyDocumentDisplayMode(displayMode);
885
- }, [displayMode]);
886
-
887
- return { displayMode, setDisplayMode };
888
- }
889
-
890
- async function requestArtifactDisplayMode(mode, setDisplayMode) {
891
- const requestDisplayMode = window.openai?.requestDisplayMode;
892
- if (typeof requestDisplayMode !== "function") return { mode: currentHostDisplayMode() };
893
-
894
- try {
895
- const result = await Promise.resolve(requestDisplayMode({ mode }));
896
- const resultMode = normalizeDisplayMode(result?.mode || result?.displayMode);
897
- if (resultMode) {
898
- setDisplayMode(resultMode);
899
- applyDocumentDisplayMode(resultMode);
900
- return result;
901
- }
902
- } catch {
903
- const currentMode = currentHostDisplayMode();
904
- setDisplayMode(currentMode);
905
- applyDocumentDisplayMode(currentMode);
906
- }
907
- return { mode: currentHostDisplayMode() };
908
- }
909
-
910
- function ArtifactApp() {
911
- const payload = useHostPayload();
912
- const surface = payload?.surface || payload?.manifest?.surface;
913
- const identity = useMemo(() => artifactIdentity(payload), [payload]);
914
- const validationIssues = useMemo(() => validateArtifactPayload(payload), [identity, payload]);
915
- const { displayMode, setDisplayMode } = useHostDisplayMode();
916
- const requestedDisplayMode = useMemo(() => displayModeFromPayload(payload), [identity, payload]);
917
- const hasFullscreenArtifactSurface = surface === "report" || surface === "dashboard";
918
- const canRequestFullscreen =
919
- hasFullscreenArtifactSurface && hostSupportsDisplayMode() && displayMode !== "fullscreen";
920
- const requestFullscreen = canRequestFullscreen
921
- ? () => {
922
- void requestArtifactDisplayMode("fullscreen", setDisplayMode);
923
- }
924
- : undefined;
925
-
926
- useLayoutEffect(() => {
927
- installMcpFetchShim(payload);
928
- }, [payload]);
929
-
930
- useEffect(() => {
931
- const mode = requestedDisplayMode;
932
- if (mode === "inline") return;
933
- const requestDisplayMode = window.openai?.requestDisplayMode;
934
- if (typeof requestDisplayMode !== "function") return;
935
- try {
936
- void Promise.resolve(requestDisplayMode({ mode }))
937
- .then((result) => {
938
- const resultMode = normalizeDisplayMode(result?.mode || result?.displayMode);
939
- if (resultMode) {
940
- setDisplayMode(resultMode);
941
- applyDocumentDisplayMode(resultMode);
942
- }
943
- })
944
- .catch(() => {
945
- // Hosts may decline fullscreen/pip; the compact artifact launcher remains inline.
946
- });
947
- } catch {
948
- // Some hosts expose requestDisplayMode as a fire-and-forget function.
949
- }
950
- }, [identity, requestedDisplayMode, setDisplayMode]);
951
-
952
- if (validationIssues.length) {
953
- return <InvalidArtifactPayload issues={validationIssues} surface={surface} />;
954
- }
955
-
956
- return (
957
- <ArtifactErrorBoundary surface={surface}>
958
- <div className="datascience-artifact-shell" data-display-mode={displayMode}>
959
- <AnalyticsApp
960
- key={identity}
961
- displayMode={displayMode === "fullscreen" ? "fullscreen" : "inline"}
962
- onRequestFullscreen={requestFullscreen}
963
- />
964
- </div>
965
- </ArtifactErrorBoundary>
966
- );
967
- }
968
-
969
- class ArtifactErrorBoundary extends React.Component {
970
- constructor(props) {
971
- super(props);
972
- this.state = { error: null };
973
- }
974
-
975
- static getDerivedStateFromError(error) {
976
- return { error };
977
- }
978
-
979
- render() {
980
- if (this.state.error) {
981
- const message =
982
- this.state.error instanceof Error ? this.state.error.message : String(this.state.error);
983
- return (
984
- <InvalidArtifactPayload
985
- issues={[`Unexpected render failure: ${message}`]}
986
- surface={this.props.surface}
987
- />
988
- );
989
- }
990
- return this.props.children;
991
- }
992
- }
993
-
994
- const root = document.getElementById("root");
995
-
996
- if (!root) {
997
- throw new Error("Missing root element");
998
- }
999
-
1000
- installStorageFallback();
1001
-
1002
- createRoot(root).render(
1003
- <StrictMode>
1004
- <ArtifactErrorBoundary>
1005
- <ArtifactApp />
1006
- </ArtifactErrorBoundary>
1007
- </StrictMode>,
1008
- );