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.
- package/dist/flowquery.min.js +1 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/parsing/data_structures/list_comprehension.d.ts +56 -0
- package/dist/parsing/data_structures/list_comprehension.d.ts.map +1 -0
- package/dist/parsing/data_structures/list_comprehension.js +102 -0
- package/dist/parsing/data_structures/list_comprehension.js.map +1 -0
- package/dist/parsing/parser.d.ts +18 -0
- package/dist/parsing/parser.d.ts.map +1 -1
- package/dist/parsing/parser.js +92 -0
- package/dist/parsing/parser.js.map +1 -1
- package/package.json +4 -1
- package/.editorconfig +0 -21
- package/.gitattributes +0 -3
- package/.github/workflows/npm-publish.yml +0 -32
- package/.github/workflows/python-publish.yml +0 -143
- package/.github/workflows/release.yml +0 -107
- package/.husky/pre-commit +0 -28
- package/.prettierrc +0 -22
- package/CODE_OF_CONDUCT.md +0 -10
- package/FlowQueryLogoIcon.png +0 -0
- package/SECURITY.md +0 -14
- package/SUPPORT.md +0 -13
- package/docs/flowquery.min.js +0 -1
- package/docs/index.html +0 -105
- package/flowquery-py/CONTRIBUTING.md +0 -127
- package/flowquery-py/README.md +0 -67
- package/flowquery-py/misc/data/test.json +0 -10
- package/flowquery-py/misc/data/users.json +0 -242
- package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
- package/flowquery-py/pyproject.toml +0 -121
- package/flowquery-py/setup_env.ps1 +0 -92
- package/flowquery-py/setup_env.sh +0 -87
- package/flowquery-py/src/__init__.py +0 -38
- package/flowquery-py/src/__main__.py +0 -10
- package/flowquery-py/src/compute/__init__.py +0 -6
- package/flowquery-py/src/compute/flowquery.py +0 -68
- package/flowquery-py/src/compute/runner.py +0 -64
- package/flowquery-py/src/extensibility.py +0 -52
- package/flowquery-py/src/graph/__init__.py +0 -31
- package/flowquery-py/src/graph/data.py +0 -136
- package/flowquery-py/src/graph/database.py +0 -141
- package/flowquery-py/src/graph/hops.py +0 -43
- package/flowquery-py/src/graph/node.py +0 -143
- package/flowquery-py/src/graph/node_data.py +0 -26
- package/flowquery-py/src/graph/node_reference.py +0 -50
- package/flowquery-py/src/graph/pattern.py +0 -115
- package/flowquery-py/src/graph/pattern_expression.py +0 -67
- package/flowquery-py/src/graph/patterns.py +0 -42
- package/flowquery-py/src/graph/physical_node.py +0 -41
- package/flowquery-py/src/graph/physical_relationship.py +0 -36
- package/flowquery-py/src/graph/relationship.py +0 -193
- package/flowquery-py/src/graph/relationship_data.py +0 -36
- package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
- package/flowquery-py/src/graph/relationship_reference.py +0 -21
- package/flowquery-py/src/io/__init__.py +0 -5
- package/flowquery-py/src/io/command_line.py +0 -108
- package/flowquery-py/src/parsing/__init__.py +0 -17
- package/flowquery-py/src/parsing/alias.py +0 -20
- package/flowquery-py/src/parsing/alias_option.py +0 -11
- package/flowquery-py/src/parsing/ast_node.py +0 -147
- package/flowquery-py/src/parsing/base_parser.py +0 -84
- package/flowquery-py/src/parsing/components/__init__.py +0 -19
- package/flowquery-py/src/parsing/components/csv.py +0 -8
- package/flowquery-py/src/parsing/components/from_.py +0 -12
- package/flowquery-py/src/parsing/components/headers.py +0 -12
- package/flowquery-py/src/parsing/components/json.py +0 -8
- package/flowquery-py/src/parsing/components/null.py +0 -10
- package/flowquery-py/src/parsing/components/post.py +0 -8
- package/flowquery-py/src/parsing/components/text.py +0 -8
- package/flowquery-py/src/parsing/context.py +0 -50
- package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
- package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
- package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
- package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
- package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
- package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
- package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
- package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
- package/flowquery-py/src/parsing/expressions/expression.py +0 -141
- package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
- package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
- package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
- package/flowquery-py/src/parsing/expressions/number.py +0 -32
- package/flowquery-py/src/parsing/expressions/operator.py +0 -271
- package/flowquery-py/src/parsing/expressions/reference.py +0 -47
- package/flowquery-py/src/parsing/expressions/string.py +0 -27
- package/flowquery-py/src/parsing/functions/__init__.py +0 -127
- package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
- package/flowquery-py/src/parsing/functions/async_function.py +0 -65
- package/flowquery-py/src/parsing/functions/avg.py +0 -55
- package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
- package/flowquery-py/src/parsing/functions/collect.py +0 -75
- package/flowquery-py/src/parsing/functions/count.py +0 -79
- package/flowquery-py/src/parsing/functions/date_.py +0 -61
- package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
- package/flowquery-py/src/parsing/functions/duration.py +0 -159
- package/flowquery-py/src/parsing/functions/element_id.py +0 -50
- package/flowquery-py/src/parsing/functions/function.py +0 -68
- package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
- package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
- package/flowquery-py/src/parsing/functions/functions.py +0 -67
- package/flowquery-py/src/parsing/functions/head.py +0 -39
- package/flowquery-py/src/parsing/functions/id_.py +0 -49
- package/flowquery-py/src/parsing/functions/join.py +0 -49
- package/flowquery-py/src/parsing/functions/keys.py +0 -34
- package/flowquery-py/src/parsing/functions/last.py +0 -39
- package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
- package/flowquery-py/src/parsing/functions/localtime.py +0 -57
- package/flowquery-py/src/parsing/functions/max_.py +0 -49
- package/flowquery-py/src/parsing/functions/min_.py +0 -49
- package/flowquery-py/src/parsing/functions/nodes.py +0 -48
- package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
- package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
- package/flowquery-py/src/parsing/functions/properties.py +0 -50
- package/flowquery-py/src/parsing/functions/rand.py +0 -28
- package/flowquery-py/src/parsing/functions/range_.py +0 -41
- package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
- package/flowquery-py/src/parsing/functions/relationships.py +0 -46
- package/flowquery-py/src/parsing/functions/replace.py +0 -39
- package/flowquery-py/src/parsing/functions/round_.py +0 -34
- package/flowquery-py/src/parsing/functions/schema.py +0 -40
- package/flowquery-py/src/parsing/functions/size.py +0 -34
- package/flowquery-py/src/parsing/functions/split.py +0 -54
- package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
- package/flowquery-py/src/parsing/functions/stringify.py +0 -49
- package/flowquery-py/src/parsing/functions/substring.py +0 -76
- package/flowquery-py/src/parsing/functions/sum.py +0 -51
- package/flowquery-py/src/parsing/functions/tail.py +0 -37
- package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
- package/flowquery-py/src/parsing/functions/time_.py +0 -57
- package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
- package/flowquery-py/src/parsing/functions/to_float.py +0 -46
- package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
- package/flowquery-py/src/parsing/functions/to_json.py +0 -35
- package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
- package/flowquery-py/src/parsing/functions/to_string.py +0 -41
- package/flowquery-py/src/parsing/functions/trim.py +0 -37
- package/flowquery-py/src/parsing/functions/type_.py +0 -47
- package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
- package/flowquery-py/src/parsing/logic/__init__.py +0 -15
- package/flowquery-py/src/parsing/logic/case.py +0 -28
- package/flowquery-py/src/parsing/logic/else_.py +0 -12
- package/flowquery-py/src/parsing/logic/end.py +0 -8
- package/flowquery-py/src/parsing/logic/then.py +0 -12
- package/flowquery-py/src/parsing/logic/when.py +0 -12
- package/flowquery-py/src/parsing/operations/__init__.py +0 -46
- package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
- package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
- package/flowquery-py/src/parsing/operations/call.py +0 -73
- package/flowquery-py/src/parsing/operations/create_node.py +0 -35
- package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
- package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
- package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
- package/flowquery-py/src/parsing/operations/group_by.py +0 -148
- package/flowquery-py/src/parsing/operations/limit.py +0 -33
- package/flowquery-py/src/parsing/operations/load.py +0 -148
- package/flowquery-py/src/parsing/operations/match.py +0 -52
- package/flowquery-py/src/parsing/operations/operation.py +0 -69
- package/flowquery-py/src/parsing/operations/order_by.py +0 -114
- package/flowquery-py/src/parsing/operations/projection.py +0 -21
- package/flowquery-py/src/parsing/operations/return_op.py +0 -88
- package/flowquery-py/src/parsing/operations/union.py +0 -115
- package/flowquery-py/src/parsing/operations/union_all.py +0 -17
- package/flowquery-py/src/parsing/operations/unwind.py +0 -42
- package/flowquery-py/src/parsing/operations/where.py +0 -43
- package/flowquery-py/src/parsing/operations/with_op.py +0 -18
- package/flowquery-py/src/parsing/parser.py +0 -1384
- package/flowquery-py/src/parsing/parser_state.py +0 -26
- package/flowquery-py/src/parsing/token_to_node.py +0 -109
- package/flowquery-py/src/tokenization/__init__.py +0 -23
- package/flowquery-py/src/tokenization/keyword.py +0 -54
- package/flowquery-py/src/tokenization/operator.py +0 -29
- package/flowquery-py/src/tokenization/string_walker.py +0 -158
- package/flowquery-py/src/tokenization/symbol.py +0 -19
- package/flowquery-py/src/tokenization/token.py +0 -693
- package/flowquery-py/src/tokenization/token_mapper.py +0 -53
- package/flowquery-py/src/tokenization/token_type.py +0 -21
- package/flowquery-py/src/tokenization/tokenizer.py +0 -214
- package/flowquery-py/src/tokenization/trie.py +0 -125
- package/flowquery-py/src/utils/__init__.py +0 -6
- package/flowquery-py/src/utils/object_utils.py +0 -20
- package/flowquery-py/src/utils/string_utils.py +0 -113
- package/flowquery-py/tests/__init__.py +0 -1
- package/flowquery-py/tests/compute/__init__.py +0 -1
- package/flowquery-py/tests/compute/test_runner.py +0 -4902
- package/flowquery-py/tests/graph/__init__.py +0 -1
- package/flowquery-py/tests/graph/test_create.py +0 -56
- package/flowquery-py/tests/graph/test_data.py +0 -73
- package/flowquery-py/tests/graph/test_match.py +0 -40
- package/flowquery-py/tests/parsing/__init__.py +0 -1
- package/flowquery-py/tests/parsing/test_context.py +0 -34
- package/flowquery-py/tests/parsing/test_expression.py +0 -248
- package/flowquery-py/tests/parsing/test_parser.py +0 -1237
- package/flowquery-py/tests/test_extensibility.py +0 -611
- package/flowquery-py/tests/tokenization/__init__.py +0 -1
- package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
- package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
- package/flowquery-py/tests/tokenization/test_trie.py +0 -30
- package/flowquery-vscode/.vscode-test.mjs +0 -5
- package/flowquery-vscode/.vscodeignore +0 -13
- package/flowquery-vscode/LICENSE +0 -21
- package/flowquery-vscode/README.md +0 -11
- package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
- package/flowquery-vscode/eslint.config.mjs +0 -25
- package/flowquery-vscode/extension.js +0 -508
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
- package/flowquery-vscode/flowquery-worker.js +0 -66
- package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
- package/flowquery-vscode/jsconfig.json +0 -13
- package/flowquery-vscode/libs/page.css +0 -53
- package/flowquery-vscode/libs/table.css +0 -13
- package/flowquery-vscode/libs/tabs.css +0 -66
- package/flowquery-vscode/package-lock.json +0 -2917
- package/flowquery-vscode/package.json +0 -51
- package/flowquery-vscode/test/extension.test.js +0 -196
- package/flowquery-vscode/test/worker.test.js +0 -25
- package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
- package/jest.config.js +0 -14
- package/misc/apps/RAG/README.md +0 -29
- package/misc/apps/RAG/data/chats.json +0 -302
- package/misc/apps/RAG/data/emails.json +0 -182
- package/misc/apps/RAG/data/events.json +0 -226
- package/misc/apps/RAG/data/files.json +0 -172
- package/misc/apps/RAG/data/users.json +0 -158
- package/misc/apps/RAG/jest.config.js +0 -21
- package/misc/apps/RAG/package.json +0 -48
- package/misc/apps/RAG/public/index.html +0 -18
- package/misc/apps/RAG/src/App.css +0 -42
- package/misc/apps/RAG/src/App.tsx +0 -50
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
- package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
- package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
- package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
- package/misc/apps/RAG/src/components/ChatInput.css +0 -23
- package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
- package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
- package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
- package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
- package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
- package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
- package/misc/apps/RAG/src/components/index.ts +0 -28
- package/misc/apps/RAG/src/graph/index.ts +0 -19
- package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
- package/misc/apps/RAG/src/index.tsx +0 -29
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
- package/misc/apps/RAG/src/prompts/index.ts +0 -10
- package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
- package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
- package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
- package/misc/apps/RAG/src/utils/Llm.ts +0 -248
- package/misc/apps/RAG/src/utils/index.ts +0 -12
- package/misc/apps/RAG/tsconfig.json +0 -22
- package/misc/apps/RAG/webpack.config.js +0 -43
- package/misc/apps/README.md +0 -1
- package/misc/queries/analyze_catfacts.cql +0 -75
- package/misc/queries/azure_openai_completions.cql +0 -13
- package/misc/queries/azure_openai_models.cql +0 -9
- package/misc/queries/mock_pipeline.cql +0 -84
- package/misc/queries/openai_completions.cql +0 -15
- package/misc/queries/openai_models.cql +0 -13
- package/misc/queries/test.cql +0 -6
- package/misc/queries/tool_inference.cql +0 -24
- package/misc/queries/wisdom.cql +0 -6
- package/misc/queries/wisdom_letter_histogram.cql +0 -8
- package/src/compute/flowquery.ts +0 -46
- package/src/compute/runner.ts +0 -66
- package/src/extensibility.ts +0 -45
- package/src/graph/data.ts +0 -130
- package/src/graph/database.ts +0 -143
- package/src/graph/hops.ts +0 -22
- package/src/graph/node.ts +0 -122
- package/src/graph/node_data.ts +0 -18
- package/src/graph/node_reference.ts +0 -38
- package/src/graph/pattern.ts +0 -110
- package/src/graph/pattern_expression.ts +0 -48
- package/src/graph/patterns.ts +0 -36
- package/src/graph/physical_node.ts +0 -23
- package/src/graph/physical_relationship.ts +0 -23
- package/src/graph/relationship.ts +0 -167
- package/src/graph/relationship_data.ts +0 -31
- package/src/graph/relationship_match_collector.ts +0 -64
- package/src/graph/relationship_reference.ts +0 -25
- package/src/index.browser.ts +0 -46
- package/src/index.node.ts +0 -55
- package/src/index.ts +0 -12
- package/src/io/command_line.ts +0 -74
- package/src/parsing/alias.ts +0 -23
- package/src/parsing/alias_option.ts +0 -5
- package/src/parsing/ast_node.ts +0 -153
- package/src/parsing/base_parser.ts +0 -98
- package/src/parsing/components/csv.ts +0 -9
- package/src/parsing/components/from.ts +0 -12
- package/src/parsing/components/headers.ts +0 -12
- package/src/parsing/components/json.ts +0 -9
- package/src/parsing/components/null.ts +0 -9
- package/src/parsing/components/post.ts +0 -9
- package/src/parsing/components/text.ts +0 -9
- package/src/parsing/context.ts +0 -54
- package/src/parsing/data_structures/associative_array.ts +0 -43
- package/src/parsing/data_structures/json_array.ts +0 -31
- package/src/parsing/data_structures/key_value_pair.ts +0 -37
- package/src/parsing/data_structures/lookup.ts +0 -44
- package/src/parsing/data_structures/range_lookup.ts +0 -36
- package/src/parsing/expressions/boolean.ts +0 -21
- package/src/parsing/expressions/expression.ts +0 -150
- package/src/parsing/expressions/expression_map.ts +0 -22
- package/src/parsing/expressions/f_string.ts +0 -26
- package/src/parsing/expressions/identifier.ts +0 -22
- package/src/parsing/expressions/number.ts +0 -40
- package/src/parsing/expressions/operator.ts +0 -354
- package/src/parsing/expressions/reference.ts +0 -45
- package/src/parsing/expressions/string.ts +0 -34
- package/src/parsing/functions/aggregate_function.ts +0 -58
- package/src/parsing/functions/async_function.ts +0 -64
- package/src/parsing/functions/avg.ts +0 -47
- package/src/parsing/functions/coalesce.ts +0 -49
- package/src/parsing/functions/collect.ts +0 -54
- package/src/parsing/functions/count.ts +0 -54
- package/src/parsing/functions/date.ts +0 -63
- package/src/parsing/functions/datetime.ts +0 -63
- package/src/parsing/functions/duration.ts +0 -143
- package/src/parsing/functions/element_id.ts +0 -51
- package/src/parsing/functions/function.ts +0 -60
- package/src/parsing/functions/function_factory.ts +0 -195
- package/src/parsing/functions/function_metadata.ts +0 -217
- package/src/parsing/functions/functions.ts +0 -70
- package/src/parsing/functions/head.ts +0 -42
- package/src/parsing/functions/id.ts +0 -51
- package/src/parsing/functions/join.ts +0 -40
- package/src/parsing/functions/keys.ts +0 -29
- package/src/parsing/functions/last.ts +0 -42
- package/src/parsing/functions/localdatetime.ts +0 -63
- package/src/parsing/functions/localtime.ts +0 -58
- package/src/parsing/functions/max.ts +0 -37
- package/src/parsing/functions/min.ts +0 -37
- package/src/parsing/functions/nodes.ts +0 -54
- package/src/parsing/functions/predicate_function.ts +0 -48
- package/src/parsing/functions/predicate_sum.ts +0 -47
- package/src/parsing/functions/properties.ts +0 -56
- package/src/parsing/functions/rand.ts +0 -21
- package/src/parsing/functions/range.ts +0 -37
- package/src/parsing/functions/reducer_element.ts +0 -10
- package/src/parsing/functions/relationships.ts +0 -52
- package/src/parsing/functions/replace.ts +0 -38
- package/src/parsing/functions/round.ts +0 -28
- package/src/parsing/functions/schema.ts +0 -39
- package/src/parsing/functions/size.ts +0 -28
- package/src/parsing/functions/split.ts +0 -45
- package/src/parsing/functions/string_distance.ts +0 -83
- package/src/parsing/functions/stringify.ts +0 -37
- package/src/parsing/functions/substring.ts +0 -68
- package/src/parsing/functions/sum.ts +0 -41
- package/src/parsing/functions/tail.ts +0 -39
- package/src/parsing/functions/temporal_utils.ts +0 -180
- package/src/parsing/functions/time.ts +0 -58
- package/src/parsing/functions/timestamp.ts +0 -37
- package/src/parsing/functions/to_float.ts +0 -50
- package/src/parsing/functions/to_integer.ts +0 -50
- package/src/parsing/functions/to_json.ts +0 -28
- package/src/parsing/functions/to_lower.ts +0 -28
- package/src/parsing/functions/to_string.ts +0 -32
- package/src/parsing/functions/trim.ts +0 -28
- package/src/parsing/functions/type.ts +0 -39
- package/src/parsing/functions/value_holder.ts +0 -13
- package/src/parsing/logic/case.ts +0 -26
- package/src/parsing/logic/else.ts +0 -12
- package/src/parsing/logic/end.ts +0 -9
- package/src/parsing/logic/then.ts +0 -12
- package/src/parsing/logic/when.ts +0 -12
- package/src/parsing/operations/aggregated_return.ts +0 -22
- package/src/parsing/operations/aggregated_with.ts +0 -18
- package/src/parsing/operations/call.ts +0 -69
- package/src/parsing/operations/create_node.ts +0 -39
- package/src/parsing/operations/create_relationship.ts +0 -38
- package/src/parsing/operations/delete_node.ts +0 -33
- package/src/parsing/operations/delete_relationship.ts +0 -32
- package/src/parsing/operations/group_by.ts +0 -137
- package/src/parsing/operations/limit.ts +0 -31
- package/src/parsing/operations/load.ts +0 -146
- package/src/parsing/operations/match.ts +0 -54
- package/src/parsing/operations/operation.ts +0 -69
- package/src/parsing/operations/order_by.ts +0 -126
- package/src/parsing/operations/projection.ts +0 -18
- package/src/parsing/operations/return.ts +0 -76
- package/src/parsing/operations/union.ts +0 -114
- package/src/parsing/operations/union_all.ts +0 -16
- package/src/parsing/operations/unwind.ts +0 -36
- package/src/parsing/operations/where.ts +0 -42
- package/src/parsing/operations/with.ts +0 -20
- package/src/parsing/parser.ts +0 -1641
- package/src/parsing/parser_state.ts +0 -25
- package/src/parsing/token_to_node.ts +0 -114
- package/src/tokenization/keyword.ts +0 -50
- package/src/tokenization/operator.ts +0 -25
- package/src/tokenization/string_walker.ts +0 -197
- package/src/tokenization/symbol.ts +0 -15
- package/src/tokenization/token.ts +0 -764
- package/src/tokenization/token_mapper.ts +0 -53
- package/src/tokenization/token_type.ts +0 -16
- package/src/tokenization/tokenizer.ts +0 -250
- package/src/tokenization/trie.ts +0 -117
- package/src/utils/object_utils.ts +0 -17
- package/src/utils/string_utils.ts +0 -114
- package/tests/compute/runner.test.ts +0 -4559
- package/tests/extensibility.test.ts +0 -643
- package/tests/graph/create.test.ts +0 -36
- package/tests/graph/data.test.ts +0 -58
- package/tests/graph/match.test.ts +0 -29
- package/tests/parsing/context.test.ts +0 -27
- package/tests/parsing/expression.test.ts +0 -303
- package/tests/parsing/parser.test.ts +0 -1327
- package/tests/tokenization/token_mapper.test.ts +0 -47
- package/tests/tokenization/tokenizer.test.ts +0 -191
- package/tests/tokenization/trie.test.ts +0 -20
- package/tsconfig.json +0 -19
- package/typedoc.json +0 -16
- package/vscode-settings.json.recommended +0 -16
- 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
|
-
}
|