m0saic 0.2.2 → 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.
- package/LICENSE +22 -7
- package/README.md +23 -5
- package/dist/browseE2e.js +1 -1
- package/dist/connectionsFromEnv.js +1 -1
- package/dist/e2eTemplateVariants.js +1 -1
- package/dist/frontDoor.js +1 -1
- package/dist/index.js +1 -1
- package/dist/inlineDsl.js +1 -1
- package/dist/mcp/bridgeClient.js +1 -0
- package/dist/mcp/server.js +1 -0
- package/dist/mcp/tools.js +1 -0
- package/dist/mosaicxRunner.js +1 -1
- package/dist/outputPattern.js +1 -1
- package/dist/showcaseFeed.js +1 -1
- package/dist/templateDoctor.js +1 -1
- package/dist/utils/checkFeasibility.js +1 -1
- package/dist/utils/collectRenderErrors.js +1 -1
- package/dist/utils/enrichImageAlphaFromDoc.js +1 -1
- package/dist/utils/ensureFfmpeg.js +1 -1
- package/dist/utils/extractLayoutMeta.js +1 -1
- package/dist/utils/failureHints.js +1 -1
- package/dist/utils/ffmpegProbe.js +1 -1
- package/dist/utils/formatM0saicForCli.js +1 -1
- package/dist/utils/hashFile.js +1 -1
- package/dist/utils/helpGroups.js +1 -1
- package/dist/utils/installContext.js +1 -0
- package/dist/utils/invocation.js +1 -1
- package/dist/utils/licenseActivation.js +1 -0
- package/dist/utils/licenseActivationWorker.js +1 -0
- package/dist/utils/mosaicSpinner.js +1 -1
- package/dist/utils/parseDimensions.js +1 -1
- package/dist/utils/pathInfo.js +1 -1
- package/dist/utils/readJsonArg.js +1 -1
- package/dist/utils/renderOutcome.js +1 -1
- package/dist/utils/renderReport.js +1 -1
- package/dist/utils/renderSignals.js +1 -1
- package/dist/utils/renderWorkspace.js +1 -1
- package/dist/utils/reportOutputFormat.js +1 -0
- package/dist/utils/setupFfmpeg.js +1 -1
- package/dist/utils/telemetry.js +1 -1
- package/dist/utils/telemetryFlushWorker.js +1 -1
- package/dist/utils/telemetryUpstream.js +1 -1
- package/dist/utils/telemetryUsage.js +1 -1
- package/dist/utils/toolchainConfig.js +1 -1
- package/dist/utils/tutorialDuration.js +1 -1
- package/dist/utils/updateCheck.js +1 -1
- package/dist/utils/updateCheckWorker.js +1 -1
- package/dist/utils/validateSourceCounts.js +1 -1
- package/dist/utils/versions.js +1 -1
- package/dist/webCustomizeLink.js +1 -1
- package/node_modules/@m0saic/community-m/NOTICE +9 -0
- package/node_modules/@m0saic/community-m/release.json +2 -2
- package/node_modules/@m0saic/core/dist/core/buildChildMosaicSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildChunkCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildEncodeCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildLavfiSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMediaSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMosaicNode.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildMosaicPlanFromFile.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildSvgTextSource.js +1 -1
- package/node_modules/@m0saic/core/dist/core/buildTextRenderCommand.js +1 -1
- package/node_modules/@m0saic/core/dist/core/collectRefTargets.js +1 -1
- package/node_modules/@m0saic/core/dist/core/index.js +1 -1
- package/node_modules/@m0saic/core/dist/core/maskCacheDir.js +1 -1
- package/node_modules/@m0saic/core/dist/core/maskWorkerBridge.js +1 -1
- package/node_modules/@m0saic/core/dist/core/playbackPlaySpeed.js +1 -1
- package/node_modules/@m0saic/core/dist/core/prepareProps.js +1 -1
- package/node_modules/@m0saic/core/dist/core/primaryOutput.js +1 -1
- package/node_modules/@m0saic/core/dist/core/rasterizeMaskPng.js +1 -1
- package/node_modules/@m0saic/core/dist/core/rasterizeSvgMediaPng.js +1 -1
- package/node_modules/@m0saic/core/dist/core/refTargetTap.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveMasks.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveMasksSync.js +1 -1
- package/node_modules/@m0saic/core/dist/core/resolveStrokeRingsSync.js +1 -1
- package/node_modules/@m0saic/core/dist/core/roundedRectMask.js +1 -1
- package/node_modules/@m0saic/core/dist/core/strokeRing.js +1 -1
- package/node_modules/@m0saic/core/dist/core/svgRaster.js +1 -1
- package/node_modules/@m0saic/core/dist/defaults.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/backgroundImageInput.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/bufferGuard.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/ffmpegCommands.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBackdropBlur.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBlur.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyBorderRadius.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyCamera.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyChromaKey.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyFade.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyGrade.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyMask.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyNoise.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyPixelize.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyRotate.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyStroke.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/applyTileEffects.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/coverCrop.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/index.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/filters/sourceRectCrop.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/gridLowering.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/index.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/splitAvMux.js +1 -1
- package/node_modules/@m0saic/core/dist/ffmpeg/threadGuard.js +1 -1
- package/node_modules/@m0saic/core/dist/flatten/index.js +1 -1
- package/node_modules/@m0saic/core/dist/fs/index.js +1 -1
- package/node_modules/@m0saic/core/dist/fs/tempWorkspace.js +1 -1
- package/node_modules/@m0saic/core/dist/index.js +1 -1
- package/node_modules/@m0saic/core/dist/media/buildAssetManifestFromInputs.js +1 -1
- package/node_modules/@m0saic/core/dist/media/buildMediaRegistryFromInput.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromInvocationProps.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromMosaicRenderableFile.js +1 -1
- package/node_modules/@m0saic/core/dist/media/collectMediaInputsFromProps.js +1 -1
- package/node_modules/@m0saic/core/dist/media/index.js +1 -1
- package/node_modules/@m0saic/core/dist/media/internalMintAsset.js +1 -1
- package/node_modules/@m0saic/core/dist/media/remoteUrl.js +1 -1
- package/node_modules/@m0saic/core/dist/media/stageUnsafeFilenames.js +1 -1
- package/node_modules/@m0saic/core/dist/media/types.js +1 -1
- package/node_modules/@m0saic/core/dist/output/index.js +1 -1
- package/node_modules/@m0saic/core/dist/output/resolveOutputFormat.js +1 -1
- package/node_modules/@m0saic/core/dist/output/types.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/cellLuminanceProbe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/extractSubtitleCues.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/helpers.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/index.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/luminanceProbe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/probeMedia.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/runFFprobe.js +1 -1
- package/node_modules/@m0saic/core/dist/probe/types.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/engineRedaction.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/ffmpegFailure.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/filterPreflight.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/hashFile.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/index.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/pathInfo.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/perfHeatmap.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/perfReport.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/pipelineM0p.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderCostModel.constants.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderCostModel.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderReport.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/renderSidecars.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/resolveMosaicx.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/runPlan.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/types.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/upstream.js +1 -1
- package/node_modules/@m0saic/core/dist/runtime/writeSidecars.js +1 -1
- package/node_modules/@m0saic/core/dist/types/chunk.js +1 -1
- package/node_modules/@m0saic/core/dist/types/index.js +1 -1
- package/node_modules/@m0saic/core/dist/types/mosaic-plan.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/assertTiming.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/command.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/createEngineContext.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/createTemplateRenderCache.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/ffmpegColor.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/formatDuration.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/fsSafeId.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/index.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/lowerRenderableToMosaicDocument.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/movSafeCodec.js +1 -1
- package/node_modules/@m0saic/core/dist/utils/resolveBoxFrac.js +1 -1
- package/node_modules/@m0saic/core/dist/validate/index.js +1 -1
- package/node_modules/@m0saic/core/scripts/mask-rasterize-core.js +1 -1
- package/node_modules/@m0saic/core/scripts/mask-rasterize-worker.js +1 -1
- package/node_modules/@m0saic/core/scripts/mask-worker-thread.js +1 -1
- package/node_modules/@m0saic/dictionary/NOTICE +9 -0
- package/node_modules/@m0saic/dictionary/README.md +315 -0
- package/node_modules/@m0saic/dictionary/package.json +1 -1
- package/node_modules/@m0saic/dsl/package.json +1 -1
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/agent.js +6 -0
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0/parseM0File.js +1 -1
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0/serializeM0File.js +2 -2
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/m0c/m0cFile.js +3 -3
- package/node_modules/@m0saic/dsl-file-formats/dist/cjs/types.js +1 -1
- package/node_modules/@m0saic/dsl-file-formats/package.json +1 -1
- package/node_modules/@m0saic/dsl-stdlib/dist/cjs/builders/bakeM0cInsets.js +1 -0
- package/node_modules/@m0saic/dsl-stdlib/dist/cjs/builders/index.js +1 -1
- package/node_modules/@m0saic/dsl-stdlib/package.json +1 -1
- package/node_modules/@m0saic/knowledge/LICENSE +21 -0
- package/node_modules/@m0saic/knowledge/README.md +71 -0
- package/node_modules/@m0saic/knowledge/dist/index.js +1 -0
- package/node_modules/@m0saic/knowledge/docs/README.md +60 -0
- package/node_modules/@m0saic/knowledge/docs/file-formats/m0-iteration-protocol.md +120 -0
- package/node_modules/@m0saic/knowledge/docs/file-formats/m0p-and-custom-field.md +195 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/README.md +27 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/composition-arithmetic.md +278 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/dsl-complexity.md +75 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/dsl-rules.md +367 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/feasibility-precision-quantization.md +591 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/m0-construction-methods.md +201 -0
- package/node_modules/@m0saic/knowledge/docs/handbook/precision-tiers.md +84 -0
- package/node_modules/@m0saic/knowledge/docs/m0saic-thesis.md +95 -0
- package/node_modules/@m0saic/knowledge/docs/runtime/README.md +17 -0
- package/node_modules/@m0saic/knowledge/docs/runtime/cli-usage.md +447 -0
- package/node_modules/@m0saic/knowledge/docs/runtime/ffmpeg-expression-limits.md +117 -0
- package/node_modules/@m0saic/knowledge/docs/runtime/reduce-to-one.md +96 -0
- package/node_modules/@m0saic/knowledge/docs/skills/README.md +40 -0
- package/node_modules/@m0saic/knowledge/docs/skills/axis-and-geometry.md +103 -0
- package/node_modules/@m0saic/knowledge/docs/skills/dsl-stdlib-method-catalog.md +7 -0
- package/node_modules/@m0saic/knowledge/docs/skills/identity.md +123 -0
- package/node_modules/@m0saic/knowledge/docs/skills/labels-and-masks.md +170 -0
- package/node_modules/@m0saic/knowledge/docs/skills/m0saic-string-generation.md +251 -0
- package/node_modules/@m0saic/knowledge/docs/skills/more-atoms-not-bigger-atoms.md +77 -0
- package/node_modules/@m0saic/knowledge/docs/skills/overlay-semantics.md +194 -0
- package/node_modules/@m0saic/knowledge/docs/skills/parse-apis.md +79 -0
- package/node_modules/@m0saic/knowledge/docs/skills/passthrough-semantics.md +136 -0
- package/node_modules/@m0saic/knowledge/docs/skills/structural-construction.md +86 -0
- package/node_modules/@m0saic/knowledge/docs/skills/text-in-templates.md +126 -0
- package/node_modules/@m0saic/knowledge/docs/skills/zero-overlay-analysis.md +87 -0
- package/node_modules/@m0saic/knowledge/docs/templates/README.md +65 -0
- package/node_modules/@m0saic/knowledge/docs/templates/capability-templates.md +72 -0
- package/node_modules/@m0saic/knowledge/docs/templates/construction-strategy.md +329 -0
- package/node_modules/@m0saic/knowledge/docs/templates/data-pipeline.md +324 -0
- package/node_modules/@m0saic/knowledge/docs/templates/emission-patterns.md +130 -0
- package/node_modules/@m0saic/knowledge/docs/templates/geometry-recipes.md +248 -0
- package/node_modules/@m0saic/knowledge/docs/templates/layout-contract.md +168 -0
- package/node_modules/@m0saic/knowledge/docs/templates/output-resolution-tree.md +202 -0
- package/node_modules/@m0saic/knowledge/docs/templates/patterns/case-study-lessons.md +69 -0
- package/node_modules/@m0saic/knowledge/docs/templates/patterns/perf-authoring-rules.md +100 -0
- package/node_modules/@m0saic/knowledge/docs/templates/patterns/primitive-extraction-pattern.md +103 -0
- package/node_modules/@m0saic/knowledge/docs/templates/philosophy-and-contract.md +310 -0
- package/node_modules/@m0saic/knowledge/docs/templates/recursion-nested-rendering.md +154 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/grid.md +104 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/json-prop-type.md +169 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/mosaic-color.md +81 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/mosaic-placement-props.md +103 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/prop-bindings.md +324 -0
- package/node_modules/@m0saic/knowledge/docs/templates/reference/template-flags.md +224 -0
- package/node_modules/@m0saic/knowledge/docs/templates/render-lifecycle.md +117 -0
- package/node_modules/@m0saic/knowledge/docs/templates/rendering-model-contract.md +392 -0
- package/node_modules/@m0saic/knowledge/docs/templates/standalone-pack-authoring.md +299 -0
- package/node_modules/@m0saic/knowledge/docs/templates/theming.md +81 -0
- package/node_modules/@m0saic/knowledge/docs/templates/ui-controls.md +150 -0
- package/node_modules/@m0saic/knowledge/package.json +6 -0
- package/node_modules/@m0saic/momo-types/README.md +109 -0
- package/node_modules/@m0saic/momo-types/dist/agent.js +1 -6
- package/node_modules/@m0saic/momo-types/dist/context.js +1 -1
- package/node_modules/@m0saic/momo-types/package.json +1 -1
- package/node_modules/@m0saic/platform/README.md +3 -0
- package/node_modules/@m0saic/platform/dist/cjs/index.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/outputKind/outputKind.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/index.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/propBindings/propBindings.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/mosaic/validate/validateSources.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/packages/mosaicPackages.js +1 -0
- package/node_modules/@m0saic/platform/dist/cjs/paths/m0saicRoot.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/telemetry/lifecycle.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/telemetry/preview.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/telemetry/sender.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/telemetry/usageRecorder.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/telemetry/usageStore.js +3 -3
- package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/baseline.json +25 -97
- package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/index.js +1 -1
- package/node_modules/@m0saic/platform/dist/cjs/toolchain/ffmpeg/install.js +2 -2
- package/node_modules/@m0saic/platform/dist/cjs/toolchain/goldenFfmpeg.js +6 -6
- package/node_modules/@m0saic/platform/package.json +1 -1
- package/node_modules/@m0saic/product/dist/communityRelease.js +1 -1
- package/node_modules/@m0saic/product/dist/freeTierLicense.js +1 -1
- package/node_modules/@m0saic/product/dist/index.js +1 -1
- package/node_modules/@m0saic/product/dist/licenseActivationNotice.js +1 -0
- package/node_modules/@m0saic/product/dist/licenseFile.js +1 -0
- package/node_modules/@m0saic/product/dist/licenseToken.js +1 -1
- package/node_modules/@m0saic/product/dist/makeScratchPath.js +1 -0
- package/node_modules/@m0saic/product/dist/postRenderWrapper.js +1 -1
- package/node_modules/@m0saic/product/dist/publicKeys.js +1 -1
- package/node_modules/@m0saic/product/dist/revokedKeys.js +1 -1
- package/node_modules/@m0saic/product/dist/upstreamDefaults.js +1 -1
- package/node_modules/@m0saic/product/dist/workspaceScaffold.js +1 -0
- package/node_modules/@m0saic/template-utils/dist/brand/hello-world/helloWorld.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/geometry-contract/index.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/geometry-contract/layoutConstraint.js +2 -2
- package/node_modules/@m0saic/template-utils/dist/m0saic/loadSession.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/render/createDesignContext.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/sources/makeErrorMosaic.js +2 -2
- package/node_modules/@m0saic/template-utils/dist/sources/svgTextSource.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/template/auditRenderedTemplate.js +5 -5
- package/node_modules/@m0saic/template-utils/dist/template/templateConventions.js +3 -3
- package/node_modules/@m0saic/template-utils/dist/template/validateTemplateProps.js +1 -1
- package/node_modules/@m0saic/template-utils/dist/text/fitText.js +6 -6
- package/node_modules/@m0saic/template-utils/package.json +1 -1
- package/node_modules/@m0saic/templates/NOTICE +9 -0
- package/node_modules/@m0saic/templates/dist/m0saic/media/blur-regions/v1/tutorial.js +1 -1
- package/node_modules/@m0saic/templates/package.json +1 -1
- package/node_modules/@m0saic/templates-advanced/NOTICE +9 -0
- package/node_modules/@m0saic/text/package.json +1 -1
- package/node_modules/@m0saic/types/dist/analytics/consent.js +1 -1
- package/node_modules/@m0saic/types/dist/analytics/event.js +1 -1
- package/node_modules/@m0saic/types/dist/analytics/usageMetrics.js +1 -1
- package/node_modules/@m0saic/types/dist/identifiers/identifiers.js +1 -1
- package/node_modules/@m0saic/types/dist/telemetry/ffmpegFailure.js +1 -1
- package/node_modules/@m0saic/types/package.json +1 -1
- package/node_modules/@m0saic/types-internal/dist/analytics/featureKeys.js +1 -1
- package/package.json +13 -11
- package/resources/starter-base/starter-base.json +10 -0
- 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`.
|
|
@@ -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,
|
|
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
|
|
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,
|
|
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"),
|
|
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,
|
|
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,
|
|
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
|
|
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")});
|
|
@@ -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
|
|
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")});
|
|
@@ -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")};
|