wcgw 3.0.6__py3-none-any.whl → 4.0.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
@@ -16,23 +16,14 @@ from pydantic import BaseModel
16
16
  from ..types_ import (
17
17
  BashCommand,
18
18
  ContextSave,
19
- FileEdit,
19
+ FileWriteOrEdit,
20
20
  Initialize,
21
21
  ReadFiles,
22
- WriteIfEmpty,
23
22
  )
24
23
 
25
24
 
26
25
  class Mdata(BaseModel):
27
- data: (
28
- BashCommand
29
- | WriteIfEmpty
30
- | FileEdit
31
- | ReadFiles
32
- | Initialize
33
- | ContextSave
34
- | str
35
- )
26
+ data: BashCommand | FileWriteOrEdit | ReadFiles | Initialize | ContextSave | str
36
27
  user_id: UUID
37
28
 
38
29
 
@@ -93,12 +84,12 @@ async def register_websocket(websocket: WebSocket, uuid: UUID) -> None:
93
84
  print(f"Client {uuid} disconnected")
94
85
 
95
86
 
96
- class WriteIfEmptyWithUUID(WriteIfEmpty):
87
+ class FileWriteOrEdithUUID(FileWriteOrEdit):
97
88
  user_id: UUID
98
89
 
99
90
 
100
- @app.post("/v1/create_file")
101
- 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:
102
93
  user_id = write_file_data.user_id
103
94
  if user_id not in clients:
104
95
  return "Failure: id not found, ask the user to check it."
@@ -122,42 +113,6 @@ async def create_file(write_file_data: WriteIfEmptyWithUUID) -> str:
122
113
  raise fastapi.HTTPException(status_code=500, detail="Timeout error")
123
114
 
124
115
 
125
- class FileEditWithUUID(FileEdit):
126
- user_id: UUID
127
-
128
-
129
- @app.post("/v1/full_file_edit")
130
- async def file_edit_find_replace(
131
- file_edit_find_replace: FileEditWithUUID,
132
- ) -> str:
133
- user_id = file_edit_find_replace.user_id
134
- if user_id not in clients:
135
- return "Failure: id not found, ask the user to check it."
136
-
137
- results: Optional[str] = None
138
-
139
- def put_results(result: str) -> None:
140
- nonlocal results
141
- results = result
142
-
143
- gpts[user_id] = put_results
144
-
145
- await clients[user_id](
146
- Mdata(
147
- data=file_edit_find_replace,
148
- user_id=user_id,
149
- )
150
- )
151
-
152
- start_time = time.time()
153
- while time.time() - start_time < 30:
154
- if results is not None:
155
- return results
156
- await asyncio.sleep(0.1)
157
-
158
- raise fastapi.HTTPException(status_code=500, detail="Timeout error")
159
-
160
-
161
116
  class CommandWithUUID(BashCommand):
162
117
  user_id: UUID
163
118
 
@@ -179,7 +134,8 @@ async def bash_command(command: CommandWithUUID) -> str:
179
134
  await clients[user_id](
180
135
  Mdata(
181
136
  data=BashCommand(
182
- 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,
183
139
  ),
184
140
  user_id=user_id,
185
141
  )
@@ -281,7 +237,7 @@ async def context_save(context_save_data: ContextSaveWithUUID) -> str:
281
237
  raise fastapi.HTTPException(status_code=500, detail="Timeout error")
282
238
 
283
239
 
284
- app.mount("/static", StaticFiles(directory="static"), name="static")
240
+ app.mount("/static", StaticFiles(directory="static"))
285
241
 
286
242
 
287
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.6
3
+ Version: 4.0.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 - An MCP server on claude desktop for autonomous shell and coding agent. (mac, linux, windows on wsl)
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,7 +38,11 @@ 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
 
@@ -53,7 +56,6 @@ Empowering chat applications to code, build and run on your local machine.
53
56
 
54
57
  - [9 Dec 2024] [Vscode extension to paste context on Claude app](https://marketplace.visualstudio.com/items?itemName=AmanRusia.wcgw)
55
58
 
56
-
57
59
  ## 🚀 Highlights
58
60
 
59
61
  - ⚡ **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.
@@ -96,6 +98,8 @@ Empowering chat applications to code, build and run on your local machine.
96
98
 
97
99
  ## Claude setup (using mcp)
98
100
 
101
+ ### Mac and linux
102
+
99
103
  First install `uv` using homebrew `brew install uv`
100
104
 
101
105
  (**Important:** use homebrew to install uv. Otherwise make sure `uv` is present in a global location like /usr/bin/)
@@ -131,18 +135,33 @@ _If there's an error in setting up_
131
135
  - Try using `uv` version `0.6.0` for which this tool was tested.
132
136
  - Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --from wcgw@latest --python 3.12 wcgw_mcp`
133
137
 
134
- ### Alternative configuration using smithery (npx required)
138
+ ### Windows on wsl
135
139
 
136
- You need to first install uv using homebrew. `brew install uv`
140
+ This mcp server works only on wsl on windows.
137
141
 
138
- Then to configure wcgw for Claude Desktop automatically via [Smithery](https://smithery.ai/server/wcgw):
142
+ To set it up, [install uv](https://docs.astral.sh/uv/getting-started/installation/)
139
143
 
140
- ```bash
141
- npx -y @smithery/cli install wcgw --client claude
142
- ```
144
+ Then add or update the claude config file `%APPDATA%\Claude\claude_desktop_config.json` with the following
143
145
 
144
- _If there's an error in setting up_
145
- - Try removing ~/.cache/uv folder
146
+ ```json
147
+ {
148
+ "mcpServers": {
149
+ "wcgw": {
150
+ "command": "wsl.exe",
151
+ "args": [
152
+ "uv",
153
+ "tool",
154
+ "run",
155
+ "--from",
156
+ "wcgw@latest",
157
+ "--python",
158
+ "3.12",
159
+ "wcgw_mcp"
160
+ ]
161
+ }
162
+ }
163
+ }
164
+ ```
146
165
 
147
166
  ### Usage
148
167
 
@@ -174,6 +193,7 @@ There are three built-in modes. You may ask Claude to run in one of the modes, l
174
193
  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
194
 
176
195
  #### Attach to the working terminal to investigate
196
+
177
197
  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
198
 
179
199
  `screen -ls`
@@ -184,7 +204,7 @@ You can then attach to the session using `screen -x 93358.wcgw.235521`
184
204
 
185
205
  You may interrupt any running command safely.
186
206
 
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.
207
+ 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
208
 
189
209
  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
210
 
@@ -204,6 +224,30 @@ Read here: https://github.com/rusiaaman/wcgw/blob/main/openai.md
204
224
 
205
225
  ![example](https://github.com/rusiaaman/wcgw/blob/main/static/example.jpg?raw=true)
206
226
 
227
+ ## Using mcp server over docker
228
+
229
+ First build the docker image `docker build -t wcgw https://github.com/rusiaaman/wcgw.git`
230
+
231
+ Then you can update `/Users/username/Library/Application Support/Claude/claude_desktop_config.json` to have
232
+
233
+ ```
234
+ {
235
+ "mcpServers": {
236
+ "filesystem": {
237
+ "command": "docker",
238
+ "args": [
239
+ "run",
240
+ "-i",
241
+ "--rm",
242
+ "--mount",
243
+ "type=bind,src=/Users/username/Desktop,dst=/workspace/Desktop",
244
+ "wcgw",
245
+ ]
246
+ }
247
+ }
248
+ }
249
+ ```
250
+
207
251
  ## [Optional] Local shell access with openai API key or anthropic API key
208
252
 
209
253
  ### Openai
@@ -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=l0L7kuylDdZ5WA2_P1CfN4Ds0xD9IPqEZ0ot0pruhKs,26512
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=Opmy5nKrCA4YITn79G1Q8l55xeBmhwtSv6MasSGkp5U,10338
9
+ wcgw/client/tool_prompts.py,sha256=H2jzhnRDv99R-VaYo38FtGh4DxAVJniqG5Wuj35JfHs,4287
10
+ wcgw/client/tools.py,sha256=rsoEUVVqZkYCTK-qlsik4CuxsmANvNOoCXJgDHAAX1Y,43243
11
+ wcgw/client/bash_state/bash_state.py,sha256=9lBqdnHStgKEOU_t1ACeHed0cwbO2npaLAiEerFj1Es,33874
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=vKELPknWu3FGgPos74yN9wox6BCVcaocZ7dpBAT8Blk,18723
14
+ wcgw/client/file_ops/search_replace.py,sha256=2biF6b_l9JRWXJRkeRIo_ltUVBKgsQgPuDd_sqkPMX8,5811
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
17
  wcgw/client/mcp_server/server.py,sha256=ayK6qbzCveoQW7RO80m10cAIS3m-hvxzd15XhjiyxmE,5055
18
- wcgw/client/repo_ops/display_tree.py,sha256=E5q9mrGBb57NyvudSmRIG-fj4FUqupbzjmARpX8X0XY,4166
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=vB3ET5RLA7p9OpL3XNPr3nycQkoeu6gC-RbyA9Ml-xA,8871
23
24
  wcgw/relay/client.py,sha256=BUeEKUsWts8RpYxXwXcyFyjBJhOCS-CxThAlL_-VCOI,3618
24
- wcgw/relay/serve.py,sha256=xFAFiRENPae723_kwaaCgBmqL5sffYHKPu3esrMu57M,7896
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.6.dist-info/METADATA,sha256=tEFOApXxIWcCkeryPchiGvd0j_zhWFP1_JX2Aqj3CuU,14049
55
- wcgw-3.0.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
56
- wcgw-3.0.6.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
57
- wcgw-3.0.6.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
58
- wcgw-3.0.6.dist-info/RECORD,,
55
+ wcgw-4.0.0.dist-info/METADATA,sha256=lep9tKuEznEoFQBQ7VpRAOrhUlFnGcPu8Q4KXIE2QQo,14785
56
+ wcgw-4.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ wcgw-4.0.0.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
58
+ wcgw-4.0.0.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
59
+ wcgw-4.0.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