@hraness/slopcamera 3.6.0 → 3.7.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 (49) hide show
  1. package/README.md +41 -26
  2. package/apps/desktop/README.md +1 -1
  3. package/apps/desktop/application/html-overlay-renderer.ts +6 -0
  4. package/apps/desktop/application/operation.ts +1 -1
  5. package/apps/desktop/cli/args.ts +60 -0
  6. package/apps/desktop/cli/command-host-resources.ts +5 -0
  7. package/apps/desktop/cli/commands.ts +13 -1
  8. package/apps/desktop/cli/help.ts +26 -4
  9. package/apps/desktop/cli/html-film-init.ts +158 -0
  10. package/apps/desktop/cli/html-film-names.ts +17 -0
  11. package/apps/desktop/cli/html-film.ts +471 -0
  12. package/apps/desktop/cli/html-overlay-renderer.ts +29 -2
  13. package/apps/desktop/cli/html-scene.ts +3 -3
  14. package/apps/desktop/cli/main.ts +1 -0
  15. package/apps/desktop/cli/menubar-status.ts +1 -0
  16. package/apps/desktop/cli/portable-surface.ts +55 -1
  17. package/apps/desktop/dist/cli/main.js +328 -293
  18. package/apps/desktop/html-overlay/film.ts +418 -0
  19. package/dist/cli.js +13 -2
  20. package/dist/generate.js +1 -1
  21. package/dist/{index-4z9y2wa2.js → index-842t02pp.js} +1 -1
  22. package/dist/{index-qxfexvj3.js → index-nv3byqa1.js} +20 -4
  23. package/dist/index-p74xy76d.js +3 -0
  24. package/dist/{index-fevf4ppk.js → index-y8spxs77.js} +10 -7
  25. package/dist/index.js +1 -1
  26. package/dist/operations.js +1 -1
  27. package/dist/workflow.js +1 -1
  28. package/docs/README.md +5 -5
  29. package/examples/html/launch-film/README.md +51 -0
  30. package/examples/html/launch-film/build.ts +158 -0
  31. package/examples/html/launch-film/film.css +593 -0
  32. package/examples/html/launch-film/film.html +85 -0
  33. package/examples/html/launch-film/film.js +410 -0
  34. package/examples/html/launch-film/film.json +63 -0
  35. package/examples/html/launch-film/mockups.tsx +74 -0
  36. package/examples/html/launch-film/timeline.ts +57 -0
  37. package/package.json +13 -6
  38. package/skills/slopcamera/SKILL.md +3 -2
  39. package/skills/slopcamera/references/install.md +3 -3
  40. package/skills/slopcamera/references/launch-films.md +154 -0
  41. package/skills/slopcamera/references/visual-communication.md +1 -1
  42. package/src/cli.ts +125 -9
  43. package/src/generation-pricing.ts +21 -1
  44. package/src/icon-set.ts +1086 -0
  45. package/src/icon.ts +396 -59
  46. package/src/index.ts +1 -0
  47. package/src/operations.ts +52 -0
  48. package/src/version.ts +1 -1
  49. package/dist/index-nxtmy18t.js +0 -3
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{DrawingValidationError,SLOPCAMERA_CAPABILITY_MANIFEST_LIMITS,SLOPCAMERA_PORTABLE_CAPABILITY_VERSION,SLOPCAMERA_VERSION,STUDIO_LIMITS,SlopcameraCapabilityCommandSchema,SlopcameraCapabilityEffectSchema,SlopcameraCapabilityManifestSchema,SlopcameraCapabilityModuleDeclarationSchema,SlopcameraCapabilityModuleSchema,SlopcameraCapabilityOperationSchema,SlopcameraCapabilityPreparationSchema,SlopcameraCapabilityProfileSchema,SlopcameraCapabilityQualificationSchema,SlopcameraCapabilityResourceSchema,SlopcameraCapabilityResumeSchema,SlopcameraCapabilityToolSchema,SlopcameraCapabilityWorkflowSchema,SlopcameraMcpToolRuntime,SlopcameraSceneVariantsSchema,StudioCapabilityNameSchema,StudioDigestSchema,StudioEngineOptionsSchema,StudioEngineSchema,StudioExecutionProfileSchema,StudioJobSchema,StudioOutputArtifactSchema,StudioOutputFormatSchema,StudioOutputInterpretationSchema,StudioOutputRoleSchema,StudioOutputSpecSchema,StudioPathSchema,StudioPlanSchema,StudioReceiptSchema,StudioRenderSchema,StudioRuntimeIdentitySchema,StudioSourceBundleSchema,StudioSourceSpaceSchema,VISUAL_STYLE_IDS,VISUAL_STYLE_PROFILES,VISUAL_STYLE_VARIATION_ALGORITHM,VisualStyleIdSchema,VisualStyleProfileSchema,WorkspaceBoundary,WorkspaceBoundaryError,artifactSummary,checkDiagramFile,checkDrawingFile,compileSlopcameraCapabilityManifest,createPortableSlopcameraCapabilityManifest,createVisualStyleDirection,defineSlopcameraCapabilityModule,diagramApi,drawingMinimumGlyphHeightPt,drawingPageGeometry,drawingProfile,drawingSourceByteLimit,getVisualStyleProfile,inspectStudioBundle,inspectStudioPlan,mcpMaximumRenderedPixels,mcpMaximumScale,mcpSourceByteLimit,parseDrawingSource,parseSlopcameraCapabilityManifest,parseSlopcameraSceneVariants,parseStudioJob,parseStudioPlan,parseStudioReceipt,parseStudioRuntimeIdentity,parseStudioSourceBundle,planSlopcameraSceneGallery,planStudioJob,readDiagramFile,readDrawingFile,renderDiagramFile,renderDrawing,renderDrawingFile,runMcpServer,sampleVisualStyleExposure,slopcameraApi,slopcameraMcpProtocolVersion,slopcameraMcpServerName,slopcameraMcpTools,slopcameraPortableCapabilityManifest,slopcameraSceneGalleryLimits,starterDrawingSource,studioJobSha256,studioOutputPath,studioRuntimeSha256,studioSourceBundleSha256,summarizeSceneVariantPatch,validateStudioReceipt,visualStyleFrameVariation}from"./index-qxfexvj3.js";import{bundledSkillPath,installSkill}from"./index-grk47tgs.js";import"./index-z1kd1x8j.js";import"./index-3cxf2c58.js";import{SlopcameraWorkflowError,defineSlopcameraWorkflow,runSlopcameraWorkflow}from"./index-4z9y2wa2.js";import{DiagramValidationError,SlopcameraOperationError,StackLayoutError,builtInIcons,composeSlopcameraImageGallery,critiqueIconRaster,executeSlopcameraOperation,executeSlopcameraOperationWithLease,extractIconLineArt,galleryCandidateId,galleryPromptFor,generateSlopcameraIcon,generateSlopcameraImageGallery,iconPromptFor,iconVisualGateProblems,isSlopcameraOperationCode,lintDiagram,parseDiagramSource,parseDiagramSpec,parseSlopcameraGalleryVary,parseSlopcameraOperationInput,planSlopcameraGallery,renderPng,renderSvg,resolveDiagramSource,resolveEdge,resolveStackLayout,searchSlopcameraOperations,serializeTldr,slopcameraGalleryAxes,slopcameraGalleryKinds,slopcameraGalleryLimits,slopcameraIconCritiqueDefaultModel,slopcameraIconCritiqueTimeoutMs,slopcameraIconDefaultInk,slopcameraIconDefaultRounds,slopcameraIconMaximumRounds,slopcameraIconPanel,slopcameraIconSubjectMaximumBytes,slopcameraOperationCodes,slopcameraOperationHostResourceClaims,slopcameraOperationRegistry,stackLayoutDefaults,withSlopcameraOperationHostAdmission}from"./index-fevf4ppk.js";import{VTRACER_VERSION,VectorizeError,vectorizeDefaultLimits,vectorizeHardLimits,vectorizeImage,vectorizeProfileNames,vtracerReleases}from"./index-mnp0bftq.js";import{SlopcameraCloudError,createFixedGatewayFetch,generateSlopcameraImage,generateSlopcameraImageFile,resolveSlopcameraGatewayCredential,slopcameraGatewayApiBaseUrl,slopcameraGatewayCredentialStatus,slopcameraImageModels,slopcameraMaximumPromptBytes,slopcameraMaximumRawImageBytes,slopcameraResponseMediaTypes}from"./index-nxtmy18t.js";import{HOST_RESOURCE_MAX_WAIT_MILLISECONDS,HostResourceError,createDefaultHostResourceCoordinator,createHostResourceCoordinator,createProcessLocalHostResourceCoordinator,defaultSlopcameraHostResourceProfile,defaultSlopcameraHostResourceStateRoot,normalizeHostResourceClaims,normalizeHostResourceProfile,slopcameraHostResourceNames}from"./index-b3geqczn.js";import"./index-80a36bc0.js";export{withSlopcameraOperationHostAdmission,vtracerReleases,visualStyleFrameVariation,vectorizeProfileNames,vectorizeImage,vectorizeHardLimits,vectorizeDefaultLimits,validateStudioReceipt,summarizeSceneVariantPatch,studioSourceBundleSha256,studioRuntimeSha256,studioOutputPath,studioJobSha256,starterDrawingSource,stackLayoutDefaults,slopcameraSceneGalleryLimits,slopcameraResponseMediaTypes,slopcameraPortableCapabilityManifest,slopcameraOperationRegistry,slopcameraOperationHostResourceClaims,slopcameraOperationCodes,slopcameraMcpTools,slopcameraMcpServerName,slopcameraMcpProtocolVersion,slopcameraMaximumRawImageBytes,slopcameraMaximumPromptBytes,slopcameraImageModels,slopcameraIconSubjectMaximumBytes,slopcameraIconPanel,slopcameraIconMaximumRounds,slopcameraIconDefaultRounds,slopcameraIconDefaultInk,slopcameraIconCritiqueTimeoutMs,slopcameraIconCritiqueDefaultModel,slopcameraHostResourceNames,slopcameraGatewayCredentialStatus,slopcameraGatewayApiBaseUrl,slopcameraGalleryLimits,slopcameraGalleryKinds,slopcameraGalleryAxes,slopcameraApi,serializeTldr,searchSlopcameraOperations,sampleVisualStyleExposure,runSlopcameraWorkflow,runMcpServer,resolveStackLayout,resolveSlopcameraGatewayCredential,resolveEdge,resolveDiagramSource,renderSvg,renderPng,renderDrawingFile,renderDrawing,renderDiagramFile,readDrawingFile,readDiagramFile,planStudioJob,planSlopcameraSceneGallery,planSlopcameraGallery,parseStudioSourceBundle,parseStudioRuntimeIdentity,parseStudioReceipt,parseStudioPlan,parseStudioJob,parseSlopcameraSceneVariants,parseSlopcameraOperationInput,parseSlopcameraGalleryVary,parseSlopcameraCapabilityManifest,parseDrawingSource,parseDiagramSpec,parseDiagramSource,normalizeHostResourceProfile,normalizeHostResourceClaims,mcpSourceByteLimit,mcpMaximumScale,mcpMaximumRenderedPixels,lintDiagram,isSlopcameraOperationCode,installSkill,inspectStudioPlan,inspectStudioBundle,iconVisualGateProblems,iconPromptFor,getVisualStyleProfile,generateSlopcameraImageGallery,generateSlopcameraImageFile,generateSlopcameraImage,generateSlopcameraIcon,galleryPromptFor,galleryCandidateId,extractIconLineArt,executeSlopcameraOperationWithLease,executeSlopcameraOperation,drawingSourceByteLimit,drawingProfile,drawingPageGeometry,drawingMinimumGlyphHeightPt,diagramApi,defineSlopcameraWorkflow,defineSlopcameraCapabilityModule,defaultSlopcameraHostResourceStateRoot,defaultSlopcameraHostResourceProfile,critiqueIconRaster,createVisualStyleDirection,createProcessLocalHostResourceCoordinator,createPortableSlopcameraCapabilityManifest,createHostResourceCoordinator,createFixedGatewayFetch,createDefaultHostResourceCoordinator,composeSlopcameraImageGallery,compileSlopcameraCapabilityManifest,checkDrawingFile,checkDiagramFile,bundledSkillPath,builtInIcons,artifactSummary,WorkspaceBoundaryError,WorkspaceBoundary,VisualStyleProfileSchema,VisualStyleIdSchema,VectorizeError,VTRACER_VERSION,VISUAL_STYLE_VARIATION_ALGORITHM,VISUAL_STYLE_PROFILES,VISUAL_STYLE_IDS,StudioSourceSpaceSchema,StudioSourceBundleSchema,StudioRuntimeIdentitySchema,StudioRenderSchema,StudioReceiptSchema,StudioPlanSchema,StudioPathSchema,StudioOutputSpecSchema,StudioOutputRoleSchema,StudioOutputInterpretationSchema,StudioOutputFormatSchema,StudioOutputArtifactSchema,StudioJobSchema,StudioExecutionProfileSchema,StudioEngineSchema,StudioEngineOptionsSchema,StudioDigestSchema,StudioCapabilityNameSchema,StackLayoutError,SlopcameraWorkflowError,SlopcameraSceneVariantsSchema,SlopcameraOperationError,SlopcameraMcpToolRuntime,SlopcameraCloudError,SlopcameraCapabilityWorkflowSchema,SlopcameraCapabilityToolSchema,SlopcameraCapabilityResumeSchema,SlopcameraCapabilityResourceSchema,SlopcameraCapabilityQualificationSchema,SlopcameraCapabilityProfileSchema,SlopcameraCapabilityPreparationSchema,SlopcameraCapabilityOperationSchema,SlopcameraCapabilityModuleSchema,SlopcameraCapabilityModuleDeclarationSchema,SlopcameraCapabilityManifestSchema,SlopcameraCapabilityEffectSchema,SlopcameraCapabilityCommandSchema,STUDIO_LIMITS,SLOPCAMERA_VERSION,SLOPCAMERA_PORTABLE_CAPABILITY_VERSION,SLOPCAMERA_CAPABILITY_MANIFEST_LIMITS,HostResourceError,HOST_RESOURCE_MAX_WAIT_MILLISECONDS,DrawingValidationError,DiagramValidationError};
2
+ import{DrawingValidationError,SLOPCAMERA_CAPABILITY_MANIFEST_LIMITS,SLOPCAMERA_PORTABLE_CAPABILITY_VERSION,SLOPCAMERA_VERSION,STUDIO_LIMITS,SlopcameraCapabilityCommandSchema,SlopcameraCapabilityEffectSchema,SlopcameraCapabilityManifestSchema,SlopcameraCapabilityModuleDeclarationSchema,SlopcameraCapabilityModuleSchema,SlopcameraCapabilityOperationSchema,SlopcameraCapabilityPreparationSchema,SlopcameraCapabilityProfileSchema,SlopcameraCapabilityQualificationSchema,SlopcameraCapabilityResourceSchema,SlopcameraCapabilityResumeSchema,SlopcameraCapabilityToolSchema,SlopcameraCapabilityWorkflowSchema,SlopcameraMcpToolRuntime,SlopcameraSceneVariantsSchema,StudioCapabilityNameSchema,StudioDigestSchema,StudioEngineOptionsSchema,StudioEngineSchema,StudioExecutionProfileSchema,StudioJobSchema,StudioOutputArtifactSchema,StudioOutputFormatSchema,StudioOutputInterpretationSchema,StudioOutputRoleSchema,StudioOutputSpecSchema,StudioPathSchema,StudioPlanSchema,StudioReceiptSchema,StudioRenderSchema,StudioRuntimeIdentitySchema,StudioSourceBundleSchema,StudioSourceSpaceSchema,VISUAL_STYLE_IDS,VISUAL_STYLE_PROFILES,VISUAL_STYLE_VARIATION_ALGORITHM,VisualStyleIdSchema,VisualStyleProfileSchema,WorkspaceBoundary,WorkspaceBoundaryError,artifactSummary,checkDiagramFile,checkDrawingFile,compileSlopcameraCapabilityManifest,createPortableSlopcameraCapabilityManifest,createVisualStyleDirection,critiqueSlopcameraIconSet,defineSlopcameraCapabilityModule,diagramApi,drawingMinimumGlyphHeightPt,drawingPageGeometry,drawingProfile,drawingSourceByteLimit,generateSlopcameraIconSet,getVisualStyleProfile,inspectStudioBundle,inspectStudioPlan,mcpMaximumRenderedPixels,mcpMaximumScale,mcpSourceByteLimit,parseDrawingSource,parseSlopcameraCapabilityManifest,parseSlopcameraIconSetSpec,parseSlopcameraSceneVariants,parseStudioJob,parseStudioPlan,parseStudioReceipt,parseStudioRuntimeIdentity,parseStudioSourceBundle,planSlopcameraSceneGallery,planStudioJob,readDiagramFile,readDrawingFile,renderDiagramFile,renderDrawing,renderDrawingFile,runMcpServer,sampleVisualStyleExposure,slopcameraApi,slopcameraIconSetDefaultPool,slopcameraIconSetDefaultSetRounds,slopcameraIconSetMaximumMembers,slopcameraIconSetMaximumNameBytes,slopcameraIconSetMaximumSetRounds,slopcameraIconSetSlugPattern,slopcameraMcpProtocolVersion,slopcameraMcpServerName,slopcameraMcpTools,slopcameraPortableCapabilityManifest,slopcameraSceneGalleryLimits,starterDrawingSource,studioJobSha256,studioOutputPath,studioRuntimeSha256,studioSourceBundleSha256,summarizeSceneVariantPatch,validateStudioReceipt,visualStyleFrameVariation}from"./index-nv3byqa1.js";import{bundledSkillPath,installSkill}from"./index-grk47tgs.js";import"./index-z1kd1x8j.js";import"./index-3cxf2c58.js";import{SlopcameraWorkflowError,defineSlopcameraWorkflow,runSlopcameraWorkflow}from"./index-842t02pp.js";import{DiagramValidationError,SlopcameraOperationError,StackLayoutError,builtInIcons,collectSlopcameraIconCandidates,composeSlopcameraImageGallery,critiqueIconRaster,estimateIconStrokePixels,executeSlopcameraOperation,executeSlopcameraOperationWithLease,extractIconLineArt,galleryCandidateId,galleryPromptFor,generateSlopcameraIcon,generateSlopcameraImageGallery,iconPromptFor,iconVisualGateProblems,isSlopcameraOperationCode,lintDiagram,loadIconLanguageRuntime,measureIconCandidateMetrics,parseDiagramSource,parseDiagramSpec,parseSlopcameraGalleryVary,parseSlopcameraOperationInput,planSlopcameraGallery,renderIconPreview,renderPng,renderSvg,resolveDiagramSource,resolveEdge,resolveStackLayout,searchSlopcameraOperations,serializeTldr,slopcameraGalleryAxes,slopcameraGalleryKinds,slopcameraGalleryLimits,slopcameraIconContextProfiles,slopcameraIconContexts,slopcameraIconCritiqueDefaultModel,slopcameraIconCritiqueTimeoutMs,slopcameraIconDefaultInk,slopcameraIconDefaultRounds,slopcameraIconMaximumRounds,slopcameraIconPanel,slopcameraIconSubjectMaximumBytes,slopcameraOperationCodes,slopcameraOperationHostResourceClaims,slopcameraOperationRegistry,stackLayoutDefaults,withSlopcameraOperationHostAdmission,writeAtomically}from"./index-y8spxs77.js";import{VTRACER_VERSION,VectorizeError,vectorizeDefaultLimits,vectorizeHardLimits,vectorizeImage,vectorizeProfileNames,vtracerReleases}from"./index-mnp0bftq.js";import{SlopcameraCloudError,createFixedGatewayFetch,generateSlopcameraImage,generateSlopcameraImageFile,resolveSlopcameraGatewayCredential,slopcameraGatewayApiBaseUrl,slopcameraGatewayCredentialStatus,slopcameraImageModels,slopcameraMaximumPromptBytes,slopcameraMaximumRawImageBytes,slopcameraResponseMediaTypes}from"./index-p74xy76d.js";import{HOST_RESOURCE_MAX_WAIT_MILLISECONDS,HostResourceError,createDefaultHostResourceCoordinator,createHostResourceCoordinator,createProcessLocalHostResourceCoordinator,defaultSlopcameraHostResourceProfile,defaultSlopcameraHostResourceStateRoot,normalizeHostResourceClaims,normalizeHostResourceProfile,slopcameraHostResourceNames}from"./index-b3geqczn.js";import"./index-80a36bc0.js";export{writeAtomically,withSlopcameraOperationHostAdmission,vtracerReleases,visualStyleFrameVariation,vectorizeProfileNames,vectorizeImage,vectorizeHardLimits,vectorizeDefaultLimits,validateStudioReceipt,summarizeSceneVariantPatch,studioSourceBundleSha256,studioRuntimeSha256,studioOutputPath,studioJobSha256,starterDrawingSource,stackLayoutDefaults,slopcameraSceneGalleryLimits,slopcameraResponseMediaTypes,slopcameraPortableCapabilityManifest,slopcameraOperationRegistry,slopcameraOperationHostResourceClaims,slopcameraOperationCodes,slopcameraMcpTools,slopcameraMcpServerName,slopcameraMcpProtocolVersion,slopcameraMaximumRawImageBytes,slopcameraMaximumPromptBytes,slopcameraImageModels,slopcameraIconSubjectMaximumBytes,slopcameraIconSetSlugPattern,slopcameraIconSetMaximumSetRounds,slopcameraIconSetMaximumNameBytes,slopcameraIconSetMaximumMembers,slopcameraIconSetDefaultSetRounds,slopcameraIconSetDefaultPool,slopcameraIconPanel,slopcameraIconMaximumRounds,slopcameraIconDefaultRounds,slopcameraIconDefaultInk,slopcameraIconCritiqueTimeoutMs,slopcameraIconCritiqueDefaultModel,slopcameraIconContexts,slopcameraIconContextProfiles,slopcameraHostResourceNames,slopcameraGatewayCredentialStatus,slopcameraGatewayApiBaseUrl,slopcameraGalleryLimits,slopcameraGalleryKinds,slopcameraGalleryAxes,slopcameraApi,serializeTldr,searchSlopcameraOperations,sampleVisualStyleExposure,runSlopcameraWorkflow,runMcpServer,resolveStackLayout,resolveSlopcameraGatewayCredential,resolveEdge,resolveDiagramSource,renderSvg,renderPng,renderIconPreview,renderDrawingFile,renderDrawing,renderDiagramFile,readDrawingFile,readDiagramFile,planStudioJob,planSlopcameraSceneGallery,planSlopcameraGallery,parseStudioSourceBundle,parseStudioRuntimeIdentity,parseStudioReceipt,parseStudioPlan,parseStudioJob,parseSlopcameraSceneVariants,parseSlopcameraOperationInput,parseSlopcameraIconSetSpec,parseSlopcameraGalleryVary,parseSlopcameraCapabilityManifest,parseDrawingSource,parseDiagramSpec,parseDiagramSource,normalizeHostResourceProfile,normalizeHostResourceClaims,measureIconCandidateMetrics,mcpSourceByteLimit,mcpMaximumScale,mcpMaximumRenderedPixels,loadIconLanguageRuntime,lintDiagram,isSlopcameraOperationCode,installSkill,inspectStudioPlan,inspectStudioBundle,iconVisualGateProblems,iconPromptFor,getVisualStyleProfile,generateSlopcameraImageGallery,generateSlopcameraImageFile,generateSlopcameraImage,generateSlopcameraIconSet,generateSlopcameraIcon,galleryPromptFor,galleryCandidateId,extractIconLineArt,executeSlopcameraOperationWithLease,executeSlopcameraOperation,estimateIconStrokePixels,drawingSourceByteLimit,drawingProfile,drawingPageGeometry,drawingMinimumGlyphHeightPt,diagramApi,defineSlopcameraWorkflow,defineSlopcameraCapabilityModule,defaultSlopcameraHostResourceStateRoot,defaultSlopcameraHostResourceProfile,critiqueSlopcameraIconSet,critiqueIconRaster,createVisualStyleDirection,createProcessLocalHostResourceCoordinator,createPortableSlopcameraCapabilityManifest,createHostResourceCoordinator,createFixedGatewayFetch,createDefaultHostResourceCoordinator,composeSlopcameraImageGallery,compileSlopcameraCapabilityManifest,collectSlopcameraIconCandidates,checkDrawingFile,checkDiagramFile,bundledSkillPath,builtInIcons,artifactSummary,WorkspaceBoundaryError,WorkspaceBoundary,VisualStyleProfileSchema,VisualStyleIdSchema,VectorizeError,VTRACER_VERSION,VISUAL_STYLE_VARIATION_ALGORITHM,VISUAL_STYLE_PROFILES,VISUAL_STYLE_IDS,StudioSourceSpaceSchema,StudioSourceBundleSchema,StudioRuntimeIdentitySchema,StudioRenderSchema,StudioReceiptSchema,StudioPlanSchema,StudioPathSchema,StudioOutputSpecSchema,StudioOutputRoleSchema,StudioOutputInterpretationSchema,StudioOutputFormatSchema,StudioOutputArtifactSchema,StudioJobSchema,StudioExecutionProfileSchema,StudioEngineSchema,StudioEngineOptionsSchema,StudioDigestSchema,StudioCapabilityNameSchema,StackLayoutError,SlopcameraWorkflowError,SlopcameraSceneVariantsSchema,SlopcameraOperationError,SlopcameraMcpToolRuntime,SlopcameraCloudError,SlopcameraCapabilityWorkflowSchema,SlopcameraCapabilityToolSchema,SlopcameraCapabilityResumeSchema,SlopcameraCapabilityResourceSchema,SlopcameraCapabilityQualificationSchema,SlopcameraCapabilityProfileSchema,SlopcameraCapabilityPreparationSchema,SlopcameraCapabilityOperationSchema,SlopcameraCapabilityModuleSchema,SlopcameraCapabilityModuleDeclarationSchema,SlopcameraCapabilityManifestSchema,SlopcameraCapabilityEffectSchema,SlopcameraCapabilityCommandSchema,STUDIO_LIMITS,SLOPCAMERA_VERSION,SLOPCAMERA_PORTABLE_CAPABILITY_VERSION,SLOPCAMERA_CAPABILITY_MANIFEST_LIMITS,HostResourceError,HOST_RESOURCE_MAX_WAIT_MILLISECONDS,DrawingValidationError,DiagramValidationError};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{SlopcameraOperationError,executeSlopcameraOperation,executeSlopcameraOperationWithLease,isSlopcameraOperationCode,parseSlopcameraOperationInput,searchSlopcameraOperations,slopcameraOperationCodes,slopcameraOperationHostResourceClaims,slopcameraOperationRegistry,withSlopcameraOperationHostAdmission}from"./index-fevf4ppk.js";import"./index-mnp0bftq.js";import"./index-nxtmy18t.js";import"./index-b3geqczn.js";import"./index-80a36bc0.js";export{withSlopcameraOperationHostAdmission,slopcameraOperationRegistry,slopcameraOperationHostResourceClaims,slopcameraOperationCodes,searchSlopcameraOperations,parseSlopcameraOperationInput,isSlopcameraOperationCode,executeSlopcameraOperationWithLease,executeSlopcameraOperation,SlopcameraOperationError};
2
+ import{SlopcameraOperationError,executeSlopcameraOperation,executeSlopcameraOperationWithLease,isSlopcameraOperationCode,parseSlopcameraOperationInput,searchSlopcameraOperations,slopcameraOperationCodes,slopcameraOperationHostResourceClaims,slopcameraOperationRegistry,withSlopcameraOperationHostAdmission}from"./index-y8spxs77.js";import"./index-mnp0bftq.js";import"./index-p74xy76d.js";import"./index-b3geqczn.js";import"./index-80a36bc0.js";export{withSlopcameraOperationHostAdmission,slopcameraOperationRegistry,slopcameraOperationHostResourceClaims,slopcameraOperationCodes,searchSlopcameraOperations,parseSlopcameraOperationInput,isSlopcameraOperationCode,executeSlopcameraOperationWithLease,executeSlopcameraOperation,SlopcameraOperationError};
package/dist/workflow.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{SlopcameraWorkflowError,defineSlopcameraWorkflow,runSlopcameraWorkflow}from"./index-4z9y2wa2.js";import"./index-fevf4ppk.js";import"./index-mnp0bftq.js";import"./index-nxtmy18t.js";import"./index-b3geqczn.js";import"./index-80a36bc0.js";export{runSlopcameraWorkflow,defineSlopcameraWorkflow,SlopcameraWorkflowError};
2
+ import{SlopcameraWorkflowError,defineSlopcameraWorkflow,runSlopcameraWorkflow}from"./index-842t02pp.js";import"./index-y8spxs77.js";import"./index-mnp0bftq.js";import"./index-p74xy76d.js";import"./index-b3geqczn.js";import"./index-80a36bc0.js";export{runSlopcameraWorkflow,defineSlopcameraWorkflow,SlopcameraWorkflowError};
package/docs/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Slopcamera documentation
1
+ # SlopCamera documentation
2
2
 
3
3
  Slopcamera is a media studio for coding agents. It retains editable source, renders local or generated media, and assembles it into inspectable video projects. Choose a guide for the work you want to do.
4
4
 
@@ -22,12 +22,12 @@ Install the [current Slopcamera release](../README.md#install-slopcamera) for th
22
22
  - [Convert raster images to SVG](how-to/vectorize-images.md): trace artwork locally, compare a duotone treatment, and inspect fidelity.
23
23
  - [Generate images, video, or narration](how-to/generate-media.md): discover Gateway capabilities, acknowledge selected uploads, and retain the result.
24
24
  - [Direct short generated clips](directing-video.md): budget, review takes, preserve endpoint continuity, and recover uncertain work.
25
- - [Author a native film](studio.md): use Blender, CadQuery, or Manim; retain caches; share assets and calibrated cameras.
25
+ - [Render Blender, CadQuery, and Manim films from source](studio.md): use Blender, CadQuery, or Manim; retain caches; share assets and calibrated cameras.
26
26
  - [Build and revise a parametric design](how-to/parametric-design.md): generate architectural models from retained parameters, inspect dependencies and render alternatives.
27
- - [Render and edit spatial scenes](spatial-scenes.md): patch named entities, use hardware rendering, import a saved world, or prepare a V2 shot composition.
27
+ - [Render and edit Three.js 3D scenes](spatial-scenes.md): patch named entities, use hardware rendering, import a saved world, or prepare a V2 shot composition.
28
28
  - [Build a directed cinematic character world](how-to/cinematic-character-worlds.md): admit a rigged world, direct it semantically, plan effects and galleries, and audit temporal evidence.
29
- - [Direct a cinematic world end to end](how-to/direct-cinematic-worlds.md): author an inert recipe pack and run the `cinematic-world` planning-and-review workflow.
30
- - [Make an educational video](how-to/educational-video.md): keep mathematical visuals, narration, and timing evidence revisable.
29
+ - [Plan camera moves, lighting, and effects for a 3D scene](how-to/direct-cinematic-worlds.md): author an inert recipe pack and run the `cinematic-world` planning-and-review workflow.
30
+ - [Make a math explainer video with Manim](how-to/educational-video.md): keep mathematical visuals, narration, and timing evidence revisable.
31
31
  - [Run or recover a workflow](how-to/run-workflows.md): use a built-in recipe or trusted Bun module and inspect its durable run.
32
32
  - [Configure Vercel](vercel.md), [publish Slopcamera](publishing.md), [operate the hosted API](hosted-api.md), or [file a platform submission](platform-submission.md): provider and maintainer procedures.
33
33
 
@@ -0,0 +1,51 @@
1
+ # Launch film
2
+
3
+ A code-built product film for a launch post. Every frame is HTML and CSS drawn from a timeline, so the film renders the same way each time and you can change a word without re-cutting anything.
4
+
5
+ The film has six acts:
6
+
7
+ 1. Cold open: a collage of the problem and two lines of copy.
8
+ 2. Title: the product name and its one-line promise.
9
+ 3. Product walk: your product in a browser frame, with a camera that moves between surfaces, a cursor and a drawn highlight. One step per entry in `film.json`.
10
+ 4. Proof: numbers counted up from your facts file.
11
+ 5. Limits: what the product does not do.
12
+ 6. End card: name, address and one line.
13
+
14
+ ## Files
15
+
16
+ | File | What it holds |
17
+ | --- | --- |
18
+ | `film.json` | Copy, aspect, frame rate, colors, fonts and product CSS. Start here. |
19
+ | `mockups.tsx` | Placeholder product surfaces. Replace them with your site's real mockup components. |
20
+ | `timeline.ts` | Act order and length. `film.js`, captions and per-beat clips all read it. |
21
+ | `film.html` | The stage, with `{{SLOT}}` placeholders that `build.ts` fills. |
22
+ | `film.css` | Canvas, scenes, masks, grain and the placeholder product styles. |
23
+ | `film.js` | The choreography. Each frame is a pure function of time. |
24
+ | `build.ts` | Writes `out/film.html`, `out/scene.json`, `out/captions.vtt` and `out/beats.json`. |
25
+
26
+ The motion helpers come from `@hraness/slopcamera/local/html-film` and are bundled into `out/film.html` at build time.
27
+
28
+ ## Make the film
29
+
30
+ ```sh
31
+ bun install
32
+ bun run build # add -- --aspect 9:16 for a vertical cut
33
+ slopcamera html still --input out/scene.json --at 3,12.5 --output out/stills
34
+ slopcamera html render --input out/scene.json --json > out/export.json
35
+ slopcamera html deliver out/export.json --basename launch --poster-at 9 --social-at 9 \
36
+ --beats out/beats.json --per-beat-clips
37
+ ```
38
+
39
+ Run each command from this directory. Look at the stills before rendering the full film.
40
+
41
+ ## Rules for the copy
42
+
43
+ - Take every number in `film.json` from a facts file or release record. Do not type numbers by hand.
44
+ - Keep the placeholder illustration note in `mockups.tsx` until the surfaces show your real product.
45
+ - Use sentence case and plain words. One idea per act.
46
+
47
+ ## Swap in your product
48
+
49
+ 1. Replace `ProductMockup` and `OpenCard` in `mockups.tsx`. Keep the `data-film` names that `film.json` steps point at (`list`, `detail-body`, `row-2`, `action`), or change both together. Each step names a `focus` for the camera, a `target` for the cursor click, an optional `highlight`, and an optional `after` state that the target gets once clicked (styled with `[data-film-state="done"]` in `film.css`).
50
+ 2. If your site uses `@hraness/design-kit`, its `mockups.css` is inlined automatically. List any other product stylesheets in `film.json` under `productCss`.
51
+ 3. List your fonts in `film.json` under `fonts` as `{ "name", "family", "weight", "file" }`. Without them the film uses the Nebula Sans files that ship with SlopCamera.
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Builds the launch film's Slopcamera scene.
3
+ *
4
+ * Renders the product mockups to static markup, inlines the shared mockup
5
+ * stylesheet (when @hraness/design-kit is installed), product CSS, the film's
6
+ * own CSS and its bundled choreography into out/film.html, copies fonts next
7
+ * to it as declared resources, and writes:
8
+ *
9
+ * - out/scene.json, validated against the Slopcamera scene schema
10
+ * - out/captions.vtt, from the same timeline the film plays
11
+ * - out/beats.json, each act's start and end for per-beat clips
12
+ *
13
+ * Usage: bun build.ts [--aspect 16:9|1:1|9:16] [--scale 0.5] [--fps 15] [--until 3]
14
+ * --scale, --fps and --until make a quick draft without changing the layout.
15
+ */
16
+ import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
17
+ import { dirname, join, resolve } from "node:path";
18
+ import { createElement, Fragment, type ReactElement } from "react";
19
+ import { renderToStaticMarkup } from "react-dom/server";
20
+ import { captionsFromTimeline } from "@hraness/slopcamera/local/html-film";
21
+ import { HtmlSceneInputSchema } from "@hraness/slopcamera/local/html-overlay";
22
+
23
+ import { OpenCard, ProductMockup } from "./mockups.tsx";
24
+ import { filmTimeline, type FilmCopy } from "./timeline.ts";
25
+
26
+ interface FilmFont { readonly name: string; readonly family: string; readonly weight: string; readonly file: string }
27
+ interface FilmConfig {
28
+ readonly name: string;
29
+ readonly aspect: Aspect;
30
+ readonly fps: number;
31
+ readonly seed: number;
32
+ readonly background: string;
33
+ readonly accent: string;
34
+ readonly productCss?: readonly string[];
35
+ readonly fonts?: readonly FilmFont[];
36
+ readonly copy: FilmCopy;
37
+ }
38
+
39
+ const ASPECTS = { "16:9": [1920, 1080], "1:1": [1080, 1080], "9:16": [1080, 1920] } as const;
40
+ type Aspect = keyof typeof ASPECTS;
41
+
42
+ const here = dirname(new URL(import.meta.url).pathname);
43
+ const out = join(here, "out");
44
+ mkdirSync(join(out, "fonts"), { recursive: true });
45
+
46
+ const film = JSON.parse(readFileSync(join(here, "film.json"), "utf8")) as FilmConfig;
47
+ function flag(name: string): string | undefined {
48
+ const index = process.argv.indexOf(name);
49
+ return index === -1 ? undefined : process.argv[index + 1];
50
+ }
51
+ const aspect = (flag("--aspect") ?? film.aspect) as Aspect;
52
+ if (!(aspect in ASPECTS)) throw new Error(`--aspect must be one of ${Object.keys(ASPECTS).join(", ")}.`);
53
+ const scale = Number(flag("--scale") ?? "1");
54
+ const fps = Number(flag("--fps") ?? String(film.fps));
55
+ if (!(scale > 0 && scale <= 1)) throw new Error("--scale must be above 0 and at most 1.");
56
+ if (!Number.isInteger(fps) || fps < 1 || fps > 60) throw new Error("--fps must be a whole number from 1 to 60.");
57
+ /** --until 3 renders only the first seconds, for a quick check of the path. */
58
+ const until = flag("--until") === undefined ? Infinity : Number(flag("--until"));
59
+ if (!(until > 0)) throw new Error("--until must be more than 0 seconds.");
60
+ /** The film lays out at full size; the canvas is that size times --scale. */
61
+ const [width, height] = ASPECTS[aspect];
62
+ const unit = Math.min(width, height) / 1080;
63
+ const even = (value: number) => Math.max(2, Math.round(value * scale / 2) * 2);
64
+ const canvasWidth = even(width);
65
+ const canvasHeight = even(height);
66
+
67
+ const timeline = filmTimeline(film.copy);
68
+
69
+ /** Slopcamera's own package root, for the default fonts. */
70
+ const slopcameraRoot = resolve(dirname(Bun.resolveSync("@hraness/slopcamera/local/html-film", here)), "../../..");
71
+ const fonts: readonly FilmFont[] = film.fonts ?? [
72
+ { name: "sans-book", family: "Film Sans", weight: "400", file: join(slopcameraRoot, "src/assets/fonts/nebula-sans/NebulaSans-Book.woff2") },
73
+ { name: "sans-bold", family: "Film Sans", weight: "700", file: join(slopcameraRoot, "src/assets/fonts/nebula-sans/NebulaSans-Bold.woff2") },
74
+ ];
75
+ for (const font of fonts) copyFileSync(resolve(here, font.file), join(out, "fonts", `${font.name}.woff2`));
76
+
77
+ /** The shared mockup stylesheet, when this project uses @hraness/design-kit. */
78
+ function kitCss(): string {
79
+ try {
80
+ const path = Bun.resolveSync("@hraness/design-kit/mockups.css", here);
81
+ return readFileSync(path, "utf8");
82
+ } catch {
83
+ return "";
84
+ }
85
+ }
86
+
87
+ async function bundle(entry: string): Promise<string> {
88
+ const result = await Bun.build({ entrypoints: [join(here, entry)], target: "browser", format: "iife", minify: { whitespace: true, syntax: true } });
89
+ if (!result.success) throw new AggregateError(result.logs, `Could not bundle ${entry}.`);
90
+ return (await result.outputs[0]!.text()).replaceAll("</script", "<\\/script");
91
+ }
92
+
93
+ /**
94
+ * Mockup slots: each `{{ID}}` in film.html becomes the static markup of its
95
+ * element. Swap in your site's real mockup components here.
96
+ */
97
+ const mockupSlots: readonly { readonly id: string; readonly element: ReactElement }[] = [
98
+ { id: "PRODUCT", element: createElement(ProductMockup, { url: `app.${film.copy.url}` }) },
99
+ { id: "OPEN_CARDS", element: createElement(Fragment, null, ...Array.from({ length: 6 }, (_, index) => createElement(OpenCard, { index, key: index }))) },
100
+ ];
101
+
102
+ const read = (path: string) => readFileSync(join(here, path), "utf8");
103
+ const escapeHtml = (text: string) => text.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;");
104
+ /** Seconds rounded to the millisecond, so beats.json reads cleanly as post source text. */
105
+ const ms = (value: number) => Math.round(value * 1000) / 1000;
106
+ const slots: Record<string, string> = {
107
+ TITLE: escapeHtml(film.name),
108
+ ASPECT: aspect,
109
+ WIDTH: String(width),
110
+ HEIGHT: String(height),
111
+ CANVAS_WIDTH: String(canvasWidth),
112
+ CANVAS_HEIGHT: String(canvasHeight),
113
+ ZOOM: String(canvasWidth / width),
114
+ UNIT: String(unit),
115
+ ACCENT: film.accent,
116
+ KIT_CSS: kitCss(),
117
+ PRODUCT_CSS: (film.productCss ?? []).map(path => readFileSync(resolve(here, path), "utf8")).join("\n"),
118
+ FILM_CSS: read("film.css"),
119
+ FILM_JS: await bundle("film.js"),
120
+ CONFIG: JSON.stringify({ width, height, unit, copy: film.copy, fonts: fonts.map(({ name, family, weight }) => ({ name, family, weight })) }).replaceAll("<", "\\u003c"),
121
+ ...Object.fromEntries(mockupSlots.map(({ id, element }) => [id, renderToStaticMarkup(element)])),
122
+ };
123
+
124
+ let html = read("film.html");
125
+ for (const [key, value] of Object.entries(slots)) html = html.replaceAll(`{{${key}}}`, () => value);
126
+ const missing = /\{\{[A-Z_]+\}\}/u.exec(html);
127
+ if (missing !== null) throw new Error(`Unfilled slot ${missing[0]}`);
128
+ writeFileSync(join(out, "film.html"), html);
129
+
130
+ const scene = HtmlSceneInputSchema.parse({
131
+ kind: "slopcamera.html-scene",
132
+ schemaVersion: 1,
133
+ name: film.name,
134
+ document: { path: "out/film.html" },
135
+ canvas: { width: canvasWidth, height: canvasHeight, deviceScaleFactor: 1 },
136
+ timing: { durationUs: Math.round(Math.min(timeline.duration, until) * 1_000_000), fps },
137
+ libraries: [],
138
+ seed: film.seed,
139
+ background: film.background,
140
+ parameters: {},
141
+ resources: fonts.map(font => ({
142
+ name: font.name,
143
+ path: `out/fonts/${font.name}.woff2`,
144
+ urlPath: `fonts/${font.name}.woff2`,
145
+ mediaType: "font/woff2",
146
+ })),
147
+ });
148
+ writeFileSync(join(out, "scene.json"), `${JSON.stringify(scene, null, 2)}\n`);
149
+ writeFileSync(join(out, "captions.vtt"), captionsFromTimeline(timeline));
150
+ writeFileSync(join(out, "beats.json"), `${JSON.stringify({
151
+ duration: ms(Math.min(timeline.duration, until)),
152
+ beats: timeline.acts
153
+ .filter(({ start }) => start < until)
154
+ .map(({ id, start, end, caption }) => ({ id, start: ms(start), end: ms(Math.min(end, until)), caption })),
155
+ }, null, 2)}\n`);
156
+
157
+ const kb = Math.round(Buffer.byteLength(html) / 1024);
158
+ console.log(`out/film.html ${kb} KB of 1024 KB; ${aspect} ${canvasWidth}x${canvasHeight} at ${fps} fps; ${Math.min(timeline.duration, until).toFixed(1)} s; ${timeline.acts.length} acts`);