roboz 0.1.2.dev11__tar.gz → 0.1.2.dev12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/CHANGELOG.md +17 -1
  2. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/PKG-INFO +76 -15
  3. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/README.md +73 -13
  4. roboz-0.1.2.dev12/docs/catalogues.md +156 -0
  5. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/pyproject.toml +12 -17
  6. roboz-0.1.2.dev12/src/roboz/endpoints/__init__.py +1 -0
  7. roboz-0.1.2.dev12/src/roboz/endpoints/__main__.py +7 -0
  8. roboz-0.1.2.dev12/src/roboz/endpoints/_inventory_codec.py +281 -0
  9. roboz-0.1.2.dev12/src/roboz/endpoints/_inventory_codegen.py +126 -0
  10. roboz-0.1.2.dev12/src/roboz/endpoints/adapters/__init__.py +1 -0
  11. roboz-0.1.2.dev12/src/roboz/endpoints/adapters/openai_compatible.py +250 -0
  12. roboz-0.1.2.dev12/src/roboz/endpoints/catalog.py +89 -0
  13. roboz-0.1.2.dev12/src/roboz/endpoints/catalog.pyi +35 -0
  14. roboz-0.1.2.dev12/src/roboz/endpoints/cli.py +281 -0
  15. roboz-0.1.2.dev12/src/roboz/endpoints/inventory.py +63 -0
  16. roboz-0.1.2.dev12/src/roboz/endpoints/inventory.pyi +37 -0
  17. roboz-0.1.2.dev12/src/roboz/endpoints/specs.py +40 -0
  18. roboz-0.1.2.dev12/src/roboz/shed/__init__.py +1 -0
  19. roboz-0.1.2.dev12/src/roboz/shed/agents/__init__.py +6 -0
  20. roboz-0.1.2.dev12/src/roboz/shed/agents/librarian.py +50 -0
  21. roboz-0.1.2.dev12/src/roboz/shed/agents/orchestrator.py +49 -0
  22. roboz-0.1.2.dev12/src/roboz/shed/capabilities.py +354 -0
  23. roboz-0.1.2.dev12/src/roboz/shed/dependency_health.py +328 -0
  24. roboz-0.1.2.dev12/src/roboz/shed/deployments/__init__.py +5 -0
  25. roboz-0.1.2.dev12/src/roboz/shed/deployments/robosprawl.py +75 -0
  26. roboz-0.1.2.dev12/src/roboz/shed/identifiers.py +30 -0
  27. roboz-0.1.2.dev12/src/roboz/shed/models.py +242 -0
  28. roboz-0.1.2.dev12/src/roboz/shed/sandbox.py +226 -0
  29. roboz-0.1.2.dev12/src/roboz/shed/skills/__init__.py +8 -0
  30. roboz-0.1.2.dev12/src/roboz/shed/skills/cli_tools/__init__.py +10 -0
  31. roboz-0.1.2.dev12/src/roboz/shed/skills/cli_tools/prompts.py +195 -0
  32. roboz-0.1.2.dev12/src/roboz/shed/skills/email_tools/__init__.py +10 -0
  33. roboz-0.1.2.dev12/src/roboz/shed/skills/email_tools/prompts.py +125 -0
  34. roboz-0.1.2.dev12/src/roboz/shed/skills/file_editing/__init__.py +27 -0
  35. roboz-0.1.2.dev12/src/roboz/shed/skills/file_editing/prompts.py +149 -0
  36. roboz-0.1.2.dev12/src/roboz/shed/skills/robosprawl.py +143 -0
  37. roboz-0.1.2.dev12/src/roboz/shed/tools/__init__.py +52 -0
  38. roboz-0.1.2.dev12/src/roboz/shed/tools/_snapshot_metadata.py +90 -0
  39. roboz-0.1.2.dev12/src/roboz/shed/tools/apply_patch.py +194 -0
  40. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/__init__.py +23 -0
  41. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/__init__.py +12 -0
  42. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/command.py +162 -0
  43. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/resolve.py +388 -0
  44. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/specs.py +131 -0
  45. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/__init__.py +80 -0
  46. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/cmd_spec.py +48 -0
  47. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/constants.py +36 -0
  48. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/formatting.py +252 -0
  49. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/path_extractors.py +179 -0
  50. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/__init__.py +35 -0
  51. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/compactify_messages.py +260 -0
  52. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/prompts.py +107 -0
  53. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/summarize.py +279 -0
  54. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/summary_prompts.py +61 -0
  55. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory.py +287 -0
  56. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory_example.py +110 -0
  57. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory_prompts.py +110 -0
  58. roboz-0.1.2.dev12/src/roboz/shed/tools/contexts.py +170 -0
  59. roboz-0.1.2.dev12/src/roboz/shed/tools/email/__init__.py +54 -0
  60. roboz-0.1.2.dev12/src/roboz/shed/tools/email/contracts.py +244 -0
  61. roboz-0.1.2.dev12/src/roboz/shed/tools/email/drafts.py +414 -0
  62. roboz-0.1.2.dev12/src/roboz/shed/tools/email/factory.py +266 -0
  63. roboz-0.1.2.dev12/src/roboz/shed/tools/email/inputs.py +66 -0
  64. roboz-0.1.2.dev12/src/roboz/shed/tools/email/messages.py +248 -0
  65. roboz-0.1.2.dev12/src/roboz/shed/tools/email/runtime.py +31 -0
  66. roboz-0.1.2.dev12/src/roboz/shed/tools/guard.py +161 -0
  67. roboz-0.1.2.dev12/src/roboz/shed/tools/guard_formatting.py +58 -0
  68. roboz-0.1.2.dev12/src/roboz/shed/tools/librarian_errors.py +8 -0
  69. roboz-0.1.2.dev12/src/roboz/shed/tools/memory_files.py +117 -0
  70. roboz-0.1.2.dev12/src/roboz/shed/tools/purge_files.py +98 -0
  71. roboz-0.1.2.dev12/src/roboz/shed/tools/runner.py +251 -0
  72. roboz-0.1.2.dev12/src/roboz/shed/tools/sleep_between_runs.py +63 -0
  73. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversation_example.py +38 -0
  74. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversation_prompts.py +89 -0
  75. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversations.py +320 -0
  76. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_normalize.py +61 -0
  77. roboz-0.1.2.dev12/src/roboz/shed/tools/stop_when_watched_agents_inactive.py +50 -0
  78. roboz-0.1.2.dev12/src/roboz/shed/tools/truncation.py +20 -0
  79. roboz-0.1.2.dev12/src/roboz/shed/tools/types.py +30 -0
  80. roboz-0.1.2.dev12/src/roboz/shed/tools/utils.py +252 -0
  81. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/.gitignore +0 -0
  82. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/LICENSE +0 -0
  83. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/__init__.py +0 -0
  84. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/__init__.pyi +0 -0
  85. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/_naming.py +0 -0
  86. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/__init__.py +0 -0
  87. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/_execution_context.py +0 -0
  88. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/_identifiers.py +0 -0
  89. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/_notifications.py +0 -0
  90. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/_prompts.py +0 -0
  91. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/_tool_observer.py +0 -0
  92. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/background_agent.py +0 -0
  93. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/core.py +0 -0
  94. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/prompt_agent_tool.py +0 -0
  95. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/agent/subagent.py +0 -0
  96. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/dependencies.py +0 -0
  97. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/deployment.py +0 -0
  98. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/examples/__init__.py +0 -0
  99. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/examples/complex.py +0 -0
  100. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/examples/simple.py +0 -0
  101. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/examples/simpsons_quotes.py +0 -0
  102. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/exceptions.py +0 -0
  103. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/__init__.py +0 -0
  104. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/_diagnostics.py +0 -0
  105. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/_retry.py +0 -0
  106. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/_truncation.py +0 -0
  107. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/binding.py +0 -0
  108. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/calls.py +0 -0
  109. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/completion.py +0 -0
  110. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/endpoints.py +0 -0
  111. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/openai_compatible.py +0 -0
  112. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/openrouter.py +0 -0
  113. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/llm/prompts.py +0 -0
  114. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/__init__.py +0 -0
  115. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/_schema.py +0 -0
  116. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/_serialization.py +0 -0
  117. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/_telemetry.py +0 -0
  118. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/core.py +0 -0
  119. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/messages.py +0 -0
  120. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/models/truncation.py +0 -0
  121. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/py.typed +0 -0
  122. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/__init__.py +0 -0
  123. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/_environment.py +0 -0
  124. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/_external.py +0 -0
  125. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/_logging.py +0 -0
  126. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/_paths.py +0 -0
  127. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/events.py +0 -0
  128. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/io.py +0 -0
  129. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/observability.py +0 -0
  130. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/__init__.py +0 -0
  131. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/activity.py +0 -0
  132. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/schema.py +0 -0
  133. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/pipe.py +0 -0
  134. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/runtime/sinks.py +0 -0
  135. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/skill/__init__.py +0 -0
  136. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/skill/_prompts.py +0 -0
  137. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/skill/core.py +0 -0
  138. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/__init__.py +0 -0
  139. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/_prompts.py +0 -0
  140. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/_protocols.py +0 -0
  141. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/_typing.py +0 -0
  142. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/context.py +0 -0
  143. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/core.py +0 -0
  144. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tooling/decorators.py +0 -0
  145. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tools/__init__.py +0 -0
  146. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tools/_identifiers.py +0 -0
  147. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tools/control.py +0 -0
  148. {roboz-0.1.2.dev11 → roboz-0.1.2.dev12}/src/roboz/tools/interaction.py +0 -0
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.1.2.dev12 - 2026-09-21
6
+
7
+ - Breaking: consolidate core, Shed, and Endpoints into the `roboz`
8
+ distribution. Replace `roboshed` imports with `roboz.shed` and
9
+ `roboz_endpoints` imports with `roboz.endpoints`; no compatibility packages
10
+ or forwarding namespaces are provided.
11
+ - Install the OpenAI SDK as a required dependency while retaining deferred
12
+ endpoint client construction and credential-free imports. Remove package
13
+ extras and the `roboz-endpoints` executable; manage catalogues with
14
+ `python -m roboz.endpoints inventory`.
15
+ - Exclude Proton Bridge from the consolidated distribution. Its pre-migration
16
+ implementation and development setup remain preserved on the
17
+ `wip/proton-bridge` branch.
18
+ - Consolidate package documentation into the main README and move the detailed
19
+ project catalogue guide to `docs/catalogues.md`.
20
+
5
21
  ## 0.1.2.dev11 - 2026-09-21
6
22
 
7
23
  - Ship the simple and complex examples in `roboz.examples`, so installed users
@@ -172,7 +188,7 @@
172
188
 
173
189
  - Breaking: remove the `roboz[openai]` extra. Install
174
190
  `roboz-endpoints[openai]` directly for the endpoint catalogue and SDK adapter;
175
- it installs core automatically. See `packages/endpoints/README.md` for migration.
191
+ it installs core automatically.
176
192
 
177
193
  - Breaking: move dependency primitives from `roboz.tooling.dependencies` and
178
194
  `roboz.tooling` to `roboz.dependencies`. Update those imports; the existing
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: roboz
3
- Version: 0.1.2.dev11
3
+ Version: 0.1.2.dev12
4
4
  Import-Name: roboz
5
- Summary: Typed primitives for composable agentic workflows
5
+ Summary: Typed agents, reusable capabilities, and model catalogues
6
6
  Project-URL: Homepage, https://github.com/Tachion-Oy/roboz
7
7
  Project-URL: Repository, https://github.com/Tachion-Oy/roboz
8
8
  Project-URL: Issues, https://github.com/Tachion-Oy/roboz/issues
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
20
20
  Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.13
23
+ Requires-Dist: openai<3,>=2.8.1
23
24
  Requires-Dist: pydantic>=2.12.4
24
25
  Requires-Dist: python-dotenv>=1.2.1
25
26
  Requires-Dist: rich>=14.2.0
@@ -236,7 +237,8 @@ uv run python -m roboz.examples.complex
236
237
 
237
238
  ## Try it out
238
239
 
239
- Add RoboZ to a uv project and run the same bundled example:
240
+ Add RoboZ to a uv project and run the same bundled example. The one dependency
241
+ includes the core framework, Shed, Endpoints, and the OpenAI SDK:
240
242
 
241
243
  ```bash
242
244
  uv add roboz
@@ -250,21 +252,80 @@ python -m pip install roboz
250
252
  python -m roboz.examples.simple
251
253
  ```
252
254
 
253
- ## Packages
255
+ ## Shed
254
256
 
255
- This repository contains four independently versioned Python distributions.
256
- They share development and release tooling, but are published separately so an
257
- application only needs to install the parts it uses.
257
+ `roboz.shed` provides reusable components built on the core primitives. Use an
258
+ individual guarded file or email tool, add a capability to a
259
+ `DeployableAgent`, start from the orchestrator and Librarian definitions, or use
260
+ the RoboSprawl recipe to assemble a persistent project agent. Applications own
261
+ the model endpoints, event sinks, lifecycle, and filesystem layout.
258
262
 
259
- | Distribution | Import | Provides |
260
- | --- | --- | --- |
261
- | `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
262
- | [`roboshed`](https://pypi.org/project/roboshed/) | `roboshed` | Reusable capabilities, guarded system tools, memory, agents, and deployment building blocks. |
263
- | [`roboz-endpoints`](https://pypi.org/project/roboz-endpoints/) | `roboz_endpoints` | Model catalogues and optional provider adapters. |
264
- | [`roboz-proton-bridge`](https://pypi.org/project/roboz-proton-bridge/) | `roboz_proton_bridge` | Proton Bridge email integration. |
263
+ - `roboz.shed.agents` contains the orchestrator and Librarian definitions.
264
+ - `roboz.shed.capabilities` binds reusable behavior to agent configuration.
265
+ - `roboz.shed.tools` contains guarded file commands, patching, email contracts,
266
+ conversation compaction, snapshots, memory consolidation, and retention.
267
+ - `roboz.shed.skills` supplies the agent instructions for those tools.
268
+ - `roboz.shed.sandbox` defines filesystem scopes and tool permission policies.
269
+ - `roboz.shed.dependency_health` checks configured external resources.
265
270
 
266
- The companion packages build on `roboz`; `roboz-proton-bridge` also uses
267
- `roboshed`.
271
+ Shed permission policies guard Shed tools. They are not an operating-system
272
+ sandbox.
273
+
274
+ ## Endpoints and model catalogues
275
+
276
+ `roboz.endpoints` builds concrete `LLMEndpoint` and `TranscriptionEndpoint`
277
+ objects for OpenAI-compatible APIs. The OpenAI SDK is installed with RoboZ, but
278
+ client construction and credential lookup remain deferred until an endpoint is
279
+ materialized or used. Importing and inspecting the bundled catalogue needs no
280
+ credentials:
281
+
282
+ ```python
283
+ from roboz.endpoints.inventory import openrouter
284
+
285
+ endpoint = openrouter.z_ai__glm_5_3
286
+ print(endpoint.model_name)
287
+ print(endpoint.max_context_tokens)
288
+ ```
289
+
290
+ The bundled OpenRouter, Cerebras, and Groq entries are examples. Export them to
291
+ an editable project catalogue, change `models.json`, then generate the Python
292
+ snapshot:
293
+
294
+ ```bash
295
+ uv run python -m roboz.endpoints inventory export
296
+ # Edit model_catalogue/models.json.
297
+ uv run python -m roboz.endpoints inventory import
298
+ ```
299
+
300
+ For a src-layout project named `my-app`, the commands create
301
+ `src/my_app/model_catalogue/models.json` and
302
+ `src/my_app/model_catalogue/providers.py`. Import the generated catalogue from
303
+ your application package:
304
+
305
+ ```python
306
+ from my_app.model_catalogue.providers import my_service
307
+
308
+ endpoint = my_service.chat
309
+ ```
310
+
311
+ Only OpenAI-compatible API protocols are supported. An inventory entry records
312
+ a provider URL, the name of its credential environment variable, and its model
313
+ routes; it never stores the credential itself. See the
314
+ [project catalogue guide](docs/catalogues.md) for custom paths, inventory
315
+ format, reset, and recovery.
316
+
317
+ ## Module map
318
+
319
+ | Module | Provides |
320
+ | --- | --- |
321
+ | `roboz` | Agent, tool, factory, and skill authoring facade. |
322
+ | `roboz.agent` | Agent implementations, subagents, and background agents. |
323
+ | `roboz.deployment` | Reusable agent definitions and capabilities. |
324
+ | `roboz.llm` | Endpoint contracts, selection, calls, and request policies. |
325
+ | `roboz.models` | Typed messages and tool input/output models. |
326
+ | `roboz.runtime` | Events, pipes, sinks, persistence, and observability. |
327
+ | `roboz.shed` | Reusable capabilities, guarded tools, agents, and recipes. |
328
+ | `roboz.endpoints` | OpenAI-compatible adapters and typed model catalogues. |
268
329
 
269
330
  ## Development
270
331
 
@@ -209,7 +209,8 @@ uv run python -m roboz.examples.complex
209
209
 
210
210
  ## Try it out
211
211
 
212
- Add RoboZ to a uv project and run the same bundled example:
212
+ Add RoboZ to a uv project and run the same bundled example. The one dependency
213
+ includes the core framework, Shed, Endpoints, and the OpenAI SDK:
213
214
 
214
215
  ```bash
215
216
  uv add roboz
@@ -223,21 +224,80 @@ python -m pip install roboz
223
224
  python -m roboz.examples.simple
224
225
  ```
225
226
 
226
- ## Packages
227
+ ## Shed
227
228
 
228
- This repository contains four independently versioned Python distributions.
229
- They share development and release tooling, but are published separately so an
230
- application only needs to install the parts it uses.
229
+ `roboz.shed` provides reusable components built on the core primitives. Use an
230
+ individual guarded file or email tool, add a capability to a
231
+ `DeployableAgent`, start from the orchestrator and Librarian definitions, or use
232
+ the RoboSprawl recipe to assemble a persistent project agent. Applications own
233
+ the model endpoints, event sinks, lifecycle, and filesystem layout.
231
234
 
232
- | Distribution | Import | Provides |
233
- | --- | --- | --- |
234
- | `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
235
- | [`roboshed`](https://pypi.org/project/roboshed/) | `roboshed` | Reusable capabilities, guarded system tools, memory, agents, and deployment building blocks. |
236
- | [`roboz-endpoints`](https://pypi.org/project/roboz-endpoints/) | `roboz_endpoints` | Model catalogues and optional provider adapters. |
237
- | [`roboz-proton-bridge`](https://pypi.org/project/roboz-proton-bridge/) | `roboz_proton_bridge` | Proton Bridge email integration. |
235
+ - `roboz.shed.agents` contains the orchestrator and Librarian definitions.
236
+ - `roboz.shed.capabilities` binds reusable behavior to agent configuration.
237
+ - `roboz.shed.tools` contains guarded file commands, patching, email contracts,
238
+ conversation compaction, snapshots, memory consolidation, and retention.
239
+ - `roboz.shed.skills` supplies the agent instructions for those tools.
240
+ - `roboz.shed.sandbox` defines filesystem scopes and tool permission policies.
241
+ - `roboz.shed.dependency_health` checks configured external resources.
238
242
 
239
- The companion packages build on `roboz`; `roboz-proton-bridge` also uses
240
- `roboshed`.
243
+ Shed permission policies guard Shed tools. They are not an operating-system
244
+ sandbox.
245
+
246
+ ## Endpoints and model catalogues
247
+
248
+ `roboz.endpoints` builds concrete `LLMEndpoint` and `TranscriptionEndpoint`
249
+ objects for OpenAI-compatible APIs. The OpenAI SDK is installed with RoboZ, but
250
+ client construction and credential lookup remain deferred until an endpoint is
251
+ materialized or used. Importing and inspecting the bundled catalogue needs no
252
+ credentials:
253
+
254
+ ```python
255
+ from roboz.endpoints.inventory import openrouter
256
+
257
+ endpoint = openrouter.z_ai__glm_5_3
258
+ print(endpoint.model_name)
259
+ print(endpoint.max_context_tokens)
260
+ ```
261
+
262
+ The bundled OpenRouter, Cerebras, and Groq entries are examples. Export them to
263
+ an editable project catalogue, change `models.json`, then generate the Python
264
+ snapshot:
265
+
266
+ ```bash
267
+ uv run python -m roboz.endpoints inventory export
268
+ # Edit model_catalogue/models.json.
269
+ uv run python -m roboz.endpoints inventory import
270
+ ```
271
+
272
+ For a src-layout project named `my-app`, the commands create
273
+ `src/my_app/model_catalogue/models.json` and
274
+ `src/my_app/model_catalogue/providers.py`. Import the generated catalogue from
275
+ your application package:
276
+
277
+ ```python
278
+ from my_app.model_catalogue.providers import my_service
279
+
280
+ endpoint = my_service.chat
281
+ ```
282
+
283
+ Only OpenAI-compatible API protocols are supported. An inventory entry records
284
+ a provider URL, the name of its credential environment variable, and its model
285
+ routes; it never stores the credential itself. See the
286
+ [project catalogue guide](docs/catalogues.md) for custom paths, inventory
287
+ format, reset, and recovery.
288
+
289
+ ## Module map
290
+
291
+ | Module | Provides |
292
+ | --- | --- |
293
+ | `roboz` | Agent, tool, factory, and skill authoring facade. |
294
+ | `roboz.agent` | Agent implementations, subagents, and background agents. |
295
+ | `roboz.deployment` | Reusable agent definitions and capabilities. |
296
+ | `roboz.llm` | Endpoint contracts, selection, calls, and request policies. |
297
+ | `roboz.models` | Typed messages and tool input/output models. |
298
+ | `roboz.runtime` | Events, pipes, sinks, persistence, and observability. |
299
+ | `roboz.shed` | Reusable capabilities, guarded tools, agents, and recipes. |
300
+ | `roboz.endpoints` | OpenAI-compatible adapters and typed model catalogues. |
241
301
 
242
302
  ## Development
243
303
 
@@ -0,0 +1,156 @@
1
+ # Project catalogues
2
+
3
+ A project catalogue is an editable JSON inventory plus a generated Python
4
+ module. It lets an application define its own OpenAI-compatible providers and
5
+ models without modifying RoboZ.
6
+
7
+ ## Standard workflow
8
+
9
+ Run these commands from the application project root:
10
+
11
+ ```bash
12
+ uv run python -m roboz.endpoints inventory export
13
+ # Edit the generated models.json.
14
+ uv run python -m roboz.endpoints inventory import
15
+ ```
16
+
17
+ The export command creates a `model_catalogue` package. The import command reads
18
+ `models.json` and generates `providers.py` beside it. Edit and retain the JSON;
19
+ do not edit the generated Python module.
20
+
21
+ For a project with `name = "my-app"` in `pyproject.toml`, the default location
22
+ follows the existing package layout:
23
+
24
+ - `src/my_app/__init__.py` → `src/my_app/model_catalogue/`
25
+ - `my_app/__init__.py` → `my_app/model_catalogue/`
26
+
27
+ If neither package exists, the CLI uses `model_catalogue/` in the project root.
28
+ For reliable imports from every application module, use `--path` to place the
29
+ catalogue inside the actual application package when automatic detection fails.
30
+
31
+ The generated package contains:
32
+
33
+ ```text
34
+ model_catalogue/
35
+ ├── __init__.py
36
+ ├── models.json # editable source
37
+ └── providers.py # generated snapshot
38
+ ```
39
+
40
+ Import through the application's package path:
41
+
42
+ ```python
43
+ from my_app.model_catalogue.providers import my_service
44
+ ```
45
+
46
+ ## Choose another name or location
47
+
48
+ `--path` selects the JSON file. Unless `--output` is provided, import generates
49
+ `providers.py` beside that JSON file. For example, to call the package
50
+ `endpoints`:
51
+
52
+ ```bash
53
+ mkdir -p src/my_app/endpoints
54
+ touch src/my_app/endpoints/__init__.py
55
+
56
+ uv run python -m roboz.endpoints inventory export \
57
+ --path src/my_app/endpoints/models.json
58
+
59
+ uv run python -m roboz.endpoints inventory import \
60
+ --path src/my_app/endpoints/models.json
61
+ ```
62
+
63
+ Then import it from any application module:
64
+
65
+ ```python
66
+ from my_app.endpoints.providers import my_service
67
+ ```
68
+
69
+ To choose the generated module name as well:
70
+
71
+ ```bash
72
+ uv run python -m roboz.endpoints inventory import \
73
+ --path src/my_app/endpoints/models.json \
74
+ --output src/my_app/endpoints/catalogue.py
75
+ ```
76
+
77
+ That module is imported as:
78
+
79
+ ```python
80
+ from my_app.endpoints.catalogue import my_service
81
+ ```
82
+
83
+ For custom paths, create the parent package and its `__init__.py` first. Paths
84
+ are relative to the directory in which the command runs.
85
+
86
+ ## Inventory format
87
+
88
+ The exported file is the complete starting inventory. A provider entry has its
89
+ service URL, the name of its credential environment variable, and one or more
90
+ models:
91
+
92
+ ```json
93
+ {
94
+ "schema_version": 1,
95
+ "providers": {
96
+ "my_service": {
97
+ "base_url": "https://models.example.com/v1",
98
+ "api_key_env": "MY_SERVICE_API_KEY",
99
+ "models": {
100
+ "chat": {
101
+ "model_id": "my-chat-model",
102
+ "endpoint_type": "llm",
103
+ "max_context_tokens": 128000
104
+ },
105
+ "voice": {
106
+ "model_id": "my-transcription-model",
107
+ "endpoint_type": "transcription"
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ Provider and model keys become Python names, so they must be valid public Python
116
+ identifiers. `model_id` is the identifier sent to the provider. A chat model
117
+ requires `max_context_tokens`; a transcription model does not accept it.
118
+
119
+ Only OpenAI-compatible APIs are currently supported. Store the environment
120
+ variable name in `api_key_env`, never the credential itself.
121
+
122
+ ## Regenerate after editing
123
+
124
+ Once `providers.py` exists, regenerate it with `--force`:
125
+
126
+ ```bash
127
+ uv run python -m roboz.endpoints inventory import --force
128
+ ```
129
+
130
+ For a custom location, pass the same `--path` and, if used originally,
131
+ `--output`. Restart the application so it imports the new snapshot. Package
132
+ upgrades do not replace a project catalogue.
133
+
134
+ ## Reset or recover
135
+
136
+ Reset restores the bundled examples after confirmation and discards catalogue
137
+ customizations:
138
+
139
+ ```bash
140
+ uv run python -m roboz.endpoints inventory reset
141
+ ```
142
+
143
+ For a custom catalogue, pass its `--path` and `--output`. Copy anything that
144
+ must be retained before confirming the reset.
145
+
146
+ If `models.json` was lost but the generated module remains, recover JSON without
147
+ executing the module:
148
+
149
+ ```bash
150
+ uv run python -m roboz.endpoints inventory export \
151
+ --from-module src/my_app/model_catalogue/providers.py \
152
+ --path recovered-models.json
153
+ ```
154
+
155
+ Use `uv run python -m roboz.endpoints inventory <command> --help` for the full
156
+ options of `export`, `import`, or `reset`.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "roboz"
3
- version = "0.1.2.dev11"
4
- description = "Typed primitives for composable agentic workflows"
3
+ version = "0.1.2.dev12"
4
+ description = "Typed agents, reusable capabilities, and model catalogues"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Tachion Oy" }]
7
7
  license = "Apache-2.0"
@@ -20,6 +20,7 @@ classifiers = [
20
20
  "Typing :: Typed",
21
21
  ]
22
22
  dependencies = [
23
+ "openai>=2.8.1,<3",
23
24
  "pydantic>=2.12.4",
24
25
  "python-dotenv>=1.2.1",
25
26
  "rich>=14.2.0",
@@ -29,20 +30,18 @@ dependencies = [
29
30
  requires = ["hatchling>=1.32"]
30
31
  build-backend = "hatchling.build"
31
32
 
32
- [tool.uv.workspace]
33
- members = ["packages/*"]
34
-
35
- [tool.uv.sources]
36
- roboz = { workspace = true }
37
- roboshed = { workspace = true }
38
- roboz-endpoints = { workspace = true }
39
- roboz-proton-bridge = { workspace = true }
40
-
41
33
  [tool.hatch.build.targets.wheel]
42
34
  packages = ["src/roboz"]
43
35
 
44
36
  [tool.hatch.build.targets.sdist]
45
- include = ["/src/roboz", "/README.md", "/CHANGELOG.md", "/LICENSE", "/pyproject.toml"]
37
+ include = [
38
+ "/src/roboz",
39
+ "/docs/catalogues.md",
40
+ "/README.md",
41
+ "/CHANGELOG.md",
42
+ "/LICENSE",
43
+ "/pyproject.toml",
44
+ ]
46
45
 
47
46
  [project.urls]
48
47
  Homepage = "https://github.com/Tachion-Oy/roboz"
@@ -53,7 +52,7 @@ Documentation = "https://github.com/Tachion-Oy/roboz#readme"
53
52
  [tool.pytest.ini_options]
54
53
  addopts = "--cov=roboz --cov-report=term-missing --ignore=tests/type_tests"
55
54
  python_files = ["test_*.py", "tests_*.py"]
56
- testpaths = ["tests", "packages/shed/tests", "packages/endpoints/tests", "packages/proton-bridge/tests"]
55
+ testpaths = ["tests"]
57
56
 
58
57
  [tool.ruff.lint]
59
58
  select = ["D", "E4", "E7", "E9", "F"]
@@ -63,16 +62,12 @@ convention = "google"
63
62
 
64
63
  [tool.ruff.lint.per-file-ignores]
65
64
  "examples/**/*.py" = ["D"]
66
- "packages/*/tests/**/*.py" = ["D"]
67
65
  "scripts/**/*.py" = ["D"]
68
66
  "tests/**/*.py" = ["D"]
69
67
 
70
68
  [dependency-groups]
71
69
  dev = [
72
70
  "check-wheel-contents>=0.6",
73
- "roboshed",
74
- "roboz-endpoints[openai]",
75
- "roboz-proton-bridge",
76
71
  "pyright>=1.1.411",
77
72
  "pytest>=7.0",
78
73
  "pytest-cov>=4.0",
@@ -0,0 +1 @@
1
+ """Typed model catalogues and OpenAI-compatible endpoint adapters."""
@@ -0,0 +1,7 @@
1
+ """Run catalogue management with ``python -m roboz.endpoints``."""
2
+
3
+ from roboz.endpoints.cli import main
4
+
5
+
6
+ if __name__ == "__main__":
7
+ raise SystemExit(main())