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.
- contraagent/__init__.py +99 -0
- contraagent/__main__.py +3 -0
- contraagent/_internal/__init__.py +43 -0
- contraagent/_internal/backends/__init__.py +119 -0
- contraagent/_internal/backends/base.py +566 -0
- contraagent/_internal/backends/claude/__init__.py +5 -0
- contraagent/_internal/backends/claude/backend.py +310 -0
- contraagent/_internal/backends/claude/login.py +20 -0
- contraagent/_internal/backends/claude/wire.py +398 -0
- contraagent/_internal/backends/codex/__init__.py +5 -0
- contraagent/_internal/backends/codex/backend.py +397 -0
- contraagent/_internal/backends/codex/hooks.py +188 -0
- contraagent/_internal/backends/codex/wire.py +395 -0
- contraagent/_internal/backends/credentials.py +459 -0
- contraagent/_internal/backends/launch.py +490 -0
- contraagent/_internal/backends/live_processes.py +268 -0
- contraagent/_internal/backends/omp/__init__.py +6 -0
- contraagent/_internal/backends/omp/backend.py +455 -0
- contraagent/_internal/backends/omp/catalogue.py +29 -0
- contraagent/_internal/backends/omp/config.py +136 -0
- contraagent/_internal/backends/omp/isolation/config.yml +27 -0
- contraagent/_internal/backends/omp/rpc.py +358 -0
- contraagent/_internal/backends/omp/wire.py +413 -0
- contraagent/_internal/backends/opencode/__init__.py +5 -0
- contraagent/_internal/backends/opencode/backend.py +442 -0
- contraagent/_internal/backends/opencode/catalogue.py +37 -0
- contraagent/_internal/backends/opencode/wire.py +223 -0
- contraagent/_internal/backends/opencode_key.py +198 -0
- contraagent/_internal/backends/pi/__init__.py +5 -0
- contraagent/_internal/backends/pi/agent_dir.py +116 -0
- contraagent/_internal/backends/pi/backend.py +345 -0
- contraagent/_internal/backends/pi/catalogue.py +22 -0
- contraagent/_internal/backends/pi/login.py +15 -0
- contraagent/_internal/backends/pi/mcp.ts +16 -0
- contraagent/_internal/backends/pi/wire.py +88 -0
- contraagent/_internal/backends/plugin_files.py +32 -0
- contraagent/_internal/backends/process.py +314 -0
- contraagent/_internal/backends/refusal.py +162 -0
- contraagent/_internal/backends/streams.py +146 -0
- contraagent/_internal/backends/wire.py +243 -0
- contraagent/_internal/cli.py +478 -0
- contraagent/_internal/commandline.py +212 -0
- contraagent/_internal/contracts/__init__.py +8 -0
- contraagent/_internal/contracts/calls.py +239 -0
- contraagent/_internal/contracts/contract.py +707 -0
- contraagent/_internal/contracts/pointers.py +180 -0
- contraagent/_internal/contracts/validators.py +178 -0
- contraagent/_internal/dispatch/__init__.py +96 -0
- contraagent/_internal/dispatch/flow.py +519 -0
- contraagent/_internal/dispatch/interceptors.py +61 -0
- contraagent/_internal/dispatch/python_task.py +90 -0
- contraagent/_internal/dispatch/queue.py +713 -0
- contraagent/_internal/dispatch/records.py +374 -0
- contraagent/_internal/dispatch/task.py +291 -0
- contraagent/_internal/dispatch/templates.py +37 -0
- contraagent/_internal/docs.py +133 -0
- contraagent/_internal/errors.py +27 -0
- contraagent/_internal/execution/__init__.py +39 -0
- contraagent/_internal/execution/adapter.py +105 -0
- contraagent/_internal/execution/changes.py +143 -0
- contraagent/_internal/execution/cursor.py +236 -0
- contraagent/_internal/execution/estimates.py +263 -0
- contraagent/_internal/execution/file_schemas.py +88 -0
- contraagent/_internal/execution/journal.py +99 -0
- contraagent/_internal/execution/pipeline_files.py +172 -0
- contraagent/_internal/execution/python_tasks.py +272 -0
- contraagent/_internal/execution/recording.py +802 -0
- contraagent/_internal/execution/run.py +737 -0
- contraagent/_internal/execution/runner.py +678 -0
- contraagent/_internal/execution/schemas.py +383 -0
- contraagent/_internal/execution/teardown.py +96 -0
- contraagent/_internal/hub/__init__.py +23 -0
- contraagent/_internal/hub/client.py +121 -0
- contraagent/_internal/hub/core.py +227 -0
- contraagent/_internal/hub/openapi.json +590 -0
- contraagent/_internal/hub/postgres.py +345 -0
- contraagent/_internal/hub/protocol.py +132 -0
- contraagent/_internal/hub/relay.py +631 -0
- contraagent/_internal/hub/retention.py +159 -0
- contraagent/_internal/hub/s3.py +126 -0
- contraagent/_internal/hub/segment_format.py +204 -0
- contraagent/_internal/hub/segment_objects.py +179 -0
- contraagent/_internal/hub/segments.py +1092 -0
- contraagent/_internal/hub/server.py +803 -0
- contraagent/_internal/hub/source.py +225 -0
- contraagent/_internal/hub/store.py +385 -0
- contraagent/_internal/hub/streams.py +193 -0
- contraagent/_internal/monitor/__init__.py +14 -0
- contraagent/_internal/monitor/aggregate.py +109 -0
- contraagent/_internal/monitor/api.py +1203 -0
- contraagent/_internal/monitor/core.py +1102 -0
- contraagent/_internal/monitor/export.py +348 -0
- contraagent/_internal/monitor/openapi.json +6659 -0
- contraagent/_internal/monitor/server.py +554 -0
- contraagent/_internal/monitor/static/app.js +985 -0
- contraagent/_internal/monitor/static/apple-touch-icon.png +0 -0
- contraagent/_internal/monitor/static/favicon-32.png +0 -0
- contraagent/_internal/monitor/static/favicon.svg +1 -0
- contraagent/_internal/monitor/static/index.html +31 -0
- contraagent/_internal/monitor/static/ja.js +1 -0
- contraagent/_internal/monitor/trends.py +755 -0
- contraagent/_internal/monitor/views.py +81 -0
- contraagent/_internal/pipeline/__init__.py +29 -0
- contraagent/_internal/pipeline/adapter.py +174 -0
- contraagent/_internal/pipeline/check.py +447 -0
- contraagent/_internal/pipeline/graph.py +763 -0
- contraagent/_internal/pipeline/loops.py +374 -0
- contraagent/_internal/pipeline/origin.py +108 -0
- contraagent/_internal/pipeline/pipeline.py +557 -0
- contraagent/_internal/pipeline/reach.py +150 -0
- contraagent/_internal/pipeline/spec.py +1091 -0
- contraagent/_internal/platform/__init__.py +3 -0
- contraagent/_internal/platform/commands.py +127 -0
- contraagent/_internal/platform/envvars.py +27 -0
- contraagent/_internal/platform/groups.py +243 -0
- contraagent/_internal/platform/links.py +73 -0
- contraagent/_internal/platform/locks.py +87 -0
- contraagent/_internal/platform/processes.py +147 -0
- contraagent/_internal/platform/telemetry.py +41 -0
- contraagent/_internal/plugins/__init__.py +13 -0
- contraagent/_internal/plugins/hooks.py +668 -0
- contraagent/_internal/plugins/lint.py +78 -0
- contraagent/_internal/plugins/plugin.py +202 -0
- contraagent/_internal/plugins/scaffold.py +143 -0
- contraagent/_internal/public.py +122 -0
- contraagent/_internal/routing/__init__.py +37 -0
- contraagent/_internal/routing/capacity.py +98 -0
- contraagent/_internal/routing/config.py +331 -0
- contraagent/_internal/routing/config_schema.py +125 -0
- contraagent/_internal/routing/kind_config.py +160 -0
- contraagent/_internal/routing/plan.py +440 -0
- contraagent/_internal/routing/pool.py +76 -0
- contraagent/_internal/routing/preflight.py +438 -0
- contraagent/_internal/routing/quota.py +294 -0
- contraagent/_internal/routing/router.py +341 -0
- contraagent/_internal/runs/__init__.py +17 -0
- contraagent/_internal/runs/files.py +245 -0
- contraagent/_internal/runs/layout.py +179 -0
- contraagent/_internal/runs/liveness.py +84 -0
- contraagent/_internal/runs/names.py +94 -0
- contraagent/_internal/runs/procs.py +178 -0
- contraagent/_internal/runs/source.py +536 -0
- contraagent/_internal/runs/times.py +41 -0
- contraagent/_internal/testing.py +498 -0
- contraagent/backends.py +56 -0
- contraagent/config.py +47 -0
- contraagent/docs/README.md +147 -0
- contraagent/docs/agents.md +91 -0
- contraagent/docs/compatibility.md +141 -0
- contraagent/docs/concepts.md +203 -0
- contraagent/docs/contracts.md +201 -0
- contraagent/docs/examples/analysis/flow.py +151 -0
- contraagent/docs/examples/before/flow.py +53 -0
- contraagent/docs/examples/changes/flow.py +52 -0
- contraagent/docs/examples/claims/flow.py +77 -0
- contraagent/docs/examples/demo/checks.py +25 -0
- contraagent/docs/examples/demo/pipeline.toml +15 -0
- contraagent/docs/examples/demo/plugins/docs/.claude-plugin/plugin.json +5 -0
- contraagent/docs/examples/demo/plugins/docs/README.md +15 -0
- contraagent/docs/examples/demo/plugins/docs/agents/reviewer.md +10 -0
- contraagent/docs/examples/demo/plugins/docs/agents/reviser.md +11 -0
- contraagent/docs/examples/demo/plugins/docs/agents/summarizer.md +11 -0
- contraagent/docs/examples/demo/plugins/docs/agents/writer.md +11 -0
- contraagent/docs/examples/demo/plugins/docs/codex/hooks.json +14 -0
- contraagent/docs/examples/demo/plugins/docs/hooks/hooks.json +14 -0
- contraagent/docs/examples/demo/plugins/docs/hooks.toml +18 -0
- contraagent/docs/examples/demo/plugins/docs/package.json +4 -0
- contraagent/docs/examples/demo/plugins/docs/settings.json +6 -0
- contraagent/docs/examples/demo/plugins/docs/skills/write-output/SKILL.md +15 -0
- contraagent/docs/examples/demo/run.py +256 -0
- contraagent/docs/examples/demo/tasks.py +167 -0
- contraagent/docs/examples/demo/test_demo.py +89 -0
- contraagent/docs/examples/hub/.dockerignore +3 -0
- contraagent/docs/examples/hub/.env.example +23 -0
- contraagent/docs/examples/hub/Dockerfile +46 -0
- contraagent/docs/examples/hub/compose.yaml +119 -0
- contraagent/docs/examples/hub/contraagent-relay.service +33 -0
- contraagent/docs/examples/hub/make-tokens +74 -0
- contraagent/docs/examples/hub/secrets/ingest-tokens.example +6 -0
- contraagent/docs/examples/hub/secrets/read-token.example +4 -0
- contraagent/docs/examples/implementations/flow.py +40 -0
- contraagent/docs/examples/implementations/plugins/review-go/.claude-plugin/plugin.json +5 -0
- contraagent/docs/examples/implementations/plugins/review-go/.mcp.json +5 -0
- contraagent/docs/examples/implementations/plugins/review-go/agents/reviewer.md +14 -0
- contraagent/docs/examples/implementations/plugins/review-go/codex/hooks.json +14 -0
- contraagent/docs/examples/implementations/plugins/review-go/hooks/hooks.json +14 -0
- contraagent/docs/examples/implementations/plugins/review-go/hooks.toml +4 -0
- contraagent/docs/examples/implementations/plugins/review-go/package.json +4 -0
- contraagent/docs/examples/implementations/plugins/review-go/settings.json +6 -0
- contraagent/docs/examples/implementations/plugins/review-go/skills/go-checks/SKILL.md +7 -0
- contraagent/docs/examples/implementations/plugins/review-python/.claude-plugin/plugin.json +5 -0
- contraagent/docs/examples/implementations/plugins/review-python/.mcp.json +5 -0
- contraagent/docs/examples/implementations/plugins/review-python/agents/reviewer.md +14 -0
- contraagent/docs/examples/implementations/plugins/review-python/codex/hooks.json +14 -0
- contraagent/docs/examples/implementations/plugins/review-python/hooks/hooks.json +14 -0
- contraagent/docs/examples/implementations/plugins/review-python/hooks.toml +4 -0
- contraagent/docs/examples/implementations/plugins/review-python/package.json +4 -0
- contraagent/docs/examples/implementations/plugins/review-python/settings.json +6 -0
- contraagent/docs/examples/implementations/plugins/review-python/skills/python-checks/SKILL.md +7 -0
- contraagent/docs/examples/light/flow.py +38 -0
- contraagent/docs/examples/panels/cycles.py +80 -0
- contraagent/docs/examples/panels/records.py +56 -0
- contraagent/docs/examples/panels/views.py +102 -0
- contraagent/docs/examples/partial/flow.py +62 -0
- contraagent/docs/examples/preserve/flow.py +47 -0
- contraagent/docs/examples/reference/pipeline.toml +184 -0
- contraagent/docs/examples/retries/flow.py +65 -0
- contraagent/docs/examples/review/flow.py +52 -0
- contraagent/docs/examples/runner/flow.py +32 -0
- contraagent/docs/examples/runner/run.py +82 -0
- contraagent/docs/examples/scopes/flow.py +93 -0
- contraagent/docs/examples/security/flow.py +37 -0
- contraagent/docs/examples/security/pipeline.toml +40 -0
- contraagent/docs/examples/skills/plugins/house-style/.claude-plugin/plugin.json +5 -0
- contraagent/docs/examples/skills/plugins/house-style/skills/house-style/SKILL.md +11 -0
- contraagent/docs/examples/skills/tasks.py +36 -0
- contraagent/docs/examples/time_box/flow.py +52 -0
- contraagent/docs/examples/tutorial/issues/csv-export.md +4 -0
- contraagent/docs/examples/tutorial/issues/dark-mode.md +4 -0
- contraagent/docs/examples/tutorial/issues/login-timeout.md +5 -0
- contraagent/docs/examples/tutorial/pipeline.toml +11 -0
- contraagent/docs/examples/tutorial/plugins/triage/.claude-plugin/plugin.json +5 -0
- contraagent/docs/examples/tutorial/plugins/triage/README.md +15 -0
- contraagent/docs/examples/tutorial/plugins/triage/agents/planner.md +17 -0
- contraagent/docs/examples/tutorial/plugins/triage/agents/triager.md +20 -0
- contraagent/docs/examples/tutorial/plugins/triage/codex/hooks.json +14 -0
- contraagent/docs/examples/tutorial/plugins/triage/hooks/hooks.json +14 -0
- contraagent/docs/examples/tutorial/plugins/triage/hooks.toml +18 -0
- contraagent/docs/examples/tutorial/plugins/triage/package.json +4 -0
- contraagent/docs/examples/tutorial/plugins/triage/settings.json +6 -0
- contraagent/docs/examples/tutorial/plugins/triage/skills/write-output/SKILL.md +17 -0
- contraagent/docs/examples/tutorial/tasks.py +77 -0
- contraagent/docs/examples/tutorial/test_tutorial.py +63 -0
- contraagent/docs/guide.md +151 -0
- contraagent/docs/hub-operations.md +140 -0
- contraagent/docs/hub.md +88 -0
- contraagent/docs/monitor.md +335 -0
- contraagent/docs/plugins.md +231 -0
- contraagent/docs/routing.md +275 -0
- contraagent/docs/schemas/cursor.schema.json +204 -0
- contraagent/docs/schemas/deferred.schema.json +213 -0
- contraagent/docs/schemas/flow_calls.schema.json +206 -0
- contraagent/docs/schemas/journal.schema.json +754 -0
- contraagent/docs/schemas/launches.schema.json +605 -0
- contraagent/docs/schemas/pipeline.schema.json +871 -0
- contraagent/docs/schemas/plan.schema.json +166 -0
- contraagent/docs/schemas/rests.schema.json +93 -0
- contraagent/docs/schemas/run.schema.json +339 -0
- contraagent/docs/security.md +160 -0
- contraagent/docs/tasks.md +516 -0
- contraagent/docs/testing.md +258 -0
- contraagent/docs/tutorial.md +406 -0
- contraagent/engine.py +63 -0
- contraagent/monitor/__init__.py +94 -0
- contraagent/monitor/api.py +168 -0
- contraagent/plugins.py +9 -0
- contraagent/py.typed +0 -0
- contraagent/testing.py +85 -0
- contraagent-0.1.0.dist-info/METADATA +189 -0
- contraagent-0.1.0.dist-info/RECORD +263 -0
- contraagent-0.1.0.dist-info/WHEEL +4 -0
- contraagent-0.1.0.dist-info/entry_points.txt +2 -0
- contraagent-0.1.0.dist-info/licenses/LICENSE +21 -0
contraagent/__init__.py
ADDED
|
@@ -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__)
|
contraagent/__main__.py
ADDED
|
@@ -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
|
+
]
|