@copilotkit/react-core 0.13.0 → 0.14.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 (47) hide show
  1. package/.turbo/turbo-build.log +21 -21
  2. package/CHANGELOG.md +6 -0
  3. package/dist/{chunk-3BOHSSKR.mjs → chunk-C4KF43WB.mjs} +3 -9
  4. package/dist/chunk-C4KF43WB.mjs.map +1 -0
  5. package/dist/{chunk-PRPQRCVY.mjs → chunk-FVU5RFVX.mjs} +4 -6
  6. package/dist/chunk-FVU5RFVX.mjs.map +1 -0
  7. package/dist/{chunk-X24EEZGG.mjs → chunk-HZDMKMAV.mjs} +1 -1
  8. package/dist/chunk-HZDMKMAV.mjs.map +1 -0
  9. package/dist/{chunk-G5LZS72K.mjs → chunk-RW25IF4S.mjs} +2 -2
  10. package/dist/{chunk-G5LZS72K.mjs.map → chunk-RW25IF4S.mjs.map} +1 -1
  11. package/dist/{chunk-AMFRKVFT.mjs → chunk-UBLDQLZM.mjs} +2 -2
  12. package/dist/chunk-UBLDQLZM.mjs.map +1 -0
  13. package/dist/{chunk-P3QUZTN7.mjs → chunk-XFSUVTIQ.mjs} +3 -6
  14. package/dist/chunk-XFSUVTIQ.mjs.map +1 -0
  15. package/dist/{chunk-63ILXW5V.mjs → chunk-YULKJPY3.mjs} +12 -18
  16. package/dist/chunk-YULKJPY3.mjs.map +1 -0
  17. package/dist/{chunk-FIYUJVWU.mjs → chunk-ZIFCJ774.mjs} +10 -13
  18. package/dist/chunk-ZIFCJ774.mjs.map +1 -0
  19. package/dist/components/copilot-provider.mjs +4 -4
  20. package/dist/components/index.mjs +4 -4
  21. package/dist/context/copilot-context.mjs +1 -1
  22. package/dist/context/index.mjs +1 -1
  23. package/dist/hooks/index.mjs +8 -8
  24. package/dist/hooks/use-copilot-chat.mjs +5 -5
  25. package/dist/hooks/use-flat-category-store.mjs +1 -1
  26. package/dist/hooks/use-make-copilot-actionable.mjs +2 -2
  27. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  28. package/dist/hooks/use-make-copilot-readable.mjs +2 -2
  29. package/dist/hooks/use-tree.mjs +1 -1
  30. package/dist/index.mjs +8 -8
  31. package/package.json +1 -1
  32. package/src/components/copilot-provider.tsx +24 -40
  33. package/src/components/index.ts +1 -4
  34. package/src/context/copilot-context.tsx +6 -17
  35. package/src/hooks/use-copilot-chat.ts +17 -22
  36. package/src/hooks/use-flat-category-store.ts +15 -25
  37. package/src/hooks/use-make-copilot-actionable.ts +3 -6
  38. package/src/hooks/use-make-copilot-document-readable.ts +2 -3
  39. package/src/hooks/use-make-copilot-readable.ts +1 -1
  40. package/src/hooks/use-tree.ts +10 -28
  41. package/dist/chunk-3BOHSSKR.mjs.map +0 -1
  42. package/dist/chunk-63ILXW5V.mjs.map +0 -1
  43. package/dist/chunk-AMFRKVFT.mjs.map +0 -1
  44. package/dist/chunk-FIYUJVWU.mjs.map +0 -1
  45. package/dist/chunk-P3QUZTN7.mjs.map +0 -1
  46. package/dist/chunk-PRPQRCVY.mjs.map +0 -1
  47. package/dist/chunk-X24EEZGG.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
 
2
- > @copilotkit/react-core@0.13.0 build /home/runner/work/CopilotKit/CopilotKit/CopilotKit/packages/react-core
2
+ > @copilotkit/react-core@0.14.0 build /home/runner/work/CopilotKit/CopilotKit/CopilotKit/packages/react-core
3
3
  > tsup --treeshake
4
4
 
5
5
  CLI Building entry: src/index.tsx, src/components/copilot-provider.tsx, src/components/index.ts, src/context/copilot-context.tsx, src/context/index.ts, src/hooks/index.ts, src/hooks/use-copilot-chat.ts, src/hooks/use-flat-category-store.ts, src/hooks/use-make-copilot-actionable.ts, src/hooks/use-make-copilot-document-readable.ts, src/hooks/use-make-copilot-readable.ts, src/hooks/use-tree.ts, src/types/annotated-function.ts, src/types/document-pointer.ts, src/types/index.ts, src/utils/utils.test.ts, src/utils/utils.ts
@@ -22,8 +22,8 @@ Generated an empty chunk: "chunk-JD7BAH7U".
22
22
  ESM dist/components/copilot-provider.mjs 295.00 B
23
23
  ESM dist/context/copilot-context.mjs 194.00 B
24
24
  ESM dist/chunk-YPSGKPDA.mjs 76.00 B
25
- ESM dist/chunk-QACD2U6P.mjs 76.00 B
26
25
  ESM dist/chunk-JD7BAH7U.mjs 76.00 B
26
+ ESM dist/chunk-QACD2U6P.mjs 76.00 B
27
27
  ESM dist/chunk-MRXNTQOX.mjs 1.92 KB
28
28
  ESM dist/hooks/use-make-copilot-document-readable.mjs 231.00 B
29
29
  ESM dist/hooks/use-make-copilot-readable.mjs 214.00 B
@@ -32,16 +32,16 @@ Generated an empty chunk: "chunk-JD7BAH7U".
32
32
  ESM dist/components/index.mjs 316.00 B
33
33
  ESM dist/context/index.mjs 216.00 B
34
34
  ESM dist/hooks/index.mjs 548.00 B
35
- ESM dist/chunk-P3QUZTN7.mjs 972.00 B
36
- ESM dist/chunk-AMFRKVFT.mjs 677.00 B
37
- ESM dist/chunk-G5LZS72K.mjs 626.00 B
35
+ ESM dist/chunk-XFSUVTIQ.mjs 954.00 B
36
+ ESM dist/chunk-UBLDQLZM.mjs 677.00 B
37
+ ESM dist/chunk-RW25IF4S.mjs 626.00 B
38
38
  ESM dist/hooks/use-copilot-chat.mjs 347.00 B
39
- ESM dist/chunk-PRPQRCVY.mjs 2.96 KB
40
- ESM dist/chunk-FIYUJVWU.mjs 4.90 KB
41
- ESM dist/chunk-3BOHSSKR.mjs 3.95 KB
42
- ESM dist/chunk-X24EEZGG.mjs 1.32 KB
39
+ ESM dist/chunk-FVU5RFVX.mjs 2.95 KB
40
+ ESM dist/chunk-C4KF43WB.mjs 3.89 KB
41
+ ESM dist/chunk-ZIFCJ774.mjs 4.87 KB
42
+ ESM dist/chunk-HZDMKMAV.mjs 1.32 KB
43
43
  ESM dist/hooks/use-flat-category-store.mjs 200.00 B
44
- ESM dist/chunk-63ILXW5V.mjs 1.92 KB
44
+ ESM dist/chunk-YULKJPY3.mjs 1.87 KB
45
45
  ESM dist/utils/utils.mjs 67.00 B
46
46
  ESM dist/types/annotated-function.mjs 80.00 B
47
47
  ESM dist/types/document-pointer.mjs 78.00 B
@@ -52,8 +52,8 @@ Generated an empty chunk: "chunk-JD7BAH7U".
52
52
  ESM dist/components/copilot-provider.mjs.map 51.00 B
53
53
  ESM dist/context/copilot-context.mjs.map 51.00 B
54
54
  ESM dist/chunk-YPSGKPDA.mjs.map 51.00 B
55
- ESM dist/chunk-QACD2U6P.mjs.map 51.00 B
56
55
  ESM dist/chunk-JD7BAH7U.mjs.map 51.00 B
56
+ ESM dist/chunk-QACD2U6P.mjs.map 51.00 B
57
57
  ESM dist/chunk-MRXNTQOX.mjs.map 71.00 B
58
58
  ESM dist/hooks/use-make-copilot-document-readable.mjs.map 51.00 B
59
59
  ESM dist/hooks/use-make-copilot-readable.mjs.map 51.00 B
@@ -62,23 +62,23 @@ Generated an empty chunk: "chunk-JD7BAH7U".
62
62
  ESM dist/components/index.mjs.map 51.00 B
63
63
  ESM dist/context/index.mjs.map 51.00 B
64
64
  ESM dist/hooks/index.mjs.map 51.00 B
65
- ESM dist/chunk-P3QUZTN7.mjs.map 1.70 KB
66
- ESM dist/chunk-AMFRKVFT.mjs.map 1.43 KB
67
- ESM dist/chunk-G5LZS72K.mjs.map 1.47 KB
65
+ ESM dist/chunk-XFSUVTIQ.mjs.map 1.67 KB
66
+ ESM dist/chunk-UBLDQLZM.mjs.map 1.42 KB
67
+ ESM dist/chunk-RW25IF4S.mjs.map 1.47 KB
68
68
  ESM dist/hooks/use-copilot-chat.mjs.map 51.00 B
69
- ESM dist/chunk-PRPQRCVY.mjs.map 4.86 KB
70
- ESM dist/chunk-FIYUJVWU.mjs.map 9.57 KB
71
- ESM dist/chunk-3BOHSSKR.mjs.map 8.39 KB
72
- ESM dist/chunk-X24EEZGG.mjs.map 4.27 KB
69
+ ESM dist/chunk-FVU5RFVX.mjs.map 4.80 KB
70
+ ESM dist/chunk-C4KF43WB.mjs.map 8.26 KB
71
+ ESM dist/chunk-ZIFCJ774.mjs.map 9.44 KB
72
+ ESM dist/chunk-HZDMKMAV.mjs.map 4.22 KB
73
73
  ESM dist/hooks/use-flat-category-store.mjs.map 51.00 B
74
- ESM dist/chunk-63ILXW5V.mjs.map 4.31 KB
74
+ ESM dist/chunk-YULKJPY3.mjs.map 4.21 KB
75
75
  ESM dist/utils/utils.mjs.map 51.00 B
76
76
  ESM dist/types/annotated-function.mjs.map 51.00 B
77
77
  ESM dist/types/document-pointer.mjs.map 51.00 B
78
78
  ESM dist/utils/utils.test.mjs.map 351.00 B
79
- ESM ⚡️ Build success in 304ms
79
+ ESM ⚡️ Build success in 299ms
80
80
  DTS Build start
81
- DTS ⚡️ Build success in 1546ms
81
+ DTS ⚡️ Build success in 1543ms
82
82
  DTS dist/index.d.ts 847.00 B
83
83
  DTS dist/components/copilot-provider.d.ts 378.00 B
84
84
  DTS dist/context/copilot-context.d.ts 2.03 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # ui
2
2
 
3
+ ## 0.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - shouldToggleHoveringEditorOnKeyPress
8
+
3
9
  ## 0.13.0
4
10
 
5
11
  ### Minor Changes
@@ -52,10 +52,7 @@ var printNode = (node, prefix = "", indentLevel = 0) => {
52
52
  node.children.forEach(
53
53
  (child, index) => output += printNode(
54
54
  child,
55
- `${childPrePrefix}${treeIndentationRepresentation(
56
- index,
57
- indentLevel + 1
58
- )}. `,
55
+ `${childPrePrefix}${treeIndentationRepresentation(index, indentLevel + 1)}. `,
59
56
  indentLevel + 1
60
57
  )
61
58
  );
@@ -114,10 +111,7 @@ var useTree = () => {
114
111
  if (index !== 0) {
115
112
  output += "\n";
116
113
  }
117
- output += printNode(
118
- node,
119
- `${treeIndentationRepresentation(index, 0)}. `
120
- );
114
+ output += printNode(node, `${treeIndentationRepresentation(index, 0)}. `);
121
115
  });
122
116
  return output;
123
117
  },
@@ -138,4 +132,4 @@ function setsHaveIntersection(setA, setB) {
138
132
 
139
133
  export { use_tree_default };
140
134
  //# sourceMappingURL=out.js.map
141
- //# sourceMappingURL=chunk-3BOHSSKR.mjs.map
135
+ //# sourceMappingURL=chunk-C4KF43WB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-tree.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,aAAa,kBAAkB;AAkCxC,IAAM,aAAa,CAAC,OAAa,OAAyB;AACxD,SAAO,MAAM,OAAO,CAAC,QAAc,SAAS;AAC1C,QAAI,KAAK,OAAO,IAAI;AAClB,YAAM,UAAU,iCAAK,OAAL,EAAW,UAAU,WAAW,KAAK,UAAU,EAAE,EAAE;AACnE,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEA,IAAM,UAAU,CAAC,OAAa,SAAmB,aAAgC;AAC/E,MAAI,CAAC,UAAU;AACb,WAAO,CAAC,GAAG,OAAO,OAAO;AAAA,EAC3B;AACA,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,QAAI,KAAK,OAAO,UAAU;AACxB,aAAO,iCAAK,OAAL,EAAW,UAAU,CAAC,GAAG,KAAK,UAAU,OAAO,EAAE;AAAA,IAC1D,WAAW,KAAK,SAAS,QAAQ;AAC/B,aAAO,iCAAK,OAAL,EAAW,UAAU,QAAQ,KAAK,UAAU,SAAS,QAAQ,EAAE;AAAA,IACxE;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,gCAAgC,CAAC,OAAe,gBAAgC;AACpF,MAAI,gBAAgB,GAAG;AACrB,YAAQ,QAAQ,GAAG,SAAS;AAAA,EAC9B,WAAW,gBAAgB,GAAG;AAC5B,WAAO,OAAO,aAAa,KAAK,KAAK;AAAA,EACvC,WAAW,gBAAgB,GAAG;AAC5B,WAAO,OAAO,aAAa,KAAK,KAAK;AAAA,EACvC,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,IAAM,YAAY,CAAC,MAAgB,SAAS,IAAI,cAAc,MAAc;AAC1E,QAAM,SAAS,IAAI,OAAO,CAAC,EAAE,OAAO,WAAW;AAE/C,QAAM,yBAAyB,OAAO,SAAS,OAAO;AACtD,QAAM,wBAAwB,IAAI,OAAO,sBAAsB;AAE/D,QAAM,aAAa,KAAK,MAAM,MAAM,IAAI;AAExC,QAAM,kBAAkB,GAAG,SAAS,SAAS,WAAW;AACxD,QAAM,wBAAwB,WAC3B,MAAM,CAAC,EACP,IAAI,CAAC,SAAS,GAAG,wBAAwB,MAAM,EAC/C,KAAK,IAAI;AAEZ,MAAI,SAAS,GAAG;AAAA;AAChB,MAAI,uBAAuB;AACzB,cAAU,GAAG;AAAA;AAAA,EACf;AAEA,QAAM,iBAAiB,IAAI,OAAO,OAAO,MAAM;AAE/C,OAAK,SAAS;AAAA,IACZ,CAAC,OAAO,UACL,UAAU;AAAA,MACT;AAAA,MACA,GAAG,iBAAiB,8BAA8B,OAAO,cAAc,CAAC;AAAA,MACxE,cAAc;AAAA,IAChB;AAAA,EACJ;AACA,SAAO;AACT;AAcA,SAAS,YAAY,OAAa,QAAsB;AACtD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,YAAY;AACf,YAAM,EAAE,OAAO,UAAU,IAAI,UAAU,IAAI;AAC3C,YAAM,UAAoB;AAAA,QACxB,IAAI;AAAA,QACJ;AAAA,QACA,UAAU,CAAC;AAAA,QACX,YAAY,IAAI,IAAI,OAAO,UAAU;AAAA,MACvC;AAEA,UAAI;AACF,eAAO,QAAQ,OAAO,SAAS,QAAQ;AAAA,MACzC,SAAS,OAAP;AACA,gBAAQ,MAAM,mCAAmC,cAAc,OAAO;AACtE,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,EAAE;AAAA,IACpC;AACE,aAAO;AAAA,EACX;AACF;AAGA,IAAM,UAAU,MAAqB;AACnC,QAAM,CAAC,MAAM,QAAQ,IAAI,WAAW,aAAa,CAAC,CAAC;AAEnD,QAAM,aAAa;AAAA,IACjB,CAAC,OAAe,YAAsB,aAAkC;AACtE,YAAM,YAAY,OAAO;AACzB,eAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,YAAY,CAAC,OAAyB;AAC1D,aAAS,EAAE,MAAM,eAAe,GAAG,CAAC;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY;AAAA,IAChB,CAAC,eAAiC;AAChC,YAAM,gBAAgB,IAAI,IAAI,UAAU;AAExC,UAAI,SAAS;AACb,WAAK,QAAQ,CAAC,MAAM,UAAU;AAE5B,YAAI,CAAC,qBAAqB,eAAe,KAAK,UAAU,GAAG;AACzD;AAAA,QACF;AAGA,YAAI,UAAU,GAAG;AACf,oBAAU;AAAA,QACZ;AAEA,kBAAU,UAAU,MAAM,GAAG,8BAA8B,OAAO,CAAC,KAAK;AAAA,MAC1E,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO,EAAE,MAAM,YAAY,WAAW,cAAc;AACtD;AAEA,IAAO,mBAAQ;AAEf,SAAS,qBAAwB,MAAc,MAAuB;AACpE,QAAM,CAAC,YAAY,SAAS,IAAI,KAAK,QAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI;AAEnF,WAAS,QAAQ,YAAY;AAC3B,QAAI,UAAU,IAAI,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT","sourcesContent":["import { nanoid } from \"nanoid\";\nimport { useCallback, useReducer } from \"react\";\n\nexport type TreeNodeId = string;\n\nexport interface TreeNode {\n id: TreeNodeId;\n value: string;\n children: TreeNode[];\n parentId?: TreeNodeId;\n categories: Set<string>;\n}\n\nexport type Tree = TreeNode[];\n\nexport interface UseTreeReturn {\n tree: Tree;\n addElement: (value: string, categories: string[], parentId?: TreeNodeId) => TreeNodeId;\n printTree: (categories: string[]) => string;\n removeElement: (id: TreeNodeId) => void;\n}\n\nconst findNode = (nodes: Tree, id: TreeNodeId): TreeNode | undefined => {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n const result = findNode(node.children, id);\n if (result) {\n return result;\n }\n }\n return undefined;\n};\n\nconst removeNode = (nodes: Tree, id: TreeNodeId): Tree => {\n return nodes.reduce((result: Tree, node) => {\n if (node.id !== id) {\n const newNode = { ...node, children: removeNode(node.children, id) };\n result.push(newNode);\n }\n return result;\n }, []);\n};\n\nconst addNode = (nodes: Tree, newNode: TreeNode, parentId?: TreeNodeId): Tree => {\n if (!parentId) {\n return [...nodes, newNode];\n }\n return nodes.map((node) => {\n if (node.id === parentId) {\n return { ...node, children: [...node.children, newNode] };\n } else if (node.children.length) {\n return { ...node, children: addNode(node.children, newNode, parentId) };\n }\n return node;\n });\n};\n\nconst treeIndentationRepresentation = (index: number, indentLevel: number): string => {\n if (indentLevel === 0) {\n return (index + 1).toString();\n } else if (indentLevel === 1) {\n return String.fromCharCode(65 + index); // 65 is the ASCII value for 'A'\n } else if (indentLevel === 2) {\n return String.fromCharCode(97 + index); // 97 is the ASCII value for 'a'\n } else {\n return \"-\";\n }\n};\n\nconst printNode = (node: TreeNode, prefix = \"\", indentLevel = 0): string => {\n const indent = \" \".repeat(3).repeat(indentLevel);\n\n const prefixPlusIndentLength = prefix.length + indent.length;\n const subsequentLinesPrefix = \" \".repeat(prefixPlusIndentLength);\n\n const valueLines = node.value.split(\"\\n\");\n\n const outputFirstLine = `${indent}${prefix}${valueLines[0]}`;\n const outputSubsequentLines = valueLines\n .slice(1)\n .map((line) => `${subsequentLinesPrefix}${line}`)\n .join(\"\\n\");\n\n let output = `${outputFirstLine}\\n`;\n if (outputSubsequentLines) {\n output += `${outputSubsequentLines}\\n`;\n }\n\n const childPrePrefix = \" \".repeat(prefix.length);\n\n node.children.forEach(\n (child, index) =>\n (output += printNode(\n child,\n `${childPrePrefix}${treeIndentationRepresentation(index, indentLevel + 1)}. `,\n indentLevel + 1,\n )),\n );\n return output;\n};\n\n// Action types\ntype Action =\n | {\n type: \"ADD_NODE\";\n value: string;\n parentId?: string;\n id: string;\n categories: string[];\n }\n | { type: \"REMOVE_NODE\"; id: string };\n\n// Reducer function\nfunction treeReducer(state: Tree, action: Action): Tree {\n switch (action.type) {\n case \"ADD_NODE\": {\n const { value, parentId, id: newNodeId } = action;\n const newNode: TreeNode = {\n id: newNodeId,\n value,\n children: [],\n categories: new Set(action.categories),\n };\n\n try {\n return addNode(state, newNode, parentId);\n } catch (error) {\n console.error(`Error while adding node with id ${newNodeId}: ${error}`);\n return state;\n }\n }\n case \"REMOVE_NODE\":\n return removeNode(state, action.id);\n default:\n return state;\n }\n}\n\n// useTree hook\nconst useTree = (): UseTreeReturn => {\n const [tree, dispatch] = useReducer(treeReducer, []);\n\n const addElement = useCallback(\n (value: string, categories: string[], parentId?: string): TreeNodeId => {\n const newNodeId = nanoid(); // Generate new ID outside of dispatch\n dispatch({\n type: \"ADD_NODE\",\n value,\n parentId,\n id: newNodeId,\n categories: categories,\n });\n return newNodeId; // Return the new ID\n },\n [],\n );\n\n const removeElement = useCallback((id: TreeNodeId): void => {\n dispatch({ type: \"REMOVE_NODE\", id });\n }, []);\n\n const printTree = useCallback(\n (categories: string[]): string => {\n const categoriesSet = new Set(categories);\n\n let output = \"\";\n tree.forEach((node, index) => {\n // if the node does not have any of the desired categories, continue to the next node\n if (!setsHaveIntersection(categoriesSet, node.categories)) {\n return;\n }\n\n // add a new line before each node except the first one\n if (index !== 0) {\n output += \"\\n\";\n }\n\n output += printNode(node, `${treeIndentationRepresentation(index, 0)}. `);\n });\n return output;\n },\n [tree],\n );\n\n return { tree, addElement, printTree, removeElement };\n};\n\nexport default useTree;\n\nfunction setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {\n const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];\n\n for (let item of smallerSet) {\n if (largerSet.has(item)) {\n return true;\n }\n }\n\n return false;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { defaultCopilotContextCategories } from './chunk-FIYUJVWU.mjs';
2
- import { CopilotContext, copilotApiConfigExtrapolator } from './chunk-X24EEZGG.mjs';
1
+ import { defaultCopilotContextCategories } from './chunk-ZIFCJ774.mjs';
2
+ import { CopilotContext, copilotApiConfigExtrapolator } from './chunk-HZDMKMAV.mjs';
3
3
  import { __objRest, __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
4
4
  import { useContext, useMemo } from 'react';
5
5
  import { useChat } from 'ai/react';
@@ -25,9 +25,7 @@ function useCopilotChat(_a) {
25
25
  role: "system"
26
26
  };
27
27
  }, [getContextString, makeSystemMessage]);
28
- const initialMessagesWithContext = [systemMessage].concat(
29
- options.initialMessages || []
30
- );
28
+ const initialMessagesWithContext = [systemMessage].concat(options.initialMessages || []);
31
29
  const functionDescriptions = useMemo(() => {
32
30
  return getChatCompletionFunctionDescriptions();
33
31
  }, [getChatCompletionFunctionDescriptions]);
@@ -79,4 +77,4 @@ If you would like to call a function, call it without saying anything else.
79
77
 
80
78
  export { defaultSystemMessage, useCopilotChat };
81
79
  //# sourceMappingURL=out.js.map
82
- //# sourceMappingURL=chunk-PRPQRCVY.mjs.map
80
+ //# sourceMappingURL=chunk-FVU5RFVX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-copilot-chat.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS,kBAAkB;AAMpC,SAAS,eAAe;AAsBjB,SAAS,eAAe,IAGiB;AAHjB,eAC7B;AAAA;AAAA,EA7BF,IA4B+B,IAE1B,oBAF0B,IAE1B;AAAA,IADH;AAAA;AAGA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,cAAc;AAE7B,QAAM,gBAAyB,QAAQ,MAAM;AAC3C,UAAM,qBAAqB,qBAAqB;AAChD,UAAM,gBAAgB,iBAAiB,CAAC,GAAG,+BAA+B;AAE1E,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,mBAAmB,aAAa;AAAA,MACzC,MAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,kBAAkB,iBAAiB,CAAC;AAExC,QAAM,6BAA6B,CAAC,aAAa,EAAE,OAAO,QAAQ,mBAAmB,CAAC,CAAC;AAEvF,QAAM,uBAAuB,QAAQ,MAAM;AACzC,WAAO,sCAAsC;AAAA,EAC/C,GAAG,CAAC,qCAAqC,CAAC;AAE1C,QAAM,EAAE,UAAU,QAAQ,QAAQ,MAAM,WAAW,OAAO,SAAS,IAAI,QAAQ,iCAC1E,UAD0E;AAAA,IAE7E,KAAK,6BAA6B,gBAAgB,EAAE;AAAA,IACpD,IAAI,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB,6BAA6B,uBAAuB;AAAA,IACpD,SAAS,kCAAK,iBAAiB,UAAY,QAAQ;AAAA,IACnD,MAAM;AAAA,MACJ,IAAI,QAAQ;AAAA,MACZ,WAAW;AAAA,OACR,iBAAiB,OACjB,QAAQ;AAAA,EAEf,EAAC;AAED,QAAM,kBAAkB,SAAS;AAAA,IAC/B,CAAC,YAAY,QAAQ,SAAS,UAAU,QAAQ,SAAS;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,eAA+B;AAClE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF","sourcesContent":["import { useMemo, useContext } from \"react\";\nimport {\n CopilotContext,\n CopilotContextParams,\n copilotApiConfigExtrapolator,\n} from \"../context/copilot-context\";\nimport { useChat } from \"ai/react\";\nimport { ChatRequestOptions, CreateMessage, Message } from \"ai\";\nimport { UseChatOptions } from \"ai\";\nimport { defaultCopilotContextCategories } from \"../components\";\n\nexport interface UseCopilotChatOptions extends UseChatOptions {\n makeSystemMessage?: (contextString: string) => string;\n}\n\nexport interface UseCopilotChatReturn {\n visibleMessages: Message[];\n append: (\n message: Message | CreateMessage,\n chatRequestOptions?: ChatRequestOptions,\n ) => Promise<string | null | undefined>;\n reload: (chatRequestOptions?: ChatRequestOptions) => Promise<string | null | undefined>;\n stop: () => void;\n isLoading: boolean;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function useCopilotChat({\n makeSystemMessage,\n ...options\n}: UseCopilotChatOptions): UseCopilotChatReturn {\n const {\n getContextString,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n copilotApiConfig,\n } = useContext(CopilotContext);\n\n const systemMessage: Message = useMemo(() => {\n const systemMessageMaker = makeSystemMessage || defaultSystemMessage;\n const contextString = getContextString([], defaultCopilotContextCategories); // TODO: make the context categories configurable\n\n return {\n id: \"system\",\n content: systemMessageMaker(contextString),\n role: \"system\",\n };\n }, [getContextString, makeSystemMessage]);\n\n const initialMessagesWithContext = [systemMessage].concat(options.initialMessages || []);\n\n const functionDescriptions = useMemo(() => {\n return getChatCompletionFunctionDescriptions();\n }, [getChatCompletionFunctionDescriptions]);\n\n const { messages, append, reload, stop, isLoading, input, setInput } = useChat({\n ...options,\n api: copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,\n id: options.id,\n initialMessages: initialMessagesWithContext,\n experimental_onFunctionCall: getFunctionCallHandler(),\n headers: { ...copilotApiConfig.headers, ...options.headers },\n body: {\n id: options.id,\n functions: functionDescriptions,\n ...copilotApiConfig.body,\n ...options.body,\n },\n });\n\n const visibleMessages = messages.filter(\n (message) => message.role === \"user\" || message.role === \"assistant\",\n );\n\n return {\n visibleMessages,\n append,\n reload,\n stop,\n isLoading,\n input,\n setInput,\n };\n}\n\nexport function defaultSystemMessage(contextString: string): string {\n return `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou can ask them for clarifying questions if needed, but don't be annoying about it. If you can reasonably 'fill in the blanks' yourself, do so.\n\nIf you would like to call a function, call it without saying anything else.\n`;\n}\n"]}
@@ -47,4 +47,4 @@ function returnAndThrowInDebug(value) {
47
47
 
48
48
  export { CopilotContext, copilotApiConfigExtrapolator };
49
49
  //# sourceMappingURL=out.js.map
50
- //# sourceMappingURL=chunk-X24EEZGG.mjs.map
50
+ //# sourceMappingURL=chunk-HZDMKMAV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/copilot-context.tsx"],"names":[],"mappings":";;;;;AAGA,OAAO,WAAW;AAHlB;AA2CO,SAAS,6BAA6B,QAA0B;AACrE,SAAO;AAAA,IACL,IAAI,kBAA0B;AAC5B,aAAO,GAAG,OAAO;AAAA,IACnB;AAAA,EACF;AACF;AAwBA,IAAM,sBAA4C;AAAA,EAChD,aAAa,CAAC;AAAA,EACd,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,uCAAuC,MAAM,sBAAsB,CAAC,CAAC;AAAA,EACrE,wBAAwB,MAAM,sBAAsB,MAAY;AAAA,EAAC,EAAC;AAAA,EAElE,kBAAkB,CAAC,WAA8B,eAC/C,sBAAsB,EAAE;AAAA,EAC1B,YAAY,MAAM;AAAA,EAClB,eAAe,MAAM;AAAA,EAAC;AAAA,EAEtB,qBAAqB,CAAC,eAAyB,sBAAsB,CAAC,CAAC;AAAA,EACvE,oBAAoB,MAAM,sBAAsB,EAAE;AAAA,EAClD,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAE9B,kBAAkB,IAAK,MAAkC;AAAA,IACvD,IAAI,kBAA0B;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,UAAkC;AACpC,aAAO,CAAC;AAAA,IACV;AAAA,IACA,IAAI,OAA4B;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,EACF,EAAG;AACL;AAEO,IAAM,iBAAiB,MAAM,cAAoC,mBAAmB;AAE3F,SAAS,sBAAyB,OAAa;AAC7C,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT","sourcesContent":["\"use client\";\n\nimport { FunctionCallHandler } from \"ai\";\nimport React from \"react\";\nimport { TreeNodeId } from \"../hooks/use-tree\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { ChatCompletionCreateParams } from \"openai/resources/chat\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Additional body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'message': 'Hello, world!'\n * }\n * ```\n */\n body: Record<string, any>;\n}\n\nexport function copilotApiConfigExtrapolator(config: CopilotApiConfig) {\n return {\n get chatApiEndpoint(): string {\n return `${config.chatApiEndpoint}`;\n },\n };\n}\n\nexport interface CopilotContextParams {\n // function-calling\n entryPoints: Record<string, AnnotatedFunction<any[]>>;\n setEntryPoint: (id: string, entryPoint: AnnotatedFunction<any[]>) => void;\n removeEntryPoint: (id: string) => void;\n getChatCompletionFunctionDescriptions: () => ChatCompletionCreateParams.Function[];\n getFunctionCallHandler: () => FunctionCallHandler;\n\n // text context\n getContextString: (documents: DocumentPointer[], categories: string[]) => string;\n addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n\n // document context\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n entryPoints: {},\n setEntryPoint: () => {},\n removeEntryPoint: () => {},\n getChatCompletionFunctionDescriptions: () => returnAndThrowInDebug([]),\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\n \"Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!\",\n );\n }\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n};\n\nexport const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nfunction returnAndThrowInDebug<T>(value: T): T {\n throw new Error(\n \"Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!\",\n );\n return value;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CopilotContext } from './chunk-X24EEZGG.mjs';
1
+ import { CopilotContext } from './chunk-HZDMKMAV.mjs';
2
2
  import { useContext, useRef, useEffect } from 'react';
3
3
 
4
4
  function useMakeCopilotReadable(information, parentId, categories) {
@@ -16,4 +16,4 @@ function useMakeCopilotReadable(information, parentId, categories) {
16
16
 
17
17
  export { useMakeCopilotReadable };
18
18
  //# sourceMappingURL=out.js.map
19
- //# sourceMappingURL=chunk-G5LZS72K.mjs.map
19
+ //# sourceMappingURL=chunk-RW25IF4S.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/use-make-copilot-readable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,YAAY,WAAW,cAAc;AAF9C;AAYO,SAAS,uBACd,aACA,UACA,YACoB;AACpB,QAAM,EAAE,YAAY,cAAc,IAAI,WAAW,cAAc;AAC/D,QAAM,QAAQ,OAAe;AAE7B,YAAU,MAAM;AACd,UAAM,KAAK,WAAW,aAAa,UAAU,UAAU;AACvD,UAAM,UAAU;AAEhB,WAAO,MAAM;AACX,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,aAAa,UAAU,YAAY,aAAa,CAAC;AAErD,SAAO,MAAM;AACf","sourcesContent":["\"use client\";\n\nimport { useContext, useEffect, useRef } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\n\n/**\n * Adds the given information to the Copilot context to make it readable by Copilot.\n * @param information - The information to be added to the Copilot context.\n * @param parentId - The ID of the parent context, if any.\n * @param categories - An array of categories to control which context are visible where. Particularly useful with CopilotTextarea (see `useMakeAutosuggestionFunction`)\n * @returns The ID of the added context.\n */\nexport function useMakeCopilotReadable(\n information: string,\n parentId?: string,\n categories?: string[]\n): string | undefined {\n const { addContext, removeContext } = useContext(CopilotContext);\n const idRef = useRef<string>();\n\n useEffect(() => {\n const id = addContext(information, parentId, categories);\n idRef.current = id;\n\n return () => {\n removeContext(id);\n };\n }, [information, parentId, addContext, removeContext]);\n\n return idRef.current;\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/use-make-copilot-readable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,YAAY,WAAW,cAAc;AAF9C;AAYO,SAAS,uBACd,aACA,UACA,YACoB;AACpB,QAAM,EAAE,YAAY,cAAc,IAAI,WAAW,cAAc;AAC/D,QAAM,QAAQ,OAAe;AAE7B,YAAU,MAAM;AACd,UAAM,KAAK,WAAW,aAAa,UAAU,UAAU;AACvD,UAAM,UAAU;AAEhB,WAAO,MAAM;AACX,oBAAc,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,aAAa,UAAU,YAAY,aAAa,CAAC;AAErD,SAAO,MAAM;AACf","sourcesContent":["\"use client\";\n\nimport { useContext, useEffect, useRef } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\n\n/**\n * Adds the given information to the Copilot context to make it readable by Copilot.\n * @param information - The information to be added to the Copilot context.\n * @param parentId - The ID of the parent context, if any.\n * @param categories - An array of categories to control which context are visible where. Particularly useful with CopilotTextarea (see `useMakeAutosuggestionFunction`)\n * @returns The ID of the added context.\n */\nexport function useMakeCopilotReadable(\n information: string,\n parentId?: string,\n categories?: string[],\n): string | undefined {\n const { addContext, removeContext } = useContext(CopilotContext);\n const idRef = useRef<string>();\n\n useEffect(() => {\n const id = addContext(information, parentId, categories);\n idRef.current = id;\n\n return () => {\n removeContext(id);\n };\n }, [information, parentId, addContext, removeContext]);\n\n return idRef.current;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CopilotContext } from './chunk-X24EEZGG.mjs';
1
+ import { CopilotContext } from './chunk-HZDMKMAV.mjs';
2
2
  import { useContext, useRef, useEffect } from 'react';
3
3
 
4
4
  function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
@@ -16,4 +16,4 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
16
16
 
17
17
  export { useMakeCopilotDocumentReadable };
18
18
  //# sourceMappingURL=out.js.map
19
- //# sourceMappingURL=chunk-AMFRKVFT.mjs.map
19
+ //# sourceMappingURL=chunk-UBLDQLZM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-make-copilot-document-readable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,YAAY,WAAW,cAAc;AAF9C;AAaO,SAAS,+BACd,UACA,YACA,eAAsB,CAAC,GACH;AACpB,QAAM,EAAE,oBAAoB,sBAAsB,IAAI,WAAW,cAAc;AAC/E,QAAM,QAAQ,OAAe;AAE7B,YAAU,MAAM;AACd,UAAM,KAAK,mBAAmB,UAAU,UAAU;AAClD,UAAM,UAAU;AAEhB,WAAO,MAAM;AACX,4BAAsB,EAAE;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,oBAAoB,uBAAuB,GAAG,YAAY,CAAC;AAE/D,SAAO,MAAM;AACf","sourcesContent":["\"use client\";\n\nimport { useContext, useEffect, useRef } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Makes a document readable by Copilot.\n * @param document The document to make readable.\n * @param categories The categories to associate with the document.\n * @param dependencies The dependencies to use for the effect.\n * @returns The id of the document.\n */\nexport function useMakeCopilotDocumentReadable(\n document: DocumentPointer,\n categories?: string[],\n dependencies: any[] = [],\n): string | undefined {\n const { addDocumentContext, removeDocumentContext } = useContext(CopilotContext);\n const idRef = useRef<string>();\n\n useEffect(() => {\n const id = addDocumentContext(document, categories);\n idRef.current = id;\n\n return () => {\n removeDocumentContext(id);\n };\n }, [addDocumentContext, removeDocumentContext, ...dependencies]);\n\n return idRef.current;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CopilotContext } from './chunk-X24EEZGG.mjs';
1
+ import { CopilotContext } from './chunk-HZDMKMAV.mjs';
2
2
  import { useRef, useContext, useMemo, useEffect } from 'react';
3
3
  import { nanoid } from 'nanoid';
4
4
 
@@ -15,10 +15,7 @@ function useMakeCopilotActionable(annotatedFunction, dependencies) {
15
15
  dependencies
16
16
  );
17
17
  useEffect(() => {
18
- setEntryPoint(
19
- idRef.current,
20
- memoizedAnnotatedFunction
21
- );
18
+ setEntryPoint(idRef.current, memoizedAnnotatedFunction);
22
19
  return () => {
23
20
  removeEntryPoint(idRef.current);
24
21
  };
@@ -27,4 +24,4 @@ function useMakeCopilotActionable(annotatedFunction, dependencies) {
27
24
 
28
25
  export { useMakeCopilotActionable };
29
26
  //# sourceMappingURL=out.js.map
30
- //# sourceMappingURL=chunk-P3QUZTN7.mjs.map
27
+ //# sourceMappingURL=chunk-XFSUVTIQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-make-copilot-actionable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,QAAQ,YAAY,WAAW,eAAe;AAGvD,SAAS,cAAc;AALvB;AAOO,SAAS,yBACd,mBACA,cACA;AACA,QAAM,QAAQ,OAAO,OAAO,CAAC;AAC7B,QAAM,EAAE,eAAe,iBAAiB,IAAI,WAAW,cAAc;AAErE,QAAM,4BAA4D;AAAA,IAChE,OAAO;AAAA,MACL,MAAM,kBAAkB;AAAA,MACxB,aAAa,kBAAkB;AAAA,MAC/B,qBAAqB,kBAAkB;AAAA,MACvC,gBAAgB,kBAAkB;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AAEA,YAAU,MAAM;AACd,kBAAc,MAAM,SAAS,yBAAqD;AAElF,WAAO,MAAM;AACX,uBAAiB,MAAM,OAAO;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,2BAA2B,eAAe,gBAAgB,CAAC;AACjE","sourcesContent":["\"use client\";\n\nimport { useRef, useContext, useEffect, useMemo } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { nanoid } from \"nanoid\";\n\nexport function useMakeCopilotActionable<ActionInput extends any[]>(\n annotatedFunction: AnnotatedFunction<ActionInput>,\n dependencies: any[],\n) {\n const idRef = useRef(nanoid()); // generate a unique id\n const { setEntryPoint, removeEntryPoint } = useContext(CopilotContext);\n\n const memoizedAnnotatedFunction: AnnotatedFunction<ActionInput> = useMemo(\n () => ({\n name: annotatedFunction.name,\n description: annotatedFunction.description,\n argumentAnnotations: annotatedFunction.argumentAnnotations,\n implementation: annotatedFunction.implementation,\n }),\n dependencies,\n );\n\n useEffect(() => {\n setEntryPoint(idRef.current, memoizedAnnotatedFunction as AnnotatedFunction<any[]>);\n\n return () => {\n removeEntryPoint(idRef.current);\n };\n }, [memoizedAnnotatedFunction, setEntryPoint, removeEntryPoint]);\n}\n"]}
@@ -3,23 +3,17 @@ import { useReducer, useCallback } from 'react';
3
3
 
4
4
  // src/hooks/use-flat-category-store.ts
5
5
  var useFlatCategoryStore = () => {
6
- const [elements, dispatch] = useReducer(
7
- flatCategoryStoreReducer,
8
- /* @__PURE__ */ new Map()
9
- );
10
- const addElement = useCallback(
11
- (value, categories) => {
12
- const newId = nanoid();
13
- dispatch({
14
- type: "ADD_ELEMENT",
15
- value,
16
- id: newId,
17
- categories
18
- });
19
- return newId;
20
- },
21
- []
22
- );
6
+ const [elements, dispatch] = useReducer(flatCategoryStoreReducer, /* @__PURE__ */ new Map());
7
+ const addElement = useCallback((value, categories) => {
8
+ const newId = nanoid();
9
+ dispatch({
10
+ type: "ADD_ELEMENT",
11
+ value,
12
+ id: newId,
13
+ categories
14
+ });
15
+ return newId;
16
+ }, []);
23
17
  const removeElement = useCallback((id) => {
24
18
  dispatch({ type: "REMOVE_ELEMENT", id });
25
19
  }, []);
@@ -73,4 +67,4 @@ function setsHaveIntersection(setA, setB) {
73
67
 
74
68
  export { use_flat_category_store_default };
75
69
  //# sourceMappingURL=out.js.map
76
- //# sourceMappingURL=chunk-63ILXW5V.mjs.map
70
+ //# sourceMappingURL=chunk-YULKJPY3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-flat-category-store.ts"],"names":[],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,aAAa,kBAAkB;AAgBxC,IAAM,uBAAuB,MAAwC;AACnE,QAAM,CAAC,UAAU,QAAQ,IAAI,WAE3B,0BAA0B,oBAAI,IAAsD,CAAC;AAEvF,QAAM,aAAa,YAAY,CAAC,OAAU,eAA8C;AACtF,UAAM,QAAQ,OAAO;AACrB,aAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,YAAY,CAAC,OAAkC;AACnE,aAAS,EAAE,MAAM,kBAAkB,GAAG,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc;AAAA,IAClB,CAAC,eAA8B;AAC7B,YAAM,gBAAgB,IAAI,IAAI,UAAU;AACxC,YAAM,SAAc,CAAC;AACrB,eAAS,QAAQ,CAAC,YAAY;AAC5B,YAAI,qBAAqB,eAAe,QAAQ,UAAU,GAAG;AAC3D,iBAAO,KAAK,QAAQ,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SAAO,EAAE,YAAY,eAAe,YAAY;AAClD;AAEA,IAAO,kCAAQ;AAaf,SAAS,yBACP,OACA,QACuD;AACvD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,eAAe;AAClB,YAAM,EAAE,OAAO,IAAI,WAAW,IAAI;AAClC,YAAM,aAA0C;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,YAAY,IAAI,IAAI,UAAU;AAAA,MAChC;AACA,YAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,eAAS,IAAI,IAAI,UAAU;AAC3B,aAAO;AAAA,IACT;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,eAAS,OAAO,OAAO,EAAE;AACzB,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAwB,MAAc,MAAuB;AACpE,QAAM,CAAC,YAAY,SAAS,IAAI,KAAK,QAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI;AAEnF,WAAS,QAAQ,YAAY;AAC3B,QAAI,UAAU,IAAI,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT","sourcesContent":["import { nanoid } from \"nanoid\";\nimport { useCallback, useReducer } from \"react\";\n\nexport type FlatCategoryStoreId = string;\n\nexport interface UseFlatCategoryStoreReturn<T> {\n addElement: (value: T, categories: string[]) => FlatCategoryStoreId;\n removeElement: (id: FlatCategoryStoreId) => void;\n allElements: (categories: string[]) => T[];\n}\n\ninterface FlatCategoryStoreElement<T> {\n id: FlatCategoryStoreId;\n value: T;\n categories: Set<string>;\n}\n\nconst useFlatCategoryStore = <T>(): UseFlatCategoryStoreReturn<T> => {\n const [elements, dispatch] = useReducer<\n React.Reducer<Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>, Action<T>>\n >(flatCategoryStoreReducer, new Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>());\n\n const addElement = useCallback((value: T, categories: string[]): FlatCategoryStoreId => {\n const newId = nanoid();\n dispatch({\n type: \"ADD_ELEMENT\",\n value,\n id: newId,\n categories,\n });\n return newId;\n }, []);\n\n const removeElement = useCallback((id: FlatCategoryStoreId): void => {\n dispatch({ type: \"REMOVE_ELEMENT\", id });\n }, []);\n\n const allElements = useCallback(\n (categories: string[]): T[] => {\n const categoriesSet = new Set(categories);\n const result: T[] = [];\n elements.forEach((element) => {\n if (setsHaveIntersection(categoriesSet, element.categories)) {\n result.push(element.value);\n }\n });\n return result;\n },\n [elements],\n );\n\n return { addElement, removeElement, allElements };\n};\n\nexport default useFlatCategoryStore;\n\n// Action types\ntype Action<T> =\n | {\n type: \"ADD_ELEMENT\";\n value: T;\n id: FlatCategoryStoreId;\n categories: string[];\n }\n | { type: \"REMOVE_ELEMENT\"; id: FlatCategoryStoreId };\n\n// Reducer\nfunction flatCategoryStoreReducer<T>(\n state: Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>,\n action: Action<T>,\n): Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>> {\n switch (action.type) {\n case \"ADD_ELEMENT\": {\n const { value, id, categories } = action;\n const newElement: FlatCategoryStoreElement<T> = {\n id,\n value,\n categories: new Set(categories),\n };\n const newState = new Map(state);\n newState.set(id, newElement);\n return newState;\n }\n case \"REMOVE_ELEMENT\": {\n const newState = new Map(state);\n newState.delete(action.id);\n return newState;\n }\n default:\n return state;\n }\n}\n\nfunction setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {\n const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];\n\n for (let item of smallerSet) {\n if (largerSet.has(item)) {\n return true;\n }\n }\n\n return false;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { use_tree_default } from './chunk-3BOHSSKR.mjs';
2
- import { CopilotContext } from './chunk-X24EEZGG.mjs';
3
- import { use_flat_category_store_default } from './chunk-63ILXW5V.mjs';
1
+ import { use_tree_default } from './chunk-C4KF43WB.mjs';
2
+ import { CopilotContext } from './chunk-HZDMKMAV.mjs';
3
+ import { use_flat_category_store_default } from './chunk-YULKJPY3.mjs';
4
4
  import { __spreadProps, __spreadValues, __async, __objRest } from './chunk-MRXNTQOX.mjs';
5
5
  import { useState, useCallback } from 'react';
6
6
  import { jsx } from 'react/jsx-runtime';
@@ -18,16 +18,13 @@ function CopilotProvider({
18
18
  removeElement: removeDocument,
19
19
  allElements: allDocuments
20
20
  } = use_flat_category_store_default();
21
- const setEntryPoint = useCallback(
22
- (id, entryPoint) => {
23
- setEntryPoints((prevPoints) => {
24
- return __spreadProps(__spreadValues({}, prevPoints), {
25
- [id]: entryPoint
26
- });
21
+ const setEntryPoint = useCallback((id, entryPoint) => {
22
+ setEntryPoints((prevPoints) => {
23
+ return __spreadProps(__spreadValues({}, prevPoints), {
24
+ [id]: entryPoint
27
25
  });
28
- },
29
- []
30
- );
26
+ });
27
+ }, []);
31
28
  const removeEntryPoint = useCallback((id) => {
32
29
  setEntryPoints((prevPoints) => {
33
30
  const newPoints = __spreadValues({}, prevPoints);
@@ -158,4 +155,4 @@ function annotatedFunctionToChatCompletionFunction(annotatedFunction) {
158
155
 
159
156
  export { CopilotProvider, defaultCopilotContextCategories };
160
157
  //# sourceMappingURL=out.js.map
161
- //# sourceMappingURL=chunk-FIYUJVWU.mjs.map
158
+ //# sourceMappingURL=chunk-ZIFCJ774.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/copilot-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { FunctionCallHandler } from \"ai\";\nimport { ReactNode, useCallback, useState } from \"react\";\nimport { CopilotContext, CopilotApiConfig } from \"../context/copilot-context\";\nimport useTree from \"../hooks/use-tree\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { ChatCompletionCreateParams } from \"openai/resources/chat\";\nimport { DocumentPointer } from \"../types\";\nimport useFlatCategoryStore from \"../hooks/use-flat-category-store\";\n\nexport function CopilotProvider({\n chatApiEndpoint,\n headers,\n body,\n children,\n}: {\n chatApiEndpoint: string;\n headers?: Record<string, string>;\n body?: Record<string, any>;\n children: ReactNode;\n}): JSX.Element {\n const [entryPoints, setEntryPoints] = useState<Record<string, AnnotatedFunction<any[]>>>({});\n\n const { addElement, removeElement, printTree } = useTree();\n const {\n addElement: addDocument,\n removeElement: removeDocument,\n allElements: allDocuments,\n } = useFlatCategoryStore<DocumentPointer>();\n\n const setEntryPoint = useCallback((id: string, entryPoint: AnnotatedFunction<any[]>) => {\n setEntryPoints((prevPoints) => {\n return {\n ...prevPoints,\n [id]: entryPoint,\n };\n });\n }, []);\n\n const removeEntryPoint = useCallback((id: string) => {\n setEntryPoints((prevPoints) => {\n const newPoints = { ...prevPoints };\n delete newPoints[id];\n return newPoints;\n });\n }, []);\n\n const getContextString = useCallback(\n (documents: DocumentPointer[], categories: string[]) => {\n const documentsString = documents\n .map((document) => {\n return `${document.name} (${document.sourceApplication}):\\n${document.getContents()}`;\n })\n .join(\"\\n\\n\");\n\n const nonDocumentStrings = printTree(categories);\n\n return `${documentsString}\\n\\n${nonDocumentStrings}`;\n },\n [printTree],\n );\n\n const addContext = useCallback(\n (\n context: string,\n parentId?: string,\n categories: string[] = defaultCopilotContextCategories,\n ) => {\n return addElement(context, categories, parentId);\n },\n [addElement],\n );\n\n const removeContext = useCallback(\n (id: string) => {\n removeElement(id);\n },\n [removeElement],\n );\n\n const getChatCompletionFunctionDescriptions = useCallback(() => {\n return entryPointsToChatCompletionFunctions(Object.values(entryPoints));\n }, [entryPoints]);\n\n const getFunctionCallHandler = useCallback(() => {\n return entryPointsToFunctionCallHandler(Object.values(entryPoints));\n }, [entryPoints]);\n\n const getDocumentsContext = useCallback(\n (categories: string[]) => {\n return allDocuments(categories);\n },\n [allDocuments],\n );\n\n const addDocumentContext = useCallback(\n (documentPointer: DocumentPointer, categories: string[] = defaultCopilotContextCategories) => {\n return addDocument(documentPointer, categories);\n },\n [addDocument],\n );\n\n const removeDocumentContext = useCallback(\n (documentId: string) => {\n removeDocument(documentId);\n },\n [removeDocument],\n );\n\n return (\n <CopilotContext.Provider\n value={{\n entryPoints,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n setEntryPoint,\n removeEntryPoint,\n getContextString,\n addContext,\n removeContext,\n getDocumentsContext,\n addDocumentContext,\n removeDocumentContext,\n copilotApiConfig: {\n chatApiEndpoint,\n headers: headers || {},\n body: body || {},\n },\n }}\n >\n {children}\n </CopilotContext.Provider>\n );\n}\n\nexport const defaultCopilotContextCategories = [\"global\"];\n\nfunction entryPointsToFunctionCallHandler(\n entryPoints: AnnotatedFunction<any[]>[],\n): FunctionCallHandler {\n return async (chatMessages, functionCall) => {\n let entrypointsByFunctionName: Record<string, AnnotatedFunction<any[]>> = {};\n for (let entryPoint of entryPoints) {\n entrypointsByFunctionName[entryPoint.name] = entryPoint;\n }\n\n const entryPointFunction = entrypointsByFunctionName[functionCall.name || \"\"];\n if (entryPointFunction) {\n let parsedFunctionCallArguments: Record<string, any>[] = [];\n if (functionCall.arguments) {\n parsedFunctionCallArguments = JSON.parse(functionCall.arguments);\n }\n\n const paramsInCorrectOrder: any[] = [];\n for (let arg of entryPointFunction.argumentAnnotations) {\n paramsInCorrectOrder.push(\n parsedFunctionCallArguments[arg.name as keyof typeof parsedFunctionCallArguments],\n );\n }\n\n await entryPointFunction.implementation(...paramsInCorrectOrder);\n\n // commented out becasue for now we don't want to return anything\n // const result = await entryPointFunction.implementation(\n // ...parsedFunctionCallArguments\n // );\n // const functionResponse: ChatRequest = {\n // messages: [\n // ...chatMessages,\n // {\n // id: nanoid(),\n // name: functionCall.name,\n // role: 'function' as const,\n // content: JSON.stringify(result),\n // },\n // ],\n // };\n\n // return functionResponse;\n }\n };\n}\n\nfunction entryPointsToChatCompletionFunctions(\n entryPoints: AnnotatedFunction<any[]>[],\n): ChatCompletionCreateParams.Function[] {\n return entryPoints.map(annotatedFunctionToChatCompletionFunction);\n}\n\nfunction annotatedFunctionToChatCompletionFunction(\n annotatedFunction: AnnotatedFunction<any[]>,\n): ChatCompletionCreateParams.Function {\n // Create the parameters object based on the argumentAnnotations\n let parameters: { [key: string]: any } = {};\n for (let arg of annotatedFunction.argumentAnnotations) {\n // isolate the args we should forward inline\n let { name, required, ...forwardedArgs } = arg;\n parameters[arg.name] = forwardedArgs;\n }\n\n let requiredParameterNames: string[] = [];\n for (let arg of annotatedFunction.argumentAnnotations) {\n if (arg.required) {\n requiredParameterNames.push(arg.name);\n }\n }\n\n // Create the ChatCompletionFunctions object\n let chatCompletionFunction: ChatCompletionCreateParams.Function = {\n name: annotatedFunction.name,\n description: annotatedFunction.description,\n parameters: {\n type: \"object\",\n properties: parameters,\n required: requiredParameterNames,\n },\n };\n\n return chatCompletionFunction;\n}\n"]}
@@ -1,7 +1,7 @@
1
- export { CopilotProvider, defaultCopilotContextCategories } from '../chunk-FIYUJVWU.mjs';
2
- import '../chunk-3BOHSSKR.mjs';
3
- import '../chunk-X24EEZGG.mjs';
4
- import '../chunk-63ILXW5V.mjs';
1
+ export { CopilotProvider, defaultCopilotContextCategories } from '../chunk-ZIFCJ774.mjs';
2
+ import '../chunk-C4KF43WB.mjs';
3
+ import '../chunk-HZDMKMAV.mjs';
4
+ import '../chunk-YULKJPY3.mjs';
5
5
  import '../chunk-MRXNTQOX.mjs';
6
6
  //# sourceMappingURL=out.js.map
7
7
  //# sourceMappingURL=copilot-provider.mjs.map
@@ -1,8 +1,8 @@
1
1
  import '../chunk-JD7BAH7U.mjs';
2
- export { CopilotProvider, defaultCopilotContextCategories } from '../chunk-FIYUJVWU.mjs';
3
- import '../chunk-3BOHSSKR.mjs';
4
- import '../chunk-X24EEZGG.mjs';
5
- import '../chunk-63ILXW5V.mjs';
2
+ export { CopilotProvider, defaultCopilotContextCategories } from '../chunk-ZIFCJ774.mjs';
3
+ import '../chunk-C4KF43WB.mjs';
4
+ import '../chunk-HZDMKMAV.mjs';
5
+ import '../chunk-YULKJPY3.mjs';
6
6
  import '../chunk-MRXNTQOX.mjs';
7
7
  //# sourceMappingURL=out.js.map
8
8
  //# sourceMappingURL=index.mjs.map
@@ -1,4 +1,4 @@
1
- export { CopilotContext, copilotApiConfigExtrapolator } from '../chunk-X24EEZGG.mjs';
1
+ export { CopilotContext, copilotApiConfigExtrapolator } from '../chunk-HZDMKMAV.mjs';
2
2
  import '../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=copilot-context.mjs.map
@@ -1,5 +1,5 @@
1
1
  import '../chunk-YPSGKPDA.mjs';
2
- export { CopilotContext, copilotApiConfigExtrapolator } from '../chunk-X24EEZGG.mjs';
2
+ export { CopilotContext, copilotApiConfigExtrapolator } from '../chunk-HZDMKMAV.mjs';
3
3
  import '../chunk-MRXNTQOX.mjs';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1,13 +1,13 @@
1
1
  import '../chunk-QACD2U6P.mjs';
2
- export { useMakeCopilotActionable } from '../chunk-P3QUZTN7.mjs';
3
- export { useMakeCopilotDocumentReadable } from '../chunk-AMFRKVFT.mjs';
4
- export { useMakeCopilotReadable } from '../chunk-G5LZS72K.mjs';
5
- export { useCopilotChat } from '../chunk-PRPQRCVY.mjs';
2
+ export { useMakeCopilotActionable } from '../chunk-XFSUVTIQ.mjs';
3
+ export { useMakeCopilotDocumentReadable } from '../chunk-UBLDQLZM.mjs';
4
+ export { useMakeCopilotReadable } from '../chunk-RW25IF4S.mjs';
5
+ export { useCopilotChat } from '../chunk-FVU5RFVX.mjs';
6
6
  import '../chunk-JD7BAH7U.mjs';
7
- import '../chunk-FIYUJVWU.mjs';
8
- import '../chunk-3BOHSSKR.mjs';
9
- import '../chunk-X24EEZGG.mjs';
10
- import '../chunk-63ILXW5V.mjs';
7
+ import '../chunk-ZIFCJ774.mjs';
8
+ import '../chunk-C4KF43WB.mjs';
9
+ import '../chunk-HZDMKMAV.mjs';
10
+ import '../chunk-YULKJPY3.mjs';
11
11
  import '../chunk-MRXNTQOX.mjs';
12
12
  //# sourceMappingURL=out.js.map
13
13
  //# sourceMappingURL=index.mjs.map
@@ -1,9 +1,9 @@
1
- export { defaultSystemMessage, useCopilotChat } from '../chunk-PRPQRCVY.mjs';
1
+ export { defaultSystemMessage, useCopilotChat } from '../chunk-FVU5RFVX.mjs';
2
2
  import '../chunk-JD7BAH7U.mjs';
3
- import '../chunk-FIYUJVWU.mjs';
4
- import '../chunk-3BOHSSKR.mjs';
5
- import '../chunk-X24EEZGG.mjs';
6
- import '../chunk-63ILXW5V.mjs';
3
+ import '../chunk-ZIFCJ774.mjs';
4
+ import '../chunk-C4KF43WB.mjs';
5
+ import '../chunk-HZDMKMAV.mjs';
6
+ import '../chunk-YULKJPY3.mjs';
7
7
  import '../chunk-MRXNTQOX.mjs';
8
8
  //# sourceMappingURL=out.js.map
9
9
  //# sourceMappingURL=use-copilot-chat.mjs.map
@@ -1,4 +1,4 @@
1
- export { use_flat_category_store_default as default } from '../chunk-63ILXW5V.mjs';
1
+ export { use_flat_category_store_default as default } from '../chunk-YULKJPY3.mjs';
2
2
  import '../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=use-flat-category-store.mjs.map
@@ -1,5 +1,5 @@
1
- export { useMakeCopilotActionable } from '../chunk-P3QUZTN7.mjs';
2
- import '../chunk-X24EEZGG.mjs';
1
+ export { useMakeCopilotActionable } from '../chunk-XFSUVTIQ.mjs';
2
+ import '../chunk-HZDMKMAV.mjs';
3
3
  import '../chunk-MRXNTQOX.mjs';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=use-make-copilot-actionable.mjs.map
@@ -1,5 +1,5 @@
1
- export { useMakeCopilotDocumentReadable } from '../chunk-AMFRKVFT.mjs';
2
- import '../chunk-X24EEZGG.mjs';
1
+ export { useMakeCopilotDocumentReadable } from '../chunk-UBLDQLZM.mjs';
2
+ import '../chunk-HZDMKMAV.mjs';
3
3
  import '../chunk-MRXNTQOX.mjs';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=use-make-copilot-document-readable.mjs.map
@@ -1,5 +1,5 @@
1
- export { useMakeCopilotReadable } from '../chunk-G5LZS72K.mjs';
2
- import '../chunk-X24EEZGG.mjs';
1
+ export { useMakeCopilotReadable } from '../chunk-RW25IF4S.mjs';
2
+ import '../chunk-HZDMKMAV.mjs';
3
3
  import '../chunk-MRXNTQOX.mjs';
4
4
  //# sourceMappingURL=out.js.map
5
5
  //# sourceMappingURL=use-make-copilot-readable.mjs.map
@@ -1,4 +1,4 @@
1
- export { use_tree_default as default } from '../chunk-3BOHSSKR.mjs';
1
+ export { use_tree_default as default } from '../chunk-C4KF43WB.mjs';
2
2
  import '../chunk-MRXNTQOX.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=use-tree.mjs.map
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
  import './chunk-EFZPSZWO.mjs';
2
2
  import './chunk-YPSGKPDA.mjs';
3
3
  import './chunk-QACD2U6P.mjs';
4
- export { useMakeCopilotActionable } from './chunk-P3QUZTN7.mjs';
5
- export { useMakeCopilotDocumentReadable } from './chunk-AMFRKVFT.mjs';
6
- export { useMakeCopilotReadable } from './chunk-G5LZS72K.mjs';
7
- export { useCopilotChat } from './chunk-PRPQRCVY.mjs';
4
+ export { useMakeCopilotActionable } from './chunk-XFSUVTIQ.mjs';
5
+ export { useMakeCopilotDocumentReadable } from './chunk-UBLDQLZM.mjs';
6
+ export { useMakeCopilotReadable } from './chunk-RW25IF4S.mjs';
7
+ export { useCopilotChat } from './chunk-FVU5RFVX.mjs';
8
8
  import './chunk-JD7BAH7U.mjs';
9
- export { CopilotProvider, defaultCopilotContextCategories } from './chunk-FIYUJVWU.mjs';
10
- import './chunk-3BOHSSKR.mjs';
11
- export { CopilotContext, copilotApiConfigExtrapolator } from './chunk-X24EEZGG.mjs';
12
- import './chunk-63ILXW5V.mjs';
9
+ export { CopilotProvider, defaultCopilotContextCategories } from './chunk-ZIFCJ774.mjs';
10
+ import './chunk-C4KF43WB.mjs';
11
+ export { CopilotContext, copilotApiConfigExtrapolator } from './chunk-HZDMKMAV.mjs';
12
+ import './chunk-YULKJPY3.mjs';
13
13
  import './chunk-MRXNTQOX.mjs';
14
14
  //# sourceMappingURL=out.js.map
15
15
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.13.0",
7
+ "version": "0.14.0",
8
8
  "sideEffects": false,
9
9
  "main": "./dist/index.js",
10
10
  "module": "./dist/index.mjs",
@@ -19,9 +19,7 @@ export function CopilotProvider({
19
19
  body?: Record<string, any>;
20
20
  children: ReactNode;
21
21
  }): JSX.Element {
22
- const [entryPoints, setEntryPoints] = useState<
23
- Record<string, AnnotatedFunction<any[]>>
24
- >({});
22
+ const [entryPoints, setEntryPoints] = useState<Record<string, AnnotatedFunction<any[]>>>({});
25
23
 
26
24
  const { addElement, removeElement, printTree } = useTree();
27
25
  const {
@@ -30,17 +28,14 @@ export function CopilotProvider({
30
28
  allElements: allDocuments,
31
29
  } = useFlatCategoryStore<DocumentPointer>();
32
30
 
33
- const setEntryPoint = useCallback(
34
- (id: string, entryPoint: AnnotatedFunction<any[]>) => {
35
- setEntryPoints((prevPoints) => {
36
- return {
37
- ...prevPoints,
38
- [id]: entryPoint,
39
- };
40
- });
41
- },
42
- []
43
- );
31
+ const setEntryPoint = useCallback((id: string, entryPoint: AnnotatedFunction<any[]>) => {
32
+ setEntryPoints((prevPoints) => {
33
+ return {
34
+ ...prevPoints,
35
+ [id]: entryPoint,
36
+ };
37
+ });
38
+ }, []);
44
39
 
45
40
  const removeEntryPoint = useCallback((id: string) => {
46
41
  setEntryPoints((prevPoints) => {
@@ -54,9 +49,7 @@ export function CopilotProvider({
54
49
  (documents: DocumentPointer[], categories: string[]) => {
55
50
  const documentsString = documents
56
51
  .map((document) => {
57
- return `${document.name} (${
58
- document.sourceApplication
59
- }):\n${document.getContents()}`;
52
+ return `${document.name} (${document.sourceApplication}):\n${document.getContents()}`;
60
53
  })
61
54
  .join("\n\n");
62
55
 
@@ -64,25 +57,25 @@ export function CopilotProvider({
64
57
 
65
58
  return `${documentsString}\n\n${nonDocumentStrings}`;
66
59
  },
67
- [printTree]
60
+ [printTree],
68
61
  );
69
62
 
70
63
  const addContext = useCallback(
71
64
  (
72
65
  context: string,
73
66
  parentId?: string,
74
- categories: string[] = defaultCopilotContextCategories
67
+ categories: string[] = defaultCopilotContextCategories,
75
68
  ) => {
76
69
  return addElement(context, categories, parentId);
77
70
  },
78
- [addElement]
71
+ [addElement],
79
72
  );
80
73
 
81
74
  const removeContext = useCallback(
82
75
  (id: string) => {
83
76
  removeElement(id);
84
77
  },
85
- [removeElement]
78
+ [removeElement],
86
79
  );
87
80
 
88
81
  const getChatCompletionFunctionDescriptions = useCallback(() => {
@@ -97,24 +90,21 @@ export function CopilotProvider({
97
90
  (categories: string[]) => {
98
91
  return allDocuments(categories);
99
92
  },
100
- [allDocuments]
93
+ [allDocuments],
101
94
  );
102
95
 
103
96
  const addDocumentContext = useCallback(
104
- (
105
- documentPointer: DocumentPointer,
106
- categories: string[] = defaultCopilotContextCategories
107
- ) => {
97
+ (documentPointer: DocumentPointer, categories: string[] = defaultCopilotContextCategories) => {
108
98
  return addDocument(documentPointer, categories);
109
99
  },
110
- [addDocument]
100
+ [addDocument],
111
101
  );
112
102
 
113
103
  const removeDocumentContext = useCallback(
114
104
  (documentId: string) => {
115
105
  removeDocument(documentId);
116
106
  },
117
- [removeDocument]
107
+ [removeDocument],
118
108
  );
119
109
 
120
110
  return (
@@ -146,19 +136,15 @@ export function CopilotProvider({
146
136
  export const defaultCopilotContextCategories = ["global"];
147
137
 
148
138
  function entryPointsToFunctionCallHandler(
149
- entryPoints: AnnotatedFunction<any[]>[]
139
+ entryPoints: AnnotatedFunction<any[]>[],
150
140
  ): FunctionCallHandler {
151
141
  return async (chatMessages, functionCall) => {
152
- let entrypointsByFunctionName: Record<
153
- string,
154
- AnnotatedFunction<any[]>
155
- > = {};
142
+ let entrypointsByFunctionName: Record<string, AnnotatedFunction<any[]>> = {};
156
143
  for (let entryPoint of entryPoints) {
157
144
  entrypointsByFunctionName[entryPoint.name] = entryPoint;
158
145
  }
159
146
 
160
- const entryPointFunction =
161
- entrypointsByFunctionName[functionCall.name || ""];
147
+ const entryPointFunction = entrypointsByFunctionName[functionCall.name || ""];
162
148
  if (entryPointFunction) {
163
149
  let parsedFunctionCallArguments: Record<string, any>[] = [];
164
150
  if (functionCall.arguments) {
@@ -168,9 +154,7 @@ function entryPointsToFunctionCallHandler(
168
154
  const paramsInCorrectOrder: any[] = [];
169
155
  for (let arg of entryPointFunction.argumentAnnotations) {
170
156
  paramsInCorrectOrder.push(
171
- parsedFunctionCallArguments[
172
- arg.name as keyof typeof parsedFunctionCallArguments
173
- ]
157
+ parsedFunctionCallArguments[arg.name as keyof typeof parsedFunctionCallArguments],
174
158
  );
175
159
  }
176
160
 
@@ -198,13 +182,13 @@ function entryPointsToFunctionCallHandler(
198
182
  }
199
183
 
200
184
  function entryPointsToChatCompletionFunctions(
201
- entryPoints: AnnotatedFunction<any[]>[]
185
+ entryPoints: AnnotatedFunction<any[]>[],
202
186
  ): ChatCompletionCreateParams.Function[] {
203
187
  return entryPoints.map(annotatedFunctionToChatCompletionFunction);
204
188
  }
205
189
 
206
190
  function annotatedFunctionToChatCompletionFunction(
207
- annotatedFunction: AnnotatedFunction<any[]>
191
+ annotatedFunction: AnnotatedFunction<any[]>,
208
192
  ): ChatCompletionCreateParams.Function {
209
193
  // Create the parameters object based on the argumentAnnotations
210
194
  let parameters: { [key: string]: any } = {};
@@ -1,4 +1 @@
1
- export {
2
- CopilotProvider,
3
- defaultCopilotContextCategories,
4
- } from "./copilot-provider";
1
+ export { CopilotProvider, defaultCopilotContextCategories } from "./copilot-provider";
@@ -58,23 +58,13 @@ export interface CopilotContextParams {
58
58
  getFunctionCallHandler: () => FunctionCallHandler;
59
59
 
60
60
  // text context
61
- getContextString: (
62
- documents: DocumentPointer[],
63
- categories: string[]
64
- ) => string;
65
- addContext: (
66
- context: string,
67
- parentId?: string,
68
- categories?: string[]
69
- ) => TreeNodeId;
61
+ getContextString: (documents: DocumentPointer[], categories: string[]) => string;
62
+ addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;
70
63
  removeContext: (id: TreeNodeId) => void;
71
64
 
72
65
  // document context
73
66
  getDocumentsContext: (categories: string[]) => DocumentPointer[];
74
- addDocumentContext: (
75
- documentPointer: DocumentPointer,
76
- categories?: string[]
77
- ) => TreeNodeId;
67
+ addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;
78
68
  removeDocumentContext: (documentId: string) => void;
79
69
 
80
70
  // api endpoints
@@ -100,7 +90,7 @@ const emptyCopilotContext: CopilotContextParams = {
100
90
  copilotApiConfig: new (class implements CopilotApiConfig {
101
91
  get chatApiEndpoint(): string {
102
92
  throw new Error(
103
- "Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!"
93
+ "Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!",
104
94
  );
105
95
  }
106
96
  get headers(): Record<string, string> {
@@ -112,12 +102,11 @@ const emptyCopilotContext: CopilotContextParams = {
112
102
  })(),
113
103
  };
114
104
 
115
- export const CopilotContext =
116
- React.createContext<CopilotContextParams>(emptyCopilotContext);
105
+ export const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);
117
106
 
118
107
  function returnAndThrowInDebug<T>(value: T): T {
119
108
  throw new Error(
120
- "Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!"
109
+ "Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!",
121
110
  );
122
111
  return value;
123
112
  }
@@ -17,11 +17,9 @@ export interface UseCopilotChatReturn {
17
17
  visibleMessages: Message[];
18
18
  append: (
19
19
  message: Message | CreateMessage,
20
- chatRequestOptions?: ChatRequestOptions
21
- ) => Promise<string | null | undefined>;
22
- reload: (
23
- chatRequestOptions?: ChatRequestOptions
20
+ chatRequestOptions?: ChatRequestOptions,
24
21
  ) => Promise<string | null | undefined>;
22
+ reload: (chatRequestOptions?: ChatRequestOptions) => Promise<string | null | undefined>;
25
23
  stop: () => void;
26
24
  isLoading: boolean;
27
25
  input: string;
@@ -50,32 +48,29 @@ export function useCopilotChat({
50
48
  };
51
49
  }, [getContextString, makeSystemMessage]);
52
50
 
53
- const initialMessagesWithContext = [systemMessage].concat(
54
- options.initialMessages || []
55
- );
51
+ const initialMessagesWithContext = [systemMessage].concat(options.initialMessages || []);
56
52
 
57
53
  const functionDescriptions = useMemo(() => {
58
54
  return getChatCompletionFunctionDescriptions();
59
55
  }, [getChatCompletionFunctionDescriptions]);
60
56
 
61
- const { messages, append, reload, stop, isLoading, input, setInput } =
62
- useChat({
63
- ...options,
64
- api: copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,
57
+ const { messages, append, reload, stop, isLoading, input, setInput } = useChat({
58
+ ...options,
59
+ api: copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,
60
+ id: options.id,
61
+ initialMessages: initialMessagesWithContext,
62
+ experimental_onFunctionCall: getFunctionCallHandler(),
63
+ headers: { ...copilotApiConfig.headers, ...options.headers },
64
+ body: {
65
65
  id: options.id,
66
- initialMessages: initialMessagesWithContext,
67
- experimental_onFunctionCall: getFunctionCallHandler(),
68
- headers: { ...copilotApiConfig.headers, ...options.headers },
69
- body: {
70
- id: options.id,
71
- functions: functionDescriptions,
72
- ...copilotApiConfig.body,
73
- ...options.body,
74
- },
75
- });
66
+ functions: functionDescriptions,
67
+ ...copilotApiConfig.body,
68
+ ...options.body,
69
+ },
70
+ });
76
71
 
77
72
  const visibleMessages = messages.filter(
78
- (message) => message.role === "user" || message.role === "assistant"
73
+ (message) => message.role === "user" || message.role === "assistant",
79
74
  );
80
75
 
81
76
  return {
@@ -17,28 +17,19 @@ interface FlatCategoryStoreElement<T> {
17
17
 
18
18
  const useFlatCategoryStore = <T>(): UseFlatCategoryStoreReturn<T> => {
19
19
  const [elements, dispatch] = useReducer<
20
- React.Reducer<
21
- Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>,
22
- Action<T>
23
- >
24
- >(
25
- flatCategoryStoreReducer,
26
- new Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>()
27
- );
20
+ React.Reducer<Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>, Action<T>>
21
+ >(flatCategoryStoreReducer, new Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>());
28
22
 
29
- const addElement = useCallback(
30
- (value: T, categories: string[]): FlatCategoryStoreId => {
31
- const newId = nanoid();
32
- dispatch({
33
- type: "ADD_ELEMENT",
34
- value,
35
- id: newId,
36
- categories,
37
- });
38
- return newId;
39
- },
40
- []
41
- );
23
+ const addElement = useCallback((value: T, categories: string[]): FlatCategoryStoreId => {
24
+ const newId = nanoid();
25
+ dispatch({
26
+ type: "ADD_ELEMENT",
27
+ value,
28
+ id: newId,
29
+ categories,
30
+ });
31
+ return newId;
32
+ }, []);
42
33
 
43
34
  const removeElement = useCallback((id: FlatCategoryStoreId): void => {
44
35
  dispatch({ type: "REMOVE_ELEMENT", id });
@@ -55,7 +46,7 @@ const useFlatCategoryStore = <T>(): UseFlatCategoryStoreReturn<T> => {
55
46
  });
56
47
  return result;
57
48
  },
58
- [elements]
49
+ [elements],
59
50
  );
60
51
 
61
52
  return { addElement, removeElement, allElements };
@@ -76,7 +67,7 @@ type Action<T> =
76
67
  // Reducer
77
68
  function flatCategoryStoreReducer<T>(
78
69
  state: Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>,
79
- action: Action<T>
70
+ action: Action<T>,
80
71
  ): Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>> {
81
72
  switch (action.type) {
82
73
  case "ADD_ELEMENT": {
@@ -101,8 +92,7 @@ function flatCategoryStoreReducer<T>(
101
92
  }
102
93
 
103
94
  function setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {
104
- const [smallerSet, largerSet] =
105
- setA.size <= setB.size ? [setA, setB] : [setB, setA];
95
+ const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];
106
96
 
107
97
  for (let item of smallerSet) {
108
98
  if (largerSet.has(item)) {
@@ -7,7 +7,7 @@ import { nanoid } from "nanoid";
7
7
 
8
8
  export function useMakeCopilotActionable<ActionInput extends any[]>(
9
9
  annotatedFunction: AnnotatedFunction<ActionInput>,
10
- dependencies: any[]
10
+ dependencies: any[],
11
11
  ) {
12
12
  const idRef = useRef(nanoid()); // generate a unique id
13
13
  const { setEntryPoint, removeEntryPoint } = useContext(CopilotContext);
@@ -19,14 +19,11 @@ export function useMakeCopilotActionable<ActionInput extends any[]>(
19
19
  argumentAnnotations: annotatedFunction.argumentAnnotations,
20
20
  implementation: annotatedFunction.implementation,
21
21
  }),
22
- dependencies
22
+ dependencies,
23
23
  );
24
24
 
25
25
  useEffect(() => {
26
- setEntryPoint(
27
- idRef.current,
28
- memoizedAnnotatedFunction as AnnotatedFunction<any[]>
29
- );
26
+ setEntryPoint(idRef.current, memoizedAnnotatedFunction as AnnotatedFunction<any[]>);
30
27
 
31
28
  return () => {
32
29
  removeEntryPoint(idRef.current);
@@ -14,10 +14,9 @@ import { DocumentPointer } from "../types";
14
14
  export function useMakeCopilotDocumentReadable(
15
15
  document: DocumentPointer,
16
16
  categories?: string[],
17
- dependencies: any[] = []
17
+ dependencies: any[] = [],
18
18
  ): string | undefined {
19
- const { addDocumentContext, removeDocumentContext } =
20
- useContext(CopilotContext);
19
+ const { addDocumentContext, removeDocumentContext } = useContext(CopilotContext);
21
20
  const idRef = useRef<string>();
22
21
 
23
22
  useEffect(() => {
@@ -13,7 +13,7 @@ import { CopilotContext } from "../context/copilot-context";
13
13
  export function useMakeCopilotReadable(
14
14
  information: string,
15
15
  parentId?: string,
16
- categories?: string[]
16
+ categories?: string[],
17
17
  ): string | undefined {
18
18
  const { addContext, removeContext } = useContext(CopilotContext);
19
19
  const idRef = useRef<string>();
@@ -15,11 +15,7 @@ export type Tree = TreeNode[];
15
15
 
16
16
  export interface UseTreeReturn {
17
17
  tree: Tree;
18
- addElement: (
19
- value: string,
20
- categories: string[],
21
- parentId?: TreeNodeId
22
- ) => TreeNodeId;
18
+ addElement: (value: string, categories: string[], parentId?: TreeNodeId) => TreeNodeId;
23
19
  printTree: (categories: string[]) => string;
24
20
  removeElement: (id: TreeNodeId) => void;
25
21
  }
@@ -47,11 +43,7 @@ const removeNode = (nodes: Tree, id: TreeNodeId): Tree => {
47
43
  }, []);
48
44
  };
49
45
 
50
- const addNode = (
51
- nodes: Tree,
52
- newNode: TreeNode,
53
- parentId?: TreeNodeId
54
- ): Tree => {
46
+ const addNode = (nodes: Tree, newNode: TreeNode, parentId?: TreeNodeId): Tree => {
55
47
  if (!parentId) {
56
48
  return [...nodes, newNode];
57
49
  }
@@ -65,10 +57,7 @@ const addNode = (
65
57
  });
66
58
  };
67
59
 
68
- const treeIndentationRepresentation = (
69
- index: number,
70
- indentLevel: number
71
- ): string => {
60
+ const treeIndentationRepresentation = (index: number, indentLevel: number): string => {
72
61
  if (indentLevel === 0) {
73
62
  return (index + 1).toString();
74
63
  } else if (indentLevel === 1) {
@@ -105,12 +94,9 @@ const printNode = (node: TreeNode, prefix = "", indentLevel = 0): string => {
105
94
  (child, index) =>
106
95
  (output += printNode(
107
96
  child,
108
- `${childPrePrefix}${treeIndentationRepresentation(
109
- index,
110
- indentLevel + 1
111
- )}. `,
112
- indentLevel + 1
113
- ))
97
+ `${childPrePrefix}${treeIndentationRepresentation(index, indentLevel + 1)}. `,
98
+ indentLevel + 1,
99
+ )),
114
100
  );
115
101
  return output;
116
102
  };
@@ -168,7 +154,7 @@ const useTree = (): UseTreeReturn => {
168
154
  });
169
155
  return newNodeId; // Return the new ID
170
156
  },
171
- []
157
+ [],
172
158
  );
173
159
 
174
160
  const removeElement = useCallback((id: TreeNodeId): void => {
@@ -191,14 +177,11 @@ const useTree = (): UseTreeReturn => {
191
177
  output += "\n";
192
178
  }
193
179
 
194
- output += printNode(
195
- node,
196
- `${treeIndentationRepresentation(index, 0)}. `
197
- );
180
+ output += printNode(node, `${treeIndentationRepresentation(index, 0)}. `);
198
181
  });
199
182
  return output;
200
183
  },
201
- [tree]
184
+ [tree],
202
185
  );
203
186
 
204
187
  return { tree, addElement, printTree, removeElement };
@@ -207,8 +190,7 @@ const useTree = (): UseTreeReturn => {
207
190
  export default useTree;
208
191
 
209
192
  function setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {
210
- const [smallerSet, largerSet] =
211
- setA.size <= setB.size ? [setA, setB] : [setB, setA];
193
+ const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];
212
194
 
213
195
  for (let item of smallerSet) {
214
196
  if (largerSet.has(item)) {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-tree.ts"],"names":[],"mappings":"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","sourcesContent":["import { nanoid } from \"nanoid\";\nimport { useCallback, useReducer } from \"react\";\n\nexport type TreeNodeId = string;\n\nexport interface TreeNode {\n id: TreeNodeId;\n value: string;\n children: TreeNode[];\n parentId?: TreeNodeId;\n categories: Set<string>;\n}\n\nexport type Tree = TreeNode[];\n\nexport interface UseTreeReturn {\n tree: Tree;\n addElement: (\n value: string,\n categories: string[],\n parentId?: TreeNodeId\n ) => TreeNodeId;\n printTree: (categories: string[]) => string;\n removeElement: (id: TreeNodeId) => void;\n}\n\nconst findNode = (nodes: Tree, id: TreeNodeId): TreeNode | undefined => {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n const result = findNode(node.children, id);\n if (result) {\n return result;\n }\n }\n return undefined;\n};\n\nconst removeNode = (nodes: Tree, id: TreeNodeId): Tree => {\n return nodes.reduce((result: Tree, node) => {\n if (node.id !== id) {\n const newNode = { ...node, children: removeNode(node.children, id) };\n result.push(newNode);\n }\n return result;\n }, []);\n};\n\nconst addNode = (\n nodes: Tree,\n newNode: TreeNode,\n parentId?: TreeNodeId\n): Tree => {\n if (!parentId) {\n return [...nodes, newNode];\n }\n return nodes.map((node) => {\n if (node.id === parentId) {\n return { ...node, children: [...node.children, newNode] };\n } else if (node.children.length) {\n return { ...node, children: addNode(node.children, newNode, parentId) };\n }\n return node;\n });\n};\n\nconst treeIndentationRepresentation = (\n index: number,\n indentLevel: number\n): string => {\n if (indentLevel === 0) {\n return (index + 1).toString();\n } else if (indentLevel === 1) {\n return String.fromCharCode(65 + index); // 65 is the ASCII value for 'A'\n } else if (indentLevel === 2) {\n return String.fromCharCode(97 + index); // 97 is the ASCII value for 'a'\n } else {\n return \"-\";\n }\n};\n\nconst printNode = (node: TreeNode, prefix = \"\", indentLevel = 0): string => {\n const indent = \" \".repeat(3).repeat(indentLevel);\n\n const prefixPlusIndentLength = prefix.length + indent.length;\n const subsequentLinesPrefix = \" \".repeat(prefixPlusIndentLength);\n\n const valueLines = node.value.split(\"\\n\");\n\n const outputFirstLine = `${indent}${prefix}${valueLines[0]}`;\n const outputSubsequentLines = valueLines\n .slice(1)\n .map((line) => `${subsequentLinesPrefix}${line}`)\n .join(\"\\n\");\n\n let output = `${outputFirstLine}\\n`;\n if (outputSubsequentLines) {\n output += `${outputSubsequentLines}\\n`;\n }\n\n const childPrePrefix = \" \".repeat(prefix.length);\n\n node.children.forEach(\n (child, index) =>\n (output += printNode(\n child,\n `${childPrePrefix}${treeIndentationRepresentation(\n index,\n indentLevel + 1\n )}. `,\n indentLevel + 1\n ))\n );\n return output;\n};\n\n// Action types\ntype Action =\n | {\n type: \"ADD_NODE\";\n value: string;\n parentId?: string;\n id: string;\n categories: string[];\n }\n | { type: \"REMOVE_NODE\"; id: string };\n\n// Reducer function\nfunction treeReducer(state: Tree, action: Action): Tree {\n switch (action.type) {\n case \"ADD_NODE\": {\n const { value, parentId, id: newNodeId } = action;\n const newNode: TreeNode = {\n id: newNodeId,\n value,\n children: [],\n categories: new Set(action.categories),\n };\n\n try {\n return addNode(state, newNode, parentId);\n } catch (error) {\n console.error(`Error while adding node with id ${newNodeId}: ${error}`);\n return state;\n }\n }\n case \"REMOVE_NODE\":\n return removeNode(state, action.id);\n default:\n return state;\n }\n}\n\n// useTree hook\nconst useTree = (): UseTreeReturn => {\n const [tree, dispatch] = useReducer(treeReducer, []);\n\n const addElement = useCallback(\n (value: string, categories: string[], parentId?: string): TreeNodeId => {\n const newNodeId = nanoid(); // Generate new ID outside of dispatch\n dispatch({\n type: \"ADD_NODE\",\n value,\n parentId,\n id: newNodeId,\n categories: categories,\n });\n return newNodeId; // Return the new ID\n },\n []\n );\n\n const removeElement = useCallback((id: TreeNodeId): void => {\n dispatch({ type: \"REMOVE_NODE\", id });\n }, []);\n\n const printTree = useCallback(\n (categories: string[]): string => {\n const categoriesSet = new Set(categories);\n\n let output = \"\";\n tree.forEach((node, index) => {\n // if the node does not have any of the desired categories, continue to the next node\n if (!setsHaveIntersection(categoriesSet, node.categories)) {\n return;\n }\n\n // add a new line before each node except the first one\n if (index !== 0) {\n output += \"\\n\";\n }\n\n output += printNode(\n node,\n `${treeIndentationRepresentation(index, 0)}. `\n );\n });\n return output;\n },\n [tree]\n );\n\n return { tree, addElement, printTree, removeElement };\n};\n\nexport default useTree;\n\nfunction setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {\n const [smallerSet, largerSet] =\n setA.size <= setB.size ? [setA, setB] : [setB, setA];\n\n for (let item of smallerSet) {\n if (largerSet.has(item)) {\n return true;\n }\n }\n\n return false;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-flat-category-store.ts"],"names":[],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,aAAa,kBAAkB;AAgBxC,IAAM,uBAAuB,MAAwC;AACnE,QAAM,CAAC,UAAU,QAAQ,IAAI;AAAA,IAM3B;AAAA,IACA,oBAAI,IAAsD;AAAA,EAC5D;AAEA,QAAM,aAAa;AAAA,IACjB,CAAC,OAAU,eAA8C;AACvD,YAAM,QAAQ,OAAO;AACrB,eAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,YAAY,CAAC,OAAkC;AACnE,aAAS,EAAE,MAAM,kBAAkB,GAAG,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc;AAAA,IAClB,CAAC,eAA8B;AAC7B,YAAM,gBAAgB,IAAI,IAAI,UAAU;AACxC,YAAM,SAAc,CAAC;AACrB,eAAS,QAAQ,CAAC,YAAY;AAC5B,YAAI,qBAAqB,eAAe,QAAQ,UAAU,GAAG;AAC3D,iBAAO,KAAK,QAAQ,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SAAO,EAAE,YAAY,eAAe,YAAY;AAClD;AAEA,IAAO,kCAAQ;AAaf,SAAS,yBACP,OACA,QACuD;AACvD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,eAAe;AAClB,YAAM,EAAE,OAAO,IAAI,WAAW,IAAI;AAClC,YAAM,aAA0C;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,YAAY,IAAI,IAAI,UAAU;AAAA,MAChC;AACA,YAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,eAAS,IAAI,IAAI,UAAU;AAC3B,aAAO;AAAA,IACT;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,eAAS,OAAO,OAAO,EAAE;AACzB,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAwB,MAAc,MAAuB;AACpE,QAAM,CAAC,YAAY,SAAS,IAC1B,KAAK,QAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI;AAErD,WAAS,QAAQ,YAAY;AAC3B,QAAI,UAAU,IAAI,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT","sourcesContent":["import { nanoid } from \"nanoid\";\nimport { useCallback, useReducer } from \"react\";\n\nexport type FlatCategoryStoreId = string;\n\nexport interface UseFlatCategoryStoreReturn<T> {\n addElement: (value: T, categories: string[]) => FlatCategoryStoreId;\n removeElement: (id: FlatCategoryStoreId) => void;\n allElements: (categories: string[]) => T[];\n}\n\ninterface FlatCategoryStoreElement<T> {\n id: FlatCategoryStoreId;\n value: T;\n categories: Set<string>;\n}\n\nconst useFlatCategoryStore = <T>(): UseFlatCategoryStoreReturn<T> => {\n const [elements, dispatch] = useReducer<\n React.Reducer<\n Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>,\n Action<T>\n >\n >(\n flatCategoryStoreReducer,\n new Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>()\n );\n\n const addElement = useCallback(\n (value: T, categories: string[]): FlatCategoryStoreId => {\n const newId = nanoid();\n dispatch({\n type: \"ADD_ELEMENT\",\n value,\n id: newId,\n categories,\n });\n return newId;\n },\n []\n );\n\n const removeElement = useCallback((id: FlatCategoryStoreId): void => {\n dispatch({ type: \"REMOVE_ELEMENT\", id });\n }, []);\n\n const allElements = useCallback(\n (categories: string[]): T[] => {\n const categoriesSet = new Set(categories);\n const result: T[] = [];\n elements.forEach((element) => {\n if (setsHaveIntersection(categoriesSet, element.categories)) {\n result.push(element.value);\n }\n });\n return result;\n },\n [elements]\n );\n\n return { addElement, removeElement, allElements };\n};\n\nexport default useFlatCategoryStore;\n\n// Action types\ntype Action<T> =\n | {\n type: \"ADD_ELEMENT\";\n value: T;\n id: FlatCategoryStoreId;\n categories: string[];\n }\n | { type: \"REMOVE_ELEMENT\"; id: FlatCategoryStoreId };\n\n// Reducer\nfunction flatCategoryStoreReducer<T>(\n state: Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>>,\n action: Action<T>\n): Map<FlatCategoryStoreId, FlatCategoryStoreElement<T>> {\n switch (action.type) {\n case \"ADD_ELEMENT\": {\n const { value, id, categories } = action;\n const newElement: FlatCategoryStoreElement<T> = {\n id,\n value,\n categories: new Set(categories),\n };\n const newState = new Map(state);\n newState.set(id, newElement);\n return newState;\n }\n case \"REMOVE_ELEMENT\": {\n const newState = new Map(state);\n newState.delete(action.id);\n return newState;\n }\n default:\n return state;\n }\n}\n\nfunction setsHaveIntersection<T>(setA: Set<T>, setB: Set<T>): boolean {\n const [smallerSet, largerSet] =\n setA.size <= setB.size ? [setA, setB] : [setB, setA];\n\n for (let item of smallerSet) {\n if (largerSet.has(item)) {\n return true;\n }\n }\n\n return false;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-make-copilot-document-readable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,YAAY,WAAW,cAAc;AAF9C;AAaO,SAAS,+BACd,UACA,YACA,eAAsB,CAAC,GACH;AACpB,QAAM,EAAE,oBAAoB,sBAAsB,IAChD,WAAW,cAAc;AAC3B,QAAM,QAAQ,OAAe;AAE7B,YAAU,MAAM;AACd,UAAM,KAAK,mBAAmB,UAAU,UAAU;AAClD,UAAM,UAAU;AAEhB,WAAO,MAAM;AACX,4BAAsB,EAAE;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,oBAAoB,uBAAuB,GAAG,YAAY,CAAC;AAE/D,SAAO,MAAM;AACf","sourcesContent":["\"use client\";\n\nimport { useContext, useEffect, useRef } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Makes a document readable by Copilot.\n * @param document The document to make readable.\n * @param categories The categories to associate with the document.\n * @param dependencies The dependencies to use for the effect.\n * @returns The id of the document.\n */\nexport function useMakeCopilotDocumentReadable(\n document: DocumentPointer,\n categories?: string[],\n dependencies: any[] = []\n): string | undefined {\n const { addDocumentContext, removeDocumentContext } =\n useContext(CopilotContext);\n const idRef = useRef<string>();\n\n useEffect(() => {\n const id = addDocumentContext(document, categories);\n idRef.current = id;\n\n return () => {\n removeDocumentContext(id);\n };\n }, [addDocumentContext, removeDocumentContext, ...dependencies]);\n\n return idRef.current;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/copilot-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { FunctionCallHandler } from \"ai\";\nimport { ReactNode, useCallback, useState } from \"react\";\nimport { CopilotContext, CopilotApiConfig } from \"../context/copilot-context\";\nimport useTree from \"../hooks/use-tree\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { ChatCompletionCreateParams } from \"openai/resources/chat\";\nimport { DocumentPointer } from \"../types\";\nimport useFlatCategoryStore from \"../hooks/use-flat-category-store\";\n\nexport function CopilotProvider({\n chatApiEndpoint,\n headers,\n body,\n children,\n}: {\n chatApiEndpoint: string;\n headers?: Record<string, string>;\n body?: Record<string, any>;\n children: ReactNode;\n}): JSX.Element {\n const [entryPoints, setEntryPoints] = useState<\n Record<string, AnnotatedFunction<any[]>>\n >({});\n\n const { addElement, removeElement, printTree } = useTree();\n const {\n addElement: addDocument,\n removeElement: removeDocument,\n allElements: allDocuments,\n } = useFlatCategoryStore<DocumentPointer>();\n\n const setEntryPoint = useCallback(\n (id: string, entryPoint: AnnotatedFunction<any[]>) => {\n setEntryPoints((prevPoints) => {\n return {\n ...prevPoints,\n [id]: entryPoint,\n };\n });\n },\n []\n );\n\n const removeEntryPoint = useCallback((id: string) => {\n setEntryPoints((prevPoints) => {\n const newPoints = { ...prevPoints };\n delete newPoints[id];\n return newPoints;\n });\n }, []);\n\n const getContextString = useCallback(\n (documents: DocumentPointer[], categories: string[]) => {\n const documentsString = documents\n .map((document) => {\n return `${document.name} (${\n document.sourceApplication\n }):\\n${document.getContents()}`;\n })\n .join(\"\\n\\n\");\n\n const nonDocumentStrings = printTree(categories);\n\n return `${documentsString}\\n\\n${nonDocumentStrings}`;\n },\n [printTree]\n );\n\n const addContext = useCallback(\n (\n context: string,\n parentId?: string,\n categories: string[] = defaultCopilotContextCategories\n ) => {\n return addElement(context, categories, parentId);\n },\n [addElement]\n );\n\n const removeContext = useCallback(\n (id: string) => {\n removeElement(id);\n },\n [removeElement]\n );\n\n const getChatCompletionFunctionDescriptions = useCallback(() => {\n return entryPointsToChatCompletionFunctions(Object.values(entryPoints));\n }, [entryPoints]);\n\n const getFunctionCallHandler = useCallback(() => {\n return entryPointsToFunctionCallHandler(Object.values(entryPoints));\n }, [entryPoints]);\n\n const getDocumentsContext = useCallback(\n (categories: string[]) => {\n return allDocuments(categories);\n },\n [allDocuments]\n );\n\n const addDocumentContext = useCallback(\n (\n documentPointer: DocumentPointer,\n categories: string[] = defaultCopilotContextCategories\n ) => {\n return addDocument(documentPointer, categories);\n },\n [addDocument]\n );\n\n const removeDocumentContext = useCallback(\n (documentId: string) => {\n removeDocument(documentId);\n },\n [removeDocument]\n );\n\n return (\n <CopilotContext.Provider\n value={{\n entryPoints,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n setEntryPoint,\n removeEntryPoint,\n getContextString,\n addContext,\n removeContext,\n getDocumentsContext,\n addDocumentContext,\n removeDocumentContext,\n copilotApiConfig: {\n chatApiEndpoint,\n headers: headers || {},\n body: body || {},\n },\n }}\n >\n {children}\n </CopilotContext.Provider>\n );\n}\n\nexport const defaultCopilotContextCategories = [\"global\"];\n\nfunction entryPointsToFunctionCallHandler(\n entryPoints: AnnotatedFunction<any[]>[]\n): FunctionCallHandler {\n return async (chatMessages, functionCall) => {\n let entrypointsByFunctionName: Record<\n string,\n AnnotatedFunction<any[]>\n > = {};\n for (let entryPoint of entryPoints) {\n entrypointsByFunctionName[entryPoint.name] = entryPoint;\n }\n\n const entryPointFunction =\n entrypointsByFunctionName[functionCall.name || \"\"];\n if (entryPointFunction) {\n let parsedFunctionCallArguments: Record<string, any>[] = [];\n if (functionCall.arguments) {\n parsedFunctionCallArguments = JSON.parse(functionCall.arguments);\n }\n\n const paramsInCorrectOrder: any[] = [];\n for (let arg of entryPointFunction.argumentAnnotations) {\n paramsInCorrectOrder.push(\n parsedFunctionCallArguments[\n arg.name as keyof typeof parsedFunctionCallArguments\n ]\n );\n }\n\n await entryPointFunction.implementation(...paramsInCorrectOrder);\n\n // commented out becasue for now we don't want to return anything\n // const result = await entryPointFunction.implementation(\n // ...parsedFunctionCallArguments\n // );\n // const functionResponse: ChatRequest = {\n // messages: [\n // ...chatMessages,\n // {\n // id: nanoid(),\n // name: functionCall.name,\n // role: 'function' as const,\n // content: JSON.stringify(result),\n // },\n // ],\n // };\n\n // return functionResponse;\n }\n };\n}\n\nfunction entryPointsToChatCompletionFunctions(\n entryPoints: AnnotatedFunction<any[]>[]\n): ChatCompletionCreateParams.Function[] {\n return entryPoints.map(annotatedFunctionToChatCompletionFunction);\n}\n\nfunction annotatedFunctionToChatCompletionFunction(\n annotatedFunction: AnnotatedFunction<any[]>\n): ChatCompletionCreateParams.Function {\n // Create the parameters object based on the argumentAnnotations\n let parameters: { [key: string]: any } = {};\n for (let arg of annotatedFunction.argumentAnnotations) {\n // isolate the args we should forward inline\n let { name, required, ...forwardedArgs } = arg;\n parameters[arg.name] = forwardedArgs;\n }\n\n let requiredParameterNames: string[] = [];\n for (let arg of annotatedFunction.argumentAnnotations) {\n if (arg.required) {\n requiredParameterNames.push(arg.name);\n }\n }\n\n // Create the ChatCompletionFunctions object\n let chatCompletionFunction: ChatCompletionCreateParams.Function = {\n name: annotatedFunction.name,\n description: annotatedFunction.description,\n parameters: {\n type: \"object\",\n properties: parameters,\n required: requiredParameterNames,\n },\n };\n\n return chatCompletionFunction;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-make-copilot-actionable.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,QAAQ,YAAY,WAAW,eAAe;AAGvD,SAAS,cAAc;AALvB;AAOO,SAAS,yBACd,mBACA,cACA;AACA,QAAM,QAAQ,OAAO,OAAO,CAAC;AAC7B,QAAM,EAAE,eAAe,iBAAiB,IAAI,WAAW,cAAc;AAErE,QAAM,4BAA4D;AAAA,IAChE,OAAO;AAAA,MACL,MAAM,kBAAkB;AAAA,MACxB,aAAa,kBAAkB;AAAA,MAC/B,qBAAqB,kBAAkB;AAAA,MACvC,gBAAgB,kBAAkB;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AAEA,YAAU,MAAM;AACd;AAAA,MACE,MAAM;AAAA,MACN;AAAA,IACF;AAEA,WAAO,MAAM;AACX,uBAAiB,MAAM,OAAO;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,2BAA2B,eAAe,gBAAgB,CAAC;AACjE","sourcesContent":["\"use client\";\n\nimport { useRef, useContext, useEffect, useMemo } from \"react\";\nimport { CopilotContext } from \"../context/copilot-context\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { nanoid } from \"nanoid\";\n\nexport function useMakeCopilotActionable<ActionInput extends any[]>(\n annotatedFunction: AnnotatedFunction<ActionInput>,\n dependencies: any[]\n) {\n const idRef = useRef(nanoid()); // generate a unique id\n const { setEntryPoint, removeEntryPoint } = useContext(CopilotContext);\n\n const memoizedAnnotatedFunction: AnnotatedFunction<ActionInput> = useMemo(\n () => ({\n name: annotatedFunction.name,\n description: annotatedFunction.description,\n argumentAnnotations: annotatedFunction.argumentAnnotations,\n implementation: annotatedFunction.implementation,\n }),\n dependencies\n );\n\n useEffect(() => {\n setEntryPoint(\n idRef.current,\n memoizedAnnotatedFunction as AnnotatedFunction<any[]>\n );\n\n return () => {\n removeEntryPoint(idRef.current);\n };\n }, [memoizedAnnotatedFunction, setEntryPoint, removeEntryPoint]);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-copilot-chat.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS,kBAAkB;AAMpC,SAAS,eAAe;AAwBjB,SAAS,eAAe,IAGiB;AAHjB,eAC7B;AAAA;AAAA,EA/BF,IA8B+B,IAE1B,oBAF0B,IAE1B;AAAA,IADH;AAAA;AAGA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,cAAc;AAE7B,QAAM,gBAAyB,QAAQ,MAAM;AAC3C,UAAM,qBAAqB,qBAAqB;AAChD,UAAM,gBAAgB,iBAAiB,CAAC,GAAG,+BAA+B;AAE1E,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,SAAS,mBAAmB,aAAa;AAAA,MACzC,MAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,kBAAkB,iBAAiB,CAAC;AAExC,QAAM,6BAA6B,CAAC,aAAa,EAAE;AAAA,IACjD,QAAQ,mBAAmB,CAAC;AAAA,EAC9B;AAEA,QAAM,uBAAuB,QAAQ,MAAM;AACzC,WAAO,sCAAsC;AAAA,EAC/C,GAAG,CAAC,qCAAqC,CAAC;AAE1C,QAAM,EAAE,UAAU,QAAQ,QAAQ,MAAM,WAAW,OAAO,SAAS,IACjE,QAAQ,iCACH,UADG;AAAA,IAEN,KAAK,6BAA6B,gBAAgB,EAAE;AAAA,IACpD,IAAI,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB,6BAA6B,uBAAuB;AAAA,IACpD,SAAS,kCAAK,iBAAiB,UAAY,QAAQ;AAAA,IACnD,MAAM;AAAA,MACJ,IAAI,QAAQ;AAAA,MACZ,WAAW;AAAA,OACR,iBAAiB,OACjB,QAAQ;AAAA,EAEf,EAAC;AAEH,QAAM,kBAAkB,SAAS;AAAA,IAC/B,CAAC,YAAY,QAAQ,SAAS,UAAU,QAAQ,SAAS;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,eAA+B;AAClE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF","sourcesContent":["import { useMemo, useContext } from \"react\";\nimport {\n CopilotContext,\n CopilotContextParams,\n copilotApiConfigExtrapolator,\n} from \"../context/copilot-context\";\nimport { useChat } from \"ai/react\";\nimport { ChatRequestOptions, CreateMessage, Message } from \"ai\";\nimport { UseChatOptions } from \"ai\";\nimport { defaultCopilotContextCategories } from \"../components\";\n\nexport interface UseCopilotChatOptions extends UseChatOptions {\n makeSystemMessage?: (contextString: string) => string;\n}\n\nexport interface UseCopilotChatReturn {\n visibleMessages: Message[];\n append: (\n message: Message | CreateMessage,\n chatRequestOptions?: ChatRequestOptions\n ) => Promise<string | null | undefined>;\n reload: (\n chatRequestOptions?: ChatRequestOptions\n ) => Promise<string | null | undefined>;\n stop: () => void;\n isLoading: boolean;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function useCopilotChat({\n makeSystemMessage,\n ...options\n}: UseCopilotChatOptions): UseCopilotChatReturn {\n const {\n getContextString,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n copilotApiConfig,\n } = useContext(CopilotContext);\n\n const systemMessage: Message = useMemo(() => {\n const systemMessageMaker = makeSystemMessage || defaultSystemMessage;\n const contextString = getContextString([], defaultCopilotContextCategories); // TODO: make the context categories configurable\n\n return {\n id: \"system\",\n content: systemMessageMaker(contextString),\n role: \"system\",\n };\n }, [getContextString, makeSystemMessage]);\n\n const initialMessagesWithContext = [systemMessage].concat(\n options.initialMessages || []\n );\n\n const functionDescriptions = useMemo(() => {\n return getChatCompletionFunctionDescriptions();\n }, [getChatCompletionFunctionDescriptions]);\n\n const { messages, append, reload, stop, isLoading, input, setInput } =\n useChat({\n ...options,\n api: copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,\n id: options.id,\n initialMessages: initialMessagesWithContext,\n experimental_onFunctionCall: getFunctionCallHandler(),\n headers: { ...copilotApiConfig.headers, ...options.headers },\n body: {\n id: options.id,\n functions: functionDescriptions,\n ...copilotApiConfig.body,\n ...options.body,\n },\n });\n\n const visibleMessages = messages.filter(\n (message) => message.role === \"user\" || message.role === \"assistant\"\n );\n\n return {\n visibleMessages,\n append,\n reload,\n stop,\n isLoading,\n input,\n setInput,\n };\n}\n\nexport function defaultSystemMessage(contextString: string): string {\n return `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou can ask them for clarifying questions if needed, but don't be annoying about it. If you can reasonably 'fill in the blanks' yourself, do so.\n\nIf you would like to call a function, call it without saying anything else.\n`;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/context/copilot-context.tsx"],"names":[],"mappings":";;;;;AAGA,OAAO,WAAW;AAHlB;AA2CO,SAAS,6BAA6B,QAA0B;AACrE,SAAO;AAAA,IACL,IAAI,kBAA0B;AAC5B,aAAO,GAAG,OAAO;AAAA,IACnB;AAAA,EACF;AACF;AAkCA,IAAM,sBAA4C;AAAA,EAChD,aAAa,CAAC;AAAA,EACd,eAAe,MAAM;AAAA,EAAC;AAAA,EACtB,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,uCAAuC,MAAM,sBAAsB,CAAC,CAAC;AAAA,EACrE,wBAAwB,MAAM,sBAAsB,MAAY;AAAA,EAAC,EAAC;AAAA,EAElE,kBAAkB,CAAC,WAA8B,eAC/C,sBAAsB,EAAE;AAAA,EAC1B,YAAY,MAAM;AAAA,EAClB,eAAe,MAAM;AAAA,EAAC;AAAA,EAEtB,qBAAqB,CAAC,eAAyB,sBAAsB,CAAC,CAAC;AAAA,EACvE,oBAAoB,MAAM,sBAAsB,EAAE;AAAA,EAClD,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAE9B,kBAAkB,IAAK,MAAkC;AAAA,IACvD,IAAI,kBAA0B;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,UAAkC;AACpC,aAAO,CAAC;AAAA,IACV;AAAA,IACA,IAAI,OAA4B;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,EACF,EAAG;AACL;AAEO,IAAM,iBACX,MAAM,cAAoC,mBAAmB;AAE/D,SAAS,sBAAyB,OAAa;AAC7C,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT","sourcesContent":["\"use client\";\n\nimport { FunctionCallHandler } from \"ai\";\nimport React from \"react\";\nimport { TreeNodeId } from \"../hooks/use-tree\";\nimport { AnnotatedFunction } from \"../types/annotated-function\";\nimport { ChatCompletionCreateParams } from \"openai/resources/chat\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Additional body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'message': 'Hello, world!'\n * }\n * ```\n */\n body: Record<string, any>;\n}\n\nexport function copilotApiConfigExtrapolator(config: CopilotApiConfig) {\n return {\n get chatApiEndpoint(): string {\n return `${config.chatApiEndpoint}`;\n },\n };\n}\n\nexport interface CopilotContextParams {\n // function-calling\n entryPoints: Record<string, AnnotatedFunction<any[]>>;\n setEntryPoint: (id: string, entryPoint: AnnotatedFunction<any[]>) => void;\n removeEntryPoint: (id: string) => void;\n getChatCompletionFunctionDescriptions: () => ChatCompletionCreateParams.Function[];\n getFunctionCallHandler: () => FunctionCallHandler;\n\n // text context\n getContextString: (\n documents: DocumentPointer[],\n categories: string[]\n ) => string;\n addContext: (\n context: string,\n parentId?: string,\n categories?: string[]\n ) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n\n // document context\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n addDocumentContext: (\n documentPointer: DocumentPointer,\n categories?: string[]\n ) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n entryPoints: {},\n setEntryPoint: () => {},\n removeEntryPoint: () => {},\n getChatCompletionFunctionDescriptions: () => returnAndThrowInDebug([]),\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\n \"Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!\"\n );\n }\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n};\n\nexport const CopilotContext =\n React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nfunction returnAndThrowInDebug<T>(value: T): T {\n throw new Error(\n \"Remember to wrap your app in a `<CopilotProvider> {...} </CopilotProvider>` !!!\"\n );\n return value;\n}\n"]}