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.
- mindroot/coreplugins/admin/plugin_manager.py +21 -3
- mindroot/coreplugins/admin/static/js/agent-form.js +38 -22
- mindroot/coreplugins/admin/static/js/plugin-advanced-install.js +8 -0
- mindroot/coreplugins/agent/templates/system.jinja2 +18 -0
- mindroot/coreplugins/chat/commands.py +11 -2
- mindroot/coreplugins/chat/router.py +48 -1
- mindroot/coreplugins/chat/services.py +4 -2
- mindroot/coreplugins/index/default.json +21 -15
- mindroot/coreplugins/index/handlers/plugin_ops.py +13 -0
- mindroot/coreplugins/index/indices/default/index.json +9 -6
- mindroot/coreplugins/index/static/js/plugin-section.js +42 -5
- mindroot/coreplugins/login/templates/login.jinja2 +4 -1
- mindroot/lib/chatcontext.py +100 -4
- mindroot/lib/chatlog.py +52 -14
- mindroot/lib/chatlog_optimized.py +509 -0
- mindroot/lib/plugins/default_plugin_manifest.json +1 -1
- {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/METADATA +1 -1
- {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/RECORD +22 -26
- {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/WHEEL +1 -1
- mindroot/coreplugins/google_auth/README.md +0 -76
- mindroot/coreplugins/google_auth/__init__.py +0 -1
- mindroot/coreplugins/google_auth/inject/login.jinja2 +0 -69
- mindroot/coreplugins/google_auth/mod.py +0 -1
- mindroot/coreplugins/google_auth/router.py +0 -170
- {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/entry_points.txt +0 -0
- {mindroot-8.9.0.dist-info → mindroot-8.11.0.dist-info}/licenses/LICENSE +0 -0
- {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)
|
|
@@ -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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
456
|
-
mindroot/coreplugins/chat/services.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
1780
|
-
mindroot/lib/chatlog.py,sha256=
|
|
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=
|
|
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.
|
|
1829
|
-
mindroot-8.
|
|
1830
|
-
mindroot-8.
|
|
1831
|
-
mindroot-8.
|
|
1832
|
-
mindroot-8.
|
|
1833
|
-
mindroot-8.
|
|
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,,
|