dtSpark 1.1.0a6__tar.gz → 1.1.0a7__tar.gz
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.
- {dtspark-1.1.0a6/src/dtSpark.egg-info → dtspark-1.1.0a7}/PKG-INFO +2 -2
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/pyproject.toml +1 -1
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/setup.py +1 -1
- dtspark-1.1.0a7/src/dtSpark/_version.txt +1 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/cli_interface.py +8 -6
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/core/application.py +2 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/resources/config.yaml.template +1 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/conversations.py +7 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/server.py +5 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/base.html +2 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/conversations.html +4 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/main_menu.html +2 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7/src/dtSpark.egg-info}/PKG-INFO +2 -2
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/requires.txt +1 -1
- dtspark-1.1.0a6/src/dtSpark/_version.txt +0 -1
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/LICENSE +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/MANIFEST.in +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/README.md +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/setup.cfg +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/_description.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/_full_name.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/_licence.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/_metadata.yaml +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/_name.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/aws/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/aws/authentication.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/aws/bedrock.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/aws/costs.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/aws/pricing.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/conversation_manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/core/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/core/context_compaction.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/__main__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/action_monitor.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/daemon_app.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/daemon_manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/execution_coordinator.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/daemon/pid_file.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/autonomous_actions.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/backends.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/connection.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/conversations.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/credential_prompt.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/files.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/mcp_ops.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/messages.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/schema.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/tool_permissions.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/database/usage.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/files/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/files/manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/launch.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/limits/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/limits/costs.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/limits/tokens.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/anthropic_direct.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/base.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/context_limits.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/llm/ollama.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/mcp_integration/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/mcp_integration/manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/mcp_integration/tool_selector.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/safety/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/safety/llm_service.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/safety/patterns.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/safety/prompt_inspector.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/safety/violation_logger.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/scheduler/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/scheduler/creation_tools.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/scheduler/execution_queue.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/scheduler/executor.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/scheduler/manager.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/tools/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/tools/builtin.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/auth.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/dependencies.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/__init__.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/autonomous_actions.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/chat.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/main_menu.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/endpoints/streaming.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/session.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/ssl_utils.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/static/css/dark-theme.css +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/static/js/actions.js +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/static/js/chat.js +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/static/js/main.js +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/static/js/sse-client.js +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/actions.html +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/chat.html +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/goodbye.html +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/login.html +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/templates/new_conversation.html +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark/web/web_interface.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/SOURCES.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/dependency_links.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/entry_points.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/not-zip-safe +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/src/dtSpark.egg-info/top_level.txt +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/README.md +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/debug_bulk_api.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/diagnose_aws_costs.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_builtin_tools.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_builtin_tools_integration.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_bulk_pricing.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_document_archive_tools.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_filesystem_tools.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_mcp_server.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_ollama_context.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_ollama_conversation.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_ollama_integration.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_pricing_integration.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_prompt_inspection.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_status_indicator.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_tool_selector.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_web_auth.py +0 -0
- {dtspark-1.1.0a6 → dtspark-1.1.0a7}/tests/test_web_session.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dtSpark
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.0a7
|
|
4
4
|
Summary: Secure Personal AI Research Kit - Multi-provider LLM CLI/Web interface with MCP tool integration
|
|
5
5
|
Home-page: https://github.com/digital-thought/dtSpark
|
|
6
6
|
Author: Matthew Westwood-Hill
|
|
@@ -42,7 +42,7 @@ Requires-Dist: httpx>=0.24.0
|
|
|
42
42
|
Requires-Dist: aiohttp>=3.8.0
|
|
43
43
|
Requires-Dist: mcp>=0.9.0
|
|
44
44
|
Requires-Dist: pyyaml>=6.0
|
|
45
|
-
Requires-Dist: dtPyAppFramework>=4.1
|
|
45
|
+
Requires-Dist: dtPyAppFramework>=4.2.1
|
|
46
46
|
Requires-Dist: tiktoken>=0.5.0
|
|
47
47
|
Requires-Dist: ollama>=0.2.0
|
|
48
48
|
Requires-Dist: cryptography>=41.0.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.1.0a7
|
|
@@ -233,6 +233,7 @@ class CLIInterface:
|
|
|
233
233
|
self.model_changing_enabled = True # Can be disabled if model is locked via config
|
|
234
234
|
self.cost_tracking_enabled = False # Can be enabled via config
|
|
235
235
|
self.actions_enabled = False # Can be enabled via autonomous_actions.enabled config
|
|
236
|
+
self.new_conversations_allowed = True # Can be disabled via predefined_conversations.allow_new_conversations
|
|
236
237
|
self._active_status_indicator = None # Track active status indicator for pause/resume
|
|
237
238
|
|
|
238
239
|
def print_splash_screen(self, full_name: str, description: str, version: str): # noqa: S1172
|
|
@@ -383,12 +384,13 @@ class CLIInterface:
|
|
|
383
384
|
choice_map[str(option_num)] = 'costs'
|
|
384
385
|
option_num += 1
|
|
385
386
|
|
|
386
|
-
# Start New Conversation
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
387
|
+
# Start New Conversation (only when new conversations are allowed)
|
|
388
|
+
if self.new_conversations_allowed:
|
|
389
|
+
menu_content.append(" ", style="")
|
|
390
|
+
menu_content.append(str(option_num), style="cyan")
|
|
391
|
+
menu_content.append(". Start New Conversation\n", style="")
|
|
392
|
+
choice_map[str(option_num)] = 'new'
|
|
393
|
+
option_num += 1
|
|
392
394
|
|
|
393
395
|
# List and Select Conversation
|
|
394
396
|
menu_content.append(" ", style="")
|
|
@@ -386,6 +386,7 @@ class AWSBedrockCLI(AbstractApp):
|
|
|
386
386
|
cost_tracking_enabled = self.settings.get(_SETTING_COST_TRACKING, False)
|
|
387
387
|
self.cli.cost_tracking_enabled = cost_tracking_enabled
|
|
388
388
|
self.cli.actions_enabled = self._get_nested_setting('autonomous_actions.enabled', False)
|
|
389
|
+
self.cli.new_conversations_allowed = self._get_nested_setting('predefined_conversations.allow_new_conversations', True)
|
|
389
390
|
|
|
390
391
|
progress.update(task_config, advance=100)
|
|
391
392
|
|
|
@@ -809,6 +810,7 @@ class AWSBedrockCLI(AbstractApp):
|
|
|
809
810
|
|
|
810
811
|
# Task 7: Initialise autonomous action scheduler (if enabled)
|
|
811
812
|
self.actions_enabled = self._get_nested_setting('autonomous_actions.enabled', False)
|
|
813
|
+
self.new_conversations_allowed = self._get_nested_setting('predefined_conversations.allow_new_conversations', True)
|
|
812
814
|
task_scheduler = progress.add_task("[cyan]Initialising action scheduler...", total=100)
|
|
813
815
|
|
|
814
816
|
if not self.actions_enabled:
|
|
@@ -420,6 +420,7 @@ aws_comprehend:
|
|
|
420
420
|
#
|
|
421
421
|
predefined_conversations:
|
|
422
422
|
enabled: false # Set to true to enable predefined conversations
|
|
423
|
+
allow_new_conversations: true # Set to false to restrict users to predefined/existing conversations only
|
|
423
424
|
|
|
424
425
|
conversations:
|
|
425
426
|
# Example 1: Code Review Assistant with inline instructions
|
|
@@ -177,6 +177,13 @@ async def create_conversation(
|
|
|
177
177
|
ConversationDetail for the created conversation
|
|
178
178
|
"""
|
|
179
179
|
try:
|
|
180
|
+
# Check if new conversations are allowed
|
|
181
|
+
if not getattr(request.app.state, 'new_conversations_allowed', True):
|
|
182
|
+
raise HTTPException(
|
|
183
|
+
status_code=403,
|
|
184
|
+
detail="Creating new conversations is disabled by configuration"
|
|
185
|
+
)
|
|
186
|
+
|
|
180
187
|
app_instance = request.app.state.app_instance
|
|
181
188
|
database = app_instance.database
|
|
182
189
|
conversation_manager = app_instance.conversation_manager
|
|
@@ -305,6 +305,7 @@ def create_app(
|
|
|
305
305
|
|
|
306
306
|
# Determine feature flags from app instance
|
|
307
307
|
actions_enabled = getattr(app_instance, 'actions_enabled', False)
|
|
308
|
+
new_conversations_allowed = getattr(app_instance, 'new_conversations_allowed', True)
|
|
308
309
|
|
|
309
310
|
# Read heartbeat configuration
|
|
310
311
|
from dtPyAppFramework.settings import Settings as _Settings
|
|
@@ -319,6 +320,7 @@ def create_app(
|
|
|
319
320
|
templates.env.globals['app_description'] = description()
|
|
320
321
|
templates.env.globals['agent_name'] = agent_name()
|
|
321
322
|
templates.env.globals['actions_enabled'] = actions_enabled
|
|
323
|
+
templates.env.globals['new_conversations_allowed'] = new_conversations_allowed
|
|
322
324
|
templates.env.globals['heartbeat_enabled'] = heartbeat_enabled
|
|
323
325
|
templates.env.globals['heartbeat_interval_ms'] = heartbeat_interval * 1000
|
|
324
326
|
|
|
@@ -332,6 +334,7 @@ def create_app(
|
|
|
332
334
|
app.state.templates = templates
|
|
333
335
|
app.state.dark_theme = dark_theme
|
|
334
336
|
app.state.cost_tracking_enabled = cost_tracking_enabled
|
|
337
|
+
app.state.new_conversations_allowed = new_conversations_allowed
|
|
335
338
|
|
|
336
339
|
# Session dependency
|
|
337
340
|
async def get_session(session_id: Optional[str] = Cookie(default=None)) -> str:
|
|
@@ -538,6 +541,8 @@ def create_app(
|
|
|
538
541
|
@app.get("/conversations/new", response_class=HTMLResponse)
|
|
539
542
|
async def new_conversation_page(request: Request, session_id: str = Depends(get_session)):
|
|
540
543
|
"""Display new conversation creation page."""
|
|
544
|
+
if not new_conversations_allowed:
|
|
545
|
+
return RedirectResponse(url="/conversations", status_code=303)
|
|
541
546
|
return templates.TemplateResponse(
|
|
542
547
|
"new_conversation.html",
|
|
543
548
|
{
|
|
@@ -48,11 +48,13 @@
|
|
|
48
48
|
<i class="bi bi-list-ul"></i> Conversations
|
|
49
49
|
</a>
|
|
50
50
|
</li>
|
|
51
|
+
{% if new_conversations_allowed %}
|
|
51
52
|
<li class="nav-item">
|
|
52
53
|
<a class="nav-link" href="/conversations/new">
|
|
53
54
|
<i class="bi bi-plus-circle"></i> New
|
|
54
55
|
</a>
|
|
55
56
|
</li>
|
|
57
|
+
{% endif %}
|
|
56
58
|
{% if actions_enabled %}
|
|
57
59
|
<li class="nav-item">
|
|
58
60
|
<a class="nav-link" href="/actions">
|
|
@@ -19,9 +19,11 @@
|
|
|
19
19
|
<div class="col-12">
|
|
20
20
|
<h2 class="mb-4">
|
|
21
21
|
<i class="bi bi-list-ul"></i> Conversations
|
|
22
|
+
{% if new_conversations_allowed %}
|
|
22
23
|
<button class="btn btn-primary float-end" onclick="showNewConversationModal()">
|
|
23
24
|
<i class="bi bi-plus-circle-fill"></i> New Conversation
|
|
24
25
|
</button>
|
|
26
|
+
{% endif %}
|
|
25
27
|
</h2>
|
|
26
28
|
</div>
|
|
27
29
|
</div>
|
|
@@ -69,6 +71,7 @@
|
|
|
69
71
|
</div>
|
|
70
72
|
</div>
|
|
71
73
|
|
|
74
|
+
{% if new_conversations_allowed %}
|
|
72
75
|
<!-- New Conversation Modal -->
|
|
73
76
|
<div class="modal fade" id="newConversationModal" tabindex="-1">
|
|
74
77
|
<div class="modal-dialog modal-lg">
|
|
@@ -141,6 +144,7 @@
|
|
|
141
144
|
</div>
|
|
142
145
|
</div>
|
|
143
146
|
</div>
|
|
147
|
+
{% endif %}
|
|
144
148
|
{% endblock %}
|
|
145
149
|
|
|
146
150
|
{% block extra_scripts %}
|
|
@@ -239,9 +239,11 @@
|
|
|
239
239
|
<div class="col-12">
|
|
240
240
|
<h5 class="mb-3"><i class="bi bi-lightning-fill"></i> Quick Actions</h5>
|
|
241
241
|
<div class="d-grid gap-3 d-md-flex">
|
|
242
|
+
{% if new_conversations_allowed %}
|
|
242
243
|
<a href="/conversations/new" class="btn btn-primary quick-action-btn flex-fill">
|
|
243
244
|
<i class="bi bi-plus-circle-fill"></i> Start New Conversation
|
|
244
245
|
</a>
|
|
246
|
+
{% endif %}
|
|
245
247
|
<a href="/conversations" class="btn btn-outline-primary quick-action-btn flex-fill">
|
|
246
248
|
<i class="bi bi-list-ul"></i> View Conversations
|
|
247
249
|
</a>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dtSpark
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.0a7
|
|
4
4
|
Summary: Secure Personal AI Research Kit - Multi-provider LLM CLI/Web interface with MCP tool integration
|
|
5
5
|
Home-page: https://github.com/digital-thought/dtSpark
|
|
6
6
|
Author: Matthew Westwood-Hill
|
|
@@ -42,7 +42,7 @@ Requires-Dist: httpx>=0.24.0
|
|
|
42
42
|
Requires-Dist: aiohttp>=3.8.0
|
|
43
43
|
Requires-Dist: mcp>=0.9.0
|
|
44
44
|
Requires-Dist: pyyaml>=6.0
|
|
45
|
-
Requires-Dist: dtPyAppFramework>=4.1
|
|
45
|
+
Requires-Dist: dtPyAppFramework>=4.2.1
|
|
46
46
|
Requires-Dist: tiktoken>=0.5.0
|
|
47
47
|
Requires-Dist: ollama>=0.2.0
|
|
48
48
|
Requires-Dist: cryptography>=41.0.0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1.1.0a6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|