vamp-cli 0.1.2__tar.gz → 0.1.4__tar.gz

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 (74) hide show
  1. vamp_cli-0.1.4/MANIFEST.in +1 -0
  2. {vamp_cli-0.1.2/src/vamp_cli.egg-info → vamp_cli-0.1.4}/PKG-INFO +3 -2
  3. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/README.md +1 -1
  4. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/pyproject.toml +3 -2
  5. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/nodes.py +22 -15
  6. vamp_cli-0.1.4/src/vamp_cli/config/default_config.yaml +291 -0
  7. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/main.py +17 -9
  8. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/transcript.py +1 -1
  9. {vamp_cli-0.1.2 → vamp_cli-0.1.4/src/vamp_cli.egg-info}/PKG-INFO +3 -2
  10. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/SOURCES.txt +2 -0
  11. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/requires.txt +1 -0
  12. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/LICENSE +0 -0
  13. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/setup.cfg +0 -0
  14. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/__init__.py +0 -0
  15. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/__init__.py +0 -0
  16. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/context_sync.py +0 -0
  17. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/graph.py +0 -0
  18. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/instructions.py +0 -0
  19. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/roles.py +0 -0
  20. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/runtime/__init__.py +0 -0
  21. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/runtime/runtime.py +0 -0
  22. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/state.py +0 -0
  23. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/status.py +0 -0
  24. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/__init__.py +0 -0
  25. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/loader.py +0 -0
  26. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/schema.py +0 -0
  27. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/__init__.py +0 -0
  28. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/adapter.py +0 -0
  29. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/adapter_registry.py +0 -0
  30. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/debug_callbacks.py +0 -0
  31. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/router.py +0 -0
  32. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/usage.py +0 -0
  33. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/logging_setup/logging_setup.py +0 -0
  34. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/__init__.py +0 -0
  35. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/compaction.py +0 -0
  36. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/emitter.py +0 -0
  37. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/event_log.py +0 -0
  38. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/fork.py +0 -0
  39. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/loader.py +0 -0
  40. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/agent.md +0 -0
  41. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/coder.md +0 -0
  42. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/planner.md +0 -0
  43. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/prompts.py +0 -0
  44. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/__init__.py +0 -0
  45. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/base.py +0 -0
  46. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/config.py +0 -0
  47. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/docker.py +0 -0
  48. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/manager.py +0 -0
  49. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/result.py +0 -0
  50. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/terminal.py +0 -0
  51. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/__init__.py +0 -0
  52. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/base.py +0 -0
  53. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/diagnostic.py +0 -0
  54. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/execute_cmd.py +0 -0
  55. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/files.py +0 -0
  56. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/registry.py +0 -0
  57. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/tools_classes.py +0 -0
  58. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/__init__.py +0 -0
  59. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/error_codes.py +0 -0
  60. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/ignore.py +0 -0
  61. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/sha_256.py +0 -0
  62. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/token_tracker.py +0 -0
  63. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/workspace/__init__.py +0 -0
  64. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/workspace/workspace.py +0 -0
  65. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/dependency_links.txt +0 -0
  66. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/entry_points.txt +0 -0
  67. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/top_level.txt +0 -0
  68. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_list_dir.py +0 -0
  69. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_loader.py +0 -0
  70. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_model_fallbacks.py +0 -0
  71. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_persistence.py +0 -0
  72. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_registry_async.py +0 -0
  73. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_sandbox_roundtrip.py +0 -0
  74. {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_system_verification.py +0 -0
@@ -0,0 +1 @@
1
+ recursive-include src/vamp_cli/config *.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vamp-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: VAMP-CLI is an interactive coding agent for working in a local repository. It combines a planner, a coder, model fallbacks, workspace-aware file tools, and a Docker-backed command sandbox in one terminal application. The agent can inspect and edit files, search a codebase, run commands, maintain a task list, and ask for confirmation before executing potentially dangerous operations.
5
5
  Author-email: Satyam Kumar <satkr2208@gmail.com>
6
6
  License: MIT License
@@ -50,6 +50,7 @@ Requires-Dist: langgraph
50
50
  Requires-Dist: langchain-litellm
51
51
  Requires-Dist: langgraph-checkpoint-sqlite
52
52
  Requires-Dist: aiosqlite
53
+ Requires-Dist: mcp
53
54
  Dynamic: license-file
54
55
 
55
56
  # VAMP-CLI
@@ -91,7 +92,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
91
92
  Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
92
93
 
93
94
  ```bash
94
- python3.11 -m venv .venv
95
+ python3.12 -m venv .venv
95
96
  source .venv/bin/activate
96
97
  python -m pip install --upgrade pip
97
98
  python -m pip install vamp-cli
@@ -37,7 +37,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
37
37
  Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
38
38
 
39
39
  ```bash
40
- python3.11 -m venv .venv
40
+ python3.12 -m venv .venv
41
41
  source .venv/bin/activate
42
42
  python -m pip install --upgrade pip
43
43
  python -m pip install vamp-cli
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "vamp-cli"
7
- version = "0.1.2"
7
+ version = "0.1.4"
8
8
  authors = [
9
9
  { name = "Satyam Kumar", email = "satkr2208@gmail.com" }
10
10
  ]
@@ -36,6 +36,7 @@ dependencies = [
36
36
  "langchain-litellm",
37
37
  "langgraph-checkpoint-sqlite",
38
38
  "aiosqlite",
39
+ "mcp",
39
40
  ]
40
41
 
41
42
 
@@ -43,7 +44,7 @@ dependencies = [
43
44
  where = ["src"]
44
45
 
45
46
  [tool.setuptools.package-data]
46
- vamp_cli = ["*.md", "**/*.md"]
47
+ vamp_cli = ["*.md", "**/*.md", "**/*.yaml"]
47
48
 
48
49
 
49
50
  [project.scripts]
@@ -4,6 +4,7 @@ import asyncio
4
4
  from typing import Any
5
5
  from prompt_toolkit import print_formatted_text
6
6
  from prompt_toolkit.formatted_text import FormattedText, HTML
7
+ from prompt_toolkit.styles import Style
7
8
 
8
9
  from langgraph.graph import END
9
10
  from langgraph.types import interrupt, Command
@@ -16,7 +17,9 @@ from vamp_cli.agent.state import AgentState
16
17
  from vamp_cli.agent.status import FeedbackResponse
17
18
  from vamp_cli.agent.instructions import TODO_INSTRUCTIONS, PLAN_INSTRUCTIONS
18
19
 
19
-
20
+ _dim_style = Style.from_dict({
21
+ 'dimmed': '#767B7D',
22
+ })
20
23
 
21
24
  def create_planner_node(model: Runnable):
22
25
 
@@ -36,17 +39,19 @@ def create_planner_node(model: Runnable):
36
39
  if response.tool_calls:
37
40
  print_formatted_text(
38
41
  FormattedText([(
39
- "dim",
42
+ "class:dimmed",
40
43
  "\n\n[planner] calling:"
41
44
  )]),
45
+ style=_dim_style,
42
46
  end="\n"
43
47
  )
44
48
  for tc in response.tool_calls:
45
49
  print_formatted_text(
46
50
  FormattedText([(
47
- "dim",
48
- f">> {tc['name']}({tc['args']})"
51
+ "class:dimmed",
52
+ f">> {str(tc['name'])}({str(tc['args'])})"
49
53
  )]),
54
+ style=_dim_style,
50
55
  end="\n"
51
56
  )
52
57
  # print("Tool: ", tc['name'])
@@ -99,15 +104,15 @@ def create_agent_node(model: Runnable):
99
104
 
100
105
 
101
106
 
102
- if not state.get("todo"):
103
- message_to_send.append(SystemMessage(content=TODO_INSTRUCTIONS))
107
+ # if not state.get("todo"):
108
+ # message_to_send.append(SystemMessage(content=TODO_INSTRUCTIONS))
104
109
 
105
- if state.get("todo"):
106
- turns_since_update = _turns_since_todo_update(state["coder_messages"])
107
- if turns_since_update >= 10:
108
- message_to_send.append(
109
- SystemMessage(content=_format_todo_reminder(state["todo"]))
110
- )
110
+ # if state.get("todo"):
111
+ # turns_since_update = _turns_since_todo_update(state["coder_messages"])
112
+ # if turns_since_update >= 10:
113
+ # message_to_send.append(
114
+ # SystemMessage(content=_format_todo_reminder(state["todo"]))
115
+ # )
111
116
 
112
117
  response: AIMessage = await model.with_config(config).ainvoke(message_to_send)
113
118
 
@@ -116,17 +121,19 @@ def create_agent_node(model: Runnable):
116
121
  if response.tool_calls:
117
122
  print_formatted_text(
118
123
  FormattedText([(
119
- "dim",
124
+ "class:dimmed",
120
125
  "\n\n[coder] calling:"
121
126
  )]),
127
+ style=_dim_style,
122
128
  end="\n"
123
129
  )
124
130
  for tc in response.tool_calls:
125
131
  print_formatted_text(
126
132
  FormattedText([(
127
- "dim",
128
- f">> {tc['name']}({tc['args']})"
133
+ "class:dimmed",
134
+ f">> {str(tc['name'])}({str(tc['args'])})"
129
135
  )]),
136
+ style=_dim_style,
130
137
  end="\n"
131
138
  )
132
139
 
@@ -0,0 +1,291 @@
1
+ models:
2
+ qwen:
3
+ model: dashscope/qwen3.6-flash
4
+ api_base: https://ws-n7c4pdh4ldno9hkc.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
5
+ api_key_env: DASHSCOPE_API_KEY
6
+ adapter: reasoning
7
+ params:
8
+ temperature: 0.2
9
+ max_tokens: 8192
10
+ max_retries: 2
11
+ streaming: true
12
+ fallbacks: []
13
+ # - openai
14
+ capabilities:
15
+ supports_tools: true
16
+ supports_parallel_tools: false
17
+ supports_streaming: true
18
+ supports_reasoning: true
19
+ context_window: 128000
20
+
21
+ # (for DashScope native OpenAI mode)
22
+ reasoning_param: enable_thinking
23
+ reasoning_value: true
24
+
25
+ # (general)
26
+ # reasoning_param: thinking
27
+ # reasoning_value:
28
+ # type: enabled
29
+ # budget_tokens: 4000
30
+
31
+
32
+ openai:
33
+ model: openai/gpt-5.6-luna
34
+ api_base:
35
+ api_key_env: OPENAI_API_KEY
36
+ adapter: reasoning
37
+ params:
38
+ temperature: 0.2
39
+ max_tokens: 8192
40
+ max_retries: 2
41
+ streaming: true
42
+ fallbacks: []
43
+ capabilities:
44
+ supports_tools: true
45
+ supports_parallel_tools: false
46
+ supports_streaming: true
47
+ supports_reasoning: true
48
+ reasoning_param: reasoning_effort
49
+ reasoning_value: medium # Options: low, medium, high
50
+ context_window: 128000
51
+
52
+
53
+ anthropic:
54
+ model: anthropic/claude-opus-5-5
55
+ api_base:
56
+ api_key_env: ANTHROPIC_API_KEY
57
+ adapter: reasoning
58
+ params:
59
+ temperature: 0.2
60
+ max_tokens: 8192
61
+ max_retries: 2
62
+ streaming: true
63
+ fallbacks: []
64
+ capabilities:
65
+ supports_tools: true
66
+ supports_parallel_tools: false
67
+ supports_streaming: true
68
+ supports_reasoning: true
69
+ reasoning_param: thinking
70
+ reasoning_value:
71
+ type: adaptive
72
+ context_window: 128000
73
+ # or (for Opus 4.5, Sonnet 4.5, Haiku 4.5)
74
+ # reasoning_param: thinking
75
+ # reasoning_value:
76
+ # type: enabled
77
+ # budget_tokens: 4000
78
+
79
+
80
+
81
+ deepseek:
82
+ model: deepseek/deepseek-v4
83
+ api_base:
84
+ api_key_env: DEEPSEEK_API_KEY
85
+ adapter: reasoning
86
+ params:
87
+ temperature: 0.2
88
+ max_tokens: 8192
89
+ max_retries: 2
90
+ streaming: true
91
+ fallbacks: []
92
+ capabilities:
93
+ supports_tools: true
94
+ supports_parallel_tools: false
95
+ supports_streaming: true
96
+ supports_reasoning: true
97
+ reasoning_param: reasoning_effort
98
+ reasoning_value: high # Options: low, high, max context_window: 128000
99
+
100
+
101
+
102
+ kimi:
103
+ model: kimi/kimi
104
+ api_base:
105
+ api_key_env: KIMI_API_KEY
106
+ adapter: reasoning
107
+ params:
108
+ temperature: 0.2
109
+ max_tokens: 8192
110
+ max_retries: 2
111
+ streaming: true
112
+ fallbacks: []
113
+ capabilities:
114
+ supports_tools: true
115
+ supports_parallel_tools: false
116
+ supports_streaming: true
117
+ supports_reasoning: true
118
+ reasoning_param: reasoning_effort
119
+ reasoning_value: high # Options: low, high, max
120
+ context_window: 128000
121
+
122
+
123
+ gork:
124
+ model: gork/gork
125
+ api_base:
126
+ api_key_env: GORK_API_KEY
127
+ adapter: reasoning
128
+ params:
129
+ temperature: 0.2
130
+ max_tokens: 8192
131
+ max_retries: 2
132
+ streaming: true
133
+ fallbacks: []
134
+ capabilities:
135
+ supports_tools: true
136
+ supports_parallel_tools: false
137
+ supports_streaming: true
138
+ supports_reasoning: true
139
+ reasoning_param: reasoning_effort
140
+ reasoning_value: high # Options: low, high, max, xhigh
141
+ context_window: 128000
142
+
143
+
144
+ gemini:
145
+ model: gemini/gemini
146
+ api_base:
147
+ api_key_env: GEMINI_API_KEY
148
+ adapter: reasoning
149
+ params:
150
+ temperature: 0.2
151
+ max_tokens: 8192
152
+ max_retries: 2
153
+ streaming: true
154
+ fallbacks: []
155
+ capabilities:
156
+ supports_tools: true
157
+ supports_parallel_tools: false
158
+ supports_streaming: true
159
+ supports_reasoning: true
160
+ context_window: 128000
161
+
162
+ # for gemini 2.5 series
163
+ reasoning_param: thinking_config
164
+ reasoning_value:
165
+ thinking_budget: 4000 # -1 for dynamic, 0 to disable, or an explicit integer budget
166
+
167
+ # for gemini 3/4 series
168
+ # reasoning_param: thinking_config
169
+ # reasoning_value:
170
+ # thinking_level: high # Options: minimal, low, medium, high
171
+
172
+
173
+ profiles:
174
+ default_coder:
175
+ model: qwen
176
+ tools:
177
+ - list_dir
178
+ - read_file
179
+ - read_many_files
180
+ - apply_search_replace
181
+ - write_file
182
+ - file_search
183
+ - ripgrep_search
184
+ - execute_command
185
+ - write_update_todos
186
+ prompt: prompts/coder.md
187
+
188
+ default_planner:
189
+ model: qwen
190
+ tools:
191
+ - list_dir
192
+ - read_file
193
+ - read_many_files
194
+ - file_search
195
+ - ripgrep_search
196
+ - submit_plan
197
+ - execute_command
198
+ prompt: prompts/planner.md
199
+
200
+ planner:
201
+ model: qwen
202
+ tools:
203
+ - list_dir
204
+ - read_file
205
+ - read_many_files
206
+ - file_search
207
+ - ripgrep_search
208
+ - submit_plan
209
+ - execute_command
210
+ prompt: prompts/planner.md
211
+
212
+ coder:
213
+ model: qwen
214
+ tools:
215
+ - list_dir
216
+ - read_file
217
+ - read_many_files
218
+ - apply_search_replace
219
+ - write_file
220
+ - file_search
221
+ - ripgrep_search
222
+ - execute_command
223
+ - write_update_todos
224
+ prompt: prompts/coder.md
225
+
226
+ default_profile:
227
+ - default_coder
228
+ - default_planner
229
+
230
+
231
+
232
+
233
+ # reasoning styles
234
+
235
+ # 1. openai
236
+ # reasoning_param: "reasoning_effort"
237
+ # reasoning_value: "medium" # Options: "low", "medium", "high"
238
+
239
+ # 2. qwen
240
+ # reasoning_param: "thinking"
241
+ # reasoning_value:
242
+ # type: "enabled"
243
+ # budget_tokens: 4000
244
+
245
+ # 4. qwen (for DashScope native OpenAI mode)
246
+ # reasoning_param: "enable_thinking"
247
+ # reasoning_value: "true"
248
+
249
+ # 5. anthropic (newer models)
250
+ # reasoning_param: "thinking"
251
+ # reasoning_value:
252
+ # type: "adaptive"
253
+
254
+ # 6. anthropic (older models)
255
+ # Models: [Claude Mythos Preview, Claude Opus 4.6, Claude Sonnet 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5]
256
+ # reasoning_param: "thinking"
257
+ # reasoning_value:
258
+ # type: "enabled"
259
+ # budget_tokens: 4000
260
+
261
+ # 7. deepseek
262
+ # Models: [deepseek-reasoner, deepseek-v4]
263
+ # reasoning_param: "reasoning_effort"
264
+ # reasoning_value: "high" # Options: "low", "high", "max"
265
+
266
+ # 8. deepseek (for deepseek's anthropic style models)
267
+ # reasoning_param: "thinking"
268
+ # reasoning_value:
269
+ # type: "enabled"
270
+
271
+ # 9. kimi
272
+ # reasoning_param: "reasoning_effort"
273
+ # reasoning_value: "high" # Options: "low", "high", "max" (default: "max")
274
+
275
+ # 10. grok/xAi
276
+ # reasoning_param: "reasoning_effort"
277
+ # reasoning_value: "high" # Options: "low", "medium", "high", "xhigh"
278
+
279
+ # 11. gemini (Gemini 2.5 series)
280
+ # reasoning_param: "thinking_config"
281
+ # reasoning_value:
282
+ # thinking_budget: 4000 # -1 for dynamic, 0 to disable, or an explicit integer budget
283
+
284
+ # 12. gemini (Gemini 3 / Gemini 4 series)
285
+ # reasoning_param: "thinking_config"
286
+ # reasoning_value:
287
+ # thinking_level: "high" # Options: "minimal", "low", "medium", "high"
288
+
289
+ # 13. gemini (If connecting to Gemini via Google's OpenAI-compatible endpoint)
290
+ # reasoning_param: "reasoning_effort"
291
+ # reasoning_value: "high" # Options: "low", "medium", "high"
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import sys
2
3
  import asyncio
3
4
  from pathlib import Path
@@ -5,6 +6,7 @@ from typing import Any
5
6
  import click
6
7
  import yaml
7
8
  from prompt_toolkit import PromptSession, print_formatted_text
9
+ from prompt_toolkit.styles import Style
8
10
  from prompt_toolkit.formatted_text import HTML, FormattedText
9
11
  from prompt_toolkit.patch_stdout import patch_stdout
10
12
 
@@ -30,6 +32,7 @@ from vamp_cli.agent.graph import create_graph
30
32
  from vamp_cli.agent.roles import AgentRole
31
33
  from vamp_cli.agent.status import FeedbackResponse
32
34
  from vamp_cli.agent.context_sync import mode_switch_sync
35
+ from vamp_cli.agent.instructions import TODO_INSTRUCTIONS
33
36
 
34
37
  from vamp_cli.persistence.emitter import EventEmitter
35
38
  from vamp_cli.persistence.event_log import EventLog, uuid7
@@ -64,6 +67,9 @@ __VERSION__ = "0.1.0"
64
67
 
65
68
  PROJECT_DIR = str(Path.cwd())
66
69
 
70
+ _dim_style = Style.from_dict({
71
+ 'dimmed': "#767B7D",
72
+ })
67
73
 
68
74
  def create(event_type: str, data: dict[str, Any]) -> str:
69
75
  """Serializes events into structured strings"""
@@ -163,9 +169,10 @@ async def streaming(
163
169
  if isinstance(payload, dict):
164
170
  print_formatted_text(
165
171
  FormattedText([(
166
- "dim",
167
- f"\nMode: {payload["mode"]}"
172
+ "class:dimmed",
173
+ f"\nMode: {payload['mode']}"
168
174
  )]),
175
+ style=_dim_style,
169
176
  end="\n"
170
177
  )
171
178
 
@@ -199,24 +206,24 @@ async def streaming(
199
206
 
200
207
  if reasoning_chunk:
201
208
  if not thinking_open:
202
- # print("Thinking:\n", end="", flush=True)
203
209
  print_formatted_text(
204
210
  FormattedText([(
205
- "dim",
211
+ "class:dimmed",
206
212
  f"\nThinking:\n"
207
213
  )]),
214
+ style=_dim_style,
208
215
  end=""
209
216
  )
210
217
  thinking_open = True
211
- # print(reasoning_chunk, end="", flush=True)
218
+
212
219
  print_formatted_text(
213
220
  FormattedText([(
214
- "dim",
215
- reasoning_chunk
221
+ "class:dimmed",
222
+ str(reasoning_chunk)
216
223
  )]),
224
+ style=_dim_style,
217
225
  end=""
218
226
  )
219
-
220
227
  # 2. capture final human text
221
228
  elif chunk.content:
222
229
  if thinking_open:
@@ -236,7 +243,7 @@ async def streaming(
236
243
  print("\n[aborted by user]")
237
244
  return call_usage
238
245
  except Exception as e:
239
- print("\n[Some error happened]: ", e)
246
+ print("\n[Some error happened]: ")
240
247
  return call_usage
241
248
 
242
249
  print("\n")
@@ -821,6 +828,7 @@ async def main(resume_id: str | None = None):
821
828
  content=coder_profile.system_prompt,
822
829
  id="coder_system_prompt"
823
830
  ),
831
+ SystemMessage(content=TODO_INSTRUCTIONS),
824
832
  HumanMessage(content=user_input),
825
833
  ],
826
834
  "task": user_input,
@@ -33,7 +33,7 @@ def render_transcript(
33
33
  shadowed, compaction_by_uuid = build_shadow_map(chain)
34
34
 
35
35
  # prompt_toolkit style names.
36
- DIM = "dim"
36
+ DIM = "gray"
37
37
  BOLD_CYAN = "bold cyan"
38
38
  BOLD_GREEN = "bold green"
39
39
  GREEN = "green"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vamp-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: VAMP-CLI is an interactive coding agent for working in a local repository. It combines a planner, a coder, model fallbacks, workspace-aware file tools, and a Docker-backed command sandbox in one terminal application. The agent can inspect and edit files, search a codebase, run commands, maintain a task list, and ask for confirmation before executing potentially dangerous operations.
5
5
  Author-email: Satyam Kumar <satkr2208@gmail.com>
6
6
  License: MIT License
@@ -50,6 +50,7 @@ Requires-Dist: langgraph
50
50
  Requires-Dist: langchain-litellm
51
51
  Requires-Dist: langgraph-checkpoint-sqlite
52
52
  Requires-Dist: aiosqlite
53
+ Requires-Dist: mcp
53
54
  Dynamic: license-file
54
55
 
55
56
  # VAMP-CLI
@@ -91,7 +92,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
91
92
  Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
92
93
 
93
94
  ```bash
94
- python3.11 -m venv .venv
95
+ python3.12 -m venv .venv
95
96
  source .venv/bin/activate
96
97
  python -m pip install --upgrade pip
97
98
  python -m pip install vamp-cli
@@ -1,4 +1,5 @@
1
1
  LICENSE
2
+ MANIFEST.in
2
3
  README.md
3
4
  pyproject.toml
4
5
  src/vamp_cli/__init__.py
@@ -20,6 +21,7 @@ src/vamp_cli/agent/status.py
20
21
  src/vamp_cli/agent/runtime/__init__.py
21
22
  src/vamp_cli/agent/runtime/runtime.py
22
23
  src/vamp_cli/config/__init__.py
24
+ src/vamp_cli/config/default_config.yaml
23
25
  src/vamp_cli/config/loader.py
24
26
  src/vamp_cli/config/schema.py
25
27
  src/vamp_cli/llm/__init__.py
@@ -12,3 +12,4 @@ langgraph
12
12
  langchain-litellm
13
13
  langgraph-checkpoint-sqlite
14
14
  aiosqlite
15
+ mcp
File without changes
File without changes
File without changes