vibecore 0.3.0__py3-none-any.whl → 0.6.2__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 (37) hide show
  1. vibecore/agents/default.py +3 -3
  2. vibecore/agents/task.py +3 -3
  3. vibecore/cli.py +67 -43
  4. vibecore/context.py +74 -11
  5. vibecore/flow.py +335 -73
  6. vibecore/handlers/stream_handler.py +35 -56
  7. vibecore/main.py +70 -272
  8. vibecore/session/jsonl_session.py +3 -1
  9. vibecore/session/loader.py +2 -2
  10. vibecore/settings.py +48 -1
  11. vibecore/tools/file/executor.py +59 -13
  12. vibecore/tools/file/tools.py +9 -9
  13. vibecore/tools/path_validator.py +251 -0
  14. vibecore/tools/python/helpers.py +2 -2
  15. vibecore/tools/python/tools.py +2 -2
  16. vibecore/tools/shell/executor.py +63 -7
  17. vibecore/tools/shell/tools.py +9 -9
  18. vibecore/tools/task/executor.py +2 -2
  19. vibecore/tools/task/tools.py +2 -2
  20. vibecore/tools/todo/manager.py +2 -10
  21. vibecore/tools/todo/models.py +5 -14
  22. vibecore/tools/todo/tools.py +5 -5
  23. vibecore/tools/webfetch/tools.py +1 -4
  24. vibecore/tools/websearch/ddgs/backend.py +1 -1
  25. vibecore/tools/websearch/tools.py +1 -4
  26. vibecore/widgets/core.py +3 -17
  27. vibecore/widgets/feedback.py +164 -0
  28. vibecore/widgets/feedback.tcss +121 -0
  29. vibecore/widgets/messages.py +22 -2
  30. vibecore/widgets/messages.tcss +28 -0
  31. vibecore/widgets/tool_messages.py +19 -4
  32. vibecore/widgets/tool_messages.tcss +23 -0
  33. {vibecore-0.3.0.dist-info → vibecore-0.6.2.dist-info}/METADATA +122 -29
  34. {vibecore-0.3.0.dist-info → vibecore-0.6.2.dist-info}/RECORD +37 -34
  35. {vibecore-0.3.0.dist-info → vibecore-0.6.2.dist-info}/WHEEL +0 -0
  36. {vibecore-0.3.0.dist-info → vibecore-0.6.2.dist-info}/entry_points.txt +0 -0
  37. {vibecore-0.3.0.dist-info → vibecore-0.6.2.dist-info}/licenses/LICENSE +0 -0
@@ -260,6 +260,11 @@ class TaskToolMessage(BaseToolMessage):
260
260
  """Add a message widget to the main scroll area."""
261
261
  await self.add_message(message)
262
262
 
263
+ async def handle_agent_message_update(self, message: BaseMessage) -> None:
264
+ """Message in the widget's message list is updated with new delta or status"""
265
+ # TODO(serialx): implement later
266
+ pass
267
+
263
268
  async def handle_agent_update(self, new_agent: Agent) -> None:
264
269
  """Handle agent updates."""
265
270
  pass
@@ -486,6 +491,7 @@ class MCPToolMessage(BaseToolMessage):
486
491
  class RichToolMessage(BaseToolMessage):
487
492
  """A widget to display rich (json/markdown) custom tool execution messages."""
488
493
 
494
+ SQL_QUERY_KEY = "query"
489
495
  tool_name: reactive[str] = reactive("")
490
496
  arguments: reactive[str] = reactive("")
491
497
 
@@ -534,6 +540,15 @@ class RichToolMessage(BaseToolMessage):
534
540
  # Not valid JSON, return as-is
535
541
  return False, output
536
542
 
543
+ def on_button_pressed(self, event: Button.Pressed) -> None:
544
+ """Handle button press events."""
545
+ if event.button.has_class("copy-button"):
546
+ arg_dict = json.loads(self.arguments)
547
+ if self.SQL_QUERY_KEY in arg_dict:
548
+ # XXX(serialx): Special case for SQL queries
549
+ query = arg_dict[self.SQL_QUERY_KEY]
550
+ self.app.copy_to_clipboard(query)
551
+
537
552
  def compose(self) -> ComposeResult:
538
553
  """Create child widgets for the rich tool message."""
539
554
  # Header line showing MCP server and tool
@@ -548,12 +563,12 @@ class RichToolMessage(BaseToolMessage):
548
563
  # Truncate arguments if too long
549
564
  max_args_length = 100
550
565
  arg_dict = json.loads(self.arguments)
551
- SQL_QUERY_KEY = "query"
552
- if SQL_QUERY_KEY in arg_dict:
566
+ if self.SQL_QUERY_KEY in arg_dict:
553
567
  # XXX(serialx): Special case for SQL queries
554
- query = arg_dict[SQL_QUERY_KEY]
568
+ query = arg_dict[self.SQL_QUERY_KEY]
569
+ yield Button("Copy", classes="copy-button", variant="primary")
555
570
  yield ExpandableMarkdown(query, language="sql", truncated_lines=8, classes="rich-output-sql")
556
- del arg_dict[SQL_QUERY_KEY]
571
+ del arg_dict[self.SQL_QUERY_KEY]
557
572
 
558
573
  display_args = arg_dict[:max_args_length] + "…" if len(arg_dict) > max_args_length else arg_dict
559
574
  yield Static(f"Args: {display_args}", classes="rich-arguments-text")
@@ -291,6 +291,29 @@ MCPToolMessage {
291
291
  RichToolMessage {
292
292
  Horizontal.rich-arguments {
293
293
  height: auto;
294
+ layers: main button;
295
+
296
+ .copy-button {
297
+ layer: button;
298
+ dock: right;
299
+ height: 1;
300
+ width: 8;
301
+ min-width: 8;
302
+ margin: 0;
303
+ padding: 0;
304
+ background: $secondary;
305
+ color: $text;
306
+ border: none;
307
+
308
+ &:hover {
309
+ background: $secondary-lighten-1;
310
+ }
311
+
312
+ &:focus {
313
+ background: $secondary-lighten-1;
314
+ text-style: bold;
315
+ }
316
+ }
294
317
 
295
318
  &> .rich-arguments-prefix {
296
319
  height: 1;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibecore
3
- Version: 0.3.0
3
+ Version: 0.6.2
4
4
  Summary: Build your own AI-powered automation tools in the terminal with this extensible agent framework
5
5
  Project-URL: Homepage, https://github.com/serialx/vibecore
6
6
  Project-URL: Repository, https://github.com/serialx/vibecore
@@ -158,7 +158,6 @@ Once vibecore is running, you can:
158
158
  ### Commands
159
159
 
160
160
  - `/help` - Show help and keyboard shortcuts
161
- - `/clear` - Clear the current session and start a new one
162
161
 
163
162
  ## Flow Mode (Experimental)
164
163
 
@@ -177,37 +176,56 @@ Flow Mode allows you to:
177
176
 
178
177
  ```python
179
178
  import asyncio
180
- from agents import Agent, Runner
181
- from vibecore.flow import flow, UserInputFunc
179
+ from agents import Agent
180
+ from vibecore.flow import Vibecore, VibecoreRunnerBase
182
181
  from vibecore.context import VibecoreContext
182
+ from vibecore.settings import settings
183
183
 
184
184
  # Define your agent with tools
185
185
  agent = Agent[VibecoreContext](
186
186
  name="Assistant",
187
187
  instructions="You are a helpful assistant",
188
188
  tools=[...], # Your tools here
189
+ model=settings.model,
189
190
  )
190
191
 
191
- # Define your conversation logic
192
- async def logic(app, ctx: VibecoreContext, user_input: UserInputFunc):
192
+ # Create Vibecore instance
193
+ vibecore = Vibecore[VibecoreContext, str]()
194
+
195
+ # Define your conversation logic with decorator
196
+ @vibecore.workflow()
197
+ async def logic(
198
+ runner: VibecoreRunnerBase[VibecoreContext, str],
199
+ ) -> str:
193
200
  # Get user input programmatically
194
- user_message = await user_input("What would you like to do?")
195
-
196
- # Process with agent
197
- result = Runner.run_streamed(
201
+ user_message = await runner.user_input("What would you like to do?")
202
+
203
+ # Print status updates
204
+ await runner.print(f"Processing: {user_message}")
205
+
206
+ # Process with agent (handles streaming automatically)
207
+ result = await runner.run_agent(
198
208
  agent,
199
209
  input=user_message,
200
- context=ctx,
201
- session=app.session,
210
+ context=runner.context,
211
+ session=runner.session,
202
212
  )
203
-
204
- # Handle the response
205
- app.current_worker = app.handle_streamed_response(result)
206
- await app.current_worker.wait()
207
213
 
208
- # Run the flow
214
+ await runner.print("Done!")
215
+ return result.final_output
216
+
217
+ # Run the flow in different modes
209
218
  async def main():
210
- await flow(agent, logic)
219
+ # Option 1: TUI mode (full terminal interface)
220
+ result = await vibecore.run_textual(shutdown=False)
221
+
222
+ # Option 2: CLI mode (simple stdin/stdout)
223
+ # result = await vibecore.run_cli()
224
+
225
+ # Option 3: Static mode (programmatic, for testing)
226
+ # result = await vibecore.run("Calculate 2+2")
227
+
228
+ print(f"Final output: {result}")
211
229
 
212
230
  if __name__ == "__main__":
213
231
  asyncio.run(main())
@@ -225,11 +243,53 @@ Flow Mode shines when building complex multi-agent systems. See `examples/custom
225
243
 
226
244
  ### Key Components
227
245
 
228
- - **`flow()`**: Entry point that sets up the Vibecore app with your custom logic
229
- - **`logic()`**: Your async function that controls the conversation flow
230
- - **`UserInputFunc`**: Provides programmatic user input collection
231
- - **`VibecoreContext`**: Shared state across tools and agents
232
- - **Agent Handoffs**: Transfer control between specialized agents
246
+ - **`Vibecore` class**: Main entry point that orchestrates your workflow
247
+ - **`@vibecore.workflow()` decorator**: Defines your conversation logic function
248
+ - **Runner argument**: Every workflow receives a runner instance for user input, printing, and agent execution
249
+ - **`runner.user_input()`**: Programmatically collect user input
250
+ - **`runner.print()`**: Display status messages to the user
251
+ - **`runner.run_agent()`**: Execute agent with automatic streaming handling
252
+ - **`runner.context`**: Shared state (VibecoreContext) across tools and agents
253
+ - **`runner.session`**: Conversation history and persistence
254
+ - **Multiple execution modes**:
255
+ - `run_textual()`: Full TUI with streaming (original behavior)
256
+ - `run_cli()`: Simple CLI with stdin/stdout
257
+ - `run()`: Static mode with predefined inputs (perfect for testing)
258
+ - **Agent Handoffs**: Transfer control between specialized agents with context preservation
259
+
260
+ > 🛠️ Upgrading from an older release? Read the [Runner Migration Guide](docs/runner_migration.md) for step-by-step instructions.
261
+
262
+ ### Multi-Mode Execution
263
+
264
+ One of vibecore's key strengths is the ability to run the **same workflow code** in different execution modes without modification:
265
+
266
+ #### TUI Mode (Textual User Interface)
267
+ Full-featured terminal interface with streaming responses, tool visualization, and interactive controls:
268
+ ```python
269
+ result = await vibecore.run_textual(shutdown=False)
270
+ ```
271
+
272
+ #### CLI Mode (Command-Line Interface)
273
+ Simple stdin/stdout interaction for scripting and automation:
274
+ ```python
275
+ result = await vibecore.run_cli()
276
+ ```
277
+
278
+ #### Static Mode (Programmatic)
279
+ Execute with predefined inputs, perfect for testing and batch processing:
280
+ ```python
281
+ # Single input
282
+ result = await vibecore.run("Calculate 2+2")
283
+
284
+ # Multiple inputs (for multi-turn workflows)
285
+ result = await vibecore.run(["First query", "Follow-up", "Final question"])
286
+ ```
287
+
288
+ This unified interface means you can:
289
+ - **Develop once, deploy anywhere**: Write your workflow logic once and run it in any mode
290
+ - **Test easily**: Use static mode for automated testing with predefined inputs
291
+ - **Choose the right interface**: TUI for development, CLI for scripts, static for tests
292
+ - **Extend to new modes**: Add custom runners (HTTP API, Discord bot, etc.) by implementing the runner interface
233
293
 
234
294
  ### Use Cases
235
295
 
@@ -414,10 +474,37 @@ uv run ruff check . && uv run ruff format --check . && uv run pyright . && uv ru
414
474
 
415
475
  ## Configuration
416
476
 
417
- ### Reasoning Effort
477
+ ### Path Confinement (Security)
478
+
479
+ vibecore includes a path confinement system that restricts file and shell operations to specified directories for enhanced security. This prevents agents from accessing sensitive system files or directories outside your project.
480
+
481
+ #### Configuration Options
482
+
483
+ ```yaml
484
+ # config.yaml
485
+ path_confinement:
486
+ enabled: true # Enable/disable path confinement (default: true)
487
+ allowed_directories: # List of allowed directories (default: [current working directory])
488
+ - /home/user/projects
489
+ - /tmp
490
+ allow_home: false # Allow access to user's home directory (default: false)
491
+ allow_temp: true # Allow access to system temp directory (default: true)
492
+ strict_mode: false # Strict validation mode (default: false)
493
+ ```
494
+
495
+ Or via environment variables:
496
+ ```bash
497
+ export VIBECORE_PATH_CONFINEMENT__ENABLED=true
498
+ export VIBECORE_PATH_CONFINEMENT__ALLOWED_DIRECTORIES='["/home/user/projects", "/tmp"]'
499
+ export VIBECORE_PATH_CONFINEMENT__ALLOW_HOME=false
500
+ export VIBECORE_PATH_CONFINEMENT__ALLOW_TEMP=true
501
+ ```
418
502
 
419
- - Set default via env var: `VIBECORE_REASONING_EFFORT` (minimal | low | medium | high)
420
- - Keyword triggers: `think` low, `think hard` → medium, `ultrathink` → high
503
+ When enabled, the path confinement system:
504
+ - Validates all file read/write/edit operations
505
+ - Checks paths in shell commands before execution
506
+ - Resolves symlinks to prevent escapes
507
+ - Blocks access to files outside allowed directories
421
508
 
422
509
  ### Environment Variables
423
510
 
@@ -475,9 +562,15 @@ vibecore is built with a modular, extensible architecture:
475
562
 
476
563
  ## Recent Updates
477
564
 
478
- - **Reasoning View**: New ReasoningMessage widget with live reasoning summaries during streaming
565
+ - **Flow Mode Refactor (v0.5.0)**: Complete redesign with multi-mode execution support
566
+ - New `Vibecore` class with decorator-based workflow definition
567
+ - Unified interface: `user_input()`, `print()`, `run_agent()`
568
+ - Three execution modes: TUI, CLI, and static (perfect for testing)
569
+ - Cleaner API with less boilerplate and better type safety
570
+ - **Path Confinement**: Security feature to restrict file and shell operations to specified directories
571
+ - **Reasoning View**: ReasoningMessage widget with live reasoning summaries during streaming
479
572
  - **Context Usage Bar & CWD**: Footer shows token usage progress and current working directory
480
- - **Keyboard & Commands**: Ctrl+Shift+D toggles theme, Esc cancels, Ctrl+D double-press to exit, `/help` and `/clear` commands
573
+ - **Keyboard & Commands**: Ctrl+Shift+D toggles theme, Esc cancels, Ctrl+D double-press to exit, `/help` command
481
574
  - **MCP Tool Output**: Improved rendering with Markdown and JSON prettification
482
575
  - **MCP Support**: Full integration with Model Context Protocol for external tool connections
483
576
  - **Print Mode**: `-p` flag to print response and exit for pipes/automation
@@ -487,7 +580,7 @@ vibecore is built with a modular, extensible architecture:
487
580
  - [x] More custom tool views (Python, Read, Todo widgets)
488
581
  - [x] Automation (vibecore -p "prompt")
489
582
  - [x] MCP (Model Context Protocol) support
490
- - [ ] Permission model
583
+ - [x] Path confinement for security
491
584
  - [ ] Multi-agent system (agent-as-tools)
492
585
  - [ ] Plugin system for custom tools
493
586
  - [ ] Automated workflow
@@ -1,14 +1,14 @@
1
1
  vibecore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- vibecore/cli.py,sha256=HU2cjvEDzMWlauoArUItBlTpsVAdgVuKFMLshtaqvUE,7119
3
- vibecore/context.py,sha256=JUVkZpmKGUSlcchrHpxu-oSO8D21GDgHT1BXDzZDTeQ,844
4
- vibecore/flow.py,sha256=ZaKzMsz4YBvgelVzJOIHnTJzMWTmvkfvudwW_hllq6U,3384
5
- vibecore/main.py,sha256=MIn7Mpg_xO_20c6Mju8PgY-MmVCTER9cepHd5YFbtYs,20175
2
+ vibecore/cli.py,sha256=_nYqGoj-ZvNYLEGVIP82htbvF4O-GwmhoISmmVVBegI,8473
3
+ vibecore/context.py,sha256=mfm3IBTnnoyfL3jDisr_B-z_44eanmXw6Lqz3tXw8Vg,3045
4
+ vibecore/flow.py,sha256=beN1kgd4krhMoPia0m_ygveXX0JCw1K2LB05rh4syfU,13071
5
+ vibecore/main.py,sha256=H_IyI6YyiXZLgM127Mhe_zY4nbHNA3TqsK_8sxJoaD8,12832
6
6
  vibecore/main.tcss,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  vibecore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- vibecore/settings.py,sha256=PwivzoJ-xyJu-Mmnv4E6G_E8up4GNvvz9_j4ttj-GUw,7063
9
- vibecore/agents/default.py,sha256=wxeP3Hsq9MVBChyMF_sNkVHCtFFXgy5ghDIxy9eH_fQ,2287
8
+ vibecore/settings.py,sha256=0hugs44VOKB47ysmkJ1BqZnfR8-Lvm_8OmEt3VTUjak,8471
9
+ vibecore/agents/default.py,sha256=LTMZcDzzl4s8B4QeqF6EY2TqP3El-LuuaQuGrt3ytSk,2299
10
10
  vibecore/agents/prompts.py,sha256=0oO9QzcytIbzgZcKJQjWD9fSRNQqBqqK5ku0fcYZZrA,324
11
- vibecore/agents/task.py,sha256=cdhZDzKDA8eHHNYPhogFIKBms3oVAMvYeiBB2GqYNuE,1898
11
+ vibecore/agents/task.py,sha256=jtYurlSHcSmPz0oRGDmBDUqD0F4HZznBm8wNd8Xj6IA,1910
12
12
  vibecore/auth/__init__.py,sha256=lFxAcdjXpmCjU2tWBnej3fyUqJKSc41qHLF8929nMRM,451
13
13
  vibecore/auth/config.py,sha256=xEuChq61dygaDGhpOA9kK3VSximL42Usd-xBOY2XMpw,1650
14
14
  vibecore/auth/interceptor.py,sha256=KsMbnTi8DDVDnwiC1YT4APjcpvpIVQK3kMSS28wizNs,5127
@@ -19,7 +19,7 @@ vibecore/auth/pkce.py,sha256=YMQxddItPqUyy1pkKfYPNWIahWhIUVWL7vPFsQQvb7M,956
19
19
  vibecore/auth/storage.py,sha256=dWSDi4thRHHrSTJmAOInOdArTGQ_t0EdWHrk4Am8LWg,3495
20
20
  vibecore/auth/token_manager.py,sha256=Dwd0EkbBVeoIef7K6RW4QzaS7-6HAM-or0Ra4M1xddg,4611
21
21
  vibecore/handlers/__init__.py,sha256=pFogA2n3GeIi4lmlUEU5jFprNNOaA6AWRR8Wc9X-P4Y,148
22
- vibecore/handlers/stream_handler.py,sha256=e4VJOJcH84QmgKkGjOedwd85EZWmmvipmJpGuDBSPhA,11069
22
+ vibecore/handlers/stream_handler.py,sha256=pD0hk0cFDwAAh6wstBKwKx7WHgvatmVoZqeiVOt-2uc,10029
23
23
  vibecore/mcp/__init__.py,sha256=sl2_8pWjPx4TotO0ZojunVA6Jn6yOhbTQNbQG9-C-Jc,199
24
24
  vibecore/mcp/manager.py,sha256=RRpoFUiQjSg0-h9M7sF3odaSM7LURwrxVlaae5Yml3M,5644
25
25
  vibecore/mcp/server_wrapper.py,sha256=CkTyqZzmy7oeciSml0Q915orho_U2XcHoqhDVMOq7nY,3989
@@ -29,57 +29,60 @@ vibecore/models/anthropic_auth.py,sha256=_hRGbPHTs6IrkSc5mDI7mshdOZYCyqu82HX9WdQ
29
29
  vibecore/prompts/common_system_prompt.txt,sha256=L-YlOfTJSQLtVg6d0r9lcD5FrgOLzoSWjGzVfQjcDBg,4916
30
30
  vibecore/session/__init__.py,sha256=FXbtw8DZVBw8e3qCA2cQharMzozblhwA0yU4U0JRSkM,121
31
31
  vibecore/session/file_lock.py,sha256=vCuDdfaOGDeVpTjJP6yBJx7onIT7JkkAeAuWAtuLJb8,3739
32
- vibecore/session/jsonl_session.py,sha256=vWITGBugf5ZDkI00abwsD_lyi6LwHYXzX9JrwavS9hE,8734
33
- vibecore/session/loader.py,sha256=vmDwzjtedFEeWhaFa6HbygjL32-bSNXM6KccQC9hyJs,6880
32
+ vibecore/session/jsonl_session.py,sha256=hS03fbgPzKEKdUesdg_8OHCoD1nnMFjHe54K2Psh3SY,8771
33
+ vibecore/session/loader.py,sha256=HTQDXW9kcw9eBWu7zN34jvRstXlKejyGE6ZoR6ux3Go,6846
34
34
  vibecore/session/path_utils.py,sha256=_meng4PnOR59ekPWp_WICkt8yVkokt8c6oePZvk3m-4,2544
35
35
  vibecore/tools/__init__.py,sha256=nppfKiflvkQRUotBrj9nFU0veWex1DE_YX1fg67SRlw,37
36
36
  vibecore/tools/base.py,sha256=POI1bM89qDWlQ5VfcdUFoIg_Tv5Rlrd6sQTRLj-4YmQ,658
37
+ vibecore/tools/path_validator.py,sha256=3Dob33-A6aNy92UeFAEEQME10V_P4N6ZODf7o5H6fYU,8566
37
38
  vibecore/tools/file/__init__.py,sha256=EhdebEC6JTaiROkpItoJWK2lGEq2B5ReNL_IRqxZX5w,147
38
- vibecore/tools/file/executor.py,sha256=xCHaER8_WVRGSLtfSiYF8M5CNkgB26VaeUbesyD2nuU,10236
39
- vibecore/tools/file/tools.py,sha256=CUl9c78WioC3hkw9GD7vSR-YGJBjVnWpHaPTMdKoo5k,8325
39
+ vibecore/tools/file/executor.py,sha256=2r4r7Q-_2POkxfHHAA2dCo4bEU9c6TtfgBOIIJaV6HU,12136
40
+ vibecore/tools/file/tools.py,sha256=6mwrQNkW7njjqdv_MqHHRwvMFPxELi27QJaUK9n9FP8,8370
40
41
  vibecore/tools/file/utils.py,sha256=0Gef8HZgq520pqYgsF8n4cL9FNtzA7nYEr8bBCZVnro,2356
41
42
  vibecore/tools/python/__init__.py,sha256=bqSKgP2pY3bArCmQxOsWFflfmASq3SybOlrmZiz9y4s,35
42
- vibecore/tools/python/helpers.py,sha256=y-qwCQ4aRMVUZU6F9OpjgrbzsIGn8i16idXEWR5MBNU,2918
43
+ vibecore/tools/python/helpers.py,sha256=NlGzDHseubLsEGVnyU2fAtCeb_nKh9vzEicOlQeWzlY,2922
43
44
  vibecore/tools/python/manager.py,sha256=5r7RAqJL7FAIf3xBNqsr-T_La2XHd3KIy5olubuBRZ4,7502
44
- vibecore/tools/python/tools.py,sha256=OBz9csUUk90Pq3QwHEkz49NcJhgK-3MhaCeCd-mGPOM,917
45
+ vibecore/tools/python/tools.py,sha256=xSPPLbNh7rDmF0Oo6_77I_Q_1zsxyqq5ztELynIxHmg,921
45
46
  vibecore/tools/python/backends/__init__.py,sha256=RTfU7AzlVyDSaldfVNdKAgv4759RQAl07-UFGqc70Oo,50
46
47
  vibecore/tools/python/backends/terminal_backend.py,sha256=3PA4haJN-dyIvnudx6qfx58ThjaeT7DULnCvhacADbw,1908
47
48
  vibecore/tools/shell/__init__.py,sha256=Ias6qmBMDK29q528VtUGtCQeYD4RU_Yx73SIAJrB8No,133
48
- vibecore/tools/shell/executor.py,sha256=yXUkbPqLc3anlsLUB_g4yEu1A_QpzfzwsoMAqx-gplA,6933
49
- vibecore/tools/shell/tools.py,sha256=hpftFrv4JWn7mbYLJwpCPLROTFyj-RiAOg1hyecV0bE,6829
49
+ vibecore/tools/shell/executor.py,sha256=vVWZ2jk_TAAkgbOQV0FuC2xzTdeOtdWOqj60bxAOAj4,9358
50
+ vibecore/tools/shell/tools.py,sha256=D_w9m8W1jJjeEnv3t8yie_SXd1Ce1wAtU8dW8xwVAOY,6874
50
51
  vibecore/tools/task/__init__.py,sha256=Fyw33zGiBArMnPuRMm7qwSYE6ZRPCZVbHK6eIUJDiJY,112
51
- vibecore/tools/task/executor.py,sha256=gRIdq0f2gjDKxnWH-b5Rbmk1H2garIs56EDYFVKfUiw,1606
52
- vibecore/tools/task/tools.py,sha256=m6MBOQC3Pz07TZgd3lVAHPGQu9M-Ted-YOxQvIPrGvo,2257
52
+ vibecore/tools/task/executor.py,sha256=Q7rNmPb38CcOrMvPJnxERZc3S4ryti_T_f-yRpA1Ivc,1614
53
+ vibecore/tools/task/tools.py,sha256=uAIAVkcIWmIolpGo9LlS_2CacWmxuWvp5rKwijvwZC0,2265
53
54
  vibecore/tools/todo/__init__.py,sha256=67o76OyzqYKBH461R9H2-rkNx7ZK6tRSydca3GjqKh8,29
54
- vibecore/tools/todo/manager.py,sha256=COcVMX8sm--dtqXo0L7914krJMEcK6P2Va4OJiVroBg,871
55
- vibecore/tools/todo/models.py,sha256=gSheOpIP8NJf44X1JNwvbJQNsyrkfzP3LxrP_9rXzYw,634
56
- vibecore/tools/todo/tools.py,sha256=kbWXOMu5_xiMdWelxtbh6qS3yBomkveyOFlBcaJKcSY,5121
55
+ vibecore/tools/todo/manager.py,sha256=-kww4y57BUFbnKI2eWo44CC1fDNX_UcSm76GwCwL3do,624
56
+ vibecore/tools/todo/models.py,sha256=qikR5S4VmwkvYTWxhlBxRxXgri5YitZ6hVdRrRySRAk,503
57
+ vibecore/tools/todo/tools.py,sha256=KhGZ5LaDPfR4OGUWVNCokIN1VCHgrZ0nsA7sDoRzVI0,5176
57
58
  vibecore/tools/webfetch/__init__.py,sha256=fKfht3oiz-wMNgtukQjYIUcUC4y7g3GLKK7QXHl0Mcg,224
58
59
  vibecore/tools/webfetch/executor.py,sha256=DFjnHgAvDPuwP5h4fgXM2JH270TgF4Vux7ndmZLs9BI,4912
59
60
  vibecore/tools/webfetch/models.py,sha256=YvGR4i8Mi7gygCJe7-VPyrvbgacBUJ1PLHyCmOQPmuU,694
60
- vibecore/tools/webfetch/tools.py,sha256=PWt8hBPD02ua2d9ZnDVfqtNVzachtIPB9QPStbkYY2Y,1494
61
+ vibecore/tools/webfetch/tools.py,sha256=X1uvJLD-7mA1ewZcmYI-MhTNuKcAELEdcF3UDY6g73s,1384
61
62
  vibecore/tools/websearch/__init__.py,sha256=xl3aPD-pOt0Ya4L8khMbOfqpcCpkWTy2-KVk2hUxnOU,97
62
63
  vibecore/tools/websearch/base.py,sha256=El9Mx6MFWM3CKGG8MPbPIKgRjdbNZtylFALsPCUTPFs,596
63
64
  vibecore/tools/websearch/executor.py,sha256=CLwFkPSDzllH7J1hNdjsp5L0SDLqoINlOSl-zoQKs2A,1114
64
65
  vibecore/tools/websearch/models.py,sha256=5cwDw9dWLZ6krP_khx1euwsHjSYLIE4_hNefkjzrkWE,749
65
- vibecore/tools/websearch/tools.py,sha256=leDf9nmvl8577TMrj7MTodYFx1vyXiIPDral0yzEYm8,1734
66
+ vibecore/tools/websearch/tools.py,sha256=1sk6q1ivUIk2rUfojYdHP5gHy7ONH3zxi1v2wHKZGWc,1624
66
67
  vibecore/tools/websearch/ddgs/__init__.py,sha256=XwZ7As5mVqxXz69In96L3TDChPhpc8GnZR72LgdBvX4,113
67
- vibecore/tools/websearch/ddgs/backend.py,sha256=HHcckGFoPaFGYSl4k5UH6PURgF1sk8zYWSWVEYeAEtI,1959
68
+ vibecore/tools/websearch/ddgs/backend.py,sha256=RACegeJkfqmbQbPKD8hBh3vIAIV6LnSWRaP7ZKQDAX0,1975
68
69
  vibecore/utils/__init__.py,sha256=KIS8TkfaDZ1AclSstkYcG8DvJPNsJNOE4EL4zHJE2k4,112
69
70
  vibecore/utils/text.py,sha256=RLVFrVsD5L7xi68JTgSa0PeN9S32faqIiaF79dNCyTM,978
70
- vibecore/widgets/core.py,sha256=ZIdHBvfIaAXaBhA2X3EUkDlL2pN4l5j5Kc_E-VCsM3g,12068
71
+ vibecore/widgets/core.py,sha256=1ecAGcdSkDpnaZokLmWTF1Jm44q8ZLAsA3ras8ywEmo,11246
71
72
  vibecore/widgets/core.tcss,sha256=fgjEv_3G_dAMwmWsaz4Uz-lXQzpN5oLSxeRYU4ygnDY,1016
72
73
  vibecore/widgets/expandable.py,sha256=GIcXXzVGr4BdyATphUrHZqB30DF_WgeyrccjEIf7FWc,5603
73
74
  vibecore/widgets/expandable.tcss,sha256=zmm5zDDabvXiePwwsuSGLPkxHUYunEjmwkp5XrTjxSw,1343
75
+ vibecore/widgets/feedback.py,sha256=LOlUB8pUkV7e2Iuh8WQlrxA2AkkHDQTCauCs2NwZRZM,6843
76
+ vibecore/widgets/feedback.tcss,sha256=dFS9VziCB-iCuKV8rT1ejRSyxY__Sx4IE5bCjNeNTVA,2497
74
77
  vibecore/widgets/info.py,sha256=hXtsRUOE13oHbIm9FNe1GCUX_FCht28pgT9SQWeJ69I,1567
75
78
  vibecore/widgets/info.tcss,sha256=v30IqNt1two-ezIcm18ZEInKRKcRkAW-h-UH2r8QzSo,201
76
- vibecore/widgets/messages.py,sha256=az4fJtdk3ItSoFZBG_adRDUHdTLttIV8F23E8LOb-mg,8156
77
- vibecore/widgets/messages.tcss,sha256=WtBbjf5LgFkUhzhVlxJB7NMbagWladJawDizvDm7hBE,1271
79
+ vibecore/widgets/messages.py,sha256=ccSCSwOyluUkG2Jmbvs91bcSq20cMQQCkiSjKu78Lj8,9210
80
+ vibecore/widgets/messages.tcss,sha256=Dhz6X1Fkj2XN9bVGVH_hBelDF7WXNE6hHMkGQRQy1QA,1911
78
81
  vibecore/widgets/tool_message_factory.py,sha256=yrZorT4HKo5b6rWUc0dgQle7q7cvLyq8JllE772RZS0,5730
79
- vibecore/widgets/tool_messages.py,sha256=04YwMHOLpyv5LExlHiCeWSQPruhGv8WnhrpCX1aJHsI,28911
80
- vibecore/widgets/tool_messages.tcss,sha256=pJJw5hghLfjD1f5R9EuzglkS7ro5t8iY_EeZyrJ85Zw,7889
81
- vibecore-0.3.0.dist-info/METADATA,sha256=6BPn9QtWSZSx28biogmQyQnzARFA2ocmtoF24jOoxkQ,18093
82
- vibecore-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
- vibecore-0.3.0.dist-info/entry_points.txt,sha256=i9mOKvpz07ciV_YYisxNCYZ53_Crjkn9mciiQ3aA6QM,51
84
- vibecore-0.3.0.dist-info/licenses/LICENSE,sha256=KXxxifvrcreHrZ4aOYgP-vA8DRHHueW389KKOeEbtjc,1069
85
- vibecore-0.3.0.dist-info/RECORD,,
82
+ vibecore/widgets/tool_messages.py,sha256=JnfcfGq-r9R69B2wALWtfqH1Rd2AdUsrYRd2N6xmM_I,29636
83
+ vibecore/widgets/tool_messages.tcss,sha256=gdChmHClURqn_sD9GkcOGQcQVYvUUl75mLUYp85sKz8,8442
84
+ vibecore-0.6.2.dist-info/METADATA,sha256=Ex4tMCX3m6t01qy_GT2XrRcg0xt2HKP-f4PsfaQYevE,22141
85
+ vibecore-0.6.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
86
+ vibecore-0.6.2.dist-info/entry_points.txt,sha256=i9mOKvpz07ciV_YYisxNCYZ53_Crjkn9mciiQ3aA6QM,51
87
+ vibecore-0.6.2.dist-info/licenses/LICENSE,sha256=KXxxifvrcreHrZ4aOYgP-vA8DRHHueW389KKOeEbtjc,1069
88
+ vibecore-0.6.2.dist-info/RECORD,,