@vulfram/engine 0.14.8-alpha → 0.17.1-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +106 -0
  2. package/package.json +55 -4
  3. package/src/core.ts +14 -0
  4. package/src/ecs.ts +1 -0
  5. package/src/engine/api.ts +234 -23
  6. package/src/engine/bridge/dispatch.ts +265 -40
  7. package/src/engine/bridge/guards.ts +4 -1
  8. package/src/engine/bridge/protocol.ts +69 -52
  9. package/src/engine/ecs/index.ts +185 -42
  10. package/src/engine/state.ts +133 -2
  11. package/src/engine/systems/command-intent.ts +153 -3
  12. package/src/engine/systems/constraint-solve.ts +167 -0
  13. package/src/engine/systems/core-command-builder.ts +9 -268
  14. package/src/engine/systems/diagnostics.ts +20 -19
  15. package/src/engine/systems/index.ts +3 -1
  16. package/src/engine/systems/input-mirror.ts +101 -3
  17. package/src/engine/systems/resource-upload.ts +96 -44
  18. package/src/engine/systems/response-decode.ts +69 -15
  19. package/src/engine/systems/scene-sync.ts +306 -0
  20. package/src/engine/systems/ui-bridge.ts +360 -0
  21. package/src/engine/systems/utils.ts +43 -1
  22. package/src/engine/systems/world-lifecycle.ts +37 -102
  23. package/src/engine/window/manager.ts +168 -0
  24. package/src/engine/world/entities.ts +821 -78
  25. package/src/engine/world/mount.ts +174 -0
  26. package/src/engine/world/types.ts +71 -0
  27. package/src/engine/world/world-ui.ts +266 -0
  28. package/src/engine/world/world3d.ts +280 -0
  29. package/src/index.ts +30 -1
  30. package/src/mount.ts +2 -0
  31. package/src/types/cmds/audio.ts +73 -48
  32. package/src/types/cmds/camera.ts +12 -8
  33. package/src/types/cmds/environment.ts +9 -3
  34. package/src/types/cmds/geometry.ts +13 -14
  35. package/src/types/cmds/index.ts +198 -168
  36. package/src/types/cmds/light.ts +12 -11
  37. package/src/types/cmds/material.ts +9 -11
  38. package/src/types/cmds/model.ts +17 -15
  39. package/src/types/cmds/realm.ts +25 -0
  40. package/src/types/cmds/system.ts +19 -0
  41. package/src/types/cmds/target.ts +82 -0
  42. package/src/types/cmds/texture.ts +13 -3
  43. package/src/types/cmds/ui.ts +220 -0
  44. package/src/types/cmds/window.ts +41 -204
  45. package/src/types/events/index.ts +4 -1
  46. package/src/types/events/pointer.ts +42 -13
  47. package/src/types/events/system.ts +144 -30
  48. package/src/types/events/ui.ts +21 -0
  49. package/src/types/index.ts +1 -0
  50. package/src/types/json.ts +15 -0
  51. package/src/window.ts +8 -0
  52. package/src/world-ui.ts +2 -0
  53. package/src/world3d.ts +10 -0
  54. package/tsconfig.json +0 -29
@@ -1,33 +1,63 @@
1
1
  import type { ElementState, TouchPhase } from '../kinds';
2
2
 
3
- /** Scroll delta reported in line or pixel units. */
4
3
  export type ScrollDelta =
5
4
  | { type: 'line'; value: [number, number] }
6
5
  | { type: 'pixel'; value: [number, number] };
7
6
 
8
- /** Payload for pointer move event. */
7
+ export type PointerTraceStage =
8
+ | 'root-window'
9
+ | 'capture'
10
+ | 'focus-fallback'
11
+ | 'connector-hit'
12
+ | 'realm-plane-hit'
13
+ | 'hop-forward'
14
+ | 'stop-no-hit'
15
+ | 'stop-cycle'
16
+ | 'stop-step-budget';
17
+
18
+ export interface PointerTraceHop {
19
+ stage: PointerTraceStage;
20
+ realmId?: number;
21
+ targetId?: number;
22
+ layerRealmId?: number;
23
+ connectorId?: number;
24
+ surfaceId?: number;
25
+ cameraId?: number;
26
+ uv?: [number, number];
27
+ }
28
+
29
+ export interface PointerEventTrace {
30
+ windowId: number;
31
+ realmId: number;
32
+ targetId?: number;
33
+ connectorId?: number;
34
+ sourceRealmId?: number;
35
+ uv?: [number, number];
36
+ hops: PointerTraceHop[];
37
+ }
38
+
9
39
  export interface PointerEventOnMoveData {
10
40
  windowId: number;
11
41
  pointerType: number;
12
42
  pointerId: number;
13
43
  position: [number, number];
44
+ trace?: PointerEventTrace;
14
45
  }
15
46
 
16
- /** Payload for pointer enter event. */
17
47
  export interface PointerEventOnEnterData {
18
48
  windowId: number;
19
49
  pointerType: number;
20
50
  pointerId: number;
51
+ trace?: PointerEventTrace;
21
52
  }
22
53
 
23
- /** Payload for pointer leave event. */
24
54
  export interface PointerEventOnLeaveData {
25
55
  windowId: number;
26
56
  pointerType: number;
27
57
  pointerId: number;
58
+ trace?: PointerEventTrace;
28
59
  }
29
60
 
30
- /** Payload for pointer button event. */
31
61
  export interface PointerEventOnButtonData {
32
62
  windowId: number;
33
63
  pointerType: number;
@@ -35,51 +65,51 @@ export interface PointerEventOnButtonData {
35
65
  button: MouseButton;
36
66
  state: ElementState;
37
67
  position: [number, number];
68
+ trace?: PointerEventTrace;
38
69
  }
39
70
 
40
- /** Payload for pointer scroll event. */
41
71
  export interface PointerEventOnScrollData {
42
72
  windowId: number;
43
73
  delta: ScrollDelta;
44
74
  phase: TouchPhase;
75
+ trace?: PointerEventTrace;
45
76
  }
46
77
 
47
- /** Payload for touch event. */
48
78
  export interface PointerEventOnTouchData {
49
79
  windowId: number;
50
80
  pointerId: number;
51
81
  phase: TouchPhase;
52
82
  position: [number, number];
53
83
  pressure?: number;
84
+ trace?: PointerEventTrace;
54
85
  }
55
86
 
56
- /** Payload for pinch gesture event. */
57
87
  export interface PointerEventOnPinchGestureData {
58
88
  windowId: number;
59
89
  delta: number;
60
90
  phase: TouchPhase;
91
+ trace?: PointerEventTrace;
61
92
  }
62
93
 
63
- /** Payload for pan gesture event. */
64
94
  export interface PointerEventOnPanGestureData {
65
95
  windowId: number;
66
96
  delta: [number, number];
67
97
  phase: TouchPhase;
98
+ trace?: PointerEventTrace;
68
99
  }
69
100
 
70
- /** Payload for rotation gesture event. */
71
101
  export interface PointerEventOnRotationGestureData {
72
102
  windowId: number;
73
103
  delta: number;
74
104
  phase: TouchPhase;
105
+ trace?: PointerEventTrace;
75
106
  }
76
107
 
77
- /** Payload for double tap gesture event. */
78
108
  export interface PointerEventOnDoubleTapGestureData {
79
109
  windowId: number;
110
+ trace?: PointerEventTrace;
80
111
  }
81
112
 
82
- /** Discriminated union of pointer events. */
83
113
  export type PointerEvent =
84
114
  | { event: 'on-move'; data: PointerEventOnMoveData }
85
115
  | { event: 'on-enter'; data: PointerEventOnEnterData }
@@ -95,7 +125,6 @@ export type PointerEvent =
95
125
  data: PointerEventOnDoubleTapGestureData;
96
126
  };
97
127
 
98
- /** Mouse button identifiers. */
99
128
  export enum MouseButton {
100
129
  Left = 0,
101
130
  Right = 1,
@@ -1,42 +1,156 @@
1
- /** Payload for notification system events. */
2
- export interface SystemEventOnNotificationData {
3
- id: string;
4
- }
1
+ import type { CursorGrabMode } from '../kinds';
5
2
 
6
- /** Payload for async texture decode completion. */
7
- export interface SystemEventTextureReadyData {
8
- window_id: number;
9
- texture_id: number;
10
- success: boolean;
11
- message: string;
12
- }
3
+ export type PointerTraceLevel = 'off' | 'errors' | 'basic' | 'full';
13
4
 
14
- /** Payload for async audio decode completion. */
15
- export interface SystemEventAudioReadyData {
16
- resource_id: number;
17
- success: boolean;
18
- message: string;
19
- }
5
+ export type UiViewportClass = 'root' | 'deferred' | 'immediate' | 'embedded';
20
6
 
21
- /** Payload for audio stream progress. */
22
- export interface SystemEventAudioStreamProgressData {
23
- resource_id: number;
24
- received_bytes: number;
25
- total_bytes: number;
26
- complete: boolean;
27
- }
7
+ export type UiViewportCommand =
8
+ | { type: 'close' }
9
+ | { type: 'title'; content: { title: string } }
10
+ | { type: 'inner-size'; content: { width: number; height: number } }
11
+ | { type: 'outer-position'; content: { x: number; y: number } }
12
+ | { type: 'resizable'; content: { value: boolean } }
13
+ | { type: 'decorations'; content: { value: boolean } }
14
+ | { type: 'fullscreen'; content: { value: boolean } }
15
+ | { type: 'minimized'; content: { value: boolean } }
16
+ | { type: 'maximized'; content: { value: boolean } }
17
+ | { type: 'focus' }
18
+ | { type: 'screenshot' }
19
+ | { type: 'cursor-visible'; content: { value: boolean } }
20
+ | { type: 'cursor-grab'; content: { mode: CursorGrabMode } }
21
+ | { type: 'ime-allowed'; content: { value: boolean } }
22
+ | {
23
+ type: 'ime-rect';
24
+ content: { minX: number; minY: number; maxX: number; maxY: number };
25
+ };
28
26
 
29
- /** Discriminated union of system-level events. */
30
27
  export type SystemEvent =
28
+ | {
29
+ event: 'error';
30
+ data: {
31
+ scope: string;
32
+ message: string;
33
+ commandId?: number;
34
+ commandType?: string;
35
+ };
36
+ }
31
37
  | { event: 'on-resume' }
32
38
  | { event: 'on-suspend' }
33
39
  | { event: 'on-memory-warning' }
34
40
  | { event: 'on-exit' }
35
- | { event: 'on-notification-clicked'; data: SystemEventOnNotificationData }
36
- | { event: 'on-notification-dismissed'; data: SystemEventOnNotificationData }
37
- | { event: 'texture-ready'; data: SystemEventTextureReadyData }
38
- | { event: 'audio-ready'; data: SystemEventAudioReadyData }
41
+ | { event: 'on-notification-clicked'; data: { id: string } }
42
+ | { event: 'on-notification-dismissed'; data: { id: string } }
43
+ | {
44
+ event: 'texture-ready';
45
+ data: { windowId: number; textureId: number; success: boolean; message: string };
46
+ }
47
+ | {
48
+ event: 'texture-processing-started';
49
+ data: { windowId: number; textureId: number; totalBytes: number };
50
+ }
51
+ | {
52
+ event: 'texture-processing-progress';
53
+ data: {
54
+ windowId: number;
55
+ textureId: number;
56
+ processedBytes: number;
57
+ totalBytes: number;
58
+ };
59
+ }
60
+ | {
61
+ event: 'texture-processing-finished';
62
+ data: {
63
+ windowId: number;
64
+ textureId: number;
65
+ success: boolean;
66
+ message: string;
67
+ totalBytes: number;
68
+ };
69
+ }
70
+ | {
71
+ event: 'ui-image-ready';
72
+ data: { imageId: number; success: boolean; message: string };
73
+ }
74
+ | {
75
+ event: 'ui-image-processing-started';
76
+ data: { imageId: number; totalBytes: number };
77
+ }
78
+ | {
79
+ event: 'ui-image-processing-progress';
80
+ data: { imageId: number; processedBytes: number; totalBytes: number };
81
+ }
82
+ | {
83
+ event: 'ui-image-processing-finished';
84
+ data: {
85
+ imageId: number;
86
+ success: boolean;
87
+ message: string;
88
+ totalBytes: number;
89
+ };
90
+ }
91
+ | {
92
+ event: 'audio-ready';
93
+ data: { resourceId: number; success: boolean; message: string };
94
+ }
39
95
  | {
40
96
  event: 'audio-stream-progress';
41
- data: SystemEventAudioStreamProgressData;
97
+ data: {
98
+ resourceId: number;
99
+ receivedBytes: number;
100
+ totalBytes: number;
101
+ complete: boolean;
102
+ };
103
+ }
104
+ | {
105
+ event: 'ui-open-url';
106
+ data: { windowId: number; realmId: number; url: string; newTab: boolean };
107
+ }
108
+ | {
109
+ event: 'ui-clipboard-set-text';
110
+ data: { windowId: number; realmId: number; text: string };
111
+ }
112
+ | {
113
+ event: 'ui-clipboard-request-copy';
114
+ data: { windowId: number; realmId: number };
115
+ }
116
+ | {
117
+ event: 'ui-clipboard-request-cut';
118
+ data: { windowId: number; realmId: number };
119
+ }
120
+ | {
121
+ event: 'ui-clipboard-request-paste';
122
+ data: { windowId: number; realmId: number };
123
+ }
124
+ | {
125
+ event: 'ui-screenshot-request';
126
+ data: { windowId: number; realmId: number };
127
+ }
128
+ | {
129
+ event: 'ui-viewport-sync';
130
+ data: {
131
+ windowId: number;
132
+ realmId: number;
133
+ viewportId: number;
134
+ parentViewportId?: number;
135
+ class: UiViewportClass;
136
+ title?: string;
137
+ };
138
+ }
139
+ | {
140
+ event: 'ui-viewport-command';
141
+ data: {
142
+ windowId: number;
143
+ realmId: number;
144
+ viewportId: number;
145
+ command: UiViewportCommand;
146
+ };
147
+ }
148
+ | {
149
+ event: 'ui-viewport-fallback-embedded';
150
+ data: {
151
+ windowId: number;
152
+ realmId: number;
153
+ viewportId: number;
154
+ parentViewportId?: number;
155
+ };
42
156
  };
@@ -0,0 +1,21 @@
1
+ export type UiEventKind =
2
+ | 'click'
3
+ | 'double-click'
4
+ | 'pressed'
5
+ | 'released'
6
+ | 'hover-enter'
7
+ | 'hover-leave'
8
+ | 'changed'
9
+ | 'change-commit'
10
+ | 'focus'
11
+ | 'blur'
12
+ | 'submit'
13
+ | 'anim-complete';
14
+
15
+ export interface UiEvent {
16
+ realmId: number;
17
+ documentId: number;
18
+ nodeId: number;
19
+ kind: UiEventKind;
20
+ label?: string;
21
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './kinds';
2
+ export * from './json';
2
3
  export * from './cmds';
3
4
  export * from './events';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * JSON-like values that are safe to serialize across the host/core boundary.
3
+ */
4
+ export type JsonValue =
5
+ | null
6
+ | boolean
7
+ | number
8
+ | string
9
+ | JsonValue[]
10
+ | { [key: string]: JsonValue };
11
+
12
+ /**
13
+ * Convenience alias for object-shaped JSON payloads.
14
+ */
15
+ export type JsonObject = { [key: string]: JsonValue };
package/src/window.ts ADDED
@@ -0,0 +1,8 @@
1
+ export {
2
+ closeWindow,
3
+ createWindow,
4
+ focusWindow,
5
+ requestAttention,
6
+ updateWindow,
7
+ } from './engine/window/manager';
8
+ export type { WindowId } from './engine/world/types';
@@ -0,0 +1,2 @@
1
+ export * from './engine/world/world-ui';
2
+ export type { EntityId, TargetId, WorldId, WorldUIId } from './engine/world/types';
package/src/world3d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from './engine/world/world3d';
2
+ export type {
3
+ EntityId,
4
+ GeometryId,
5
+ MaterialId,
6
+ TargetId,
7
+ TextureId,
8
+ World3DId,
9
+ WorldId,
10
+ } from './engine/world/types';
package/tsconfig.json DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- // Environment setup & latest features
4
- "lib": ["ESNext"],
5
- "target": "ESNext",
6
- "module": "Preserve",
7
- "moduleDetection": "force",
8
- "jsx": "react-jsx",
9
- "allowJs": true,
10
-
11
- // Bundler mode
12
- "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
- "verbatimModuleSyntax": true,
15
- "noEmit": true,
16
-
17
- // Best practices
18
- "strict": true,
19
- "skipLibCheck": true,
20
- "noFallthroughCasesInSwitch": true,
21
- "noUncheckedIndexedAccess": true,
22
- "noImplicitOverride": true,
23
-
24
- // Some stricter flags (disabled by default)
25
- "noUnusedLocals": false,
26
- "noUnusedParameters": false,
27
- "noPropertyAccessFromIndexSignature": false
28
- }
29
- }