@fluidframework/ai-collab 2.33.2 → 2.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +156 -0
- package/api-report/ai-collab.alpha.api.md +88 -0
- package/dist/aiCollabApi.d.ts +9 -0
- package/dist/aiCollabApi.d.ts.map +1 -1
- package/dist/aiCollabApi.js.map +1 -1
- package/dist/alpha.d.ts +12 -0
- package/dist/diffTypes.d.ts +200 -0
- package/dist/diffTypes.d.ts.map +1 -0
- package/dist/diffTypes.js +7 -0
- package/dist/diffTypes.js.map +1 -0
- package/dist/explicit-strategy/agentEditReducer.d.ts +25 -3
- package/dist/explicit-strategy/agentEditReducer.d.ts.map +1 -1
- package/dist/explicit-strategy/agentEditReducer.js +239 -15
- package/dist/explicit-strategy/agentEditReducer.js.map +1 -1
- package/dist/explicit-strategy/index.d.ts +3 -0
- package/dist/explicit-strategy/index.d.ts.map +1 -1
- package/dist/explicit-strategy/index.js +6 -2
- package/dist/explicit-strategy/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/lib/aiCollabApi.d.ts +9 -0
- package/lib/aiCollabApi.d.ts.map +1 -1
- package/lib/aiCollabApi.js.map +1 -1
- package/lib/alpha.d.ts +12 -0
- package/lib/diffTypes.d.ts +200 -0
- package/lib/diffTypes.d.ts.map +1 -0
- package/lib/diffTypes.js +6 -0
- package/lib/diffTypes.js.map +1 -0
- package/lib/explicit-strategy/agentEditReducer.d.ts +25 -3
- package/lib/explicit-strategy/agentEditReducer.d.ts.map +1 -1
- package/lib/explicit-strategy/agentEditReducer.js +239 -18
- package/lib/explicit-strategy/agentEditReducer.js.map +1 -1
- package/lib/explicit-strategy/index.d.ts +3 -0
- package/lib/explicit-strategy/index.d.ts.map +1 -1
- package/lib/explicit-strategy/index.js +6 -2
- package/lib/explicit-strategy/index.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +9 -9
- package/src/aiCollabApi.ts +10 -0
- package/src/diffTypes.ts +211 -0
- package/src/explicit-strategy/agentEditReducer.ts +296 -19
- package/src/explicit-strategy/index.ts +10 -2
- package/src/index.ts +15 -0
|
@@ -2,11 +2,33 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { type TreeNode, type SimpleNodeSchema } from "@fluidframework/tree/internal";
|
|
6
|
-
import {
|
|
5
|
+
import { type TreeArrayNode, type TreeNode, type SimpleNodeSchema } from "@fluidframework/tree/internal";
|
|
6
|
+
import type { Diff } from "../diffTypes.js";
|
|
7
|
+
import { type TreeEdit, type Range, type TreeEditObject, type TreeEditValue } from "./agentEditTypes.js";
|
|
7
8
|
import type { IdGenerator } from "./idGenerator.js";
|
|
9
|
+
/**
|
|
10
|
+
* Gets the schema identifier of the given content, including primitive values.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getSchemaIdentifier(content: TreeEditValue): string;
|
|
13
|
+
/**
|
|
14
|
+
* Converts a tree node from a {@link TreeEdit} to a {@link TreeEditObject} with the proper object IDs.
|
|
15
|
+
*/
|
|
16
|
+
export declare function contentWithIds(content: TreeNode, idGenerator: IdGenerator): TreeEditObject;
|
|
8
17
|
/**
|
|
9
18
|
* Manages applying the various types of {@link TreeEdit}'s to a a given {@link TreeNode}.
|
|
10
19
|
*/
|
|
11
|
-
export declare function applyAgentEdit(treeEdit: TreeEdit, idGenerator: IdGenerator, definitionMap: ReadonlyMap<string, SimpleNodeSchema>, validator?: (edit: TreeNode) => void):
|
|
20
|
+
export declare function applyAgentEdit(treeEdit: TreeEdit, idGenerator: IdGenerator, definitionMap: ReadonlyMap<string, SimpleNodeSchema>, validator?: (edit: TreeNode) => void): {
|
|
21
|
+
edit: TreeEdit;
|
|
22
|
+
diff: Diff;
|
|
23
|
+
};
|
|
24
|
+
interface RangeInfo {
|
|
25
|
+
array: TreeArrayNode;
|
|
26
|
+
startIndex: number;
|
|
27
|
+
endIndex: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Gets information about the range of nodes being targeted by an {@link Range}
|
|
31
|
+
*/
|
|
32
|
+
export declare function getRangeInfo(range: Range, idGenerator: IdGenerator): RangeInfo;
|
|
33
|
+
export {};
|
|
12
34
|
//# sourceMappingURL=agentEditReducer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentEditReducer.d.ts","sourceRoot":"","sources":["../../src/explicit-strategy/agentEditReducer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"agentEditReducer.d.ts","sourceRoot":"","sources":["../../src/explicit-strategy/agentEditReducer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAIN,KAAK,aAAa,EAClB,KAAK,QAAQ,EAEb,KAAK,gBAAgB,EAOrB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EASX,IAAI,EACJ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,KAAK,QAAQ,EAGb,KAAK,KAAK,EAGV,KAAK,cAAc,EACnB,KAAK,aAAa,EAMlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA4BpD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA4BlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc,CAE1F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACpD,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAwPhC;AAkED,UAAU,SAAS;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS,CAW9E"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.applyAgentEdit = void 0;
|
|
7
|
+
exports.getRangeInfo = exports.applyAgentEdit = exports.contentWithIds = exports.getSchemaIdentifier = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
10
10
|
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
@@ -30,6 +30,9 @@ function populateDefaults(json, definitionMap) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Gets the schema identifier of the given content, including primitive values.
|
|
35
|
+
*/
|
|
33
36
|
function getSchemaIdentifier(content) {
|
|
34
37
|
switch (typeof content) {
|
|
35
38
|
case "boolean": {
|
|
@@ -58,9 +61,14 @@ function getSchemaIdentifier(content) {
|
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
}
|
|
64
|
+
exports.getSchemaIdentifier = getSchemaIdentifier;
|
|
65
|
+
/**
|
|
66
|
+
* Converts a tree node from a {@link TreeEdit} to a {@link TreeEditObject} with the proper object IDs.
|
|
67
|
+
*/
|
|
61
68
|
function contentWithIds(content, idGenerator) {
|
|
62
69
|
return JSON.parse((0, promptGeneration_js_1.toDecoratedJson)(idGenerator, content));
|
|
63
70
|
}
|
|
71
|
+
exports.contentWithIds = contentWithIds;
|
|
64
72
|
/**
|
|
65
73
|
* Manages applying the various types of {@link TreeEdit}'s to a a given {@link TreeNode}.
|
|
66
74
|
*/
|
|
@@ -83,8 +91,11 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
83
91
|
validator?.(insertNode);
|
|
84
92
|
array.insertAt(index, insertNode);
|
|
85
93
|
return {
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
edit: {
|
|
95
|
+
...treeEdit,
|
|
96
|
+
content: contentWithIds(insertNode, idGenerator),
|
|
97
|
+
},
|
|
98
|
+
diff: createInsertDiff(insertNode, treeEdit.explanation, idGenerator),
|
|
88
99
|
};
|
|
89
100
|
}
|
|
90
101
|
}
|
|
@@ -92,6 +103,7 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
92
103
|
}
|
|
93
104
|
case "remove": {
|
|
94
105
|
const source = treeEdit.source;
|
|
106
|
+
let diff;
|
|
95
107
|
if (isObjectTarget(source)) {
|
|
96
108
|
const node = getNodeFromTarget(source, idGenerator);
|
|
97
109
|
const parentNode = internal_3.Tree.parent(node);
|
|
@@ -101,7 +113,9 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
101
113
|
}
|
|
102
114
|
else if (internal_3.Tree.schema(parentNode).kind === internal_3.NodeKind.Array) {
|
|
103
115
|
const nodeIndex = internal_3.Tree.key(node);
|
|
104
|
-
parentNode
|
|
116
|
+
const parentArrayNode = parentNode;
|
|
117
|
+
diff = createRemoveDiff(treeEdit, idGenerator);
|
|
118
|
+
parentArrayNode.removeAt(nodeIndex);
|
|
105
119
|
}
|
|
106
120
|
else {
|
|
107
121
|
const fieldKey = internal_3.Tree.key(node);
|
|
@@ -109,6 +123,7 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
109
123
|
const fieldSchema = parentSchema.info[fieldKey] ??
|
|
110
124
|
(0, utils_js_1.fail)("Expected field schema");
|
|
111
125
|
if (fieldSchema instanceof internal_3.FieldSchema && fieldSchema.kind === internal_3.FieldKind.Optional) {
|
|
126
|
+
diff = createRemoveDiff(treeEdit, idGenerator);
|
|
112
127
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
113
128
|
parentNode[fieldKey] = undefined;
|
|
114
129
|
}
|
|
@@ -119,9 +134,13 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
119
134
|
}
|
|
120
135
|
else if (isRange(source)) {
|
|
121
136
|
const { array, startIndex, endIndex } = getRangeInfo(source, idGenerator);
|
|
137
|
+
diff = createRemoveDiff(treeEdit, idGenerator);
|
|
122
138
|
array.removeRange(startIndex, endIndex);
|
|
123
139
|
}
|
|
124
|
-
|
|
140
|
+
else {
|
|
141
|
+
throw new internal_2.UsageError("Invalid source for remove edit");
|
|
142
|
+
}
|
|
143
|
+
return { edit: treeEdit, diff };
|
|
125
144
|
}
|
|
126
145
|
case "modify": {
|
|
127
146
|
const node = getNodeFromTarget(treeEdit.target, idGenerator);
|
|
@@ -137,6 +156,7 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
137
156
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
138
157
|
const schemaIdentifier = modification[agentEditTypes_js_1.typeField];
|
|
139
158
|
let insertedObject;
|
|
159
|
+
const diff = createModifyDiff(treeEdit, idGenerator);
|
|
140
160
|
// if fieldSchema is a LeafnodeSchema, we can check that it's a valid type and set the field.
|
|
141
161
|
if (isPrimitive(modification)) {
|
|
142
162
|
try {
|
|
@@ -169,13 +189,9 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
169
189
|
(0, internal_1.assert)(Array.isArray(field), 0xa75 /* the field must be an array node */);
|
|
170
190
|
(0, internal_1.assert)(Array.isArray(constructedModification), 0xa76 /* the modification must be an array node */);
|
|
171
191
|
field.removeRange(0);
|
|
172
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
173
|
-
node[treeEdit.field] = constructedModification;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
177
|
-
node[treeEdit.field] = constructedModification;
|
|
178
192
|
}
|
|
193
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
194
|
+
node[treeEdit.field] = constructedModification;
|
|
179
195
|
}
|
|
180
196
|
// If the fieldSchema is of type FieldSchema, we can check its allowed types and set the field.
|
|
181
197
|
else if (fieldSchema instanceof internal_3.FieldSchema) {
|
|
@@ -202,10 +218,13 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
202
218
|
}
|
|
203
219
|
}
|
|
204
220
|
return insertedObject === undefined
|
|
205
|
-
? treeEdit
|
|
221
|
+
? { edit: treeEdit, diff }
|
|
206
222
|
: {
|
|
207
|
-
|
|
208
|
-
|
|
223
|
+
edit: {
|
|
224
|
+
...treeEdit,
|
|
225
|
+
modification: contentWithIds(insertedObject, idGenerator),
|
|
226
|
+
},
|
|
227
|
+
diff,
|
|
209
228
|
};
|
|
210
229
|
}
|
|
211
230
|
case "move": {
|
|
@@ -213,6 +232,7 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
213
232
|
const source = treeEdit.source;
|
|
214
233
|
const destination = treeEdit.destination;
|
|
215
234
|
const { array: destinationArrayNode, index: destinationIndex } = getPlaceInfo(destination, idGenerator);
|
|
235
|
+
const diff = createMoveDiff(treeEdit, idGenerator);
|
|
216
236
|
if (isObjectTarget(source)) {
|
|
217
237
|
const sourceNode = getNodeFromTarget(source, idGenerator);
|
|
218
238
|
const sourceIndex = internal_3.Tree.key(sourceNode);
|
|
@@ -249,7 +269,10 @@ function applyAgentEdit(treeEdit, idGenerator, definitionMap, validator) {
|
|
|
249
269
|
}
|
|
250
270
|
destinationArrayNode.moveRangeToIndex(destinationIndex, sourceStartIndex, sourceEndIndex, array);
|
|
251
271
|
}
|
|
252
|
-
|
|
272
|
+
else {
|
|
273
|
+
throw new Error("Invalid source for move edit");
|
|
274
|
+
}
|
|
275
|
+
return { edit: treeEdit, diff };
|
|
253
276
|
}
|
|
254
277
|
default: {
|
|
255
278
|
(0, utils_js_1.fail)("invalid tree edit");
|
|
@@ -309,6 +332,9 @@ function isObjectTarget(selection) {
|
|
|
309
332
|
function isRange(selection) {
|
|
310
333
|
return "from" in selection && "to" in selection;
|
|
311
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* Gets information about the range of nodes being targeted by an {@link Range}
|
|
337
|
+
*/
|
|
312
338
|
function getRangeInfo(range, idGenerator) {
|
|
313
339
|
const { array: arrayFrom, index: startIndex } = getPlaceInfo(range.from, idGenerator);
|
|
314
340
|
const { array: arrayTo, index: endIndex } = getPlaceInfo(range.to, idGenerator);
|
|
@@ -317,6 +343,7 @@ function getRangeInfo(range, idGenerator) {
|
|
|
317
343
|
}
|
|
318
344
|
return { array: arrayFrom, startIndex, endIndex };
|
|
319
345
|
}
|
|
346
|
+
exports.getRangeInfo = getRangeInfo;
|
|
320
347
|
function getPlaceInfo(place, idGenerator) {
|
|
321
348
|
if (place.type === "arrayPlace") {
|
|
322
349
|
const parent = idGenerator.getNode(place.parentId) ?? (0, utils_js_1.fail)("Expected parent node");
|
|
@@ -437,6 +464,203 @@ function assertObjectIdsExist(treeEdit, idGenerator) {
|
|
|
437
464
|
}
|
|
438
465
|
}
|
|
439
466
|
}
|
|
467
|
+
const createNodePathRecursive = (node, idGenerator, currentPath) => {
|
|
468
|
+
if (node === undefined) {
|
|
469
|
+
return currentPath;
|
|
470
|
+
}
|
|
471
|
+
currentPath.push({
|
|
472
|
+
shortId: internal_3.Tree.shortId(node),
|
|
473
|
+
schemaIdentifier: internal_3.Tree.schema(node).identifier,
|
|
474
|
+
parentField: internal_3.Tree.key(node),
|
|
475
|
+
});
|
|
476
|
+
const parentNode = internal_3.Tree.parent(node);
|
|
477
|
+
return createNodePathRecursive(parentNode, idGenerator, currentPath);
|
|
478
|
+
};
|
|
479
|
+
/**
|
|
480
|
+
* Creates a diff for an Insert TreeEdit.
|
|
481
|
+
*
|
|
482
|
+
* @remarks
|
|
483
|
+
* This function is only invoked within the "insert" case block.
|
|
484
|
+
*
|
|
485
|
+
* This must only be called AFTER an insertion is made.
|
|
486
|
+
* It generates the insert diff after the node has been successfully inserted, as the node's index may
|
|
487
|
+
* be required to support undoing the insert operation, and we don't know that index until the insert has been made.
|
|
488
|
+
*/
|
|
489
|
+
function createInsertDiff(newlyInsertedNode, aiExplanation, idGenerator) {
|
|
490
|
+
return {
|
|
491
|
+
type: "insert",
|
|
492
|
+
nodePath: createNodePathRecursive(newlyInsertedNode, idGenerator, []),
|
|
493
|
+
nodeContent: JSON.parse(JSON.stringify(newlyInsertedNode)),
|
|
494
|
+
aiExplanation,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Returns an object identical to the input except that the special 'objectIdKey' field (only intended for use by the LLM agent) is removed if present.
|
|
499
|
+
* @remarks The input object is not modified.
|
|
500
|
+
*/
|
|
501
|
+
function removeAgentObjectIdField(oldValue) {
|
|
502
|
+
if (typeof oldValue === "object" && oldValue !== null && !Array.isArray(oldValue)) {
|
|
503
|
+
const { [agentEditTypes_js_1.objectIdKey]: _, ...rest } = oldValue;
|
|
504
|
+
return rest;
|
|
505
|
+
}
|
|
506
|
+
return oldValue;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Creates a diff for a Modify TreeEdit.
|
|
510
|
+
*
|
|
511
|
+
* @remarks
|
|
512
|
+
* This function must only be called BEFORE a modify edit is applied.
|
|
513
|
+
* For move operations, the diff is created before the node(s) have been successfully moved,
|
|
514
|
+
* since the original index is needed to restore the node(s) if the move operation need to undo.
|
|
515
|
+
*/
|
|
516
|
+
function createModifyDiff(treeEdit, idGenerator) {
|
|
517
|
+
const targetNode = getNodeFromTarget(treeEdit.target, idGenerator);
|
|
518
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
519
|
+
const targetNodeAtField = targetNode[treeEdit.field];
|
|
520
|
+
if (isPrimitive(targetNodeAtField)) {
|
|
521
|
+
return {
|
|
522
|
+
type: "modify",
|
|
523
|
+
nodePath: createNodePathRecursive(targetNode, idGenerator, [
|
|
524
|
+
{
|
|
525
|
+
shortId: undefined,
|
|
526
|
+
parentField: treeEdit.field,
|
|
527
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
528
|
+
schemaIdentifier: getSchemaIdentifier(treeEdit.modification),
|
|
529
|
+
},
|
|
530
|
+
]),
|
|
531
|
+
newValue: treeEdit.modification,
|
|
532
|
+
oldValue: targetNodeAtField,
|
|
533
|
+
aiExplanation: treeEdit.explanation,
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
return {
|
|
537
|
+
type: "modify",
|
|
538
|
+
nodePath: createNodePathRecursive(targetNodeAtField, idGenerator, []),
|
|
539
|
+
newValue: treeEdit.modification,
|
|
540
|
+
oldValue: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetNodeAtField))),
|
|
541
|
+
aiExplanation: treeEdit.explanation,
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Creates a diff for a Remove TreeEdit.
|
|
546
|
+
*
|
|
547
|
+
* @remarks
|
|
548
|
+
* This function must only be called BEFORE a remove edit is applied.
|
|
549
|
+
* It generates the remove diff before the node has been successfully removed, as the node's index may
|
|
550
|
+
* be required to support undoing the remove operation, and we don't know that index until the remove has been made.
|
|
551
|
+
*/
|
|
552
|
+
function createRemoveDiff(treeEdit, idGenerator) {
|
|
553
|
+
const source = treeEdit.source;
|
|
554
|
+
if (isObjectTarget(source)) {
|
|
555
|
+
const node = getNodeFromTarget(source, idGenerator);
|
|
556
|
+
const parentNode = internal_3.Tree.parent(node);
|
|
557
|
+
if (parentNode === undefined) {
|
|
558
|
+
throw new Error("Unexpectedly received a root node as the target of a remove edit");
|
|
559
|
+
}
|
|
560
|
+
else if (internal_3.Tree.schema(parentNode).kind === internal_3.NodeKind.Array) {
|
|
561
|
+
const nodeIndex = internal_3.Tree.key(node);
|
|
562
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
563
|
+
const targetRemovedNode = parentNode.at(nodeIndex);
|
|
564
|
+
if (isPrimitive(targetRemovedNode)) {
|
|
565
|
+
// Note that this cause should not be possible, still putting the error here in case things change so that this function is updated properly
|
|
566
|
+
throw new Error("Unexpectedly recieved a primitive node as the target of a remove edit");
|
|
567
|
+
}
|
|
568
|
+
return {
|
|
569
|
+
type: "remove",
|
|
570
|
+
removalType: "remove-array-single",
|
|
571
|
+
nodePath: createNodePathRecursive(targetRemovedNode, idGenerator, []),
|
|
572
|
+
aiExplanation: treeEdit.explanation,
|
|
573
|
+
nodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetRemovedNode))),
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
const fieldKey = internal_3.Tree.key(node);
|
|
578
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
|
579
|
+
const targetNodeAtField = parentNode[fieldKey];
|
|
580
|
+
if (isPrimitive(targetNodeAtField)) {
|
|
581
|
+
// Note that this cause should not be possible, still putting the error here in case things change so that this function is updated properly
|
|
582
|
+
throw new Error("Unexpectedly recieved a primitive node as the target of a remove field edit");
|
|
583
|
+
}
|
|
584
|
+
return {
|
|
585
|
+
type: "remove",
|
|
586
|
+
removalType: "remove-node",
|
|
587
|
+
nodePath: createNodePathRecursive(targetNodeAtField, idGenerator, []),
|
|
588
|
+
aiExplanation: treeEdit.explanation,
|
|
589
|
+
nodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetNodeAtField))),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
else if (isRange(source)) {
|
|
594
|
+
const { array, startIndex, endIndex } = getRangeInfo(source, idGenerator);
|
|
595
|
+
const removedNodePaths = [];
|
|
596
|
+
const removedNodes = [];
|
|
597
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
598
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
599
|
+
const nodeToRemove = array.at(i);
|
|
600
|
+
if (!isPrimitive(nodeToRemove)) {
|
|
601
|
+
removedNodePaths.push(createNodePathRecursive(nodeToRemove, idGenerator, []));
|
|
602
|
+
removedNodes.push(nodeToRemove);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
return {
|
|
606
|
+
type: "remove",
|
|
607
|
+
removalType: "remove-array-range",
|
|
608
|
+
nodePaths: removedNodePaths,
|
|
609
|
+
aiExplanation: treeEdit.explanation,
|
|
610
|
+
nodeContents: removedNodes.map((node) => removeAgentObjectIdField(JSON.parse(JSON.stringify(node)))),
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
throw new Error("Invalid source encountered when trying to create diff for remove edit");
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Creates a diff for a Move TreeEdit.
|
|
619
|
+
*
|
|
620
|
+
* @remarks
|
|
621
|
+
* This function must only be called BEFORE a move edit is applied.
|
|
622
|
+
* For move operations, the diff is created before the node(s) have been successfully moved,
|
|
623
|
+
* since the original index is needed to restore the node(s) if the move operation need to undo.
|
|
624
|
+
*/
|
|
625
|
+
function createMoveDiff(treeEdit, idGenerator) {
|
|
626
|
+
const source = treeEdit.source;
|
|
627
|
+
const destination = treeEdit.destination;
|
|
628
|
+
const { array: destinationArrayNode } = getPlaceInfo(destination, idGenerator);
|
|
629
|
+
if (isObjectTarget(source)) {
|
|
630
|
+
const node = getNodeFromTarget(source, idGenerator);
|
|
631
|
+
return {
|
|
632
|
+
type: "move",
|
|
633
|
+
moveType: "move-single",
|
|
634
|
+
sourceNodePath: createNodePathRecursive(node, idGenerator, []),
|
|
635
|
+
destinationNodePath: createNodePathRecursive(destinationArrayNode, idGenerator, []),
|
|
636
|
+
aiExplanation: treeEdit.explanation,
|
|
637
|
+
nodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(node))),
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
else if (isRange(source)) {
|
|
641
|
+
const { array, startIndex: sourceStartIndex, endIndex: sourceEndIndex, } = getRangeInfo(source, idGenerator);
|
|
642
|
+
const movedNodePaths = [];
|
|
643
|
+
const movedNodes = [];
|
|
644
|
+
for (let i = sourceStartIndex; i < sourceEndIndex; i++) {
|
|
645
|
+
const nodeToMove = array.at(i);
|
|
646
|
+
if (!isPrimitive(nodeToMove)) {
|
|
647
|
+
movedNodePaths.push(createNodePathRecursive(nodeToMove, idGenerator, []));
|
|
648
|
+
movedNodes.push(nodeToMove);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return {
|
|
652
|
+
type: "move",
|
|
653
|
+
moveType: "move-range",
|
|
654
|
+
sourceNodePaths: movedNodePaths,
|
|
655
|
+
destinationNodePath: createNodePathRecursive(destinationArrayNode, idGenerator, []),
|
|
656
|
+
aiExplanation: treeEdit.explanation,
|
|
657
|
+
nodeContents: movedNodes.map((node) => removeAgentObjectIdField(JSON.parse(JSON.stringify(node)))),
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
throw new Error("Invalid source for move edit");
|
|
662
|
+
}
|
|
663
|
+
}
|
|
440
664
|
function getSimpleNodeSchema(node) {
|
|
441
665
|
const treeNodeSchema = internal_3.Tree.schema(node);
|
|
442
666
|
const simpleNodeSchema = treeNodeSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentEditReducer.js","sourceRoot":"","sources":["../../src/explicit-strategy/agentEditReducer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { isFluidHandle } from \"@fluidframework/runtime-utils\";\nimport { isFluidError, UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tTree,\n\tNodeKind,\n\ttype ImplicitAllowedTypes,\n\ttype TreeArrayNode,\n\ttype TreeNode,\n\ttype TreeNodeSchema,\n\ttype SimpleNodeSchema,\n\tFieldKind,\n\tFieldSchema,\n\tnormalizeAllowedTypes,\n\ttype ImplicitFieldSchema,\n\ttype IterableTreeArrayContent,\n\tSchemaFactory,\n} from \"@fluidframework/tree/internal\";\nimport { closest } from \"fastest-levenshtein\";\n\nimport {\n\ttype TreeEdit,\n\ttype ObjectTarget,\n\ttype Selection,\n\ttype Range,\n\ttype ObjectPlace,\n\ttype ArrayPlace,\n\ttype TreeEditObject,\n\ttype TreeEditValue,\n\ttypeField,\n\ttype Modify,\n} from \"./agentEditTypes.js\";\nimport type { IdGenerator } from \"./idGenerator.js\";\nimport type { JsonValue } from \"./jsonTypes.js\";\nimport { toDecoratedJson } from \"./promptGeneration.js\";\nimport { fail } from \"./utils.js\";\n\nfunction populateDefaults(\n\tjson: JsonValue,\n\tdefinitionMap: ReadonlyMap<string, SimpleNodeSchema>,\n): void {\n\tif (typeof json === \"object\") {\n\t\tif (json === null) {\n\t\t\treturn;\n\t\t}\n\t\tif (Array.isArray(json)) {\n\t\t\tfor (const element of json) {\n\t\t\t\tpopulateDefaults(element, definitionMap);\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof json[typeField] === \"string\",\n\t\t\t\t0xa73 /* The typeField must be present in new JSON content */,\n\t\t\t);\n\t\t\tconst nodeSchema = definitionMap.get(json[typeField]);\n\t\t\tassert(nodeSchema?.kind === NodeKind.Object, 0xa74 /* Expected object schema */);\n\t\t}\n\t}\n}\n\nfunction getSchemaIdentifier(content: TreeEditValue): string | undefined {\n\tswitch (typeof content) {\n\t\tcase \"boolean\": {\n\t\t\treturn SchemaFactory.boolean.identifier;\n\t\t}\n\t\tcase \"number\": {\n\t\t\treturn SchemaFactory.number.identifier;\n\t\t}\n\t\tcase \"string\": {\n\t\t\treturn SchemaFactory.string.identifier;\n\t\t}\n\t\tcase \"object\": {\n\t\t\tif (content === null) {\n\t\t\t\treturn SchemaFactory.null.identifier;\n\t\t\t}\n\t\t\tif (Array.isArray(content)) {\n\t\t\t\tthrow new UsageError(\"Arrays are not currently supported in this context\");\n\t\t\t}\n\t\t\tif (isFluidHandle(content)) {\n\t\t\t\treturn SchemaFactory.handle.identifier;\n\t\t\t}\n\t\t\treturn content[typeField];\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new UsageError(\"Unsupported content type\");\n\t\t}\n\t}\n}\n\nfunction contentWithIds(content: TreeNode, idGenerator: IdGenerator): TreeEditObject {\n\treturn JSON.parse(toDecoratedJson(idGenerator, content)) as TreeEditObject;\n}\n\n/**\n * Manages applying the various types of {@link TreeEdit}'s to a a given {@link TreeNode}.\n */\nexport function applyAgentEdit(\n\ttreeEdit: TreeEdit,\n\tidGenerator: IdGenerator,\n\tdefinitionMap: ReadonlyMap<string, SimpleNodeSchema>,\n\tvalidator?: (edit: TreeNode) => void,\n): TreeEdit {\n\tassertObjectIdsExist(treeEdit, idGenerator);\n\tswitch (treeEdit.type) {\n\t\tcase \"insert\": {\n\t\t\tconst { array, index } = getPlaceInfo(treeEdit.destination, idGenerator);\n\n\t\t\tconst parentNodeSchema = Tree.schema(array);\n\t\t\tpopulateDefaults(treeEdit.content, definitionMap);\n\n\t\t\tconst schemaIdentifier = getSchemaIdentifier(treeEdit.content);\n\n\t\t\t// We assume that the parentNode for inserts edits are guaranteed to be an arrayNode.\n\t\t\tconst allowedTypes = [\n\t\t\t\t...normalizeAllowedTypes(parentNodeSchema.info as ImplicitAllowedTypes),\n\t\t\t];\n\n\t\t\tfor (const allowedType of allowedTypes.values()) {\n\t\t\t\tif (allowedType.identifier === schemaIdentifier && typeof allowedType === \"function\") {\n\t\t\t\t\tconst simpleNodeSchema = allowedType as unknown as new (dummy: unknown) => TreeNode;\n\t\t\t\t\tconst insertNode = new simpleNodeSchema(treeEdit.content);\n\t\t\t\t\tvalidator?.(insertNode);\n\t\t\t\t\tarray.insertAt(index, insertNode as unknown as IterableTreeArrayContent<never>);\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...treeEdit,\n\t\t\t\t\t\tcontent: contentWithIds(insertNode, idGenerator),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tfail(\"inserted node must be of an allowed type\");\n\t\t}\n\t\tcase \"remove\": {\n\t\t\tconst source = treeEdit.source;\n\t\t\tif (isObjectTarget(source)) {\n\t\t\t\tconst node = getNodeFromTarget(source, idGenerator);\n\t\t\t\tconst parentNode = Tree.parent(node);\n\t\t\t\t// Case for deleting rootNode\n\t\t\t\tif (parentNode === undefined) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"The root is required, and cannot be removed. Please use modify edit instead.\",\n\t\t\t\t\t);\n\t\t\t\t} else if (Tree.schema(parentNode).kind === NodeKind.Array) {\n\t\t\t\t\tconst nodeIndex = Tree.key(node) as number;\n\t\t\t\t\t(parentNode as TreeArrayNode).removeAt(nodeIndex);\n\t\t\t\t} else {\n\t\t\t\t\tconst fieldKey = Tree.key(node);\n\t\t\t\t\tconst parentSchema = Tree.schema(parentNode);\n\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\t(parentSchema.info as Record<string, ImplicitFieldSchema>)[fieldKey] ??\n\t\t\t\t\t\tfail(\"Expected field schema\");\n\t\t\t\t\tif (fieldSchema instanceof FieldSchema && fieldSchema.kind === FieldKind.Optional) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t(parentNode as any)[fieldKey] = undefined;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t`${fieldKey} is required, and cannot be removed. Please use modify edit instead.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (isRange(source)) {\n\t\t\t\tconst { array, startIndex, endIndex } = getRangeInfo(source, idGenerator);\n\t\t\t\tarray.removeRange(startIndex, endIndex);\n\t\t\t}\n\t\t\treturn treeEdit;\n\t\t}\n\t\tcase \"modify\": {\n\t\t\tconst node = getNodeFromTarget(treeEdit.target, idGenerator);\n\t\t\tconst { treeNodeSchema } = getSimpleNodeSchema(node);\n\n\t\t\tconst nodeFieldSchemas = treeNodeSchema.info as Record<string, ImplicitFieldSchema>;\n\n\t\t\tconst fieldSchema = nodeFieldSchemas[treeEdit.field];\n\n\t\t\t// If the LLM attempts to modify a field that does not exist in the target schema we generate a useful error message that can be used as part of the feedback loop.\n\t\t\tif (fieldSchema === undefined) {\n\t\t\t\tconst errorMessage = createInvalidModifyFeedbackMsg(\n\t\t\t\t\ttreeEdit,\n\t\t\t\t\tnode,\n\t\t\t\t\t\"NONEXISTENT_FIELD\",\n\t\t\t\t);\n\t\t\t\tthrow new UsageError(errorMessage);\n\t\t\t}\n\n\t\t\tconst modification = treeEdit.modification;\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tconst schemaIdentifier = (modification as any)[typeField];\n\n\t\t\tlet insertedObject: TreeNode | undefined;\n\t\t\t// if fieldSchema is a LeafnodeSchema, we can check that it's a valid type and set the field.\n\t\t\tif (isPrimitive(modification)) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = modification;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isFluidError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\t// If the LLM attempts to use the wrong type for a field, we generate a useful error message that can be used as part of the feedback loop.\n\t\t\t\t\tconst isInvalidTypeError =\n\t\t\t\t\t\terror.message.match(\n\t\t\t\t\t\t\t/The provided data is incompatible with all of the types allowed by the schema./,\n\t\t\t\t\t\t) !== null;\n\t\t\t\t\tif (isInvalidTypeError === true) {\n\t\t\t\t\t\tconst errorMessage = createInvalidModifyFeedbackMsg(\n\t\t\t\t\t\t\ttreeEdit,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\"INVALID_TYPE\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow new UsageError(errorMessage);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the fieldSchema is a function we can grab the constructor and make an instance of that node.\n\t\t\telse if (typeof fieldSchema === \"function\") {\n\t\t\t\tconst simpleSchema = fieldSchema as unknown as new (dummy: unknown) => TreeNode;\n\t\t\t\tpopulateDefaults(modification, definitionMap);\n\t\t\t\tconst constructedModification = new simpleSchema(modification);\n\t\t\t\tvalidator?.(constructedModification);\n\t\t\t\tinsertedObject = constructedModification;\n\n\t\t\t\tif (Array.isArray(modification)) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\tconst field = (node as any)[treeEdit.field] as TreeArrayNode;\n\t\t\t\t\tassert(Array.isArray(field), 0xa75 /* the field must be an array node */);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tArray.isArray(constructedModification),\n\t\t\t\t\t\t0xa76 /* the modification must be an array node */,\n\t\t\t\t\t);\n\t\t\t\t\tfield.removeRange(0);\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = constructedModification;\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = constructedModification;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the fieldSchema is of type FieldSchema, we can check its allowed types and set the field.\n\t\t\telse if (fieldSchema instanceof FieldSchema) {\n\t\t\t\tif (fieldSchema.kind === FieldKind.Optional && modification === undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const allowedType of fieldSchema.allowedTypeSet.values()) {\n\t\t\t\t\t\tif (allowedType.identifier === schemaIdentifier) {\n\t\t\t\t\t\t\tif (typeof allowedType === \"function\") {\n\t\t\t\t\t\t\t\tconst simpleSchema = allowedType as unknown as new (\n\t\t\t\t\t\t\t\t\tdummy: unknown,\n\t\t\t\t\t\t\t\t) => TreeNode;\n\t\t\t\t\t\t\t\tconst constructedObject = new simpleSchema(modification);\n\t\t\t\t\t\t\t\tinsertedObject = constructedObject;\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t\t\t(node as any)[treeEdit.field] = constructedObject;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t\t\t(node as any)[treeEdit.field] = modification;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn insertedObject === undefined\n\t\t\t\t? treeEdit\n\t\t\t\t: {\n\t\t\t\t\t\t...treeEdit,\n\t\t\t\t\t\tmodification: contentWithIds(insertedObject, idGenerator),\n\t\t\t\t\t};\n\t\t}\n\t\tcase \"move\": {\n\t\t\t// TODO: need to add schema check for valid moves\n\t\t\tconst source = treeEdit.source;\n\t\t\tconst destination = treeEdit.destination;\n\t\t\tconst { array: destinationArrayNode, index: destinationIndex } = getPlaceInfo(\n\t\t\t\tdestination,\n\t\t\t\tidGenerator,\n\t\t\t);\n\n\t\t\tif (isObjectTarget(source)) {\n\t\t\t\tconst sourceNode = getNodeFromTarget(source, idGenerator);\n\t\t\t\tconst sourceIndex = Tree.key(sourceNode) as number;\n\t\t\t\tconst sourceArrayNode = Tree.parent(sourceNode) as TreeArrayNode;\n\t\t\t\tconst sourceArraySchema = Tree.schema(sourceArrayNode);\n\t\t\t\tif (sourceArraySchema.kind !== NodeKind.Array) {\n\t\t\t\t\tthrow new UsageError(\"the source node must be within an arrayNode\");\n\t\t\t\t}\n\t\t\t\tconst destinationArraySchema = Tree.schema(destinationArrayNode);\n\t\t\t\tconst allowedTypes = [\n\t\t\t\t\t...normalizeAllowedTypes(destinationArraySchema.info as ImplicitAllowedTypes),\n\t\t\t\t];\n\t\t\t\tconst nodeToMove = sourceArrayNode.at(sourceIndex);\n\t\t\t\tassert(nodeToMove !== undefined, 0xa77 /* node to move must exist */);\n\t\t\t\tif (isNodeAllowedType(nodeToMove as TreeNode, allowedTypes)) {\n\t\t\t\t\tdestinationArrayNode.moveRangeToIndex(\n\t\t\t\t\t\tdestinationIndex,\n\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\tsourceIndex + 1,\n\t\t\t\t\t\tsourceArrayNode,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new UsageError(\"Illegal node type in destination array\");\n\t\t\t\t}\n\t\t\t} else if (isRange(source)) {\n\t\t\t\tconst {\n\t\t\t\t\tarray,\n\t\t\t\t\tstartIndex: sourceStartIndex,\n\t\t\t\t\tendIndex: sourceEndIndex,\n\t\t\t\t} = getRangeInfo(source, idGenerator);\n\t\t\t\tconst destinationArraySchema = Tree.schema(destinationArrayNode);\n\t\t\t\tconst allowedTypes = [\n\t\t\t\t\t...normalizeAllowedTypes(destinationArraySchema.info as ImplicitAllowedTypes),\n\t\t\t\t];\n\t\t\t\tfor (let i = sourceStartIndex; i < sourceEndIndex; i++) {\n\t\t\t\t\tconst nodeToMove = array.at(i);\n\t\t\t\t\tassert(nodeToMove !== undefined, 0xa78 /* node to move must exist */);\n\t\t\t\t\tif (!isNodeAllowedType(nodeToMove as TreeNode, allowedTypes)) {\n\t\t\t\t\t\tthrow new UsageError(\"Illegal node type in destination array\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdestinationArrayNode.moveRangeToIndex(\n\t\t\t\t\tdestinationIndex,\n\t\t\t\t\tsourceStartIndex,\n\t\t\t\t\tsourceEndIndex,\n\t\t\t\t\tarray,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn treeEdit;\n\t\t}\n\t\tdefault: {\n\t\t\tfail(\"invalid tree edit\");\n\t\t}\n\t}\n}\n\n/**\n * Produces a useful, context-rich error message to give as a response to the LLM when it has produced an {@link ModifyEdit} that either references a nonexistant field or an invalid type for the selected field.\n * @param errorType - The type of error message to produce. You must determine the error type before calling this function.\n * - `'NONEXISTENT_FIELD'` is used when the field does not exist in the node's schema.\n * - `'INVALID_TYPE'` is used when the field exists but the type of the modification is invalid.\n */\nfunction createInvalidModifyFeedbackMsg(\n\tmodifyEdit: Modify,\n\ttreeNode: TreeNode,\n\terrorType: \"NONEXISTENT_FIELD\" | \"INVALID_TYPE\",\n): string {\n\tconst { treeNodeSchema } = getSimpleNodeSchema(treeNode);\n\tconst nodeFieldSchemas = treeNodeSchema.info as Record<string, ImplicitFieldSchema>;\n\tconst messagePrefix = `You attempted an invalid modify edit on the node with id '${modifyEdit.target.target}' and schema '${treeNodeSchema.identifier}'.`;\n\tlet messageSuffix = \"\";\n\tconst getAllowedTypeIdentifiers = (fieldName: string): string[] => {\n\t\tconst targetFieldNodeSchema = nodeFieldSchemas[fieldName];\n\t\treturn targetFieldNodeSchema instanceof FieldSchema\n\t\t\t? [...targetFieldNodeSchema.allowedTypeSet.values()].map((schema) => schema.identifier)\n\t\t\t: [(targetFieldNodeSchema as TreeNodeSchema).identifier];\n\t};\n\n\tif (errorType === \"NONEXISTENT_FIELD\") {\n\t\tconst nodeFieldNames = Object.keys(nodeFieldSchemas);\n\t\tconst closestPossibleFieldMatch = closest(modifyEdit.field, nodeFieldNames);\n\t\tconst allowedTypeIdentifiers = getAllowedTypeIdentifiers(closestPossibleFieldMatch);\n\t\tconst closestPossibleMatchForFieldMessage = ` If you are sure you are trying to modify this node, did you mean to use the field \\`${closestPossibleFieldMatch}\\` which has the following set of allowed types: \\`[${allowedTypeIdentifiers.map((id) => `'${id}'`).join(\", \")}]\\`?`;\n\t\tmessageSuffix = ` The node's field you selected for modification \\`${modifyEdit.field}\\` does not exist in this node's schema. The set of available fields for this node are: \\`[${nodeFieldNames.map((field) => `'${field}'`).join(\", \")}]\\`.${closestPossibleMatchForFieldMessage}`;\n\t} else if (errorType === \"INVALID_TYPE\") {\n\t\tconst allowedTypeIdentifiers = getAllowedTypeIdentifiers(modifyEdit.field);\n\t\t// TODO: If the invalid modification is a new object, it won't be clear what part of the object is invalid for the given type. If we could give some more detailed guidance on what was wrong with the object it would be ideal.\n\t\tmessageSuffix = ` You cannot set the node's field \\`${modifyEdit.field}\\` to the value \\`${modifyEdit.modification}\\` with type \\`${typeof modifyEdit.modification}\\` because this type is incompatible with all of the types allowed by the field's schema. The set of allowed types are \\`[${allowedTypeIdentifiers.map((id) => `'${id}'`).join(\", \")}]\\`.`;\n\t}\n\n\treturn messagePrefix + messageSuffix;\n}\n\nfunction isNodeAllowedType(node: TreeNode, allowedTypes: TreeNodeSchema[]): boolean {\n\tfor (const allowedType of allowedTypes) {\n\t\tif (Tree.is(node, allowedType)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction isPrimitive(content: unknown): boolean {\n\treturn (\n\t\ttypeof content === \"number\" ||\n\t\ttypeof content === \"string\" ||\n\t\ttypeof content === \"boolean\" ||\n\t\tcontent === undefined ||\n\t\tcontent === null\n\t);\n}\n\nfunction isObjectTarget(selection: Selection): selection is ObjectTarget {\n\treturn Object.keys(selection).length === 1 && \"target\" in selection;\n}\n\nfunction isRange(selection: Selection): selection is Range {\n\treturn \"from\" in selection && \"to\" in selection;\n}\n\ninterface RangeInfo {\n\tarray: TreeArrayNode;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\nfunction getRangeInfo(range: Range, idGenerator: IdGenerator): RangeInfo {\n\tconst { array: arrayFrom, index: startIndex } = getPlaceInfo(range.from, idGenerator);\n\tconst { array: arrayTo, index: endIndex } = getPlaceInfo(range.to, idGenerator);\n\n\tif (arrayFrom !== arrayTo) {\n\t\tthrow new UsageError(\n\t\t\t'The \"from\" node and \"to\" nodes of the range must be in the same parent array.',\n\t\t);\n\t}\n\n\treturn { array: arrayFrom, startIndex, endIndex };\n}\n\nfunction getPlaceInfo(\n\tplace: ObjectPlace | ArrayPlace,\n\tidGenerator: IdGenerator,\n): {\n\tarray: TreeArrayNode;\n\tindex: number;\n} {\n\tif (place.type === \"arrayPlace\") {\n\t\tconst parent = idGenerator.getNode(place.parentId) ?? fail(\"Expected parent node\");\n\t\tconst child = (parent as unknown as Record<string, unknown>)[place.field];\n\t\tif (child === undefined) {\n\t\t\tthrow new UsageError(`No child under field field`);\n\t\t}\n\t\tconst schema = Tree.schema(child as TreeNode);\n\t\tif (schema.kind !== NodeKind.Array) {\n\t\t\tthrow new UsageError(\"Expected child to be in an array node\");\n\t\t}\n\t\treturn {\n\t\t\tarray: child as TreeArrayNode,\n\t\t\tindex: place.location === \"start\" ? 0 : (child as TreeArrayNode).length,\n\t\t};\n\t} else {\n\t\tconst node = getNodeFromTarget(place, idGenerator);\n\t\tconst nodeIndex = Tree.key(node);\n\t\tconst parent = Tree.parent(node);\n\t\tif (parent === undefined) {\n\t\t\tthrow new UsageError(\"TODO: root node target not supported\");\n\t\t}\n\t\tconst schema = Tree.schema(parent);\n\t\tif (schema.kind !== NodeKind.Array) {\n\t\t\tthrow new UsageError(\"Expected child to be in an array node\");\n\t\t}\n\t\treturn {\n\t\t\tarray: parent as unknown as TreeArrayNode,\n\t\t\tindex: place.place === \"before\" ? (nodeIndex as number) : (nodeIndex as number) + 1,\n\t\t};\n\t}\n}\n\n/**\n * Returns the target node with the matching internal objectId using the provided {@link ObjectTarget}\n */\nfunction getNodeFromTarget(target: ObjectTarget, idGenerator: IdGenerator): TreeNode {\n\tconst node = idGenerator.getNode(target.target);\n\tassert(node !== undefined, 0xa79 /* objectId does not exist in nodeMap */);\n\treturn node;\n}\n\n/**\n * Checks that the objectIds of the Tree Nodes within the givin the {@link TreeEdit} exist within the given {@link IdGenerator}\n *\n * @throws An {@link UsageError} if the objectIdKey does not exist in the {@link IdGenerator}\n */\nfunction assertObjectIdsExist(treeEdit: TreeEdit, idGenerator: IdGenerator): void {\n\tswitch (treeEdit.type) {\n\t\tcase \"insert\": {\n\t\t\tif (treeEdit.destination.type === \"objectPlace\") {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.target) === undefined) {\n\t\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.destination.target} does not exist`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.parentId) === undefined) {\n\t\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.destination.parentId} does not exist`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"remove\": {\n\t\t\tif (isRange(treeEdit.source)) {\n\t\t\t\tconst missingObjectIds = [\n\t\t\t\t\ttreeEdit.source.from.target,\n\t\t\t\t\ttreeEdit.source.to.target,\n\t\t\t\t].filter((id) => !idGenerator.getNode(id));\n\n\t\t\t\tif (missingObjectIds.length > 0) {\n\t\t\t\t\tthrow new UsageError(`objectIdKeys [${missingObjectIds}] does not exist`);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisObjectTarget(treeEdit.source) &&\n\t\t\t\tidGenerator.getNode(treeEdit.source.target) === undefined\n\t\t\t) {\n\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.source.target} does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"modify\": {\n\t\t\tif (idGenerator.getNode(treeEdit.target.target) === undefined) {\n\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.target.target} does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"move\": {\n\t\t\tconst invalidObjectIds: string[] = [];\n\t\t\t// check the source\n\t\t\tif (isRange(treeEdit.source)) {\n\t\t\t\tconst missingObjectIds = [\n\t\t\t\t\ttreeEdit.source.from.target,\n\t\t\t\t\ttreeEdit.source.to.target,\n\t\t\t\t].filter((id) => !idGenerator.getNode(id));\n\n\t\t\t\tif (missingObjectIds.length > 0) {\n\t\t\t\t\tinvalidObjectIds.push(...missingObjectIds);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisObjectTarget(treeEdit.source) &&\n\t\t\t\tidGenerator.getNode(treeEdit.source.target) === undefined\n\t\t\t) {\n\t\t\t\tinvalidObjectIds.push(treeEdit.source.target);\n\t\t\t}\n\n\t\t\t// check the destination\n\t\t\tif (treeEdit.destination.type === \"objectPlace\") {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.target) === undefined) {\n\t\t\t\t\tinvalidObjectIds.push(treeEdit.destination.target);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.parentId) === undefined) {\n\t\t\t\t\tinvalidObjectIds.push(treeEdit.destination.parentId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (invalidObjectIds.length > 0) {\n\t\t\t\tthrow new UsageError(`objectIdKeys [${invalidObjectIds}] does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\ninterface SchemaInfo {\n\ttreeNodeSchema: TreeNodeSchema;\n\tsimpleNodeSchema: new (dummy: unknown) => TreeNode;\n}\n\nfunction getSimpleNodeSchema(node: TreeNode): SchemaInfo {\n\tconst treeNodeSchema = Tree.schema(node);\n\tconst simpleNodeSchema = treeNodeSchema as unknown as new (dummy: unknown) => TreeNode;\n\treturn { treeNodeSchema, simpleNodeSchema };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agentEditReducer.js","sourceRoot":"","sources":["../../src/explicit-strategy/agentEditReducer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { isFluidHandle } from \"@fluidframework/runtime-utils\";\nimport { isFluidError, UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport {\n\tTree,\n\tNodeKind,\n\ttype ImplicitAllowedTypes,\n\ttype TreeArrayNode,\n\ttype TreeNode,\n\ttype TreeNodeSchema,\n\ttype SimpleNodeSchema,\n\tFieldKind,\n\tFieldSchema,\n\tnormalizeAllowedTypes,\n\ttype ImplicitFieldSchema,\n\ttype IterableTreeArrayContent,\n\tSchemaFactory,\n} from \"@fluidframework/tree/internal\";\nimport { closest } from \"fastest-levenshtein\";\n\nimport type {\n\tArrayRangeRemoveDiff,\n\tArraySingleRemoveDiff,\n\tInsertDiff,\n\tModifyDiff,\n\tMoveRangeDiff,\n\tMoveSingleDiff,\n\tNodePath,\n\tRemoveNodeDiff,\n\tDiff,\n} from \"../diffTypes.js\";\n\nimport {\n\ttype TreeEdit,\n\ttype ObjectTarget,\n\ttype Selection,\n\ttype Range,\n\ttype ObjectPlace,\n\ttype ArrayPlace,\n\ttype TreeEditObject,\n\ttype TreeEditValue,\n\ttypeField,\n\ttype Modify,\n\ttype Remove,\n\ttype Move,\n\tobjectIdKey,\n} from \"./agentEditTypes.js\";\nimport type { IdGenerator } from \"./idGenerator.js\";\nimport type { JsonValue } from \"./jsonTypes.js\";\nimport { toDecoratedJson } from \"./promptGeneration.js\";\nimport { fail } from \"./utils.js\";\n\nfunction populateDefaults(\n\tjson: JsonValue,\n\tdefinitionMap: ReadonlyMap<string, SimpleNodeSchema>,\n): void {\n\tif (typeof json === \"object\") {\n\t\tif (json === null) {\n\t\t\treturn;\n\t\t}\n\t\tif (Array.isArray(json)) {\n\t\t\tfor (const element of json) {\n\t\t\t\tpopulateDefaults(element, definitionMap);\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\ttypeof json[typeField] === \"string\",\n\t\t\t\t0xa73 /* The typeField must be present in new JSON content */,\n\t\t\t);\n\t\t\tconst nodeSchema = definitionMap.get(json[typeField]);\n\t\t\tassert(nodeSchema?.kind === NodeKind.Object, 0xa74 /* Expected object schema */);\n\t\t}\n\t}\n}\n\n/**\n * Gets the schema identifier of the given content, including primitive values.\n */\nexport function getSchemaIdentifier(content: TreeEditValue): string {\n\tswitch (typeof content) {\n\t\tcase \"boolean\": {\n\t\t\treturn SchemaFactory.boolean.identifier;\n\t\t}\n\t\tcase \"number\": {\n\t\t\treturn SchemaFactory.number.identifier;\n\t\t}\n\t\tcase \"string\": {\n\t\t\treturn SchemaFactory.string.identifier;\n\t\t}\n\t\tcase \"object\": {\n\t\t\tif (content === null) {\n\t\t\t\treturn SchemaFactory.null.identifier;\n\t\t\t}\n\t\t\tif (Array.isArray(content)) {\n\t\t\t\tthrow new UsageError(\"Arrays are not currently supported in this context\");\n\t\t\t}\n\t\t\tif (isFluidHandle(content)) {\n\t\t\t\treturn SchemaFactory.handle.identifier;\n\t\t\t}\n\n\t\t\treturn content[typeField];\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new UsageError(\"Unsupported content type\");\n\t\t}\n\t}\n}\n\n/**\n * Converts a tree node from a {@link TreeEdit} to a {@link TreeEditObject} with the proper object IDs.\n */\nexport function contentWithIds(content: TreeNode, idGenerator: IdGenerator): TreeEditObject {\n\treturn JSON.parse(toDecoratedJson(idGenerator, content)) as TreeEditObject;\n}\n\n/**\n * Manages applying the various types of {@link TreeEdit}'s to a a given {@link TreeNode}.\n */\nexport function applyAgentEdit(\n\ttreeEdit: TreeEdit,\n\tidGenerator: IdGenerator,\n\tdefinitionMap: ReadonlyMap<string, SimpleNodeSchema>,\n\tvalidator?: (edit: TreeNode) => void,\n): { edit: TreeEdit; diff: Diff } {\n\tassertObjectIdsExist(treeEdit, idGenerator);\n\tswitch (treeEdit.type) {\n\t\tcase \"insert\": {\n\t\t\tconst { array, index } = getPlaceInfo(treeEdit.destination, idGenerator);\n\n\t\t\tconst parentNodeSchema = Tree.schema(array);\n\t\t\tpopulateDefaults(treeEdit.content, definitionMap);\n\n\t\t\tconst schemaIdentifier = getSchemaIdentifier(treeEdit.content);\n\n\t\t\t// We assume that the parentNode for inserts edits are guaranteed to be an arrayNode.\n\t\t\tconst allowedTypes = [\n\t\t\t\t...normalizeAllowedTypes(parentNodeSchema.info as ImplicitAllowedTypes),\n\t\t\t];\n\n\t\t\tfor (const allowedType of allowedTypes.values()) {\n\t\t\t\tif (allowedType.identifier === schemaIdentifier && typeof allowedType === \"function\") {\n\t\t\t\t\tconst simpleNodeSchema = allowedType as unknown as new (dummy: unknown) => TreeNode;\n\t\t\t\t\tconst insertNode = new simpleNodeSchema(treeEdit.content);\n\t\t\t\t\tvalidator?.(insertNode);\n\n\t\t\t\t\tarray.insertAt(index, insertNode as unknown as IterableTreeArrayContent<never>);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tedit: {\n\t\t\t\t\t\t\t...treeEdit,\n\t\t\t\t\t\t\tcontent: contentWithIds(insertNode, idGenerator),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiff: createInsertDiff(insertNode, treeEdit.explanation, idGenerator),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tfail(\"inserted node must be of an allowed type\");\n\t\t}\n\t\tcase \"remove\": {\n\t\t\tconst source = treeEdit.source;\n\t\t\tlet diff: RemoveNodeDiff | ArraySingleRemoveDiff | ArrayRangeRemoveDiff;\n\t\t\tif (isObjectTarget(source)) {\n\t\t\t\tconst node = getNodeFromTarget(source, idGenerator);\n\t\t\t\tconst parentNode = Tree.parent(node);\n\t\t\t\t// Case for deleting rootNode\n\t\t\t\tif (parentNode === undefined) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"The root is required, and cannot be removed. Please use modify edit instead.\",\n\t\t\t\t\t);\n\t\t\t\t} else if (Tree.schema(parentNode).kind === NodeKind.Array) {\n\t\t\t\t\tconst nodeIndex = Tree.key(node) as number;\n\t\t\t\t\tconst parentArrayNode = parentNode as TreeArrayNode;\n\t\t\t\t\tdiff = createRemoveDiff(treeEdit, idGenerator);\n\t\t\t\t\tparentArrayNode.removeAt(nodeIndex);\n\t\t\t\t} else {\n\t\t\t\t\tconst fieldKey = Tree.key(node);\n\t\t\t\t\tconst parentSchema = Tree.schema(parentNode);\n\t\t\t\t\tconst fieldSchema =\n\t\t\t\t\t\t(parentSchema.info as Record<string, ImplicitFieldSchema>)[fieldKey] ??\n\t\t\t\t\t\tfail(\"Expected field schema\");\n\t\t\t\t\tif (fieldSchema instanceof FieldSchema && fieldSchema.kind === FieldKind.Optional) {\n\t\t\t\t\t\tdiff = createRemoveDiff(treeEdit, idGenerator);\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t(parentNode as any)[fieldKey] = undefined;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t`${fieldKey} is required, and cannot be removed. Please use modify edit instead.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (isRange(source)) {\n\t\t\t\tconst { array, startIndex, endIndex } = getRangeInfo(source, idGenerator);\n\t\t\t\tdiff = createRemoveDiff(treeEdit, idGenerator);\n\t\t\t\tarray.removeRange(startIndex, endIndex);\n\t\t\t} else {\n\t\t\t\tthrow new UsageError(\"Invalid source for remove edit\");\n\t\t\t}\n\n\t\t\treturn { edit: treeEdit, diff };\n\t\t}\n\t\tcase \"modify\": {\n\t\t\tconst node = getNodeFromTarget(treeEdit.target, idGenerator);\n\t\t\tconst { treeNodeSchema } = getSimpleNodeSchema(node);\n\n\t\t\tconst nodeFieldSchemas = treeNodeSchema.info as Record<string, ImplicitFieldSchema>;\n\n\t\t\tconst fieldSchema = nodeFieldSchemas[treeEdit.field];\n\n\t\t\t// If the LLM attempts to modify a field that does not exist in the target schema we generate a useful error message that can be used as part of the feedback loop.\n\t\t\tif (fieldSchema === undefined) {\n\t\t\t\tconst errorMessage = createInvalidModifyFeedbackMsg(\n\t\t\t\t\ttreeEdit,\n\t\t\t\t\tnode,\n\t\t\t\t\t\"NONEXISTENT_FIELD\",\n\t\t\t\t);\n\t\t\t\tthrow new UsageError(errorMessage);\n\t\t\t}\n\n\t\t\tconst modification = treeEdit.modification;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tconst schemaIdentifier = (modification as any)[typeField];\n\n\t\t\tlet insertedObject: TreeNode | undefined;\n\t\t\tconst diff = createModifyDiff(treeEdit, idGenerator);\n\t\t\t// if fieldSchema is a LeafnodeSchema, we can check that it's a valid type and set the field.\n\t\t\tif (isPrimitive(modification)) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = modification;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isFluidError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\t// If the LLM attempts to use the wrong type for a field, we generate a useful error message that can be used as part of the feedback loop.\n\t\t\t\t\tconst isInvalidTypeError =\n\t\t\t\t\t\terror.message.match(\n\t\t\t\t\t\t\t/The provided data is incompatible with all of the types allowed by the schema./,\n\t\t\t\t\t\t) !== null;\n\t\t\t\t\tif (isInvalidTypeError === true) {\n\t\t\t\t\t\tconst errorMessage = createInvalidModifyFeedbackMsg(\n\t\t\t\t\t\t\ttreeEdit,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\"INVALID_TYPE\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow new UsageError(errorMessage);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the fieldSchema is a function we can grab the constructor and make an instance of that node.\n\t\t\telse if (typeof fieldSchema === \"function\") {\n\t\t\t\tconst simpleSchema = fieldSchema as unknown as new (dummy: unknown) => TreeNode;\n\t\t\t\tpopulateDefaults(modification, definitionMap);\n\t\t\t\tconst constructedModification = new simpleSchema(modification);\n\t\t\t\tvalidator?.(constructedModification);\n\n\t\t\t\tinsertedObject = constructedModification;\n\n\t\t\t\tif (Array.isArray(modification)) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\tconst field = (node as any)[treeEdit.field] as TreeArrayNode;\n\t\t\t\t\tassert(Array.isArray(field), 0xa75 /* the field must be an array node */);\n\t\t\t\t\tassert(\n\t\t\t\t\t\tArray.isArray(constructedModification),\n\t\t\t\t\t\t0xa76 /* the modification must be an array node */,\n\t\t\t\t\t);\n\t\t\t\t\tfield.removeRange(0);\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(node as any)[treeEdit.field] = constructedModification;\n\t\t\t}\n\t\t\t// If the fieldSchema is of type FieldSchema, we can check its allowed types and set the field.\n\t\t\telse if (fieldSchema instanceof FieldSchema) {\n\t\t\t\tif (fieldSchema.kind === FieldKind.Optional && modification === undefined) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(node as any)[treeEdit.field] = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const allowedType of fieldSchema.allowedTypeSet.values()) {\n\t\t\t\t\t\tif (allowedType.identifier === schemaIdentifier) {\n\t\t\t\t\t\t\tif (typeof allowedType === \"function\") {\n\t\t\t\t\t\t\t\tconst simpleSchema = allowedType as unknown as new (\n\t\t\t\t\t\t\t\t\tdummy: unknown,\n\t\t\t\t\t\t\t\t) => TreeNode;\n\t\t\t\t\t\t\t\tconst constructedObject = new simpleSchema(modification);\n\t\t\t\t\t\t\t\tinsertedObject = constructedObject;\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t\t\t(node as any)[treeEdit.field] = constructedObject;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\t\t\t(node as any)[treeEdit.field] = modification;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn insertedObject === undefined\n\t\t\t\t? { edit: treeEdit, diff }\n\t\t\t\t: {\n\t\t\t\t\t\tedit: {\n\t\t\t\t\t\t\t...treeEdit,\n\t\t\t\t\t\t\tmodification: contentWithIds(insertedObject, idGenerator),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiff,\n\t\t\t\t\t};\n\t\t}\n\t\tcase \"move\": {\n\t\t\t// TODO: need to add schema check for valid moves\n\t\t\tconst source = treeEdit.source;\n\t\t\tconst destination = treeEdit.destination;\n\t\t\tconst { array: destinationArrayNode, index: destinationIndex } = getPlaceInfo(\n\t\t\t\tdestination,\n\t\t\t\tidGenerator,\n\t\t\t);\n\t\t\tconst diff: MoveSingleDiff | MoveRangeDiff = createMoveDiff(treeEdit, idGenerator);\n\t\t\tif (isObjectTarget(source)) {\n\t\t\t\tconst sourceNode = getNodeFromTarget(source, idGenerator);\n\t\t\t\tconst sourceIndex = Tree.key(sourceNode) as number;\n\t\t\t\tconst sourceArrayNode = Tree.parent(sourceNode) as TreeArrayNode;\n\t\t\t\tconst sourceArraySchema = Tree.schema(sourceArrayNode);\n\t\t\t\tif (sourceArraySchema.kind !== NodeKind.Array) {\n\t\t\t\t\tthrow new UsageError(\"the source node must be within an arrayNode\");\n\t\t\t\t}\n\t\t\t\tconst destinationArraySchema = Tree.schema(destinationArrayNode);\n\t\t\t\tconst allowedTypes = [\n\t\t\t\t\t...normalizeAllowedTypes(destinationArraySchema.info as ImplicitAllowedTypes),\n\t\t\t\t];\n\t\t\t\tconst nodeToMove = sourceArrayNode.at(sourceIndex);\n\t\t\t\tassert(nodeToMove !== undefined, 0xa77 /* node to move must exist */);\n\t\t\t\tif (isNodeAllowedType(nodeToMove as TreeNode, allowedTypes)) {\n\t\t\t\t\tdestinationArrayNode.moveRangeToIndex(\n\t\t\t\t\t\tdestinationIndex,\n\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\tsourceIndex + 1,\n\t\t\t\t\t\tsourceArrayNode,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new UsageError(\"Illegal node type in destination array\");\n\t\t\t\t}\n\t\t\t} else if (isRange(source)) {\n\t\t\t\tconst {\n\t\t\t\t\tarray,\n\t\t\t\t\tstartIndex: sourceStartIndex,\n\t\t\t\t\tendIndex: sourceEndIndex,\n\t\t\t\t} = getRangeInfo(source, idGenerator);\n\t\t\t\tconst destinationArraySchema = Tree.schema(destinationArrayNode);\n\t\t\t\tconst allowedTypes = [\n\t\t\t\t\t...normalizeAllowedTypes(destinationArraySchema.info as ImplicitAllowedTypes),\n\t\t\t\t];\n\t\t\t\tfor (let i = sourceStartIndex; i < sourceEndIndex; i++) {\n\t\t\t\t\tconst nodeToMove = array.at(i);\n\t\t\t\t\tassert(nodeToMove !== undefined, 0xa78 /* node to move must exist */);\n\t\t\t\t\tif (!isNodeAllowedType(nodeToMove as TreeNode, allowedTypes)) {\n\t\t\t\t\t\tthrow new UsageError(\"Illegal node type in destination array\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdestinationArrayNode.moveRangeToIndex(\n\t\t\t\t\tdestinationIndex,\n\t\t\t\t\tsourceStartIndex,\n\t\t\t\t\tsourceEndIndex,\n\t\t\t\t\tarray,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Invalid source for move edit\");\n\t\t\t}\n\t\t\treturn { edit: treeEdit, diff };\n\t\t}\n\t\tdefault: {\n\t\t\tfail(\"invalid tree edit\");\n\t\t}\n\t}\n}\n\n/**\n * Produces a useful, context-rich error message to give as a response to the LLM when it has produced an {@link ModifyEdit} that either references a nonexistant field or an invalid type for the selected field.\n * @param errorType - The type of error message to produce. You must determine the error type before calling this function.\n * - `'NONEXISTENT_FIELD'` is used when the field does not exist in the node's schema.\n * - `'INVALID_TYPE'` is used when the field exists but the type of the modification is invalid.\n */\nfunction createInvalidModifyFeedbackMsg(\n\tmodifyEdit: Modify,\n\ttreeNode: TreeNode,\n\terrorType: \"NONEXISTENT_FIELD\" | \"INVALID_TYPE\",\n): string {\n\tconst { treeNodeSchema } = getSimpleNodeSchema(treeNode);\n\tconst nodeFieldSchemas = treeNodeSchema.info as Record<string, ImplicitFieldSchema>;\n\tconst messagePrefix = `You attempted an invalid modify edit on the node with id '${modifyEdit.target.target}' and schema '${treeNodeSchema.identifier}'.`;\n\tlet messageSuffix = \"\";\n\tconst getAllowedTypeIdentifiers = (fieldName: string): string[] => {\n\t\tconst targetFieldNodeSchema = nodeFieldSchemas[fieldName];\n\t\treturn targetFieldNodeSchema instanceof FieldSchema\n\t\t\t? [...targetFieldNodeSchema.allowedTypeSet.values()].map((schema) => schema.identifier)\n\t\t\t: [(targetFieldNodeSchema as TreeNodeSchema).identifier];\n\t};\n\n\tif (errorType === \"NONEXISTENT_FIELD\") {\n\t\tconst nodeFieldNames = Object.keys(nodeFieldSchemas);\n\t\tconst closestPossibleFieldMatch = closest(modifyEdit.field, nodeFieldNames);\n\t\tconst allowedTypeIdentifiers = getAllowedTypeIdentifiers(closestPossibleFieldMatch);\n\t\tconst closestPossibleMatchForFieldMessage = ` If you are sure you are trying to modify this node, did you mean to use the field \\`${closestPossibleFieldMatch}\\` which has the following set of allowed types: \\`[${allowedTypeIdentifiers.map((id) => `'${id}'`).join(\", \")}]\\`?`;\n\t\tmessageSuffix = ` The node's field you selected for modification \\`${modifyEdit.field}\\` does not exist in this node's schema. The set of available fields for this node are: \\`[${nodeFieldNames.map((field) => `'${field}'`).join(\", \")}]\\`.${closestPossibleMatchForFieldMessage}`;\n\t} else if (errorType === \"INVALID_TYPE\") {\n\t\tconst allowedTypeIdentifiers = getAllowedTypeIdentifiers(modifyEdit.field);\n\t\t// TODO: If the invalid modification is a new object, it won't be clear what part of the object is invalid for the given type. If we could give some more detailed guidance on what was wrong with the object it would be ideal.\n\t\tmessageSuffix = ` You cannot set the node's field \\`${modifyEdit.field}\\` to the value \\`${modifyEdit.modification}\\` with type \\`${typeof modifyEdit.modification}\\` because this type is incompatible with all of the types allowed by the field's schema. The set of allowed types are \\`[${allowedTypeIdentifiers.map((id) => `'${id}'`).join(\", \")}]\\`.`;\n\t}\n\n\treturn messagePrefix + messageSuffix;\n}\n\nfunction isNodeAllowedType(node: TreeNode, allowedTypes: TreeNodeSchema[]): boolean {\n\tfor (const allowedType of allowedTypes) {\n\t\tif (Tree.is(node, allowedType)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction isPrimitive(content: unknown): boolean {\n\treturn (\n\t\ttypeof content === \"number\" ||\n\t\ttypeof content === \"string\" ||\n\t\ttypeof content === \"boolean\" ||\n\t\tcontent === undefined ||\n\t\tcontent === null\n\t);\n}\n\nfunction isObjectTarget(selection: Selection): selection is ObjectTarget {\n\treturn Object.keys(selection).length === 1 && \"target\" in selection;\n}\n\nfunction isRange(selection: Selection): selection is Range {\n\treturn \"from\" in selection && \"to\" in selection;\n}\n\ninterface RangeInfo {\n\tarray: TreeArrayNode;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\n/**\n * Gets information about the range of nodes being targeted by an {@link Range}\n */\nexport function getRangeInfo(range: Range, idGenerator: IdGenerator): RangeInfo {\n\tconst { array: arrayFrom, index: startIndex } = getPlaceInfo(range.from, idGenerator);\n\tconst { array: arrayTo, index: endIndex } = getPlaceInfo(range.to, idGenerator);\n\n\tif (arrayFrom !== arrayTo) {\n\t\tthrow new UsageError(\n\t\t\t'The \"from\" node and \"to\" nodes of the range must be in the same parent array.',\n\t\t);\n\t}\n\n\treturn { array: arrayFrom, startIndex, endIndex };\n}\n\nfunction getPlaceInfo(\n\tplace: ObjectPlace | ArrayPlace,\n\tidGenerator: IdGenerator,\n): {\n\tarray: TreeArrayNode;\n\tindex: number;\n} {\n\tif (place.type === \"arrayPlace\") {\n\t\tconst parent = idGenerator.getNode(place.parentId) ?? fail(\"Expected parent node\");\n\t\tconst child = (parent as unknown as Record<string, unknown>)[place.field];\n\t\tif (child === undefined) {\n\t\t\tthrow new UsageError(`No child under field field`);\n\t\t}\n\t\tconst schema = Tree.schema(child as TreeNode);\n\t\tif (schema.kind !== NodeKind.Array) {\n\t\t\tthrow new UsageError(\"Expected child to be in an array node\");\n\t\t}\n\t\treturn {\n\t\t\tarray: child as TreeArrayNode,\n\t\t\tindex: place.location === \"start\" ? 0 : (child as TreeArrayNode).length,\n\t\t};\n\t} else {\n\t\tconst node = getNodeFromTarget(place, idGenerator);\n\t\tconst nodeIndex = Tree.key(node);\n\t\tconst parent = Tree.parent(node);\n\t\tif (parent === undefined) {\n\t\t\tthrow new UsageError(\"TODO: root node target not supported\");\n\t\t}\n\t\tconst schema = Tree.schema(parent);\n\t\tif (schema.kind !== NodeKind.Array) {\n\t\t\tthrow new UsageError(\"Expected child to be in an array node\");\n\t\t}\n\t\treturn {\n\t\t\tarray: parent as unknown as TreeArrayNode,\n\t\t\tindex: place.place === \"before\" ? (nodeIndex as number) : (nodeIndex as number) + 1,\n\t\t};\n\t}\n}\n\n/**\n * Returns the target node with the matching internal objectId using the provided {@link ObjectTarget}\n */\nfunction getNodeFromTarget(target: ObjectTarget, idGenerator: IdGenerator): TreeNode {\n\tconst node = idGenerator.getNode(target.target);\n\tassert(node !== undefined, 0xa79 /* objectId does not exist in nodeMap */);\n\treturn node;\n}\n\n/**\n * Checks that the objectIds of the Tree Nodes within the givin the {@link TreeEdit} exist within the given {@link IdGenerator}\n *\n * @throws An {@link UsageError} if the objectIdKey does not exist in the {@link IdGenerator}\n */\nfunction assertObjectIdsExist(treeEdit: TreeEdit, idGenerator: IdGenerator): void {\n\tswitch (treeEdit.type) {\n\t\tcase \"insert\": {\n\t\t\tif (treeEdit.destination.type === \"objectPlace\") {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.target) === undefined) {\n\t\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.destination.target} does not exist`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.parentId) === undefined) {\n\t\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.destination.parentId} does not exist`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"remove\": {\n\t\t\tif (isRange(treeEdit.source)) {\n\t\t\t\tconst missingObjectIds = [\n\t\t\t\t\ttreeEdit.source.from.target,\n\t\t\t\t\ttreeEdit.source.to.target,\n\t\t\t\t].filter((id) => !idGenerator.getNode(id));\n\n\t\t\t\tif (missingObjectIds.length > 0) {\n\t\t\t\t\tthrow new UsageError(`objectIdKeys [${missingObjectIds}] does not exist`);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisObjectTarget(treeEdit.source) &&\n\t\t\t\tidGenerator.getNode(treeEdit.source.target) === undefined\n\t\t\t) {\n\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.source.target} does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"modify\": {\n\t\t\tif (idGenerator.getNode(treeEdit.target.target) === undefined) {\n\t\t\t\tthrow new UsageError(`objectIdKey ${treeEdit.target.target} does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"move\": {\n\t\t\tconst invalidObjectIds: string[] = [];\n\t\t\t// check the source\n\t\t\tif (isRange(treeEdit.source)) {\n\t\t\t\tconst missingObjectIds = [\n\t\t\t\t\ttreeEdit.source.from.target,\n\t\t\t\t\ttreeEdit.source.to.target,\n\t\t\t\t].filter((id) => !idGenerator.getNode(id));\n\n\t\t\t\tif (missingObjectIds.length > 0) {\n\t\t\t\t\tinvalidObjectIds.push(...missingObjectIds);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tisObjectTarget(treeEdit.source) &&\n\t\t\t\tidGenerator.getNode(treeEdit.source.target) === undefined\n\t\t\t) {\n\t\t\t\tinvalidObjectIds.push(treeEdit.source.target);\n\t\t\t}\n\n\t\t\t// check the destination\n\t\t\tif (treeEdit.destination.type === \"objectPlace\") {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.target) === undefined) {\n\t\t\t\t\tinvalidObjectIds.push(treeEdit.destination.target);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (idGenerator.getNode(treeEdit.destination.parentId) === undefined) {\n\t\t\t\t\tinvalidObjectIds.push(treeEdit.destination.parentId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (invalidObjectIds.length > 0) {\n\t\t\t\tthrow new UsageError(`objectIdKeys [${invalidObjectIds}] does not exist`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nconst createNodePathRecursive = (\n\tnode: TreeNode | undefined,\n\tidGenerator: IdGenerator,\n\tcurrentPath: NodePath,\n): NodePath => {\n\tif (node === undefined) {\n\t\treturn currentPath;\n\t}\n\n\tcurrentPath.push({\n\t\tshortId: Tree.shortId(node),\n\t\tschemaIdentifier: Tree.schema(node).identifier,\n\t\tparentField: Tree.key(node),\n\t});\n\n\tconst parentNode = Tree.parent(node);\n\treturn createNodePathRecursive(parentNode, idGenerator, currentPath);\n};\n\n/**\n * Creates a diff for an Insert TreeEdit.\n *\n * @remarks\n * This function is only invoked within the \"insert\" case block.\n *\n * This must only be called AFTER an insertion is made.\n * It generates the insert diff after the node has been successfully inserted, as the node's index may\n * be required to support undoing the insert operation, and we don't know that index until the insert has been made.\n */\nfunction createInsertDiff(\n\tnewlyInsertedNode: TreeNode,\n\taiExplanation: string,\n\tidGenerator: IdGenerator,\n): InsertDiff {\n\treturn {\n\t\ttype: \"insert\",\n\t\tnodePath: createNodePathRecursive(newlyInsertedNode, idGenerator, []),\n\t\tnodeContent: JSON.parse(JSON.stringify(newlyInsertedNode)),\n\t\taiExplanation,\n\t};\n}\n\n/**\n * Returns an object identical to the input except that the special 'objectIdKey' field (only intended for use by the LLM agent) is removed if present.\n * @remarks The input object is not modified.\n */\nfunction removeAgentObjectIdField(oldValue: unknown): unknown {\n\tif (typeof oldValue === \"object\" && oldValue !== null && !Array.isArray(oldValue)) {\n\t\tconst { [objectIdKey]: _, ...rest } = oldValue as Record<string, unknown>;\n\t\treturn rest;\n\t}\n\treturn oldValue;\n}\n\n/**\n * Creates a diff for a Modify TreeEdit.\n *\n * @remarks\n * This function must only be called BEFORE a modify edit is applied.\n * For move operations, the diff is created before the node(s) have been successfully moved,\n * since the original index is needed to restore the node(s) if the move operation need to undo.\n */\nfunction createModifyDiff(treeEdit: Modify, idGenerator: IdGenerator): ModifyDiff {\n\tconst targetNode = getNodeFromTarget(treeEdit.target, idGenerator);\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\tconst targetNodeAtField: unknown = (targetNode as any)[treeEdit.field];\n\n\tif (isPrimitive(targetNodeAtField)) {\n\t\treturn {\n\t\t\ttype: \"modify\",\n\t\t\tnodePath: createNodePathRecursive(targetNode, idGenerator, [\n\t\t\t\t{\n\t\t\t\t\tshortId: undefined,\n\t\t\t\t\tparentField: treeEdit.field,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tschemaIdentifier: getSchemaIdentifier(treeEdit.modification)!,\n\t\t\t\t},\n\t\t\t]),\n\t\t\tnewValue: treeEdit.modification,\n\t\t\toldValue: targetNodeAtField,\n\t\t\taiExplanation: treeEdit.explanation,\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: \"modify\",\n\t\tnodePath: createNodePathRecursive(targetNodeAtField as TreeNode, idGenerator, []),\n\t\tnewValue: treeEdit.modification,\n\t\toldValue: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetNodeAtField))),\n\t\taiExplanation: treeEdit.explanation,\n\t};\n}\n\n/**\n * Creates a diff for a Remove TreeEdit.\n *\n * @remarks\n * This function must only be called BEFORE a remove edit is applied.\n * It generates the remove diff before the node has been successfully removed, as the node's index may\n * be required to support undoing the remove operation, and we don't know that index until the remove has been made.\n */\nfunction createRemoveDiff(\n\ttreeEdit: Remove,\n\tidGenerator: IdGenerator,\n): RemoveNodeDiff | ArraySingleRemoveDiff | ArrayRangeRemoveDiff {\n\tconst source = treeEdit.source;\n\tif (isObjectTarget(source)) {\n\t\tconst node = getNodeFromTarget(source, idGenerator);\n\t\tconst parentNode = Tree.parent(node);\n\t\tif (parentNode === undefined) {\n\t\t\tthrow new Error(\"Unexpectedly received a root node as the target of a remove edit\");\n\t\t} else if (Tree.schema(parentNode).kind === NodeKind.Array) {\n\t\t\tconst nodeIndex = Tree.key(node) as number;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst targetRemovedNode = (parentNode as TreeArrayNode).at(nodeIndex)!;\n\n\t\t\tif (isPrimitive(targetRemovedNode)) {\n\t\t\t\t// Note that this cause should not be possible, still putting the error here in case things change so that this function is updated properly\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Unexpectedly recieved a primitive node as the target of a remove edit\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"remove\",\n\t\t\t\tremovalType: \"remove-array-single\",\n\t\t\t\tnodePath: createNodePathRecursive(targetRemovedNode as TreeNode, idGenerator, []),\n\t\t\t\taiExplanation: treeEdit.explanation,\n\t\t\t\tnodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetRemovedNode))),\n\t\t\t};\n\t\t} else {\n\t\t\tconst fieldKey = Tree.key(node);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\tconst targetNodeAtField: unknown = (parentNode as any)[fieldKey];\n\n\t\t\tif (isPrimitive(targetNodeAtField)) {\n\t\t\t\t// Note that this cause should not be possible, still putting the error here in case things change so that this function is updated properly\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Unexpectedly recieved a primitive node as the target of a remove field edit\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: \"remove\",\n\t\t\t\tremovalType: \"remove-node\",\n\t\t\t\tnodePath: createNodePathRecursive(targetNodeAtField as TreeNode, idGenerator, []),\n\t\t\t\taiExplanation: treeEdit.explanation,\n\t\t\t\tnodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(targetNodeAtField))),\n\t\t\t};\n\t\t}\n\t} else if (isRange(source)) {\n\t\tconst { array, startIndex, endIndex } = getRangeInfo(source, idGenerator);\n\t\tconst removedNodePaths: NodePath[] = [];\n\t\tconst removedNodes: TreeNode[] = [];\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst nodeToRemove = array.at(i)!;\n\t\t\tif (!isPrimitive(nodeToRemove)) {\n\t\t\t\tremovedNodePaths.push(\n\t\t\t\t\tcreateNodePathRecursive(nodeToRemove as TreeNode, idGenerator, []),\n\t\t\t\t);\n\t\t\t\tremovedNodes.push(nodeToRemove as TreeNode);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: \"remove\",\n\t\t\tremovalType: \"remove-array-range\",\n\t\t\tnodePaths: removedNodePaths,\n\t\t\taiExplanation: treeEdit.explanation,\n\t\t\tnodeContents: removedNodes.map((node) =>\n\t\t\t\tremoveAgentObjectIdField(JSON.parse(JSON.stringify(node))),\n\t\t\t),\n\t\t};\n\t} else {\n\t\tthrow new Error(\"Invalid source encountered when trying to create diff for remove edit\");\n\t}\n}\n\n/**\n * Creates a diff for a Move TreeEdit.\n *\n * @remarks\n * This function must only be called BEFORE a move edit is applied.\n * For move operations, the diff is created before the node(s) have been successfully moved,\n * since the original index is needed to restore the node(s) if the move operation need to undo.\n */\nfunction createMoveDiff(\n\ttreeEdit: Move,\n\tidGenerator: IdGenerator,\n): MoveSingleDiff | MoveRangeDiff {\n\tconst source = treeEdit.source;\n\tconst destination = treeEdit.destination;\n\tconst { array: destinationArrayNode } = getPlaceInfo(destination, idGenerator);\n\n\tif (isObjectTarget(source)) {\n\t\tconst node = getNodeFromTarget(source, idGenerator);\n\t\treturn {\n\t\t\ttype: \"move\",\n\t\t\tmoveType: \"move-single\",\n\t\t\tsourceNodePath: createNodePathRecursive(node, idGenerator, []),\n\t\t\tdestinationNodePath: createNodePathRecursive(destinationArrayNode, idGenerator, []),\n\t\t\taiExplanation: treeEdit.explanation,\n\t\t\tnodeContent: removeAgentObjectIdField(JSON.parse(JSON.stringify(node))),\n\t\t};\n\t} else if (isRange(source)) {\n\t\tconst {\n\t\t\tarray,\n\t\t\tstartIndex: sourceStartIndex,\n\t\t\tendIndex: sourceEndIndex,\n\t\t} = getRangeInfo(source, idGenerator);\n\n\t\tconst movedNodePaths: NodePath[] = [];\n\t\tconst movedNodes: TreeNode[] = [];\n\t\tfor (let i = sourceStartIndex; i < sourceEndIndex; i++) {\n\t\t\tconst nodeToMove = array.at(i);\n\t\t\tif (!isPrimitive(nodeToMove)) {\n\t\t\t\tmovedNodePaths.push(createNodePathRecursive(nodeToMove as TreeNode, idGenerator, []));\n\t\t\t\tmovedNodes.push(nodeToMove as TreeNode);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"move\",\n\t\t\tmoveType: \"move-range\",\n\t\t\tsourceNodePaths: movedNodePaths,\n\t\t\tdestinationNodePath: createNodePathRecursive(destinationArrayNode, idGenerator, []),\n\t\t\taiExplanation: treeEdit.explanation,\n\t\t\tnodeContents: movedNodes.map((node) =>\n\t\t\t\tremoveAgentObjectIdField(JSON.parse(JSON.stringify(node))),\n\t\t\t),\n\t\t};\n\t} else {\n\t\tthrow new Error(\"Invalid source for move edit\");\n\t}\n}\n\ninterface SchemaInfo {\n\ttreeNodeSchema: TreeNodeSchema;\n\tsimpleNodeSchema: new (dummy: unknown) => TreeNode;\n}\n\nfunction getSimpleNodeSchema(node: TreeNode): SchemaInfo {\n\tconst treeNodeSchema = Tree.schema(node);\n\tconst simpleNodeSchema = treeNodeSchema as unknown as new (dummy: unknown) => TreeNode;\n\treturn { treeNodeSchema, simpleNodeSchema };\n}\n"]}
|