@copilotkit/react-core 0.17.0-alpha.4 → 0.17.0-alpha.5

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 (119) hide show
  1. package/.turbo/turbo-build.log +101 -105
  2. package/CHANGELOG.md +6 -0
  3. package/dist/components/copilot-provider/copilot-provider-props.mjs +1 -2
  4. package/dist/components/copilot-provider/copilot-provider-props.mjs.map +1 -1
  5. package/dist/components/copilot-provider/copilot-provider.mjs +468 -7
  6. package/dist/components/copilot-provider/copilot-provider.mjs.map +1 -1
  7. package/dist/components/copilot-provider/index.mjs +467 -8
  8. package/dist/components/copilot-provider/index.mjs.map +1 -1
  9. package/dist/components/copilot-provider/standard-copilot-api-config.mjs +12 -3
  10. package/dist/components/copilot-provider/standard-copilot-api-config.mjs.map +1 -1
  11. package/dist/components/index.mjs +467 -9
  12. package/dist/components/index.mjs.map +1 -1
  13. package/dist/context/copilot-context.mjs +70 -3
  14. package/dist/context/copilot-context.mjs.map +1 -1
  15. package/dist/context/index.mjs +69 -4
  16. package/dist/context/index.mjs.map +1 -1
  17. package/dist/hooks/index.mjs +646 -17
  18. package/dist/hooks/index.mjs.map +1 -1
  19. package/dist/hooks/use-chat.mjs +452 -5
  20. package/dist/hooks/use-chat.mjs.map +1 -1
  21. package/dist/hooks/use-copilot-chat.mjs +591 -13
  22. package/dist/hooks/use-copilot-chat.mjs.map +1 -1
  23. package/dist/hooks/use-flat-category-store.mjs +68 -3
  24. package/dist/hooks/use-flat-category-store.mjs.map +1 -1
  25. package/dist/hooks/use-make-copilot-actionable.mjs +95 -4
  26. package/dist/hooks/use-make-copilot-actionable.mjs.map +1 -1
  27. package/dist/hooks/use-make-copilot-document-readable.mjs +87 -4
  28. package/dist/hooks/use-make-copilot-document-readable.mjs.map +1 -1
  29. package/dist/hooks/use-make-copilot-readable.mjs +87 -4
  30. package/dist/hooks/use-make-copilot-readable.mjs.map +1 -1
  31. package/dist/hooks/use-tree.mjs +153 -3
  32. package/dist/hooks/use-tree.mjs.map +1 -1
  33. package/dist/index.mjs +1194 -26
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/openai/chat-completion-client.mjs +353 -4
  36. package/dist/openai/chat-completion-client.mjs.map +1 -1
  37. package/dist/openai/chat-completion-stream.mjs +217 -4
  38. package/dist/openai/chat-completion-stream.mjs.map +1 -1
  39. package/dist/openai/chat-completion-transport.mjs +179 -3
  40. package/dist/openai/chat-completion-transport.mjs.map +1 -1
  41. package/dist/openai/index.mjs +217 -5
  42. package/dist/openai/index.mjs.map +1 -1
  43. package/dist/openai-assistants/hooks/index.mjs +235 -14
  44. package/dist/openai-assistants/hooks/index.mjs.map +1 -1
  45. package/dist/openai-assistants/hooks/use-assistants.mjs +52 -8
  46. package/dist/openai-assistants/hooks/use-assistants.mjs.map +1 -1
  47. package/dist/openai-assistants/hooks/use-copilot-chat-v2.mjs +236 -13
  48. package/dist/openai-assistants/hooks/use-copilot-chat-v2.mjs.map +1 -1
  49. package/dist/openai-assistants/index.mjs +236 -15
  50. package/dist/openai-assistants/index.mjs.map +1 -1
  51. package/dist/openai-assistants/utils/index.mjs +46 -4
  52. package/dist/openai-assistants/utils/index.mjs.map +1 -1
  53. package/dist/openai-assistants/utils/process-message-stream.mjs +46 -3
  54. package/dist/openai-assistants/utils/process-message-stream.mjs.map +1 -1
  55. package/dist/types/annotated-function.mjs +0 -2
  56. package/dist/types/annotated-function.mjs.map +1 -1
  57. package/dist/types/base.mjs +0 -2
  58. package/dist/types/base.mjs.map +1 -1
  59. package/dist/types/document-pointer.mjs +0 -2
  60. package/dist/types/document-pointer.mjs.map +1 -1
  61. package/dist/types/index.mjs +0 -2
  62. package/dist/types/index.mjs.map +1 -1
  63. package/dist/types/message.mjs +0 -2
  64. package/dist/types/message.mjs.map +1 -1
  65. package/dist/utils/utils.mjs +0 -2
  66. package/dist/utils/utils.mjs.map +1 -1
  67. package/dist/utils/utils.test.mjs +0 -1
  68. package/dist/utils/utils.test.mjs.map +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-56GURLWX.mjs +0 -165
  71. package/dist/chunk-56GURLWX.mjs.map +0 -1
  72. package/dist/chunk-5UGLWBZJ.mjs +0 -3
  73. package/dist/chunk-5UGLWBZJ.mjs.map +0 -1
  74. package/dist/chunk-6A4PCNMZ.mjs +0 -48
  75. package/dist/chunk-6A4PCNMZ.mjs.map +0 -1
  76. package/dist/chunk-6SOQYBNX.mjs +0 -44
  77. package/dist/chunk-6SOQYBNX.mjs.map +0 -1
  78. package/dist/chunk-7GFKOIO7.mjs +0 -3
  79. package/dist/chunk-7GFKOIO7.mjs.map +0 -1
  80. package/dist/chunk-7P4OYNP3.mjs +0 -19
  81. package/dist/chunk-7P4OYNP3.mjs.map +0 -1
  82. package/dist/chunk-BABVSMJR.mjs +0 -3
  83. package/dist/chunk-BABVSMJR.mjs.map +0 -1
  84. package/dist/chunk-EFZPSZWO.mjs +0 -3
  85. package/dist/chunk-EFZPSZWO.mjs.map +0 -1
  86. package/dist/chunk-ELXZFAYR.mjs +0 -77
  87. package/dist/chunk-ELXZFAYR.mjs.map +0 -1
  88. package/dist/chunk-F2JIAPZQ.mjs +0 -13
  89. package/dist/chunk-F2JIAPZQ.mjs.map +0 -1
  90. package/dist/chunk-FP4EXCGS.mjs +0 -27
  91. package/dist/chunk-FP4EXCGS.mjs.map +0 -1
  92. package/dist/chunk-FRAKUJWH.mjs +0 -3
  93. package/dist/chunk-FRAKUJWH.mjs.map +0 -1
  94. package/dist/chunk-HW5IH6PV.mjs +0 -19
  95. package/dist/chunk-HW5IH6PV.mjs.map +0 -1
  96. package/dist/chunk-JD7BAH7U.mjs +0 -3
  97. package/dist/chunk-JD7BAH7U.mjs.map +0 -1
  98. package/dist/chunk-LV3MQPZL.mjs +0 -125
  99. package/dist/chunk-LV3MQPZL.mjs.map +0 -1
  100. package/dist/chunk-MRXNTQOX.mjs +0 -55
  101. package/dist/chunk-MRXNTQOX.mjs.map +0 -1
  102. package/dist/chunk-MZ5UN3BY.mjs +0 -28
  103. package/dist/chunk-MZ5UN3BY.mjs.map +0 -1
  104. package/dist/chunk-PUFR5OAI.mjs +0 -3
  105. package/dist/chunk-PUFR5OAI.mjs.map +0 -1
  106. package/dist/chunk-SPCZTZCY.mjs +0 -3
  107. package/dist/chunk-SPCZTZCY.mjs.map +0 -1
  108. package/dist/chunk-TKXPMMND.mjs +0 -177
  109. package/dist/chunk-TKXPMMND.mjs.map +0 -1
  110. package/dist/chunk-VK25FIML.mjs +0 -144
  111. package/dist/chunk-VK25FIML.mjs.map +0 -1
  112. package/dist/chunk-VNRDQJXW.mjs +0 -3
  113. package/dist/chunk-VNRDQJXW.mjs.map +0 -1
  114. package/dist/chunk-VUY2K2DI.mjs +0 -135
  115. package/dist/chunk-VUY2K2DI.mjs.map +0 -1
  116. package/dist/chunk-WMXA2TIX.mjs +0 -102
  117. package/dist/chunk-WMXA2TIX.mjs.map +0 -1
  118. package/dist/chunk-YULKJPY3.mjs +0 -70
  119. package/dist/chunk-YULKJPY3.mjs.map +0 -1
@@ -1,144 +0,0 @@
1
- import { __async, __spreadValues } from './chunk-MRXNTQOX.mjs';
2
- import EventEmitter from 'eventemitter3';
3
-
4
- var DEFAULT_MODEL = "gpt-4-1106-preview";
5
- var ChatCompletionTransport = class extends EventEmitter {
6
- constructor(params) {
7
- super();
8
- this.buffer = new Uint8Array();
9
- this.bodyReader = null;
10
- }
11
- cleanup() {
12
- return __async(this, null, function* () {
13
- if (this.bodyReader) {
14
- try {
15
- yield this.bodyReader.cancel();
16
- } catch (error) {
17
- console.warn("Failed to cancel body reader:", error);
18
- }
19
- }
20
- this.bodyReader = null;
21
- this.buffer = new Uint8Array();
22
- });
23
- }
24
- fetch(_0) {
25
- return __async(this, arguments, function* ({
26
- copilotConfig,
27
- model,
28
- messages,
29
- functions,
30
- temperature,
31
- headers,
32
- body,
33
- signal
34
- }) {
35
- yield this.cleanup();
36
- temperature || (temperature = 0.5);
37
- functions || (functions = []);
38
- model || (model = DEFAULT_MODEL);
39
- const cleanedMessages = messages.map((message) => {
40
- const { content, role, name, function_call } = message;
41
- return { content, role, name, function_call };
42
- });
43
- try {
44
- const response = yield fetch(copilotConfig.chatApiEndpoint, {
45
- method: "POST",
46
- headers: __spreadValues(__spreadValues({
47
- "Content-Type": "application/json"
48
- }, copilotConfig.headers), headers ? __spreadValues({}, headers) : {}),
49
- body: JSON.stringify(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
50
- model,
51
- messages: cleanedMessages,
52
- stream: true
53
- }, functions.length ? { functions } : {}), temperature ? { temperature } : {}), functions.length != 0 ? { function_call: "auto" } : {}), copilotConfig.body), body ? __spreadValues({}, body) : {})),
54
- signal
55
- });
56
- if (!response.ok) {
57
- try {
58
- const errorText = yield response.text();
59
- yield this.cleanup();
60
- const msg = `Error ${response.status}: ${errorText}`;
61
- this.emit("error", new Error(msg));
62
- } catch (_error) {
63
- yield this.cleanup();
64
- const msg = `Error ${response.status}: ${response.statusText}`;
65
- this.emit("error", new Error(msg));
66
- }
67
- return;
68
- }
69
- if (response.body == null) {
70
- yield this.cleanup();
71
- const msg = "Response body is null";
72
- this.emit("error", new Error(msg));
73
- return;
74
- }
75
- this.bodyReader = response.body.getReader();
76
- yield this.streamBody();
77
- } catch (error) {
78
- yield this.cleanup();
79
- this.emit("error", error);
80
- return;
81
- }
82
- });
83
- }
84
- streamBody() {
85
- return __async(this, null, function* () {
86
- while (true) {
87
- try {
88
- const { done, value } = yield this.bodyReader.read();
89
- if (done) {
90
- yield this.cleanup();
91
- this.emit("end");
92
- return;
93
- }
94
- const shouldContinue = yield this.processData(value);
95
- if (!shouldContinue) {
96
- return;
97
- }
98
- } catch (error) {
99
- yield this.cleanup();
100
- this.emit("error", error);
101
- return;
102
- }
103
- }
104
- });
105
- }
106
- processData(data) {
107
- return __async(this, null, function* () {
108
- const newBuffer = new Uint8Array(this.buffer.length + data.length);
109
- newBuffer.set(this.buffer);
110
- newBuffer.set(data, this.buffer.length);
111
- this.buffer = newBuffer;
112
- const dataString = new TextDecoder("utf-8").decode(this.buffer);
113
- let lines = dataString.split("\n").filter((line) => line.trim() !== "");
114
- if (!dataString.endsWith("\n")) {
115
- const lastLine = lines.pop() || "";
116
- const remainingBytes = new TextEncoder().encode(lastLine);
117
- this.buffer = new Uint8Array(remainingBytes);
118
- } else {
119
- this.buffer = new Uint8Array();
120
- }
121
- for (const line of lines) {
122
- const cleanedLine = line.replace(/^data: /, "");
123
- if (cleanedLine === "[DONE]") {
124
- yield this.cleanup();
125
- this.emit("end");
126
- return false;
127
- }
128
- let json;
129
- try {
130
- json = JSON.parse(cleanedLine);
131
- } catch (error) {
132
- console.error("Failed to parse JSON:", error);
133
- continue;
134
- }
135
- this.emit("data", json);
136
- }
137
- return true;
138
- });
139
- }
140
- };
141
-
142
- export { ChatCompletionTransport };
143
- //# sourceMappingURL=out.js.map
144
- //# sourceMappingURL=chunk-VK25FIML.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/openai/chat-completion-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from \"eventemitter3\";\nimport { Message, Function } from \"../types\";\nimport { CopilotApiConfig } from \"../context\";\n\nexport interface ChatCompletionTransportConfiguration {}\n\ninterface ChatCompletionTransportEvents {\n end: void;\n data: any;\n error: any;\n}\n\nexport interface ChatCompletionTransportFetchParams {\n copilotConfig: CopilotApiConfig;\n model?: string;\n messages: Message[];\n functions?: Function[];\n temperature?: number;\n maxTokens?: number;\n headers?: Record<string, string> | Headers;\n body?: object;\n signal?: AbortSignal;\n}\n\nconst DEFAULT_MODEL = \"gpt-4-1106-preview\";\n\nexport class ChatCompletionTransport extends EventEmitter<ChatCompletionTransportEvents> {\n private buffer = new Uint8Array();\n private bodyReader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n constructor(params: ChatCompletionTransportConfiguration) {\n super();\n }\n\n private async cleanup() {\n if (this.bodyReader) {\n try {\n await this.bodyReader.cancel();\n } catch (error) {\n console.warn(\"Failed to cancel body reader:\", error);\n }\n }\n this.bodyReader = null;\n this.buffer = new Uint8Array();\n }\n\n public async fetch({\n copilotConfig,\n model,\n messages,\n functions,\n temperature,\n headers,\n body,\n signal,\n }: ChatCompletionTransportFetchParams): Promise<void> {\n await this.cleanup();\n\n temperature ||= 0.5;\n functions ||= [];\n model ||= DEFAULT_MODEL;\n\n // clean up any extra properties from messages\n const cleanedMessages = messages.map((message) => {\n const { content, role, name, function_call } = message;\n return { content, role, name, function_call };\n });\n\n try {\n const response = await fetch(copilotConfig.chatApiEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...copilotConfig.headers,\n ...(headers ? { ...headers } : {}),\n },\n body: JSON.stringify({\n model,\n messages: cleanedMessages,\n stream: true,\n ...(functions.length ? { functions } : {}),\n ...(temperature ? { temperature } : {}),\n ...(functions.length != 0 ? { function_call: \"auto\" } : {}),\n ...copilotConfig.body,\n ...(body ? { ...body } : {}),\n }),\n signal,\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.text();\n await this.cleanup();\n const msg = `Error ${response.status}: ${errorText}`;\n this.emit(\"error\", new Error(msg));\n } catch (_error) {\n await this.cleanup();\n const msg = `Error ${response.status}: ${response.statusText}`;\n this.emit(\"error\", new Error(msg));\n }\n return;\n }\n\n if (response.body == null) {\n await this.cleanup();\n const msg = \"Response body is null\";\n this.emit(\"error\", new Error(msg));\n return;\n }\n\n this.bodyReader = response.body.getReader();\n\n await this.streamBody();\n } catch (error) {\n await this.cleanup();\n this.emit(\"error\", error);\n return;\n }\n }\n\n private async streamBody() {\n while (true) {\n try {\n const { done, value } = await this.bodyReader!.read();\n\n if (done) {\n await this.cleanup();\n this.emit(\"end\");\n return;\n }\n\n const shouldContinue = await this.processData(value);\n\n if (!shouldContinue) {\n return;\n }\n } catch (error) {\n await this.cleanup();\n this.emit(\"error\", error);\n return;\n }\n }\n }\n\n private async processData(data: Uint8Array): Promise<boolean> {\n // Append new data to the temp buffer\n const newBuffer = new Uint8Array(this.buffer.length + data.length);\n newBuffer.set(this.buffer);\n newBuffer.set(data, this.buffer.length);\n this.buffer = newBuffer;\n\n const dataString = new TextDecoder(\"utf-8\").decode(this.buffer);\n\n let lines = dataString.split(\"\\n\").filter((line) => line.trim() !== \"\");\n\n // If the last line isn't complete, keep it in the buffer for next time\n if (!dataString.endsWith(\"\\n\")) {\n const lastLine = lines.pop() || \"\";\n const remainingBytes = new TextEncoder().encode(lastLine);\n this.buffer = new Uint8Array(remainingBytes);\n } else {\n this.buffer = new Uint8Array();\n }\n\n for (const line of lines) {\n const cleanedLine = line.replace(/^data: /, \"\");\n\n if (cleanedLine === \"[DONE]\") {\n await this.cleanup();\n this.emit(\"end\");\n return false;\n }\n\n let json;\n try {\n json = JSON.parse(cleanedLine);\n } catch (error) {\n console.error(\"Failed to parse JSON:\", error);\n continue;\n }\n\n this.emit(\"data\", json);\n }\n return true;\n }\n}\n"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=out.js.map
3
- //# sourceMappingURL=chunk-VNRDQJXW.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
@@ -1,135 +0,0 @@
1
- import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
2
- import { nanoid } from 'nanoid';
3
- import { useReducer, useCallback } from 'react';
4
-
5
- var removeNode = (nodes, id) => {
6
- return nodes.reduce((result, node) => {
7
- if (node.id !== id) {
8
- const newNode = __spreadProps(__spreadValues({}, node), { children: removeNode(node.children, id) });
9
- result.push(newNode);
10
- }
11
- return result;
12
- }, []);
13
- };
14
- var addNode = (nodes, newNode, parentId) => {
15
- if (!parentId) {
16
- return [...nodes, newNode];
17
- }
18
- return nodes.map((node) => {
19
- if (node.id === parentId) {
20
- return __spreadProps(__spreadValues({}, node), { children: [...node.children, newNode] });
21
- } else if (node.children.length) {
22
- return __spreadProps(__spreadValues({}, node), { children: addNode(node.children, newNode, parentId) });
23
- }
24
- return node;
25
- });
26
- };
27
- var treeIndentationRepresentation = (index, indentLevel) => {
28
- if (indentLevel === 0) {
29
- return (index + 1).toString();
30
- } else if (indentLevel === 1) {
31
- return String.fromCharCode(65 + index);
32
- } else if (indentLevel === 2) {
33
- return String.fromCharCode(97 + index);
34
- } else {
35
- return "-";
36
- }
37
- };
38
- var printNode = (node, prefix = "", indentLevel = 0) => {
39
- const indent = " ".repeat(3).repeat(indentLevel);
40
- const prefixPlusIndentLength = prefix.length + indent.length;
41
- const subsequentLinesPrefix = " ".repeat(prefixPlusIndentLength);
42
- const valueLines = node.value.split("\n");
43
- const outputFirstLine = `${indent}${prefix}${valueLines[0]}`;
44
- const outputSubsequentLines = valueLines.slice(1).map((line) => `${subsequentLinesPrefix}${line}`).join("\n");
45
- let output = `${outputFirstLine}
46
- `;
47
- if (outputSubsequentLines) {
48
- output += `${outputSubsequentLines}
49
- `;
50
- }
51
- const childPrePrefix = " ".repeat(prefix.length);
52
- node.children.forEach(
53
- (child, index) => output += printNode(
54
- child,
55
- `${childPrePrefix}${treeIndentationRepresentation(index, indentLevel + 1)}. `,
56
- indentLevel + 1
57
- )
58
- );
59
- return output;
60
- };
61
- function treeReducer(state, action) {
62
- switch (action.type) {
63
- case "ADD_NODE": {
64
- const { value, parentId, id: newNodeId } = action;
65
- const newNode = {
66
- id: newNodeId,
67
- value,
68
- children: [],
69
- categories: new Set(action.categories)
70
- };
71
- try {
72
- return addNode(state, newNode, parentId);
73
- } catch (error) {
74
- console.error(`Error while adding node with id ${newNodeId}: ${error}`);
75
- return state;
76
- }
77
- }
78
- case "REMOVE_NODE":
79
- return removeNode(state, action.id);
80
- default:
81
- return state;
82
- }
83
- }
84
- var useTree = () => {
85
- const [tree, dispatch] = useReducer(treeReducer, []);
86
- const addElement = useCallback(
87
- (value, categories, parentId) => {
88
- const newNodeId = nanoid();
89
- dispatch({
90
- type: "ADD_NODE",
91
- value,
92
- parentId,
93
- id: newNodeId,
94
- categories
95
- });
96
- return newNodeId;
97
- },
98
- []
99
- );
100
- const removeElement = useCallback((id) => {
101
- dispatch({ type: "REMOVE_NODE", id });
102
- }, []);
103
- const printTree = useCallback(
104
- (categories) => {
105
- const categoriesSet = new Set(categories);
106
- let output = "";
107
- tree.forEach((node, index) => {
108
- if (!setsHaveIntersection(categoriesSet, node.categories)) {
109
- return;
110
- }
111
- if (index !== 0) {
112
- output += "\n";
113
- }
114
- output += printNode(node, `${treeIndentationRepresentation(index, 0)}. `);
115
- });
116
- return output;
117
- },
118
- [tree]
119
- );
120
- return { tree, addElement, printTree, removeElement };
121
- };
122
- var use_tree_default = useTree;
123
- function setsHaveIntersection(setA, setB) {
124
- const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];
125
- for (let item of smallerSet) {
126
- if (largerSet.has(item)) {
127
- return true;
128
- }
129
- }
130
- return false;
131
- }
132
-
133
- export { use_tree_default };
134
- //# sourceMappingURL=out.js.map
135
- //# sourceMappingURL=chunk-VUY2K2DI.mjs.map
@@ -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: (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,102 +0,0 @@
1
- import { ChatCompletionClient } from './chunk-TKXPMMND.mjs';
2
- import { __async, __spreadValues } from './chunk-MRXNTQOX.mjs';
3
- import { useState } from 'react';
4
- import { nanoid } from 'nanoid';
5
-
6
- function useChat(options) {
7
- const [messages, setMessages] = useState([]);
8
- const [input, setInput] = useState("");
9
- const [isLoading, setIsLoading] = useState(false);
10
- const runChatCompletion = (messages2) => __async(this, null, function* () {
11
- return new Promise((resolve, reject) => {
12
- setIsLoading(true);
13
- const assistantMessage = {
14
- id: nanoid(),
15
- createdAt: /* @__PURE__ */ new Date(),
16
- content: "",
17
- role: "assistant"
18
- };
19
- setMessages([...messages2, __spreadValues({}, assistantMessage)]);
20
- const messagesWithContext = [...options.initialMessages || [], ...messages2];
21
- const client = new ChatCompletionClient({});
22
- const cleanup = () => {
23
- client.off("content");
24
- client.off("end");
25
- client.off("error");
26
- client.off("function");
27
- };
28
- client.on("content", (content) => {
29
- assistantMessage.content += content;
30
- setMessages([...messages2, __spreadValues({}, assistantMessage)]);
31
- });
32
- client.on("end", () => {
33
- setIsLoading(false);
34
- cleanup();
35
- resolve(__spreadValues({}, assistantMessage));
36
- });
37
- client.on("error", (error) => {
38
- setIsLoading(false);
39
- cleanup();
40
- reject(error);
41
- });
42
- client.on("function", (functionCall) => __async(this, null, function* () {
43
- assistantMessage.function_call = {
44
- name: functionCall.name,
45
- arguments: JSON.stringify(functionCall.arguments)
46
- };
47
- setMessages([...messages2, __spreadValues({}, assistantMessage)]);
48
- setIsLoading(false);
49
- cleanup();
50
- resolve(__spreadValues({}, assistantMessage));
51
- }));
52
- client.fetch({
53
- copilotConfig: options.copilotConfig,
54
- messages: messagesWithContext,
55
- functions: options.functions,
56
- headers: options.headers
57
- });
58
- });
59
- });
60
- const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
61
- const message = yield runChatCompletion(messages2);
62
- if (message.function_call && options.onFunctionCall) {
63
- yield options.onFunctionCall(messages2, message.function_call);
64
- }
65
- });
66
- const append = (message) => __async(this, null, function* () {
67
- if (isLoading) {
68
- return;
69
- }
70
- const newMessages = [...messages, message];
71
- setMessages(newMessages);
72
- return runChatCompletionAndHandleFunctionCall(newMessages);
73
- });
74
- const reload = () => __async(this, null, function* () {
75
- if (isLoading || messages.length === 0) {
76
- return;
77
- }
78
- let newMessages = [...messages];
79
- const lastMessage = messages[messages.length - 1];
80
- if (lastMessage.role === "assistant") {
81
- newMessages = newMessages.slice(0, -1);
82
- }
83
- setMessages(newMessages);
84
- return runChatCompletionAndHandleFunctionCall(newMessages);
85
- });
86
- const stop = () => {
87
- throw new Error("Not implemented");
88
- };
89
- return {
90
- messages,
91
- append,
92
- reload,
93
- stop,
94
- isLoading,
95
- input,
96
- setInput
97
- };
98
- }
99
-
100
- export { useChat };
101
- //# sourceMappingURL=out.js.map
102
- //# sourceMappingURL=chunk-WMXA2TIX.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-chat.ts"],"names":["messages"],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport { Message, Function, FunctionCallHandler } from \"../types\";\nimport { nanoid } from \"nanoid\";\nimport { ChatCompletionClient } from \"../openai/chat-completion-client\";\nimport { CopilotApiConfig } from \"../context\";\n\nexport type UseChatOptions = {\n /**\n * The API endpoint that accepts a `{ messages: Message[] }` object and returns\n * a stream of tokens of the AI chat response. Defaults to `/api/chat`.\n */\n api?: string;\n /**\n * A unique identifier for the chat. If not provided, a random one will be\n * generated. When provided, the `useChat` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n /**\n * System messages of the chat. Defaults to an empty array.\n */\n initialMessages?: Message[];\n /**\n * Callback function to be called when a function call is received.\n * If the function returns a `ChatRequest` object, the request will be sent\n * automatically to the API and will be used to update the chat.\n */\n onFunctionCall?: FunctionCallHandler;\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Record<string, string> | Headers;\n /**\n * Extra body object to be sent with the API request.\n * @example\n * Send a `sessionId` to the API along with the messages.\n * ```js\n * useChat({\n * body: {\n * sessionId: '123',\n * }\n * })\n * ```\n */\n body?: object;\n /**\n * Function definitions to be sent to the API.\n */\n functions?: Function[];\n};\n\nexport type UseChatHelpers = {\n /** Current messages in the chat */\n messages: Message[];\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n * @param message The message to append\n */\n append: (message: Message) => Promise<void>;\n /**\n * Reload the last AI chat response for the given chat history. If the last\n * message isn't from the assistant, it will request the API to generate a\n * new response.\n */\n reload: () => Promise<void>;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n /** The current value of the input */\n input: string;\n /** setState-powered method to update the input value */\n setInput: React.Dispatch<React.SetStateAction<string>>;\n /** Whether the API request is in progress */\n isLoading: boolean;\n};\n\nexport type UseChatOptionsWithCopilotConfig = UseChatOptions & {\n copilotConfig: CopilotApiConfig;\n};\n\nexport function useChat(options: UseChatOptionsWithCopilotConfig): UseChatHelpers {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const runChatCompletion = async (messages: Message[]): Promise<Message> => {\n return new Promise<Message>((resolve, reject) => {\n setIsLoading(true);\n\n const assistantMessage: Message = {\n id: nanoid(),\n createdAt: new Date(),\n content: \"\",\n role: \"assistant\",\n };\n\n // Assistant messages are always copied when using setState\n setMessages([...messages, { ...assistantMessage }]);\n\n const messagesWithContext = [...(options.initialMessages || []), ...messages];\n\n const client = new ChatCompletionClient({});\n\n const cleanup = () => {\n client.off(\"content\");\n client.off(\"end\");\n client.off(\"error\");\n client.off(\"function\");\n };\n\n client.on(\"content\", (content) => {\n assistantMessage.content += content;\n setMessages([...messages, { ...assistantMessage }]);\n });\n\n client.on(\"end\", () => {\n setIsLoading(false);\n cleanup();\n resolve({ ...assistantMessage });\n });\n\n client.on(\"error\", (error) => {\n setIsLoading(false);\n cleanup();\n reject(error);\n });\n\n client.on(\"function\", async (functionCall) => {\n assistantMessage.function_call = {\n name: functionCall.name,\n arguments: JSON.stringify(functionCall.arguments),\n };\n setMessages([...messages, { ...assistantMessage }]);\n // quit early if we get a function call\n setIsLoading(false);\n cleanup();\n resolve({ ...assistantMessage });\n });\n\n client.fetch({\n copilotConfig: options.copilotConfig,\n messages: messagesWithContext,\n functions: options.functions,\n headers: options.headers,\n });\n });\n };\n\n const runChatCompletionAndHandleFunctionCall = async (messages: Message[]): Promise<void> => {\n const message = await runChatCompletion(messages);\n if (message.function_call && options.onFunctionCall) {\n await options.onFunctionCall(messages, message.function_call);\n }\n };\n\n const append = async (message: Message): Promise<void> => {\n if (isLoading) {\n return;\n }\n const newMessages = [...messages, message];\n setMessages(newMessages);\n return runChatCompletionAndHandleFunctionCall(newMessages);\n };\n\n const reload = async (): Promise<void> => {\n if (isLoading || messages.length === 0) {\n return;\n }\n let newMessages = [...messages];\n const lastMessage = messages[messages.length - 1];\n\n if (lastMessage.role === \"assistant\") {\n newMessages = newMessages.slice(0, -1);\n }\n setMessages(newMessages);\n\n return runChatCompletionAndHandleFunctionCall(newMessages);\n };\n\n const stop = (): void => {\n throw new Error(\"Not implemented\");\n };\n\n return {\n messages,\n append,\n reload,\n stop,\n isLoading,\n input,\n setInput,\n };\n}\n"]}
@@ -1,70 +0,0 @@
1
- import { nanoid } from 'nanoid';
2
- import { useReducer, useCallback } from 'react';
3
-
4
- // src/hooks/use-flat-category-store.ts
5
- var useFlatCategoryStore = () => {
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
- }, []);
17
- const removeElement = useCallback((id) => {
18
- dispatch({ type: "REMOVE_ELEMENT", id });
19
- }, []);
20
- const allElements = useCallback(
21
- (categories) => {
22
- const categoriesSet = new Set(categories);
23
- const result = [];
24
- elements.forEach((element) => {
25
- if (setsHaveIntersection(categoriesSet, element.categories)) {
26
- result.push(element.value);
27
- }
28
- });
29
- return result;
30
- },
31
- [elements]
32
- );
33
- return { addElement, removeElement, allElements };
34
- };
35
- var use_flat_category_store_default = useFlatCategoryStore;
36
- function flatCategoryStoreReducer(state, action) {
37
- switch (action.type) {
38
- case "ADD_ELEMENT": {
39
- const { value, id, categories } = action;
40
- const newElement = {
41
- id,
42
- value,
43
- categories: new Set(categories)
44
- };
45
- const newState = new Map(state);
46
- newState.set(id, newElement);
47
- return newState;
48
- }
49
- case "REMOVE_ELEMENT": {
50
- const newState = new Map(state);
51
- newState.delete(action.id);
52
- return newState;
53
- }
54
- default:
55
- return state;
56
- }
57
- }
58
- function setsHaveIntersection(setA, setB) {
59
- const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA];
60
- for (let item of smallerSet) {
61
- if (largerSet.has(item)) {
62
- return true;
63
- }
64
- }
65
- return false;
66
- }
67
-
68
- export { use_flat_category_store_default };
69
- //# sourceMappingURL=out.js.map
70
- //# sourceMappingURL=chunk-YULKJPY3.mjs.map
@@ -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,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"]}