rocket-engine 0.0.2b1__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 (241) hide show
  1. rocket_engine/__init__.py +8 -0
  2. rocket_engine/__main__.py +12 -0
  3. rocket_engine/adapters/README.md +54 -0
  4. rocket_engine/adapters/__init__.py +7 -0
  5. rocket_engine/adapters/api.py +39 -0
  6. rocket_engine/adapters/base.py +46 -0
  7. rocket_engine/adapters/cace/__init__.py +163 -0
  8. rocket_engine/adapters/circulax/README.md +10 -0
  9. rocket_engine/adapters/circulax/__init__.py +112 -0
  10. rocket_engine/adapters/circulax/_driver.py +190 -0
  11. rocket_engine/adapters/circulax/adapter.py +538 -0
  12. rocket_engine/adapters/circulax/results.py +291 -0
  13. rocket_engine/adapters/cli/README.md +34 -0
  14. rocket_engine/adapters/cli/__init__.py +305 -0
  15. rocket_engine/adapters/connectivity/__init__.py +196 -0
  16. rocket_engine/adapters/connectivity/results.py +214 -0
  17. rocket_engine/adapters/cosim/README.md +9 -0
  18. rocket_engine/adapters/cosim/__init__.py +1390 -0
  19. rocket_engine/adapters/cosim/results.py +214 -0
  20. rocket_engine/adapters/devsim/__init__.py +171 -0
  21. rocket_engine/adapters/digital_flow/README.md +9 -0
  22. rocket_engine/adapters/digital_flow/__init__.py +1121 -0
  23. rocket_engine/adapters/digital_flow/results.py +227 -0
  24. rocket_engine/adapters/digital_flow/state.py +462 -0
  25. rocket_engine/adapters/drc/README.klayout.md +7 -0
  26. rocket_engine/adapters/drc/README.md +7 -0
  27. rocket_engine/adapters/drc/__init__.py +1 -0
  28. rocket_engine/adapters/drc/klayout.py +952 -0
  29. rocket_engine/adapters/drc/magic.py +287 -0
  30. rocket_engine/adapters/drc/results.py +184 -0
  31. rocket_engine/adapters/drc/results_kl.py +188 -0
  32. rocket_engine/adapters/elmer/__init__.py +163 -0
  33. rocket_engine/adapters/envelope.py +120 -0
  34. rocket_engine/adapters/equivalence/__init__.py +156 -0
  35. rocket_engine/adapters/errors.py +181 -0
  36. rocket_engine/adapters/extract_magic/README.md +15 -0
  37. rocket_engine/adapters/extract_magic/__init__.py +425 -0
  38. rocket_engine/adapters/extract_magic/results.py +209 -0
  39. rocket_engine/adapters/formal_sby/README.md +7 -0
  40. rocket_engine/adapters/formal_sby/__init__.py +773 -0
  41. rocket_engine/adapters/formal_sby/formal_edge.py +195 -0
  42. rocket_engine/adapters/formal_sby/results.py +185 -0
  43. rocket_engine/adapters/gdsfactory/__init__.py +194 -0
  44. rocket_engine/adapters/gdsfactory/_driver.py +459 -0
  45. rocket_engine/adapters/gdsfactory/adapter.py +609 -0
  46. rocket_engine/adapters/gdsfactory/results.py +181 -0
  47. rocket_engine/adapters/hdl_sim/README.md +7 -0
  48. rocket_engine/adapters/hdl_sim/__init__.py +369 -0
  49. rocket_engine/adapters/hdl_sim/ghdl.py +155 -0
  50. rocket_engine/adapters/hdl_sim/results.py +178 -0
  51. rocket_engine/adapters/hdl_sim/verilator.py +167 -0
  52. rocket_engine/adapters/http/README.md +15 -0
  53. rocket_engine/adapters/http/__init__.py +458 -0
  54. rocket_engine/adapters/http/events.py +63 -0
  55. rocket_engine/adapters/ipc/README.md +9 -0
  56. rocket_engine/adapters/ipc/__init__.py +111 -0
  57. rocket_engine/adapters/lvs_netgen/README.md +20 -0
  58. rocket_engine/adapters/lvs_netgen/__init__.py +889 -0
  59. rocket_engine/adapters/lvs_netgen/results.py +168 -0
  60. rocket_engine/adapters/mcp/README.md +19 -0
  61. rocket_engine/adapters/mcp/__init__.py +85 -0
  62. rocket_engine/adapters/mcp/api-schema.json +6107 -0
  63. rocket_engine/adapters/mcp/pull.py +246 -0
  64. rocket_engine/adapters/mcp/server.py +794 -0
  65. rocket_engine/adapters/meep/__init__.py +167 -0
  66. rocket_engine/adapters/meow/README.md +7 -0
  67. rocket_engine/adapters/meow/__init__.py +190 -0
  68. rocket_engine/adapters/meow/_driver.py +227 -0
  69. rocket_engine/adapters/meow/_envelope.py +108 -0
  70. rocket_engine/adapters/meow/adapter.py +491 -0
  71. rocket_engine/adapters/meow/results.py +218 -0
  72. rocket_engine/adapters/mutation/__init__.py +192 -0
  73. rocket_engine/adapters/ngspice/README.md +28 -0
  74. rocket_engine/adapters/ngspice/__init__.py +627 -0
  75. rocket_engine/adapters/ngspice/results.py +215 -0
  76. rocket_engine/adapters/postlayout/README.md +28 -0
  77. rocket_engine/adapters/postlayout/__init__.py +17 -0
  78. rocket_engine/adapters/postlayout/adapter.py +1062 -0
  79. rocket_engine/adapters/postlayout/results.py +330 -0
  80. rocket_engine/adapters/postlayout/translate.py +71 -0
  81. rocket_engine/adapters/profile.py +220 -0
  82. rocket_engine/adapters/sax/README.md +23 -0
  83. rocket_engine/adapters/sax/__init__.py +516 -0
  84. rocket_engine/adapters/sax/_driver.py +148 -0
  85. rocket_engine/adapters/sax/results.py +291 -0
  86. rocket_engine/adapters/stdio_console.py +1151 -0
  87. rocket_engine/adapters/syntax/README.md +5 -0
  88. rocket_engine/adapters/syntax/__init__.py +366 -0
  89. rocket_engine/adapters/syntax/results.py +181 -0
  90. rocket_engine/adapters/synth_yosys/README.md +7 -0
  91. rocket_engine/adapters/synth_yosys/__init__.py +655 -0
  92. rocket_engine/adapters/synth_yosys/amaranth.py +120 -0
  93. rocket_engine/adapters/synth_yosys/ghdl.py +128 -0
  94. rocket_engine/adapters/synth_yosys/results.py +173 -0
  95. rocket_engine/adapters/timing_sta/README.md +9 -0
  96. rocket_engine/adapters/timing_sta/__init__.py +726 -0
  97. rocket_engine/adapters/view_sync/__init__.py +185 -0
  98. rocket_engine/adapters/view_sync/results.py +189 -0
  99. rocket_engine/adapters/vlsir/__init__.py +142 -0
  100. rocket_engine/adapters/xschem/__init__.py +440 -0
  101. rocket_engine/adapters/xschem/deck.py +266 -0
  102. rocket_engine/clients/__init__.py +5 -0
  103. rocket_engine/clients/runtime.py +255 -0
  104. rocket_engine/composition.py +2279 -0
  105. rocket_engine/execution/README.md +30 -0
  106. rocket_engine/execution/__init__.py +150 -0
  107. rocket_engine/execution/apig/__init__.py +1 -0
  108. rocket_engine/execution/apig/pool.py +463 -0
  109. rocket_engine/execution/apig/submit.py +124 -0
  110. rocket_engine/execution/block_runs_scope.py +479 -0
  111. rocket_engine/execution/coalesce.py +414 -0
  112. rocket_engine/execution/console/__init__.py +1 -0
  113. rocket_engine/execution/console/apply_session.py +318 -0
  114. rocket_engine/execution/console/lifecycle.py +265 -0
  115. rocket_engine/execution/dispatch.py +205 -0
  116. rocket_engine/execution/errors.py +31 -0
  117. rocket_engine/execution/ports.py +797 -0
  118. rocket_engine/execution/pyexec/__init__.py +1 -0
  119. rocket_engine/execution/pyexec/apply_context.py +547 -0
  120. rocket_engine/execution/pyexec/approvals.py +173 -0
  121. rocket_engine/execution/pyexec/runner.py +404 -0
  122. rocket_engine/execution/pyexec/support.py +464 -0
  123. rocket_engine/execution/python_exec.py +897 -0
  124. rocket_engine/execution/queue.py +85 -0
  125. rocket_engine/execution/replay_safe.py +601 -0
  126. rocket_engine/execution/routing/__init__.py +1 -0
  127. rocket_engine/execution/routing/calls.py +364 -0
  128. rocket_engine/execution/routing/namespace.py +785 -0
  129. rocket_engine/execution/routing/ports.py +102 -0
  130. rocket_engine/execution/routing/tools.py +346 -0
  131. rocket_engine/execution/runner.py +311 -0
  132. rocket_engine/execution/runtime.py +1149 -0
  133. rocket_engine/execution/service.py +279 -0
  134. rocket_engine/execution/worker.py +464 -0
  135. rocket_engine/interfaces/README.md +26 -0
  136. rocket_engine/interfaces/__init__.py +58 -0
  137. rocket_engine/interfaces/apig_assets.py +407 -0
  138. rocket_engine/interfaces/celllink.py +461 -0
  139. rocket_engine/interfaces/documents.py +92 -0
  140. rocket_engine/interfaces/envelopes.py +131 -0
  141. rocket_engine/interfaces/errors.py +16 -0
  142. rocket_engine/interfaces/layout.py +410 -0
  143. rocket_engine/interfaces/layout_schema.yaml +278 -0
  144. rocket_engine/interfaces/paths.py +223 -0
  145. rocket_engine/interfaces/pdks.py +550 -0
  146. rocket_engine/interfaces/ports.py +72 -0
  147. rocket_engine/interfaces/references.py +115 -0
  148. rocket_engine/interfaces/refs.py +85 -0
  149. rocket_engine/interfaces/runparams.py +304 -0
  150. rocket_engine/interfaces/setup.py +552 -0
  151. rocket_engine/interfaces/setup_catalogue.yaml +243 -0
  152. rocket_engine/interfaces/setup_probes.py +66 -0
  153. rocket_engine/interfaces/vocabulary.py +58 -0
  154. rocket_engine/interfaces/yaml_dump.py +31 -0
  155. rocket_engine/library/README.md +22 -0
  156. rocket_engine/library/__init__.py +13 -0
  157. rocket_engine/library/apig_catalog.py +371 -0
  158. rocket_engine/library/catalog.py +185 -0
  159. rocket_engine/library/errors.py +16 -0
  160. rocket_engine/mutate/__init__.py +776 -0
  161. rocket_engine/mutate/operators.py +700 -0
  162. rocket_engine/ops/__init__.py +1 -0
  163. rocket_engine/ops/deferred.py +279 -0
  164. rocket_engine/ops/editors.py +404 -0
  165. rocket_engine/ops/evidence.py +194 -0
  166. rocket_engine/ops/gates.py +262 -0
  167. rocket_engine/ops/ports.py +76 -0
  168. rocket_engine/ops/queries.py +417 -0
  169. rocket_engine/ops/runs.py +553 -0
  170. rocket_engine/ops/submit.py +614 -0
  171. rocket_engine/project/README.md +27 -0
  172. rocket_engine/project/__init__.py +6 -0
  173. rocket_engine/project/canvas/__init__.py +55 -0
  174. rocket_engine/project/canvas/compile.py +109 -0
  175. rocket_engine/project/canvas/integrate.py +48 -0
  176. rocket_engine/project/canvas/schema.py +241 -0
  177. rocket_engine/project/canvas/templates.py +46 -0
  178. rocket_engine/project/canvas/validate.py +603 -0
  179. rocket_engine/project/edit/__init__.py +5 -0
  180. rocket_engine/project/edit/cas.py +87 -0
  181. rocket_engine/project/edit/transactions.py +282 -0
  182. rocket_engine/project/errors.py +16 -0
  183. rocket_engine/project/frontend13.py +685 -0
  184. rocket_engine/project/geometry/__init__.py +23 -0
  185. rocket_engine/project/geometry/ops.py +451 -0
  186. rocket_engine/project/geometry/snap.py +103 -0
  187. rocket_engine/project/ip/__init__.py +1 -0
  188. rocket_engine/project/ip/blocks.py +195 -0
  189. rocket_engine/project/ip/entry.schema.json +78 -0
  190. rocket_engine/project/ip/lifecycle.py +402 -0
  191. rocket_engine/project/ip/verbs.py +123 -0
  192. rocket_engine/project/layers/__init__.py +6 -0
  193. rocket_engine/project/layers/bindings.py +115 -0
  194. rocket_engine/project/layers/catalog.py +228 -0
  195. rocket_engine/project/layers/presets.py +43 -0
  196. rocket_engine/project/ledger/__init__.py +1 -0
  197. rocket_engine/project/ledger/docs.py +167 -0
  198. rocket_engine/project/ledger/entities.py +176 -0
  199. rocket_engine/project/ledger/events.py +29 -0
  200. rocket_engine/project/ledger/runs.py +257 -0
  201. rocket_engine/project/ledger/shared.py +174 -0
  202. rocket_engine/project/ledger/snapshots.py +385 -0
  203. rocket_engine/project/ledger/wires.py +552 -0
  204. rocket_engine/project/process/__init__.py +14 -0
  205. rocket_engine/project/process/model.py +193 -0
  206. rocket_engine/project/process/recipes.py +121 -0
  207. rocket_engine/project/schematic/__init__.py +1 -0
  208. rocket_engine/project/schematic/hierarchy.py +312 -0
  209. rocket_engine/project/schematic/instances.py +393 -0
  210. rocket_engine/project/schematic/sheets.py +198 -0
  211. rocket_engine/project/service.py +2941 -0
  212. rocket_engine/project/symbols/__init__.py +1 -0
  213. rocket_engine/project/symbols/cells.py +324 -0
  214. rocket_engine/project/symbols/linkage.py +356 -0
  215. rocket_engine/project/symbols/symbols.py +352 -0
  216. rocket_engine/project/templates/__init__.py +303 -0
  217. rocket_engine/project/templates/errors.py +25 -0
  218. rocket_engine/project/testbench/__init__.py +49 -0
  219. rocket_engine/project/testbench/blocks.py +619 -0
  220. rocket_engine/project/testbench/templates.py +134 -0
  221. rocket_engine/stores/README.md +12 -0
  222. rocket_engine/stores/__init__.py +6 -0
  223. rocket_engine/stores/ecs.py +1508 -0
  224. rocket_engine/stores/layers.py +1023 -0
  225. rocket_engine/stores/settings.py +1188 -0
  226. rocket_engine/stores/wireplace.py +1324 -0
  227. rocket_engine/workflows/README.md +18 -0
  228. rocket_engine/workflows/__init__.py +53 -0
  229. rocket_engine/workflows/capability_plan.py +102 -0
  230. rocket_engine/workflows/completion.py +228 -0
  231. rocket_engine/workflows/connectgraph.py +734 -0
  232. rocket_engine/workflows/connectgraph_emit.py +336 -0
  233. rocket_engine/workflows/gates.py +144 -0
  234. rocket_engine/workflows/photonic_wire.py +76 -0
  235. rocket_engine/workflows/stages.py +324 -0
  236. rocket_engine/workflows/viewsync.py +399 -0
  237. rocket_engine-0.0.2b1.dist-info/METADATA +200 -0
  238. rocket_engine-0.0.2b1.dist-info/RECORD +241 -0
  239. rocket_engine-0.0.2b1.dist-info/WHEEL +4 -0
  240. rocket_engine-0.0.2b1.dist-info/entry_points.txt +2 -0
  241. rocket_engine-0.0.2b1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,168 @@
1
+ """Netgen LVS v1 normalizer: v0 parse output to a ResultBundle.
2
+
3
+ Maps the ``run_lvs`` parse shape (match flag plus ``violations[]``
4
+ with rule, severity, message, and net/instance subjects) onto a
5
+ typed mismatch table, a bound view, and findings. Pure function
6
+ of the parsed output: no I/O, no tool calls, deterministic ids
7
+ derived from the run id. A match carries no findings; any
8
+ mismatch fails as an error finding.
9
+ """
10
+
11
+ TASK = "run_lvs"
12
+
13
+ _DIAG_CAP = 240
14
+
15
+ _SEVERITY = {"error": "error", "warning": "warning"}
16
+
17
+
18
+ def _cap(text):
19
+ """Cap one diagnostic string at the bundle prose limit.
20
+
21
+ Args:
22
+ text: Raw diagnostic text, possibly unbounded tool prose.
23
+
24
+ Returns:
25
+ The text unchanged when short, else truncated with an
26
+ ellipsis marker.
27
+ """
28
+ text = text if isinstance(text, str) else str(text)
29
+ if len(text) <= _DIAG_CAP:
30
+ return text
31
+ return text[: _DIAG_CAP - 3] + "..."
32
+
33
+
34
+ def _subject(violation):
35
+ """Name the net or instance one mismatch is about.
36
+
37
+ Args:
38
+ violation: v0 violation with optional net/instance keys.
39
+
40
+ Returns:
41
+ Subject text, or an empty string when unlocated.
42
+ """
43
+ return str(violation.get("net") or violation.get("instance") or "")
44
+
45
+
46
+ def _provenance(project_id, run_id, tools, provenance):
47
+ """Build ResultProvenance, defaulting to a placeholder closure.
48
+
49
+ Args:
50
+ project_id: Project the run belongs to.
51
+ run_id: Run the bundle describes.
52
+ tools: Tool ingredient mappings (id, version, digest?).
53
+ provenance: Full provenance mapping when the caller has
54
+ one; a deterministic placeholder otherwise.
55
+
56
+ Returns:
57
+ Provenance mapping valid against the v1 schema.
58
+ """
59
+ if provenance is not None:
60
+ return provenance
61
+ ref = {"scope": "project", "id": project_id, "revision": "r1"}
62
+ return {
63
+ "snapshot": dict(ref),
64
+ "input_lock": dict(ref),
65
+ "closure_hash": "0" * 64,
66
+ "tools": [
67
+ {
68
+ "id": item["id"],
69
+ "version": item.get("version", ""),
70
+ "digest": item.get("digest", "0" * 64),
71
+ }
72
+ for item in tools
73
+ ],
74
+ "parents": [],
75
+ }
76
+
77
+
78
+ def normalize(parsed, *, run_id, project_id="project", target=None,
79
+ tools=(), provenance=None):
80
+ """Normalize one netgen LVS parse output to a v1 ResultBundle.
81
+
82
+ Mismatch rows become a table dataset (rule, message,
83
+ subject) plus a bound table view; every mismatch also
84
+ becomes a finding with a capped message.
85
+
86
+ Args:
87
+ parsed: v0 parse mapping with ``match`` and
88
+ ``violations[]``.
89
+ run_id: Run the bundle describes (anchors all ids).
90
+ project_id: Project the run belongs to.
91
+ target: v1 target mapping; project kind by default.
92
+ tools: Tool ingredient mappings for provenance.
93
+ provenance: Full provenance mapping when the caller has
94
+ one; a deterministic placeholder otherwise.
95
+
96
+ Returns:
97
+ Schema-valid ResultBundle mapping.
98
+ """
99
+ violations = parsed.get("violations") or []
100
+ table_id = f"{run_id}:dataset:mismatches"
101
+ datasets = [
102
+ {
103
+ "id": table_id,
104
+ "kind": "table",
105
+ "row_count": len(violations),
106
+ "columns": [
107
+ {
108
+ "id": f"{table_id}:rule",
109
+ "name": "rule",
110
+ "dtype": "utf8",
111
+ "unit": "1",
112
+ "data": [v.get("rule", "") for v in violations],
113
+ },
114
+ {
115
+ "id": f"{table_id}:message",
116
+ "name": "message",
117
+ "dtype": "utf8",
118
+ "unit": "1",
119
+ "data": [_cap(v.get("message", "")) for v in violations],
120
+ },
121
+ {
122
+ "id": f"{table_id}:subject",
123
+ "name": "subject",
124
+ "dtype": "utf8",
125
+ "unit": "1",
126
+ "data": [_subject(v) for v in violations],
127
+ },
128
+ ],
129
+ "conditions": [],
130
+ }
131
+ ]
132
+ views = [
133
+ {
134
+ "id": f"{run_id}:view:mismatches",
135
+ "kind": "table",
136
+ "dataset_id": table_id,
137
+ "name": "lvs mismatches",
138
+ }
139
+ ]
140
+ findings = [
141
+ {
142
+ "id": f"{run_id}:finding:{index}",
143
+ "severity": _SEVERITY.get(v.get("severity"), "info"),
144
+ "code": v.get("rule", "lvs_net_mismatch"),
145
+ "message": _cap(v.get("message", "")),
146
+ }
147
+ for index, v in enumerate(violations)
148
+ ]
149
+ return {
150
+ "schema": "rocketeda/results/v1",
151
+ "ref": {"scope": "project", "id": run_id, "revision": "r1"},
152
+ "run_id": run_id,
153
+ "task": TASK,
154
+ "target": dict(target)
155
+ if target is not None
156
+ else {"project_id": project_id, "kind": "project"},
157
+ "state": "complete",
158
+ "freshness": "current",
159
+ "convergence": "not_applicable",
160
+ "provenance": _provenance(project_id, run_id, tools, provenance),
161
+ "datasets": datasets,
162
+ "views": views,
163
+ "measurements": [],
164
+ "findings": findings,
165
+ "artifacts": [],
166
+ "logs": [],
167
+ "gaps": [],
168
+ }
@@ -0,0 +1,19 @@
1
+ # adapters/mcp — project-scoped MCP stdio server
2
+
3
+ The MCP bridge exposes the engine operation and query vocabulary as tools. `McpTransport` validates and routes calls to the same `Engine.submit` path used by other clients; the server itself owns no agent loop, queue policy, or verdict logic. stdout is reserved for MCP protocol traffic.
4
+
5
+ ## Trust boundary
6
+
7
+ Local-only trust: this server speaks stdio to the local harness under OS identity — no tokens, no listener, no remote execution, no multi-user, hence no auth step (the named `TRUST_NOTE` in `server.py`). Human Run on the displayed cell is the approval; the harness edge (rocket-fuel client permissions) owns ask/deny. Same caller-blind API as every other transport; localhost-only, no auth.
8
+
9
+ ## Project binding
10
+
11
+ `--project` binds the server to one project and fills the project ID and current expected revision for mutation calls. `--project-dir` additionally confines `run_spice` source paths to that project, loads run targets and the PDK pin from its `constraints.yaml` (`pdk: <id>` pins the one registered revision, `pdk: {id, revision}` is taken as written, `none` means generic models, and an unregistered id fails with `unknown_pdk`), chooses the run work directory, and writes completed run evidence under `results/engine-runs/`.
12
+
13
+ Normal solver operations currently execute inline through `submit` and return their completion. `run_job` remains available for deferred work, pool draining, and idempotent result retrieval. This differs from older Fuel notes that describe every run as a two-call admission/execution sequence; use the [current Engine implementation](../../composition.py) and generated [API reference](../../../docs/engine-api.md) for the live behavior.
14
+
15
+ ## Tool descriptions and schemas
16
+
17
+ Descriptions are derived from the same handler docstrings used by the generated API reference. The MCP `inputSchema` is still generic for most operation/query tools; `python_execute` is the current specific-schema exception. The open [MCP-SCHEMA ticket](../../../docs/tickets/MCP-SCHEMA.md) tracks wiring generated schemas to every tool. `cancel_job` is also not yet part of the public operation vocabulary.
18
+
19
+ Python execution requests an approval; the agent cannot approve its own code. Approval resolution belongs to the trusted client path. See [`execution/`](../../execution/README.md), the [Fuel contract note](../../../docs/fuel-contract.md), and the [PRD harness boundary](../../../../PRD/harness/README.md).
@@ -0,0 +1,85 @@
1
+ """MCP stdio bridge (request/response + get_events_since polling, NOT push — see PUSH-EVENTS): tool calls in, bounded replies out.
2
+
3
+ Only cataloged operations and read queries are exposed. Anything else
4
+ — host shells first among them — is rejected, never routed.
5
+ """
6
+
7
+ import uuid
8
+
9
+ from ...clients.runtime import RuntimeClient
10
+ from ...interfaces.vocabulary import OPERATIONS, QUERIES
11
+ from .. import api
12
+ from ..base import enforce_scope, parse_json
13
+ from ..errors import AdapterError
14
+
15
+
16
+ class McpTransport:
17
+ """MCP transport over an engine: tool calls in, bounded replies out.
18
+
19
+ Args:
20
+ engine: Engine the tool calls submit against.
21
+ project_id: Optional scope; calls for another project are
22
+ denied, never routed.
23
+ """
24
+
25
+ host_execution_enabled = False
26
+
27
+ def __init__(self, engine, project_id=None):
28
+ self._engine = engine
29
+ self._project_id = project_id
30
+
31
+ def handle(self, text):
32
+ """Route one tools/call message through the engine.
33
+
34
+ Args:
35
+ text: Raw JSON-RPC message with method tools/call and
36
+ params holding the tool name plus arguments
37
+ (project_id required).
38
+
39
+ Returns:
40
+ Engine admission ack or query result for the tool call.
41
+
42
+ Raises:
43
+ AdapterError: unsupported_operation for a foreign
44
+ method or an uncataloged tool, invalid_command for
45
+ a missing project_id, cross_project_denied for a
46
+ call outside the bound scope.
47
+
48
+ Caution: Only cataloged operations and read queries are
49
+ exposed — anything else, host shells first among them,
50
+ is rejected, never routed.
51
+ """
52
+ message = parse_json(text)
53
+ if message.get("method") != "tools/call":
54
+ raise AdapterError(
55
+ "unsupported_operation",
56
+ f"Unsupported method: {message.get('method')}.",
57
+ )
58
+ params = message.get("params", {})
59
+ name = params.get("name")
60
+ if name not in OPERATIONS and name not in QUERIES:
61
+ raise AdapterError("unsupported_operation", f"Unsupported tool: {name}.")
62
+ arguments = dict(params.get("arguments", {}))
63
+ if arguments.get("project_id") is None:
64
+ raise AdapterError("invalid_command", "Missing project_id in arguments.")
65
+ enforce_scope(arguments.get("project_id"), self._project_id)
66
+ return api.submit(
67
+ self._engine,
68
+ arguments.pop("project_id"),
69
+ name,
70
+ arguments,
71
+ request_id=str(message.get("id", uuid.uuid4().hex)),
72
+ )
73
+
74
+ def runtime_client(self):
75
+ """Serve this transport's engine through the shared client.
76
+
77
+ The MCP list/call path is untouched — this binds the same
78
+ engine's integrated runtime (deferred submit, pump, wait,
79
+ cancel, watch) so MCP clients share one run identity
80
+ with every other transport.
81
+
82
+ Returns:
83
+ RuntimeClient bound to this transport's engine.
84
+ """
85
+ return RuntimeClient(self._engine)