wcgw 3.0.7__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
@@ -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.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,12 +224,12 @@ 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
 
207
-
208
227
  ## Using mcp server over docker
209
228
 
210
229
  First build the docker image `docker build -t wcgw https://github.com/rusiaaman/wcgw.git`
211
230
 
212
231
  Then you can update `/Users/username/Library/Application Support/Claude/claude_desktop_config.json` to have
232
+
213
233
  ```
214
234
  {
215
235
  "mcpServers": {
@@ -228,8 +248,6 @@ Then you can update `/Users/username/Library/Application Support/Claude/claude_d
228
248
  }
229
249
  ```
230
250
 
231
-
232
-
233
251
  ## [Optional] Local shell access with openai API key or anthropic API key
234
252
 
235
253
  ### Openai
@@ -281,4 +299,3 @@ The server provides the following MCP tools:
281
299
  - Parameters: `id` (string), `project_root_path` (string), `description` (string), `relevant_file_globs` (string[])
282
300
 
283
301
  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=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=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.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