m0saic 0.2.1 → 0.3.0

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 (292) hide show
  1. package/LICENSE +22 -7
  2. package/README.md +23 -5
  3. package/dist/browseE2e.js +1 -1
  4. package/dist/connectionsFromEnv.js +1 -1
  5. package/dist/e2eTemplateVariants.js +1 -1
  6. package/dist/frontDoor.js +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/inlineDsl.js +1 -1
  9. package/dist/mcp/bridgeClient.js +1 -0
  10. package/dist/mcp/server.js +1 -0
  11. package/dist/mcp/tools.js +1 -0
  12. package/dist/mosaicxRunner.js +1 -1
  13. package/dist/outputPattern.js +1 -1
  14. package/dist/showcaseFeed.js +1 -1
  15. package/dist/templateDoctor.js +1 -1
  16. package/dist/utils/checkFeasibility.js +1 -1
  17. package/dist/utils/collectRenderErrors.js +1 -1
  18. package/dist/utils/enrichImageAlphaFromDoc.js +1 -1
  19. package/dist/utils/ensureFfmpeg.js +1 -1
  20. package/dist/utils/extractLayoutMeta.js +1 -1
  21. package/dist/utils/failureHints.js +1 -1
  22. package/dist/utils/ffmpegProbe.js +1 -1
  23. package/dist/utils/formatM0saicForCli.js +1 -1
  24. package/dist/utils/hashFile.js +1 -1
  25. package/dist/utils/helpGroups.js +1 -1
  26. package/dist/utils/installContext.js +1 -0
  27. package/dist/utils/invocation.js +1 -1
  28. package/dist/utils/licenseActivation.js +1 -0
  29. package/dist/utils/licenseActivationWorker.js +1 -0
  30. package/dist/utils/mosaicSpinner.js +1 -1
  31. package/dist/utils/parseDimensions.js +1 -1
  32. package/dist/utils/pathInfo.js +1 -1
  33. package/dist/utils/readJsonArg.js +1 -1
  34. package/dist/utils/renderOutcome.js +1 -1
  35. package/dist/utils/renderReport.js +1 -1
  36. package/dist/utils/renderSignals.js +1 -1
  37. package/dist/utils/renderWorkspace.js +1 -1
  38. package/dist/utils/reportOutputFormat.js +1 -0
  39. package/dist/utils/setupFfmpeg.js +1 -1
  40. package/dist/utils/telemetry.js +1 -1
  41. package/dist/utils/telemetryFlushWorker.js +1 -1
  42. package/dist/utils/telemetryUpstream.js +1 -1
  43. package/dist/utils/telemetryUsage.js +1 -1
  44. package/dist/utils/toolchainConfig.js +1 -1
  45. package/dist/utils/tutorialDuration.js +1 -1
  46. package/dist/utils/updateCheck.js +1 -1
  47. package/dist/utils/updateCheckWorker.js +1 -1
  48. package/dist/utils/validateSourceCounts.js +1 -1
  49. package/dist/utils/versions.js +1 -1
  50. package/dist/webCustomizeLink.js +1 -1
  51. package/node_modules/@m0saic/community-m/NOTICE +9 -0
  52. package/node_modules/@m0saic/community-m/release.json +2 -2
  53. package/node_modules/@m0saic/core/dist/core/buildChildMosaicSource.js +1 -1
  54. package/node_modules/@m0saic/core/dist/core/buildChunkCommands.js +1 -1
  55. package/node_modules/@m0saic/core/dist/core/buildEncodeCommands.js +1 -1
  56. package/node_modules/@m0saic/core/dist/core/buildLavfiSource.js +1 -1
  57. package/node_modules/@m0saic/core/dist/core/buildMediaSource.js +1 -1
  58. package/node_modules/@m0saic/core/dist/core/buildMosaicNode.js +1 -1
  59. package/node_modules/@m0saic/core/dist/core/buildMosaicPlanFromFile.js +1 -1
  60. package/node_modules/@m0saic/core/dist/core/buildSvgTextSource.js +1 -1
  61. package/node_modules/@m0saic/core/dist/core/buildTextRenderCommand.js +1 -1
  62. package/node_modules/@m0saic/core/dist/core/collectRefTargets.js +1 -1
  63. package/node_modules/@m0saic/core/dist/core/index.js +1 -1
  64. package/node_modules/@m0saic/core/dist/core/maskCacheDir.js +1 -1
  65. package/node_modules/@m0saic/core/dist/core/maskWorkerBridge.js +1 -1
  66. package/node_modules/@m0saic/core/dist/core/playbackPlaySpeed.js +1 -1
  67. package/node_modules/@m0saic/core/dist/core/prepareProps.js +1 -1
  68. package/node_modules/@m0saic/core/dist/core/primaryOutput.js +1 -1
  69. package/node_modules/@m0saic/core/dist/core/rasterizeMaskPng.js +1 -1
  70. package/node_modules/@m0saic/core/dist/core/rasterizeSvgMediaPng.js +1 -1
  71. package/node_modules/@m0saic/core/dist/core/refTargetTap.js +1 -1
  72. package/node_modules/@m0saic/core/dist/core/resolveMasks.js +1 -1
  73. package/node_modules/@m0saic/core/dist/core/resolveMasksSync.js +1 -1
  74. package/node_modules/@m0saic/core/dist/core/resolveStrokeRingsSync.js +1 -1
  75. package/node_modules/@m0saic/core/dist/core/roundedRectMask.js +1 -1
  76. package/node_modules/@m0saic/core/dist/core/strokeRing.js +1 -1
  77. package/node_modules/@m0saic/core/dist/core/svgRaster.js +1 -1
  78. package/node_modules/@m0saic/core/dist/defaults.js +1 -1
  79. package/node_modules/@m0saic/core/dist/ffmpeg/backgroundImageInput.js +1 -1
  80. package/node_modules/@m0saic/core/dist/ffmpeg/bufferGuard.js +1 -1
  81. package/node_modules/@m0saic/core/dist/ffmpeg/ffmpegCommands.js +1 -1
  82. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBackdropBlur.js +1 -1
  83. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBlur.js +1 -1
  84. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBorderRadius.js +1 -1
  85. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyCamera.js +1 -1
  86. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyChromaKey.js +1 -1
  87. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyFade.js +1 -1
  88. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyGrade.js +1 -1
  89. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyMask.js +1 -1
  90. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyNoise.js +1 -1
  91. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyPixelize.js +1 -1
  92. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyRotate.js +1 -1
  93. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyStroke.js +1 -1
  94. package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyTileEffects.js +1 -1
  95. package/node_modules/@m0saic/core/dist/ffmpeg/filters/coverCrop.js +1 -1
  96. package/node_modules/@m0saic/core/dist/ffmpeg/filters/index.js +1 -1
  97. package/node_modules/@m0saic/core/dist/ffmpeg/filters/sourceRectCrop.js +1 -1
  98. package/node_modules/@m0saic/core/dist/ffmpeg/gridLowering.js +1 -1
  99. package/node_modules/@m0saic/core/dist/ffmpeg/index.js +1 -1
  100. package/node_modules/@m0saic/core/dist/ffmpeg/splitAvMux.js +1 -1
  101. package/node_modules/@m0saic/core/dist/ffmpeg/threadGuard.js +1 -1
  102. package/node_modules/@m0saic/core/dist/flatten/index.js +1 -1
  103. package/node_modules/@m0saic/core/dist/fs/index.js +1 -1
  104. package/node_modules/@m0saic/core/dist/fs/tempWorkspace.js +1 -1
  105. package/node_modules/@m0saic/core/dist/index.js +1 -1
  106. package/node_modules/@m0saic/core/dist/media/buildAssetManifestFromInputs.js +1 -1
  107. package/node_modules/@m0saic/core/dist/media/buildMediaRegistryFromInput.js +1 -1
  108. package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromInvocationProps.js +1 -1
  109. package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromMosaicRenderableFile.js +1 -1
  110. package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromProps.js +1 -1
  111. package/node_modules/@m0saic/core/dist/media/index.js +1 -1
  112. package/node_modules/@m0saic/core/dist/media/internalMintAsset.js +1 -1
  113. package/node_modules/@m0saic/core/dist/media/remoteUrl.js +1 -1
  114. package/node_modules/@m0saic/core/dist/media/stageUnsafeFilenames.js +1 -1
  115. package/node_modules/@m0saic/core/dist/media/types.js +1 -1
  116. package/node_modules/@m0saic/core/dist/output/index.js +1 -1
  117. package/node_modules/@m0saic/core/dist/output/resolveOutputFormat.js +1 -1
  118. package/node_modules/@m0saic/core/dist/output/types.js +1 -1
  119. package/node_modules/@m0saic/core/dist/probe/cellLuminanceProbe.js +1 -1
  120. package/node_modules/@m0saic/core/dist/probe/extractSubtitleCues.js +1 -1
  121. package/node_modules/@m0saic/core/dist/probe/helpers.js +1 -1
  122. package/node_modules/@m0saic/core/dist/probe/index.js +1 -1
  123. package/node_modules/@m0saic/core/dist/probe/luminanceProbe.js +1 -1
  124. package/node_modules/@m0saic/core/dist/probe/probeMedia.js +1 -1
  125. package/node_modules/@m0saic/core/dist/probe/runFFprobe.js +1 -1
  126. package/node_modules/@m0saic/core/dist/probe/types.js +1 -1
  127. package/node_modules/@m0saic/core/dist/runtime/engineRedaction.js +1 -1
  128. package/node_modules/@m0saic/core/dist/runtime/ffmpegFailure.js +1 -1
  129. package/node_modules/@m0saic/core/dist/runtime/filterPreflight.js +1 -1
  130. package/node_modules/@m0saic/core/dist/runtime/hashFile.js +1 -1
  131. package/node_modules/@m0saic/core/dist/runtime/index.js +1 -1
  132. package/node_modules/@m0saic/core/dist/runtime/pathInfo.js +1 -1
  133. package/node_modules/@m0saic/core/dist/runtime/perfHeatmap.js +1 -1
  134. package/node_modules/@m0saic/core/dist/runtime/perfReport.js +1 -1
  135. package/node_modules/@m0saic/core/dist/runtime/pipelineM0p.js +1 -1
  136. package/node_modules/@m0saic/core/dist/runtime/renderCostModel.constants.js +1 -1
  137. package/node_modules/@m0saic/core/dist/runtime/renderCostModel.js +1 -1
  138. package/node_modules/@m0saic/core/dist/runtime/renderReport.js +1 -1
  139. package/node_modules/@m0saic/core/dist/runtime/renderSidecars.js +1 -1
  140. package/node_modules/@m0saic/core/dist/runtime/resolveMosaicx.js +1 -1
  141. package/node_modules/@m0saic/core/dist/runtime/runPlan.js +1 -1
  142. package/node_modules/@m0saic/core/dist/runtime/types.js +1 -1
  143. package/node_modules/@m0saic/core/dist/runtime/upstream.js +1 -1
  144. package/node_modules/@m0saic/core/dist/runtime/writeSidecars.js +1 -1
  145. package/node_modules/@m0saic/core/dist/types/chunk.js +1 -1
  146. package/node_modules/@m0saic/core/dist/types/index.js +1 -1
  147. package/node_modules/@m0saic/core/dist/types/mosaic-plan.js +1 -1
  148. package/node_modules/@m0saic/core/dist/utils/assertTiming.js +1 -1
  149. package/node_modules/@m0saic/core/dist/utils/command.js +1 -1
  150. package/node_modules/@m0saic/core/dist/utils/createEngineContext.js +1 -1
  151. package/node_modules/@m0saic/core/dist/utils/createTemplateRenderCache.js +1 -1
  152. package/node_modules/@m0saic/core/dist/utils/ffmpegColor.js +1 -1
  153. package/node_modules/@m0saic/core/dist/utils/formatDuration.js +1 -1
  154. package/node_modules/@m0saic/core/dist/utils/fsSafeId.js +1 -1
  155. package/node_modules/@m0saic/core/dist/utils/index.js +1 -1
  156. package/node_modules/@m0saic/core/dist/utils/lowerRenderableToMosaicDocument.js +1 -1
  157. package/node_modules/@m0saic/core/dist/utils/movSafeCodec.js +1 -1
  158. package/node_modules/@m0saic/core/dist/utils/resolveBoxFrac.js +1 -1
  159. package/node_modules/@m0saic/core/dist/validate/index.js +1 -1
  160. package/node_modules/@m0saic/core/scripts/mask-rasterize-core.js +1 -1
  161. package/node_modules/@m0saic/core/scripts/mask-rasterize-worker.js +1 -1
  162. package/node_modules/@m0saic/core/scripts/mask-worker-thread.js +1 -1
  163. package/node_modules/@m0saic/dictionary/NOTICE +9 -0
  164. package/node_modules/@m0saic/dictionary/README.md +315 -0
  165. package/node_modules/@m0saic/dictionary/package.json +1 -1
  166. package/node_modules/@m0saic/dsl/package.json +1 -1
  167. package/node_modules/@m0saic/dsl-file-formats/dist/cjs/agent.js +6 -0
  168. package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0/parseM0File.js +1 -1
  169. package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0/serializeM0File.js +2 -2
  170. package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0c/m0cFile.js +3 -3
  171. package/node_modules/@m0saic/dsl-file-formats/dist/cjs/types.js +1 -1
  172. package/node_modules/@m0saic/dsl-file-formats/package.json +1 -1
  173. package/node_modules/@m0saic/dsl-stdlib/dist/cjs/builders/bakeM0cInsets.js +1 -0
  174. package/node_modules/@m0saic/dsl-stdlib/dist/cjs/builders/index.js +1 -1
  175. package/node_modules/@m0saic/dsl-stdlib/package.json +1 -1
  176. package/node_modules/@m0saic/knowledge/LICENSE +21 -0
  177. package/node_modules/@m0saic/knowledge/README.md +71 -0
  178. package/node_modules/@m0saic/knowledge/dist/index.js +1 -0
  179. package/node_modules/@m0saic/knowledge/docs/README.md +60 -0
  180. package/node_modules/@m0saic/knowledge/docs/file-formats/m0-iteration-protocol.md +120 -0
  181. package/node_modules/@m0saic/knowledge/docs/file-formats/m0p-and-custom-field.md +195 -0
  182. package/node_modules/@m0saic/knowledge/docs/handbook/README.md +27 -0
  183. package/node_modules/@m0saic/knowledge/docs/handbook/composition-arithmetic.md +278 -0
  184. package/node_modules/@m0saic/knowledge/docs/handbook/dsl-complexity.md +75 -0
  185. package/node_modules/@m0saic/knowledge/docs/handbook/dsl-rules.md +367 -0
  186. package/node_modules/@m0saic/knowledge/docs/handbook/feasibility-precision-quantization.md +591 -0
  187. package/node_modules/@m0saic/knowledge/docs/handbook/m0-construction-methods.md +201 -0
  188. package/node_modules/@m0saic/knowledge/docs/handbook/precision-tiers.md +84 -0
  189. package/node_modules/@m0saic/knowledge/docs/m0saic-thesis.md +95 -0
  190. package/node_modules/@m0saic/knowledge/docs/runtime/README.md +17 -0
  191. package/node_modules/@m0saic/knowledge/docs/runtime/cli-usage.md +447 -0
  192. package/node_modules/@m0saic/knowledge/docs/runtime/ffmpeg-expression-limits.md +117 -0
  193. package/node_modules/@m0saic/knowledge/docs/runtime/reduce-to-one.md +96 -0
  194. package/node_modules/@m0saic/knowledge/docs/skills/README.md +40 -0
  195. package/node_modules/@m0saic/knowledge/docs/skills/axis-and-geometry.md +103 -0
  196. package/node_modules/@m0saic/knowledge/docs/skills/dsl-stdlib-method-catalog.md +7 -0
  197. package/node_modules/@m0saic/knowledge/docs/skills/identity.md +123 -0
  198. package/node_modules/@m0saic/knowledge/docs/skills/labels-and-masks.md +170 -0
  199. package/node_modules/@m0saic/knowledge/docs/skills/m0saic-string-generation.md +251 -0
  200. package/node_modules/@m0saic/knowledge/docs/skills/more-atoms-not-bigger-atoms.md +77 -0
  201. package/node_modules/@m0saic/knowledge/docs/skills/overlay-semantics.md +194 -0
  202. package/node_modules/@m0saic/knowledge/docs/skills/parse-apis.md +79 -0
  203. package/node_modules/@m0saic/knowledge/docs/skills/passthrough-semantics.md +136 -0
  204. package/node_modules/@m0saic/knowledge/docs/skills/structural-construction.md +86 -0
  205. package/node_modules/@m0saic/knowledge/docs/skills/text-in-templates.md +126 -0
  206. package/node_modules/@m0saic/knowledge/docs/skills/zero-overlay-analysis.md +87 -0
  207. package/node_modules/@m0saic/knowledge/docs/templates/README.md +65 -0
  208. package/node_modules/@m0saic/knowledge/docs/templates/capability-templates.md +72 -0
  209. package/node_modules/@m0saic/knowledge/docs/templates/construction-strategy.md +329 -0
  210. package/node_modules/@m0saic/knowledge/docs/templates/data-pipeline.md +324 -0
  211. package/node_modules/@m0saic/knowledge/docs/templates/emission-patterns.md +130 -0
  212. package/node_modules/@m0saic/knowledge/docs/templates/geometry-recipes.md +248 -0
  213. package/node_modules/@m0saic/knowledge/docs/templates/layout-contract.md +168 -0
  214. package/node_modules/@m0saic/knowledge/docs/templates/output-resolution-tree.md +202 -0
  215. package/node_modules/@m0saic/knowledge/docs/templates/patterns/case-study-lessons.md +69 -0
  216. package/node_modules/@m0saic/knowledge/docs/templates/patterns/perf-authoring-rules.md +100 -0
  217. package/node_modules/@m0saic/knowledge/docs/templates/patterns/primitive-extraction-pattern.md +103 -0
  218. package/node_modules/@m0saic/knowledge/docs/templates/philosophy-and-contract.md +310 -0
  219. package/node_modules/@m0saic/knowledge/docs/templates/recursion-nested-rendering.md +154 -0
  220. package/node_modules/@m0saic/knowledge/docs/templates/reference/grid.md +104 -0
  221. package/node_modules/@m0saic/knowledge/docs/templates/reference/json-prop-type.md +169 -0
  222. package/node_modules/@m0saic/knowledge/docs/templates/reference/mosaic-color.md +81 -0
  223. package/node_modules/@m0saic/knowledge/docs/templates/reference/mosaic-placement-props.md +103 -0
  224. package/node_modules/@m0saic/knowledge/docs/templates/reference/prop-bindings.md +324 -0
  225. package/node_modules/@m0saic/knowledge/docs/templates/reference/template-flags.md +224 -0
  226. package/node_modules/@m0saic/knowledge/docs/templates/render-lifecycle.md +117 -0
  227. package/node_modules/@m0saic/knowledge/docs/templates/rendering-model-contract.md +392 -0
  228. package/node_modules/@m0saic/knowledge/docs/templates/standalone-pack-authoring.md +299 -0
  229. package/node_modules/@m0saic/knowledge/docs/templates/theming.md +81 -0
  230. package/node_modules/@m0saic/knowledge/docs/templates/ui-controls.md +150 -0
  231. package/node_modules/@m0saic/knowledge/package.json +6 -0
  232. package/node_modules/@m0saic/momo-types/README.md +109 -0
  233. package/node_modules/@m0saic/momo-types/dist/agent.js +1 -6
  234. package/node_modules/@m0saic/momo-types/dist/context.js +1 -1
  235. package/node_modules/@m0saic/momo-types/package.json +1 -1
  236. package/node_modules/@m0saic/platform/README.md +3 -0
  237. package/node_modules/@m0saic/platform/dist/cjs/index.js +1 -1
  238. package/node_modules/@m0saic/platform/dist/cjs/mosaic/outputKind/outputKind.js +1 -1
  239. package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/index.js +1 -1
  240. package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/propBindings.js +1 -1
  241. package/node_modules/@m0saic/platform/dist/cjs/mosaic/validate/validateSources.js +1 -1
  242. package/node_modules/@m0saic/platform/dist/cjs/packages/mosaicPackages.js +1 -0
  243. package/node_modules/@m0saic/platform/dist/cjs/paths/m0saicRoot.js +1 -1
  244. package/node_modules/@m0saic/platform/dist/cjs/telemetry/lifecycle.js +1 -1
  245. package/node_modules/@m0saic/platform/dist/cjs/telemetry/preview.js +1 -1
  246. package/node_modules/@m0saic/platform/dist/cjs/telemetry/sender.js +1 -1
  247. package/node_modules/@m0saic/platform/dist/cjs/telemetry/usageRecorder.js +1 -1
  248. package/node_modules/@m0saic/platform/dist/cjs/telemetry/usageStore.js +3 -3
  249. package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/baseline.json +25 -97
  250. package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/index.js +1 -1
  251. package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/install.js +2 -2
  252. package/node_modules/@m0saic/platform/dist/cjs/toolchain/goldenFfmpeg.js +6 -6
  253. package/node_modules/@m0saic/platform/package.json +1 -1
  254. package/node_modules/@m0saic/product/dist/communityRelease.js +1 -1
  255. package/node_modules/@m0saic/product/dist/freeTierLicense.js +1 -1
  256. package/node_modules/@m0saic/product/dist/index.js +1 -1
  257. package/node_modules/@m0saic/product/dist/licenseActivationNotice.js +1 -0
  258. package/node_modules/@m0saic/product/dist/licenseFile.js +1 -0
  259. package/node_modules/@m0saic/product/dist/licenseToken.js +1 -1
  260. package/node_modules/@m0saic/product/dist/makeScratchPath.js +1 -0
  261. package/node_modules/@m0saic/product/dist/postRenderWrapper.js +1 -1
  262. package/node_modules/@m0saic/product/dist/publicKeys.js +1 -1
  263. package/node_modules/@m0saic/product/dist/revokedKeys.js +1 -1
  264. package/node_modules/@m0saic/product/dist/upstreamDefaults.js +1 -1
  265. package/node_modules/@m0saic/product/dist/workspaceScaffold.js +1 -0
  266. package/node_modules/@m0saic/template-utils/dist/brand/hello-world/helloWorld.js +1 -1
  267. package/node_modules/@m0saic/template-utils/dist/geometry-contract/index.js +1 -1
  268. package/node_modules/@m0saic/template-utils/dist/geometry-contract/layoutConstraint.js +2 -2
  269. package/node_modules/@m0saic/template-utils/dist/m0saic/loadSession.js +1 -1
  270. package/node_modules/@m0saic/template-utils/dist/render/createDesignContext.js +1 -1
  271. package/node_modules/@m0saic/template-utils/dist/sources/makeErrorMosaic.js +2 -2
  272. package/node_modules/@m0saic/template-utils/dist/sources/svgTextSource.js +1 -1
  273. package/node_modules/@m0saic/template-utils/dist/template/auditRenderedTemplate.js +5 -5
  274. package/node_modules/@m0saic/template-utils/dist/template/templateConventions.js +3 -3
  275. package/node_modules/@m0saic/template-utils/dist/template/validateTemplateProps.js +1 -1
  276. package/node_modules/@m0saic/template-utils/dist/text/fitText.js +6 -6
  277. package/node_modules/@m0saic/template-utils/package.json +1 -1
  278. package/node_modules/@m0saic/templates/NOTICE +9 -0
  279. package/node_modules/@m0saic/templates/dist/m0saic/media/blur-regions/v1/tutorial.js +1 -1
  280. package/node_modules/@m0saic/templates/package.json +1 -1
  281. package/node_modules/@m0saic/templates-advanced/NOTICE +9 -0
  282. package/node_modules/@m0saic/text/package.json +1 -1
  283. package/node_modules/@m0saic/types/dist/analytics/consent.js +1 -1
  284. package/node_modules/@m0saic/types/dist/analytics/event.js +1 -1
  285. package/node_modules/@m0saic/types/dist/analytics/usageMetrics.js +1 -1
  286. package/node_modules/@m0saic/types/dist/identifiers/identifiers.js +1 -1
  287. package/node_modules/@m0saic/types/dist/telemetry/ffmpegFailure.js +1 -1
  288. package/node_modules/@m0saic/types/package.json +1 -1
  289. package/node_modules/@m0saic/types-internal/dist/analytics/featureKeys.js +1 -1
  290. package/package.json +13 -11
  291. package/resources/starter-base/starter-base.json +10 -0
  292. package/resources/starter-base/starter-base.tgz +0 -0
@@ -0,0 +1,315 @@
1
+ # @m0saic/dictionary
2
+
3
+ The official catalog of reusable m0saic layouts — 30 fixed entries and 10 parameterized generators.
4
+
5
+ ```
6
+ npm install @m0saic/dictionary
7
+ ```
8
+
9
+ ---
10
+
11
+ ## Where this fits
12
+
13
+ ```
14
+ @m0saic/dsl
15
+ the language core (zero deps)
16
+ grammar, parser, validator, types
17
+ |
18
+ +-------------+-------------+
19
+ | |
20
+ @m0saic/dsl- @m0saic/dsl-stdlib
21
+ file-formats builders, transforms
22
+ .m0 .m0c authoring toolkit
23
+ | |
24
+ +-------------+-------------+
25
+ |
26
+ @m0saic/dictionary <── you are here
27
+ curated entries + generators
28
+ ```
29
+
30
+ The dictionary depends on all three packages above. It consumes DSL validation, stdlib builders, and file-format parsing to produce a curated, tested catalog of reusable layouts.
31
+
32
+ ---
33
+
34
+ ## Quick start
35
+
36
+ ```typescript
37
+ import { entries, generators, resolveM0saic } from "@m0saic/dictionary";
38
+
39
+ // Browse all entries
40
+ entries.all.forEach(e => console.log(e.id, e.sourceCount));
41
+
42
+ // Get a specific entry
43
+ const hero = entries.byId["layouts/hero-sidebar"];
44
+ console.log(hero.m0saic); // "2(F,2[F,F])"
45
+
46
+ // Resolve heavy entries (brand logos with large DSL)
47
+ const dsl = await resolveM0saic(entries.byId["brand/m0saic-m-256"]);
48
+
49
+ // Use a generator
50
+ const { m0saic, sourceCount } = generators.grid({
51
+ columns: 4, rows: 3, gutter: 0.1
52
+ });
53
+ ```
54
+
55
+ ---
56
+
57
+ ## Entries
58
+
59
+ 30 fixed canonical layouts across 4 categories.
60
+
61
+ ```
62
+ entries/
63
+ ├── splits/ 10 entries simple N-way splits
64
+ │ ├── 2-col 2(F,F)
65
+ │ ├── 2-row 2[F,F]
66
+ │ ├── 3-col 3(F,F,F)
67
+ │ ├── 3-row 3[F,F,F]
68
+ │ ├── 4-col 4(F,F,F,F)
69
+ │ ├── 4-row 4[F,F,F,F]
70
+ │ ├── 2-1-col 3(0,F,F) 2:1 ratio
71
+ │ ├── 1-2-col 3(F,0,F) 1:2 ratio
72
+ │ ├── 2-1-row 3[0,F,F] 2:1 ratio
73
+ │ └── 1-2-row 3[F,0,F] 1:2 ratio
74
+ │
75
+ ├── grids/ 5 entries uniform rectangular grids
76
+ │ ├── 2x2 2[2(F,F),2(F,F)]
77
+ │ ├── 2x3 3[2(F,F),2(F,F),2(F,F)]
78
+ │ ├── 3x2 2[3(F,F,F),3(F,F,F)]
79
+ │ ├── 3x3 3[3(F,F,F),3(F,F,F),3(F,F,F)]
80
+ │ └── 4x4 4[4(...),4(...),4(...),4(...)]
81
+ │
82
+ ├── layouts/ 8 entries editorial / compositional layouts
83
+ │ ├── hero-sidebar 2(F,2[F,F])
84
+ │ ├── hero-bottom-strip 2[F,3(F,F,F)]
85
+ │ ├── hero-top-strip 2[3(F,F,F),F]
86
+ │ ├── sidebar-main 2(2[F,F],F)
87
+ │ ├── l-shape 2[2(F,F),2(F,-)]
88
+ │ ├── t-shape 2[3(F,F,F),3(-,F,-)]
89
+ │ ├── three-up 2[F,2(F,F)]
90
+ │ └── main-two-supporting 3[0,F,2(F,F)]
91
+ │
92
+ └── brand/ 7 entries canonical brand primitives
93
+ ├── m0saic-m-64 2,242 tiles (64x64 bitmap)
94
+ ├── m0saic-m-256 35,298 tiles (256x256 bitmap)
95
+ ├── m0saic-m-rects 109 tiles (rect decomposition)
96
+ ├── m0saic-pattern 110 tiles (brand pattern)
97
+ ├── m-33 33 tiles (composed logo)
98
+ ├── m-33_bitmap 36,426 tiles (bitmap logo)
99
+ └── m0 26 tiles (M0 mark)
100
+ ```
101
+
102
+ ### Entry shape
103
+
104
+ Each entry is a `MosaicDictionaryEntryResolved`:
105
+
106
+ ```
107
+ MosaicDictionaryEntry
108
+ +── id: string permanent identifier
109
+ +── m0saic: string canonical DSL (empty for heavy entries)
110
+ +── sourceCount: number rendered tile count
111
+ +── title: string display name
112
+ +── description: string human-readable description
113
+ +── category: string "split" | "grid" | "layout" | "brand"
114
+ +── tags: string[] searchable tags
115
+ +── m0File?: string path to .m0 file (heavy entries)
116
+ +── preview?: { mode, src? } "canvas" (SVG from DSL) or "image" (shipped PNG)
117
+ +── minWidthPx?: number exact minimum feasible width
118
+ +── minHeightPx?: number exact minimum feasible height
119
+ +── rankSets?: Record<...> named rank orderings
120
+ +── maskSets?: Record<...> named clipping masks
121
+ ```
122
+
123
+ ### Light vs heavy entries
124
+
125
+ ```
126
+ Light entries (splits, grids, layouts)
127
+ ──────────────────────────────────────
128
+ DSL inlined in browser bundle
129
+ m0saic: "2(F,F)"
130
+ Instant access, no fetch needed
131
+
132
+ Heavy entries (brand)
133
+ ─────────────────────
134
+ DSL in .m0 file on disk/server
135
+ m0saic: "" (empty in browser)
136
+ m0File: "entries/brand/m0saic-m-256/m0saic.m0"
137
+ Resolved via: await resolveM0saic(entry)
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Generators
143
+
144
+ 10 parameterized layout producers. Each has a descriptor (for UI controls) and a build function.
145
+
146
+ ```
147
+ Generator Description Key params
148
+ ───────── ─────────── ──────────
149
+ grid rectangular grid columns, rows, gutter
150
+ aspectFit fit content to aspect ratio rootW/H, target ratio
151
+ placeRect position rect in canvas rootW/H, rectW/H, align
152
+ aspectSafeGrid grid with aspect preservation columns, rows, priority
153
+ magazine editorial hero + sidebar + strip heroWeight, sidebarCount
154
+ safeCanvas canvas with constraints columns, rows, gutter
155
+ spotlight hero + supporting tiles supportCount, arrangement
156
+ comparison before/after pairs pairs, direction
157
+ rankedList ranked items with decay count, decay, direction
158
+ bentoGrid curated irregular grids base, variant
159
+ ```
160
+
161
+ ### Using generators
162
+
163
+ ```typescript
164
+ import { generators } from "@m0saic/dictionary";
165
+
166
+ // Call directly
167
+ const { m0saic, sourceCount } = generators.grid({
168
+ columns: 3, rows: 2, gutter: 0.05
169
+ });
170
+
171
+ // Enumerate all descriptors (for UI)
172
+ generators.descriptors.forEach(d => {
173
+ console.log(d.id, d.title, d.params.length);
174
+ });
175
+ ```
176
+
177
+ ### Generator descriptor shape
178
+
179
+ ```
180
+ GeneratorDescriptor
181
+ +── id: string generator identifier
182
+ +── title: string display name
183
+ +── description: string what it produces
184
+ +── category: string grouping
185
+ +── params: GeneratorParamDescriptor[]
186
+ +── key: string parameter name
187
+ +── title: string display label
188
+ +── type: "int" | "float" | "bool" | "enum"
189
+ +── default: number | boolean | string
190
+ +── min?: number
191
+ +── max?: number
192
+ +── step?: number
193
+ +── options?: { value, label }[] (enum only)
194
+ +── visibleWhen?: Record<string, ...> conditional visibility
195
+ ```
196
+
197
+ ---
198
+
199
+ ## Resolution
200
+
201
+ ### `resolveM0saic(entry): Promise<string>`
202
+
203
+ Resolves the m0saic DSL string for any entry. Light entries return immediately. Heavy entries fetch and parse the `.m0` file.
204
+
205
+ ```typescript
206
+ import { resolveM0saic, entries } from "@m0saic/dictionary";
207
+
208
+ const dsl = await resolveM0saic(entries.byId["brand/m0saic-m-rects"]);
209
+ // Returns canonical DSL string (109 tiles)
210
+ ```
211
+
212
+ Results are cached (bounded, max 64, FIFO eviction).
213
+
214
+ ### `setDictionaryAssetsBase(base)`
215
+
216
+ Set the base URL for `.m0` file fetches. Default: `"/dictionary"`.
217
+
218
+ ```typescript
219
+ import { setDictionaryAssetsBase } from "@m0saic/dictionary";
220
+
221
+ setDictionaryAssetsBase("/assets/dictionary");
222
+ // Heavy entries will fetch from /assets/dictionary/entries/brand/...
223
+ ```
224
+
225
+ ---
226
+
227
+ ## Mask sets
228
+
229
+ Entries with non-rectangular silhouettes (e.g. `brand/m-33`, `brand/m0`) ship a `masks.json` whose entries describe each frame's clip shape (`localPath` + design-space `bounds`). Templates load the set at template-execution time and bake the data inline on each `MosaicSource.mask`:
230
+
231
+ ```typescript
232
+ import { registry } from "@m0saic/dictionary";
233
+
234
+ const masks = registry.getMaskSet("brand/m-33", "default").masks;
235
+ sources.forEach((s, i) => {
236
+ const m = masks[i];
237
+ if (m) s.mask = { kind: "inline-mask", localPath: m.localPath, bounds: m.bounds };
238
+ });
239
+ ```
240
+
241
+ Rasterization happens engine-side in `@m0saic/core` (`rasterizeMaskPng`) — `@m0saic/dictionary` no longer carries `sharp` as a dependency, and there is no `getOrCreateMaskPng` export. The dictionary's job is to ship the silhouette source-of-truth; turning it into pixels is the engine's job.
242
+
243
+ ---
244
+
245
+ ## Browser vs Node
246
+
247
+ ```
248
+ Browser (via bundler) Node / CLI
249
+ ───────────────────── ──────────
250
+ Resolves to browser.ts Resolves to index.ts
251
+ via package.json "browser" via package.json "main"
252
+
253
+ Light DSL inlined Light DSL inlined
254
+ Heavy DSL: fetch .m0 from server Heavy DSL: fs.readFileSync
255
+
256
+ Same API shape: Same API shape:
257
+ entries.all entries.all
258
+ entries.byId entries.byId
259
+ generators.* generators.*
260
+ resolveM0saic() resolveM0saic()
261
+ registry.getMaskSet() registry.getMaskSet()
262
+ ```
263
+
264
+ Consumers always import from `@m0saic/dictionary` — the bundler handles resolution automatically.
265
+
266
+ ---
267
+
268
+ ## Stability contract
269
+
270
+ Entry IDs and generator schemas are **permanent public contract**.
271
+
272
+ ```
273
+ Action Allowed in
274
+ ────── ──────────
275
+ Add new entries minor / patch
276
+ Add new generators minor / patch
277
+ Change metadata (title, tags) minor / patch
278
+ Change entry m0saic string major only (geometry changes)
279
+ Remove / rename entry IDs major only
280
+ Change generator param schemas major only
281
+ ```
282
+
283
+ ---
284
+
285
+ ## Development
286
+
287
+ ### Add a new entry
288
+
289
+ ```bash
290
+ cd packages/dictionary
291
+ npx ts-node tools/create-new-entry.ts <group> <slug> <path-to-file.m0>
292
+ npm run dictionary:build
293
+ ```
294
+
295
+ ### Build
296
+
297
+ ```bash
298
+ npm run dictionary:build
299
+ # validates -> generates artifacts -> generates index -> compiles -> copies assets
300
+ ```
301
+
302
+ ### Test
303
+
304
+ ```bash
305
+ npm test # unit + generator tests
306
+ npm run test:visual # golden wireframe PNGs
307
+ npm run test:visual:update # regenerate goldens
308
+ ```
309
+
310
+ ---
311
+
312
+ ## License
313
+
314
+ Licensed under the Apache License, Version 2.0.
315
+ See `LICENSE` and `NOTICE`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m0saic/dictionary",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "main": "dist/index.js",
5
5
  "license": "MIT"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m0saic/dsl",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "exports": {
6
6
  ".": {
@@ -0,0 +1,6 @@
1
+ "use strict";var f=Object.defineProperty;var r=(e,t)=>f(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.normalizeCandidateContext=normalizeCandidateContext,exports.mintAgentId=mintAgentId,exports.collapseAgentProse=collapseAgentProse,exports.normalizeAgentProse=normalizeAgentProse;const CANDIDATE_CONTEXT_KEYS=new Set(["session","candidate","phase","category","intent","layoutIntent","regionAnnotations","evaluation","relation","extras"]);function normalizeCandidateContext(e){if(e==null)return;if(typeof e!="object"||Array.isArray(e))return{extras:{raw:e}};const t=e,s={},a={};let o=!1,l=!1;for(const[i,n]of Object.entries(t))if(n!==void 0){if(i==="extras"){if(n!==null&&typeof n=="object"&&!Array.isArray(n))for(const[u,c]of Object.entries(n))c!==void 0&&(a[u]=c,o=!0);continue}CANDIDATE_CONTEXT_KEYS.has(i)?(s[i]=n,l=!0):(a[i]=n,o=!0)}return o&&(s.extras=a),l||o?s:void 0}r(normalizeCandidateContext,"normalizeCandidateContext");function mintAgentId(){const e=typeof globalThis<"u"?globalThis.crypto:void 0;return e&&typeof e.randomUUID=="function"?e.randomUUID().replace(/-/g,"").slice(0,8):Math.random().toString(36).slice(2,6)+Math.random().toString(36).slice(2,6)}r(mintAgentId,"mintAgentId");function collapseAgentProse(e){return e.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim()}r(collapseAgentProse,"collapseAgentProse");function normalizeAgentProse(e){return e.replace(/\r\n?/g,`
2
+ `).split(`
3
+ `).map(t=>t.replace(/[ \t]+$/g,"")).join(`
4
+ `).replace(/\n{3,}/g,`
5
+
6
+ `).trim()}r(normalizeAgentProse,"normalizeAgentProse");
@@ -1 +1 @@
1
- "use strict";var x=Object.defineProperty;var y=(t,o)=>x(t,"name",{value:o,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseM0File=parseM0File;const momo_types_1=require("@m0saic/momo-types"),m0Validation_1=require("../m0Validation");function parseM0File(t){if(typeof t!="string")throw new Error("parseM0File: input must be a string");const o=t.split(/\r?\n/),n={},s={},m=[],c=[];for(const l of o){const p=l.trim();if(p!==""){if(p.startsWith("#")){if(p==="# m0"||p==="# m0saic")continue;const w=p.match(/^#\s*m0agent:([^:]+):\s*(.*)$/);if(w){const d=w[1].trim(),h=w[2].trim();d==="comment"?m.push(h):d&&(s[d]=h);continue}const M=p.match(/^#\s*([^:]+):\s*(.*)$/);if(M){const d=M[1].trim(),h=M[2].trim();d&&(n[d]=h)}continue}c.push(p)}}const b=(0,m0Validation_1.canonicalizeAndValidateM0)("parseM0File",c.join(""),"parseM0File: payload is empty");if(n.version!=null&&n.version.trim()!=="1")throw new Error(`parseM0File: unsupported version "${n.version}" (expected "1")`);const g=parseSize(n.size);if(n.size!=null&&g==null)throw new Error(`parseM0File: invalid size "${n.size}" (expected WxH e.g. 1920x1080)`);const a=n.created?.trim();if(!a)throw new Error('parseM0File: missing required header "created"');const i=n.app?.trim(),e=n.appVersion?.trim(),f=extractKnownMeta(n),u=extractAgentMeta(s,m);return{version:1,created:a,app:i&&i!==""?i:null,appVersion:e&&e!==""?e:null,meta:f,agent:u,size:g??null,m0:b}}y(parseM0File,"parseM0File");function parseSize(t){if(t==null||t.trim()==="")return null;const o=t.match(/^(\d+)x(\d+)$/);if(!o)return null;const n=Number(o[1]),s=Number(o[2]);return!Number.isInteger(n)||n<=0||!Number.isInteger(s)||s<=0?null:{width:n,height:s}}y(parseSize,"parseSize");function extractKnownMeta(t){const o=t.title?.trim(),n=t.author?.trim(),s=t.source?.trim(),m=t.note?.trim(),c={};return o&&(c.title=o),n&&(c.author=n),s&&(c.source=s),m&&(c.note=m),Object.keys(c).length?c:null}y(extractKnownMeta,"extractKnownMeta");function extractAgentMeta(t,o){const n=t.id?.trim(),s=t.note?.trim(),m=t.question?.trim(),c=t.regions?.trim(),b=t.context?.trim(),g=t.response?.trim(),a={};if(n&&(a.id=n),s&&(a.note=s),m&&(a.question=m),c){const i=safeJsonParse(c);if(i&&typeof i=="object"&&!Array.isArray(i)){const e={};for(const[f,u]of Object.entries(i))typeof u=="string"&&(e[f]=u);Object.keys(e).length&&(a.regions=e)}}if(b){const i=safeJsonParse(b),e=(0,momo_types_1.normalizeCandidateContext)(i);e!==void 0&&(a.context=e)}if(g){const i=safeJsonParse(g);if(i&&typeof i=="object"&&!Array.isArray(i)){const e=i;if(typeof e.body=="string"&&e.body.trim()!==""){const f={body:e.body};typeof e.from=="string"&&e.from.trim()!==""&&(f.from=e.from),typeof e.at=="string"&&e.at.trim()!==""&&(f.at=e.at),a.response=f}}}if(o.length>0){const i=[];for(const e of o){const f=e.trim();if(!f)continue;const u=safeJsonParse(f);if(!u||typeof u!="object"||Array.isArray(u))continue;const r=u;if(typeof r.body!="string"||r.body.trim()==="")continue;const l={body:r.body};typeof r.id=="string"&&r.id.trim()!==""&&(l.id=r.id),typeof r.from=="string"&&r.from.trim()!==""&&(l.from=r.from),typeof r.at=="string"&&r.at.trim()!==""&&(l.at=r.at),i.push(l)}i.length&&(a.comments=i)}return Object.keys(a).length?a:null}y(extractAgentMeta,"extractAgentMeta");function safeJsonParse(t){try{return JSON.parse(t)}catch{return}}y(safeJsonParse,"safeJsonParse");
1
+ "use strict";var x=Object.defineProperty;var y=(t,r)=>x(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseM0File=parseM0File;const agent_1=require("../agent"),m0Validation_1=require("../m0Validation");function parseM0File(t){if(typeof t!="string")throw new Error("parseM0File: input must be a string");const r=t.split(/\r?\n/),n={},s={},m=[],c=[];for(const l of r){const p=l.trim();if(p!==""){if(p.startsWith("#")){if(p==="# m0"||p==="# m0saic")continue;const w=p.match(/^#\s*m0agent:([^:]+):\s*(.*)$/);if(w){const d=w[1].trim(),h=w[2].trim();d==="comment"?m.push(h):d&&(s[d]=h);continue}const M=p.match(/^#\s*([^:]+):\s*(.*)$/);if(M){const d=M[1].trim(),h=M[2].trim();d&&(n[d]=h)}continue}c.push(p)}}const b=(0,m0Validation_1.canonicalizeAndValidateM0)("parseM0File",c.join(""),"parseM0File: payload is empty");if(n.version!=null&&n.version.trim()!=="1")throw new Error(`parseM0File: unsupported version "${n.version}" (expected "1")`);const g=parseSize(n.size);if(n.size!=null&&g==null)throw new Error(`parseM0File: invalid size "${n.size}" (expected WxH e.g. 1920x1080)`);const a=n.created?.trim();if(!a)throw new Error('parseM0File: missing required header "created"');const i=n.app?.trim(),e=n.appVersion?.trim(),f=extractKnownMeta(n),u=extractAgentMeta(s,m);return{version:1,created:a,app:i&&i!==""?i:null,appVersion:e&&e!==""?e:null,meta:f,agent:u,size:g??null,m0:b}}y(parseM0File,"parseM0File");function parseSize(t){if(t==null||t.trim()==="")return null;const r=t.match(/^(\d+)x(\d+)$/);if(!r)return null;const n=Number(r[1]),s=Number(r[2]);return!Number.isInteger(n)||n<=0||!Number.isInteger(s)||s<=0?null:{width:n,height:s}}y(parseSize,"parseSize");function extractKnownMeta(t){const r=t.title?.trim(),n=t.author?.trim(),s=t.source?.trim(),m=t.note?.trim(),c={};return r&&(c.title=r),n&&(c.author=n),s&&(c.source=s),m&&(c.note=m),Object.keys(c).length?c:null}y(extractKnownMeta,"extractKnownMeta");function extractAgentMeta(t,r){const n=t.id?.trim(),s=t.note?.trim(),m=t.question?.trim(),c=t.regions?.trim(),b=t.context?.trim(),g=t.response?.trim(),a={};if(n&&(a.id=n),s&&(a.note=s),m&&(a.question=m),c){const i=safeJsonParse(c);if(i&&typeof i=="object"&&!Array.isArray(i)){const e={};for(const[f,u]of Object.entries(i))typeof u=="string"&&(e[f]=u);Object.keys(e).length&&(a.regions=e)}}if(b){const i=safeJsonParse(b),e=(0,agent_1.normalizeCandidateContext)(i);e!==void 0&&(a.context=e)}if(g){const i=safeJsonParse(g);if(i&&typeof i=="object"&&!Array.isArray(i)){const e=i;if(typeof e.body=="string"&&e.body.trim()!==""){const f={body:e.body};typeof e.from=="string"&&e.from.trim()!==""&&(f.from=e.from),typeof e.at=="string"&&e.at.trim()!==""&&(f.at=e.at),a.response=f}}}if(r.length>0){const i=[];for(const e of r){const f=e.trim();if(!f)continue;const u=safeJsonParse(f);if(!u||typeof u!="object"||Array.isArray(u))continue;const o=u;if(typeof o.body!="string"||o.body.trim()==="")continue;const l={body:o.body};typeof o.id=="string"&&o.id.trim()!==""&&(l.id=o.id),typeof o.from=="string"&&o.from.trim()!==""&&(l.from=o.from),typeof o.at=="string"&&o.at.trim()!==""&&(l.at=o.at),i.push(l)}i.length&&(a.comments=i)}return Object.keys(a).length?a:null}y(extractAgentMeta,"extractAgentMeta");function safeJsonParse(t){try{return JSON.parse(t)}catch{return}}y(safeJsonParse,"safeJsonParse");
@@ -1,3 +1,3 @@
1
- "use strict";var a=Object.defineProperty;var o=(i,e)=>a(i,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.serializeM0File=serializeM0File,exports.formatISO=formatISO;const momo_types_1=require("@m0saic/momo-types"),m0Validation_1=require("../m0Validation");function serializeM0File(i){const e=(0,m0Validation_1.canonicalizeAndValidateM0)("serializeM0File",i.m0,"serializeM0File: m0 layout string cannot be empty."),t=i.created??new Date,n=i.app??null?String(i.app).trim():null,u=i.appVersion??null?String(i.appVersion).trim():null,c=i.meta??null,s=i.size??null;s&&assertValidSize(s.width,s.height);const r=["# m0","# version: 1",`# created: ${formatISO(t)}`];if(s&&r.push(`# size: ${s.width}x${s.height}`),n&&r.push(`# app: ${n}`),u&&r.push(`# appVersion: ${u}`),c){const l=["title","author","source","note"];for(const p of l){const m=c[p];m!=null&&m.trim()!==""&&r.push(`# ${p}: ${m.trim()}`)}}return appendAgentLines(r,i.agent??null),r.push(""),r.push(e),r.join(`
1
+ "use strict";var l=Object.defineProperty;var o=(i,e)=>l(i,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.serializeM0File=serializeM0File,exports.formatISO=formatISO;const agent_1=require("../agent"),m0Validation_1=require("../m0Validation");function serializeM0File(i){const e=(0,m0Validation_1.canonicalizeAndValidateM0)("serializeM0File",i.m0,"serializeM0File: m0 layout string cannot be empty."),t=i.created??new Date,n=i.app??null?String(i.app).trim():null,u=i.appVersion??null?String(i.appVersion).trim():null,c=i.meta??null,s=i.size??null;s&&assertValidSize(s.width,s.height);const r=["# m0","# version: 1",`# created: ${formatISO(t)}`];if(s&&r.push(`# size: ${s.width}x${s.height}`),n&&r.push(`# app: ${n}`),u&&r.push(`# appVersion: ${u}`),c){const a=["title","author","source","note"];for(const p of a){const m=c[p];m!=null&&m.trim()!==""&&r.push(`# ${p}: ${m.trim()}`)}}return appendAgentLines(r,i.agent??null),r.push(""),r.push(e),r.join(`
2
2
  `)+`
3
- `}o(serializeM0File,"serializeM0File");function appendAgentLines(i,e){if(e){if(e.id&&e.id.trim()!==""&&i.push(`# m0agent:id: ${e.id.trim()}`),e.note&&e.note.trim()!==""&&i.push(`# m0agent:note: ${collapseToSingleLine(e.note)}`),e.question&&e.question.trim()!==""&&i.push(`# m0agent:question: ${collapseToSingleLine(e.question)}`),e.regions&&Object.keys(e.regions).length>0&&i.push(`# m0agent:regions: ${JSON.stringify(e.regions)}`),e.context!==void 0){const t=(0,momo_types_1.normalizeCandidateContext)(e.context);t!==void 0&&i.push(`# m0agent:context: ${JSON.stringify(t)}`)}if(e.response&&e.response.body.trim()!==""){const t={body:collapseToSingleLine(e.response.body),...e.response.from&&e.response.from.trim()!==""?{from:e.response.from.trim()}:{},...e.response.at&&e.response.at.trim()!==""?{at:e.response.at.trim()}:{}};i.push(`# m0agent:response: ${JSON.stringify(t)}`)}if(e.comments&&e.comments.length>0)for(const t of e.comments){if(!t||typeof t.body!="string"||t.body.trim()==="")continue;const n={...t.id&&t.id.trim()!==""?{id:t.id.trim()}:{},body:collapseToSingleLine(t.body),...t.from&&t.from.trim()!==""?{from:t.from.trim()}:{},...t.at&&t.at.trim()!==""?{at:t.at.trim()}:{}};i.push(`# m0agent:comment: ${JSON.stringify(n)}`)}}}o(appendAgentLines,"appendAgentLines");function collapseToSingleLine(i){return i.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim()}o(collapseToSingleLine,"collapseToSingleLine");function assertValidSize(i,e){if(!Number.isInteger(i)||i<=0)throw new Error("serializeM0File: width must be a positive integer.");if(!Number.isInteger(e)||e<=0)throw new Error("serializeM0File: height must be a positive integer.")}o(assertValidSize,"assertValidSize");function formatISO(i){const e=o((t,n=2)=>String(t).padStart(n,"0"),"pad");return`${i.getUTCFullYear()}-${e(i.getUTCMonth()+1)}-${e(i.getUTCDate())}T${e(i.getUTCHours())}:${e(i.getUTCMinutes())}:${e(i.getUTCSeconds())}.${e(i.getUTCMilliseconds(),3)}Z`}o(formatISO,"formatISO");
3
+ `}o(serializeM0File,"serializeM0File");function appendAgentLines(i,e){if(e){if(e.id&&e.id.trim()!==""&&i.push(`# m0agent:id: ${e.id.trim()}`),e.note&&e.note.trim()!==""&&i.push(`# m0agent:note: ${collapseToSingleLine(e.note)}`),e.question&&e.question.trim()!==""&&i.push(`# m0agent:question: ${collapseToSingleLine(e.question)}`),e.regions&&Object.keys(e.regions).length>0&&i.push(`# m0agent:regions: ${JSON.stringify(e.regions)}`),e.context!==void 0){const t=(0,agent_1.normalizeCandidateContext)(e.context);t!==void 0&&i.push(`# m0agent:context: ${JSON.stringify(t)}`)}if(e.response&&e.response.body.trim()!==""){const t={body:collapseToSingleLine(e.response.body),...e.response.from&&e.response.from.trim()!==""?{from:e.response.from.trim()}:{},...e.response.at&&e.response.at.trim()!==""?{at:e.response.at.trim()}:{}};i.push(`# m0agent:response: ${JSON.stringify(t)}`)}if(e.comments&&e.comments.length>0)for(const t of e.comments){if(!t||typeof t.body!="string"||t.body.trim()==="")continue;const n={...t.id&&t.id.trim()!==""?{id:t.id.trim()}:{},body:collapseToSingleLine(t.body),...t.from&&t.from.trim()!==""?{from:t.from.trim()}:{},...t.at&&t.at.trim()!==""?{at:t.at.trim()}:{}};i.push(`# m0agent:comment: ${JSON.stringify(n)}`)}}}o(appendAgentLines,"appendAgentLines");function collapseToSingleLine(i){return i.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim()}o(collapseToSingleLine,"collapseToSingleLine");function assertValidSize(i,e){if(!Number.isInteger(i)||i<=0)throw new Error("serializeM0File: width must be a positive integer.");if(!Number.isInteger(e)||e<=0)throw new Error("serializeM0File: height must be a positive integer.")}o(assertValidSize,"assertValidSize");function formatISO(i){const e=o((t,n=2)=>String(t).padStart(n,"0"),"pad");return`${i.getUTCFullYear()}-${e(i.getUTCMonth()+1)}-${e(i.getUTCDate())}T${e(i.getUTCHours())}:${e(i.getUTCMinutes())}:${e(i.getUTCSeconds())}.${e(i.getUTCMilliseconds(),3)}Z`}o(formatISO,"formatISO");
@@ -1,5 +1,5 @@
1
- "use strict";var w=Object.defineProperty;var u=(e,n)=>w(e,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.MOGGING_HEADER=void 0,exports.serializeM0cFile=serializeM0cFile,exports.serializeM0gFile=serializeM0gFile,exports.normalizeAgent=normalizeAgent,exports.parseM0cFile=parseM0cFile,exports.parseAgentOrNull=parseAgentOrNull;const serializeM0File_1=require("../m0/serializeM0File"),m0Validation_1=require("../m0Validation"),momo_types_1=require("@m0saic/momo-types"),derive_1=require("../derive");exports.MOGGING_HEADER="#mogging";function serializeM0cFile(e){const n=e.created??new Date,t=(0,m0Validation_1.canonicalizeAndValidateM0)("serializeM0cFile",e.m0,"serializeM0cFile: m0 layout string cannot be empty."),r=e.size??null;r&&assertValidSize(r.width,r.height);const i=e.app??null,s=e.appVersion??null,o=normalizeMeta(e.meta??null),c=normalizeAgent(e.agent??null),l=normalizeLabels(e.labels??null),a=normalizeDerive(e.background!==void 0?e.background:(0,derive_1.encodeBackgroundImage)(e.deriveImage??null)),f=normalizeMasks(e.masks??null),p=normalizeFill(e.fill??null),b=normalizeInsets(e.insets??null),y=normalizeRankSets(e.rankSets??null),d=e.gold??null,m=d!=null,g={format:m?"m0g":"m0c",version:1,created:(0,serializeM0File_1.formatISO)(n),app:i&&i.trim()!==""?i.trim():null,appVersion:s&&s.trim()!==""?s.trim():null,meta:o,agent:c,...m?{gold:d}:{},size:r,m0:t,labels:l,derive:a,masks:f,fill:p,insets:b,rankSets:y,custom:e.custom??null},h=JSON.stringify(g,null,2)+`
1
+ "use strict";var w=Object.defineProperty;var u=(e,n)=>w(e,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.MOGGING_HEADER=void 0,exports.serializeM0cFile=serializeM0cFile,exports.serializeM0gFile=serializeM0gFile,exports.normalizeAgent=normalizeAgent,exports.parseM0cFile=parseM0cFile,exports.parseAgentOrNull=parseAgentOrNull;const serializeM0File_1=require("../m0/serializeM0File"),m0Validation_1=require("../m0Validation"),agent_1=require("../agent"),derive_1=require("../derive");exports.MOGGING_HEADER="#mogging";function serializeM0cFile(e){const n=e.created??new Date,t=(0,m0Validation_1.canonicalizeAndValidateM0)("serializeM0cFile",e.m0,"serializeM0cFile: m0 layout string cannot be empty."),r=e.size??null;r&&assertValidSize(r.width,r.height);const i=e.app??null,s=e.appVersion??null,o=normalizeMeta(e.meta??null),c=normalizeAgent(e.agent??null),l=normalizeLabels(e.labels??null),a=normalizeDerive(e.background!==void 0?e.background:(0,derive_1.encodeBackgroundImage)(e.deriveImage??null)),f=normalizeMasks(e.masks??null),p=normalizeFill(e.fill??null),b=normalizeInsets(e.insets??null),y=normalizeRankSets(e.rankSets??null),d=e.gold??null,m=d!=null,g={format:m?"m0g":"m0c",version:1,created:(0,serializeM0File_1.formatISO)(n),app:i&&i.trim()!==""?i.trim():null,appVersion:s&&s.trim()!==""?s.trim():null,meta:o,agent:c,...m?{gold:d}:{},size:r,m0:t,labels:l,derive:a,masks:f,fill:p,insets:b,rankSets:y,custom:e.custom??null},h=JSON.stringify(g,null,2)+`
2
2
  `;return m?`${exports.MOGGING_HEADER}
3
- ${h}`:h}u(serializeM0cFile,"serializeM0cFile");function serializeM0gFile(e){return serializeM0cFile(e)}u(serializeM0gFile,"serializeM0gFile");function normalizeAgent(e){if(!e)return null;const n={};if(e.id&&e.id.trim()!==""&&(n.id=e.id.trim()),e.note&&e.note.trim()!==""&&(n.note=(0,momo_types_1.normalizeAgentProse)(e.note)),e.question&&e.question.trim()!==""&&(n.question=(0,momo_types_1.normalizeAgentProse)(e.question)),e.regions){const t={};for(const[r,i]of Object.entries(e.regions))typeof i=="string"&&i.trim()!==""&&(t[r]=i);Object.keys(t).length&&(n.regions=t)}if(e.context!==void 0){const t=(0,momo_types_1.normalizeCandidateContext)(e.context);t!==void 0&&(n.context=t)}if(e.response&&e.response.body&&e.response.body.trim()!==""){const t=e.response,r=Array.isArray(t.images)?t.images.filter(i=>typeof i=="string"&&i.length>0):[];n.response={body:(0,momo_types_1.normalizeAgentProse)(t.body),...t.from&&t.from.trim()!==""?{from:t.from.trim()}:{},...t.at&&t.at.trim()!==""?{at:t.at.trim()}:{},...t.src&&t.src.trim()!==""?{src:t.src.trim()}:{},...t.srcMosaic&&t.srcMosaic.trim()!==""?{srcMosaic:t.srcMosaic.trim()}:{},...r.length>0?{images:r}:{}}}if(e.comments&&Array.isArray(e.comments)&&e.comments.length>0){const t=[];for(const r of e.comments)!r||typeof r.body!="string"||r.body.trim()===""||t.push({...r.id&&r.id.trim()!==""?{id:r.id.trim()}:{},body:(0,momo_types_1.normalizeAgentProse)(r.body),...r.from&&r.from.trim()!==""?{from:r.from.trim()}:{},...r.at&&r.at.trim()!==""?{at:r.at.trim()}:{}});t.length&&(n.comments=t)}return Object.keys(n).length?n:null}u(normalizeAgent,"normalizeAgent");function normalizeMeta(e){if(!e)return null;const n={},t=["title","author","source","note"];for(const r of t){const i=e[r];if(i!=null){const s=i.trim();s!==""&&(n[r]=s)}}return Object.keys(n).length?n:null}u(normalizeMeta,"normalizeMeta");function normalizeLabels(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t||!r)continue;const i=(r.text??"").trim();if(!i)continue;const s=r.color?.trim();n[t]=s?{text:i,color:s}:{text:i}}return Object.keys(n).length?n:null}u(normalizeLabels,"normalizeLabels");function normalizeDerive(e){if(typeof e!="string")return{background:null};const n=e.trim();return{background:n===""?null:n}}u(normalizeDerive,"normalizeDerive");function normalizeMasks(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t)continue;if(r===null){n[t]=null;continue}if(!r||typeof r.localPath!="string"||r.localPath.trim()==="")continue;const i=r.bounds;!i||typeof i.x!="number"||typeof i.y!="number"||typeof i.width!="number"||typeof i.height!="number"||(n[t]={localPath:r.localPath,bounds:{x:i.x,y:i.y,width:i.width,height:i.height}})}return Object.keys(n).length?n:null}u(normalizeMasks,"normalizeMasks");function normalizeFill(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t||!r)continue;const i=typeof r.color=="string"?r.color.trim():"",s=typeof r.mediaRef=="string"?r.mediaRef.trim():"";if(!i&&!s)continue;const o={};i&&(o.color=i),s&&(o.mediaRef=s),n[t]=o}return Object.keys(n).length?n:null}u(normalizeFill,"normalizeFill");const INSET_EDGES=["top","right","bottom","left"];function normalizeInsets(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s)))t&&(!r||typeof r!="object"||INSET_EDGES.some(i=>typeof r[i]!="number"||!Number.isFinite(r[i]))||INSET_EDGES.every(i=>r[i]===0)||(n[t]={top:r.top,right:r.right,bottom:r.bottom,left:r.left}));return Object.keys(n).length?n:null}u(normalizeInsets,"normalizeInsets");function normalizeRankSets(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t)continue;if(r===null){n[t]=null;continue}const i=normalizeRankSet(r);i!==null&&(n[t]=i)}return Object.keys(n).length?n:null}u(normalizeRankSets,"normalizeRankSets");function normalizeRankSet(e){if(!e||typeof e!="object")return null;const n=typeof e.mode=="string"&&e.mode.trim()!==""?e.mode.trim():void 0,t={},r=e.ranks;if(!r||typeof r!="object"||Array.isArray(r))return null;for(const[i,s]of Object.entries(r).sort(([o],[c])=>o.localeCompare(c)))if(i){if(s===null){t[i]=null;continue}typeof s!="number"||!Number.isFinite(s)||(t[i]=s)}return Object.keys(t).length===0&&n===void 0?null:n!==void 0?{mode:n,ranks:t}:{ranks:t}}u(normalizeRankSet,"normalizeRankSet");function assertValidSize(e,n){if(!Number.isInteger(e)||e<=0)throw new Error("serializeM0cFile: width must be a positive integer.");if(!Number.isInteger(n)||n<=0)throw new Error("serializeM0cFile: height must be a positive integer.")}u(assertValidSize,"assertValidSize");function stripLeadingHashComments(e){const n=e.split(`
3
+ ${h}`:h}u(serializeM0cFile,"serializeM0cFile");function serializeM0gFile(e){return serializeM0cFile(e)}u(serializeM0gFile,"serializeM0gFile");function normalizeAgent(e){if(!e)return null;const n={};if(e.id&&e.id.trim()!==""&&(n.id=e.id.trim()),e.note&&e.note.trim()!==""&&(n.note=(0,agent_1.normalizeAgentProse)(e.note)),e.question&&e.question.trim()!==""&&(n.question=(0,agent_1.normalizeAgentProse)(e.question)),e.regions){const t={};for(const[r,i]of Object.entries(e.regions))typeof i=="string"&&i.trim()!==""&&(t[r]=i);Object.keys(t).length&&(n.regions=t)}if(e.context!==void 0){const t=(0,agent_1.normalizeCandidateContext)(e.context);t!==void 0&&(n.context=t)}if(e.response&&e.response.body&&e.response.body.trim()!==""){const t=e.response,r=Array.isArray(t.images)?t.images.filter(i=>typeof i=="string"&&i.length>0):[];n.response={body:(0,agent_1.normalizeAgentProse)(t.body),...t.from&&t.from.trim()!==""?{from:t.from.trim()}:{},...t.at&&t.at.trim()!==""?{at:t.at.trim()}:{},...t.src&&t.src.trim()!==""?{src:t.src.trim()}:{},...t.srcMosaic&&t.srcMosaic.trim()!==""?{srcMosaic:t.srcMosaic.trim()}:{},...r.length>0?{images:r}:{}}}if(e.comments&&Array.isArray(e.comments)&&e.comments.length>0){const t=[];for(const r of e.comments)!r||typeof r.body!="string"||r.body.trim()===""||t.push({...r.id&&r.id.trim()!==""?{id:r.id.trim()}:{},body:(0,agent_1.normalizeAgentProse)(r.body),...r.from&&r.from.trim()!==""?{from:r.from.trim()}:{},...r.at&&r.at.trim()!==""?{at:r.at.trim()}:{}});t.length&&(n.comments=t)}return Object.keys(n).length?n:null}u(normalizeAgent,"normalizeAgent");function normalizeMeta(e){if(!e)return null;const n={},t=["title","author","source","note"];for(const r of t){const i=e[r];if(i!=null){const s=i.trim();s!==""&&(n[r]=s)}}return Object.keys(n).length?n:null}u(normalizeMeta,"normalizeMeta");function normalizeLabels(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t||!r)continue;const i=(r.text??"").trim();if(!i)continue;const s=r.color?.trim();n[t]=s?{text:i,color:s}:{text:i}}return Object.keys(n).length?n:null}u(normalizeLabels,"normalizeLabels");function normalizeDerive(e){if(typeof e!="string")return{background:null};const n=e.trim();return{background:n===""?null:n}}u(normalizeDerive,"normalizeDerive");function normalizeMasks(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t)continue;if(r===null){n[t]=null;continue}if(!r||typeof r.localPath!="string"||r.localPath.trim()==="")continue;const i=r.bounds;!i||typeof i.x!="number"||typeof i.y!="number"||typeof i.width!="number"||typeof i.height!="number"||(n[t]={localPath:r.localPath,bounds:{x:i.x,y:i.y,width:i.width,height:i.height}})}return Object.keys(n).length?n:null}u(normalizeMasks,"normalizeMasks");function normalizeFill(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t||!r)continue;const i=typeof r.color=="string"?r.color.trim():"",s=typeof r.mediaRef=="string"?r.mediaRef.trim():"";if(!i&&!s)continue;const o={};i&&(o.color=i),s&&(o.mediaRef=s),n[t]=o}return Object.keys(n).length?n:null}u(normalizeFill,"normalizeFill");const INSET_EDGES=["top","right","bottom","left"];function normalizeInsets(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s)))t&&(!r||typeof r!="object"||INSET_EDGES.some(i=>typeof r[i]!="number"||!Number.isFinite(r[i]))||INSET_EDGES.every(i=>r[i]===0)||(n[t]={top:r.top,right:r.right,bottom:r.bottom,left:r.left}));return Object.keys(n).length?n:null}u(normalizeInsets,"normalizeInsets");function normalizeRankSets(e){if(!e)return null;const n={};for(const[t,r]of Object.entries(e).sort(([i],[s])=>i.localeCompare(s))){if(!t)continue;if(r===null){n[t]=null;continue}const i=normalizeRankSet(r);i!==null&&(n[t]=i)}return Object.keys(n).length?n:null}u(normalizeRankSets,"normalizeRankSets");function normalizeRankSet(e){if(!e||typeof e!="object")return null;const n=typeof e.mode=="string"&&e.mode.trim()!==""?e.mode.trim():void 0,t={},r=e.ranks;if(!r||typeof r!="object"||Array.isArray(r))return null;for(const[i,s]of Object.entries(r).sort(([o],[c])=>o.localeCompare(c)))if(i){if(s===null){t[i]=null;continue}typeof s!="number"||!Number.isFinite(s)||(t[i]=s)}return Object.keys(t).length===0&&n===void 0?null:n!==void 0?{mode:n,ranks:t}:{ranks:t}}u(normalizeRankSet,"normalizeRankSet");function assertValidSize(e,n){if(!Number.isInteger(e)||e<=0)throw new Error("serializeM0cFile: width must be a positive integer.");if(!Number.isInteger(n)||n<=0)throw new Error("serializeM0cFile: height must be a positive integer.")}u(assertValidSize,"assertValidSize");function stripLeadingHashComments(e){const n=e.split(`
4
4
  `);let t=0;for(;t<n.length;){const r=n[t].trim();if(r===""||r.startsWith("#")){t++;continue}break}return n.slice(t).join(`
5
- `)}u(stripLeadingHashComments,"stripLeadingHashComments");function parseGoldOrNull(e){if(!isPlainObject(e))return null;const n=e,t={};return typeof n.promotedAt=="string"&&(t.promotedAt=n.promotedAt),typeof n.provenance=="string"&&(t.provenance=n.provenance),"criteria"in n&&(t.criteria=n.criteria),t}u(parseGoldOrNull,"parseGoldOrNull");function parseM0cFile(e){if(typeof e!="string")throw new Error("parseM0cFile: input must be a string");let n;try{n=JSON.parse(stripLeadingHashComments(e))}catch{throw new Error("parseM0cFile: invalid JSON")}if(!isPlainObject(n))throw new Error("parseM0cFile: expected JSON object");const t=n;if(t.format!=="m0c"&&t.format!=="m0g")throw new Error(`parseM0cFile: expected format "m0c" or "m0g", got "${String(t.format)}"`);if(t.version!==1)throw new Error(`parseM0cFile: expected version 1, got ${String(t.version)}`);const r=typeof t.created=="string"?t.created.trim():"";if(!r)throw new Error("parseM0cFile: missing created timestamp");const i=(0,m0Validation_1.canonicalizeAndValidateM0)("parseM0cFile",typeof t.m0=="string"?t.m0:"","parseM0cFile: missing m0 payload"),s=parseSizeOrNull(t.size),o=parseStringOrNull(t.app),c=parseStringOrNull(t.appVersion),l=parseMetaOrNull(t.meta),a=parseAgentOrNull(t.agent),f=parseGoldOrNull(t.gold),p=parseLabelsOrNull(t.labels),b=parseDerive(t.derive),y=parseMasksOrNull(t.masks),d=parseFillOrNull(t.fill),m=parseInsetsOrNull(t.insets),g=parseRankSetsOrNull(t.rankSets);return{format:t.format,version:1,created:r,app:o,appVersion:c,meta:l,agent:a,...f?{gold:f}:{},size:s,m0:i,labels:p,derive:b,masks:y,fill:d,insets:m,rankSets:g,custom:t.custom===void 0?null:t.custom}}u(parseM0cFile,"parseM0cFile");function parseAgentOrNull(e){if(e==null||!isPlainObject(e))return null;const n=e,t={},r=parseStringOrNull(n.id);r&&(t.id=r);const i=parseStringOrNull(n.note);i&&(t.note=i);const s=parseStringOrNull(n.question);if(s&&(t.question=s),isPlainObject(n.regions)){const o={};for(const[c,l]of Object.entries(n.regions))typeof l=="string"&&l.trim()!==""&&(o[c]=l);Object.keys(o).length&&(t.regions=o)}if("context"in n){const o=(0,momo_types_1.normalizeCandidateContext)(n.context);o!==void 0&&(t.context=o)}if(isPlainObject(n.response)){const o=n.response;if(typeof o.body=="string"&&o.body.trim()!==""){const c={body:o.body};if(typeof o.from=="string"&&o.from.trim()!==""&&(c.from=o.from),typeof o.at=="string"&&o.at.trim()!==""&&(c.at=o.at),typeof o.src=="string"&&o.src.trim()!==""&&(c.src=o.src),typeof o.srcMosaic=="string"&&o.srcMosaic.trim()!==""&&(c.srcMosaic=o.srcMosaic),Array.isArray(o.images)){const l=o.images.filter(a=>typeof a=="string"&&a.length>0);l.length>0&&(c.images=l)}t.response=c}}if(Array.isArray(n.comments)){const o=[];for(const c of n.comments){if(!isPlainObject(c))continue;const l=c;if(typeof l.body!="string"||l.body.trim()==="")continue;const a={body:l.body};typeof l.id=="string"&&l.id.trim()!==""&&(a.id=l.id),typeof l.from=="string"&&l.from.trim()!==""&&(a.from=l.from),typeof l.at=="string"&&l.at.trim()!==""&&(a.at=l.at),o.push(a)}o.length&&(t.comments=o)}return Object.keys(t).length?t:null}u(parseAgentOrNull,"parseAgentOrNull");function parseStringOrNull(e){if(e==null||typeof e!="string")return null;const n=e.trim();return n||null}u(parseStringOrNull,"parseStringOrNull");function parseSizeOrNull(e){if(e==null||!isPlainObject(e))return null;const n=e.width,t=e.height;if(typeof n!="number"||typeof t!="number"||!Number.isInteger(n)||!Number.isInteger(t)||n<=0||t<=0)throw new Error("parseM0cFile: invalid size (expected {width,height} positive ints or null)");return{width:n,height:t}}u(parseSizeOrNull,"parseSizeOrNull");function parseMetaOrNull(e){if(e==null)return null;if(!isPlainObject(e))throw new Error("parseM0cFile: invalid meta (expected object or null)");const n=e,t={};for(const r of["title","author","source","note"]){const i=n[r];if(typeof i=="string"){const s=i.trim();s&&(t[r]=s)}}return Object.keys(t).length?t:null}u(parseMetaOrNull,"parseMetaOrNull");function parseLabelsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid labels (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r||!isPlainObject(i))continue;const s=i.text,o=typeof s=="string"?s.trim():"";if(!o)continue;const c=i.color,l=typeof c=="string"?c.trim():void 0;t[r]=l?{text:o,color:l}:{text:o}}return Object.keys(t).length?t:null}u(parseLabelsOrNull,"parseLabelsOrNull");function parseDerive(e){if(e==null)return{background:null};if(!isPlainObject(e))throw new Error("parseM0cFile: invalid derive (expected object or null)");const n=e.background;if(n==null)return{background:null};if(typeof n!="string")throw new Error("parseM0cFile: invalid derive.background (expected string or null)");const t=n.trim();return{background:t===""?null:t}}u(parseDerive,"parseDerive");function parseMasksOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid masks (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(i===null){t[r]=null;continue}if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid masks["${r}"] (expected object or null)`);const s=i.localPath;if(typeof s!="string"||s.trim()==="")throw new Error(`parseM0cFile: invalid masks["${r}"].localPath (expected non-empty string)`);const o=i.bounds;if(!isPlainObject(o))throw new Error(`parseM0cFile: invalid masks["${r}"].bounds (expected object)`);const c=o.x,l=o.y,a=o.width,f=o.height;if(typeof c!="number"||typeof l!="number"||typeof a!="number"||typeof f!="number"||!Number.isFinite(c)||!Number.isFinite(l)||!Number.isFinite(a)||!Number.isFinite(f))throw new Error(`parseM0cFile: invalid masks["${r}"].bounds (x/y/width/height must be finite numbers)`);t[r]={localPath:s,bounds:{x:c,y:l,width:a,height:f}}}return Object.keys(t).length?t:null}u(parseMasksOrNull,"parseMasksOrNull");function parseFillOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid fill (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid fill["${r}"] (expected object)`);const s=i.color,o=i.mediaRef,c=typeof s=="string"?s.trim():"",l=typeof o=="string"?o.trim():"";if(!c&&!l)continue;const a={};c&&(a.color=c),l&&(a.mediaRef=l),t[r]=a}return Object.keys(t).length?t:null}u(parseFillOrNull,"parseFillOrNull");function parseInsetsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid insets (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid insets["${r}"] (expected object)`);const s={};for(const o of INSET_EDGES){const c=i[o];if(typeof c!="number"||!Number.isFinite(c))throw new Error(`parseM0cFile: invalid insets["${r}"].${o} (expected finite number)`);s[o]=c}INSET_EDGES.every(o=>s[o]===0)||(t[r]={top:s.top,right:s.right,bottom:s.bottom,left:s.left})}return Object.keys(t).length?t:null}u(parseInsetsOrNull,"parseInsetsOrNull");function parseRankSetsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid rankSets (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(i===null){t[r]=null;continue}if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid rankSets["${r}"] (expected object or null)`);const s=i.mode,o=s===void 0?void 0:typeof s=="string"?s:(()=>{throw new Error(`parseM0cFile: invalid rankSets["${r}"].mode (expected string or absent)`)})(),c=i.ranks;if(!isPlainObject(c)||Array.isArray(c))throw new Error(`parseM0cFile: invalid rankSets["${r}"].ranks (expected object map keyed by stableKey)`);const l={};for(const[a,f]of Object.entries(c))if(a){if(f===null){l[a]=null;continue}if(typeof f!="number"||!Number.isFinite(f))throw new Error(`parseM0cFile: invalid rankSets["${r}"].ranks["${a}"] (expected finite number or null)`);l[a]=f}t[r]=o!==void 0?{mode:o,ranks:l}:{ranks:l}}return Object.keys(t).length?t:null}u(parseRankSetsOrNull,"parseRankSetsOrNull");function isPlainObject(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}u(isPlainObject,"isPlainObject");
5
+ `)}u(stripLeadingHashComments,"stripLeadingHashComments");function parseGoldOrNull(e){if(!isPlainObject(e))return null;const n=e,t={};return typeof n.promotedAt=="string"&&(t.promotedAt=n.promotedAt),typeof n.provenance=="string"&&(t.provenance=n.provenance),"criteria"in n&&(t.criteria=n.criteria),t}u(parseGoldOrNull,"parseGoldOrNull");function parseM0cFile(e){if(typeof e!="string")throw new Error("parseM0cFile: input must be a string");let n;try{n=JSON.parse(stripLeadingHashComments(e))}catch{throw new Error("parseM0cFile: invalid JSON")}if(!isPlainObject(n))throw new Error("parseM0cFile: expected JSON object");const t=n;if(t.format!=="m0c"&&t.format!=="m0g")throw new Error(`parseM0cFile: expected format "m0c" or "m0g", got "${String(t.format)}"`);if(t.version!==1)throw new Error(`parseM0cFile: expected version 1, got ${String(t.version)}`);const r=typeof t.created=="string"?t.created.trim():"";if(!r)throw new Error("parseM0cFile: missing created timestamp");const i=(0,m0Validation_1.canonicalizeAndValidateM0)("parseM0cFile",typeof t.m0=="string"?t.m0:"","parseM0cFile: missing m0 payload"),s=parseSizeOrNull(t.size),o=parseStringOrNull(t.app),c=parseStringOrNull(t.appVersion),l=parseMetaOrNull(t.meta),a=parseAgentOrNull(t.agent),f=parseGoldOrNull(t.gold),p=parseLabelsOrNull(t.labels),b=parseDerive(t.derive),y=parseMasksOrNull(t.masks),d=parseFillOrNull(t.fill),m=parseInsetsOrNull(t.insets),g=parseRankSetsOrNull(t.rankSets);return{format:t.format,version:1,created:r,app:o,appVersion:c,meta:l,agent:a,...f?{gold:f}:{},size:s,m0:i,labels:p,derive:b,masks:y,fill:d,insets:m,rankSets:g,custom:t.custom===void 0?null:t.custom}}u(parseM0cFile,"parseM0cFile");function parseAgentOrNull(e){if(e==null||!isPlainObject(e))return null;const n=e,t={},r=parseStringOrNull(n.id);r&&(t.id=r);const i=parseStringOrNull(n.note);i&&(t.note=i);const s=parseStringOrNull(n.question);if(s&&(t.question=s),isPlainObject(n.regions)){const o={};for(const[c,l]of Object.entries(n.regions))typeof l=="string"&&l.trim()!==""&&(o[c]=l);Object.keys(o).length&&(t.regions=o)}if("context"in n){const o=(0,agent_1.normalizeCandidateContext)(n.context);o!==void 0&&(t.context=o)}if(isPlainObject(n.response)){const o=n.response;if(typeof o.body=="string"&&o.body.trim()!==""){const c={body:o.body};if(typeof o.from=="string"&&o.from.trim()!==""&&(c.from=o.from),typeof o.at=="string"&&o.at.trim()!==""&&(c.at=o.at),typeof o.src=="string"&&o.src.trim()!==""&&(c.src=o.src),typeof o.srcMosaic=="string"&&o.srcMosaic.trim()!==""&&(c.srcMosaic=o.srcMosaic),Array.isArray(o.images)){const l=o.images.filter(a=>typeof a=="string"&&a.length>0);l.length>0&&(c.images=l)}t.response=c}}if(Array.isArray(n.comments)){const o=[];for(const c of n.comments){if(!isPlainObject(c))continue;const l=c;if(typeof l.body!="string"||l.body.trim()==="")continue;const a={body:l.body};typeof l.id=="string"&&l.id.trim()!==""&&(a.id=l.id),typeof l.from=="string"&&l.from.trim()!==""&&(a.from=l.from),typeof l.at=="string"&&l.at.trim()!==""&&(a.at=l.at),o.push(a)}o.length&&(t.comments=o)}return Object.keys(t).length?t:null}u(parseAgentOrNull,"parseAgentOrNull");function parseStringOrNull(e){if(e==null||typeof e!="string")return null;const n=e.trim();return n||null}u(parseStringOrNull,"parseStringOrNull");function parseSizeOrNull(e){if(e==null||!isPlainObject(e))return null;const n=e.width,t=e.height;if(typeof n!="number"||typeof t!="number"||!Number.isInteger(n)||!Number.isInteger(t)||n<=0||t<=0)throw new Error("parseM0cFile: invalid size (expected {width,height} positive ints or null)");return{width:n,height:t}}u(parseSizeOrNull,"parseSizeOrNull");function parseMetaOrNull(e){if(e==null)return null;if(!isPlainObject(e))throw new Error("parseM0cFile: invalid meta (expected object or null)");const n=e,t={};for(const r of["title","author","source","note"]){const i=n[r];if(typeof i=="string"){const s=i.trim();s&&(t[r]=s)}}return Object.keys(t).length?t:null}u(parseMetaOrNull,"parseMetaOrNull");function parseLabelsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid labels (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r||!isPlainObject(i))continue;const s=i.text,o=typeof s=="string"?s.trim():"";if(!o)continue;const c=i.color,l=typeof c=="string"?c.trim():void 0;t[r]=l?{text:o,color:l}:{text:o}}return Object.keys(t).length?t:null}u(parseLabelsOrNull,"parseLabelsOrNull");function parseDerive(e){if(e==null)return{background:null};if(!isPlainObject(e))throw new Error("parseM0cFile: invalid derive (expected object or null)");const n=e.background;if(n==null)return{background:null};if(typeof n!="string")throw new Error("parseM0cFile: invalid derive.background (expected string or null)");const t=n.trim();return{background:t===""?null:t}}u(parseDerive,"parseDerive");function parseMasksOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid masks (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(i===null){t[r]=null;continue}if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid masks["${r}"] (expected object or null)`);const s=i.localPath;if(typeof s!="string"||s.trim()==="")throw new Error(`parseM0cFile: invalid masks["${r}"].localPath (expected non-empty string)`);const o=i.bounds;if(!isPlainObject(o))throw new Error(`parseM0cFile: invalid masks["${r}"].bounds (expected object)`);const c=o.x,l=o.y,a=o.width,f=o.height;if(typeof c!="number"||typeof l!="number"||typeof a!="number"||typeof f!="number"||!Number.isFinite(c)||!Number.isFinite(l)||!Number.isFinite(a)||!Number.isFinite(f))throw new Error(`parseM0cFile: invalid masks["${r}"].bounds (x/y/width/height must be finite numbers)`);t[r]={localPath:s,bounds:{x:c,y:l,width:a,height:f}}}return Object.keys(t).length?t:null}u(parseMasksOrNull,"parseMasksOrNull");function parseFillOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid fill (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid fill["${r}"] (expected object)`);const s=i.color,o=i.mediaRef,c=typeof s=="string"?s.trim():"",l=typeof o=="string"?o.trim():"";if(!c&&!l)continue;const a={};c&&(a.color=c),l&&(a.mediaRef=l),t[r]=a}return Object.keys(t).length?t:null}u(parseFillOrNull,"parseFillOrNull");function parseInsetsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid insets (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid insets["${r}"] (expected object)`);const s={};for(const o of INSET_EDGES){const c=i[o];if(typeof c!="number"||!Number.isFinite(c))throw new Error(`parseM0cFile: invalid insets["${r}"].${o} (expected finite number)`);s[o]=c}INSET_EDGES.every(o=>s[o]===0)||(t[r]={top:s.top,right:s.right,bottom:s.bottom,left:s.left})}return Object.keys(t).length?t:null}u(parseInsetsOrNull,"parseInsetsOrNull");function parseRankSetsOrNull(e){if(e==null)return null;if(!isPlainObject(e)||Array.isArray(e))throw new Error("parseM0cFile: invalid rankSets (expected object map or null)");const n=e,t={};for(const[r,i]of Object.entries(n)){if(!r)continue;if(i===null){t[r]=null;continue}if(!isPlainObject(i))throw new Error(`parseM0cFile: invalid rankSets["${r}"] (expected object or null)`);const s=i.mode,o=s===void 0?void 0:typeof s=="string"?s:(()=>{throw new Error(`parseM0cFile: invalid rankSets["${r}"].mode (expected string or absent)`)})(),c=i.ranks;if(!isPlainObject(c)||Array.isArray(c))throw new Error(`parseM0cFile: invalid rankSets["${r}"].ranks (expected object map keyed by stableKey)`);const l={};for(const[a,f]of Object.entries(c))if(a){if(f===null){l[a]=null;continue}if(typeof f!="number"||!Number.isFinite(f))throw new Error(`parseM0cFile: invalid rankSets["${r}"].ranks["${a}"] (expected finite number or null)`);l[a]=f}t[r]=o!==void 0?{mode:o,ranks:l}:{ranks:l}}return Object.keys(t).length?t:null}u(parseRankSetsOrNull,"parseRankSetsOrNull");function isPlainObject(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}u(isPlainObject,"isPlainObject");
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.mintAgentId=void 0;var momo_types_1=require("@m0saic/momo-types");Object.defineProperty(exports,"mintAgentId",{enumerable:!0,get:e(function(){return momo_types_1.mintAgentId},"get")});
1
+ "use strict";var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.normalizeCandidateContext=exports.normalizeAgentProse=exports.collapseAgentProse=exports.mintAgentId=void 0;var agent_1=require("./agent");Object.defineProperty(exports,"mintAgentId",{enumerable:!0,get:e(function(){return agent_1.mintAgentId},"get")}),Object.defineProperty(exports,"collapseAgentProse",{enumerable:!0,get:e(function(){return agent_1.collapseAgentProse},"get")}),Object.defineProperty(exports,"normalizeAgentProse",{enumerable:!0,get:e(function(){return agent_1.normalizeAgentProse},"get")}),Object.defineProperty(exports,"normalizeCandidateContext",{enumerable:!0,get:e(function(){return agent_1.normalizeCandidateContext},"get")});
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m0saic/dsl-file-formats",
3
- "version": "1.1.0",
3
+ "version": "2.0.1",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "exports": {
6
6
  ".": {
@@ -0,0 +1 @@
1
+ "use strict";var S=Object.defineProperty;var c=(e,n)=>S(e,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.bakeM0cInsets=bakeM0cInsets,exports.lowerM0cToM0=lowerM0cToM0;const dsl_file_formats_1=require("@m0saic/dsl-file-formats"),rebuildRects_1=require("./rebuildRects"),packLeafRects_1=require("./_internal/packLeafRects"),queryFrames_1=require("../queries/queryFrames"),output_1=require("../transforms/_internal/output"),INSET_EDGES=["top","right","bottom","left"];function isMeaningfulInset(e){if(!e||typeof e!="object")return!1;const n=e;return INSET_EDGES.some(s=>typeof n[s]!="number"||!Number.isFinite(n[s]))?!1:INSET_EDGES.some(s=>n[s]>0)}c(isMeaningfulInset,"isMeaningfulInset");function insetRect(e,n){const s=Math.floor(n.left*e.w),u=Math.floor(n.right*e.w),r=Math.floor(n.top*e.h),a=Math.floor(n.bottom*e.h);return{x:e.x+s,y:e.y+r,w:Math.max(1,e.w-(s+u)),h:Math.max(1,e.h-(r+a))}}c(insetRect,"insetRect");function sameRect(e,n){return e.x===n.x&&e.y===n.y&&e.w===n.w&&e.h===n.h}c(sameRect,"sameRect");function carryMap(e,n,s){if(!e)return e;const u={};let r=!1;for(const[a,d]of Object.entries(e)){const f=n.get(a)??a;if(!s.has(f)){r=!0;continue}f!==a&&(r=!0),u[f]=d}return r?u:e}c(carryMap,"carryMap");function bakeM0cInsets(e,n={}){const s=Object.entries(e.insets??{}).filter(([,t])=>isMeaningfulInset(t)),u=c((t,o)=>({file:e.insets==null?e:{...e,insets:null},rekey:[],liveKeys:[],meta:{changed:!1,frameCount:t,insetCount:0,orphanInsetKeys:o,dslLengthBefore:e.m0.length,dslLengthAfter:e.m0.length}}),"unchanged");if(s.length===0)return u(0,[]);const r=e.size;if(!r||!Number.isInteger(r.width)||!Number.isInteger(r.height)||r.width<1||r.height<1)throw new Error("bakeM0cInsets: the file carries insets but no canvas size \u2014 insets are fractions of a canvas, so `size` must be set before they can be baked");const{width:a,height:d}=r,f=(0,output_1.validateInputOrThrow)("bakeM0cInsets",e.m0),y=(0,queryFrames_1.queryFrames)(f,{width:a,height:d}),m=y.render();if(m.length===0)throw new Error("bakeM0cInsets: document has no rendered frames");const w=new Map;for(const t of m)w.set(t.logicalIndex,{x:Math.max(0,Math.round(t.x)),y:Math.max(0,Math.round(t.y)),w:Math.max(1,Math.round(t.width)),h:Math.max(1,Math.round(t.height))});const x=new Map;for(const t of y.editor().filter(packLeafRects_1.isRenderedLeaf)){if(t.logicalIndex==null)continue;const o=w.get(t.logicalIndex);o&&x.set(String(t.meta.stableKey),o)}const p={},M=[];let b=0;for(const[t,o]of s){const l=x.get(t);if(!l){M.push(t);continue}const i=insetRect(l,o);sameRect(i,l)||(p[t]=i,b++)}if(b===0)return u(m.length,M);const h=(0,rebuildRects_1.rebuildRects)({m0:f,width:a,height:d,overrides:p,reduceSplits:n.reduceSplits??!0}),g=new Map(h.rekey.map(t=>[t.from,t.to])),k=new Set(h.liveKeys);let I=e.rankSets;if(e.rankSets){let t=!1;const o={};for(const[l,i]of Object.entries(e.rankSets)){if(i?.ranks){const _=carryMap(i.ranks,g,k);if(_!==i.ranks){o[l]={...i,ranks:_??{}},t=!0;continue}}o[l]=i}t&&(I=o)}return{file:{...e,m0:h.m0,labels:carryMap(e.labels,g,k)??null,...e.masks!==void 0?{masks:carryMap(e.masks,g,k)}:{},...e.fill!==void 0?{fill:carryMap(e.fill,g,k)}:{},insets:null,...e.rankSets!==void 0?{rankSets:I}:{}},rekey:h.rekey,liveKeys:h.liveKeys,meta:{changed:!0,frameCount:m.length,insetCount:b,orphanInsetKeys:M,dslLengthBefore:f.length,dslLengthAfter:h.m0.length}}}c(bakeM0cInsets,"bakeM0cInsets");function lowerM0cToM0(e,n={}){const s=bakeM0cInsets(e,n);return{file:(0,dsl_file_formats_1.downgradeM0cToM0)(s.file),baked:s.meta}}c(lowerM0cToM0,"lowerM0cToM0");
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTick=exports.categoryCenters=exports.project=exports.linearScale=exports.niceNum=exports.compactLossless=exports.bakeInsets=exports.rebuildRects=exports.compactDocument=exports.goldenRect=exports.goldenSpiral=exports.goldenSplit=exports.snapGridEnumerate=exports.snapGridFind=exports.snapGridFit=exports.rankedList=exports.comparison=exports.spotlight=exports.safeCanvas=exports.aspectSafeGrid=exports.placeInsetRects=exports.placeOptimizedRects=exports.snapRectPrecision=exports.placeRects=exports.placeRect=exports.aspectFit=exports.strip=exports.grid=exports.container=exports.weightedSplit=exports.weightedTokens=exports.equalSplit=void 0;var equalSplit_1=require("./equalSplit");Object.defineProperty(exports,"equalSplit",{enumerable:!0,get:e(function(){return equalSplit_1.equalSplit},"get")});var weightedTokens_1=require("./weightedTokens");Object.defineProperty(exports,"weightedTokens",{enumerable:!0,get:e(function(){return weightedTokens_1.weightedTokens},"get")});var weightedSplit_1=require("./weightedSplit");Object.defineProperty(exports,"weightedSplit",{enumerable:!0,get:e(function(){return weightedSplit_1.weightedSplit},"get")});var container_1=require("./container");Object.defineProperty(exports,"container",{enumerable:!0,get:e(function(){return container_1.container},"get")});var grid_1=require("./grid");Object.defineProperty(exports,"grid",{enumerable:!0,get:e(function(){return grid_1.grid},"get")});var strip_1=require("./strip");Object.defineProperty(exports,"strip",{enumerable:!0,get:e(function(){return strip_1.strip},"get")});var aspectFit_1=require("./aspectFit");Object.defineProperty(exports,"aspectFit",{enumerable:!0,get:e(function(){return aspectFit_1.aspectFit},"get")});var placeRect_1=require("./placeRect");Object.defineProperty(exports,"placeRect",{enumerable:!0,get:e(function(){return placeRect_1.placeRect},"get")});var placeRects_1=require("./placeRects");Object.defineProperty(exports,"placeRects",{enumerable:!0,get:e(function(){return placeRects_1.placeRects},"get")});var snapRectPrecision_1=require("./snapRectPrecision");Object.defineProperty(exports,"snapRectPrecision",{enumerable:!0,get:e(function(){return snapRectPrecision_1.snapRectPrecision},"get")});var placeOptimizedRects_1=require("./placeOptimizedRects");Object.defineProperty(exports,"placeOptimizedRects",{enumerable:!0,get:e(function(){return placeOptimizedRects_1.placeOptimizedRects},"get")});var placeInsetRects_1=require("./placeInsetRects");Object.defineProperty(exports,"placeInsetRects",{enumerable:!0,get:e(function(){return placeInsetRects_1.placeInsetRects},"get")});var aspectSafeGrid_1=require("./aspectSafeGrid");Object.defineProperty(exports,"aspectSafeGrid",{enumerable:!0,get:e(function(){return aspectSafeGrid_1.aspectSafeGrid},"get")});var safeCanvas_1=require("./safeCanvas");Object.defineProperty(exports,"safeCanvas",{enumerable:!0,get:e(function(){return safeCanvas_1.safeCanvas},"get")});var spotlight_1=require("./spotlight");Object.defineProperty(exports,"spotlight",{enumerable:!0,get:e(function(){return spotlight_1.spotlight},"get")});var comparison_1=require("./comparison");Object.defineProperty(exports,"comparison",{enumerable:!0,get:e(function(){return comparison_1.comparison},"get")});var rankedList_1=require("./rankedList");Object.defineProperty(exports,"rankedList",{enumerable:!0,get:e(function(){return rankedList_1.rankedList},"get")});var snapGrid_1=require("./snapGrid");Object.defineProperty(exports,"snapGridFit",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridFit},"get")}),Object.defineProperty(exports,"snapGridFind",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridFind},"get")}),Object.defineProperty(exports,"snapGridEnumerate",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridEnumerate},"get")});var golden_1=require("./golden");Object.defineProperty(exports,"goldenSplit",{enumerable:!0,get:e(function(){return golden_1.goldenSplit},"get")}),Object.defineProperty(exports,"goldenSpiral",{enumerable:!0,get:e(function(){return golden_1.goldenSpiral},"get")}),Object.defineProperty(exports,"goldenRect",{enumerable:!0,get:e(function(){return golden_1.goldenRect},"get")});var compactDocument_1=require("./compactDocument");Object.defineProperty(exports,"compactDocument",{enumerable:!0,get:e(function(){return compactDocument_1.compactDocument},"get")});var rebuildRects_1=require("./rebuildRects");Object.defineProperty(exports,"rebuildRects",{enumerable:!0,get:e(function(){return rebuildRects_1.rebuildRects},"get")});var bakeInsets_1=require("./bakeInsets");Object.defineProperty(exports,"bakeInsets",{enumerable:!0,get:e(function(){return bakeInsets_1.bakeInsets},"get")});var compactLossless_1=require("./compactLossless");Object.defineProperty(exports,"compactLossless",{enumerable:!0,get:e(function(){return compactLossless_1.compactLossless},"get")});var scale_1=require("./scale");Object.defineProperty(exports,"niceNum",{enumerable:!0,get:e(function(){return scale_1.niceNum},"get")}),Object.defineProperty(exports,"linearScale",{enumerable:!0,get:e(function(){return scale_1.linearScale},"get")}),Object.defineProperty(exports,"project",{enumerable:!0,get:e(function(){return scale_1.project},"get")}),Object.defineProperty(exports,"categoryCenters",{enumerable:!0,get:e(function(){return scale_1.categoryCenters},"get")}),Object.defineProperty(exports,"formatTick",{enumerable:!0,get:e(function(){return scale_1.formatTick},"get")});
1
+ "use strict";var n=Object.defineProperty;var e=(r,t)=>n(r,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTick=exports.categoryCenters=exports.project=exports.linearScale=exports.niceNum=exports.compactLossless=exports.bakeInsets=exports.rebuildRects=exports.compactDocument=exports.goldenRect=exports.goldenSpiral=exports.goldenSplit=exports.snapGridEnumerate=exports.snapGridFind=exports.snapGridFit=exports.rankedList=exports.comparison=exports.spotlight=exports.safeCanvas=exports.aspectSafeGrid=exports.lowerM0cToM0=exports.bakeM0cInsets=exports.placeInsetRects=exports.placeOptimizedRects=exports.snapRectPrecision=exports.placeRects=exports.placeRect=exports.aspectFit=exports.strip=exports.grid=exports.container=exports.weightedSplit=exports.weightedTokens=exports.equalSplit=void 0;var equalSplit_1=require("./equalSplit");Object.defineProperty(exports,"equalSplit",{enumerable:!0,get:e(function(){return equalSplit_1.equalSplit},"get")});var weightedTokens_1=require("./weightedTokens");Object.defineProperty(exports,"weightedTokens",{enumerable:!0,get:e(function(){return weightedTokens_1.weightedTokens},"get")});var weightedSplit_1=require("./weightedSplit");Object.defineProperty(exports,"weightedSplit",{enumerable:!0,get:e(function(){return weightedSplit_1.weightedSplit},"get")});var container_1=require("./container");Object.defineProperty(exports,"container",{enumerable:!0,get:e(function(){return container_1.container},"get")});var grid_1=require("./grid");Object.defineProperty(exports,"grid",{enumerable:!0,get:e(function(){return grid_1.grid},"get")});var strip_1=require("./strip");Object.defineProperty(exports,"strip",{enumerable:!0,get:e(function(){return strip_1.strip},"get")});var aspectFit_1=require("./aspectFit");Object.defineProperty(exports,"aspectFit",{enumerable:!0,get:e(function(){return aspectFit_1.aspectFit},"get")});var placeRect_1=require("./placeRect");Object.defineProperty(exports,"placeRect",{enumerable:!0,get:e(function(){return placeRect_1.placeRect},"get")});var placeRects_1=require("./placeRects");Object.defineProperty(exports,"placeRects",{enumerable:!0,get:e(function(){return placeRects_1.placeRects},"get")});var snapRectPrecision_1=require("./snapRectPrecision");Object.defineProperty(exports,"snapRectPrecision",{enumerable:!0,get:e(function(){return snapRectPrecision_1.snapRectPrecision},"get")});var placeOptimizedRects_1=require("./placeOptimizedRects");Object.defineProperty(exports,"placeOptimizedRects",{enumerable:!0,get:e(function(){return placeOptimizedRects_1.placeOptimizedRects},"get")});var placeInsetRects_1=require("./placeInsetRects");Object.defineProperty(exports,"placeInsetRects",{enumerable:!0,get:e(function(){return placeInsetRects_1.placeInsetRects},"get")});var bakeM0cInsets_1=require("./bakeM0cInsets");Object.defineProperty(exports,"bakeM0cInsets",{enumerable:!0,get:e(function(){return bakeM0cInsets_1.bakeM0cInsets},"get")}),Object.defineProperty(exports,"lowerM0cToM0",{enumerable:!0,get:e(function(){return bakeM0cInsets_1.lowerM0cToM0},"get")});var aspectSafeGrid_1=require("./aspectSafeGrid");Object.defineProperty(exports,"aspectSafeGrid",{enumerable:!0,get:e(function(){return aspectSafeGrid_1.aspectSafeGrid},"get")});var safeCanvas_1=require("./safeCanvas");Object.defineProperty(exports,"safeCanvas",{enumerable:!0,get:e(function(){return safeCanvas_1.safeCanvas},"get")});var spotlight_1=require("./spotlight");Object.defineProperty(exports,"spotlight",{enumerable:!0,get:e(function(){return spotlight_1.spotlight},"get")});var comparison_1=require("./comparison");Object.defineProperty(exports,"comparison",{enumerable:!0,get:e(function(){return comparison_1.comparison},"get")});var rankedList_1=require("./rankedList");Object.defineProperty(exports,"rankedList",{enumerable:!0,get:e(function(){return rankedList_1.rankedList},"get")});var snapGrid_1=require("./snapGrid");Object.defineProperty(exports,"snapGridFit",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridFit},"get")}),Object.defineProperty(exports,"snapGridFind",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridFind},"get")}),Object.defineProperty(exports,"snapGridEnumerate",{enumerable:!0,get:e(function(){return snapGrid_1.snapGridEnumerate},"get")});var golden_1=require("./golden");Object.defineProperty(exports,"goldenSplit",{enumerable:!0,get:e(function(){return golden_1.goldenSplit},"get")}),Object.defineProperty(exports,"goldenSpiral",{enumerable:!0,get:e(function(){return golden_1.goldenSpiral},"get")}),Object.defineProperty(exports,"goldenRect",{enumerable:!0,get:e(function(){return golden_1.goldenRect},"get")});var compactDocument_1=require("./compactDocument");Object.defineProperty(exports,"compactDocument",{enumerable:!0,get:e(function(){return compactDocument_1.compactDocument},"get")});var rebuildRects_1=require("./rebuildRects");Object.defineProperty(exports,"rebuildRects",{enumerable:!0,get:e(function(){return rebuildRects_1.rebuildRects},"get")});var bakeInsets_1=require("./bakeInsets");Object.defineProperty(exports,"bakeInsets",{enumerable:!0,get:e(function(){return bakeInsets_1.bakeInsets},"get")});var compactLossless_1=require("./compactLossless");Object.defineProperty(exports,"compactLossless",{enumerable:!0,get:e(function(){return compactLossless_1.compactLossless},"get")});var scale_1=require("./scale");Object.defineProperty(exports,"niceNum",{enumerable:!0,get:e(function(){return scale_1.niceNum},"get")}),Object.defineProperty(exports,"linearScale",{enumerable:!0,get:e(function(){return scale_1.linearScale},"get")}),Object.defineProperty(exports,"project",{enumerable:!0,get:e(function(){return scale_1.project},"get")}),Object.defineProperty(exports,"categoryCenters",{enumerable:!0,get:e(function(){return scale_1.categoryCenters},"get")}),Object.defineProperty(exports,"formatTick",{enumerable:!0,get:e(function(){return scale_1.formatTick},"get")});
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m0saic/dsl-stdlib",
3
- "version": "2.0.0",
3
+ "version": "3.1.0",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "exports": {
6
6
  ".": {
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 m0saic LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,71 @@
1
+ # @m0saic/knowledge
2
+
3
+ The m0saic knowledge base, as plain Markdown: the **m0 handbook** (grammar,
4
+ semantics, the geometry math), the **skills** (engine mental models and
5
+ invariants), and the **template-authoring contract**. It is the same tree the
6
+ m0saic maintainers' agents work from, generated from the monorepo with every
7
+ internal reference rewritten to a public one.
8
+
9
+ **If you are a coding agent about to write a template: read this file, then
10
+ [`docs/m0saic-thesis.md`](docs/m0saic-thesis.md), then follow the router in
11
+ [`docs/README.md`](docs/README.md).** Nothing here needs a build, a network,
12
+ or a login.
13
+
14
+ ## Where it lives on disk
15
+
16
+ - Installed: `node_modules/@m0saic/knowledge/docs/` — the template repo
17
+ starters list this package as a devDependency, so `npm install` puts it
18
+ beside your code.
19
+ - On GitHub: [`m0saic-project/m0saic-packages/packages/knowledge`](https://github.com/m0saic-project/m0saic-packages/tree/main/packages/knowledge).
20
+
21
+ ## Authority order
22
+
23
+ 1. `docs/handbook/` — canonical truth for the m0 language and its geometry.
24
+ 2. `docs/skills/` — mental models and invariants; subordinate to the handbook.
25
+ 3. `docs/templates/` — the template contract, construction strategy, recipes,
26
+ perf rules; subordinate to both.
27
+
28
+ Handbook wins over skills, skills over templates, and **code wins over every
29
+ doc**: when a document and the packages disagree, the packages are right. The
30
+ one idea everything rests on: a layout is one string of rectangles
31
+ (`docs/m0saic-thesis.md`).
32
+
33
+ ## Read code, not just prose — the three example repos
34
+
35
+ | Repo | What it is | Good for |
36
+ |---|---|---|
37
+ | [`m0saic-project/m0saic-template-repo-starter`](https://github.com/m0saic-project/m0saic-template-repo-starter) | ~80 one-concept templates, one lesson each, zero-build | learning the shape of a template; copying a pattern in isolation |
38
+ | [`m0saic-project/m0saic-community-templates`](https://github.com/m0saic-project/m0saic-community-templates) | the public library, one folder per publisher, signed releases | a real submission's layout, tests, registry entry, `deprecated.replacement` |
39
+ | [`m0saic-project/m0saic-packages/packages/templates`](https://github.com/m0saic-project/m0saic-packages/tree/main/packages/templates) | the official library that ships in the product (100+ templates) | the house standard for every kind of template: brand, charts, media, data-driven, pipelines |
40
+
41
+ Start your own from the scaffold:
42
+ [`m0saic-template-repo-starter-base`](https://github.com/m0saic-project/m0saic-template-repo-starter-base)
43
+ (rename its placeholder identity in `src/repo.ts` before you publish).
44
+
45
+ ## Verify before you claim it works
46
+
47
+ - `validateM0String(str)` from `@m0saic/dsl` — never ship an m0 string you
48
+ did not validate; `isValidM0String` is the boolean form.
49
+ - `npm run verify` in a starter clone — build, lint, tests, the loader
50
+ contract, the dependency policy.
51
+ - `m0saic doctor <repo>` — the CLI's convention audit over a template repo;
52
+ its `latticeSmooth` finding is blocking.
53
+ - `m0saic make <id> --template-repo <repo> --validate-only` — the plan
54
+ without the render.
55
+
56
+ ## What is deliberately not here
57
+
58
+ The engine's internals — filtergraph construction, the cost model, the
59
+ ffmpeg walls and their mitigations, the private app internals. Where a page
60
+ would have cited one it says so in plain text ("absent in the shipped copy")
61
+ and stands on its own. Every author-facing consequence of those internals is
62
+ distilled into [`docs/templates/patterns/perf-authoring-rules.md`](docs/templates/patterns/perf-authoring-rules.md).
63
+
64
+ ## Maintenance
65
+
66
+ `docs/` is generated — do not edit it here. The source is the maintainers'
67
+ knowledge tree in the m0saic monorepo; a sync script regenerates this copy
68
+ and fails if any reference to private code survives. Found something wrong?
69
+ Open an issue on the mirror repo.
70
+
71
+ MIT — see LICENSE.
@@ -0,0 +1 @@
1
+ "use strict";const path=require("path"),docsDir=path.join(__dirname,"..","docs");module.exports={docsDir,readme:path.join(__dirname,"..","README.md"),thesis:path.join(docsDir,"m0saic-thesis.md"),router:path.join(docsDir,"README.md")};