zjcode 0.0.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.
- deepagents_code/__init__.py +42 -0
- deepagents_code/__main__.py +6 -0
- deepagents_code/_ask_user_types.py +90 -0
- deepagents_code/_cli_context.py +96 -0
- deepagents_code/_constants.py +41 -0
- deepagents_code/_debug.py +148 -0
- deepagents_code/_debug_buffer.py +204 -0
- deepagents_code/_env_vars.py +411 -0
- deepagents_code/_fake_models.py +66 -0
- deepagents_code/_git.py +521 -0
- deepagents_code/_paths.py +69 -0
- deepagents_code/_server_config.py +576 -0
- deepagents_code/_session_stats.py +235 -0
- deepagents_code/_startup_error.py +45 -0
- deepagents_code/_testing_models.py +305 -0
- deepagents_code/_textual_patches.py +420 -0
- deepagents_code/_tool_stream.py +694 -0
- deepagents_code/_version.py +46 -0
- deepagents_code/agent.py +1976 -0
- deepagents_code/app.py +19239 -0
- deepagents_code/app.tcss +438 -0
- deepagents_code/approval_mode.py +131 -0
- deepagents_code/ask_user.py +306 -0
- deepagents_code/auth_display.py +185 -0
- deepagents_code/auth_store.py +545 -0
- deepagents_code/built_in_skills/__init__.py +5 -0
- deepagents_code/built_in_skills/remember/SKILL.md +118 -0
- deepagents_code/built_in_skills/skill-creator/SKILL.md +383 -0
- deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +366 -0
- deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +158 -0
- deepagents_code/client/__init__.py +1 -0
- deepagents_code/client/commands/__init__.py +1 -0
- deepagents_code/client/commands/auth.py +541 -0
- deepagents_code/client/commands/config.py +714 -0
- deepagents_code/client/commands/mcp.py +250 -0
- deepagents_code/client/commands/tools.py +416 -0
- deepagents_code/client/launch/__init__.py +1 -0
- deepagents_code/client/launch/server.py +978 -0
- deepagents_code/client/launch/server_manager.py +540 -0
- deepagents_code/client/non_interactive.py +1758 -0
- deepagents_code/client/remote_client.py +794 -0
- deepagents_code/clipboard.py +217 -0
- deepagents_code/command_registry.py +450 -0
- deepagents_code/config.py +4829 -0
- deepagents_code/config_manifest.py +1451 -0
- deepagents_code/configurable_model.py +577 -0
- deepagents_code/default_agent_prompt.md +12 -0
- deepagents_code/doctor.py +559 -0
- deepagents_code/editor.py +142 -0
- deepagents_code/event_bus.py +411 -0
- deepagents_code/extras_info.py +661 -0
- deepagents_code/file_ops.py +576 -0
- deepagents_code/formatting.py +135 -0
- deepagents_code/goal_rubric.py +497 -0
- deepagents_code/goal_tools.py +459 -0
- deepagents_code/hooks.py +348 -0
- deepagents_code/input.py +1041 -0
- deepagents_code/integrations/__init__.py +1 -0
- deepagents_code/integrations/openai_codex.py +551 -0
- deepagents_code/integrations/sandbox_config.py +198 -0
- deepagents_code/integrations/sandbox_factory.py +1124 -0
- deepagents_code/integrations/sandbox_provider.py +137 -0
- deepagents_code/integrations/sandbox_registry.py +350 -0
- deepagents_code/iterm_cursor_guide.py +176 -0
- deepagents_code/local_context.py +926 -0
- deepagents_code/main.py +3985 -0
- deepagents_code/managed_tools.py +642 -0
- deepagents_code/mcp_auth.py +1950 -0
- deepagents_code/mcp_config.py +176 -0
- deepagents_code/mcp_disabled.py +212 -0
- deepagents_code/mcp_login_service.py +281 -0
- deepagents_code/mcp_oauth_ui.py +199 -0
- deepagents_code/mcp_providers/__init__.py +23 -0
- deepagents_code/mcp_providers/_registry.py +39 -0
- deepagents_code/mcp_providers/base.py +133 -0
- deepagents_code/mcp_providers/github.py +102 -0
- deepagents_code/mcp_providers/slack.py +175 -0
- deepagents_code/mcp_tools.py +2427 -0
- deepagents_code/mcp_trust.py +207 -0
- deepagents_code/media_utils.py +826 -0
- deepagents_code/memory_guard.py +474 -0
- deepagents_code/model_config.py +4156 -0
- deepagents_code/notifications.py +247 -0
- deepagents_code/offload.py +402 -0
- deepagents_code/onboarding.py +223 -0
- deepagents_code/output.py +69 -0
- deepagents_code/paste_collapse.py +103 -0
- deepagents_code/project_utils.py +231 -0
- deepagents_code/py.typed +0 -0
- deepagents_code/reasoning_effort.py +641 -0
- deepagents_code/reliable_rubric.py +97 -0
- deepagents_code/resume_state.py +237 -0
- deepagents_code/server_graph.py +310 -0
- deepagents_code/session_end_summary.py +329 -0
- deepagents_code/sessions.py +1716 -0
- deepagents_code/skills/__init__.py +18 -0
- deepagents_code/skills/commands.py +1252 -0
- deepagents_code/skills/invocation.py +112 -0
- deepagents_code/skills/load.py +196 -0
- deepagents_code/skills/trust.py +547 -0
- deepagents_code/state_migration.py +136 -0
- deepagents_code/subagents.py +278 -0
- deepagents_code/system_prompt.md +204 -0
- deepagents_code/terminal_capabilities.py +115 -0
- deepagents_code/terminal_escape.py +287 -0
- deepagents_code/theme.py +891 -0
- deepagents_code/todo_list_prompt.md +12 -0
- deepagents_code/tool_catalog.py +509 -0
- deepagents_code/tool_display.py +367 -0
- deepagents_code/tools.py +516 -0
- deepagents_code/tui/__init__.py +1 -0
- deepagents_code/tui/textual_adapter.py +2553 -0
- deepagents_code/tui/widgets/__init__.py +9 -0
- deepagents_code/tui/widgets/_js_eval_display.py +139 -0
- deepagents_code/tui/widgets/_links.py +261 -0
- deepagents_code/tui/widgets/agent_selector.py +420 -0
- deepagents_code/tui/widgets/approval.py +602 -0
- deepagents_code/tui/widgets/ask_user.py +515 -0
- deepagents_code/tui/widgets/auth.py +1997 -0
- deepagents_code/tui/widgets/autocomplete.py +890 -0
- deepagents_code/tui/widgets/chat_input.py +3181 -0
- deepagents_code/tui/widgets/codex_auth.py +452 -0
- deepagents_code/tui/widgets/cwd_switch.py +242 -0
- deepagents_code/tui/widgets/debug_console.py +868 -0
- deepagents_code/tui/widgets/diff.py +252 -0
- deepagents_code/tui/widgets/effort_selector.py +189 -0
- deepagents_code/tui/widgets/goal_review.py +390 -0
- deepagents_code/tui/widgets/goal_status.py +50 -0
- deepagents_code/tui/widgets/history.py +194 -0
- deepagents_code/tui/widgets/install_confirm.py +248 -0
- deepagents_code/tui/widgets/launch_init.py +482 -0
- deepagents_code/tui/widgets/loading.py +227 -0
- deepagents_code/tui/widgets/mcp_login.py +539 -0
- deepagents_code/tui/widgets/mcp_reconnect.py +212 -0
- deepagents_code/tui/widgets/mcp_viewer.py +1634 -0
- deepagents_code/tui/widgets/message_store.py +999 -0
- deepagents_code/tui/widgets/messages.py +3846 -0
- deepagents_code/tui/widgets/model_selector.py +2343 -0
- deepagents_code/tui/widgets/notification_center.py +456 -0
- deepagents_code/tui/widgets/notification_detail.py +257 -0
- deepagents_code/tui/widgets/notification_settings.py +170 -0
- deepagents_code/tui/widgets/restart_prompt.py +158 -0
- deepagents_code/tui/widgets/skill_trust.py +131 -0
- deepagents_code/tui/widgets/startup_tip.py +91 -0
- deepagents_code/tui/widgets/status.py +781 -0
- deepagents_code/tui/widgets/subagent_panel.py +969 -0
- deepagents_code/tui/widgets/theme_selector.py +401 -0
- deepagents_code/tui/widgets/thread_selector.py +2564 -0
- deepagents_code/tui/widgets/tool_renderers.py +190 -0
- deepagents_code/tui/widgets/tool_widgets.py +304 -0
- deepagents_code/tui/widgets/update_available.py +311 -0
- deepagents_code/tui/widgets/update_confirm.py +184 -0
- deepagents_code/tui/widgets/update_progress.py +327 -0
- deepagents_code/tui/widgets/welcome.py +508 -0
- deepagents_code/turn_end_summary.py +522 -0
- deepagents_code/ui.py +858 -0
- deepagents_code/unicode_security.py +563 -0
- deepagents_code/update_check.py +3124 -0
- zjcode-0.0.1.data/data/deepagents_code/default_agent_prompt.md +12 -0
- zjcode-0.0.1.dist-info/METADATA +220 -0
- zjcode-0.0.1.dist-info/RECORD +163 -0
- zjcode-0.0.1.dist-info/WHEEL +4 -0
- zjcode-0.0.1.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Parsing for the `[sandboxes]` section of `~/.deepagents/config.toml`.
|
|
2
|
+
|
|
3
|
+
Parallels the `[models]` provider configuration in `model_config.py`. Config
|
|
4
|
+
providers declare a `class_path` (same trust model as model `class_path`),
|
|
5
|
+
a `working_dir`, an optional install `package`, and `params` forwarded to
|
|
6
|
+
`provider.get_or_create()`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import tomllib
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from types import MappingProxyType
|
|
15
|
+
from typing import TYPE_CHECKING, Any, TypedDict, cast
|
|
16
|
+
|
|
17
|
+
from deepagents_code.model_config import DEFAULT_CONFIG_PATH
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from collections.abc import Mapping
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _normalize_provider_configs(
|
|
27
|
+
providers: dict[str, Any],
|
|
28
|
+
) -> dict[str, SandboxProviderConfig]:
|
|
29
|
+
"""Drop malformed provider entries before constructing `SandboxConfig`.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
providers: Raw provider mapping from TOML.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Provider entries that are valid TOML tables.
|
|
36
|
+
"""
|
|
37
|
+
normalized: dict[str, SandboxProviderConfig] = {}
|
|
38
|
+
for name, provider in providers.items():
|
|
39
|
+
if not isinstance(provider, dict):
|
|
40
|
+
logger.warning(
|
|
41
|
+
"Sandbox provider '%s' is not a table (%s); ignoring it",
|
|
42
|
+
name,
|
|
43
|
+
type(provider).__name__,
|
|
44
|
+
)
|
|
45
|
+
continue
|
|
46
|
+
normalized[name] = cast("SandboxProviderConfig", provider)
|
|
47
|
+
return normalized
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class SandboxProviderConfig(TypedDict, total=False):
|
|
51
|
+
"""Configuration for a single config-declared sandbox provider.
|
|
52
|
+
|
|
53
|
+
!!! warning
|
|
54
|
+
|
|
55
|
+
Setting `class_path` executes arbitrary Python code imported from the
|
|
56
|
+
user's config file. This has the same trust model as model
|
|
57
|
+
`class_path` — the user controls their own machine.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
class_path: str
|
|
61
|
+
"""Fully-qualified provider class in `module.path:ClassName` format."""
|
|
62
|
+
|
|
63
|
+
working_dir: str
|
|
64
|
+
"""Default working directory inside the sandbox."""
|
|
65
|
+
|
|
66
|
+
package: str
|
|
67
|
+
"""Package suggested when the provider's dependencies are missing."""
|
|
68
|
+
|
|
69
|
+
supports_sandbox_id: bool
|
|
70
|
+
"""Whether the provider can reattach to an existing sandbox by id."""
|
|
71
|
+
|
|
72
|
+
supports_snapshot_name: bool
|
|
73
|
+
"""Whether the provider honors `--sandbox-snapshot-name`."""
|
|
74
|
+
|
|
75
|
+
params: dict[str, Any]
|
|
76
|
+
"""Extra keyword arguments forwarded to `provider.get_or_create()`."""
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass(frozen=True)
|
|
80
|
+
class SandboxConfig:
|
|
81
|
+
"""Parsed `[sandboxes]` configuration from `config.toml`.
|
|
82
|
+
|
|
83
|
+
Instances are immutable once constructed; `providers` is wrapped in a
|
|
84
|
+
`MappingProxyType` to prevent accidental mutation.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
default: str | None = None
|
|
88
|
+
"""The configured default provider (from `[sandboxes].default`).
|
|
89
|
+
|
|
90
|
+
Only applied when the user explicitly opts into sandbox mode; a config
|
|
91
|
+
value never silently enables sandbox mode.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
providers: Mapping[str, SandboxProviderConfig] = field(default_factory=dict)
|
|
95
|
+
"""Read-only mapping of provider names to their configurations."""
|
|
96
|
+
|
|
97
|
+
parse_error: str | None = None
|
|
98
|
+
"""Set when the config file existed but could not be read or parsed.
|
|
99
|
+
|
|
100
|
+
`load()` degrades to an empty config on malformed TOML or an unreadable
|
|
101
|
+
file so unrelated startup keeps working, but the user explicitly opted into
|
|
102
|
+
a sandbox. Callers surface this so the failure isn't invisible (a bare
|
|
103
|
+
`logger.warning` never reaches the TUI).
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
def __post_init__(self) -> None:
|
|
107
|
+
"""Freeze the providers dict into a read-only proxy."""
|
|
108
|
+
if not isinstance(self.providers, MappingProxyType):
|
|
109
|
+
object.__setattr__(self, "providers", MappingProxyType(self.providers))
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def load(cls, config_path: Path | None = None) -> SandboxConfig:
|
|
113
|
+
"""Load the `[sandboxes]` section from a config file.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
config_path: Path to config file. Defaults to
|
|
117
|
+
`~/.deepagents/config.toml`.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Parsed `SandboxConfig`. Returns an empty config if the file is
|
|
121
|
+
missing, unreadable, or contains invalid TOML.
|
|
122
|
+
"""
|
|
123
|
+
if config_path is None:
|
|
124
|
+
config_path = DEFAULT_CONFIG_PATH
|
|
125
|
+
|
|
126
|
+
if not config_path.exists():
|
|
127
|
+
return cls()
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
with config_path.open("rb") as f:
|
|
131
|
+
data = tomllib.load(f)
|
|
132
|
+
except tomllib.TOMLDecodeError as e:
|
|
133
|
+
logger.warning(
|
|
134
|
+
"Config file %s has invalid TOML syntax: %s. Ignoring sandbox config.",
|
|
135
|
+
config_path,
|
|
136
|
+
e,
|
|
137
|
+
)
|
|
138
|
+
return cls(parse_error=f"invalid TOML syntax: {e}")
|
|
139
|
+
except (PermissionError, OSError) as e:
|
|
140
|
+
logger.warning("Could not read config file %s: %s", config_path, e)
|
|
141
|
+
return cls(parse_error=f"could not read config file: {e}")
|
|
142
|
+
|
|
143
|
+
section = data.get("sandboxes", {})
|
|
144
|
+
if not isinstance(section, dict):
|
|
145
|
+
logger.warning("[sandboxes] is not a table; ignoring sandbox config")
|
|
146
|
+
return cls(parse_error="[sandboxes] is not a table")
|
|
147
|
+
|
|
148
|
+
providers = section.get("providers", {})
|
|
149
|
+
if not isinstance(providers, dict):
|
|
150
|
+
logger.warning(
|
|
151
|
+
"[sandboxes.providers] is not a table; ignoring sandbox providers"
|
|
152
|
+
)
|
|
153
|
+
providers = {}
|
|
154
|
+
|
|
155
|
+
config = cls(
|
|
156
|
+
default=section.get("default"),
|
|
157
|
+
providers=_normalize_provider_configs(providers),
|
|
158
|
+
)
|
|
159
|
+
config._validate()
|
|
160
|
+
return config
|
|
161
|
+
|
|
162
|
+
def _validate(self) -> None:
|
|
163
|
+
"""Warn about malformed config without raising."""
|
|
164
|
+
for name, provider in self.providers.items():
|
|
165
|
+
class_path = provider.get("class_path")
|
|
166
|
+
if not class_path:
|
|
167
|
+
logger.warning(
|
|
168
|
+
"Sandbox provider '%s' is missing required 'class_path'", name
|
|
169
|
+
)
|
|
170
|
+
elif ":" not in class_path:
|
|
171
|
+
logger.warning(
|
|
172
|
+
"Sandbox provider '%s' has invalid class_path '%s': "
|
|
173
|
+
"must be in module.path:ClassName format",
|
|
174
|
+
name,
|
|
175
|
+
class_path,
|
|
176
|
+
)
|
|
177
|
+
params = provider.get("params")
|
|
178
|
+
if params is not None and not isinstance(params, dict):
|
|
179
|
+
logger.warning(
|
|
180
|
+
"Sandbox provider '%s' has non-table 'params' (%s); ignoring it",
|
|
181
|
+
name,
|
|
182
|
+
type(params).__name__,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
def get_params(self, provider_name: str) -> dict[str, Any]:
|
|
186
|
+
"""Return the `params` forwarded to a provider's `get_or_create()`.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
provider_name: The provider to look up.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
A copy of the configured params (empty if none configured).
|
|
193
|
+
"""
|
|
194
|
+
provider = self.providers.get(provider_name)
|
|
195
|
+
if not provider:
|
|
196
|
+
return {}
|
|
197
|
+
params = provider.get("params", {})
|
|
198
|
+
return dict(params) if isinstance(params, dict) else {}
|