agenticdome-python-sdk 1.2.33__tar.gz → 1.2.35__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.
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/PKG-INFO +47 -10
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/README.md +46 -9
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/PKG-INFO +47 -10
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/SOURCES.txt +1 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/catalog_snapshot.json +3 -3
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/connect.py +65 -26
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/copilot_ir.py +9 -3
- agenticdome_python_sdk-1.2.35/agenticdome_sdk/guided_integration.py +658 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/onboarding_cli.py +462 -72
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/customer-onboarding.md +84 -29
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/pyproject.toml +1 -1
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/CONTRIBUTING.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/LICENSE +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/MANIFEST.in +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/NOTICE +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/SECURITY.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/dependency_links.txt +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/entry_points.txt +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/requires.txt +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/top_level.txt +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/__init__.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/_framework_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/_mode.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/agno.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/attestation.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/autogen.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/aws_bedrock.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/claude.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/client.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/copilot_ir_collector.cjs +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/crewai.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/demo.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/google_adk.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/hook_catalog.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/identity.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/langgraph.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/lifecycle.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/llamaindex.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_host.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_http_gateway.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_rehearsal_server.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_verification.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/microsoft_agent_framework.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/microsoft_ai_foundry.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/openai_agents.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/outcomes.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/proof.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/pydantic.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/simulation.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/smolagents.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/README.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/agno.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/autogen.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/aws-bedrock.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/claude-agent-sdk.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/crewai.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/custom-python.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/google-adk.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/langgraph.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/llamaindex.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/microsoft-agent-framework.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/microsoft-ai-foundry.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/openai-agents.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/pydanticai.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/smolagents.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/mcp-integration.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/performance-evidence.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/runtime-deployment.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/PRODUCTION_INTEGRATION.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/README.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/attack_demo.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/crewai_agenticdome_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/README.md +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/_shared.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/agno.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/autogen.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/aws_bedrock.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/claude_agent_sdk.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/crewai.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/custom_python.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/google_adk.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/langgraph.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/llamaindex.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/mcp.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/microsoft_agent_framework.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/microsoft_ai_foundry.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/openai_agents.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/pydanticai.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/smolagents.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/langgraph_agenticdome_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/local_simulation_gallery.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/mcp_gateway_action_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/setup.cfg +0 -0
- {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agenticdome-python-sdk
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.35
|
|
4
4
|
Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
|
|
5
5
|
Author: AgenticDome
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -177,23 +177,41 @@ agenticdome inspect --output agenticdome-inspection.json
|
|
|
177
177
|
|
|
178
178
|
`init` writes the secret-free inspection and local configuration. For the
|
|
179
179
|
certified onboarding path, obtain the assigned sidecar and a dedicated
|
|
180
|
-
`integration_copilot` key, run
|
|
181
|
-
|
|
180
|
+
`integration_copilot` key, run `agenticdome integrate preview`, review its
|
|
181
|
+
local exact diff and change summary, explicitly approve a supported edit or
|
|
182
|
+
attach other boundaries manually, then run
|
|
182
183
|
`agenticdome verify --run-tests --output .agenticdome/verification.json`.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
Preview obtains the private, signed, catalog-bound semantic plan and keeps
|
|
185
|
+
application source on your machine. `agenticdome integrate apply` creates a
|
|
186
|
+
local Git review branch but never commits, pushes or deploys. Existing-source
|
|
187
|
+
automatic edits are currently limited to one exact certified smolagents run
|
|
188
|
+
pattern; all other paths need manual integration. The older `agenticdome plan`
|
|
189
|
+
and `agenticdome scaffold` remain available as advanced review-only commands.
|
|
186
190
|
|
|
187
191
|
For an MCP client, host, gateway or server workload, use the focused path:
|
|
188
192
|
|
|
189
193
|
```bash
|
|
190
194
|
agenticdome mcp protect
|
|
191
|
-
#
|
|
195
|
+
# Review the detected role/transport and boundaries, then preview exact local files:
|
|
196
|
+
agenticdome integrate preview --target mcp
|
|
197
|
+
# Review .agenticdome/scaffold/guided-integration.patch and
|
|
198
|
+
# .agenticdome/scaffold/proposed/AGENTICDOME-CHANGES.md
|
|
199
|
+
agenticdome integrate status
|
|
200
|
+
# Optional, after approval: add review files on a local Git branch.
|
|
201
|
+
agenticdome integrate apply
|
|
202
|
+
# Manually attach the wrapper to the real MCP forwarder and reroute clients.
|
|
203
|
+
agenticdome inspect --output agenticdome-inspection.json
|
|
192
204
|
agenticdome mcp verify
|
|
193
205
|
```
|
|
194
206
|
|
|
195
|
-
`mcp protect`
|
|
196
|
-
|
|
207
|
+
`mcp protect` and `integrate preview --target mcp` do not edit customer source.
|
|
208
|
+
An approved `integrate apply` adds only missing MCP review/wrapper files to a
|
|
209
|
+
local Git branch; it does not rewrite an existing forwarder, route clients,
|
|
210
|
+
commit or deploy. If there are no new MCP review files, apply refuses. Undo
|
|
211
|
+
removes only unchanged files added by the approval. Actual interception still
|
|
212
|
+
requires manually connecting the wrapper to the real request/response path,
|
|
213
|
+
trusted identity and purpose, runtime credentials, client routing and tests.
|
|
214
|
+
`mcp verify` runs the workload's tests, a real JSON-RPC stdio subprocess interception rehearsal and live
|
|
197
215
|
assigned-sidecar decisions. The customer Control Panel combines that evidence
|
|
198
216
|
with retained runtime evidence before representing production readiness.
|
|
199
217
|
|
|
@@ -216,9 +234,17 @@ agenticdome openclaw verify --output .agenticdome/verification.json
|
|
|
216
234
|
|
|
217
235
|
`openclaw protect` fails unless the active OpenClaw runtime reports the loaded
|
|
218
236
|
AgenticDome plugin, explicit consent and the exact certified typed hooks.
|
|
237
|
+
The official `openclaw plugins install`, `enable`, `config set` and gateway
|
|
238
|
+
restart commands are the actual runtime configuration change; the Python CLI
|
|
239
|
+
does not apply or undo them. No application source patch is needed for native
|
|
240
|
+
hooks. Custom skill paths outside those hooks need a reviewed manual
|
|
241
|
+
`protectedExecute()` integration and workload-specific tests.
|
|
219
242
|
`agenticdome plan` returns source-free, tenant-bound Integration Copilot
|
|
220
243
|
guidance for review. `openclaw verify` adds workspace-test and assigned-tenant
|
|
221
|
-
policy evidence.
|
|
244
|
+
policy evidence. If the same deployable workload also uses MCP, this command
|
|
245
|
+
includes the MCP transport rehearsal and both `mcp_verification` and
|
|
246
|
+
`openclaw_verification` in one report. Both sections must be ready before the
|
|
247
|
+
report is imported; `mcp verify` alone is not a combined-workload proof. The
|
|
222
248
|
customer Control Panel separately confirms tenant binding and retained
|
|
223
249
|
telemetry; neither command silently modifies customer source.
|
|
224
250
|
|
|
@@ -228,6 +254,17 @@ languages and candidate boundaries can be discovered locally; business
|
|
|
228
254
|
purpose, sensitive actions and managed-versus-sovereign deployment remain
|
|
229
255
|
explicit customer decisions and are not guessed from source code.
|
|
230
256
|
|
|
257
|
+
`agenticdome init` creates local configuration without contacting Copilot.
|
|
258
|
+
`inspect` and `plan` send source-free structural metadata to the assigned
|
|
259
|
+
tenant sidecar. A selection spanning several deployable packages is analyzed
|
|
260
|
+
as bounded, sequential workload units; successful units are checkpointed
|
|
261
|
+
locally so a retry does not resubmit them. The report lists analyzed parts
|
|
262
|
+
and any result-list caps. It does not claim that calls or guard placement
|
|
263
|
+
across separate workload units were proven; review those boundaries before
|
|
264
|
+
production. If the selection exceeds the 24-unit safety limit, select the
|
|
265
|
+
application or package that actually executes agent actions. No unexamined
|
|
266
|
+
unit is silently omitted or reported as protected.
|
|
267
|
+
|
|
231
268
|
Use **Customer Control Panel → Activate Action Firewall → Core Config** to
|
|
232
269
|
choose the Developer Integration path and import the two evidence files. This
|
|
233
270
|
path is for SDK, MCP, framework or custom-code integrations; Microsoft
|
|
@@ -64,23 +64,41 @@ agenticdome inspect --output agenticdome-inspection.json
|
|
|
64
64
|
|
|
65
65
|
`init` writes the secret-free inspection and local configuration. For the
|
|
66
66
|
certified onboarding path, obtain the assigned sidecar and a dedicated
|
|
67
|
-
`integration_copilot` key, run
|
|
68
|
-
|
|
67
|
+
`integration_copilot` key, run `agenticdome integrate preview`, review its
|
|
68
|
+
local exact diff and change summary, explicitly approve a supported edit or
|
|
69
|
+
attach other boundaries manually, then run
|
|
69
70
|
`agenticdome verify --run-tests --output .agenticdome/verification.json`.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
Preview obtains the private, signed, catalog-bound semantic plan and keeps
|
|
72
|
+
application source on your machine. `agenticdome integrate apply` creates a
|
|
73
|
+
local Git review branch but never commits, pushes or deploys. Existing-source
|
|
74
|
+
automatic edits are currently limited to one exact certified smolagents run
|
|
75
|
+
pattern; all other paths need manual integration. The older `agenticdome plan`
|
|
76
|
+
and `agenticdome scaffold` remain available as advanced review-only commands.
|
|
73
77
|
|
|
74
78
|
For an MCP client, host, gateway or server workload, use the focused path:
|
|
75
79
|
|
|
76
80
|
```bash
|
|
77
81
|
agenticdome mcp protect
|
|
78
|
-
#
|
|
82
|
+
# Review the detected role/transport and boundaries, then preview exact local files:
|
|
83
|
+
agenticdome integrate preview --target mcp
|
|
84
|
+
# Review .agenticdome/scaffold/guided-integration.patch and
|
|
85
|
+
# .agenticdome/scaffold/proposed/AGENTICDOME-CHANGES.md
|
|
86
|
+
agenticdome integrate status
|
|
87
|
+
# Optional, after approval: add review files on a local Git branch.
|
|
88
|
+
agenticdome integrate apply
|
|
89
|
+
# Manually attach the wrapper to the real MCP forwarder and reroute clients.
|
|
90
|
+
agenticdome inspect --output agenticdome-inspection.json
|
|
79
91
|
agenticdome mcp verify
|
|
80
92
|
```
|
|
81
93
|
|
|
82
|
-
`mcp protect`
|
|
83
|
-
|
|
94
|
+
`mcp protect` and `integrate preview --target mcp` do not edit customer source.
|
|
95
|
+
An approved `integrate apply` adds only missing MCP review/wrapper files to a
|
|
96
|
+
local Git branch; it does not rewrite an existing forwarder, route clients,
|
|
97
|
+
commit or deploy. If there are no new MCP review files, apply refuses. Undo
|
|
98
|
+
removes only unchanged files added by the approval. Actual interception still
|
|
99
|
+
requires manually connecting the wrapper to the real request/response path,
|
|
100
|
+
trusted identity and purpose, runtime credentials, client routing and tests.
|
|
101
|
+
`mcp verify` runs the workload's tests, a real JSON-RPC stdio subprocess interception rehearsal and live
|
|
84
102
|
assigned-sidecar decisions. The customer Control Panel combines that evidence
|
|
85
103
|
with retained runtime evidence before representing production readiness.
|
|
86
104
|
|
|
@@ -103,9 +121,17 @@ agenticdome openclaw verify --output .agenticdome/verification.json
|
|
|
103
121
|
|
|
104
122
|
`openclaw protect` fails unless the active OpenClaw runtime reports the loaded
|
|
105
123
|
AgenticDome plugin, explicit consent and the exact certified typed hooks.
|
|
124
|
+
The official `openclaw plugins install`, `enable`, `config set` and gateway
|
|
125
|
+
restart commands are the actual runtime configuration change; the Python CLI
|
|
126
|
+
does not apply or undo them. No application source patch is needed for native
|
|
127
|
+
hooks. Custom skill paths outside those hooks need a reviewed manual
|
|
128
|
+
`protectedExecute()` integration and workload-specific tests.
|
|
106
129
|
`agenticdome plan` returns source-free, tenant-bound Integration Copilot
|
|
107
130
|
guidance for review. `openclaw verify` adds workspace-test and assigned-tenant
|
|
108
|
-
policy evidence.
|
|
131
|
+
policy evidence. If the same deployable workload also uses MCP, this command
|
|
132
|
+
includes the MCP transport rehearsal and both `mcp_verification` and
|
|
133
|
+
`openclaw_verification` in one report. Both sections must be ready before the
|
|
134
|
+
report is imported; `mcp verify` alone is not a combined-workload proof. The
|
|
109
135
|
customer Control Panel separately confirms tenant binding and retained
|
|
110
136
|
telemetry; neither command silently modifies customer source.
|
|
111
137
|
|
|
@@ -115,6 +141,17 @@ languages and candidate boundaries can be discovered locally; business
|
|
|
115
141
|
purpose, sensitive actions and managed-versus-sovereign deployment remain
|
|
116
142
|
explicit customer decisions and are not guessed from source code.
|
|
117
143
|
|
|
144
|
+
`agenticdome init` creates local configuration without contacting Copilot.
|
|
145
|
+
`inspect` and `plan` send source-free structural metadata to the assigned
|
|
146
|
+
tenant sidecar. A selection spanning several deployable packages is analyzed
|
|
147
|
+
as bounded, sequential workload units; successful units are checkpointed
|
|
148
|
+
locally so a retry does not resubmit them. The report lists analyzed parts
|
|
149
|
+
and any result-list caps. It does not claim that calls or guard placement
|
|
150
|
+
across separate workload units were proven; review those boundaries before
|
|
151
|
+
production. If the selection exceeds the 24-unit safety limit, select the
|
|
152
|
+
application or package that actually executes agent actions. No unexamined
|
|
153
|
+
unit is silently omitted or reported as protected.
|
|
154
|
+
|
|
118
155
|
Use **Customer Control Panel → Activate Action Firewall → Core Config** to
|
|
119
156
|
choose the Developer Integration path and import the two evidence files. This
|
|
120
157
|
path is for SDK, MCP, framework or custom-code integrations; Microsoft
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agenticdome-python-sdk
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.35
|
|
4
4
|
Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
|
|
5
5
|
Author: AgenticDome
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -177,23 +177,41 @@ agenticdome inspect --output agenticdome-inspection.json
|
|
|
177
177
|
|
|
178
178
|
`init` writes the secret-free inspection and local configuration. For the
|
|
179
179
|
certified onboarding path, obtain the assigned sidecar and a dedicated
|
|
180
|
-
`integration_copilot` key, run
|
|
181
|
-
|
|
180
|
+
`integration_copilot` key, run `agenticdome integrate preview`, review its
|
|
181
|
+
local exact diff and change summary, explicitly approve a supported edit or
|
|
182
|
+
attach other boundaries manually, then run
|
|
182
183
|
`agenticdome verify --run-tests --output .agenticdome/verification.json`.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
Preview obtains the private, signed, catalog-bound semantic plan and keeps
|
|
185
|
+
application source on your machine. `agenticdome integrate apply` creates a
|
|
186
|
+
local Git review branch but never commits, pushes or deploys. Existing-source
|
|
187
|
+
automatic edits are currently limited to one exact certified smolagents run
|
|
188
|
+
pattern; all other paths need manual integration. The older `agenticdome plan`
|
|
189
|
+
and `agenticdome scaffold` remain available as advanced review-only commands.
|
|
186
190
|
|
|
187
191
|
For an MCP client, host, gateway or server workload, use the focused path:
|
|
188
192
|
|
|
189
193
|
```bash
|
|
190
194
|
agenticdome mcp protect
|
|
191
|
-
#
|
|
195
|
+
# Review the detected role/transport and boundaries, then preview exact local files:
|
|
196
|
+
agenticdome integrate preview --target mcp
|
|
197
|
+
# Review .agenticdome/scaffold/guided-integration.patch and
|
|
198
|
+
# .agenticdome/scaffold/proposed/AGENTICDOME-CHANGES.md
|
|
199
|
+
agenticdome integrate status
|
|
200
|
+
# Optional, after approval: add review files on a local Git branch.
|
|
201
|
+
agenticdome integrate apply
|
|
202
|
+
# Manually attach the wrapper to the real MCP forwarder and reroute clients.
|
|
203
|
+
agenticdome inspect --output agenticdome-inspection.json
|
|
192
204
|
agenticdome mcp verify
|
|
193
205
|
```
|
|
194
206
|
|
|
195
|
-
`mcp protect`
|
|
196
|
-
|
|
207
|
+
`mcp protect` and `integrate preview --target mcp` do not edit customer source.
|
|
208
|
+
An approved `integrate apply` adds only missing MCP review/wrapper files to a
|
|
209
|
+
local Git branch; it does not rewrite an existing forwarder, route clients,
|
|
210
|
+
commit or deploy. If there are no new MCP review files, apply refuses. Undo
|
|
211
|
+
removes only unchanged files added by the approval. Actual interception still
|
|
212
|
+
requires manually connecting the wrapper to the real request/response path,
|
|
213
|
+
trusted identity and purpose, runtime credentials, client routing and tests.
|
|
214
|
+
`mcp verify` runs the workload's tests, a real JSON-RPC stdio subprocess interception rehearsal and live
|
|
197
215
|
assigned-sidecar decisions. The customer Control Panel combines that evidence
|
|
198
216
|
with retained runtime evidence before representing production readiness.
|
|
199
217
|
|
|
@@ -216,9 +234,17 @@ agenticdome openclaw verify --output .agenticdome/verification.json
|
|
|
216
234
|
|
|
217
235
|
`openclaw protect` fails unless the active OpenClaw runtime reports the loaded
|
|
218
236
|
AgenticDome plugin, explicit consent and the exact certified typed hooks.
|
|
237
|
+
The official `openclaw plugins install`, `enable`, `config set` and gateway
|
|
238
|
+
restart commands are the actual runtime configuration change; the Python CLI
|
|
239
|
+
does not apply or undo them. No application source patch is needed for native
|
|
240
|
+
hooks. Custom skill paths outside those hooks need a reviewed manual
|
|
241
|
+
`protectedExecute()` integration and workload-specific tests.
|
|
219
242
|
`agenticdome plan` returns source-free, tenant-bound Integration Copilot
|
|
220
243
|
guidance for review. `openclaw verify` adds workspace-test and assigned-tenant
|
|
221
|
-
policy evidence.
|
|
244
|
+
policy evidence. If the same deployable workload also uses MCP, this command
|
|
245
|
+
includes the MCP transport rehearsal and both `mcp_verification` and
|
|
246
|
+
`openclaw_verification` in one report. Both sections must be ready before the
|
|
247
|
+
report is imported; `mcp verify` alone is not a combined-workload proof. The
|
|
222
248
|
customer Control Panel separately confirms tenant binding and retained
|
|
223
249
|
telemetry; neither command silently modifies customer source.
|
|
224
250
|
|
|
@@ -228,6 +254,17 @@ languages and candidate boundaries can be discovered locally; business
|
|
|
228
254
|
purpose, sensitive actions and managed-versus-sovereign deployment remain
|
|
229
255
|
explicit customer decisions and are not guessed from source code.
|
|
230
256
|
|
|
257
|
+
`agenticdome init` creates local configuration without contacting Copilot.
|
|
258
|
+
`inspect` and `plan` send source-free structural metadata to the assigned
|
|
259
|
+
tenant sidecar. A selection spanning several deployable packages is analyzed
|
|
260
|
+
as bounded, sequential workload units; successful units are checkpointed
|
|
261
|
+
locally so a retry does not resubmit them. The report lists analyzed parts
|
|
262
|
+
and any result-list caps. It does not claim that calls or guard placement
|
|
263
|
+
across separate workload units were proven; review those boundaries before
|
|
264
|
+
production. If the selection exceeds the 24-unit safety limit, select the
|
|
265
|
+
application or package that actually executes agent actions. No unexamined
|
|
266
|
+
unit is silently omitted or reported as protected.
|
|
267
|
+
|
|
231
268
|
Use **Customer Control Panel → Activate Action Firewall → Core Config** to
|
|
232
269
|
choose the Developer Integration path and import the two evidence files. This
|
|
233
270
|
path is for SDK, MCP, framework or custom-code integrations; Microsoft
|
|
@@ -28,6 +28,7 @@ agenticdome_sdk/copilot_ir_collector.cjs
|
|
|
28
28
|
agenticdome_sdk/crewai.py
|
|
29
29
|
agenticdome_sdk/demo.py
|
|
30
30
|
agenticdome_sdk/google_adk.py
|
|
31
|
+
agenticdome_sdk/guided_integration.py
|
|
31
32
|
agenticdome_sdk/hook_catalog.py
|
|
32
33
|
agenticdome_sdk/identity.py
|
|
33
34
|
agenticdome_sdk/langgraph.py
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"schema": "agenticdome.catalog-snapshot.v1",
|
|
3
3
|
"catalog_schema": "agenticdome.hook-catalog.v1",
|
|
4
4
|
"verified_at": "2026-09-26",
|
|
5
|
-
"python_sdk_version": "1.2.
|
|
5
|
+
"python_sdk_version": "1.2.35",
|
|
6
6
|
"published_packages": {
|
|
7
7
|
"agenticdome-python-sdk": {
|
|
8
8
|
"registry": "pypi",
|
|
9
|
-
"version": "1.2.
|
|
10
|
-
"url": "https://pypi.org/project/agenticdome-python-sdk/1.2.
|
|
9
|
+
"version": "1.2.35",
|
|
10
|
+
"url": "https://pypi.org/project/agenticdome-python-sdk/1.2.35/"
|
|
11
11
|
},
|
|
12
12
|
"agenticdome-sdk": {
|
|
13
13
|
"registry": "npm",
|
|
@@ -17,9 +17,6 @@ from pathlib import Path
|
|
|
17
17
|
from typing import Any, Dict, Optional
|
|
18
18
|
|
|
19
19
|
from .attestation import ensure_attestation_key
|
|
20
|
-
from .hook_catalog import CATALOG_SCHEMA, CATALOG_VERIFIED_AT, catalog_digest
|
|
21
|
-
|
|
22
|
-
|
|
23
20
|
SCOPES = ["onboarding:read", "metadata:write", "evidence:write", "workload:write", "repository:prepare"]
|
|
24
21
|
|
|
25
22
|
|
|
@@ -124,7 +121,10 @@ def _approve_metadata(ir: Dict[str, Any], assume_yes: bool) -> None:
|
|
|
124
121
|
|
|
125
122
|
def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
126
123
|
# Import lazily to avoid a module cycle and keep the public client purely orchestration code.
|
|
127
|
-
from .onboarding_cli import
|
|
124
|
+
from .onboarding_cli import (
|
|
125
|
+
_active_copilot_catalog_binding, _copilot_semantic_analysis,
|
|
126
|
+
_ensure_workload_id, _installed_sdk_version, _scope_gap_message, inspect_repository,
|
|
127
|
+
)
|
|
128
128
|
|
|
129
129
|
portal = str(args.portal).rstrip("/")
|
|
130
130
|
if not portal.startswith("https://") and not getattr(args, "allow_insecure_http", False):
|
|
@@ -155,12 +155,23 @@ def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
|
155
155
|
if not session.get("runtime") or not session.get("copilot"):
|
|
156
156
|
raise SystemExit("Authentication succeeded, but no eligible runtime is assigned. The saved portal session can be resumed after an administrator enables an assignment policy.")
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
local_workload_id = _ensure_workload_id(root)
|
|
159
|
+
report = inspect_repository(root, remote_analysis=False)
|
|
160
|
+
if report.get("scope", {}).get("complete") is not True:
|
|
161
|
+
raise SystemExit(_scope_gap_message(report))
|
|
159
162
|
ir = report["copilot_ir"]
|
|
160
163
|
_approve_metadata(ir, bool(args.yes))
|
|
161
164
|
private_pem, public_pem = ensure_attestation_key(root / ".agenticdome")
|
|
162
165
|
del private_pem
|
|
163
|
-
workload_uuid = str(uuid.uuid5(uuid.NAMESPACE_URL, session["tenant_id"] + ":" +
|
|
166
|
+
workload_uuid = str(uuid.uuid5(uuid.NAMESPACE_URL, session["tenant_id"] + ":" + local_workload_id))
|
|
167
|
+
previous_session_path = root / ".agenticdome" / "connect-session.json"
|
|
168
|
+
if previous_session_path.is_file():
|
|
169
|
+
try:
|
|
170
|
+
previous_session = json.loads(previous_session_path.read_text(encoding="utf-8"))
|
|
171
|
+
if previous_session.get("tenant_id") == session["tenant_id"]:
|
|
172
|
+
workload_uuid = str(uuid.UUID(str(previous_session["workload_uuid"])))
|
|
173
|
+
except (OSError, ValueError, KeyError, TypeError, AttributeError, json.JSONDecodeError):
|
|
174
|
+
raise SystemExit("The previous Connect workload identity is unreadable. Restore its connect-session.json before retrying to avoid creating a duplicate workload.")
|
|
164
175
|
frameworks = [item["key"] for item in report.get("frameworks", [])]
|
|
165
176
|
_request(portal + "/api/agentguard/connect/workloads", {
|
|
166
177
|
"session_uuid": session["session_uuid"], "workload_uuid": workload_uuid,
|
|
@@ -171,38 +182,51 @@ def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
|
171
182
|
|
|
172
183
|
runtime_base = str(session["runtime"]["api_base"]).rstrip("/")
|
|
173
184
|
copilot_key = str(session["copilot"]["api_key"])
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
"schema": "agenticdome.copilot-request.v1", "ir": ir,
|
|
177
|
-
"catalog_binding": {"schema": CATALOG_SCHEMA, "catalog_digest": catalog_digest(), "verified_at": CATALOG_VERIFIED_AT},
|
|
178
|
-
}, headers={"X-API-Key": copilot_key, "X-Tenant-Id": session["tenant_id"], "Idempotency-Key": hashlib.sha256((session["tenant_id"] + ir_digest + catalog_digest()).encode()).hexdigest()})
|
|
179
|
-
if plan.get("schema") != "agenticdome.copilot-plan.v1" or plan.get("tenant_id") != session["tenant_id"]:
|
|
180
|
-
raise SystemExit("The assigned private Copilot returned an invalid tenant-bound plan.")
|
|
181
|
-
semantic = plan.get("semantic_analysis") or {}
|
|
182
|
-
if semantic.get("ir_sha256") != ir_digest:
|
|
183
|
-
raise SystemExit("The private Copilot plan was not bound to the submitted metadata.")
|
|
184
|
-
_request(portal + "/api/agentguard/connect/sessions/" + session["session_uuid"] + "/metadata", {"ir": ir, "signed_plan": plan}, session["access_token"])
|
|
185
|
-
|
|
185
|
+
from .onboarding_cli import _ir_sha256
|
|
186
|
+
ir_digest = _ir_sha256(ir)
|
|
186
187
|
state_dir = root / ".agenticdome"
|
|
187
188
|
state_dir.mkdir(parents=True, exist_ok=True)
|
|
188
|
-
cache = {"schema": "agenticdome.copilot-cache.v1", "source_upload": False, "tenant_id": session["tenant_id"], "api_base": runtime_base, "semantic_analysis": semantic, "catalog_binding": plan.get("catalog_binding")}
|
|
189
|
-
(state_dir / "copilot-analysis.json").write_text(json.dumps(cache, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
190
189
|
config_path = state_dir / "config.json"
|
|
191
190
|
if not config_path.exists():
|
|
192
191
|
config_path.write_text(json.dumps({
|
|
193
|
-
"schema": "agenticdome.project-config.v1", "
|
|
192
|
+
"schema": "agenticdome.project-config.v1", "workload_id": local_workload_id,
|
|
193
|
+
"frameworks": frameworks or ["custom-python"],
|
|
194
194
|
"execution_broker_mode": "policy",
|
|
195
195
|
"business_purpose": "REVIEW_REQUIRED_NOT_INVENTED", "sensitive_tools": [],
|
|
196
196
|
"deployment": {"preference": "managed", "region": session["runtime"].get("region") or "auto"},
|
|
197
197
|
"source_upload": False,
|
|
198
198
|
}, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
199
|
-
resumable = {"schema": "agenticdome.connect-state.v1", "portal": portal, "tenant_id": session["tenant_id"], "session_uuid": session["session_uuid"], "workload_uuid": workload_uuid, "token_expires_at": session["expires_at"], "access_token": session["access_token"]}
|
|
200
|
-
state_path = state_dir / "connect-session.json"
|
|
201
|
-
state_path.write_text(json.dumps(resumable, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
202
|
-
os.chmod(state_path, 0o600)
|
|
203
199
|
previous = {name: os.environ.get(name) for name in ("AGENTICDOME_API_BASE", "AGENTICDOME_COPILOT_API_KEY", "AGENTICDOME_TENANT_ID")}
|
|
204
200
|
os.environ.update({"AGENTICDOME_API_BASE": runtime_base, "AGENTICDOME_COPILOT_API_KEY": copilot_key, "AGENTICDOME_TENANT_ID": session["tenant_id"]})
|
|
205
201
|
try:
|
|
202
|
+
semantic = _copilot_semantic_analysis(root, ir, required=True)
|
|
203
|
+
binding = _active_copilot_catalog_binding(root)
|
|
204
|
+
if semantic.get("ir_sha256") != ir_digest or not binding:
|
|
205
|
+
raise SystemExit("The private Copilot result was not bound to this workload and the installed SDK catalog.")
|
|
206
|
+
# The portal stores a compact inventory, never the potentially large
|
|
207
|
+
# per-function graph. Every selected part was analyzed at the sidecar.
|
|
208
|
+
portal_ir = {
|
|
209
|
+
"schema": "agenticdome.copilot-ir.v1", "source_upload": False,
|
|
210
|
+
"metadata_kind": "bounded_workload_summary", "selected_ir_sha256": ir_digest,
|
|
211
|
+
"files": [], "functions": [],
|
|
212
|
+
"features": {"functions": len(ir.get("functions", []))},
|
|
213
|
+
"scope": {
|
|
214
|
+
"complete": True, "fingerprint": ir.get("scope", {}).get("fingerprint"),
|
|
215
|
+
"eligible_files_scanned": ir.get("scope", {}).get("eligible_files_scanned", 0),
|
|
216
|
+
},
|
|
217
|
+
"workload_coverage": {
|
|
218
|
+
"selected_parts": semantic.get("workload_coverage", {}).get("selected_parts", 1),
|
|
219
|
+
"analyzed_parts": semantic.get("workload_coverage", {}).get("analyzed_parts", 1),
|
|
220
|
+
"cross_part_flow_proven": semantic.get("workload_coverage", {}).get("cross_part_flow_proven", True),
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
plan = {
|
|
224
|
+
"schema": "agenticdome.copilot-plan.v1", "tenant_id": session["tenant_id"],
|
|
225
|
+
"semantic_analysis": semantic, "catalog_binding": binding,
|
|
226
|
+
"aggregation": {"kind": "sdk_local_bounded_parts", "signature_scope": "individual_sidecar_parts_only"},
|
|
227
|
+
}
|
|
228
|
+
_request(portal + "/api/agentguard/connect/sessions/" + session["session_uuid"] + "/metadata", {"ir": portal_ir, "signed_plan": plan}, session["access_token"])
|
|
229
|
+
|
|
206
230
|
from .onboarding_cli import create_scaffold
|
|
207
231
|
patch_path = create_scaffold(root)
|
|
208
232
|
finally:
|
|
@@ -211,6 +235,11 @@ def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
|
211
235
|
os.environ.pop(name, None)
|
|
212
236
|
else:
|
|
213
237
|
os.environ[name] = value
|
|
238
|
+
|
|
239
|
+
resumable = {"schema": "agenticdome.connect-state.v1", "portal": portal, "tenant_id": session["tenant_id"], "session_uuid": session["session_uuid"], "workload_uuid": workload_uuid, "token_expires_at": session["expires_at"], "access_token": session["access_token"]}
|
|
240
|
+
state_path = state_dir / "connect-session.json"
|
|
241
|
+
state_path.write_text(json.dumps(resumable, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
242
|
+
os.chmod(state_path, 0o600)
|
|
214
243
|
pull_request = None
|
|
215
244
|
if args.open_pr:
|
|
216
245
|
if not args.repository_connection:
|
|
@@ -222,6 +251,15 @@ def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
|
222
251
|
"next_action": "Ask AgenticDome to confirm policy-aware sidecar readiness before live verification.",
|
|
223
252
|
})
|
|
224
253
|
broker_setup["sdk_mode"] = effective_config.get("execution_broker_mode", "existing_sdk_or_environment_default")
|
|
254
|
+
cross_part_review_required = semantic.get("workload_coverage", {}).get("cross_part_flow_proven") is False
|
|
255
|
+
next_action = (
|
|
256
|
+
"Review the generated pull request and run agenticdome verify. Then review cross-part call paths and workload-specific tests in the portal before activation."
|
|
257
|
+
if args.open_pr else
|
|
258
|
+
"Review the generated patch, apply it on a branch, and run agenticdome verify. Then review cross-part call paths and workload-specific tests in the portal before activation."
|
|
259
|
+
) if cross_part_review_required else (
|
|
260
|
+
"Review the generated pull request and run agenticdome verify."
|
|
261
|
+
if args.open_pr else "Review the generated patch, apply it on a branch, then run agenticdome verify."
|
|
262
|
+
)
|
|
225
263
|
return {
|
|
226
264
|
"status": "changeset_ready", "source_upload": False, "tenant_id": session["tenant_id"],
|
|
227
265
|
"session_uuid": session["session_uuid"], "workload_uuid": workload_uuid,
|
|
@@ -229,9 +267,10 @@ def run_connect(root: Path, args: Any) -> Dict[str, Any]:
|
|
|
229
267
|
"execution_broker": broker_setup,
|
|
230
268
|
"attachment_points": len(semantic.get("attachment_points") or []),
|
|
231
269
|
"bypass_risks": len(semantic.get("bypass_risks") or []),
|
|
270
|
+
"cross_part_review_required": cross_part_review_required,
|
|
232
271
|
"patch": str(patch_path.relative_to(root)),
|
|
233
272
|
"pull_request": pull_request,
|
|
234
|
-
"next_action":
|
|
273
|
+
"next_action": next_action,
|
|
235
274
|
"sdk_version": _installed_sdk_version(),
|
|
236
275
|
}
|
|
237
276
|
|
{agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/copilot_ir.py
RENAMED
|
@@ -350,11 +350,13 @@ def _collect_typescript(root: Path, paths: Sequence[Path]) -> Tuple[List[Dict[st
|
|
|
350
350
|
def _typescript_fallback(root: Path, paths: Sequence[Path], reason: str) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
|
|
351
351
|
functions: List[Dict[str, Any]] = []
|
|
352
352
|
parsed = 0
|
|
353
|
+
read_errors = 0
|
|
353
354
|
call_pattern = re.compile(r"\b([A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*)*)\s*\(")
|
|
354
355
|
for path in paths:
|
|
355
356
|
try:
|
|
356
357
|
lines = path.read_text(encoding="utf-8", errors="ignore").splitlines()
|
|
357
358
|
except OSError:
|
|
359
|
+
read_errors += 1
|
|
358
360
|
continue
|
|
359
361
|
events = []
|
|
360
362
|
for line_number, line in enumerate(lines, start=1):
|
|
@@ -368,7 +370,7 @@ def _typescript_fallback(root: Path, paths: Sequence[Path], reason: str) -> Tupl
|
|
|
368
370
|
"engine": "typescript-structural-fallback",
|
|
369
371
|
"available": False,
|
|
370
372
|
"files_parsed": parsed,
|
|
371
|
-
"parse_errors":
|
|
373
|
+
"parse_errors": read_errors,
|
|
372
374
|
"reason": reason,
|
|
373
375
|
"claim": "Generic structural collection only; install TypeScript for compiler AST evidence",
|
|
374
376
|
}
|
|
@@ -382,7 +384,10 @@ def collect_repository_ir(root: Path, paths: Sequence[Path]) -> Dict[str, Any]:
|
|
|
382
384
|
python_functions, python_engine = _collect_python(root, python_paths)
|
|
383
385
|
typescript_functions, typescript_engine = _collect_typescript(root, typescript_paths)
|
|
384
386
|
functions = python_functions + typescript_functions
|
|
385
|
-
|
|
387
|
+
collection_errors = int(python_engine.get("parse_errors", 0)) + int(typescript_engine.get("parse_errors", 0))
|
|
388
|
+
files_parsed = int(python_engine.get("files_parsed", 0)) + int(typescript_engine.get("files_parsed", 0))
|
|
389
|
+
complete = (len(paths) <= MAX_IR_FILES and len(functions) <= MAX_IR_FUNCTIONS
|
|
390
|
+
and collection_errors == 0 and files_parsed == len(paths))
|
|
386
391
|
return {
|
|
387
392
|
"schema": IR_SCHEMA,
|
|
388
393
|
"source_upload": False,
|
|
@@ -394,7 +399,8 @@ def collect_repository_ir(root: Path, paths: Sequence[Path]) -> Dict[str, Any]:
|
|
|
394
399
|
"files_selected": len(selected),
|
|
395
400
|
"symbols_found": len(functions),
|
|
396
401
|
"complete": complete,
|
|
397
|
-
"limit_reason": "file_limit" if len(paths) > MAX_IR_FILES else "symbol_limit" if len(functions) > MAX_IR_FUNCTIONS
|
|
402
|
+
"limit_reason": "file_limit" if len(paths) > MAX_IR_FILES else "symbol_limit" if len(functions) > MAX_IR_FUNCTIONS
|
|
403
|
+
else "parse_or_read_error" if collection_errors or files_parsed != len(paths) else None,
|
|
398
404
|
},
|
|
399
405
|
"privacy": {
|
|
400
406
|
"source_text": False,
|