dtSpark 1.0.8__tar.gz → 1.0.9__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.
Files changed (122) hide show
  1. {dtspark-1.0.8 → dtspark-1.0.9}/PKG-INFO +1 -1
  2. dtspark-1.0.9/src/dtSpark/_version.txt +1 -0
  3. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/core/application.py +48 -47
  4. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/PKG-INFO +1 -1
  5. dtspark-1.0.8/src/dtSpark/_version.txt +0 -1
  6. {dtspark-1.0.8 → dtspark-1.0.9}/LICENSE +0 -0
  7. {dtspark-1.0.8 → dtspark-1.0.9}/MANIFEST.in +0 -0
  8. {dtspark-1.0.8 → dtspark-1.0.9}/README.md +0 -0
  9. {dtspark-1.0.8 → dtspark-1.0.9}/pyproject.toml +0 -0
  10. {dtspark-1.0.8 → dtspark-1.0.9}/setup.cfg +0 -0
  11. {dtspark-1.0.8 → dtspark-1.0.9}/setup.py +0 -0
  12. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/__init__.py +0 -0
  13. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/_description.txt +0 -0
  14. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/_full_name.txt +0 -0
  15. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/_licence.txt +0 -0
  16. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/_metadata.yaml +0 -0
  17. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/_name.txt +0 -0
  18. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/aws/__init__.py +0 -0
  19. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/aws/authentication.py +0 -0
  20. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/aws/bedrock.py +0 -0
  21. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/aws/costs.py +0 -0
  22. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/aws/pricing.py +0 -0
  23. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/cli_interface.py +0 -0
  24. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/conversation_manager.py +0 -0
  25. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/core/__init__.py +0 -0
  26. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/core/context_compaction.py +0 -0
  27. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/__init__.py +0 -0
  28. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/__main__.py +0 -0
  29. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/action_monitor.py +0 -0
  30. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/daemon_app.py +0 -0
  31. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/daemon_manager.py +0 -0
  32. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/execution_coordinator.py +0 -0
  33. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/daemon/pid_file.py +0 -0
  34. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/__init__.py +0 -0
  35. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/autonomous_actions.py +0 -0
  36. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/backends.py +0 -0
  37. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/connection.py +0 -0
  38. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/conversations.py +0 -0
  39. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/credential_prompt.py +0 -0
  40. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/files.py +0 -0
  41. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/mcp_ops.py +0 -0
  42. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/messages.py +0 -0
  43. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/schema.py +0 -0
  44. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/tool_permissions.py +0 -0
  45. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/database/usage.py +0 -0
  46. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/files/__init__.py +0 -0
  47. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/files/manager.py +0 -0
  48. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/launch.py +0 -0
  49. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/limits/__init__.py +0 -0
  50. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/limits/costs.py +0 -0
  51. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/limits/tokens.py +0 -0
  52. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/__init__.py +0 -0
  53. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/anthropic_direct.py +0 -0
  54. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/base.py +0 -0
  55. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/context_limits.py +0 -0
  56. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/manager.py +0 -0
  57. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/llm/ollama.py +0 -0
  58. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/mcp_integration/__init__.py +0 -0
  59. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/mcp_integration/manager.py +0 -0
  60. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/mcp_integration/tool_selector.py +0 -0
  61. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/resources/config.yaml.template +0 -0
  62. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/safety/__init__.py +0 -0
  63. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/safety/llm_service.py +0 -0
  64. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/safety/patterns.py +0 -0
  65. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/safety/prompt_inspector.py +0 -0
  66. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/safety/violation_logger.py +0 -0
  67. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/scheduler/__init__.py +0 -0
  68. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/scheduler/creation_tools.py +0 -0
  69. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/scheduler/execution_queue.py +0 -0
  70. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/scheduler/executor.py +0 -0
  71. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/scheduler/manager.py +0 -0
  72. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/tools/__init__.py +0 -0
  73. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/tools/builtin.py +0 -0
  74. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/__init__.py +0 -0
  75. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/auth.py +0 -0
  76. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/dependencies.py +0 -0
  77. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/__init__.py +0 -0
  78. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/autonomous_actions.py +0 -0
  79. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/chat.py +0 -0
  80. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/conversations.py +0 -0
  81. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/main_menu.py +0 -0
  82. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/endpoints/streaming.py +0 -0
  83. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/server.py +0 -0
  84. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/session.py +0 -0
  85. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/ssl_utils.py +0 -0
  86. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/static/css/dark-theme.css +0 -0
  87. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/static/js/actions.js +0 -0
  88. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/static/js/chat.js +0 -0
  89. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/static/js/main.js +0 -0
  90. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/static/js/sse-client.js +0 -0
  91. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/actions.html +0 -0
  92. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/base.html +0 -0
  93. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/chat.html +0 -0
  94. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/conversations.html +0 -0
  95. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/goodbye.html +0 -0
  96. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/login.html +0 -0
  97. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/main_menu.html +0 -0
  98. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/templates/new_conversation.html +0 -0
  99. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark/web/web_interface.py +0 -0
  100. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/SOURCES.txt +0 -0
  101. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/dependency_links.txt +0 -0
  102. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/entry_points.txt +0 -0
  103. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/not-zip-safe +0 -0
  104. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/requires.txt +0 -0
  105. {dtspark-1.0.8 → dtspark-1.0.9}/src/dtSpark.egg-info/top_level.txt +0 -0
  106. {dtspark-1.0.8 → dtspark-1.0.9}/tests/README.md +0 -0
  107. {dtspark-1.0.8 → dtspark-1.0.9}/tests/debug_bulk_api.py +0 -0
  108. {dtspark-1.0.8 → dtspark-1.0.9}/tests/diagnose_aws_costs.py +0 -0
  109. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_builtin_tools.py +0 -0
  110. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_builtin_tools_integration.py +0 -0
  111. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_bulk_pricing.py +0 -0
  112. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_filesystem_tools.py +0 -0
  113. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_mcp_server.py +0 -0
  114. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_ollama_context.py +0 -0
  115. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_ollama_conversation.py +0 -0
  116. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_ollama_integration.py +0 -0
  117. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_pricing_integration.py +0 -0
  118. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_prompt_inspection.py +0 -0
  119. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_status_indicator.py +0 -0
  120. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_tool_selector.py +0 -0
  121. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_web_auth.py +0 -0
  122. {dtspark-1.0.8 → dtspark-1.0.9}/tests/test_web_session.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtSpark
3
- Version: 1.0.8
3
+ Version: 1.0.9
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
@@ -0,0 +1 @@
1
+ 1.0.9
@@ -124,6 +124,7 @@ class AWSBedrockCLI(AbstractApp):
124
124
  if value is not None:
125
125
  return value
126
126
 
127
+
127
128
  # Fallback: Navigate the dict manually
128
129
  parts = key.split('.')
129
130
  if len(parts) > 1:
@@ -1258,10 +1259,6 @@ class AWSBedrockCLI(AbstractApp):
1258
1259
  from dtSpark.cli_interface import CLIInterface
1259
1260
  cli = CLIInterface()
1260
1261
 
1261
- # Initialize secrets manager for storing sensitive credentials
1262
- from dtPyAppFramework.settings import Settings
1263
- secret_manager = Settings().secret_manager
1264
-
1265
1262
  # Display SPARK splash screen
1266
1263
  cli.print_splash_screen(
1267
1264
  full_name=full_name(),
@@ -1283,10 +1280,23 @@ class AWSBedrockCLI(AbstractApp):
1283
1280
  ))
1284
1281
  cli.console.print()
1285
1282
 
1286
- # Destination: user data directory
1287
- user_data_path = ApplicationPaths().usr_data_root_path
1288
- dest_config_dir = os.path.join(user_data_path, 'config')
1283
+ # Destination: depends on CONTAINER_MODE environment variable
1284
+ container_mode = os.environ.get('CONTAINER_MODE', '').lower() == 'true'
1285
+ if container_mode:
1286
+ # Container mode: use working directory
1287
+ dest_config_dir = os.path.join(os.getcwd(), 'config')
1288
+ secrets_dir = os.getcwd()
1289
+ else:
1290
+ # Normal mode: use user data directory
1291
+ user_data_path = ApplicationPaths().usr_data_root_path
1292
+ dest_config_dir = os.path.join(user_data_path, 'config')
1293
+ secrets_dir = user_data_path
1294
+
1289
1295
  dest_config = os.path.join(dest_config_dir, 'config.yaml')
1296
+ secrets_file = os.path.join(secrets_dir, 'secrets.yaml')
1297
+
1298
+ # Collection for secrets to be written to secrets.yaml
1299
+ secrets_to_store = []
1290
1300
 
1291
1301
  cli.print_info(f"Configuration will be created at: {dest_config}")
1292
1302
  cli.console.print()
@@ -1398,7 +1408,7 @@ class AWSBedrockCLI(AbstractApp):
1398
1408
  )
1399
1409
 
1400
1410
  cli.console.print()
1401
- cli.console.print("[dim]AWS Credentials (stored securely in secrets manager):[/dim]")
1411
+ cli.console.print("[dim]AWS Credentials (will be stored in secrets.yaml for secure ingestion):[/dim]")
1402
1412
 
1403
1413
  # Access Key ID (not typically considered secret, but mask anyway for consistency)
1404
1414
  aws_access_key_id_input = Prompt.ask(
@@ -1406,9 +1416,8 @@ class AWSBedrockCLI(AbstractApp):
1406
1416
  default=""
1407
1417
  )
1408
1418
  if aws_access_key_id_input:
1409
- secret_manager.set_secret("aws_access_key_id", aws_access_key_id_input)
1419
+ secrets_to_store.append({"name": "aws_access_key_id", "value": aws_access_key_id_input})
1410
1420
  aws_access_key_id = "SEC/aws_access_key_id"
1411
- cli.print_success("✓ AWS access key ID securely stored in secrets manager")
1412
1421
 
1413
1422
  # Secret Access Key (sensitive - mask input)
1414
1423
  aws_secret_access_key_input = Prompt.ask(
@@ -1417,9 +1426,8 @@ class AWSBedrockCLI(AbstractApp):
1417
1426
  password=True
1418
1427
  )
1419
1428
  if aws_secret_access_key_input:
1420
- secret_manager.set_secret("aws_secret_access_key", aws_secret_access_key_input)
1429
+ secrets_to_store.append({"name": "aws_secret_access_key", "value": aws_secret_access_key_input})
1421
1430
  aws_secret_access_key = "SEC/aws_secret_access_key"
1422
- cli.print_success("✓ AWS secret access key securely stored in secrets manager")
1423
1431
 
1424
1432
  # Session Token (only for session auth)
1425
1433
  if aws_auth_method == "session":
@@ -1430,9 +1438,8 @@ class AWSBedrockCLI(AbstractApp):
1430
1438
  password=True
1431
1439
  )
1432
1440
  if aws_session_token_input:
1433
- secret_manager.set_secret("aws_session_token", aws_session_token_input)
1441
+ secrets_to_store.append({"name": "aws_session_token", "value": aws_session_token_input})
1434
1442
  aws_session_token = "SEC/aws_session_token"
1435
- cli.print_success("✓ AWS session token securely stored in secrets manager")
1436
1443
 
1437
1444
  cli.console.print()
1438
1445
  enable_cost_tracking = Confirm.ask(
@@ -1475,11 +1482,10 @@ class AWSBedrockCLI(AbstractApp):
1475
1482
  password=True
1476
1483
  )
1477
1484
 
1478
- # Store API key in secrets manager if provided
1485
+ # Store API key in secrets.yaml if provided
1479
1486
  if anthropic_api_key_input:
1480
- secret_manager.set_secret("anthropic_api_key", anthropic_api_key_input)
1487
+ secrets_to_store.append({"name": "anthropic_api_key", "value": anthropic_api_key_input})
1481
1488
  anthropic_api_key = "SEC/anthropic_api_key"
1482
- cli.print_success("✓ Anthropic API key securely stored in secrets manager")
1483
1489
  else:
1484
1490
  anthropic_api_key = ""
1485
1491
 
@@ -1538,23 +1544,21 @@ class AWSBedrockCLI(AbstractApp):
1538
1544
  cli.console.print("[dim]Leave username/password empty (null) to be prompted on startup (more secure)[/dim]")
1539
1545
  db_username_input = Prompt.ask("Database username (or press Enter for null)", default="")
1540
1546
 
1541
- # Store database username in secrets manager if provided
1547
+ # Store database username in secrets.yaml if provided
1542
1548
  if db_username_input:
1543
1549
  secret_key = f"db_{database_type}_username"
1544
- secret_manager.set_secret(secret_key, db_username_input)
1550
+ secrets_to_store.append({"name": secret_key, "value": db_username_input})
1545
1551
  db_username = f"SEC/{secret_key}"
1546
- cli.print_success(f"✓ Database username securely stored in secrets manager")
1547
1552
  else:
1548
1553
  db_username = "null"
1549
1554
 
1550
1555
  db_password_input = Prompt.ask("Database password (or press Enter for null)", default="", password=True)
1551
1556
 
1552
- # Store database password in secrets manager if provided
1557
+ # Store database password in secrets.yaml if provided
1553
1558
  if db_password_input:
1554
1559
  secret_key = f"db_{database_type}_password"
1555
- secret_manager.set_secret(secret_key, db_password_input)
1560
+ secrets_to_store.append({"name": secret_key, "value": db_password_input})
1556
1561
  db_password = f"SEC/{secret_key}"
1557
- cli.print_success(f"✓ Database password securely stored in secrets manager")
1558
1562
  else:
1559
1563
  db_password = "null"
1560
1564
 
@@ -2098,37 +2102,34 @@ class AWSBedrockCLI(AbstractApp):
2098
2102
  f.write(config_content)
2099
2103
 
2100
2104
  cli.console.print()
2101
- cli.print_success(f"✓ Configuration file created successfully!")
2105
+ cli.print_success("✓ Configuration file created successfully!")
2102
2106
  cli.console.print()
2103
2107
  cli.print_info(f"Location: {dest_config}")
2104
2108
  cli.console.print()
2105
2109
 
2106
- # Display summary of secrets stored
2107
- secrets_stored = []
2108
- if use_aws_bedrock and aws_auth_method in ["iam", "session"]:
2109
- if aws_access_key_id.startswith("SEC/"):
2110
- secrets_stored.append("• AWS access key ID")
2111
- if aws_secret_access_key.startswith("SEC/"):
2112
- secrets_stored.append("• AWS secret access key")
2113
- if aws_session_token.startswith("SEC/"):
2114
- secrets_stored.append("• AWS session token")
2115
- if use_anthropic and anthropic_api_key.startswith("SEC/"):
2116
- secrets_stored.append("• Anthropic API key")
2117
- if database_type != "sqlite":
2118
- if db_username.startswith("SEC/"):
2119
- secrets_stored.append(f"• {database_type.upper()} database username")
2120
- if db_password.startswith("SEC/"):
2121
- secrets_stored.append(f"• {database_type.upper()} database password")
2122
-
2123
- if secrets_stored:
2110
+ # Write secrets.yaml if there are secrets to store
2111
+ if secrets_to_store:
2112
+ import yaml
2113
+ secrets_yaml_content = {"secrets": secrets_to_store}
2114
+
2115
+ # Ensure secrets directory exists
2116
+ os.makedirs(secrets_dir, exist_ok=True)
2117
+
2118
+ with open(secrets_file, 'w', encoding='utf-8') as f:
2119
+ yaml.dump(secrets_yaml_content, f, default_flow_style=False, sort_keys=False)
2120
+
2124
2121
  cli.console.print()
2125
2122
  cli.print_separator("─")
2126
- cli.console.print("[bold green]Secrets Securely Stored:[/bold green]")
2127
- for secret in secrets_stored:
2128
- cli.console.print(f" {secret}")
2123
+ cli.console.print("[bold green]Secrets Written to secrets.yaml:[/bold green]")
2124
+ for secret in secrets_to_store:
2125
+ cli.console.print(f" {secret['name']}")
2126
+ cli.console.print()
2127
+ cli.print_info(f"Location: {secrets_file}")
2128
+ cli.console.print()
2129
+ cli.console.print("[dim]On next application startup, secrets will be automatically[/dim]")
2130
+ cli.console.print("[dim]ingested into the secrets manager and secrets.yaml will be deleted.[/dim]")
2129
2131
  cli.console.print()
2130
- cli.console.print("[dim]These credentials are stored in the secrets manager and[/dim]")
2131
- cli.console.print("[dim]referenced in config.yaml as SEC/<key_name> for security.[/dim]")
2132
+ cli.console.print("[dim]Secrets are referenced in config.yaml as SEC/<key_name>.[/dim]")
2132
2133
  cli.print_separator("─")
2133
2134
  cli.console.print()
2134
2135
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtSpark
3
- Version: 1.0.8
3
+ Version: 1.0.9
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
@@ -1 +0,0 @@
1
- 1.0.8
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