stigmergy 1.0.68 → 1.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.en.md +306 -300
  2. package/README.md +469 -301
  3. package/package.json +97 -81
  4. package/scripts/publish.js +268 -0
  5. package/scripts/simple-publish.js +59 -0
  6. package/src/index.js +12 -0
  7. package/test/enhanced-main-alignment.test.js +298 -0
  8. package/test/hook-system-integration-test.js +307 -0
  9. package/test/natural-language-skills-test.js +320 -0
  10. package/test/nl-integration-test.js +179 -0
  11. package/test/parameter-parsing-test.js +143 -0
  12. package/test/real-test.js +435 -0
  13. package/test/system-compatibility-test.js +447 -0
  14. package/test/tdd-fixes-test.js +211 -0
  15. package/test/third-party-skills-test.js +321 -0
  16. package/test/tool-selection-integration-test.js +157 -0
  17. package/test/unit/cli-scanner.test.js +291 -0
  18. package/test/unit/cross-cli-executor.test.js +399 -0
  19. package/src/adapters/claude/__init__.py +0 -13
  20. package/src/adapters/claude/claude_skills_integration.py +0 -609
  21. package/src/adapters/claude/hook_adapter.py +0 -663
  22. package/src/adapters/claude/install_claude_integration.py +0 -265
  23. package/src/adapters/claude/skills_hook_adapter.py +0 -841
  24. package/src/adapters/claude/standalone_claude_adapter.py +0 -384
  25. package/src/adapters/cline/__init__.py +0 -20
  26. package/src/adapters/cline/config.py +0 -108
  27. package/src/adapters/cline/install_cline_integration.py +0 -617
  28. package/src/adapters/cline/mcp_server.py +0 -713
  29. package/src/adapters/cline/standalone_cline_adapter.py +0 -459
  30. package/src/adapters/codebuddy/__init__.py +0 -13
  31. package/src/adapters/codebuddy/buddy_adapter.py +0 -1125
  32. package/src/adapters/codebuddy/install_codebuddy_integration.py +0 -279
  33. package/src/adapters/codebuddy/skills_hook_adapter.py +0 -672
  34. package/src/adapters/codebuddy/skills_integration.py +0 -395
  35. package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +0 -403
  36. package/src/adapters/codex/__init__.py +0 -11
  37. package/src/adapters/codex/base.py +0 -46
  38. package/src/adapters/codex/install_codex_integration.py +0 -311
  39. package/src/adapters/codex/mcp_server.py +0 -493
  40. package/src/adapters/codex/natural_language_parser.py +0 -82
  41. package/src/adapters/codex/slash_command_adapter.py +0 -326
  42. package/src/adapters/codex/standalone_codex_adapter.py +0 -362
  43. package/src/adapters/copilot/__init__.py +0 -13
  44. package/src/adapters/copilot/install_copilot_integration.py +0 -564
  45. package/src/adapters/copilot/mcp_adapter.py +0 -772
  46. package/src/adapters/copilot/mcp_server.py +0 -168
  47. package/src/adapters/copilot/standalone_copilot_adapter.py +0 -114
  48. package/src/adapters/gemini/__init__.py +0 -13
  49. package/src/adapters/gemini/extension_adapter.py +0 -690
  50. package/src/adapters/gemini/install_gemini_integration.py +0 -257
  51. package/src/adapters/gemini/standalone_gemini_adapter.py +0 -366
  52. package/src/adapters/iflow/__init__.py +0 -7
  53. package/src/adapters/iflow/hook_adapter.py +0 -1038
  54. package/src/adapters/iflow/hook_installer.py +0 -536
  55. package/src/adapters/iflow/install_iflow_integration.py +0 -271
  56. package/src/adapters/iflow/official_hook_adapter.py +0 -1272
  57. package/src/adapters/iflow/standalone_iflow_adapter.py +0 -48
  58. package/src/adapters/iflow/workflow_adapter.py +0 -793
  59. package/src/adapters/qoder/hook_installer.py +0 -732
  60. package/src/adapters/qoder/install_qoder_integration.py +0 -265
  61. package/src/adapters/qoder/notification_hook_adapter.py +0 -863
  62. package/src/adapters/qoder/standalone_qoder_adapter.py +0 -48
  63. package/src/adapters/qwen/__init__.py +0 -17
  64. package/src/adapters/qwencode/__init__.py +0 -13
  65. package/src/adapters/qwencode/inheritance_adapter.py +0 -818
  66. package/src/adapters/qwencode/install_qwencode_integration.py +0 -276
  67. package/src/adapters/qwencode/standalone_qwencode_adapter.py +0 -399
  68. package/src/atomic_collaboration_handler.py +0 -461
  69. package/src/cli_collaboration_agent.py +0 -697
  70. package/src/collaboration/hooks.py +0 -315
  71. package/src/core/__init__.py +0 -21
  72. package/src/core/ai_environment_scanner.py +0 -331
  73. package/src/core/base_adapter.py +0 -220
  74. package/src/core/cli_hook_integration.py +0 -406
  75. package/src/core/cross_cli_executor.py +0 -713
  76. package/src/core/cross_cli_mapping.py +0 -1165
  77. package/src/core/cross_platform_encoding.py +0 -365
  78. package/src/core/cross_platform_safe_cli.py +0 -894
  79. package/src/core/direct_cli_executor.py +0 -805
  80. package/src/core/direct_cli_hook_system.py +0 -958
  81. package/src/core/enhanced_init_processor.py +0 -467
  82. package/src/core/graceful_cli_executor.py +0 -912
  83. package/src/core/md_enhancer.py +0 -342
  84. package/src/core/md_generator.py +0 -619
  85. package/src/core/models.py +0 -218
  86. package/src/core/parser.py +0 -108
  87. package/src/core/real_cli_hook_system.py +0 -852
  88. package/src/core/real_cross_cli_system.py +0 -925
  89. package/src/core/verified_cross_cli_system.py +0 -961
  90. package/src/deploy.js +0 -737
  91. package/src/enhanced-main.js +0 -626
  92. package/src/enhanced_deploy.js +0 -303
  93. package/src/enhanced_universal_cli_setup.py +0 -930
  94. package/src/kimi_wrapper.py +0 -104
  95. package/src/main.js +0 -1309
  96. package/src/shell_integration.py +0 -398
  97. package/src/simple-main.js +0 -315
  98. package/src/smart_router_creator.py +0 -323
  99. package/src/universal_cli_setup.py +0 -1289
  100. package/src/utils/__init__.py +0 -12
  101. package/src/utils/cli_detector.py +0 -445
  102. package/src/utils/file_utils.py +0 -246
@@ -1,690 +0,0 @@
1
- """
2
- Gemini CLI Extension适配器 - 基于Gemini CLI官方Extension系统的原生集成
3
-
4
- 这是TDD驱动的实现,基于test_gemini_adapter.py中的测试用例
5
- 完全符合项目约束条件:
6
- - 使用Gemini CLI官方Extension机制
7
- - 不改变CLI启动和使用方式
8
- - 不依赖包装器
9
- - 完全无损扩展
10
- """
11
-
12
- import os
13
- import json
14
- import logging
15
- import asyncio
16
- from typing import Dict, Any, Optional, List
17
- from datetime import datetime
18
- from pathlib import Path
19
-
20
- from ...core.base_adapter import BaseCrossCLIAdapter, IntentResult
21
- from ...core.parser import NaturalLanguageParser
22
-
23
- logger = logging.getLogger(__name__)
24
-
25
-
26
- class ExtensionContext:
27
- """Gemini CLI Extension上下文模拟类"""
28
-
29
- def __init__(self, prompt: str = "", metadata: Optional[Dict] = None):
30
- self.prompt = prompt
31
- self.metadata = metadata or {}
32
- self.session_id = self.metadata.get('session_id', 'unknown')
33
- self.user_id = self.metadata.get('user_id', 'unknown')
34
- self.extension_id = "cross-cli-adapter"
35
- self.version = "1.0.0"
36
- self.timestamp = datetime.now()
37
-
38
-
39
- class GeminiExtensionAdapter(BaseCrossCLIAdapter):
40
- """
41
- Gemini CLI Extension适配器
42
-
43
- 通过Gemini CLI官方Extension系统实现跨CLI调用功能。
44
- 这是完全基于原生机制的无损扩展实现。
45
-
46
- Extension机制:
47
- - on_prompt_submit: 用户提交提示时触发
48
- - on_command_execute: 命令执行时触发
49
- - on_response_format: 响应格式化时触发
50
- - on_tool_call: 工具调用时触发
51
- - on_file_operation: 文件操作时触发
52
- """
53
-
54
- def __init__(self, cli_name: str = "gemini"):
55
- """
56
- 初始化Gemini Extension适配器
57
-
58
- Args:
59
- cli_name: CLI工具名称,默认为"gemini"
60
- """
61
- super().__init__(cli_name)
62
-
63
- # Extension相关配置
64
- self.extensions_file = os.path.expanduser("~/.config/gemini/extensions.json")
65
- self.extensions_registered = False
66
- self.extension_handlers = {
67
- 'on_prompt_submit': self.on_prompt_submit,
68
- 'on_command_execute': self.on_command_execute,
69
- 'on_response_format': self.on_response_format,
70
- 'on_tool_call': self.on_tool_call,
71
- 'on_file_operation': self.on_file_operation,
72
- }
73
-
74
- # 统计信息
75
- self.extension_calls_count = 0
76
- self.cross_cli_calls_count = 0
77
- self.processed_requests: List[Dict[str, Any]] = []
78
-
79
- # 解析器
80
- self.parser = NaturalLanguageParser()
81
-
82
- # 跨CLI适配器工厂
83
- from ...core.base_adapter import get_cross_cli_adapter
84
- self.get_adapter = get_cross_cli_adapter
85
-
86
- async def initialize(self) -> bool:
87
- """
88
- 初始化适配器
89
-
90
- Returns:
91
- bool: 初始化是否成功
92
- """
93
- try:
94
- # 1. 检查Gemini CLI环境
95
- if not self._check_gemini_environment():
96
- logger.error("Gemini CLI环境检查失败")
97
- return False
98
-
99
- # 2. 注册Extension
100
- if not await self._register_extensions():
101
- logger.error("Extension注册失败")
102
- return False
103
-
104
- # 3. 创建配置目录
105
- await self._ensure_config_directory()
106
-
107
- self.extensions_registered = True
108
- logger.info("Gemini Extension适配器初始化成功")
109
- return True
110
-
111
- except Exception as e:
112
- logger.error(f"初始化Gemini Extension适配器失败: {e}")
113
- self.record_error()
114
- return False
115
-
116
- async def _register_extensions(self) -> bool:
117
- """
118
- 注册Extension到Gemini CLI
119
-
120
- Returns:
121
- bool: 注册是否成功
122
- """
123
- try:
124
- # 读取现有extensions配置
125
- extensions_config = self._load_extensions_config()
126
-
127
- # 添加我们的Extension
128
- cross_cli_extension = {
129
- "id": "cross-cli-adapter",
130
- "name": "Cross-CLI Integration Extension",
131
- "description": "Enables cross-CLI tool calling from Gemini CLI",
132
- "version": "1.0.0",
133
- "author": "Smart CLI Router",
134
- "enabled": True,
135
- "priority": 90,
136
- "handlers": [
137
- "on_prompt_submit",
138
- "on_command_execute",
139
- "on_response_format",
140
- "on_tool_call",
141
- "on_file_operation"
142
- ],
143
- "config": {
144
- "cross_cli_enabled": True,
145
- "supported_clis": ["claude", "qwencode", "iflow", "qoder", "codebuddy", "codex"],
146
- "auto_detect": True,
147
- "timeout": 30
148
- }
149
- }
150
-
151
- # 检查是否已存在
152
- existing_extensions = extensions_config.get('extensions', [])
153
- extension_exists = any(
154
- ext['id'] == cross_cli_extension['id']
155
- for ext in existing_extensions
156
- )
157
-
158
- if not extension_exists:
159
- existing_extensions.append(cross_cli_extension)
160
- extensions_config['extensions'] = existing_extensions
161
-
162
- # 保存配置
163
- await self._save_extensions_config(extensions_config)
164
- logger.info(f"注册Extension: {cross_cli_extension['id']}")
165
- else:
166
- logger.info("Extension已存在,跳过注册")
167
-
168
- return True
169
-
170
- except Exception as e:
171
- logger.error(f"注册Extension失败: {e}")
172
- return False
173
-
174
- def _load_extensions_config(self) -> Dict[str, Any]:
175
- """
176
- 加载Extensions配置
177
-
178
- Returns:
179
- Dict[str, Any]: Extension配置
180
- """
181
- if os.path.exists(self.extensions_file):
182
- try:
183
- with open(self.extensions_file, 'r', encoding='utf-8') as f:
184
- return json.load(f)
185
- except (json.JSONDecodeError, IOError) as e:
186
- logger.warning(f"加载Extension配置失败,使用默认配置: {e}")
187
-
188
- # 返回默认配置
189
- return {
190
- "version": "1.0",
191
- "extensions": []
192
- }
193
-
194
- async def _save_extensions_config(self, config: Dict[str, Any]) -> bool:
195
- """
196
- 保存Extensions配置
197
-
198
- Args:
199
- config: Extension配置
200
-
201
- Returns:
202
- bool: 保存是否成功
203
- """
204
- try:
205
- os.makedirs(os.path.dirname(self.extensions_file), exist_ok=True)
206
-
207
- with open(self.extensions_file, 'w', encoding='utf-8') as f:
208
- json.dump(config, f, indent=2, ensure_ascii=False)
209
-
210
- logger.info(f"保存Extension配置到: {self.extensions_file}")
211
- return True
212
-
213
- except Exception as e:
214
- logger.error(f"保存Extension配置失败: {e}")
215
- return False
216
-
217
- async def _ensure_config_directory(self) -> bool:
218
- """
219
- 确保配置目录存在
220
-
221
- Returns:
222
- bool: 创建是否成功
223
- """
224
- try:
225
- config_dir = os.path.expanduser("~/.config/gemini")
226
- os.makedirs(config_dir, exist_ok=True)
227
-
228
- # 创建适配器配置目录
229
- adapter_dir = os.path.join(config_dir, "adapters")
230
- os.makedirs(adapter_dir, exist_ok=True)
231
-
232
- logger.info(f"配置目录已准备: {config_dir}")
233
- return True
234
-
235
- except Exception as e:
236
- logger.error(f"创建配置目录失败: {e}")
237
- return False
238
-
239
- def _check_gemini_environment(self) -> bool:
240
- """
241
- 检查Gemini CLI环境
242
-
243
- Returns:
244
- bool: 环境是否可用
245
- """
246
- # 这里应该检查Gemini CLI是否可用
247
- # 暂时返回True,实际实现中需要检查CLI命令和配置
248
- return True
249
-
250
- async def on_prompt_submit(self, context: ExtensionContext) -> Optional[str]:
251
- """
252
- 用户提示提交Extension处理函数
253
-
254
- 这是核心Extension,用于检测和执行跨CLI调用。
255
-
256
- Args:
257
- context: Extension上下文
258
-
259
- Returns:
260
- Optional[str]: 处理结果,如果返回None则让Gemini继续正常处理
261
- """
262
- try:
263
- self.extension_calls_count += 1
264
- user_input = context.prompt
265
-
266
- # 记录请求
267
- request_record = {
268
- 'extension_type': 'on_prompt_submit',
269
- 'prompt': user_input,
270
- 'metadata': context.metadata,
271
- 'timestamp': datetime.now().isoformat()
272
- }
273
- self.processed_requests.append(request_record)
274
-
275
- # 1. 检测是否为跨CLI调用意图
276
- intent = self.parser.parse_intent(user_input, "gemini")
277
-
278
- if not intent.is_cross_cli:
279
- # 不是跨CLI调用,让Gemini继续处理
280
- return None
281
-
282
- # 2. 避免自我调用
283
- if intent.target_cli == self.cli_name:
284
- # 目标是Gemini自己,让Gemini处理
285
- return None
286
-
287
- # 3. 执行跨CLI调用
288
- result = await self._execute_cross_cli_call(
289
- intent.target_cli,
290
- intent.task,
291
- context
292
- )
293
-
294
- if result:
295
- self.cross_cli_calls_count += 1
296
- return result
297
-
298
- return None
299
-
300
- except Exception as e:
301
- logger.error(f"用户提示Extension处理失败: {e}")
302
- self.record_error()
303
- return None
304
-
305
- async def on_command_execute(self, context: ExtensionContext) -> Optional[str]:
306
- """
307
- 命令执行Extension处理函数
308
-
309
- Args:
310
- context: Extension上下文
311
-
312
- Returns:
313
- Optional[str]: 处理结果
314
- """
315
- # 可以在这里预处理命令执行
316
- return None
317
-
318
- async def on_response_format(self, context: ExtensionContext) -> Optional[str]:
319
- """
320
- 响应格式化Extension处理函数
321
-
322
- Args:
323
- context: Extension上下文
324
-
325
- Returns:
326
- Optional[str]: 处理结果
327
- """
328
- # 可以在这里后处理Gemini的响应
329
- return None
330
-
331
- async def on_tool_call(self, context: ExtensionContext) -> Optional[str]:
332
- """
333
- 工具调用Extension处理函数
334
-
335
- Args:
336
- context: Extension上下文
337
-
338
- Returns:
339
- Optional[str]: 处理结果
340
- """
341
- # 可以在这里处理工具调用相关的跨CLI功能
342
- return None
343
-
344
- async def on_file_operation(self, context: ExtensionContext) -> Optional[str]:
345
- """
346
- 文件操作Extension处理函数
347
-
348
- Args:
349
- context: Extension上下文
350
-
351
- Returns:
352
- Optional[str]: 处理结果
353
- """
354
- # 可以在这里处理文件操作相关的跨CLI功能
355
- return None
356
-
357
- async def _execute_cross_cli_call(
358
- self,
359
- target_cli: str,
360
- task: str,
361
- context: ExtensionContext
362
- ) -> Optional[str]:
363
- """
364
- 执行跨CLI调用
365
-
366
- Args:
367
- target_cli: 目标CLI工具
368
- task: 要执行的任务
369
- context: Extension上下文
370
-
371
- Returns:
372
- Optional[str]: 执行结果
373
- """
374
- try:
375
- logger.info(f"执行跨CLI调用: {target_cli} -> {task}")
376
-
377
- # 获取目标CLI适配器
378
- target_adapter = self.get_adapter(target_cli)
379
-
380
- if not target_adapter:
381
- logger.warning(f"目标CLI适配器不可用: {target_cli}")
382
- return self._format_error_result(
383
- target_cli,
384
- task,
385
- f"目标CLI工具 '{target_cli}' 不可用或未安装"
386
- )
387
-
388
- if not target_adapter.is_available():
389
- logger.warning(f"目标CLI工具不可用: {target_cli}")
390
- return self._format_error_result(
391
- target_cli,
392
- task,
393
- f"目标CLI工具 '{target_cli}' 当前不可用"
394
- )
395
-
396
- # 构建执行上下文
397
- execution_context = {
398
- 'source_cli': self.cli_name,
399
- 'target_cli': target_cli,
400
- 'original_task': task,
401
- 'extension_context': context.__dict__,
402
- 'timestamp': datetime.now().isoformat()
403
- }
404
-
405
- # 执行任务
406
- result = await target_adapter.execute_task(task, execution_context)
407
-
408
- # 记录成功的跨CLI调用
409
- self.processed_requests.append({
410
- 'type': 'cross_cli_execution',
411
- 'target_cli': target_cli,
412
- 'task': task,
413
- 'success': True,
414
- 'result_length': len(result),
415
- 'timestamp': datetime.now().isoformat()
416
- })
417
-
418
- # 格式化结果
419
- formatted_result = self._format_success_result(target_cli, task, result)
420
-
421
- logger.info(f"跨CLI调用成功: {target_cli}")
422
- return formatted_result
423
-
424
- except Exception as e:
425
- logger.error(f"跨CLI调用失败: {target_cli}, {e}")
426
- self.record_error()
427
-
428
- self.processed_requests.append({
429
- 'type': 'cross_cli_execution',
430
- 'target_cli': target_cli,
431
- 'task': task,
432
- 'success': False,
433
- 'error': str(e),
434
- 'timestamp': datetime.now().isoformat()
435
- })
436
-
437
- return self._format_error_result(target_cli, task, str(e))
438
-
439
- def _format_success_result(
440
- self,
441
- target_cli: str,
442
- task: str,
443
- result: str
444
- ) -> str:
445
- """
446
- 格式化成功的跨CLI调用结果
447
-
448
- Args:
449
- target_cli: 目标CLI工具
450
- task: 原始任务
451
- result: 执行结果
452
-
453
- Returns:
454
- str: 格式化的结果
455
- """
456
- return f"""## 🔗 跨CLI调用结果
457
-
458
- **源工具**: Gemini CLI
459
- **目标工具**: {target_cli.upper()}
460
- **原始任务**: {task}
461
- **执行时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
462
-
463
- ---
464
-
465
- {result}
466
-
467
- ---
468
-
469
- *此结果由跨CLI集成系统通过Gemini CLI Extension提供*"""
470
-
471
- def _format_error_result(
472
- self,
473
- target_cli: str,
474
- task: str,
475
- error_message: str
476
- ) -> str:
477
- """
478
- 格式化错误的跨CLI调用结果
479
-
480
- Args:
481
- target_cli: 目标CLI工具
482
- task: 原始任务
483
- error_message: 错误信息
484
-
485
- Returns:
486
- str: 格式化的错误结果
487
- """
488
- return f"""## ❌ 跨CLI调用失败
489
-
490
- **源工具**: Gemini CLI
491
- **目标工具**: {target_cli.upper()}
492
- **原始任务**: {task}
493
- **错误信息**: {error_message}
494
- **失败时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
495
-
496
- 请检查目标CLI工具是否正确安装和配置。
497
-
498
- ---
499
-
500
- *此错误由跨CLI集成系统报告*"""
501
-
502
- def is_available(self) -> bool:
503
- """
504
- 检查适配器是否可用
505
-
506
- Returns:
507
- bool: 是否可用
508
- """
509
- return self.extensions_registered and self._check_gemini_environment()
510
-
511
- async def health_check(self) -> Dict[str, Any]:
512
- """
513
- 健康检查
514
-
515
- Returns:
516
- Dict[str, Any]: 健康状态
517
- """
518
- base_health = await super().health_check()
519
-
520
- gemini_health = {
521
- 'extensions_registered': self.extensions_registered,
522
- 'extension_calls_count': self.extension_calls_count,
523
- 'cross_cli_calls_count': self.cross_cli_calls_count,
524
- 'processed_requests_count': len(self.processed_requests),
525
- 'extensions_file': self.extensions_file,
526
- 'extensions_config_exists': os.path.exists(self.extensions_file),
527
- 'extension_handlers': list(self.extension_handlers.keys())
528
- }
529
-
530
- # 检查环境
531
- try:
532
- gemini_health['gemini_environment'] = self._check_gemini_environment()
533
- except Exception as e:
534
- gemini_health['gemini_environment_error'] = str(e)
535
-
536
- # 合并基础健康信息
537
- base_health.update(gemini_health)
538
- return base_health
539
-
540
- def get_statistics(self) -> Dict[str, Any]:
541
- """
542
- 获取适配器统计信息
543
-
544
- Returns:
545
- Dict[str, Any]: 统计信息
546
- """
547
- base_stats = super().get_statistics()
548
-
549
- gemini_stats = {
550
- 'extensions_registered': self.extensions_registered,
551
- 'extension_calls_count': self.extension_calls_count,
552
- 'cross_cli_calls_count': self.cross_cli_calls_count,
553
- 'success_rate': self._calculate_success_rate(),
554
- 'last_activity': self._get_last_activity(),
555
- 'supported_extensions': list(self.extension_handlers.keys())
556
- }
557
-
558
- base_stats.update(gemini_stats)
559
- return base_stats
560
-
561
- def _calculate_success_rate(self) -> float:
562
- """
563
- 计算成功率
564
-
565
- Returns:
566
- float: 成功率 (0.0 - 1.0)
567
- """
568
- total_cross_cli = self.cross_cli_calls_count
569
-
570
- if total_cross_cli == 0:
571
- return 1.0
572
-
573
- successful_calls = sum(
574
- 1 for req in self.processed_requests
575
- if req.get('type') == 'cross_cli_execution' and req.get('success')
576
- )
577
-
578
- return successful_calls / total_cross_cli
579
-
580
- def _get_last_activity(self) -> Optional[str]:
581
- """
582
- 获取最后活动时间
583
-
584
- Returns:
585
- Optional[str]: 最后活动时间戳
586
- """
587
- if not self.processed_requests:
588
- return None
589
-
590
- return max(req['timestamp'] for req in self.processed_requests)
591
-
592
- async def execute_task(self, task: str, context: Dict[str, Any]) -> str:
593
- """
594
- 执行跨CLI任务 - Gemini适配器的具体实现
595
-
596
- Args:
597
- task: 要执行的任务描述
598
- context: 执行上下文信息
599
-
600
- Returns:
601
- str: 任务执行结果
602
- """
603
- try:
604
- # Gemini适配器的任务执行主要是通过Extension系统
605
- # 这里创建一个模拟的Extension上下文来处理任务
606
- extension_context = ExtensionContext(
607
- prompt=task,
608
- metadata=context.get('metadata', {})
609
- )
610
-
611
- # 检查是否为跨CLI调用
612
- intent = self.parser.parse_intent(task, "gemini")
613
- if intent.is_cross_cli and intent.target_cli != self.cli_name:
614
- # 执行跨CLI调用
615
- result = await self._execute_cross_cli_call(
616
- intent.target_cli,
617
- intent.task,
618
- extension_context
619
- )
620
- return result or f"Gemini Extension适配器处理了任务: {task}"
621
- else:
622
- # 本地Gemini任务处理
623
- return f"Gemini Extension适配器本地处理: {task}"
624
-
625
- except Exception as e:
626
- logger.error(f"执行任务失败: {task}, 错误: {e}")
627
- self.record_error()
628
- return f"任务执行失败: {str(e)}"
629
-
630
- async def cleanup(self) -> bool:
631
- """
632
- 清理适配器资源
633
-
634
- Returns:
635
- bool: 清理是否成功
636
- """
637
- try:
638
- # 清理统计信息
639
- self.processed_requests.clear()
640
-
641
- # 注销Extension(如果需要)
642
- # 这里可以实现Extension注销逻辑
643
-
644
- logger.info("Gemini Extension适配器清理完成")
645
- return True
646
-
647
- except Exception as e:
648
- logger.error(f"清理Gemini Extension适配器失败: {e}")
649
- return False
650
-
651
-
652
- # 创建全局适配器实例
653
- _global_adapter: Optional[GeminiExtensionAdapter] = None
654
-
655
-
656
- def get_gemini_extension_adapter() -> GeminiExtensionAdapter:
657
- """
658
- 获取Gemini Extension适配器实例
659
-
660
- Returns:
661
- GeminiExtensionAdapter: 适配器实例
662
- """
663
- global _global_adapter
664
- if _global_adapter is None:
665
- _global_adapter = GeminiExtensionAdapter()
666
- # 异步初始化需要在调用时进行
667
- return _global_adapter
668
-
669
-
670
- # 便捷函数
671
- async def initialize_gemini_adapter() -> bool:
672
- """
673
- 初始化Gemini Extension适配器
674
-
675
- Returns:
676
- bool: 初始化是否成功
677
- """
678
- adapter = get_gemini_extension_adapter()
679
- return await adapter.initialize()
680
-
681
-
682
- def is_gemini_adapter_available() -> bool:
683
- """
684
- 检查Gemini Extension适配器是否可用
685
-
686
- Returns:
687
- bool: 是否可用
688
- """
689
- adapter = get_gemini_extension_adapter()
690
- return adapter.is_available()