jarvis-ai-assistant 0.3.16__py3-none-any.whl → 0.3.17__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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/jarvis.py +352 -182
- jarvis/jarvis_agent/session_manager.py +9 -1
- jarvis/jarvis_agent/task_manager.py +11 -6
- jarvis/jarvis_data/config_schema.json +34 -0
- jarvis/jarvis_utils/config.py +48 -0
- jarvis/jarvis_utils/input.py +49 -3
- jarvis/jarvis_utils/utils.py +142 -0
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/RECORD +14 -14
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
jarvis/jarvis_agent/jarvis.py
CHANGED
@@ -10,6 +10,14 @@ from jarvis.jarvis_agent.config_editor import ConfigEditor
|
|
10
10
|
from jarvis.jarvis_agent.methodology_share_manager import MethodologyShareManager
|
11
11
|
from jarvis.jarvis_agent.tool_share_manager import ToolShareManager
|
12
12
|
from jarvis.jarvis_utils.utils import init_env
|
13
|
+
from jarvis.jarvis_utils.config import (
|
14
|
+
is_enable_git_repo_jca_switch,
|
15
|
+
is_enable_builtin_config_selector,
|
16
|
+
get_agent_definition_dirs,
|
17
|
+
get_multi_agent_dirs,
|
18
|
+
get_roles_dirs,
|
19
|
+
)
|
20
|
+
import jarvis.jarvis_utils.utils as jutils
|
13
21
|
from jarvis.jarvis_utils.input import user_confirm, get_single_line_input
|
14
22
|
import os
|
15
23
|
import sys
|
@@ -22,6 +30,337 @@ from rich.console import Console
|
|
22
30
|
app = typer.Typer(help="Jarvis AI 助手")
|
23
31
|
|
24
32
|
|
33
|
+
def print_commands_overview() -> None:
|
34
|
+
"""打印命令与快捷方式总览表。"""
|
35
|
+
try:
|
36
|
+
cmd_table = Table(show_header=True, header_style="bold magenta")
|
37
|
+
cmd_table.add_column("命令", style="bold")
|
38
|
+
cmd_table.add_column("快捷方式", style="cyan")
|
39
|
+
cmd_table.add_column("功能描述", style="white")
|
40
|
+
|
41
|
+
cmd_table.add_row("jarvis", "jvs", "通用AI代理,适用于多种任务")
|
42
|
+
cmd_table.add_row("jarvis-agent", "ja", "AI代理基础功能,处理会话和任务")
|
43
|
+
cmd_table.add_row(
|
44
|
+
"jarvis-code-agent",
|
45
|
+
"jca",
|
46
|
+
"专注于代码分析、修改和生成的代码代理",
|
47
|
+
)
|
48
|
+
cmd_table.add_row("jarvis-code-review", "jcr", "智能代码审查工具")
|
49
|
+
cmd_table.add_row(
|
50
|
+
"jarvis-git-commit",
|
51
|
+
"jgc",
|
52
|
+
"自动化分析代码变更并生成规范的Git提交信息",
|
53
|
+
)
|
54
|
+
cmd_table.add_row("jarvis-git-squash", "jgs", "Git提交历史整理工具")
|
55
|
+
cmd_table.add_row(
|
56
|
+
"jarvis-platform-manager",
|
57
|
+
"jpm",
|
58
|
+
"管理和测试不同的大语言模型平台",
|
59
|
+
)
|
60
|
+
cmd_table.add_row("jarvis-multi-agent", "jma", "多智能体协作系统")
|
61
|
+
cmd_table.add_row("jarvis-tool", "jt", "工具管理与调用系统")
|
62
|
+
cmd_table.add_row("jarvis-methodology", "jm", "方法论知识库管理")
|
63
|
+
cmd_table.add_row(
|
64
|
+
"jarvis-rag",
|
65
|
+
"jrg",
|
66
|
+
"构建和查询本地化的RAG知识库",
|
67
|
+
)
|
68
|
+
cmd_table.add_row("jarvis-smart-shell", "jss", "实验性的智能Shell功能")
|
69
|
+
cmd_table.add_row(
|
70
|
+
"jarvis-stats",
|
71
|
+
"jst",
|
72
|
+
"通用统计模块,支持记录和可视化任意指标数据",
|
73
|
+
)
|
74
|
+
cmd_table.add_row(
|
75
|
+
"jarvis-memory-organizer",
|
76
|
+
"jmo",
|
77
|
+
"记忆管理工具,支持整理、合并、导入导出记忆",
|
78
|
+
)
|
79
|
+
|
80
|
+
Console().print(cmd_table)
|
81
|
+
except Exception:
|
82
|
+
# 静默忽略渲染异常,避免影响主流程
|
83
|
+
pass
|
84
|
+
|
85
|
+
def handle_edit_option(edit: bool, config_file: Optional[str]) -> bool:
|
86
|
+
"""处理配置文件编辑选项,返回是否已处理并需提前结束。"""
|
87
|
+
if edit:
|
88
|
+
ConfigEditor.edit_config(config_file)
|
89
|
+
return True
|
90
|
+
return False
|
91
|
+
|
92
|
+
|
93
|
+
def handle_share_methodology_option(
|
94
|
+
share_methodology: bool, config_file: Optional[str]
|
95
|
+
) -> bool:
|
96
|
+
"""处理方法论分享选项,返回是否已处理并需提前结束。"""
|
97
|
+
if share_methodology:
|
98
|
+
init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
|
99
|
+
methodology_manager = MethodologyShareManager()
|
100
|
+
methodology_manager.run()
|
101
|
+
return True
|
102
|
+
return False
|
103
|
+
|
104
|
+
|
105
|
+
def handle_share_tool_option(share_tool: bool, config_file: Optional[str]) -> bool:
|
106
|
+
"""处理工具分享选项,返回是否已处理并需提前结束。"""
|
107
|
+
if share_tool:
|
108
|
+
init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
|
109
|
+
tool_manager = ToolShareManager()
|
110
|
+
tool_manager.run()
|
111
|
+
return True
|
112
|
+
return False
|
113
|
+
|
114
|
+
|
115
|
+
def preload_config_for_flags(config_file: Optional[str]) -> None:
|
116
|
+
"""预加载配置(仅用于读取功能开关),不会显示欢迎信息或影响后续 init_env。"""
|
117
|
+
try:
|
118
|
+
jutils.g_config_file = config_file
|
119
|
+
jutils.load_config()
|
120
|
+
except Exception:
|
121
|
+
# 静默忽略配置加载异常
|
122
|
+
pass
|
123
|
+
|
124
|
+
|
125
|
+
def try_switch_to_jca_if_git_repo(
|
126
|
+
llm_type: str,
|
127
|
+
model_group: Optional[str],
|
128
|
+
tool_group: Optional[str],
|
129
|
+
config_file: Optional[str],
|
130
|
+
restore_session: bool,
|
131
|
+
task: Optional[str],
|
132
|
+
) -> None:
|
133
|
+
"""在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)。"""
|
134
|
+
if is_enable_git_repo_jca_switch():
|
135
|
+
try:
|
136
|
+
res = subprocess.run(
|
137
|
+
["git", "rev-parse", "--show-toplevel"],
|
138
|
+
capture_output=True,
|
139
|
+
text=True,
|
140
|
+
)
|
141
|
+
if res.returncode == 0:
|
142
|
+
git_root = res.stdout.strip()
|
143
|
+
if git_root and os.path.isdir(git_root):
|
144
|
+
PrettyOutput.print(
|
145
|
+
f"检测到当前位于 Git 仓库: {git_root}", OutputType.INFO
|
146
|
+
)
|
147
|
+
if user_confirm(
|
148
|
+
"检测到Git仓库,是否切换到代码开发模式(jca)?", default=False
|
149
|
+
):
|
150
|
+
# 构建并切换到 jarvis-code-agent 命令,传递兼容参数
|
151
|
+
args = ["jarvis-code-agent"]
|
152
|
+
if llm_type:
|
153
|
+
args += ["-t", llm_type]
|
154
|
+
if model_group:
|
155
|
+
args += ["-g", model_group]
|
156
|
+
if tool_group:
|
157
|
+
args += ["-G", tool_group]
|
158
|
+
if config_file:
|
159
|
+
args += ["-f", config_file]
|
160
|
+
if restore_session:
|
161
|
+
args += ["--restore-session"]
|
162
|
+
if task:
|
163
|
+
args += ["-r", task]
|
164
|
+
PrettyOutput.print(
|
165
|
+
"正在切换到 'jca'(jarvis-code-agent)以进入代码开发模式...",
|
166
|
+
OutputType.INFO,
|
167
|
+
)
|
168
|
+
os.execvp(args[0], args)
|
169
|
+
except Exception:
|
170
|
+
# 静默忽略检测异常,不影响主流程
|
171
|
+
pass
|
172
|
+
|
173
|
+
|
174
|
+
def handle_builtin_config_selector(
|
175
|
+
llm_type: str,
|
176
|
+
model_group: Optional[str],
|
177
|
+
tool_group: Optional[str],
|
178
|
+
config_file: Optional[str],
|
179
|
+
task: Optional[str],
|
180
|
+
) -> None:
|
181
|
+
"""在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)。"""
|
182
|
+
if is_enable_builtin_config_selector():
|
183
|
+
try:
|
184
|
+
# 优先使用项目内置目录,若不存在则回退到指定的绝对路径
|
185
|
+
builtin_root = Path(__file__).resolve().parents[3] / "builtin"
|
186
|
+
if not builtin_root.exists():
|
187
|
+
builtin_root = Path("/home/skyfire/code/Jarvis/builtin")
|
188
|
+
|
189
|
+
categories = [
|
190
|
+
("agent", "jarvis-agent", "*.yaml"),
|
191
|
+
("multi_agent", "jarvis-multi-agent", "*.yaml"),
|
192
|
+
("roles", "jarvis-platform-manager", "*.yaml"),
|
193
|
+
]
|
194
|
+
|
195
|
+
options = []
|
196
|
+
for cat, cmd, pattern in categories:
|
197
|
+
# 构建待扫描目录列表:优先使用配置中的目录,其次回退到内置目录
|
198
|
+
search_dirs = []
|
199
|
+
try:
|
200
|
+
if cat == "agent":
|
201
|
+
search_dirs.extend(
|
202
|
+
[Path(p) for p in get_agent_definition_dirs() if p]
|
203
|
+
)
|
204
|
+
elif cat == "multi_agent":
|
205
|
+
search_dirs.extend(
|
206
|
+
[Path(p) for p in get_multi_agent_dirs() if p]
|
207
|
+
)
|
208
|
+
elif cat == "roles":
|
209
|
+
search_dirs.extend([Path(p) for p in get_roles_dirs() if p])
|
210
|
+
except Exception:
|
211
|
+
# 忽略配置读取异常
|
212
|
+
pass
|
213
|
+
|
214
|
+
# 追加内置目录
|
215
|
+
search_dirs.append(builtin_root / cat)
|
216
|
+
|
217
|
+
# 去重并保留顺序
|
218
|
+
unique_dirs = []
|
219
|
+
seen = set()
|
220
|
+
for d in search_dirs:
|
221
|
+
try:
|
222
|
+
key = str(Path(d).resolve())
|
223
|
+
except Exception:
|
224
|
+
key = str(d)
|
225
|
+
if key not in seen:
|
226
|
+
seen.add(key)
|
227
|
+
unique_dirs.append(Path(d))
|
228
|
+
|
229
|
+
# 每日自动更新配置目录(如目录为Git仓库则执行git pull,每日仅一次)
|
230
|
+
try:
|
231
|
+
jutils.daily_check_git_updates([str(p) for p in unique_dirs], cat)
|
232
|
+
except Exception:
|
233
|
+
# 忽略更新过程中的所有异常,避免影响主流程
|
234
|
+
pass
|
235
|
+
|
236
|
+
for dir_path in unique_dirs:
|
237
|
+
if not dir_path.exists():
|
238
|
+
continue
|
239
|
+
for fpath in sorted(dir_path.glob(pattern)):
|
240
|
+
# 解析YAML以获取可读名称/描述(失败时静默降级为文件名)
|
241
|
+
name = fpath.stem
|
242
|
+
desc = ""
|
243
|
+
try:
|
244
|
+
with open(
|
245
|
+
fpath, "r", encoding="utf-8", errors="ignore"
|
246
|
+
) as fh:
|
247
|
+
data = yaml.safe_load(fh) or {}
|
248
|
+
if isinstance(data, dict):
|
249
|
+
name = data.get("name") or data.get("title") or name
|
250
|
+
desc = data.get("description") or data.get("desc") or ""
|
251
|
+
if cat == "roles" and isinstance(
|
252
|
+
data.get("roles"), list
|
253
|
+
):
|
254
|
+
if not desc:
|
255
|
+
desc = f"{len(data['roles'])} 个角色"
|
256
|
+
except Exception:
|
257
|
+
# 忽略解析错误,使用默认显示
|
258
|
+
pass
|
259
|
+
|
260
|
+
# 为 roles 构建详细信息(每个角色的名称与描述)
|
261
|
+
details = ""
|
262
|
+
if cat == "roles":
|
263
|
+
roles = (data or {}).get("roles", [])
|
264
|
+
if isinstance(roles, list):
|
265
|
+
lines = []
|
266
|
+
for role in roles:
|
267
|
+
if isinstance(role, dict):
|
268
|
+
rname = str(role.get("name", "") or "")
|
269
|
+
rdesc = str(role.get("description", "") or "")
|
270
|
+
lines.append(
|
271
|
+
f"{rname} - {rdesc}" if rdesc else rname
|
272
|
+
)
|
273
|
+
details = "\n".join([ln for ln in lines if ln])
|
274
|
+
# 如果没有角色详情,退回到统计信息
|
275
|
+
if not details and isinstance(
|
276
|
+
(data or {}).get("roles"), list
|
277
|
+
):
|
278
|
+
details = f"{len(data['roles'])} 个角色"
|
279
|
+
|
280
|
+
options.append(
|
281
|
+
{
|
282
|
+
"category": cat,
|
283
|
+
"cmd": cmd,
|
284
|
+
"file": str(fpath),
|
285
|
+
"name": str(name),
|
286
|
+
"desc": str(desc),
|
287
|
+
"details": str(details),
|
288
|
+
}
|
289
|
+
)
|
290
|
+
|
291
|
+
if options:
|
292
|
+
PrettyOutput.section("可用的内置配置", OutputType.SUCCESS)
|
293
|
+
# 使用 rich Table 呈现
|
294
|
+
table = Table(show_header=True, header_style="bold magenta")
|
295
|
+
table.add_column("No.", style="cyan", no_wrap=True)
|
296
|
+
table.add_column("类型", style="green", no_wrap=True)
|
297
|
+
table.add_column("名称", style="bold")
|
298
|
+
table.add_column("文件", style="dim")
|
299
|
+
table.add_column("描述", style="white")
|
300
|
+
|
301
|
+
for idx, opt in enumerate(options, 1):
|
302
|
+
category = opt.get("category", "")
|
303
|
+
name = opt.get("name", "")
|
304
|
+
file_path = opt.get("file", "")
|
305
|
+
# 描述列显示配置描述;若为 roles 则显示角色列表
|
306
|
+
if category == "roles":
|
307
|
+
desc_display = opt.get("details", "")
|
308
|
+
else:
|
309
|
+
desc_display = opt.get("desc", "")
|
310
|
+
table.add_row(str(idx), category, name, file_path, desc_display)
|
311
|
+
|
312
|
+
Console().print(table)
|
313
|
+
|
314
|
+
choice = get_single_line_input(
|
315
|
+
"选择要启动的配置编号,直接回车使用默认通用代理(jvs): ", default=""
|
316
|
+
)
|
317
|
+
|
318
|
+
if choice.strip():
|
319
|
+
try:
|
320
|
+
index = int(choice.strip())
|
321
|
+
if 1 <= index <= len(options):
|
322
|
+
sel = options[index - 1]
|
323
|
+
args = []
|
324
|
+
|
325
|
+
if sel["category"] == "agent":
|
326
|
+
# jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition
|
327
|
+
args = [sel["cmd"], "-c", sel["file"]]
|
328
|
+
if llm_type:
|
329
|
+
args += ["--llm-type", llm_type]
|
330
|
+
if model_group:
|
331
|
+
args += ["-g", model_group]
|
332
|
+
if config_file:
|
333
|
+
args += ["-f", config_file]
|
334
|
+
if task:
|
335
|
+
args += ["--task", task]
|
336
|
+
|
337
|
+
elif sel["category"] == "multi_agent":
|
338
|
+
# jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
|
339
|
+
args = [sel["cmd"], "-c", sel["file"]]
|
340
|
+
if task:
|
341
|
+
args += ["-i", task]
|
342
|
+
|
343
|
+
elif sel["category"] == "roles":
|
344
|
+
# jarvis-platform-manager role 子命令,支持 -c/-t/-g
|
345
|
+
args = [sel["cmd"], "role", "-c", sel["file"]]
|
346
|
+
if llm_type:
|
347
|
+
args += ["-t", llm_type]
|
348
|
+
if model_group:
|
349
|
+
args += ["-g", model_group]
|
350
|
+
|
351
|
+
if args:
|
352
|
+
PrettyOutput.print(
|
353
|
+
f"正在启动: {' '.join(args)}", OutputType.INFO
|
354
|
+
)
|
355
|
+
os.execvp(args[0], args)
|
356
|
+
except Exception:
|
357
|
+
# 任何异常都不影响默认流程
|
358
|
+
pass
|
359
|
+
except Exception:
|
360
|
+
# 静默忽略内置配置扫描错误,不影响主流程
|
361
|
+
pass
|
362
|
+
|
363
|
+
|
25
364
|
@app.callback(invoke_without_command=True)
|
26
365
|
def run_cli(
|
27
366
|
ctx: typer.Context,
|
@@ -60,200 +399,31 @@ def run_cli(
|
|
60
399
|
if ctx.invoked_subcommand is not None:
|
61
400
|
return
|
62
401
|
|
402
|
+
# 使用 rich 输出命令与快捷方式总览
|
403
|
+
print_commands_overview()
|
404
|
+
|
63
405
|
# 处理配置文件编辑
|
64
|
-
if edit:
|
65
|
-
ConfigEditor.edit_config(config_file)
|
406
|
+
if handle_edit_option(edit, config_file):
|
66
407
|
return
|
67
408
|
|
68
409
|
# 处理方法论分享
|
69
|
-
if share_methodology:
|
70
|
-
init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
|
71
|
-
methodology_manager = MethodologyShareManager()
|
72
|
-
methodology_manager.run()
|
410
|
+
if handle_share_methodology_option(share_methodology, config_file):
|
73
411
|
return
|
74
412
|
|
75
413
|
# 处理工具分享
|
76
|
-
if share_tool:
|
77
|
-
init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
|
78
|
-
tool_manager = ToolShareManager()
|
79
|
-
tool_manager.run()
|
414
|
+
if handle_share_tool_option(share_tool, config_file):
|
80
415
|
return
|
81
416
|
|
417
|
+
# 预加载配置(仅用于读取功能开关),不会显示欢迎信息或影响后续 init_env
|
418
|
+
preload_config_for_flags(config_file)
|
419
|
+
|
82
420
|
# 在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
capture_output=True,
|
87
|
-
text=True,
|
88
|
-
)
|
89
|
-
if res.returncode == 0:
|
90
|
-
git_root = res.stdout.strip()
|
91
|
-
if git_root and os.path.isdir(git_root):
|
92
|
-
PrettyOutput.print(
|
93
|
-
f"检测到当前位于 Git 仓库: {git_root}", OutputType.INFO
|
94
|
-
)
|
95
|
-
if user_confirm(
|
96
|
-
"检测到Git仓库,是否切换到代码开发模式(jca)?", default=False
|
97
|
-
):
|
98
|
-
# 构建并切换到 jarvis-code-agent 命令,传递兼容参数
|
99
|
-
args = ["jarvis-code-agent"]
|
100
|
-
if llm_type:
|
101
|
-
args += ["-t", llm_type]
|
102
|
-
if model_group:
|
103
|
-
args += ["-g", model_group]
|
104
|
-
if tool_group:
|
105
|
-
args += ["-G", tool_group]
|
106
|
-
if config_file:
|
107
|
-
args += ["-f", config_file]
|
108
|
-
if restore_session:
|
109
|
-
args += ["--restore-session"]
|
110
|
-
if task:
|
111
|
-
args += ["-r", task]
|
112
|
-
PrettyOutput.print(
|
113
|
-
"正在切换到 'jca'(jarvis-code-agent)以进入代码开发模式...",
|
114
|
-
OutputType.INFO,
|
115
|
-
)
|
116
|
-
os.execvp(args[0], args)
|
117
|
-
except Exception:
|
118
|
-
# 静默忽略检测异常,不影响主流程
|
119
|
-
pass
|
421
|
+
try_switch_to_jca_if_git_repo(
|
422
|
+
llm_type, model_group, tool_group, config_file, restore_session, task
|
423
|
+
)
|
120
424
|
|
121
425
|
# 在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)
|
122
|
-
|
123
|
-
# 优先使用项目内置目录,若不存在则回退到指定的绝对路径
|
124
|
-
builtin_root = Path(__file__).resolve().parents[3] / "builtin"
|
125
|
-
if not builtin_root.exists():
|
126
|
-
builtin_root = Path("/home/skyfire/code/Jarvis/builtin")
|
127
|
-
|
128
|
-
categories = [
|
129
|
-
("agent", "jarvis-agent", "*.yaml"),
|
130
|
-
("multi_agent", "jarvis-multi-agent", "*.yaml"),
|
131
|
-
("roles", "jarvis-platform-manager", "*.yaml"),
|
132
|
-
]
|
133
|
-
|
134
|
-
options = []
|
135
|
-
for cat, cmd, pattern in categories:
|
136
|
-
dir_path = builtin_root / cat
|
137
|
-
if not dir_path.exists():
|
138
|
-
continue
|
139
|
-
for fpath in sorted(dir_path.glob(pattern)):
|
140
|
-
# 解析YAML以获取可读名称/描述(失败时静默降级为文件名)
|
141
|
-
name = fpath.stem
|
142
|
-
desc = ""
|
143
|
-
try:
|
144
|
-
with open(fpath, "r", encoding="utf-8", errors="ignore") as fh:
|
145
|
-
data = yaml.safe_load(fh) or {}
|
146
|
-
if isinstance(data, dict):
|
147
|
-
name = data.get("name") or data.get("title") or name
|
148
|
-
desc = data.get("description") or data.get("desc") or ""
|
149
|
-
if cat == "roles" and isinstance(data.get("roles"), list):
|
150
|
-
if not desc:
|
151
|
-
desc = f"{len(data['roles'])} 个角色"
|
152
|
-
except Exception:
|
153
|
-
# 忽略解析错误,使用默认显示
|
154
|
-
pass
|
155
|
-
|
156
|
-
# 为 roles 构建详细信息(每个角色的名称与描述)
|
157
|
-
details = ""
|
158
|
-
if cat == "roles":
|
159
|
-
roles = (data or {}).get("roles", [])
|
160
|
-
if isinstance(roles, list):
|
161
|
-
lines = []
|
162
|
-
for role in roles:
|
163
|
-
if isinstance(role, dict):
|
164
|
-
rname = str(role.get("name", "") or "")
|
165
|
-
rdesc = str(role.get("description", "") or "")
|
166
|
-
lines.append(f"{rname} - {rdesc}" if rdesc else rname)
|
167
|
-
details = "\n".join([ln for ln in lines if ln])
|
168
|
-
# 如果没有角色详情,退回到统计信息
|
169
|
-
if not details and isinstance((data or {}).get("roles"), list):
|
170
|
-
details = f"{len(data['roles'])} 个角色"
|
171
|
-
|
172
|
-
options.append(
|
173
|
-
{
|
174
|
-
"category": cat,
|
175
|
-
"cmd": cmd,
|
176
|
-
"file": str(fpath),
|
177
|
-
"name": str(name),
|
178
|
-
"desc": str(desc),
|
179
|
-
"details": str(details),
|
180
|
-
}
|
181
|
-
)
|
182
|
-
|
183
|
-
if options:
|
184
|
-
PrettyOutput.section("可用的内置配置", OutputType.SUCCESS)
|
185
|
-
# 使用 rich Table 呈现
|
186
|
-
table = Table(show_header=True, header_style="bold magenta")
|
187
|
-
table.add_column("No.", style="cyan", no_wrap=True)
|
188
|
-
table.add_column("类型", style="green", no_wrap=True)
|
189
|
-
table.add_column("名称", style="bold")
|
190
|
-
table.add_column("文件", style="dim")
|
191
|
-
table.add_column("描述/详情", style="white")
|
192
|
-
|
193
|
-
for idx, opt in enumerate(options, 1):
|
194
|
-
category = opt.get("category", "")
|
195
|
-
name = opt.get("name", "")
|
196
|
-
file_path = opt.get("file", "")
|
197
|
-
# multi_agent: 优先显示顶层描述
|
198
|
-
# roles: 显示每个角色名称与描述(多行)
|
199
|
-
# 其他:显示 desc
|
200
|
-
if category == "roles" and opt.get("details"):
|
201
|
-
detail = opt["details"]
|
202
|
-
else:
|
203
|
-
detail = opt.get("desc", "")
|
204
|
-
|
205
|
-
table.add_row(str(idx), category, name, file_path, detail)
|
206
|
-
|
207
|
-
Console().print(table)
|
208
|
-
|
209
|
-
choice = get_single_line_input(
|
210
|
-
"选择要启动的配置编号,直接回车使用默认通用代理(jvs): ", default=""
|
211
|
-
)
|
212
|
-
|
213
|
-
if choice.strip():
|
214
|
-
try:
|
215
|
-
index = int(choice.strip())
|
216
|
-
if 1 <= index <= len(options):
|
217
|
-
sel = options[index - 1]
|
218
|
-
args = []
|
219
|
-
|
220
|
-
if sel["category"] == "agent":
|
221
|
-
# jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition
|
222
|
-
args = [sel["cmd"], "-c", sel["file"]]
|
223
|
-
if llm_type:
|
224
|
-
args += ["--llm-type", llm_type]
|
225
|
-
if model_group:
|
226
|
-
args += ["-g", model_group]
|
227
|
-
if config_file:
|
228
|
-
args += ["-f", config_file]
|
229
|
-
if task:
|
230
|
-
args += ["--task", task]
|
231
|
-
|
232
|
-
elif sel["category"] == "multi_agent":
|
233
|
-
# jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
|
234
|
-
args = [sel["cmd"], "-c", sel["file"]]
|
235
|
-
if task:
|
236
|
-
args += ["-i", task]
|
237
|
-
|
238
|
-
elif sel["category"] == "roles":
|
239
|
-
# jarvis-platform-manager role 子命令,支持 -c/-t/-g
|
240
|
-
args = [sel["cmd"], "role", "-c", sel["file"]]
|
241
|
-
if llm_type:
|
242
|
-
args += ["-t", llm_type]
|
243
|
-
if model_group:
|
244
|
-
args += ["-g", model_group]
|
245
|
-
|
246
|
-
if args:
|
247
|
-
PrettyOutput.print(
|
248
|
-
f"正在启动: {' '.join(args)}", OutputType.INFO
|
249
|
-
)
|
250
|
-
os.execvp(args[0], args)
|
251
|
-
except Exception:
|
252
|
-
# 任何异常都不影响默认流程
|
253
|
-
pass
|
254
|
-
except Exception:
|
255
|
-
# 静默忽略内置配置扫描错误,不影响主流程
|
256
|
-
pass
|
426
|
+
handle_builtin_config_selector(llm_type, model_group, tool_group, config_file, task)
|
257
427
|
|
258
428
|
# 初始化环境
|
259
429
|
init_env(
|
@@ -67,10 +67,18 @@ class SessionManager:
|
|
67
67
|
return True
|
68
68
|
return False
|
69
69
|
|
70
|
-
def clear_history(self):
|
70
|
+
def clear_history(self) -> None:
|
71
71
|
"""
|
72
72
|
Clears conversation history but keeps the system prompt by resetting the model state.
|
73
73
|
"""
|
74
74
|
self.prompt = ""
|
75
75
|
self.model.reset()
|
76
76
|
self.conversation_length = 0
|
77
|
+
|
78
|
+
def clear(self) -> None:
|
79
|
+
"""
|
80
|
+
Clears the session state, resetting prompt and conversation length while
|
81
|
+
preserving user_data. This method is an alias of clear_history for backward
|
82
|
+
compatibility with existing tests and callers.
|
83
|
+
"""
|
84
|
+
self.clear_history()
|
@@ -3,8 +3,10 @@
|
|
3
3
|
import os
|
4
4
|
from typing import Dict
|
5
5
|
|
6
|
-
import yaml
|
6
|
+
import yaml # type: ignore
|
7
7
|
from prompt_toolkit import prompt
|
8
|
+
from rich.table import Table
|
9
|
+
from rich.console import Console
|
8
10
|
|
9
11
|
from jarvis.jarvis_agent import (
|
10
12
|
OutputType,
|
@@ -68,16 +70,19 @@ class TaskManager:
|
|
68
70
|
return ""
|
69
71
|
|
70
72
|
task_names = list(tasks.keys())
|
71
|
-
|
73
|
+
# 使用 rich.Table 展示预定义任务
|
74
|
+
table = Table(show_header=True, header_style="bold magenta")
|
75
|
+
table.add_column("No.", style="cyan", no_wrap=True)
|
76
|
+
table.add_column("任务名", style="bold")
|
72
77
|
for i, name in enumerate(task_names, 1):
|
73
|
-
|
74
|
-
|
75
|
-
PrettyOutput.print("
|
78
|
+
table.add_row(str(i), name)
|
79
|
+
Console().print(table)
|
80
|
+
PrettyOutput.print("[0] 跳过预定义任务", OutputType.INFO)
|
76
81
|
|
77
82
|
while True:
|
78
83
|
try:
|
79
84
|
choice_str = prompt(
|
80
|
-
"\n请选择一个任务编号(0
|
85
|
+
"\n请选择一个任务编号(0 或者直接回车跳过预定义任务):"
|
81
86
|
).strip()
|
82
87
|
if not choice_str:
|
83
88
|
return ""
|
@@ -235,6 +235,30 @@
|
|
235
235
|
},
|
236
236
|
"default": []
|
237
237
|
},
|
238
|
+
"JARVIS_AGENT_DEFINITION_DIRS": {
|
239
|
+
"type": "array",
|
240
|
+
"description": "agent 定义加载目录",
|
241
|
+
"items": {
|
242
|
+
"type": "string"
|
243
|
+
},
|
244
|
+
"default": []
|
245
|
+
},
|
246
|
+
"JARVIS_MULTI_AGENT_DIRS": {
|
247
|
+
"type": "array",
|
248
|
+
"description": "multi_agent 加载目录",
|
249
|
+
"items": {
|
250
|
+
"type": "string"
|
251
|
+
},
|
252
|
+
"default": []
|
253
|
+
},
|
254
|
+
"JARVIS_ROLES_DIRS": {
|
255
|
+
"type": "array",
|
256
|
+
"description": "roles 加载目录",
|
257
|
+
"items": {
|
258
|
+
"type": "string"
|
259
|
+
},
|
260
|
+
"default": []
|
261
|
+
},
|
238
262
|
"JARVIS_CENTRAL_METHODOLOGY_REPO": {
|
239
263
|
"type": "string",
|
240
264
|
"description": "中心方法论Git仓库地址,该仓库会自动添加到方法论加载路径中",
|
@@ -260,6 +284,16 @@
|
|
260
284
|
"description": "是否强制保存记忆",
|
261
285
|
"default": true
|
262
286
|
},
|
287
|
+
"JARVIS_ENABLE_GIT_JCA_SWITCH": {
|
288
|
+
"type": "boolean",
|
289
|
+
"description": "在初始化环境前检测Git仓库并提示可切换到代码开发模式(jca)",
|
290
|
+
"default": false
|
291
|
+
},
|
292
|
+
"JARVIS_ENABLE_STARTUP_CONFIG_SELECTOR": {
|
293
|
+
"type": "boolean",
|
294
|
+
"description": "在进入默认通用代理前,列出可用配置(agent/multi_agent/roles)供选择",
|
295
|
+
"default": false
|
296
|
+
},
|
263
297
|
"JARVIS_TOOL_GROUP": {
|
264
298
|
"type": "string",
|
265
299
|
"description": "选择一个预定义的工具配置组",
|
jarvis/jarvis_utils/config.py
CHANGED
@@ -309,6 +309,36 @@ def get_methodology_dirs() -> List[str]:
|
|
309
309
|
return GLOBAL_CONFIG_DATA.get("JARVIS_METHODOLOGY_DIRS", [])
|
310
310
|
|
311
311
|
|
312
|
+
def get_agent_definition_dirs() -> List[str]:
|
313
|
+
"""
|
314
|
+
获取 agent 定义的加载目录。
|
315
|
+
|
316
|
+
返回:
|
317
|
+
List[str]: agent 定义加载目录列表
|
318
|
+
"""
|
319
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_AGENT_DEFINITION_DIRS", [])
|
320
|
+
|
321
|
+
|
322
|
+
def get_multi_agent_dirs() -> List[str]:
|
323
|
+
"""
|
324
|
+
获取 multi_agent 的加载目录。
|
325
|
+
|
326
|
+
返回:
|
327
|
+
List[str]: multi_agent 加载目录列表
|
328
|
+
"""
|
329
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_MULTI_AGENT_DIRS", [])
|
330
|
+
|
331
|
+
|
332
|
+
def get_roles_dirs() -> List[str]:
|
333
|
+
"""
|
334
|
+
获取 roles 的加载目录。
|
335
|
+
|
336
|
+
返回:
|
337
|
+
List[str]: roles 加载目录列表
|
338
|
+
"""
|
339
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_ROLES_DIRS", [])
|
340
|
+
|
341
|
+
|
312
342
|
def get_central_methodology_repo() -> str:
|
313
343
|
"""
|
314
344
|
获取中心方法论Git仓库地址。
|
@@ -576,3 +606,21 @@ def get_tool_dont_use_list() -> List[str]:
|
|
576
606
|
"""
|
577
607
|
config = _get_resolved_tool_config()
|
578
608
|
return config.get("dont_use", [])
|
609
|
+
|
610
|
+
|
611
|
+
def is_enable_git_repo_jca_switch() -> bool:
|
612
|
+
"""
|
613
|
+
是否启用:在初始化环境前检测Git仓库并提示可切换到代码开发模式(jca)
|
614
|
+
默认关闭
|
615
|
+
"""
|
616
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_ENABLE_GIT_JCA_SWITCH", False) is True
|
617
|
+
|
618
|
+
|
619
|
+
def is_enable_builtin_config_selector() -> bool:
|
620
|
+
"""
|
621
|
+
是否启用:在进入默认通用代理前,列出可用配置(agent/multi_agent/roles)供选择
|
622
|
+
默认关闭
|
623
|
+
"""
|
624
|
+
return (
|
625
|
+
GLOBAL_CONFIG_DATA.get("JARVIS_ENABLE_STARTUP_CONFIG_SELECTOR", False) is True
|
626
|
+
)
|
jarvis/jarvis_utils/input.py
CHANGED
@@ -15,7 +15,7 @@ from colorama import Fore
|
|
15
15
|
from colorama import Style as ColoramaStyle
|
16
16
|
from fuzzywuzzy import process
|
17
17
|
from prompt_toolkit import PromptSession
|
18
|
-
from prompt_toolkit.application import Application
|
18
|
+
from prompt_toolkit.application import Application, run_in_terminal
|
19
19
|
from prompt_toolkit.completion import CompleteEvent
|
20
20
|
from prompt_toolkit.completion import (
|
21
21
|
Completer,
|
@@ -40,6 +40,28 @@ from jarvis.jarvis_utils.tag import ot
|
|
40
40
|
# Sentinel value to indicate that Ctrl+O was pressed
|
41
41
|
CTRL_O_SENTINEL = "__CTRL_O_PRESSED__"
|
42
42
|
|
43
|
+
# Persistent hint marker for multiline input (shown only once across runs)
|
44
|
+
_MULTILINE_HINT_MARK_FILE = os.path.join(get_data_dir(), "multiline_enter_hint_shown")
|
45
|
+
|
46
|
+
|
47
|
+
def _multiline_hint_already_shown() -> bool:
|
48
|
+
"""Check if the multiline Enter hint has been shown before (persisted)."""
|
49
|
+
try:
|
50
|
+
return os.path.exists(_MULTILINE_HINT_MARK_FILE)
|
51
|
+
except Exception:
|
52
|
+
return False
|
53
|
+
|
54
|
+
|
55
|
+
def _mark_multiline_hint_shown() -> None:
|
56
|
+
"""Persist that the multiline Enter hint has been shown."""
|
57
|
+
try:
|
58
|
+
os.makedirs(os.path.dirname(_MULTILINE_HINT_MARK_FILE), exist_ok=True)
|
59
|
+
with open(_MULTILINE_HINT_MARK_FILE, "w", encoding="utf-8") as f:
|
60
|
+
f.write("1")
|
61
|
+
except Exception:
|
62
|
+
# Non-critical persistence failure; ignore to avoid breaking input flow
|
63
|
+
pass
|
64
|
+
|
43
65
|
|
44
66
|
def get_single_line_input(tip: str, default: str = "") -> str:
|
45
67
|
"""
|
@@ -315,8 +337,32 @@ def _get_multiline_input_internal(tip: str) -> str:
|
|
315
337
|
"""
|
316
338
|
bindings = KeyBindings()
|
317
339
|
|
340
|
+
# Show a one-time hint on the first Enter press in this invocation
|
341
|
+
first_enter_hint_shown = False
|
342
|
+
|
318
343
|
@bindings.add("enter")
|
319
344
|
def _(event):
|
345
|
+
nonlocal first_enter_hint_shown
|
346
|
+
if not first_enter_hint_shown and not _multiline_hint_already_shown():
|
347
|
+
first_enter_hint_shown = True
|
348
|
+
|
349
|
+
def _show_notice():
|
350
|
+
print(
|
351
|
+
f"{Fore.YELLOW}提示:当前支持多行输入。输入完成请使用 Ctrl+J 确认;Enter 仅用于换行。{ColoramaStyle.RESET_ALL}"
|
352
|
+
)
|
353
|
+
try:
|
354
|
+
input("按回车继续...")
|
355
|
+
except Exception:
|
356
|
+
pass
|
357
|
+
# Persist the hint so it won't be shown again in future runs
|
358
|
+
try:
|
359
|
+
_mark_multiline_hint_shown()
|
360
|
+
except Exception:
|
361
|
+
pass
|
362
|
+
|
363
|
+
run_in_terminal(_show_notice)
|
364
|
+
return
|
365
|
+
|
320
366
|
if event.current_buffer.complete_state:
|
321
367
|
completion = event.current_buffer.complete_state.current_completion
|
322
368
|
if completion:
|
@@ -363,7 +409,7 @@ def get_multiline_input(tip: str) -> str:
|
|
363
409
|
此函数处理控制流,允许在不破坏终端状态的情况下处理历史记录复制。
|
364
410
|
"""
|
365
411
|
PrettyOutput.section(
|
366
|
-
"用户输入 - 使用 @ 触发文件补全,Tab 选择补全项,Ctrl+J
|
412
|
+
"用户输入 - 使用 @ 触发文件补全,Tab 选择补全项,Ctrl+J 确认,Ctrl+O 从历史记录中选择消息复制,按 Ctrl+C/D 取消输入",
|
367
413
|
OutputType.USER,
|
368
414
|
)
|
369
415
|
|
@@ -372,7 +418,7 @@ def get_multiline_input(tip: str) -> str:
|
|
372
418
|
|
373
419
|
if user_input == CTRL_O_SENTINEL:
|
374
420
|
_show_history_and_copy()
|
375
|
-
tip = "请继续输入(或按Ctrl+J
|
421
|
+
tip = "请继续输入(或按Ctrl+J确认):"
|
376
422
|
continue
|
377
423
|
else:
|
378
424
|
if not user_input:
|
jarvis/jarvis_utils/utils.py
CHANGED
@@ -880,12 +880,154 @@ def _load_and_process_config(jarvis_dir: str, config_file: str) -> None:
|
|
880
880
|
config_file: 配置文件路径
|
881
881
|
"""
|
882
882
|
from jarvis.jarvis_utils.input import user_confirm as get_yes_no
|
883
|
+
from jarvis.jarvis_utils.input import get_single_line_input
|
883
884
|
|
884
885
|
try:
|
885
886
|
content, config_data = _load_config_file(config_file)
|
886
887
|
_ensure_schema_declaration(jarvis_dir, config_file, content, config_data)
|
887
888
|
set_global_env_data(config_data)
|
888
889
|
_process_env_variables(config_data)
|
890
|
+
|
891
|
+
# 首次运行提示:为新功能开关询问用户(默认值见各配置的getter)
|
892
|
+
def _ask_and_set(_key, _tip, _default, _type="bool"):
|
893
|
+
try:
|
894
|
+
if _key in config_data:
|
895
|
+
return False
|
896
|
+
if _type == "bool":
|
897
|
+
val = get_yes_no(_tip, default=bool(_default))
|
898
|
+
config_data[_key] = bool(val)
|
899
|
+
else:
|
900
|
+
val = get_single_line_input(f"{_tip}", default=str(_default or ""))
|
901
|
+
config_data[_key] = val.strip()
|
902
|
+
return True
|
903
|
+
except Exception:
|
904
|
+
# 出现异常时按默认值设置,避免中断流程
|
905
|
+
config_data[_key] = (
|
906
|
+
bool(_default) if _type == "bool" else str(_default or "")
|
907
|
+
)
|
908
|
+
return True
|
909
|
+
|
910
|
+
changed = False
|
911
|
+
# 现有两个开关
|
912
|
+
changed = (
|
913
|
+
_ask_and_set(
|
914
|
+
"JARVIS_ENABLE_GIT_JCA_SWITCH",
|
915
|
+
"是否在检测到Git仓库时,提示并可自动切换到代码开发模式(jca)?",
|
916
|
+
False,
|
917
|
+
"bool",
|
918
|
+
)
|
919
|
+
or changed
|
920
|
+
)
|
921
|
+
changed = (
|
922
|
+
_ask_and_set(
|
923
|
+
"JARVIS_ENABLE_STARTUP_CONFIG_SELECTOR",
|
924
|
+
"在进入默认通用代理前,是否先列出可用配置(agent/multi_agent/roles)供选择?",
|
925
|
+
False,
|
926
|
+
"bool",
|
927
|
+
)
|
928
|
+
or changed
|
929
|
+
)
|
930
|
+
|
931
|
+
# 新增的配置项交互
|
932
|
+
changed = (
|
933
|
+
_ask_and_set(
|
934
|
+
"JARVIS_PRETTY_OUTPUT",
|
935
|
+
"是否启用更美观的终端输出(Pretty Output)?",
|
936
|
+
False,
|
937
|
+
"bool",
|
938
|
+
)
|
939
|
+
or changed
|
940
|
+
)
|
941
|
+
changed = (
|
942
|
+
_ask_and_set(
|
943
|
+
"JARVIS_PRINT_PROMPT",
|
944
|
+
"是否打印发送给模型的提示词(Prompt)?",
|
945
|
+
False,
|
946
|
+
"bool",
|
947
|
+
)
|
948
|
+
or changed
|
949
|
+
)
|
950
|
+
changed = (
|
951
|
+
_ask_and_set(
|
952
|
+
"JARVIS_ENABLE_STATIC_ANALYSIS",
|
953
|
+
"是否启用静态代码分析(Static Analysis)?",
|
954
|
+
True,
|
955
|
+
"bool",
|
956
|
+
)
|
957
|
+
or changed
|
958
|
+
)
|
959
|
+
changed = (
|
960
|
+
_ask_and_set(
|
961
|
+
"JARVIS_USE_METHODOLOGY",
|
962
|
+
"是否启用方法论系统(Methodology)?",
|
963
|
+
True,
|
964
|
+
"bool",
|
965
|
+
)
|
966
|
+
or changed
|
967
|
+
)
|
968
|
+
changed = (
|
969
|
+
_ask_and_set(
|
970
|
+
"JARVIS_USE_ANALYSIS",
|
971
|
+
"是否启用分析流程(Analysis)?",
|
972
|
+
True,
|
973
|
+
"bool",
|
974
|
+
)
|
975
|
+
or changed
|
976
|
+
)
|
977
|
+
changed = (
|
978
|
+
_ask_and_set(
|
979
|
+
"JARVIS_FORCE_SAVE_MEMORY",
|
980
|
+
"是否强制保存会话记忆?",
|
981
|
+
True,
|
982
|
+
"bool",
|
983
|
+
)
|
984
|
+
or changed
|
985
|
+
)
|
986
|
+
changed = (
|
987
|
+
_ask_and_set(
|
988
|
+
"JARVIS_CENTRAL_METHODOLOGY_REPO",
|
989
|
+
"请输入中心方法论仓库地址(可留空跳过):",
|
990
|
+
"",
|
991
|
+
"str",
|
992
|
+
)
|
993
|
+
or changed
|
994
|
+
)
|
995
|
+
changed = (
|
996
|
+
_ask_and_set(
|
997
|
+
"JARVIS_CENTRAL_TOOL_REPO",
|
998
|
+
"请输入中心工具仓库地址(可留空跳过):",
|
999
|
+
"",
|
1000
|
+
"str",
|
1001
|
+
)
|
1002
|
+
or changed
|
1003
|
+
)
|
1004
|
+
|
1005
|
+
if changed:
|
1006
|
+
# 保留schema声明,如无则自动补充
|
1007
|
+
header = ""
|
1008
|
+
try:
|
1009
|
+
with open(config_file, "r", encoding="utf-8") as rf:
|
1010
|
+
first_line = rf.readline()
|
1011
|
+
if first_line.startswith("# yaml-language-server: $schema="):
|
1012
|
+
header = first_line
|
1013
|
+
except Exception:
|
1014
|
+
header = ""
|
1015
|
+
yaml_str = yaml.dump(config_data, allow_unicode=True, sort_keys=False)
|
1016
|
+
if not header:
|
1017
|
+
schema_path = Path(
|
1018
|
+
os.path.relpath(
|
1019
|
+
Path(__file__).parent.parent
|
1020
|
+
/ "jarvis_data"
|
1021
|
+
/ "config_schema.json",
|
1022
|
+
start=jarvis_dir,
|
1023
|
+
)
|
1024
|
+
)
|
1025
|
+
header = f"# yaml-language-server: $schema={schema_path}\n"
|
1026
|
+
with open(config_file, "w", encoding="utf-8") as wf:
|
1027
|
+
wf.write(header)
|
1028
|
+
wf.write(yaml_str)
|
1029
|
+
# 更新全局配置
|
1030
|
+
set_global_env_data(config_data)
|
889
1031
|
except Exception:
|
890
1032
|
PrettyOutput.print("加载配置文件失败", OutputType.ERROR)
|
891
1033
|
if get_yes_no("配置文件格式错误,是否删除并重新配置?"):
|
@@ -1,11 +1,11 @@
|
|
1
|
-
jarvis/__init__.py,sha256=
|
1
|
+
jarvis/__init__.py,sha256=B3aeVws2GyKWNL5gcAastwUvTv8_xzc1QrhuTZ8zGJs,74
|
2
2
|
jarvis/jarvis_agent/__init__.py,sha256=CkFa66l5lM0-_zlzApwBxTYbrnbC4_NqdD4QuK3H1VQ,32614
|
3
3
|
jarvis/jarvis_agent/agent_manager.py,sha256=YzpMiF0H2-eyk2kn2o24Bkj3bXsQx7Pv2vfD4gWepo0,2893
|
4
4
|
jarvis/jarvis_agent/builtin_input_handler.py,sha256=wS-FqpT3pIXwHn1dfL3SpXonUKWgVThbQueUIeyRc2U,2917
|
5
5
|
jarvis/jarvis_agent/config_editor.py,sha256=Ctk82sO6w2cNW0-_5L7Bomj-hgM4U7WwMc52fwhAJyg,1809
|
6
6
|
jarvis/jarvis_agent/edit_file_handler.py,sha256=w-byNJ4TN_SlV3djjfFC7OksySOFGrM8ku49w662dzc,11854
|
7
7
|
jarvis/jarvis_agent/file_methodology_manager.py,sha256=PwDUQwq7HVIyPInsN8fgWyMXLwi8heIXPrqfBZJhVHs,4260
|
8
|
-
jarvis/jarvis_agent/jarvis.py,sha256=
|
8
|
+
jarvis/jarvis_agent/jarvis.py,sha256=SrlAZdt6kad78dRbCbIdrus16PL1rE2QE9i54qItSmk,18789
|
9
9
|
jarvis/jarvis_agent/main.py,sha256=Hu5u0mq0owuzt965IqaGP6TtVGFXHE4E4Tg1TzCtGYE,3552
|
10
10
|
jarvis/jarvis_agent/memory_manager.py,sha256=F7HTNzdN1_-cSygnz7zKSJRJvPLUOosqcXQeiW8zG4U,5266
|
11
11
|
jarvis/jarvis_agent/methodology_share_manager.py,sha256=vwWNexluTXSI3qeNP3zJAemOjWW37o_1AlqDR1C8wCI,6910
|
@@ -13,11 +13,11 @@ jarvis/jarvis_agent/output_handler.py,sha256=P7oWpXBGFfOsWq7cIhS_z9crkQ19ES7qU5p
|
|
13
13
|
jarvis/jarvis_agent/prompt_builder.py,sha256=PH1fPDVa8z_RXkoXHJFNDf8PQjUoLNLYwkh2lC__p40,1705
|
14
14
|
jarvis/jarvis_agent/prompts.py,sha256=X6cXa-n0xqBQ8LDTgLsD0kqziAh1s0cNp89i4mxcvHg,9444
|
15
15
|
jarvis/jarvis_agent/protocols.py,sha256=JWnJDikFEuwvFUv7uzXu0ggJ4O9K2FkMnfVCwIJ5REw,873
|
16
|
-
jarvis/jarvis_agent/session_manager.py,sha256=
|
16
|
+
jarvis/jarvis_agent/session_manager.py,sha256=5wVcaZGwJ9cEKTQglSbqyxUDJ2fI5KxYN8C8L16UWLw,3024
|
17
17
|
jarvis/jarvis_agent/share_manager.py,sha256=wFcdULSog1mMxDyB94ofbqitFL8DCX8i1u6qVzSEuAk,8704
|
18
18
|
jarvis/jarvis_agent/shell_input_handler.py,sha256=1IboqdxcJuoIqRpmDU10GugR9fWXUHyCEbVF4nIWbyo,1328
|
19
19
|
jarvis/jarvis_agent/task_analyzer.py,sha256=-fQ9YBYFcc-Z1FSoDIPzRfAgkREFoIOXtU2TdBkB-e0,4656
|
20
|
-
jarvis/jarvis_agent/task_manager.py,sha256=
|
20
|
+
jarvis/jarvis_agent/task_manager.py,sha256=IRfkjkeSjSo5rDKmzICdsJtJiVfTOf3Xc13qMVwl5ZM,4689
|
21
21
|
jarvis/jarvis_agent/tool_executor.py,sha256=k73cKhZEZpljvui4ZxALlFEIE-iLzJ32Softsmiwzqk,1896
|
22
22
|
jarvis/jarvis_agent/tool_share_manager.py,sha256=R5ONIQlDXX9pFq3clwHFhEW8BAJ3ECaR2DqWCEC9tzM,5205
|
23
23
|
jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -44,7 +44,7 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
|
|
44
44
|
jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
|
45
45
|
jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
|
46
46
|
jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
|
47
|
-
jarvis/jarvis_data/config_schema.json,sha256=
|
47
|
+
jarvis/jarvis_data/config_schema.json,sha256=MdVuj0zSFlo0X5mA-Oxtj0S5tx9GslFN9VInQQwrmbQ,12660
|
48
48
|
jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
|
49
49
|
jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
50
|
jarvis/jarvis_git_squash/main.py,sha256=6PECdAbTbrsJBRLK1pXBh4hdJ_LADh-XXSic1xJi97E,2255
|
@@ -108,20 +108,20 @@ jarvis/jarvis_tools/cli/main.py,sha256=GsfZJ4OS4Hvxh0H2XiLkgbzm-ajBsb4c0LyjuIAAa
|
|
108
108
|
jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
|
109
109
|
jarvis/jarvis_utils/builtin_replace_map.py,sha256=4BurljGuiG_I93EBs7mlFlPm9wYC_4CmdTG5tQWpF6g,1712
|
110
110
|
jarvis/jarvis_utils/clipboard.py,sha256=WgbQIQR2sh7_5ZzeX04eT3zXx_mxQbKyJOZXgGX_TcI,2907
|
111
|
-
jarvis/jarvis_utils/config.py,sha256=
|
111
|
+
jarvis/jarvis_utils/config.py,sha256=dB6zivA66fPjoTmSXxvu5Y5R0MF-ERP9aUPA4fxkD64,17320
|
112
112
|
jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
|
113
113
|
jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
|
114
114
|
jarvis/jarvis_utils/git_utils.py,sha256=AkczUiRcGcOnPfz2v3mdLwV1S41IopiAYD2tjeMTDrE,23586
|
115
115
|
jarvis/jarvis_utils/globals.py,sha256=aTrOHcCgPAeZFLFIWMAMiJCYlmr4XhdFZf5gZ745hnE,8900
|
116
116
|
jarvis/jarvis_utils/http.py,sha256=eRhV3-GYuWmQ0ogq9di9WMlQkFcVb1zGCrySnOgT1x0,4392
|
117
|
-
jarvis/jarvis_utils/input.py,sha256=
|
117
|
+
jarvis/jarvis_utils/input.py,sha256=YO1jdK9HObkGO44XfXHNNN3HNneD_WrbANYkfJmrdJU,14489
|
118
118
|
jarvis/jarvis_utils/methodology.py,sha256=IIMU17WVSunsWXsnXROd4G77LxgYs4xEC_xm_0CDkjw,12554
|
119
119
|
jarvis/jarvis_utils/output.py,sha256=QRLlKObQKT0KuRSeZRqYb7NlTQvsd1oZXZ41WxeWEuU,10894
|
120
120
|
jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
|
121
|
-
jarvis/jarvis_utils/utils.py,sha256=
|
122
|
-
jarvis_ai_assistant-0.3.
|
123
|
-
jarvis_ai_assistant-0.3.
|
124
|
-
jarvis_ai_assistant-0.3.
|
125
|
-
jarvis_ai_assistant-0.3.
|
126
|
-
jarvis_ai_assistant-0.3.
|
127
|
-
jarvis_ai_assistant-0.3.
|
121
|
+
jarvis/jarvis_utils/utils.py,sha256=UMDOAQsIdlgobTN14ToKarLq3HeKUQrhUsSbfrFUPYo,52132
|
122
|
+
jarvis_ai_assistant-0.3.17.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
123
|
+
jarvis_ai_assistant-0.3.17.dist-info/METADATA,sha256=Vb3yaWH1VcDsh5G_4EAt4UzSZS1N_HZ22wdzyJN05x8,18216
|
124
|
+
jarvis_ai_assistant-0.3.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
125
|
+
jarvis_ai_assistant-0.3.17.dist-info/entry_points.txt,sha256=4GcWKFxRJD-QU14gw_3ZaW4KuEVxOcZK9i270rwPdjA,1395
|
126
|
+
jarvis_ai_assistant-0.3.17.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
127
|
+
jarvis_ai_assistant-0.3.17.dist-info/RECORD,,
|
File without changes
|
{jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/entry_points.txt
RENAMED
File without changes
|
{jarvis_ai_assistant-0.3.16.dist-info → jarvis_ai_assistant-0.3.17.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|