gobby 0.2.5__py3-none-any.whl → 0.2.6__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.
- gobby/adapters/claude_code.py +13 -4
- gobby/adapters/codex.py +43 -3
- gobby/agents/runner.py +8 -0
- gobby/cli/__init__.py +6 -0
- gobby/cli/clones.py +419 -0
- gobby/cli/conductor.py +266 -0
- gobby/cli/installers/antigravity.py +3 -9
- gobby/cli/installers/claude.py +9 -9
- gobby/cli/installers/codex.py +2 -8
- gobby/cli/installers/gemini.py +2 -8
- gobby/cli/installers/shared.py +71 -8
- gobby/cli/skills.py +858 -0
- gobby/cli/tasks/ai.py +0 -440
- gobby/cli/tasks/crud.py +44 -6
- gobby/cli/tasks/main.py +0 -4
- gobby/cli/tui.py +2 -2
- gobby/cli/utils.py +3 -3
- gobby/clones/__init__.py +13 -0
- gobby/clones/git.py +547 -0
- gobby/conductor/__init__.py +16 -0
- gobby/conductor/alerts.py +135 -0
- gobby/conductor/loop.py +164 -0
- gobby/conductor/monitors/__init__.py +11 -0
- gobby/conductor/monitors/agents.py +116 -0
- gobby/conductor/monitors/tasks.py +155 -0
- gobby/conductor/pricing.py +234 -0
- gobby/conductor/token_tracker.py +160 -0
- gobby/config/app.py +63 -1
- gobby/config/search.py +110 -0
- gobby/config/servers.py +1 -1
- gobby/config/skills.py +43 -0
- gobby/config/tasks.py +6 -14
- gobby/hooks/event_handlers.py +145 -2
- gobby/hooks/hook_manager.py +48 -2
- gobby/hooks/skill_manager.py +130 -0
- gobby/install/claude/hooks/hook_dispatcher.py +4 -4
- gobby/install/codex/hooks/hook_dispatcher.py +1 -1
- gobby/install/gemini/hooks/hook_dispatcher.py +87 -12
- gobby/llm/claude.py +22 -34
- gobby/llm/claude_executor.py +46 -256
- gobby/llm/codex_executor.py +59 -291
- gobby/llm/executor.py +21 -0
- gobby/llm/gemini.py +134 -110
- gobby/llm/litellm_executor.py +143 -6
- gobby/llm/resolver.py +95 -33
- gobby/mcp_proxy/instructions.py +54 -0
- gobby/mcp_proxy/models.py +15 -0
- gobby/mcp_proxy/registries.py +68 -5
- gobby/mcp_proxy/server.py +33 -3
- gobby/mcp_proxy/services/tool_proxy.py +81 -1
- gobby/mcp_proxy/stdio.py +2 -1
- gobby/mcp_proxy/tools/__init__.py +0 -2
- gobby/mcp_proxy/tools/agent_messaging.py +317 -0
- gobby/mcp_proxy/tools/clones.py +903 -0
- gobby/mcp_proxy/tools/memory.py +1 -24
- gobby/mcp_proxy/tools/metrics.py +65 -1
- gobby/mcp_proxy/tools/orchestration/__init__.py +3 -0
- gobby/mcp_proxy/tools/orchestration/cleanup.py +151 -0
- gobby/mcp_proxy/tools/orchestration/wait.py +467 -0
- gobby/mcp_proxy/tools/session_messages.py +1 -2
- gobby/mcp_proxy/tools/skills/__init__.py +631 -0
- gobby/mcp_proxy/tools/task_orchestration.py +7 -0
- gobby/mcp_proxy/tools/task_readiness.py +14 -0
- gobby/mcp_proxy/tools/task_sync.py +1 -1
- gobby/mcp_proxy/tools/tasks/_context.py +0 -20
- gobby/mcp_proxy/tools/tasks/_crud.py +91 -4
- gobby/mcp_proxy/tools/tasks/_expansion.py +348 -0
- gobby/mcp_proxy/tools/tasks/_factory.py +6 -16
- gobby/mcp_proxy/tools/tasks/_lifecycle.py +60 -29
- gobby/mcp_proxy/tools/tasks/_lifecycle_validation.py +18 -29
- gobby/mcp_proxy/tools/workflows.py +1 -1
- gobby/mcp_proxy/tools/worktrees.py +5 -0
- gobby/memory/backends/__init__.py +6 -1
- gobby/memory/backends/mem0.py +6 -1
- gobby/memory/extractor.py +477 -0
- gobby/memory/manager.py +11 -2
- gobby/prompts/defaults/handoff/compact.md +63 -0
- gobby/prompts/defaults/handoff/session_end.md +57 -0
- gobby/prompts/defaults/memory/extract.md +61 -0
- gobby/runner.py +37 -16
- gobby/search/__init__.py +48 -6
- gobby/search/backends/__init__.py +159 -0
- gobby/search/backends/embedding.py +225 -0
- gobby/search/embeddings.py +238 -0
- gobby/search/models.py +148 -0
- gobby/search/unified.py +496 -0
- gobby/servers/http.py +23 -8
- gobby/servers/routes/admin.py +280 -0
- gobby/servers/routes/mcp/tools.py +241 -52
- gobby/servers/websocket.py +2 -2
- gobby/sessions/analyzer.py +2 -0
- gobby/sessions/transcripts/base.py +1 -0
- gobby/sessions/transcripts/claude.py +64 -5
- gobby/skills/__init__.py +91 -0
- gobby/skills/loader.py +685 -0
- gobby/skills/manager.py +384 -0
- gobby/skills/parser.py +258 -0
- gobby/skills/search.py +463 -0
- gobby/skills/sync.py +119 -0
- gobby/skills/updater.py +385 -0
- gobby/skills/validator.py +368 -0
- gobby/storage/clones.py +378 -0
- gobby/storage/database.py +1 -1
- gobby/storage/memories.py +43 -13
- gobby/storage/migrations.py +180 -6
- gobby/storage/sessions.py +73 -0
- gobby/storage/skills.py +749 -0
- gobby/storage/tasks/_crud.py +4 -4
- gobby/storage/tasks/_lifecycle.py +41 -6
- gobby/storage/tasks/_manager.py +14 -5
- gobby/storage/tasks/_models.py +8 -3
- gobby/sync/memories.py +39 -4
- gobby/sync/tasks.py +83 -6
- gobby/tasks/__init__.py +1 -2
- gobby/tasks/validation.py +24 -15
- gobby/tui/api_client.py +4 -7
- gobby/tui/app.py +5 -3
- gobby/tui/screens/orchestrator.py +1 -2
- gobby/tui/screens/tasks.py +2 -4
- gobby/tui/ws_client.py +1 -1
- gobby/utils/daemon_client.py +2 -2
- gobby/workflows/actions.py +84 -2
- gobby/workflows/context_actions.py +43 -0
- gobby/workflows/detection_helpers.py +115 -31
- gobby/workflows/engine.py +13 -2
- gobby/workflows/lifecycle_evaluator.py +29 -1
- gobby/workflows/loader.py +19 -6
- gobby/workflows/memory_actions.py +74 -0
- gobby/workflows/summary_actions.py +17 -0
- gobby/workflows/task_enforcement_actions.py +448 -6
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/METADATA +82 -21
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/RECORD +136 -107
- gobby/install/codex/prompts/forget.md +0 -7
- gobby/install/codex/prompts/memories.md +0 -7
- gobby/install/codex/prompts/recall.md +0 -7
- gobby/install/codex/prompts/remember.md +0 -13
- gobby/llm/gemini_executor.py +0 -339
- gobby/mcp_proxy/tools/task_expansion.py +0 -591
- gobby/tasks/context.py +0 -747
- gobby/tasks/criteria.py +0 -342
- gobby/tasks/expansion.py +0 -626
- gobby/tasks/prompts/expand.py +0 -327
- gobby/tasks/research.py +0 -421
- gobby/tasks/tdd.py +0 -352
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/WHEEL +0 -0
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/entry_points.txt +0 -0
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/licenses/LICENSE.md +0 -0
- {gobby-0.2.5.dist-info → gobby-0.2.6.dist-info}/top_level.txt +0 -0
gobby/storage/sessions.py
CHANGED
|
@@ -47,6 +47,7 @@ class Session:
|
|
|
47
47
|
usage_cache_creation_tokens: int = 0
|
|
48
48
|
usage_cache_read_tokens: int = 0
|
|
49
49
|
usage_total_cost_usd: float = 0.0
|
|
50
|
+
model: str | None = None # LLM model used (e.g., "claude-3-5-sonnet-20241022")
|
|
50
51
|
# Terminal context (JSON blob with tty, parent_pid, term_session_id, etc.)
|
|
51
52
|
terminal_context: dict[str, Any] | None = None
|
|
52
53
|
# Global sequence number
|
|
@@ -82,6 +83,7 @@ class Session:
|
|
|
82
83
|
usage_cache_creation_tokens=row["usage_cache_creation_tokens"] or 0,
|
|
83
84
|
usage_cache_read_tokens=row["usage_cache_read_tokens"] or 0,
|
|
84
85
|
usage_total_cost_usd=row["usage_total_cost_usd"] or 0.0,
|
|
86
|
+
model=row["model"] if "model" in row.keys() else None,
|
|
85
87
|
terminal_context=cls._parse_terminal_context(row["terminal_context"]),
|
|
86
88
|
seq_num=row["seq_num"] if "seq_num" in row.keys() else None,
|
|
87
89
|
)
|
|
@@ -773,6 +775,77 @@ class LocalSessionManager:
|
|
|
773
775
|
logger.error(f"Failed to update session usage {session_id}: {e}")
|
|
774
776
|
return False
|
|
775
777
|
|
|
778
|
+
def add_cost(self, session_id: str, cost_usd: float) -> bool:
|
|
779
|
+
"""
|
|
780
|
+
Add cost to the session's usage_total_cost_usd.
|
|
781
|
+
|
|
782
|
+
This is used for internal agent runs that track cost via CostInfo.
|
|
783
|
+
Unlike update_usage which overwrites, this method adds to the existing cost.
|
|
784
|
+
|
|
785
|
+
Args:
|
|
786
|
+
session_id: Session ID to update.
|
|
787
|
+
cost_usd: Cost in USD to add.
|
|
788
|
+
|
|
789
|
+
Returns:
|
|
790
|
+
True if update succeeded, False otherwise.
|
|
791
|
+
"""
|
|
792
|
+
if cost_usd <= 0:
|
|
793
|
+
return True # Nothing to add
|
|
794
|
+
|
|
795
|
+
query = """
|
|
796
|
+
UPDATE sessions
|
|
797
|
+
SET
|
|
798
|
+
usage_total_cost_usd = COALESCE(usage_total_cost_usd, 0) + ?,
|
|
799
|
+
updated_at = datetime('now')
|
|
800
|
+
WHERE id = ?
|
|
801
|
+
"""
|
|
802
|
+
try:
|
|
803
|
+
with self.db.transaction():
|
|
804
|
+
cursor = self.db.execute(query, (cost_usd, session_id))
|
|
805
|
+
return cursor.rowcount > 0
|
|
806
|
+
except Exception as e:
|
|
807
|
+
logger.error(f"Failed to add cost to session {session_id}: {e}")
|
|
808
|
+
return False
|
|
809
|
+
|
|
810
|
+
def get_sessions_since(
|
|
811
|
+
self, since: datetime, project_id: str | None = None
|
|
812
|
+
) -> builtins.list[Session]:
|
|
813
|
+
"""
|
|
814
|
+
Get sessions created since a given timestamp.
|
|
815
|
+
|
|
816
|
+
Used for aggregating usage over a time period (e.g., daily budget tracking).
|
|
817
|
+
|
|
818
|
+
Args:
|
|
819
|
+
since: Datetime to query from (sessions created after this time)
|
|
820
|
+
project_id: Optional project ID to filter by
|
|
821
|
+
|
|
822
|
+
Returns:
|
|
823
|
+
List of sessions created since the given timestamp
|
|
824
|
+
"""
|
|
825
|
+
since_str = since.isoformat()
|
|
826
|
+
|
|
827
|
+
if project_id:
|
|
828
|
+
rows = self.db.fetchall(
|
|
829
|
+
"""
|
|
830
|
+
SELECT * FROM sessions
|
|
831
|
+
WHERE created_at >= ?
|
|
832
|
+
AND project_id = ?
|
|
833
|
+
ORDER BY created_at DESC
|
|
834
|
+
""",
|
|
835
|
+
(since_str, project_id),
|
|
836
|
+
)
|
|
837
|
+
else:
|
|
838
|
+
rows = self.db.fetchall(
|
|
839
|
+
"""
|
|
840
|
+
SELECT * FROM sessions
|
|
841
|
+
WHERE created_at >= ?
|
|
842
|
+
ORDER BY created_at DESC
|
|
843
|
+
""",
|
|
844
|
+
(since_str,),
|
|
845
|
+
)
|
|
846
|
+
|
|
847
|
+
return [Session.from_row(row) for row in rows]
|
|
848
|
+
|
|
776
849
|
def update_terminal_pickup_metadata(
|
|
777
850
|
self,
|
|
778
851
|
session_id: str,
|