wcgw 3.0.7__py3-none-any.whl → 4.1.0__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.

Potentially problematic release.


This version of wcgw might be problematic. Click here for more details.

wcgw/relay/serve.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- import os
3
2
  import threading
4
3
  import time
5
4
  from importlib import metadata
@@ -17,23 +16,14 @@ from pydantic import BaseModel
17
16
  from ..types_ import (
18
17
  BashCommand,
19
18
  ContextSave,
20
- FileEdit,
19
+ FileWriteOrEdit,
21
20
  Initialize,
22
21
  ReadFiles,
23
- WriteIfEmpty,
24
22
  )
25
23
 
26
24
 
27
25
  class Mdata(BaseModel):
28
- data: (
29
- BashCommand
30
- | WriteIfEmpty
31
- | FileEdit
32
- | ReadFiles
33
- | Initialize
34
- | ContextSave
35
- | str
36
- )
26
+ data: BashCommand | FileWriteOrEdit | ReadFiles | Initialize | ContextSave | str
37
27
  user_id: UUID
38
28
 
39
29
 
@@ -94,12 +84,12 @@ async def register_websocket(websocket: WebSocket, uuid: UUID) -> None:
94
84
  print(f"Client {uuid} disconnected")
95
85
 
96
86
 
97
- class WriteIfEmptyWithUUID(WriteIfEmpty):
87
+ class FileWriteOrEdithUUID(FileWriteOrEdit):
98
88
  user_id: UUID
99
89
 
100
90
 
101
- @app.post("/v1/create_file")
102
- async def create_file(write_file_data: WriteIfEmptyWithUUID) -> str:
91
+ @app.post("/v1/file_write_or_edit")
92
+ async def file_write_or_edit(write_file_data: FileWriteOrEdithUUID) -> str:
103
93
  user_id = write_file_data.user_id
104
94
  if user_id not in clients:
105
95
  return "Failure: id not found, ask the user to check it."
@@ -123,42 +113,6 @@ async def create_file(write_file_data: WriteIfEmptyWithUUID) -> str:
123
113
  raise fastapi.HTTPException(status_code=500, detail="Timeout error")
124
114
 
125
115
 
126
- class FileEditWithUUID(FileEdit):
127
- user_id: UUID
128
-
129
-
130
- @app.post("/v1/full_file_edit")
131
- async def file_edit_find_replace(
132
- file_edit_find_replace: FileEditWithUUID,
133
- ) -> str:
134
- user_id = file_edit_find_replace.user_id
135
- if user_id not in clients:
136
- return "Failure: id not found, ask the user to check it."
137
-
138
- results: Optional[str] = None
139
-
140
- def put_results(result: str) -> None:
141
- nonlocal results
142
- results = result
143
-
144
- gpts[user_id] = put_results
145
-
146
- await clients[user_id](
147
- Mdata(
148
- data=file_edit_find_replace,
149
- user_id=user_id,
150
- )
151
- )
152
-
153
- start_time = time.time()
154
- while time.time() - start_time < 30:
155
- if results is not None:
156
- return results
157
- await asyncio.sleep(0.1)
158
-
159
- raise fastapi.HTTPException(status_code=500, detail="Timeout error")
160
-
161
-
162
116
  class CommandWithUUID(BashCommand):
163
117
  user_id: UUID
164
118
 
@@ -180,7 +134,8 @@ async def bash_command(command: CommandWithUUID) -> str:
180
134
  await clients[user_id](
181
135
  Mdata(
182
136
  data=BashCommand(
183
- action_json=command.action_json, wait_for_seconds=command.wait_for_seconds
137
+ action_json=command.action_json,
138
+ wait_for_seconds=command.wait_for_seconds,
184
139
  ),
185
140
  user_id=user_id,
186
141
  )
@@ -282,7 +237,7 @@ async def context_save(context_save_data: ContextSaveWithUUID) -> str:
282
237
  raise fastapi.HTTPException(status_code=500, detail="Timeout error")
283
238
 
284
239
 
285
- app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "static")), name="static")
240
+ app.mount("/static", StaticFiles(directory="static"))
286
241
 
287
242
 
288
243
  def run() -> None:
wcgw/types_.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import os
2
- from typing import Any, Literal, Optional, Protocol, Sequence, Union
2
+ from typing import Any, List, Literal, Optional, Protocol, Sequence, Union
3
3
 
4
4
  from pydantic import BaseModel as PydanticBaseModel
5
+ from pydantic import PrivateAttr
5
6
 
6
7
 
7
8
  class NoExtraArgs(PydanticBaseModel):
@@ -56,9 +57,9 @@ class Initialize(BaseModel):
56
57
 
57
58
  def model_post_init(self, __context: Any) -> None:
58
59
  if self.mode_name == "code_writer":
59
- assert (
60
- self.code_writer_config is not None
61
- ), "code_writer_config can't be null when the mode is code_writer"
60
+ assert self.code_writer_config is not None, (
61
+ "code_writer_config can't be null when the mode is code_writer"
62
+ )
62
63
  return super().model_post_init(__context)
63
64
 
64
65
  @property
@@ -67,9 +68,9 @@ class Initialize(BaseModel):
67
68
  return "wcgw"
68
69
  if self.mode_name == "architect":
69
70
  return "architect"
70
- assert (
71
- self.code_writer_config is not None
72
- ), "code_writer_config can't be null when the mode is code_writer"
71
+ assert self.code_writer_config is not None, (
72
+ "code_writer_config can't be null when the mode is code_writer"
73
+ )
73
74
  return self.code_writer_config
74
75
 
75
76
 
@@ -114,6 +115,94 @@ class WriteIfEmpty(BaseModel):
114
115
 
115
116
  class ReadFiles(BaseModel):
116
117
  file_paths: list[str]
118
+ show_line_numbers_reason: Optional[str] = None
119
+ _start_line_nums: List[Optional[int]] = PrivateAttr(default_factory=lambda: [])
120
+ _end_line_nums: List[Optional[int]] = PrivateAttr(default_factory=lambda: [])
121
+
122
+ @property
123
+ def start_line_nums(self) -> List[Optional[int]]:
124
+ """Get the start line numbers."""
125
+ return self._start_line_nums
126
+
127
+ @property
128
+ def end_line_nums(self) -> List[Optional[int]]:
129
+ """Get the end line numbers."""
130
+ return self._end_line_nums
131
+
132
+ def model_post_init(self, __context: Any) -> None:
133
+ # Parse file paths for line ranges and store them in private attributes
134
+ self._start_line_nums = []
135
+ self._end_line_nums = []
136
+
137
+ # Create new file_paths list without line ranges
138
+ clean_file_paths = []
139
+
140
+ for file_path in self.file_paths:
141
+ start_line_num = None
142
+ end_line_num = None
143
+ path_part = file_path
144
+
145
+ # Check if the path ends with a line range pattern
146
+ # We're looking for patterns at the very end of the path like:
147
+ # - file.py:10 (specific line)
148
+ # - file.py:10-20 (line range)
149
+ # - file.py:10- (from line 10 to end)
150
+ # - file.py:-20 (from start to line 20)
151
+
152
+ # Split by the last colon
153
+ if ":" in file_path:
154
+ parts = file_path.rsplit(":", 1)
155
+ if len(parts) == 2:
156
+ potential_path = parts[0]
157
+ line_spec = parts[1]
158
+
159
+ # Check if it's a valid line range format
160
+ if line_spec.isdigit():
161
+ # Format: file.py:10
162
+ try:
163
+ start_line_num = int(line_spec)
164
+ path_part = potential_path
165
+ except ValueError:
166
+ # Keep the original path if conversion fails
167
+ pass
168
+
169
+ elif "-" in line_spec:
170
+ # Could be file.py:10-20, file.py:10-, or file.py:-20
171
+ line_parts = line_spec.split("-", 1)
172
+
173
+ if not line_parts[0] and line_parts[1].isdigit():
174
+ # Format: file.py:-20
175
+ try:
176
+ end_line_num = int(line_parts[1])
177
+ path_part = potential_path
178
+ except ValueError:
179
+ # Keep original path
180
+ pass
181
+
182
+ elif line_parts[0].isdigit():
183
+ # Format: file.py:10-20 or file.py:10-
184
+ try:
185
+ start_line_num = int(line_parts[0])
186
+
187
+ if line_parts[1].isdigit():
188
+ # file.py:10-20
189
+ end_line_num = int(line_parts[1])
190
+
191
+ # In both cases, update the path
192
+ path_part = potential_path
193
+ except ValueError:
194
+ # Keep original path
195
+ pass
196
+
197
+ # Add clean path and corresponding line numbers
198
+ clean_file_paths.append(path_part)
199
+ self._start_line_nums.append(start_line_num)
200
+ self._end_line_nums.append(end_line_num)
201
+
202
+ # Update file_paths with clean paths
203
+ self.file_paths = clean_file_paths
204
+
205
+ return super().model_post_init(__context)
117
206
 
118
207
 
119
208
  class FileEdit(BaseModel):
@@ -121,6 +210,12 @@ class FileEdit(BaseModel):
121
210
  file_edit_using_search_replace_blocks: str
122
211
 
123
212
 
213
+ class FileWriteOrEdit(BaseModel):
214
+ file_path: str
215
+ percentage_to_change: int # 0.0 to 100.0
216
+ file_content_or_search_replace_blocks: str
217
+
218
+
124
219
  class ContextSave(BaseModel):
125
220
  id: str
126
221
  project_root_path: str
@@ -135,12 +230,4 @@ class Console(Protocol):
135
230
 
136
231
 
137
232
  class Mdata(PydanticBaseModel):
138
- data: (
139
- BashCommand
140
- | WriteIfEmpty
141
- | FileEdit
142
- | str
143
- | ReadFiles
144
- | Initialize
145
- | ContextSave
146
- )
233
+ data: BashCommand | FileWriteOrEdit | str | ReadFiles | Initialize | ContextSave
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wcgw
3
- Version: 3.0.7
3
+ Version: 4.1.0
4
4
  Summary: Shell and coding agent on claude and chatgpt
5
5
  Project-URL: Homepage, https://github.com/rusiaaman/wcgw
6
6
  Author-email: Aman Rusia <gapypi@arcfu.com>
@@ -17,7 +17,6 @@ Requires-Dist: pyte>=0.8.2
17
17
  Requires-Dist: python-dotenv>=1.0.1
18
18
  Requires-Dist: rich>=13.8.1
19
19
  Requires-Dist: semantic-version>=2.10.0
20
- Requires-Dist: shell>=1.0.1
21
20
  Requires-Dist: syntax-checker>=0.3.0
22
21
  Requires-Dist: tokenizers>=0.21.0
23
22
  Requires-Dist: toml>=0.10.2
@@ -30,8 +29,8 @@ Description-Content-Type: text/markdown
30
29
 
31
30
  Empowering chat applications to code, build and run on your local machine.
32
31
 
33
- - Claude - An MCP server on claude desktop for autonomous shell and coding agent. (mac only)
34
- - Chatgpt - Allows custom gpt to talk to your shell via a relay server. (linux or mac)
32
+ - Claude - MCP server with tightly integrated shell and code editing tools.
33
+ - Chatgpt - Allows custom gpt to talk to your shell via a relay server. (linux, mac, windows on wsl)
35
34
 
36
35
  ⚠️ Warning: do not allow BashCommand tool without reviewing the command, it may result in data loss.
37
36
 
@@ -39,10 +38,16 @@ Empowering chat applications to code, build and run on your local machine.
39
38
  [![Mypy strict](https://github.com/rusiaaman/wcgw/actions/workflows/python-types.yml/badge.svg?branch=main)](https://github.com/rusiaaman/wcgw/actions/workflows/python-types.yml)
40
39
  [![Build](https://github.com/rusiaaman/wcgw/actions/workflows/python-publish.yml/badge.svg)](https://github.com/rusiaaman/wcgw/actions/workflows/python-publish.yml)
41
40
  [![codecov](https://codecov.io/gh/rusiaaman/wcgw/graph/badge.svg)](https://codecov.io/gh/rusiaaman/wcgw)
42
- [![smithery badge](https://smithery.ai/badge/wcgw)](https://smithery.ai/server/wcgw)
41
+ [![Reddit](https://img.shields.io/badge/Reddit-r%2Fwcgw_mcp-red)](https://www.reddit.com/r/wcgw_mcp/)
42
+
43
+ ## Demo
44
+
45
+ ![Workflow Demo](static/workflow-demo.gif)
43
46
 
44
47
  ## Updates
45
48
 
49
+ - [24 Mar 2025] Improved writing and editing experience for sonnet 3.7, CLAUDE.md gets loaded automatically.
50
+
46
51
  - [16 Feb 2025] You can now attach to the working terminal that the AI uses. See the "attach-to-terminal" section below.
47
52
 
48
53
  - [15 Jan 2025] Modes introduced: architect, code-writer, and all powerful wcgw mode.
@@ -53,11 +58,10 @@ Empowering chat applications to code, build and run on your local machine.
53
58
 
54
59
  - [9 Dec 2024] [Vscode extension to paste context on Claude app](https://marketplace.visualstudio.com/items?itemName=AmanRusia.wcgw)
55
60
 
56
-
57
61
  ## 🚀 Highlights
58
62
 
59
63
  - ⚡ **Create, Execute, Iterate**: Ask claude to keep running compiler checks till all errors are fixed, or ask it to keep checking for the status of a long running command till it's done.
60
- - ⚡ **Large file edit**: Supports large file incremental edits to avoid token limit issues. Faster than full file write.
64
+ - ⚡ **Large file edit**: Supports large file incremental edits to avoid token limit issues. Smartly selects when to do small edits or large rewrite based on % of change needed.
61
65
  - ⚡ **Syntax checking on edits**: Reports feedback to the LLM if its edits have any syntax errors, so that it can redo it.
62
66
  - ⚡ **Interactive Command Handling**: Supports interactive commands using arrow keys, interrupt, and ansi escape sequences.
63
67
  - ⚡ **File protections**:
@@ -96,6 +100,8 @@ Empowering chat applications to code, build and run on your local machine.
96
100
 
97
101
  ## Claude setup (using mcp)
98
102
 
103
+ ### Mac and linux
104
+
99
105
  First install `uv` using homebrew `brew install uv`
100
106
 
101
107
  (**Important:** use homebrew to install uv. Otherwise make sure `uv` is present in a global location like /usr/bin/)
@@ -131,18 +137,33 @@ _If there's an error in setting up_
131
137
  - Try using `uv` version `0.6.0` for which this tool was tested.
132
138
  - Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --from wcgw@latest --python 3.12 wcgw_mcp`
133
139
 
134
- ### Alternative configuration using smithery (npx required)
140
+ ### Windows on wsl
135
141
 
136
- You need to first install uv using homebrew. `brew install uv`
142
+ This mcp server works only on wsl on windows.
137
143
 
138
- Then to configure wcgw for Claude Desktop automatically via [Smithery](https://smithery.ai/server/wcgw):
144
+ To set it up, [install uv](https://docs.astral.sh/uv/getting-started/installation/)
139
145
 
140
- ```bash
141
- npx -y @smithery/cli install wcgw --client claude
142
- ```
146
+ Then add or update the claude config file `%APPDATA%\Claude\claude_desktop_config.json` with the following
143
147
 
144
- _If there's an error in setting up_
145
- - Try removing ~/.cache/uv folder
148
+ ```json
149
+ {
150
+ "mcpServers": {
151
+ "wcgw": {
152
+ "command": "wsl.exe",
153
+ "args": [
154
+ "uv",
155
+ "tool",
156
+ "run",
157
+ "--from",
158
+ "wcgw@latest",
159
+ "--python",
160
+ "3.12",
161
+ "wcgw_mcp"
162
+ ]
163
+ }
164
+ }
165
+ }
166
+ ```
146
167
 
147
168
  ### Usage
148
169
 
@@ -174,6 +195,7 @@ There are three built-in modes. You may ask Claude to run in one of the modes, l
174
195
  Note: in code-writer mode either all commands are allowed or none are allowed for now. If you give a list of allowed commands, Claude is instructed to run only those commands, but no actual check happens. (WIP)
175
196
 
176
197
  #### Attach to the working terminal to investigate
198
+
177
199
  If you've `screen` command installed, wcgw runs on a screen instance automatically. If you've started wcgw mcp server, you can list the screen sessions:
178
200
 
179
201
  `screen -ls`
@@ -184,7 +206,7 @@ You can then attach to the session using `screen -x 93358.wcgw.235521`
184
206
 
185
207
  You may interrupt any running command safely.
186
208
 
187
- You can interact with the terminal but beware that the AI might be running in parallel and it may conflict with what you're doing. It's recommended to keep your interactions to minimum.
209
+ You can interact with the terminal but beware that the AI might be running in parallel and it may conflict with what you're doing. It's recommended to keep your interactions to minimum.
188
210
 
189
211
  You shouldn't exit the session using `exit `or Ctrl-d, instead you should use `ctrl+a+d` to safely detach without destroying the screen session.
190
212
 
@@ -204,12 +226,12 @@ Read here: https://github.com/rusiaaman/wcgw/blob/main/openai.md
204
226
 
205
227
  ![example](https://github.com/rusiaaman/wcgw/blob/main/static/example.jpg?raw=true)
206
228
 
207
-
208
229
  ## Using mcp server over docker
209
230
 
210
231
  First build the docker image `docker build -t wcgw https://github.com/rusiaaman/wcgw.git`
211
232
 
212
233
  Then you can update `/Users/username/Library/Application Support/Claude/claude_desktop_config.json` to have
234
+
213
235
  ```
214
236
  {
215
237
  "mcpServers": {
@@ -228,8 +250,6 @@ Then you can update `/Users/username/Library/Application Support/Claude/claude_d
228
250
  }
229
251
  ```
230
252
 
231
-
232
-
233
253
  ## [Optional] Local shell access with openai API key or anthropic API key
234
254
 
235
255
  ### Openai
@@ -281,4 +301,3 @@ The server provides the following MCP tools:
281
301
  - Parameters: `id` (string), `project_root_path` (string), `description` (string), `relevant_file_globs` (string[])
282
302
 
283
303
  All tools support absolute paths and include built-in protections against common errors. See the [MCP specification](https://modelcontextprotocol.io/) for detailed protocol information.
284
-
@@ -1,33 +1,34 @@
1
1
  wcgw/__init__.py,sha256=qUofQOAXCGcWr2u_B8U-MIMhhYaBUpUwNDcscvRmYfo,90
2
2
  wcgw/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- wcgw/types_.py,sha256=xd3TP9_57iFVoKxkBsl3G7mwIW5uIog68xJ_Khh9E9s,3639
3
+ wcgw/types_.py,sha256=mwr2x20yLF85OoHy3pKxtmG834Gnoqrkx3pA8skGsVk,7360
4
4
  wcgw/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  wcgw/client/common.py,sha256=OCH7Tx64jojz3M3iONUrGMadE07W21DiZs5sOxWX1Qc,1456
6
- wcgw/client/diff-instructions.txt,sha256=tmJ9Fu9XdO_72lYXQQNY9RZyx91bjxrXJf9d_KBz57k,1611
7
- wcgw/client/memory.py,sha256=8LdYsOhvCOoC1kfvDr85kNy07WnhPMvE6B2FRM2w85Y,2902
8
- wcgw/client/modes.py,sha256=FjIQOjT5oI7dk9VG0oRemN1A6EHBvHnuSQGKuRbguJI,10352
9
- wcgw/client/tool_prompts.py,sha256=H36Sr3yH2YuHZTc08Y6rTUWlYWjKMFtIGP6vbAVNwZo,3988
10
- wcgw/client/tools.py,sha256=rboKbRHtIl_4Mhypc23CrDaswXOHjyovyxWkwbXswXk,27387
11
- wcgw/client/bash_state/bash_state.py,sha256=aY_hW9y7TyPWHR5799v6rxzuWb1VzgjiGjA4K0cpGjE,27287
6
+ wcgw/client/diff-instructions.txt,sha256=HXYfGvhlDMxmiIX9AbB05wJcptJF_gSIobYhYSqWRJo,1685
7
+ wcgw/client/memory.py,sha256=M0plOGE5WXTEAs7nVLg4eCpVhmSW94ckpg5D0ycWX5I,2927
8
+ wcgw/client/modes.py,sha256=gXm0u5EGQuPYEPZnyAptdzusN0JzLMED_DyErojPE6s,10679
9
+ wcgw/client/tool_prompts.py,sha256=zHJQHb_E44zA3rBIkAudibgP3Zbw0DjA-CKM8qlqmMU,4410
10
+ wcgw/client/tools.py,sha256=JXk6t7iNtP2EK6mdTkMqCquGGQ6TtoIJ8AEhkSith14,43963
11
+ wcgw/client/bash_state/bash_state.py,sha256=1i72oLJ73AHvj0XmK0kAKnksiZwxWdAg21K27loKmpo,34020
12
12
  wcgw/client/encoder/__init__.py,sha256=Y-8f43I6gMssUCWpX5rLYiAFv3D-JPRs4uNEejPlke8,1514
13
- wcgw/client/file_ops/diff_edit.py,sha256=sIwXSSkWYff_Dp3oHfefqtSuFqLrxbhKvzkCoLuLqDE,18679
14
- wcgw/client/file_ops/search_replace.py,sha256=Napa7IWaYPGMNdttunKyRDkb90elZE7r23B_o_htRxo,5585
13
+ wcgw/client/file_ops/diff_edit.py,sha256=eNxFRmVsBfY0ISwfsV5s8rlMwMxTlm6ko150iFFCsT8,18525
14
+ wcgw/client/file_ops/search_replace.py,sha256=TaIPDqjgmTo4oghhO3zIFklq5JjAbx_aPHJ7yEgvDh4,6854
15
15
  wcgw/client/mcp_server/Readme.md,sha256=2Z88jj1mf9daYGW1CWaldcJ0moy8owDumhR2glBY3A8,109
16
16
  wcgw/client/mcp_server/__init__.py,sha256=mm7xhBIPwJpRT3u-Qsj4cKVMpVyucJoKRlbMP_gRRB0,343
17
- wcgw/client/mcp_server/server.py,sha256=ayK6qbzCveoQW7RO80m10cAIS3m-hvxzd15XhjiyxmE,5055
18
- wcgw/client/repo_ops/display_tree.py,sha256=E5q9mrGBb57NyvudSmRIG-fj4FUqupbzjmARpX8X0XY,4166
17
+ wcgw/client/mcp_server/server.py,sha256=bHr9kv6hOs8s7LySNfpJeSX69GdFvFtbWpVyrp3G_eM,5160
18
+ wcgw/client/repo_ops/display_tree.py,sha256=uOGX2IbXTKXwtXT2wdDszuH4ODmSYsHm0toU55e1vYI,4021
19
+ wcgw/client/repo_ops/file_stats.py,sha256=AUA0Br7zFRpylWFYZPGMeGPJy3nWp9e2haKi34JptHE,4887
19
20
  wcgw/client/repo_ops/path_prob.py,sha256=SWf0CDn37rtlsYRQ51ufSxay-heaQoVIhr1alB9tZ4M,2144
20
21
  wcgw/client/repo_ops/paths_model.vocab,sha256=M1pXycYDQehMXtpp-qAgU7rtzeBbCOiJo4qcYFY0kqk,315087
21
22
  wcgw/client/repo_ops/paths_tokens.model,sha256=jiwwE4ae8ADKuTZISutXuM5Wfyc_FBmN5rxTjoNnCos,1569052
22
- wcgw/client/repo_ops/repo_context.py,sha256=5NqRxBY0K-SBFXJ0Ybt7llzYOBD8pRkTpruMMJHWxv4,4336
23
+ wcgw/client/repo_ops/repo_context.py,sha256=e_w-1VfxWQiZT3r66N13nlmPt6AGm0uvG3A7aYSgaCI,9632
23
24
  wcgw/relay/client.py,sha256=BUeEKUsWts8RpYxXwXcyFyjBJhOCS-CxThAlL_-VCOI,3618
24
- wcgw/relay/serve.py,sha256=UFaRlGTfeD9Oc2AcPF8rIdTRwROBKoT2HglOKrc-aoo,7947
25
+ wcgw/relay/serve.py,sha256=vaHxSm4DkWUKLMOnz2cO6ClR2udnaXCWAGl0O_bXvrs,6984
25
26
  wcgw/relay/static/privacy.txt,sha256=s9qBdbx2SexCpC_z33sg16TptmAwDEehMCLz4L50JLc,529
26
27
  wcgw_cli/__init__.py,sha256=TNxXsTPgb52OhakIda9wTRh91cqoBqgQRx5TxjzQQFU,21
27
28
  wcgw_cli/__main__.py,sha256=wcCrL4PjG51r5wVKqJhcoJPTLfHW0wNbD31DrUN0MWI,28
28
- wcgw_cli/anthropic_client.py,sha256=-rfnw_tIx1VjhzOsPeTZkoF0VAXhRC9zBW2oLMFJcxg,19624
29
+ wcgw_cli/anthropic_client.py,sha256=R95ht8ct3TgV8PMNzr5yJdAXAmZpozPpyZZ01J9bQHs,19627
29
30
  wcgw_cli/cli.py,sha256=-7FBe_lahKyUOhf65iurTA1M1gXXXAiT0OVKQVcZKKo,948
30
- wcgw_cli/openai_client.py,sha256=4NFv-d7u6B7vMD_w3Qqr-564ZcdvfBUGowUmQ6idglE,15758
31
+ wcgw_cli/openai_client.py,sha256=MnJ93E7vSIRx1SkkanvCTcfc4ZsndlPUs8c-LXdxbOk,15761
31
32
  wcgw_cli/openai_utils.py,sha256=xGOb3W5ALrIozV7oszfGYztpj0FnXdD7jAxm5lEIVKY,2439
32
33
  mcp_wcgw/__init__.py,sha256=fKCgOdN7cn7gR3YGFaGyV5Goe8A2sEyllLcsRkN0i-g,2601
33
34
  mcp_wcgw/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -51,8 +52,8 @@ mcp_wcgw/shared/memory.py,sha256=dBsOghxHz8-tycdSVo9kSujbsC8xb_tYsGmuJobuZnw,281
51
52
  mcp_wcgw/shared/progress.py,sha256=ymxOsb8XO5Mhlop7fRfdbmvPodANj7oq6O4dD0iUcnw,1048
52
53
  mcp_wcgw/shared/session.py,sha256=e44a0LQOW8gwdLs9_DE9oDsxqW2U8mXG3d5KT95bn5o,10393
53
54
  mcp_wcgw/shared/version.py,sha256=d2LZii-mgsPIxpshjkXnOTUmk98i0DT4ff8VpA_kAvE,111
54
- wcgw-3.0.7.dist-info/METADATA,sha256=EUfU99SQ5awMMfYVqCS969KEJ_4sWvcd8Jn9DkbVq0s,14549
55
- wcgw-3.0.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
56
- wcgw-3.0.7.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
57
- wcgw-3.0.7.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
58
- wcgw-3.0.7.dist-info/RECORD,,
55
+ wcgw-4.1.0.dist-info/METADATA,sha256=6v32rPTVYTPeEGY9F0miFZRknGe31eeN0bZKWskoSW8,14916
56
+ wcgw-4.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ wcgw-4.1.0.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
58
+ wcgw-4.1.0.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
59
+ wcgw-4.1.0.dist-info/RECORD,,
@@ -217,7 +217,7 @@ def loop(
217
217
  system_console, os.getcwd(), None, None, None, None, True, None
218
218
  ) as bash_state:
219
219
  context = Context(bash_state, system_console)
220
- system, context = initialize(
220
+ system, context, _ = initialize(
221
221
  "first_call",
222
222
  context,
223
223
  os.getcwd(),
wcgw_cli/openai_client.py CHANGED
@@ -181,7 +181,7 @@ def loop(
181
181
  system_console, os.getcwd(), None, None, None, None, True, None
182
182
  ) as bash_state:
183
183
  context = Context(bash_state, system_console)
184
- system, context = initialize(
184
+ system, context, _ = initialize(
185
185
  "first_call",
186
186
  context,
187
187
  os.getcwd(),
File without changes