dtSpark 1.1.0a7__py3-none-any.whl → 1.1.0a10__py3-none-any.whl

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/_version.txt CHANGED
@@ -1 +1 @@
1
- 1.1.0a7
1
+ 1.1.0a10
@@ -21,7 +21,7 @@ class ToolSelector:
21
21
  'aws_infrastructure': ['ec2', 's3', 'lambda', 'cloudwatch', 'iam', 'vpc', 'rds', 'dynamodb', 'diagram'],
22
22
  'elasticsearch': ['elasticsearch', 'search', 'index', 'query', 'aggregation'],
23
23
  'ragstore': ['ragstore', 'rag', 'embedding', 'vector', 'semantic'],
24
- 'documents': ['word', 'excel', 'powerpoint', 'pdf', 'document', 'docx', 'xlsx', 'pptx', 'spreadsheet'],
24
+ 'documents': ['word', 'excel', 'powerpoint', 'pdf', 'docx', 'xlsx', 'pptx', 'spreadsheet'],
25
25
  'archives': ['archive', 'zip', 'tar', 'extract', 'compress', 'tgz'],
26
26
  }
27
27
 
@@ -38,8 +38,8 @@ class ToolSelector:
38
38
  'vpc', 'subnet', 'instance', 'bucket', 'function', 'diagram'],
39
39
  'elasticsearch': ['elasticsearch', 'search', 'query', 'index', 'log', 'aggregate'],
40
40
  'ragstore': ['ragstore', 'rag', 'embedding', 'semantic', 'vector', 'similarity'],
41
- 'documents': ['document', 'word', 'excel', 'powerpoint', 'pdf', 'docx', 'xlsx', 'pptx',
42
- 'spreadsheet', 'presentation', 'template', 'office'],
41
+ 'documents': ['word doc', 'excel', 'powerpoint', 'pdf', 'docx', 'xlsx', 'pptx',
42
+ 'spreadsheet', 'presentation', 'office'],
43
43
  'archives': ['archive', 'zip', 'tar', 'extract', 'unzip', 'compressed', 'tgz'],
44
44
  }
45
45
 
dtSpark/tools/builtin.py CHANGED
@@ -361,7 +361,11 @@ def _get_filesystem_tools(fs_config: Dict[str, Any]) -> List[Dict[str, Any]]:
361
361
  tools.extend([
362
362
  {
363
363
  "name": "write_file",
364
- "description": f"Write content to a file within the allowed path ({allowed_path}). "
364
+ "description": f"Write text content to a file within the allowed path ({allowed_path}). "
365
+ "Use this tool for creating or updating ANY text-based file including HTML, CSS, JavaScript, "
366
+ "JSON, YAML, XML, Python, Markdown, plain text, config files, and all other non-binary formats. "
367
+ "Do NOT use the Microsoft Office tools (create_word_document, create_excel_document, "
368
+ "create_powerpoint_document) for text-based file formats. "
365
369
  "Creates the file if it doesn't exist, or overwrites if it exists. "
366
370
  "Parent directories must already exist (use create_directories first if needed).",
367
371
  "input_schema": {
@@ -1037,8 +1041,11 @@ def _get_document_tools(doc_config: Dict[str, Any]) -> List[Dict[str, Any]]:
1037
1041
  {
1038
1042
  "name": "create_word_document",
1039
1043
  "description": f"Create a Microsoft Word document (.docx) within the allowed path ({allowed_path}). "
1040
- "Supports creating from scratch with structured content, or using a template with placeholder replacement. "
1041
- "When using a template, placeholders in the format {{{{placeholder_name}}}} will be replaced with provided values.",
1044
+ "ONLY use this tool when the user specifically requests a Word/.docx file. "
1045
+ "Do NOT use this for HTML, plain text, Markdown, or other text-based formats use write_file instead. "
1046
+ "CRITICAL: You MUST provide 'content' with 'title' and 'paragraphs' to create a document with actual content. "
1047
+ "If you only provide 'path' without 'content', the document will be EMPTY. "
1048
+ "Example: {{\"path\": \"doc.docx\", \"content\": {{\"title\": \"My Title\", \"paragraphs\": [{{\"text\": \"First paragraph\", \"style\": \"Normal\"}}]}}}}",
1042
1049
  "input_schema": {
1043
1050
  "type": "object",
1044
1051
  "properties": {
@@ -1048,29 +1055,31 @@ def _get_document_tools(doc_config: Dict[str, Any]) -> List[Dict[str, Any]]:
1048
1055
  },
1049
1056
  "content": {
1050
1057
  "type": "object",
1051
- "description": "Document content structure",
1058
+ "description": "REQUIRED to create a document with content. Without this, document will be empty.",
1052
1059
  "properties": {
1053
- "title": {"type": "string", "description": "Document title"},
1060
+ "title": {"type": "string", "description": "Document title displayed at top"},
1054
1061
  "paragraphs": {
1055
1062
  "type": "array",
1056
1063
  "items": {
1057
1064
  "type": "object",
1058
1065
  "properties": {
1059
- "text": {"type": "string"},
1060
- "style": {"type": "string", "description": "Style: Normal, Heading 1, Heading 2, Heading 3, Title"}
1061
- }
1066
+ "text": {"type": "string", "description": "The paragraph text"},
1067
+ "style": {"type": "string", "description": "Normal, Heading 1, Heading 2, Heading 3, or Title. Defaults to Normal."}
1068
+ },
1069
+ "required": ["text"]
1062
1070
  },
1063
- "description": "List of paragraphs with optional styles"
1071
+ "description": "Array of paragraphs with 'text' (required) and 'style' (optional)"
1064
1072
  }
1065
- }
1073
+ },
1074
+ "required": ["title", "paragraphs"]
1066
1075
  },
1067
1076
  "template_path": {
1068
1077
  "type": "string",
1069
- "description": "Path to a .docx template file. If provided, placeholders will be replaced."
1078
+ "description": "Alternative to 'content': path to a .docx template file with {{placeholder}} markers"
1070
1079
  },
1071
1080
  "placeholders": {
1072
1081
  "type": "object",
1073
- "description": "Dictionary of placeholder names to values for template replacement",
1082
+ "description": "Only with template_path: dictionary mapping placeholder names to replacement values",
1074
1083
  "additionalProperties": {"type": "string"}
1075
1084
  }
1076
1085
  },
@@ -1080,7 +1089,10 @@ def _get_document_tools(doc_config: Dict[str, Any]) -> List[Dict[str, Any]]:
1080
1089
  {
1081
1090
  "name": "create_excel_document",
1082
1091
  "description": f"Create a Microsoft Excel document (.xlsx) within the allowed path ({allowed_path}). "
1083
- "Creates spreadsheets from structured data. Supports multiple sheets.",
1092
+ "ONLY use this tool when the user specifically requests an Excel/.xlsx spreadsheet. "
1093
+ "Do NOT use this for CSV or other text-based tabular formats — use write_file instead. "
1094
+ "CRITICAL: You MUST provide 'sheets' array with sheet data. "
1095
+ "Example: {{\"path\": \"data.xlsx\", \"sheets\": [{{\"name\": \"Sheet1\", \"headers\": [\"Col1\", \"Col2\"], \"data\": [[\"A\", \"B\"]]}}]}}",
1084
1096
  "input_schema": {
1085
1097
  "type": "object",
1086
1098
  "properties": {
@@ -1112,7 +1124,10 @@ def _get_document_tools(doc_config: Dict[str, Any]) -> List[Dict[str, Any]]:
1112
1124
  {
1113
1125
  "name": "create_powerpoint_document",
1114
1126
  "description": f"Create a Microsoft PowerPoint document (.pptx) within the allowed path ({allowed_path}). "
1115
- "Creates presentations with title and content slides. Supports templates with placeholder replacement.",
1127
+ "ONLY use this tool when the user specifically requests a PowerPoint/.pptx presentation. "
1128
+ "Do NOT use this for HTML presentations or other text-based formats — use write_file instead. "
1129
+ "CRITICAL: You MUST provide 'slides' array with slide content. "
1130
+ "Example: {{\"path\": \"pres.pptx\", \"slides\": [{{\"layout\": \"title\", \"title\": \"My Title\", \"content\": [\"Bullet 1\"]}}]}}",
1116
1131
  "input_schema": {
1117
1132
  "type": "object",
1118
1133
  "properties": {
@@ -101,19 +101,71 @@ body {
101
101
  overflow-x: auto;
102
102
  }
103
103
 
104
- /* Tool calls */
104
+ /* Tool calls - aligned left like assistant messages */
105
105
  .tool-call {
106
106
  background-color: #2a3a4a;
107
107
  padding: 0.75rem;
108
108
  margin: 0.5rem 0;
109
- border-radius: 0.25rem;
109
+ margin-right: 20%;
110
+ border-radius: 0.5rem;
110
111
  }
111
112
 
113
+ /* Tool results - aligned right like user messages */
112
114
  .tool-result {
113
115
  background-color: #3a3a2a;
114
116
  padding: 0.75rem;
115
117
  margin: 0.5rem 0;
116
- border-radius: 0.25rem;
118
+ margin-left: 20%;
119
+ border-radius: 0.5rem;
120
+ }
121
+
122
+ /* Tool message header with icons */
123
+ .tool-header {
124
+ display: flex;
125
+ justify-content: space-between;
126
+ align-items: center;
127
+ cursor: pointer;
128
+ }
129
+
130
+ .tool-header-left {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 0.5rem;
134
+ }
135
+
136
+ .tool-header-icons {
137
+ display: flex;
138
+ gap: 0.25rem;
139
+ }
140
+
141
+ .tool-header-icons button {
142
+ background: none;
143
+ border: none;
144
+ color: #aaa;
145
+ padding: 0.25rem;
146
+ cursor: pointer;
147
+ font-size: 0.9rem;
148
+ transition: color 0.2s;
149
+ }
150
+
151
+ .tool-header-icons button:hover {
152
+ color: #fff;
153
+ }
154
+
155
+ /* Tool content - collapsible */
156
+ .tool-content {
157
+ display: none;
158
+ margin-top: 0.5rem;
159
+ }
160
+
161
+ .tool-content.expanded {
162
+ display: block;
163
+ }
164
+
165
+ .tool-content pre {
166
+ margin: 0;
167
+ white-space: pre-wrap;
168
+ word-wrap: break-word;
117
169
  }
118
170
 
119
171
  /* Rollup summary */
@@ -167,19 +167,34 @@ function appendToolResults(content, timestamp = null) {
167
167
 
168
168
  if (Array.isArray(results)) {
169
169
  results.forEach((result, index) => {
170
+ const toolId = generateToolId();
170
171
  const resultDiv = document.createElement('div');
171
172
  resultDiv.className = 'tool-result';
173
+ resultDiv.id = toolId;
172
174
 
173
- const toolId = result.tool_use_id || 'unknown';
175
+ const toolUseId = result.tool_use_id || 'unknown';
174
176
  const resultContent = result.content || JSON.stringify(result);
177
+ const formattedContent = typeof resultContent === 'string' ? resultContent : JSON.stringify(resultContent, null, 2);
175
178
 
176
179
  resultDiv.innerHTML = `
177
- <div class="small">
178
- <strong><i class="bi bi-check-circle-fill"></i> Tool Result ${index + 1}:</strong>
179
- <code>${escapeHtml(toolId)}</code>
180
- ${timestamp ? `<span class="ms-2">${formatTimestamp(timestamp)}</span>` : ''}
180
+ <div class="tool-header small" onclick="toggleToolContent('${toolId}')">
181
+ <div class="tool-header-left">
182
+ <strong><i class="bi bi-check-circle-fill"></i> Tool Result ${index + 1}:</strong>
183
+ <code>${escapeHtml(toolUseId)}</code>
184
+ ${timestamp ? `<span class="ms-2">${formatTimestamp(timestamp)}</span>` : ''}
185
+ </div>
186
+ <div class="tool-header-icons">
187
+ <button class="tool-copy-btn" onclick="event.stopPropagation(); copyToolContent('${toolId}')" title="Copy to clipboard">
188
+ <i class="bi bi-clipboard"></i>
189
+ </button>
190
+ <button onclick="event.stopPropagation(); toggleToolContent('${toolId}')" title="Expand/Collapse">
191
+ <i class="bi bi-chevron-down" id="${toolId}-toggle-icon"></i>
192
+ </button>
193
+ </div>
194
+ </div>
195
+ <div class="tool-content" id="${toolId}-content">
196
+ <pre class="small mb-0">${escapeHtml(formattedContent)}</pre>
181
197
  </div>
182
- <pre class="small mb-0 mt-1">${escapeHtml(typeof resultContent === 'string' ? resultContent : JSON.stringify(resultContent, null, 2))}</pre>
183
198
  `;
184
199
 
185
200
  messagesContainer.appendChild(resultDiv);
@@ -188,11 +203,27 @@ function appendToolResults(content, timestamp = null) {
188
203
  } catch (e) {
189
204
  console.error('Error parsing tool results:', e);
190
205
  // Fall back to displaying the raw content
206
+ const toolId = generateToolId();
191
207
  const resultDiv = document.createElement('div');
192
208
  resultDiv.className = 'tool-result';
209
+ resultDiv.id = toolId;
193
210
  resultDiv.innerHTML = `
194
- <div class="small"><strong><i class="bi bi-check-circle-fill"></i> Tool Results</strong></div>
195
- <pre class="small mb-0 mt-1">${escapeHtml(content)}</pre>
211
+ <div class="tool-header small" onclick="toggleToolContent('${toolId}')">
212
+ <div class="tool-header-left">
213
+ <strong><i class="bi bi-check-circle-fill"></i> Tool Results</strong>
214
+ </div>
215
+ <div class="tool-header-icons">
216
+ <button class="tool-copy-btn" onclick="event.stopPropagation(); copyToolContent('${toolId}')" title="Copy to clipboard">
217
+ <i class="bi bi-clipboard"></i>
218
+ </button>
219
+ <button onclick="event.stopPropagation(); toggleToolContent('${toolId}')" title="Expand/Collapse">
220
+ <i class="bi bi-chevron-down" id="${toolId}-toggle-icon"></i>
221
+ </button>
222
+ </div>
223
+ </div>
224
+ <div class="tool-content" id="${toolId}-content">
225
+ <pre class="small mb-0">${escapeHtml(content)}</pre>
226
+ </div>
196
227
  `;
197
228
  messagesContainer.appendChild(resultDiv);
198
229
  }
@@ -225,6 +256,50 @@ function appendRollupSummary(content, timestamp = null) {
225
256
  scrollToBottom();
226
257
  }
227
258
 
259
+ /**
260
+ * Generate a unique ID for tool elements
261
+ * @returns {string} Unique ID
262
+ */
263
+ function generateToolId() {
264
+ return 'tool-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);
265
+ }
266
+
267
+ /**
268
+ * Toggle tool content visibility
269
+ * @param {string} toolId - ID of the tool element
270
+ */
271
+ function toggleToolContent(toolId) {
272
+ const content = document.getElementById(toolId + '-content');
273
+ const icon = document.getElementById(toolId + '-toggle-icon');
274
+ if (content && icon) {
275
+ content.classList.toggle('expanded');
276
+ icon.className = content.classList.contains('expanded')
277
+ ? 'bi bi-chevron-up'
278
+ : 'bi bi-chevron-down';
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Copy tool content to clipboard
284
+ * @param {string} toolId - ID of the tool element
285
+ */
286
+ function copyToolContent(toolId) {
287
+ const content = document.getElementById(toolId + '-content');
288
+ if (content) {
289
+ const pre = content.querySelector('pre');
290
+ if (pre) {
291
+ navigator.clipboard.writeText(pre.textContent).then(() => {
292
+ const btn = document.querySelector(`#${toolId} .tool-copy-btn`);
293
+ if (btn) {
294
+ const originalIcon = btn.innerHTML;
295
+ btn.innerHTML = '<i class="bi bi-check"></i>';
296
+ setTimeout(() => { btn.innerHTML = originalIcon; }, 1500);
297
+ }
298
+ });
299
+ }
300
+ }
301
+ }
302
+
228
303
  /**
229
304
  * Append a tool call message
230
305
  * @param {string} toolName - Tool name
@@ -232,14 +307,28 @@ function appendRollupSummary(content, timestamp = null) {
232
307
  */
233
308
  function appendToolCall(toolName, toolInput) {
234
309
  const messagesContainer = document.getElementById('chat-messages');
310
+ const toolId = generateToolId();
235
311
 
236
312
  const toolDiv = document.createElement('div');
237
313
  toolDiv.className = 'tool-call';
314
+ toolDiv.id = toolId;
238
315
  toolDiv.innerHTML = `
239
- <div class="small">
240
- <strong><i class="bi bi-tools"></i> Tool Call:</strong> <code>${escapeHtml(toolName)}</code>
316
+ <div class="tool-header small" onclick="toggleToolContent('${toolId}')">
317
+ <div class="tool-header-left">
318
+ <strong><i class="bi bi-tools"></i> Tool Call:</strong> <code>${escapeHtml(toolName)}</code>
319
+ </div>
320
+ <div class="tool-header-icons">
321
+ <button class="tool-copy-btn" onclick="event.stopPropagation(); copyToolContent('${toolId}')" title="Copy to clipboard">
322
+ <i class="bi bi-clipboard"></i>
323
+ </button>
324
+ <button onclick="event.stopPropagation(); toggleToolContent('${toolId}')" title="Expand/Collapse">
325
+ <i class="bi bi-chevron-down" id="${toolId}-toggle-icon"></i>
326
+ </button>
327
+ </div>
328
+ </div>
329
+ <div class="tool-content" id="${toolId}-content">
330
+ <pre class="small mb-0">${escapeHtml(JSON.stringify(toolInput, null, 2))}</pre>
241
331
  </div>
242
- <pre class="small mb-0 mt-1">${escapeHtml(JSON.stringify(toolInput, null, 2))}</pre>
243
332
  `;
244
333
 
245
334
  messagesContainer.appendChild(toolDiv);
@@ -248,19 +337,33 @@ function appendToolCall(toolName, toolInput) {
248
337
 
249
338
  /**
250
339
  * Append a tool result message
251
- * @param {string} toolName - Tool name
340
+ * @param {string} toolName - Tool name or tool_use_id
252
341
  * @param {object} toolResult - Tool result data
253
342
  */
254
343
  function appendToolResult(toolName, toolResult) {
255
344
  const messagesContainer = document.getElementById('chat-messages');
345
+ const toolId = generateToolId();
256
346
 
257
347
  const resultDiv = document.createElement('div');
258
348
  resultDiv.className = 'tool-result';
349
+ resultDiv.id = toolId;
259
350
  resultDiv.innerHTML = `
260
- <div class="small">
261
- <strong><i class="bi bi-check-circle-fill"></i> Tool Result:</strong> <code>${escapeHtml(toolName)}</code>
351
+ <div class="tool-header small" onclick="toggleToolContent('${toolId}')">
352
+ <div class="tool-header-left">
353
+ <strong><i class="bi bi-check-circle-fill"></i> Tool Result:</strong> <code>${escapeHtml(toolName)}</code>
354
+ </div>
355
+ <div class="tool-header-icons">
356
+ <button class="tool-copy-btn" onclick="event.stopPropagation(); copyToolContent('${toolId}')" title="Copy to clipboard">
357
+ <i class="bi bi-clipboard"></i>
358
+ </button>
359
+ <button onclick="event.stopPropagation(); toggleToolContent('${toolId}')" title="Expand/Collapse">
360
+ <i class="bi bi-chevron-down" id="${toolId}-toggle-icon"></i>
361
+ </button>
362
+ </div>
363
+ </div>
364
+ <div class="tool-content" id="${toolId}-content">
365
+ <pre class="small mb-0">${escapeHtml(JSON.stringify(toolResult, null, 2))}</pre>
262
366
  </div>
263
- <pre class="small mb-0 mt-1">${escapeHtml(JSON.stringify(toolResult, null, 2))}</pre>
264
367
  `;
265
368
 
266
369
  messagesContainer.appendChild(resultDiv);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dtSpark
3
- Version: 1.1.0a7
3
+ Version: 1.1.0a10
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
@@ -4,7 +4,7 @@ dtSpark/_full_name.txt,sha256=wsMYXtT12WMrY9gT1JHiKdE4k7H59psECS6cSD07giQ,31
4
4
  dtSpark/_licence.txt,sha256=Mvt5wkOkst8VGlk48vwN3CgHwMHLfmplKSPOUEbTfOw,1071
5
5
  dtSpark/_metadata.yaml,sha256=h3PQd2QsY5yUBzS2b6EueTwkmd57svsbAKcwDVVEfIo,188
6
6
  dtSpark/_name.txt,sha256=kDZC5_a3iMKIPOUvtLXl0C9N5DiOfgUCsecwTUnkJhs,7
7
- dtSpark/_version.txt,sha256=IPCpT1ggRHHZbmAfNBVOsWMbPW5eyBS-kaISKoRcAu4,7
7
+ dtSpark/_version.txt,sha256=1fsRT6Hsv69QfbVKQSqRFwJuW8FDwDfpAAMu2LsyLhE,8
8
8
  dtSpark/cli_interface.py,sha256=uNcD8s_h65EJA9xXB_waMfiugwmNYVLdntB2qNn8-Rc,97635
9
9
  dtSpark/conversation_manager.py,sha256=VcfZSwrRuuUbVZa8kQVJjHwG4un5HA0nqYuajsUovoI,132593
10
10
  dtSpark/launch.py,sha256=j8XYpmDswWUIzhpMc32E0Fhbhk_qhOQUAwJSpqh37f0,892
@@ -48,7 +48,7 @@ dtSpark/llm/manager.py,sha256=Qg9glX5ZhepWaRnb8ILZiPoiwqzC8Y318JgwuJf9m58,5837
48
48
  dtSpark/llm/ollama.py,sha256=BQOS6j8nRipoHzPv6gxwzpjucdJ-HLQ3ixNvTEPROKM,20897
49
49
  dtSpark/mcp_integration/__init__.py,sha256=pFw-yTSSJ1yx_ksTe94eq8pBrwDD-5Z-UqSM3VO4deQ,157
50
50
  dtSpark/mcp_integration/manager.py,sha256=yfSymFPXAN-80Rl0M5D-Upb3vIvRq_tvGAI5wVR-IdQ,25241
51
- dtSpark/mcp_integration/tool_selector.py,sha256=GHH1pEyi5E2QA2JdfrWFGkZlVucuhSIh4jBJOb54TjU,11029
51
+ dtSpark/mcp_integration/tool_selector.py,sha256=15l2Abr1ouuk0GUoysetnW-e7z-x1MRU1LpYsYJ2xrA,10997
52
52
  dtSpark/resources/config.yaml.template,sha256=e_GNNZ2FAVDcx1dQ-Mc41SMEPE9M0JrRWdFyRYqstMA,27454
53
53
  dtSpark/safety/__init__.py,sha256=fdcZ4qNbYhH7Un9iKLwNe2GDr_doUmpSgtv-oNS8qPE,460
54
54
  dtSpark/safety/llm_service.py,sha256=N2J9_Od-fGGvk9BkddD6CFd81PrJ03sMjSz6egBDYr4,3820
@@ -61,7 +61,7 @@ dtSpark/scheduler/execution_queue.py,sha256=7_yXnGxO-arZTl0qPbyE-kDhZDVXQKT2z9zI
61
61
  dtSpark/scheduler/executor.py,sha256=s_-6WKdTYEK1-xjYJNXGcAj6vdN27Cf6TI9zNYPSsk0,51371
62
62
  dtSpark/scheduler/manager.py,sha256=vwtmQadqf3cv1QzdZJzFqC0l3bBzIplGZ79BUjfsh4o,12846
63
63
  dtSpark/tools/__init__.py,sha256=TPK-c8CmXheEkoiFzL9PMP8ve0hTpw9iIV2xlGLTsMc,147
64
- dtSpark/tools/builtin.py,sha256=oTdOsxK8x4-DR4wDOYZdBNdZZ7MlqgplM5GLV6OaWQQ,88941
64
+ dtSpark/tools/builtin.py,sha256=3Gx9vBk4eegMOIhi4YJTrzVRqaAn4b9MexnBQYAbiDQ,90880
65
65
  dtSpark/web/__init__.py,sha256=5OrzA2yIR9NBf9mlTPnrQ0afMJTBuEgnzxq4QmIYe54,428
66
66
  dtSpark/web/auth.py,sha256=uSIHwJOiklkjZSpLcznwOL1pVQktKeWifZygt068M9Y,4384
67
67
  dtSpark/web/dependencies.py,sha256=ku54-Vb8wYvGVQ8Kluzxj8zm2Re3wDgU5LzFJ0NVIsI,874
@@ -75,9 +75,9 @@ dtSpark/web/endpoints/chat.py,sha256=c5MWZE-SY26Hr0X3DIFU_LQ15m1E-fFZ7hnQbmzXd1w
75
75
  dtSpark/web/endpoints/conversations.py,sha256=bIt10Laq1JaFBqB_3E1b3dTdSBxPyKvzgmi_f9QaDc8,13537
76
76
  dtSpark/web/endpoints/main_menu.py,sha256=shAP7F5zREbs2A7BmZAIzt5LpR83tZHrNXiFdWgsmFg,20621
77
77
  dtSpark/web/endpoints/streaming.py,sha256=qo0ugUWYvJJF5QvvLpuIvFIlVWgOpfPyUK59HeoRgdY,14603
78
- dtSpark/web/static/css/dark-theme.css,sha256=vMHtvATXuPFYCKlcwexa5ttq15IIffUWiBchxDqxwvo,7673
78
+ dtSpark/web/static/css/dark-theme.css,sha256=K3RwCR3oRU7Iuzrjaa3oRjECCnvzhnJHexw2LDWXyQE,8581
79
79
  dtSpark/web/static/js/actions.js,sha256=EI-ur3eNV97flgpUcM4M5YOQtn_VPS1o4aFiPvthx3U,37463
80
- dtSpark/web/static/js/chat.js,sha256=JE1v7i-Bn6arcMQbbLvV1u-bzlRrjPoJwkuTXTsa84o,21737
80
+ dtSpark/web/static/js/chat.js,sha256=UY28X8is2lrteQhnWePKTSu0KoReZU_M--S1BIfsjXQ,26489
81
81
  dtSpark/web/static/js/main.js,sha256=0JUuRtVlWxpRgCZoHwM4_tRxyBrNKwTPQmN_meKEI4M,16133
82
82
  dtSpark/web/static/js/sse-client.js,sha256=JZnLDar6j8m7TxuHJ9JQDl7E3LqUiWSbQHt6yMaskPI,9104
83
83
  dtSpark/web/templates/actions.html,sha256=08Pk8aqmNEr3uEQTzmnFklETqd1hUcE8PCtUZVMZJso,18875
@@ -88,9 +88,9 @@ dtSpark/web/templates/goodbye.html,sha256=ZdEzgP9MD4kMPrLHkg_3wAod2Hfr9hSTRyBq9f
88
88
  dtSpark/web/templates/login.html,sha256=OkLf_uzMYhl_o9ER1RQZc8ch6-bCaiOokEhKbeEl8E8,3274
89
89
  dtSpark/web/templates/main_menu.html,sha256=pEJTq642BZ8LeeI5jyuJEU3mfGmGiHlMuMMq2XrBu78,39207
90
90
  dtSpark/web/templates/new_conversation.html,sha256=wL9ZZbn3M8ktEoX7H5n4r6XKSEImtO2aXnuNKsB-pEw,8047
91
- dtspark-1.1.0a7.dist-info/licenses/LICENSE,sha256=jIuWlmbirwQabTwxfzE7SXT1LpCG-y_GRQ3VnoRTKgo,1101
92
- dtspark-1.1.0a7.dist-info/METADATA,sha256=bc_OuMg8SoQVITt27Pba7vDDJ4rFfQ71x2Agb9-u-uk,7410
93
- dtspark-1.1.0a7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
94
- dtspark-1.1.0a7.dist-info/entry_points.txt,sha256=IpIwa_a6XY8Z2w7DtgYAhpFHHEbha-zhLkyttWd3zpw,76
95
- dtspark-1.1.0a7.dist-info/top_level.txt,sha256=x-6lMA6vNuxyDNJGNOKI4dyy7L0kOb9V98I5z46bJVY,8
96
- dtspark-1.1.0a7.dist-info/RECORD,,
91
+ dtspark-1.1.0a10.dist-info/licenses/LICENSE,sha256=jIuWlmbirwQabTwxfzE7SXT1LpCG-y_GRQ3VnoRTKgo,1101
92
+ dtspark-1.1.0a10.dist-info/METADATA,sha256=s2V84W0wxKkLAEksFHYfOKxorpG48QCjJiP9f9qNkIs,7411
93
+ dtspark-1.1.0a10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
94
+ dtspark-1.1.0a10.dist-info/entry_points.txt,sha256=IpIwa_a6XY8Z2w7DtgYAhpFHHEbha-zhLkyttWd3zpw,76
95
+ dtspark-1.1.0a10.dist-info/top_level.txt,sha256=x-6lMA6vNuxyDNJGNOKI4dyy7L0kOb9V98I5z46bJVY,8
96
+ dtspark-1.1.0a10.dist-info/RECORD,,