kolega-code 0.1.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.
Files changed (171) hide show
  1. kolega_code/__init__.py +151 -0
  2. kolega_code/agent/__init__.py +42 -0
  3. kolega_code/agent/baseagent.py +998 -0
  4. kolega_code/agent/browseragent.py +123 -0
  5. kolega_code/agent/coder.py +157 -0
  6. kolega_code/agent/common.py +41 -0
  7. kolega_code/agent/compression.py +81 -0
  8. kolega_code/agent/context.py +112 -0
  9. kolega_code/agent/conversation.py +408 -0
  10. kolega_code/agent/generalagent.py +146 -0
  11. kolega_code/agent/investigationagent.py +123 -0
  12. kolega_code/agent/planningagent.py +187 -0
  13. kolega_code/agent/prompt_provider.py +196 -0
  14. kolega_code/agent/prompt_templates/agents/browser.j2 +102 -0
  15. kolega_code/agent/prompt_templates/agents/coder_cli_mode.j2 +127 -0
  16. kolega_code/agent/prompt_templates/agents/general.j2 +68 -0
  17. kolega_code/agent/prompt_templates/agents/investigation.j2 +72 -0
  18. kolega_code/agent/prompt_templates/common/frontend_guidance.md +36 -0
  19. kolega_code/agent/prompt_templates/common/kolega_md_instructions.md +14 -0
  20. kolega_code/agent/prompt_templates/environment_variables/workspace_env_vars.md +11 -0
  21. kolega_code/agent/prompt_templates/template_guidance/expo-template.md +379 -0
  22. kolega_code/agent/prompt_templates/template_guidance/html-website-template.md +3 -0
  23. kolega_code/agent/prompt_templates/template_guidance/mern-stack-template.md +3 -0
  24. kolega_code/agent/prompt_templates/template_guidance/react-vite-shadcdn-template.md +182 -0
  25. kolega_code/agent/prompts.py +192 -0
  26. kolega_code/agent/tests/__init__.py +0 -0
  27. kolega_code/agent/tests/llm/__init__.py +0 -0
  28. kolega_code/agent/tests/llm/test_anthropic_token_counting.py +633 -0
  29. kolega_code/agent/tests/llm/test_billing_openai_cache.py +74 -0
  30. kolega_code/agent/tests/llm/test_client.py +773 -0
  31. kolega_code/agent/tests/llm/test_dashscope_mapping.py +32 -0
  32. kolega_code/agent/tests/llm/test_error_boundary.py +322 -0
  33. kolega_code/agent/tests/llm/test_exceptions.py +249 -0
  34. kolega_code/agent/tests/llm/test_instrumented_client.py +536 -0
  35. kolega_code/agent/tests/llm/test_instrumented_client_integration.py +547 -0
  36. kolega_code/agent/tests/llm/test_langfuse_normalization.py +39 -0
  37. kolega_code/agent/tests/llm/test_model_specs.py +17 -0
  38. kolega_code/agent/tests/llm/test_openai_cached_tokens.py +58 -0
  39. kolega_code/agent/tests/llm/test_openai_cached_tokens_stream.py +74 -0
  40. kolega_code/agent/tests/llm/test_openai_message_conversion.py +30 -0
  41. kolega_code/agent/tests/llm/test_openai_token_counting.py +687 -0
  42. kolega_code/agent/tests/llm/test_tool_execution_ids.py +193 -0
  43. kolega_code/agent/tests/services/__init__.py +1 -0
  44. kolega_code/agent/tests/services/test_browser.py +447 -0
  45. kolega_code/agent/tests/services/test_browser_parity.py +353 -0
  46. kolega_code/agent/tests/services/test_file_system.py +699 -0
  47. kolega_code/agent/tests/services/test_sandbox_terminal_input.py +98 -0
  48. kolega_code/agent/tests/services/test_terminal.py +154 -0
  49. kolega_code/agent/tests/services/test_terminal_command_tracking.py +385 -0
  50. kolega_code/agent/tests/services/test_terminal_state_serializer.py +262 -0
  51. kolega_code/agent/tests/test_agent_tools_inventory.py +267 -0
  52. kolega_code/agent/tests/test_base_agent.py +1942 -0
  53. kolega_code/agent/tests/test_coder_attachments.py +330 -0
  54. kolega_code/agent/tests/test_coder_prompt_extensions.py +61 -0
  55. kolega_code/agent/tests/test_commands.py +179 -0
  56. kolega_code/agent/tests/test_duplicate_tool_results.py +556 -0
  57. kolega_code/agent/tests/test_empty_message_handling.py +48 -0
  58. kolega_code/agent/tests/test_general_agent.py +242 -0
  59. kolega_code/agent/tests/test_html.py +320 -0
  60. kolega_code/agent/tests/test_parallel_tool_calls.py +291 -0
  61. kolega_code/agent/tests/test_planning_agent.py +227 -0
  62. kolega_code/agent/tests/test_prompt_provider.py +271 -0
  63. kolega_code/agent/tests/test_tool_registry.py +102 -0
  64. kolega_code/agent/tests/test_tools.py +549 -0
  65. kolega_code/agent/tests/tool_backend/__init__.py +0 -0
  66. kolega_code/agent/tests/tool_backend/test_agent_tool.py +356 -0
  67. kolega_code/agent/tests/tool_backend/test_base_tool.py +147 -0
  68. kolega_code/agent/tests/tool_backend/test_browser_tool.py +335 -0
  69. kolega_code/agent/tests/tool_backend/test_build_tool.py +93 -0
  70. kolega_code/agent/tests/tool_backend/test_create_file_tool.py +115 -0
  71. kolega_code/agent/tests/tool_backend/test_glob_tool.py +196 -0
  72. kolega_code/agent/tests/tool_backend/test_glob_tool_sandbox_parity.py +230 -0
  73. kolega_code/agent/tests/tool_backend/test_list_directory_tool.py +292 -0
  74. kolega_code/agent/tests/tool_backend/test_read_file_tool.py +173 -0
  75. kolega_code/agent/tests/tool_backend/test_replace_entire_file_tool.py +115 -0
  76. kolega_code/agent/tests/tool_backend/test_replace_lines_tool.py +141 -0
  77. kolega_code/agent/tests/tool_backend/test_search_and_replace_tool.py +174 -0
  78. kolega_code/agent/tests/tool_backend/test_search_codebase_tool.py +228 -0
  79. kolega_code/agent/tests/tool_backend/test_terminal_tool.py +482 -0
  80. kolega_code/agent/tests/tool_backend/test_think_hard_integration.py +189 -0
  81. kolega_code/agent/tests/tool_backend/test_think_hard_streaming.py +445 -0
  82. kolega_code/agent/tests/tool_backend/test_web_fetch_tool.py +194 -0
  83. kolega_code/agent/tool_backend/agent_tool.py +414 -0
  84. kolega_code/agent/tool_backend/apply_edit_tool.py +98 -0
  85. kolega_code/agent/tool_backend/apply_patch_tool.py +514 -0
  86. kolega_code/agent/tool_backend/base_tool.py +217 -0
  87. kolega_code/agent/tool_backend/browser_tool.py +271 -0
  88. kolega_code/agent/tool_backend/build_tool.py +93 -0
  89. kolega_code/agent/tool_backend/create_file_tool.py +52 -0
  90. kolega_code/agent/tool_backend/glob_tool.py +323 -0
  91. kolega_code/agent/tool_backend/list_directory_tool.py +300 -0
  92. kolega_code/agent/tool_backend/memory_tool.py +79 -0
  93. kolega_code/agent/tool_backend/read_file_tool.py +119 -0
  94. kolega_code/agent/tool_backend/replace_entire_file_tool.py +40 -0
  95. kolega_code/agent/tool_backend/replace_lines_tool.py +97 -0
  96. kolega_code/agent/tool_backend/search_and_replace_tool.py +146 -0
  97. kolega_code/agent/tool_backend/search_codebase_tool.py +377 -0
  98. kolega_code/agent/tool_backend/streaming_tool.py +47 -0
  99. kolega_code/agent/tool_backend/terminal_tool.py +643 -0
  100. kolega_code/agent/tool_backend/think_hard_tool.py +211 -0
  101. kolega_code/agent/tool_backend/web_fetch_tool.py +205 -0
  102. kolega_code/agent/tools.py +1704 -0
  103. kolega_code/agent/utils/commands.py +94 -0
  104. kolega_code/cli/__init__.py +1 -0
  105. kolega_code/cli/app.py +2756 -0
  106. kolega_code/cli/config.py +280 -0
  107. kolega_code/cli/connection.py +49 -0
  108. kolega_code/cli/file_index.py +147 -0
  109. kolega_code/cli/main.py +564 -0
  110. kolega_code/cli/mentions.py +155 -0
  111. kolega_code/cli/messages.py +89 -0
  112. kolega_code/cli/provider_registry.py +96 -0
  113. kolega_code/cli/session_store.py +207 -0
  114. kolega_code/cli/settings.py +87 -0
  115. kolega_code/cli/skills.py +409 -0
  116. kolega_code/cli/slash_commands.py +108 -0
  117. kolega_code/cli/tests/__init__.py +1 -0
  118. kolega_code/cli/tests/test_app.py +4251 -0
  119. kolega_code/cli/tests/test_cli_config.py +171 -0
  120. kolega_code/cli/tests/test_connection.py +26 -0
  121. kolega_code/cli/tests/test_file_index.py +103 -0
  122. kolega_code/cli/tests/test_main.py +455 -0
  123. kolega_code/cli/tests/test_mentions.py +108 -0
  124. kolega_code/cli/tests/test_session_store.py +67 -0
  125. kolega_code/cli/tests/test_settings.py +62 -0
  126. kolega_code/cli/tests/test_skills.py +157 -0
  127. kolega_code/cli/tests/test_slash_commands.py +88 -0
  128. kolega_code/cli/theme.py +180 -0
  129. kolega_code/config.py +154 -0
  130. kolega_code/events.py +202 -0
  131. kolega_code/llm/client.py +300 -0
  132. kolega_code/llm/exceptions.py +285 -0
  133. kolega_code/llm/instrumented_client.py +520 -0
  134. kolega_code/llm/models.py +1368 -0
  135. kolega_code/llm/providers/__init__.py +0 -0
  136. kolega_code/llm/providers/anthropic.py +387 -0
  137. kolega_code/llm/providers/base.py +71 -0
  138. kolega_code/llm/providers/google.py +157 -0
  139. kolega_code/llm/providers/models.py +37 -0
  140. kolega_code/llm/providers/openai.py +363 -0
  141. kolega_code/llm/ratelimit.py +40 -0
  142. kolega_code/llm/specs.py +67 -0
  143. kolega_code/llm/tool_execution_ids.py +18 -0
  144. kolega_code/models/__init__.py +9 -0
  145. kolega_code/models/sandbox_terminal_state.py +47 -0
  146. kolega_code/runtime.py +50 -0
  147. kolega_code/sandbox/README.md +200 -0
  148. kolega_code/sandbox/__init__.py +21 -0
  149. kolega_code/sandbox/async_filesystem.py +475 -0
  150. kolega_code/sandbox/base.py +297 -0
  151. kolega_code/sandbox/browser.py +25 -0
  152. kolega_code/sandbox/event_loop.py +43 -0
  153. kolega_code/sandbox/filesystem.py +341 -0
  154. kolega_code/sandbox/local.py +118 -0
  155. kolega_code/sandbox/serializer.py +175 -0
  156. kolega_code/sandbox/terminal.py +868 -0
  157. kolega_code/sandbox/utils.py +216 -0
  158. kolega_code/services/base.py +255 -0
  159. kolega_code/services/browser.py +444 -0
  160. kolega_code/services/file_system.py +749 -0
  161. kolega_code/services/html.py +221 -0
  162. kolega_code/services/terminal.py +903 -0
  163. kolega_code/tools/__init__.py +22 -0
  164. kolega_code/tools/core.py +33 -0
  165. kolega_code/tools/definitions.py +81 -0
  166. kolega_code/tools/registry.py +73 -0
  167. kolega_code-0.1.0.dist-info/METADATA +157 -0
  168. kolega_code-0.1.0.dist-info/RECORD +171 -0
  169. kolega_code-0.1.0.dist-info/WHEEL +4 -0
  170. kolega_code-0.1.0.dist-info/entry_points.txt +2 -0
  171. kolega_code-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,22 @@
1
+ """First-class tool primitives.
2
+
3
+ Tools are data: a Tool pairs a provider-facing ToolDefinition with the
4
+ coroutine that implements it, plus execution metadata (groups, parallel
5
+ safety). A ToolRegistry holds Tools and answers availability, dispatch,
6
+ and definition queries; ToolPolicy expresses name-based selection.
7
+
8
+ ToolCollection (kolega_code.agent.tools) remains the host-facing way to
9
+ assemble an agent's tools; internally it builds a ToolRegistry.
10
+ """
11
+
12
+ from .core import Tool, ToolError
13
+ from .definitions import tool_definition_from_callable
14
+ from .registry import ToolPolicy, ToolRegistry
15
+
16
+ __all__ = [
17
+ "Tool",
18
+ "ToolError",
19
+ "ToolPolicy",
20
+ "ToolRegistry",
21
+ "tool_definition_from_callable",
22
+ ]
@@ -0,0 +1,33 @@
1
+ """Tool: a definition paired with its implementation and execution metadata."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Awaitable, Callable, FrozenSet
5
+
6
+ from ..llm.models import ToolDefinition
7
+
8
+
9
+ class ToolError(Exception):
10
+ """
11
+ An expected tool failure.
12
+
13
+ Raise this from a tool implementation when the failure is a normal
14
+ outcome the model should see and react to (file not found, invalid
15
+ arguments, command failed). The executor reports the message as an
16
+ is_error tool result without treating it as an internal fault.
17
+ """
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class Tool:
22
+ """A single callable tool: provider-facing definition plus implementation."""
23
+
24
+ name: str
25
+ definition: ToolDefinition
26
+ handler: Callable[..., Awaitable[Any]]
27
+ groups: FrozenSet[str] = field(default_factory=frozenset)
28
+ # Safe to run concurrently with other parallel-safe tools in one batch
29
+ # (read-only operations and independent sub-agent dispatches).
30
+ parallel_safe: bool = False
31
+
32
+ async def call(self, **inputs: Any) -> Any:
33
+ return await self.handler(**inputs)
@@ -0,0 +1,81 @@
1
+ """Build provider-agnostic tool definitions from Python callables.
2
+
3
+ The callable's signature supplies the parameter schema and its docstring
4
+ supplies the descriptions, so the code documenting a tool for developers is
5
+ also what the model sees.
6
+ """
7
+
8
+ import inspect
9
+ import re
10
+ from typing import Any, Callable, Dict, Optional
11
+
12
+ from ..llm.models import ToolDefinition, ToolParameter
13
+
14
+
15
+ def tool_definition_from_callable(
16
+ name: str,
17
+ method: Callable[..., Any],
18
+ *,
19
+ description_overrides: Optional[Dict[str, str]] = None,
20
+ ) -> ToolDefinition:
21
+ """Build a provider-agnostic tool definition from a Python callable."""
22
+ signature = inspect.signature(method)
23
+ docstring = inspect.getdoc(method) or ""
24
+
25
+ description = docstring.split("Raises:")[0].strip() if "Raises:" in docstring else docstring.strip()
26
+
27
+ if description_overrides and name in description_overrides:
28
+ description = description_overrides[name]
29
+
30
+ properties = {}
31
+ required = []
32
+
33
+ for param_name, param in signature.parameters.items():
34
+ if param_name == "self":
35
+ continue
36
+
37
+ if param.default == inspect.Parameter.empty:
38
+ required.append(param_name)
39
+
40
+ param_type = "string"
41
+ param_description = ""
42
+
43
+ param_doc_match = re.search(rf"{param_name}:\s*(.*?)(?:\n\s*\w+:|$)", docstring, re.DOTALL)
44
+ if param_doc_match:
45
+ param_description = param_doc_match.group(1).strip()
46
+
47
+ if param.annotation != inspect.Parameter.empty:
48
+ annotation = str(param.annotation)
49
+ if "str" in annotation:
50
+ param_type = "string"
51
+ elif "int" in annotation:
52
+ param_type = "integer"
53
+ elif "float" in annotation:
54
+ param_type = "number"
55
+ elif "bool" in annotation:
56
+ param_type = "boolean"
57
+ elif "List" in annotation or "list" in annotation:
58
+ param_type = "array"
59
+ elif "Dict" in annotation or "dict" in annotation:
60
+ param_type = "object"
61
+
62
+ properties[param_name] = {
63
+ "type": param_type,
64
+ "description": param_description,
65
+ }
66
+
67
+ tool_parameters = [
68
+ ToolParameter(
69
+ name=param_name,
70
+ type=param_info["type"],
71
+ description=param_info["description"],
72
+ required=param_name in required,
73
+ )
74
+ for param_name, param_info in properties.items()
75
+ ]
76
+
77
+ return ToolDefinition(
78
+ name=name,
79
+ description=description,
80
+ parameters=tool_parameters,
81
+ )
@@ -0,0 +1,73 @@
1
+ """ToolRegistry: holds Tools; answers availability, dispatch, and definitions."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Dict, FrozenSet, Iterator, List, Optional
5
+
6
+ from ..llm.models import ToolDefinition
7
+ from .core import Tool
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ class ToolPolicy:
12
+ """Name-based tool selection: optional allowlist plus exclusions."""
13
+
14
+ include: Optional[FrozenSet[str]] = None # None = all registered tools
15
+ exclude: FrozenSet[str] = field(default_factory=frozenset)
16
+
17
+ def allows(self, name: str) -> bool:
18
+ if name in self.exclude:
19
+ return False
20
+ if self.include is not None and name not in self.include:
21
+ return False
22
+ return True
23
+
24
+
25
+ class ToolRegistry:
26
+ """An ordered collection of Tools with lookup, selection, and dispatch."""
27
+
28
+ def __init__(self, tools: Optional[List[Tool]] = None) -> None:
29
+ self._tools: Dict[str, Tool] = {}
30
+ for tool in tools or []:
31
+ self.add(tool)
32
+
33
+ def add(self, *tools: Tool) -> "ToolRegistry":
34
+ for tool in tools:
35
+ if tool.name in self._tools:
36
+ raise ValueError(f"Tool '{tool.name}' is already registered")
37
+ self._tools[tool.name] = tool
38
+ return self
39
+
40
+ def get(self, name: str) -> Tool:
41
+ return self._tools[name]
42
+
43
+ def __contains__(self, name: str) -> bool:
44
+ return name in self._tools
45
+
46
+ def __iter__(self) -> Iterator[Tool]:
47
+ return iter(self._tools.values())
48
+
49
+ def __len__(self) -> int:
50
+ return len(self._tools)
51
+
52
+ def names(self) -> List[str]:
53
+ return list(self._tools.keys())
54
+
55
+ def select(self, policy: ToolPolicy) -> "ToolRegistry":
56
+ return ToolRegistry([tool for tool in self if policy.allows(tool.name)])
57
+
58
+ async def call(self, name: str, **inputs: Any) -> Any:
59
+ """Dispatch a tool by name. Raises KeyError for unknown tools."""
60
+ return await self.get(name).call(**inputs)
61
+
62
+ def definitions(self) -> List[ToolDefinition]:
63
+ """
64
+ Provider-facing definitions, with the prompt-cache checkpoint on the
65
+ last definition (and cleared everywhere else, since definitions may
66
+ be shared between registry views).
67
+ """
68
+ definitions = [tool.definition for tool in self]
69
+ for definition in definitions:
70
+ definition.cache_checkpoint = False
71
+ if definitions:
72
+ definitions[-1].cache_checkpoint = True
73
+ return definitions
@@ -0,0 +1,157 @@
1
+ Metadata-Version: 2.4
2
+ Name: kolega-code
3
+ Version: 0.1.0
4
+ Summary: Local-first AI coding agent for the terminal
5
+ Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
6
+ Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
7
+ Project-URL: Repository, https://github.com/kolega-ai/kolega-code
8
+ Project-URL: Issues, https://github.com/kolega-ai/kolega-code/issues
9
+ Author: Kolega Team
10
+ License: MIT License
11
+
12
+ Copyright (c) 2026 Kolega Team
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+ License-File: LICENSE
32
+ Keywords: agent,ai,cli,coding-agent,developer-tools
33
+ Classifier: Development Status :: 3 - Alpha
34
+ Classifier: Environment :: Console
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Operating System :: MacOS
37
+ Classifier: Operating System :: POSIX :: Linux
38
+ Classifier: Programming Language :: Python :: 3
39
+ Classifier: Programming Language :: Python :: 3.11
40
+ Classifier: Programming Language :: Python :: 3.12
41
+ Classifier: Topic :: Software Development
42
+ Classifier: Topic :: Utilities
43
+ Requires-Python: >=3.11
44
+ Requires-Dist: anthropic==0.101.0
45
+ Requires-Dist: beautifulsoup4==4.14.3
46
+ Requires-Dist: browser-use==0.1.40
47
+ Requires-Dist: google-genai==2.0.1
48
+ Requires-Dist: jinja2==3.1.6
49
+ Requires-Dist: langfuse==3.14.5
50
+ Requires-Dist: nest-asyncio==1.6.0
51
+ Requires-Dist: openai==1.109.1
52
+ Requires-Dist: pathspec==1.1.1
53
+ Requires-Dist: playwright==1.59.0
54
+ Requires-Dist: psutil==7.2.2
55
+ Requires-Dist: pydantic==2.13.4
56
+ Requires-Dist: python-dotenv==1.2.2
57
+ Requires-Dist: pyyaml==6.0.3
58
+ Requires-Dist: tenacity==9.1.4
59
+ Requires-Dist: textual==8.2.5
60
+ Requires-Dist: tiktoken==0.12.0
61
+ Requires-Dist: trafilatura==2.0.0
62
+ Provides-Extra: cli
63
+ Provides-Extra: dev
64
+ Requires-Dist: pytest-asyncio==1.3.0; extra == 'dev'
65
+ Requires-Dist: pytest==9.0.3; extra == 'dev'
66
+ Requires-Dist: ruff==0.15.12; extra == 'dev'
67
+ Description-Content-Type: text/markdown
68
+
69
+ # kolega-code
70
+
71
+ Kolega Code is a local-first AI coding agent for the terminal.
72
+
73
+ The package owns the `kolega_code` import namespace and provides the
74
+ `kolega-code` command.
75
+
76
+ ## Install
77
+
78
+ Install with the public installer:
79
+
80
+ ```bash
81
+ curl -fsSL https://kolega.dev/install-kolega-code | sh
82
+ ```
83
+
84
+ Or install directly from PyPI with uv:
85
+
86
+ ```bash
87
+ uv tool install kolega-code
88
+ ```
89
+
90
+ Verify the command is available:
91
+
92
+ ```bash
93
+ kolega-code --version
94
+ ```
95
+
96
+ Upgrade or uninstall:
97
+
98
+ ```bash
99
+ uv tool upgrade kolega-code
100
+ uv tool uninstall kolega-code
101
+ ```
102
+
103
+ Run the Textual UI and open the Settings tab to select Moonshot Kimi K2.6 or DeepSeek V4 Pro and save your API key:
104
+
105
+ ```bash
106
+ kolega-code .
107
+ ```
108
+
109
+ In the Textual UI, press `Shift+Tab` to switch between build mode and planning mode. Planning mode uses a standalone read-only planning agent; when it submits a complete plan, choose whether to implement it or keep discussing the plan.
110
+
111
+ All CLI sessions use the CLI-specific coding-agent prompt, including resumed sessions. Launching the UI starts a fresh thread by default. Resume an existing thread explicitly:
112
+
113
+ ```bash
114
+ kolega-code . --resume
115
+ kolega-code . --resume <thread-or-session-id>
116
+ ```
117
+
118
+ You can also set `MOONSHOT_API_KEY`, `DEEPSEEK_API_KEY`, or keep using env/flag based configuration for non-UI commands:
119
+
120
+ ```bash
121
+ kolega-code ask "summarize this repository" --project .
122
+ kolega-code ask "summarize this repository" --project . --provider deepseek --model deepseek-v4-pro
123
+ kolega-code sessions list --project .
124
+ kolega-code doctor --project .
125
+ ```
126
+
127
+ The Settings UI supports Moonshot `kimi-k2.6` and DeepSeek `deepseek-v4-pro`. A saved UI selection is used for all agent model roles and API keys are stored in the local CLI settings file with restrictive permissions. Existing environment and model/provider flag overrides continue to work. Local session state is stored under the platform state directory unless `KOLEGA_CODE_STATE_DIR` is set.
128
+
129
+ ## From source
130
+
131
+ ```bash
132
+ git clone https://github.com/kolega-ai/kolega-code.git
133
+ cd kolega-code
134
+ uv sync --extra dev
135
+ uv run kolega-code --version
136
+ ```
137
+
138
+ ## Tests
139
+
140
+ Fast tests run by default:
141
+
142
+ ```bash
143
+ ./run_tests.sh
144
+ ```
145
+
146
+ Some slow and integration tests require real provider credentials. To run them locally, create an ignored `.env` file from the example and fill only the keys you need:
147
+
148
+ ```bash
149
+ cp .env.example .env
150
+ ./run_tests.sh --all
151
+ ```
152
+
153
+ The test runner loads `.env` through pytest and keeps existing shell environment variables higher priority than values in the file. You can pass additional pytest arguments through the wrapper:
154
+
155
+ ```bash
156
+ ./run_tests.sh kolega_code/agent/tests/llm/test_client.py -ra
157
+ ```
@@ -0,0 +1,171 @@
1
+ kolega_code/__init__.py,sha256=V9mY6M3W63EoyqeNdrHiJLJooeWgr9HSDCc-XX1eu60,4016
2
+ kolega_code/config.py,sha256=8fVzZARwGe6KDXo_oFHIe5XE97ixetvGTSmz2VDZQR8,6618
3
+ kolega_code/events.py,sha256=8DL-BU8PfWosdqtm6_sccpNCfdiN-y591VrxvaN0Zok,6919
4
+ kolega_code/runtime.py,sha256=RL0wW6KEeUbd1HVP4M8n4KHzwBAICYIhuqrSqnZwros,1433
5
+ kolega_code/agent/__init__.py,sha256=N23c-fwXhEf6BE9vePPg6We1hI1v20Y6ObNu9jj75sU,1131
6
+ kolega_code/agent/baseagent.py,sha256=k4Iygs2EnFCQ5idEUerykJZRpYVDiOYFv5ZR2nudV3s,43638
7
+ kolega_code/agent/browseragent.py,sha256=1hCLclv3qozUTJBg537LJz-GkCI9frI71NgioDa2pqI,5240
8
+ kolega_code/agent/coder.py,sha256=XTwUI6Z05mIGCN78iC2FnF2XV-sK22xhDiXNla3qET4,6741
9
+ kolega_code/agent/common.py,sha256=0UqJ6myHe_h5ffE9FaKcsqYg693o-rLjH1YEeAy5_Tc,1582
10
+ kolega_code/agent/compression.py,sha256=fqkjzTUBvcDsU1UbFwg-GnCQ45feyR-y23RcIghQeAQ,2881
11
+ kolega_code/agent/context.py,sha256=qviZw1TVDkwR2Y-xBc7ufBmw8xThikESz-rloVQ9QB4,4494
12
+ kolega_code/agent/conversation.py,sha256=sQO0mWl4rjKxLv4Ho6srZFvLuTZEvjdrpEWvrMXiRlo,18977
13
+ kolega_code/agent/generalagent.py,sha256=8tbH3T9zkRw-3JfyOLcHuN1DoY-pnV7W6l-6Wk5WJHQ,6308
14
+ kolega_code/agent/investigationagent.py,sha256=TsrVM9tXdrnd7h1OTrxIuK3a8nzsZpPpWnifgXgRz3U,5267
15
+ kolega_code/agent/planningagent.py,sha256=jp3itqn7shF9_RUzlzlxfGPLl_XxPSXrpG5nXbVT0Q4,7521
16
+ kolega_code/agent/prompt_provider.py,sha256=x2LKq5HY-pEjO8Ql1D9jTEqxDDTlJMl5pI32oM17Z_k,7023
17
+ kolega_code/agent/prompts.py,sha256=63pvkY-24qY9jZVQzNtjjYaJb2x1BeMcpciuq88dGQc,7912
18
+ kolega_code/agent/tools.py,sha256=jYrX7GwEtjC8eZrp_SwG5qomG8pJoY_CQgnVq8BnQ7k,76301
19
+ kolega_code/agent/prompt_templates/agents/browser.j2,sha256=RzDEv2amWoXf7chr292iGChU_HH3i6GxzQyWtxHsoDQ,4230
20
+ kolega_code/agent/prompt_templates/agents/coder_cli_mode.j2,sha256=sDdruR--eVzmdvFEYl-sMXKrHv3-XvplfP9-3xaKMTw,6456
21
+ kolega_code/agent/prompt_templates/agents/general.j2,sha256=DFDQZmZpZ7_lPQiPqj5HYJVBlPSvs_ImmnMnMZqF8RM,3014
22
+ kolega_code/agent/prompt_templates/agents/investigation.j2,sha256=Yho5FmYOoMvCk7sEMcaWV5ARXf2KmspovQdcWIq2n4c,3462
23
+ kolega_code/agent/prompt_templates/common/frontend_guidance.md,sha256=PGBci7ySfRwc8tCDYoHrYyol-vZJFznk_bwKutX4bEI,3410
24
+ kolega_code/agent/prompt_templates/common/kolega_md_instructions.md,sha256=4NhVsW5a5gKjb8ZDTWsMNwup8u4Lpti7tA3TV60w0PY,382
25
+ kolega_code/agent/prompt_templates/environment_variables/workspace_env_vars.md,sha256=OqHOZhDK9ZfMyb0m1G2RLWk-DoPtq0ZwXYafp8UxJSc,527
26
+ kolega_code/agent/prompt_templates/template_guidance/expo-template.md,sha256=_O15zf1qEwNtlcTmA9DbVqS2fRBYO_53AGvqNn-d64I,10712
27
+ kolega_code/agent/prompt_templates/template_guidance/html-website-template.md,sha256=GFd0cLfkxyDLgtfNkmjTlOAMl70P_kIlnMcAJ8Ojnvo,59
28
+ kolega_code/agent/prompt_templates/template_guidance/mern-stack-template.md,sha256=INVYLOcT46HvEpY5JMUAELVvIqe_8tPBe8_8Opd3rYg,58
29
+ kolega_code/agent/prompt_templates/template_guidance/react-vite-shadcdn-template.md,sha256=K1Fn6x9alsTovwUzKJsVkW-tcWGZ7bGhUYY4i8Xe4DM,5256
30
+ kolega_code/agent/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ kolega_code/agent/tests/test_agent_tools_inventory.py,sha256=fR3ee6wD-aE4ZzV5bbUFDeZRBfqJ3kQ6sbUeDyNR-F8,9398
32
+ kolega_code/agent/tests/test_base_agent.py,sha256=7Pp3lq8Jy3zTgxIkRxFcby6MVyQbKRF1lMvrf-2kdyw,86747
33
+ kolega_code/agent/tests/test_coder_attachments.py,sha256=Uf61UUr1qb_5UJTpQAh59wcxqfRFbn4MFgQFdQ26DJw,11788
34
+ kolega_code/agent/tests/test_coder_prompt_extensions.py,sha256=LrlqUYSTMDxonCxU7EGpY452rAQ8oYvI6JVJYPum6Z0,2193
35
+ kolega_code/agent/tests/test_commands.py,sha256=SJOdISumVS3HGyuqUO1WT2EiF-qycE7WSsepIDInXWA,5760
36
+ kolega_code/agent/tests/test_duplicate_tool_results.py,sha256=KQWZsGHjvDvuHm2OBuRZpQciMGi_DI6XC71IDmtsuso,24308
37
+ kolega_code/agent/tests/test_empty_message_handling.py,sha256=xsWhvlO-79RYNWvzjl9Y2VJ8lWUvC3K-Uu0CwFoNAv8,1652
38
+ kolega_code/agent/tests/test_general_agent.py,sha256=tLDtd7K_AYu2K5CpxtQo7KYS91ChODbddxriL7taD1M,9156
39
+ kolega_code/agent/tests/test_html.py,sha256=S4RdF_4k8d2PwEWI0tNVl5zKSk6fnTyYcAm8Iav8V1k,12719
40
+ kolega_code/agent/tests/test_parallel_tool_calls.py,sha256=GDcO4Yp8RCKVXlA7CrVKbcwUC3c9X2ASXCeHzBNmX9c,10061
41
+ kolega_code/agent/tests/test_planning_agent.py,sha256=U_yte5WuUwMC5eglpjhnojUb4RuNaCnUbrRKeHbyY5k,7418
42
+ kolega_code/agent/tests/test_prompt_provider.py,sha256=SumgaezHINFxWCw2HN_W8wzq26QqFS90K6drdjMNZa8,10964
43
+ kolega_code/agent/tests/test_tool_registry.py,sha256=18QTKpqtNd_j0lmKTp53T-mtfnvoweSqhgptbxpAKLU,3761
44
+ kolega_code/agent/tests/test_tools.py,sha256=Nah14HgFxOVRwjxXZAsyd6F6yZm-vQWMZ1kyZBN5JpM,22577
45
+ kolega_code/agent/tests/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ kolega_code/agent/tests/llm/test_anthropic_token_counting.py,sha256=ZD87tT3O72zQd5WZYpMN5OIAWVkwZHkE9t667sNMD-Q,21852
47
+ kolega_code/agent/tests/llm/test_billing_openai_cache.py,sha256=GxrTBSIMoRz7wz3l8TfiqlAdPltVlxKxGe6YUVaww7c,2187
48
+ kolega_code/agent/tests/llm/test_client.py,sha256=ysxE-d-FgEaG0Kv-pNOpxarLrDax-UKtNNp0KN3STAI,27207
49
+ kolega_code/agent/tests/llm/test_dashscope_mapping.py,sha256=dANyovSpkIYu7MjhPBBVj2Dqg3zom20hCNYoRSOjzcI,1464
50
+ kolega_code/agent/tests/llm/test_error_boundary.py,sha256=_6EEkxa7SLF0DYMG0hAW6csTKqDhLGjFYfE-OuZFSNA,13972
51
+ kolega_code/agent/tests/llm/test_exceptions.py,sha256=JhpbK1nT82EL1VSi6Hecu8KVbHfrQDffXJHsVjKICFs,8888
52
+ kolega_code/agent/tests/llm/test_instrumented_client.py,sha256=sgfUOWEMN7KxDqidmQsgSLv5enP3RL7urxwdG2yra_g,21807
53
+ kolega_code/agent/tests/llm/test_instrumented_client_integration.py,sha256=xXRhCDNXvocp9JNTVHdfMFoiJStOga0u5lVPUFg8fvo,19746
54
+ kolega_code/agent/tests/llm/test_langfuse_normalization.py,sha256=3IY5NeNox2YKocBnKTf8f_CBZH0o6ZLWIXVyMZ7DlUA,1483
55
+ kolega_code/agent/tests/llm/test_model_specs.py,sha256=EQ5PLRPjQJ242FRszbpyPq1nX816qsuc_pfgYV8e94Y,529
56
+ kolega_code/agent/tests/llm/test_openai_cached_tokens.py,sha256=KnITeUcuvtBXh9KMtx7iZeZLz8FiKZBkBTWzeaTDOgE,1710
57
+ kolega_code/agent/tests/llm/test_openai_cached_tokens_stream.py,sha256=6VyoNRlpToEkq_ygLROtQ2E1_x1IU_wzCHrOtgMmUAM,2191
58
+ kolega_code/agent/tests/llm/test_openai_message_conversion.py,sha256=tYO8B_EqwpYPI8VRUJuSeeTSw-rWn6ONyxBSG0KbBw8,1357
59
+ kolega_code/agent/tests/llm/test_openai_token_counting.py,sha256=zzbckj1FKtNyGbNHOOugfkVvbOYx5kF29KpnLiozbns,23106
60
+ kolega_code/agent/tests/llm/test_tool_execution_ids.py,sha256=WVrcBsk5RbEwC7Hw7GLrutmGGVJlrSmJJyCZPRe1MqY,5910
61
+ kolega_code/agent/tests/services/__init__.py,sha256=i-cXS1FVIV4__6BLezd37SxOLN-8f8uC4RAwYhv2cT8,24
62
+ kolega_code/agent/tests/services/test_browser.py,sha256=vf2V-IdgBTrewTcm7c4oAdaGSxwMcx0QcncbSdxcb1E,19083
63
+ kolega_code/agent/tests/services/test_browser_parity.py,sha256=aOnU9qOdt5-Jx4AcReaO2eAJ9JvE2DJPNJQ0m49BZNE,16574
64
+ kolega_code/agent/tests/services/test_file_system.py,sha256=GP1FHhG5s7gGEnjjXzkTIXsmwXPHcez_NhlX2_MiV5U,25503
65
+ kolega_code/agent/tests/services/test_sandbox_terminal_input.py,sha256=PmcWpWFkJPTidmyY5Y5kUebkzf-ArjX7cQJTHx2LRHc,3114
66
+ kolega_code/agent/tests/services/test_terminal.py,sha256=QznD3K0LV8YcvYHhStmbdxF2eC64RGRNgbqX64iTH3s,6108
67
+ kolega_code/agent/tests/services/test_terminal_command_tracking.py,sha256=nTSDcjnMJcTPKc0IeavZDD_BwYnGRqbINraZXcJde7c,15882
68
+ kolega_code/agent/tests/services/test_terminal_state_serializer.py,sha256=l4ildKH-IdZ35ec0avCcn9XYUrwUYDzOU2codRvD4_M,10725
69
+ kolega_code/agent/tests/tool_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ kolega_code/agent/tests/tool_backend/test_agent_tool.py,sha256=fBNnntHbPbFW90maAhn5E_rO88oJtfwyybgxlsoQgkw,14467
71
+ kolega_code/agent/tests/tool_backend/test_base_tool.py,sha256=-Rs1DXLKKQaOlU4buE8LnZIzf0y-Ywi03BiZNyzSaS8,5122
72
+ kolega_code/agent/tests/tool_backend/test_browser_tool.py,sha256=xdHSrbAeRGczqBh9C-2DkWhBoFaSVdAUHnFre_sytx4,13343
73
+ kolega_code/agent/tests/tool_backend/test_build_tool.py,sha256=1pEy_j_U6822VLm6u0dghDP9zx1hCoOkanuB72TUpWs,2621
74
+ kolega_code/agent/tests/tool_backend/test_create_file_tool.py,sha256=QQnYMvsxyhQvklG39RVkM08FcaHrWLesWkFmCid-PGM,4479
75
+ kolega_code/agent/tests/tool_backend/test_glob_tool.py,sha256=lG1m1Jt6-dyqC4vEQFm32bIwDA8mqDffPBauIcfgPq4,7049
76
+ kolega_code/agent/tests/tool_backend/test_glob_tool_sandbox_parity.py,sha256=O_J3M1uHzUPKDXc719cKFayNkZfv-rtIkKi0s2LurhE,7894
77
+ kolega_code/agent/tests/tool_backend/test_list_directory_tool.py,sha256=NIJYGPp9iwjW1CQoiy0MsTv-jGuov3ui4hKIeJIq2Ic,10880
78
+ kolega_code/agent/tests/tool_backend/test_read_file_tool.py,sha256=4FdL3inRC6gUhHOkUfDUDYlJKav8oDdwmTrULM1Mnzk,7665
79
+ kolega_code/agent/tests/tool_backend/test_replace_entire_file_tool.py,sha256=yHj2jOKYjPS0hDaDSpO6pSB86Ws0bG0og33jeJG2CTw,4653
80
+ kolega_code/agent/tests/tool_backend/test_replace_lines_tool.py,sha256=TEMrYdhgGZ97R0JsU5xTQrY5756ei7Uw3_VmTmF2rBc,6387
81
+ kolega_code/agent/tests/tool_backend/test_search_and_replace_tool.py,sha256=y0MgRXMbisTQ7DDqGr3rjLSfCDJbqOsAVv0IyA9mB4c,5046
82
+ kolega_code/agent/tests/tool_backend/test_search_codebase_tool.py,sha256=zZpKZgadeFUl_CYE_27sQ3ekFEY3zpjQMNr3CWqk0C4,9403
83
+ kolega_code/agent/tests/tool_backend/test_terminal_tool.py,sha256=hOcXuXkjRPq7C1QhLOMYyea9uvi0HN9XDYpcaxEvjTY,22442
84
+ kolega_code/agent/tests/tool_backend/test_think_hard_integration.py,sha256=MyCSDLwzV3sd9nmRE312YnUmPEw8b_O9eq7_OeLs6e8,7108
85
+ kolega_code/agent/tests/tool_backend/test_think_hard_streaming.py,sha256=qPklQF4fw8I7HRz2nxKxunkzHfrMZ2vfi8dPRpnE7pk,17188
86
+ kolega_code/agent/tests/tool_backend/test_web_fetch_tool.py,sha256=YPTUu01MGezbZ84vsXEGO8BEBWv-EWB0RugNgf1mqYc,8599
87
+ kolega_code/agent/tool_backend/agent_tool.py,sha256=EhsH_N-hufVSIfcd4lgoa--hq81nqLn3AttBH2OaRCM,16648
88
+ kolega_code/agent/tool_backend/apply_edit_tool.py,sha256=wh1uMuIg46P9eH5a4hbkYXG2q6vUIpBye8Mav9DYVQA,4422
89
+ kolega_code/agent/tool_backend/apply_patch_tool.py,sha256=hr2JEm5nXb3lnE_j20pPFKsyeR5KRi9htfFJbukXdOI,18828
90
+ kolega_code/agent/tool_backend/base_tool.py,sha256=4_O6ESo7VN8IGzj-tujX6PhBkH2w9iIa6lm5a5xclnI,6963
91
+ kolega_code/agent/tool_backend/browser_tool.py,sha256=YSsrXbrRFW7YLviNmAhGn5_haaIjy4hDrnNQ_rMSQJ0,11876
92
+ kolega_code/agent/tool_backend/build_tool.py,sha256=my0mC19ainx_-Twdx9HdgpBVFPSbXGQ0eDej_IHoYPU,2792
93
+ kolega_code/agent/tool_backend/create_file_tool.py,sha256=RuX4SInfBxWc2JD9po8zg5az-l7fHStMg0qd-1eKxIg,2102
94
+ kolega_code/agent/tool_backend/glob_tool.py,sha256=EtxMrD521ffGy3qU4RsLCwqj4raNDQ5vvuE45UiAnXk,11092
95
+ kolega_code/agent/tool_backend/list_directory_tool.py,sha256=koK6HQeMo1MJoPU5fEZM-SMbE0ZTIFufAdTVrJtJLLc,11318
96
+ kolega_code/agent/tool_backend/memory_tool.py,sha256=hypLkw1lILozS4fThlV3wDFe4wppP8EJoUJDF7royaU,3181
97
+ kolega_code/agent/tool_backend/read_file_tool.py,sha256=fpBjwe2oALmQTpnmh1NgyZMa1O1SG3pzrqkODSXuzx0,4637
98
+ kolega_code/agent/tool_backend/replace_entire_file_tool.py,sha256=xOKHLNiYHT9KuxCR9_c1GvMHCpspw22c7WSDmCDIveY,1686
99
+ kolega_code/agent/tool_backend/replace_lines_tool.py,sha256=82s6TIl5NMg--ek2mvDGrQwgISf33Rhdx9QiiqoOfpY,4278
100
+ kolega_code/agent/tool_backend/search_and_replace_tool.py,sha256=r2tWPMwb_Da_BUzX7lspDw5Sxd5eIQV_qQhPvjznQQc,6539
101
+ kolega_code/agent/tool_backend/search_codebase_tool.py,sha256=70mQFO0n04oypI3tEWsuwTPNfB3EEBVuA8HoRRliPWk,13650
102
+ kolega_code/agent/tool_backend/streaming_tool.py,sha256=CaoycempH9nxEZ2X1sFgydLcQfHC0xy3Miu_w8PtEZ4,1842
103
+ kolega_code/agent/tool_backend/terminal_tool.py,sha256=RIBx-oEGzzZQE0GDX-bznLpxkBVh3LyQlGZsy_jcla8,26654
104
+ kolega_code/agent/tool_backend/think_hard_tool.py,sha256=S5SL8XxEMknTnx7iYHnUbq783S-G0Wbo8FKgfxoMqG8,10026
105
+ kolega_code/agent/tool_backend/web_fetch_tool.py,sha256=Y2OUYJEHE6lnxeJ_VfTGQNJxybqD6bXbzpEJvTHuT6g,8744
106
+ kolega_code/agent/utils/commands.py,sha256=nIz5EnXlvCRr8Qsc5fid7bzTUC0-sBQA2pb1EXQV9Ig,3461
107
+ kolega_code/cli/__init__.py,sha256=IktV9YH_Is77fDr8LGsymWL-h7-EWH1e3Wj9VVaDM-s,46
108
+ kolega_code/cli/app.py,sha256=SOGyuDolAAGEwpZo67hKugYpHhJdFEC-mF2vlWNBBPg,113232
109
+ kolega_code/cli/config.py,sha256=4rQRgLHiMA5vLvezL0HLPbdKqXpL0H31vrSvi2w7gQg,10496
110
+ kolega_code/cli/connection.py,sha256=eXti1P_ZpqvQhGLMnPsrQ07YUeXUsztHpPI3AnX4T48,1713
111
+ kolega_code/cli/file_index.py,sha256=oL6gCXeg7fPLS7JhlmWRue4kAZG41bOVhfG_nQJn8Eo,5105
112
+ kolega_code/cli/main.py,sha256=Q1rTLcmLaxoZ5NrLJ5DFs2sPTrEb9JvL66v6sQOn2F4,22777
113
+ kolega_code/cli/mentions.py,sha256=XtJNdqsW58T51De-Q8WaqWO_BFGtDF8yz7uuvBcOYJk,5176
114
+ kolega_code/cli/messages.py,sha256=Kz77nxX1tCUuV37CDcad3Zty4ocyPrYQWXeROJoAefg,3640
115
+ kolega_code/cli/provider_registry.py,sha256=AyWe5bQ3UYqGe7NmdONL3hlEEH1cXyn2-vM8cp-5rg8,2788
116
+ kolega_code/cli/session_store.py,sha256=hXw1GDcp87OREZnhNkMgxQGs8zjZdag-g-UjsiKsH8U,7418
117
+ kolega_code/cli/settings.py,sha256=RSfIazBNb0c8t_m-yVBxBYvrrlQ7jfeM4sKf4_CHz-A,2870
118
+ kolega_code/cli/skills.py,sha256=28fqDUZ6tHYdKtgKNO8TzvZ_GTeQl-V7p_DtILfXafU,14146
119
+ kolega_code/cli/slash_commands.py,sha256=iwDjBoMLd9RoeOsFkFgtq04GJmdIuBinwGOb59mtc-A,4037
120
+ kolega_code/cli/theme.py,sha256=GrIlJuAUeUxN8yzGAXd0oW54PgnC6FfimcT3kc6VGOA,4898
121
+ kolega_code/cli/tests/__init__.py,sha256=2gFf4eavl_-FUh9Q2Jan2t1kql0rqwLuvABcL278H3w,17
122
+ kolega_code/cli/tests/test_app.py,sha256=0jYSbgQkDMWaOexxM71kRIN7WIswIiS5xzUtsMucehQ,155692
123
+ kolega_code/cli/tests/test_cli_config.py,sha256=B1M_DXPB69ALoRbVC7e2XD2ZDdQ_IGz1GlP4T8hQFT4,7106
124
+ kolega_code/cli/tests/test_connection.py,sha256=yypXnz-f6i0cXScyefezEaZ06QW-WIsmZgm2vDxYAQc,938
125
+ kolega_code/cli/tests/test_file_index.py,sha256=Rq3q7hqeWp8N3u74AxnZmpw-ST-dSnBQ0mbgW8Lksto,4016
126
+ kolega_code/cli/tests/test_main.py,sha256=e8cPP5nBUM2bCoNg7qohBzQP9nXms21RxoO54CuXUAE,15923
127
+ kolega_code/cli/tests/test_mentions.py,sha256=zKpJH4mA5FiXqNPjqbNPxbS0FgT6Z1hJUJ9G_DGrTCQ,4700
128
+ kolega_code/cli/tests/test_session_store.py,sha256=C8HomYdAt7g9Nh9Eubi9tzzP74kwWVWywR5yFX_L90M,2490
129
+ kolega_code/cli/tests/test_settings.py,sha256=02NDJRp-ye_XfK5pdcyXvuMbtgce6pIr_UAtRGG4sSU,2126
130
+ kolega_code/cli/tests/test_skills.py,sha256=Vo1fTi9wYc4Lh9NiHs8JSkJxyLId_U_V2Y-oDPJdg8c,6042
131
+ kolega_code/cli/tests/test_slash_commands.py,sha256=PXOvwAgbC2Xw8dOJxq3UNGYGv5meSp41Wn_eosSOC8E,3051
132
+ kolega_code/llm/client.py,sha256=s72jJzCECjNsSwQT_LASQU0fJf4M0BEJVG3I5vW2I3g,13254
133
+ kolega_code/llm/exceptions.py,sha256=4JBz1FvfqNKe40sZMnk4WZPpNkytgb6HPyK0QEzr6dU,12404
134
+ kolega_code/llm/instrumented_client.py,sha256=YD8uqrrvseuPNQW79EtJuRGpJlGGrdq4VlXifqGKyaU,21020
135
+ kolega_code/llm/models.py,sha256=y3RJa4x9GyHxhqh9iNXbJnaTZVID8OjuiLfExJEwx2M,50346
136
+ kolega_code/llm/ratelimit.py,sha256=qW5KSecuW9rbazB4_1wLoXhTelV1_Z9XfT_W4QYXUk8,1698
137
+ kolega_code/llm/specs.py,sha256=J-FfRCXa_PnV9-8lV9H0dc9RxFBVXqcDT9TehvUXNak,4591
138
+ kolega_code/llm/tool_execution_ids.py,sha256=Wh0_rK14iq6bcJSLuKmH8qJF1Vnmlk4z21CmpKt34AA,666
139
+ kolega_code/llm/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ kolega_code/llm/providers/anthropic.py,sha256=bwr1H8UYyG5baYgrs5ME2_zBtaU6NiIJY3JF4RzDD1k,15719
141
+ kolega_code/llm/providers/base.py,sha256=_yKlodHO_72cb64si_A_nZUeWYfrhjdO6XA1goDcH_Q,2485
142
+ kolega_code/llm/providers/google.py,sha256=s_oVrXX3PyTIijQ3agS7G-l_onuPyKuB6OBpZET6uks,5131
143
+ kolega_code/llm/providers/models.py,sha256=0kVUABvNDXlL1t1MMeBxr-5YPCXPR1_3_EEKHnbOlCk,801
144
+ kolega_code/llm/providers/openai.py,sha256=oy8jpWtARWI0si0Zg4Q_kGTJMy-nAK1lrh4c3p2OjEI,15370
145
+ kolega_code/models/__init__.py,sha256=ZH_txQ5WcBht8fkQKH7bqS3nOpeHuBKDWyJ75B-qh10,220
146
+ kolega_code/models/sandbox_terminal_state.py,sha256=4CRnTPpGxNE6KwsLOSD8G9PwquOIGOcI5dx2E4o-SjE,2141
147
+ kolega_code/sandbox/README.md,sha256=LIpzvTF0s0asmWgtHkB1CMHuo-Gne-NkohbJk5cUkJI,5944
148
+ kolega_code/sandbox/__init__.py,sha256=lCOGKa0dEjs-7kvEMwWsLE1Mejwh6lSe_IAemY4R69M,656
149
+ kolega_code/sandbox/async_filesystem.py,sha256=8hGqyxxfS3YdYMMmn7YNbsissWABuj4tJznYPywbvgI,18407
150
+ kolega_code/sandbox/base.py,sha256=1UPcVs-Qhj1JYkBliRERFYLv3J4BnYj3udAqrzHXn_Y,8522
151
+ kolega_code/sandbox/browser.py,sha256=L26OzTb-3AwetTp_DdsRUK5fNT0UuhQwAz1I6R-RM9g,809
152
+ kolega_code/sandbox/event_loop.py,sha256=AZ1Dw48PohCvkGdF8ipMmvSH4B7ioXCeAgvDggiShSM,1426
153
+ kolega_code/sandbox/filesystem.py,sha256=f-uytGlt_3L7ymQKOTs1gW7blAlcqUMFIIP48azqrnY,13457
154
+ kolega_code/sandbox/local.py,sha256=LBTj5pgyLQvfFA341gjYfJi7rWkGa_7sqf9maZRk7KM,5128
155
+ kolega_code/sandbox/serializer.py,sha256=EwGgEGGqEcFUGpJPKELKZXSnEuBdM2rsHU4DLa5v-cU,7213
156
+ kolega_code/sandbox/terminal.py,sha256=B6Rg1KJwE5OH8ET6-RrsSkxTs-TNE7gDOybvFpTfLk4,33535
157
+ kolega_code/sandbox/utils.py,sha256=OjWDsXz7VpJpl1PKFisNVqWpeCqYswTSWTOLip-lmEw,8061
158
+ kolega_code/services/base.py,sha256=wGgCIRZi8hX4S5S-GimoqC4O9_dEbMjAIgLuJEGgU2E,7620
159
+ kolega_code/services/browser.py,sha256=3ha0tWDYUkKLi4rBNlzMAAW5HDW_4zEruAqokLGaIB4,18344
160
+ kolega_code/services/file_system.py,sha256=8yl25CaghLK-_e_sOhZHwDB5r4IRq_GZHulx9h5rKME,22668
161
+ kolega_code/services/html.py,sha256=sV6HU9pTSYDgwn4Pr4blHyVmhmE7fD-lUaxZtdweSLc,8001
162
+ kolega_code/services/terminal.py,sha256=UtmvmNguClfy5Pa0le6xsAfWldwIcyI288JwPlNTkMQ,33731
163
+ kolega_code/tools/__init__.py,sha256=296Q36x1PBTovK4kpUK1T1ZLIWUeiZgnyY9bXLDGfbM,712
164
+ kolega_code/tools/core.py,sha256=pa6KVG86cXtNaF_HT-Afveuiq8IX8x208IrUNCNNQYQ,1113
165
+ kolega_code/tools/definitions.py,sha256=Haw9KWLNtypvc3vofRaDaX0Kxilj17fqntTUiiUhEjI,2578
166
+ kolega_code/tools/registry.py,sha256=AhfAhpPC-49RBH1PVvwJcZKprXFANqS5-RghxVYbvqA,2478
167
+ kolega_code-0.1.0.dist-info/METADATA,sha256=bXbUP1EaXHmNxqpVopZ-vmmqXUUENdXk5n40ky2e7J0,5616
168
+ kolega_code-0.1.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
169
+ kolega_code-0.1.0.dist-info/entry_points.txt,sha256=RoAZYNg_7kSVI0eKigXNpDUIWW4T4OKdu7kFkaG3I2Q,58
170
+ kolega_code-0.1.0.dist-info/licenses/LICENSE,sha256=bGIi1IqApyT2G4aB7xKPMgiq5-8kOGN609ZkhT_-qbg,1068
171
+ kolega_code-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ kolega-code = kolega_code.cli.main:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kolega Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.