contraagent 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 (263) hide show
  1. contraagent/__init__.py +99 -0
  2. contraagent/__main__.py +3 -0
  3. contraagent/_internal/__init__.py +43 -0
  4. contraagent/_internal/backends/__init__.py +119 -0
  5. contraagent/_internal/backends/base.py +566 -0
  6. contraagent/_internal/backends/claude/__init__.py +5 -0
  7. contraagent/_internal/backends/claude/backend.py +310 -0
  8. contraagent/_internal/backends/claude/login.py +20 -0
  9. contraagent/_internal/backends/claude/wire.py +398 -0
  10. contraagent/_internal/backends/codex/__init__.py +5 -0
  11. contraagent/_internal/backends/codex/backend.py +397 -0
  12. contraagent/_internal/backends/codex/hooks.py +188 -0
  13. contraagent/_internal/backends/codex/wire.py +395 -0
  14. contraagent/_internal/backends/credentials.py +459 -0
  15. contraagent/_internal/backends/launch.py +490 -0
  16. contraagent/_internal/backends/live_processes.py +268 -0
  17. contraagent/_internal/backends/omp/__init__.py +6 -0
  18. contraagent/_internal/backends/omp/backend.py +455 -0
  19. contraagent/_internal/backends/omp/catalogue.py +29 -0
  20. contraagent/_internal/backends/omp/config.py +136 -0
  21. contraagent/_internal/backends/omp/isolation/config.yml +27 -0
  22. contraagent/_internal/backends/omp/rpc.py +358 -0
  23. contraagent/_internal/backends/omp/wire.py +413 -0
  24. contraagent/_internal/backends/opencode/__init__.py +5 -0
  25. contraagent/_internal/backends/opencode/backend.py +442 -0
  26. contraagent/_internal/backends/opencode/catalogue.py +37 -0
  27. contraagent/_internal/backends/opencode/wire.py +223 -0
  28. contraagent/_internal/backends/opencode_key.py +198 -0
  29. contraagent/_internal/backends/pi/__init__.py +5 -0
  30. contraagent/_internal/backends/pi/agent_dir.py +116 -0
  31. contraagent/_internal/backends/pi/backend.py +345 -0
  32. contraagent/_internal/backends/pi/catalogue.py +22 -0
  33. contraagent/_internal/backends/pi/login.py +15 -0
  34. contraagent/_internal/backends/pi/mcp.ts +16 -0
  35. contraagent/_internal/backends/pi/wire.py +88 -0
  36. contraagent/_internal/backends/plugin_files.py +32 -0
  37. contraagent/_internal/backends/process.py +314 -0
  38. contraagent/_internal/backends/refusal.py +162 -0
  39. contraagent/_internal/backends/streams.py +146 -0
  40. contraagent/_internal/backends/wire.py +243 -0
  41. contraagent/_internal/cli.py +478 -0
  42. contraagent/_internal/commandline.py +212 -0
  43. contraagent/_internal/contracts/__init__.py +8 -0
  44. contraagent/_internal/contracts/calls.py +239 -0
  45. contraagent/_internal/contracts/contract.py +707 -0
  46. contraagent/_internal/contracts/pointers.py +180 -0
  47. contraagent/_internal/contracts/validators.py +178 -0
  48. contraagent/_internal/dispatch/__init__.py +96 -0
  49. contraagent/_internal/dispatch/flow.py +519 -0
  50. contraagent/_internal/dispatch/interceptors.py +61 -0
  51. contraagent/_internal/dispatch/python_task.py +90 -0
  52. contraagent/_internal/dispatch/queue.py +713 -0
  53. contraagent/_internal/dispatch/records.py +374 -0
  54. contraagent/_internal/dispatch/task.py +291 -0
  55. contraagent/_internal/dispatch/templates.py +37 -0
  56. contraagent/_internal/docs.py +133 -0
  57. contraagent/_internal/errors.py +27 -0
  58. contraagent/_internal/execution/__init__.py +39 -0
  59. contraagent/_internal/execution/adapter.py +105 -0
  60. contraagent/_internal/execution/changes.py +143 -0
  61. contraagent/_internal/execution/cursor.py +236 -0
  62. contraagent/_internal/execution/estimates.py +263 -0
  63. contraagent/_internal/execution/file_schemas.py +88 -0
  64. contraagent/_internal/execution/journal.py +99 -0
  65. contraagent/_internal/execution/pipeline_files.py +172 -0
  66. contraagent/_internal/execution/python_tasks.py +272 -0
  67. contraagent/_internal/execution/recording.py +802 -0
  68. contraagent/_internal/execution/run.py +737 -0
  69. contraagent/_internal/execution/runner.py +678 -0
  70. contraagent/_internal/execution/schemas.py +383 -0
  71. contraagent/_internal/execution/teardown.py +96 -0
  72. contraagent/_internal/hub/__init__.py +23 -0
  73. contraagent/_internal/hub/client.py +121 -0
  74. contraagent/_internal/hub/core.py +227 -0
  75. contraagent/_internal/hub/openapi.json +590 -0
  76. contraagent/_internal/hub/postgres.py +345 -0
  77. contraagent/_internal/hub/protocol.py +132 -0
  78. contraagent/_internal/hub/relay.py +631 -0
  79. contraagent/_internal/hub/retention.py +159 -0
  80. contraagent/_internal/hub/s3.py +126 -0
  81. contraagent/_internal/hub/segment_format.py +204 -0
  82. contraagent/_internal/hub/segment_objects.py +179 -0
  83. contraagent/_internal/hub/segments.py +1092 -0
  84. contraagent/_internal/hub/server.py +803 -0
  85. contraagent/_internal/hub/source.py +225 -0
  86. contraagent/_internal/hub/store.py +385 -0
  87. contraagent/_internal/hub/streams.py +193 -0
  88. contraagent/_internal/monitor/__init__.py +14 -0
  89. contraagent/_internal/monitor/aggregate.py +109 -0
  90. contraagent/_internal/monitor/api.py +1203 -0
  91. contraagent/_internal/monitor/core.py +1102 -0
  92. contraagent/_internal/monitor/export.py +348 -0
  93. contraagent/_internal/monitor/openapi.json +6659 -0
  94. contraagent/_internal/monitor/server.py +554 -0
  95. contraagent/_internal/monitor/static/app.js +985 -0
  96. contraagent/_internal/monitor/static/apple-touch-icon.png +0 -0
  97. contraagent/_internal/monitor/static/favicon-32.png +0 -0
  98. contraagent/_internal/monitor/static/favicon.svg +1 -0
  99. contraagent/_internal/monitor/static/index.html +31 -0
  100. contraagent/_internal/monitor/static/ja.js +1 -0
  101. contraagent/_internal/monitor/trends.py +755 -0
  102. contraagent/_internal/monitor/views.py +81 -0
  103. contraagent/_internal/pipeline/__init__.py +29 -0
  104. contraagent/_internal/pipeline/adapter.py +174 -0
  105. contraagent/_internal/pipeline/check.py +447 -0
  106. contraagent/_internal/pipeline/graph.py +763 -0
  107. contraagent/_internal/pipeline/loops.py +374 -0
  108. contraagent/_internal/pipeline/origin.py +108 -0
  109. contraagent/_internal/pipeline/pipeline.py +557 -0
  110. contraagent/_internal/pipeline/reach.py +150 -0
  111. contraagent/_internal/pipeline/spec.py +1091 -0
  112. contraagent/_internal/platform/__init__.py +3 -0
  113. contraagent/_internal/platform/commands.py +127 -0
  114. contraagent/_internal/platform/envvars.py +27 -0
  115. contraagent/_internal/platform/groups.py +243 -0
  116. contraagent/_internal/platform/links.py +73 -0
  117. contraagent/_internal/platform/locks.py +87 -0
  118. contraagent/_internal/platform/processes.py +147 -0
  119. contraagent/_internal/platform/telemetry.py +41 -0
  120. contraagent/_internal/plugins/__init__.py +13 -0
  121. contraagent/_internal/plugins/hooks.py +668 -0
  122. contraagent/_internal/plugins/lint.py +78 -0
  123. contraagent/_internal/plugins/plugin.py +202 -0
  124. contraagent/_internal/plugins/scaffold.py +143 -0
  125. contraagent/_internal/public.py +122 -0
  126. contraagent/_internal/routing/__init__.py +37 -0
  127. contraagent/_internal/routing/capacity.py +98 -0
  128. contraagent/_internal/routing/config.py +331 -0
  129. contraagent/_internal/routing/config_schema.py +125 -0
  130. contraagent/_internal/routing/kind_config.py +160 -0
  131. contraagent/_internal/routing/plan.py +440 -0
  132. contraagent/_internal/routing/pool.py +76 -0
  133. contraagent/_internal/routing/preflight.py +438 -0
  134. contraagent/_internal/routing/quota.py +294 -0
  135. contraagent/_internal/routing/router.py +341 -0
  136. contraagent/_internal/runs/__init__.py +17 -0
  137. contraagent/_internal/runs/files.py +245 -0
  138. contraagent/_internal/runs/layout.py +179 -0
  139. contraagent/_internal/runs/liveness.py +84 -0
  140. contraagent/_internal/runs/names.py +94 -0
  141. contraagent/_internal/runs/procs.py +178 -0
  142. contraagent/_internal/runs/source.py +536 -0
  143. contraagent/_internal/runs/times.py +41 -0
  144. contraagent/_internal/testing.py +498 -0
  145. contraagent/backends.py +56 -0
  146. contraagent/config.py +47 -0
  147. contraagent/docs/README.md +147 -0
  148. contraagent/docs/agents.md +91 -0
  149. contraagent/docs/compatibility.md +141 -0
  150. contraagent/docs/concepts.md +203 -0
  151. contraagent/docs/contracts.md +201 -0
  152. contraagent/docs/examples/analysis/flow.py +151 -0
  153. contraagent/docs/examples/before/flow.py +53 -0
  154. contraagent/docs/examples/changes/flow.py +52 -0
  155. contraagent/docs/examples/claims/flow.py +77 -0
  156. contraagent/docs/examples/demo/checks.py +25 -0
  157. contraagent/docs/examples/demo/pipeline.toml +15 -0
  158. contraagent/docs/examples/demo/plugins/docs/.claude-plugin/plugin.json +5 -0
  159. contraagent/docs/examples/demo/plugins/docs/README.md +15 -0
  160. contraagent/docs/examples/demo/plugins/docs/agents/reviewer.md +10 -0
  161. contraagent/docs/examples/demo/plugins/docs/agents/reviser.md +11 -0
  162. contraagent/docs/examples/demo/plugins/docs/agents/summarizer.md +11 -0
  163. contraagent/docs/examples/demo/plugins/docs/agents/writer.md +11 -0
  164. contraagent/docs/examples/demo/plugins/docs/codex/hooks.json +14 -0
  165. contraagent/docs/examples/demo/plugins/docs/hooks/hooks.json +14 -0
  166. contraagent/docs/examples/demo/plugins/docs/hooks.toml +18 -0
  167. contraagent/docs/examples/demo/plugins/docs/package.json +4 -0
  168. contraagent/docs/examples/demo/plugins/docs/settings.json +6 -0
  169. contraagent/docs/examples/demo/plugins/docs/skills/write-output/SKILL.md +15 -0
  170. contraagent/docs/examples/demo/run.py +256 -0
  171. contraagent/docs/examples/demo/tasks.py +167 -0
  172. contraagent/docs/examples/demo/test_demo.py +89 -0
  173. contraagent/docs/examples/hub/.dockerignore +3 -0
  174. contraagent/docs/examples/hub/.env.example +23 -0
  175. contraagent/docs/examples/hub/Dockerfile +46 -0
  176. contraagent/docs/examples/hub/compose.yaml +119 -0
  177. contraagent/docs/examples/hub/contraagent-relay.service +33 -0
  178. contraagent/docs/examples/hub/make-tokens +74 -0
  179. contraagent/docs/examples/hub/secrets/ingest-tokens.example +6 -0
  180. contraagent/docs/examples/hub/secrets/read-token.example +4 -0
  181. contraagent/docs/examples/implementations/flow.py +40 -0
  182. contraagent/docs/examples/implementations/plugins/review-go/.claude-plugin/plugin.json +5 -0
  183. contraagent/docs/examples/implementations/plugins/review-go/.mcp.json +5 -0
  184. contraagent/docs/examples/implementations/plugins/review-go/agents/reviewer.md +14 -0
  185. contraagent/docs/examples/implementations/plugins/review-go/codex/hooks.json +14 -0
  186. contraagent/docs/examples/implementations/plugins/review-go/hooks/hooks.json +14 -0
  187. contraagent/docs/examples/implementations/plugins/review-go/hooks.toml +4 -0
  188. contraagent/docs/examples/implementations/plugins/review-go/package.json +4 -0
  189. contraagent/docs/examples/implementations/plugins/review-go/settings.json +6 -0
  190. contraagent/docs/examples/implementations/plugins/review-go/skills/go-checks/SKILL.md +7 -0
  191. contraagent/docs/examples/implementations/plugins/review-python/.claude-plugin/plugin.json +5 -0
  192. contraagent/docs/examples/implementations/plugins/review-python/.mcp.json +5 -0
  193. contraagent/docs/examples/implementations/plugins/review-python/agents/reviewer.md +14 -0
  194. contraagent/docs/examples/implementations/plugins/review-python/codex/hooks.json +14 -0
  195. contraagent/docs/examples/implementations/plugins/review-python/hooks/hooks.json +14 -0
  196. contraagent/docs/examples/implementations/plugins/review-python/hooks.toml +4 -0
  197. contraagent/docs/examples/implementations/plugins/review-python/package.json +4 -0
  198. contraagent/docs/examples/implementations/plugins/review-python/settings.json +6 -0
  199. contraagent/docs/examples/implementations/plugins/review-python/skills/python-checks/SKILL.md +7 -0
  200. contraagent/docs/examples/light/flow.py +38 -0
  201. contraagent/docs/examples/panels/cycles.py +80 -0
  202. contraagent/docs/examples/panels/records.py +56 -0
  203. contraagent/docs/examples/panels/views.py +102 -0
  204. contraagent/docs/examples/partial/flow.py +62 -0
  205. contraagent/docs/examples/preserve/flow.py +47 -0
  206. contraagent/docs/examples/reference/pipeline.toml +184 -0
  207. contraagent/docs/examples/retries/flow.py +65 -0
  208. contraagent/docs/examples/review/flow.py +52 -0
  209. contraagent/docs/examples/runner/flow.py +32 -0
  210. contraagent/docs/examples/runner/run.py +82 -0
  211. contraagent/docs/examples/scopes/flow.py +93 -0
  212. contraagent/docs/examples/security/flow.py +37 -0
  213. contraagent/docs/examples/security/pipeline.toml +40 -0
  214. contraagent/docs/examples/skills/plugins/house-style/.claude-plugin/plugin.json +5 -0
  215. contraagent/docs/examples/skills/plugins/house-style/skills/house-style/SKILL.md +11 -0
  216. contraagent/docs/examples/skills/tasks.py +36 -0
  217. contraagent/docs/examples/time_box/flow.py +52 -0
  218. contraagent/docs/examples/tutorial/issues/csv-export.md +4 -0
  219. contraagent/docs/examples/tutorial/issues/dark-mode.md +4 -0
  220. contraagent/docs/examples/tutorial/issues/login-timeout.md +5 -0
  221. contraagent/docs/examples/tutorial/pipeline.toml +11 -0
  222. contraagent/docs/examples/tutorial/plugins/triage/.claude-plugin/plugin.json +5 -0
  223. contraagent/docs/examples/tutorial/plugins/triage/README.md +15 -0
  224. contraagent/docs/examples/tutorial/plugins/triage/agents/planner.md +17 -0
  225. contraagent/docs/examples/tutorial/plugins/triage/agents/triager.md +20 -0
  226. contraagent/docs/examples/tutorial/plugins/triage/codex/hooks.json +14 -0
  227. contraagent/docs/examples/tutorial/plugins/triage/hooks/hooks.json +14 -0
  228. contraagent/docs/examples/tutorial/plugins/triage/hooks.toml +18 -0
  229. contraagent/docs/examples/tutorial/plugins/triage/package.json +4 -0
  230. contraagent/docs/examples/tutorial/plugins/triage/settings.json +6 -0
  231. contraagent/docs/examples/tutorial/plugins/triage/skills/write-output/SKILL.md +17 -0
  232. contraagent/docs/examples/tutorial/tasks.py +77 -0
  233. contraagent/docs/examples/tutorial/test_tutorial.py +63 -0
  234. contraagent/docs/guide.md +151 -0
  235. contraagent/docs/hub-operations.md +140 -0
  236. contraagent/docs/hub.md +88 -0
  237. contraagent/docs/monitor.md +335 -0
  238. contraagent/docs/plugins.md +231 -0
  239. contraagent/docs/routing.md +275 -0
  240. contraagent/docs/schemas/cursor.schema.json +204 -0
  241. contraagent/docs/schemas/deferred.schema.json +213 -0
  242. contraagent/docs/schemas/flow_calls.schema.json +206 -0
  243. contraagent/docs/schemas/journal.schema.json +754 -0
  244. contraagent/docs/schemas/launches.schema.json +605 -0
  245. contraagent/docs/schemas/pipeline.schema.json +871 -0
  246. contraagent/docs/schemas/plan.schema.json +166 -0
  247. contraagent/docs/schemas/rests.schema.json +93 -0
  248. contraagent/docs/schemas/run.schema.json +339 -0
  249. contraagent/docs/security.md +160 -0
  250. contraagent/docs/tasks.md +516 -0
  251. contraagent/docs/testing.md +258 -0
  252. contraagent/docs/tutorial.md +406 -0
  253. contraagent/engine.py +63 -0
  254. contraagent/monitor/__init__.py +94 -0
  255. contraagent/monitor/api.py +168 -0
  256. contraagent/plugins.py +9 -0
  257. contraagent/py.typed +0 -0
  258. contraagent/testing.py +85 -0
  259. contraagent-0.1.0.dist-info/METADATA +189 -0
  260. contraagent-0.1.0.dist-info/RECORD +263 -0
  261. contraagent-0.1.0.dist-info/WHEEL +4 -0
  262. contraagent-0.1.0.dist-info/entry_points.txt +2 -0
  263. contraagent-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,99 @@
1
+ """contraagent: run coding-agent CLIs as typed, supervised, observable tasks.
2
+
3
+ A pipeline declares its tasks (parameters, output, budget), implements each agent task as
4
+ a plugin, and writes the flow as a plain function:
5
+
6
+ from contraagent import Pipeline, agent_task
7
+
8
+ summarize = agent_task("summarize", plugin="plugins/summarize", params=Doc, output=Summary)
9
+
10
+ def docs(units):
11
+ for u in units:
12
+ summarize(u, path=f"in/{u}.md")
13
+
14
+ Pipeline("pipeline.toml").run(docs, units=["alpha", "beta"])
15
+
16
+ The public modules: `contraagent` (this one: tasks, flows, the pipeline, validators, the
17
+ values callbacks are given, the errors), `contraagent.config` (credentials, routes,
18
+ budgets, quota readings), `contraagent.backends` (the coding agents), `contraagent.engine`
19
+ (the runners and schedulers underneath a pipeline), `contraagent.plugins`,
20
+ `contraagent.monitor` (with `contraagent.monitor.api`, its HTTP responses) and
21
+ `contraagent.testing`. `contraagent docs` prints the documentation.
22
+ """
23
+
24
+ from contraagent._internal.backends.credentials import CredentialError
25
+ from contraagent._internal.backends.process import LaunchError
26
+ from contraagent._internal.contracts.validators import CommandValidator, Validator
27
+ from contraagent._internal.dispatch.flow import TaskDeferred, TaskFailed, time_box
28
+ from contraagent._internal.dispatch.interceptors import ResultEnricher, TaskScope
29
+ from contraagent._internal.dispatch.records import Changes, DeferralCause, Frame, Hop, Loop, OtherModel, SkippedHop, TokenUsage
30
+ from contraagent._internal.dispatch.task import Origin, Partial, Task, TaskResult, TimeBox
31
+ from contraagent._internal.errors import ContraagentDeprecationWarning, ContraagentError
32
+ from contraagent._internal.execution.pipeline_files import NoCurrentRun, log, pipeline_table, save
33
+ from contraagent._internal.execution.recording import RecordingError
34
+ from contraagent._internal.execution.run import RunExists, RunFormatError, RunLocked
35
+ from contraagent._internal.pipeline.check import CheckReport
36
+ from contraagent._internal.pipeline.graph import Pending, TextOutput, TooManyPasses
37
+ from contraagent._internal.pipeline.pipeline import Pipeline, RunReport
38
+ from contraagent._internal.pipeline.spec import AgentTask, PythonTask, agent_task, python_task
39
+ from contraagent._internal.plugins.plugin import PluginError
40
+ from contraagent._internal.public import publish
41
+ from contraagent._internal.routing.config import ConfigError, PerTask, PipelineConfig
42
+ from contraagent._internal.routing.plan import Overrides, RoutingError
43
+ from contraagent._internal.routing.preflight import PreflightStopped
44
+ from contraagent._internal.routing.quota import QuotaRule
45
+
46
+ __all__ = [
47
+ "AgentTask",
48
+ "Changes",
49
+ "CheckReport",
50
+ "CommandValidator",
51
+ "ConfigError",
52
+ "ContraagentDeprecationWarning",
53
+ "ContraagentError",
54
+ "CredentialError",
55
+ "DeferralCause",
56
+ "Frame",
57
+ "Hop",
58
+ "LaunchError",
59
+ "Loop",
60
+ "NoCurrentRun",
61
+ "Origin",
62
+ "OtherModel",
63
+ "Overrides",
64
+ "Partial",
65
+ "Pending",
66
+ "PerTask",
67
+ "Pipeline",
68
+ "PipelineConfig",
69
+ "PluginError",
70
+ "PreflightStopped",
71
+ "PythonTask",
72
+ "QuotaRule",
73
+ "RecordingError",
74
+ "ResultEnricher",
75
+ "RoutingError",
76
+ "RunExists",
77
+ "RunFormatError",
78
+ "RunLocked",
79
+ "RunReport",
80
+ "SkippedHop",
81
+ "Task",
82
+ "TaskDeferred",
83
+ "TaskFailed",
84
+ "TaskResult",
85
+ "TaskScope",
86
+ "TextOutput",
87
+ "TimeBox",
88
+ "TokenUsage",
89
+ "TooManyPasses",
90
+ "Validator",
91
+ "agent_task",
92
+ "log",
93
+ "pipeline_table",
94
+ "python_task",
95
+ "save",
96
+ "time_box",
97
+ ]
98
+
99
+ publish(__name__, __all__)
@@ -0,0 +1,3 @@
1
+ from contraagent._internal.cli import main
2
+
3
+ raise SystemExit(main())
@@ -0,0 +1,43 @@
1
+ """contraagent's implementation. The public modules (`contraagent`, `contraagent.config`,
2
+ `contraagent.backends`, `contraagent.engine`, `contraagent.plugins`, `contraagent.monitor`,
3
+ `contraagent.monitor.api`, `contraagent.testing`) re-export from it; nothing here imports
4
+ one of them.
5
+
6
+ Layers, bottom up (each imports only the ones above it in this list):
7
+
8
+ * `errors` `ContraagentError`, the base of every error raised on purpose
9
+ * `platform/` the host, on Linux, macOS and Windows alike: its processes (`processes`),
10
+ a child in a group of its own (`groups`), a file lock (`locks`), and the
11
+ line and variables that name a live agent process's run and task
12
+ (`telemetry`, `envvars`); leaf modules, importing nothing else of the package
13
+ * `commandline` the parts every command's arguments share; a leaf module
14
+ * `public` how a public module publishes what it re-exports
15
+ * `docs` the documentation installed with the package (`contraagent/docs/`): its
16
+ topics and the examples they quote; `contraagent docs`
17
+ * `runs/` run records: the layout of a run directory, the one writer of a document
18
+ and of a log line, the readers of complete lines, the times records hold;
19
+ `RunSource` (where runs are read from) and `Liveness`
20
+ * `dispatch/` the domain-free `Task`/`TaskResult` envelope and the schedulers:
21
+ `WorkQueue` (claims, caps, retry, throttle, deadline, bottom level, priority)
22
+ and `FlowDriver` (generator flows over it); `make_python_task`; `records`: the
23
+ facts a run records (hops, rests, deferral causes, flow paths), one type each
24
+ * `backends/` one coding-agent CLI behind `Backend`: one `Launch` in, one `LaunchResult` out
25
+ * `contracts/` `OutputContract`/`InputContract` (`contract`): files checked by pydantic and
26
+ `validators`; `run_until_valid` resumes the session until they hold;
27
+ `calls`: the call file an agent task is handed; `pointers`: the parts of a
28
+ JSON output a task keeps (`agent_task(preserve=)`)
29
+ * `routing/` `PipelineConfig` (one TOML file) -> `RoutingPlan`: per-kind
30
+ `KindConfig` and failover `Router`, with a preflight
31
+ * `execution/` `AgentRunner` (one task, with failover), `RetryingRunner`, `PythonTaskRunner`,
32
+ `TaskAdapter`, `Run` (journal, lock, plan, resume), `CursorStore`
33
+ * `plugins/` an agent task's implementation, as the coding agent loads it;
34
+ hooks declared once and rendered into each agent's own hook system
35
+ * `pipeline/` `agent_task`, `@python_task`, `Pipeline`: the API a pipeline is written in
36
+ * `monitor/` a read-only live view of a run, as a library and a web UI (`static/`, built
37
+ from `web/`) with its OpenAPI document (`openapi.json`)
38
+ * `hub/` the runs of many hosts in one monitor: `contraagent relay` ships a host's runs,
39
+ `contraagent hub` stores them and serves their monitor; only `hub/server.py`,
40
+ which serves the monitor's app, imports `monitor/`
41
+ * `testing` `StubAgent`: a coding agent that plays scripted replies, for tests
42
+ * `cli` `contraagent ...`: one argument tree over every command
43
+ """
@@ -0,0 +1,119 @@
1
+ """Coding-agent CLIs behind one interface: one `Launch` in, one `LaunchResult` out.
2
+
3
+ * `base.py` the `Backend` ABC and its one run template (`Backend.run`)
4
+ * `launch.py` the backend-neutral vocabulary: `Launch`, `Limits`, `LaunchResult`, `Stop`, `Usage`
5
+ * `wire.py` what every wire reader shares: `EventFold`, `LimitsWatch`, the tool preview
6
+ * `refusal.py` how a launch ended: `Signals`, `Ending`, the one `classify_stop` ladder
7
+ * `credentials.py` credential types (subscription, API key, OAuth token, WIF, Bedrock, ...) and secrets
8
+ * `process.py` the guarded subprocess loop every CLI backend shares
9
+ * `live_processes.py` the agent processes this interpreter started, for teardown
10
+ * `streams.py` raw transcript lines -> the monitor's renderable events
11
+ * `plugin_files.py` a plugin's MCP servers and extensions, as every backend reads them
12
+ * `opencode_key.py` an OpenCode key, wherever an agent finds it: its account and its usage
13
+ * `claude/`, `omp/`, `opencode/`, `pi/`, `codex/` the concrete CLIs: `backend.py` (argv, env,
14
+ credentials), `wire.py` (the reader and the monitor's view of its events), `catalogue.py`
15
+ (the model list), `login.py` (a login it keeps)
16
+
17
+ The registry below is the one place a coding-agent *name* (what a config
18
+ file, a `Route` or a journal row says) is tied to a class. Everything that
19
+ needs the list of known agents reads it from here.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ from typing import Any
25
+
26
+ from contraagent._internal.backends.base import Backend
27
+ from contraagent._internal.backends.claude import ClaudeBackend
28
+ from contraagent._internal.backends.codex import CodexBackend
29
+ from contraagent._internal.backends.credentials import (
30
+ AMBIENT,
31
+ Ambient,
32
+ ApiKey,
33
+ Bedrock,
34
+ Credential,
35
+ CredentialBinding,
36
+ CredentialError,
37
+ Gateway,
38
+ OAuthToken,
39
+ Pool,
40
+ Secret,
41
+ Subscription,
42
+ Vertex,
43
+ WorkloadIdentity,
44
+ )
45
+ from contraagent._internal.backends.launch import STDIN_THRESHOLD, Launch, LaunchResult, Limits, QuotaRefusal, Stop, Usage
46
+ from contraagent._internal.backends.omp import OMP_PREAMBLE, OmpBackend, OmpRpcBackend
47
+ from contraagent._internal.backends.opencode import OpencodeBackend
48
+ from contraagent._internal.backends.pi import PiBackend
49
+ from contraagent._internal.backends.process import LaunchError
50
+
51
+ _REGISTRY: dict[str, type[Backend]] = {
52
+ "claude": ClaudeBackend,
53
+ "omp": OmpBackend,
54
+ "omp-rpc": OmpRpcBackend,
55
+ "opencode": OpencodeBackend,
56
+ "pi": PiBackend,
57
+ "codex": CodexBackend,
58
+ }
59
+
60
+
61
+ def register_backend(name: str, cls: type[Backend]) -> None:
62
+ """Make a custom `Backend` subclass known by `name` (config files, routes, `create_backend`)."""
63
+ _REGISTRY[name] = cls
64
+
65
+
66
+ def backend_class(name: str) -> type[Backend] | None:
67
+ """The class registered under `name`, or None."""
68
+ return _REGISTRY.get(name)
69
+
70
+
71
+ def known_agents() -> tuple[str, ...]:
72
+ """Every registered coding-agent name, in registration order."""
73
+ return tuple(_REGISTRY)
74
+
75
+
76
+ def create_backend(name: str, **kwargs: Any) -> Backend:
77
+ """A new backend for a registered name. Unknown names raise KeyError."""
78
+ cls = _REGISTRY.get(name)
79
+ if cls is None:
80
+ raise KeyError(f"unknown backend: {name} (known: {', '.join(_REGISTRY)})")
81
+ return cls(**kwargs)
82
+
83
+
84
+ __all__ = [
85
+ "AMBIENT",
86
+ "OMP_PREAMBLE",
87
+ "STDIN_THRESHOLD",
88
+ "Ambient",
89
+ "ApiKey",
90
+ "Backend",
91
+ "Bedrock",
92
+ "ClaudeBackend",
93
+ "CodexBackend",
94
+ "Credential",
95
+ "CredentialBinding",
96
+ "CredentialError",
97
+ "Gateway",
98
+ "Launch",
99
+ "LaunchError",
100
+ "LaunchResult",
101
+ "Limits",
102
+ "OAuthToken",
103
+ "OmpBackend",
104
+ "OmpRpcBackend",
105
+ "OpencodeBackend",
106
+ "PiBackend",
107
+ "Pool",
108
+ "QuotaRefusal",
109
+ "Secret",
110
+ "Stop",
111
+ "Subscription",
112
+ "Usage",
113
+ "Vertex",
114
+ "WorkloadIdentity",
115
+ "backend_class",
116
+ "create_backend",
117
+ "known_agents",
118
+ "register_backend",
119
+ ]