vibecore 0.2.0a1__py3-none-any.whl → 0.3.0b2__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 vibecore might be problematic. Click here for more details.

Files changed (38) hide show
  1. vibecore/agents/default.py +6 -11
  2. vibecore/agents/{task_agent.py → task.py} +2 -6
  3. vibecore/auth/__init__.py +15 -0
  4. vibecore/auth/config.py +38 -0
  5. vibecore/auth/interceptor.py +141 -0
  6. vibecore/auth/manager.py +173 -0
  7. vibecore/auth/models.py +54 -0
  8. vibecore/auth/oauth_flow.py +129 -0
  9. vibecore/auth/pkce.py +29 -0
  10. vibecore/auth/storage.py +111 -0
  11. vibecore/auth/token_manager.py +131 -0
  12. vibecore/cli.py +117 -9
  13. vibecore/flow.py +105 -0
  14. vibecore/handlers/stream_handler.py +11 -0
  15. vibecore/main.py +28 -6
  16. vibecore/models/anthropic_auth.py +226 -0
  17. vibecore/settings.py +56 -5
  18. vibecore/tools/task/executor.py +1 -1
  19. vibecore/tools/webfetch/__init__.py +7 -0
  20. vibecore/tools/webfetch/executor.py +127 -0
  21. vibecore/tools/webfetch/models.py +22 -0
  22. vibecore/tools/webfetch/tools.py +46 -0
  23. vibecore/tools/websearch/__init__.py +5 -0
  24. vibecore/tools/websearch/base.py +27 -0
  25. vibecore/tools/websearch/ddgs/__init__.py +5 -0
  26. vibecore/tools/websearch/ddgs/backend.py +64 -0
  27. vibecore/tools/websearch/executor.py +43 -0
  28. vibecore/tools/websearch/models.py +20 -0
  29. vibecore/tools/websearch/tools.py +49 -0
  30. vibecore/widgets/tool_message_factory.py +16 -0
  31. vibecore/widgets/tool_messages.py +117 -0
  32. vibecore/widgets/tool_messages.tcss +48 -0
  33. {vibecore-0.2.0a1.dist-info → vibecore-0.3.0b2.dist-info}/METADATA +107 -1
  34. {vibecore-0.2.0a1.dist-info → vibecore-0.3.0b2.dist-info}/RECORD +37 -15
  35. vibecore-0.3.0b2.dist-info/entry_points.txt +2 -0
  36. vibecore-0.2.0a1.dist-info/entry_points.txt +0 -2
  37. {vibecore-0.2.0a1.dist-info → vibecore-0.3.0b2.dist-info}/WHEEL +0 -0
  38. {vibecore-0.2.0a1.dist-info → vibecore-0.3.0b2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,43 @@
1
+ """Websearch execution logic with backend selection."""
2
+
3
+ from .base import WebSearchBackend
4
+ from .ddgs import DDGSBackend
5
+ from .models import SearchParams
6
+
7
+ # Default backend
8
+ _default_backend: WebSearchBackend = DDGSBackend()
9
+
10
+
11
+ def set_default_backend(backend: WebSearchBackend) -> None:
12
+ """Set the default search backend.
13
+
14
+ Args:
15
+ backend: The backend to use for searches
16
+ """
17
+ global _default_backend
18
+ _default_backend = backend
19
+
20
+
21
+ def get_default_backend() -> WebSearchBackend:
22
+ """Get the current default search backend.
23
+
24
+ Returns:
25
+ The current default backend
26
+ """
27
+ return _default_backend
28
+
29
+
30
+ async def perform_websearch(params: SearchParams, backend: WebSearchBackend | None = None) -> str:
31
+ """Perform a web search using the specified or default backend.
32
+
33
+ Args:
34
+ params: Search parameters
35
+ backend: Optional specific backend to use (defaults to default backend)
36
+
37
+ Returns:
38
+ JSON string containing search results or error message
39
+ """
40
+ if backend is None:
41
+ backend = _default_backend
42
+
43
+ return await backend.search(params)
@@ -0,0 +1,20 @@
1
+ """Models for websearch tool."""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class SearchResult(BaseModel):
7
+ """A single search result."""
8
+
9
+ title: str = Field(description="Title of the search result")
10
+ href: str = Field(description="URL of the search result")
11
+ body: str = Field(description="Description/snippet of the result")
12
+
13
+
14
+ class SearchParams(BaseModel):
15
+ """Parameters for web search."""
16
+
17
+ query: str = Field(description="Search query")
18
+ max_results: int = Field(default=5, description="Maximum number of results to return")
19
+ region: str | None = Field(default=None, description="Region code (e.g., 'us-en')")
20
+ safesearch: str = Field(default="moderate", description="SafeSearch setting: 'on', 'moderate', or 'off'")
@@ -0,0 +1,49 @@
1
+ """Websearch tool for Vibecore agents."""
2
+
3
+ from agents import RunContextWrapper, function_tool
4
+
5
+ from vibecore.context import VibecoreContext
6
+
7
+ from .executor import perform_websearch
8
+ from .models import SearchParams
9
+
10
+
11
+ @function_tool
12
+ async def websearch(
13
+ ctx: RunContextWrapper[VibecoreContext],
14
+ query: str,
15
+ max_results: int = 5,
16
+ region: str | None = None,
17
+ safesearch: str = "moderate",
18
+ ) -> str:
19
+ """Search the web for information using DuckDuckGo.
20
+
21
+ This tool allows you to search the web for current information, news, and general knowledge.
22
+ It supports advanced search operators like quotes for exact phrases, minus for exclusions,
23
+ site: for specific domains, and filetype: for specific file types.
24
+
25
+ Args:
26
+ ctx: The run context wrapper
27
+ query: The search query (supports advanced operators like "exact phrase", -exclude, site:example.com)
28
+ max_results: Maximum number of results to return (default: 5)
29
+ region: Optional region code for localized results (e.g., 'us-en' for US English)
30
+ safesearch: SafeSearch filter level ('on', 'moderate', or 'off', default: 'moderate')
31
+
32
+ Returns:
33
+ JSON string containing search results with title, URL, and snippet for each result
34
+
35
+ Examples:
36
+ - Basic search: query="python programming"
37
+ - Exact phrase: query='"machine learning algorithms"'
38
+ - Exclude terms: query="python -javascript"
39
+ - Site-specific: query="AI site:github.com"
40
+ - File type: query="climate change filetype:pdf"
41
+ """
42
+ params = SearchParams(
43
+ query=query,
44
+ max_results=max_results,
45
+ region=region,
46
+ safesearch=safesearch,
47
+ )
48
+
49
+ return await perform_websearch(params)
@@ -18,6 +18,8 @@ from vibecore.widgets.tool_messages import (
18
18
  TaskToolMessage,
19
19
  TodoWriteToolMessage,
20
20
  ToolMessage,
21
+ WebFetchToolMessage,
22
+ WebSearchToolMessage,
21
23
  WriteToolMessage,
22
24
  )
23
25
 
@@ -113,6 +115,20 @@ def create_tool_message(
113
115
  else:
114
116
  return WriteToolMessage(file_path=file_path, content=content, status=status)
115
117
 
118
+ elif tool_name == "websearch":
119
+ query = args_dict.get("query", "") if args_dict else ""
120
+ if output is not None:
121
+ return WebSearchToolMessage(query=query, output=output, status=status)
122
+ else:
123
+ return WebSearchToolMessage(query=query, status=status)
124
+
125
+ elif tool_name == "webfetch":
126
+ url = args_dict.get("url", "") if args_dict else ""
127
+ if output is not None:
128
+ return WebFetchToolMessage(url=url, output=output, status=status)
129
+ else:
130
+ return WebFetchToolMessage(url=url, status=status)
131
+
116
132
  # Default to generic ToolMessage for all other tools
117
133
  else:
118
134
  if output is not None:
@@ -481,3 +481,120 @@ class MCPToolMessage(BaseToolMessage):
481
481
  yield ExpandableMarkdown(
482
482
  processed_output, language="", truncated_lines=5, classes="mcp-output-markdown"
483
483
  )
484
+
485
+
486
+ class WebSearchToolMessage(BaseToolMessage):
487
+ """A widget to display web search results."""
488
+
489
+ search_query: reactive[str] = reactive("")
490
+
491
+ def __init__(self, query: str, output: str = "", status: MessageStatus = MessageStatus.EXECUTING, **kwargs) -> None:
492
+ """
493
+ Construct a WebSearchToolMessage.
494
+
495
+ Args:
496
+ query: The search query.
497
+ output: The search results as JSON string (optional, can be set later).
498
+ status: The status of execution.
499
+ **kwargs: Additional keyword arguments for Widget.
500
+ """
501
+ super().__init__(status=status, **kwargs)
502
+ self.search_query = query
503
+ self.output = output
504
+
505
+ def compose(self) -> ComposeResult:
506
+ """Create child widgets for the search message."""
507
+ # Header line
508
+ header = f"WebSearch({self.search_query})"
509
+ yield MessageHeader("⏺", header, status=self.status)
510
+
511
+ # Process and display search results
512
+ if self.output:
513
+ try:
514
+ result_data = json.loads(self.output)
515
+ if result_data.get("success") and result_data.get("results"):
516
+ with Horizontal(classes="tool-output"):
517
+ yield Static("└─", classes="tool-output-prefix")
518
+ with Vertical(classes="tool-output-content"):
519
+ # Format results as markdown
520
+ markdown_results = []
521
+ for i, result in enumerate(result_data["results"], 1):
522
+ title = result.get("title", "No title")
523
+ href = result.get("href", "")
524
+ body = result.get("body", "")
525
+
526
+ # Format each result
527
+ result_md = f"**{i}. [{title}]({href})**"
528
+ if body:
529
+ # Truncate body if too long
530
+ max_body_length = 200
531
+ if len(body) > max_body_length:
532
+ body = body[:max_body_length] + "..."
533
+ result_md += f"\n {body}"
534
+ if href:
535
+ result_md += f"\n 🔗 {href}"
536
+
537
+ markdown_results.append(result_md)
538
+
539
+ # Join all results with spacing
540
+ all_results = "\n\n".join(markdown_results)
541
+
542
+ # Add result count message
543
+ count_msg = result_data.get("message", "")
544
+ if count_msg:
545
+ all_results = f"_{count_msg}_\n\n{all_results}"
546
+
547
+ yield ExpandableMarkdown(
548
+ all_results, language="", truncated_lines=10, classes="websearch-results"
549
+ )
550
+ else:
551
+ # No results or error
552
+ with Horizontal(classes="tool-output"):
553
+ yield Static("└─", classes="tool-output-prefix")
554
+ with Vertical(classes="tool-output-content"):
555
+ message = result_data.get("message", "No results found")
556
+ yield Static(message, classes="websearch-no-results")
557
+ except (json.JSONDecodeError, KeyError, TypeError):
558
+ # Fallback to raw output if JSON parsing fails
559
+ yield from self._render_output(self.output, truncated_lines=5)
560
+
561
+
562
+ class WebFetchToolMessage(BaseToolMessage):
563
+ """A widget to display fetched web content."""
564
+
565
+ fetch_url: reactive[str] = reactive("")
566
+
567
+ def __init__(self, url: str, output: str = "", status: MessageStatus = MessageStatus.EXECUTING, **kwargs) -> None:
568
+ """
569
+ Construct a WebFetchToolMessage.
570
+
571
+ Args:
572
+ url: The URL that was fetched.
573
+ output: The fetched content as Markdown (optional, can be set later).
574
+ status: The status of execution.
575
+ **kwargs: Additional keyword arguments for Widget.
576
+ """
577
+ super().__init__(status=status, **kwargs)
578
+ self.fetch_url = url
579
+ self.output = output
580
+
581
+ def compose(self) -> ComposeResult:
582
+ """Create child widgets for the fetch message."""
583
+ # Header line
584
+ header = f"WebFetch({self.fetch_url})"
585
+ yield MessageHeader("⏺", header, status=self.status)
586
+
587
+ # Display fetched content
588
+ if self.output:
589
+ with Horizontal(classes="tool-output"):
590
+ yield Static("└─", classes="tool-output-prefix")
591
+ with Vertical(classes="tool-output-content"):
592
+ # Check if it's an error message
593
+ if self.output.startswith("Error:"):
594
+ yield Static(self.output, classes="webfetch-error")
595
+ else:
596
+ # Display as expandable markdown content
597
+ # Default to showing first 15 lines since web content can be long
598
+ yield ExpandableMarkdown(
599
+ self.output, language="", truncated_lines=15, classes="webfetch-content"
600
+ )
@@ -286,4 +286,52 @@ MCPToolMessage {
286
286
  width: 1fr;
287
287
  }
288
288
  }
289
+ }
290
+
291
+ WebSearchToolMessage {
292
+ Horizontal.tool-output {
293
+ height: auto;
294
+
295
+ &> .tool-output-prefix {
296
+ height: 1;
297
+ width: 5;
298
+ padding-left: 2;
299
+ padding-right: 1;
300
+ }
301
+
302
+ &> Vertical.tool-output-content {
303
+ height: auto;
304
+
305
+ &> .tool-output-content {
306
+ # color: $text-muted;
307
+ }
308
+
309
+ &> .tool-output-content-more {
310
+ }
311
+ }
312
+ }
313
+ }
314
+
315
+ WebFetchToolMessage {
316
+ Horizontal.tool-output {
317
+ height: auto;
318
+
319
+ &> .tool-output-prefix {
320
+ height: 1;
321
+ width: 5;
322
+ padding-left: 2;
323
+ padding-right: 1;
324
+ }
325
+
326
+ &> Vertical.tool-output-content {
327
+ height: auto;
328
+
329
+ &> .tool-output-content {
330
+ # color: $text-muted;
331
+ }
332
+
333
+ &> .tool-output-content-more {
334
+ }
335
+ }
336
+ }
289
337
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibecore
3
- Version: 0.2.0a1
3
+ Version: 0.3.0b2
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
@@ -27,6 +27,9 @@ Classifier: Topic :: Terminals
27
27
  Classifier: Topic :: Text Processing :: Linguistic
28
28
  Classifier: Typing :: Typed
29
29
  Requires-Python: >=3.11
30
+ Requires-Dist: ddgs>=9.5.4
31
+ Requires-Dist: html2text>=2024.2.26
32
+ Requires-Dist: httpx>=0.24.0
30
33
  Requires-Dist: litellm>=1.72.4
31
34
  Requires-Dist: openai-agents[litellm]>=0.2.2
32
35
  Requires-Dist: pydantic-settings>=2.10.1
@@ -65,6 +68,7 @@ Built on [Textual](https://textual.textualize.io/) and the [OpenAI Agents SDK](h
65
68
 
66
69
  ### Key Features
67
70
 
71
+ - **Flow Mode (Experimental)** - Build structured agent-based applications with programmatic conversation control
68
72
  - **AI-Powered Chat Interface** - Interact with state-of-the-art language models through an intuitive terminal interface
69
73
  - **Rich Tool Integration** - Built-in tools for file operations, shell commands, Python execution, and task management
70
74
  - **MCP Support** - Connect to external tools and services via Model Context Protocol servers
@@ -79,6 +83,26 @@ Built on [Textual](https://textual.textualize.io/) and the [OpenAI Agents SDK](h
79
83
  ### Prerequisites
80
84
 
81
85
  - Python 3.11 or higher
86
+ - (Optional) [uv](https://docs.astral.sh/uv/) for quick testing and better package management
87
+
88
+ ### Quick Test (No Installation)
89
+
90
+ Try vibecore instantly without installing it:
91
+
92
+ ```bash
93
+ # Install uv if you don't have it (optional)
94
+ curl -LsSf https://astral.sh/uv/install.sh | sh
95
+
96
+ # Configure your API key
97
+ export ANTHROPIC_API_KEY="your-api-key-here"
98
+ # or
99
+ export OPENAI_API_KEY="your-api-key-here"
100
+
101
+ # Run vibecore directly with uvx
102
+ uvx vibecore
103
+ ```
104
+
105
+ This will download and run vibecore in an isolated environment without affecting your system Python installation.
82
106
 
83
107
  ### Install from PyPI
84
108
 
@@ -136,6 +160,88 @@ Once vibecore is running, you can:
136
160
  - `/help` - Show help and keyboard shortcuts
137
161
  - `/clear` - Clear the current session and start a new one
138
162
 
163
+ ## Flow Mode (Experimental)
164
+
165
+ Flow Mode is vibecore's **key differentiator** - it transforms the framework from a chat interface into a platform for building structured agent-based applications with programmatic conversation control.
166
+
167
+ ### What is Flow Mode?
168
+
169
+ Flow Mode allows you to:
170
+ - **Define custom conversation logic** that controls how agents process user input
171
+ - **Build multi-step workflows** with defined sequences and decision points
172
+ - **Orchestrate multiple agents** with handoffs and shared context
173
+ - **Maintain conversation state** across interactions
174
+ - **Create agent-based applications** rather than just chatbots
175
+
176
+ ### Example: Simple Flow
177
+
178
+ ```python
179
+ import asyncio
180
+ from agents import Agent, Runner
181
+ from vibecore.flow import flow, UserInputFunc
182
+ from vibecore.context import VibecoreContext
183
+
184
+ # Define your agent with tools
185
+ agent = Agent[VibecoreContext](
186
+ name="Assistant",
187
+ instructions="You are a helpful assistant",
188
+ tools=[...], # Your tools here
189
+ )
190
+
191
+ # Define your conversation logic
192
+ async def logic(app, ctx: VibecoreContext, user_input: UserInputFunc):
193
+ # 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(
198
+ agent,
199
+ input=user_message,
200
+ context=ctx,
201
+ session=app.session,
202
+ )
203
+
204
+ # Handle the response
205
+ app.current_worker = app.handle_streamed_response(result)
206
+ await app.current_worker.wait()
207
+
208
+ # Run the flow
209
+ async def main():
210
+ await flow(agent, logic)
211
+
212
+ if __name__ == "__main__":
213
+ asyncio.run(main())
214
+ ```
215
+
216
+ ### Example: Multi-Agent Customer Service
217
+
218
+ Flow Mode shines when building complex multi-agent systems. See `examples/customer_service.py` for a complete implementation featuring:
219
+
220
+ - **Triage Agent**: Routes requests to appropriate specialists
221
+ - **FAQ Agent**: Handles frequently asked questions
222
+ - **Booking Agent**: Manages seat reservations
223
+ - **Agent Handoffs**: Seamless transitions between agents with context preservation
224
+ - **Shared State**: Maintains customer information across the conversation
225
+
226
+ ### Key Components
227
+
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
233
+
234
+ ### Use Cases
235
+
236
+ Flow Mode enables building:
237
+ - **Customer service systems** with routing and escalation
238
+ - **Guided workflows** for complex tasks
239
+ - **Interactive tutorials** with step-by-step guidance
240
+ - **Task automation** with human-in-the-loop controls
241
+ - **Multi-stage data processing** pipelines
242
+
243
+ The examples in the `examples/` directory are adapted from the official OpenAI Agents SDK with minimal modifications, demonstrating how easily you can build sophisticated agent applications with vibecore.
244
+
139
245
  ### Available Tools
140
246
 
141
247
  vibecore comes with powerful built-in tools:
@@ -1,20 +1,31 @@
1
1
  vibecore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- vibecore/cli.py,sha256=IN2D5RFagPC-H4gQJWwIXX7EftRvgWajWDLv-klLDiM,3670
2
+ vibecore/cli.py,sha256=HU2cjvEDzMWlauoArUItBlTpsVAdgVuKFMLshtaqvUE,7119
3
3
  vibecore/context.py,sha256=JUVkZpmKGUSlcchrHpxu-oSO8D21GDgHT1BXDzZDTeQ,844
4
- vibecore/main.py,sha256=dml8vUoEQrqBZIaH04i15xuBRo_LDZbPwQt8dnVZHZU,19274
4
+ vibecore/flow.py,sha256=ZaKzMsz4YBvgelVzJOIHnTJzMWTmvkfvudwW_hllq6U,3384
5
+ vibecore/main.py,sha256=MIn7Mpg_xO_20c6Mju8PgY-MmVCTER9cepHd5YFbtYs,20175
5
6
  vibecore/main.tcss,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
7
  vibecore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- vibecore/settings.py,sha256=_X2HLh6LbBiQOUKst5Z3sdzcaAxH3m7xNHXI-JXPrHs,5154
8
- vibecore/agents/default.py,sha256=HnJ33t9rxwco7jfbbZ9dzgyRcpqvGoYH-3KPdTRKX-c,2539
8
+ vibecore/settings.py,sha256=OnEME61vi7qBiSbu7Q_7twAZa7l0sOXBIavxYNAVOWU,6897
9
+ vibecore/agents/default.py,sha256=wxeP3Hsq9MVBChyMF_sNkVHCtFFXgy5ghDIxy9eH_fQ,2287
9
10
  vibecore/agents/prompts.py,sha256=0oO9QzcytIbzgZcKJQjWD9fSRNQqBqqK5ku0fcYZZrA,324
10
- vibecore/agents/task_agent.py,sha256=WcqmSIml1TVZZSWg1xqODAnzpfvSkC-caZuV9ejjUi0,2073
11
+ vibecore/agents/task.py,sha256=cdhZDzKDA8eHHNYPhogFIKBms3oVAMvYeiBB2GqYNuE,1898
12
+ vibecore/auth/__init__.py,sha256=lFxAcdjXpmCjU2tWBnej3fyUqJKSc41qHLF8929nMRM,451
13
+ vibecore/auth/config.py,sha256=xEuChq61dygaDGhpOA9kK3VSximL42Usd-xBOY2XMpw,1650
14
+ vibecore/auth/interceptor.py,sha256=KsMbnTi8DDVDnwiC1YT4APjcpvpIVQK3kMSS28wizNs,5127
15
+ vibecore/auth/manager.py,sha256=xGhE8BUwmiAmT7zQWIqqYGD_3d1qdkBt9b-AslWIHJM,5980
16
+ vibecore/auth/models.py,sha256=5dw_p2s2AMSCp_NqXxF_3gsb4dvauEMturK23t9tRA0,1083
17
+ vibecore/auth/oauth_flow.py,sha256=LV8zQbNbkBRmMObsuvvc61PUQHypKyx4wByNd7PJzTc,4274
18
+ vibecore/auth/pkce.py,sha256=YMQxddItPqUyy1pkKfYPNWIahWhIUVWL7vPFsQQvb7M,956
19
+ vibecore/auth/storage.py,sha256=dWSDi4thRHHrSTJmAOInOdArTGQ_t0EdWHrk4Am8LWg,3495
20
+ vibecore/auth/token_manager.py,sha256=Dwd0EkbBVeoIef7K6RW4QzaS7-6HAM-or0Ra4M1xddg,4611
11
21
  vibecore/handlers/__init__.py,sha256=pFogA2n3GeIi4lmlUEU5jFprNNOaA6AWRR8Wc9X-P4Y,148
12
- vibecore/handlers/stream_handler.py,sha256=N3fs7jO9QcjSClSyglrwJQ3ky08F70xS8j5m-aYNkyM,10336
22
+ vibecore/handlers/stream_handler.py,sha256=e4VJOJcH84QmgKkGjOedwd85EZWmmvipmJpGuDBSPhA,11069
13
23
  vibecore/mcp/__init__.py,sha256=sl2_8pWjPx4TotO0ZojunVA6Jn6yOhbTQNbQG9-C-Jc,199
14
24
  vibecore/mcp/manager.py,sha256=RRpoFUiQjSg0-h9M7sF3odaSM7LURwrxVlaae5Yml3M,5644
15
25
  vibecore/mcp/server_wrapper.py,sha256=CkTyqZzmy7oeciSml0Q915orho_U2XcHoqhDVMOq7nY,3989
16
26
  vibecore/models/__init__.py,sha256=-vF0e_S5p7VdBM_TZuDI6oWFHcPecdX5KRjUzifHBow,116
17
27
  vibecore/models/anthropic.py,sha256=X48qj73cQ2jiChtoeMZYfLrkWTGABQZLEOPeU17hzuU,9750
28
+ vibecore/models/anthropic_auth.py,sha256=_hRGbPHTs6IrkSc5mDI7mshdOZYCyqu82HX9WdQIb8Y,8856
18
29
  vibecore/prompts/common_system_prompt.txt,sha256=L-YlOfTJSQLtVg6d0r9lcD5FrgOLzoSWjGzVfQjcDBg,4916
19
30
  vibecore/session/__init__.py,sha256=FXbtw8DZVBw8e3qCA2cQharMzozblhwA0yU4U0JRSkM,121
20
31
  vibecore/session/file_lock.py,sha256=vCuDdfaOGDeVpTjJP6yBJx7onIT7JkkAeAuWAtuLJb8,3739
@@ -37,12 +48,23 @@ vibecore/tools/shell/__init__.py,sha256=Ias6qmBMDK29q528VtUGtCQeYD4RU_Yx73SIAJrB
37
48
  vibecore/tools/shell/executor.py,sha256=yXUkbPqLc3anlsLUB_g4yEu1A_QpzfzwsoMAqx-gplA,6933
38
49
  vibecore/tools/shell/tools.py,sha256=hpftFrv4JWn7mbYLJwpCPLROTFyj-RiAOg1hyecV0bE,6829
39
50
  vibecore/tools/task/__init__.py,sha256=Fyw33zGiBArMnPuRMm7qwSYE6ZRPCZVbHK6eIUJDiJY,112
40
- vibecore/tools/task/executor.py,sha256=gPOAbPNf5Rwxke8pC9-dDfMp07gNptNcL6HsMC7en0U,1612
51
+ vibecore/tools/task/executor.py,sha256=gRIdq0f2gjDKxnWH-b5Rbmk1H2garIs56EDYFVKfUiw,1606
41
52
  vibecore/tools/task/tools.py,sha256=m6MBOQC3Pz07TZgd3lVAHPGQu9M-Ted-YOxQvIPrGvo,2257
42
53
  vibecore/tools/todo/__init__.py,sha256=67o76OyzqYKBH461R9H2-rkNx7ZK6tRSydca3GjqKh8,29
43
54
  vibecore/tools/todo/manager.py,sha256=COcVMX8sm--dtqXo0L7914krJMEcK6P2Va4OJiVroBg,871
44
55
  vibecore/tools/todo/models.py,sha256=gSheOpIP8NJf44X1JNwvbJQNsyrkfzP3LxrP_9rXzYw,634
45
56
  vibecore/tools/todo/tools.py,sha256=kbWXOMu5_xiMdWelxtbh6qS3yBomkveyOFlBcaJKcSY,5121
57
+ vibecore/tools/webfetch/__init__.py,sha256=fKfht3oiz-wMNgtukQjYIUcUC4y7g3GLKK7QXHl0Mcg,224
58
+ vibecore/tools/webfetch/executor.py,sha256=DFjnHgAvDPuwP5h4fgXM2JH270TgF4Vux7ndmZLs9BI,4912
59
+ vibecore/tools/webfetch/models.py,sha256=YvGR4i8Mi7gygCJe7-VPyrvbgacBUJ1PLHyCmOQPmuU,694
60
+ vibecore/tools/webfetch/tools.py,sha256=PWt8hBPD02ua2d9ZnDVfqtNVzachtIPB9QPStbkYY2Y,1494
61
+ vibecore/tools/websearch/__init__.py,sha256=xl3aPD-pOt0Ya4L8khMbOfqpcCpkWTy2-KVk2hUxnOU,97
62
+ vibecore/tools/websearch/base.py,sha256=El9Mx6MFWM3CKGG8MPbPIKgRjdbNZtylFALsPCUTPFs,596
63
+ vibecore/tools/websearch/executor.py,sha256=CLwFkPSDzllH7J1hNdjsp5L0SDLqoINlOSl-zoQKs2A,1114
64
+ vibecore/tools/websearch/models.py,sha256=5cwDw9dWLZ6krP_khx1euwsHjSYLIE4_hNefkjzrkWE,749
65
+ vibecore/tools/websearch/tools.py,sha256=leDf9nmvl8577TMrj7MTodYFx1vyXiIPDral0yzEYm8,1734
66
+ vibecore/tools/websearch/ddgs/__init__.py,sha256=XwZ7As5mVqxXz69In96L3TDChPhpc8GnZR72LgdBvX4,113
67
+ vibecore/tools/websearch/ddgs/backend.py,sha256=HHcckGFoPaFGYSl4k5UH6PURgF1sk8zYWSWVEYeAEtI,1959
46
68
  vibecore/utils/__init__.py,sha256=KIS8TkfaDZ1AclSstkYcG8DvJPNsJNOE4EL4zHJE2k4,112
47
69
  vibecore/utils/text.py,sha256=RLVFrVsD5L7xi68JTgSa0PeN9S32faqIiaF79dNCyTM,978
48
70
  vibecore/widgets/core.py,sha256=ZIdHBvfIaAXaBhA2X3EUkDlL2pN4l5j5Kc_E-VCsM3g,12068
@@ -53,11 +75,11 @@ vibecore/widgets/info.py,sha256=hXtsRUOE13oHbIm9FNe1GCUX_FCht28pgT9SQWeJ69I,1567
53
75
  vibecore/widgets/info.tcss,sha256=v30IqNt1two-ezIcm18ZEInKRKcRkAW-h-UH2r8QzSo,201
54
76
  vibecore/widgets/messages.py,sha256=az4fJtdk3ItSoFZBG_adRDUHdTLttIV8F23E8LOb-mg,8156
55
77
  vibecore/widgets/messages.tcss,sha256=WtBbjf5LgFkUhzhVlxJB7NMbagWladJawDizvDm7hBE,1271
56
- vibecore/widgets/tool_message_factory.py,sha256=8sSJOo_yXsKY46lDGExdbyB179kFUIEGyfAHWzc6ksY,4749
57
- vibecore/widgets/tool_messages.py,sha256=uF_QoqtdxPEN0VnoFlvPLdRJKGvIpklHe_NwhqVFStw,19167
58
- vibecore/widgets/tool_messages.tcss,sha256=K7aCmx_zCbYYwCs6IFfPfvK9pygRVf1PDd8gX0vVtc0,5999
59
- vibecore-0.2.0a1.dist-info/METADATA,sha256=_dqD4rr0mbio9aMe9OzMwI6Vc7LChxffWFRGlXGFxDg,14357
60
- vibecore-0.2.0a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
61
- vibecore-0.2.0a1.dist-info/entry_points.txt,sha256=YldTakc3dNelboaWXtzCcnM5MXvU2_6pVOjc2xPjDTY,47
62
- vibecore-0.2.0a1.dist-info/licenses/LICENSE,sha256=KXxxifvrcreHrZ4aOYgP-vA8DRHHueW389KKOeEbtjc,1069
63
- vibecore-0.2.0a1.dist-info/RECORD,,
78
+ vibecore/widgets/tool_message_factory.py,sha256=FMwavKMRNT8ik9RgcL37WuM19Ln-c5wuFmS0A2CkikM,5377
79
+ vibecore/widgets/tool_messages.py,sha256=PKmPigeOlccowo0uLpgIPzsmmE-zkichzuXIS6hWsbQ,24501
80
+ vibecore/widgets/tool_messages.tcss,sha256=mcFY58FE1AcfEvEiA_Yb7sMpIniTIC_IjDvv8M7vWOA,6924
81
+ vibecore-0.3.0b2.dist-info/METADATA,sha256=7YQejvTynr_4g3MmrV0cRLHdH4P5OiqC403t8qYjVnM,18095
82
+ vibecore-0.3.0b2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
+ vibecore-0.3.0b2.dist-info/entry_points.txt,sha256=i9mOKvpz07ciV_YYisxNCYZ53_Crjkn9mciiQ3aA6QM,51
84
+ vibecore-0.3.0b2.dist-info/licenses/LICENSE,sha256=KXxxifvrcreHrZ4aOYgP-vA8DRHHueW389KKOeEbtjc,1069
85
+ vibecore-0.3.0b2.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ vibecore = vibecore.cli:cli_main
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- vibecore = vibecore.cli:main