mindroot 8.9.0__py3-none-any.whl → 8.11.0__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.

Potentially problematic release.


This version of mindroot might be problematic. Click here for more details.

Files changed (27) hide show
  1. mindroot/coreplugins/admin/plugin_manager.py +21 -3
  2. mindroot/coreplugins/admin/static/js/agent-form.js +38 -22
  3. mindroot/coreplugins/admin/static/js/plugin-advanced-install.js +8 -0
  4. mindroot/coreplugins/agent/templates/system.jinja2 +18 -0
  5. mindroot/coreplugins/chat/commands.py +11 -2
  6. mindroot/coreplugins/chat/router.py +48 -1
  7. mindroot/coreplugins/chat/services.py +4 -2
  8. mindroot/coreplugins/index/default.json +21 -15
  9. mindroot/coreplugins/index/handlers/plugin_ops.py +13 -0
  10. mindroot/coreplugins/index/indices/default/index.json +9 -6
  11. mindroot/coreplugins/index/static/js/plugin-section.js +42 -5
  12. mindroot/coreplugins/login/templates/login.jinja2 +4 -1
  13. mindroot/lib/chatcontext.py +100 -4
  14. mindroot/lib/chatlog.py +52 -14
  15. mindroot/lib/chatlog_optimized.py +509 -0
  16. mindroot/lib/plugins/default_plugin_manifest.json +1 -1
  17. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/METADATA +1 -1
  18. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/RECORD +22 -26
  19. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/WHEEL +1 -1
  20. mindroot/coreplugins/google_auth/README.md +0 -76
  21. mindroot/coreplugins/google_auth/__init__.py +0 -1
  22. mindroot/coreplugins/google_auth/inject/login.jinja2 +0 -69
  23. mindroot/coreplugins/google_auth/mod.py +0 -1
  24. mindroot/coreplugins/google_auth/router.py +0 -170
  25. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/entry_points.txt +0 -0
  26. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/licenses/LICENSE +0 -0
  27. {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,509 @@
1
+ import os
2
+ import json
3
+ from typing import List, Dict, Set, Optional, Tuple
4
+ import sys
5
+ import traceback
6
+ import re
7
+ import time
8
+ from mindroot.lib.utils.debug import debug_box
9
+ from collections import defaultdict
10
+ import threading
11
+
12
+ # Global cache for directory structure and parent-child relationships
13
+ _log_index_cache = {
14
+ 'log_paths': {}, # log_id -> full_path
15
+ 'parent_children': defaultdict(set), # parent_log_id -> set of child_log_ids
16
+ 'log_metadata': {}, # log_id -> {parent_log_id, agent, user, mtime}
17
+ 'last_scan': 0,
18
+ 'scan_lock': threading.Lock()
19
+ }
20
+
21
+ class ChatLog:
22
+ def __init__(self, log_id=0, agent=None, parent_log_id=None, context_length: int = 4096, user: str = None):
23
+ self.log_id = log_id
24
+ self.messages = []
25
+ self.parent_log_id = parent_log_id
26
+ self.agent = agent
27
+ if user is None or user == '' or user == 'None':
28
+ raise ValueError('User must be provided')
29
+ # make sure user is string
30
+ if not isinstance(user, str):
31
+ # does it have a username?
32
+ if hasattr(user, 'username'):
33
+ user = user.username
34
+ else:
35
+ # throw an error
36
+ raise ValueError('ChatLog(): user must be a string or have username field')
37
+ self.user = user
38
+ if agent is None or agent == '':
39
+ raise ValueError('Agent must be provided')
40
+ self.context_length = context_length
41
+ self.log_dir = os.environ.get('CHATLOG_DIR', 'data/chat')
42
+ self.log_dir = os.path.join(self.log_dir, self.user)
43
+ self.log_dir = os.path.join(self.log_dir, self.agent)
44
+ if not os.path.exists(self.log_dir):
45
+ os.makedirs(self.log_dir)
46
+ self.load_log()
47
+
48
+ def _get_log_data(self) -> Dict[str, any]:
49
+ return {
50
+ 'agent': self.agent,
51
+ 'log_id': self.log_id,
52
+ 'messages': self.messages,
53
+ 'parent_log_id': self.parent_log_id
54
+ }
55
+
56
+ def _calculate_message_length(self, message: Dict[str, str]) -> int:
57
+ return len(json.dumps(message)) // 3
58
+
59
+ def add_message(self, message: Dict[str, str]) -> None:
60
+ if len(self.messages)>0 and self.messages[-1]['role'] == message['role']:
61
+ print("found repeat role")
62
+ # check if messasge is str
63
+ # if so, convert to dict with type 'text':
64
+ if type(message['content']) == str:
65
+ message['content'] = [{'type':'text', 'text': message['content']}]
66
+ elif type(message['content']) == list:
67
+ for part in message['content']:
68
+ if part['type'] == 'image':
69
+ print("found image")
70
+ self.messages.append(message)
71
+ self.save_log()
72
+ return
73
+
74
+ try:
75
+ cmd_list = json.loads(self.messages[-1]['content'][0]['text'])
76
+ if type(cmd_list) != list:
77
+ debug_box("1")
78
+ cmd_list = [cmd_list]
79
+ new_json = json.loads(message['content'][0]['text'])
80
+ if type(new_json) != list:
81
+ debug_box("2")
82
+ new_json = [new_json]
83
+ new_cmd_list = cmd_list + new_json
84
+ debug_box("3")
85
+ self.messages[-1]['content'] = [{ 'type': 'text', 'text': json.dumps(new_cmd_list) }]
86
+ except Exception as e:
87
+ # assume previous mesage was not a command, was a string
88
+ debug_box("4")
89
+ print("Could not combine commands, probably normal if user message and previous system output, assuming string", e)
90
+ if type(self.messages[-1]['content']) == str:
91
+ new_msg_text = self.messages[-1]['content'] + message['content'][0]['text']
92
+ else:
93
+ new_msg_text = self.messages[-1]['content'][0]['text'] + message['content'][0]['text']
94
+ self.messages.append({'role': message['role'], 'content': [{'type': 'text', 'text': new_msg_text}]})
95
+ else:
96
+ if len(self.messages)>0:
97
+ print('roles do not repeat, last message role is ', self.messages[-1]['role'], 'new message role is ', message['role'])
98
+ debug_box("5")
99
+ self.messages.append(message)
100
+ self.save_log()
101
+
102
+ def get_history(self) -> List[Dict[str, str]]:
103
+ return self.messages
104
+
105
+ def get_recent(self, max_tokens: int = 4096) -> List[Dict[str, str]]:
106
+ recent_messages = []
107
+ total_length = 0
108
+ json_messages = json.dumps(self.messages)
109
+ return json.loads(json_messages)
110
+
111
+ def save_log(self) -> None:
112
+ log_file = os.path.join(self.log_dir, f'chatlog_{self.log_id}.json')
113
+ with open(log_file, 'w') as f:
114
+ json.dump(self._get_log_data(), f, indent=2)
115
+ # Invalidate cache when log is saved
116
+ _invalidate_log_cache()
117
+
118
+
119
+ def load_log(self, log_id = None) -> None:
120
+ if log_id is None:
121
+ log_id = self.log_id
122
+ self.log_id = log_id
123
+ log_file = os.path.join(self.log_dir, f'chatlog_{log_id}.json')
124
+ if os.path.exists(log_file):
125
+ with open(log_file, 'r') as f:
126
+ log_data = json.load(f)
127
+ self.agent = log_data.get('agent')
128
+ self.messages = log_data.get('messages', [])
129
+ self.parent_log_id = log_data.get('parent_log_id', None)
130
+ print("Loaded log file at ", log_file)
131
+ print("Message length: ", len(self.messages))
132
+ else:
133
+ print("Could not find log file at ", log_file)
134
+ self.messages = []
135
+
136
+ def count_tokens(self) -> Dict[str, int]:
137
+ input_tokens_sequence = 0
138
+ output_tokens_sequence = 0
139
+ input_tokens_total = 0
140
+
141
+ for i, message in enumerate(self.messages):
142
+ message_tokens = len(json.dumps(message)) // 4
143
+
144
+ if message['role'] == 'assistant':
145
+ output_tokens_sequence += message_tokens
146
+ else:
147
+ input_tokens_sequence += message_tokens
148
+
149
+ if message['role'] == 'assistant':
150
+ request_input_tokens = 0
151
+ for j in range(i):
152
+ request_input_tokens += len(json.dumps(self.messages[j])) // 4
153
+ input_tokens_total += request_input_tokens
154
+
155
+ return {
156
+ 'input_tokens_sequence': input_tokens_sequence,
157
+ 'output_tokens_sequence': output_tokens_sequence,
158
+ 'input_tokens_total': input_tokens_total
159
+ }
160
+
161
+ def _invalidate_log_cache():
162
+ """Invalidate the log index cache"""
163
+ global _log_index_cache
164
+ with _log_index_cache['scan_lock']:
165
+ _log_index_cache['last_scan'] = 0
166
+
167
+ def _build_log_index(force_refresh: bool = False) -> None:
168
+ """
169
+ Build an index of all chat logs and their relationships.
170
+ This replaces the inefficient os.walk() calls with a single scan.
171
+ """
172
+ global _log_index_cache
173
+
174
+ with _log_index_cache['scan_lock']:
175
+ current_time = time.time()
176
+
177
+ # Only rebuild if cache is older than 5 minutes or forced
178
+ if not force_refresh and (current_time - _log_index_cache['last_scan']) < 300:
179
+ return
180
+
181
+ print("Building log index cache...")
182
+ start_time = time.time()
183
+
184
+ # Clear existing cache
185
+ _log_index_cache['log_paths'].clear()
186
+ _log_index_cache['parent_children'].clear()
187
+ _log_index_cache['log_metadata'].clear()
188
+
189
+ chat_dir = os.environ.get('CHATLOG_DIR', 'data/chat')
190
+ if not os.path.exists(chat_dir):
191
+ _log_index_cache['last_scan'] = current_time
192
+ return
193
+
194
+ # Single directory walk to build complete index
195
+ for root, dirs, files in os.walk(chat_dir):
196
+ for file in files:
197
+ if file.startswith("chatlog_") and file.endswith(".json"):
198
+ # Extract log_id from filename
199
+ log_id = file[8:-5] # Remove 'chatlog_' prefix and '.json' suffix
200
+ full_path = os.path.join(root, file)
201
+
202
+ try:
203
+ # Get file modification time
204
+ mtime = os.path.getmtime(full_path)
205
+
206
+ # Parse user and agent from path
207
+ rel_path = os.path.relpath(full_path, chat_dir)
208
+ path_parts = rel_path.split(os.sep)
209
+ user = path_parts[0] if len(path_parts) > 0 else 'unknown'
210
+ agent = path_parts[1] if len(path_parts) > 1 else 'unknown'
211
+
212
+ # Store path mapping
213
+ _log_index_cache['log_paths'][log_id] = full_path
214
+
215
+ # Read log data to get parent relationship
216
+ try:
217
+ with open(full_path, 'r') as f:
218
+ log_data = json.load(f)
219
+ parent_log_id = log_data.get('parent_log_id')
220
+
221
+ # Store metadata
222
+ _log_index_cache['log_metadata'][log_id] = {
223
+ 'parent_log_id': parent_log_id,
224
+ 'agent': agent,
225
+ 'user': user,
226
+ 'mtime': mtime
227
+ }
228
+
229
+ # Build parent-child relationships
230
+ if parent_log_id:
231
+ _log_index_cache['parent_children'][parent_log_id].add(log_id)
232
+
233
+ except (json.JSONDecodeError, KeyError) as e:
234
+ print(f"Error reading log file {full_path}: {e}")
235
+ continue
236
+
237
+ except OSError as e:
238
+ print(f"Error accessing file {full_path}: {e}")
239
+ continue
240
+
241
+ _log_index_cache['last_scan'] = current_time
242
+ elapsed = time.time() - start_time
243
+ print(f"Log index built in {elapsed:.2f}s. Found {len(_log_index_cache['log_paths'])} logs.")
244
+
245
+ def find_chatlog_file(log_id: str) -> Optional[str]:
246
+ """
247
+ Find a chatlog file by its log_id using the cached index.
248
+
249
+ Args:
250
+ log_id: The log ID to search for
251
+
252
+ Returns:
253
+ The full path to the chatlog file if found, None otherwise
254
+ """
255
+ _build_log_index()
256
+ return _log_index_cache['log_paths'].get(log_id)
257
+
258
+ def find_child_logs_by_parent_id(parent_log_id: str) -> List[str]:
259
+ """
260
+ Find all chat logs that have the given parent_log_id using the cached index.
261
+
262
+ Args:
263
+ parent_log_id: The parent log ID to search for
264
+
265
+ Returns:
266
+ List of log IDs that have this parent_log_id
267
+ """
268
+ _build_log_index()
269
+ return list(_log_index_cache['parent_children'].get(parent_log_id, set()))
270
+
271
+ def extract_delegate_task_log_ids(messages: List[Dict]) -> List[str]:
272
+ """
273
+ Extract log IDs from delegate_task commands in messages.
274
+
275
+ Args:
276
+ messages: List of chat messages
277
+
278
+ Returns:
279
+ List of log IDs found in delegate_task commands
280
+ """
281
+ log_ids = []
282
+
283
+ for message in messages:
284
+ if message['role'] == 'assistant':
285
+ content = message['content']
286
+ # Handle both string and list content formats
287
+ if isinstance(content, str):
288
+ text = content
289
+ elif isinstance(content, list) and len(content) > 0 and 'text' in content[0]:
290
+ text = content[0]['text']
291
+ else:
292
+ continue
293
+
294
+ # Try to parse as JSON
295
+ try:
296
+ commands = json.loads(text)
297
+ if not isinstance(commands, list):
298
+ commands = [commands]
299
+
300
+ for cmd in commands:
301
+ for key, value in cmd.items():
302
+ if key == 'delegate_task' and 'log_id' in value:
303
+ log_ids.append(value['log_id'])
304
+ except (json.JSONDecodeError, TypeError, KeyError):
305
+ # If not JSON, try regex to find log_ids in delegate_task commands
306
+ matches = re.findall(r'"delegate_task"\s*:\s*{\s*"log_id"\s*:\s*"([^"]+)"', text)
307
+ log_ids.extend(matches)
308
+
309
+ return log_ids
310
+
311
+ def get_cache_dir() -> str:
312
+ """
313
+ Get the directory for token count cache files.
314
+ Creates the directory if it doesn't exist.
315
+ """
316
+ cache_dir = os.environ.get('TOKEN_CACHE_DIR', 'data/token_cache')
317
+ if not os.path.exists(cache_dir):
318
+ os.makedirs(cache_dir)
319
+ return cache_dir
320
+
321
+ def get_cache_path(log_id: str) -> str:
322
+ """
323
+ Get the path to the cache file for a specific log_id.
324
+ """
325
+ cache_dir = get_cache_dir()
326
+ return os.path.join(cache_dir, f"tokens_{log_id}.json")
327
+
328
+ def get_cached_token_counts(log_id: str, log_path: str) -> Dict[str, int]:
329
+ """
330
+ Get cached token counts if available and valid.
331
+
332
+ Args:
333
+ log_id: The log ID
334
+ log_path: Path to the actual log file
335
+
336
+ Returns:
337
+ Cached token counts if valid, None otherwise
338
+ """
339
+ cache_path = get_cache_path(log_id)
340
+
341
+ # If cache doesn't exist, return None
342
+ if not os.path.exists(cache_path):
343
+ return None
344
+
345
+ try:
346
+ # Get modification times
347
+ log_mtime = os.path.getmtime(log_path)
348
+ cache_mtime = os.path.getmtime(cache_path)
349
+ current_time = time.time()
350
+
351
+ # If log was modified after cache was created, cache is invalid
352
+ if log_mtime > cache_mtime:
353
+ return None
354
+
355
+ # Don't recalculate sooner than 3 minutes after last calculation
356
+ if current_time - cache_mtime < 180: # 3 minutes in seconds
357
+ with open(cache_path, 'r') as f:
358
+ return json.load(f)
359
+
360
+ # For logs that haven't been modified in over an hour, consider them "finished"
361
+ # and use the cache regardless of when it was last calculated
362
+ if current_time - log_mtime > 3600: # 1 hour in seconds
363
+ with open(cache_path, 'r') as f:
364
+ return json.load(f)
365
+
366
+ except (json.JSONDecodeError, IOError) as e:
367
+ print(f"Error reading token cache: {e}")
368
+
369
+ return None
370
+
371
+ def save_token_counts_to_cache(log_id: str, token_counts: Dict[str, int]) -> None:
372
+ """
373
+ Save token counts to cache.
374
+ """
375
+ cache_path = get_cache_path(log_id)
376
+ with open(cache_path, 'w') as f:
377
+ json.dump(token_counts, f)
378
+
379
+ def count_tokens_for_log_id_optimized(log_id: str) -> Dict[str, int]:
380
+ """
381
+ Optimized version of count_tokens_for_log_id that uses caching and batch operations.
382
+
383
+ Args:
384
+ log_id: The log ID to count tokens for
385
+
386
+ Returns:
387
+ Dictionary with token counts or None if log not found
388
+ """
389
+ # Find the chatlog file using cached index
390
+ chatlog_path = find_chatlog_file(log_id)
391
+ if not chatlog_path:
392
+ return None
393
+
394
+ # Check cache first
395
+ cached_counts = get_cached_token_counts(log_id, chatlog_path)
396
+ if cached_counts:
397
+ print(f"Using cached token counts for {log_id}")
398
+ return cached_counts
399
+
400
+ print(f"Calculating token counts for {log_id}")
401
+
402
+ # Use batch processing to get all related logs at once
403
+ all_related_logs = _get_all_related_logs_batch(log_id)
404
+
405
+ # Calculate tokens for all logs in batch
406
+ token_results = {}
407
+ for related_log_id, log_data in all_related_logs.items():
408
+ # Create a temporary ChatLog instance to count tokens
409
+ temp_log = ChatLog(log_id=related_log_id, user="system", agent=log_data.get('agent', 'unknown'))
410
+ temp_log.messages = log_data.get('messages', [])
411
+
412
+ # Count tokens for this log
413
+ token_results[related_log_id] = temp_log.count_tokens()
414
+
415
+ # Build the hierarchical token counts
416
+ main_counts = token_results.get(log_id, {
417
+ 'input_tokens_sequence': 0,
418
+ 'output_tokens_sequence': 0,
419
+ 'input_tokens_total': 0
420
+ })
421
+
422
+ # Sum up all child tokens
423
+ combined_counts = {
424
+ 'input_tokens_sequence': main_counts['input_tokens_sequence'],
425
+ 'output_tokens_sequence': main_counts['output_tokens_sequence'],
426
+ 'input_tokens_total': main_counts['input_tokens_total']
427
+ }
428
+
429
+ # Add child log tokens
430
+ for related_log_id, counts in token_results.items():
431
+ if related_log_id != log_id: # Don't double-count the main log
432
+ combined_counts['input_tokens_sequence'] += counts['input_tokens_sequence']
433
+ combined_counts['output_tokens_sequence'] += counts['output_tokens_sequence']
434
+ combined_counts['input_tokens_total'] += counts['input_tokens_total']
435
+
436
+ # Create final result
437
+ final_token_counts = {
438
+ # Parent session only counts
439
+ 'input_tokens_sequence': main_counts['input_tokens_sequence'],
440
+ 'output_tokens_sequence': main_counts['output_tokens_sequence'],
441
+ 'input_tokens_total': main_counts['input_tokens_total'],
442
+ # Combined counts (parent + all subtasks)
443
+ 'combined_input_tokens_sequence': combined_counts['input_tokens_sequence'],
444
+ 'combined_output_tokens_sequence': combined_counts['output_tokens_sequence'],
445
+ 'combined_input_tokens_total': combined_counts['input_tokens_total']
446
+ }
447
+
448
+ # Save to cache
449
+ save_token_counts_to_cache(log_id, final_token_counts)
450
+
451
+ return final_token_counts
452
+
453
+ def _get_all_related_logs_batch(log_id: str) -> Dict[str, Dict]:
454
+ """
455
+ Get all related logs (parent and children) in a single batch operation.
456
+ This avoids multiple directory traversals and file reads.
457
+ """
458
+ # Ensure index is built
459
+ _build_log_index()
460
+
461
+ # Find all related log IDs
462
+ related_log_ids = set([log_id])
463
+ to_process = [log_id]
464
+
465
+ while to_process:
466
+ current_id = to_process.pop()
467
+
468
+ # Add children
469
+ children = _log_index_cache['parent_children'].get(current_id, set())
470
+ for child_id in children:
471
+ if child_id not in related_log_ids:
472
+ related_log_ids.add(child_id)
473
+ to_process.append(child_id)
474
+
475
+ # Also check for delegated tasks in the main log
476
+ main_log_path = _log_index_cache['log_paths'].get(log_id)
477
+ if main_log_path:
478
+ try:
479
+ with open(main_log_path, 'r') as f:
480
+ log_data = json.load(f)
481
+ delegated_ids = extract_delegate_task_log_ids(log_data.get('messages', []))
482
+ for delegated_id in delegated_ids:
483
+ if delegated_id not in related_log_ids:
484
+ related_log_ids.add(delegated_id)
485
+ to_process.append(delegated_id)
486
+ except (json.JSONDecodeError, IOError):
487
+ pass
488
+
489
+ # Batch read all related logs
490
+ result = {}
491
+ for related_id in related_log_ids:
492
+ log_path = _log_index_cache['log_paths'].get(related_id)
493
+ if log_path:
494
+ try:
495
+ with open(log_path, 'r') as f:
496
+ result[related_id] = json.load(f)
497
+ except (json.JSONDecodeError, IOError) as e:
498
+ print(f"Error reading log {related_id}: {e}")
499
+ continue
500
+
501
+ return result
502
+
503
+ # Backward compatibility - keep the original function name but use optimized version
504
+ def count_tokens_for_log_id(log_id: str) -> Dict[str, int]:
505
+ """
506
+ Count tokens for a chat log identified by log_id, including any delegated tasks.
507
+ This is the optimized version that uses caching and batch operations.
508
+ """
509
+ return count_tokens_for_log_id_optimized(log_id)
@@ -62,7 +62,7 @@
62
62
  "source": "core"
63
63
  },
64
64
  "credits": {
65
- "enabled": true,
65
+ "enabled": false,
66
66
  "source": "core"
67
67
  },
68
68
  "startup": {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mindroot
3
- Version: 8.9.0
3
+ Version: 8.11.0
4
4
  Summary: MindRoot AI Agent Framework
5
5
  Requires-Python: >=3.9
6
6
  License-File: LICENSE
@@ -6,7 +6,7 @@ mindroot/coreplugins/admin/agent_router.py,sha256=mstYUURNRb9MpfNwqMYC7WY3FOQJ-5
6
6
  mindroot/coreplugins/admin/command_router.py,sha256=nhNkurIb9w7itgQ5nBtDYM-W2q69cYpLAq9HLrK-0Bk,6567
7
7
  mindroot/coreplugins/admin/persona_handler.py,sha256=eRYmmOmupLJuiujWN35SS2nwRgo0lbbXug-chZ_WmjU,2862
8
8
  mindroot/coreplugins/admin/persona_router.py,sha256=tyPxBe-pRnntHo_xyazvnwKZxHmvEI5_Fsu0YkZbrXA,6036
9
- mindroot/coreplugins/admin/plugin_manager.py,sha256=k_buWtxh1JGb7j_NMILxJlZ_ZU5VVuXQpw4_Qp1Zjjo,14587
9
+ mindroot/coreplugins/admin/plugin_manager.py,sha256=ZXzxSNY6Y0_PXvnZSsSK3WDTkgDJNDuDlFP8y-F72h8,15355
10
10
  mindroot/coreplugins/admin/plugin_manager_backup.py,sha256=pUnh-EW4BMOrL2tYUq1X2BC65aoTBhDM-o2-mlDYXfU,24583
11
11
  mindroot/coreplugins/admin/plugin_router.py,sha256=EEDIM0MMPhqeej8Lu8cazYgzaXH1sKZLy_6kBOwrUgY,1020
12
12
  mindroot/coreplugins/admin/router.py,sha256=Wzeri92Rv39YKTYflMZ3E1pnYy959KHWRjS8D4Xgaao,1580
@@ -38,7 +38,7 @@ mindroot/coreplugins/admin/static/favicon/favicon_io (1)/favicon-32x32.png,sha25
38
38
  mindroot/coreplugins/admin/static/favicon/favicon_io (1)/favicon.ico,sha256=5tNfs1TPDqu8ltrcvAKXw_n7tpkRNXP7rlpdtAqyitk,15406
39
39
  mindroot/coreplugins/admin/static/favicon/favicon_io (1)/site.webmanifest,sha256=ep4Hzh9zhmiZF2At3Fp1dQrYQuYF_3ZPZxc1KcGBvwQ,263
40
40
  mindroot/coreplugins/admin/static/js/agent-editor.js,sha256=ZCJBNQ-l4kJj-ZufYuzEg45ZpqxwliNmxuqUa2GNiqY,2825
41
- mindroot/coreplugins/admin/static/js/agent-form.js,sha256=76d2VmiyMcUiVraBCq6Pk9NkFQbkcRRlG5gtfamGDko,37376
41
+ mindroot/coreplugins/admin/static/js/agent-form.js,sha256=NBPHY8L23n007gX0r8J_9gZZltobzQ4DVwWcwBv4cRs,38053
42
42
  mindroot/coreplugins/admin/static/js/agent-list.js,sha256=86mqFyHspx9EnzJpgUDyeAgEq-jcqQ4v96CrgfUXoGM,2239
43
43
  mindroot/coreplugins/admin/static/js/base.js,sha256=xGCA6ngMapQ_jqMgHXg__CS3R46qprycOjkKTFDCMlA,1307
44
44
  mindroot/coreplugins/admin/static/js/github-import.js,sha256=iP-O2WrbKumyDetDjK7EQdi9yivFe6IlvHZLd2qo1dA,3658
@@ -51,7 +51,7 @@ mindroot/coreplugins/admin/static/js/missing-commands.js,sha256=adNF9GWN981_KX7H
51
51
  mindroot/coreplugins/admin/static/js/model-preferences.js,sha256=J0G7gcGACaPyslWJO42urf5wbZZsqO0LyPicAu-uV_Y,3365
52
52
  mindroot/coreplugins/admin/static/js/notification.js,sha256=296rVCr6MNtzvzdzW3bGiMa231-BnWJtwZZ_sDWX-3c,5633
53
53
  mindroot/coreplugins/admin/static/js/persona-editor.js,sha256=xO2jobJXwqGY7Uajj3vQxyERubsHZovIPF_8FHpvzFE,8604
54
- mindroot/coreplugins/admin/static/js/plugin-advanced-install.js,sha256=nrCpHlQTd9c_SRIqR0MNqsqgocUPL1K7_yfA99f-MlM,7679
54
+ mindroot/coreplugins/admin/static/js/plugin-advanced-install.js,sha256=-HDJ3lVuDwj6R-74TfVUo4dUxB8efl13m3R_sUicnJI,8038
55
55
  mindroot/coreplugins/admin/static/js/plugin-base.js,sha256=KWp5DqueHtyTxYKbuHMoFpoFXrfMbIjzK4M1ulAR9m8,5095
56
56
  mindroot/coreplugins/admin/static/js/plugin-index-browser.js,sha256=P-V4wqlYGxjr7oF2LiD5ti8Is3wtSsKPwpRgRJpT0VI,10028
57
57
  mindroot/coreplugins/admin/static/js/plugin-install-dialog.js,sha256=ty_dZ9dZcpp9El1j3eY4Z6Wp8iZ5WNkf_lHSV-W1IhA,8216
@@ -439,7 +439,7 @@ mindroot/coreplugins/agent/preferred_models.default.json,sha256=Zpi6psgjhY750vyR
439
439
  mindroot/coreplugins/agent/providers.default.json,sha256=FPmY5qVOrBy_Z4RgDJWQwLwxd-zWWI83nnAE6z5fEeg,1524
440
440
  mindroot/coreplugins/agent/system.j2.backup,sha256=itPx-urDBtKBqwps5T6yly4M9gX45AdrM-sznwefG_U,8927
441
441
  mindroot/coreplugins/agent/Assistant/agent.json,sha256=-WPUqffe5XNUTUb23zFRBW97jl4pBbleq_MMiH4U55c,206
442
- mindroot/coreplugins/agent/templates/system.jinja2,sha256=GKEztbJJKUvNodXAHlihRwocK7FtE_w7R1M69kyFmDs,10515
442
+ mindroot/coreplugins/agent/templates/system.jinja2,sha256=EODOqlKUawqbrEwZl2lEnSAt_imqc3b5Npj4VlSC2Jc,11127
443
443
  mindroot/coreplugins/api_keys/__init__.py,sha256=znoBzjEYNIDi7AD3NQMntC4MINqLofXh75L5_Ez8_bY,138
444
444
  mindroot/coreplugins/api_keys/api_key_manager.py,sha256=GH2V1PGnpLguAB5KMumgPgVwTXoft1F0FsvBhD781go,3205
445
445
  mindroot/coreplugins/api_keys/cli.py,sha256=h9VSt3-89AH2-uM7JS8TCfKYpGG79tChU-Ynr1R18Vc,1253
@@ -448,12 +448,12 @@ mindroot/coreplugins/api_keys/router.py,sha256=pz6VjUDPryKxYgnPt8-5AP1P-wjIIQq2c
448
448
  mindroot/coreplugins/api_keys/inject/admin.jinja2,sha256=t50he2aeK_GJ6838LekBcGjkYRbo5p6OHeTWtlggbyU,372
449
449
  mindroot/coreplugins/api_keys/static/js/api-key-manager.js,sha256=imqlhd85Z-1e7uxDlprphGV_N467WKo8_BYVQsJJ1V0,5327
450
450
  mindroot/coreplugins/chat/__init__.py,sha256=0Zs02XeMuTCBdKHvtpO-utxyWmFaQJpH-O1tCiVBw9I,141
451
- mindroot/coreplugins/chat/commands.py,sha256=QozVxkLqtP6rlK3tSVLThfZz6nE7G_YygcmDzZdgb7c,16773
451
+ mindroot/coreplugins/chat/commands.py,sha256=vlgGOvwvjpCbSsW25x4HaeFzeRNWXoEKrdqNpwX_EGg,17077
452
452
  mindroot/coreplugins/chat/format_result_msgs.py,sha256=daEdpEyAJIa8b2VkCqSKcw8PaExcB6Qro80XNes_sHA,2
453
453
  mindroot/coreplugins/chat/mod.py,sha256=Xydjv3feKJJRbwdiB7raqiQnWtaS_2GcdC9bXYQX3nE,425
454
454
  mindroot/coreplugins/chat/models.py,sha256=GRcRuDUAJFpyWERPMxkxUaZ21igNlWeeamriruEKiEQ,692
455
- mindroot/coreplugins/chat/router.py,sha256=ucSQ6_wztDq2PCUP0D4KHL5JaFUAaBtmCQy-4iI8e8c,9087
456
- mindroot/coreplugins/chat/services.py,sha256=Ngv_TceFeXn2EzlZbSbR8Iv1E4M7qL7o3q1L7tufFq4,17835
455
+ mindroot/coreplugins/chat/router.py,sha256=u7zSFwRenVzdyZxSE81mBzqeOHgNgubdvHGNycC8zoI,11260
456
+ mindroot/coreplugins/chat/services.py,sha256=Wc_PzC9yT53vWKhiuh9wBrvdAigD5OKfwPwQT-27bXA,17950
457
457
  mindroot/coreplugins/chat/utils.py,sha256=BiE14PpsAcQSO5vbU88klHGm8cAXJDXxgVgva-EXybU,155
458
458
  mindroot/coreplugins/chat/static/assistant.png,sha256=oAt1ctkFKLSPBoAZGNnSixooW9ANVIk1GwniauVWDXo,215190
459
459
  mindroot/coreplugins/chat/static/mindgen.png,sha256=fN3E3oOFvAGYjJq-Pvg2f75jIMv7kg5WRU0EeEbxCWg,235353
@@ -923,11 +923,6 @@ mindroot/coreplugins/events/mod.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329N
923
923
  mindroot/coreplugins/events/router.py,sha256=a-77306_fQPNHPXP5aYtbpfC0gbqMBNRu04aYOh75L4,3587
924
924
  mindroot/coreplugins/events/backup/mod.py,sha256=9QeJpg6WKwxRdjiKVHD1froguTe86FS2-2wWm1B9xa8,1832
925
925
  mindroot/coreplugins/events/backup/router_backup.py,sha256=ImU8xoxdSd45V1yOFVqdtDQ614V6CMsDZQ1gtJj0Mnk,254
926
- mindroot/coreplugins/google_auth/README.md,sha256=9BTSYrU-k22RshkKDsszZwrB40xFu-1JUBi34QD52I8,2801
927
- mindroot/coreplugins/google_auth/__init__.py,sha256=qw8b_7YoN67q1kEdXYXmQkXycF1NaYb3dMbjP-6FsUs,19
928
- mindroot/coreplugins/google_auth/mod.py,sha256=wVhrOK7gw7kTjGRCS3nlhbELHPxydUqKMDQcjdGIUfU,61
929
- mindroot/coreplugins/google_auth/router.py,sha256=15ix01TVTexfhgGRAhkNiQeHZamj-jqNDBNVQm1yqW4,5519
930
- mindroot/coreplugins/google_auth/inject/login.jinja2,sha256=Vlihmk8vgxup0Y6Pvi5nzvbZUQyhUzZH0I5qREW_Vj8,1944
931
926
  mindroot/coreplugins/home/mod.py,sha256=MsSFjiLMLJZ7QhUPpVBWKiyDnCzryquRyr329NoCACI,2
932
927
  mindroot/coreplugins/home/router.py,sha256=kzPg2eIimG_2Qa1bZ0gKCmoo2uzd8GurrePODOO1How,1982
933
928
  mindroot/coreplugins/home/static/css/dark.css,sha256=Q9FHaEsf9xeJjtouyKgr1Su6vTzsN07NHxxqDrDfyx8,14259
@@ -1307,7 +1302,7 @@ mindroot/coreplugins/home/static/js/lit-html/node/directives/when.js.map,sha256=
1307
1302
  mindroot/coreplugins/home/templates/home.jinja2,sha256=wVaXYgaNK3Kn7wmrKEyBT24Az2l4_o7ctVbDhHPXgEw,2088
1308
1303
  mindroot/coreplugins/index/.gitignore,sha256=r_urXBxUYZhSuWyYzpRcAz5rHR0gVTERMrTI_gbBmCM,9
1309
1304
  mindroot/coreplugins/index/__init__.py,sha256=WU5revQym2nu-vAV-o5cdAXpuRlb_Juu0lzc9s6lIFU,74
1310
- mindroot/coreplugins/index/default.json,sha256=E3Rj8gCAcFeppbS4CtXoGwXL94E7jFJQcNflDp4xrJg,2030
1305
+ mindroot/coreplugins/index/default.json,sha256=nFZXpsAFlTCGN_lfqJIewCd_o-fMEpjaUixBbnynWfA,2288
1311
1306
  mindroot/coreplugins/index/mod.py,sha256=F_2PBZIjOOKID36m_DK8fvN92zEkTHQeBm9M6gJ84Tw,554
1312
1307
  mindroot/coreplugins/index/models.py,sha256=WXG4pslFwq-iUld4-7dZlbHTsiFkVq9RghE0AVDzR_M,1044
1313
1308
  mindroot/coreplugins/index/router.py,sha256=z8TlbcN_9i6Q5XgLxcbV6H_PAGqK9H0tJdrQ3oqkCcY,2085
@@ -1315,9 +1310,9 @@ mindroot/coreplugins/index/utils.py,sha256=UF30B_XM3FNHjwn_BnxaW9yEjwZl-TjyDBcUD
1315
1310
  mindroot/coreplugins/index/handlers/__init__.py,sha256=MPoCNJooyIGXwD9lXyIR8RQwUE5MrPj4wFpJVIzPCtM,421
1316
1311
  mindroot/coreplugins/index/handlers/agent_ops.py,sha256=6faXdvDwZfZSsev5BLlKxJkDo4BNskVNAstWt3_T6kA,3849
1317
1312
  mindroot/coreplugins/index/handlers/index_ops.py,sha256=VvGev9qKMtXK0LJnyO4s0fKeJwFLlXIBI3SPgYIGMD8,3898
1318
- mindroot/coreplugins/index/handlers/plugin_ops.py,sha256=lDC4RtSiZ27w_rW6aj_VkoLhq2vIhs1GktyHvDOYdTs,5139
1313
+ mindroot/coreplugins/index/handlers/plugin_ops.py,sha256=KT5Ga8Q42rBfkaqyDd4VPtu3x1Ax7mEApS8a-xIhq2E,5599
1319
1314
  mindroot/coreplugins/index/handlers/publish.py,sha256=J4SiDSvaXpYV7My66nFjD1jHTVeDsV986iIwUAUlLok,4684
1320
- mindroot/coreplugins/index/indices/default/index.json,sha256=zC44bA-WnHfkzx-BCzzycwPtD7QggLCvGzvLPYCWRPI,37844
1315
+ mindroot/coreplugins/index/indices/default/index.json,sha256=2zR869dAVESvpGuRATZXaaQkh7n2oqkjc3DY2VcqXgc,37991
1321
1316
  mindroot/coreplugins/index/indices/default/personas/Assistant/avatar.png,sha256=AsT2_jjGpZvEhzTEwSVhEShSYaIBhcUDrlj_bAG_HVY,1169266
1322
1317
  mindroot/coreplugins/index/indices/default/personas/Assistant/faceref.png,sha256=AsT2_jjGpZvEhzTEwSVhEShSYaIBhcUDrlj_bAG_HVY,1169266
1323
1318
  mindroot/coreplugins/index/indices/default/personas/Assistant/persona.json,sha256=BwVSL8E1VkFtxPEN_6fjULxK2SufaE2Dsi0_Mfs4Mhw,244
@@ -1332,7 +1327,7 @@ mindroot/coreplugins/index/static/js/index-list.js,sha256=7nE7Taeppc1NaxyojOncgv
1332
1327
  mindroot/coreplugins/index/static/js/index-manager.js,sha256=UFTCwT21ZB0I1YRgeJWwRBUiCcKvHWZvuebopHKyTcA,6453
1333
1328
  mindroot/coreplugins/index/static/js/index-metadata.js,sha256=sLFV1P0XLd887PQkwpjZMK25BQUqT5QGF60dvRwAQc8,2640
1334
1329
  mindroot/coreplugins/index/static/js/lit-core.min.js,sha256=wHslYF0J77niIj1xfYyYjSvnU6Mkq-QRiNffiOb6xz8,15443
1335
- mindroot/coreplugins/index/static/js/plugin-section.js,sha256=bXE0w6Npq0Z77sBOPv0kUU7r48-sgdHmyXFWTwPZtew,5333
1330
+ mindroot/coreplugins/index/static/js/plugin-section.js,sha256=bwYiWCuYdWbMdS8lociS72k8_6dBLMS2wyBgG3f6DGA,6551
1336
1331
  mindroot/coreplugins/index/static/js/components/publish-button.js,sha256=REEvOYv0uPe2jPeGkmI9WHscHIwMoAXOQTO67Aux9nU,3367
1337
1332
  mindroot/coreplugins/index/static/js/components/upload-area.js,sha256=MqoVKaTnwm8Gce1_qjqZxF7x3NKVKORHoECBTKGpP0o,4056
1338
1333
  mindroot/coreplugins/index/static/js/lit-html/LICENSE,sha256=K2b5OQr94p7f5DFNr_k_AfsYLhF4BT4igSAXiYfl23U,1518
@@ -1705,7 +1700,7 @@ mindroot/coreplugins/jwt_auth/role_checks.py,sha256=bruZIIBSOvXNWB1YZ2s5btrbbXNf
1705
1700
  mindroot/coreplugins/jwt_auth/router.py,sha256=ecXYao_UG33UjQF15Hi-tf_X0eFsqLEldyqGpt7JNSw,1162
1706
1701
  mindroot/coreplugins/login/mod.py,sha256=4W8VliAYUP1KY2gLJ_YDy2TmcXYVm-PY7XikQD_bFwA,2
1707
1702
  mindroot/coreplugins/login/router.py,sha256=vyxBNkrVguRn3SmoR5JTYjkI_Oiv74DMkLbYSSK4ju4,2722
1708
- mindroot/coreplugins/login/templates/login.jinja2,sha256=PZa85CmQeROc8ABQ6s5S9llH9xy2i6JtTWRKLR5FUZs,2513
1703
+ mindroot/coreplugins/login/templates/login.jinja2,sha256=sxZL8G52hv3T364k9pylXz8g6H9xludXfziHGTruKw8,2610
1709
1704
  mindroot/coreplugins/persona/README.md,sha256=YZWBU9O3i8Edvuldd3_9mplAd3hIU7c5ueSO3ssTo8s,826
1710
1705
  mindroot/coreplugins/persona/__init__.py,sha256=qw8b_7YoN67q1kEdXYXmQkXycF1NaYb3dMbjP-6FsUs,19
1711
1706
  mindroot/coreplugins/persona/init_persona.py,sha256=4ZXy9LrmOI8xFgr2gsz4VPvwWBMd1oB04uhAWrRbp8A,410
@@ -1776,8 +1771,9 @@ mindroot/lib/__init__.py,sha256=388n_hMskU0TnZ4xT10US_kFkya-EPBjWcv7AZf_HOk,74
1776
1771
  mindroot/lib/buchatlog.py,sha256=LJZc3ksKgJcStltmHrrwNLaON3EDzhOKVAWj0Wl22wk,5861
1777
1772
  mindroot/lib/buchatlog2.py,sha256=Va9FteBWePEjWD9OZcw-OtQfEb-IoCVGTmJeMRaX9is,13729
1778
1773
  mindroot/lib/butemplates.py,sha256=gfHGPTOjvoEenXsR7xokNuqMjOAPuC2DawheH1Ae4bU,12196
1779
- mindroot/lib/chatcontext.py,sha256=OR63K63NMjaV7kXDf0MIcvOXFZhdiqr7LKgbyfZzjkE,6211
1780
- mindroot/lib/chatlog.py,sha256=6brFJASM7r1qlRX3t1HsXHehEnkaUW5dwmCG3WIPOqc,14690
1774
+ mindroot/lib/chatcontext.py,sha256=yJQOC0lhS-M7sk0oHet8W3B8urxUZBRwEkvQlDUpsws,11702
1775
+ mindroot/lib/chatlog.py,sha256=F5rKxiDotLvJnZVjHlbUrChRLdFkbS4V2gNcAQ-XE-s,16176
1776
+ mindroot/lib/chatlog_optimized.py,sha256=rL7KBP-V4_cGgMLihxPm3HoKcjFEyA1uEtPtqvkOa3A,20011
1781
1777
  mindroot/lib/json_escape.py,sha256=5cAmAdNbnYX2uyfQcnse2fFtNI0CdB-AfZ23RwaDm-k,884
1782
1778
  mindroot/lib/model_selector.py,sha256=Wz-8NZoiclmnhLeCNnI3WCuKFmjsO5HE4bK5F8GpZzU,1397
1783
1779
  mindroot/lib/parent_templates.py,sha256=elcQFFwrFtfAYfQOSTs06aiDDigN1f1R2f8I1V-wj6Q,2731
@@ -1800,7 +1796,7 @@ mindroot/lib/logging/logfiles_prev.py,sha256=Dqya4VlqXh5Wx7HC6uydkwkb5SLpcl6HQ46
1800
1796
  mindroot/lib/pipelines/pipe.py,sha256=zlVI8BTjDaI87UZO61uVvXyZIbs_pPipi-zGVgDoCwk,527
1801
1797
  mindroot/lib/pipelines/pipelines.py,sha256=Uv83Xvnpt34u6J0h0f1mef4M53ifgFco65nMECBJeMM,2654
1802
1798
  mindroot/lib/plugins/__init__.py,sha256=ZpIgOKsGjyvAe9KenqZ_5ppxaQ7br9EmU7RBI_VXaBw,1318
1803
- mindroot/lib/plugins/default_plugin_manifest.json,sha256=vVgFY_vIn5NFsj2dbERg9m_iiaSOOfLdSRlgNfAI5H0,1405
1799
+ mindroot/lib/plugins/default_plugin_manifest.json,sha256=lg3mIQmQPU6nkOKjClstvXGC82tNP9RuV-LLQVIJAIw,1406
1804
1800
  mindroot/lib/plugins/installation.py,sha256=Ju3gD3cv9I5qIY0hrL7-4t5xYeivEtEgUveWIiE1oqM,15360
1805
1801
  mindroot/lib/plugins/loader.py,sha256=OhBzfzHuZCwxVtloVrgkHUJCaLG3_n4k9lDLMIuuZsg,9541
1806
1802
  mindroot/lib/plugins/manifest.py,sha256=DOCpwZRFCbk4fAhXlh67uDunYGMBD-OK6_W4E9tf-_k,3955
@@ -1825,9 +1821,9 @@ mindroot/protocols/services/stream_chat.py,sha256=fMnPfwaB5fdNMBLTEg8BXKAGvrELKH
1825
1821
  mindroot/registry/__init__.py,sha256=40Xy9bmPHsgdIrOzbtBGzf4XMqXVi9P8oZTJhn0r654,151
1826
1822
  mindroot/registry/component_manager.py,sha256=WZFNPg4SNvpqsM5NFiC2DpgmrJQCyR9cNhrCBpp30Qk,995
1827
1823
  mindroot/registry/data_access.py,sha256=NgNMamxIjaKeYxzxnVaQz1Y-Rm0AI51si3788_JHUTM,5316
1828
- mindroot-8.9.0.dist-info/licenses/LICENSE,sha256=8plAmZh8y9ccuuqFFz4kp7G-cO_qsPgAOoHNvabSB4U,1070
1829
- mindroot-8.9.0.dist-info/METADATA,sha256=43N17ZsLw9k6hQbsQHP21DJdu41cxnlVT7cc5KXlPRg,891
1830
- mindroot-8.9.0.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
1831
- mindroot-8.9.0.dist-info/entry_points.txt,sha256=0bpyjMccLttx6VcjDp6zfJPN0Kk0rffor6IdIbP0j4c,50
1832
- mindroot-8.9.0.dist-info/top_level.txt,sha256=gwKm7DmNjhdrCJTYCrxa9Szne4lLpCtrEBltfsX-Mm8,9
1833
- mindroot-8.9.0.dist-info/RECORD,,
1824
+ mindroot-8.11.0.dist-info/licenses/LICENSE,sha256=8plAmZh8y9ccuuqFFz4kp7G-cO_qsPgAOoHNvabSB4U,1070
1825
+ mindroot-8.11.0.dist-info/METADATA,sha256=wef7mud8dSSLBdP0uNYhmySIvcexiy-Hth-h4Tk471U,892
1826
+ mindroot-8.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1827
+ mindroot-8.11.0.dist-info/entry_points.txt,sha256=0bpyjMccLttx6VcjDp6zfJPN0Kk0rffor6IdIbP0j4c,50
1828
+ mindroot-8.11.0.dist-info/top_level.txt,sha256=gwKm7DmNjhdrCJTYCrxa9Szne4lLpCtrEBltfsX-Mm8,9
1829
+ mindroot-8.11.0.dist-info/RECORD,,