htmlgraph 0.9.3__py3-none-any.whl → 0.27.5__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.
- htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +173 -17
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +127 -0
- htmlgraph/agent_registry.py +45 -30
- htmlgraph/agents.py +160 -107
- htmlgraph/analytics/__init__.py +9 -2
- htmlgraph/analytics/cli.py +190 -51
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +192 -100
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +190 -14
- htmlgraph/analytics_index.py +135 -51
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +208 -0
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/__init__.py +14 -0
- htmlgraph/builders/base.py +118 -29
- htmlgraph/builders/bug.py +150 -0
- htmlgraph/builders/chore.py +119 -0
- htmlgraph/builders/epic.py +150 -0
- htmlgraph/builders/feature.py +31 -6
- htmlgraph/builders/insight.py +195 -0
- htmlgraph/builders/metric.py +217 -0
- htmlgraph/builders/pattern.py +202 -0
- htmlgraph/builders/phase.py +162 -0
- htmlgraph/builders/spike.py +52 -19
- htmlgraph/builders/track.py +148 -72
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +18 -0
- htmlgraph/collections/base.py +415 -98
- htmlgraph/collections/bug.py +53 -0
- htmlgraph/collections/chore.py +53 -0
- htmlgraph/collections/epic.py +53 -0
- htmlgraph/collections/feature.py +12 -26
- htmlgraph/collections/insight.py +100 -0
- htmlgraph/collections/metric.py +92 -0
- htmlgraph/collections/pattern.py +97 -0
- htmlgraph/collections/phase.py +53 -0
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +56 -16
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +511 -0
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +344 -0
- htmlgraph/converter.py +216 -28
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2406 -307
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +19 -2
- htmlgraph/deploy.py +142 -125
- htmlgraph/deployment_models.py +474 -0
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +182 -27
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +100 -52
- htmlgraph/event_migration.py +13 -4
- htmlgraph/exceptions.py +49 -0
- htmlgraph/file_watcher.py +101 -28
- htmlgraph/find_api.py +75 -63
- htmlgraph/git_events.py +145 -63
- htmlgraph/graph.py +1122 -106
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +45 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +1314 -0
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/hooks-config.example.json +12 -0
- htmlgraph/hooks/installer.py +343 -0
- htmlgraph/hooks/orchestrator.py +674 -0
- htmlgraph/hooks/orchestrator_reflector.py +223 -0
- htmlgraph/hooks/post-checkout.sh +28 -0
- htmlgraph/hooks/post-commit.sh +24 -0
- htmlgraph/hooks/post-merge.sh +26 -0
- htmlgraph/hooks/post_tool_use_failure.py +273 -0
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +408 -0
- htmlgraph/hooks/pre-commit.sh +94 -0
- htmlgraph/hooks/pre-push.sh +28 -0
- htmlgraph/hooks/pretooluse.py +819 -0
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +255 -0
- htmlgraph/hooks/task_validator.py +177 -0
- htmlgraph/hooks/validator.py +628 -0
- htmlgraph/ids.py +41 -27
- htmlgraph/index.d.ts +286 -0
- htmlgraph/learning.py +767 -0
- htmlgraph/mcp_server.py +69 -23
- htmlgraph/models.py +1586 -87
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/orchestration/task_coordination.py +343 -0
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +669 -0
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +328 -0
- htmlgraph/orchestrator_validator.py +133 -0
- htmlgraph/parallel.py +646 -0
- htmlgraph/parser.py +160 -35
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/planning.py +147 -52
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +109 -72
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/routing.py +8 -19
- htmlgraph/scripts/deploy.py +1 -2
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +685 -180
- htmlgraph/services/__init__.py +10 -0
- htmlgraph/services/claiming.py +199 -0
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +1392 -175
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +201 -0
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/setup.py +34 -17
- htmlgraph/spike_index.py +143 -0
- htmlgraph/sync_docs.py +12 -15
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph/templates/GEMINI.md.template +87 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +146 -15
- htmlgraph/track_manager.py +69 -21
- htmlgraph/transcript.py +890 -0
- htmlgraph/transcript_analytics.py +699 -0
- htmlgraph/types.py +323 -0
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +8 -5
- htmlgraph/work_type_utils.py +3 -2
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
- htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
- htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -2688
- htmlgraph/sdk.py +0 -709
- htmlgraph-0.9.3.dist-info/RECORD +0 -61
- {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"""Copilot spawner implementation."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import subprocess
|
|
5
|
+
import time
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
from .base import AIResult, BaseSpawner
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from htmlgraph.sdk import SDK
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CopilotSpawner(BaseSpawner):
|
|
17
|
+
"""Spawner for GitHub Copilot CLI."""
|
|
18
|
+
|
|
19
|
+
def _parse_and_track_events(
|
|
20
|
+
self, prompt: str, response: str, sdk: "SDK"
|
|
21
|
+
) -> list[dict]:
|
|
22
|
+
"""
|
|
23
|
+
Track Copilot execution (start and result only).
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
prompt: Original prompt
|
|
27
|
+
response: Response from Copilot
|
|
28
|
+
sdk: HtmlGraph SDK instance for tracking
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Synthetic events list for consistency
|
|
32
|
+
"""
|
|
33
|
+
events = []
|
|
34
|
+
|
|
35
|
+
# Track start
|
|
36
|
+
start_event = {"type": "copilot_start", "prompt": prompt[:100]}
|
|
37
|
+
events.append(start_event)
|
|
38
|
+
self._track_activity(
|
|
39
|
+
sdk,
|
|
40
|
+
tool="copilot_start",
|
|
41
|
+
summary=f"Copilot started with prompt: {prompt[:80]}",
|
|
42
|
+
payload={"prompt_length": len(prompt)},
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Track result
|
|
46
|
+
result_event = {"type": "copilot_result", "response": response[:100]}
|
|
47
|
+
events.append(result_event)
|
|
48
|
+
self._track_activity(
|
|
49
|
+
sdk,
|
|
50
|
+
tool="copilot_result",
|
|
51
|
+
summary=f"Copilot completed: {response[:80]}",
|
|
52
|
+
payload={"response_length": len(response)},
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
return events
|
|
56
|
+
|
|
57
|
+
def spawn(
|
|
58
|
+
self,
|
|
59
|
+
prompt: str,
|
|
60
|
+
allow_tools: list[str] | None = None,
|
|
61
|
+
allow_all_tools: bool = False,
|
|
62
|
+
deny_tools: list[str] | None = None,
|
|
63
|
+
track_in_htmlgraph: bool = True,
|
|
64
|
+
timeout: int = 120,
|
|
65
|
+
tracker: Any = None,
|
|
66
|
+
parent_event_id: str | None = None,
|
|
67
|
+
) -> AIResult:
|
|
68
|
+
"""
|
|
69
|
+
Spawn GitHub Copilot in headless mode.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
prompt: Task description for Copilot
|
|
73
|
+
allow_tools: Tools to auto-approve (e.g., ["shell(git)"])
|
|
74
|
+
allow_all_tools: Auto-approve all tools. Default: False
|
|
75
|
+
deny_tools: Tools to deny (--deny-tool). Default: None
|
|
76
|
+
track_in_htmlgraph: Enable HtmlGraph activity tracking. Default: True
|
|
77
|
+
timeout: Max seconds to wait
|
|
78
|
+
tracker: Optional SpawnerEventTracker for recording subprocess invocation
|
|
79
|
+
parent_event_id: Optional parent event ID for event hierarchy
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
AIResult with response, error, and tracked events if tracking enabled
|
|
83
|
+
"""
|
|
84
|
+
# Initialize tracking if enabled
|
|
85
|
+
sdk = None
|
|
86
|
+
tracked_events = []
|
|
87
|
+
if track_in_htmlgraph:
|
|
88
|
+
sdk = self._get_sdk()
|
|
89
|
+
|
|
90
|
+
# Publish live event: spawner starting
|
|
91
|
+
self._publish_live_event(
|
|
92
|
+
"spawner_start",
|
|
93
|
+
"copilot",
|
|
94
|
+
prompt=prompt,
|
|
95
|
+
)
|
|
96
|
+
start_time = time.time()
|
|
97
|
+
|
|
98
|
+
cmd = ["copilot", "-p", prompt]
|
|
99
|
+
|
|
100
|
+
# Add allow all tools flag
|
|
101
|
+
if allow_all_tools:
|
|
102
|
+
cmd.append("--allow-all-tools")
|
|
103
|
+
|
|
104
|
+
# Add tool permissions
|
|
105
|
+
if allow_tools:
|
|
106
|
+
for tool in allow_tools:
|
|
107
|
+
cmd.extend(["--allow-tool", tool])
|
|
108
|
+
|
|
109
|
+
# Add denied tools
|
|
110
|
+
if deny_tools:
|
|
111
|
+
for tool in deny_tools:
|
|
112
|
+
cmd.extend(["--deny-tool", tool])
|
|
113
|
+
|
|
114
|
+
# Track spawner start if SDK available
|
|
115
|
+
if sdk:
|
|
116
|
+
self._track_activity(
|
|
117
|
+
sdk,
|
|
118
|
+
tool="copilot_spawn_start",
|
|
119
|
+
summary=f"Spawning Copilot: {prompt[:80]}",
|
|
120
|
+
payload={"prompt_length": len(prompt)},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
# Publish live event: executing
|
|
125
|
+
self._publish_live_event(
|
|
126
|
+
"spawner_phase",
|
|
127
|
+
"copilot",
|
|
128
|
+
phase="executing",
|
|
129
|
+
details="Running Copilot CLI",
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Record subprocess invocation if tracker is available
|
|
133
|
+
subprocess_event_id = None
|
|
134
|
+
logger.warning(
|
|
135
|
+
f"DEBUG: tracker={tracker is not None}, parent_event_id={parent_event_id}"
|
|
136
|
+
)
|
|
137
|
+
if tracker and parent_event_id:
|
|
138
|
+
logger.debug("Recording subprocess invocation for Copilot...")
|
|
139
|
+
try:
|
|
140
|
+
subprocess_event = tracker.record_tool_call(
|
|
141
|
+
tool_name="subprocess.copilot",
|
|
142
|
+
tool_input={"cmd": cmd},
|
|
143
|
+
phase_event_id=parent_event_id,
|
|
144
|
+
spawned_agent="github-copilot",
|
|
145
|
+
)
|
|
146
|
+
if subprocess_event:
|
|
147
|
+
subprocess_event_id = subprocess_event.get("event_id")
|
|
148
|
+
logger.warning(
|
|
149
|
+
f"DEBUG: Subprocess event created for Copilot: {subprocess_event_id}"
|
|
150
|
+
)
|
|
151
|
+
else:
|
|
152
|
+
logger.debug("subprocess_event was None")
|
|
153
|
+
except Exception as e:
|
|
154
|
+
# Tracking failure should not break execution
|
|
155
|
+
logger.warning(
|
|
156
|
+
f"DEBUG: Exception recording Copilot subprocess: {e}"
|
|
157
|
+
)
|
|
158
|
+
pass
|
|
159
|
+
else:
|
|
160
|
+
logger.warning(
|
|
161
|
+
f"DEBUG: Skipping Copilot subprocess tracking - tracker={tracker is not None}, parent_event_id={parent_event_id}"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
result = subprocess.run(
|
|
165
|
+
cmd,
|
|
166
|
+
capture_output=True,
|
|
167
|
+
text=True,
|
|
168
|
+
timeout=timeout,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Complete subprocess invocation tracking
|
|
172
|
+
if tracker and subprocess_event_id:
|
|
173
|
+
try:
|
|
174
|
+
tracker.complete_tool_call(
|
|
175
|
+
event_id=subprocess_event_id,
|
|
176
|
+
output_summary=result.stdout[:500] if result.stdout else "",
|
|
177
|
+
success=result.returncode == 0,
|
|
178
|
+
)
|
|
179
|
+
except Exception:
|
|
180
|
+
# Tracking failure should not break execution
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
# Publish live event: processing
|
|
184
|
+
self._publish_live_event(
|
|
185
|
+
"spawner_phase",
|
|
186
|
+
"copilot",
|
|
187
|
+
phase="processing",
|
|
188
|
+
details="Parsing Copilot response",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# Parse output: response is before stats block
|
|
192
|
+
lines = result.stdout.split("\n")
|
|
193
|
+
|
|
194
|
+
# Find where stats start (look for "Total usage est:" or "Usage by model")
|
|
195
|
+
stats_start = len(lines)
|
|
196
|
+
for i, line in enumerate(lines):
|
|
197
|
+
if "Total usage est" in line or "Usage by model" in line:
|
|
198
|
+
stats_start = i
|
|
199
|
+
break
|
|
200
|
+
|
|
201
|
+
# Response is everything before stats
|
|
202
|
+
response = "\n".join(lines[:stats_start]).strip()
|
|
203
|
+
|
|
204
|
+
# Try to extract token count from stats
|
|
205
|
+
tokens = None
|
|
206
|
+
for line in lines[stats_start:]:
|
|
207
|
+
# Look for token counts like "25.8k input, 5 output"
|
|
208
|
+
if "input" in line and "output" in line:
|
|
209
|
+
# Simple extraction: just note we found stats
|
|
210
|
+
# TODO: More sophisticated parsing if needed
|
|
211
|
+
tokens = 0 # Placeholder
|
|
212
|
+
break
|
|
213
|
+
|
|
214
|
+
# Track Copilot execution if SDK available
|
|
215
|
+
if sdk:
|
|
216
|
+
tracked_events = self._parse_and_track_events(prompt, response, sdk)
|
|
217
|
+
|
|
218
|
+
# Publish live event: complete
|
|
219
|
+
duration = time.time() - start_time
|
|
220
|
+
success = result.returncode == 0
|
|
221
|
+
self._publish_live_event(
|
|
222
|
+
"spawner_complete",
|
|
223
|
+
"copilot",
|
|
224
|
+
success=success,
|
|
225
|
+
duration=duration,
|
|
226
|
+
response=response[:200] if response else None,
|
|
227
|
+
tokens=tokens,
|
|
228
|
+
error=result.stderr if not success else None,
|
|
229
|
+
)
|
|
230
|
+
return AIResult(
|
|
231
|
+
success=success,
|
|
232
|
+
response=response,
|
|
233
|
+
tokens_used=tokens,
|
|
234
|
+
error=None if success else result.stderr,
|
|
235
|
+
raw_output=result.stdout,
|
|
236
|
+
tracked_events=tracked_events,
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
except FileNotFoundError:
|
|
240
|
+
duration = time.time() - start_time
|
|
241
|
+
self._publish_live_event(
|
|
242
|
+
"spawner_complete",
|
|
243
|
+
"copilot",
|
|
244
|
+
success=False,
|
|
245
|
+
duration=duration,
|
|
246
|
+
error="CLI not found",
|
|
247
|
+
)
|
|
248
|
+
return AIResult(
|
|
249
|
+
success=False,
|
|
250
|
+
response="",
|
|
251
|
+
tokens_used=None,
|
|
252
|
+
error="Copilot CLI not found. Install from: https://docs.github.com/en/copilot/using-github-copilot/using-github-copilot-in-the-command-line",
|
|
253
|
+
raw_output=None,
|
|
254
|
+
tracked_events=tracked_events,
|
|
255
|
+
)
|
|
256
|
+
except subprocess.TimeoutExpired as e:
|
|
257
|
+
duration = time.time() - start_time
|
|
258
|
+
self._publish_live_event(
|
|
259
|
+
"spawner_complete",
|
|
260
|
+
"copilot",
|
|
261
|
+
success=False,
|
|
262
|
+
duration=duration,
|
|
263
|
+
error=f"Timed out after {timeout} seconds",
|
|
264
|
+
)
|
|
265
|
+
return AIResult(
|
|
266
|
+
success=False,
|
|
267
|
+
response="",
|
|
268
|
+
tokens_used=None,
|
|
269
|
+
error=f"Timed out after {timeout} seconds",
|
|
270
|
+
raw_output={
|
|
271
|
+
"partial_stdout": e.stdout.decode() if e.stdout else None,
|
|
272
|
+
"partial_stderr": e.stderr.decode() if e.stderr else None,
|
|
273
|
+
}
|
|
274
|
+
if e.stdout or e.stderr
|
|
275
|
+
else None,
|
|
276
|
+
tracked_events=tracked_events,
|
|
277
|
+
)
|
|
278
|
+
except Exception as e:
|
|
279
|
+
duration = time.time() - start_time
|
|
280
|
+
self._publish_live_event(
|
|
281
|
+
"spawner_complete",
|
|
282
|
+
"copilot",
|
|
283
|
+
success=False,
|
|
284
|
+
duration=duration,
|
|
285
|
+
error=str(e),
|
|
286
|
+
)
|
|
287
|
+
return AIResult(
|
|
288
|
+
success=False,
|
|
289
|
+
response="",
|
|
290
|
+
tokens_used=None,
|
|
291
|
+
error=f"Unexpected error: {type(e).__name__}: {e}",
|
|
292
|
+
raw_output=None,
|
|
293
|
+
tracked_events=tracked_events,
|
|
294
|
+
)
|