agentpool 2.1.9__py3-none-any.whl → 2.2.3__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.
- acp/__init__.py +13 -0
- acp/bridge/README.md +15 -2
- acp/bridge/__init__.py +3 -2
- acp/bridge/__main__.py +60 -19
- acp/bridge/ws_server.py +173 -0
- acp/bridge/ws_server_cli.py +89 -0
- acp/notifications.py +2 -1
- acp/stdio.py +39 -9
- acp/transports.py +362 -2
- acp/utils.py +15 -2
- agentpool/__init__.py +4 -1
- agentpool/agents/__init__.py +2 -0
- agentpool/agents/acp_agent/acp_agent.py +203 -88
- agentpool/agents/acp_agent/acp_converters.py +46 -21
- agentpool/agents/acp_agent/client_handler.py +157 -3
- agentpool/agents/acp_agent/session_state.py +4 -1
- agentpool/agents/agent.py +314 -107
- agentpool/agents/agui_agent/__init__.py +0 -2
- agentpool/agents/agui_agent/agui_agent.py +90 -21
- agentpool/agents/agui_agent/agui_converters.py +0 -131
- agentpool/agents/base_agent.py +163 -1
- agentpool/agents/claude_code_agent/claude_code_agent.py +626 -179
- agentpool/agents/claude_code_agent/converters.py +71 -3
- agentpool/agents/claude_code_agent/history.py +474 -0
- agentpool/agents/context.py +40 -0
- agentpool/agents/events/__init__.py +2 -0
- agentpool/agents/events/builtin_handlers.py +2 -1
- agentpool/agents/events/event_emitter.py +29 -2
- agentpool/agents/events/events.py +20 -0
- agentpool/agents/modes.py +54 -0
- agentpool/agents/tool_call_accumulator.py +213 -0
- agentpool/common_types.py +21 -0
- agentpool/config_resources/__init__.py +38 -1
- agentpool/config_resources/claude_code_agent.yml +3 -0
- agentpool/delegation/pool.py +37 -29
- agentpool/delegation/team.py +1 -0
- agentpool/delegation/teamrun.py +1 -0
- agentpool/diagnostics/__init__.py +53 -0
- agentpool/diagnostics/lsp_manager.py +1593 -0
- agentpool/diagnostics/lsp_proxy.py +41 -0
- agentpool/diagnostics/lsp_proxy_script.py +229 -0
- agentpool/diagnostics/models.py +398 -0
- agentpool/mcp_server/__init__.py +0 -2
- agentpool/mcp_server/client.py +12 -3
- agentpool/mcp_server/manager.py +25 -31
- agentpool/mcp_server/registries/official_registry_client.py +25 -0
- agentpool/mcp_server/tool_bridge.py +78 -66
- agentpool/messaging/__init__.py +0 -2
- agentpool/messaging/compaction.py +72 -197
- agentpool/messaging/message_history.py +12 -0
- agentpool/messaging/messages.py +52 -9
- agentpool/messaging/processing.py +3 -1
- agentpool/models/acp_agents/base.py +0 -22
- agentpool/models/acp_agents/mcp_capable.py +8 -148
- agentpool/models/acp_agents/non_mcp.py +129 -72
- agentpool/models/agents.py +35 -13
- agentpool/models/claude_code_agents.py +33 -2
- agentpool/models/manifest.py +43 -0
- agentpool/repomap.py +1 -1
- agentpool/resource_providers/__init__.py +9 -1
- agentpool/resource_providers/aggregating.py +52 -3
- agentpool/resource_providers/base.py +57 -1
- agentpool/resource_providers/mcp_provider.py +23 -0
- agentpool/resource_providers/plan_provider.py +130 -41
- agentpool/resource_providers/pool.py +2 -0
- agentpool/resource_providers/static.py +2 -0
- agentpool/sessions/__init__.py +2 -1
- agentpool/sessions/manager.py +31 -2
- agentpool/sessions/models.py +50 -0
- agentpool/skills/registry.py +13 -8
- agentpool/storage/manager.py +217 -1
- agentpool/testing.py +537 -19
- agentpool/utils/file_watcher.py +269 -0
- agentpool/utils/identifiers.py +121 -0
- agentpool/utils/pydantic_ai_helpers.py +46 -0
- agentpool/utils/streams.py +690 -1
- agentpool/utils/subprocess_utils.py +155 -0
- agentpool/utils/token_breakdown.py +461 -0
- {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/METADATA +27 -7
- {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/RECORD +170 -112
- {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/WHEEL +1 -1
- agentpool_cli/__main__.py +4 -0
- agentpool_cli/serve_acp.py +41 -20
- agentpool_cli/serve_agui.py +87 -0
- agentpool_cli/serve_opencode.py +119 -0
- agentpool_commands/__init__.py +30 -0
- agentpool_commands/agents.py +74 -1
- agentpool_commands/history.py +62 -0
- agentpool_commands/mcp.py +176 -0
- agentpool_commands/models.py +56 -3
- agentpool_commands/tools.py +57 -0
- agentpool_commands/utils.py +51 -0
- agentpool_config/builtin_tools.py +77 -22
- agentpool_config/commands.py +24 -1
- agentpool_config/compaction.py +258 -0
- agentpool_config/mcp_server.py +131 -1
- agentpool_config/storage.py +46 -1
- agentpool_config/tools.py +7 -1
- agentpool_config/toolsets.py +92 -148
- agentpool_server/acp_server/acp_agent.py +134 -150
- agentpool_server/acp_server/commands/acp_commands.py +216 -51
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +10 -10
- agentpool_server/acp_server/server.py +23 -79
- agentpool_server/acp_server/session.py +181 -19
- agentpool_server/opencode_server/.rules +95 -0
- agentpool_server/opencode_server/ENDPOINTS.md +362 -0
- agentpool_server/opencode_server/__init__.py +27 -0
- agentpool_server/opencode_server/command_validation.py +172 -0
- agentpool_server/opencode_server/converters.py +869 -0
- agentpool_server/opencode_server/dependencies.py +24 -0
- agentpool_server/opencode_server/input_provider.py +269 -0
- agentpool_server/opencode_server/models/__init__.py +228 -0
- agentpool_server/opencode_server/models/agent.py +53 -0
- agentpool_server/opencode_server/models/app.py +60 -0
- agentpool_server/opencode_server/models/base.py +26 -0
- agentpool_server/opencode_server/models/common.py +23 -0
- agentpool_server/opencode_server/models/config.py +37 -0
- agentpool_server/opencode_server/models/events.py +647 -0
- agentpool_server/opencode_server/models/file.py +88 -0
- agentpool_server/opencode_server/models/mcp.py +25 -0
- agentpool_server/opencode_server/models/message.py +162 -0
- agentpool_server/opencode_server/models/parts.py +190 -0
- agentpool_server/opencode_server/models/provider.py +81 -0
- agentpool_server/opencode_server/models/pty.py +43 -0
- agentpool_server/opencode_server/models/session.py +99 -0
- agentpool_server/opencode_server/routes/__init__.py +25 -0
- agentpool_server/opencode_server/routes/agent_routes.py +442 -0
- agentpool_server/opencode_server/routes/app_routes.py +139 -0
- agentpool_server/opencode_server/routes/config_routes.py +241 -0
- agentpool_server/opencode_server/routes/file_routes.py +392 -0
- agentpool_server/opencode_server/routes/global_routes.py +94 -0
- agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
- agentpool_server/opencode_server/routes/message_routes.py +705 -0
- agentpool_server/opencode_server/routes/pty_routes.py +299 -0
- agentpool_server/opencode_server/routes/session_routes.py +1205 -0
- agentpool_server/opencode_server/routes/tui_routes.py +139 -0
- agentpool_server/opencode_server/server.py +430 -0
- agentpool_server/opencode_server/state.py +121 -0
- agentpool_server/opencode_server/time_utils.py +8 -0
- agentpool_storage/__init__.py +16 -0
- agentpool_storage/base.py +103 -0
- agentpool_storage/claude_provider.py +907 -0
- agentpool_storage/file_provider.py +129 -0
- agentpool_storage/memory_provider.py +61 -0
- agentpool_storage/models.py +3 -0
- agentpool_storage/opencode_provider.py +730 -0
- agentpool_storage/project_store.py +325 -0
- agentpool_storage/session_store.py +6 -0
- agentpool_storage/sql_provider/__init__.py +4 -2
- agentpool_storage/sql_provider/models.py +48 -0
- agentpool_storage/sql_provider/sql_provider.py +134 -1
- agentpool_storage/sql_provider/utils.py +10 -1
- agentpool_storage/text_log_provider.py +1 -0
- agentpool_toolsets/builtin/__init__.py +0 -8
- agentpool_toolsets/builtin/code.py +95 -56
- agentpool_toolsets/builtin/debug.py +16 -21
- agentpool_toolsets/builtin/execution_environment.py +99 -103
- agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
- agentpool_toolsets/builtin/skills.py +86 -4
- agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
- agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
- agentpool_toolsets/fsspec_toolset/grep.py +74 -2
- agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +159 -38
- agentpool_toolsets/mcp_discovery/__init__.py +5 -0
- agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
- agentpool_toolsets/mcp_discovery/toolset.py +454 -0
- agentpool_toolsets/mcp_run_toolset.py +84 -6
- agentpool_toolsets/builtin/agent_management.py +0 -239
- agentpool_toolsets/builtin/history.py +0 -36
- agentpool_toolsets/builtin/integration.py +0 -85
- agentpool_toolsets/builtin/tool_management.py +0 -90
- {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/entry_points.txt +0 -0
- {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""File operation models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Literal, Self
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class FileNode(OpenCodeBaseModel):
|
|
13
|
+
"""File or directory node."""
|
|
14
|
+
|
|
15
|
+
name: str
|
|
16
|
+
path: str
|
|
17
|
+
type: Literal["file", "directory"]
|
|
18
|
+
size: int | None = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FileContent(OpenCodeBaseModel):
|
|
22
|
+
"""File content response."""
|
|
23
|
+
|
|
24
|
+
path: str
|
|
25
|
+
content: str
|
|
26
|
+
encoding: str = "utf-8"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class FileStatus(OpenCodeBaseModel):
|
|
30
|
+
"""File status (for VCS)."""
|
|
31
|
+
|
|
32
|
+
path: str
|
|
33
|
+
status: str # modified, added, deleted, etc.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TextWrapper(OpenCodeBaseModel):
|
|
37
|
+
"""Wrapper for text content."""
|
|
38
|
+
|
|
39
|
+
text: str
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SubmatchInfo(OpenCodeBaseModel):
|
|
43
|
+
"""Submatch information."""
|
|
44
|
+
|
|
45
|
+
match: TextWrapper
|
|
46
|
+
start: int
|
|
47
|
+
end: int
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def create(cls, text: str, start: int, end: int) -> Self:
|
|
51
|
+
return cls(match=TextWrapper(text=text), start=start, end=end)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class FindMatch(BaseModel):
|
|
55
|
+
"""Text search match."""
|
|
56
|
+
|
|
57
|
+
path: TextWrapper
|
|
58
|
+
lines: TextWrapper
|
|
59
|
+
line_number: int # these here are snake_case in the API, so we inherit from BaseModel
|
|
60
|
+
absolute_offset: int
|
|
61
|
+
submatches: list[SubmatchInfo] = Field(default_factory=list)
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def create(
|
|
65
|
+
cls,
|
|
66
|
+
path: str,
|
|
67
|
+
lines: str,
|
|
68
|
+
line_number: int,
|
|
69
|
+
absolute_offset: int,
|
|
70
|
+
submatches: list[SubmatchInfo] | None = None,
|
|
71
|
+
) -> FindMatch:
|
|
72
|
+
return cls(
|
|
73
|
+
path=TextWrapper(text=path),
|
|
74
|
+
lines=TextWrapper(text=lines),
|
|
75
|
+
line_number=line_number,
|
|
76
|
+
absolute_offset=absolute_offset,
|
|
77
|
+
submatches=submatches or [],
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class Symbol(OpenCodeBaseModel):
|
|
82
|
+
"""Code symbol."""
|
|
83
|
+
|
|
84
|
+
name: str
|
|
85
|
+
kind: str
|
|
86
|
+
path: str
|
|
87
|
+
line: int
|
|
88
|
+
character: int
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""MCP and logging models."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
|
|
7
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LogRequest(OpenCodeBaseModel):
|
|
11
|
+
"""Log entry request."""
|
|
12
|
+
|
|
13
|
+
service: str
|
|
14
|
+
level: Literal["debug", "info", "warn", "error"]
|
|
15
|
+
message: str
|
|
16
|
+
extra: dict[str, Any] | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MCPStatus(OpenCodeBaseModel):
|
|
20
|
+
"""MCP server status."""
|
|
21
|
+
|
|
22
|
+
name: str
|
|
23
|
+
status: Literal["connected", "disconnected", "error"]
|
|
24
|
+
tools: list[str] = Field(default_factory=list)
|
|
25
|
+
error: str | None = None
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Message related models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
|
|
9
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
10
|
+
from agentpool_server.opencode_server.models.common import TimeCreated # noqa: TC001
|
|
11
|
+
from agentpool_server.opencode_server.models.parts import Part # noqa: TC001
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MessagePath(OpenCodeBaseModel):
|
|
15
|
+
"""Path context for a message."""
|
|
16
|
+
|
|
17
|
+
cwd: str
|
|
18
|
+
root: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MessageTime(OpenCodeBaseModel):
|
|
22
|
+
"""Time information for a message (milliseconds)."""
|
|
23
|
+
|
|
24
|
+
created: int
|
|
25
|
+
completed: int | None = None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TokensCache(OpenCodeBaseModel):
|
|
29
|
+
"""Token cache information."""
|
|
30
|
+
|
|
31
|
+
read: int = 0
|
|
32
|
+
write: int = 0
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Tokens(OpenCodeBaseModel):
|
|
36
|
+
"""Token usage information."""
|
|
37
|
+
|
|
38
|
+
cache: TokensCache = Field(default_factory=TokensCache)
|
|
39
|
+
input: int = 0
|
|
40
|
+
output: int = 0
|
|
41
|
+
reasoning: int = 0
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class UserMessageModel(OpenCodeBaseModel):
|
|
45
|
+
"""Model info for user message."""
|
|
46
|
+
|
|
47
|
+
provider_id: str
|
|
48
|
+
model_id: str
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class UserMessage(OpenCodeBaseModel):
|
|
52
|
+
"""User message."""
|
|
53
|
+
|
|
54
|
+
id: str
|
|
55
|
+
role: Literal["user"] = "user"
|
|
56
|
+
session_id: str
|
|
57
|
+
time: TimeCreated
|
|
58
|
+
agent: str = "default"
|
|
59
|
+
model: UserMessageModel
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AssistantMessage(OpenCodeBaseModel):
|
|
63
|
+
"""Assistant message."""
|
|
64
|
+
|
|
65
|
+
id: str
|
|
66
|
+
role: Literal["assistant"] = "assistant"
|
|
67
|
+
session_id: str
|
|
68
|
+
parent_id: str # Required - links to user message
|
|
69
|
+
model_id: str
|
|
70
|
+
provider_id: str
|
|
71
|
+
mode: str = "default"
|
|
72
|
+
agent: str = "default"
|
|
73
|
+
path: MessagePath
|
|
74
|
+
time: MessageTime
|
|
75
|
+
tokens: Tokens = Field(default_factory=Tokens)
|
|
76
|
+
cost: float = 0.0
|
|
77
|
+
error: dict[str, Any] | None = None
|
|
78
|
+
summary: bool | None = None
|
|
79
|
+
finish: str | None = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class MessageWithParts(OpenCodeBaseModel):
|
|
83
|
+
"""Message with its parts."""
|
|
84
|
+
|
|
85
|
+
info: UserMessage | AssistantMessage
|
|
86
|
+
parts: list[Part] = Field(default_factory=list)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Request models
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class TextPartInput(OpenCodeBaseModel):
|
|
93
|
+
"""Text part for input."""
|
|
94
|
+
|
|
95
|
+
type: Literal["text"] = "text"
|
|
96
|
+
text: str
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class FilePartSourceText(OpenCodeBaseModel):
|
|
100
|
+
"""Source text info for file part."""
|
|
101
|
+
|
|
102
|
+
value: str
|
|
103
|
+
start: int
|
|
104
|
+
end: int
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class FilePartSource(OpenCodeBaseModel):
|
|
108
|
+
"""Source info for file part."""
|
|
109
|
+
|
|
110
|
+
text: FilePartSourceText | None = None
|
|
111
|
+
type: str | None = None
|
|
112
|
+
path: str | None = None
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class FilePartInput(OpenCodeBaseModel):
|
|
116
|
+
"""File part for input (image, document, etc.)."""
|
|
117
|
+
|
|
118
|
+
type: Literal["file"] = "file"
|
|
119
|
+
mime: str
|
|
120
|
+
filename: str | None = None
|
|
121
|
+
url: str # Can be data: URI or file path
|
|
122
|
+
source: FilePartSource | None = None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
PartInput = TextPartInput | FilePartInput
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class MessageModelInfo(OpenCodeBaseModel):
|
|
129
|
+
"""Model info in message request."""
|
|
130
|
+
|
|
131
|
+
provider_id: str
|
|
132
|
+
model_id: str
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class MessageRequest(OpenCodeBaseModel):
|
|
136
|
+
"""Request body for sending a message."""
|
|
137
|
+
|
|
138
|
+
parts: list[PartInput]
|
|
139
|
+
message_id: str | None = None
|
|
140
|
+
model: MessageModelInfo | None = None
|
|
141
|
+
agent: str | None = None
|
|
142
|
+
no_reply: bool | None = None
|
|
143
|
+
system: str | None = None
|
|
144
|
+
tools: dict[str, bool] | None = None
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class ShellRequest(OpenCodeBaseModel):
|
|
148
|
+
"""Request body for running a shell command."""
|
|
149
|
+
|
|
150
|
+
agent: str
|
|
151
|
+
command: str
|
|
152
|
+
model: MessageModelInfo | None = None
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class CommandRequest(OpenCodeBaseModel):
|
|
156
|
+
"""Request body for executing a slash command."""
|
|
157
|
+
|
|
158
|
+
command: str
|
|
159
|
+
arguments: str | None = None
|
|
160
|
+
agent: str | None = None
|
|
161
|
+
model: str | None = None # Format: "providerID/modelID"
|
|
162
|
+
message_id: str | None = None
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""Message part models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import Field
|
|
8
|
+
|
|
9
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TimeStart(OpenCodeBaseModel):
|
|
13
|
+
"""Time with only start (milliseconds).
|
|
14
|
+
|
|
15
|
+
Used by: ToolStateRunning
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
start: int
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TimeStartEnd(OpenCodeBaseModel):
|
|
22
|
+
"""Time with start and end, both required (milliseconds).
|
|
23
|
+
|
|
24
|
+
Used by: ToolStateError
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
start: int
|
|
28
|
+
end: int
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TimeStartEndOptional(OpenCodeBaseModel):
|
|
32
|
+
"""Time with start required and end optional (milliseconds).
|
|
33
|
+
|
|
34
|
+
Used by: TextPart
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
start: int
|
|
38
|
+
end: int | None = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TimeStartEndCompacted(OpenCodeBaseModel):
|
|
42
|
+
"""Time with start, end required, and optional compacted (milliseconds).
|
|
43
|
+
|
|
44
|
+
Used by: ToolStateCompleted
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
start: int
|
|
48
|
+
end: int
|
|
49
|
+
compacted: int | None = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class TextPart(OpenCodeBaseModel):
|
|
53
|
+
"""Text content part."""
|
|
54
|
+
|
|
55
|
+
id: str
|
|
56
|
+
type: Literal["text"] = "text"
|
|
57
|
+
message_id: str
|
|
58
|
+
session_id: str
|
|
59
|
+
text: str
|
|
60
|
+
synthetic: bool | None = None
|
|
61
|
+
ignored: bool | None = None
|
|
62
|
+
time: TimeStartEndOptional | None = None
|
|
63
|
+
metadata: dict[str, Any] | None = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ToolStatePending(OpenCodeBaseModel):
|
|
67
|
+
"""Pending tool state."""
|
|
68
|
+
|
|
69
|
+
status: Literal["pending"] = "pending"
|
|
70
|
+
input: dict[str, Any] = Field(default_factory=dict)
|
|
71
|
+
raw: str = ""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ToolStateRunning(OpenCodeBaseModel):
|
|
75
|
+
"""Running tool state."""
|
|
76
|
+
|
|
77
|
+
status: Literal["running"] = "running"
|
|
78
|
+
time: TimeStart
|
|
79
|
+
input: dict[str, Any] = Field(default_factory=dict)
|
|
80
|
+
metadata: dict[str, Any] | None = None
|
|
81
|
+
title: str | None = None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class ToolStateCompleted(OpenCodeBaseModel):
|
|
85
|
+
"""Completed tool state."""
|
|
86
|
+
|
|
87
|
+
status: Literal["completed"] = "completed"
|
|
88
|
+
input: dict[str, Any] = Field(default_factory=dict)
|
|
89
|
+
output: str = ""
|
|
90
|
+
title: str = ""
|
|
91
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
92
|
+
time: TimeStartEndCompacted
|
|
93
|
+
attachments: list[Any] | None = None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class ToolStateError(OpenCodeBaseModel):
|
|
97
|
+
"""Error tool state."""
|
|
98
|
+
|
|
99
|
+
status: Literal["error"] = "error"
|
|
100
|
+
input: dict[str, Any] = Field(default_factory=dict)
|
|
101
|
+
error: str = ""
|
|
102
|
+
metadata: dict[str, Any] | None = None
|
|
103
|
+
time: TimeStartEnd
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
ToolState = ToolStatePending | ToolStateRunning | ToolStateCompleted | ToolStateError
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ToolPart(OpenCodeBaseModel):
|
|
110
|
+
"""Tool call part."""
|
|
111
|
+
|
|
112
|
+
id: str
|
|
113
|
+
type: Literal["tool"] = "tool"
|
|
114
|
+
message_id: str
|
|
115
|
+
session_id: str
|
|
116
|
+
call_id: str
|
|
117
|
+
tool: str
|
|
118
|
+
state: ToolState
|
|
119
|
+
metadata: dict[str, Any] | None = None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class FilePartSourceText(OpenCodeBaseModel):
|
|
123
|
+
"""File part source text."""
|
|
124
|
+
|
|
125
|
+
value: str
|
|
126
|
+
start: int
|
|
127
|
+
end: int
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class FileSource(OpenCodeBaseModel):
|
|
131
|
+
"""File source."""
|
|
132
|
+
|
|
133
|
+
text: FilePartSourceText
|
|
134
|
+
type: Literal["file"] = "file"
|
|
135
|
+
path: str
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class FilePart(OpenCodeBaseModel):
|
|
139
|
+
"""File content part."""
|
|
140
|
+
|
|
141
|
+
id: str
|
|
142
|
+
type: Literal["file"] = "file"
|
|
143
|
+
message_id: str
|
|
144
|
+
session_id: str
|
|
145
|
+
mime: str
|
|
146
|
+
filename: str | None = None
|
|
147
|
+
url: str
|
|
148
|
+
source: FileSource | None = None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class StepStartPart(OpenCodeBaseModel):
|
|
152
|
+
"""Step start marker."""
|
|
153
|
+
|
|
154
|
+
id: str
|
|
155
|
+
type: Literal["step-start"] = "step-start"
|
|
156
|
+
message_id: str
|
|
157
|
+
session_id: str
|
|
158
|
+
snapshot: str | None = None
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class TokenCache(OpenCodeBaseModel):
|
|
162
|
+
"""Token cache information."""
|
|
163
|
+
|
|
164
|
+
read: int = 0
|
|
165
|
+
write: int = 0
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class StepFinishTokens(OpenCodeBaseModel):
|
|
169
|
+
"""Token usage for step finish."""
|
|
170
|
+
|
|
171
|
+
input: int = 0
|
|
172
|
+
output: int = 0
|
|
173
|
+
reasoning: int = 0
|
|
174
|
+
cache: TokenCache = Field(default_factory=TokenCache)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class StepFinishPart(OpenCodeBaseModel):
|
|
178
|
+
"""Step finish marker."""
|
|
179
|
+
|
|
180
|
+
id: str
|
|
181
|
+
type: Literal["step-finish"] = "step-finish"
|
|
182
|
+
message_id: str
|
|
183
|
+
session_id: str
|
|
184
|
+
reason: str = "stop"
|
|
185
|
+
snapshot: str | None = None
|
|
186
|
+
cost: float = 0.0
|
|
187
|
+
tokens: StepFinishTokens = Field(default_factory=StepFinishTokens)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
Part = TextPart | ToolPart | FilePart | StepStartPart | StepFinishPart
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Provider, model, and mode related models."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import Field
|
|
6
|
+
|
|
7
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ModelCost(OpenCodeBaseModel):
|
|
11
|
+
"""Cost information for a model."""
|
|
12
|
+
|
|
13
|
+
input: float
|
|
14
|
+
output: float
|
|
15
|
+
cache_read: float | None = None
|
|
16
|
+
cache_write: float | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ModelLimit(OpenCodeBaseModel):
|
|
20
|
+
"""Limit information for a model."""
|
|
21
|
+
|
|
22
|
+
context: float
|
|
23
|
+
output: float
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Model(OpenCodeBaseModel):
|
|
27
|
+
"""Model information."""
|
|
28
|
+
|
|
29
|
+
id: str
|
|
30
|
+
name: str
|
|
31
|
+
attachment: bool = False
|
|
32
|
+
cost: ModelCost
|
|
33
|
+
limit: ModelLimit
|
|
34
|
+
options: dict[str, Any] = Field(default_factory=dict)
|
|
35
|
+
reasoning: bool = False
|
|
36
|
+
release_date: str = ""
|
|
37
|
+
temperature: bool = True
|
|
38
|
+
tool_call: bool = True
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class Provider(OpenCodeBaseModel):
|
|
42
|
+
"""Provider information."""
|
|
43
|
+
|
|
44
|
+
id: str
|
|
45
|
+
name: str
|
|
46
|
+
env: list[str] = Field(default_factory=list)
|
|
47
|
+
models: dict[str, Model] = Field(default_factory=dict)
|
|
48
|
+
api: str | None = None
|
|
49
|
+
npm: str | None = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ProvidersResponse(OpenCodeBaseModel):
|
|
53
|
+
"""Response for /config/providers endpoint."""
|
|
54
|
+
|
|
55
|
+
providers: list[Provider]
|
|
56
|
+
default: dict[str, str] = Field(default_factory=dict)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ProviderListResponse(OpenCodeBaseModel):
|
|
60
|
+
"""Response for /provider endpoint."""
|
|
61
|
+
|
|
62
|
+
all: list[Provider]
|
|
63
|
+
default: dict[str, str] = Field(default_factory=dict)
|
|
64
|
+
connected: list[str] = Field(default_factory=list)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class ModeModel(OpenCodeBaseModel):
|
|
68
|
+
"""Model selection for a mode."""
|
|
69
|
+
|
|
70
|
+
model_id: str
|
|
71
|
+
provider_id: str
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class Mode(OpenCodeBaseModel):
|
|
75
|
+
"""Agent mode configuration."""
|
|
76
|
+
|
|
77
|
+
name: str
|
|
78
|
+
tools: dict[str, bool] = Field(default_factory=dict)
|
|
79
|
+
model: ModeModel | None = None
|
|
80
|
+
prompt: str | None = None
|
|
81
|
+
temperature: float | None = None
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""PTY (Pseudo-Terminal) models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Literal
|
|
6
|
+
|
|
7
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PtyInfo(OpenCodeBaseModel):
|
|
11
|
+
"""PTY session information."""
|
|
12
|
+
|
|
13
|
+
id: str
|
|
14
|
+
title: str
|
|
15
|
+
command: str
|
|
16
|
+
args: list[str]
|
|
17
|
+
cwd: str
|
|
18
|
+
status: Literal["running", "exited"]
|
|
19
|
+
pid: int
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PtyCreateRequest(OpenCodeBaseModel):
|
|
23
|
+
"""Request to create a PTY session."""
|
|
24
|
+
|
|
25
|
+
command: str | None = None
|
|
26
|
+
args: list[str] | None = None
|
|
27
|
+
cwd: str | None = None
|
|
28
|
+
title: str | None = None
|
|
29
|
+
env: dict[str, str] | None = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PtySize(OpenCodeBaseModel):
|
|
33
|
+
"""Terminal size."""
|
|
34
|
+
|
|
35
|
+
rows: int
|
|
36
|
+
cols: int
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PtyUpdateRequest(OpenCodeBaseModel):
|
|
40
|
+
"""Request to update a PTY session."""
|
|
41
|
+
|
|
42
|
+
title: str | None = None
|
|
43
|
+
size: PtySize | None = None
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Session related models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Literal
|
|
6
|
+
|
|
7
|
+
from agentpool_server.opencode_server.models.base import OpenCodeBaseModel
|
|
8
|
+
from agentpool_server.opencode_server.models.common import TimeCreatedUpdated # noqa: TC001
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SessionRevert(OpenCodeBaseModel):
|
|
12
|
+
"""Revert information for a session."""
|
|
13
|
+
|
|
14
|
+
message_id: str
|
|
15
|
+
diff: str | None = None
|
|
16
|
+
part_id: str | None = None
|
|
17
|
+
snapshot: str | None = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SessionShare(OpenCodeBaseModel):
|
|
21
|
+
"""Share information for a session."""
|
|
22
|
+
|
|
23
|
+
url: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Session(OpenCodeBaseModel):
|
|
27
|
+
"""Session information."""
|
|
28
|
+
|
|
29
|
+
id: str
|
|
30
|
+
project_id: str
|
|
31
|
+
directory: str
|
|
32
|
+
title: str
|
|
33
|
+
version: str = "1"
|
|
34
|
+
time: TimeCreatedUpdated
|
|
35
|
+
parent_id: str | None = None
|
|
36
|
+
revert: SessionRevert | None = None
|
|
37
|
+
share: SessionShare | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class SessionCreateRequest(OpenCodeBaseModel):
|
|
41
|
+
"""Request body for creating a session."""
|
|
42
|
+
|
|
43
|
+
parent_id: str | None = None
|
|
44
|
+
title: str | None = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SessionUpdateRequest(OpenCodeBaseModel):
|
|
48
|
+
"""Request body for updating a session."""
|
|
49
|
+
|
|
50
|
+
title: str | None = None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SessionForkRequest(OpenCodeBaseModel):
|
|
54
|
+
"""Request body for forking a session."""
|
|
55
|
+
|
|
56
|
+
message_id: str | None = None
|
|
57
|
+
"""Optional message ID to fork from. If provided, only messages up to and including
|
|
58
|
+
this message will be copied to the forked session. If None, all messages are copied."""
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class SessionInitRequest(OpenCodeBaseModel):
|
|
62
|
+
"""Request body for initializing a session (creating AGENTS.md)."""
|
|
63
|
+
|
|
64
|
+
model_id: str | None = None
|
|
65
|
+
"""Optional model ID to use for the init task."""
|
|
66
|
+
|
|
67
|
+
provider_id: str | None = None
|
|
68
|
+
"""Optional provider ID to use for the init task."""
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class SummarizeRequest(OpenCodeBaseModel):
|
|
72
|
+
"""Request body for summarizing a session.
|
|
73
|
+
|
|
74
|
+
Matches OpenCode's compaction API. If model info is provided, uses that model
|
|
75
|
+
for the summary generation. If 'auto' is True, automatically selects the model.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
model_id: str | None = None
|
|
79
|
+
"""Optional model ID to use for summary generation."""
|
|
80
|
+
|
|
81
|
+
provider_id: str | None = None
|
|
82
|
+
"""Optional provider ID to use for summary generation."""
|
|
83
|
+
|
|
84
|
+
auto: bool | None = None
|
|
85
|
+
"""If True, automatically select the model for summarization."""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class SessionStatus(OpenCodeBaseModel):
|
|
89
|
+
"""Status of a session."""
|
|
90
|
+
|
|
91
|
+
type: Literal["idle", "busy", "retry"] = "idle"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class Todo(OpenCodeBaseModel):
|
|
95
|
+
"""Todo item for a session."""
|
|
96
|
+
|
|
97
|
+
id: str
|
|
98
|
+
content: str
|
|
99
|
+
status: Literal["pending", "in_progress", "completed"] = "pending"
|