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.
Files changed (163) hide show
  1. deepagents_code/__init__.py +42 -0
  2. deepagents_code/__main__.py +6 -0
  3. deepagents_code/_ask_user_types.py +90 -0
  4. deepagents_code/_cli_context.py +96 -0
  5. deepagents_code/_constants.py +41 -0
  6. deepagents_code/_debug.py +148 -0
  7. deepagents_code/_debug_buffer.py +204 -0
  8. deepagents_code/_env_vars.py +411 -0
  9. deepagents_code/_fake_models.py +66 -0
  10. deepagents_code/_git.py +521 -0
  11. deepagents_code/_paths.py +69 -0
  12. deepagents_code/_server_config.py +576 -0
  13. deepagents_code/_session_stats.py +235 -0
  14. deepagents_code/_startup_error.py +45 -0
  15. deepagents_code/_testing_models.py +305 -0
  16. deepagents_code/_textual_patches.py +420 -0
  17. deepagents_code/_tool_stream.py +694 -0
  18. deepagents_code/_version.py +46 -0
  19. deepagents_code/agent.py +1976 -0
  20. deepagents_code/app.py +19239 -0
  21. deepagents_code/app.tcss +438 -0
  22. deepagents_code/approval_mode.py +131 -0
  23. deepagents_code/ask_user.py +306 -0
  24. deepagents_code/auth_display.py +185 -0
  25. deepagents_code/auth_store.py +545 -0
  26. deepagents_code/built_in_skills/__init__.py +5 -0
  27. deepagents_code/built_in_skills/remember/SKILL.md +118 -0
  28. deepagents_code/built_in_skills/skill-creator/SKILL.md +383 -0
  29. deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +366 -0
  30. deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +158 -0
  31. deepagents_code/client/__init__.py +1 -0
  32. deepagents_code/client/commands/__init__.py +1 -0
  33. deepagents_code/client/commands/auth.py +541 -0
  34. deepagents_code/client/commands/config.py +714 -0
  35. deepagents_code/client/commands/mcp.py +250 -0
  36. deepagents_code/client/commands/tools.py +416 -0
  37. deepagents_code/client/launch/__init__.py +1 -0
  38. deepagents_code/client/launch/server.py +978 -0
  39. deepagents_code/client/launch/server_manager.py +540 -0
  40. deepagents_code/client/non_interactive.py +1758 -0
  41. deepagents_code/client/remote_client.py +794 -0
  42. deepagents_code/clipboard.py +217 -0
  43. deepagents_code/command_registry.py +450 -0
  44. deepagents_code/config.py +4829 -0
  45. deepagents_code/config_manifest.py +1451 -0
  46. deepagents_code/configurable_model.py +577 -0
  47. deepagents_code/default_agent_prompt.md +12 -0
  48. deepagents_code/doctor.py +559 -0
  49. deepagents_code/editor.py +142 -0
  50. deepagents_code/event_bus.py +411 -0
  51. deepagents_code/extras_info.py +661 -0
  52. deepagents_code/file_ops.py +576 -0
  53. deepagents_code/formatting.py +135 -0
  54. deepagents_code/goal_rubric.py +497 -0
  55. deepagents_code/goal_tools.py +459 -0
  56. deepagents_code/hooks.py +348 -0
  57. deepagents_code/input.py +1041 -0
  58. deepagents_code/integrations/__init__.py +1 -0
  59. deepagents_code/integrations/openai_codex.py +551 -0
  60. deepagents_code/integrations/sandbox_config.py +198 -0
  61. deepagents_code/integrations/sandbox_factory.py +1124 -0
  62. deepagents_code/integrations/sandbox_provider.py +137 -0
  63. deepagents_code/integrations/sandbox_registry.py +350 -0
  64. deepagents_code/iterm_cursor_guide.py +176 -0
  65. deepagents_code/local_context.py +926 -0
  66. deepagents_code/main.py +3985 -0
  67. deepagents_code/managed_tools.py +642 -0
  68. deepagents_code/mcp_auth.py +1950 -0
  69. deepagents_code/mcp_config.py +176 -0
  70. deepagents_code/mcp_disabled.py +212 -0
  71. deepagents_code/mcp_login_service.py +281 -0
  72. deepagents_code/mcp_oauth_ui.py +199 -0
  73. deepagents_code/mcp_providers/__init__.py +23 -0
  74. deepagents_code/mcp_providers/_registry.py +39 -0
  75. deepagents_code/mcp_providers/base.py +133 -0
  76. deepagents_code/mcp_providers/github.py +102 -0
  77. deepagents_code/mcp_providers/slack.py +175 -0
  78. deepagents_code/mcp_tools.py +2427 -0
  79. deepagents_code/mcp_trust.py +207 -0
  80. deepagents_code/media_utils.py +826 -0
  81. deepagents_code/memory_guard.py +474 -0
  82. deepagents_code/model_config.py +4156 -0
  83. deepagents_code/notifications.py +247 -0
  84. deepagents_code/offload.py +402 -0
  85. deepagents_code/onboarding.py +223 -0
  86. deepagents_code/output.py +69 -0
  87. deepagents_code/paste_collapse.py +103 -0
  88. deepagents_code/project_utils.py +231 -0
  89. deepagents_code/py.typed +0 -0
  90. deepagents_code/reasoning_effort.py +641 -0
  91. deepagents_code/reliable_rubric.py +97 -0
  92. deepagents_code/resume_state.py +237 -0
  93. deepagents_code/server_graph.py +310 -0
  94. deepagents_code/session_end_summary.py +329 -0
  95. deepagents_code/sessions.py +1716 -0
  96. deepagents_code/skills/__init__.py +18 -0
  97. deepagents_code/skills/commands.py +1252 -0
  98. deepagents_code/skills/invocation.py +112 -0
  99. deepagents_code/skills/load.py +196 -0
  100. deepagents_code/skills/trust.py +547 -0
  101. deepagents_code/state_migration.py +136 -0
  102. deepagents_code/subagents.py +278 -0
  103. deepagents_code/system_prompt.md +204 -0
  104. deepagents_code/terminal_capabilities.py +115 -0
  105. deepagents_code/terminal_escape.py +287 -0
  106. deepagents_code/theme.py +891 -0
  107. deepagents_code/todo_list_prompt.md +12 -0
  108. deepagents_code/tool_catalog.py +509 -0
  109. deepagents_code/tool_display.py +367 -0
  110. deepagents_code/tools.py +516 -0
  111. deepagents_code/tui/__init__.py +1 -0
  112. deepagents_code/tui/textual_adapter.py +2553 -0
  113. deepagents_code/tui/widgets/__init__.py +9 -0
  114. deepagents_code/tui/widgets/_js_eval_display.py +139 -0
  115. deepagents_code/tui/widgets/_links.py +261 -0
  116. deepagents_code/tui/widgets/agent_selector.py +420 -0
  117. deepagents_code/tui/widgets/approval.py +602 -0
  118. deepagents_code/tui/widgets/ask_user.py +515 -0
  119. deepagents_code/tui/widgets/auth.py +1997 -0
  120. deepagents_code/tui/widgets/autocomplete.py +890 -0
  121. deepagents_code/tui/widgets/chat_input.py +3181 -0
  122. deepagents_code/tui/widgets/codex_auth.py +452 -0
  123. deepagents_code/tui/widgets/cwd_switch.py +242 -0
  124. deepagents_code/tui/widgets/debug_console.py +868 -0
  125. deepagents_code/tui/widgets/diff.py +252 -0
  126. deepagents_code/tui/widgets/effort_selector.py +189 -0
  127. deepagents_code/tui/widgets/goal_review.py +390 -0
  128. deepagents_code/tui/widgets/goal_status.py +50 -0
  129. deepagents_code/tui/widgets/history.py +194 -0
  130. deepagents_code/tui/widgets/install_confirm.py +248 -0
  131. deepagents_code/tui/widgets/launch_init.py +482 -0
  132. deepagents_code/tui/widgets/loading.py +227 -0
  133. deepagents_code/tui/widgets/mcp_login.py +539 -0
  134. deepagents_code/tui/widgets/mcp_reconnect.py +212 -0
  135. deepagents_code/tui/widgets/mcp_viewer.py +1634 -0
  136. deepagents_code/tui/widgets/message_store.py +999 -0
  137. deepagents_code/tui/widgets/messages.py +3846 -0
  138. deepagents_code/tui/widgets/model_selector.py +2343 -0
  139. deepagents_code/tui/widgets/notification_center.py +456 -0
  140. deepagents_code/tui/widgets/notification_detail.py +257 -0
  141. deepagents_code/tui/widgets/notification_settings.py +170 -0
  142. deepagents_code/tui/widgets/restart_prompt.py +158 -0
  143. deepagents_code/tui/widgets/skill_trust.py +131 -0
  144. deepagents_code/tui/widgets/startup_tip.py +91 -0
  145. deepagents_code/tui/widgets/status.py +781 -0
  146. deepagents_code/tui/widgets/subagent_panel.py +969 -0
  147. deepagents_code/tui/widgets/theme_selector.py +401 -0
  148. deepagents_code/tui/widgets/thread_selector.py +2564 -0
  149. deepagents_code/tui/widgets/tool_renderers.py +190 -0
  150. deepagents_code/tui/widgets/tool_widgets.py +304 -0
  151. deepagents_code/tui/widgets/update_available.py +311 -0
  152. deepagents_code/tui/widgets/update_confirm.py +184 -0
  153. deepagents_code/tui/widgets/update_progress.py +327 -0
  154. deepagents_code/tui/widgets/welcome.py +508 -0
  155. deepagents_code/turn_end_summary.py +522 -0
  156. deepagents_code/ui.py +858 -0
  157. deepagents_code/unicode_security.py +563 -0
  158. deepagents_code/update_check.py +3124 -0
  159. zjcode-0.0.1.data/data/deepagents_code/default_agent_prompt.md +12 -0
  160. zjcode-0.0.1.dist-info/METADATA +220 -0
  161. zjcode-0.0.1.dist-info/RECORD +163 -0
  162. zjcode-0.0.1.dist-info/WHEEL +4 -0
  163. 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 {}