@world-engines/tmw 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +46 -0
  2. package/dist/activation.d.ts +50 -0
  3. package/dist/activation.js +113 -0
  4. package/dist/audio-presentation-projection.d.ts +23 -0
  5. package/dist/audio-presentation-projection.js +39 -0
  6. package/dist/author-scenario-source-v3.d.ts +34 -0
  7. package/dist/author-scenario-source-v3.js +1 -0
  8. package/dist/authoring-runtime.d.ts +76 -0
  9. package/dist/authoring-runtime.js +282 -0
  10. package/dist/builder-diagnostics.d.ts +3 -0
  11. package/dist/builder-diagnostics.js +8 -0
  12. package/dist/builder-node.d.ts +178 -0
  13. package/dist/builder-node.js +212 -0
  14. package/dist/builder.d.ts +32 -0
  15. package/dist/builder.js +127 -0
  16. package/dist/capability-registry.d.ts +32 -0
  17. package/dist/capability-registry.js +33 -0
  18. package/dist/compile-target-profile.d.ts +16 -0
  19. package/dist/compile-target-profile.js +70 -0
  20. package/dist/compiled-plan.d.ts +44 -0
  21. package/dist/compiled-plan.js +1 -0
  22. package/dist/compiler-compatibility-gate.d.ts +96 -0
  23. package/dist/compiler-compatibility-gate.js +609 -0
  24. package/dist/compiler-release-authority.d.ts +212 -0
  25. package/dist/compiler-release-authority.js +676 -0
  26. package/dist/compiler-stage-cache.d.ts +42 -0
  27. package/dist/compiler-stage-cache.js +100 -0
  28. package/dist/compiler-stage-registry.d.ts +48 -0
  29. package/dist/compiler-stage-registry.js +126 -0
  30. package/dist/compiler.d.ts +7 -0
  31. package/dist/compiler.js +68 -0
  32. package/dist/condition-graph.d.ts +46 -0
  33. package/dist/condition-graph.js +135 -0
  34. package/dist/diagnostics.d.ts +20 -0
  35. package/dist/diagnostics.js +20 -0
  36. package/dist/durable-intent.d.ts +29 -0
  37. package/dist/durable-intent.js +60 -0
  38. package/dist/effect-flow.d.ts +69 -0
  39. package/dist/effect-flow.js +98 -0
  40. package/dist/event-fabric.d.ts +81 -0
  41. package/dist/event-fabric.js +227 -0
  42. package/dist/event-lifecycle.d.ts +59 -0
  43. package/dist/event-lifecycle.js +161 -0
  44. package/dist/evidence.d.ts +37 -0
  45. package/dist/evidence.js +92 -0
  46. package/dist/gameplay-state.d.ts +127 -0
  47. package/dist/gameplay-state.js +214 -0
  48. package/dist/index.d.ts +66 -0
  49. package/dist/index.js +52 -0
  50. package/dist/isolated-replay.d.ts +81 -0
  51. package/dist/isolated-replay.js +316 -0
  52. package/dist/music-candidate-set.d.ts +38 -0
  53. package/dist/music-candidate-set.js +102 -0
  54. package/dist/natural-language-chunking.d.ts +10 -0
  55. package/dist/natural-language-chunking.js +62 -0
  56. package/dist/natural-language-ingestion.d.ts +14 -0
  57. package/dist/natural-language-ingestion.js +128 -0
  58. package/dist/natural-language-structured-decode.d.ts +2 -0
  59. package/dist/natural-language-structured-decode.js +69 -0
  60. package/dist/natural-language-world-types.d.ts +142 -0
  61. package/dist/natural-language-world-types.js +2 -0
  62. package/dist/neutral-source-compiler.d.ts +135 -0
  63. package/dist/neutral-source-compiler.js +608 -0
  64. package/dist/presentation-intent.d.ts +42 -0
  65. package/dist/presentation-intent.js +137 -0
  66. package/dist/recall-query-envelope.d.ts +32 -0
  67. package/dist/recall-query-envelope.js +51 -0
  68. package/dist/rewrite-compensation.d.ts +28 -0
  69. package/dist/rewrite-compensation.js +85 -0
  70. package/dist/runtime-contract.d.ts +56 -0
  71. package/dist/runtime-contract.js +96 -0
  72. package/dist/runtime-domain-capabilities.d.ts +12 -0
  73. package/dist/runtime-domain-capabilities.js +20 -0
  74. package/dist/runtime-sav.d.ts +117 -0
  75. package/dist/runtime-sav.js +356 -0
  76. package/dist/runtime-trace.d.ts +44 -0
  77. package/dist/runtime-trace.js +119 -0
  78. package/dist/runtime.d.ts +238 -0
  79. package/dist/runtime.js +1887 -0
  80. package/dist/scene-author-source.d.ts +13 -0
  81. package/dist/scene-author-source.js +25 -0
  82. package/dist/scene-state.d.ts +275 -0
  83. package/dist/scene-state.js +334 -0
  84. package/dist/scheduler.d.ts +55 -0
  85. package/dist/scheduler.js +235 -0
  86. package/dist/selector-ast.d.ts +24 -0
  87. package/dist/selector-ast.js +18 -0
  88. package/dist/semantic-verdict.d.ts +48 -0
  89. package/dist/semantic-verdict.js +101 -0
  90. package/dist/simulator.d.ts +45 -0
  91. package/dist/simulator.js +58 -0
  92. package/dist/source-canonical.d.ts +4 -0
  93. package/dist/source-canonical.js +51 -0
  94. package/dist/source-crypto.d.ts +20 -0
  95. package/dist/source-crypto.js +17 -0
  96. package/dist/source-revision.d.ts +22 -0
  97. package/dist/source-revision.js +43 -0
  98. package/dist/spatial-impact-receipt.d.ts +38 -0
  99. package/dist/spatial-impact-receipt.js +67 -0
  100. package/dist/temporal-rewrite.d.ts +59 -0
  101. package/dist/temporal-rewrite.js +214 -0
  102. package/dist/time-domains.d.ts +37 -0
  103. package/dist/time-domains.js +142 -0
  104. package/dist/timeline-revision.d.ts +28 -0
  105. package/dist/timeline-revision.js +59 -0
  106. package/dist/trigger-document-v3.d.ts +99 -0
  107. package/dist/trigger-document-v3.js +334 -0
  108. package/dist/turn-commit.d.ts +56 -0
  109. package/dist/turn-commit.js +190 -0
  110. package/dist/validator.d.ts +7 -0
  111. package/dist/validator.js +142 -0
  112. package/dist/value-graph.d.ts +98 -0
  113. package/dist/value-graph.js +318 -0
  114. package/dist/view-event-delivery.d.ts +47 -0
  115. package/dist/view-event-delivery.js +197 -0
  116. package/dist/view-interaction-manifest-v3.d.ts +60 -0
  117. package/dist/view-interaction-manifest-v3.js +198 -0
  118. package/dist/view-payload-schema.d.ts +17 -0
  119. package/dist/view-payload-schema.js +84 -0
  120. package/package.json +62 -0
@@ -0,0 +1,198 @@
1
+ import { canonicalTmwBytes, canonicalTmwJson, tmwSha256Hex } from "./runtime-contract.js";
2
+ import { parseViewPayloadSchemaV3, viewPayloadMatchesSchemaV3, } from "./view-payload-schema.js";
3
+ import { parseViewEventDeliveryDeclarations, } from "./view-event-delivery.js";
4
+ export { parseViewPayloadSchemaV3, viewPayloadMatchesSchemaV3, } from "./view-payload-schema.js";
5
+ const SHA256_HEX = /^[a-f0-9]{64}$/;
6
+ const STABLE_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
7
+ const EVENT_TYPE = /^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/;
8
+ const MAX_EVENT_COUNT = 256;
9
+ const MAX_CAPABILITY_COUNT = 256;
10
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11
+ const hasExactKeys = (value, required, optional = []) => {
12
+ const allowed = new Set([...required, ...optional]);
13
+ return required.every((key) => Object.hasOwn(value, key))
14
+ && Object.keys(value).every((key) => allowed.has(key));
15
+ };
16
+ const isPositiveSafeInteger = (value) => typeof value === "number" && Number.isSafeInteger(value) && value > 0;
17
+ const isCanonicalBootstrapUrl = (value) => {
18
+ if (typeof value !== "string")
19
+ return false;
20
+ let parsed;
21
+ try {
22
+ parsed = new URL(value);
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ if (parsed.username !== "" || parsed.password !== "" || parsed.hash !== "")
28
+ return false;
29
+ if (parsed.protocol !== "https:" && !(parsed.protocol === "http:" && parsed.hostname === "localhost")) {
30
+ return false;
31
+ }
32
+ return parsed.toString() === value;
33
+ };
34
+ const parseEventDeclaration = (value) => {
35
+ if (!isRecord(value) || !hasExactKeys(value, ["event_id", "event_type", "capability", "payload_schema"])) {
36
+ return null;
37
+ }
38
+ if (typeof value.event_id !== "string" || !STABLE_ID.test(value.event_id))
39
+ return null;
40
+ if (typeof value.event_type !== "string" || !EVENT_TYPE.test(value.event_type))
41
+ return null;
42
+ if (typeof value.capability !== "string" || !STABLE_ID.test(value.capability))
43
+ return null;
44
+ if (parseViewPayloadSchemaV3(value.payload_schema) === null)
45
+ return null;
46
+ return value;
47
+ };
48
+ export const parseViewInteractionManifestV3 = (value) => {
49
+ if (!isRecord(value) || !hasExactKeys(value, [
50
+ "schema",
51
+ "generation",
52
+ "epoch",
53
+ "artifact_digest",
54
+ "runtime_contract_hash",
55
+ "bootstrap_url",
56
+ "capabilities",
57
+ "events"
58
+ ], ["view_deliveries"]))
59
+ return null;
60
+ if (value.schema !== "view-interaction-manifest.v3" || value.generation !== 3)
61
+ return null;
62
+ if (!isPositiveSafeInteger(value.epoch))
63
+ return null;
64
+ if (typeof value.artifact_digest !== "string" || !SHA256_HEX.test(value.artifact_digest))
65
+ return null;
66
+ if (typeof value.runtime_contract_hash !== "string" || !SHA256_HEX.test(value.runtime_contract_hash))
67
+ return null;
68
+ if (!isCanonicalBootstrapUrl(value.bootstrap_url))
69
+ return null;
70
+ if (!Array.isArray(value.capabilities)
71
+ || value.capabilities.length > MAX_CAPABILITY_COUNT
72
+ || !value.capabilities.every((capability) => typeof capability === "string" && STABLE_ID.test(capability)))
73
+ return null;
74
+ if (!Array.isArray(value.events)
75
+ || value.events.length > MAX_EVENT_COUNT
76
+ || !value.events.every((event) => parseEventDeclaration(event) !== null))
77
+ return null;
78
+ const capabilities = new Set(value.capabilities);
79
+ if (capabilities.size !== value.capabilities.length)
80
+ return null;
81
+ const eventIds = new Set();
82
+ const eventTypes = new Set();
83
+ for (const event of value.events) {
84
+ if (eventIds.has(event.event_id)
85
+ || eventTypes.has(event.event_type)
86
+ || !capabilities.has(event.capability))
87
+ return null;
88
+ eventIds.add(event.event_id);
89
+ eventTypes.add(event.event_type);
90
+ }
91
+ if (value.view_deliveries !== undefined && !parseViewEventDeliveryDeclarations(value.view_deliveries).ok) {
92
+ return null;
93
+ }
94
+ return value;
95
+ };
96
+ export const parseViewInteractionSourceV3 = (value) => {
97
+ if (!isRecord(value) || !hasExactKeys(value, [
98
+ "schema",
99
+ "generation",
100
+ "manifest",
101
+ "manifest_digest"
102
+ ]))
103
+ return null;
104
+ if (value.schema !== "view-interaction-source.v3" || value.generation !== 3)
105
+ return null;
106
+ if (parseViewInteractionManifestV3(value.manifest) === null)
107
+ return null;
108
+ if (typeof value.manifest_digest !== "string" || !SHA256_HEX.test(value.manifest_digest))
109
+ return null;
110
+ return value;
111
+ };
112
+ export const canonicalViewInteractionManifestV3 = (manifest) => {
113
+ const parsed = parseViewInteractionManifestV3(manifest);
114
+ if (parsed === null)
115
+ throw new Error("view_interaction_manifest_v3_invalid");
116
+ return canonicalTmwJson(parsed);
117
+ };
118
+ export const digestViewInteractionManifestV3 = async (manifest) => {
119
+ canonicalViewInteractionManifestV3(manifest);
120
+ return tmwSha256Hex(canonicalTmwBytes(manifest));
121
+ };
122
+ export const parseViewInteractionEventV3 = (value, manifest, manifestDigest) => {
123
+ const parsedManifest = parseViewInteractionManifestV3(manifest);
124
+ if (parsedManifest === null || !SHA256_HEX.test(manifestDigest)) {
125
+ return { ok: false, code: "view_manifest_invalid" };
126
+ }
127
+ if (!isRecord(value) || !hasExactKeys(value, [
128
+ "schema",
129
+ "generation",
130
+ "event_id",
131
+ "event_type",
132
+ "payload",
133
+ "interaction_id",
134
+ "manifest_digest",
135
+ "epoch",
136
+ "artifact_digest",
137
+ "nonce"
138
+ ]))
139
+ return { ok: false, code: "view_event_envelope_invalid" };
140
+ if (value.schema !== "view-interaction-event.v3" || value.generation !== 3) {
141
+ return { ok: false, code: "view_event_generation_unsupported" };
142
+ }
143
+ if (value.epoch !== manifest.epoch)
144
+ return { ok: false, code: "stale_content_epoch" };
145
+ if (value.artifact_digest !== manifest.artifact_digest)
146
+ return { ok: false, code: "view_event_artifact_mismatch" };
147
+ if (value.manifest_digest !== manifestDigest)
148
+ return { ok: false, code: "view_event_manifest_mismatch" };
149
+ if (typeof value.event_id !== "string" || typeof value.event_type !== "string") {
150
+ return { ok: false, code: "view_event_identity_invalid" };
151
+ }
152
+ const declaration = manifest.events.find((event) => event.event_id === value.event_id);
153
+ if (declaration === undefined || declaration.event_type !== value.event_type) {
154
+ return { ok: false, code: "view_event_not_declared" };
155
+ }
156
+ if (!manifest.capabilities.includes(declaration.capability)) {
157
+ return { ok: false, code: "view_event_capability_denied" };
158
+ }
159
+ if (!isRecord(value.payload) || !viewPayloadMatchesSchemaV3(value.payload, declaration.payload_schema)) {
160
+ return { ok: false, code: "view_event_payload_invalid" };
161
+ }
162
+ if (typeof value.interaction_id !== "string" || !STABLE_ID.test(value.interaction_id)) {
163
+ return { ok: false, code: "view_event_interaction_id_invalid" };
164
+ }
165
+ if (typeof value.nonce !== "string" || !STABLE_ID.test(value.nonce)) {
166
+ return { ok: false, code: "view_event_nonce_invalid" };
167
+ }
168
+ return { ok: true, event: value };
169
+ };
170
+ /** Pure stateful replay gate; the Player/preview host remains the sole listener. */
171
+ export const createViewInteractionEventGateV3 = (manifest, manifestDigest, maxReplayNonces = 2_048) => {
172
+ if (!Number.isSafeInteger(maxReplayNonces) || maxReplayNonces <= 0) {
173
+ throw new Error("view_event_replay_window_invalid");
174
+ }
175
+ const seenNonces = new Set();
176
+ const nonceOrder = [];
177
+ return Object.freeze({
178
+ parse: (value) => {
179
+ const parsed = parseViewInteractionEventV3(value, manifest, manifestDigest);
180
+ if (!parsed.ok)
181
+ return parsed;
182
+ if (seenNonces.has(parsed.event.nonce))
183
+ return { ok: false, code: "view_event_replayed" };
184
+ seenNonces.add(parsed.event.nonce);
185
+ nonceOrder.push(parsed.event.nonce);
186
+ if (nonceOrder.length > maxReplayNonces) {
187
+ const oldest = nonceOrder.shift();
188
+ if (oldest !== undefined)
189
+ seenNonces.delete(oldest);
190
+ }
191
+ return parsed;
192
+ },
193
+ clear: () => {
194
+ seenNonces.clear();
195
+ nonceOrder.length = 0;
196
+ }
197
+ });
198
+ };
@@ -0,0 +1,17 @@
1
+ import { type TmwJsonPrimitive, type TmwJsonValue } from "./runtime-contract.js";
2
+ export type ViewPayloadPrimitiveKind = "string" | "number" | "integer" | "boolean" | "null";
3
+ export interface ViewPayloadPropertyV3 {
4
+ readonly type: ViewPayloadPrimitiveKind;
5
+ readonly required: boolean;
6
+ readonly enum?: ReadonlyArray<TmwJsonPrimitive>;
7
+ }
8
+ export interface ViewPayloadSchemaV3 {
9
+ readonly type: "object";
10
+ readonly additional_properties: false;
11
+ readonly properties: Readonly<Record<string, ViewPayloadPropertyV3>>;
12
+ readonly max_bytes: number;
13
+ }
14
+ /** 仅校验 View payload schema;不涉及 manifest 身份、能力或 epoch。 */
15
+ export declare const parseViewPayloadSchemaV3: (value: unknown) => ViewPayloadSchemaV3 | null;
16
+ /** 仅校验 payload 是否符合已校验 schema;不涉及 event envelope 身份。 */
17
+ export declare const viewPayloadMatchesSchemaV3: (payload: Record<string, unknown>, schema: ViewPayloadSchemaV3) => payload is Record<string, TmwJsonValue>;
@@ -0,0 +1,84 @@
1
+ import { canonicalTmwBytes } from "./runtime-contract.js";
2
+ const STABLE_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
3
+ const MAX_SCHEMA_PROPERTIES = 128;
4
+ const MAX_PAYLOAD_BYTES = 32 * 1024;
5
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
6
+ const hasExactKeys = (value, required, optional = []) => {
7
+ const allowed = new Set([...required, ...optional]);
8
+ return required.every((key) => Object.hasOwn(value, key))
9
+ && Object.keys(value).every((key) => allowed.has(key));
10
+ };
11
+ const isPositiveSafeInteger = (value) => typeof value === "number" && Number.isSafeInteger(value) && value > 0;
12
+ const isJsonValue = (value) => {
13
+ if (value === null || typeof value === "string" || typeof value === "boolean")
14
+ return true;
15
+ if (typeof value === "number")
16
+ return Number.isFinite(value);
17
+ if (Array.isArray(value))
18
+ return value.every(isJsonValue);
19
+ return isRecord(value) && Object.values(value).every(isJsonValue);
20
+ };
21
+ const parseProperty = (value) => {
22
+ if (!isRecord(value) || !hasExactKeys(value, ["type", "required"], ["enum"]))
23
+ return null;
24
+ if (value.type !== "string"
25
+ && value.type !== "number"
26
+ && value.type !== "integer"
27
+ && value.type !== "boolean"
28
+ && value.type !== "null")
29
+ return null;
30
+ if (typeof value.required !== "boolean")
31
+ return null;
32
+ if (value.enum !== undefined) {
33
+ if (!Array.isArray(value.enum) || value.enum.length === 0 || !value.enum.every((item) => (item === null
34
+ || typeof item === "string"
35
+ || typeof item === "boolean"
36
+ || (typeof item === "number" && Number.isFinite(item)))))
37
+ return null;
38
+ }
39
+ return value;
40
+ };
41
+ /** 仅校验 View payload schema;不涉及 manifest 身份、能力或 epoch。 */
42
+ export const parseViewPayloadSchemaV3 = (value) => {
43
+ if (!isRecord(value) || !hasExactKeys(value, ["type", "additional_properties", "properties", "max_bytes"])) {
44
+ return null;
45
+ }
46
+ if (value.type !== "object" || value.additional_properties !== false)
47
+ return null;
48
+ if (!isRecord(value.properties) || Object.keys(value.properties).length > MAX_SCHEMA_PROPERTIES)
49
+ return null;
50
+ if (!isPositiveSafeInteger(value.max_bytes) || value.max_bytes > MAX_PAYLOAD_BYTES)
51
+ return null;
52
+ for (const [key, property] of Object.entries(value.properties)) {
53
+ if (!STABLE_ID.test(key) || parseProperty(property) === null)
54
+ return null;
55
+ }
56
+ return value;
57
+ };
58
+ /** 仅校验 payload 是否符合已校验 schema;不涉及 event envelope 身份。 */
59
+ export const viewPayloadMatchesSchemaV3 = (payload, schema) => {
60
+ const keys = Object.keys(payload);
61
+ if (keys.some((key) => !Object.hasOwn(schema.properties, key)))
62
+ return false;
63
+ for (const [key, property] of Object.entries(schema.properties)) {
64
+ if (property.required && !Object.hasOwn(payload, key))
65
+ return false;
66
+ if (!Object.hasOwn(payload, key))
67
+ continue;
68
+ const item = payload[key];
69
+ const matches = property.type === "null"
70
+ ? item === null
71
+ : property.type === "string"
72
+ ? typeof item === "string"
73
+ : property.type === "boolean"
74
+ ? typeof item === "boolean"
75
+ : property.type === "integer"
76
+ ? typeof item === "number" && Number.isSafeInteger(item)
77
+ : typeof item === "number" && Number.isFinite(item);
78
+ if (!matches || !isJsonValue(item))
79
+ return false;
80
+ if (property.enum !== undefined && !property.enum.some((candidate) => Object.is(candidate, item)))
81
+ return false;
82
+ }
83
+ return canonicalTmwBytes(payload).byteLength <= schema.max_bytes;
84
+ };
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@world-engines/tmw",
3
+ "private": false,
4
+ "version": "0.1.0-alpha.0",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ },
12
+ "./scene-state": {
13
+ "types": "./dist/scene-state.d.ts",
14
+ "import": "./dist/scene-state.js"
15
+ },
16
+ "./*": {
17
+ "types": "./dist/*.d.ts",
18
+ "import": "./dist/*.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "@world-engines/protocol-ts": "0.1.0-alpha.0",
26
+ "@world-engines/scenario-author-source": "0.1.0-alpha.0",
27
+ "@world-engines/spatial-authoring": "0.1.0-alpha.0",
28
+ "zod": "^4.0.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "worldengine_source_sha256": "06d11db2ee456554759811314f133283599d3990f28a1a968453d68885453acf",
34
+ "worldengine_source_identity_provenance": {
35
+ "schema": "worldengine-public-namespace-projection/v1",
36
+ "kind": "composite-source-identity; namespace projection; not-full-source-recompile",
37
+ "original_name": "@chat/tmw",
38
+ "original_archive_sha256": "5fc6c8ab7d45f37f4d1d8197e0edd7c4b232b0dce346822712159aae736d14cd",
39
+ "original_source_sha256": "1272f256e0f4c2851625b1279d68c572bfc98f42a94002512b0445ba5a803078",
40
+ "projected_name": "@world-engines/tmw",
41
+ "package_name_mapping": {
42
+ "@chat/blocks-editor": "@world-engines/blocks-editor",
43
+ "@chat/ladybug-bridge": "@world-engines/ladybug-bridge",
44
+ "@chat/monaco-host": "@world-engines/monaco-host",
45
+ "@chat/protocol-ts": "@world-engines/protocol-ts",
46
+ "@chat/scenario-author-source": "@world-engines/scenario-author-source",
47
+ "@chat/scenario-review-snapshot": "@world-engines/scenario-review-snapshot",
48
+ "@chat/tmw": "@world-engines/tmw",
49
+ "@chat/view-exposure": "@world-engines/view-exposure",
50
+ "@world-engines/chatplay-vite-plugin": "@world-engines/chatplay-vite-plugin",
51
+ "@worldengine/agent-kit": "@world-engines/agent-kit",
52
+ "@worldengine/authoring-bridge": "@world-engines/authoring-bridge",
53
+ "@worldengine/authoring-ui": "@world-engines/authoring-ui",
54
+ "@worldengine/create-project": "@world-engines/create-project",
55
+ "@worldengine/project-format": "@world-engines/project-format",
56
+ "@worldengine/project-host": "@world-engines/project-host",
57
+ "@worldengine/project-setup": "@world-engines/project-setup",
58
+ "@worldengine/spatial-authoring": "@world-engines/spatial-authoring",
59
+ "@worldengine/view-sdk": "@world-engines/view-sdk"
60
+ }
61
+ }
62
+ }