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.
Files changed (174) hide show
  1. acp/__init__.py +13 -0
  2. acp/bridge/README.md +15 -2
  3. acp/bridge/__init__.py +3 -2
  4. acp/bridge/__main__.py +60 -19
  5. acp/bridge/ws_server.py +173 -0
  6. acp/bridge/ws_server_cli.py +89 -0
  7. acp/notifications.py +2 -1
  8. acp/stdio.py +39 -9
  9. acp/transports.py +362 -2
  10. acp/utils.py +15 -2
  11. agentpool/__init__.py +4 -1
  12. agentpool/agents/__init__.py +2 -0
  13. agentpool/agents/acp_agent/acp_agent.py +203 -88
  14. agentpool/agents/acp_agent/acp_converters.py +46 -21
  15. agentpool/agents/acp_agent/client_handler.py +157 -3
  16. agentpool/agents/acp_agent/session_state.py +4 -1
  17. agentpool/agents/agent.py +314 -107
  18. agentpool/agents/agui_agent/__init__.py +0 -2
  19. agentpool/agents/agui_agent/agui_agent.py +90 -21
  20. agentpool/agents/agui_agent/agui_converters.py +0 -131
  21. agentpool/agents/base_agent.py +163 -1
  22. agentpool/agents/claude_code_agent/claude_code_agent.py +626 -179
  23. agentpool/agents/claude_code_agent/converters.py +71 -3
  24. agentpool/agents/claude_code_agent/history.py +474 -0
  25. agentpool/agents/context.py +40 -0
  26. agentpool/agents/events/__init__.py +2 -0
  27. agentpool/agents/events/builtin_handlers.py +2 -1
  28. agentpool/agents/events/event_emitter.py +29 -2
  29. agentpool/agents/events/events.py +20 -0
  30. agentpool/agents/modes.py +54 -0
  31. agentpool/agents/tool_call_accumulator.py +213 -0
  32. agentpool/common_types.py +21 -0
  33. agentpool/config_resources/__init__.py +38 -1
  34. agentpool/config_resources/claude_code_agent.yml +3 -0
  35. agentpool/delegation/pool.py +37 -29
  36. agentpool/delegation/team.py +1 -0
  37. agentpool/delegation/teamrun.py +1 -0
  38. agentpool/diagnostics/__init__.py +53 -0
  39. agentpool/diagnostics/lsp_manager.py +1593 -0
  40. agentpool/diagnostics/lsp_proxy.py +41 -0
  41. agentpool/diagnostics/lsp_proxy_script.py +229 -0
  42. agentpool/diagnostics/models.py +398 -0
  43. agentpool/mcp_server/__init__.py +0 -2
  44. agentpool/mcp_server/client.py +12 -3
  45. agentpool/mcp_server/manager.py +25 -31
  46. agentpool/mcp_server/registries/official_registry_client.py +25 -0
  47. agentpool/mcp_server/tool_bridge.py +78 -66
  48. agentpool/messaging/__init__.py +0 -2
  49. agentpool/messaging/compaction.py +72 -197
  50. agentpool/messaging/message_history.py +12 -0
  51. agentpool/messaging/messages.py +52 -9
  52. agentpool/messaging/processing.py +3 -1
  53. agentpool/models/acp_agents/base.py +0 -22
  54. agentpool/models/acp_agents/mcp_capable.py +8 -148
  55. agentpool/models/acp_agents/non_mcp.py +129 -72
  56. agentpool/models/agents.py +35 -13
  57. agentpool/models/claude_code_agents.py +33 -2
  58. agentpool/models/manifest.py +43 -0
  59. agentpool/repomap.py +1 -1
  60. agentpool/resource_providers/__init__.py +9 -1
  61. agentpool/resource_providers/aggregating.py +52 -3
  62. agentpool/resource_providers/base.py +57 -1
  63. agentpool/resource_providers/mcp_provider.py +23 -0
  64. agentpool/resource_providers/plan_provider.py +130 -41
  65. agentpool/resource_providers/pool.py +2 -0
  66. agentpool/resource_providers/static.py +2 -0
  67. agentpool/sessions/__init__.py +2 -1
  68. agentpool/sessions/manager.py +31 -2
  69. agentpool/sessions/models.py +50 -0
  70. agentpool/skills/registry.py +13 -8
  71. agentpool/storage/manager.py +217 -1
  72. agentpool/testing.py +537 -19
  73. agentpool/utils/file_watcher.py +269 -0
  74. agentpool/utils/identifiers.py +121 -0
  75. agentpool/utils/pydantic_ai_helpers.py +46 -0
  76. agentpool/utils/streams.py +690 -1
  77. agentpool/utils/subprocess_utils.py +155 -0
  78. agentpool/utils/token_breakdown.py +461 -0
  79. {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/METADATA +27 -7
  80. {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/RECORD +170 -112
  81. {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/WHEEL +1 -1
  82. agentpool_cli/__main__.py +4 -0
  83. agentpool_cli/serve_acp.py +41 -20
  84. agentpool_cli/serve_agui.py +87 -0
  85. agentpool_cli/serve_opencode.py +119 -0
  86. agentpool_commands/__init__.py +30 -0
  87. agentpool_commands/agents.py +74 -1
  88. agentpool_commands/history.py +62 -0
  89. agentpool_commands/mcp.py +176 -0
  90. agentpool_commands/models.py +56 -3
  91. agentpool_commands/tools.py +57 -0
  92. agentpool_commands/utils.py +51 -0
  93. agentpool_config/builtin_tools.py +77 -22
  94. agentpool_config/commands.py +24 -1
  95. agentpool_config/compaction.py +258 -0
  96. agentpool_config/mcp_server.py +131 -1
  97. agentpool_config/storage.py +46 -1
  98. agentpool_config/tools.py +7 -1
  99. agentpool_config/toolsets.py +92 -148
  100. agentpool_server/acp_server/acp_agent.py +134 -150
  101. agentpool_server/acp_server/commands/acp_commands.py +216 -51
  102. agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +10 -10
  103. agentpool_server/acp_server/server.py +23 -79
  104. agentpool_server/acp_server/session.py +181 -19
  105. agentpool_server/opencode_server/.rules +95 -0
  106. agentpool_server/opencode_server/ENDPOINTS.md +362 -0
  107. agentpool_server/opencode_server/__init__.py +27 -0
  108. agentpool_server/opencode_server/command_validation.py +172 -0
  109. agentpool_server/opencode_server/converters.py +869 -0
  110. agentpool_server/opencode_server/dependencies.py +24 -0
  111. agentpool_server/opencode_server/input_provider.py +269 -0
  112. agentpool_server/opencode_server/models/__init__.py +228 -0
  113. agentpool_server/opencode_server/models/agent.py +53 -0
  114. agentpool_server/opencode_server/models/app.py +60 -0
  115. agentpool_server/opencode_server/models/base.py +26 -0
  116. agentpool_server/opencode_server/models/common.py +23 -0
  117. agentpool_server/opencode_server/models/config.py +37 -0
  118. agentpool_server/opencode_server/models/events.py +647 -0
  119. agentpool_server/opencode_server/models/file.py +88 -0
  120. agentpool_server/opencode_server/models/mcp.py +25 -0
  121. agentpool_server/opencode_server/models/message.py +162 -0
  122. agentpool_server/opencode_server/models/parts.py +190 -0
  123. agentpool_server/opencode_server/models/provider.py +81 -0
  124. agentpool_server/opencode_server/models/pty.py +43 -0
  125. agentpool_server/opencode_server/models/session.py +99 -0
  126. agentpool_server/opencode_server/routes/__init__.py +25 -0
  127. agentpool_server/opencode_server/routes/agent_routes.py +442 -0
  128. agentpool_server/opencode_server/routes/app_routes.py +139 -0
  129. agentpool_server/opencode_server/routes/config_routes.py +241 -0
  130. agentpool_server/opencode_server/routes/file_routes.py +392 -0
  131. agentpool_server/opencode_server/routes/global_routes.py +94 -0
  132. agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
  133. agentpool_server/opencode_server/routes/message_routes.py +705 -0
  134. agentpool_server/opencode_server/routes/pty_routes.py +299 -0
  135. agentpool_server/opencode_server/routes/session_routes.py +1205 -0
  136. agentpool_server/opencode_server/routes/tui_routes.py +139 -0
  137. agentpool_server/opencode_server/server.py +430 -0
  138. agentpool_server/opencode_server/state.py +121 -0
  139. agentpool_server/opencode_server/time_utils.py +8 -0
  140. agentpool_storage/__init__.py +16 -0
  141. agentpool_storage/base.py +103 -0
  142. agentpool_storage/claude_provider.py +907 -0
  143. agentpool_storage/file_provider.py +129 -0
  144. agentpool_storage/memory_provider.py +61 -0
  145. agentpool_storage/models.py +3 -0
  146. agentpool_storage/opencode_provider.py +730 -0
  147. agentpool_storage/project_store.py +325 -0
  148. agentpool_storage/session_store.py +6 -0
  149. agentpool_storage/sql_provider/__init__.py +4 -2
  150. agentpool_storage/sql_provider/models.py +48 -0
  151. agentpool_storage/sql_provider/sql_provider.py +134 -1
  152. agentpool_storage/sql_provider/utils.py +10 -1
  153. agentpool_storage/text_log_provider.py +1 -0
  154. agentpool_toolsets/builtin/__init__.py +0 -8
  155. agentpool_toolsets/builtin/code.py +95 -56
  156. agentpool_toolsets/builtin/debug.py +16 -21
  157. agentpool_toolsets/builtin/execution_environment.py +99 -103
  158. agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
  159. agentpool_toolsets/builtin/skills.py +86 -4
  160. agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
  161. agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
  162. agentpool_toolsets/fsspec_toolset/grep.py +74 -2
  163. agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
  164. agentpool_toolsets/fsspec_toolset/toolset.py +159 -38
  165. agentpool_toolsets/mcp_discovery/__init__.py +5 -0
  166. agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
  167. agentpool_toolsets/mcp_discovery/toolset.py +454 -0
  168. agentpool_toolsets/mcp_run_toolset.py +84 -6
  169. agentpool_toolsets/builtin/agent_management.py +0 -239
  170. agentpool_toolsets/builtin/history.py +0 -36
  171. agentpool_toolsets/builtin/integration.py +0 -85
  172. agentpool_toolsets/builtin/tool_management.py +0 -90
  173. {agentpool-2.1.9.dist-info → agentpool-2.2.3.dist-info}/entry_points.txt +0 -0
  174. {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"