monkeybot 2.1.1__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.
- monkeybot/__init__.py +3 -0
- monkeybot/cli/__init__.py +3 -0
- monkeybot/cli/__main__.py +8 -0
- monkeybot/cli/audio_io.py +8 -0
- monkeybot/cli/gateway_manager.py +17 -0
- monkeybot/cli/main.py +22 -0
- monkeybot/cli/push_to_talk.py +12 -0
- monkeybot/cli/realtime_client.py +13 -0
- monkeybot/core/__init__.py +19 -0
- monkeybot/core/attachments/__init__.py +22 -0
- monkeybot/core/attachments/catalog.py +62 -0
- monkeybot/core/attachments/config.py +52 -0
- monkeybot/core/attachments/freeze.py +158 -0
- monkeybot/core/attachments/resolve.py +70 -0
- monkeybot/core/attachments/store.py +180 -0
- monkeybot/core/attachments/text.py +72 -0
- monkeybot/core/attachments/tools.py +54 -0
- monkeybot/core/bootstrap.py +242 -0
- monkeybot/core/config/__init__.py +71 -0
- monkeybot/core/config/realtime_config.py +150 -0
- monkeybot/core/config/runtime_env.py +262 -0
- monkeybot/core/config/settings.py +341 -0
- monkeybot/core/config/validation.py +249 -0
- monkeybot/core/config/yaml_loader.py +45 -0
- monkeybot/core/context/__init__.py +781 -0
- monkeybot/core/context/campaign_context.py +8 -0
- monkeybot/core/context/common.py +14 -0
- monkeybot/core/context/curator.py +255 -0
- monkeybot/core/context/epoch.py +226 -0
- monkeybot/core/context/memory_prompt.py +222 -0
- monkeybot/core/context/tool_output_policy.py +270 -0
- monkeybot/core/context/tool_result_ingress.py +290 -0
- monkeybot/core/context/tool_shapers.py +361 -0
- monkeybot/core/hooks/__init__.py +261 -0
- monkeybot/core/llm/__init__.py +4 -0
- monkeybot/core/llm/provider.py +296 -0
- monkeybot/core/llm/realtime_provider.py +203 -0
- monkeybot/core/llm/usage.py +57 -0
- monkeybot/core/logging_utils.py +24 -0
- monkeybot/core/mcp/__init__.py +1 -0
- monkeybot/core/mcp/mcp_client.py +1215 -0
- monkeybot/core/mcp/ports_mcp.py +109 -0
- monkeybot/core/memory/__init__.py +24 -0
- monkeybot/core/memory/hook.py +413 -0
- monkeybot/core/memory/index_format.py +104 -0
- monkeybot/core/memory/integrity.py +180 -0
- monkeybot/core/memory/organizer.py +270 -0
- monkeybot/core/memory/storage_ops.py +139 -0
- monkeybot/core/memory/subsystem.py +91 -0
- monkeybot/core/messages/__init__.py +16 -0
- monkeybot/core/messages/convert_provider.py +41 -0
- monkeybot/core/messages/tool_integrity.py +262 -0
- monkeybot/core/messages/transform_context.py +84 -0
- monkeybot/core/path_safety.py +11 -0
- monkeybot/core/persistence/__init__.py +17 -0
- monkeybot/core/persistence/backends.py +236 -0
- monkeybot/core/persistence/db.py +28 -0
- monkeybot/core/persistence/durable_runs.py +286 -0
- monkeybot/core/persistence/firestore.py +658 -0
- monkeybot/core/persistence/firestore_scheduled_loops.py +336 -0
- monkeybot/core/persistence/history.py +156 -0
- monkeybot/core/persistence/postgres.py +895 -0
- monkeybot/core/persistence/runs.py +76 -0
- monkeybot/core/persistence/scheduled_loops.py +435 -0
- monkeybot/core/persistence/session_turn_locks.py +94 -0
- monkeybot/core/persistence/sqlite.py +218 -0
- monkeybot/core/persistence/sqlite_backend.py +74 -0
- monkeybot/core/persistence/thread_summary.py +61 -0
- monkeybot/core/persistence/transcript.py +194 -0
- monkeybot/core/persistence/usage.py +149 -0
- monkeybot/core/prompts/__init__.py +1 -0
- monkeybot/core/prompts/harness_prompt.py +197 -0
- monkeybot/core/prompts/prompt.py +215 -0
- monkeybot/core/runtime/__init__.py +1 -0
- monkeybot/core/runtime/context_budget.py +267 -0
- monkeybot/core/runtime/events.py +819 -0
- monkeybot/core/runtime/input_admission.py +154 -0
- monkeybot/core/runtime/loop.py +2374 -0
- monkeybot/core/runtime/provider_stream_mapper.py +159 -0
- monkeybot/core/runtime/realtime_loop.py +654 -0
- monkeybot/core/runtime/utterance_buffer.py +179 -0
- monkeybot/core/subagents/__init__.py +1 -0
- monkeybot/core/subagents/subagent_proto.py +331 -0
- monkeybot/core/subagents/subagent_worker.py +441 -0
- monkeybot/core/subagents/worker_pool.py +403 -0
- monkeybot/core/testing/__init__.py +1 -0
- monkeybot/core/testing/mocks_provider.py +86 -0
- monkeybot/core/testing/mocks_realtime_provider.py +137 -0
- monkeybot/core/tools/__init__.py +1 -0
- monkeybot/core/tools/core_tool_executor.py +1548 -0
- monkeybot/core/tools/inspector.py +226 -0
- monkeybot/core/tools/loop_inspector.py +45 -0
- monkeybot/core/tools/patch.py +480 -0
- monkeybot/core/tools/permission.py +284 -0
- monkeybot/core/tools/sandbox_executor.py +255 -0
- monkeybot/core/tools/spill_inventory.py +35 -0
- monkeybot/core/tools/terminal.py +381 -0
- monkeybot/core/tools/text_normalize.py +25 -0
- monkeybot/core/tools/types.py +33 -0
- monkeybot/core/tools/workspace_service.py +710 -0
- monkeybot/core/tools/workspace_tools.py +116 -0
- monkeybot/core/types/__init__.py +1 -0
- monkeybot/core/types/content_blocks.py +644 -0
- monkeybot/core/types/interfaces.py +156 -0
- monkeybot/core/types/types_tools.py +29 -0
- monkeybot/core/workspace/__init__.py +8 -0
- monkeybot/core/workspace/factory.py +45 -0
- monkeybot/core/workspace/gcs.py +130 -0
- monkeybot/core/workspace/local.py +162 -0
- monkeybot/core/workspace/protocol.py +45 -0
- monkeybot/core/workspace/s3.py +151 -0
- monkeybot/core/workspace_layout.py +27 -0
- monkeybot/gateway/__init__.py +1 -0
- monkeybot/gateway/bootstrap.py +18 -0
- monkeybot/gateway/main.py +47 -0
- monkeybot/gateway/realtime/__init__.py +31 -0
- monkeybot/gateway/realtime/app.py +321 -0
- monkeybot/gateway/realtime/deps.py +52 -0
- monkeybot/gateway/realtime/errors.py +81 -0
- monkeybot/gateway/realtime/guardrails.py +88 -0
- monkeybot/gateway/realtime/manager.py +77 -0
- monkeybot/gateway/realtime/metrics.py +144 -0
- monkeybot/gateway/realtime/routes.py +864 -0
- monkeybot/gateway/realtime/session.py +232 -0
- monkeybot/gateway/realtime/wire.py +412 -0
- monkeybot/gateway/realtime_main.py +49 -0
- monkeybot/gateway/sse/__init__.py +1 -0
- monkeybot/gateway/sse/app.py +733 -0
- monkeybot/gateway/sse/loop_port.py +31 -0
- monkeybot/gateway/sse/models.py +177 -0
- monkeybot/gateway/sse/reply_body.py +91 -0
- monkeybot/gateway/sse/routes.py +1101 -0
- monkeybot/gateway/sse/scheduler_routes.py +200 -0
- monkeybot/gateway/sse/scheduler_wiring.py +96 -0
- monkeybot/gateway/sse/session_bus.py +226 -0
- monkeybot/gateway/sse/sse.py +46 -0
- monkeybot/gateway/sse/workspace_layout.py +7 -0
- monkeybot/observability/__init__.py +220 -0
- monkeybot/observability/_state.py +10 -0
- monkeybot/observability/instrumentation.py +153 -0
- monkeybot/observability/propagation.py +65 -0
- monkeybot/observability/spans.py +455 -0
- monkeybot/providers/__init__.py +19 -0
- monkeybot/providers/_openai_compat.py +450 -0
- monkeybot/providers/_utils.py +473 -0
- monkeybot/providers/bedrock.py +145 -0
- monkeybot/providers/claude.py +125 -0
- monkeybot/providers/gemini.py +677 -0
- monkeybot/providers/gemini_live.py +398 -0
- monkeybot/providers/huggingface.py +129 -0
- monkeybot/providers/nvidia.py +104 -0
- monkeybot/providers/ollama.py +152 -0
- monkeybot/providers/openai.py +127 -0
- monkeybot/providers/pricing.py +60 -0
- monkeybot/providers/sampling.py +44 -0
- monkeybot/providers/vertex_claude.py +148 -0
- monkeybot/scaffold/__init__.py +33 -0
- monkeybot/scheduler/__init__.py +13 -0
- monkeybot/scheduler/__main__.py +4 -0
- monkeybot/scheduler/engine.py +333 -0
- monkeybot/scheduler/http_invoker.py +61 -0
- monkeybot/scheduler/interval.py +77 -0
- monkeybot/scheduler/tick_result.py +34 -0
- monkeybot/scheduler/worker.py +87 -0
- monkeybot/subagents/__init__.py +1 -0
- monkeybot/subagents/worker/__init__.py +1 -0
- monkeybot/subagents/worker/__main__.py +22 -0
- monkeybot/web_search/__init__.py +82 -0
- monkeybot/web_search/backends/__init__.py +5 -0
- monkeybot/web_search/backends/duckduckgo.py +32 -0
- monkeybot/web_search/backends/firecrawl.py +43 -0
- monkeybot/web_search/backends/tavily.py +45 -0
- monkeybot/web_search/protocol.py +25 -0
- monkeybot/web_search/tool.py +56 -0
- monkeybot-2.1.1.dist-info/METADATA +318 -0
- monkeybot-2.1.1.dist-info/RECORD +178 -0
- monkeybot-2.1.1.dist-info/WHEEL +4 -0
- monkeybot-2.1.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""LangChain-free tools wrapping WorkspaceFileService (same logic as /workspace/v1 HTTP API)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import functools
|
|
6
|
+
import json
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, TypeVar, cast
|
|
10
|
+
|
|
11
|
+
from .workspace_service import WorkspaceError, WorkspaceFileService
|
|
12
|
+
|
|
13
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def tool(fn: F) -> F:
|
|
17
|
+
"""Lightweight stand-in for ``langchain_core.tools.tool`` — preserves docstrings and name."""
|
|
18
|
+
|
|
19
|
+
@functools.wraps(fn)
|
|
20
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
21
|
+
return fn(*args, **kwargs)
|
|
22
|
+
|
|
23
|
+
return cast(F, wrapper)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _j(data: Any) -> str:
|
|
27
|
+
return json.dumps(data, ensure_ascii=False)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def create_workspace_file_tools(
|
|
31
|
+
repo_root: Path,
|
|
32
|
+
*,
|
|
33
|
+
settings: object | None = None,
|
|
34
|
+
) -> list[Any]:
|
|
35
|
+
"""Return five tool instances registered with the orchestrator."""
|
|
36
|
+
root = Path(repo_root).resolve()
|
|
37
|
+
svc = WorkspaceFileService(root, settings=settings)
|
|
38
|
+
|
|
39
|
+
@tool
|
|
40
|
+
def workspace_read_file(
|
|
41
|
+
path: str,
|
|
42
|
+
offset: int = 1,
|
|
43
|
+
limit: int | None = None,
|
|
44
|
+
) -> str:
|
|
45
|
+
"""Read a slice of a text file under the repo root (numbered lines, total_lines, truncated).
|
|
46
|
+
|
|
47
|
+
Paths are repo-relative (e.g. data/memory/campaigns/x/note.md). Prefer this over read_file
|
|
48
|
+
for predictable paging. Use offset/limit to read more when truncated is true.
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
return _j(svc.read_file(path, offset=offset, limit=limit))
|
|
52
|
+
except WorkspaceError as e:
|
|
53
|
+
return _j({"ok": False, "error": str(e), "code": e.code})
|
|
54
|
+
|
|
55
|
+
@tool
|
|
56
|
+
def workspace_write_file(path: str, content: str = "") -> str:
|
|
57
|
+
"""Create or replace entire file contents (atomic write). Parent directories are created.
|
|
58
|
+
|
|
59
|
+
Both path and content are required for real writes; content may be empty string.
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
return _j(svc.write_file(path, content))
|
|
63
|
+
except WorkspaceError as e:
|
|
64
|
+
return _j({"ok": False, "error": str(e), "code": e.code})
|
|
65
|
+
|
|
66
|
+
@tool
|
|
67
|
+
def workspace_replace_in_file(path: str, old_string: str = "", new_string: str = "") -> str:
|
|
68
|
+
"""Replace exactly one occurrence of old_string with new_string in a file. Fails if 0 or 2+ matches."""
|
|
69
|
+
try:
|
|
70
|
+
return _j(svc.replace_in_file(path, old_string, new_string))
|
|
71
|
+
except WorkspaceError as e:
|
|
72
|
+
return _j({"ok": False, "error": str(e), "code": e.code})
|
|
73
|
+
|
|
74
|
+
@tool
|
|
75
|
+
def workspace_glob(pattern: str, root: str | None = None) -> str:
|
|
76
|
+
"""List file paths matching a glob pattern under an optional repo-relative root (default repo root).
|
|
77
|
+
|
|
78
|
+
Example pattern: **/*.md — results are capped; check truncated in JSON.
|
|
79
|
+
"""
|
|
80
|
+
try:
|
|
81
|
+
return _j(svc.glob_paths(pattern, root=root))
|
|
82
|
+
except WorkspaceError as e:
|
|
83
|
+
return _j({"ok": False, "error": str(e), "code": e.code})
|
|
84
|
+
|
|
85
|
+
@tool
|
|
86
|
+
def workspace_grep(
|
|
87
|
+
pattern: str,
|
|
88
|
+
root: str | None = None,
|
|
89
|
+
ignore_case: bool = False,
|
|
90
|
+
file_glob: str | None = None,
|
|
91
|
+
max_matches: int | None = None,
|
|
92
|
+
) -> str:
|
|
93
|
+
"""Search file contents with a Python regex under optional repo-relative root.
|
|
94
|
+
|
|
95
|
+
Optional file_glob filters by filename (e.g. *.md). Returns JSON matches [{path, line, text}, ...]; truncated if caps hit.
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
return _j(
|
|
99
|
+
svc.grep(
|
|
100
|
+
pattern,
|
|
101
|
+
root=root,
|
|
102
|
+
ignore_case=ignore_case,
|
|
103
|
+
file_glob=file_glob,
|
|
104
|
+
max_matches=max_matches,
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
except WorkspaceError as e:
|
|
108
|
+
return _j({"ok": False, "error": str(e), "code": e.code})
|
|
109
|
+
|
|
110
|
+
return [
|
|
111
|
+
workspace_read_file,
|
|
112
|
+
workspace_write_file,
|
|
113
|
+
workspace_replace_in_file,
|
|
114
|
+
workspace_glob,
|
|
115
|
+
workspace_grep,
|
|
116
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Shared types, content blocks, and tool definitions for the agent core."""
|