@combos-fun/plugin-development-tool 0.0.23 → 0.0.24

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/agent-skill.md CHANGED
@@ -48,8 +48,27 @@ new Game({
48
48
  |---------|-----|
49
49
  | Selection box never appears | Ensure both `EventSystem` and `GraphicsSystem` are registered |
50
50
  | Parent frame never receives messages | The page must be in an iframe / embedded context; `window.parent !== window` |
51
+ | Parent postMessage ignored | Check `allowedMessageOrigins` — defaults allow `knoffice.tech` and `converge.ai` (+ subdomains). Pass `['localhost']` to merge local dev hosts |
51
52
  | Selection stuck on stale node | Listen for `COMBOS_DEVELOPMENT_TOOL_REFRESH` to clear |
52
53
 
54
+ ## Inbound postMessage security
55
+
56
+ `CombosDevelopmentToolSystem` validates `MessageEvent.origin` before handling parent commands.
57
+
58
+ - Default allowlist: `knoffice.tech`, `converge.ai` (each matches the host and all subdomains).
59
+ - `allowedMessageOrigins` **merges** with defaults (deduped). Pass `['localhost']` for local parent pages without repeating the defaults.
60
+ - Pass `['*']` alone to accept any origin (disables the check).
61
+ - Local dev with a non-knoffice parent (e.g. `http://localhost:9001`): `allowedMessageOrigins: ['localhost']`.
62
+
63
+ ```ts
64
+ new CombosDevelopmentToolSystem({
65
+ allowedMessageOrigins: ['localhost'],
66
+ });
67
+ // effective: knoffice.tech, converge.ai, localhost
68
+ ```
69
+
70
+ Outbound `postMessageOrigin` is separate — it limits which parent origin receives selection snapshots.
71
+
53
72
  ## Verification
54
73
 
55
74
  `pnpm --filter @combos-fun/plugin-development-tool run build`.
@@ -41,6 +41,74 @@ class CombosDevelopmentToolTarget extends engine.Component {
41
41
  }
42
42
  }
43
43
 
44
+ /** Default inbound postMessage host suffixes (host + all subdomains). */
45
+ const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [
46
+ 'knoffice.tech',
47
+ 'converge.ai',
48
+ ];
49
+ /**
50
+ * Returns whether `origin` is allowed by `allowed`.
51
+ *
52
+ * Each entry in `allowed` is either:
53
+ * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;
54
+ * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;
55
+ * - `'*'` — accept any origin (escape hatch).
56
+ */
57
+ function isAllowedMessageOrigin(origin, allowed) {
58
+ if (allowed.includes('*')) {
59
+ return true;
60
+ }
61
+ if (allowed.length === 0) {
62
+ return false;
63
+ }
64
+ let parsed;
65
+ try {
66
+ parsed = new URL(origin);
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ const originLower = origin.toLowerCase();
72
+ const hostLower = parsed.hostname.toLowerCase();
73
+ for (const entry of allowed) {
74
+ const trimmed = entry.trim();
75
+ if (!trimmed) {
76
+ continue;
77
+ }
78
+ if (trimmed.includes('://')) {
79
+ if (originLower === trimmed.toLowerCase()) {
80
+ return true;
81
+ }
82
+ continue;
83
+ }
84
+ const suffix = trimmed.toLowerCase().replace(/^\./, '');
85
+ if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {
86
+ return true;
87
+ }
88
+ }
89
+ return false;
90
+ }
91
+ /** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */
92
+ function mergeAllowedMessageOrigins(extra) {
93
+ if (!extra?.length) {
94
+ return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];
95
+ }
96
+ if (extra.includes('*')) {
97
+ return ['*'];
98
+ }
99
+ const seen = new Set();
100
+ const result = [];
101
+ for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {
102
+ const trimmed = entry.trim();
103
+ if (!trimmed || seen.has(trimmed)) {
104
+ continue;
105
+ }
106
+ seen.add(trimmed);
107
+ result.push(trimmed);
108
+ }
109
+ return result;
110
+ }
111
+
44
112
  function isSceneSourceAnchor(v) {
45
113
  return (!!v &&
46
114
  typeof v === 'object' &&
@@ -304,6 +372,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
304
372
  constructor() {
305
373
  super(...arguments);
306
374
  this.postMessageOrigin = '*';
375
+ this.allowedMessageOrigins = mergeAllowedMessageOrigins();
307
376
  this.enabled = false;
308
377
  this.outlineGo = null;
309
378
  this.selected = null;
@@ -336,6 +405,9 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
336
405
  }
337
406
  };
338
407
  this.onWindowMessage = (e) => {
408
+ if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {
409
+ return;
410
+ }
339
411
  const d = e.data;
340
412
  if (!d || typeof d !== 'object')
341
413
  return;
@@ -380,6 +452,7 @@ let CombosDevelopmentToolSystem$1 = class CombosDevelopmentToolSystem extends en
380
452
  static { this.systemName = 'CombosDevelopmentToolSystem'; }
381
453
  init(params) {
382
454
  this.postMessageOrigin = params?.postMessageOrigin ?? '*';
455
+ this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);
383
456
  if (typeof window !== 'undefined') {
384
457
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);
385
458
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);
@@ -920,7 +993,7 @@ var CombosDevelopmentToolSystem = CombosDevelopmentToolSystem$1;
920
993
  /** Auto-generated by scripts/build-package.mjs — do not edit. */
921
994
  Object.assign(CombosDevelopmentToolSystem, {
922
995
  packageName: "@combos-fun/plugin-development-tool",
923
- packageVersion: "0.0.22",
996
+ packageVersion: "0.0.23",
924
997
  });
925
998
 
926
999
  exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY = COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY;
@@ -934,9 +1007,12 @@ exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS = COMBOS_DEVELOPMENT_TOOL_SET_SUCCES
934
1007
  exports.COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED = COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED;
935
1008
  exports.CombosDevelopmentToolSystem = CombosDevelopmentToolSystem;
936
1009
  exports.CombosDevelopmentToolTarget = CombosDevelopmentToolTarget;
1010
+ exports.DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES;
937
1011
  exports.applyPropertyValue = applyPropertyValue;
938
1012
  exports.applyPropertyWithHooks = applyPropertyWithHooks;
939
1013
  exports.buildGameObjectSnapshot = buildGameObjectSnapshot;
1014
+ exports.isAllowedMessageOrigin = isAllowedMessageOrigin;
1015
+ exports.mergeAllowedMessageOrigins = mergeAllowedMessageOrigins;
940
1016
  exports.readPropertyValue = readPropertyValue;
941
1017
  exports.readSourceAnchor = readSourceAnchor;
942
1018
  //# sourceMappingURL=plugin-development-tool.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.22\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","OBSERVER_TYPE","Event","HIT_AREA_TYPE","Graphics","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-development-tool.cjs.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.23\",\n});\n"],"names":["Component","CombosDevelopmentToolSystem","System","OBSERVER_TYPE","Event","HIT_AREA_TYPE","Graphics","RendererSystem","GameObject","__decorate","decorators"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer"),o=require("@combos-fun/plugin-renderer-graphics"),s=require("@combos-fun/plugin-renderer-event");const i="combos-development-tool:set",r="combos-development-tool:set-success",a="combos-development-tool:refresh",d="combos-development-tool:gameobject-selected",h="combos-development-tool:apply-property",c="combos-development-tool:set-paused",l="combos-development-tool:set-muted",u="combos-development-tool:state-changed";class p extends t.Component{constructor(){super(...arguments),this.payload={}}static{this.componentName="CombosDevelopmentToolTarget"}init(e){this.payload=e?.payload?{...e.payload}:{}}}const m=new Set(["gameObject","name","started","__componentDefaultParams","destroyed","inScene","worldTransform","children","_parent"]),f={Graphics:new Set(["graphics"]),Physics:new Set(["body","Body","PhysicsEngine","World","Constraint","mouseConstraint","bodyParams"]),Event:new Set(["hitArea"])};function g(e,t=0){if(null==e)return e;if("number"==typeof e||"string"==typeof e||"boolean"==typeof e)return e;if(!(t>6)){if(Array.isArray(e))return e.map(e=>g(e,t+1));if("object"==typeof e){const n={};for(const[o,s]of Object.entries(e)){if("function"==typeof s)continue;const e=g(s,t+1);void 0!==e&&(n[o]=e)}return n}}}function y(e){const t={},n=f[e.name];for(const o of Object.keys(e)){if(m.has(o)||o.startsWith("_"))continue;if(n?.has(o))continue;const s=e[o];if("function"==typeof s)continue;const i=g(s);void 0!==i&&(t[o]=i)}return t}function w(e){const t=e.getComponent(p),n=t?.payload?.source;var o;if((o=n)&&"object"==typeof o&&"string"==typeof o.file)return{file:n.file,anchor:n.anchor??e.name}}function b(e){const t=e.components.filter(e=>"CombosDevelopmentToolTarget"!==e.name).map(e=>({componentName:e.name,fields:y(e)}));return{id:e.id,name:e.name,components:t,source:w(e)}}function O(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;let i=s;for(let e=0;e<n.length-1;e++){const t=n[e];void 0!==i[t]&&null!==i[t]||(i[t]={}),i=i[t]}return i[n[n.length-1]]=o,!0}const E=new Set(["position","size","origin","anchor","scale","skew"]);function S(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&""!==e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}const v={Transform:function(e,t,n,o){const s=e.transform??t,i=s;if(1===n.length&&"rotation"===n[0]){const e=S(o);return void 0!==e&&(s.rotation=e,!0)}if(2===n.length&&E.has(n[0])){const t=n[0],s=n[1],r=S(o);if(void 0===r)return!1;const a=i[t];return!(!a||"object"!=typeof a)&&(a[s]=r,"position"===t&&(function(e){const t=e.getComponent("Physics");if(!t?.body)return;const{x:n,y:o}=e.transform.position;t.Body?.setPosition?t.Body.setPosition(t.body,{x:n,y:o}):(t.body.position.x=n,t.body.position.y=o)}(e),function(e){const t=e.getComponent("PlatformerMover");t&&(t.originX=e.transform.position.x,t.originY=e.transform.position.y)}(e)),!0)}return!1},Text:function(e,t,n,o){const s=t;if(1===n.length&&"text"===n[0])return s.text=String(o??""),!0;if(2===n.length&&"style"===n[0]){const e=n[1],t={...s.style??{},[e]:o};return s.style=t,!0}return!1},Sound:function(e,t,n,o){const s=t;if(1===n.length&&"volume"===n[0]||2===n.length&&"config"===n[0]&&"volume"===n[1]){const e=S(o);return void 0!==e&&(s.volume=e,!0)}return!1}};function G(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;const i=v[t];return!!i?.(e,s,n,o)||O(e,t,n,o)}const P="__combosDevelopmentToolOutline";let C=class extends t.System{constructor(){super(...arguments),this.postMessageOrigin="*",this.enabled=!1,this.outlineGo=null,this.selected=null,this.tapHandlers=new Map,this.tapOwners=new Map,this.disabledGameEventGoIds=new Set,this.pickEvents=new Set,this.needsRescan=!1,this.lastOutlineBounds=null,this.mutedWithoutSoundSystem=!1,this.onWindowSet=e=>{const t=e.detail;t&&"boolean"==typeof t.enabled&&this.setEnabled(t.enabled)},this.onWindowSetPaused=e=>{const t=e.detail;t&&"boolean"==typeof t.paused&&this.setPaused(t.paused)},this.onWindowSetMuted=e=>{const t=e.detail;t&&"boolean"==typeof t.muted&&this.setMuted(t.muted)},this.onWindowMessage=e=>{const t=e.data;t&&"object"==typeof t&&(t.type===i&&"boolean"==typeof t.enabled?this.setEnabled(t.enabled):t.type===c&&"boolean"==typeof t.paused?this.setPaused(t.paused):t.type===l&&"boolean"==typeof t.muted?this.setMuted(t.muted):t.type===a?this.requestSceneRescan():t.type===h&&this.handleApplyProperty(t))},this.onGameSet=e=>{e&&"boolean"==typeof e.enabled&&this.setEnabled(e.enabled)},this.onGameRefresh=()=>{this.requestSceneRescan()},this.onGameSetPaused=e=>{e&&"boolean"==typeof e.paused&&this.setPaused(e.paused)},this.onGameSetMuted=e=>{e&&"boolean"==typeof e.muted&&this.setMuted(e.muted)},this.onWindowRefresh=()=>{this.requestSceneRescan()}}static{this.systemName="CombosDevelopmentToolSystem"}init(e){this.postMessageOrigin=e?.postMessageOrigin??"*","undefined"!=typeof window&&(window.addEventListener(i,this.onWindowSet),window.addEventListener(c,this.onWindowSetPaused),window.addEventListener(l,this.onWindowSetMuted),window.addEventListener(a,this.onWindowRefresh),window.addEventListener("message",this.onWindowMessage)),this.game.on(i,this.onGameSet),this.game.on(c,this.onGameSetPaused),this.game.on(l,this.onGameSetMuted),this.game.on(a,this.onGameRefresh),this.enabled&&(this.needsRescan=!0)}onDestroy(){"undefined"!=typeof window&&(window.removeEventListener(i,this.onWindowSet),window.removeEventListener(c,this.onWindowSetPaused),window.removeEventListener(l,this.onWindowSetMuted),window.removeEventListener(a,this.onWindowRefresh),window.removeEventListener("message",this.onWindowMessage)),this.game.off(i,this.onGameSet),this.game.off(c,this.onGameSetPaused),this.game.off(l,this.onGameSetMuted),this.game.off(a,this.onGameRefresh),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.clearSelection()}setEnabled(e){this.enabled!==e&&(this.enabled=e,e?this.needsRescan=!0:(this.clearSelection(),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.postSetSuccess(!1)))}get isEnabled(){return this.enabled}get isPaused(){return!this.game.playing}get isMuted(){const e=this.getSoundSystem();return e?e.muted:this.mutedWithoutSoundSystem}setPaused(e){e?this.game.playing&&this.game.pause():this.game.playing||this.game.resume(),this.postStateChanged()}setMuted(e){const t=this.getSoundSystem();t?t.muted=e:this.mutedWithoutSoundSystem=e,this.postStateChanged()}update(e){this.enabled&&this.needsRescan&&(this.needsRescan=!1,this.attachEditMode(),this.postSetSuccess(!0));for(const e of[...this.tapOwners.values()])e.destroyed&&this.releasePick(e);this.enabled&&this.selected&&this.outlineGo&&this.updateSelectionOutline()}componentChanged(e){if(!this.enabled)return;const{type:n,gameObject:o,componentName:s}=e;o&&"CombosDevelopmentToolTarget"===s&&(n===t.OBSERVER_TYPE.ADD?(this.stripGameEvent(o),this.ensurePick(o)):n===t.OBSERVER_TYPE.REMOVE&&(this.releasePick(o),this.selected===o&&this.clearSelection()))}requestSceneRescan(){this.enabled&&(this.needsRescan=!0)}attachEditMode(){this.detachAllPicks();const e=[];for(const t of this.game.scene.transform.children)this.collectGameObjects(t.gameObject,e);for(const t of e)this.isIgnoredPickGo(t)||this.stripGameEvent(t);for(const t of e)this.isIgnoredPickGo(t)||t.getComponent(p)&&this.ensurePick(t)}collectGameObjects(e,t){t.push(e);for(const n of e.transform.children)this.collectGameObjects(n.gameObject,t)}isIgnoredPickGo(e){return e.name===P||e===this.outlineGo}stripGameEvent(e){if(this.disabledGameEventGoIds.has(e.id))return;if(!e.getComponent(s.Event))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!1,this.disabledGameEventGoIds.add(e.id)}catch{}}restoreDisabledGameEvents(){for(const e of[...this.disabledGameEventGoIds]){const t=this.findGameObjectById(e);if(!t||t.destroyed){this.disabledGameEventGoIds.delete(e);continue}const n=this.getRendererContainer(t);if(n)try{n.interactive=!0}catch{}this.disabledGameEventGoIds.delete(e)}}detachAllPicks(){for(const e of[...this.tapOwners.values()])this.releasePick(e)}ensurePick(e){if(this.tapHandlers.has(e.id))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!0}catch{}let n=e.getComponent(s.Event);n||(n=e.addComponent(this.createPickEvent(e)),this.pickEvents.add(e.id));const o=t=>this.onSelect(e,t);this.tapHandlers.set(e.id,o),this.tapOwners.set(e.id,e),n.on("tap",o)}createPickEvent(e){const t=this.resolvePickBounds(e);return t.width>0&&t.height>0?new s.Event({hitArea:{type:s.HIT_AREA_TYPE.Rect,style:{x:t.x,y:t.y,width:t.width,height:t.height}}}):new s.Event}resolvePickBounds(e){if(this.shouldPreferRenderedBounds(e)){const t=this.resolveOwnGraphicsLocalBounds(e);if(t)return t;const n=this.resolveContainerLocalBounds(e);if(n)return n}const{width:t,height:n}=e.transform.size;if(t>0&&n>0)return{x:0,y:0,width:t,height:n};const o=this.resolveContainerLocalBounds(e);return o||{x:0,y:0,width:1,height:1}}shouldPreferRenderedBounds(e){return null!=e.getComponent(o.Graphics)}resolveOwnGraphicsLocalBounds(e){const t=e.getComponent(o.Graphics);if(!t?.graphics)return null;try{const e=t.graphics.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}return null}resolveContainerLocalBounds(e){const t=this.getRendererContainer(e);if(!t)return null;const n=this.getOutlineContainerIfChildOf(e);let o=!1;n?.parent===t&&(t.removeChild(n),o=!0);try{const e=t.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}finally{o&&n&&t.addChild(n)}return null}getOutlineContainerIfChildOf(e){return this.outlineGo&&this.outlineGo.parent===e?this.getRendererContainer(this.outlineGo):null}getRendererContainer(e){const t=this.game.getSystem(n.RendererSystem);if(!t?.containerManager)return null;try{return t.containerManager.getContainer(e.id)}catch{return null}}releasePick(e){const t=this.tapHandlers.get(e.id);if(!t)return;const n=e.getComponent(s.Event);if(n?.off("tap",t),this.tapHandlers.delete(e.id),this.tapOwners.delete(e.id),this.pickEvents.has(e.id)){try{e.removeComponent(s.Event)}catch{}this.pickEvents.delete(e.id)}}postSetSuccess(e){const t={type:r,enabled:e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(r,{enabled:e})}postStateChanged(){const e={paused:this.isPaused,muted:this.isMuted},t={type:u,...e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(u,e)}getSoundSystem(){const e=this.game.getSystem("SoundSystem");return e&&"object"==typeof e&&"muted"in e&&"boolean"==typeof e.muted?e:null}ensureOutline(){if(this.outlineGo)return;const e=new t.GameObject(P,{size:{width:1,height:1},position:{x:0,y:0},origin:{x:0,y:0}});e.addComponent(new o.Graphics),this.outlineGo=e}onSelect(e,t){if(!this.enabled)return;if(t?.stopPropagation?.(),this.ensureOutline(),!this.outlineGo)return;this.selected=e,this.outlineGo.parent&&this.outlineGo.remove(),e.addChild(this.outlineGo),this.invalidateOutlineBounds(),this.updateSelectionOutline();const n=b(e),o={type:d,snapshot:n,pointer:t?.data?.position??null};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(o,this.postMessageOrigin)}findGameObjectById(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);return t.find(t=>t.id===e)??null}findGameObjectBySource(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);const n=e.file.trim(),o=(e.anchor??"").trim();if(!o)return null;for(const e of t){const t=w(e);if(!t||t.file!==n)continue;if((t.anchor??e.name)===o)return e}return null}resolveApplyTarget(e){if("number"==typeof e.gameObjectId){const t=this.findGameObjectById(e.gameObjectId);if(t)return t}const t=e.source?.file?.trim(),n=e.source?.anchor?.trim();return t&&n?this.findGameObjectBySource({file:t,anchor:n}):null}handleApplyProperty(e){const t=e.componentName,n=e.path,o="number"==typeof e.gameObjectId,s=Boolean(e.source?.file?.trim())&&Boolean(e.source?.anchor?.trim());if(!o&&!s||"string"!=typeof t||!Array.isArray(n)||0===n.length)return;const i=this.resolveApplyTarget(e);if(!i)return;G(i,t,n,e.value)&&this.selected?.id===i.id&&(this.invalidateOutlineBounds(),this.updateSelectionOutline(),this.postSnapshotUpdate(i))}postSnapshotUpdate(e){const t=b(e);"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage({type:d,snapshot:t,pointer:null,source:"property-applied"},this.postMessageOrigin)}clearSelection(){this.selected=null,this.invalidateOutlineBounds(),this.outlineGo?.parent&&this.outlineGo.remove();const e=this.outlineGo?.getComponent(o.Graphics);e?.graphics&&e.graphics.clear()}updateSelectionOutline(){if(!this.enabled||!this.selected||!this.outlineGo)return;const e=this.outlineGo.getComponent(o.Graphics);if(!e?.graphics)return;const t=this.resolvePickBounds(this.selected);if(this.lastOutlineBounds&&this.pickBoundsEqual(this.lastOutlineBounds,t))return;this.lastOutlineBounds=t;const n=e.graphics;n.clear(),n.rect(t.x,t.y,t.width,t.height),n.stroke({width:4,color:5636010,alpha:1})}invalidateOutlineBounds(){this.lastOutlineBounds=null}pickBoundsEqual(e,t){const n=.01;return Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.width-t.width)<n&&Math.abs(e.height-t.height)<n}};C=e.__decorate([t.decorators.componentObserver({CombosDevelopmentToolTarget:[]})],C);var M=C;Object.assign(M,{packageName:"@combos-fun/plugin-development-tool",packageVersion:"0.0.22"}),exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY=h,exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED=d,exports.COMBOS_DEVELOPMENT_TOOL_READY="combos-development-tool:ready",exports.COMBOS_DEVELOPMENT_TOOL_REFRESH=a,exports.COMBOS_DEVELOPMENT_TOOL_SET=i,exports.COMBOS_DEVELOPMENT_TOOL_SET_MUTED=l,exports.COMBOS_DEVELOPMENT_TOOL_SET_PAUSED=c,exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS=r,exports.COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED=u,exports.CombosDevelopmentToolSystem=M,exports.CombosDevelopmentToolTarget=p,exports.applyPropertyValue=O,exports.applyPropertyWithHooks=G,exports.buildGameObjectSnapshot=b,exports.readPropertyValue=function(e,t,n){const o=e.getComponent(t);if(!o||!n.length)return;let s=o;for(const e of n){if(null==s||"object"!=typeof s)return;s=s[e]}return s},exports.readSourceAnchor=w;
1
+ "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer"),o=require("@combos-fun/plugin-renderer-graphics"),s=require("@combos-fun/plugin-renderer-event");const i="combos-development-tool:set",r="combos-development-tool:set-success",a="combos-development-tool:refresh",d="combos-development-tool:gameobject-selected",c="combos-development-tool:apply-property",h="combos-development-tool:set-paused",l="combos-development-tool:set-muted",u="combos-development-tool:state-changed";class p extends t.Component{constructor(){super(...arguments),this.payload={}}static{this.componentName="CombosDevelopmentToolTarget"}init(e){this.payload=e?.payload?{...e.payload}:{}}}const m=["knoffice.tech","converge.ai"];function f(e,t){if(t.includes("*"))return!0;if(0===t.length)return!1;let n;try{n=new URL(e)}catch{return!1}const o=e.toLowerCase(),s=n.hostname.toLowerCase();for(const e of t){const t=e.trim();if(!t)continue;if(t.includes("://")){if(o===t.toLowerCase())return!0;continue}const n=t.toLowerCase().replace(/^\./,"");if(s===n||s.endsWith(`.${n}`))return!0}return!1}function g(e){if(!e?.length)return[...m];if(e.includes("*"))return["*"];const t=new Set,n=[];for(const o of[...m,...e]){const e=o.trim();e&&!t.has(e)&&(t.add(e),n.push(e))}return n}const y=new Set(["gameObject","name","started","__componentDefaultParams","destroyed","inScene","worldTransform","children","_parent"]),w={Graphics:new Set(["graphics"]),Physics:new Set(["body","Body","PhysicsEngine","World","Constraint","mouseConstraint","bodyParams"]),Event:new Set(["hitArea"])};function b(e,t=0){if(null==e)return e;if("number"==typeof e||"string"==typeof e||"boolean"==typeof e)return e;if(!(t>6)){if(Array.isArray(e))return e.map(e=>b(e,t+1));if("object"==typeof e){const n={};for(const[o,s]of Object.entries(e)){if("function"==typeof s)continue;const e=b(s,t+1);void 0!==e&&(n[o]=e)}return n}}}function O(e){const t={},n=w[e.name];for(const o of Object.keys(e)){if(y.has(o)||o.startsWith("_"))continue;if(n?.has(o))continue;const s=e[o];if("function"==typeof s)continue;const i=b(s);void 0!==i&&(t[o]=i)}return t}function E(e){const t=e.getComponent(p),n=t?.payload?.source;var o;if((o=n)&&"object"==typeof o&&"string"==typeof o.file)return{file:n.file,anchor:n.anchor??e.name}}function S(e){const t=e.components.filter(e=>"CombosDevelopmentToolTarget"!==e.name).map(e=>({componentName:e.name,fields:O(e)}));return{id:e.id,name:e.name,components:t,source:E(e)}}function v(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;let i=s;for(let e=0;e<n.length-1;e++){const t=n[e];void 0!==i[t]&&null!==i[t]||(i[t]={}),i=i[t]}return i[n[n.length-1]]=o,!0}const G=new Set(["position","size","origin","anchor","scale","skew"]);function C(e){if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&""!==e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}const M={Transform:function(e,t,n,o){const s=e.transform??t,i=s;if(1===n.length&&"rotation"===n[0]){const e=C(o);return void 0!==e&&(s.rotation=e,!0)}if(2===n.length&&G.has(n[0])){const t=n[0],s=n[1],r=C(o);if(void 0===r)return!1;const a=i[t];return!(!a||"object"!=typeof a)&&(a[s]=r,"position"===t&&(function(e){const t=e.getComponent("Physics");if(!t?.body)return;const{x:n,y:o}=e.transform.position;t.Body?.setPosition?t.Body.setPosition(t.body,{x:n,y:o}):(t.body.position.x=n,t.body.position.y=o)}(e),function(e){const t=e.getComponent("PlatformerMover");t&&(t.originX=e.transform.position.x,t.originY=e.transform.position.y)}(e)),!0)}return!1},Text:function(e,t,n,o){const s=t;if(1===n.length&&"text"===n[0])return s.text=String(o??""),!0;if(2===n.length&&"style"===n[0]){const e=n[1],t={...s.style??{},[e]:o};return s.style=t,!0}return!1},Sound:function(e,t,n,o){const s=t;if(1===n.length&&"volume"===n[0]||2===n.length&&"config"===n[0]&&"volume"===n[1]){const e=C(o);return void 0!==e&&(s.volume=e,!0)}return!1}};function P(e,t,n,o){const s=e.getComponent(t);if(!s||!n.length)return!1;const i=M[t];return!!i?.(e,s,n,o)||v(e,t,n,o)}const T="__combosDevelopmentToolOutline";let _=class extends t.System{constructor(){super(...arguments),this.postMessageOrigin="*",this.allowedMessageOrigins=g(),this.enabled=!1,this.outlineGo=null,this.selected=null,this.tapHandlers=new Map,this.tapOwners=new Map,this.disabledGameEventGoIds=new Set,this.pickEvents=new Set,this.needsRescan=!1,this.lastOutlineBounds=null,this.mutedWithoutSoundSystem=!1,this.onWindowSet=e=>{const t=e.detail;t&&"boolean"==typeof t.enabled&&this.setEnabled(t.enabled)},this.onWindowSetPaused=e=>{const t=e.detail;t&&"boolean"==typeof t.paused&&this.setPaused(t.paused)},this.onWindowSetMuted=e=>{const t=e.detail;t&&"boolean"==typeof t.muted&&this.setMuted(t.muted)},this.onWindowMessage=e=>{if(!f(e.origin,this.allowedMessageOrigins))return;const t=e.data;t&&"object"==typeof t&&(t.type===i&&"boolean"==typeof t.enabled?this.setEnabled(t.enabled):t.type===h&&"boolean"==typeof t.paused?this.setPaused(t.paused):t.type===l&&"boolean"==typeof t.muted?this.setMuted(t.muted):t.type===a?this.requestSceneRescan():t.type===c&&this.handleApplyProperty(t))},this.onGameSet=e=>{e&&"boolean"==typeof e.enabled&&this.setEnabled(e.enabled)},this.onGameRefresh=()=>{this.requestSceneRescan()},this.onGameSetPaused=e=>{e&&"boolean"==typeof e.paused&&this.setPaused(e.paused)},this.onGameSetMuted=e=>{e&&"boolean"==typeof e.muted&&this.setMuted(e.muted)},this.onWindowRefresh=()=>{this.requestSceneRescan()}}static{this.systemName="CombosDevelopmentToolSystem"}init(e){this.postMessageOrigin=e?.postMessageOrigin??"*",this.allowedMessageOrigins=g(e?.allowedMessageOrigins),"undefined"!=typeof window&&(window.addEventListener(i,this.onWindowSet),window.addEventListener(h,this.onWindowSetPaused),window.addEventListener(l,this.onWindowSetMuted),window.addEventListener(a,this.onWindowRefresh),window.addEventListener("message",this.onWindowMessage)),this.game.on(i,this.onGameSet),this.game.on(h,this.onGameSetPaused),this.game.on(l,this.onGameSetMuted),this.game.on(a,this.onGameRefresh),this.enabled&&(this.needsRescan=!0)}onDestroy(){"undefined"!=typeof window&&(window.removeEventListener(i,this.onWindowSet),window.removeEventListener(h,this.onWindowSetPaused),window.removeEventListener(l,this.onWindowSetMuted),window.removeEventListener(a,this.onWindowRefresh),window.removeEventListener("message",this.onWindowMessage)),this.game.off(i,this.onGameSet),this.game.off(h,this.onGameSetPaused),this.game.off(l,this.onGameSetMuted),this.game.off(a,this.onGameRefresh),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.clearSelection()}setEnabled(e){this.enabled!==e&&(this.enabled=e,e?this.needsRescan=!0:(this.clearSelection(),this.detachAllPicks(),this.restoreDisabledGameEvents(),this.postSetSuccess(!1)))}get isEnabled(){return this.enabled}get isPaused(){return!this.game.playing}get isMuted(){const e=this.getSoundSystem();return e?e.muted:this.mutedWithoutSoundSystem}setPaused(e){e?this.game.playing&&this.game.pause():this.game.playing||this.game.resume(),this.postStateChanged()}setMuted(e){const t=this.getSoundSystem();t?t.muted=e:this.mutedWithoutSoundSystem=e,this.postStateChanged()}update(e){this.enabled&&this.needsRescan&&(this.needsRescan=!1,this.attachEditMode(),this.postSetSuccess(!0));for(const e of[...this.tapOwners.values()])e.destroyed&&this.releasePick(e);this.enabled&&this.selected&&this.outlineGo&&this.updateSelectionOutline()}componentChanged(e){if(!this.enabled)return;const{type:n,gameObject:o,componentName:s}=e;o&&"CombosDevelopmentToolTarget"===s&&(n===t.OBSERVER_TYPE.ADD?(this.stripGameEvent(o),this.ensurePick(o)):n===t.OBSERVER_TYPE.REMOVE&&(this.releasePick(o),this.selected===o&&this.clearSelection()))}requestSceneRescan(){this.enabled&&(this.needsRescan=!0)}attachEditMode(){this.detachAllPicks();const e=[];for(const t of this.game.scene.transform.children)this.collectGameObjects(t.gameObject,e);for(const t of e)this.isIgnoredPickGo(t)||this.stripGameEvent(t);for(const t of e)this.isIgnoredPickGo(t)||t.getComponent(p)&&this.ensurePick(t)}collectGameObjects(e,t){t.push(e);for(const n of e.transform.children)this.collectGameObjects(n.gameObject,t)}isIgnoredPickGo(e){return e.name===T||e===this.outlineGo}stripGameEvent(e){if(this.disabledGameEventGoIds.has(e.id))return;if(!e.getComponent(s.Event))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!1,this.disabledGameEventGoIds.add(e.id)}catch{}}restoreDisabledGameEvents(){for(const e of[...this.disabledGameEventGoIds]){const t=this.findGameObjectById(e);if(!t||t.destroyed){this.disabledGameEventGoIds.delete(e);continue}const n=this.getRendererContainer(t);if(n)try{n.interactive=!0}catch{}this.disabledGameEventGoIds.delete(e)}}detachAllPicks(){for(const e of[...this.tapOwners.values()])this.releasePick(e)}ensurePick(e){if(this.tapHandlers.has(e.id))return;const t=this.getRendererContainer(e);if(t)try{t.interactive=!0}catch{}let n=e.getComponent(s.Event);n||(n=e.addComponent(this.createPickEvent(e)),this.pickEvents.add(e.id));const o=t=>this.onSelect(e,t);this.tapHandlers.set(e.id,o),this.tapOwners.set(e.id,e),n.on("tap",o)}createPickEvent(e){const t=this.resolvePickBounds(e);return t.width>0&&t.height>0?new s.Event({hitArea:{type:s.HIT_AREA_TYPE.Rect,style:{x:t.x,y:t.y,width:t.width,height:t.height}}}):new s.Event}resolvePickBounds(e){if(this.shouldPreferRenderedBounds(e)){const t=this.resolveOwnGraphicsLocalBounds(e);if(t)return t;const n=this.resolveContainerLocalBounds(e);if(n)return n}const{width:t,height:n}=e.transform.size;if(t>0&&n>0)return{x:0,y:0,width:t,height:n};const o=this.resolveContainerLocalBounds(e);return o||{x:0,y:0,width:1,height:1}}shouldPreferRenderedBounds(e){return null!=e.getComponent(o.Graphics)}resolveOwnGraphicsLocalBounds(e){const t=e.getComponent(o.Graphics);if(!t?.graphics)return null;try{const e=t.graphics.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}return null}resolveContainerLocalBounds(e){const t=this.getRendererContainer(e);if(!t)return null;const n=this.getOutlineContainerIfChildOf(e);let o=!1;n?.parent===t&&(t.removeChild(n),o=!0);try{const e=t.getLocalBounds();if(e.width>0&&e.height>0)return{x:e.x,y:e.y,width:e.width,height:e.height}}catch{}finally{o&&n&&t.addChild(n)}return null}getOutlineContainerIfChildOf(e){return this.outlineGo&&this.outlineGo.parent===e?this.getRendererContainer(this.outlineGo):null}getRendererContainer(e){const t=this.game.getSystem(n.RendererSystem);if(!t?.containerManager)return null;try{return t.containerManager.getContainer(e.id)}catch{return null}}releasePick(e){const t=this.tapHandlers.get(e.id);if(!t)return;const n=e.getComponent(s.Event);if(n?.off("tap",t),this.tapHandlers.delete(e.id),this.tapOwners.delete(e.id),this.pickEvents.has(e.id)){try{e.removeComponent(s.Event)}catch{}this.pickEvents.delete(e.id)}}postSetSuccess(e){const t={type:r,enabled:e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(r,{enabled:e})}postStateChanged(){const e={paused:this.isPaused,muted:this.isMuted},t={type:u,...e};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(t,this.postMessageOrigin),this.game.emit(u,e)}getSoundSystem(){const e=this.game.getSystem("SoundSystem");return e&&"object"==typeof e&&"muted"in e&&"boolean"==typeof e.muted?e:null}ensureOutline(){if(this.outlineGo)return;const e=new t.GameObject(T,{size:{width:1,height:1},position:{x:0,y:0},origin:{x:0,y:0}});e.addComponent(new o.Graphics),this.outlineGo=e}onSelect(e,t){if(!this.enabled)return;if(t?.stopPropagation?.(),this.ensureOutline(),!this.outlineGo)return;this.selected=e,this.outlineGo.parent&&this.outlineGo.remove(),e.addChild(this.outlineGo),this.invalidateOutlineBounds(),this.updateSelectionOutline();const n=S(e),o={type:d,snapshot:n,pointer:t?.data?.position??null};"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage(o,this.postMessageOrigin)}findGameObjectById(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);return t.find(t=>t.id===e)??null}findGameObjectBySource(e){const t=[];for(const e of this.game.scene.transform.children)this.collectGameObjects(e.gameObject,t);const n=e.file.trim(),o=(e.anchor??"").trim();if(!o)return null;for(const e of t){const t=E(e);if(!t||t.file!==n)continue;if((t.anchor??e.name)===o)return e}return null}resolveApplyTarget(e){if("number"==typeof e.gameObjectId){const t=this.findGameObjectById(e.gameObjectId);if(t)return t}const t=e.source?.file?.trim(),n=e.source?.anchor?.trim();return t&&n?this.findGameObjectBySource({file:t,anchor:n}):null}handleApplyProperty(e){const t=e.componentName,n=e.path,o="number"==typeof e.gameObjectId,s=Boolean(e.source?.file?.trim())&&Boolean(e.source?.anchor?.trim());if(!o&&!s||"string"!=typeof t||!Array.isArray(n)||0===n.length)return;const i=this.resolveApplyTarget(e);if(!i)return;P(i,t,n,e.value)&&this.selected?.id===i.id&&(this.invalidateOutlineBounds(),this.updateSelectionOutline(),this.postSnapshotUpdate(i))}postSnapshotUpdate(e){const t=S(e);"undefined"!=typeof window&&window.parent&&window.parent!==window&&window.parent.postMessage({type:d,snapshot:t,pointer:null,source:"property-applied"},this.postMessageOrigin)}clearSelection(){this.selected=null,this.invalidateOutlineBounds(),this.outlineGo?.parent&&this.outlineGo.remove();const e=this.outlineGo?.getComponent(o.Graphics);e?.graphics&&e.graphics.clear()}updateSelectionOutline(){if(!this.enabled||!this.selected||!this.outlineGo)return;const e=this.outlineGo.getComponent(o.Graphics);if(!e?.graphics)return;const t=this.resolvePickBounds(this.selected);if(this.lastOutlineBounds&&this.pickBoundsEqual(this.lastOutlineBounds,t))return;this.lastOutlineBounds=t;const n=e.graphics;n.clear(),n.rect(t.x,t.y,t.width,t.height),n.stroke({width:4,color:5636010,alpha:1})}invalidateOutlineBounds(){this.lastOutlineBounds=null}pickBoundsEqual(e,t){const n=.01;return Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.width-t.width)<n&&Math.abs(e.height-t.height)<n}};_=e.__decorate([t.decorators.componentObserver({CombosDevelopmentToolTarget:[]})],_);var B=_;Object.assign(B,{packageName:"@combos-fun/plugin-development-tool",packageVersion:"0.0.23"}),exports.COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY=c,exports.COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED=d,exports.COMBOS_DEVELOPMENT_TOOL_READY="combos-development-tool:ready",exports.COMBOS_DEVELOPMENT_TOOL_REFRESH=a,exports.COMBOS_DEVELOPMENT_TOOL_SET=i,exports.COMBOS_DEVELOPMENT_TOOL_SET_MUTED=l,exports.COMBOS_DEVELOPMENT_TOOL_SET_PAUSED=h,exports.COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS=r,exports.COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED=u,exports.CombosDevelopmentToolSystem=B,exports.CombosDevelopmentToolTarget=p,exports.DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES=m,exports.applyPropertyValue=v,exports.applyPropertyWithHooks=P,exports.buildGameObjectSnapshot=S,exports.isAllowedMessageOrigin=f,exports.mergeAllowedMessageOrigins=g,exports.readPropertyValue=function(e,t,n){const o=e.getComponent(t);if(!o||!n.length)return;let s=o;for(const e of n){if(null==s||"object"!=typeof s)return;s=s[e]}return s},exports.readSourceAnchor=E;
@@ -19,6 +19,20 @@ declare const COMBOS_DEVELOPMENT_TOOL_SET_MUTED: "combos-development-tool:set-mu
19
19
  /** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */
20
20
  declare const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED: "combos-development-tool:state-changed";
21
21
 
22
+ /** Default inbound postMessage host suffixes (host + all subdomains). */
23
+ declare const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES: readonly ["knoffice.tech", "converge.ai"];
24
+ /**
25
+ * Returns whether `origin` is allowed by `allowed`.
26
+ *
27
+ * Each entry in `allowed` is either:
28
+ * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;
29
+ * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;
30
+ * - `'*'` — accept any origin (escape hatch).
31
+ */
32
+ declare function isAllowedMessageOrigin(origin: string, allowed: readonly string[]): boolean;
33
+ /** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */
34
+ declare function mergeAllowedMessageOrigins(extra?: string[]): string[];
35
+
22
36
  interface CombosDevelopmentToolTargetParams extends ComponentParams {
23
37
  /** Extra JSON-serializable fields included in postMessage to parent. */
24
38
  payload?: Record<string, unknown>;
@@ -37,6 +51,11 @@ declare class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToo
37
51
  interface CombosDevelopmentToolSystemParams {
38
52
  /** postMessage `targetOrigin` when notifying parent (default `'*'`). */
39
53
  postMessageOrigin?: string;
54
+ /**
55
+ * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.
56
+ * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.
57
+ */
58
+ allowedMessageOrigins?: string[];
40
59
  }
41
60
  /**
42
61
  * **Off** at start. While enabled:
@@ -61,6 +80,7 @@ interface CombosDevelopmentToolSystemParams {
61
80
  declare class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {
62
81
  static systemName: string;
63
82
  private postMessageOrigin;
83
+ private allowedMessageOrigins;
64
84
  private enabled;
65
85
  private outlineGo;
66
86
  private selected;
@@ -168,5 +188,5 @@ declare function readPropertyValue(go: GameObject, componentName: string, path:
168
188
 
169
189
  declare function applyPropertyWithHooks(go: GameObject, componentName: string, path: string[], value: unknown): boolean;
170
190
 
171
- export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, readPropertyValue, readSourceAnchor };
191
+ export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, isAllowedMessageOrigin, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor };
172
192
  export type { CombosDevelopmentToolSystemParams, CombosDevelopmentToolTargetParams, SceneEditComponentSnapshot, SceneEditGameObjectSnapshot, SceneEditPropertyRef, SceneSourceAnchor };
@@ -39,6 +39,74 @@ class CombosDevelopmentToolTarget extends Component {
39
39
  }
40
40
  }
41
41
 
42
+ /** Default inbound postMessage host suffixes (host + all subdomains). */
43
+ const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [
44
+ 'knoffice.tech',
45
+ 'converge.ai',
46
+ ];
47
+ /**
48
+ * Returns whether `origin` is allowed by `allowed`.
49
+ *
50
+ * Each entry in `allowed` is either:
51
+ * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;
52
+ * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;
53
+ * - `'*'` — accept any origin (escape hatch).
54
+ */
55
+ function isAllowedMessageOrigin(origin, allowed) {
56
+ if (allowed.includes('*')) {
57
+ return true;
58
+ }
59
+ if (allowed.length === 0) {
60
+ return false;
61
+ }
62
+ let parsed;
63
+ try {
64
+ parsed = new URL(origin);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ const originLower = origin.toLowerCase();
70
+ const hostLower = parsed.hostname.toLowerCase();
71
+ for (const entry of allowed) {
72
+ const trimmed = entry.trim();
73
+ if (!trimmed) {
74
+ continue;
75
+ }
76
+ if (trimmed.includes('://')) {
77
+ if (originLower === trimmed.toLowerCase()) {
78
+ return true;
79
+ }
80
+ continue;
81
+ }
82
+ const suffix = trimmed.toLowerCase().replace(/^\./, '');
83
+ if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
89
+ /** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */
90
+ function mergeAllowedMessageOrigins(extra) {
91
+ if (!extra?.length) {
92
+ return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];
93
+ }
94
+ if (extra.includes('*')) {
95
+ return ['*'];
96
+ }
97
+ const seen = new Set();
98
+ const result = [];
99
+ for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {
100
+ const trimmed = entry.trim();
101
+ if (!trimmed || seen.has(trimmed)) {
102
+ continue;
103
+ }
104
+ seen.add(trimmed);
105
+ result.push(trimmed);
106
+ }
107
+ return result;
108
+ }
109
+
42
110
  function isSceneSourceAnchor(v) {
43
111
  return (!!v &&
44
112
  typeof v === 'object' &&
@@ -302,6 +370,7 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
302
370
  constructor() {
303
371
  super(...arguments);
304
372
  this.postMessageOrigin = '*';
373
+ this.allowedMessageOrigins = mergeAllowedMessageOrigins();
305
374
  this.enabled = false;
306
375
  this.outlineGo = null;
307
376
  this.selected = null;
@@ -334,6 +403,9 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
334
403
  }
335
404
  };
336
405
  this.onWindowMessage = (e) => {
406
+ if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {
407
+ return;
408
+ }
337
409
  const d = e.data;
338
410
  if (!d || typeof d !== 'object')
339
411
  return;
@@ -378,6 +450,7 @@ let CombosDevelopmentToolSystem = class CombosDevelopmentToolSystem extends Syst
378
450
  static { this.systemName = 'CombosDevelopmentToolSystem'; }
379
451
  init(params) {
380
452
  this.postMessageOrigin = params?.postMessageOrigin ?? '*';
453
+ this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);
381
454
  if (typeof window !== 'undefined') {
382
455
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);
383
456
  window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);
@@ -918,8 +991,8 @@ var CombosDevelopmentToolSystem$1 = CombosDevelopmentToolSystem;
918
991
  /** Auto-generated by scripts/build-package.mjs — do not edit. */
919
992
  Object.assign(CombosDevelopmentToolSystem$1, {
920
993
  packageName: "@combos-fun/plugin-development-tool",
921
- packageVersion: "0.0.22",
994
+ packageVersion: "0.0.23",
922
995
  });
923
996
 
924
- export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem$1 as CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, readPropertyValue, readSourceAnchor };
997
+ export { COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY, COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED, COMBOS_DEVELOPMENT_TOOL_READY, COMBOS_DEVELOPMENT_TOOL_REFRESH, COMBOS_DEVELOPMENT_TOOL_SET, COMBOS_DEVELOPMENT_TOOL_SET_MUTED, COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, CombosDevelopmentToolSystem$1 as CombosDevelopmentToolSystem, CombosDevelopmentToolTarget, DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, applyPropertyValue, applyPropertyWithHooks, buildGameObjectSnapshot, isAllowedMessageOrigin, mergeAllowedMessageOrigins, readPropertyValue, readSourceAnchor };
925
998
  //# sourceMappingURL=plugin-development-tool.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-development-tool.esm.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.22\",\n});\n"],"names":["CombosDevelopmentToolSystem"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-development-tool.esm.js","sources":["../lib/constants.ts","../lib/CombosDevelopmentToolTarget.ts","../lib/messageOrigin.ts","../lib/sceneEditTypes.ts","../lib/sceneEditSerialize.ts","../lib/sceneEditApplyHooks.ts","../lib/CombosDevelopmentToolSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["/** Toggle development-tool selection / parent postMessage. Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET = 'combos-development-tool:set' as const;\n\n/** iframe → parent: `setEnabled` finished (pick attach after enable, or restore after disable). Payload: `{ enabled: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS =\n 'combos-development-tool:set-success' as const;\n\n/** Re-scan the scene tree while the development tool is enabled. */\nexport const COMBOS_DEVELOPMENT_TOOL_REFRESH = 'combos-development-tool:refresh' as const;\n\n/** Emitted to `window.parent` when an object is selected while the tool is on. */\nexport const COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED =\n 'combos-development-tool:gameobject-selected' as const;\n\n/** Parent → iframe: apply a value to a component field (live preview). */\nexport const COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY =\n 'combos-development-tool:apply-property' as const;\n\n/** iframe → parent: game scene bootstrap finished; parent may enable pick mode. */\nexport const COMBOS_DEVELOPMENT_TOOL_READY = 'combos-development-tool:ready' as const;\n\n/** Parent → iframe: pause or resume the game loop. Payload: `{ paused: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_PAUSED =\n 'combos-development-tool:set-paused' as const;\n\n/** Parent → iframe: mute or unmute audio when `SoundSystem` is registered. Payload: `{ muted: boolean }`. */\nexport const COMBOS_DEVELOPMENT_TOOL_SET_MUTED =\n 'combos-development-tool:set-muted' as const;\n\n/** iframe → parent (and `game.emit`): current pause/mute snapshot after a successful change. */\nexport const COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED =\n 'combos-development-tool:state-changed' as const;\n","import { Component, ComponentParams } from '@combos-fun/engine';\n\nexport interface CombosDevelopmentToolTargetParams extends ComponentParams {\n /** Extra JSON-serializable fields included in postMessage to parent. */\n payload?: Record<string, unknown>;\n}\n\n/**\n * Marks a `GameObject` as selectable in editor pick mode. While the development tool is enabled,\n * only nodes carrying this component receive a pick `Event`; all other game `Event` components\n * are removed and cached until disable.\n */\nexport default class CombosDevelopmentToolTarget extends Component<CombosDevelopmentToolTargetParams> {\n static componentName = 'CombosDevelopmentToolTarget';\n\n payload: Record<string, unknown> = {};\n\n init(params?: CombosDevelopmentToolTargetParams) {\n this.payload = params?.payload ? { ...params.payload } : {};\n }\n}\n","/** Default inbound postMessage host suffixes (host + all subdomains). */\nexport const DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES = [\n 'knoffice.tech',\n 'converge.ai',\n] as const;\n\n/**\n * Returns whether `origin` is allowed by `allowed`.\n *\n * Each entry in `allowed` is either:\n * - a **host suffix** (e.g. `knoffice.tech`) — matches that host and `*.knoffice.tech`;\n * - a **full origin** (e.g. `https://creator.knoffice.tech`) — exact match;\n * - `'*'` — accept any origin (escape hatch).\n */\nexport function isAllowedMessageOrigin(\n origin: string,\n allowed: readonly string[],\n): boolean {\n if (allowed.includes('*')) {\n return true;\n }\n if (allowed.length === 0) {\n return false;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n return false;\n }\n\n const originLower = origin.toLowerCase();\n const hostLower = parsed.hostname.toLowerCase();\n\n for (const entry of allowed) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n if (trimmed.includes('://')) {\n if (originLower === trimmed.toLowerCase()) {\n return true;\n }\n continue;\n }\n\n const suffix = trimmed.toLowerCase().replace(/^\\./, '');\n if (hostLower === suffix || hostLower.endsWith(`.${suffix}`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Defaults plus any extra entries (deduped). `['*']` alone accepts any origin. */\nexport function mergeAllowedMessageOrigins(extra?: string[]): string[] {\n if (!extra?.length) {\n return [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES];\n }\n if (extra.includes('*')) {\n return ['*'];\n }\n\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of [...DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES, ...extra]) {\n const trimmed = entry.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n","/** Optional bootstrap anchor stored on {@link CombosDevelopmentToolTarget}.payload.source */\nexport interface SceneSourceAnchor {\n /** Project-relative path, e.g. `src/index.ts` */\n file: string;\n /** Variable name in bootstrap (`const poster = …`) or stable key; defaults to gameObject name */\n anchor?: string;\n}\n\nexport interface SceneEditPropertyRef {\n gameObjectId: number;\n gameObjectName: string;\n componentName: string;\n path: string[];\n}\n\nexport interface SceneEditComponentSnapshot {\n componentName: string;\n fields: Record<string, unknown>;\n}\n\nexport interface SceneEditGameObjectSnapshot {\n id: number;\n name: string;\n components: SceneEditComponentSnapshot[];\n source?: SceneSourceAnchor;\n}\n\nexport function isSceneSourceAnchor(v: unknown): v is SceneSourceAnchor {\n return (\n !!v &&\n typeof v === 'object' &&\n typeof (v as SceneSourceAnchor).file === 'string'\n );\n}\n","import { Component, GameObject } from '@combos-fun/engine';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isSceneSourceAnchor,\n type SceneEditComponentSnapshot,\n type SceneEditGameObjectSnapshot,\n type SceneSourceAnchor,\n} from './sceneEditTypes';\n\nconst SKIP_KEYS = new Set([\n 'gameObject',\n 'name',\n 'started',\n '__componentDefaultParams',\n 'destroyed',\n 'inScene',\n 'worldTransform',\n 'children',\n '_parent',\n]);\n\nconst COMPONENT_SKIP_KEYS: Record<string, ReadonlySet<string>> = {\n Graphics: new Set(['graphics']),\n Physics: new Set([\n 'body',\n 'Body',\n 'PhysicsEngine',\n 'World',\n 'Constraint',\n 'mouseConstraint',\n 'bodyParams',\n ]),\n Event: new Set(['hitArea']),\n};\n\nfunction cloneJsonSafe(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (depth > 6) return undefined;\n if (Array.isArray(value)) {\n return value.map(item => cloneJsonSafe(item, depth + 1));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === 'function') continue;\n const cloned = cloneJsonSafe(v, depth + 1);\n if (cloned !== undefined) out[k] = cloned;\n }\n return out;\n }\n return undefined;\n}\n\nfunction serializeComponent(comp: Component): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const componentSkips = COMPONENT_SKIP_KEYS[comp.name];\n for (const key of Object.keys(comp)) {\n if (SKIP_KEYS.has(key) || key.startsWith('_')) continue;\n if (componentSkips?.has(key)) continue;\n const value = (comp as Record<string, unknown>)[key];\n if (typeof value === 'function') continue;\n const cloned = cloneJsonSafe(value);\n if (cloned !== undefined) out[key] = cloned;\n }\n return out;\n}\n\nexport function readSourceAnchor(go: GameObject): SceneSourceAnchor | undefined {\n const tag = go.getComponent(CombosDevelopmentToolTarget);\n const raw = tag?.payload?.source;\n if (!isSceneSourceAnchor(raw)) return undefined;\n return {\n file: raw.file,\n anchor: raw.anchor ?? go.name,\n };\n}\n\nexport function buildGameObjectSnapshot(go: GameObject): SceneEditGameObjectSnapshot {\n const components: SceneEditComponentSnapshot[] = go.components\n .filter(c => c.name !== 'CombosDevelopmentToolTarget')\n .map(c => ({\n componentName: c.name,\n fields: serializeComponent(c),\n }));\n\n return {\n id: go.id,\n name: go.name,\n components,\n source: readSourceAnchor(go),\n };\n}\n\nexport function applyPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return false;\n\n let target: Record<string, unknown> = comp as unknown as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (target[key] === undefined || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n\n target[path[path.length - 1]] = value;\n return true;\n}\n\nexport function readPropertyValue(\n go: GameObject,\n componentName: string,\n path: string[],\n): unknown {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) return undefined;\n\n let target: unknown = comp;\n for (const key of path) {\n if (target === null || target === undefined || typeof target !== 'object') {\n return undefined;\n }\n target = (target as Record<string, unknown>)[key];\n }\n return target;\n}\n","import type { Component, GameObject } from '@combos-fun/engine';\nimport { applyPropertyValue } from './sceneEditSerialize';\n\ntype SceneEditApplyHook = (\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n) => boolean;\n\nconst TRANSFORM_VECTOR_KEYS = new Set([\n 'position',\n 'size',\n 'origin',\n 'anchor',\n 'scale',\n 'skew',\n]);\n\ntype PhysicsLike = {\n body?: { position: { x: number; y: number }; angle?: number };\n bodyParams?: { stopRotation?: boolean };\n Body?: { setPosition: (body: unknown, pos: { x: number; y: number }) => void; setAngle?: (body: unknown, angle: number) => void };\n};\n\ntype MoverLike = {\n originX: number;\n originY: number;\n};\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const next = Number(value);\n return Number.isFinite(next) ? next : undefined;\n }\n return undefined;\n}\n\nfunction syncPhysicsBodyFromTransform(go: GameObject): void {\n const physics = go.getComponent('Physics') as PhysicsLike | undefined;\n if (!physics?.body) {\n return;\n }\n\n const { x, y } = go.transform.position;\n if (physics.Body?.setPosition) {\n physics.Body.setPosition(physics.body, { x, y });\n return;\n }\n\n physics.body.position.x = x;\n physics.body.position.y = y;\n}\n\nfunction syncMoverOriginFromTransform(go: GameObject): void {\n const mover = go.getComponent('PlatformerMover') as MoverLike | undefined;\n if (!mover) {\n return;\n }\n mover.originX = go.transform.position.x;\n mover.originY = go.transform.position.y;\n}\n\nfunction applyTransformProperty(\n go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const transform = go.transform ?? comp;\n const transformRecord = transform as unknown as Record<string, unknown>;\n\n if (path.length === 1 && path[0] === 'rotation') {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n transform.rotation = next;\n return true;\n }\n\n if (path.length === 2 && TRANSFORM_VECTOR_KEYS.has(path[0])) {\n const groupKey = path[0];\n const leafKey = path[1];\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n\n const group = transformRecord[groupKey];\n if (!group || typeof group !== 'object') {\n return false;\n }\n\n (group as Record<string, unknown>)[leafKey] = next;\n\n if (groupKey === 'position') {\n syncPhysicsBodyFromTransform(go);\n syncMoverOriginFromTransform(go);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction applyTextProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const textComp = comp as Component & { text?: string; style?: Record<string, unknown> };\n\n if (path.length === 1 && path[0] === 'text') {\n textComp.text = String(value ?? '');\n return true;\n }\n\n if (path.length === 2 && path[0] === 'style') {\n const styleKey = path[1];\n const nextStyle = { ...(textComp.style ?? {}), [styleKey]: value };\n textComp.style = nextStyle;\n return true;\n }\n\n return false;\n}\n\nfunction applySoundProperty(\n _go: GameObject,\n comp: Component,\n path: string[],\n value: unknown,\n): boolean {\n const soundComp = comp as Component & { volume?: number };\n\n if (\n (path.length === 1 && path[0] === 'volume') ||\n (path.length === 2 && path[0] === 'config' && path[1] === 'volume')\n ) {\n const next = asNumber(value);\n if (next === undefined) {\n return false;\n }\n soundComp.volume = next;\n return true;\n }\n\n return false;\n}\n\nconst APPLY_HOOKS: Record<string, SceneEditApplyHook> = {\n Transform: applyTransformProperty,\n Text: applyTextProperty,\n Sound: applySoundProperty,\n};\n\nexport function applyPropertyWithHooks(\n go: GameObject,\n componentName: string,\n path: string[],\n value: unknown,\n): boolean {\n const comp = go.getComponent(componentName);\n if (!comp || !path.length) {\n return false;\n }\n\n const hook = APPLY_HOOKS[componentName];\n if (hook?.(go, comp, path, value)) {\n return true;\n }\n\n return applyPropertyValue(go, componentName, path, value);\n}\n","import {\n ComponentChanged,\n GameObject,\n OBSERVER_TYPE,\n System,\n UpdateParams,\n decorators,\n} from '@combos-fun/engine';\nimport { RendererSystem } from '@combos-fun/plugin-renderer';\nimport { Graphics } from '@combos-fun/plugin-renderer-graphics';\nimport { Event, HIT_AREA_TYPE } from '@combos-fun/plugin-renderer-event';\nimport {\n COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY,\n COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n COMBOS_DEVELOPMENT_TOOL_REFRESH,\n COMBOS_DEVELOPMENT_TOOL_SET,\n COMBOS_DEVELOPMENT_TOOL_SET_MUTED,\n COMBOS_DEVELOPMENT_TOOL_SET_PAUSED,\n COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n} from './constants';\nimport CombosDevelopmentToolTarget from './CombosDevelopmentToolTarget';\nimport {\n isAllowedMessageOrigin,\n mergeAllowedMessageOrigins,\n} from './messageOrigin';\nimport { applyPropertyWithHooks } from './sceneEditApplyHooks';\nimport { buildGameObjectSnapshot, readSourceAnchor } from './sceneEditSerialize';\n\nimport type { SceneSourceAnchor } from './sceneEditTypes';\n\ntype TapEventPayload = {\n stopPropagation?: () => void;\n data?: {\n position?: { x: number; y: number };\n };\n};\n\ntype TapListener = (payload?: TapEventPayload) => void;\n\ntype ApplyPropertyPayload = {\n gameObjectId?: number;\n source?: SceneSourceAnchor;\n componentName?: string;\n path?: string[];\n value?: unknown;\n};\n\nexport interface CombosDevelopmentToolSystemParams {\n /** postMessage `targetOrigin` when notifying parent (default `'*'`). */\n postMessageOrigin?: string;\n /**\n * Extra inbound `postMessage` origins merged with {@link DEFAULT_ALLOWED_MESSAGE_HOST_SUFFIXES}.\n * Each entry is a host suffix (e.g. `localhost`) or full origin. Pass `['*']` to accept any origin.\n */\n allowedMessageOrigins?: string[];\n}\n\nconst OUTLINE_GO_NAME = '__combosDevelopmentToolOutline';\n\ntype SetPayload = { enabled?: boolean };\ntype SetPausedPayload = { paused?: boolean };\ntype SetMutedPayload = { muted?: boolean };\n\ntype SoundSystemLike = {\n muted: boolean;\n};\n\ntype PickBounds = { x: number; y: number; width: number; height: number };\n\n/**\n * **Off** at start. While enabled:\n * - soft-disables game `Event` hit targets (`container.interactive = false`, restored on disable);\n * - attaches pick `Event` + outline only on nodes with {@link CombosDevelopmentToolTarget}.\n *\n * Turn on/off via:\n * - `window.dispatchEvent(new CustomEvent(COMBOS_DEVELOPMENT_TOOL_SET, { detail: { enabled: true } }))`\n * - `window.postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET, enabled: true }, targetOrigin)` (e.g. from parent iframe)\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET, { enabled: true })` or `getSystem(CombosDevelopmentToolSystem).setEnabled(true)`\n *\n * Pause / mute (independent of pick mode; parent toolbar or in-game debug UI):\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, paused: true })`\n * - `postMessage({ type: COMBOS_DEVELOPMENT_TOOL_SET_MUTED, muted: true })`\n * - `game.emit(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, { paused: true })` or `.setPaused(true)`\n * Mute applies when `SoundSystem` is registered; otherwise the desired value is remembered until it appears.\n * Both emit / post `COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED` with `{ paused, muted }`.\n *\n * While enabled: `game.emit(COMBOS_DEVELOPMENT_TOOL_REFRESH)`, `window` event `combos-development-tool:refresh`,\n * or `postMessage({ type: 'combos-development-tool:refresh' })` to re-bind after adding/removing objects.\n */\n@decorators.componentObserver({\n CombosDevelopmentToolTarget: [],\n})\nexport default class CombosDevelopmentToolSystem extends System<CombosDevelopmentToolSystemParams> {\n static systemName = 'CombosDevelopmentToolSystem';\n\n private postMessageOrigin = '*';\n private allowedMessageOrigins = mergeAllowedMessageOrigins();\n private enabled = false;\n private outlineGo: GameObject | null = null;\n private selected: GameObject | null = null;\n private readonly tapHandlers = new Map<number, TapListener>();\n private readonly tapOwners = new Map<number, GameObject>();\n /** Game `Event` hit targets soft-disabled while enabled (`container.interactive = false`). */\n private readonly disabledGameEventGoIds = new Set<number>();\n /** Pick `Event` injected for {@link CombosDevelopmentToolTarget} nodes. */\n private readonly pickEvents = new Set<number>();\n private needsRescan = false;\n private lastOutlineBounds: PickBounds | null = null;\n /** Remembered mute when `SoundSystem` is not registered yet. */\n private mutedWithoutSoundSystem = false;\n\n private readonly onWindowSet = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPayload>).detail;\n if (d && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n }\n };\n\n private readonly onWindowSetPaused = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetPausedPayload>).detail;\n if (d && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n }\n };\n\n private readonly onWindowSetMuted = (e: globalThis.Event) => {\n const d = (e as unknown as CustomEvent<SetMutedPayload>).detail;\n if (d && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n }\n };\n\n private readonly onWindowMessage = (e: MessageEvent) => {\n if (!isAllowedMessageOrigin(e.origin, this.allowedMessageOrigins)) {\n return;\n }\n\n const d = e.data;\n if (!d || typeof d !== 'object') return;\n if (d.type === COMBOS_DEVELOPMENT_TOOL_SET && typeof d.enabled === 'boolean') {\n this.setEnabled(d.enabled);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_PAUSED && typeof d.paused === 'boolean') {\n this.setPaused(d.paused);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_SET_MUTED && typeof d.muted === 'boolean') {\n this.setMuted(d.muted);\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_REFRESH) {\n this.requestSceneRescan();\n } else if (d.type === COMBOS_DEVELOPMENT_TOOL_APPLY_PROPERTY) {\n this.handleApplyProperty(d as ApplyPropertyPayload);\n }\n };\n\n private readonly onGameSet = (payload: SetPayload) => {\n if (payload && typeof payload.enabled === 'boolean') {\n this.setEnabled(payload.enabled);\n }\n };\n\n private readonly onGameRefresh = () => {\n this.requestSceneRescan();\n };\n\n private readonly onGameSetPaused = (payload: SetPausedPayload) => {\n if (payload && typeof payload.paused === 'boolean') {\n this.setPaused(payload.paused);\n }\n };\n\n private readonly onGameSetMuted = (payload: SetMutedPayload) => {\n if (payload && typeof payload.muted === 'boolean') {\n this.setMuted(payload.muted);\n }\n };\n\n private readonly onWindowRefresh = () => {\n this.requestSceneRescan();\n };\n\n init(params?: CombosDevelopmentToolSystemParams) {\n this.postMessageOrigin = params?.postMessageOrigin ?? '*';\n this.allowedMessageOrigins = mergeAllowedMessageOrigins(params?.allowedMessageOrigins);\n\n if (typeof window !== 'undefined') {\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.addEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.addEventListener('message', this.onWindowMessage);\n }\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.on(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n\n if (this.enabled) {\n this.needsRescan = true;\n }\n }\n\n onDestroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET, this.onWindowSet);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onWindowSetPaused);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onWindowSetMuted);\n window.removeEventListener(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onWindowRefresh);\n window.removeEventListener('message', this.onWindowMessage);\n }\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET, this.onGameSet);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_PAUSED, this.onGameSetPaused);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_SET_MUTED, this.onGameSetMuted);\n this.game.off(COMBOS_DEVELOPMENT_TOOL_REFRESH, this.onGameRefresh);\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.clearSelection();\n }\n\n /** Programmatic toggle (same effect as events). */\n setEnabled(on: boolean) {\n if (this.enabled === on) return;\n this.enabled = on;\n if (!on) {\n this.clearSelection();\n this.detachAllPicks();\n this.restoreDisabledGameEvents();\n this.postSetSuccess(false);\n } else {\n this.needsRescan = true;\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Whether the game loop is paused (`!game.playing`). */\n get isPaused(): boolean {\n return !this.game.playing;\n }\n\n /** Master mute when `SoundSystem` exists; otherwise the last requested value. */\n get isMuted(): boolean {\n const sound = this.getSoundSystem();\n if (sound) {\n return sound.muted;\n }\n return this.mutedWithoutSoundSystem;\n }\n\n /** Pause or resume the game loop (same as `game.pause()` / `game.resume()`). */\n setPaused(paused: boolean) {\n if (paused) {\n if (this.game.playing) {\n this.game.pause();\n }\n } else if (!this.game.playing) {\n this.game.resume();\n }\n this.postStateChanged();\n }\n\n /**\n * Mute or unmute audio via `SoundSystem` when registered.\n * No-op on the audio graph if `SoundSystem` is missing; value is remembered for `isMuted`.\n */\n setMuted(muted: boolean) {\n const sound = this.getSoundSystem();\n if (sound) {\n sound.muted = muted;\n } else {\n this.mutedWithoutSoundSystem = muted;\n }\n this.postStateChanged();\n }\n\n update(e: UpdateParams) {\n if (this.enabled && this.needsRescan) {\n this.needsRescan = false;\n this.attachEditMode();\n this.postSetSuccess(true);\n }\n\n for (const go of [...this.tapOwners.values()]) {\n if (go.destroyed) {\n this.releasePick(go);\n }\n }\n\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n this.updateSelectionOutline();\n }\n\n componentChanged(changed: ComponentChanged) {\n if (!this.enabled) return;\n\n const { type, gameObject, componentName } = changed;\n if (!gameObject || componentName !== 'CombosDevelopmentToolTarget') return;\n\n if (type === OBSERVER_TYPE.ADD) {\n this.stripGameEvent(gameObject);\n this.ensurePick(gameObject);\n } else if (type === OBSERVER_TYPE.REMOVE) {\n this.releasePick(gameObject);\n if (this.selected === gameObject) {\n this.clearSelection();\n }\n }\n }\n\n /** Re-bind pick targets after dynamic scene changes while enabled. */\n requestSceneRescan() {\n if (!this.enabled) return;\n this.needsRescan = true;\n }\n\n private attachEditMode() {\n this.detachAllPicks();\n\n const list: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, list);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n this.stripGameEvent(go);\n }\n\n for (const go of list) {\n if (this.isIgnoredPickGo(go)) continue;\n if (!go.getComponent(CombosDevelopmentToolTarget)) continue;\n this.ensurePick(go);\n }\n }\n\n private collectGameObjects(go: GameObject, out: GameObject[]) {\n out.push(go);\n for (const tr of go.transform.children) {\n this.collectGameObjects(tr.gameObject, out);\n }\n }\n\n private isIgnoredPickGo(go: GameObject): boolean {\n return go.name === OUTLINE_GO_NAME || go === this.outlineGo;\n }\n\n private stripGameEvent(go: GameObject) {\n if (this.disabledGameEventGoIds.has(go.id)) return;\n\n const ev = go.getComponent(Event);\n if (!ev) return;\n\n const container = this.getRendererContainer(go);\n if (!container) return;\n\n try {\n container.interactive = false;\n this.disabledGameEventGoIds.add(go.id);\n } catch {\n /* ignore */\n }\n }\n\n private restoreDisabledGameEvents() {\n for (const id of [...this.disabledGameEventGoIds]) {\n const go = this.findGameObjectById(id);\n if (!go || go.destroyed) {\n this.disabledGameEventGoIds.delete(id);\n continue;\n }\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n this.disabledGameEventGoIds.delete(id);\n }\n }\n\n private detachAllPicks() {\n for (const go of [...this.tapOwners.values()]) {\n this.releasePick(go);\n }\n }\n\n private ensurePick(go: GameObject) {\n if (this.tapHandlers.has(go.id)) return;\n\n const container = this.getRendererContainer(go);\n if (container) {\n try {\n container.interactive = true;\n } catch {\n /* ignore */\n }\n }\n\n let ev = go.getComponent(Event);\n if (!ev) {\n ev = go.addComponent(this.createPickEvent(go));\n this.pickEvents.add(go.id);\n }\n\n const handler: TapListener = payload => this.onSelect(go, payload);\n this.tapHandlers.set(go.id, handler);\n this.tapOwners.set(go.id, go);\n ev.on('tap', handler);\n }\n\n private createPickEvent(go: GameObject): Event {\n const bounds = this.resolvePickBounds(go);\n if (bounds.width > 0 && bounds.height > 0) {\n return new Event({\n hitArea: {\n type: HIT_AREA_TYPE.Rect,\n style: {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n },\n },\n });\n }\n\n return new Event();\n }\n\n private resolvePickBounds(go: GameObject): PickBounds {\n if (this.shouldPreferRenderedBounds(go)) {\n const fromOwnGraphics = this.resolveOwnGraphicsLocalBounds(go);\n if (fromOwnGraphics) {\n return fromOwnGraphics;\n }\n\n const fromGraphics = this.resolveContainerLocalBounds(go);\n if (fromGraphics) {\n return fromGraphics;\n }\n }\n\n const { width, height } = go.transform.size;\n if (width > 0 && height > 0) {\n return { x: 0, y: 0, width, height };\n }\n\n const fromContainer = this.resolveContainerLocalBounds(go);\n if (fromContainer) {\n return fromContainer;\n }\n\n return { x: 0, y: 0, width: 1, height: 1 };\n }\n\n private shouldPreferRenderedBounds(go: GameObject): boolean {\n return go.getComponent(Graphics) != null;\n }\n\n /** Bounds of this GO's own Graphics only — excludes child GOs such as the selection outline. */\n private resolveOwnGraphicsLocalBounds(go: GameObject): PickBounds | null {\n const gfx = go.getComponent(Graphics);\n if (!gfx?.graphics) return null;\n\n try {\n const bounds = gfx.graphics.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n }\n\n return null;\n }\n\n private resolveContainerLocalBounds(go: GameObject): PickBounds | null {\n const container = this.getRendererContainer(go);\n if (!container) return null;\n\n const outlineContainer = this.getOutlineContainerIfChildOf(go);\n let outlineDetached = false;\n if (outlineContainer?.parent === container) {\n container.removeChild(outlineContainer);\n outlineDetached = true;\n }\n\n try {\n const bounds = container.getLocalBounds();\n if (bounds.width > 0 && bounds.height > 0) {\n return {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n }\n } catch {\n /* ignore */\n } finally {\n if (outlineDetached && outlineContainer) {\n container.addChild(outlineContainer);\n }\n }\n\n return null;\n }\n\n /** Outline is parented under the selected GO; exclude it when measuring content bounds. */\n private getOutlineContainerIfChildOf(go: GameObject) {\n if (!this.outlineGo || this.outlineGo.parent !== go) {\n return null;\n }\n return this.getRendererContainer(this.outlineGo);\n }\n\n private getRendererContainer(go: GameObject) {\n const rendererSystem = this.game.getSystem(RendererSystem) as RendererSystem | undefined;\n if (!rendererSystem?.containerManager) return null;\n\n try {\n return rendererSystem.containerManager.getContainer(go.id);\n } catch {\n return null;\n }\n }\n\n private releasePick(go: GameObject) {\n const handler = this.tapHandlers.get(go.id);\n if (!handler) return;\n\n const ev = go.getComponent(Event);\n ev?.off('tap', handler);\n this.tapHandlers.delete(go.id);\n this.tapOwners.delete(go.id);\n\n if (this.pickEvents.has(go.id)) {\n try {\n go.removeComponent(Event);\n } catch {\n /* ignore */\n }\n this.pickEvents.delete(go.id);\n }\n }\n\n private postSetSuccess(enabled: boolean) {\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS,\n enabled,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_SET_SUCCESS, { enabled });\n }\n\n private postStateChanged() {\n const state = {\n paused: this.isPaused,\n muted: this.isMuted,\n };\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED,\n ...state,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n this.game.emit(COMBOS_DEVELOPMENT_TOOL_STATE_CHANGED, state);\n }\n\n private getSoundSystem(): SoundSystemLike | null {\n const system = this.game.getSystem('SoundSystem') as unknown;\n if (\n !system ||\n typeof system !== 'object' ||\n !('muted' in system) ||\n typeof (system as SoundSystemLike).muted !== 'boolean'\n ) {\n return null;\n }\n return system as SoundSystemLike;\n }\n\n private ensureOutline() {\n if (this.outlineGo) return;\n const go = new GameObject(OUTLINE_GO_NAME, {\n size: { width: 1, height: 1 },\n position: { x: 0, y: 0 },\n origin: { x: 0, y: 0 },\n });\n go.addComponent(new Graphics());\n this.outlineGo = go;\n }\n\n private onSelect(go: GameObject, tap?: TapEventPayload) {\n if (!this.enabled) return;\n tap?.stopPropagation?.();\n\n this.ensureOutline();\n if (!this.outlineGo) return;\n\n this.selected = go;\n\n if (this.outlineGo.parent) {\n this.outlineGo.remove();\n }\n go.addChild(this.outlineGo);\n\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n\n const snapshot = buildGameObjectSnapshot(go);\n const payload = {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: tap?.data?.position ?? null,\n };\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(payload, this.postMessageOrigin);\n }\n }\n\n private findGameObjectById(id: number): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n return stack.find(go => go.id === id) ?? null;\n }\n\n private findGameObjectBySource(source: SceneSourceAnchor): GameObject | null {\n const stack: GameObject[] = [];\n for (const tr of this.game.scene.transform.children) {\n this.collectGameObjects(tr.gameObject, stack);\n }\n\n const wantFile = source.file.trim();\n const wantAnchor = (source.anchor ?? '').trim();\n if (!wantAnchor) {\n return null;\n }\n\n for (const go of stack) {\n const anchor = readSourceAnchor(go);\n if (!anchor || anchor.file !== wantFile) {\n continue;\n }\n const resolvedAnchor = anchor.anchor ?? go.name;\n if (resolvedAnchor === wantAnchor) {\n return go;\n }\n }\n\n return null;\n }\n\n private resolveApplyTarget(payload: ApplyPropertyPayload): GameObject | null {\n if (typeof payload.gameObjectId === 'number') {\n const byId = this.findGameObjectById(payload.gameObjectId);\n if (byId) {\n return byId;\n }\n }\n\n const file = payload.source?.file?.trim();\n const anchor = payload.source?.anchor?.trim();\n if (!file || !anchor) {\n return null;\n }\n\n return this.findGameObjectBySource({ file, anchor });\n }\n\n private handleApplyProperty(payload: ApplyPropertyPayload) {\n const componentName = payload.componentName;\n const path = payload.path;\n const hasId = typeof payload.gameObjectId === 'number';\n const hasSource =\n Boolean(payload.source?.file?.trim()) && Boolean(payload.source?.anchor?.trim());\n\n if (\n (!hasId && !hasSource) ||\n typeof componentName !== 'string' ||\n !Array.isArray(path) ||\n path.length === 0\n ) {\n return;\n }\n\n const go = this.resolveApplyTarget(payload);\n if (!go) return;\n\n const applied = applyPropertyWithHooks(go, componentName, path, payload.value);\n if (!applied) return;\n\n if (this.selected?.id === go.id) {\n this.invalidateOutlineBounds();\n this.updateSelectionOutline();\n this.postSnapshotUpdate(go);\n }\n }\n\n private postSnapshotUpdate(go: GameObject) {\n const snapshot = buildGameObjectSnapshot(go);\n if (typeof window !== 'undefined' && window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: COMBOS_DEVELOPMENT_TOOL_GAMEOBJECT_SELECTED,\n snapshot,\n pointer: null,\n source: 'property-applied',\n },\n this.postMessageOrigin,\n );\n }\n }\n\n private clearSelection() {\n this.selected = null;\n this.invalidateOutlineBounds();\n if (this.outlineGo?.parent) {\n this.outlineGo.remove();\n }\n const gfx = this.outlineGo?.getComponent(Graphics);\n if (gfx?.graphics) {\n gfx.graphics.clear();\n }\n }\n\n /** Redraw the green outline only when content bounds change (movement follows via child transform). */\n private updateSelectionOutline() {\n if (!this.enabled || !this.selected || !this.outlineGo) return;\n\n const gfxComp = this.outlineGo.getComponent(Graphics);\n if (!gfxComp?.graphics) return;\n\n const bounds = this.resolvePickBounds(this.selected);\n if (this.lastOutlineBounds && this.pickBoundsEqual(this.lastOutlineBounds, bounds)) {\n return;\n }\n\n this.lastOutlineBounds = bounds;\n const g = gfxComp.graphics;\n g.clear();\n g.rect(bounds.x, bounds.y, bounds.width, bounds.height);\n g.stroke({ width: 4, color: 0x55ffaa, alpha: 1 });\n }\n\n private invalidateOutlineBounds() {\n this.lastOutlineBounds = null;\n }\n\n private pickBoundsEqual(a: PickBounds, b: PickBounds): boolean {\n const eps = 0.01;\n return (\n Math.abs(a.x - b.x) < eps &&\n Math.abs(a.y - b.y) < eps &&\n Math.abs(a.width - b.width) < eps &&\n Math.abs(a.height - b.height) < eps\n );\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport CombosDevelopmentToolSystem from './CombosDevelopmentToolSystem';\n\nObject.assign(CombosDevelopmentToolSystem, {\n packageName: \"@combos-fun/plugin-development-tool\",\n packageVersion: \"0.0.23\",\n});\n"],"names":["CombosDevelopmentToolSystem"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combos-fun/plugin-development-tool",
3
- "version": "0.0.23",
3
+ "version": "0.0.24",
4
4
  "description": "only useful for combos.fun preview page, no need to understand and modify",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-development-tool.esm.js",
@@ -36,10 +36,10 @@
36
36
  ],
37
37
  "author": "sun668 <q947692259@gmail.com>",
38
38
  "dependencies": {
39
- "@combos-fun/plugin-renderer": "0.0.23",
40
- "@combos-fun/engine": "0.0.23",
41
- "@combos-fun/plugin-renderer-graphics": "0.0.23",
42
- "@combos-fun/plugin-renderer-event": "0.0.23"
39
+ "@combos-fun/engine": "0.0.24",
40
+ "@combos-fun/plugin-renderer-event": "0.0.24",
41
+ "@combos-fun/plugin-renderer": "0.0.24",
42
+ "@combos-fun/plugin-renderer-graphics": "0.0.24"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "node ../../scripts/build-package.mjs"