flowquery 1.0.46 → 1.0.48

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 (422) hide show
  1. package/dist/flowquery.min.js +1 -1
  2. package/dist/index.d.ts +0 -7
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -4
  5. package/dist/index.js.map +1 -1
  6. package/dist/parsing/data_structures/list_comprehension.d.ts +56 -0
  7. package/dist/parsing/data_structures/list_comprehension.d.ts.map +1 -0
  8. package/dist/parsing/data_structures/list_comprehension.js +102 -0
  9. package/dist/parsing/data_structures/list_comprehension.js.map +1 -0
  10. package/dist/parsing/parser.d.ts +18 -0
  11. package/dist/parsing/parser.d.ts.map +1 -1
  12. package/dist/parsing/parser.js +92 -0
  13. package/dist/parsing/parser.js.map +1 -1
  14. package/package.json +4 -1
  15. package/.editorconfig +0 -21
  16. package/.gitattributes +0 -3
  17. package/.github/workflows/npm-publish.yml +0 -32
  18. package/.github/workflows/python-publish.yml +0 -143
  19. package/.github/workflows/release.yml +0 -107
  20. package/.husky/pre-commit +0 -28
  21. package/.prettierrc +0 -22
  22. package/CODE_OF_CONDUCT.md +0 -10
  23. package/FlowQueryLogoIcon.png +0 -0
  24. package/SECURITY.md +0 -14
  25. package/SUPPORT.md +0 -13
  26. package/docs/flowquery.min.js +0 -1
  27. package/docs/index.html +0 -105
  28. package/flowquery-py/CONTRIBUTING.md +0 -127
  29. package/flowquery-py/README.md +0 -67
  30. package/flowquery-py/misc/data/test.json +0 -10
  31. package/flowquery-py/misc/data/users.json +0 -242
  32. package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
  33. package/flowquery-py/pyproject.toml +0 -121
  34. package/flowquery-py/setup_env.ps1 +0 -92
  35. package/flowquery-py/setup_env.sh +0 -87
  36. package/flowquery-py/src/__init__.py +0 -38
  37. package/flowquery-py/src/__main__.py +0 -10
  38. package/flowquery-py/src/compute/__init__.py +0 -6
  39. package/flowquery-py/src/compute/flowquery.py +0 -68
  40. package/flowquery-py/src/compute/runner.py +0 -64
  41. package/flowquery-py/src/extensibility.py +0 -52
  42. package/flowquery-py/src/graph/__init__.py +0 -31
  43. package/flowquery-py/src/graph/data.py +0 -136
  44. package/flowquery-py/src/graph/database.py +0 -141
  45. package/flowquery-py/src/graph/hops.py +0 -43
  46. package/flowquery-py/src/graph/node.py +0 -143
  47. package/flowquery-py/src/graph/node_data.py +0 -26
  48. package/flowquery-py/src/graph/node_reference.py +0 -50
  49. package/flowquery-py/src/graph/pattern.py +0 -115
  50. package/flowquery-py/src/graph/pattern_expression.py +0 -67
  51. package/flowquery-py/src/graph/patterns.py +0 -42
  52. package/flowquery-py/src/graph/physical_node.py +0 -41
  53. package/flowquery-py/src/graph/physical_relationship.py +0 -36
  54. package/flowquery-py/src/graph/relationship.py +0 -193
  55. package/flowquery-py/src/graph/relationship_data.py +0 -36
  56. package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
  57. package/flowquery-py/src/graph/relationship_reference.py +0 -21
  58. package/flowquery-py/src/io/__init__.py +0 -5
  59. package/flowquery-py/src/io/command_line.py +0 -108
  60. package/flowquery-py/src/parsing/__init__.py +0 -17
  61. package/flowquery-py/src/parsing/alias.py +0 -20
  62. package/flowquery-py/src/parsing/alias_option.py +0 -11
  63. package/flowquery-py/src/parsing/ast_node.py +0 -147
  64. package/flowquery-py/src/parsing/base_parser.py +0 -84
  65. package/flowquery-py/src/parsing/components/__init__.py +0 -19
  66. package/flowquery-py/src/parsing/components/csv.py +0 -8
  67. package/flowquery-py/src/parsing/components/from_.py +0 -12
  68. package/flowquery-py/src/parsing/components/headers.py +0 -12
  69. package/flowquery-py/src/parsing/components/json.py +0 -8
  70. package/flowquery-py/src/parsing/components/null.py +0 -10
  71. package/flowquery-py/src/parsing/components/post.py +0 -8
  72. package/flowquery-py/src/parsing/components/text.py +0 -8
  73. package/flowquery-py/src/parsing/context.py +0 -50
  74. package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
  75. package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
  76. package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
  77. package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
  78. package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
  79. package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
  80. package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
  81. package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
  82. package/flowquery-py/src/parsing/expressions/expression.py +0 -141
  83. package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
  84. package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
  85. package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
  86. package/flowquery-py/src/parsing/expressions/number.py +0 -32
  87. package/flowquery-py/src/parsing/expressions/operator.py +0 -271
  88. package/flowquery-py/src/parsing/expressions/reference.py +0 -47
  89. package/flowquery-py/src/parsing/expressions/string.py +0 -27
  90. package/flowquery-py/src/parsing/functions/__init__.py +0 -127
  91. package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
  92. package/flowquery-py/src/parsing/functions/async_function.py +0 -65
  93. package/flowquery-py/src/parsing/functions/avg.py +0 -55
  94. package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
  95. package/flowquery-py/src/parsing/functions/collect.py +0 -75
  96. package/flowquery-py/src/parsing/functions/count.py +0 -79
  97. package/flowquery-py/src/parsing/functions/date_.py +0 -61
  98. package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
  99. package/flowquery-py/src/parsing/functions/duration.py +0 -159
  100. package/flowquery-py/src/parsing/functions/element_id.py +0 -50
  101. package/flowquery-py/src/parsing/functions/function.py +0 -68
  102. package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
  103. package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
  104. package/flowquery-py/src/parsing/functions/functions.py +0 -67
  105. package/flowquery-py/src/parsing/functions/head.py +0 -39
  106. package/flowquery-py/src/parsing/functions/id_.py +0 -49
  107. package/flowquery-py/src/parsing/functions/join.py +0 -49
  108. package/flowquery-py/src/parsing/functions/keys.py +0 -34
  109. package/flowquery-py/src/parsing/functions/last.py +0 -39
  110. package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
  111. package/flowquery-py/src/parsing/functions/localtime.py +0 -57
  112. package/flowquery-py/src/parsing/functions/max_.py +0 -49
  113. package/flowquery-py/src/parsing/functions/min_.py +0 -49
  114. package/flowquery-py/src/parsing/functions/nodes.py +0 -48
  115. package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
  116. package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
  117. package/flowquery-py/src/parsing/functions/properties.py +0 -50
  118. package/flowquery-py/src/parsing/functions/rand.py +0 -28
  119. package/flowquery-py/src/parsing/functions/range_.py +0 -41
  120. package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
  121. package/flowquery-py/src/parsing/functions/relationships.py +0 -46
  122. package/flowquery-py/src/parsing/functions/replace.py +0 -39
  123. package/flowquery-py/src/parsing/functions/round_.py +0 -34
  124. package/flowquery-py/src/parsing/functions/schema.py +0 -40
  125. package/flowquery-py/src/parsing/functions/size.py +0 -34
  126. package/flowquery-py/src/parsing/functions/split.py +0 -54
  127. package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
  128. package/flowquery-py/src/parsing/functions/stringify.py +0 -49
  129. package/flowquery-py/src/parsing/functions/substring.py +0 -76
  130. package/flowquery-py/src/parsing/functions/sum.py +0 -51
  131. package/flowquery-py/src/parsing/functions/tail.py +0 -37
  132. package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
  133. package/flowquery-py/src/parsing/functions/time_.py +0 -57
  134. package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
  135. package/flowquery-py/src/parsing/functions/to_float.py +0 -46
  136. package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
  137. package/flowquery-py/src/parsing/functions/to_json.py +0 -35
  138. package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
  139. package/flowquery-py/src/parsing/functions/to_string.py +0 -41
  140. package/flowquery-py/src/parsing/functions/trim.py +0 -37
  141. package/flowquery-py/src/parsing/functions/type_.py +0 -47
  142. package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
  143. package/flowquery-py/src/parsing/logic/__init__.py +0 -15
  144. package/flowquery-py/src/parsing/logic/case.py +0 -28
  145. package/flowquery-py/src/parsing/logic/else_.py +0 -12
  146. package/flowquery-py/src/parsing/logic/end.py +0 -8
  147. package/flowquery-py/src/parsing/logic/then.py +0 -12
  148. package/flowquery-py/src/parsing/logic/when.py +0 -12
  149. package/flowquery-py/src/parsing/operations/__init__.py +0 -46
  150. package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
  151. package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
  152. package/flowquery-py/src/parsing/operations/call.py +0 -73
  153. package/flowquery-py/src/parsing/operations/create_node.py +0 -35
  154. package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
  155. package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
  156. package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
  157. package/flowquery-py/src/parsing/operations/group_by.py +0 -148
  158. package/flowquery-py/src/parsing/operations/limit.py +0 -33
  159. package/flowquery-py/src/parsing/operations/load.py +0 -148
  160. package/flowquery-py/src/parsing/operations/match.py +0 -52
  161. package/flowquery-py/src/parsing/operations/operation.py +0 -69
  162. package/flowquery-py/src/parsing/operations/order_by.py +0 -114
  163. package/flowquery-py/src/parsing/operations/projection.py +0 -21
  164. package/flowquery-py/src/parsing/operations/return_op.py +0 -88
  165. package/flowquery-py/src/parsing/operations/union.py +0 -115
  166. package/flowquery-py/src/parsing/operations/union_all.py +0 -17
  167. package/flowquery-py/src/parsing/operations/unwind.py +0 -42
  168. package/flowquery-py/src/parsing/operations/where.py +0 -43
  169. package/flowquery-py/src/parsing/operations/with_op.py +0 -18
  170. package/flowquery-py/src/parsing/parser.py +0 -1384
  171. package/flowquery-py/src/parsing/parser_state.py +0 -26
  172. package/flowquery-py/src/parsing/token_to_node.py +0 -109
  173. package/flowquery-py/src/tokenization/__init__.py +0 -23
  174. package/flowquery-py/src/tokenization/keyword.py +0 -54
  175. package/flowquery-py/src/tokenization/operator.py +0 -29
  176. package/flowquery-py/src/tokenization/string_walker.py +0 -158
  177. package/flowquery-py/src/tokenization/symbol.py +0 -19
  178. package/flowquery-py/src/tokenization/token.py +0 -693
  179. package/flowquery-py/src/tokenization/token_mapper.py +0 -53
  180. package/flowquery-py/src/tokenization/token_type.py +0 -21
  181. package/flowquery-py/src/tokenization/tokenizer.py +0 -214
  182. package/flowquery-py/src/tokenization/trie.py +0 -125
  183. package/flowquery-py/src/utils/__init__.py +0 -6
  184. package/flowquery-py/src/utils/object_utils.py +0 -20
  185. package/flowquery-py/src/utils/string_utils.py +0 -113
  186. package/flowquery-py/tests/__init__.py +0 -1
  187. package/flowquery-py/tests/compute/__init__.py +0 -1
  188. package/flowquery-py/tests/compute/test_runner.py +0 -4902
  189. package/flowquery-py/tests/graph/__init__.py +0 -1
  190. package/flowquery-py/tests/graph/test_create.py +0 -56
  191. package/flowquery-py/tests/graph/test_data.py +0 -73
  192. package/flowquery-py/tests/graph/test_match.py +0 -40
  193. package/flowquery-py/tests/parsing/__init__.py +0 -1
  194. package/flowquery-py/tests/parsing/test_context.py +0 -34
  195. package/flowquery-py/tests/parsing/test_expression.py +0 -248
  196. package/flowquery-py/tests/parsing/test_parser.py +0 -1237
  197. package/flowquery-py/tests/test_extensibility.py +0 -611
  198. package/flowquery-py/tests/tokenization/__init__.py +0 -1
  199. package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
  200. package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
  201. package/flowquery-py/tests/tokenization/test_trie.py +0 -30
  202. package/flowquery-vscode/.vscode-test.mjs +0 -5
  203. package/flowquery-vscode/.vscodeignore +0 -13
  204. package/flowquery-vscode/LICENSE +0 -21
  205. package/flowquery-vscode/README.md +0 -11
  206. package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
  207. package/flowquery-vscode/eslint.config.mjs +0 -25
  208. package/flowquery-vscode/extension.js +0 -508
  209. package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
  210. package/flowquery-vscode/flowquery-worker.js +0 -66
  211. package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
  212. package/flowquery-vscode/jsconfig.json +0 -13
  213. package/flowquery-vscode/libs/page.css +0 -53
  214. package/flowquery-vscode/libs/table.css +0 -13
  215. package/flowquery-vscode/libs/tabs.css +0 -66
  216. package/flowquery-vscode/package-lock.json +0 -2917
  217. package/flowquery-vscode/package.json +0 -51
  218. package/flowquery-vscode/test/extension.test.js +0 -196
  219. package/flowquery-vscode/test/worker.test.js +0 -25
  220. package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
  221. package/jest.config.js +0 -14
  222. package/misc/apps/RAG/README.md +0 -29
  223. package/misc/apps/RAG/data/chats.json +0 -302
  224. package/misc/apps/RAG/data/emails.json +0 -182
  225. package/misc/apps/RAG/data/events.json +0 -226
  226. package/misc/apps/RAG/data/files.json +0 -172
  227. package/misc/apps/RAG/data/users.json +0 -158
  228. package/misc/apps/RAG/jest.config.js +0 -21
  229. package/misc/apps/RAG/package.json +0 -48
  230. package/misc/apps/RAG/public/index.html +0 -18
  231. package/misc/apps/RAG/src/App.css +0 -42
  232. package/misc/apps/RAG/src/App.tsx +0 -50
  233. package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
  234. package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
  235. package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
  236. package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
  237. package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
  238. package/misc/apps/RAG/src/components/ChatInput.css +0 -23
  239. package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
  240. package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
  241. package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
  242. package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
  243. package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
  244. package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
  245. package/misc/apps/RAG/src/components/index.ts +0 -28
  246. package/misc/apps/RAG/src/graph/index.ts +0 -19
  247. package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
  248. package/misc/apps/RAG/src/index.tsx +0 -29
  249. package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
  250. package/misc/apps/RAG/src/prompts/index.ts +0 -10
  251. package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
  252. package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
  253. package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
  254. package/misc/apps/RAG/src/utils/Llm.ts +0 -248
  255. package/misc/apps/RAG/src/utils/index.ts +0 -12
  256. package/misc/apps/RAG/tsconfig.json +0 -22
  257. package/misc/apps/RAG/webpack.config.js +0 -43
  258. package/misc/apps/README.md +0 -1
  259. package/misc/queries/analyze_catfacts.cql +0 -75
  260. package/misc/queries/azure_openai_completions.cql +0 -13
  261. package/misc/queries/azure_openai_models.cql +0 -9
  262. package/misc/queries/mock_pipeline.cql +0 -84
  263. package/misc/queries/openai_completions.cql +0 -15
  264. package/misc/queries/openai_models.cql +0 -13
  265. package/misc/queries/test.cql +0 -6
  266. package/misc/queries/tool_inference.cql +0 -24
  267. package/misc/queries/wisdom.cql +0 -6
  268. package/misc/queries/wisdom_letter_histogram.cql +0 -8
  269. package/src/compute/flowquery.ts +0 -46
  270. package/src/compute/runner.ts +0 -66
  271. package/src/extensibility.ts +0 -45
  272. package/src/graph/data.ts +0 -130
  273. package/src/graph/database.ts +0 -143
  274. package/src/graph/hops.ts +0 -22
  275. package/src/graph/node.ts +0 -122
  276. package/src/graph/node_data.ts +0 -18
  277. package/src/graph/node_reference.ts +0 -38
  278. package/src/graph/pattern.ts +0 -110
  279. package/src/graph/pattern_expression.ts +0 -48
  280. package/src/graph/patterns.ts +0 -36
  281. package/src/graph/physical_node.ts +0 -23
  282. package/src/graph/physical_relationship.ts +0 -23
  283. package/src/graph/relationship.ts +0 -167
  284. package/src/graph/relationship_data.ts +0 -31
  285. package/src/graph/relationship_match_collector.ts +0 -64
  286. package/src/graph/relationship_reference.ts +0 -25
  287. package/src/index.browser.ts +0 -46
  288. package/src/index.node.ts +0 -55
  289. package/src/index.ts +0 -12
  290. package/src/io/command_line.ts +0 -74
  291. package/src/parsing/alias.ts +0 -23
  292. package/src/parsing/alias_option.ts +0 -5
  293. package/src/parsing/ast_node.ts +0 -153
  294. package/src/parsing/base_parser.ts +0 -98
  295. package/src/parsing/components/csv.ts +0 -9
  296. package/src/parsing/components/from.ts +0 -12
  297. package/src/parsing/components/headers.ts +0 -12
  298. package/src/parsing/components/json.ts +0 -9
  299. package/src/parsing/components/null.ts +0 -9
  300. package/src/parsing/components/post.ts +0 -9
  301. package/src/parsing/components/text.ts +0 -9
  302. package/src/parsing/context.ts +0 -54
  303. package/src/parsing/data_structures/associative_array.ts +0 -43
  304. package/src/parsing/data_structures/json_array.ts +0 -31
  305. package/src/parsing/data_structures/key_value_pair.ts +0 -37
  306. package/src/parsing/data_structures/lookup.ts +0 -44
  307. package/src/parsing/data_structures/range_lookup.ts +0 -36
  308. package/src/parsing/expressions/boolean.ts +0 -21
  309. package/src/parsing/expressions/expression.ts +0 -150
  310. package/src/parsing/expressions/expression_map.ts +0 -22
  311. package/src/parsing/expressions/f_string.ts +0 -26
  312. package/src/parsing/expressions/identifier.ts +0 -22
  313. package/src/parsing/expressions/number.ts +0 -40
  314. package/src/parsing/expressions/operator.ts +0 -354
  315. package/src/parsing/expressions/reference.ts +0 -45
  316. package/src/parsing/expressions/string.ts +0 -34
  317. package/src/parsing/functions/aggregate_function.ts +0 -58
  318. package/src/parsing/functions/async_function.ts +0 -64
  319. package/src/parsing/functions/avg.ts +0 -47
  320. package/src/parsing/functions/coalesce.ts +0 -49
  321. package/src/parsing/functions/collect.ts +0 -54
  322. package/src/parsing/functions/count.ts +0 -54
  323. package/src/parsing/functions/date.ts +0 -63
  324. package/src/parsing/functions/datetime.ts +0 -63
  325. package/src/parsing/functions/duration.ts +0 -143
  326. package/src/parsing/functions/element_id.ts +0 -51
  327. package/src/parsing/functions/function.ts +0 -60
  328. package/src/parsing/functions/function_factory.ts +0 -195
  329. package/src/parsing/functions/function_metadata.ts +0 -217
  330. package/src/parsing/functions/functions.ts +0 -70
  331. package/src/parsing/functions/head.ts +0 -42
  332. package/src/parsing/functions/id.ts +0 -51
  333. package/src/parsing/functions/join.ts +0 -40
  334. package/src/parsing/functions/keys.ts +0 -29
  335. package/src/parsing/functions/last.ts +0 -42
  336. package/src/parsing/functions/localdatetime.ts +0 -63
  337. package/src/parsing/functions/localtime.ts +0 -58
  338. package/src/parsing/functions/max.ts +0 -37
  339. package/src/parsing/functions/min.ts +0 -37
  340. package/src/parsing/functions/nodes.ts +0 -54
  341. package/src/parsing/functions/predicate_function.ts +0 -48
  342. package/src/parsing/functions/predicate_sum.ts +0 -47
  343. package/src/parsing/functions/properties.ts +0 -56
  344. package/src/parsing/functions/rand.ts +0 -21
  345. package/src/parsing/functions/range.ts +0 -37
  346. package/src/parsing/functions/reducer_element.ts +0 -10
  347. package/src/parsing/functions/relationships.ts +0 -52
  348. package/src/parsing/functions/replace.ts +0 -38
  349. package/src/parsing/functions/round.ts +0 -28
  350. package/src/parsing/functions/schema.ts +0 -39
  351. package/src/parsing/functions/size.ts +0 -28
  352. package/src/parsing/functions/split.ts +0 -45
  353. package/src/parsing/functions/string_distance.ts +0 -83
  354. package/src/parsing/functions/stringify.ts +0 -37
  355. package/src/parsing/functions/substring.ts +0 -68
  356. package/src/parsing/functions/sum.ts +0 -41
  357. package/src/parsing/functions/tail.ts +0 -39
  358. package/src/parsing/functions/temporal_utils.ts +0 -180
  359. package/src/parsing/functions/time.ts +0 -58
  360. package/src/parsing/functions/timestamp.ts +0 -37
  361. package/src/parsing/functions/to_float.ts +0 -50
  362. package/src/parsing/functions/to_integer.ts +0 -50
  363. package/src/parsing/functions/to_json.ts +0 -28
  364. package/src/parsing/functions/to_lower.ts +0 -28
  365. package/src/parsing/functions/to_string.ts +0 -32
  366. package/src/parsing/functions/trim.ts +0 -28
  367. package/src/parsing/functions/type.ts +0 -39
  368. package/src/parsing/functions/value_holder.ts +0 -13
  369. package/src/parsing/logic/case.ts +0 -26
  370. package/src/parsing/logic/else.ts +0 -12
  371. package/src/parsing/logic/end.ts +0 -9
  372. package/src/parsing/logic/then.ts +0 -12
  373. package/src/parsing/logic/when.ts +0 -12
  374. package/src/parsing/operations/aggregated_return.ts +0 -22
  375. package/src/parsing/operations/aggregated_with.ts +0 -18
  376. package/src/parsing/operations/call.ts +0 -69
  377. package/src/parsing/operations/create_node.ts +0 -39
  378. package/src/parsing/operations/create_relationship.ts +0 -38
  379. package/src/parsing/operations/delete_node.ts +0 -33
  380. package/src/parsing/operations/delete_relationship.ts +0 -32
  381. package/src/parsing/operations/group_by.ts +0 -137
  382. package/src/parsing/operations/limit.ts +0 -31
  383. package/src/parsing/operations/load.ts +0 -146
  384. package/src/parsing/operations/match.ts +0 -54
  385. package/src/parsing/operations/operation.ts +0 -69
  386. package/src/parsing/operations/order_by.ts +0 -126
  387. package/src/parsing/operations/projection.ts +0 -18
  388. package/src/parsing/operations/return.ts +0 -76
  389. package/src/parsing/operations/union.ts +0 -114
  390. package/src/parsing/operations/union_all.ts +0 -16
  391. package/src/parsing/operations/unwind.ts +0 -36
  392. package/src/parsing/operations/where.ts +0 -42
  393. package/src/parsing/operations/with.ts +0 -20
  394. package/src/parsing/parser.ts +0 -1641
  395. package/src/parsing/parser_state.ts +0 -25
  396. package/src/parsing/token_to_node.ts +0 -114
  397. package/src/tokenization/keyword.ts +0 -50
  398. package/src/tokenization/operator.ts +0 -25
  399. package/src/tokenization/string_walker.ts +0 -197
  400. package/src/tokenization/symbol.ts +0 -15
  401. package/src/tokenization/token.ts +0 -764
  402. package/src/tokenization/token_mapper.ts +0 -53
  403. package/src/tokenization/token_type.ts +0 -16
  404. package/src/tokenization/tokenizer.ts +0 -250
  405. package/src/tokenization/trie.ts +0 -117
  406. package/src/utils/object_utils.ts +0 -17
  407. package/src/utils/string_utils.ts +0 -114
  408. package/tests/compute/runner.test.ts +0 -4559
  409. package/tests/extensibility.test.ts +0 -643
  410. package/tests/graph/create.test.ts +0 -36
  411. package/tests/graph/data.test.ts +0 -58
  412. package/tests/graph/match.test.ts +0 -29
  413. package/tests/parsing/context.test.ts +0 -27
  414. package/tests/parsing/expression.test.ts +0 -303
  415. package/tests/parsing/parser.test.ts +0 -1327
  416. package/tests/tokenization/token_mapper.test.ts +0 -47
  417. package/tests/tokenization/tokenizer.test.ts +0 -191
  418. package/tests/tokenization/trie.test.ts +0 -20
  419. package/tsconfig.json +0 -19
  420. package/typedoc.json +0 -16
  421. package/vscode-settings.json.recommended +0 -16
  422. package/webpack.config.js +0 -26
@@ -1,380 +0,0 @@
1
- import React from 'react';
2
- import * as AdaptiveCards from 'adaptivecards';
3
- import * as ACData from 'adaptivecards-templating';
4
- import './AdaptiveCardRenderer.css';
5
-
6
- /**
7
- * Data passed when an Action.Submit is triggered
8
- */
9
- export interface SubmitActionData {
10
- /**
11
- * The data property from the Action.Submit (if any)
12
- */
13
- actionData: unknown;
14
-
15
- /**
16
- * All input values collected from the card
17
- */
18
- inputValues: Record<string, string>;
19
-
20
- /**
21
- * The original action object
22
- */
23
- action: AdaptiveCards.SubmitAction;
24
- }
25
-
26
- export interface AdaptiveCardRendererProps {
27
- /**
28
- * The Adaptive Card payload (JSON object conforming to Adaptive Cards schema).
29
- * Can be a template with ${expression} bindings if `data` prop is provided.
30
- */
31
- card: Record<string, unknown>;
32
-
33
- /**
34
- * Optional data context for template binding.
35
- * When provided, the card is treated as a template and expressions like
36
- * ${property} or ${$root.property} will be evaluated against this data.
37
- */
38
- data?: Record<string, unknown>;
39
-
40
- /**
41
- * Optional host config for styling the card
42
- */
43
- hostConfig?: Record<string, unknown>;
44
-
45
- /**
46
- * Callback when an Action.Submit is executed.
47
- * Receives the action data and all input values from the card.
48
- */
49
- onSubmit?: (submitData: SubmitActionData) => void;
50
-
51
- /**
52
- * Callback when any action is executed (e.g., Action.Submit, Action.OpenUrl).
53
- * For Action.Submit, prefer using onSubmit which provides collected input values.
54
- */
55
- onExecuteAction?: (action: AdaptiveCards.Action) => void;
56
-
57
- /**
58
- * Optional CSS class name for the container
59
- */
60
- className?: string;
61
- }
62
-
63
- /**
64
- * Default host config styled to match Fluent UI aesthetics
65
- */
66
- const defaultHostConfig: AdaptiveCards.HostConfig = new AdaptiveCards.HostConfig({
67
- fontFamily: "'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', sans-serif",
68
- containerStyles: {
69
- default: {
70
- backgroundColor: "#ffffff",
71
- foregroundColors: {
72
- default: {
73
- default: "#242424",
74
- subtle: "#616161"
75
- },
76
- accent: {
77
- default: "#0078D4",
78
- subtle: "#0063B1"
79
- },
80
- good: {
81
- default: "#107C10",
82
- subtle: "#0B5C0B"
83
- },
84
- warning: {
85
- default: "#D83B01",
86
- subtle: "#C43501"
87
- },
88
- attention: {
89
- default: "#A80000",
90
- subtle: "#8B0000"
91
- }
92
- }
93
- },
94
- emphasis: {
95
- backgroundColor: "#F5F5F5",
96
- foregroundColors: {
97
- default: {
98
- default: "#242424",
99
- subtle: "#616161"
100
- }
101
- }
102
- },
103
- accent: {
104
- backgroundColor: "#E6F2FB",
105
- foregroundColors: {
106
- default: {
107
- default: "#242424",
108
- subtle: "#616161"
109
- }
110
- }
111
- }
112
- },
113
- spacing: {
114
- small: 4,
115
- default: 8,
116
- medium: 12,
117
- large: 16,
118
- extraLarge: 24,
119
- padding: 12
120
- },
121
- separator: {
122
- lineThickness: 1,
123
- lineColor: "#E0E0E0"
124
- },
125
- actions: {
126
- maxActions: 5,
127
- spacing: AdaptiveCards.Spacing.Default,
128
- buttonSpacing: 8,
129
- showCard: {
130
- actionMode: AdaptiveCards.ShowCardActionMode.Inline,
131
- inlineTopMargin: 8
132
- },
133
- actionsOrientation: AdaptiveCards.Orientation.Horizontal,
134
- actionAlignment: AdaptiveCards.ActionAlignment.Left
135
- },
136
- adaptiveCard: {
137
- allowCustomStyle: true
138
- },
139
- textBlock: {
140
- headingLevel: 2
141
- },
142
- factSet: {
143
- title: {
144
- color: AdaptiveCards.TextColor.Default,
145
- size: AdaptiveCards.TextSize.Default,
146
- isSubtle: false,
147
- weight: AdaptiveCards.TextWeight.Bolder,
148
- wrap: true
149
- },
150
- value: {
151
- color: AdaptiveCards.TextColor.Default,
152
- size: AdaptiveCards.TextSize.Default,
153
- isSubtle: false,
154
- weight: AdaptiveCards.TextWeight.Default,
155
- wrap: true
156
- },
157
- spacing: 8
158
- }
159
- });
160
-
161
- /**
162
- * Renders an Adaptive Card using the adaptivecards library.
163
- * Adaptive Cards are platform-agnostic UI snippets authored in JSON.
164
- */
165
- export class AdaptiveCardRenderer extends React.Component<AdaptiveCardRendererProps> {
166
- private containerRef = React.createRef<HTMLDivElement>();
167
- private adaptiveCard: AdaptiveCards.AdaptiveCard | null = null;
168
-
169
- componentDidMount(): void {
170
- this.createAdaptiveCard();
171
- this.renderCard();
172
- }
173
-
174
- componentDidUpdate(prevProps: AdaptiveCardRendererProps): void {
175
- // Recreate adaptive card instance if host config changes
176
- if (prevProps.hostConfig !== this.props.hostConfig) {
177
- this.createAdaptiveCard();
178
- }
179
-
180
- // Re-render if card, data, hostConfig, or action handler changes
181
- if (
182
- prevProps.card !== this.props.card ||
183
- prevProps.data !== this.props.data ||
184
- prevProps.hostConfig !== this.props.hostConfig ||
185
- prevProps.onExecuteAction !== this.props.onExecuteAction ||
186
- prevProps.onSubmit !== this.props.onSubmit
187
- ) {
188
- this.renderCard();
189
- }
190
- }
191
-
192
- /**
193
- * Collects all input values from the rendered card
194
- */
195
- private collectInputValues(): Record<string, string> {
196
- const inputs: Record<string, string> = {};
197
-
198
- if (!this.adaptiveCard) {
199
- return inputs;
200
- }
201
-
202
- // Get all input elements from the card
203
- const allInputs = this.adaptiveCard.getAllInputs();
204
-
205
- for (const input of allInputs) {
206
- if (input.id) {
207
- inputs[input.id] = input.value ?? '';
208
- }
209
- }
210
-
211
- return inputs;
212
- }
213
-
214
- private createAdaptiveCard(): void {
215
- const { hostConfig } = this.props;
216
-
217
- this.adaptiveCard = new AdaptiveCards.AdaptiveCard();
218
-
219
- // Apply host config
220
- if (hostConfig) {
221
- this.adaptiveCard.hostConfig = new AdaptiveCards.HostConfig(hostConfig);
222
- } else {
223
- this.adaptiveCard.hostConfig = defaultHostConfig;
224
- }
225
- }
226
-
227
- private renderCard(): void {
228
- const { card, data, onExecuteAction, onSubmit } = this.props;
229
-
230
- if (!this.containerRef.current || !card || !this.adaptiveCard) {
231
- return;
232
- }
233
-
234
- // Clear previous content
235
- this.containerRef.current.innerHTML = '';
236
-
237
- try {
238
- // Normalize the card to standard Adaptive Card format
239
- let cardPayload = normalizeAdaptiveCard(card);
240
-
241
- if (!cardPayload) {
242
- throw new Error('Invalid Adaptive Card format');
243
- }
244
-
245
- // Apply data binding if data is provided
246
- if (data) {
247
- const template = new ACData.Template(cardPayload);
248
- cardPayload = template.expand({
249
- $root: data
250
- });
251
- }
252
-
253
- // Set up action handler
254
- this.adaptiveCard.onExecuteAction = (action: AdaptiveCards.Action) => {
255
- // Handle Action.Submit specially to collect input values
256
- if (action instanceof AdaptiveCards.SubmitAction) {
257
- const inputValues = this.collectInputValues();
258
-
259
- if (onSubmit) {
260
- onSubmit({
261
- actionData: action.data,
262
- inputValues,
263
- action
264
- });
265
- }
266
- }
267
-
268
- // Call general action handler if provided
269
- if (onExecuteAction) {
270
- onExecuteAction(action);
271
- } else if (action instanceof AdaptiveCards.OpenUrlAction && action.url) {
272
- // Default: open URLs in new tab
273
- window.open(action.url, '_blank', 'noopener,noreferrer');
274
- }
275
- };
276
-
277
- // Parse and render the card
278
- this.adaptiveCard.parse(cardPayload);
279
- const renderedCard = this.adaptiveCard.render();
280
-
281
- if (renderedCard) {
282
- this.containerRef.current.appendChild(renderedCard);
283
- }
284
- } catch (error) {
285
- console.error('Failed to render Adaptive Card:', error);
286
-
287
- // Show error message in the container
288
- const errorDiv = document.createElement('div');
289
- errorDiv.className = 'adaptive-card-error';
290
- errorDiv.textContent = `Failed to render card: ${error instanceof Error ? error.message : 'Unknown error'}`;
291
- this.containerRef.current.appendChild(errorDiv);
292
- }
293
- }
294
-
295
- render(): React.ReactNode {
296
- const { className } = this.props;
297
-
298
- return (
299
- <div
300
- ref={this.containerRef}
301
- className={`adaptive-card-container ${className || ''}`}
302
- />
303
- );
304
- }
305
- }
306
-
307
- /**
308
- * Helper function to check if an object looks like an Adaptive Card.
309
- * Supports both standard format (type: 'AdaptiveCard') and alternative format (cardType: 'AdaptiveCard').
310
- */
311
- export function isAdaptiveCard(obj: unknown): obj is Record<string, unknown> {
312
- if (typeof obj !== 'object' || obj === null) {
313
- return false;
314
- }
315
-
316
- const card = obj as Record<string, unknown>;
317
-
318
- // Standard Adaptive Card format
319
- if (card.type === 'AdaptiveCard') {
320
- return true;
321
- }
322
-
323
- // Alternative format with cardType/cardBody
324
- if (card.cardType === 'AdaptiveCard') {
325
- return true;
326
- }
327
-
328
- // Check if it's an array containing Adaptive Cards
329
- if (Array.isArray(obj) && obj.length > 0) {
330
- return obj.some(item => isAdaptiveCard(item));
331
- }
332
-
333
- return false;
334
- }
335
-
336
- /**
337
- * Normalizes a card payload to the standard Adaptive Card format.
338
- * Handles:
339
- * - Arrays of cards (returns the first card)
340
- * - Alternative format with cardType/cardBody properties
341
- * - Standard format (passed through unchanged)
342
- */
343
- export function normalizeAdaptiveCard(obj: unknown): Record<string, unknown> | null {
344
- if (typeof obj !== 'object' || obj === null) {
345
- return null;
346
- }
347
-
348
- // Handle arrays - extract the first valid card
349
- if (Array.isArray(obj)) {
350
- for (const item of obj) {
351
- const normalized = normalizeAdaptiveCard(item);
352
- if (normalized) {
353
- return normalized;
354
- }
355
- }
356
- return null;
357
- }
358
-
359
- const card = obj as Record<string, unknown>;
360
-
361
- // Standard format - return as-is
362
- if (card.type === 'AdaptiveCard') {
363
- return card;
364
- }
365
-
366
- // Alternative format - convert to standard format
367
- if (card.cardType === 'AdaptiveCard') {
368
- return {
369
- type: 'AdaptiveCard',
370
- $schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
371
- version: (card.version as string) || '1.5',
372
- body: card.cardBody || card.body || [],
373
- actions: card.actions || []
374
- };
375
- }
376
-
377
- return null;
378
- }
379
-
380
- export default AdaptiveCardRenderer;
@@ -1,245 +0,0 @@
1
- /**
2
- * API Key Settings Component
3
- *
4
- * Allows users to input and store their OpenAI API key in localStorage.
5
- * The key is never sent to any server - it's only used client-side.
6
- */
7
-
8
- import React, { Component } from 'react';
9
- import {
10
- Dialog,
11
- DialogTrigger,
12
- DialogSurface,
13
- DialogTitle,
14
- DialogBody,
15
- DialogActions,
16
- DialogContent,
17
- Button,
18
- Input,
19
- Label,
20
- Field,
21
- MessageBar,
22
- MessageBarBody,
23
- tokens,
24
- } from '@fluentui/react-components';
25
- import { Settings24Regular, Key24Regular, Checkmark24Regular } from '@fluentui/react-icons';
26
-
27
- const STORAGE_KEY = 'flowquery_openai_api_key';
28
- const ORG_STORAGE_KEY = 'flowquery_openai_org_id';
29
- const MODEL_STORAGE_KEY = 'flowquery_openai_model';
30
-
31
- export interface ApiKeyConfig {
32
- apiKey: string;
33
- organizationId?: string;
34
- model?: string;
35
- }
36
-
37
- /**
38
- * Get the stored API configuration from localStorage.
39
- */
40
- export function getStoredApiConfig(): ApiKeyConfig | null {
41
- const apiKey = localStorage.getItem(STORAGE_KEY);
42
- if (!apiKey) return null;
43
-
44
- return {
45
- apiKey,
46
- organizationId: localStorage.getItem(ORG_STORAGE_KEY) || undefined,
47
- model: localStorage.getItem(MODEL_STORAGE_KEY) || undefined,
48
- };
49
- }
50
-
51
- /**
52
- * Check if an API key is configured in localStorage.
53
- */
54
- export function hasApiKey(): boolean {
55
- return !!localStorage.getItem(STORAGE_KEY);
56
- }
57
-
58
- /**
59
- * Get just the API key from storage.
60
- */
61
- export function getApiKey(): string | null {
62
- return localStorage.getItem(STORAGE_KEY);
63
- }
64
-
65
- interface ApiKeySettingsProps {
66
- onSave?: (config: ApiKeyConfig) => void;
67
- }
68
-
69
- interface ApiKeySettingsState {
70
- open: boolean;
71
- apiKey: string;
72
- organizationId: string;
73
- model: string;
74
- saved: boolean;
75
- }
76
-
77
- export class ApiKeySettings extends Component<ApiKeySettingsProps, ApiKeySettingsState> {
78
- constructor(props: ApiKeySettingsProps) {
79
- super(props);
80
- this.state = {
81
- open: false,
82
- apiKey: '',
83
- organizationId: '',
84
- model: '',
85
- saved: false,
86
- };
87
- }
88
-
89
- componentDidUpdate(_prevProps: ApiKeySettingsProps, prevState: ApiKeySettingsState): void {
90
- // Load existing values when dialog opens
91
- if (this.state.open && !prevState.open) {
92
- const config = getStoredApiConfig();
93
- this.setState({
94
- apiKey: config?.apiKey || '',
95
- organizationId: config?.organizationId || '',
96
- model: config?.model || '',
97
- saved: false,
98
- });
99
- }
100
- }
101
-
102
- handleOpenChange = (_: unknown, data: { open: boolean }): void => {
103
- this.setState({ open: data.open });
104
- };
105
-
106
- handleSave = (): void => {
107
- const { apiKey, organizationId, model } = this.state;
108
- const { onSave } = this.props;
109
-
110
- // Save to localStorage
111
- if (apiKey) {
112
- localStorage.setItem(STORAGE_KEY, apiKey);
113
- } else {
114
- localStorage.removeItem(STORAGE_KEY);
115
- }
116
-
117
- if (organizationId) {
118
- localStorage.setItem(ORG_STORAGE_KEY, organizationId);
119
- } else {
120
- localStorage.removeItem(ORG_STORAGE_KEY);
121
- }
122
-
123
- if (model) {
124
- localStorage.setItem(MODEL_STORAGE_KEY, model);
125
- } else {
126
- localStorage.removeItem(MODEL_STORAGE_KEY);
127
- }
128
-
129
- const config: ApiKeyConfig = {
130
- apiKey,
131
- organizationId: organizationId || undefined,
132
- model: model || undefined,
133
- };
134
-
135
- this.setState({ saved: true });
136
- onSave?.(config);
137
-
138
- // Close dialog after a brief delay to show success
139
- setTimeout(() => this.setState({ open: false }), 500);
140
- };
141
-
142
- handleClear = (): void => {
143
- localStorage.removeItem(STORAGE_KEY);
144
- localStorage.removeItem(ORG_STORAGE_KEY);
145
- localStorage.removeItem(MODEL_STORAGE_KEY);
146
- this.setState({
147
- apiKey: '',
148
- organizationId: '',
149
- model: '',
150
- saved: false,
151
- });
152
- };
153
-
154
- handleCancel = (): void => {
155
- this.setState({ open: false });
156
- };
157
-
158
- handleApiKeyChange = (_: unknown, data: { value: string }): void => {
159
- this.setState({ apiKey: data.value });
160
- };
161
-
162
- handleOrganizationIdChange = (_: unknown, data: { value: string }): void => {
163
- this.setState({ organizationId: data.value });
164
- };
165
-
166
- handleModelChange = (_: unknown, data: { value: string }): void => {
167
- this.setState({ model: data.value });
168
- };
169
-
170
- render(): React.ReactNode {
171
- const { open, apiKey, organizationId, model, saved } = this.state;
172
- const isConfigured = hasApiKey();
173
-
174
- return (
175
- <Dialog open={open} onOpenChange={this.handleOpenChange}>
176
- <DialogTrigger disableButtonEnhancement>
177
- <Button
178
- appearance={isConfigured ? 'subtle' : 'primary'}
179
- icon={isConfigured ? <Checkmark24Regular /> : <Settings24Regular />}
180
- title="API Settings"
181
- >
182
- {isConfigured ? 'API Configured' : 'Configure API Key'}
183
- </Button>
184
- </DialogTrigger>
185
- <DialogSurface>
186
- <DialogBody>
187
- <DialogTitle>OpenAI API Settings</DialogTitle>
188
- <DialogContent style={{ display: 'flex', flexDirection: 'column', gap: '16px', paddingTop: '16px' }}>
189
- <MessageBar intent="info">
190
- <MessageBarBody>
191
- Your API key is stored locally in your browser and never sent to any server.
192
- </MessageBarBody>
193
- </MessageBar>
194
-
195
- <Field label="API Key" required>
196
- <Input
197
- type="password"
198
- value={apiKey}
199
- onChange={this.handleApiKeyChange}
200
- placeholder="sk-..."
201
- contentBefore={<Key24Regular />}
202
- />
203
- </Field>
204
-
205
- <Field label="Organization ID" hint="Optional - only needed for organization accounts">
206
- <Input
207
- value={organizationId}
208
- onChange={this.handleOrganizationIdChange}
209
- placeholder="org-..."
210
- />
211
- </Field>
212
-
213
- <Field label="Default Model" hint="Optional - defaults to gpt-4o-mini">
214
- <Input
215
- value={model}
216
- onChange={this.handleModelChange}
217
- placeholder="gpt-4o-mini"
218
- />
219
- </Field>
220
-
221
- {saved && (
222
- <MessageBar intent="success">
223
- <MessageBarBody>Settings saved successfully!</MessageBarBody>
224
- </MessageBar>
225
- )}
226
- </DialogContent>
227
- <DialogActions>
228
- <Button appearance="secondary" onClick={this.handleClear}>
229
- Clear
230
- </Button>
231
- <Button appearance="secondary" onClick={this.handleCancel}>
232
- Cancel
233
- </Button>
234
- <Button appearance="primary" onClick={this.handleSave} disabled={!apiKey}>
235
- Save
236
- </Button>
237
- </DialogActions>
238
- </DialogBody>
239
- </DialogSurface>
240
- </Dialog>
241
- );
242
- }
243
- }
244
-
245
- export default ApiKeySettings;
@@ -1,67 +0,0 @@
1
- .chat-container {
2
- display: flex;
3
- flex-direction: column;
4
- height: 100%;
5
- background-color: #ffffff;
6
- border-radius: 8px;
7
- overflow: hidden;
8
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
9
- }
10
-
11
- .chat-messages {
12
- flex: 1;
13
- overflow-y: auto;
14
- padding: 16px;
15
- background-color: #fafafa;
16
- }
17
-
18
- .chat-empty-state {
19
- display: flex;
20
- align-items: center;
21
- justify-content: center;
22
- height: 100%;
23
- color: #666;
24
- text-align: center;
25
- padding: 24px;
26
- }
27
-
28
- .chat-empty-state p {
29
- margin: 0;
30
- font-size: 16px;
31
- }
32
-
33
- .chat-loading {
34
- display: flex;
35
- justify-content: center;
36
- padding: 16px;
37
- }
38
-
39
- .chat-error {
40
- padding: 12px 16px;
41
- background-color: #fde7e9;
42
- color: #c50f1f;
43
- border-top: 1px solid #c50f1f;
44
- font-size: 14px;
45
- }
46
-
47
- .chat-clear-button {
48
- padding: 8px 16px;
49
- margin: 8px 16px 16px;
50
- background-color: transparent;
51
- border: 1px solid #d1d1d1;
52
- border-radius: 4px;
53
- color: #666;
54
- cursor: pointer;
55
- font-size: 14px;
56
- transition: all 0.2s ease;
57
- }
58
-
59
- .chat-clear-button:hover:not(:disabled) {
60
- background-color: #f5f5f5;
61
- border-color: #b3b3b3;
62
- }
63
-
64
- .chat-clear-button:disabled {
65
- opacity: 0.5;
66
- cursor: not-allowed;
67
- }