crabcode 0.1.6__py3-none-win_amd64.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.
- crabcode-0.1.6.dist-info/METADATA +63 -0
- crabcode-0.1.6.dist-info/RECORD +205 -0
- crabcode-0.1.6.dist-info/WHEEL +4 -0
- crabcode-0.1.6.dist-info/entry_points.txt +2 -0
- crabcode_cli/__init__.py +7 -0
- crabcode_cli/__main__.py +4 -0
- crabcode_cli/_native/crabcode-computer-use-host.exe +0 -0
- crabcode_cli/_native/runtime.json +6 -0
- crabcode_cli/app.py +776 -0
- crabcode_cli/banner.py +39 -0
- crabcode_cli/computer_use.py +286 -0
- crabcode_cli/model_manager.py +649 -0
- crabcode_cli/model_picker.py +168 -0
- crabcode_cli/pipe.py +148 -0
- crabcode_cli/render/__init__.py +0 -0
- crabcode_cli/render/messages.py +19 -0
- crabcode_cli/repl.py +4841 -0
- crabcode_cli/session_picker.py +239 -0
- crabcode_core/__init__.py +7 -0
- crabcode_core/_version.py +3 -0
- crabcode_core/_windows_process.py +68 -0
- crabcode_core/agent_manager.py +1731 -0
- crabcode_core/api/__init__.py +20 -0
- crabcode_core/api/anthropic_adapter.py +648 -0
- crabcode_core/api/azure_adapter.py +69 -0
- crabcode_core/api/base.py +233 -0
- crabcode_core/api/codex_adapter.py +1327 -0
- crabcode_core/api/error_logging.py +132 -0
- crabcode_core/api/gemini_adapter.py +26 -0
- crabcode_core/api/model_info.py +257 -0
- crabcode_core/api/network.py +62 -0
- crabcode_core/api/ollama_adapter.py +27 -0
- crabcode_core/api/openai_adapter.py +323 -0
- crabcode_core/api/registry.py +58 -0
- crabcode_core/command_line.py +18 -0
- crabcode_core/compact/__init__.py +17 -0
- crabcode_core/compact/compact.py +514 -0
- crabcode_core/compact/context_tokens.py +165 -0
- crabcode_core/computer_use_mode.py +38 -0
- crabcode_core/computer_use_observation.py +144 -0
- crabcode_core/config/__init__.py +3 -0
- crabcode_core/config/claudemd.py +61 -0
- crabcode_core/config/manager.py +237 -0
- crabcode_core/config/model_catalog.py +256 -0
- crabcode_core/events.py +4896 -0
- crabcode_core/file_lock.py +81 -0
- crabcode_core/filesystem.py +22 -0
- crabcode_core/goal.py +149 -0
- crabcode_core/hooks/__init__.py +5 -0
- crabcode_core/hooks/manager.py +290 -0
- crabcode_core/image_io.py +111 -0
- crabcode_core/io_worker.py +211 -0
- crabcode_core/logging_utils.py +168 -0
- crabcode_core/lsp/__init__.py +6 -0
- crabcode_core/lsp/client.py +786 -0
- crabcode_core/lsp/diagnostics.py +150 -0
- crabcode_core/lsp/manager.py +583 -0
- crabcode_core/mcp/__init__.py +4 -0
- crabcode_core/mcp/client.py +169 -0
- crabcode_core/mcp/config.py +57 -0
- crabcode_core/path_validation.py +34 -0
- crabcode_core/paths.py +24 -0
- crabcode_core/peer/__init__.py +10 -0
- crabcode_core/peer/runtime.py +518 -0
- crabcode_core/permissions/__init__.py +7 -0
- crabcode_core/permissions/ai_reviewer.py +184 -0
- crabcode_core/permissions/manager.py +187 -0
- crabcode_core/plan/__init__.py +5 -0
- crabcode_core/plan/executor.py +270 -0
- crabcode_core/plan/types.py +169 -0
- crabcode_core/prompts/__init__.py +0 -0
- crabcode_core/prompts/blocks.py +10 -0
- crabcode_core/prompts/context.py +229 -0
- crabcode_core/prompts/library.py +92 -0
- crabcode_core/prompts/profile.py +79 -0
- crabcode_core/prompts/system.py +356 -0
- crabcode_core/prompts/templates.py +104 -0
- crabcode_core/query/__init__.py +0 -0
- crabcode_core/query/computer_use_history.py +83 -0
- crabcode_core/query/loop.py +2446 -0
- crabcode_core/query/retry.py +116 -0
- crabcode_core/schedule/__init__.py +13 -0
- crabcode_core/schedule/manager.py +631 -0
- crabcode_core/schedule/models.py +204 -0
- crabcode_core/schedule/store.py +558 -0
- crabcode_core/schedule/timing.py +287 -0
- crabcode_core/session/__init__.py +12 -0
- crabcode_core/session/export.py +141 -0
- crabcode_core/session/meta_db.py +684 -0
- crabcode_core/session/storage.py +2032 -0
- crabcode_core/session/title_gen.py +52 -0
- crabcode_core/skills/__init__.py +6 -0
- crabcode_core/skills/context.py +23 -0
- crabcode_core/skills/loader.py +214 -0
- crabcode_core/skills/matcher.py +203 -0
- crabcode_core/snapshot/__init__.py +21 -0
- crabcode_core/snapshot/snapshot.py +436 -0
- crabcode_core/snapshot/tracker.py +359 -0
- crabcode_core/subprocess_utils.py +260 -0
- crabcode_core/team/__init__.py +27 -0
- crabcode_core/team/bridge.py +66 -0
- crabcode_core/team/inbox.py +237 -0
- crabcode_core/team/manager.py +1660 -0
- crabcode_core/team/message_bus.py +821 -0
- crabcode_core/team/models.py +191 -0
- crabcode_core/team/recovery.py +192 -0
- crabcode_core/text_io.py +52 -0
- crabcode_core/tools/__init__.py +112 -0
- crabcode_core/tools/_input_helpers.py +39 -0
- crabcode_core/tools/_input_schema.py +130 -0
- crabcode_core/tools/agent.py +413 -0
- crabcode_core/tools/apply_patch.py +587 -0
- crabcode_core/tools/ask_user.py +122 -0
- crabcode_core/tools/bash.py +154 -0
- crabcode_core/tools/browser.py +678 -0
- crabcode_core/tools/checklist.py +241 -0
- crabcode_core/tools/checkpoint.py +78 -0
- crabcode_core/tools/computer_use.py +599 -0
- crabcode_core/tools/diff_utils.py +123 -0
- crabcode_core/tools/file_edit.py +240 -0
- crabcode_core/tools/file_read.py +187 -0
- crabcode_core/tools/file_write.py +154 -0
- crabcode_core/tools/glob.py +123 -0
- crabcode_core/tools/goal.py +134 -0
- crabcode_core/tools/grep.py +247 -0
- crabcode_core/tools/image.py +173 -0
- crabcode_core/tools/image_generate.py +115 -0
- crabcode_core/tools/lint.py +388 -0
- crabcode_core/tools/loading.py +187 -0
- crabcode_core/tools/memory.py +456 -0
- crabcode_core/tools/monitor.py +677 -0
- crabcode_core/tools/peer.py +103 -0
- crabcode_core/tools/revert.py +90 -0
- crabcode_core/tools/schedule.py +683 -0
- crabcode_core/tools/skill.py +108 -0
- crabcode_core/tools/switch_mode.py +213 -0
- crabcode_core/tools/team.py +329 -0
- crabcode_core/tools/tool_search.py +64 -0
- crabcode_core/tools/web_search.py +444 -0
- crabcode_core/turn_details.py +64 -0
- crabcode_core/types/__init__.py +95 -0
- crabcode_core/types/config.py +434 -0
- crabcode_core/types/event.py +334 -0
- crabcode_core/types/message.py +263 -0
- crabcode_core/types/tool.py +208 -0
- crabcode_core/usage.py +289 -0
- crabcode_core/utf8_sanitize.py +29 -0
- crabcode_debugger/__init__.py +5 -0
- crabcode_debugger/adapters.py +332 -0
- crabcode_debugger/dap.py +304 -0
- crabcode_debugger/memory.py +1806 -0
- crabcode_debugger/process.py +707 -0
- crabcode_debugger/runtime.py +58 -0
- crabcode_debugger/sessions.py +387 -0
- crabcode_debugger/tool.py +731 -0
- crabcode_gateway/__init__.py +18 -0
- crabcode_gateway/acp/__init__.py +13 -0
- crabcode_gateway/acp/agent.py +1581 -0
- crabcode_gateway/acp/session.py +114 -0
- crabcode_gateway/acp/transport.py +39 -0
- crabcode_gateway/acp/types.py +90 -0
- crabcode_gateway/adapter.py +30 -0
- crabcode_gateway/auth.py +139 -0
- crabcode_gateway/computer_use.py +364 -0
- crabcode_gateway/document_engine.py +637 -0
- crabcode_gateway/document_worker.py +301 -0
- crabcode_gateway/event_bus.py +655 -0
- crabcode_gateway/grpc/__init__.py +0 -0
- crabcode_gateway/grpc/crabcode_pb2.py +70 -0
- crabcode_gateway/grpc/crabcode_pb2_grpc.py +474 -0
- crabcode_gateway/grpc/proto/crabcode.proto +160 -0
- crabcode_gateway/grpc/server.py +765 -0
- crabcode_gateway/middleware.py +344 -0
- crabcode_gateway/protocol.py +17 -0
- crabcode_gateway/routes/__init__.py +0 -0
- crabcode_gateway/routes/agent.py +392 -0
- crabcode_gateway/routes/auth.py +150 -0
- crabcode_gateway/routes/computer_use.py +101 -0
- crabcode_gateway/routes/config.py +1698 -0
- crabcode_gateway/routes/document.py +1810 -0
- crabcode_gateway/routes/event.py +3801 -0
- crabcode_gateway/routes/git_review.py +232 -0
- crabcode_gateway/routes/health.py +14 -0
- crabcode_gateway/routes/peer.py +78 -0
- crabcode_gateway/routes/permission.py +121 -0
- crabcode_gateway/routes/schedule.py +300 -0
- crabcode_gateway/routes/session.py +1496 -0
- crabcode_gateway/routes/snapshot.py +211 -0
- crabcode_gateway/routes/tasks.py +318 -0
- crabcode_gateway/routes/team.py +392 -0
- crabcode_gateway/routes/usage.py +49 -0
- crabcode_gateway/routes/workspace.py +299 -0
- crabcode_gateway/safe_file.py +63 -0
- crabcode_gateway/schemas.py +1820 -0
- crabcode_gateway/server.py +514 -0
- crabcode_gateway/session_registry.py +36 -0
- crabcode_gateway/task_registry.py +708 -0
- crabcode_gateway/turn_details.py +60 -0
- crabcode_search/__init__.py +11 -0
- crabcode_search/background.py +368 -0
- crabcode_search/chunker.py +517 -0
- crabcode_search/embedder.py +497 -0
- crabcode_search/indexer.py +215 -0
- crabcode_search/store.py +222 -0
- crabcode_search/tool.py +268 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Retry state for streamed model responses."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import random
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Callable
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
INITIAL_RETRY_DELAY_SECONDS = 0.2
|
|
11
|
+
INITIAL_CONNECTION_RETRY_DELAY_SECONDS = 5.0
|
|
12
|
+
MAX_CONNECTION_RETRY_DELAY_SECONDS = 60.0
|
|
13
|
+
MAX_STREAM_RETRIES = 100
|
|
14
|
+
MAX_REQUEST_RETRIES = 100
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class StreamRetry:
|
|
19
|
+
"""One scheduled reconnect attempt."""
|
|
20
|
+
|
|
21
|
+
message: str
|
|
22
|
+
error: str
|
|
23
|
+
delay_seconds: float
|
|
24
|
+
retry_count: int
|
|
25
|
+
max_retries: int
|
|
26
|
+
unbounded: bool = False
|
|
27
|
+
transport_fallback: bool = False
|
|
28
|
+
discarded_text_chars: int = 0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ResponsesStreamRetryState:
|
|
32
|
+
"""Track bounded stream retries and unbounded connection retries."""
|
|
33
|
+
|
|
34
|
+
def __init__(self) -> None:
|
|
35
|
+
self.retries = 0
|
|
36
|
+
self.connection_retries = 0
|
|
37
|
+
self.connection_retry_delay = INITIAL_CONNECTION_RETRY_DELAY_SECONDS
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def _backoff(attempt: int) -> float:
|
|
41
|
+
base = INITIAL_RETRY_DELAY_SECONDS * (2 ** max(attempt - 1, 0))
|
|
42
|
+
return base * random.uniform(0.9, 1.1)
|
|
43
|
+
|
|
44
|
+
def schedule(
|
|
45
|
+
self,
|
|
46
|
+
*,
|
|
47
|
+
error: str,
|
|
48
|
+
max_retries: int,
|
|
49
|
+
connection_failed: bool = False,
|
|
50
|
+
retry_after: float | None = None,
|
|
51
|
+
unbounded_connection_retries: bool = False,
|
|
52
|
+
allow_unbounded_connection_retries: bool = True,
|
|
53
|
+
try_transport_fallback: Callable[[], bool] | None = None,
|
|
54
|
+
) -> StreamRetry | None:
|
|
55
|
+
"""Return the next retry, or ``None`` when the error is terminal.
|
|
56
|
+
|
|
57
|
+
Eligible connection failures use a separate unbounded 5..60 second
|
|
58
|
+
budget. Other failures consume the bounded stream budget. After that
|
|
59
|
+
budget, a transport fallback gets one chance and resets the counter.
|
|
60
|
+
"""
|
|
61
|
+
max_retries = min(max(0, int(max_retries)), MAX_STREAM_RETRIES)
|
|
62
|
+
if (
|
|
63
|
+
unbounded_connection_retries
|
|
64
|
+
and allow_unbounded_connection_retries
|
|
65
|
+
and connection_failed
|
|
66
|
+
):
|
|
67
|
+
delay = self.connection_retry_delay
|
|
68
|
+
self.connection_retries += 1
|
|
69
|
+
self.connection_retry_delay = min(
|
|
70
|
+
delay * 2,
|
|
71
|
+
MAX_CONNECTION_RETRY_DELAY_SECONDS,
|
|
72
|
+
)
|
|
73
|
+
return StreamRetry(
|
|
74
|
+
message="模型连接中断,正在等待网络恢复(持续重连已开启,可停止任务)",
|
|
75
|
+
error=error,
|
|
76
|
+
delay_seconds=delay,
|
|
77
|
+
retry_count=self.connection_retries,
|
|
78
|
+
max_retries=0,
|
|
79
|
+
unbounded=True,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if self.retries >= max_retries and try_transport_fallback is not None:
|
|
83
|
+
if bool(try_transport_fallback()):
|
|
84
|
+
self.retries = 0
|
|
85
|
+
return StreamRetry(
|
|
86
|
+
message="Falling back from WebSockets to HTTPS transport.",
|
|
87
|
+
error=error,
|
|
88
|
+
delay_seconds=0.0,
|
|
89
|
+
retry_count=0,
|
|
90
|
+
max_retries=max_retries,
|
|
91
|
+
transport_fallback=True,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if self.retries >= max_retries:
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
self.retries += 1
|
|
98
|
+
delay = (
|
|
99
|
+
max(0.0, float(retry_after))
|
|
100
|
+
if retry_after is not None
|
|
101
|
+
else self._backoff(self.retries)
|
|
102
|
+
)
|
|
103
|
+
return StreamRetry(
|
|
104
|
+
message=f"模型连接中断,正在重试 {self.retries}/{max_retries}",
|
|
105
|
+
error=error,
|
|
106
|
+
delay_seconds=delay,
|
|
107
|
+
retry_count=self.retries,
|
|
108
|
+
max_retries=max_retries,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def request_retry_backoff(attempt: int) -> float:
|
|
113
|
+
"""Return a 200ms exponential HTTP-request retry delay with jitter."""
|
|
114
|
+
bounded_attempt = max(1, int(attempt))
|
|
115
|
+
base = INITIAL_RETRY_DELAY_SECONDS * (2 ** (bounded_attempt - 1))
|
|
116
|
+
return base * random.uniform(0.9, 1.1)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Schedule subsystem - cron/interval/once job scheduling."""
|
|
2
|
+
|
|
3
|
+
from crabcode_core.schedule.manager import ScheduleExecutionResult, ScheduleManager
|
|
4
|
+
from crabcode_core.schedule.models import JobRun, ScheduleJob
|
|
5
|
+
from crabcode_core.schedule.store import ScheduleStore
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"JobRun",
|
|
9
|
+
"ScheduleExecutionResult",
|
|
10
|
+
"ScheduleJob",
|
|
11
|
+
"ScheduleManager",
|
|
12
|
+
"ScheduleStore",
|
|
13
|
+
]
|