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.
Files changed (94) hide show
  1. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/PKG-INFO +47 -10
  2. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/README.md +46 -9
  3. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/PKG-INFO +47 -10
  4. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/SOURCES.txt +1 -0
  5. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/catalog_snapshot.json +3 -3
  6. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/connect.py +65 -26
  7. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/copilot_ir.py +9 -3
  8. agenticdome_python_sdk-1.2.35/agenticdome_sdk/guided_integration.py +658 -0
  9. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/onboarding_cli.py +462 -72
  10. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/customer-onboarding.md +84 -29
  11. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/pyproject.toml +1 -1
  12. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/CONTRIBUTING.md +0 -0
  13. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/LICENSE +0 -0
  14. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/MANIFEST.in +0 -0
  15. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/NOTICE +0 -0
  16. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/SECURITY.md +0 -0
  17. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/dependency_links.txt +0 -0
  18. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/entry_points.txt +0 -0
  19. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/requires.txt +0 -0
  20. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_python_sdk.egg-info/top_level.txt +0 -0
  21. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/__init__.py +0 -0
  22. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/_framework_firewall.py +0 -0
  23. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/_mode.py +0 -0
  24. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/agno.py +0 -0
  25. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/attestation.py +0 -0
  26. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/autogen.py +0 -0
  27. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/aws_bedrock.py +0 -0
  28. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/claude.py +0 -0
  29. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/client.py +0 -0
  30. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/copilot_ir_collector.cjs +0 -0
  31. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/crewai.py +0 -0
  32. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/demo.py +0 -0
  33. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/google_adk.py +0 -0
  34. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/hook_catalog.py +0 -0
  35. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/identity.py +0 -0
  36. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/langgraph.py +0 -0
  37. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/lifecycle.py +0 -0
  38. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/llamaindex.py +0 -0
  39. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_host.py +0 -0
  40. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_http_gateway.py +0 -0
  41. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_rehearsal_server.py +0 -0
  42. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/mcp_verification.py +0 -0
  43. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/microsoft_agent_framework.py +0 -0
  44. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/microsoft_ai_foundry.py +0 -0
  45. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/openai_agents.py +0 -0
  46. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/outcomes.py +0 -0
  47. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/proof.py +0 -0
  48. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/pydantic.py +0 -0
  49. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/simulation.py +0 -0
  50. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/agenticdome_sdk/smolagents.py +0 -0
  51. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/README.md +0 -0
  52. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/agno.md +0 -0
  53. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/autogen.md +0 -0
  54. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/aws-bedrock.md +0 -0
  55. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/claude-agent-sdk.md +0 -0
  56. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/crewai.md +0 -0
  57. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/custom-python.md +0 -0
  58. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/google-adk.md +0 -0
  59. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/langgraph.md +0 -0
  60. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/llamaindex.md +0 -0
  61. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/microsoft-agent-framework.md +0 -0
  62. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/microsoft-ai-foundry.md +0 -0
  63. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/openai-agents.md +0 -0
  64. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/pydanticai.md +0 -0
  65. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/frameworks/smolagents.md +0 -0
  66. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/mcp-integration.md +0 -0
  67. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/performance-evidence.md +0 -0
  68. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/docs/runtime-deployment.md +0 -0
  69. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/PRODUCTION_INTEGRATION.md +0 -0
  70. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/README.md +0 -0
  71. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/attack_demo.py +0 -0
  72. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/crewai_agenticdome_firewall.py +0 -0
  73. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/README.md +0 -0
  74. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/_shared.py +0 -0
  75. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/agno.py +0 -0
  76. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/autogen.py +0 -0
  77. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/aws_bedrock.py +0 -0
  78. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/claude_agent_sdk.py +0 -0
  79. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/crewai.py +0 -0
  80. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/custom_python.py +0 -0
  81. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/google_adk.py +0 -0
  82. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/langgraph.py +0 -0
  83. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/llamaindex.py +0 -0
  84. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/mcp.py +0 -0
  85. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/microsoft_agent_framework.py +0 -0
  86. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/microsoft_ai_foundry.py +0 -0
  87. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/openai_agents.py +0 -0
  88. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/pydanticai.py +0 -0
  89. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/frameworks/smolagents.py +0 -0
  90. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/langgraph_agenticdome_firewall.py +0 -0
  91. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/local_simulation_gallery.py +0 -0
  92. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/examples/mcp_gateway_action_firewall.py +0 -0
  93. {agenticdome_python_sdk-1.2.33 → agenticdome_python_sdk-1.2.35}/setup.cfg +0 -0
  94. {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.33
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 the tenant-bound `agenticdome plan`, attach
181
- and test the selected boundaries, then run
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
- The private plan is required because production verification consumes its
184
- signed, catalog-bound semantic analysis. `agenticdome scaffold` remains
185
- optional and writes an unapplied patch for review.
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
- # review the detected role/transport, boundaries, registry and unapplied patch
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` adds no customer source changes. `mcp verify` runs the workload's
196
- tests, a real JSON-RPC stdio subprocess interception rehearsal and live
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. The
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 the tenant-bound `agenticdome plan`, attach
68
- and test the selected boundaries, then run
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
- The private plan is required because production verification consumes its
71
- signed, catalog-bound semantic analysis. `agenticdome scaffold` remains
72
- optional and writes an unapplied patch for review.
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
- # review the detected role/transport, boundaries, registry and unapplied patch
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` adds no customer source changes. `mcp verify` runs the workload's
83
- tests, a real JSON-RPC stdio subprocess interception rehearsal and live
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. The
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.33
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 the tenant-bound `agenticdome plan`, attach
181
- and test the selected boundaries, then run
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
- The private plan is required because production verification consumes its
184
- signed, catalog-bound semantic analysis. `agenticdome scaffold` remains
185
- optional and writes an unapplied patch for review.
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
- # review the detected role/transport, boundaries, registry and unapplied patch
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` adds no customer source changes. `mcp verify` runs the workload's
196
- tests, a real JSON-RPC stdio subprocess interception rehearsal and live
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. The
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.33",
5
+ "python_sdk_version": "1.2.35",
6
6
  "published_packages": {
7
7
  "agenticdome-python-sdk": {
8
8
  "registry": "pypi",
9
- "version": "1.2.33",
10
- "url": "https://pypi.org/project/agenticdome-python-sdk/1.2.33/"
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 _installed_sdk_version, inspect_repository
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
- report = inspect_repository(root)
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"] + ":" + root.name))
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
- ir_digest = hashlib.sha256(json.dumps(ir, sort_keys=True, separators=(",", ":")).encode("utf-8")).hexdigest()
175
- plan = _request(runtime_base + "/integration-copilot/v1/analyze", {
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", "frameworks": frameworks or ["custom-python"],
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": "Review the generated pull request and run agenticdome verify." if pull_request else "Review the generated patch, apply it on a branch, then run agenticdome verify.",
273
+ "next_action": next_action,
235
274
  "sdk_version": _installed_sdk_version(),
236
275
  }
237
276
 
@@ -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": 0,
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
- complete = len(paths) <= MAX_IR_FILES and len(functions) <= MAX_IR_FUNCTIONS
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 else None,
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,