@mulmoclaude/mulmoscript-plugin 4.4.0 → 4.5.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 (45) hide show
  1. package/dist/contract-BHqxMUWm.cjs +82 -0
  2. package/dist/contract-BHqxMUWm.cjs.map +1 -0
  3. package/dist/contract-BnIl6w_f.js +53 -0
  4. package/dist/contract-BnIl6w_f.js.map +1 -0
  5. package/dist/core/contract.d.ts +80 -6
  6. package/dist/core/contract.d.ts.map +1 -1
  7. package/dist/core/definition.d.ts.map +1 -1
  8. package/dist/core/paths.d.ts +41 -0
  9. package/dist/core/paths.d.ts.map +1 -1
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/{plugin-BOq5YkTl.cjs → plugin-C5JC2lNR.cjs} +51 -1
  13. package/dist/plugin-C5JC2lNR.cjs.map +1 -0
  14. package/dist/{plugin-CAhxJ5WM.js → plugin-Jo8iGv4K.js} +40 -2
  15. package/dist/plugin-Jo8iGv4K.js.map +1 -0
  16. package/dist/server/dispatch.d.ts +0 -6
  17. package/dist/server/dispatch.d.ts.map +1 -1
  18. package/dist/server/ops.d.ts +29 -18
  19. package/dist/server/ops.d.ts.map +1 -1
  20. package/dist/server/types.d.ts +64 -2
  21. package/dist/server/types.d.ts.map +1 -1
  22. package/dist/server.cjs +423 -110
  23. package/dist/server.cjs.map +1 -1
  24. package/dist/server.js +423 -110
  25. package/dist/server.js.map +1 -1
  26. package/dist/style.css +30 -18
  27. package/dist/vue/View.vue.d.ts.map +1 -1
  28. package/dist/vue/composables/useDeckEditor.d.ts.map +1 -1
  29. package/dist/vue/index.d.ts +1 -1
  30. package/dist/vue/index.d.ts.map +1 -1
  31. package/dist/vue/subscription.d.ts +16 -0
  32. package/dist/vue/subscription.d.ts.map +1 -0
  33. package/dist/vue/transport.d.ts +16 -5
  34. package/dist/vue/transport.d.ts.map +1 -1
  35. package/dist/vue.cjs +110 -21
  36. package/dist/vue.cjs.map +1 -1
  37. package/dist/vue.js +110 -21
  38. package/dist/vue.js.map +1 -1
  39. package/package.json +11 -11
  40. package/dist/contract-BhN3yKJC.cjs +0 -36
  41. package/dist/contract-BhN3yKJC.cjs.map +0 -1
  42. package/dist/contract-CIt1ZAtt.js +0 -19
  43. package/dist/contract-CIt1ZAtt.js.map +0 -1
  44. package/dist/plugin-BOq5YkTl.cjs.map +0 -1
  45. package/dist/plugin-CAhxJ5WM.js.map +0 -1
package/dist/style.css CHANGED
@@ -396,6 +396,10 @@
396
396
  position: relative;
397
397
  }
398
398
 
399
+ .static {
400
+ position: static;
401
+ }
402
+
399
403
  .inset-0 {
400
404
  inset: 0;
401
405
  }
@@ -546,6 +550,10 @@
546
550
  display: block;
547
551
  }
548
552
 
553
+ .contents {
554
+ display: contents;
555
+ }
556
+
549
557
  .flex {
550
558
  display: flex;
551
559
  }
@@ -714,6 +722,10 @@
714
722
  flex-shrink: 0;
715
723
  }
716
724
 
725
+ .grow {
726
+ flex-grow: 1;
727
+ }
728
+
717
729
  .-translate-x-1\/2 {
718
730
  --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
719
731
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -1746,18 +1758,18 @@
1746
1758
  }
1747
1759
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
1748
1760
  @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-400:oklch(70.4% .191 22.216);--color-red-600:oklch(57.7% .245 27.325);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-500:oklch(68.5% .169 237.323);--color-violet-500:oklch(60.6% .25 292.717);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-900:oklch(21.6% .006 56.043);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.\@container{container-type:inline-size}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.-top-20{top:calc(var(--spacing) * -20)}.top-0{top:0}.top-5{top:calc(var(--spacing) * 5)}.top-\[52px\]{top:52px}.-right-8{right:calc(var(--spacing) * -8)}.right-0{right:0}.right-1{right:var(--spacing)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-16{left:calc(var(--spacing) * -16)}.left-0{left:0}.left-1{left:var(--spacing)}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.z-\[1\]{z-index:1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.row-2{grid-row:2}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:var(--spacing)}.mx-12{margin-inline:calc(var(--spacing) * 12)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-video{aspect-ratio:var(--aspect-video)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-\[2px\]{height:2px}.h-\[3px\]{height:3px}.h-\[280px\]{height:280px}.h-\[360px\]{height:360px}.h-full{height:100%}.max-h-1\/2{max-height:50%}.min-h-0{min-height:0}.w-1{width:var(--spacing)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-56{width:calc(var(--spacing) * 56)}.w-\[48px\]{width:48px}.w-\[280px\]{width:280px}.w-\[360px\]{width:360px}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-\[80px\]{min-width:80px}.flex-1{flex:1}.flex-\[1\.5\]{flex:1.5}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-200{border-color:var(--color-gray-200)}.border-red-400{border-color:var(--color-red-400)}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-300{border-color:var(--color-stone-300)}.border-stone-700{border-color:var(--color-stone-700)}.border-transparent{border-color:#0000}.bg-\[\#0D1117\]{background-color:#0d1117}.bg-amber-500{background-color:var(--color-amber-500)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-50\/40{background-color:#fafaf966}@supports (color:color-mix(in lab, red, red)){.bg-stone-50\/40{background-color:color-mix(in oklab, var(--color-stone-50) 40%, transparent)}}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-700{background-color:var(--color-stone-700)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-12{padding-inline:calc(var(--spacing) * 12)}.px-16{padding-inline:calc(var(--spacing) * 16)}.px-20{padding-inline:calc(var(--spacing) * 20)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[52px\]{font-size:52px}.text-\[60px\]{font-size:60px}.text-\[64px\]{font-size:64px}.text-\[68px\]{font-size:68px}.text-\[76px\]{font-size:76px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-red-600{color:var(--color-red-600)}.text-rose-600{color:var(--color-rose-600)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-white{color:var(--color-white)}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.opacity-10{opacity:.1}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-stone-300:hover{border-color:var(--color-stone-300)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-stone-100:hover{background-color:var(--color-stone-100)}.hover\:bg-stone-200:hover{background-color:var(--color-stone-200)}.hover\:text-stone-900:hover{color:var(--color-stone-900)}}.disabled\:opacity-30:disabled{opacity:.3}@media (min-width:40rem){.sm\:inline{display:inline}}@container (min-width:48rem){.\@3xl\:max-h-none{max-height:none}.\@3xl\:w-\[var\(--beat-editor-pane-width\,24rem\)\]{width:var(--beat-editor-pane-width,24rem)}.\@3xl\:flex-row{flex-direction:row}.\@3xl\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.\@3xl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
1749
- .bottom-bar-wrapper[data-v-f9957eaf] {
1761
+ .bottom-bar-wrapper[data-v-2d5f76ac] {
1750
1762
  position: relative;
1751
1763
  flex-shrink: 0;
1752
1764
  }
1753
- .script-source[data-v-f9957eaf] {
1765
+ .script-source[data-v-2d5f76ac] {
1754
1766
  padding: 0.5rem;
1755
1767
  background: #f5f5f5;
1756
1768
  border-top: 1px solid #e0e0e0;
1757
1769
  font-family: Consolas, "MS Gothic", "BIZ UDGothic", monospace;
1758
1770
  font-size: 0.85rem;
1759
1771
  }
1760
- .script-source summary[data-v-f9957eaf] {
1772
+ .script-source summary[data-v-2d5f76ac] {
1761
1773
  cursor: pointer;
1762
1774
  user-select: none;
1763
1775
  padding: 0.5rem;
@@ -1766,13 +1778,13 @@
1766
1778
  font-weight: 500;
1767
1779
  color: #333;
1768
1780
  }
1769
- .script-source[open] summary[data-v-f9957eaf] {
1781
+ .script-source[open] summary[data-v-2d5f76ac] {
1770
1782
  margin-bottom: 0.5rem;
1771
1783
  }
1772
- .script-source summary[data-v-f9957eaf]:hover {
1784
+ .script-source summary[data-v-2d5f76ac]:hover {
1773
1785
  background: #d8d8d8;
1774
1786
  }
1775
- .script-editor[data-v-f9957eaf] {
1787
+ .script-editor[data-v-2d5f76ac] {
1776
1788
  width: 100%;
1777
1789
  height: 40vh;
1778
1790
  padding: 1rem;
@@ -1786,23 +1798,23 @@
1786
1798
  margin-bottom: 0.5rem;
1787
1799
  line-height: 1.5;
1788
1800
  }
1789
- .script-editor[data-v-f9957eaf]:focus {
1801
+ .script-editor[data-v-2d5f76ac]:focus {
1790
1802
  outline: none;
1791
1803
  border-color: #4caf50;
1792
1804
  box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
1793
1805
  }
1794
- .script-editor-invalid[data-v-f9957eaf] {
1806
+ .script-editor-invalid[data-v-2d5f76ac] {
1795
1807
  border-color: #ef4444;
1796
1808
  }
1797
- .script-editor-invalid[data-v-f9957eaf]:focus {
1809
+ .script-editor-invalid[data-v-2d5f76ac]:focus {
1798
1810
  border-color: #ef4444;
1799
1811
  box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.1);
1800
1812
  }
1801
- .editor-actions[data-v-f9957eaf] {
1813
+ .editor-actions[data-v-2d5f76ac] {
1802
1814
  display: flex;
1803
1815
  justify-content: space-between;
1804
1816
  }
1805
- .apply-btn[data-v-f9957eaf] {
1817
+ .apply-btn[data-v-2d5f76ac] {
1806
1818
  padding: 0.5rem 1rem;
1807
1819
  background: #4caf50;
1808
1820
  color: white;
@@ -1813,16 +1825,16 @@
1813
1825
  transition: background 0.2s;
1814
1826
  font-weight: 500;
1815
1827
  }
1816
- .apply-btn[data-v-f9957eaf]:hover {
1828
+ .apply-btn[data-v-2d5f76ac]:hover {
1817
1829
  background: #45a049;
1818
1830
  }
1819
- .apply-btn[data-v-f9957eaf]:disabled {
1831
+ .apply-btn[data-v-2d5f76ac]:disabled {
1820
1832
  background: #cccccc;
1821
1833
  color: #666666;
1822
1834
  cursor: not-allowed;
1823
1835
  opacity: 0.6;
1824
1836
  }
1825
- .cancel-btn[data-v-f9957eaf] {
1837
+ .cancel-btn[data-v-2d5f76ac] {
1826
1838
  padding: 0.5rem 1rem;
1827
1839
  background: #e0e0e0;
1828
1840
  color: #333;
@@ -1833,10 +1845,10 @@
1833
1845
  transition: background 0.2s;
1834
1846
  font-weight: 500;
1835
1847
  }
1836
- .cancel-btn[data-v-f9957eaf]:hover {
1848
+ .cancel-btn[data-v-2d5f76ac]:hover {
1837
1849
  background: #d0d0d0;
1838
1850
  }
1839
- .copy-btn[data-v-f9957eaf] {
1851
+ .copy-btn[data-v-2d5f76ac] {
1840
1852
  position: absolute;
1841
1853
  bottom: 0.3rem;
1842
1854
  right: 0.65rem;
@@ -1847,10 +1859,10 @@
1847
1859
  cursor: pointer;
1848
1860
  z-index: 1;
1849
1861
  }
1850
- .copy-btn[data-v-f9957eaf]:hover {
1862
+ .copy-btn[data-v-2d5f76ac]:hover {
1851
1863
  color: #000;
1852
1864
  }
1853
- .copy-btn .material-icons[data-v-f9957eaf] {
1865
+ .copy-btn .material-icons[data-v-2d5f76ac] {
1854
1866
  font-size: 1.15rem;
1855
1867
  }
1856
1868
  /*$vite$:1*/
@@ -1 +1 @@
1
- {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AAy6CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+CrD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;CACrD,CAAC;AA0gEF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AAw6CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+CrD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;CACrD,CAAC;AAmhEF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDeckEditor.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useDeckEditor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgBjE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C;gFAC4E;IAC5E,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,oBAAoB;;;yBA+BtE,eAAe,KAAG,IAAI;gCAOjB,IAAI;iCAcD,MAAM,IAAI,KAAG,MAAM,IAAI;EAY5D"}
1
+ {"version":3,"file":"useDeckEditor.d.ts","sourceRoot":"","sources":["../../../src/vue/composables/useDeckEditor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgBjE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C;gFAC4E;IAC5E,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,oBAAoB;;;yBA+BtE,eAAe,KAAG,IAAI;gCAOjB,IAAI;iCAcD,MAAM,IAAI,KAAG,MAAM,IAAI;EAc5D"}
@@ -10,7 +10,7 @@ export type { MulmoScriptDispatchArgs, MulmoScriptDispatchResult, MulmoScriptGen
10
10
  export { GENERATION_EVENT, SCRIPT_CHANGED_EVENT } from "../core/contract";
11
11
  export { TOOL_NAME, TOOL_DEFINITION } from "../core/definition";
12
12
  export { MULMOSCRIPT_HOST_ADAPTER_KEY, useHostAdapter, type MulmoScriptHostAdapter } from "./hostAdapter";
13
- export { useMulmoScriptTransport, type MulmoScriptTransport, type TransportResult } from "./transport";
13
+ export { useMulmoScriptTransport, type MulmoScriptTransport, type TransportResult, type GenerationSubscription, type ScriptChangedSubscription, } from "./transport";
14
14
  export { View, Preview };
15
15
  declare const _default: {
16
16
  plugin: ToolPlugin<MulmoScriptData, MulmoScriptData, SaveMulmoScriptArgs, import("gui-chat-protocol").InputHandler, Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAMtB,OAAO,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,OAAO,MAAM,eAAe,CAAC;AAEpC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,eAAe,EAAE,mBAAmB,CAIpF,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrG,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1J,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,cAAc,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;;;AAEzB,wBAA0B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAMtB,OAAO,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,OAAO,MAAM,eAAe,CAAC;AAEpC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,eAAe,EAAE,mBAAmB,CAIpF,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACrG,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1J,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,cAAc,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EACL,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;;;AAEzB,wBAA0B"}
@@ -0,0 +1,16 @@
1
+ import type { MulmoScriptGenerationEvent } from "../core/contract";
2
+ export interface GenerationSubscription {
3
+ filePath: () => string;
4
+ root: () => string | undefined;
5
+ handler: (event: MulmoScriptGenerationEvent) => void;
6
+ }
7
+ export interface ScriptChangedSubscription {
8
+ filePath: () => string;
9
+ root: () => string | undefined;
10
+ /** This View's id — its own writes echo back and must not be acted on. */
11
+ ownOrigin: string;
12
+ handler: () => void;
13
+ }
14
+ export declare function normalizeGenerationSubscription(first: GenerationSubscription | (() => string), legacyHandler?: (event: MulmoScriptGenerationEvent) => void): GenerationSubscription;
15
+ export declare function normalizeScriptChangedSubscription(first: ScriptChangedSubscription | (() => string), legacyOwnOrigin?: string, legacyHandler?: () => void): ScriptChangedSubscription;
16
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/vue/subscription.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC/B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA6BD,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,sBAAsB,GAAG,CAAC,MAAM,MAAM,CAAC,EAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,GAC1D,sBAAsB,CAIxB;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,yBAAyB,GAAG,CAAC,MAAM,MAAM,CAAC,EACjD,eAAe,CAAC,EAAE,MAAM,EACxB,aAAa,CAAC,EAAE,MAAM,IAAI,GACzB,yBAAyB,CAU3B"}
@@ -1,4 +1,6 @@
1
- import type { MulmoScriptDispatchArgs, MulmoScriptDispatchResult, MulmoScriptGenerationEvent } from "../core/contract";
1
+ import type { MulmoScriptChangedEvent, MulmoScriptDispatchArgs, MulmoScriptDispatchResult, MulmoScriptGenerationEvent } from "../core/contract";
2
+ import type { GenerationSubscription, ScriptChangedSubscription } from "./subscription";
3
+ export type { GenerationSubscription, ScriptChangedSubscription } from "./subscription";
2
4
  export type TransportResult<T> = {
3
5
  ok: true;
4
6
  data: T;
@@ -9,15 +11,24 @@ export type TransportResult<T> = {
9
11
  type ArgsFor<K extends MulmoScriptDispatchArgs["kind"]> = Omit<Extract<MulmoScriptDispatchArgs, {
10
12
  kind: K;
11
13
  }>, "kind">;
14
+ export declare function parseScriptChangedEvent(payload: unknown): MulmoScriptChangedEvent | null;
15
+ export declare function parseGenerationEvent(payload: unknown): MulmoScriptGenerationEvent | null;
12
16
  export interface MulmoScriptTransport {
13
17
  call<K extends MulmoScriptDispatchArgs["kind"]>(kind: K, args: ArgsFor<K>): Promise<TransportResult<MulmoScriptDispatchResult[K]>>;
14
- /** Subscribe to the host's generation channel, pre-filtered to one
15
- * script's wire path. Returns the unsubscribe function. */
18
+ /** Subscribe to the host's generation channel, pre-filtered to one script —
19
+ * identified by the PAIR `(root, filePath)`, since the same wire path
20
+ * exists in every registered root (#3014). Returns the unsubscribe
21
+ * function. */
22
+ onGenerationEvent(subscription: GenerationSubscription): () => void;
23
+ /** The pre-#3014 form: no root named, so the host's default root. Kept
24
+ * because this interface is exported from `/vue` on a published package. */
16
25
  onGenerationEvent(filePath: () => string, handler: (event: MulmoScriptGenerationEvent) => void): () => void;
17
26
  /** Subscribe to writes of one script, skipping the echo of this View's own
18
- * (`ownOrigin`). Returns the unsubscribe function. */
27
+ * (`ownOrigin`). Same pair identity as above. Returns the unsubscribe
28
+ * function. */
29
+ onScriptChanged(subscription: ScriptChangedSubscription): () => void;
30
+ /** The pre-#3014 form — see `onGenerationEvent` above. */
19
31
  onScriptChanged(filePath: () => string, ownOrigin: string, handler: () => void): () => void;
20
32
  }
21
33
  export declare function useMulmoScriptTransport(): MulmoScriptTransport;
22
- export {};
23
34
  //# sourceMappingURL=transport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/vue/transport.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAA2B,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAKhJ,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,KAAK,OAAO,CAAC,CAAC,SAAS,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAyBtH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,CAAC,SAAS,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnI;gEAC4D;IAC5D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5G;2DACuD;IACvD,eAAe,CAAC,QAAQ,EAAE,MAAM,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7F;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CA4C9D"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/vue/transport.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGhJ,OAAO,KAAK,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAIxF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,KAAK,OAAO,CAAC,CAAC,SAAS,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAwBtH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CAexF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,0BAA0B,GAAG,IAAI,CAmBxF;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,CAAC,SAAS,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnI;;;oBAGgB;IAChB,iBAAiB,CAAC,YAAY,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAAC;IACpE;iFAC6E;IAC7E,iBAAiB,CAAC,QAAQ,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5G;;oBAEgB;IAChB,eAAe,CAAC,YAAY,EAAE,yBAAyB,GAAG,MAAM,IAAI,CAAC;IACrE,0DAA0D;IAC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7F;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAmD9D"}
package/dist/vue.cjs CHANGED
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_plugin = require("./plugin-BOq5YkTl.cjs");
6
- const require_contract = require("./contract-BhN3yKJC.cjs");
5
+ const require_plugin = require("./plugin-C5JC2lNR.cjs");
6
+ const require_contract = require("./contract-BHqxMUWm.cjs");
7
7
  let _mulmocast_types = require("@mulmocast/types");
8
8
  let vue = require("vue");
9
9
  let _mulmocast_beat_editor = require("@mulmocast/beat-editor");
@@ -219,6 +219,57 @@ function focusLeftContainer(container, movedTo) {
219
219
  return !container.contains(movedTo);
220
220
  }
221
221
  //#endregion
222
+ //#region src/vue/subscription.ts
223
+ /** A caller that predates roots is asking for the host's default root. */
224
+ var DEFAULT_ROOT_GETTER = () => void 0;
225
+ /**
226
+ * The object form is checked at runtime, not only by the type.
227
+ *
228
+ * This package is published, so a JavaScript consumer reaches these functions
229
+ * with no call-site checking at all. An object missing `root` type-checks
230
+ * nowhere and passed through here unchanged, and the failure surfaced much
231
+ * later as `sub.root is not a function` — thrown inside a pubsub delivery,
232
+ * where there is no caller left to catch it and the only symptom is a View
233
+ * that silently stops updating (CodeRabbit on #3015).
234
+ *
235
+ * A missing `root` is the one field with a safe answer: absent means the
236
+ * default root, which is exactly what a caller who did not think about roots
237
+ * intended. A missing `filePath` or `handler` has no such answer, so it
238
+ * throws HERE, at the subscribe call, where the stack points at the bug.
239
+ */
240
+ function checkedSubscription(subscription, label) {
241
+ if (typeof subscription.filePath !== "function" || typeof subscription.handler !== "function") throw new TypeError(`${label}: filePath and handler must both be functions`);
242
+ if (subscription.root === void 0) return {
243
+ ...subscription,
244
+ root: DEFAULT_ROOT_GETTER
245
+ };
246
+ if (typeof subscription.root !== "function") throw new TypeError(`${label}: root must be a function returning the root id, or be omitted`);
247
+ return subscription;
248
+ }
249
+ function normalizeGenerationSubscription(first, legacyHandler) {
250
+ if (typeof first !== "function") return checkedSubscription(first, "onGenerationEvent(subscription)");
251
+ if (!legacyHandler) throw new TypeError("onGenerationEvent(filePath, handler): handler is required");
252
+ return {
253
+ filePath: first,
254
+ root: DEFAULT_ROOT_GETTER,
255
+ handler: legacyHandler
256
+ };
257
+ }
258
+ function normalizeScriptChangedSubscription(first, legacyOwnOrigin, legacyHandler) {
259
+ if (typeof first !== "function") {
260
+ const checked = checkedSubscription(first, "onScriptChanged(subscription)");
261
+ if (typeof checked.ownOrigin !== "string") throw new TypeError("onScriptChanged(subscription): ownOrigin must be a string");
262
+ return checked;
263
+ }
264
+ if (typeof legacyOwnOrigin !== "string" || !legacyHandler) throw new TypeError("onScriptChanged(filePath, ownOrigin, handler): ownOrigin and handler are required");
265
+ return {
266
+ filePath: first,
267
+ root: DEFAULT_ROOT_GETTER,
268
+ ownOrigin: legacyOwnOrigin,
269
+ handler: legacyHandler
270
+ };
271
+ }
272
+ //#endregion
222
273
  //#region src/vue/transport.ts
223
274
  var GENERATION_EVENT_KINDS = /* @__PURE__ */ new Set([
224
275
  "beatImage",
@@ -227,26 +278,53 @@ var GENERATION_EVENT_KINDS = /* @__PURE__ */ new Set([
227
278
  "movie",
228
279
  "pdf"
229
280
  ]);
281
+ /**
282
+ * A field that is absent, or a string.
283
+ *
284
+ * `undefined` is a legitimate answer for both `root` and `origin`, so a
285
+ * present-but-wrong-typed value CANNOT be flattened into it: `root: 42` read
286
+ * as "no root" makes a named root's event look like a default-root one, and
287
+ * the subscriber then routes another repository's script to this View
288
+ * (CodeRabbit on #3015 — the same shape the dispatch boundary was just fixed
289
+ * for). Malformed means malformed; the caller rejects the payload.
290
+ */
291
+ function optionalString(value) {
292
+ if (value === void 0) return {
293
+ ok: true,
294
+ value: void 0
295
+ };
296
+ return typeof value === "string" ? {
297
+ ok: true,
298
+ value
299
+ } : { ok: false };
300
+ }
230
301
  function parseScriptChangedEvent(payload) {
231
302
  if (!isRecord(payload)) return null;
232
- const { filePath, origin } = payload;
303
+ const { filePath, origin, root } = payload;
233
304
  if (typeof filePath !== "string") return null;
305
+ const parsedOrigin = optionalString(origin);
306
+ const parsedRoot = optionalString(root);
307
+ if (!parsedOrigin.ok || !parsedRoot.ok) return null;
234
308
  return {
235
309
  filePath,
236
- ...typeof origin === "string" ? { origin } : {}
310
+ ...parsedOrigin.value !== void 0 ? { origin: parsedOrigin.value } : {},
311
+ ...parsedRoot.value !== void 0 ? { root: parsedRoot.value } : {}
237
312
  };
238
313
  }
239
314
  function parseGenerationEvent(payload) {
240
315
  if (!isRecord(payload)) return null;
241
- const { kind, filePath, key, done, error } = payload;
316
+ const { kind, filePath, key, done, error, root } = payload;
242
317
  if (typeof kind !== "string" || !GENERATION_EVENT_KINDS.has(kind)) return null;
243
318
  if (typeof filePath !== "string" || typeof key !== "string" || typeof done !== "boolean") return null;
319
+ const parsedRoot = optionalString(root);
320
+ if (!parsedRoot.ok) return null;
244
321
  return {
245
322
  kind,
246
323
  filePath,
247
324
  key,
248
325
  done,
249
- ...typeof error === "string" ? { error } : {}
326
+ ...typeof error === "string" ? { error } : {},
327
+ ...parsedRoot.value !== void 0 ? { root: parsedRoot.value } : {}
250
328
  };
251
329
  }
252
330
  function useMulmoScriptTransport() {
@@ -273,12 +351,13 @@ function useMulmoScriptTransport() {
273
351
  data: result
274
352
  };
275
353
  }
276
- function onGenerationEvent(filePath, handler) {
354
+ function onGenerationEvent(first, legacyHandler) {
355
+ const { filePath, root, handler } = normalizeGenerationSubscription(first, legacyHandler);
277
356
  return runtime.pubsub.subscribe(require_contract.GENERATION_EVENT, (payload) => {
278
357
  const event = parseGenerationEvent(payload);
279
358
  if (!event) return;
280
359
  const current = filePath();
281
- if (!current || event.filePath !== current) return;
360
+ if (!current || event.filePath !== current || !require_contract.sameRoot(event.root, root())) return;
282
361
  handler(event);
283
362
  });
284
363
  }
@@ -289,11 +368,12 @@ function useMulmoScriptTransport() {
289
368
  * on them would rebuild the element the caret is in on every keystroke, so they are dropped
290
369
  * here. A write from the agent carries no origin and always reaches the handler.
291
370
  */
292
- function onScriptChanged(filePath, ownOrigin, handler) {
371
+ function onScriptChanged(first, legacyOwnOrigin, legacyHandler) {
372
+ const { filePath, root, ownOrigin, handler } = normalizeScriptChangedSubscription(first, legacyOwnOrigin, legacyHandler);
293
373
  return runtime.pubsub.subscribe(require_contract.SCRIPT_CHANGED_EVENT, (payload) => {
294
374
  const event = parseScriptChangedEvent(payload);
295
375
  if (!event) return;
296
- if (!require_contract.shouldReloadForScriptChange(event, filePath(), ownOrigin)) return;
376
+ if (!require_contract.shouldReloadForScriptChange(event, filePath(), ownOrigin, root())) return;
297
377
  handler();
298
378
  });
299
379
  }
@@ -650,9 +730,14 @@ function useDeckEditor({ api, filePath, effectiveScript, commitScript }) {
650
730
  * flushing cannot clobber it out of order.
651
731
  */
652
732
  function watchForeignWrites(reload) {
653
- return api.onScriptChanged(() => filePath.value, EDITOR_ORIGIN, () => {
654
- flushPendingDeckSave();
655
- reload();
733
+ return api.onScriptChanged({
734
+ filePath: () => filePath.value,
735
+ root: () => void 0,
736
+ ownOrigin: EDITOR_ORIGIN,
737
+ handler: () => {
738
+ flushPendingDeckSave();
739
+ reload();
740
+ }
656
741
  });
657
742
  }
658
743
  return {
@@ -2014,14 +2099,18 @@ var View_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.def
2014
2099
  }
2015
2100
  (0, vue.onMounted)(initializeScript);
2016
2101
  (0, vue.watch)(() => props.selectedResult, initializeScript);
2017
- const unsubscribeGenerationEvents = api.onGenerationEvent(() => filePath.value, (event) => {
2018
- if (!event.done) {
2019
- reflectGenerationStart(event);
2020
- return;
2102
+ const unsubscribeGenerationEvents = api.onGenerationEvent({
2103
+ filePath: () => filePath.value,
2104
+ root: () => void 0,
2105
+ handler: (event) => {
2106
+ if (!event.done) {
2107
+ reflectGenerationStart(event);
2108
+ return;
2109
+ }
2110
+ reflectGenerationFinish(event).catch((err) => {
2111
+ console.error("[presentMulmoScript] reload on finish failed:", err);
2112
+ });
2021
2113
  }
2022
- reflectGenerationFinish(event).catch((err) => {
2023
- console.error("[presentMulmoScript] reload on finish failed:", err);
2024
- });
2025
2114
  });
2026
2115
  function reflectGenerationStart(entry) {
2027
2116
  if (entry.kind === "beatImage") {
@@ -2357,7 +2446,7 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2357
2446
  };
2358
2447
  //#endregion
2359
2448
  //#region src/vue/View.vue
2360
- var View_default = /*#__PURE__*/ _plugin_vue_export_helper_default(View_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-f9957eaf"]]);
2449
+ var View_default = /*#__PURE__*/ _plugin_vue_export_helper_default(View_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-2d5f76ac"]]);
2361
2450
  //#endregion
2362
2451
  //#region src/vue/Preview.vue?vue&type=script&setup=true&lang.ts
2363
2452
  var _hoisted_1 = {