@fluidframework/tree-agent 2.71.0 → 2.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.eslintrc.cjs +2 -2
  2. package/CHANGELOG.md +8 -1
  3. package/api-report/tree-agent.alpha.api.md +88 -17
  4. package/dist/agent.d.ts +5 -31
  5. package/dist/agent.d.ts.map +1 -1
  6. package/dist/agent.js +19 -38
  7. package/dist/agent.js.map +1 -1
  8. package/dist/alpha.d.ts +12 -3
  9. package/dist/api.d.ts +38 -20
  10. package/dist/api.d.ts.map +1 -1
  11. package/dist/api.js.map +1 -1
  12. package/dist/index.d.ts +4 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/prompt.d.ts +2 -2
  17. package/dist/prompt.d.ts.map +1 -1
  18. package/dist/prompt.js +4 -4
  19. package/dist/prompt.js.map +1 -1
  20. package/dist/propertyBinding.d.ts +106 -0
  21. package/dist/propertyBinding.d.ts.map +1 -0
  22. package/dist/propertyBinding.js +64 -0
  23. package/dist/propertyBinding.js.map +1 -0
  24. package/dist/subtree.d.ts +8 -9
  25. package/dist/subtree.d.ts.map +1 -1
  26. package/dist/subtree.js +21 -21
  27. package/dist/subtree.js.map +1 -1
  28. package/dist/typeGeneration.d.ts.map +1 -1
  29. package/dist/typeGeneration.js +78 -21
  30. package/dist/typeGeneration.js.map +1 -1
  31. package/dist/utils.d.ts +1 -7
  32. package/dist/utils.d.ts.map +1 -1
  33. package/dist/utils.js +17 -3
  34. package/dist/utils.js.map +1 -1
  35. package/lib/agent.d.ts +5 -31
  36. package/lib/agent.d.ts.map +1 -1
  37. package/lib/agent.js +17 -35
  38. package/lib/agent.js.map +1 -1
  39. package/lib/alpha.d.ts +12 -3
  40. package/lib/api.d.ts +38 -20
  41. package/lib/api.d.ts.map +1 -1
  42. package/lib/api.js.map +1 -1
  43. package/lib/index.d.ts +4 -3
  44. package/lib/index.d.ts.map +1 -1
  45. package/lib/index.js +1 -1
  46. package/lib/index.js.map +1 -1
  47. package/lib/prompt.d.ts +2 -2
  48. package/lib/prompt.d.ts.map +1 -1
  49. package/lib/prompt.js +4 -4
  50. package/lib/prompt.js.map +1 -1
  51. package/lib/propertyBinding.d.ts +106 -0
  52. package/lib/propertyBinding.d.ts.map +1 -0
  53. package/lib/propertyBinding.js +59 -0
  54. package/lib/propertyBinding.js.map +1 -0
  55. package/lib/subtree.d.ts +8 -9
  56. package/lib/subtree.d.ts.map +1 -1
  57. package/lib/subtree.js +21 -21
  58. package/lib/subtree.js.map +1 -1
  59. package/lib/typeGeneration.d.ts.map +1 -1
  60. package/lib/typeGeneration.js +78 -21
  61. package/lib/typeGeneration.js.map +1 -1
  62. package/lib/utils.d.ts +1 -7
  63. package/lib/utils.d.ts.map +1 -1
  64. package/lib/utils.js +17 -3
  65. package/lib/utils.js.map +1 -1
  66. package/package.json +13 -13
  67. package/src/agent.ts +27 -69
  68. package/src/api.ts +56 -29
  69. package/src/index.ts +16 -4
  70. package/src/prompt.ts +6 -6
  71. package/src/propertyBinding.ts +181 -0
  72. package/src/subtree.ts +26 -29
  73. package/src/typeGeneration.ts +90 -24
  74. package/src/utils.ts +21 -15
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.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\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { isFluidHandle } from \"@fluidframework/runtime-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport type { ImplicitFieldSchema, TreeNodeSchemaClass } from \"@fluidframework/tree\";\nimport type {\n\tInsertableContent,\n\tTreeBranchAlpha,\n\tTreeNode,\n\tTreeNodeSchema,\n\tTreeViewAlpha,\n\tUnsafeUnknownSchema,\n} from \"@fluidframework/tree/alpha\";\nimport {\n\tArrayNodeSchema,\n\tMapNodeSchema,\n\tObjectNodeSchema,\n\tRecordNodeSchema,\n\tTreeAlpha,\n} from \"@fluidframework/tree/alpha\";\nimport { NodeKind, normalizeFieldSchema } from \"@fluidframework/tree/internal\";\nimport { z } from \"zod\";\n\nimport { FunctionWrapper } from \"./methodBinding.js\";\n\n/**\n * Subset of Map interface.\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport interface MapGetSet<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n}\n\n/**\n * TBD\n */\nexport function fail(message: string): never {\n\tthrow new Error(message);\n}\n\n/**\n * Map one iterable to another by transforming each element one at a time\n * @param iterable - the iterable to transform\n * @param map - the transformation function to run on each element of the iterable\n * @returns a new iterable of elements which have been transformed by the `map` function\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport function* mapIterable<T, U>(\n\titerable: Iterable<T>,\n\tmap: (t: T) => U,\n): IterableIterator<U> {\n\tfor (const t of iterable) {\n\t\tyield map(t);\n\t}\n}\n\n/**\n * Retrieve a value from a map with the given key, or create a new entry if the key is not in the map.\n * @param map - The map to query/update\n * @param key - The key to lookup in the map\n * @param defaultValue - a function which returns a default value. This is called and used to set an initial value for the given key in the map if none exists\n * @returns either the existing value for the given key, or the newly-created value (the result of `defaultValue`)\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport function getOrCreate<K, V>(\n\tmap: MapGetSet<K, V>,\n\tkey: K,\n\tdefaultValue: (key: K) => V,\n): V {\n\tlet value = map.get(key);\n\tif (value === undefined) {\n\t\tvalue = defaultValue(key);\n\t\tmap.set(key, value);\n\t}\n\treturn value;\n}\n\n/**\n * TODO\n * @alpha\n * @privateRemarks This is a subset of the TreeViewAlpha functionality because if take it wholesale, it causes problems with invariance of the generic parameters.\n */\nexport type TreeView<TRoot extends ImplicitFieldSchema | UnsafeUnknownSchema> = Pick<\n\tTreeViewAlpha<TRoot>,\n\t\"root\" | \"fork\" | \"merge\" | \"rebaseOnto\" | \"schema\" | \"events\"\n> &\n\tTreeBranchAlpha;\n\n/**\n * TODO\n */\nexport function tryGetSingleton<T>(set: ReadonlySet<T>): T | undefined {\n\tif (set.size === 1) {\n\t\tfor (const item of set) {\n\t\t\treturn item;\n\t\t}\n\t}\n}\n\n/**\n * Does it have at least two elements?\n */\nexport function hasAtLeastTwo<T>(array: T[]): array is [T, T, ...T[]] {\n\treturn array.length >= 2;\n}\n\n/**\n * Include this property in a field's schema metadata to indicate that the field's value should be generated via a provided function rather than by the LLM.\n * @example\n * ```ts\n * class Object extends schemaFactory.object(\"Object\", {\n * created: sf.required(sf.number, {\n * custom: {\n * // The LLM will ignore this field, and instead it will be populated with the result of the function\n * [llmDefault]: () => Date.now(),\n * },\n * }),\n * }) {};\n * ```\n * @alpha\n */\nexport const llmDefault = Symbol(\"tree-agent/llmDefault\");\n// TODO: make this a wrapper function instead, and hide the symbol.\n// function llmDefault<T extends FieldSchemaMetadata>(metadata: T): T { ... }\n\n/**\n * Usage fail\n */\nexport function failUsage(message: string): never {\n\tthrow new UsageError(message);\n}\n\n/**\n * Construct an object node from a schema and value.\n */\nexport function constructNode(schema: TreeNodeSchema, value: InsertableContent): TreeNode {\n\tconst node = TreeAlpha.create<UnsafeUnknownSchema>(schema, value);\n\tassert(\n\t\tnode !== undefined && node !== null && typeof node === \"object\" && !isFluidHandle(node),\n\t\t0xc1e /* Expected a constructed node to be an object */,\n\t);\n\treturn node;\n}\n\n/**\n * Returns the unqualified name of a tree value's schema (e.g. a node with schema identifier `\"my.scope.MyNode\"` returns `\"MyNode\"`).\n * @remarks If the schema is an inlined array, map, or record type, then it has no name and this function will return a string representation of the type (e.g., `\"MyNode[]\"` or `\"Map<string, MyNode>\"`).\n */\nexport function getFriendlyName(schema: TreeNodeSchema): string {\n\tif (schema.kind === NodeKind.Leaf || isNamedSchema(schema.identifier)) {\n\t\treturn unqualifySchema(schema.identifier);\n\t}\n\n\tconst childNames = Array.from(schema.childTypes, (t) => getFriendlyName(t));\n\tif (schema instanceof ArrayNodeSchema) {\n\t\treturn childNames.length > 1 ? `(${childNames.join(\" | \")})[]` : `${childNames[0]}[]`;\n\t}\n\tif (schema instanceof MapNodeSchema) {\n\t\treturn childNames.length > 1\n\t\t\t? `Map<string, (${childNames.join(\" | \")})>`\n\t\t\t: `Map<string, ${childNames[0]}>`;\n\t}\n\tif (schema instanceof RecordNodeSchema) {\n\t\treturn childNames.length > 1\n\t\t\t? `Record<string, (${childNames.join(\" | \")})>`\n\t\t\t: `Record<string, ${childNames[0]}>`;\n\t}\n\tfail(\"Unexpected node schema\");\n}\n\n/**\n * Returns true if the schema identifier represents a named schema (object, named array, named map, or named record).\n * @remarks This does not include primitive schemas or inlined array/map/record schemas.\n */\nexport function isNamedSchema(schemaIdentifier: string): boolean {\n\tif (\n\t\t[\"string\", \"number\", \"boolean\", \"null\", \"handle\"].includes(\n\t\t\tunqualifySchema(schemaIdentifier),\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\treturn schemaIdentifier.match(/(?:Array|Map|Record)<\\[\"(.*)\"]>/) === null;\n}\n\n/**\n * Returns the unqualified name of a schema (e.g. `\"my.scope.MyNode\"` returns `\"MyNode\"`).\n * @remarks This works by removing all characters before the last dot in the schema name.\n * If there is a dot in a user's schema name, this might produce unexpected results.\n */\nexport function unqualifySchema(schemaIdentifier: string): string {\n\t// Get the unqualified name by removing the scope (everything before the last dot).\n\tconst matches = schemaIdentifier.match(/[^.]+$/);\n\tif (matches === null) {\n\t\treturn schemaIdentifier; // Return the original name if it is unscoped.\n\t}\n\treturn matches[0];\n}\n\n/**\n * Details about the properties of a TypeScript schema represented as Zod.\n */\nexport interface SchemaDetails {\n\thasHelperMethods: boolean;\n}\n\n// TODO: yuck, this entire file has too many statics. we should rewrite it as a generic zod schema walk.\nlet detailsI: SchemaDetails = {\n\thasHelperMethods: false,\n};\n\n/**\n * Returns the TypeScript source code corresponding to a Zod schema. The schema is supplied as an object where each\n * property provides a name for an associated Zod type. The return value is a string containing the TypeScript source\n * code corresponding to the schema. Each property of the schema object is emitted as a named `interface` or `type`\n * declaration for the associated type and is referenced by that name in the emitted type declarations. Other types\n * referenced in the schema are emitted in their structural form.\n * @param schema - A schema object where each property provides a name for an associated Zod type.\n * @param details - Optional details about the schema. The fields will be set according to the details in the given schema.\n * @returns The TypeScript source code corresponding to the schema.\n */\nexport function getZodSchemaAsTypeScript(\n\tschema: Record<string, z.ZodType>,\n\tdetails?: SchemaDetails,\n): string {\n\tdetailsI = details ?? { hasHelperMethods: false };\n\tlet result = \"\";\n\tlet startOfLine = true;\n\tlet indent = 0;\n\tconst entries = [...Object.entries(schema)];\n\tconst namedTypes = new Map<object, string>(\n\t\tentries.map(([name, type]) => [getTypeIdentity(type), name]),\n\t);\n\tfor (const [name, type] of entries) {\n\t\tif (result) {\n\t\t\tappendNewLine();\n\t\t}\n\t\tconst description = type._def.description;\n\t\tif (description !== undefined && description !== \"\") {\n\t\t\tfor (const comment of description.split(\"\\n\")) {\n\t\t\t\tappend(`// ${comment}`);\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodObject) {\n\t\t\tappend(`interface ${name} `);\n\t\t\tappendObjectType(type as z.ZodObject<z.ZodRawShape>);\n\t\t} else {\n\t\t\tappend(`type ${name} = `);\n\t\t\tappendTypeDefinition(type);\n\t\t\tappend(\";\");\n\t\t}\n\t\tappendNewLine();\n\t}\n\treturn result;\n\n\tfunction append(s: string) {\n\t\tif (startOfLine) {\n\t\t\tresult += \" \".repeat(indent);\n\t\t\tstartOfLine = false;\n\t\t}\n\t\tresult += s;\n\t}\n\n\tfunction appendNewLine() {\n\t\tappend(\"\\n\");\n\t\tstartOfLine = true;\n\t}\n\n\tfunction appendType(type: z.ZodType, minPrecedence = TypePrecedence.Object) {\n\t\tconst name = namedTypes.get(getTypeIdentity(type));\n\t\tif (name === undefined) {\n\t\t\tconst parenthesize = getTypePrecendece(type) < minPrecedence;\n\t\t\tif (parenthesize) append(\"(\");\n\t\t\tappendTypeDefinition(type);\n\t\t\tif (parenthesize) append(\")\");\n\t\t} else {\n\t\t\tappend(name);\n\t\t}\n\t}\n\n\tfunction appendTypeDefinition(type: z.ZodType) {\n\t\tswitch (getTypeKind(type)) {\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodString: {\n\t\t\t\treturn append(\"string\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodNumber: {\n\t\t\t\treturn append(\"number\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodBoolean: {\n\t\t\t\treturn append(\"boolean\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodDate: {\n\t\t\t\treturn append(\"Date\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUndefined: {\n\t\t\t\treturn append(\"undefined\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodNull: {\n\t\t\t\treturn append(\"null\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUnknown: {\n\t\t\t\treturn append(\"unknown\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodArray: {\n\t\t\t\treturn appendArrayType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodObject: {\n\t\t\t\treturn appendObjectType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUnion: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t(type._def as z.ZodUnionDef).options,\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[...(type._def as z.ZodDiscriminatedUnionDef<string>).options.values()],\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodIntersection: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[\n\t\t\t\t\t\t(type._def as z.ZodIntersectionDef).left,\n\t\t\t\t\t\t(type._def as z.ZodIntersectionDef).right,\n\t\t\t\t\t],\n\t\t\t\t\tTypePrecedence.Intersection,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodTuple: {\n\t\t\t\treturn appendTupleType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodRecord: {\n\t\t\t\treturn appendRecordType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodMap: {\n\t\t\t\treturn appendMapType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodLiteral: {\n\t\t\t\treturn appendLiteral((type._def as z.ZodLiteralDef).value);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodEnum: {\n\t\t\t\treturn append(\n\t\t\t\t\t(type._def as z.ZodEnumDef).values.map((value) => JSON.stringify(value)).join(\" | \"),\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodOptional: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[(type._def as z.ZodOptionalDef).innerType, z.undefined()],\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodReadonly: {\n\t\t\t\treturn appendReadonlyType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodEffects: {\n\t\t\t\t// Currently, this only handles schema class instances, but there are other cases in which a ZodEffects could theoretically be used.\n\t\t\t\tif (instanceOfs.has(type)) {\n\t\t\t\t\tconst objectNodeSchema = instanceOfs.get(type);\n\t\t\t\t\tif (objectNodeSchema === undefined) {\n\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t`Unsupported zod effects type when transforming class method: ${getTypeKind(type)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn append(getFriendlyName(objectNodeSchema));\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Unsupported zod effects type. Did you use z.instanceOf? Use ExposedMethods.instanceOf function to reference schema classes in methods.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodVoid: {\n\t\t\t\treturn append(\"void\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodLazy: {\n\t\t\t\treturn appendType((type._def as z.ZodLazyDef).getter());\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t`Unsupported type when transforming class method: ${getTypeKind(type)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction appendBoundMethods(boundType: z.ZodType): void {\n\t\t// eslint-disable-next-line prefer-const\n\t\tfor (let [name, type] of Object.entries((boundType._def as z.ZodObjectDef).shape())) {\n\t\t\t// Special handling of methods on objects\n\t\t\tconst method = (type as unknown as { method: object | undefined }).method;\n\t\t\tif (method !== undefined && method instanceof FunctionWrapper) {\n\t\t\t\tdetailsI.hasHelperMethods = true;\n\t\t\t\tappend(name);\n\t\t\t\tappend(\"(\");\n\t\t\t\tlet first = true;\n\t\t\t\tfor (const [argName, argType] of method.args) {\n\t\t\t\t\tif (!first) append(\", \");\n\t\t\t\t\tif (getTypeKind(argType) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\t\t\tappend(`${argName}?: `);\n\t\t\t\t\t\tappendType((argType._def as z.ZodOptionalDef).innerType, TypePrecedence.Object);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tappend(`${argName}: `);\n\t\t\t\t\t\tappendType(argType);\n\t\t\t\t\t}\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\t\t\t\tif (method.rest !== null) {\n\t\t\t\t\tif (!first) append(\", \");\n\t\t\t\t\tappend(\"...rest: \");\n\t\t\t\t\tappendType(method.rest, TypePrecedence.Object);\n\t\t\t\t\tappend(\"[]\");\n\t\t\t\t}\n\t\t\t\tappend(`): `);\n\t\t\t\tappendType(method.returns, TypePrecedence.Object);\n\t\t\t\tappend(\";\");\n\t\t\t\tif (method.description !== undefined) {\n\t\t\t\t\tappend(` // ${method.description}`);\n\t\t\t\t}\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction appendArrayType(arrayType: z.ZodType) {\n\t\tappendType((arrayType._def as z.ZodArrayDef).type, TypePrecedence.Object);\n\t\tappend(\"[]\");\n\t}\n\n\tfunction appendObjectType(objectType: z.ZodType) {\n\t\tappend(\"{\");\n\t\tappendNewLine();\n\t\tindent++;\n\t\t// eslint-disable-next-line prefer-const\n\t\tfor (let [name, type] of Object.entries((objectType._def as z.ZodObjectDef).shape())) {\n\t\t\tconst method = (type as unknown as { method: object | undefined }).method;\n\t\t\tif (method === undefined || !(method instanceof FunctionWrapper)) {\n\t\t\t\tappend(name);\n\t\t\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\t\tappend(\"?\");\n\t\t\t\t\ttype = (type._def as z.ZodOptionalDef).innerType;\n\t\t\t\t}\n\t\t\t\tappend(\": \");\n\t\t\t\tappendType(type);\n\t\t\t\tappend(\";\");\n\t\t\t\tconst comment = type.description;\n\t\t\t\tif (comment !== undefined && comment !== \"\") append(` // ${comment}`);\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t\tappendBoundMethods(objectType);\n\t\tindent--;\n\t\tappend(\"}\");\n\t}\n\n\tfunction appendUnionOrIntersectionTypes(\n\t\ttypes: readonly z.ZodType[],\n\t\tminPrecedence: TypePrecedence,\n\t) {\n\t\tlet first = true;\n\t\tfor (const type of types) {\n\t\t\tif (!first) append(minPrecedence === TypePrecedence.Intersection ? \" & \" : \" | \");\n\t\t\tappendType(type, minPrecedence);\n\t\t\tfirst = false;\n\t\t}\n\t}\n\n\tfunction appendTupleType(tupleType: z.ZodType) {\n\t\tappend(\"[\");\n\t\tlet first = true;\n\t\tfor (const type of (tupleType._def as z.ZodTupleDef<z.ZodTupleItems, z.ZodType>).items) {\n\t\t\tif (!first) append(\", \");\n\t\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\tappendType((type._def as z.ZodOptionalDef).innerType, TypePrecedence.Object);\n\t\t\t\tappend(\"?\");\n\t\t\t} else {\n\t\t\t\tappendType(type);\n\t\t\t}\n\t\t\tfirst = false;\n\t\t}\n\t\tconst rest = (tupleType._def as z.ZodTupleDef<z.ZodTupleItems, z.ZodType | null>).rest;\n\t\tif (rest !== null) {\n\t\t\tif (!first) append(\", \");\n\t\t\tappend(\"...\");\n\t\t\tappendType(rest, TypePrecedence.Object);\n\t\t\tappend(\"[]\");\n\t\t}\n\t\tappend(\"]\");\n\t}\n\n\tfunction appendRecordType(recordType: z.ZodType) {\n\t\tappend(\"Record<\");\n\t\tappendType((recordType._def as z.ZodRecordDef).keyType);\n\t\tappend(\", \");\n\t\tappendType((recordType._def as z.ZodRecordDef).valueType);\n\t\tappend(\">\");\n\t}\n\n\tfunction appendMapType(mapType: z.ZodType) {\n\t\tappend(\"Map<\");\n\t\tappendType((mapType._def as z.ZodMapDef).keyType);\n\t\tappend(\", \");\n\t\tappendType((mapType._def as z.ZodMapDef).valueType);\n\t\tappend(\">\");\n\t}\n\n\tfunction appendLiteral(value: unknown) {\n\t\tappend(\n\t\t\ttypeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n\t\t\t\t? JSON.stringify(value)\n\t\t\t\t: \"any\",\n\t\t);\n\t}\n\n\tfunction appendReadonlyType(readonlyType: z.ZodType) {\n\t\tappend(\"Readonly<\");\n\t\tappendType((readonlyType._def as z.ZodReadonlyDef).innerType);\n\t\tappend(\">\");\n\t}\n}\n\nfunction getTypeKind(type: z.ZodType): z.ZodFirstPartyTypeKind {\n\treturn (type._def as z.ZodTypeDef & { typeName: z.ZodFirstPartyTypeKind }).typeName;\n}\n\nfunction getTypeIdentity(type: z.ZodType): object {\n\tswitch (getTypeKind(type)) {\n\t\tcase z.ZodFirstPartyTypeKind.ZodObject: {\n\t\t\treturn (type._def as z.ZodObjectDef).shape();\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodEnum: {\n\t\t\treturn (type._def as z.ZodEnumDef).values;\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodUnion: {\n\t\t\treturn (type._def as z.ZodUnionDef).options;\n\t\t}\n\t\tdefault: {\n\t\t\treturn type;\n\t\t}\n\t}\n}\n\nconst enum TypePrecedence {\n\tUnion = 0,\n\tIntersection = 1,\n\tObject = 2,\n}\n\nfunction getTypePrecendece(type: z.ZodType): TypePrecedence {\n\tswitch (getTypeKind(type)) {\n\t\tcase z.ZodFirstPartyTypeKind.ZodEnum:\n\t\tcase z.ZodFirstPartyTypeKind.ZodUnion:\n\t\tcase z.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n\t\t\treturn TypePrecedence.Union;\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodIntersection: {\n\t\t\treturn TypePrecedence.Intersection;\n\t\t}\n\t\tdefault: {\n\t\t\treturn TypePrecedence.Object;\n\t\t}\n\t}\n}\n\n/**\n * Create a Zod schema for a SharedTree schema class.\n * @alpha\n */\nexport function instanceOf<T extends TreeNodeSchemaClass>(\n\tschema: T,\n): z.ZodType<InstanceType<T>, z.ZodTypeDef, InstanceType<T>> {\n\tif (!(schema instanceof ObjectNodeSchema)) {\n\t\tthrow new UsageError(`${schema.identifier} must be an instance of ObjectNodeSchema.`);\n\t}\n\tconst effect = z.instanceof(schema);\n\tinstanceOfs.set(effect, schema);\n\treturn effect;\n}\n\nconst instanceOfs = new WeakMap<z.ZodTypeAny, ObjectNodeSchema>();\n\n/**\n * Adds all (optionally filtered) schemas reachable from the given schema to the given set.\n * @returns The set of schemas added (same as the `schemas` parameter, if supplied).\n */\nexport function findSchemas(\n\tschema: ImplicitFieldSchema,\n\tfilter: (schema: TreeNodeSchema) => boolean = () => true,\n\tschemas = new Set<TreeNodeSchema>(),\n): Set<TreeNodeSchema> {\n\tfor (const nodeSchema of normalizeFieldSchema(schema).allowedTypeSet) {\n\t\tif (!schemas.has(nodeSchema)) {\n\t\t\tif (filter(nodeSchema)) {\n\t\t\t\tschemas.add(nodeSchema);\n\t\t\t}\n\t\t\tfindSchemas([...nodeSchema.childTypes], filter, schemas);\n\t\t}\n\t}\n\treturn schemas;\n}\n\n/**\n * De-capitalize (the first letter of) a string.\n */\nexport function communize(str: string): string {\n\treturn str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n * Stringify an unknown error value\n */\nexport function toErrorString(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\ttry {\n\t\treturn JSON.stringify(error);\n\t} catch {\n\t\treturn String(error);\n\t}\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.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\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { isFluidHandle } from \"@fluidframework/runtime-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport type { ImplicitFieldSchema, TreeNodeSchemaClass } from \"@fluidframework/tree\";\nimport type {\n\tInsertableContent,\n\tTreeNode,\n\tTreeNodeSchema,\n\tUnsafeUnknownSchema,\n} from \"@fluidframework/tree/alpha\";\nimport {\n\tArrayNodeSchema,\n\tMapNodeSchema,\n\tObjectNodeSchema,\n\tRecordNodeSchema,\n\tTreeAlpha,\n} from \"@fluidframework/tree/alpha\";\nimport { NodeKind, normalizeFieldSchema } from \"@fluidframework/tree/internal\";\nimport { z } from \"zod\";\n\nimport { FunctionWrapper } from \"./methodBinding.js\";\nimport { PropertyDef } from \"./propertyBinding.js\";\n\n/**\n * Subset of Map interface.\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport interface MapGetSet<K, V> {\n\tget(key: K): V | undefined;\n\tset(key: K, value: V): void;\n}\n\n/**\n * TBD\n */\nexport function fail(message: string): never {\n\tthrow new Error(message);\n}\n\n/**\n * Map one iterable to another by transforming each element one at a time\n * @param iterable - the iterable to transform\n * @param map - the transformation function to run on each element of the iterable\n * @returns a new iterable of elements which have been transformed by the `map` function\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport function* mapIterable<T, U>(\n\titerable: Iterable<T>,\n\tmap: (t: T) => U,\n): IterableIterator<U> {\n\tfor (const t of iterable) {\n\t\tyield map(t);\n\t}\n}\n\n/**\n * Retrieve a value from a map with the given key, or create a new entry if the key is not in the map.\n * @param map - The map to query/update\n * @param key - The key to lookup in the map\n * @param defaultValue - a function which returns a default value. This is called and used to set an initial value for the given key in the map if none exists\n * @returns either the existing value for the given key, or the newly-created value (the result of `defaultValue`)\n *\n * @remarks originally from tree/src/util/utils.ts\n */\nexport function getOrCreate<K, V>(\n\tmap: MapGetSet<K, V>,\n\tkey: K,\n\tdefaultValue: (key: K) => V,\n): V {\n\tlet value = map.get(key);\n\tif (value === undefined) {\n\t\tvalue = defaultValue(key);\n\t\tmap.set(key, value);\n\t}\n\treturn value;\n}\n\n/**\n * TODO\n */\nexport function tryGetSingleton<T>(set: ReadonlySet<T>): T | undefined {\n\tif (set.size === 1) {\n\t\tfor (const item of set) {\n\t\t\treturn item;\n\t\t}\n\t}\n}\n\n/**\n * Does it have at least two elements?\n */\nexport function hasAtLeastTwo<T>(array: T[]): array is [T, T, ...T[]] {\n\treturn array.length >= 2;\n}\n\n/**\n * Include this property in a field's schema metadata to indicate that the field's value should be generated via a provided function rather than by the LLM.\n * @example\n * ```ts\n * class Object extends schemaFactory.object(\"Object\", {\n * created: sf.required(sf.number, {\n * custom: {\n * // The LLM will ignore this field, and instead it will be populated with the result of the function\n * [llmDefault]: () => Date.now(),\n * },\n * }),\n * }) {};\n * ```\n * @alpha\n */\nexport const llmDefault = Symbol(\"tree-agent/llmDefault\");\n// TODO: make this a wrapper function instead, and hide the symbol.\n// function llmDefault<T extends FieldSchemaMetadata>(metadata: T): T { ... }\n\n/**\n * Usage fail\n */\nexport function failUsage(message: string): never {\n\tthrow new UsageError(message);\n}\n\n/**\n * Construct an object node from a schema and value.\n */\nexport function constructNode(schema: TreeNodeSchema, value: InsertableContent): TreeNode {\n\tconst node = TreeAlpha.create<UnsafeUnknownSchema>(schema, value);\n\tassert(\n\t\tnode !== undefined && node !== null && typeof node === \"object\" && !isFluidHandle(node),\n\t\t0xc1e /* Expected a constructed node to be an object */,\n\t);\n\treturn node;\n}\n\n/**\n * Returns the unqualified name of a tree value's schema (e.g. a node with schema identifier `\"my.scope.MyNode\"` returns `\"MyNode\"`).\n * @remarks If the schema is an inlined array, map, or record type, then it has no name and this function will return a string representation of the type (e.g., `\"MyNode[]\"` or `\"Map<string, MyNode>\"`).\n */\nexport function getFriendlyName(schema: TreeNodeSchema): string {\n\tif (schema.kind === NodeKind.Leaf || isNamedSchema(schema.identifier)) {\n\t\treturn unqualifySchema(schema.identifier);\n\t}\n\n\tconst childNames = Array.from(schema.childTypes, (t) => getFriendlyName(t));\n\tif (schema instanceof ArrayNodeSchema) {\n\t\treturn childNames.length > 1 ? `(${childNames.join(\" | \")})[]` : `${childNames[0]}[]`;\n\t}\n\tif (schema instanceof MapNodeSchema) {\n\t\treturn childNames.length > 1\n\t\t\t? `Map<string, (${childNames.join(\" | \")})>`\n\t\t\t: `Map<string, ${childNames[0]}>`;\n\t}\n\tif (schema instanceof RecordNodeSchema) {\n\t\treturn childNames.length > 1\n\t\t\t? `Record<string, (${childNames.join(\" | \")})>`\n\t\t\t: `Record<string, ${childNames[0]}>`;\n\t}\n\tfail(\"Unexpected node schema\");\n}\n\n/**\n * Returns true if the schema identifier represents a named schema (object, named array, named map, or named record).\n * @remarks This does not include primitive schemas or inlined array/map/record schemas.\n */\nexport function isNamedSchema(schemaIdentifier: string): boolean {\n\tif (\n\t\t[\"string\", \"number\", \"boolean\", \"null\", \"handle\"].includes(\n\t\t\tunqualifySchema(schemaIdentifier),\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\n\treturn schemaIdentifier.match(/(?:Array|Map|Record)<\\[\"(.*)\"]>/) === null;\n}\n\n/**\n * Returns the unqualified name of a schema (e.g. `\"my.scope.MyNode\"` returns `\"MyNode\"`).\n * @remarks This works by removing all characters before the last dot in the schema name.\n * If there is a dot in a user's schema name, this might produce unexpected results.\n */\nexport function unqualifySchema(schemaIdentifier: string): string {\n\t// Get the unqualified name by removing the scope (everything before the last dot).\n\tconst matches = schemaIdentifier.match(/[^.]+$/);\n\tif (matches === null) {\n\t\treturn schemaIdentifier; // Return the original name if it is unscoped.\n\t}\n\treturn matches[0];\n}\n\n/**\n * Details about the properties of a TypeScript schema represented as Zod.\n */\nexport interface SchemaDetails {\n\thasHelperMethods: boolean;\n}\n\n// TODO: yuck, this entire file has too many statics. we should rewrite it as a generic zod schema walk.\nlet detailsI: SchemaDetails = {\n\thasHelperMethods: false,\n};\n\n/**\n * Returns the TypeScript source code corresponding to a Zod schema. The schema is supplied as an object where each\n * property provides a name for an associated Zod type. The return value is a string containing the TypeScript source\n * code corresponding to the schema. Each property of the schema object is emitted as a named `interface` or `type`\n * declaration for the associated type and is referenced by that name in the emitted type declarations. Other types\n * referenced in the schema are emitted in their structural form.\n * @param schema - A schema object where each property provides a name for an associated Zod type.\n * @param details - Optional details about the schema. The fields will be set according to the details in the given schema.\n * @returns The TypeScript source code corresponding to the schema.\n */\nexport function getZodSchemaAsTypeScript(\n\tschema: Record<string, z.ZodType>,\n\tdetails?: SchemaDetails,\n): string {\n\tdetailsI = details ?? { hasHelperMethods: false };\n\tlet result = \"\";\n\tlet startOfLine = true;\n\tlet indent = 0;\n\tconst entries = [...Object.entries(schema)];\n\tconst namedTypes = new Map<object, string>(\n\t\tentries.map(([name, type]) => [getTypeIdentity(type), name]),\n\t);\n\tfor (const [name, type] of entries) {\n\t\tif (result) {\n\t\t\tappendNewLine();\n\t\t}\n\t\tconst description = type._def.description;\n\t\tif (description !== undefined && description !== \"\") {\n\t\t\tfor (const comment of description.split(\"\\n\")) {\n\t\t\t\tappend(`// ${comment}`);\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodObject) {\n\t\t\tappend(`interface ${name} `);\n\t\t\tappendObjectType(type as z.ZodObject<z.ZodRawShape>);\n\t\t} else {\n\t\t\tappend(`type ${name} = `);\n\t\t\tappendTypeDefinition(type);\n\t\t\tappend(\";\");\n\t\t}\n\t\tappendNewLine();\n\t}\n\treturn result;\n\n\tfunction append(s: string) {\n\t\tif (startOfLine) {\n\t\t\tresult += \" \".repeat(indent);\n\t\t\tstartOfLine = false;\n\t\t}\n\t\tresult += s;\n\t}\n\n\tfunction appendNewLine() {\n\t\tappend(\"\\n\");\n\t\tstartOfLine = true;\n\t}\n\n\tfunction appendType(type: z.ZodType, minPrecedence = TypePrecedence.Object) {\n\t\tconst name = namedTypes.get(getTypeIdentity(type));\n\t\tif (name === undefined) {\n\t\t\tconst parenthesize = getTypePrecendece(type) < minPrecedence;\n\t\t\tif (parenthesize) append(\"(\");\n\t\t\tappendTypeDefinition(type);\n\t\t\tif (parenthesize) append(\")\");\n\t\t} else {\n\t\t\tappend(name);\n\t\t}\n\t}\n\n\tfunction appendTypeDefinition(type: z.ZodType) {\n\t\tswitch (getTypeKind(type)) {\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodString: {\n\t\t\t\treturn append(\"string\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodNumber: {\n\t\t\t\treturn append(\"number\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodBoolean: {\n\t\t\t\treturn append(\"boolean\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodDate: {\n\t\t\t\treturn append(\"Date\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUndefined: {\n\t\t\t\treturn append(\"undefined\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodNull: {\n\t\t\t\treturn append(\"null\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUnknown: {\n\t\t\t\treturn append(\"unknown\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodArray: {\n\t\t\t\treturn appendArrayType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodObject: {\n\t\t\t\treturn appendObjectType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodUnion: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t(type._def as z.ZodUnionDef).options,\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[...(type._def as z.ZodDiscriminatedUnionDef<string>).options.values()],\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodIntersection: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[\n\t\t\t\t\t\t(type._def as z.ZodIntersectionDef).left,\n\t\t\t\t\t\t(type._def as z.ZodIntersectionDef).right,\n\t\t\t\t\t],\n\t\t\t\t\tTypePrecedence.Intersection,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodTuple: {\n\t\t\t\treturn appendTupleType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodRecord: {\n\t\t\t\treturn appendRecordType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodMap: {\n\t\t\t\treturn appendMapType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodLiteral: {\n\t\t\t\treturn appendLiteral((type._def as z.ZodLiteralDef).value);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodEnum: {\n\t\t\t\treturn append(\n\t\t\t\t\t(type._def as z.ZodEnumDef).values.map((value) => JSON.stringify(value)).join(\" | \"),\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodOptional: {\n\t\t\t\treturn appendUnionOrIntersectionTypes(\n\t\t\t\t\t[(type._def as z.ZodOptionalDef).innerType, z.undefined()],\n\t\t\t\t\tTypePrecedence.Union,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodReadonly: {\n\t\t\t\treturn appendReadonlyType(type);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodEffects: {\n\t\t\t\t// Currently, this only handles schema class instances, but there are other cases in which a ZodEffects could theoretically be used.\n\t\t\t\tif (instanceOfs.has(type)) {\n\t\t\t\t\tconst objectNodeSchema = instanceOfs.get(type);\n\t\t\t\t\tif (objectNodeSchema === undefined) {\n\t\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\t`Unsupported zod effects type when transforming class method: ${getTypeKind(type)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn append(getFriendlyName(objectNodeSchema));\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Unsupported zod effects type. Did you use z.instanceOf? Use ExposedMethods.instanceOf function to reference schema classes in methods.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodVoid: {\n\t\t\t\treturn append(\"void\");\n\t\t\t}\n\t\t\tcase z.ZodFirstPartyTypeKind.ZodLazy: {\n\t\t\t\treturn appendType((type._def as z.ZodLazyDef).getter());\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t`Unsupported type when transforming class method: ${getTypeKind(type)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction appendBoundMethods(boundType: z.ZodType): void {\n\t\t// eslint-disable-next-line prefer-const\n\t\tfor (let [name, type] of Object.entries((boundType._def as z.ZodObjectDef).shape())) {\n\t\t\t// Special handling of methods on objects\n\t\t\tconst method = (type as unknown as { method: object | undefined }).method;\n\t\t\tif (method !== undefined && method instanceof FunctionWrapper) {\n\t\t\t\tdetailsI.hasHelperMethods = true;\n\t\t\t\tappend(name);\n\t\t\t\tappend(\"(\");\n\t\t\t\tlet first = true;\n\t\t\t\tfor (const [argName, argType] of method.args) {\n\t\t\t\t\tif (!first) append(\", \");\n\t\t\t\t\tif (getTypeKind(argType) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\t\t\tappend(`${argName}?: `);\n\t\t\t\t\t\tappendType((argType._def as z.ZodOptionalDef).innerType, TypePrecedence.Object);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tappend(`${argName}: `);\n\t\t\t\t\t\tappendType(argType);\n\t\t\t\t\t}\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\t\t\t\tif (method.rest !== null) {\n\t\t\t\t\tif (!first) append(\", \");\n\t\t\t\t\tappend(\"...rest: \");\n\t\t\t\t\tappendType(method.rest, TypePrecedence.Object);\n\t\t\t\t\tappend(\"[]\");\n\t\t\t\t}\n\t\t\t\tappend(`): `);\n\t\t\t\tappendType(method.returns, TypePrecedence.Object);\n\t\t\t\tappend(\";\");\n\t\t\t\tif (method.description !== undefined) {\n\t\t\t\t\tappend(` // ${method.description}`);\n\t\t\t\t}\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction appendBoundProperties(type: z.ZodType): void {\n\t\tconst property = (type as unknown as { property?: PropertyDef }).property;\n\n\t\tif (!(property instanceof PropertyDef)) {\n\t\t\tif (type.description !== undefined && type.description !== \"\") {\n\t\t\t\tappend(` // ${type.description}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (property.readOnly === true) {\n\t\t\tappend(\" // readonly\");\n\t\t}\n\t\tif (property.description !== undefined && property.description !== \"\") {\n\t\t\tappend(` - ${property.description}`);\n\t\t}\n\t}\n\n\tfunction appendArrayType(arrayType: z.ZodType) {\n\t\tappendType((arrayType._def as z.ZodArrayDef).type, TypePrecedence.Object);\n\t\tappend(\"[]\");\n\t}\n\n\tfunction appendObjectType(objectType: z.ZodType) {\n\t\tappend(\"{\");\n\t\tappendNewLine();\n\t\tindent++;\n\t\t// eslint-disable-next-line prefer-const\n\t\tfor (let [name, type] of Object.entries((objectType._def as z.ZodObjectDef).shape())) {\n\t\t\tconst method = (type as unknown as { method: object | undefined }).method;\n\n\t\t\tif (method === undefined || !(method instanceof FunctionWrapper)) {\n\t\t\t\tappend(name);\n\t\t\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\t\tappend(\"?\");\n\t\t\t\t\ttype = (type._def as z.ZodOptionalDef).innerType;\n\t\t\t\t}\n\t\t\t\tappend(\": \");\n\t\t\t\tappendType(type);\n\t\t\t\tappend(\";\");\n\t\t\t\tappendBoundProperties(type);\n\t\t\t\tappendNewLine();\n\t\t\t}\n\t\t}\n\t\tappendBoundMethods(objectType);\n\t\tindent--;\n\t\tappend(\"}\");\n\t}\n\n\tfunction appendUnionOrIntersectionTypes(\n\t\ttypes: readonly z.ZodType[],\n\t\tminPrecedence: TypePrecedence,\n\t) {\n\t\tlet first = true;\n\t\tfor (const type of types) {\n\t\t\tif (!first) append(minPrecedence === TypePrecedence.Intersection ? \" & \" : \" | \");\n\t\t\tappendType(type, minPrecedence);\n\t\t\tfirst = false;\n\t\t}\n\t}\n\n\tfunction appendTupleType(tupleType: z.ZodType) {\n\t\tappend(\"[\");\n\t\tlet first = true;\n\t\tfor (const type of (tupleType._def as z.ZodTupleDef<z.ZodTupleItems, z.ZodType>).items) {\n\t\t\tif (!first) append(\", \");\n\t\t\tif (getTypeKind(type) === z.ZodFirstPartyTypeKind.ZodOptional) {\n\t\t\t\tappendType((type._def as z.ZodOptionalDef).innerType, TypePrecedence.Object);\n\t\t\t\tappend(\"?\");\n\t\t\t} else {\n\t\t\t\tappendType(type);\n\t\t\t}\n\t\t\tfirst = false;\n\t\t}\n\t\tconst rest = (tupleType._def as z.ZodTupleDef<z.ZodTupleItems, z.ZodType | null>).rest;\n\t\tif (rest !== null) {\n\t\t\tif (!first) append(\", \");\n\t\t\tappend(\"...\");\n\t\t\tappendType(rest, TypePrecedence.Object);\n\t\t\tappend(\"[]\");\n\t\t}\n\t\tappend(\"]\");\n\t}\n\n\tfunction appendRecordType(recordType: z.ZodType) {\n\t\tappend(\"Record<\");\n\t\tappendType((recordType._def as z.ZodRecordDef).keyType);\n\t\tappend(\", \");\n\t\tappendType((recordType._def as z.ZodRecordDef).valueType);\n\t\tappend(\">\");\n\t}\n\n\tfunction appendMapType(mapType: z.ZodType) {\n\t\tappend(\"Map<\");\n\t\tappendType((mapType._def as z.ZodMapDef).keyType);\n\t\tappend(\", \");\n\t\tappendType((mapType._def as z.ZodMapDef).valueType);\n\t\tappend(\">\");\n\t}\n\n\tfunction appendLiteral(value: unknown) {\n\t\tappend(\n\t\t\ttypeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n\t\t\t\t? JSON.stringify(value)\n\t\t\t\t: \"any\",\n\t\t);\n\t}\n\n\tfunction appendReadonlyType(readonlyType: z.ZodType) {\n\t\tappend(\"Readonly<\");\n\t\tappendType((readonlyType._def as z.ZodReadonlyDef).innerType);\n\t\tappend(\">\");\n\t}\n}\n\nfunction getTypeKind(type: z.ZodType): z.ZodFirstPartyTypeKind {\n\treturn (type._def as z.ZodTypeDef & { typeName: z.ZodFirstPartyTypeKind }).typeName;\n}\n\nfunction getTypeIdentity(type: z.ZodType): object {\n\tswitch (getTypeKind(type)) {\n\t\tcase z.ZodFirstPartyTypeKind.ZodObject: {\n\t\t\treturn (type._def as z.ZodObjectDef).shape();\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodEnum: {\n\t\t\treturn (type._def as z.ZodEnumDef).values;\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodUnion: {\n\t\t\treturn (type._def as z.ZodUnionDef).options;\n\t\t}\n\t\tdefault: {\n\t\t\treturn type;\n\t\t}\n\t}\n}\n\nconst enum TypePrecedence {\n\tUnion = 0,\n\tIntersection = 1,\n\tObject = 2,\n}\n\nfunction getTypePrecendece(type: z.ZodType): TypePrecedence {\n\tswitch (getTypeKind(type)) {\n\t\tcase z.ZodFirstPartyTypeKind.ZodEnum:\n\t\tcase z.ZodFirstPartyTypeKind.ZodUnion:\n\t\tcase z.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n\t\t\treturn TypePrecedence.Union;\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodIntersection: {\n\t\t\treturn TypePrecedence.Intersection;\n\t\t}\n\t\tdefault: {\n\t\t\treturn TypePrecedence.Object;\n\t\t}\n\t}\n}\n\n/**\n * Create a Zod schema for a SharedTree schema class.\n * @alpha\n */\nexport function instanceOf<T extends TreeNodeSchemaClass>(\n\tschema: T,\n): z.ZodType<InstanceType<T>, z.ZodTypeDef, InstanceType<T>> {\n\tif (!(schema instanceof ObjectNodeSchema)) {\n\t\tthrow new UsageError(`${schema.identifier} must be an instance of ObjectNodeSchema.`);\n\t}\n\tconst effect = z.instanceof(schema);\n\tinstanceOfs.set(effect, schema);\n\treturn effect;\n}\n\nconst instanceOfs = new WeakMap<z.ZodTypeAny, ObjectNodeSchema>();\n\n/**\n * Adds all (optionally filtered) schemas reachable from the given schema to the given set.\n * @returns The set of schemas added (same as the `schemas` parameter, if supplied).\n */\nexport function findSchemas(\n\tschema: ImplicitFieldSchema,\n\tfilter: (schema: TreeNodeSchema) => boolean = () => true,\n\tschemas = new Set<TreeNodeSchema>(),\n): Set<TreeNodeSchema> {\n\tfor (const nodeSchema of normalizeFieldSchema(schema).allowedTypeSet) {\n\t\tif (!schemas.has(nodeSchema)) {\n\t\t\tif (filter(nodeSchema)) {\n\t\t\t\tschemas.add(nodeSchema);\n\t\t\t}\n\t\t\tfindSchemas([...nodeSchema.childTypes], filter, schemas);\n\t\t}\n\t}\n\treturn schemas;\n}\n\n/**\n * De-capitalize (the first letter of) a string.\n */\nexport function communize(str: string): string {\n\treturn str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n * Stringify an unknown error value\n */\nexport function toErrorString(error: unknown): string {\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\ttry {\n\t\treturn JSON.stringify(error);\n\t} catch {\n\t\treturn String(error);\n\t}\n}\n"]}
package/lib/agent.d.ts CHANGED
@@ -3,10 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import type { ImplicitFieldSchema } from "@fluidframework/tree";
6
- import { TreeNode } from "@fluidframework/tree";
7
- import type { ReadableField } from "@fluidframework/tree/alpha";
8
- import type { SharedTreeChatModel, SemanticAgentOptions, SynchronousEditor, AsynchronousEditor } from "./api.js";
9
- import { type TreeView } from "./utils.js";
6
+ import type { SharedTreeChatModel, SemanticAgentOptions, Context, ViewOrTree } from "./api.js";
10
7
  /**
11
8
  * An agent that uses a {@link SharedTreeChatModel} to interact with a SharedTree.
12
9
  * @remarks This class forwards user queries to the chat model, and handles the application of any edits to the tree that the model requests.
@@ -16,11 +13,12 @@ export declare class SharedTreeSemanticAgent<TSchema extends ImplicitFieldSchema
16
13
  private readonly client;
17
14
  private readonly options?;
18
15
  private readonly outerTree;
16
+ private readonly editor;
19
17
  /**
20
18
  * Whether or not the outer tree has changed since the last query finished.
21
19
  */
22
20
  private outerTreeIsDirty;
23
- constructor(client: SharedTreeChatModel, tree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode), options?: Readonly<SemanticAgentOptions> | undefined);
21
+ constructor(client: SharedTreeChatModel, tree: ViewOrTree<TSchema>, options?: Readonly<SemanticAgentOptions<TSchema>> | undefined);
24
22
  /**
25
23
  * Given a user prompt, return a response.
26
24
  *
@@ -30,32 +28,8 @@ export declare class SharedTreeSemanticAgent<TSchema extends ImplicitFieldSchema
30
28
  query(userPrompt: string): Promise<string>;
31
29
  }
32
30
  /**
33
- * The default {@link AsynchronousEditor | editor} implementation that simply uses `new Function` to run the provided code.
34
- * @remarks This editor allows both synchronous and asynchronous code (i.e. the provided code may return a Promise).
35
- * @example `await new Function("context", code)(context);`
31
+ * Creates a {@link Context} for the given subtree.
36
32
  * @alpha
37
33
  */
38
- export declare const defaultEditor: AsynchronousEditor;
39
- /**
40
- * Binds the given {@link AsynchronousEditor | editor} to the given view or tree.
41
- * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.
42
- * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.
43
- * @alpha
44
- */
45
- export declare function bindEditorImpl<TSchema extends ImplicitFieldSchema>(tree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode), editor: AsynchronousEditor): (code: string) => Promise<void>;
46
- /**
47
- * Binds the given {@link SynchronousEditor | editor} to the given view or tree.
48
- * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.
49
- * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.
50
- * @alpha
51
- */
52
- export declare function bindEditorImpl<TSchema extends ImplicitFieldSchema>(tree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode), editor: SynchronousEditor): (code: string) => void;
53
- /**
54
- * Binds the given {@link SynchronousEditor | synchronous} or {@link AsynchronousEditor | asynchronous} editor to the given view or tree.
55
- * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor.
56
- * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.
57
- * @alpha
58
- * @privateRemarks This exists (as opposed to just exporting bindEditorImpl directly) so that API documentation links work correctly.
59
- */
60
- export declare const bindEditor: typeof bindEditorImpl;
34
+ export declare function createContext<TSchema extends ImplicitFieldSchema>(tree: ViewOrTree<TSchema>): Context<TSchema>;
61
35
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACX,aAAa,EAIb,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EACX,mBAAmB,EAEnB,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAElB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAEN,KAAK,QAAQ,EAKb,MAAM,YAAY,CAAC;AAQpB;;;;GAIG;AACH,qBAAa,uBAAuB,CAAC,OAAO,SAAS,mBAAmB;IAStE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAT1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAS;gBAGf,MAAM,EAAE,mBAAmB,EAC5C,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,EAC5C,OAAO,CAAC,4CAAgC;IAiC1D;;;;;OAKG;IACU,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAqEvD;AAwED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,kBAI3B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,mBAAmB,EACjE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,EAC7D,MAAM,EAAE,kBAAkB,GACxB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACnC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,mBAAmB,EACjE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,EAC7D,MAAM,EAAE,iBAAiB,GACvB,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAe1B;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,uBAAiB,CAAC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EAGnB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,KAAK,EACX,mBAAmB,EAEnB,oBAAoB,EAGpB,OAAO,EAEP,UAAU,EACV,MAAM,UAAU,CAAC;AAiBlB;;;;GAIG;AACH,qBAAa,uBAAuB,CAAC,OAAO,SAAS,mBAAmB;IAUtE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAV1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2D;IAClF;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAS;gBAGf,MAAM,EAAE,mBAAmB,EAC5C,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EACR,OAAO,CAAC,qDAAyC;IAkCnE;;;;;OAKG;IACU,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAqEvD;AAkFD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,mBAAmB,EAChE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GACvB,OAAO,CAAC,OAAO,CAAC,CA2ClB"}
package/lib/agent.js CHANGED
@@ -32,6 +32,7 @@ export class SharedTreeSemanticAgent {
32
32
  tree.events.on("changed", () => (this.outerTreeIsDirty = true));
33
33
  }
34
34
  this.outerTree = new Subtree(tree);
35
+ this.editor = this.options?.editor ?? createDefaultEditor();
35
36
  const prompt = getPrompt({
36
37
  subtree: this.outerTree,
37
38
  editToolName: this.client.editToolName,
@@ -97,7 +98,7 @@ export class SharedTreeSemanticAgent {
97
98
  message: `The maximum number of edits (${maxEditCount}) for this query has been exceeded.`,
98
99
  };
99
100
  }
100
- const editResult = await applyTreeFunction(queryTree, editCode, this.options?.editor ?? defaultEditor, this.options?.logger);
101
+ const editResult = await applyTreeFunction(queryTree, editCode, this.editor, this.options?.logger);
101
102
  rollbackEdits = editResult.type !== "success";
102
103
  return editResult;
103
104
  };
@@ -154,9 +155,8 @@ async function applyTreeFunction(tree, editCode, editor, logger) {
154
155
  logger?.log(`#### Generated Code\n\n\`\`\`javascript\n${editCode}\n\`\`\`\n\n`);
155
156
  // Fork a branch to edit. If the edit fails or produces an error, we discard this branch, otherwise we merge it.
156
157
  const editTree = tree.fork();
157
- const boundEditor = bindEditorToSubtree(editTree, editor);
158
158
  try {
159
- await boundEditor(editCode);
159
+ await editor(editTree.viewOrTree, editCode);
160
160
  }
161
161
  catch (error) {
162
162
  logger?.log(`#### Error\n\n`);
@@ -175,50 +175,34 @@ async function applyTreeFunction(tree, editCode, editor, logger) {
175
175
  message: `After running the code, the new state of the tree is:\n\n\`\`\`JSON\n${stringifyTree(tree.field)}\n\`\`\``,
176
176
  };
177
177
  }
178
- /**
179
- * The default {@link AsynchronousEditor | editor} implementation that simply uses `new Function` to run the provided code.
180
- * @remarks This editor allows both synchronous and asynchronous code (i.e. the provided code may return a Promise).
181
- * @example `await new Function("context", code)(context);`
182
- * @alpha
183
- */
184
- export const defaultEditor = async (context, code) => {
185
- // eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval
186
- const fn = new Function("context", code);
187
- await fn(context);
188
- };
189
- /**
190
- * Binds the given {@link SynchronousEditor | editor} or {@link AsynchronousEditor | editor} to the given view or tree.
191
- * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.
192
- * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.
193
- * @alpha
194
- */
195
- export function bindEditorImpl(tree, editor) {
196
- const subtree = new Subtree(tree);
197
- return bindEditorToSubtree(subtree, editor);
178
+ function createDefaultEditor() {
179
+ return async (tree, code) => {
180
+ const context = createContext(tree);
181
+ // eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval
182
+ const fn = new Function("context", code);
183
+ await fn(context);
184
+ };
198
185
  }
199
186
  /**
200
- * Binds the given {@link SynchronousEditor | synchronous} or {@link AsynchronousEditor | asynchronous} editor to the given view or tree.
201
- * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor.
202
- * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.
187
+ * Creates a {@link Context} for the given subtree.
203
188
  * @alpha
204
- * @privateRemarks This exists (as opposed to just exporting bindEditorImpl directly) so that API documentation links work correctly.
205
189
  */
206
- export const bindEditor = bindEditorImpl;
207
- function bindEditorToSubtree(tree, executeEdit) {
190
+ export function createContext(tree) {
191
+ const subTree = new Subtree(tree);
208
192
  // Stick the tree schema constructors on an object passed to the function so that the LLM can create new nodes.
209
193
  const create = {};
210
194
  const is = {};
211
- for (const schema of findSchemas(tree.schema, (s) => isNamedSchema(s.identifier))) {
195
+ for (const schema of findSchemas(subTree.schema, (s) => isNamedSchema(s.identifier))) {
212
196
  const name = unqualifySchema(schema.identifier);
213
197
  create[name] = (input) => constructTreeNode(schema, input);
214
198
  is[name] = (input) => Tree.is(input, schema);
215
199
  }
216
- const context = {
200
+ return {
217
201
  get root() {
218
- return tree.field;
202
+ return subTree.field;
219
203
  },
220
204
  set root(value) {
221
- tree.field = value;
205
+ subTree.field = value;
222
206
  },
223
207
  create,
224
208
  is,
@@ -245,7 +229,5 @@ function bindEditorToSubtree(tree, executeEdit) {
245
229
  parent: (child) => Tree.parent(child),
246
230
  key: (child) => Tree.key(child),
247
231
  };
248
- // eslint-disable-next-line @typescript-eslint/promise-function-async
249
- return (code) => executeEdit(context, code);
250
232
  }
251
233
  //# sourceMappingURL=agent.js.map
package/lib/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.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 type {\n\tImplicitFieldSchema,\n\tTreeFieldFromImplicitField,\n\tTreeNodeSchema,\n} from \"@fluidframework/tree\";\nimport { NodeKind, TreeNode } from \"@fluidframework/tree\";\nimport type {\n\tReadableField,\n\tFactoryContentObject,\n\tInsertableContent,\n\tReadSchema,\n} from \"@fluidframework/tree/alpha\";\nimport { ObjectNodeSchema, Tree, TreeAlpha } from \"@fluidframework/tree/alpha\";\n\nimport type {\n\tSharedTreeChatModel,\n\tEditResult,\n\tSemanticAgentOptions,\n\tLogger,\n\tSynchronousEditor,\n\tAsynchronousEditor,\n\tContext,\n} from \"./api.js\";\nimport { getPrompt, stringifyTree } from \"./prompt.js\";\nimport { Subtree } from \"./subtree.js\";\nimport {\n\tllmDefault,\n\ttype TreeView,\n\tfindSchemas,\n\ttoErrorString,\n\tunqualifySchema,\n\tisNamedSchema,\n} from \"./utils.js\";\n\n/**\n * The default maximum number of sequential edits the LLM can make before we assume it's stuck in a loop.\n * @remarks This can be overridden by passing {@link SemanticAgentOptions.maximumSequentialEdits | maximumSequentialEdits} to {@link createSemanticAgent}.\n */\nconst defaultMaxSequentialEdits = 20;\n\n/**\n * An agent that uses a {@link SharedTreeChatModel} to interact with a SharedTree.\n * @remarks This class forwards user queries to the chat model, and handles the application of any edits to the tree that the model requests.\n * @alpha @sealed\n */\nexport class SharedTreeSemanticAgent<TSchema extends ImplicitFieldSchema> {\n\t// Converted from ECMAScript private fields (#name) to TypeScript private members for easier debugger inspection.\n\tprivate readonly outerTree: Subtree<TSchema>;\n\t/**\n\t * Whether or not the outer tree has changed since the last query finished.\n\t */\n\tprivate outerTreeIsDirty = false;\n\n\tpublic constructor(\n\t\tprivate readonly client: SharedTreeChatModel,\n\t\ttree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode),\n\t\tprivate readonly options?: Readonly<SemanticAgentOptions>,\n\t) {\n\t\tif (tree instanceof TreeNode) {\n\t\t\tTree.on(tree, \"treeChanged\", () => (this.outerTreeIsDirty = true));\n\t\t} else {\n\t\t\ttree.events.on(\"changed\", () => (this.outerTreeIsDirty = true));\n\t\t}\n\n\t\tthis.outerTree = new Subtree(tree);\n\t\tconst prompt = getPrompt({\n\t\t\tsubtree: this.outerTree,\n\t\t\teditToolName: this.client.editToolName,\n\t\t\tdomainHints: this.options?.domainHints,\n\t\t});\n\t\tthis.options?.logger?.log(`# Fluid Framework SharedTree AI Agent Log\\n\\n`);\n\t\tconst now = new Date();\n\t\tconst formattedDate = now.toLocaleString(undefined, {\n\t\t\tweekday: \"long\",\n\t\t\tyear: \"numeric\",\n\t\t\tmonth: \"long\",\n\t\t\tday: \"numeric\",\n\t\t\thour: \"numeric\",\n\t\t\tminute: \"2-digit\",\n\t\t\tsecond: \"2-digit\",\n\t\t});\n\t\tthis.options?.logger?.log(`Agent created: **${formattedDate}**\\n\\n`);\n\t\tif (this.client.name !== undefined) {\n\t\t\tthis.options?.logger?.log(`Model: **${this.client.name}**\\n\\n`);\n\t\t}\n\t\tthis.client.appendContext?.(prompt);\n\t\tthis.options?.logger?.log(`## System Prompt\\n\\n${prompt}\\n\\n`);\n\t}\n\n\t/**\n\t * Given a user prompt, return a response.\n\t *\n\t * @param userPrompt - The prompt to send to the agent.\n\t * @returns The agent's response.\n\t */\n\tpublic async query(userPrompt: string): Promise<string> {\n\t\tthis.options?.logger?.log(`## User Query\\n\\n${userPrompt}\\n\\n`);\n\n\t\t// Notify the llm if the tree has changed since the last query, and if so, provide the new state of the tree.\n\t\tif (this.outerTreeIsDirty) {\n\t\t\tconst stringified = stringifyTree(this.outerTree.field);\n\t\t\tthis.client.appendContext?.(\n\t\t\t\t`The tree has changed since the last query. The new state of the tree is: \\n\\n\\`\\`\\`JSON\\n${stringified}\\n\\`\\`\\``,\n\t\t\t);\n\t\t\tthis.options?.logger?.log(\n\t\t\t\t`### Latest Tree State\\n\\nThe Tree was edited by a local or remote user since the previous query. The latest state is:\\n\\n\\`\\`\\`JSON\\n${stringified}\\n\\`\\`\\`\\n\\n`,\n\t\t\t);\n\t\t}\n\n\t\t// Fork a branch that will live for the lifetime of this query (which can be multiple LLM calls if the there are errors or the LLM decides to take multiple steps to accomplish a task).\n\t\t// The branch will be merged back into the outer branch if and only if the query succeeds.\n\t\tconst queryTree = this.outerTree.fork();\n\t\tconst maxEditCount = this.options?.maximumSequentialEdits ?? defaultMaxSequentialEdits;\n\t\tlet active = true;\n\t\tlet editCount = 0;\n\t\tlet rollbackEdits = false;\n\t\tconst { editToolName } = this.client;\n\t\tconst edit = async (editCode: string): Promise<EditResult> => {\n\t\t\tif (editToolName === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"disabledError\",\n\t\t\t\t\tmessage: \"Editing is not enabled for this model.\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"expiredError\",\n\t\t\t\t\tmessage: `The query has already completed. Further edits are not allowed.`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (++editCount > maxEditCount) {\n\t\t\t\trollbackEdits = true;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"tooManyEditsError\",\n\t\t\t\t\tmessage: `The maximum number of edits (${maxEditCount}) for this query has been exceeded.`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst editResult = await applyTreeFunction(\n\t\t\t\tqueryTree,\n\t\t\t\teditCode,\n\t\t\t\tthis.options?.editor ?? defaultEditor,\n\t\t\t\tthis.options?.logger,\n\t\t\t);\n\n\t\t\trollbackEdits = editResult.type !== \"success\";\n\t\t\treturn editResult;\n\t\t};\n\n\t\tconst responseMessage = await this.client.query({\n\t\t\ttext: userPrompt,\n\t\t\tedit,\n\t\t});\n\t\tactive = false;\n\n\t\tif (!rollbackEdits) {\n\t\t\tthis.outerTree.branch.merge(queryTree.branch);\n\t\t\tthis.outerTreeIsDirty = false;\n\t\t}\n\t\tthis.options?.logger?.log(`## Response\\n\\n`);\n\t\tthis.options?.logger?.log(`${responseMessage}\\n\\n`);\n\t\treturn responseMessage;\n\t}\n}\n\n/**\n * Creates an unhydrated node of the given schema with the given value.\n * @remarks If the schema is an object with {@link llmDefault | default values}, this function populates the node with those defaults.\n */\nfunction constructTreeNode(schema: TreeNodeSchema, content: FactoryContentObject): TreeNode {\n\tlet toInsert = content;\n\tif (schema instanceof ObjectNodeSchema) {\n\t\tconst contentWithDefaults: Record<string, InsertableContent | undefined> = {};\n\t\tfor (const [key, field] of schema.fields) {\n\t\t\tif (content[key] === undefined) {\n\t\t\t\tif (\n\t\t\t\t\ttypeof field.metadata.custom === \"object\" &&\n\t\t\t\t\tfield.metadata.custom !== null &&\n\t\t\t\t\tllmDefault in field.metadata.custom\n\t\t\t\t) {\n\t\t\t\t\tconst defaulter = field.metadata.custom[llmDefault];\n\t\t\t\t\tif (typeof defaulter === \"function\") {\n\t\t\t\t\t\tconst defaultValue: unknown = defaulter();\n\t\t\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\t\t\tcontentWithDefaults[key] = defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcontentWithDefaults[key] = content[key];\n\t\t\t}\n\t\t}\n\t\ttoInsert = contentWithDefaults;\n\t}\n\n\t// Cast to never because tagContentSchema is typed to only accept InsertableContent, but we know that 'toInsert' (either the original content or contentWithDefaults) produces valid content for the schema.\n\treturn TreeAlpha.tagContentSchema(schema, toInsert as never);\n}\n\n/**\n * Applies the given function (as a string of JavaScript code or an actual function) to the given tree.\n */\nasync function applyTreeFunction<TSchema extends ImplicitFieldSchema>(\n\ttree: Subtree<TSchema>,\n\teditCode: string,\n\teditor: Required<SemanticAgentOptions>[\"editor\"],\n\tlogger: Logger | undefined,\n): Promise<EditResult> {\n\tlogger?.log(`### Editing Tool Invoked\\n\\n`);\n\tlogger?.log(`#### Generated Code\\n\\n\\`\\`\\`javascript\\n${editCode}\\n\\`\\`\\`\\n\\n`);\n\n\t// Fork a branch to edit. If the edit fails or produces an error, we discard this branch, otherwise we merge it.\n\tconst editTree = tree.fork();\n\tconst boundEditor = bindEditorToSubtree(editTree, editor);\n\ttry {\n\t\tawait boundEditor(editCode);\n\t} catch (error: unknown) {\n\t\tlogger?.log(`#### Error\\n\\n`);\n\t\tlogger?.log(`\\`\\`\\`JSON\\n${toErrorString(error)}\\n\\`\\`\\`\\n\\n`);\n\t\teditTree.branch.dispose();\n\t\treturn {\n\t\t\ttype: \"editingError\",\n\t\t\tmessage: `Running the generated code produced an error. The state of the tree will be reset to its previous state as it was before the code ran. Please try again. Here is the error: ${toErrorString(error)}`,\n\t\t};\n\t}\n\n\ttree.branch.merge(editTree.branch);\n\tlogger?.log(`#### New Tree State\\n\\n`);\n\tlogger?.log(`${`\\`\\`\\`JSON\\n${stringifyTree(tree.field)}\\n\\`\\`\\``}\\n\\n`);\n\treturn {\n\t\ttype: \"success\",\n\t\tmessage: `After running the code, the new state of the tree is:\\n\\n\\`\\`\\`JSON\\n${stringifyTree(tree.field)}\\n\\`\\`\\``,\n\t};\n}\n\n/**\n * The default {@link AsynchronousEditor | editor} implementation that simply uses `new Function` to run the provided code.\n * @remarks This editor allows both synchronous and asynchronous code (i.e. the provided code may return a Promise).\n * @example `await new Function(\"context\", code)(context);`\n * @alpha\n */\nexport const defaultEditor: AsynchronousEditor = async (context, code) => {\n\t// eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval\n\tconst fn = new Function(\"context\", code);\n\tawait fn(context);\n};\n\n/**\n * Binds the given {@link AsynchronousEditor | editor} to the given view or tree.\n * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.\n * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.\n * @alpha\n */\nexport function bindEditorImpl<TSchema extends ImplicitFieldSchema>(\n\ttree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode),\n\teditor: AsynchronousEditor,\n): (code: string) => Promise<void>;\n/**\n * Binds the given {@link SynchronousEditor | editor} to the given view or tree.\n * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.\n * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.\n * @alpha\n */\nexport function bindEditorImpl<TSchema extends ImplicitFieldSchema>(\n\ttree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode),\n\teditor: SynchronousEditor,\n): (code: string) => void;\n/**\n * Binds the given {@link SynchronousEditor | editor} or {@link AsynchronousEditor | editor} to the given view or tree.\n * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor function.\n * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.\n * @alpha\n */\nexport function bindEditorImpl<TSchema extends ImplicitFieldSchema>(\n\ttree: TreeView<TSchema> | (ReadableField<TSchema> & TreeNode),\n\teditor: SynchronousEditor | AsynchronousEditor,\n): ((code: string) => void) | ((code: string) => Promise<void>) {\n\tconst subtree = new Subtree(tree);\n\treturn bindEditorToSubtree(subtree, editor);\n}\n\n/**\n * Binds the given {@link SynchronousEditor | synchronous} or {@link AsynchronousEditor | asynchronous} editor to the given view or tree.\n * @returns A function that takes a string of JavaScript code and executes it on the given view or tree using the given editor.\n * @remarks This is useful for testing/debugging code execution without needing to set up a full {@link SharedTreeSemanticAgent | agent}.\n * @alpha\n * @privateRemarks This exists (as opposed to just exporting bindEditorImpl directly) so that API documentation links work correctly.\n */\nexport const bindEditor = bindEditorImpl;\n\nfunction bindEditorToSubtree<TSchema extends ImplicitFieldSchema>(\n\ttree: Subtree<TSchema>,\n\texecuteEdit: SynchronousEditor | AsynchronousEditor,\n): (code: string) => void | Promise<void> {\n\t// Stick the tree schema constructors on an object passed to the function so that the LLM can create new nodes.\n\tconst create: Record<string, (input: FactoryContentObject) => TreeNode> = {};\n\tconst is: Record<string, <T extends TreeNode>(input: unknown) => input is T> = {};\n\tfor (const schema of findSchemas(tree.schema, (s) => isNamedSchema(s.identifier))) {\n\t\tconst name = unqualifySchema(schema.identifier);\n\t\tcreate[name] = (input: FactoryContentObject) => constructTreeNode(schema, input);\n\t\tis[name] = <T extends TreeNode>(input: unknown): input is T => Tree.is(input, schema);\n\t}\n\n\tconst context = {\n\t\tget root(): ReadableField<TSchema> {\n\t\t\treturn tree.field;\n\t\t},\n\t\tset root(value: TreeFieldFromImplicitField<ReadSchema<TSchema>>) {\n\t\t\ttree.field = value;\n\t\t},\n\t\tcreate,\n\t\tis,\n\t\tisArray(node) {\n\t\t\tif (Array.isArray(node)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (node instanceof TreeNode) {\n\t\t\t\tconst schema = Tree.schema(node);\n\t\t\t\treturn schema.kind === NodeKind.Array;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisMap(node) {\n\t\t\tif (node instanceof Map) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (node instanceof TreeNode) {\n\t\t\t\tconst schema = Tree.schema(node);\n\t\t\t\treturn schema.kind === NodeKind.Map;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tparent: (child: TreeNode): TreeNode | undefined => Tree.parent(child),\n\t\tkey: (child: TreeNode): string | number => Tree.key(child),\n\t} satisfies Context<TSchema>;\n\n\t// eslint-disable-next-line @typescript-eslint/promise-function-async\n\treturn (code: string) => executeEdit(context, code);\n}\n"]}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.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 type {\n\tImplicitFieldSchema,\n\tTreeFieldFromImplicitField,\n\tTreeNodeSchema,\n} from \"@fluidframework/tree\";\nimport { NodeKind, TreeNode } from \"@fluidframework/tree\";\nimport type {\n\tReadableField,\n\tFactoryContentObject,\n\tInsertableContent,\n\tReadSchema,\n} from \"@fluidframework/tree/alpha\";\nimport { ObjectNodeSchema, Tree, TreeAlpha } from \"@fluidframework/tree/alpha\";\n\nimport type {\n\tSharedTreeChatModel,\n\tEditResult,\n\tSemanticAgentOptions,\n\tLogger,\n\tAsynchronousEditor,\n\tContext,\n\tSynchronousEditor,\n\tViewOrTree,\n} from \"./api.js\";\nimport { getPrompt, stringifyTree } from \"./prompt.js\";\nimport { Subtree } from \"./subtree.js\";\nimport {\n\tllmDefault,\n\tfindSchemas,\n\ttoErrorString,\n\tunqualifySchema,\n\tisNamedSchema,\n} from \"./utils.js\";\n\n/**\n * The default maximum number of sequential edits the LLM can make before we assume it's stuck in a loop.\n * @remarks This can be overridden by passing {@link SemanticAgentOptions.maximumSequentialEdits | maximumSequentialEdits} to {@link createSemanticAgent}.\n */\nconst defaultMaxSequentialEdits = 20;\n\n/**\n * An agent that uses a {@link SharedTreeChatModel} to interact with a SharedTree.\n * @remarks This class forwards user queries to the chat model, and handles the application of any edits to the tree that the model requests.\n * @alpha @sealed\n */\nexport class SharedTreeSemanticAgent<TSchema extends ImplicitFieldSchema> {\n\t// Converted from ECMAScript private fields (#name) to TypeScript private members for easier debugger inspection.\n\tprivate readonly outerTree: Subtree<TSchema>;\n\tprivate readonly editor: SynchronousEditor<TSchema> | AsynchronousEditor<TSchema>;\n\t/**\n\t * Whether or not the outer tree has changed since the last query finished.\n\t */\n\tprivate outerTreeIsDirty = false;\n\n\tpublic constructor(\n\t\tprivate readonly client: SharedTreeChatModel,\n\t\ttree: ViewOrTree<TSchema>,\n\t\tprivate readonly options?: Readonly<SemanticAgentOptions<TSchema>>,\n\t) {\n\t\tif (tree instanceof TreeNode) {\n\t\t\tTree.on(tree, \"treeChanged\", () => (this.outerTreeIsDirty = true));\n\t\t} else {\n\t\t\ttree.events.on(\"changed\", () => (this.outerTreeIsDirty = true));\n\t\t}\n\n\t\tthis.outerTree = new Subtree(tree);\n\t\tthis.editor = this.options?.editor ?? createDefaultEditor();\n\t\tconst prompt = getPrompt({\n\t\t\tsubtree: this.outerTree,\n\t\t\teditToolName: this.client.editToolName,\n\t\t\tdomainHints: this.options?.domainHints,\n\t\t});\n\t\tthis.options?.logger?.log(`# Fluid Framework SharedTree AI Agent Log\\n\\n`);\n\t\tconst now = new Date();\n\t\tconst formattedDate = now.toLocaleString(undefined, {\n\t\t\tweekday: \"long\",\n\t\t\tyear: \"numeric\",\n\t\t\tmonth: \"long\",\n\t\t\tday: \"numeric\",\n\t\t\thour: \"numeric\",\n\t\t\tminute: \"2-digit\",\n\t\t\tsecond: \"2-digit\",\n\t\t});\n\t\tthis.options?.logger?.log(`Agent created: **${formattedDate}**\\n\\n`);\n\t\tif (this.client.name !== undefined) {\n\t\t\tthis.options?.logger?.log(`Model: **${this.client.name}**\\n\\n`);\n\t\t}\n\t\tthis.client.appendContext?.(prompt);\n\t\tthis.options?.logger?.log(`## System Prompt\\n\\n${prompt}\\n\\n`);\n\t}\n\n\t/**\n\t * Given a user prompt, return a response.\n\t *\n\t * @param userPrompt - The prompt to send to the agent.\n\t * @returns The agent's response.\n\t */\n\tpublic async query(userPrompt: string): Promise<string> {\n\t\tthis.options?.logger?.log(`## User Query\\n\\n${userPrompt}\\n\\n`);\n\n\t\t// Notify the llm if the tree has changed since the last query, and if so, provide the new state of the tree.\n\t\tif (this.outerTreeIsDirty) {\n\t\t\tconst stringified = stringifyTree(this.outerTree.field);\n\t\t\tthis.client.appendContext?.(\n\t\t\t\t`The tree has changed since the last query. The new state of the tree is: \\n\\n\\`\\`\\`JSON\\n${stringified}\\n\\`\\`\\``,\n\t\t\t);\n\t\t\tthis.options?.logger?.log(\n\t\t\t\t`### Latest Tree State\\n\\nThe Tree was edited by a local or remote user since the previous query. The latest state is:\\n\\n\\`\\`\\`JSON\\n${stringified}\\n\\`\\`\\`\\n\\n`,\n\t\t\t);\n\t\t}\n\n\t\t// Fork a branch that will live for the lifetime of this query (which can be multiple LLM calls if the there are errors or the LLM decides to take multiple steps to accomplish a task).\n\t\t// The branch will be merged back into the outer branch if and only if the query succeeds.\n\t\tconst queryTree = this.outerTree.fork();\n\t\tconst maxEditCount = this.options?.maximumSequentialEdits ?? defaultMaxSequentialEdits;\n\t\tlet active = true;\n\t\tlet editCount = 0;\n\t\tlet rollbackEdits = false;\n\t\tconst { editToolName } = this.client;\n\t\tconst edit = async (editCode: string): Promise<EditResult> => {\n\t\t\tif (editToolName === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"disabledError\",\n\t\t\t\t\tmessage: \"Editing is not enabled for this model.\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!active) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"expiredError\",\n\t\t\t\t\tmessage: `The query has already completed. Further edits are not allowed.`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (++editCount > maxEditCount) {\n\t\t\t\trollbackEdits = true;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"tooManyEditsError\",\n\t\t\t\t\tmessage: `The maximum number of edits (${maxEditCount}) for this query has been exceeded.`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst editResult = await applyTreeFunction(\n\t\t\t\tqueryTree,\n\t\t\t\teditCode,\n\t\t\t\tthis.editor,\n\t\t\t\tthis.options?.logger,\n\t\t\t);\n\n\t\t\trollbackEdits = editResult.type !== \"success\";\n\t\t\treturn editResult;\n\t\t};\n\n\t\tconst responseMessage = await this.client.query({\n\t\t\ttext: userPrompt,\n\t\t\tedit,\n\t\t});\n\t\tactive = false;\n\n\t\tif (!rollbackEdits) {\n\t\t\tthis.outerTree.branch.merge(queryTree.branch);\n\t\t\tthis.outerTreeIsDirty = false;\n\t\t}\n\t\tthis.options?.logger?.log(`## Response\\n\\n`);\n\t\tthis.options?.logger?.log(`${responseMessage}\\n\\n`);\n\t\treturn responseMessage;\n\t}\n}\n\n/**\n * Creates an unhydrated node of the given schema with the given value.\n * @remarks If the schema is an object with {@link llmDefault | default values}, this function populates the node with those defaults.\n */\nfunction constructTreeNode(schema: TreeNodeSchema, content: FactoryContentObject): TreeNode {\n\tlet toInsert = content;\n\tif (schema instanceof ObjectNodeSchema) {\n\t\tconst contentWithDefaults: Record<string, InsertableContent | undefined> = {};\n\t\tfor (const [key, field] of schema.fields) {\n\t\t\tif (content[key] === undefined) {\n\t\t\t\tif (\n\t\t\t\t\ttypeof field.metadata.custom === \"object\" &&\n\t\t\t\t\tfield.metadata.custom !== null &&\n\t\t\t\t\tllmDefault in field.metadata.custom\n\t\t\t\t) {\n\t\t\t\t\tconst defaulter = field.metadata.custom[llmDefault];\n\t\t\t\t\tif (typeof defaulter === \"function\") {\n\t\t\t\t\t\tconst defaultValue: unknown = defaulter();\n\t\t\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\t\t\tcontentWithDefaults[key] = defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcontentWithDefaults[key] = content[key];\n\t\t\t}\n\t\t}\n\t\ttoInsert = contentWithDefaults;\n\t}\n\n\t// Cast to never because tagContentSchema is typed to only accept InsertableContent, but we know that 'toInsert' (either the original content or contentWithDefaults) produces valid content for the schema.\n\treturn TreeAlpha.tagContentSchema(schema, toInsert as never);\n}\n\n/**\n * Applies the given function (as a string of JavaScript code or an actual function) to the given tree.\n */\nasync function applyTreeFunction<TSchema extends ImplicitFieldSchema>(\n\ttree: Subtree<TSchema>,\n\teditCode: string,\n\teditor: SynchronousEditor<TSchema> | AsynchronousEditor<TSchema>,\n\tlogger: Logger | undefined,\n): Promise<EditResult> {\n\tlogger?.log(`### Editing Tool Invoked\\n\\n`);\n\tlogger?.log(`#### Generated Code\\n\\n\\`\\`\\`javascript\\n${editCode}\\n\\`\\`\\`\\n\\n`);\n\n\t// Fork a branch to edit. If the edit fails or produces an error, we discard this branch, otherwise we merge it.\n\tconst editTree = tree.fork();\n\ttry {\n\t\tawait editor(editTree.viewOrTree, editCode);\n\t} catch (error: unknown) {\n\t\tlogger?.log(`#### Error\\n\\n`);\n\t\tlogger?.log(`\\`\\`\\`JSON\\n${toErrorString(error)}\\n\\`\\`\\`\\n\\n`);\n\t\teditTree.branch.dispose();\n\t\treturn {\n\t\t\ttype: \"editingError\",\n\t\t\tmessage: `Running the generated code produced an error. The state of the tree will be reset to its previous state as it was before the code ran. Please try again. Here is the error: ${toErrorString(error)}`,\n\t\t};\n\t}\n\n\ttree.branch.merge(editTree.branch);\n\tlogger?.log(`#### New Tree State\\n\\n`);\n\tlogger?.log(`${`\\`\\`\\`JSON\\n${stringifyTree(tree.field)}\\n\\`\\`\\``}\\n\\n`);\n\treturn {\n\t\ttype: \"success\",\n\t\tmessage: `After running the code, the new state of the tree is:\\n\\n\\`\\`\\`JSON\\n${stringifyTree(tree.field)}\\n\\`\\`\\``,\n\t};\n}\n\nfunction createDefaultEditor<\n\tTSchema extends ImplicitFieldSchema = ImplicitFieldSchema,\n>(): AsynchronousEditor<TSchema> {\n\treturn async (tree, code) => {\n\t\tconst context = createContext(tree);\n\t\t// eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval\n\t\tconst fn = new Function(\"context\", code);\n\t\tawait fn(context);\n\t};\n}\n\n/**\n * Creates a {@link Context} for the given subtree.\n * @alpha\n */\nexport function createContext<TSchema extends ImplicitFieldSchema>(\n\ttree: ViewOrTree<TSchema>,\n): Context<TSchema> {\n\tconst subTree = new Subtree(tree);\n\t// Stick the tree schema constructors on an object passed to the function so that the LLM can create new nodes.\n\tconst create: Record<string, (input: FactoryContentObject) => TreeNode> = {};\n\tconst is: Record<string, <T extends TreeNode>(input: unknown) => input is T> = {};\n\tfor (const schema of findSchemas(subTree.schema, (s) => isNamedSchema(s.identifier))) {\n\t\tconst name = unqualifySchema(schema.identifier);\n\t\tcreate[name] = (input: FactoryContentObject) => constructTreeNode(schema, input);\n\t\tis[name] = <T extends TreeNode>(input: unknown): input is T => Tree.is(input, schema);\n\t}\n\n\treturn {\n\t\tget root(): ReadableField<TSchema> {\n\t\t\treturn subTree.field;\n\t\t},\n\t\tset root(value: TreeFieldFromImplicitField<ReadSchema<TSchema>>) {\n\t\t\tsubTree.field = value;\n\t\t},\n\t\tcreate,\n\t\tis,\n\t\tisArray(node) {\n\t\t\tif (Array.isArray(node)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (node instanceof TreeNode) {\n\t\t\t\tconst schema = Tree.schema(node);\n\t\t\t\treturn schema.kind === NodeKind.Array;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisMap(node) {\n\t\t\tif (node instanceof Map) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (node instanceof TreeNode) {\n\t\t\t\tconst schema = Tree.schema(node);\n\t\t\t\treturn schema.kind === NodeKind.Map;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tparent: (child: TreeNode): TreeNode | undefined => Tree.parent(child),\n\t\tkey: (child: TreeNode): string | number => Tree.key(child),\n\t} satisfies Context<TSchema>;\n}\n"]}
package/lib/alpha.d.ts CHANGED
@@ -20,25 +20,34 @@ export {
20
20
  ArgsTuple,
21
21
  AsynchronousEditor,
22
22
  BindableSchema,
23
+ Context,
23
24
  Ctor,
24
25
  EditResult,
26
+ ExposableKeys,
25
27
  ExposedMethods,
28
+ ExposedProperties,
26
29
  FunctionDef,
27
30
  IExposedMethods,
31
+ IExposedProperties,
32
+ IfEquals,
28
33
  Infer,
29
34
  Logger,
30
35
  MethodKeys,
36
+ PropertyDef,
37
+ ReadOnlyRequirement,
38
+ ReadonlyKeys,
31
39
  SemanticAgentOptions,
32
40
  SharedTreeChatModel,
33
41
  SharedTreeChatQuery,
34
42
  SharedTreeSemanticAgent,
35
43
  SynchronousEditor,
36
44
  TreeView,
37
- bindEditor,
38
- bindEditorImpl,
45
+ TypeMatchOrError,
46
+ ViewOrTree,
39
47
  buildFunc,
40
- defaultEditor,
48
+ createContext,
41
49
  exposeMethodsSymbol,
50
+ exposePropertiesSymbol,
42
51
  llmDefault
43
52
  // #endregion
44
53
  } from "./index.js";
package/lib/api.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import type { ImplicitFieldSchema, TreeNode } from "@fluidframework/tree";
6
- import type { FactoryContentObject, ReadableField } from "@fluidframework/tree/alpha";
6
+ import type { FactoryContentObject, ReadableField, TreeBranchAlpha, TreeViewAlpha } from "@fluidframework/tree/alpha";
7
7
  /**
8
8
  * Logger interface for logging events from a {@link SharedTreeSemanticAgent}.
9
9
  * @alpha
@@ -14,10 +14,23 @@ export interface Logger {
14
14
  */
15
15
  log(message: string): void;
16
16
  }
17
+ /**
18
+ * A SharedTree view for use by a {@link SharedTreeSemanticAgent}.
19
+ * @alpha
20
+ * @privateRemarks This is a subset of the TreeViewAlpha functionality because if take it wholesale, it causes problems with invariance of the generic parameters.
21
+ */
22
+ export type TreeView<TRoot extends ImplicitFieldSchema> = Pick<TreeViewAlpha<TRoot>, "root" | "fork" | "merge" | "rebaseOnto" | "schema" | "events"> & TreeBranchAlpha;
23
+ /**
24
+ * A value that is either a {@link TreeView} or a subtree within a {@link TreeView}.
25
+ * @alpha
26
+ */
27
+ export type ViewOrTree<TSchema extends ImplicitFieldSchema> = TreeView<TSchema> | (ReadableField<TSchema> & TreeNode);
17
28
  /**
18
29
  * The context object available to generated code when editing a tree.
19
30
  * @remarks This object is provided to JavaScript code executed by the {@link SynchronousEditor | editor} as a variable named `context`.
20
31
  * It contains the current state of the tree and utilities for creating and inspecting tree nodes.
32
+ *
33
+ * Use {@link createContext} to create a context.
21
34
  * @alpha
22
35
  */
23
36
  export interface Context<TSchema extends ImplicitFieldSchema> {
@@ -82,25 +95,39 @@ export interface Context<TSchema extends ImplicitFieldSchema> {
82
95
  }
83
96
  /**
84
97
  * A synchronous function that executes a string of JavaScript code to perform an edit within a {@link SharedTreeSemanticAgent}.
85
- * @param context - An object that must be provided to the generated code as a variable named "context" in its top-level scope.
98
+ * @param tree - The tree to edit.
86
99
  * @param code - The JavaScript code that should be executed.
87
- * @remarks To simulate the execution of an editor outside of an {@link SharedTreeSemanticAgent | agent}, you can use {@link bindEditor | bindEditor} to bind an editor to a specific subtree.
100
+ * @throws Any error thrown by the executed code.
101
+ * @remarks The code expects a variable named `context` to be in scope, which provides access to the tree and utilities for creating and inspecting nodes.
102
+ * A context can be created for a given tree via the {@link createContext} function.
103
+ * @example
104
+ * ```ts
105
+ * // A simple editor implementation that runs the provided code via a JavaScript Function.
106
+ * new Function("context", code)(createContext(tree));
107
+ * ```
88
108
  * @alpha
89
109
  */
90
- export type SynchronousEditor = (context: Record<string, unknown>, code: string) => void;
110
+ export type SynchronousEditor<TSchema extends ImplicitFieldSchema> = (tree: ViewOrTree<TSchema>, code: string) => void;
91
111
  /**
92
112
  * An asynchronous function that executes a string of JavaScript code to perform an edit within a {@link SharedTreeSemanticAgent}.
93
- * @param context - An object that must be provided to the generated code as a variable named "context" in its top-level scope.
113
+ * @param tree - The tree to edit.
94
114
  * @param code - The JavaScript code that should be executed.
95
- * @remarks To simulate the execution of an editor outside of an {@link SharedTreeSemanticAgent | agent}, you can use {@link bindEditor | bindEditor} to bind an editor to a specific subtree.
115
+ * @throws Any error thrown by the executed code.
116
+ * @remarks The code expects a variable named `context` to be in scope, which provides access to the tree and utilities for creating and inspecting nodes.
117
+ * A context can be created for a given tree via the {@link createContext} function.
118
+ * @example
119
+ * ```ts
120
+ * // A simple editor implementation that runs the provided code via a JavaScript Function.
121
+ * await new Function("context", code)(createContext(tree));
122
+ * ```
96
123
  * @alpha
97
124
  */
98
- export type AsynchronousEditor = (context: Record<string, unknown>, code: string) => Promise<void>;
125
+ export type AsynchronousEditor<TSchema extends ImplicitFieldSchema> = (tree: ViewOrTree<TSchema>, code: string) => Promise<void>;
99
126
  /**
100
127
  * Options used to parameterize the creation of a {@link SharedTreeSemanticAgent}.
101
128
  * @alpha
102
129
  */
103
- export interface SemanticAgentOptions {
130
+ export interface SemanticAgentOptions<TSchema extends ImplicitFieldSchema> {
104
131
  /**
105
132
  * Additional information about the application domain that will be included in the context provided to the {@link SharedTreeChatModel | model}.
106
133
  */
@@ -108,12 +135,10 @@ export interface SemanticAgentOptions {
108
135
  /**
109
136
  * Executes any generated JavaScript created by the {@link SharedTreeChatModel.editToolName | model's editing tool}.
110
137
  * @remarks If an error is thrown while executing the code, it will be caught and the message will be forwarded to the {@link SharedTreeChatModel | model} for debugging.
111
- * @remarks If this function is not provided, the generated code will be executed using a {@link defaultEditor | simple default} which may not provide sufficient security guarantees for some environments.
112
- * Use a library such as SES to provide a more secure implementation - see `@fluidframework/tree-agent-ses` for a drop-in implementation.
113
- *
114
- * To simulate the execution of an editor outside of an {@link SharedTreeSemanticAgent | agent}, you can use {@link bindEditor | bindEditor} to bind an editor to a specific subtree.
138
+ * @remarks If this function is not provided, the generated code will be executed using a simple JavaScript eval which may not provide sufficient security guarantees for some environments.
139
+ * Run the code in a sandboxed environment or use a library such as SES to provide a more secure implementation - see `@fluidframework/tree-agent-ses` for a drop-in implementation.
115
140
  */
116
- editor?: SynchronousEditor | AsynchronousEditor;
141
+ editor?: SynchronousEditor<TSchema> | AsynchronousEditor<TSchema>;
117
142
  /**
118
143
  * The maximum number of sequential edits the LLM can make before we assume it's stuck in a loop.
119
144
  */
@@ -202,11 +227,4 @@ export interface SharedTreeChatModel {
202
227
  */
203
228
  query(message: SharedTreeChatQuery): Promise<string>;
204
229
  }
205
- /**
206
- * A function that edits a SharedTree.
207
- */
208
- export type EditFunction<TSchema extends ImplicitFieldSchema> = ({ root, create, }: {
209
- root: ReadableField<TSchema>;
210
- create: Record<string, (input: FactoryContentObject) => TreeNode>;
211
- }) => void | Promise<void>;
212
230
  //# sourceMappingURL=api.d.ts.map
package/lib/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}