eda-bridge-runtime 0.1.0a5__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.
- eda_bridge_runtime-0.1.0a5/.agents/plugins/marketplace.json +20 -0
- eda_bridge_runtime-0.1.0a5/.github/workflows/publish.yml +81 -0
- eda_bridge_runtime-0.1.0a5/.gitignore +15 -0
- eda_bridge_runtime-0.1.0a5/AGENTS.md +11 -0
- eda_bridge_runtime-0.1.0a5/CONTRIBUTING.md +6 -0
- eda_bridge_runtime-0.1.0a5/LICENSE +22 -0
- eda_bridge_runtime-0.1.0a5/PKG-INFO +97 -0
- eda_bridge_runtime-0.1.0a5/README.md +56 -0
- eda_bridge_runtime-0.1.0a5/SECURITY.md +11 -0
- eda_bridge_runtime-0.1.0a5/docs/ACCEPTANCE.md +74 -0
- eda_bridge_runtime-0.1.0a5/docs/ARCHITECTURE.md +63 -0
- eda_bridge_runtime-0.1.0a5/docs/DEPLOYMENT_ROLES.md +63 -0
- eda_bridge_runtime-0.1.0a5/docs/MCP_AND_CODEX.md +79 -0
- eda_bridge_runtime-0.1.0a5/docs/PI_AGENT_PILOT.md +103 -0
- eda_bridge_runtime-0.1.0a5/docs/V0_1_SCOPE.md +34 -0
- eda_bridge_runtime-0.1.0a5/docs/schemas/eda-context-v2.schema.json +28 -0
- eda_bridge_runtime-0.1.0a5/docs/schemas/request-v1.schema.json +22 -0
- eda_bridge_runtime-0.1.0a5/docs/schemas/run-view-v1.schema.json +32 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/.codex-plugin/plugin.json +35 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/.mcp.json +8 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/icon.png +0 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/logo.png +0 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/logo.svg +4 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/hooks/hooks.json +28 -0
- eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/skills/eda-runtime-control/SKILL.md +52 -0
- eda_bridge_runtime-0.1.0a5/pyproject.toml +41 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/__init__.py +33 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/_version.py +1 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/adapter.py +36 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/agent_audit.py +152 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/artifacts.py +43 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/cli.py +154 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/connections.py +192 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/context.py +150 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/jobs.py +203 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/lease.py +65 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/ledger.py +264 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/mcp_server.py +389 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/protocol.py +274 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/redaction.py +24 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/runtime.py +143 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/supervisor.py +73 -0
- eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/transport.py +171 -0
- eda_bridge_runtime-0.1.0a5/tests/test_agent_audit.py +91 -0
- eda_bridge_runtime-0.1.0a5/tests/test_connections_mcp.py +324 -0
- eda_bridge_runtime-0.1.0a5/tests/test_context.py +86 -0
- eda_bridge_runtime-0.1.0a5/tests/test_jobs_leases.py +114 -0
- eda_bridge_runtime-0.1.0a5/tests/test_ledger.py +78 -0
- eda_bridge_runtime-0.1.0a5/tests/test_protocol.py +115 -0
- eda_bridge_runtime-0.1.0a5/tests/test_runtime_transport.py +186 -0
- eda_bridge_runtime-0.1.0a5/uv.lock +331 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "eda-bridge-runtime",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Eda Bridge Runtime"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "eda-bridge-runtime",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./plugins/eda-bridge-runtime"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_USE"
|
|
16
|
+
},
|
|
17
|
+
"category": "Developer Tools"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
16
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.13"
|
|
19
|
+
- name: Verify tag matches package version
|
|
20
|
+
env:
|
|
21
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
22
|
+
run: |
|
|
23
|
+
python - <<'PY'
|
|
24
|
+
import pathlib
|
|
25
|
+
import tomllib
|
|
26
|
+
import os
|
|
27
|
+
|
|
28
|
+
version = tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"]
|
|
29
|
+
tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
|
|
30
|
+
if version != tag_version:
|
|
31
|
+
raise SystemExit(f"tag {tag_version!r} does not match package {version!r}")
|
|
32
|
+
PY
|
|
33
|
+
- run: python -m pip install --upgrade build twine
|
|
34
|
+
- run: python -m pip install -e ".[dev]"
|
|
35
|
+
- run: pytest
|
|
36
|
+
- run: ruff check .
|
|
37
|
+
- run: python -m build
|
|
38
|
+
- run: python -m twine check dist/*
|
|
39
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.0
|
|
40
|
+
with:
|
|
41
|
+
name: python-package-distributions
|
|
42
|
+
path: dist/
|
|
43
|
+
if-no-files-found: error
|
|
44
|
+
retention-days: 7
|
|
45
|
+
|
|
46
|
+
publish:
|
|
47
|
+
needs: build
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
environment:
|
|
50
|
+
name: pypi
|
|
51
|
+
url: https://pypi.org/p/eda-bridge-runtime
|
|
52
|
+
permissions:
|
|
53
|
+
id-token: write
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
|
|
56
|
+
with:
|
|
57
|
+
name: python-package-distributions
|
|
58
|
+
path: dist/
|
|
59
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
|
|
60
|
+
|
|
61
|
+
verify:
|
|
62
|
+
needs: publish
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
66
|
+
with:
|
|
67
|
+
python-version: "3.13"
|
|
68
|
+
- name: Install the exact published version
|
|
69
|
+
env:
|
|
70
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
71
|
+
run: |
|
|
72
|
+
version="${RELEASE_TAG#v}"
|
|
73
|
+
for attempt in 1 2 3 4 5 6; do
|
|
74
|
+
if python -m pip install --no-cache-dir "eda-bridge-runtime==$version"; then
|
|
75
|
+
python -c "import eda_bridge_runtime; assert eda_bridge_runtime.__version__ == '$version'"
|
|
76
|
+
eda-runtime --help
|
|
77
|
+
exit 0
|
|
78
|
+
fi
|
|
79
|
+
sleep 10
|
|
80
|
+
done
|
|
81
|
+
exit 1
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Agent working agreement
|
|
2
|
+
|
|
3
|
+
- Treat this as a public repository. Never add customer data, credentials,
|
|
4
|
+
private hostnames, private paths, or proprietary EDA models.
|
|
5
|
+
- Preserve the agent-neutral and vendor-neutral boundary.
|
|
6
|
+
- Every operation initiated by an agent must include a concise `purpose`.
|
|
7
|
+
- Prefer typed capabilities over arbitrary script execution.
|
|
8
|
+
- Keep local and SSH behavior conformant through shared tests.
|
|
9
|
+
- Do not claim success until durable state or a fresh observation proves it.
|
|
10
|
+
- Do not publish or create releases without explicit owner authorization.
|
|
11
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pengfei Li
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: eda-bridge-runtime
|
|
3
|
+
Version: 0.1.0a5
|
|
4
|
+
Summary: Agent-neutral execution runtime for local and remote EDA bridges
|
|
5
|
+
Author: Pengfei Li
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Pengfei Li
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Classifier: Development Status :: 3 - Alpha
|
|
30
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
31
|
+
Classifier: Programming Language :: Python :: 3
|
|
32
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
33
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
34
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
35
|
+
Requires-Python: >=3.10
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
39
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
40
|
+
Description-Content-Type: text/markdown
|
|
41
|
+
|
|
42
|
+
# EDA Bridge Runtime
|
|
43
|
+
|
|
44
|
+
<img src="plugins/eda-bridge-runtime/assets/logo.png" width="180" alt="EDA Bridge Runtime logo">
|
|
45
|
+
|
|
46
|
+
`eda-bridge-runtime` is an agent-neutral execution layer for EDA automation.
|
|
47
|
+
It gives local and SSH-driven bridges the same request envelope, durable job
|
|
48
|
+
semantics, context handoff, timing evidence, and append-only execution ledger.
|
|
49
|
+
|
|
50
|
+
The runtime is intentionally not an EDA bridge and not an AI harness. Vendor
|
|
51
|
+
bridges keep their native API knowledge. Agents state a short purpose; the
|
|
52
|
+
runtime records what was requested, what actually ran, how long each phase
|
|
53
|
+
took, and what result or artifact was produced.
|
|
54
|
+
|
|
55
|
+
## Design promises
|
|
56
|
+
|
|
57
|
+
- Local and SSH execution use one protocol and one evidence model.
|
|
58
|
+
- Every agent-originated operation carries a concise `purpose`.
|
|
59
|
+
- Actor metadata is collected automatically where possible and records its
|
|
60
|
+
provenance; missing metadata never blocks engineering work.
|
|
61
|
+
- Mutating requests are idempotent and auditable.
|
|
62
|
+
- Disconnection does not imply that a long EDA job failed.
|
|
63
|
+
- Context tokens contain locators and fingerprints, never credentials.
|
|
64
|
+
- EDA-specific behavior lives in adapters, not in the runtime core.
|
|
65
|
+
|
|
66
|
+
## Current alpha
|
|
67
|
+
|
|
68
|
+
`0.1.0a5` adds agent-host lifecycle auditing without changing tool permissions. Codex hooks record
|
|
69
|
+
session, turn, model, permission mode, tool-call identity, concise purpose, and a content hash before
|
|
70
|
+
an EDA Runtime call, then link the completed call to its actual Run. The audit is append-only,
|
|
71
|
+
hash-chained, and stores neither raw operation payloads nor chat transcripts.
|
|
72
|
+
|
|
73
|
+
`0.1.0a4` adds rich bounded Context snapshots, stable origin routing, direct
|
|
74
|
+
one-submit execution, and automatic origin binding during connection setup.
|
|
75
|
+
Vendor Skills can declare the Runtime MCP directly, so users select one
|
|
76
|
+
task-facing Skill rather than manually composing infrastructure Skills.
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
python -m pip install "eda-bridge-runtime==0.1.0a5"
|
|
80
|
+
eda-runtime doctor
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
For repository development, create a virtual environment and install `.[dev]`
|
|
84
|
+
instead. Public releases are built once on a clean GitHub runner, published
|
|
85
|
+
through PyPI Trusted Publishing, and installed back from PyPI before acceptance.
|
|
86
|
+
|
|
87
|
+
See [Architecture](docs/ARCHITECTURE.md) and the
|
|
88
|
+
[protocol schema](docs/schemas/request-v1.schema.json). Host placement is
|
|
89
|
+
defined by the [agent-client, eda-worker, and combined deployment roles](docs/DEPLOYMENT_ROLES.md).
|
|
90
|
+
|
|
91
|
+
The proposed lightweight Pi Agent pilot is described in
|
|
92
|
+
[Pi Agent pilot](docs/PI_AGENT_PILOT.md). It reuses the same Runtime boundary instead of adding a
|
|
93
|
+
second SSH or EDA-control path.
|
|
94
|
+
|
|
95
|
+
The repository also includes a minimal [MCP and Codex plugin](docs/MCP_AND_CODEX.md). It resolves
|
|
96
|
+
named local/SSH connections without asking the agent to assemble transport commands on each call.
|
|
97
|
+
Sanitized real-host evidence is recorded in [acceptance results](docs/ACCEPTANCE.md).
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# EDA Bridge Runtime
|
|
2
|
+
|
|
3
|
+
<img src="plugins/eda-bridge-runtime/assets/logo.png" width="180" alt="EDA Bridge Runtime logo">
|
|
4
|
+
|
|
5
|
+
`eda-bridge-runtime` is an agent-neutral execution layer for EDA automation.
|
|
6
|
+
It gives local and SSH-driven bridges the same request envelope, durable job
|
|
7
|
+
semantics, context handoff, timing evidence, and append-only execution ledger.
|
|
8
|
+
|
|
9
|
+
The runtime is intentionally not an EDA bridge and not an AI harness. Vendor
|
|
10
|
+
bridges keep their native API knowledge. Agents state a short purpose; the
|
|
11
|
+
runtime records what was requested, what actually ran, how long each phase
|
|
12
|
+
took, and what result or artifact was produced.
|
|
13
|
+
|
|
14
|
+
## Design promises
|
|
15
|
+
|
|
16
|
+
- Local and SSH execution use one protocol and one evidence model.
|
|
17
|
+
- Every agent-originated operation carries a concise `purpose`.
|
|
18
|
+
- Actor metadata is collected automatically where possible and records its
|
|
19
|
+
provenance; missing metadata never blocks engineering work.
|
|
20
|
+
- Mutating requests are idempotent and auditable.
|
|
21
|
+
- Disconnection does not imply that a long EDA job failed.
|
|
22
|
+
- Context tokens contain locators and fingerprints, never credentials.
|
|
23
|
+
- EDA-specific behavior lives in adapters, not in the runtime core.
|
|
24
|
+
|
|
25
|
+
## Current alpha
|
|
26
|
+
|
|
27
|
+
`0.1.0a5` adds agent-host lifecycle auditing without changing tool permissions. Codex hooks record
|
|
28
|
+
session, turn, model, permission mode, tool-call identity, concise purpose, and a content hash before
|
|
29
|
+
an EDA Runtime call, then link the completed call to its actual Run. The audit is append-only,
|
|
30
|
+
hash-chained, and stores neither raw operation payloads nor chat transcripts.
|
|
31
|
+
|
|
32
|
+
`0.1.0a4` adds rich bounded Context snapshots, stable origin routing, direct
|
|
33
|
+
one-submit execution, and automatic origin binding during connection setup.
|
|
34
|
+
Vendor Skills can declare the Runtime MCP directly, so users select one
|
|
35
|
+
task-facing Skill rather than manually composing infrastructure Skills.
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
python -m pip install "eda-bridge-runtime==0.1.0a5"
|
|
39
|
+
eda-runtime doctor
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For repository development, create a virtual environment and install `.[dev]`
|
|
43
|
+
instead. Public releases are built once on a clean GitHub runner, published
|
|
44
|
+
through PyPI Trusted Publishing, and installed back from PyPI before acceptance.
|
|
45
|
+
|
|
46
|
+
See [Architecture](docs/ARCHITECTURE.md) and the
|
|
47
|
+
[protocol schema](docs/schemas/request-v1.schema.json). Host placement is
|
|
48
|
+
defined by the [agent-client, eda-worker, and combined deployment roles](docs/DEPLOYMENT_ROLES.md).
|
|
49
|
+
|
|
50
|
+
The proposed lightweight Pi Agent pilot is described in
|
|
51
|
+
[Pi Agent pilot](docs/PI_AGENT_PILOT.md). It reuses the same Runtime boundary instead of adding a
|
|
52
|
+
second SSH or EDA-control path.
|
|
53
|
+
|
|
54
|
+
The repository also includes a minimal [MCP and Codex plugin](docs/MCP_AND_CODEX.md). It resolves
|
|
55
|
+
named local/SSH connections without asking the agent to assemble transport commands on each call.
|
|
56
|
+
Sanitized real-host evidence is recorded in [acceptance results](docs/ACCEPTANCE.md).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
Do not place EDA license strings, SSH private keys, bridge authentication
|
|
4
|
+
tokens, customer designs, or customer paths in requests or ledger metadata.
|
|
5
|
+
The runtime redacts common secret-shaped keys before persistence, but callers
|
|
6
|
+
remain responsible for using artifact references instead of embedding private
|
|
7
|
+
payloads.
|
|
8
|
+
|
|
9
|
+
Report security issues privately to the repository owner. Do not open a public
|
|
10
|
+
issue containing credentials, proprietary design data, or host inventories.
|
|
11
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Sanitized acceptance evidence
|
|
2
|
+
|
|
3
|
+
Acceptance used a remote Linux EDA host over one persistent SSH transport. No customer project,
|
|
4
|
+
credentials, host address, or task-specific geometry is included here.
|
|
5
|
+
|
|
6
|
+
## 2026-08-29 Codex lifecycle-audit acceptance
|
|
7
|
+
|
|
8
|
+
- A freshly installed `0.1.0-alpha.5` plugin loaded its bundled
|
|
9
|
+
`hooks/hooks.json` in a new Codex CLI session and called `eda.connections.list` exactly once.
|
|
10
|
+
This non-interactive acceptance used Codex's explicit hook-trust bypass after the installed Hook
|
|
11
|
+
file was inspected; normal interactive use presents the standard one-time trust review.
|
|
12
|
+
- The pre- and post-tool hooks produced two consecutive, hash-linked audit events. They observed
|
|
13
|
+
the Codex model, session, turn, tool-call identity, permission mode, and concise declared purpose.
|
|
14
|
+
- The events stored a SHA-256 fingerprint instead of the raw MCP arguments. No chat transcript,
|
|
15
|
+
customer data, connection details, or credentials were copied into the Agent audit.
|
|
16
|
+
- The diagnostic connection-list call correctly recorded `execution.linked=false` because it does
|
|
17
|
+
not create an EDA Run. Runtime operation tests cover completion linkage to the returned Run view.
|
|
18
|
+
- The two hook records were 609 ms apart, including the MCP call itself. Hook handlers do not
|
|
19
|
+
rewrite the pending call or return an allow decision, so telemetry cannot bypass tool approval.
|
|
20
|
+
|
|
21
|
+
## 2026-08-28 convergence acceptance
|
|
22
|
+
|
|
23
|
+
- The installed Agent-side MCP exposed six typed tools, including `eda.capabilities`.
|
|
24
|
+
- Capability discovery through the registered SSH connections took 438 ms for ADS and 422 ms for
|
|
25
|
+
AnsysEM on the first measurement. Both adapters reported `execution_host_role=eda-worker`; ADS
|
|
26
|
+
reported a synchronous Run model and AnsysEM a durable Run model.
|
|
27
|
+
- ADS 2026 Update 2.1 created one disposable empty workspace on virtual display 4 in 1.55 seconds.
|
|
28
|
+
A repeated call with the same idempotency key returned the original Run in 265 ms and did not
|
|
29
|
+
recreate the workspace.
|
|
30
|
+
- AEDT 2026.1 / PyAEDT 1.4.0 created, saved, closed, and fresh-reopened one disposable empty HFSS
|
|
31
|
+
3D Layout project on virtual display 4. Submission returned in 453 ms and the durable Run reached
|
|
32
|
+
`passed` after 42.4 seconds. Status observations normally took 0--16 ms over the reused transport.
|
|
33
|
+
- Repeating the AnsysEM submission returned the same `job_id` and original `run_id`; later status
|
|
34
|
+
and event calls observed that Run without replaying it.
|
|
35
|
+
- The first AnsysEM attempt exposed a missing propagation of the connection-level runtime profile
|
|
36
|
+
into detached workers. The Bridge now inherits this profile automatically; a regression test and
|
|
37
|
+
the successful real-host rerun cover the failure path.
|
|
38
|
+
|
|
39
|
+
## 2026-08-28 Context v2 and dual-role acceptance
|
|
40
|
+
|
|
41
|
+
- Both vendor Bridges emitted bounded `EDA_CONTEXT:v2` tokens containing a stable origin, session
|
|
42
|
+
state, target summary, capability digest, and freshness state. Runtime selected the correct
|
|
43
|
+
registered connection from the origin without a connection hint; legacy v1 decoding remains
|
|
44
|
+
covered by tests.
|
|
45
|
+
- One ADS documentation query completed with a single `eda.submit` over the SSH route in 529 ms.
|
|
46
|
+
One AnsysEM documentation query completed over the production SSH route in 860 ms. Neither path
|
|
47
|
+
launched the EDA or required separate context-resolution and capability calls.
|
|
48
|
+
- The same Runtime and AnsysEM adapter completed a documentation-status request through a local
|
|
49
|
+
connection in 72 ms when the EDA worker also acted as the Agent host. Only the connection record
|
|
50
|
+
differed between the local and SSH paths.
|
|
51
|
+
- Acceptance caught that an SSH child initially inherited the host's default virtual display even
|
|
52
|
+
though the captured Context named another display. The production connection commands now bind
|
|
53
|
+
the display before launching either Bridge; the ledgers then observed the required display for
|
|
54
|
+
both adapters.
|
|
55
|
+
- Connection setup probed each Bridge once and persisted its origin. Subsequent Context-driven
|
|
56
|
+
requests did not spend an extra round trip rediscovering the target.
|
|
57
|
+
|
|
58
|
+
## Evidence boundary
|
|
59
|
+
|
|
60
|
+
- Both append-only ledgers verified their hash chains after the real operations.
|
|
61
|
+
- Recorded facts include the concise declared purpose, MCP client and harness identity, observed
|
|
62
|
+
host/display/runtime facts, adapter events, and terminal result. Metadata unavailable from the
|
|
63
|
+
client remains explicitly `unknown` with provenance instead of being guessed.
|
|
64
|
+
- Scratch output completeness was checked, then the disposable artifacts were removed. No customer
|
|
65
|
+
model was opened, no solve was launched, and no GUI automation was used.
|
|
66
|
+
|
|
67
|
+
## Package and failure-path checks
|
|
68
|
+
|
|
69
|
+
- Unit tests cover hash-chain integrity, source identity, handshake mismatch, malformed-frame
|
|
70
|
+
isolation, idempotency, leases, durable jobs, orphan detection, connection ambiguity, legacy and
|
|
71
|
+
stateless MCP discovery, context routing, and no-replay connection failure.
|
|
72
|
+
- Runtime, ADS adapter, and AnsysEM adapter tests pass; lint passes for Runtime, AnsysEM, and all
|
|
73
|
+
modified ADS files. The wider ADS repository retains unrelated pre-existing lint debt.
|
|
74
|
+
- The Codex plugin manifest and bundled Skill pass their validators.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## One execution path
|
|
4
|
+
|
|
5
|
+
An agent, CLI, MCP server, or EDA UI creates a versioned request envelope. The
|
|
6
|
+
runtime reads an explicit `EDA_CONTEXT` snapshot or a deterministic registered
|
|
7
|
+
binding, opens either a local or SSH transport, and submits the request to an
|
|
8
|
+
EDA adapter. A v2 Context adds bounded origin, session, target, selection,
|
|
9
|
+
capability, and freshness facts; v1 remains accepted. When the selected Skill
|
|
10
|
+
already establishes a typed operation, `eda.submit` performs routing, freshness
|
|
11
|
+
validation, and execution in one client call.
|
|
12
|
+
|
|
13
|
+
All paths emit the same event model into one logical execution ledger:
|
|
14
|
+
|
|
15
|
+
`client -> runtime -> transport -> adapter -> vendor bridge -> EDA`
|
|
16
|
+
|
|
17
|
+
The ledger keeps declared intent separate from observed execution. Physical
|
|
18
|
+
client and server ledger segments may live on different hosts; `request_id`,
|
|
19
|
+
`run_id`, `trace_id`, sequence numbers, and event hashes make them mergeable.
|
|
20
|
+
|
|
21
|
+
## Three logical responsibility domains
|
|
22
|
+
|
|
23
|
+
The system has three logical responsibility domains. Skill, MCP, transport,
|
|
24
|
+
and SSH are interfaces or internal modules, not additional product layers.
|
|
25
|
+
|
|
26
|
+
| Domain | Owns | Does not own |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| User and Agent | Intent, engineering judgment, concise purpose | Durable execution state |
|
|
29
|
+
| Runtime kernel | Identity enrichment, facts, routing, transport, leases, jobs, Run projection | EDA semantics |
|
|
30
|
+
| Vendor adapter and bridge | Typed EDA capabilities, native API calls, EDA lifecycle, result normalization | Agent policy or cross-EDA governance |
|
|
31
|
+
|
|
32
|
+
The physical modules remain separable for testing. MCP and CLI are stateless
|
|
33
|
+
frontends to the Runtime kernel; local and SSH are interchangeable transports;
|
|
34
|
+
Skills are routing policy; vendor adapters preserve real EDA differences.
|
|
35
|
+
See [Deployment roles](DEPLOYMENT_ROLES.md) for host placement.
|
|
36
|
+
|
|
37
|
+
## Reliability model
|
|
38
|
+
|
|
39
|
+
Delivery is at-least-once. Mutating operations therefore require an
|
|
40
|
+
`idempotency_key`. Durable jobs persist state before execution, expose an event
|
|
41
|
+
cursor, and allow clients to reconnect without restarting the EDA operation.
|
|
42
|
+
Resource leases carry monotonically increasing fencing tokens so a stale worker
|
|
43
|
+
cannot claim current ownership.
|
|
44
|
+
|
|
45
|
+
Synchronous responses and durable jobs retain their existing wire formats. The
|
|
46
|
+
Runtime adds a compact `eda-runtime.run-view/v1` projection so clients observe
|
|
47
|
+
the same run identity, state, terminal flag, job identity, and path-free
|
|
48
|
+
evidence references without forcing ADS and AnsysEM to share one execution
|
|
49
|
+
implementation.
|
|
50
|
+
|
|
51
|
+
## Escape lanes
|
|
52
|
+
|
|
53
|
+
The preferred path is a typed adapter capability. If unavailable, callers may
|
|
54
|
+
use a verified native API, then a bounded script, then bounded GUI assistance,
|
|
55
|
+
then a manual external action. Adapters advertise which lanes exist. Every
|
|
56
|
+
non-typed lane must be explicit in the request and ledger.
|
|
57
|
+
|
|
58
|
+
## Privacy and retention
|
|
59
|
+
|
|
60
|
+
Structured ledger records are retained until user cleanup. Raw vendor/debug
|
|
61
|
+
logs are artifacts with a default seven-day retention policy. Context tokens
|
|
62
|
+
contain no secrets. Structured values are redacted recursively before being
|
|
63
|
+
written.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Deployment roles
|
|
2
|
+
|
|
3
|
+
The Runtime uses two independent host roles. They may be installed on separate
|
|
4
|
+
machines or combined on one machine; the execution contract does not change.
|
|
5
|
+
|
|
6
|
+
## Agent client
|
|
7
|
+
|
|
8
|
+
The agent host owns the user-facing Skill, MCP server, connection registry,
|
|
9
|
+
context resolution, and transport reuse. It does not need the EDA application
|
|
10
|
+
or a vendor bridge installed locally when the selected connection is SSH.
|
|
11
|
+
|
|
12
|
+
Required components:
|
|
13
|
+
|
|
14
|
+
- `eda-runtime mcp serve` and the Runtime Codex plugin;
|
|
15
|
+
- `~/.eda-bridge-runtime/connections.json` or an explicitly selected registry;
|
|
16
|
+
- the thin Runtime routing Skill;
|
|
17
|
+
- platform SSH configuration when an EDA worker is remote.
|
|
18
|
+
|
|
19
|
+
## EDA worker
|
|
20
|
+
|
|
21
|
+
The EDA host owns the vendor adapter service, bridge, EDA add-on or add-in, EDA
|
|
22
|
+
process, durable worker state, and vendor evidence. It does not need Agent
|
|
23
|
+
Skills or the Runtime Codex plugin unless an Agent also runs on that host.
|
|
24
|
+
|
|
25
|
+
Required components:
|
|
26
|
+
|
|
27
|
+
- the shared Runtime protocol library;
|
|
28
|
+
- one vendor bridge and its Runtime adapter service;
|
|
29
|
+
- the intended EDA installation, runtime profile, display, and license;
|
|
30
|
+
- host-side job, ledger, and artifact state used by that bridge.
|
|
31
|
+
|
|
32
|
+
## Combined host
|
|
33
|
+
|
|
34
|
+
A combined host installs both roles and selects a `local` Runtime connection.
|
|
35
|
+
It still traverses MCP, Runtime, and the vendor adapter; only SSH is removed.
|
|
36
|
+
This preserves purpose, actor, idempotency, Run, and evidence behavior between
|
|
37
|
+
local and remote deployments.
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Agent host EDA host
|
|
41
|
+
----------- --------
|
|
42
|
+
Agent -> Skill -> MCP -> Runtime client Runtime adapter service
|
|
43
|
+
| -> vendor bridge
|
|
44
|
+
+-- local or SSH ------> -> EDA add-on/API -> EDA
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Skills are Agent instructions, not remote execution services. Documentation
|
|
48
|
+
query backends and licensed corpora may live on either host, but their
|
|
49
|
+
user-facing Skill belongs wherever the Agent runs.
|
|
50
|
+
|
|
51
|
+
## Installation-state proof
|
|
52
|
+
|
|
53
|
+
An Agent capability is usable only when four states agree:
|
|
54
|
+
|
|
55
|
+
1. repository source;
|
|
56
|
+
2. installed Python package;
|
|
57
|
+
3. installed plugin and Skill cache;
|
|
58
|
+
4. tools exposed to a freshly started Agent session.
|
|
59
|
+
|
|
60
|
+
An EDA worker is proven separately by its installed bridge version, adapter
|
|
61
|
+
capabilities, EDA/profile identity, and a bounded real-host acceptance check.
|
|
62
|
+
Static Skills found on an EDA-only host do not participate in a remote Agent's
|
|
63
|
+
route and must not be treated as worker dependencies.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# MCP and Codex plugin
|
|
2
|
+
|
|
3
|
+
The bundled plugin is a thin discovery layer. It starts `eda-runtime mcp serve`, while the Runtime
|
|
4
|
+
keeps transport, idempotency, durable jobs, and the execution ledger independent of Codex.
|
|
5
|
+
The plugin and Skill belong on the Agent host. A remote EDA host needs only the
|
|
6
|
+
shared Runtime protocol plus its vendor bridge and adapter service unless an
|
|
7
|
+
Agent also runs there.
|
|
8
|
+
|
|
9
|
+
The plugin also installs `PreToolUse` and `PostToolUse` hooks scoped only to its own MCP tools.
|
|
10
|
+
They write an Agent-host append-only audit that records the Codex session, turn, active model,
|
|
11
|
+
permission mode, tool-call identity, concise purpose, and a hash of the arguments. Completion links
|
|
12
|
+
that identity to the returned Runtime Run. Hooks do not rewrite inputs, approve tools, parse the
|
|
13
|
+
chat transcript, or store raw operation payloads. Inspect the bounded recent view with
|
|
14
|
+
`eda-runtime audit list`.
|
|
15
|
+
|
|
16
|
+
Codex asks for one-time trust when a new or changed plugin Hook is first used. Review and approve
|
|
17
|
+
the two bundled audit commands; routine calls need no extra Agent prompt after that. Automated
|
|
18
|
+
acceptance may use Codex's explicit hook-trust bypass only after validating the installed Hook file.
|
|
19
|
+
|
|
20
|
+
The stdio server supports both the legacy MCP initialization era through `2025-11-25` and the
|
|
21
|
+
stateless `2026-07-28` discovery era. It exposes six tools:
|
|
22
|
+
|
|
23
|
+
- `eda.context.resolve`
|
|
24
|
+
- `eda.connections.list`
|
|
25
|
+
- `eda.capabilities`
|
|
26
|
+
- `eda.submit`
|
|
27
|
+
- `eda.job.status`
|
|
28
|
+
- `eda.job.events`
|
|
29
|
+
|
|
30
|
+
Operation, status, and event calls include an additive compact `run` object.
|
|
31
|
+
It projects synchronous responses and durable jobs into one observation shape
|
|
32
|
+
and lists content-addressed evidence metadata without exposing artifact paths.
|
|
33
|
+
|
|
34
|
+
For a greenfield task, use the create operation established by the selected vendor Skill; discover
|
|
35
|
+
capabilities only when that operation is not known. ADS and AnsysEM intentionally keep different
|
|
36
|
+
creation schemas; both return a bounded, reusable `EDA_CONTEXT` without exposing credentials or
|
|
37
|
+
large private artifacts.
|
|
38
|
+
|
|
39
|
+
When a selected Skill and Context establish the operation, call `eda.submit` directly. Separate
|
|
40
|
+
`eda.context.resolve` and `eda.capabilities` calls are diagnostic and discovery tools, not mandatory
|
|
41
|
+
preflight. The adapter still validates the Context generation and target before execution.
|
|
42
|
+
|
|
43
|
+
The tools never accept a raw local or SSH launch command. They select a previously registered
|
|
44
|
+
connection by `connection_id`, by a stable `origin_id` in `EDA_CONTEXT`, or by an unambiguous EDA
|
|
45
|
+
match. Each Agent host may map the same origin to a different local or SSH route.
|
|
46
|
+
|
|
47
|
+
## One-time connection registration
|
|
48
|
+
|
|
49
|
+
Installation or administration code registers the connection once. Engineers normally copy
|
|
50
|
+
context from the EDA UI and do not maintain this file themselves.
|
|
51
|
+
|
|
52
|
+
```console
|
|
53
|
+
eda-runtime connection set --eda ansys-electronics-desktop --kind ssh \
|
|
54
|
+
--host eda-host --ssh-option=-o --ssh-option=BatchMode=yes \
|
|
55
|
+
ansys-lab /opt/eda/bin/ansysem-agent runtime serve
|
|
56
|
+
|
|
57
|
+
eda-runtime connection set --eda keysight-ads --kind local \
|
|
58
|
+
ads-local ads-agent runtime serve
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Registration probes the adapter once and stores its stable `origin_id`; engineers do not create or
|
|
62
|
+
maintain that identifier. `--origin-id` is an administrative override and `--no-origin-probe`
|
|
63
|
+
exists only for repair or legacy adapters.
|
|
64
|
+
|
|
65
|
+
The default registry is `~/.eda-bridge-runtime/connections.json`. Set `EDA_RUNTIME_HOME` to move
|
|
66
|
+
the whole Runtime control directory. Do not store credentials in the registry; SSH authentication
|
|
67
|
+
remains in the platform SSH configuration.
|
|
68
|
+
|
|
69
|
+
## Plugin source
|
|
70
|
+
|
|
71
|
+
The repository plugin lives at `plugins/eda-bridge-runtime`. Install the Python package first so
|
|
72
|
+
that `eda-runtime` is on the host path, then install the repository marketplace and plugin:
|
|
73
|
+
|
|
74
|
+
```console
|
|
75
|
+
codex plugin marketplace add cottman99/eda-bridge-runtime --ref main
|
|
76
|
+
codex plugin add eda-bridge-runtime@eda-bridge-runtime
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Restart the Codex client after first installation so its Skill and MCP server are loaded together.
|