@fps-games/editor 0.2.0-beta.3 → 0.2.0-beta.4

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 (116) hide show
  1. package/dist/agent-bridge/capabilities/editor-state.d.ts.map +1 -1
  2. package/dist/agent-bridge/capabilities/editor-state.js +26 -17
  3. package/dist/agent-bridge/capabilities/editor-state.js.map +1 -1
  4. package/dist/agent-bridge/capabilities/prefabs.d.ts.map +1 -1
  5. package/dist/agent-bridge/capabilities/prefabs.js +61 -13
  6. package/dist/agent-bridge/capabilities/prefabs.js.map +1 -1
  7. package/dist/agent-bridge/capabilities/scene-objects.d.ts +1 -1
  8. package/dist/agent-bridge/capabilities/scene-objects.d.ts.map +1 -1
  9. package/dist/agent-bridge/capabilities/scene-objects.js +110 -25
  10. package/dist/agent-bridge/capabilities/scene-objects.js.map +1 -1
  11. package/dist/agent-bridge/capabilities/selection.d.ts.map +1 -1
  12. package/dist/agent-bridge/capabilities/selection.js +8 -5
  13. package/dist/agent-bridge/capabilities/selection.js.map +1 -1
  14. package/dist/agent-bridge/capabilities/shadows.d.ts.map +1 -1
  15. package/dist/agent-bridge/capabilities/shadows.js +11 -2
  16. package/dist/agent-bridge/capabilities/shadows.js.map +1 -1
  17. package/dist/agent-bridge/capabilities/transform.d.ts.map +1 -1
  18. package/dist/agent-bridge/capabilities/transform.js +6 -4
  19. package/dist/agent-bridge/capabilities/transform.js.map +1 -1
  20. package/dist/agent-bridge/capabilities/viewport.d.ts.map +1 -1
  21. package/dist/agent-bridge/capabilities/viewport.js +79 -47
  22. package/dist/agent-bridge/capabilities/viewport.js.map +1 -1
  23. package/dist/agent-bridge/shared.d.ts +8 -3
  24. package/dist/agent-bridge/shared.d.ts.map +1 -1
  25. package/dist/agent-bridge/shared.js +32 -0
  26. package/dist/agent-bridge/shared.js.map +1 -1
  27. package/dist/build-info.json +34 -34
  28. package/dist/local-editor-agent-actions.d.ts.map +1 -1
  29. package/dist/local-editor-agent-actions.js +9 -5
  30. package/dist/local-editor-agent-actions.js.map +1 -1
  31. package/dist/local-editor-harness.d.ts.map +1 -1
  32. package/dist/local-editor-harness.js +264 -41
  33. package/dist/local-editor-harness.js.map +1 -1
  34. package/node_modules/@fps-games/babylon-renderer/package.json +7 -7
  35. package/node_modules/@fps-games/editor-babylon/package.json +5 -5
  36. package/node_modules/@fps-games/editor-browser/dist/index.d.ts +3 -1
  37. package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
  38. package/node_modules/@fps-games/editor-browser/dist/index.js +2 -0
  39. package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
  40. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts +2 -1
  41. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts.map +1 -1
  42. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js +260 -94
  43. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js.map +1 -1
  44. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-projection.d.ts +7 -0
  45. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-projection.d.ts.map +1 -0
  46. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-projection.js +186 -0
  47. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-projection.js.map +1 -0
  48. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts +2 -2
  49. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts.map +1 -1
  50. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js +14 -8
  51. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js.map +1 -1
  52. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.d.ts.map +1 -1
  53. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js +23 -7
  54. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js.map +1 -1
  55. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts +1 -1
  56. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts.map +1 -1
  57. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js +6 -0
  58. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js.map +1 -1
  59. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.d.ts +3 -0
  60. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.d.ts.map +1 -1
  61. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.js +60 -13
  62. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.js.map +1 -1
  63. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-status-diagnostics.d.ts +24 -0
  64. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-status-diagnostics.d.ts.map +1 -0
  65. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-status-diagnostics.js +69 -0
  66. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-status-diagnostics.js.map +1 -0
  67. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +58 -14
  68. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
  69. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js.map +1 -1
  70. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +1 -1
  71. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
  72. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +196 -11
  73. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
  74. package/node_modules/@fps-games/editor-browser/package.json +4 -4
  75. package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts +3 -0
  76. package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts.map +1 -1
  77. package/node_modules/@fps-games/editor-core/dist/editor-session.js +9 -0
  78. package/node_modules/@fps-games/editor-core/dist/editor-session.js.map +1 -1
  79. package/node_modules/@fps-games/editor-core/package.json +6 -6
  80. package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
  81. package/node_modules/@fps-games/editor-playable-sdk/package.json +6 -6
  82. package/node_modules/@fps-games/editor-protocol/package.json +2 -2
  83. package/node_modules/@fps-games/editor-tooling/package.json +3 -3
  84. package/node_modules/@fps-games/playable-assets/package.json +1 -1
  85. package/node_modules/@fps-games/playable-contracts/package.json +1 -1
  86. package/node_modules/@fps-games/playable-rendering/package.json +2 -2
  87. package/node_modules/@fps-games/playable-runtime/package.json +12 -12
  88. package/node_modules/@fps-games/playable-runtime-data/package.json +4 -4
  89. package/node_modules/@fps-games/playable-scene/package.json +2 -2
  90. package/node_modules/@fps-games/plugin-api/package.json +1 -1
  91. package/node_modules/@fps-games/plugin-assets/dist/version.d.ts +1 -1
  92. package/node_modules/@fps-games/plugin-assets/dist/version.js +1 -1
  93. package/node_modules/@fps-games/plugin-assets/dist/version.js.map +1 -1
  94. package/node_modules/@fps-games/plugin-assets/package.json +5 -5
  95. package/node_modules/@fps-games/plugin-host/package.json +2 -2
  96. package/node_modules/@fps-games/plugin-markers/dist/version.d.ts +1 -1
  97. package/node_modules/@fps-games/plugin-markers/dist/version.js +1 -1
  98. package/node_modules/@fps-games/plugin-markers/dist/version.js.map +1 -1
  99. package/node_modules/@fps-games/plugin-markers/package.json +5 -5
  100. package/node_modules/@fps-games/plugin-materials/dist/version.d.ts +1 -1
  101. package/node_modules/@fps-games/plugin-materials/dist/version.js +1 -1
  102. package/node_modules/@fps-games/plugin-materials/dist/version.js.map +1 -1
  103. package/node_modules/@fps-games/plugin-materials/package.json +5 -5
  104. package/node_modules/@fps-games/plugin-rendering/dist/version.d.ts +1 -1
  105. package/node_modules/@fps-games/plugin-rendering/dist/version.js +1 -1
  106. package/node_modules/@fps-games/plugin-rendering/dist/version.js.map +1 -1
  107. package/node_modules/@fps-games/plugin-rendering/package.json +5 -5
  108. package/node_modules/@fps-games/plugin-scene/dist/version.d.ts +1 -1
  109. package/node_modules/@fps-games/plugin-scene/dist/version.js +1 -1
  110. package/node_modules/@fps-games/plugin-scene/dist/version.js.map +1 -1
  111. package/node_modules/@fps-games/plugin-scene/package.json +5 -5
  112. package/node_modules/@fps-games/plugin-shadows/dist/version.d.ts +1 -1
  113. package/node_modules/@fps-games/plugin-shadows/dist/version.js +1 -1
  114. package/node_modules/@fps-games/plugin-shadows/dist/version.js.map +1 -1
  115. package/node_modules/@fps-games/plugin-shadows/package.json +7 -7
  116. package/package.json +19 -19
@@ -2,7 +2,7 @@ import { validateSceneGraphDelete, } from '@fps-games/editor-core';
2
2
  import { EDITOR_AGENT_BRIDGE_CAPABILITY_ID, } from '@fps-games/editor-protocol';
3
3
  import { cloneVec3, createLocalEditorAgentBridgeFailure, editorTransformSnapshotToAgentTransform, isLocalEditorAgentBridgeVec3, } from '../diagnostics.js';
4
4
  import { findAgentBridgeVisibleAssetInfo } from './assets.js';
5
- import { cloneAgentBridgeSelection, isAgentBridgeDocumentNodeLocked, isAgentBridgeDocumentNodeSelectable, isAgentBridgeObjectSelectable, normalizeAgentBridgeIdList, normalizeAgentBridgeString, } from '../shared.js';
5
+ import { cloneAgentBridgeSelection, getAgentBridgeSafeSceneHierarchy, getAgentBridgeSafeSceneSelection, hasAgentBridgeSafeSceneScope, isAgentBridgeDocumentNodeLocked, isAgentBridgeDocumentNodeSelectable, isAgentBridgeHierarchyObjectSelectable, normalizeAgentBridgeIdList, normalizeAgentBridgeString, } from '../shared.js';
6
6
  const OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS = 3000;
7
7
  export function createLocalEditorAgentBridgeObjectSource(state, options, renderUi, operations) {
8
8
  return {
@@ -10,16 +10,16 @@ export function createLocalEditorAgentBridgeObjectSource(state, options, renderU
10
10
  const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;
11
11
  if (state.mode !== 'editor' || !document)
12
12
  return [];
13
- return listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true);
13
+ return listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true, operations);
14
14
  },
15
15
  resolveObject(input) {
16
- return resolveAgentBridgeObject(state, options, input);
16
+ return resolveAgentBridgeObject(state, options, input, operations);
17
17
  },
18
18
  getObject(objectId) {
19
19
  const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;
20
20
  if (state.mode !== 'editor' || !document)
21
21
  return null;
22
- return createAgentBridgeSceneObject(state, options, document, objectId, operations.getHierarchy());
22
+ return createAgentBridgeSceneObject(state, options, document, objectId, getAgentBridgeSafeSceneHierarchy(operations));
23
23
  },
24
24
  createPrimitive(input) {
25
25
  return createAgentBridgePrimitiveObject(state, options, input, renderUi, operations);
@@ -32,8 +32,8 @@ export function createLocalEditorAgentBridgeObjectSource(state, options, renderU
32
32
  },
33
33
  };
34
34
  }
35
- export function listAgentBridgeSceneObjects(state, options, document, includeUnselectable) {
36
- const hierarchy = options.documentAdapter.getHierarchyItems(document);
35
+ export function listAgentBridgeSceneObjects(state, options, document, includeUnselectable, operations) {
36
+ const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);
37
37
  return hierarchy
38
38
  .map(item => createAgentBridgeSceneObject(state, options, document, item.id, hierarchy))
39
39
  .filter((object) => !!object)
@@ -41,9 +41,9 @@ export function listAgentBridgeSceneObjects(state, options, document, includeUns
41
41
  }
42
42
  export function createAgentBridgeSceneObject(state, options, document, objectId, hierarchyItems) {
43
43
  const item = hierarchyItems.find(candidate => candidate.id === objectId) ?? null;
44
- const projectionNode = options.documentAdapter.getProjectionNode(document, objectId);
45
- if (!item && !projectionNode)
44
+ if (!item)
46
45
  return null;
46
+ const projectionNode = options.documentAdapter.getProjectionNode(document, objectId);
47
47
  const runtimeTransform = state.projection?.readNodeTransform(objectId) ?? null;
48
48
  const documentTransform = projectionNode?.transform ?? null;
49
49
  const transform = editorTransformSnapshotToAgentTransform(runtimeTransform ?? documentTransform);
@@ -115,12 +115,12 @@ function isAgentBridgeFiniteVec3(value) {
115
115
  && Number.isFinite(record.y)
116
116
  && Number.isFinite(record.z);
117
117
  }
118
- function resolveAgentBridgeObject(state, options, input) {
118
+ function resolveAgentBridgeObject(state, options, input, operations) {
119
119
  const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;
120
120
  if (state.mode !== 'editor' || !document) {
121
121
  return { objects: [], resolvedObject: null, ambiguous: false };
122
122
  }
123
- const objects = listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true);
123
+ const objects = listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true, operations);
124
124
  const objectId = normalizeAgentBridgeString(input.objectId);
125
125
  const name = normalizeAgentBridgeString(input.name);
126
126
  const path = normalizeAgentBridgeString(input.path);
@@ -153,13 +153,26 @@ function createAgentBridgePrimitiveObject(state, options, input, renderUi, opera
153
153
  if (state.mode !== 'editor' || !state.session) {
154
154
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE, 'Editor is not in edit mode.', { code: 'editor.notReady' });
155
155
  }
156
+ if (!hasAgentBridgeSafeSceneScope(operations)) {
157
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE, 'Scene object creation is unavailable outside the Scene Hierarchy scope.', { code: 'object.sceneScopeRequired' });
158
+ }
156
159
  const sessionState = state.session.getState({ cloneDocuments: false });
157
160
  const document = sessionState.workingDocument;
161
+ const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);
162
+ const requestedParentId = input.parentId === null ? null : normalizeAgentBridgeString(input.parentId) || null;
163
+ const requestedActiveId = input.activeId === null
164
+ ? null
165
+ : normalizeAgentBridgeString(input.activeId) || getAgentBridgeSafeSceneSelection(operations).activeId;
166
+ const invalidTargetId = [requestedParentId, requestedActiveId]
167
+ .find(id => id && !hierarchy.some(item => item.id === id));
168
+ if (invalidTargetId) {
169
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE, `Create target is unavailable in the safe Hierarchy projection: ${invalidTargetId}`, { code: 'object.create.invalidTarget', objectId: invalidTargetId });
170
+ }
158
171
  const intent = {
159
172
  shape,
160
173
  name: normalizeAgentBridgeString(input.name) || undefined,
161
- parentId: input.parentId === null ? null : normalizeAgentBridgeString(input.parentId) || null,
162
- activeId: input.activeId === null ? null : normalizeAgentBridgeString(input.activeId) || sessionState.selection.activeId,
174
+ parentId: requestedParentId,
175
+ activeId: requestedActiveId,
163
176
  };
164
177
  operations.cancelActiveOperation();
165
178
  const patch = options.documentAdapter.createSceneGraphCreatePrimitivePatch?.(document, intent);
@@ -184,8 +197,8 @@ function createAgentBridgePrimitiveObject(state, options, input, renderUi, opera
184
197
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE, `Create ${shape} did not return a created id.`, { code: 'object.create.missingCreatedId' });
185
198
  }
186
199
  let selection = result.selection;
187
- const hierarchy = options.documentAdapter.getHierarchyItems(result.workingDocument);
188
- if (isAgentBridgeObjectSelectable(options, result.workingDocument, createdId, hierarchy)) {
200
+ const updatedHierarchy = getAgentBridgeSafeSceneHierarchy(operations);
201
+ if (isAgentBridgeHierarchyObjectSelectable(options, result.workingDocument, createdId, updatedHierarchy)) {
189
202
  selection = state.session.dispatch({
190
203
  type: 'selection.replace',
191
204
  selectedIds: [createdId],
@@ -196,14 +209,19 @@ function createAgentBridgePrimitiveObject(state, options, input, renderUi, opera
196
209
  else {
197
210
  selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;
198
211
  }
212
+ selection = reconcileAgentBridgeSafeSceneSelection(state, operations, selection);
199
213
  operations.rebuildProjectionFromDocument(result.workingDocument, selection);
200
214
  state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());
201
215
  state.status = patch.label ?? `Agent created ${shape} ${createdId}`;
202
216
  renderUi();
217
+ const object = createAgentBridgeSceneObject(state, options, result.workingDocument, createdId, getAgentBridgeSafeSceneHierarchy(operations));
218
+ if (!object) {
219
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE, 'Created object is unavailable in the safe Scene Hierarchy projection.', { code: 'object.create.projectionIntegrity' });
220
+ }
203
221
  return {
204
222
  createdId,
205
- object: createAgentBridgeSceneObject(state, options, result.workingDocument, createdId, hierarchy) ?? undefined,
206
- selection: cloneAgentBridgeSelection(selection),
223
+ object,
224
+ selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),
207
225
  };
208
226
  }
209
227
  async function createAgentBridgeObjectFromAsset(state, options, input, renderUi, operations) {
@@ -214,6 +232,9 @@ async function createAgentBridgeObjectFromAsset(state, options, input, renderUi,
214
232
  if (state.mode !== 'editor' || !state.session) {
215
233
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, 'Editor is not in edit mode.', { code: 'editor.notReady' });
216
234
  }
235
+ if (!hasAgentBridgeSafeSceneScope(operations)) {
236
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, 'Scene asset placement is unavailable outside the Scene Hierarchy scope. Use prefab.node.createFromAsset in Prefab Stage.', { code: 'object.sceneScopeRequired' });
237
+ }
217
238
  const asset = findAgentBridgeVisibleAssetInfo(state, options, assetId);
218
239
  if (!asset) {
219
240
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, `Asset not found: ${assetId}`, { code: 'asset.notFound' });
@@ -237,11 +258,30 @@ async function createAgentBridgeObjectFromAsset(state, options, input, renderUi,
237
258
  if (!createdId) {
238
259
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, `Create from asset did not return a created id: ${assetId}`, { code: 'object.createFromAsset.missingCreatedId' });
239
260
  }
261
+ const projectionToken = captureAgentBridgeSceneProjectionToken(operations);
262
+ if (!projectionToken) {
263
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, 'Asset placement completed without a current Scene Hierarchy projection.', { code: 'object.createFromAsset.projectionUnavailable' });
264
+ }
240
265
  await waitForAgentBridgeProjectionIdle(state);
266
+ if (!isAgentBridgeSceneProjectionTokenCurrent(operations, projectionToken)) {
267
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, 'Scene Hierarchy scope or revision changed while asset placement projection was pending.', {
268
+ code: 'object.createFromAsset.staleProjection',
269
+ details: {
270
+ expectedScopeId: projectionToken.scopeId,
271
+ expectedDocumentRevision: projectionToken.documentRevision,
272
+ expectedProjectionRevision: projectionToken.projectionRevision,
273
+ },
274
+ });
275
+ }
241
276
  const document = state.session.getState({ cloneDocuments: false }).workingDocument;
242
- const selection = state.session.getSelection();
277
+ const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);
278
+ const selection = getAgentBridgeSafeSceneSelection(operations);
279
+ const object = createAgentBridgeSceneObject(state, options, document, createdId, hierarchy);
280
+ if (!object) {
281
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET, 'Placed asset object is unavailable in the safe Scene Hierarchy projection.', { code: 'object.createFromAsset.projectionIntegrity' });
282
+ }
243
283
  let focused = false;
244
- if (input.focus === true) {
284
+ if (input.focus === true && hierarchy.some(item => item.id === createdId)) {
245
285
  focused = operations.focusProjectionNode(createdId);
246
286
  if (focused)
247
287
  renderUi();
@@ -249,7 +289,7 @@ async function createAgentBridgeObjectFromAsset(state, options, input, renderUi,
249
289
  return {
250
290
  assetId,
251
291
  createdId,
252
- object: createAgentBridgeSceneObject(state, options, document, createdId, operations.getHierarchy()) ?? undefined,
292
+ object,
253
293
  selection: cloneAgentBridgeSelection(selection),
254
294
  focused,
255
295
  status: result.status,
@@ -264,6 +304,22 @@ async function waitForAgentBridgeProjectionIdle(state) {
264
304
  new Promise(resolve => setTimeout(resolve, OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS)),
265
305
  ]);
266
306
  }
307
+ function captureAgentBridgeSceneProjectionToken(operations) {
308
+ const projection = operations.getHierarchyProjection();
309
+ return projection?.scopeKind === 'scene'
310
+ ? {
311
+ scopeId: projection.scopeId,
312
+ documentRevision: projection.documentRevision,
313
+ projectionRevision: projection.projectionRevision,
314
+ }
315
+ : null;
316
+ }
317
+ function isAgentBridgeSceneProjectionTokenCurrent(operations, expected) {
318
+ const current = captureAgentBridgeSceneProjectionToken(operations);
319
+ return current?.scopeId === expected.scopeId
320
+ && current.documentRevision === expected.documentRevision
321
+ && current.projectionRevision === expected.projectionRevision;
322
+ }
267
323
  function createAgentBridgeAssetPlacement(input) {
268
324
  const hasPosition = input.position !== undefined;
269
325
  const hasRotation = input.rotation !== undefined;
@@ -288,13 +344,22 @@ function deleteAgentBridgeObjects(state, options, input, renderUi, operations) {
288
344
  if (state.mode !== 'editor' || !state.session) {
289
345
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE, 'Editor is not in edit mode.', { code: 'editor.notReady' });
290
346
  }
347
+ if (!hasAgentBridgeSafeSceneScope(operations)) {
348
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE, 'Scene object deletion is unavailable outside the Scene Hierarchy scope.', { code: 'object.sceneScopeRequired' });
349
+ }
291
350
  const document = state.session.getState({ cloneDocuments: false }).workingDocument;
292
351
  const intent = {
293
352
  ids: normalized.ids,
294
353
  activeId: normalized.activeId,
295
354
  };
296
355
  operations.cancelActiveOperation();
297
- const validation = validateSceneGraphDelete(options.documentAdapter.getHierarchyItems(document), intent);
356
+ const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);
357
+ const invalidTargetId = [...intent.ids, intent.activeId]
358
+ .find(id => id && !hierarchy.some(item => item.id === id));
359
+ if (invalidTargetId) {
360
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE, `Delete target is unavailable in the safe Hierarchy projection: ${invalidTargetId}`, { code: 'object.delete.invalidTarget', objectId: invalidTargetId });
361
+ }
362
+ const validation = validateSceneGraphDelete(hierarchy, intent);
298
363
  if (!validation.ok) {
299
364
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE, `Delete rejected: ${validation.reason ?? 'invalid scene graph delete'}.`, { code: 'object.delete.rejected', objectId: normalized.ids[0] });
300
365
  }
@@ -314,11 +379,16 @@ function deleteAgentBridgeObjects(state, options, input, renderUi, operations) {
314
379
  if (!result.documentChanged) {
315
380
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE, 'Delete did not change the document.', { code: 'object.delete.unchanged', objectId: normalized.ids[0] });
316
381
  }
317
- const deletedIds = patch.deletedIds ?? normalized.ids;
318
- const fallbackSelectionId = patch.fallbackSelectionId ?? null;
382
+ const deletedIds = (patch.deletedIds ?? normalized.ids)
383
+ .filter(id => hierarchy.some(item => item.id === id));
384
+ const rawFallbackSelectionId = patch.fallbackSelectionId ?? null;
319
385
  let selection = result.selection;
320
- const hierarchy = options.documentAdapter.getHierarchyItems(result.workingDocument);
321
- if (fallbackSelectionId && isAgentBridgeObjectSelectable(options, result.workingDocument, fallbackSelectionId, hierarchy)) {
386
+ const updatedHierarchy = getAgentBridgeSafeSceneHierarchy(operations);
387
+ const fallbackSelectionId = rawFallbackSelectionId
388
+ && updatedHierarchy.some(item => item.id === rawFallbackSelectionId)
389
+ ? rawFallbackSelectionId
390
+ : null;
391
+ if (fallbackSelectionId && isAgentBridgeHierarchyObjectSelectable(options, result.workingDocument, fallbackSelectionId, updatedHierarchy)) {
322
392
  selection = state.session.dispatch({
323
393
  type: 'selection.replace',
324
394
  selectedIds: [fallbackSelectionId],
@@ -329,6 +399,7 @@ function deleteAgentBridgeObjects(state, options, input, renderUi, operations) {
329
399
  else {
330
400
  selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;
331
401
  }
402
+ selection = reconcileAgentBridgeSafeSceneSelection(state, operations, selection);
332
403
  operations.rebuildProjectionFromDocument(result.workingDocument, selection);
333
404
  state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());
334
405
  state.status = patch.label ?? `Agent deleted ${deletedIds.length} node(s)`;
@@ -336,9 +407,23 @@ function deleteAgentBridgeObjects(state, options, input, renderUi, operations) {
336
407
  return {
337
408
  deletedIds,
338
409
  fallbackSelectionId,
339
- selection: cloneAgentBridgeSelection(selection),
410
+ selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),
340
411
  };
341
412
  }
413
+ function reconcileAgentBridgeSafeSceneSelection(state, operations, currentSelection) {
414
+ const safeSelection = getAgentBridgeSafeSceneSelection(operations);
415
+ if (safeSelection.activeId === currentSelection.activeId
416
+ && safeSelection.selectedIds.length === currentSelection.selectedIds.length
417
+ && safeSelection.selectedIds.every((id, index) => id === currentSelection.selectedIds[index])) {
418
+ return safeSelection;
419
+ }
420
+ return state.session?.dispatch({
421
+ type: 'selection.replace',
422
+ selectedIds: safeSelection.selectedIds,
423
+ activeId: safeSelection.activeId,
424
+ label: 'Agent Reconcile Safe Hierarchy Selection',
425
+ }).selection ?? safeSelection;
426
+ }
342
427
  function agentBridgeObjectMatchesQuery(object, query) {
343
428
  return [
344
429
  object.id,
@@ -1 +1 @@
1
- {"version":3,"file":"scene-objects.js","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/scene-objects.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type EditorTransformSnapshot,\n type EditorSelectionState,\n type SceneGraphCreatePrimitiveIntent,\n type SceneGraphDeleteIntent,\n validateSceneGraphDelete,\n} from '@fps-games/editor-core';\nimport {\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID,\n type EditorAgentBridgeObjectCreateFromAssetInput,\n type EditorAgentBridgeObjectCreateFromAssetOutput,\n type EditorAgentBridgeObjectCreatePrimitiveOutput,\n type EditorAgentBridgeObjectDeleteOutput,\n type EditorAgentBridgeObjectResolveInput,\n type EditorAgentBridgeObjectResolveOutput,\n type EditorAgentBridgePrimitiveShape,\n type EditorAgentBridgeBounds,\n type EditorAgentBridgeSceneObject,\n type EditorAgentBridgeVec3,\n} from '@fps-games/editor-protocol';\nimport type { LocalEditorBrowserUiHierarchyItem } from '@fps-games/editor-browser';\nimport {\n cloneVec3,\n createLocalEditorAgentBridgeFailure,\n editorTransformSnapshotToAgentTransform,\n isLocalEditorAgentBridgeVec3,\n} from '../diagnostics.js';\nimport { findAgentBridgeVisibleAssetInfo } from './assets.js';\nimport type { LocalEditorAgentBridgeObjectSource } from '../source-types.js';\nimport {\n cloneAgentBridgeSelection,\n isAgentBridgeDocumentNodeLocked,\n isAgentBridgeDocumentNodeSelectable,\n isAgentBridgeObjectSelectable,\n normalizeAgentBridgeIdList,\n normalizeAgentBridgeString,\n type LocalEditorAgentBridgeCapabilitySourceOperations,\n type LocalEditorAgentBridgeHarnessState,\n} from '../shared.js';\nimport type { LocalEditorHarnessOptions } from '../../local-editor-harness.js';\n\nconst OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS = 3000;\n\nexport function createLocalEditorAgentBridgeObjectSource<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): LocalEditorAgentBridgeObjectSource {\n return {\n listObjects(input) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) return [];\n return listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true);\n },\n resolveObject(input) {\n return resolveAgentBridgeObject(state, options, input);\n },\n getObject(objectId) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) return null;\n return createAgentBridgeSceneObject(state, options, document, objectId, operations.getHierarchy());\n },\n createPrimitive(input) {\n return createAgentBridgePrimitiveObject(state, options, input, renderUi, operations);\n },\n createFromAsset(input) {\n return createAgentBridgeObjectFromAsset(state, options, input, renderUi, operations);\n },\n deleteObjects(input) {\n return deleteAgentBridgeObjects(state, options, input, renderUi, operations);\n },\n };\n}\n\nexport function listAgentBridgeSceneObjects<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n document: TDocument,\n includeUnselectable: boolean,\n): EditorAgentBridgeSceneObject[] {\n const hierarchy = options.documentAdapter.getHierarchyItems(document);\n return hierarchy\n .map(item => createAgentBridgeSceneObject(state, options, document, item.id, hierarchy))\n .filter((object): object is EditorAgentBridgeSceneObject => !!object)\n .filter(object => includeUnselectable || object.selectable !== false);\n}\n\nexport function createAgentBridgeSceneObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n document: TDocument,\n objectId: string,\n hierarchyItems: readonly LocalEditorBrowserUiHierarchyItem[],\n): EditorAgentBridgeSceneObject | null {\n const item = hierarchyItems.find(candidate => candidate.id === objectId) ?? null;\n const projectionNode = options.documentAdapter.getProjectionNode(document, objectId);\n if (!item && !projectionNode) return null;\n const runtimeTransform = state.projection?.readNodeTransform(objectId) ?? null;\n const documentTransform = projectionNode?.transform ?? null;\n const transform = editorTransformSnapshotToAgentTransform(runtimeTransform ?? documentTransform);\n const bounds = createAgentBridgeSceneObjectBounds(state.projection?.getSelectionBounds([objectId]) ?? null, transform?.position);\n const locked = isAgentBridgeDocumentNodeLocked(options, document, objectId);\n const selectable = isAgentBridgeDocumentNodeSelectable(options, document, objectId);\n return {\n id: objectId,\n name: projectionNode?.name,\n label: item?.label ?? projectionNode?.name ?? objectId,\n type: projectionNode?.runtimeKind ?? projectionNode?.helperKind ?? item?.role,\n path: createAgentBridgeHierarchyPath(objectId, hierarchyItems),\n parentId: item?.parentId ?? projectionNode?.parentId ?? null,\n selectable,\n locked,\n ...(transform ? { transform } : {}),\n ...(bounds ? { bounds } : {}),\n };\n}\n\nfunction createAgentBridgeSceneObjectBounds(\n bounds: unknown,\n fallbackCenter?: EditorAgentBridgeVec3,\n): EditorAgentBridgeBounds | null {\n const record = bounds && typeof bounds === 'object' && !Array.isArray(bounds)\n ? bounds as Record<string, unknown>\n : null;\n const min = record ? readAgentBridgeFiniteVec3(record.min) : null;\n const max = record ? readAgentBridgeFiniteVec3(record.max) : null;\n const size = record ? readAgentBridgeFiniteVec3(record.size) : null;\n const center = record ? readAgentBridgeFiniteVec3(record.center) : null;\n const hasInvertedMinMax = !!min && !!max && (\n min.x > max.x\n || min.y > max.y\n || min.z > max.z\n );\n if (!hasInvertedMinMax && (min || max || size || center)) {\n return {\n ...(min ? { min } : {}),\n ...(max ? { max } : {}),\n ...(size ? { size } : {}),\n ...(center ? { center } : {}),\n };\n }\n if (!fallbackCenter || !isAgentBridgeFiniteVec3(fallbackCenter)) return null;\n const safeCenter = cloneVec3(fallbackCenter);\n return {\n min: cloneVec3(safeCenter),\n max: cloneVec3(safeCenter),\n center: cloneVec3(safeCenter),\n size: { x: 0, y: 0, z: 0 },\n };\n}\n\nfunction readAgentBridgeFiniteVec3(value: unknown): EditorAgentBridgeVec3 | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n const vec3 = {\n x: record.x,\n y: record.y,\n z: record.z,\n };\n return isAgentBridgeFiniteVec3(vec3) ? {\n x: vec3.x,\n y: vec3.y,\n z: vec3.z,\n } : null;\n}\n\nfunction isAgentBridgeFiniteVec3(value: unknown): value is EditorAgentBridgeVec3 {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return Number.isFinite(record.x)\n && Number.isFinite(record.y)\n && Number.isFinite(record.z);\n}\n\nfunction resolveAgentBridgeObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: EditorAgentBridgeObjectResolveInput,\n): EditorAgentBridgeObjectResolveOutput {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) {\n return { objects: [], resolvedObject: null, ambiguous: false };\n }\n const objects = listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true);\n const objectId = normalizeAgentBridgeString(input.objectId);\n const name = normalizeAgentBridgeString(input.name);\n const path = normalizeAgentBridgeString(input.path);\n const type = normalizeAgentBridgeString(input.type);\n const query = normalizeAgentBridgeString(input.query).toLowerCase();\n const matches = objects.filter(object => {\n if (objectId && object.id !== objectId) return false;\n if (name && object.name !== name && object.label !== name) return false;\n if (path && object.path !== path) return false;\n if (type && object.type !== type) return false;\n if (query && !agentBridgeObjectMatchesQuery(object, query)) return false;\n return true;\n });\n return {\n objects: matches,\n resolvedObject: matches.length === 1 ? matches[0] : null,\n ambiguous: matches.length > 1,\n };\n}\n\nfunction createAgentBridgePrimitiveObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: { shape?: unknown; name?: unknown; parentId?: unknown; activeId?: unknown },\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): EditorAgentBridgeObjectCreatePrimitiveOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure> {\n const shape = normalizeAgentBridgeString(input.shape);\n if (!isAgentBridgePrimitiveShape(shape)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'object.createPrimitive requires shape to be cube, sphere, plane, or capsule.',\n { code: 'object.create.invalidInput' },\n );\n }\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n const sessionState = state.session.getState({ cloneDocuments: false });\n const document = sessionState.workingDocument;\n const intent: SceneGraphCreatePrimitiveIntent = {\n shape,\n name: normalizeAgentBridgeString(input.name) || undefined,\n parentId: input.parentId === null ? null : normalizeAgentBridgeString(input.parentId) || null,\n activeId: input.activeId === null ? null : normalizeAgentBridgeString(input.activeId) || sessionState.selection.activeId,\n };\n operations.cancelActiveOperation();\n const patch = options.documentAdapter.createSceneGraphCreatePrimitivePatch?.(document, intent);\n if (!patch) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Primitive patch was not created for shape: ${shape}`,\n { code: 'object.create.patchUnavailable' },\n );\n }\n const result = state.session.dispatch({\n type: 'document.patch',\n label: patch.label ?? `Create ${shape}`,\n patch: patch.patch,\n targetId: patch.createdId ?? undefined,\n ...operations.withProjectionImpact(operations.resolveProjectionImpact(\n patch,\n operations.createKnownCreatedReprojectProjectionImpact({\n createdNodeIds: [patch.createdId],\n reprojectIds: patch.reprojectIds,\n }),\n )),\n });\n if (!result.documentChanged) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Create ${shape} did not change the document.`,\n { code: 'object.create.unchanged' },\n );\n }\n const createdId = patch.createdId ?? null;\n if (!createdId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Create ${shape} did not return a created id.`,\n { code: 'object.create.missingCreatedId' },\n );\n }\n let selection: EditorSelectionState = result.selection;\n const hierarchy = options.documentAdapter.getHierarchyItems(result.workingDocument);\n if (isAgentBridgeObjectSelectable(options, result.workingDocument, createdId, hierarchy)) {\n selection = state.session.dispatch({\n type: 'selection.replace',\n selectedIds: [createdId],\n activeId: createdId,\n label: 'Agent Select Created Primitive',\n }).selection;\n } else {\n selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;\n }\n operations.rebuildProjectionFromDocument(result.workingDocument, selection);\n state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());\n state.status = patch.label ?? `Agent created ${shape} ${createdId}`;\n renderUi();\n return {\n createdId,\n object: createAgentBridgeSceneObject(state, options, result.workingDocument, createdId, hierarchy) ?? undefined,\n selection: cloneAgentBridgeSelection(selection),\n };\n}\n\nasync function createAgentBridgeObjectFromAsset<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: EditorAgentBridgeObjectCreateFromAssetInput,\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): Promise<EditorAgentBridgeObjectCreateFromAssetOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure>> {\n const assetId = normalizeAgentBridgeString(input.assetId);\n if (!assetId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'object.createFromAsset requires assetId.',\n { code: 'object.createFromAsset.invalidInput' },\n );\n }\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n const asset = findAgentBridgeVisibleAssetInfo(state, options, assetId);\n if (!asset) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Asset not found: ${assetId}`,\n { code: 'asset.notFound' },\n );\n }\n if (asset.placeable === false) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Asset is not placeable: ${assetId}`,\n { code: 'asset.unplaceable' },\n );\n }\n const placement = createAgentBridgeAssetPlacement(input);\n if (placement === false) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'object.createFromAsset position, rotation, and scale must be finite vec3 values when supplied.',\n { code: 'object.createFromAsset.invalidTransform' },\n );\n }\n const result = operations.createAssetFromAssetId(assetId, {\n name: normalizeAgentBridgeString(input.name) || undefined,\n placement,\n select: input.select !== false,\n });\n if (!result.ok) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n result.status || `Create from asset failed: ${assetId}`,\n { code: result.error ?? 'object.createFromAsset.failed' },\n );\n }\n const createdId = normalizeAgentBridgeString(result.createdId);\n if (!createdId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Create from asset did not return a created id: ${assetId}`,\n { code: 'object.createFromAsset.missingCreatedId' },\n );\n }\n await waitForAgentBridgeProjectionIdle(state);\n const document = state.session.getState({ cloneDocuments: false }).workingDocument;\n const selection = state.session.getSelection();\n let focused = false;\n if (input.focus === true) {\n focused = operations.focusProjectionNode(createdId);\n if (focused) renderUi();\n }\n return {\n assetId,\n createdId,\n object: createAgentBridgeSceneObject(state, options, document, createdId, operations.getHierarchy()) ?? undefined,\n selection: cloneAgentBridgeSelection(selection),\n focused,\n status: result.status,\n };\n}\n\nasync function waitForAgentBridgeProjectionIdle<TDocument, TPatch>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n): Promise<void> {\n const waitForIdle = state.projection?.waitForIdle;\n if (!waitForIdle) return;\n await Promise.race([\n waitForIdle.call(state.projection),\n new Promise(resolve => setTimeout(resolve, OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS)),\n ]);\n}\n\nfunction createAgentBridgeAssetPlacement(input: EditorAgentBridgeObjectCreateFromAssetInput): EditorTransformSnapshot | undefined | false {\n const hasPosition = input.position !== undefined;\n const hasRotation = input.rotation !== undefined;\n const hasScale = input.scale !== undefined;\n if (!hasPosition && !hasRotation && !hasScale) return undefined;\n if (\n (hasPosition && !isLocalEditorAgentBridgeVec3(input.position))\n || (hasRotation && !isLocalEditorAgentBridgeVec3(input.rotation))\n || (hasScale && !isLocalEditorAgentBridgeVec3(input.scale))\n ) {\n return false;\n }\n return {\n position: hasPosition && input.position ? cloneVec3(input.position) : { x: 0, y: 0, z: 0 },\n rotation: hasRotation && input.rotation ? cloneVec3(input.rotation) : { x: 0, y: 0, z: 0 },\n scale: hasScale && input.scale ? cloneVec3(input.scale) : { x: 1, y: 1, z: 1 },\n };\n}\n\nfunction deleteAgentBridgeObjects<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: { objectId?: unknown; objectIds?: unknown; activeId?: unknown },\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): EditorAgentBridgeObjectDeleteOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure> {\n const normalized = normalizeAgentBridgeDeleteInput(input);\n if (!normalized.ok) return normalized.result;\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n const document = state.session.getState({ cloneDocuments: false }).workingDocument;\n const intent: SceneGraphDeleteIntent = {\n ids: normalized.ids,\n activeId: normalized.activeId,\n };\n operations.cancelActiveOperation();\n const validation = validateSceneGraphDelete(options.documentAdapter.getHierarchyItems(document), intent);\n if (!validation.ok) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n `Delete rejected: ${validation.reason ?? 'invalid scene graph delete'}.`,\n { code: 'object.delete.rejected', objectId: normalized.ids[0] },\n );\n }\n const patch = options.documentAdapter.createSceneGraphDeletePatch?.(document, intent);\n if (!patch) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Delete patch was not created.',\n { code: 'object.delete.patchUnavailable', objectId: normalized.ids[0] },\n );\n }\n const result = state.session.dispatch({\n type: 'document.patch',\n label: patch.label ?? `Delete ${intent.ids.length} node(s)`,\n patch: patch.patch,\n targetId: intent.activeId ?? undefined,\n ...operations.withProjectionImpact(operations.resolveProjectionImpact(\n patch,\n patch.deletedIds\n ? operations.createDeletedNodeProjectionImpact(patch.deletedIds)\n : undefined,\n )),\n });\n if (!result.documentChanged) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Delete did not change the document.',\n { code: 'object.delete.unchanged', objectId: normalized.ids[0] },\n );\n }\n const deletedIds = patch.deletedIds ?? normalized.ids;\n const fallbackSelectionId = patch.fallbackSelectionId ?? null;\n let selection: EditorSelectionState = result.selection;\n const hierarchy = options.documentAdapter.getHierarchyItems(result.workingDocument);\n if (fallbackSelectionId && isAgentBridgeObjectSelectable(options, result.workingDocument, fallbackSelectionId, hierarchy)) {\n selection = state.session.dispatch({\n type: 'selection.replace',\n selectedIds: [fallbackSelectionId],\n activeId: fallbackSelectionId,\n label: 'Agent Select Delete Fallback',\n }).selection;\n } else {\n selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;\n }\n operations.rebuildProjectionFromDocument(result.workingDocument, selection);\n state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());\n state.status = patch.label ?? `Agent deleted ${deletedIds.length} node(s)`;\n renderUi();\n return {\n deletedIds,\n fallbackSelectionId,\n selection: cloneAgentBridgeSelection(selection),\n };\n}\n\nfunction agentBridgeObjectMatchesQuery(object: EditorAgentBridgeSceneObject, query: string): boolean {\n return [\n object.id,\n object.name,\n object.label,\n object.type,\n object.path,\n ].some(value => typeof value === 'string' && value.toLowerCase().includes(query));\n}\n\nfunction createAgentBridgeHierarchyPath(\n objectId: string,\n hierarchyItems: readonly LocalEditorBrowserUiHierarchyItem[],\n): string | undefined {\n const byId = new Map(hierarchyItems.map(item => [item.id, item]));\n const path: string[] = [];\n const seen = new Set<string>();\n let cursor = byId.get(objectId) ?? null;\n while (cursor && !seen.has(cursor.id)) {\n seen.add(cursor.id);\n path.unshift(cursor.label || cursor.id);\n cursor = cursor.parentId ? byId.get(cursor.parentId) ?? null : null;\n }\n return path.length > 0 ? path.join(' / ') : undefined;\n}\n\nfunction isAgentBridgePrimitiveShape(value: string): value is EditorAgentBridgePrimitiveShape {\n return value === 'cube' || value === 'sphere' || value === 'plane' || value === 'capsule';\n}\n\nfunction normalizeAgentBridgeDeleteInput(\n input: { objectId?: unknown; objectIds?: unknown; activeId?: unknown },\n): { ok: true; ids: string[]; activeId: string | null } | { ok: false; result: ReturnType<typeof createLocalEditorAgentBridgeFailure> } {\n const objectId = normalizeAgentBridgeString(input.objectId);\n const hasObjectId = objectId.length > 0;\n const hasObjectIds = Array.isArray(input.objectIds);\n if (hasObjectId === hasObjectIds) {\n return {\n ok: false,\n result: createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'object.delete requires exactly one of objectId or objectIds.',\n { code: 'object.delete.invalidInput', objectId: objectId || undefined },\n ),\n };\n }\n const ids = hasObjectId\n ? [objectId]\n : normalizeAgentBridgeIdList(input.objectIds as unknown[]);\n if (ids.length === 0) {\n return {\n ok: false,\n result: createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'object.delete requires at least one object id.',\n { code: 'object.delete.invalidInput' },\n ),\n };\n }\n const requestedActiveId = normalizeAgentBridgeString(input.activeId);\n return {\n ok: true,\n ids,\n activeId: requestedActiveId && ids.includes(requestedActiveId)\n ? requestedActiveId\n : ids[ids.length - 1] ?? null,\n };\n}\n"]}
1
+ {"version":3,"file":"scene-objects.js","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/scene-objects.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type EditorTransformSnapshot,\n type EditorSelectionState,\n type SceneGraphCreatePrimitiveIntent,\n type SceneGraphDeleteIntent,\n validateSceneGraphDelete,\n} from '@fps-games/editor-core';\nimport {\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID,\n type EditorAgentBridgeObjectCreateFromAssetInput,\n type EditorAgentBridgeObjectCreateFromAssetOutput,\n type EditorAgentBridgeObjectCreatePrimitiveOutput,\n type EditorAgentBridgeObjectDeleteOutput,\n type EditorAgentBridgeObjectResolveInput,\n type EditorAgentBridgeObjectResolveOutput,\n type EditorAgentBridgePrimitiveShape,\n type EditorAgentBridgeBounds,\n type EditorAgentBridgeSceneObject,\n type EditorAgentBridgeVec3,\n} from '@fps-games/editor-protocol';\nimport type { LocalEditorBrowserUiHierarchyItem } from '@fps-games/editor-browser';\nimport {\n cloneVec3,\n createLocalEditorAgentBridgeFailure,\n editorTransformSnapshotToAgentTransform,\n isLocalEditorAgentBridgeVec3,\n} from '../diagnostics.js';\nimport { findAgentBridgeVisibleAssetInfo } from './assets.js';\nimport type { LocalEditorAgentBridgeObjectSource } from '../source-types.js';\nimport {\n cloneAgentBridgeSelection,\n getAgentBridgeSafeSceneHierarchy,\n getAgentBridgeSafeSceneSelection,\n hasAgentBridgeSafeSceneScope,\n isAgentBridgeDocumentNodeLocked,\n isAgentBridgeDocumentNodeSelectable,\n isAgentBridgeHierarchyObjectSelectable,\n normalizeAgentBridgeIdList,\n normalizeAgentBridgeString,\n type LocalEditorAgentBridgeCapabilitySourceOperations,\n type LocalEditorAgentBridgeHarnessState,\n} from '../shared.js';\nimport type { LocalEditorHarnessOptions } from '../../local-editor-harness.js';\n\nconst OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS = 3000;\n\nexport function createLocalEditorAgentBridgeObjectSource<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): LocalEditorAgentBridgeObjectSource {\n return {\n listObjects(input) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) return [];\n return listAgentBridgeSceneObjects(state, options, document, input.includeUnselectable === true, operations);\n },\n resolveObject(input) {\n return resolveAgentBridgeObject(state, options, input, operations);\n },\n getObject(objectId) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) return null;\n return createAgentBridgeSceneObject(\n state,\n options,\n document,\n objectId,\n getAgentBridgeSafeSceneHierarchy(operations),\n );\n },\n createPrimitive(input) {\n return createAgentBridgePrimitiveObject(state, options, input, renderUi, operations);\n },\n createFromAsset(input) {\n return createAgentBridgeObjectFromAsset(state, options, input, renderUi, operations);\n },\n deleteObjects(input) {\n return deleteAgentBridgeObjects(state, options, input, renderUi, operations);\n },\n };\n}\n\nexport function listAgentBridgeSceneObjects<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n document: TDocument,\n includeUnselectable: boolean,\n operations: Pick<LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>, 'getHierarchyProjection'>,\n): EditorAgentBridgeSceneObject[] {\n const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n return hierarchy\n .map(item => createAgentBridgeSceneObject(state, options, document, item.id, hierarchy))\n .filter((object): object is EditorAgentBridgeSceneObject => !!object)\n .filter(object => includeUnselectable || object.selectable !== false);\n}\n\nexport function createAgentBridgeSceneObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n document: TDocument,\n objectId: string,\n hierarchyItems: readonly LocalEditorBrowserUiHierarchyItem[],\n): EditorAgentBridgeSceneObject | null {\n const item = hierarchyItems.find(candidate => candidate.id === objectId) ?? null;\n if (!item) return null;\n const projectionNode = options.documentAdapter.getProjectionNode(document, objectId);\n const runtimeTransform = state.projection?.readNodeTransform(objectId) ?? null;\n const documentTransform = projectionNode?.transform ?? null;\n const transform = editorTransformSnapshotToAgentTransform(runtimeTransform ?? documentTransform);\n const bounds = createAgentBridgeSceneObjectBounds(state.projection?.getSelectionBounds([objectId]) ?? null, transform?.position);\n const locked = isAgentBridgeDocumentNodeLocked(options, document, objectId);\n const selectable = isAgentBridgeDocumentNodeSelectable(options, document, objectId);\n return {\n id: objectId,\n name: projectionNode?.name,\n label: item?.label ?? projectionNode?.name ?? objectId,\n type: projectionNode?.runtimeKind ?? projectionNode?.helperKind ?? item?.role,\n path: createAgentBridgeHierarchyPath(objectId, hierarchyItems),\n parentId: item?.parentId ?? projectionNode?.parentId ?? null,\n selectable,\n locked,\n ...(transform ? { transform } : {}),\n ...(bounds ? { bounds } : {}),\n };\n}\n\nfunction createAgentBridgeSceneObjectBounds(\n bounds: unknown,\n fallbackCenter?: EditorAgentBridgeVec3,\n): EditorAgentBridgeBounds | null {\n const record = bounds && typeof bounds === 'object' && !Array.isArray(bounds)\n ? bounds as Record<string, unknown>\n : null;\n const min = record ? readAgentBridgeFiniteVec3(record.min) : null;\n const max = record ? readAgentBridgeFiniteVec3(record.max) : null;\n const size = record ? readAgentBridgeFiniteVec3(record.size) : null;\n const center = record ? readAgentBridgeFiniteVec3(record.center) : null;\n const hasInvertedMinMax = !!min && !!max && (\n min.x > max.x\n || min.y > max.y\n || min.z > max.z\n );\n if (!hasInvertedMinMax && (min || max || size || center)) {\n return {\n ...(min ? { min } : {}),\n ...(max ? { max } : {}),\n ...(size ? { size } : {}),\n ...(center ? { center } : {}),\n };\n }\n if (!fallbackCenter || !isAgentBridgeFiniteVec3(fallbackCenter)) return null;\n const safeCenter = cloneVec3(fallbackCenter);\n return {\n min: cloneVec3(safeCenter),\n max: cloneVec3(safeCenter),\n center: cloneVec3(safeCenter),\n size: { x: 0, y: 0, z: 0 },\n };\n}\n\nfunction readAgentBridgeFiniteVec3(value: unknown): EditorAgentBridgeVec3 | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n const vec3 = {\n x: record.x,\n y: record.y,\n z: record.z,\n };\n return isAgentBridgeFiniteVec3(vec3) ? {\n x: vec3.x,\n y: vec3.y,\n z: vec3.z,\n } : null;\n}\n\nfunction isAgentBridgeFiniteVec3(value: unknown): value is EditorAgentBridgeVec3 {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return Number.isFinite(record.x)\n && Number.isFinite(record.y)\n && Number.isFinite(record.z);\n}\n\nfunction resolveAgentBridgeObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: EditorAgentBridgeObjectResolveInput,\n operations: Pick<LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>, 'getHierarchyProjection'>,\n): EditorAgentBridgeObjectResolveOutput {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n if (state.mode !== 'editor' || !document) {\n return { objects: [], resolvedObject: null, ambiguous: false };\n }\n const objects = listAgentBridgeSceneObjects(\n state,\n options,\n document,\n input.includeUnselectable === true,\n operations,\n );\n const objectId = normalizeAgentBridgeString(input.objectId);\n const name = normalizeAgentBridgeString(input.name);\n const path = normalizeAgentBridgeString(input.path);\n const type = normalizeAgentBridgeString(input.type);\n const query = normalizeAgentBridgeString(input.query).toLowerCase();\n const matches = objects.filter(object => {\n if (objectId && object.id !== objectId) return false;\n if (name && object.name !== name && object.label !== name) return false;\n if (path && object.path !== path) return false;\n if (type && object.type !== type) return false;\n if (query && !agentBridgeObjectMatchesQuery(object, query)) return false;\n return true;\n });\n return {\n objects: matches,\n resolvedObject: matches.length === 1 ? matches[0] : null,\n ambiguous: matches.length > 1,\n };\n}\n\nfunction createAgentBridgePrimitiveObject<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: { shape?: unknown; name?: unknown; parentId?: unknown; activeId?: unknown },\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): EditorAgentBridgeObjectCreatePrimitiveOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure> {\n const shape = normalizeAgentBridgeString(input.shape);\n if (!isAgentBridgePrimitiveShape(shape)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'object.createPrimitive requires shape to be cube, sphere, plane, or capsule.',\n { code: 'object.create.invalidInput' },\n );\n }\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n if (!hasAgentBridgeSafeSceneScope(operations)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'Scene object creation is unavailable outside the Scene Hierarchy scope.',\n { code: 'object.sceneScopeRequired' },\n );\n }\n const sessionState = state.session.getState({ cloneDocuments: false });\n const document = sessionState.workingDocument;\n const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n const requestedParentId = input.parentId === null ? null : normalizeAgentBridgeString(input.parentId) || null;\n const requestedActiveId = input.activeId === null\n ? null\n : normalizeAgentBridgeString(input.activeId) || getAgentBridgeSafeSceneSelection(operations).activeId;\n const invalidTargetId = [requestedParentId, requestedActiveId]\n .find(id => id && !hierarchy.some(item => item.id === id));\n if (invalidTargetId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Create target is unavailable in the safe Hierarchy projection: ${invalidTargetId}`,\n { code: 'object.create.invalidTarget', objectId: invalidTargetId },\n );\n }\n const intent: SceneGraphCreatePrimitiveIntent = {\n shape,\n name: normalizeAgentBridgeString(input.name) || undefined,\n parentId: requestedParentId,\n activeId: requestedActiveId,\n };\n operations.cancelActiveOperation();\n const patch = options.documentAdapter.createSceneGraphCreatePrimitivePatch?.(document, intent);\n if (!patch) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Primitive patch was not created for shape: ${shape}`,\n { code: 'object.create.patchUnavailable' },\n );\n }\n const result = state.session.dispatch({\n type: 'document.patch',\n label: patch.label ?? `Create ${shape}`,\n patch: patch.patch,\n targetId: patch.createdId ?? undefined,\n ...operations.withProjectionImpact(operations.resolveProjectionImpact(\n patch,\n operations.createKnownCreatedReprojectProjectionImpact({\n createdNodeIds: [patch.createdId],\n reprojectIds: patch.reprojectIds,\n }),\n )),\n });\n if (!result.documentChanged) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Create ${shape} did not change the document.`,\n { code: 'object.create.unchanged' },\n );\n }\n const createdId = patch.createdId ?? null;\n if (!createdId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n `Create ${shape} did not return a created id.`,\n { code: 'object.create.missingCreatedId' },\n );\n }\n let selection: EditorSelectionState = result.selection;\n const updatedHierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n if (isAgentBridgeHierarchyObjectSelectable(options, result.workingDocument, createdId, updatedHierarchy)) {\n selection = state.session.dispatch({\n type: 'selection.replace',\n selectedIds: [createdId],\n activeId: createdId,\n label: 'Agent Select Created Primitive',\n }).selection;\n } else {\n selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;\n }\n selection = reconcileAgentBridgeSafeSceneSelection(state, operations, selection);\n operations.rebuildProjectionFromDocument(result.workingDocument, selection);\n state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());\n state.status = patch.label ?? `Agent created ${shape} ${createdId}`;\n renderUi();\n const object = createAgentBridgeSceneObject(\n state,\n options,\n result.workingDocument,\n createdId,\n getAgentBridgeSafeSceneHierarchy(operations),\n );\n if (!object) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_PRIMITIVE,\n 'Created object is unavailable in the safe Scene Hierarchy projection.',\n { code: 'object.create.projectionIntegrity' },\n );\n }\n return {\n createdId,\n object,\n selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),\n };\n}\n\nasync function createAgentBridgeObjectFromAsset<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: EditorAgentBridgeObjectCreateFromAssetInput,\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): Promise<EditorAgentBridgeObjectCreateFromAssetOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure>> {\n const assetId = normalizeAgentBridgeString(input.assetId);\n if (!assetId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'object.createFromAsset requires assetId.',\n { code: 'object.createFromAsset.invalidInput' },\n );\n }\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n if (!hasAgentBridgeSafeSceneScope(operations)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Scene asset placement is unavailable outside the Scene Hierarchy scope. Use prefab.node.createFromAsset in Prefab Stage.',\n { code: 'object.sceneScopeRequired' },\n );\n }\n const asset = findAgentBridgeVisibleAssetInfo(state, options, assetId);\n if (!asset) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Asset not found: ${assetId}`,\n { code: 'asset.notFound' },\n );\n }\n if (asset.placeable === false) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Asset is not placeable: ${assetId}`,\n { code: 'asset.unplaceable' },\n );\n }\n const placement = createAgentBridgeAssetPlacement(input);\n if (placement === false) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'object.createFromAsset position, rotation, and scale must be finite vec3 values when supplied.',\n { code: 'object.createFromAsset.invalidTransform' },\n );\n }\n const result = operations.createAssetFromAssetId(assetId, {\n name: normalizeAgentBridgeString(input.name) || undefined,\n placement,\n select: input.select !== false,\n });\n if (!result.ok) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n result.status || `Create from asset failed: ${assetId}`,\n { code: result.error ?? 'object.createFromAsset.failed' },\n );\n }\n const createdId = normalizeAgentBridgeString(result.createdId);\n if (!createdId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n `Create from asset did not return a created id: ${assetId}`,\n { code: 'object.createFromAsset.missingCreatedId' },\n );\n }\n const projectionToken = captureAgentBridgeSceneProjectionToken(operations);\n if (!projectionToken) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Asset placement completed without a current Scene Hierarchy projection.',\n { code: 'object.createFromAsset.projectionUnavailable' },\n );\n }\n await waitForAgentBridgeProjectionIdle(state);\n if (!isAgentBridgeSceneProjectionTokenCurrent(operations, projectionToken)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Scene Hierarchy scope or revision changed while asset placement projection was pending.',\n {\n code: 'object.createFromAsset.staleProjection',\n details: {\n expectedScopeId: projectionToken.scopeId,\n expectedDocumentRevision: projectionToken.documentRevision,\n expectedProjectionRevision: projectionToken.projectionRevision,\n },\n },\n );\n }\n const document = state.session.getState({ cloneDocuments: false }).workingDocument;\n const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n const selection = getAgentBridgeSafeSceneSelection(operations);\n const object = createAgentBridgeSceneObject(state, options, document, createdId, hierarchy);\n if (!object) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_CREATE_FROM_ASSET,\n 'Placed asset object is unavailable in the safe Scene Hierarchy projection.',\n { code: 'object.createFromAsset.projectionIntegrity' },\n );\n }\n let focused = false;\n if (input.focus === true && hierarchy.some(item => item.id === createdId)) {\n focused = operations.focusProjectionNode(createdId);\n if (focused) renderUi();\n }\n return {\n assetId,\n createdId,\n object,\n selection: cloneAgentBridgeSelection(selection),\n focused,\n status: result.status,\n };\n}\n\nasync function waitForAgentBridgeProjectionIdle<TDocument, TPatch>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n): Promise<void> {\n const waitForIdle = state.projection?.waitForIdle;\n if (!waitForIdle) return;\n await Promise.race([\n waitForIdle.call(state.projection),\n new Promise(resolve => setTimeout(resolve, OBJECT_CREATE_FROM_ASSET_PROJECTION_WAIT_MS)),\n ]);\n}\n\ninterface AgentBridgeSceneProjectionToken {\n scopeId: string;\n documentRevision: number;\n projectionRevision: number;\n}\n\nfunction captureAgentBridgeSceneProjectionToken<TDocument>(\n operations: Pick<LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>, 'getHierarchyProjection'>,\n): AgentBridgeSceneProjectionToken | null {\n const projection = operations.getHierarchyProjection();\n return projection?.scopeKind === 'scene'\n ? {\n scopeId: projection.scopeId,\n documentRevision: projection.documentRevision,\n projectionRevision: projection.projectionRevision,\n }\n : null;\n}\n\nfunction isAgentBridgeSceneProjectionTokenCurrent<TDocument>(\n operations: Pick<LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>, 'getHierarchyProjection'>,\n expected: AgentBridgeSceneProjectionToken,\n): boolean {\n const current = captureAgentBridgeSceneProjectionToken(operations);\n return current?.scopeId === expected.scopeId\n && current.documentRevision === expected.documentRevision\n && current.projectionRevision === expected.projectionRevision;\n}\n\nfunction createAgentBridgeAssetPlacement(input: EditorAgentBridgeObjectCreateFromAssetInput): EditorTransformSnapshot | undefined | false {\n const hasPosition = input.position !== undefined;\n const hasRotation = input.rotation !== undefined;\n const hasScale = input.scale !== undefined;\n if (!hasPosition && !hasRotation && !hasScale) return undefined;\n if (\n (hasPosition && !isLocalEditorAgentBridgeVec3(input.position))\n || (hasRotation && !isLocalEditorAgentBridgeVec3(input.rotation))\n || (hasScale && !isLocalEditorAgentBridgeVec3(input.scale))\n ) {\n return false;\n }\n return {\n position: hasPosition && input.position ? cloneVec3(input.position) : { x: 0, y: 0, z: 0 },\n rotation: hasRotation && input.rotation ? cloneVec3(input.rotation) : { x: 0, y: 0, z: 0 },\n scale: hasScale && input.scale ? cloneVec3(input.scale) : { x: 1, y: 1, z: 1 },\n };\n}\n\nfunction deleteAgentBridgeObjects<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n input: { objectId?: unknown; objectIds?: unknown; activeId?: unknown },\n renderUi: () => void,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): EditorAgentBridgeObjectDeleteOutput | ReturnType<typeof createLocalEditorAgentBridgeFailure> {\n const normalized = normalizeAgentBridgeDeleteInput(input);\n if (!normalized.ok) return normalized.result;\n if (state.mode !== 'editor' || !state.session) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Editor is not in edit mode.',\n { code: 'editor.notReady' },\n );\n }\n if (!hasAgentBridgeSafeSceneScope(operations)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Scene object deletion is unavailable outside the Scene Hierarchy scope.',\n { code: 'object.sceneScopeRequired' },\n );\n }\n const document = state.session.getState({ cloneDocuments: false }).workingDocument;\n const intent: SceneGraphDeleteIntent = {\n ids: normalized.ids,\n activeId: normalized.activeId,\n };\n operations.cancelActiveOperation();\n const hierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n const invalidTargetId = [...intent.ids, intent.activeId]\n .find(id => id && !hierarchy.some(item => item.id === id));\n if (invalidTargetId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n `Delete target is unavailable in the safe Hierarchy projection: ${invalidTargetId}`,\n { code: 'object.delete.invalidTarget', objectId: invalidTargetId },\n );\n }\n const validation = validateSceneGraphDelete(hierarchy, intent);\n if (!validation.ok) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n `Delete rejected: ${validation.reason ?? 'invalid scene graph delete'}.`,\n { code: 'object.delete.rejected', objectId: normalized.ids[0] },\n );\n }\n const patch = options.documentAdapter.createSceneGraphDeletePatch?.(document, intent);\n if (!patch) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Delete patch was not created.',\n { code: 'object.delete.patchUnavailable', objectId: normalized.ids[0] },\n );\n }\n const result = state.session.dispatch({\n type: 'document.patch',\n label: patch.label ?? `Delete ${intent.ids.length} node(s)`,\n patch: patch.patch,\n targetId: intent.activeId ?? undefined,\n ...operations.withProjectionImpact(operations.resolveProjectionImpact(\n patch,\n patch.deletedIds\n ? operations.createDeletedNodeProjectionImpact(patch.deletedIds)\n : undefined,\n )),\n });\n if (!result.documentChanged) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'Delete did not change the document.',\n { code: 'object.delete.unchanged', objectId: normalized.ids[0] },\n );\n }\n const deletedIds = (patch.deletedIds ?? normalized.ids)\n .filter(id => hierarchy.some(item => item.id === id));\n const rawFallbackSelectionId = patch.fallbackSelectionId ?? null;\n let selection: EditorSelectionState = result.selection;\n const updatedHierarchy = getAgentBridgeSafeSceneHierarchy(operations);\n const fallbackSelectionId = rawFallbackSelectionId\n && updatedHierarchy.some(item => item.id === rawFallbackSelectionId)\n ? rawFallbackSelectionId\n : null;\n if (fallbackSelectionId && isAgentBridgeHierarchyObjectSelectable(options, result.workingDocument, fallbackSelectionId, updatedHierarchy)) {\n selection = state.session.dispatch({\n type: 'selection.replace',\n selectedIds: [fallbackSelectionId],\n activeId: fallbackSelectionId,\n label: 'Agent Select Delete Fallback',\n }).selection;\n } else {\n selection = operations.sanitizeSelection(result.workingDocument, selection) ?? selection;\n }\n selection = reconcileAgentBridgeSafeSceneSelection(state, operations, selection);\n operations.rebuildProjectionFromDocument(result.workingDocument, selection);\n state.summary = operations.summarizeDocument(result.workingDocument, state.session.getSource());\n state.status = patch.label ?? `Agent deleted ${deletedIds.length} node(s)`;\n renderUi();\n return {\n deletedIds,\n fallbackSelectionId,\n selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),\n };\n}\n\nfunction reconcileAgentBridgeSafeSceneSelection<TDocument, TPatch>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n operations: Pick<LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>, 'getHierarchyProjection'>,\n currentSelection: EditorSelectionState,\n): EditorSelectionState {\n const safeSelection = getAgentBridgeSafeSceneSelection(operations);\n if (safeSelection.activeId === currentSelection.activeId\n && safeSelection.selectedIds.length === currentSelection.selectedIds.length\n && safeSelection.selectedIds.every((id, index) => id === currentSelection.selectedIds[index])) {\n return safeSelection;\n }\n return state.session?.dispatch({\n type: 'selection.replace',\n selectedIds: safeSelection.selectedIds,\n activeId: safeSelection.activeId,\n label: 'Agent Reconcile Safe Hierarchy Selection',\n }).selection ?? safeSelection;\n}\n\nfunction agentBridgeObjectMatchesQuery(object: EditorAgentBridgeSceneObject, query: string): boolean {\n return [\n object.id,\n object.name,\n object.label,\n object.type,\n object.path,\n ].some(value => typeof value === 'string' && value.toLowerCase().includes(query));\n}\n\nfunction createAgentBridgeHierarchyPath(\n objectId: string,\n hierarchyItems: readonly LocalEditorBrowserUiHierarchyItem[],\n): string | undefined {\n const byId = new Map(hierarchyItems.map(item => [item.id, item]));\n const path: string[] = [];\n const seen = new Set<string>();\n let cursor = byId.get(objectId) ?? null;\n while (cursor && !seen.has(cursor.id)) {\n seen.add(cursor.id);\n path.unshift(cursor.label || cursor.id);\n cursor = cursor.parentId ? byId.get(cursor.parentId) ?? null : null;\n }\n return path.length > 0 ? path.join(' / ') : undefined;\n}\n\nfunction isAgentBridgePrimitiveShape(value: string): value is EditorAgentBridgePrimitiveShape {\n return value === 'cube' || value === 'sphere' || value === 'plane' || value === 'capsule';\n}\n\nfunction normalizeAgentBridgeDeleteInput(\n input: { objectId?: unknown; objectIds?: unknown; activeId?: unknown },\n): { ok: true; ids: string[]; activeId: string | null } | { ok: false; result: ReturnType<typeof createLocalEditorAgentBridgeFailure> } {\n const objectId = normalizeAgentBridgeString(input.objectId);\n const hasObjectId = objectId.length > 0;\n const hasObjectIds = Array.isArray(input.objectIds);\n if (hasObjectId === hasObjectIds) {\n return {\n ok: false,\n result: createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'object.delete requires exactly one of objectId or objectIds.',\n { code: 'object.delete.invalidInput', objectId: objectId || undefined },\n ),\n };\n }\n const ids = hasObjectId\n ? [objectId]\n : normalizeAgentBridgeIdList(input.objectIds as unknown[]);\n if (ids.length === 0) {\n return {\n ok: false,\n result: createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.OBJECT_DELETE,\n 'object.delete requires at least one object id.',\n { code: 'object.delete.invalidInput' },\n ),\n };\n }\n const requestedActiveId = normalizeAgentBridgeString(input.activeId);\n return {\n ok: true,\n ids,\n activeId: requestedActiveId && ids.includes(requestedActiveId)\n ? requestedActiveId\n : ids[ids.length - 1] ?? null,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/selection.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAIL,KAAK,gDAAgD,EACrD,KAAK,kCAAkC,EACxC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/E,wBAAgB,2CAA2C,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EACnF,KAAK,EAAE,kCAAkC,CAAC,SAAS,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7D,UAAU,EAAE,gDAAgD,CAAC,SAAS,CAAC,GACtE,qCAAqC,CA+CvC"}
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/selection.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAML,KAAK,gDAAgD,EACrD,KAAK,kCAAkC,EACxC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/E,wBAAgB,2CAA2C,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EACnF,KAAK,EAAE,kCAAkC,CAAC,SAAS,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7D,UAAU,EAAE,gDAAgD,CAAC,SAAS,CAAC,GACtE,qCAAqC,CAoDvC"}
@@ -1,12 +1,15 @@
1
1
  import { EDITOR_AGENT_BRIDGE_CAPABILITY_ID, } from '@fps-games/editor-protocol';
2
2
  import { createLocalEditorAgentBridgeFailure } from '../diagnostics.js';
3
- import { cloneAgentBridgeSelection, EMPTY_EDITOR_SELECTION, isAgentBridgeObjectSelectable, } from '../shared.js';
3
+ import { cloneAgentBridgeSelection, getAgentBridgeSafeSceneHierarchy, getAgentBridgeSafeSceneSelection, hasAgentBridgeSafeSceneScope, isAgentBridgeHierarchyObjectSelectable, } from '../shared.js';
4
4
  export function createLocalEditorAgentBridgeSelectionSource(state, options, operations) {
5
5
  return {
6
6
  getSelection() {
7
- return cloneAgentBridgeSelection(state.session?.getState({ cloneDocuments: false }).selection ?? EMPTY_EDITOR_SELECTION);
7
+ return cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations));
8
8
  },
9
9
  setSelection(input) {
10
+ if (!hasAgentBridgeSafeSceneScope(operations)) {
11
+ return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET, 'Scene selection is unavailable outside the Scene Hierarchy scope.', { code: 'selection.sceneScopeRequired' });
12
+ }
10
13
  const objectIds = normalizeAgentBridgeSelectionInput(input);
11
14
  if (!objectIds) {
12
15
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET, 'selection.set requires objectId or objectIds.', { code: 'selection.invalidInput' });
@@ -16,8 +19,8 @@ export function createLocalEditorAgentBridgeSelectionSource(state, options, oper
16
19
  : objectIds[objectIds.length - 1] ?? null;
17
20
  if (objectIds.length > 0) {
18
21
  const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;
19
- const hierarchy = document ? options.documentAdapter.getHierarchyItems(document) : [];
20
- const invalidId = objectIds.find(id => !document || !isAgentBridgeObjectSelectable(options, document, id, hierarchy));
22
+ const hierarchy = document ? getAgentBridgeSafeSceneHierarchy(operations) : [];
23
+ const invalidId = objectIds.find(id => !document || !isAgentBridgeHierarchyObjectSelectable(options, document, id, hierarchy));
21
24
  if (invalidId) {
22
25
  return createLocalEditorAgentBridgeFailure(EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET, `Object is not selectable: ${invalidId}`, { code: 'selection.notSelectable', objectId: invalidId });
23
26
  }
@@ -32,7 +35,7 @@ export function createLocalEditorAgentBridgeSelectionSource(state, options, oper
32
35
  : { type: 'selection.clear', label: 'Agent Selection' };
33
36
  operations.dispatchSelectionCommand(command, true);
34
37
  return {
35
- selection: cloneAgentBridgeSelection(state.session?.getState({ cloneDocuments: false }).selection ?? EMPTY_EDITOR_SELECTION),
38
+ selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),
36
39
  };
37
40
  },
38
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID,\n type EditorAgentBridgeSelectionSetInput,\n} from '@fps-games/editor-protocol';\nimport type { SelectionCommand } from '@fps-games/editor-core';\nimport { createLocalEditorAgentBridgeFailure } from '../diagnostics.js';\nimport type { LocalEditorAgentBridgeSelectionSource } from '../source-types.js';\nimport {\n cloneAgentBridgeSelection,\n EMPTY_EDITOR_SELECTION,\n isAgentBridgeObjectSelectable,\n type LocalEditorAgentBridgeCapabilitySourceOperations,\n type LocalEditorAgentBridgeHarnessState,\n} from '../shared.js';\nimport type { LocalEditorHarnessOptions } from '../../local-editor-harness.js';\n\nexport function createLocalEditorAgentBridgeSelectionSource<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): LocalEditorAgentBridgeSelectionSource {\n return {\n getSelection() {\n return cloneAgentBridgeSelection(state.session?.getState({ cloneDocuments: false }).selection ?? EMPTY_EDITOR_SELECTION);\n },\n setSelection(input) {\n const objectIds = normalizeAgentBridgeSelectionInput(input);\n if (!objectIds) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET,\n 'selection.set requires objectId or objectIds.',\n { code: 'selection.invalidInput' },\n );\n }\n const activeId = input.activeId && objectIds.includes(input.activeId)\n ? input.activeId\n : objectIds[objectIds.length - 1] ?? null;\n if (objectIds.length > 0) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n const hierarchy = document ? options.documentAdapter.getHierarchyItems(document) : [];\n const invalidId = objectIds.find(\n id => !document || !isAgentBridgeObjectSelectable(options, document, id, hierarchy),\n );\n if (invalidId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET,\n `Object is not selectable: ${invalidId}`,\n { code: 'selection.notSelectable', objectId: invalidId },\n );\n }\n }\n const command: SelectionCommand = objectIds.length > 0\n ? {\n type: 'selection.replace',\n selectedIds: objectIds,\n activeId,\n label: 'Agent Selection',\n }\n : { type: 'selection.clear', label: 'Agent Selection' };\n operations.dispatchSelectionCommand(command, true);\n return {\n selection: cloneAgentBridgeSelection(\n state.session?.getState({ cloneDocuments: false }).selection ?? EMPTY_EDITOR_SELECTION,\n ),\n };\n },\n };\n}\n\nfunction normalizeAgentBridgeSelectionInput(input: EditorAgentBridgeSelectionSetInput): string[] | null {\n const ids = Array.isArray(input.objectIds) ? input.objectIds : input.objectId ? [input.objectId] : null;\n if (!ids) return null;\n const normalized: string[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n if (typeof id !== 'string') continue;\n const trimmed = id.trim();\n if (!trimmed || seen.has(trimmed)) continue;\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n return normalized;\n}\n"]}
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/selection.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID,\n type EditorAgentBridgeSelectionSetInput,\n} from '@fps-games/editor-protocol';\nimport type { SelectionCommand } from '@fps-games/editor-core';\nimport { createLocalEditorAgentBridgeFailure } from '../diagnostics.js';\nimport type { LocalEditorAgentBridgeSelectionSource } from '../source-types.js';\nimport {\n cloneAgentBridgeSelection,\n getAgentBridgeSafeSceneHierarchy,\n getAgentBridgeSafeSceneSelection,\n hasAgentBridgeSafeSceneScope,\n isAgentBridgeHierarchyObjectSelectable,\n type LocalEditorAgentBridgeCapabilitySourceOperations,\n type LocalEditorAgentBridgeHarnessState,\n} from '../shared.js';\nimport type { LocalEditorHarnessOptions } from '../../local-editor-harness.js';\n\nexport function createLocalEditorAgentBridgeSelectionSource<TDocument, TPatch, TAsset>(\n state: LocalEditorAgentBridgeHarnessState<TDocument, TPatch>,\n options: LocalEditorHarnessOptions<TDocument, TPatch, TAsset>,\n operations: LocalEditorAgentBridgeCapabilitySourceOperations<TDocument>,\n): LocalEditorAgentBridgeSelectionSource {\n return {\n getSelection() {\n return cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations));\n },\n setSelection(input) {\n if (!hasAgentBridgeSafeSceneScope(operations)) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET,\n 'Scene selection is unavailable outside the Scene Hierarchy scope.',\n { code: 'selection.sceneScopeRequired' },\n );\n }\n const objectIds = normalizeAgentBridgeSelectionInput(input);\n if (!objectIds) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET,\n 'selection.set requires objectId or objectIds.',\n { code: 'selection.invalidInput' },\n );\n }\n const activeId = input.activeId && objectIds.includes(input.activeId)\n ? input.activeId\n : objectIds[objectIds.length - 1] ?? null;\n if (objectIds.length > 0) {\n const document = state.session?.getState({ cloneDocuments: false }).workingDocument ?? null;\n const hierarchy = document ? getAgentBridgeSafeSceneHierarchy(operations) : [];\n const invalidId = objectIds.find(\n id => !document || !isAgentBridgeHierarchyObjectSelectable(options, document, id, hierarchy),\n );\n if (invalidId) {\n return createLocalEditorAgentBridgeFailure(\n EDITOR_AGENT_BRIDGE_CAPABILITY_ID.SELECTION_SET,\n `Object is not selectable: ${invalidId}`,\n { code: 'selection.notSelectable', objectId: invalidId },\n );\n }\n }\n const command: SelectionCommand = objectIds.length > 0\n ? {\n type: 'selection.replace',\n selectedIds: objectIds,\n activeId,\n label: 'Agent Selection',\n }\n : { type: 'selection.clear', label: 'Agent Selection' };\n operations.dispatchSelectionCommand(command, true);\n return {\n selection: cloneAgentBridgeSelection(getAgentBridgeSafeSceneSelection(operations)),\n };\n },\n };\n}\n\nfunction normalizeAgentBridgeSelectionInput(input: EditorAgentBridgeSelectionSetInput): string[] | null {\n const ids = Array.isArray(input.objectIds) ? input.objectIds : input.objectId ? [input.objectId] : null;\n if (!ids) return null;\n const normalized: string[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n if (typeof id !== 'string') continue;\n const trimmed = id.trim();\n if (!trimmed || seen.has(trimmed)) continue;\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n return normalized;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"shadows.d.ts","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/shadows.ts"],"names":[],"mappings":"AA6DA,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAGL,KAAK,gDAAgD,EACrD,KAAK,kCAAkC,EAIxC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA6D/E,wBAAgB,wCAAwC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAChF,KAAK,EAAE,kCAAkC,CAAC,SAAS,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7D,QAAQ,EAAE,MAAM,IAAI,EACpB,UAAU,EAAE,gDAAgD,CAAC,SAAS,CAAC,GACtE,kCAAkC,CAwWpC"}
1
+ {"version":3,"file":"shadows.d.ts","sourceRoot":"","sources":["../../../src/agent-bridge/capabilities/shadows.ts"],"names":[],"mappings":"AA6DA,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAKL,KAAK,gDAAgD,EACrD,KAAK,kCAAkC,EAIxC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AA6D/E,wBAAgB,wCAAwC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAChF,KAAK,EAAE,kCAAkC,CAAC,SAAS,EAAE,MAAM,CAAC,EAC5D,OAAO,EAAE,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7D,QAAQ,EAAE,MAAM,IAAI,EACpB,UAAU,EAAE,gDAAgD,CAAC,SAAS,CAAC,GACtE,kCAAkC,CAwWpC"}