agentengine-sdk-python 0.8.2__py3-none-any.whl → 0.8.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
  2. agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +108 -91
  6. ksadk/builders/code_builder.py +36 -9
  7. ksadk/builders/framework_requirements.py +2 -1
  8. ksadk/builders/ks3_uploader.py +36 -7
  9. ksadk/builders/managed_runtime_builder.py +4 -0
  10. ksadk/cli/__init__.py +38 -3
  11. ksadk/cli/cmd_managed_runtime.py +13 -1
  12. ksadk/cli/cmd_plugin.py +662 -0
  13. ksadk/cli/cmd_web.py +2 -5
  14. ksadk/cli/runtime_bootstrap.py +23 -1
  15. ksadk/codex/client.py +424 -96
  16. ksadk/codex/projection.py +24 -0
  17. ksadk/codex/runtime.py +83 -283
  18. ksadk/common/auth.py +16 -10
  19. ksadk/configs/env_registry.py +59 -3
  20. ksadk/configs/settings.py +9 -0
  21. ksadk/context_engine/contributors.py +73 -8
  22. ksadk/conversations/__init__.py +19 -0
  23. ksadk/conversations/context.py +104 -24
  24. ksadk/conversations/contracts.py +266 -0
  25. ksadk/conversations/message_projection.py +154 -15
  26. ksadk/conversations/projector.py +614 -0
  27. ksadk/conversations/reducer.py +98 -0
  28. ksadk/conversations/runtime_invocation.py +5 -0
  29. ksadk/conversations/runtime_payloads.py +1 -0
  30. ksadk/conversations/runtime_preparation.py +30 -27
  31. ksadk/conversations/runtime_resume.py +50 -2
  32. ksadk/conversations/runtime_stream_events.py +5 -0
  33. ksadk/conversations/runtime_streaming.py +25 -7
  34. ksadk/deployment/env_forward.py +2 -2
  35. ksadk/deployment/providers/serverless.py +1 -1
  36. ksadk/events/_v1_compat/projection.py +2 -0
  37. ksadk/events/adapters/_codex_validators.py +18 -7
  38. ksadk/events/adapters/codex.py +190 -0
  39. ksadk/events/adapters/langgraph.py +15 -1
  40. ksadk/events/canonical_store.py +3 -1
  41. ksadk/events/projections.py +1 -1
  42. ksadk/harness/__init__.py +45 -35
  43. ksadk/harness/config.py +2 -2
  44. ksadk/harness/runtime.py +75 -16
  45. ksadk/harness/tools.py +38 -13
  46. ksadk/interaction/provider.py +1 -0
  47. ksadk/interaction/providers/langgraph.py +1 -0
  48. ksadk/kernel/bootstrap.py +28 -4
  49. ksadk/kernel/contract_fingerprints.py +5 -4
  50. ksadk/kernel/contracts.py +8 -0
  51. ksadk/kernel/control.py +1 -0
  52. ksadk/kernel/ingress.py +36 -2
  53. ksadk/kernel/memory_store.py +1 -0
  54. ksadk/kernel/postgres_store.py +1 -0
  55. ksadk/kernel/sqlite_store.py +28 -0
  56. ksadk/kernel/store.py +3 -0
  57. ksadk/kernel/worker.py +76 -10
  58. ksadk/knowledge_base/client.py +57 -27
  59. ksadk/mcp_runtime/__init__.py +12 -4
  60. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  61. ksadk/memory/adk/resilient_session_service.py +25 -17
  62. ksadk/memory/adk/short_term_memory.py +26 -9
  63. ksadk/memory/models.py +7 -4
  64. ksadk/memory/provider_resolver.py +3 -0
  65. ksadk/memory/providers/local_sqlite.py +7 -0
  66. ksadk/model_proxy/server.py +10 -5
  67. ksadk/plugins/__init__.py +171 -0
  68. ksadk/plugins/artifacts.py +275 -0
  69. ksadk/plugins/bridges/__init__.py +47 -0
  70. ksadk/plugins/bridges/codex.py +659 -0
  71. ksadk/plugins/bridges/dsh.py +1300 -0
  72. ksadk/plugins/builtins.py +746 -0
  73. ksadk/plugins/bundle.py +246 -0
  74. ksadk/plugins/bundle_security.py +191 -0
  75. ksadk/plugins/codex_manifest.py +983 -0
  76. ksadk/plugins/composition.py +537 -0
  77. ksadk/plugins/context_contributor.py +437 -0
  78. ksadk/plugins/contracts.py +569 -0
  79. ksadk/plugins/delivery.py +153 -0
  80. ksadk/plugins/dsh_installation_digest.py +71 -0
  81. ksadk/plugins/dsh_toolchain.py +1024 -0
  82. ksadk/plugins/ecosystem_bridge.py +1105 -0
  83. ksadk/plugins/ecosystem_probe.py +191 -0
  84. ksadk/plugins/host.py +787 -0
  85. ksadk/plugins/kernel_adapter.py +205 -0
  86. ksadk/plugins/providers/__init__.py +108 -0
  87. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  88. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  89. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  90. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  91. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  92. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  93. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  94. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  95. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  96. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  97. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  98. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  99. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  100. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  101. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  102. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  103. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  104. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  105. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  106. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  107. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  108. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  109. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  110. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  111. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  112. ksadk/plugins/providers/codex.py +988 -0
  113. ksadk/plugins/providers/codex_dsh.py +83 -0
  114. ksadk/plugins/providers/codex_native.py +368 -0
  115. ksadk/plugins/providers/codex_turn.py +301 -0
  116. ksadk/plugins/providers/dsh.py +951 -0
  117. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  118. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  119. ksadk/plugins/providers/dsh_mcp.py +467 -0
  120. ksadk/plugins/providers/harness.py +632 -0
  121. ksadk/plugins/providers/harness_dsh.py +91 -0
  122. ksadk/plugins/providers/legacy.py +215 -0
  123. ksadk/plugins/providers/legacy_catalog.py +100 -0
  124. ksadk/plugins/providers/mcp_projection.py +150 -0
  125. ksadk/plugins/providers/platform_resources.py +657 -0
  126. ksadk/plugins/providers/shipped_dsh.py +370 -0
  127. ksadk/plugins/resolver.py +338 -0
  128. ksadk/plugins/subagent_providers/__init__.py +12 -0
  129. ksadk/plugins/subagent_providers/codex.py +443 -0
  130. ksadk/plugins/subagents.py +333 -0
  131. ksadk/resource_runtime/__init__.py +4 -0
  132. ksadk/resource_runtime/broker.py +616 -0
  133. ksadk/resource_runtime/build_artifacts.py +165 -0
  134. ksadk/resource_runtime/contracts.py +138 -0
  135. ksadk/resource_runtime/discovery_receipts.py +100 -0
  136. ksadk/resource_runtime/discovery_skills.py +172 -0
  137. ksadk/resource_runtime/errors.py +6 -0
  138. ksadk/resource_runtime/ipc.py +142 -0
  139. ksadk/resource_runtime/kernel_approval.py +165 -0
  140. ksadk/resource_runtime/knowledge.py +114 -0
  141. ksadk/resource_runtime/langgraph.py +94 -0
  142. ksadk/resource_runtime/leases.py +191 -0
  143. ksadk/resource_runtime/managed_projection.py +186 -0
  144. ksadk/resource_runtime/mcp_server.py +138 -0
  145. ksadk/resource_runtime/memory_provider.py +318 -0
  146. ksadk/resource_runtime/memory_receipts.py +34 -0
  147. ksadk/resource_runtime/operation_ledger.py +211 -0
  148. ksadk/resource_runtime/plugin_config.py +48 -0
  149. ksadk/resource_runtime/policy_authorization.py +54 -0
  150. ksadk/resource_runtime/process.py +110 -0
  151. ksadk/resource_runtime/skill_artifacts.py +153 -0
  152. ksadk/resource_runtime/skill_runtime.py +42 -0
  153. ksadk/resource_runtime/skill_workspace.py +118 -0
  154. ksadk/resource_runtime/skills.py +215 -0
  155. ksadk/resource_runtime/snapshots.py +180 -0
  156. ksadk/resource_runtime/socket_server.py +103 -0
  157. ksadk/resource_runtime/supervisor.py +380 -0
  158. ksadk/resource_runtime/worker.py +504 -0
  159. ksadk/runners/_langgraph_runner_streams.py +74 -6
  160. ksadk/runners/adk_runner.py +149 -11
  161. ksadk/runners/base_runner.py +29 -1
  162. ksadk/runners/langgraph_runner.py +475 -145
  163. ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
  164. ksadk/runtime/adapter.py +3 -0
  165. ksadk/runtime/conversation_execution.py +92 -16
  166. ksadk/runtime/executor.py +78 -2
  167. ksadk/runtime/factory.py +30 -200
  168. ksadk/runtime/framework_adapters.py +41 -0
  169. ksadk/runtime/preprocessing.py +10 -2
  170. ksadk/runtime/runner_adapter.py +78 -14
  171. ksadk/runtime_context.py +40 -2
  172. ksadk/sandbox/__init__.py +2 -1
  173. ksadk/sandbox/backends/e2b.py +52 -11
  174. ksadk/sandbox/backends/local_process.py +9 -0
  175. ksadk/sandbox/base.py +2 -0
  176. ksadk/sandbox/e2b_connection.py +66 -0
  177. ksadk/sandbox/factory.py +72 -0
  178. ksadk/scheduler/__init__.py +18 -0
  179. ksadk/scheduler/calendar.py +102 -0
  180. ksadk/scheduler/contracts.py +254 -0
  181. ksadk/scheduler/dispatcher.py +129 -0
  182. ksadk/scheduler/engine.py +416 -0
  183. ksadk/scheduler/sqlite_store.py +581 -0
  184. ksadk/server/composition.py +2 -0
  185. ksadk/server/factory.py +5 -0
  186. ksadk/server/persistence_capability.py +516 -0
  187. ksadk/server/routes/control.py +210 -46
  188. ksadk/server/routes/dependencies.py +15 -0
  189. ksadk/server/routes/models.py +47 -4
  190. ksadk/server/routes/projection.py +252 -12
  191. ksadk/server/routes/sessions.py +284 -107
  192. ksadk/server/routes/streaming.py +43 -9
  193. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  194. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
  195. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  196. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  197. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  198. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  199. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
  200. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  201. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  202. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  203. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  204. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  205. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  206. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  207. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  208. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  209. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  210. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  211. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  212. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  213. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  214. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  215. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  216. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  217. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  218. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  219. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  220. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  221. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
  222. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  223. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  224. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  225. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  226. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  227. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
  228. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
  229. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
  230. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
  231. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
  232. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
  233. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
  234. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
  235. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
  236. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
  237. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
  238. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
  239. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
  240. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
  241. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
  242. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
  243. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
  244. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
  245. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
  246. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
  247. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
  248. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
  249. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  250. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  251. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  252. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  253. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  254. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  255. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  256. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  257. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  258. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  259. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  260. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  261. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  262. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  263. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
  264. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
  265. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  266. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  267. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  268. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  269. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  270. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  271. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  272. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  273. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  274. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  275. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  276. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  277. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  278. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  279. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  280. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  281. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  282. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  283. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  284. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  285. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  286. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  287. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  288. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  289. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  290. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  291. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  292. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  293. ksadk/server/static/index.html +2 -2
  294. ksadk/session_context.py +66 -0
  295. ksadk/sessions/__init__.py +11 -21
  296. ksadk/sessions/_local_service_sync.py +263 -1
  297. ksadk/sessions/base.py +176 -0
  298. ksadk/sessions/errors.py +4 -0
  299. ksadk/sessions/in_memory.py +309 -19
  300. ksadk/sessions/local_service.py +83 -1
  301. ksadk/sessions/persistence.py +275 -0
  302. ksadk/sessions/postgres_service.py +358 -0
  303. ksadk/sessions/resilience.py +8 -0
  304. ksadk/sessions/resilient.py +362 -4
  305. ksadk/sessions/topology.py +135 -0
  306. ksadk/skills/models.py +26 -4
  307. ksadk/skills/package_store.py +186 -38
  308. ksadk/skills/runtime/agent.py +31 -6
  309. ksadk/skills/runtime/artifact_delivery.py +139 -0
  310. ksadk/skills/runtime/backends/e2b.py +98 -6
  311. ksadk/skills/runtime/backends/local.py +73 -8
  312. ksadk/skills/runtime/base.py +3 -0
  313. ksadk/skills/runtime/executor.py +2 -0
  314. ksadk/skills/runtime/loader.py +10 -2
  315. ksadk/skills/runtime/pinned.py +114 -0
  316. ksadk/skills/runtime/request.py +31 -0
  317. ksadk/skills/service_client.py +211 -24
  318. ksadk/studio/agent_lifecycle.py +26 -20
  319. ksadk/studio/api.py +714 -90
  320. ksadk/studio/api_catalog_routes.py +23 -0
  321. ksadk/studio/api_contracts.py +34 -1
  322. ksadk/studio/api_plugin_routes.py +911 -0
  323. ksadk/studio/api_resource_connections.py +183 -0
  324. ksadk/studio/attachment_store.py +187 -0
  325. ksadk/studio/authoring.py +10 -4
  326. ksadk/studio/authoring_coordinator.py +31 -16
  327. ksadk/studio/builder.py +199 -43
  328. ksadk/studio/cloud.py +346 -104
  329. ksadk/studio/cloud_shared_web.py +565 -0
  330. ksadk/studio/codex_agent_service.py +140 -27
  331. ksadk/studio/codex_builder.py +294 -16
  332. ksadk/studio/codex_credentials.py +90 -0
  333. ksadk/studio/codex_manifest.py +51 -4
  334. ksadk/studio/codex_plugin_store.py +746 -0
  335. ksadk/studio/codex_provider_build.py +231 -0
  336. ksadk/studio/codex_run.py +200 -29
  337. ksadk/studio/compatibility_report.py +456 -0
  338. ksadk/studio/compiler.py +84 -15
  339. ksadk/studio/contracts.py +249 -4
  340. ksadk/studio/dsh_application.py +137 -0
  341. ksadk/studio/dsh_capability_service.py +1107 -0
  342. ksadk/studio/dsh_models.py +59 -0
  343. ksadk/studio/dsh_provider_registration.py +1075 -0
  344. ksadk/studio/event_store.py +54 -6
  345. ksadk/studio/framework_run.py +37 -4
  346. ksadk/studio/hosted_kernel.py +89 -14
  347. ksadk/studio/mcp_runtime.py +11 -3
  348. ksadk/studio/model_client.py +2 -2
  349. ksadk/studio/operations.py +12 -2
  350. ksadk/studio/plugin_composition.py +468 -0
  351. ksadk/studio/plugin_kernel_adapter.py +28 -0
  352. ksadk/studio/plugin_runtime.py +831 -0
  353. ksadk/studio/resource_authority.py +637 -0
  354. ksadk/studio/resource_binding_validation.py +77 -0
  355. ksadk/studio/resource_build_admission.py +196 -0
  356. ksadk/studio/resource_build_materializer.py +149 -0
  357. ksadk/studio/resource_catalog.py +149 -3
  358. ksadk/studio/resource_connections.py +220 -0
  359. ksadk/studio/run_service.py +1144 -96
  360. ksadk/studio/runtime_source.py +24 -8
  361. ksadk/studio/scheduler_assistant.py +317 -0
  362. ksadk/studio/scheduler_runtime.py +383 -0
  363. ksadk/studio/scheduler_service.py +214 -0
  364. ksadk/studio/service.py +1131 -95
  365. ksadk/studio/shared_web.py +610 -87
  366. ksadk/studio/soul.py +52 -0
  367. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  368. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  369. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  372. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  373. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  377. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  378. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  379. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  380. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  381. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  382. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  383. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  384. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  385. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  386. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  387. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  388. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  389. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  390. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  391. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  392. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  393. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  394. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  395. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  396. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  397. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  398. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  399. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  400. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  401. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  402. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  403. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  404. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  405. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  406. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  407. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  408. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  409. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  410. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  411. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  412. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  413. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  414. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  415. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  416. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  417. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  418. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  419. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  420. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  421. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  422. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  423. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  424. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  425. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  426. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  427. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  428. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  429. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  430. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  431. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  432. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  433. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  434. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  435. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  436. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  437. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  438. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  439. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  440. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  441. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  442. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  443. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  444. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  445. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  446. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  447. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  448. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  449. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  450. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  451. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  452. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  453. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  454. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  455. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  456. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  457. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  458. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  459. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  460. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  461. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  462. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  463. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  464. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  465. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  466. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  467. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  468. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  469. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  470. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  471. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  472. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  473. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  474. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  475. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  476. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  477. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  478. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  479. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  480. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  481. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  482. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  483. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  484. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  485. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  486. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  487. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  488. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  489. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  490. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  491. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  492. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  493. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  494. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  495. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  496. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  497. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  498. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  499. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  500. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  501. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  502. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  503. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  504. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  505. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  506. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  507. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  508. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  509. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  510. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  511. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  512. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  513. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  514. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  515. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  516. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  517. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  518. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  519. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  520. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  521. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  522. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  523. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  524. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  525. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  526. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  527. ksadk/studio/static/index.html +2 -2
  528. ksadk/studio/validator.py +1 -1
  529. ksadk/studio/workspace.py +1 -0
  530. ksadk/version.py +1 -1
  531. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  532. agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
  533. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  534. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  535. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  536. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  537. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  538. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  539. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  540. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  541. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  542. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  543. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  544. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  545. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  546. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  547. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  548. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  549. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  550. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  551. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  552. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  553. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  554. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  555. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  556. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  557. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  558. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  559. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  560. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  561. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  562. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  563. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,504 @@
1
+ """Private resource worker entry point. Initialization arrives on a trusted pipe."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import sys
7
+ import time
8
+ from dataclasses import asdict
9
+ from pathlib import Path
10
+ from typing import ClassVar
11
+ from urllib.parse import urlsplit
12
+
13
+ import httpx
14
+ from pydantic import ConfigDict, Field, SecretStr, model_validator
15
+ from requests.exceptions import RequestException
16
+
17
+ from ksadk.knowledge_base.client import KnowledgeBaseClient
18
+ from ksadk.memory.adk.backends.sdk_ltm_backend import SdkLTMBackend
19
+ from ksadk.memory.models import MemorySearchRequest
20
+ from ksadk.plugins.contracts import PluginContractModel
21
+ from ksadk.resource_runtime.build_artifacts import ResourceBuildReference
22
+ from ksadk.resource_runtime.contracts import (
23
+ Identifier,
24
+ InvocationIdentity,
25
+ ResourceConfig,
26
+ validate_resource_bindings,
27
+ )
28
+ from ksadk.resource_runtime.discovery_receipts import DiscoverySkillReceipt, discovery_scope_key
29
+ from ksadk.resource_runtime.discovery_skills import DiscoverySkillService
30
+ from ksadk.resource_runtime.errors import ResourceUpstreamAuthorizationError
31
+ from ksadk.resource_runtime.ipc import ResourceRequest, read_frame, write_frame
32
+ from ksadk.resource_runtime.knowledge import BoundKnowledgeService
33
+ from ksadk.resource_runtime.leases import ResourceScope
34
+ from ksadk.resource_runtime.memory_provider import AicpMemoryProvider, MemoryQuery
35
+ from ksadk.resource_runtime.skill_runtime import create_bound_skill_runtime
36
+ from ksadk.resource_runtime.skills import PinnedSkillService
37
+ from ksadk.resource_runtime.snapshots import ConnectionTarget, MemoryRecallPolicy, ResourceSnapshot
38
+ from ksadk.skills.package_store import SkillPackageError
39
+ from ksadk.skills.service_client import SkillServiceClient
40
+
41
+
42
+ class ExplicitWorkerBinding(PluginContractModel):
43
+ resource_kind: ClassVar[str] = ""
44
+ model_config = ConfigDict(hide_input_in_errors=True)
45
+ config: ResourceConfig
46
+ endpoint: str
47
+ access_key: SecretStr = Field(min_length=1)
48
+ secret_key: SecretStr = Field(min_length=1)
49
+ session_token: SecretStr = SecretStr("")
50
+
51
+ @model_validator(mode="after")
52
+ def explicit_connection(self) -> ExplicitWorkerBinding:
53
+ url = urlsplit(self.endpoint)
54
+ if (
55
+ url.scheme not in {"http", "https"}
56
+ or not url.hostname
57
+ or url.username is not None
58
+ or url.password is not None
59
+ or url.query
60
+ or url.fragment
61
+ or url.path not in {"", "/"}
62
+ or any(char.isspace() for char in self.endpoint)
63
+ ):
64
+ raise ValueError("Worker requires an explicit service endpoint")
65
+ if self.config.binding.resource.kind != self.resource_kind:
66
+ raise ValueError("Worker binding resource kind does not match service")
67
+ return self
68
+
69
+
70
+ class KnowledgeWorkerBinding(ExplicitWorkerBinding):
71
+ resource_kind: ClassVar[str] = "knowledge-base"
72
+
73
+ def create_service(self) -> BoundKnowledgeService:
74
+ endpoint = urlsplit(self.endpoint)
75
+ client = KnowledgeBaseClient(
76
+ dataset_id=self.config.binding.resource.id,
77
+ region=self.config.binding.resource.region,
78
+ endpoint=endpoint.netloc,
79
+ scheme=endpoint.scheme,
80
+ access_key=self.access_key.get_secret_value(),
81
+ secret_key=self.secret_key.get_secret_value(),
82
+ session_token=self.session_token.get_secret_value(),
83
+ )
84
+ return BoundKnowledgeService(self.config, client)
85
+
86
+
87
+ class MemoryWorkerBinding(ExplicitWorkerBinding):
88
+ resource_kind: ClassVar[str] = "memory-instance"
89
+
90
+ def create_provider(self, identity: InvocationIdentity) -> AicpMemoryProvider:
91
+ endpoint = urlsplit(self.endpoint)
92
+ backend = SdkLTMBackend(
93
+ index="bound-resource",
94
+ memory_collection_id=self.config.binding.resource.id,
95
+ namespace=self.config.binding.resource.id,
96
+ agent_id=identity.agent_id,
97
+ region=self.config.binding.resource.region,
98
+ endpoint=endpoint.netloc,
99
+ scheme=endpoint.scheme,
100
+ access_key=self.access_key.get_secret_value(),
101
+ secret_key=self.secret_key.get_secret_value(),
102
+ session_token=self.session_token.get_secret_value(),
103
+ )
104
+ return AicpMemoryProvider(self.config, identity, backend)
105
+
106
+
107
+ class DiscoverySkillWorkerBinding(ExplicitWorkerBinding):
108
+ resource_kind: ClassVar[str] = "skill-space"
109
+ cache_directory: Path
110
+ selection_run_ref: Identifier
111
+ restored_selections: tuple[DiscoverySkillReceipt, ...] = Field(default=(), max_length=32)
112
+ execution_connection: ConnectionTarget | None = None
113
+ execution_api_key: SecretStr | None = Field(default=None, repr=False)
114
+ artifact_directory: Path | None = None
115
+
116
+ @model_validator(mode="after")
117
+ def discovery_only(self):
118
+ if (
119
+ self.config.selection_mode != "discovery"
120
+ or self.config.include_public
121
+ or self.session_token.get_secret_value()
122
+ or not self.cache_directory.is_absolute()
123
+ ):
124
+ raise ValueError("Discovery Worker requires private-space signed configuration")
125
+ execution = (self.execution_connection, self.execution_api_key, self.artifact_directory)
126
+ if any(value is not None for value in execution) and (
127
+ any(value is None for value in execution)
128
+ or not self.execution_api_key.get_secret_value()
129
+ or not self.artifact_directory.is_absolute()
130
+ ):
131
+ raise ValueError(
132
+ "Discovery execution requires complete explicit target and artifact root"
133
+ )
134
+ return self
135
+
136
+ def create_provider(
137
+ self, scope: ResourceScope, *, execution_target=None,
138
+ ) -> DiscoverySkillService:
139
+ namespace = discovery_scope_key(scope, self.selection_run_ref)
140
+ client = SkillServiceClient(
141
+ base_url=self.endpoint,
142
+ access_key=self.access_key.get_secret_value(),
143
+ secret_key=self.secret_key.get_secret_value(),
144
+ region=self.config.binding.resource.region,
145
+ allow_env_fallback=False,
146
+ timeout=15,
147
+ )
148
+ return DiscoverySkillService(
149
+ self.config,
150
+ client,
151
+ cache_directory=self.cache_directory,
152
+ namespace=namespace,
153
+ restored_selections=self.restored_selections,
154
+ execution_target=execution_target,
155
+ )
156
+
157
+
158
+ def read_memory(
159
+ provider: AicpMemoryProvider,
160
+ arguments: dict,
161
+ policy: MemoryRecallPolicy | None = None,
162
+ ) -> dict:
163
+ query = MemoryQuery.model_validate(arguments)
164
+ policy = MemoryRecallPolicy.model_validate((policy or MemoryRecallPolicy()).model_dump())
165
+ result = provider.search(
166
+ MemorySearchRequest(
167
+ query=query.query,
168
+ scopes=[("user", provider.partition)],
169
+ top_k=policy.top_k,
170
+ max_tokens=policy.max_tokens,
171
+ min_score=policy.min_score,
172
+ memory_types=[],
173
+ )
174
+ )
175
+ return asdict(result)
176
+
177
+
178
+ class PinnedSkillWorkerBinding(PluginContractModel):
179
+ model_config = ConfigDict(hide_input_in_errors=True)
180
+ config: ResourceConfig
181
+ build_directory: Path
182
+ build_reference: ResourceBuildReference
183
+ cache_directory: Path
184
+ execution_connection: ConnectionTarget | None = None
185
+ execution_api_key: SecretStr | None = Field(default=None, repr=False)
186
+ artifact_directory: Path | None = None
187
+
188
+ @model_validator(mode="after")
189
+ def pinned_only(self):
190
+ if (
191
+ self.config.binding.resource.kind != "skill-space"
192
+ or self.config.selection_mode == "discovery"
193
+ ):
194
+ raise ValueError("Pinned Skill Worker requires pinned selection")
195
+ if not self.build_directory.is_absolute() or not self.cache_directory.is_absolute():
196
+ raise ValueError("Worker delivery paths must be absolute host paths")
197
+ execution_fields = (
198
+ self.execution_connection,
199
+ self.execution_api_key,
200
+ self.artifact_directory,
201
+ )
202
+ if any(item is not None for item in execution_fields):
203
+ if any(item is None for item in execution_fields):
204
+ raise ValueError(
205
+ "Skill execution requires connection, credential and artifact root"
206
+ )
207
+ if not self.execution_api_key.get_secret_value():
208
+ raise ValueError("Skill execution credential cannot be empty")
209
+ if not self.artifact_directory.is_absolute():
210
+ raise ValueError("Skill artifact root must be absolute")
211
+ return self
212
+
213
+ def create_service(self) -> PinnedSkillService:
214
+ return PinnedSkillService(
215
+ self.build_directory,
216
+ self.build_reference,
217
+ binding_id=self.config.binding.id,
218
+ cache_directory=self.cache_directory,
219
+ )
220
+
221
+
222
+ class WorkerInitialization(PluginContractModel):
223
+ model_config = ConfigDict(hide_input_in_errors=True)
224
+ resource_snapshot: ResourceSnapshot
225
+ bindings: tuple[
226
+ KnowledgeWorkerBinding
227
+ | MemoryWorkerBinding
228
+ | PinnedSkillWorkerBinding
229
+ | DiscoverySkillWorkerBinding,
230
+ ...,
231
+ ]
232
+ scopes: tuple[ResourceScope, ...]
233
+
234
+ @model_validator(mode="after")
235
+ def single_activation(self) -> WorkerInitialization:
236
+ if not self.bindings or not self.scopes:
237
+ raise ValueError("Worker initialization cannot be empty")
238
+ validate_resource_bindings(tuple(binding.config for binding in self.bindings))
239
+ binding_ids = {binding.config.binding.id for binding in self.bindings}
240
+ if binding_ids != {scope.binding_id for scope in self.scopes}:
241
+ raise ValueError("Worker scopes must exactly cover bindings")
242
+ if len(self.scopes) != len(binding_ids):
243
+ raise ValueError("Duplicate worker scope")
244
+ first = self.scopes[0]
245
+ if binding_ids != {item.config.binding.id for item in self.resource_snapshot.bindings}:
246
+ raise ValueError("Worker bindings must exactly match the Build resource snapshot")
247
+ for scope in self.scopes:
248
+ frozen = self.resource_snapshot.binding(scope.binding_id)
249
+ binding = next(
250
+ item for item in self.bindings if item.config.binding.id == scope.binding_id
251
+ )
252
+ if (
253
+ scope.binding_snapshot_digest != self.resource_snapshot.digest
254
+ or binding.config.digest != frozen.config.digest
255
+ ):
256
+ raise ValueError("Worker resource configuration does not match Build")
257
+ if isinstance(binding, PinnedSkillWorkerBinding):
258
+ if (
259
+ binding.build_reference.snapshot_digest != self.resource_snapshot.digest
260
+ or frozen.connection.tenant_ref != scope.identity.tenant_ref
261
+ or frozen.connection.principal_ref != scope.identity.resource_principal_ref
262
+ ):
263
+ raise ValueError(
264
+ "Pinned Skill Worker identity or snapshot does not match Build"
265
+ )
266
+ else:
267
+ self.resource_snapshot.verify_connection(
268
+ scope.binding_id,
269
+ ConnectionTarget(
270
+ connection_ref=binding.config.binding.connection_ref,
271
+ tenant_ref=scope.identity.tenant_ref,
272
+ principal_ref=scope.identity.resource_principal_ref,
273
+ endpoint=binding.endpoint,
274
+ auth_mode="sts" if binding.session_token.get_secret_value() else "signed",
275
+ ),
276
+ )
277
+ if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)):
278
+ if binding.execution_connection is not None and (
279
+ frozen.skill_execution is None
280
+ or binding.execution_connection != frozen.skill_execution.connection
281
+ ):
282
+ raise ValueError("Skill execution connection does not match Build")
283
+ if (
284
+ scope.identity != first.identity
285
+ or scope.activation_id != first.activation_id
286
+ or scope.generation_id != first.generation_id
287
+ or scope.profile_digest != first.profile_digest
288
+ or scope.build_digest != first.build_digest
289
+ or scope.binding_snapshot_digest != first.binding_snapshot_digest
290
+ ):
291
+ raise ValueError("Worker scopes cannot mix activations or Builds")
292
+ supported = (
293
+ {"load_memory", "save_memory", "memory_status", "update_memory", "delete_memory"}
294
+ if isinstance(binding, MemoryWorkerBinding)
295
+ else {"search_knowledge_base"}
296
+ )
297
+ if isinstance(binding, DiscoverySkillWorkerBinding):
298
+ supported = {"list_skills", "search_skills", "load_skill", "read_skill_resource"}
299
+ if binding.execution_connection is not None:
300
+ supported.update({"execute_skills", "read_skill_artifact"})
301
+ if isinstance(binding, PinnedSkillWorkerBinding):
302
+ supported = {
303
+ "list_skills",
304
+ "search_skills",
305
+ "load_skill",
306
+ "read_skill_resource",
307
+ "read_skill_artifact",
308
+ }
309
+ if binding.execution_connection is not None:
310
+ supported.add("execute_skills")
311
+ if not set(scope.allowed_operations) <= supported:
312
+ raise ValueError("Unsupported worker operation")
313
+ return self
314
+
315
+ def pipe_payload(self) -> dict:
316
+ """Credential-bearing data for the private child stdin only; never persist."""
317
+ payload = self.model_dump(by_alias=True, mode="json")
318
+ for raw, binding in zip(payload["bindings"], self.bindings):
319
+ if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)):
320
+ if binding.execution_api_key is not None:
321
+ raw["executionApiKey"] = binding.execution_api_key.get_secret_value()
322
+ if isinstance(binding, PinnedSkillWorkerBinding):
323
+ continue
324
+ raw["accessKey"] = binding.access_key.get_secret_value()
325
+ raw["secretKey"] = binding.secret_key.get_secret_value()
326
+ raw["sessionToken"] = binding.session_token.get_secret_value()
327
+ return payload
328
+
329
+
330
+ def main() -> int:
331
+ logging.disable(logging.CRITICAL)
332
+ source, target = sys.stdin.buffer, sys.stdout.buffer
333
+ try:
334
+ initialization = WorkerInitialization.model_validate(read_frame(source))
335
+ scopes = {scope.binding_id: scope for scope in initialization.scopes}
336
+ services = {
337
+ binding.config.binding.id: (
338
+ binding.create_provider(
339
+ scopes[binding.config.binding.id],
340
+ execution_target=initialization.resource_snapshot.binding(
341
+ binding.config.binding.id
342
+ ).skill_execution,
343
+ )
344
+ if isinstance(binding, DiscoverySkillWorkerBinding)
345
+ else binding.create_provider(scopes[binding.config.binding.id].identity)
346
+ if isinstance(binding, MemoryWorkerBinding)
347
+ else binding.create_service()
348
+ )
349
+ for binding in initialization.bindings
350
+ }
351
+ skill_runtimes = {}
352
+ for binding in initialization.bindings:
353
+ if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)) and (
354
+ binding.execution_connection is not None
355
+ ):
356
+ root = binding.artifact_directory
357
+ root.mkdir(mode=0o700, parents=True, exist_ok=True)
358
+ if root.is_symlink() or root.stat().st_mode & 0o077:
359
+ raise ValueError("Skill artifact root must be private")
360
+ skill_runtimes[binding.config.binding.id] = create_bound_skill_runtime(
361
+ initialization.resource_snapshot,
362
+ binding.config.binding.id,
363
+ current_connection=binding.execution_connection,
364
+ api_key=binding.execution_api_key,
365
+ artifact_directory=root.resolve(),
366
+ )
367
+ skill_runtimes[binding.config.binding.id].preflight()
368
+ write_frame(target, {"status": "ready"})
369
+ except Exception:
370
+ write_frame(target, {"error": {"code": "RESOURCE_WORKER_INITIALIZATION_FAILED"}})
371
+ return 1
372
+ revoked_bindings: set[str] = set()
373
+ while True:
374
+ try:
375
+ message = read_frame(source)
376
+ if message is None:
377
+ return 0
378
+ if set(message) != {"request", "scope"}:
379
+ raise ValueError("Invalid worker message")
380
+ request = ResourceRequest.model_validate(message["request"])
381
+ scope = ResourceScope.model_validate(message["scope"])
382
+ if scopes.get(scope.binding_id) != scope:
383
+ raise ValueError("Scope does not match worker initialization")
384
+ if request.deadline / 1000 <= time.time():
385
+ raise ValueError("Request deadline exceeded")
386
+ if request.check_only or request.operation not in scope.allowed_operations:
387
+ raise ValueError("Unsupported worker operation")
388
+ if scope.binding_id in revoked_bindings:
389
+ raise ResourceUpstreamAuthorizationError()
390
+ service = services[scope.binding_id]
391
+ if request.operation == "load_memory" and isinstance(service, AicpMemoryProvider):
392
+ reply = read_memory(
393
+ service,
394
+ request.arguments,
395
+ initialization.resource_snapshot.binding(scope.binding_id).memory_recall,
396
+ )
397
+ elif request.operation == "save_memory" and isinstance(service, AicpMemoryProvider):
398
+ reply = service.submit(request.arguments, operation_id=request.request_id)
399
+ elif request.operation == "memory_status" and isinstance(service, AicpMemoryProvider):
400
+ reply = service.extraction_status(request.arguments)
401
+ elif request.operation in {"update_memory", "delete_memory"} and isinstance(
402
+ service, AicpMemoryProvider
403
+ ):
404
+ reply = service.mutate(
405
+ request.operation,
406
+ request.arguments,
407
+ operation_id=request.request_id,
408
+ )
409
+ elif request.operation == "search_knowledge_base":
410
+ reply = service.search(request.arguments).model_dump(by_alias=True, mode="json")
411
+ elif isinstance(service, PinnedSkillService):
412
+ if request.operation == "execute_skills":
413
+ try:
414
+ arguments = dict(request.arguments)
415
+ execution_kwargs = {}
416
+ if isinstance(service, DiscoverySkillService):
417
+ execution_kwargs["approved_selections"] = tuple(
418
+ DiscoverySkillReceipt.model_validate(item)
419
+ for item in arguments.pop("_hostSelections", [])
420
+ )
421
+ execution = service.execute(
422
+ arguments,
423
+ backend=skill_runtimes[scope.binding_id],
424
+ operation_id=request.request_id,
425
+ timeout=max(
426
+ 1, min(900, int(request.deadline / 1000 - time.time()) - 2)
427
+ ),
428
+ **execution_kwargs,
429
+ )
430
+ # Only the broker consumes these private paths. stdout/stderr
431
+ # may contain secrets or host paths and never cross this boundary.
432
+ known_outcome = (
433
+ execution.exit_code is not None
434
+ and not execution.timed_out
435
+ and not execution.error_type
436
+ )
437
+ reply = {
438
+ "operationId": request.request_id,
439
+ "status": (
440
+ "succeeded"
441
+ if execution.ok
442
+ else "failed"
443
+ if known_outcome
444
+ else "unknown"
445
+ ),
446
+ "outputFiles": execution.output_files if known_outcome else [],
447
+ }
448
+ except Exception:
449
+ reply = {
450
+ "operationId": request.request_id,
451
+ "status": "unknown",
452
+ "outputFiles": [],
453
+ }
454
+ write_frame(target, {"requestId": request.request_id, "result": reply})
455
+ continue
456
+ handlers = {
457
+ "list_skills": service.list_skills,
458
+ "search_skills": service.search_skills,
459
+ "load_skill": service.load_skill,
460
+ "read_skill_resource": service.read_resource,
461
+ }
462
+ try:
463
+ reply = handlers[request.operation](request.arguments)
464
+ except (httpx.HTTPError, RequestException) as error:
465
+ response = getattr(error, "response", None)
466
+ if response is not None and response.status_code in {401, 403}:
467
+ raise ResourceUpstreamAuthorizationError() from None
468
+ reply = {"status": "failed", "errorCode": "SKILL_RESOURCE_UNAVAILABLE"}
469
+ except (ValueError, OSError, SkillPackageError):
470
+ reply = {"status": "failed", "errorCode": "SKILL_RESOURCE_UNAVAILABLE"}
471
+ if (
472
+ isinstance(service, DiscoverySkillService)
473
+ and request.operation in {"load_skill", "read_skill_resource"}
474
+ and reply.get("status") == "ok"
475
+ ):
476
+ reply["_discoverySelection"] = DiscoverySkillReceipt.from_ref(
477
+ service._selected[reply["skillId"]]
478
+ ).model_dump(by_alias=True, mode="json")
479
+ else:
480
+ raise ValueError("Unsupported worker service")
481
+ if reply.get("errorCode", reply.get("error_code")) == "RESOURCE_FORBIDDEN":
482
+ revoked_bindings.add(scope.binding_id)
483
+ write_frame(
484
+ target,
485
+ {
486
+ "requestId": request.request_id,
487
+ "result": reply,
488
+ },
489
+ )
490
+ except ResourceUpstreamAuthorizationError:
491
+ revoked_bindings.add(scope.binding_id)
492
+ write_frame(target, {
493
+ "requestId": request.request_id,
494
+ "result": {"status": "unauthorized", "errorCode": "RESOURCE_FORBIDDEN"},
495
+ })
496
+ except Exception:
497
+ # Malformed transport or a protocol violation closes this worker.
498
+ # No exception text, credentials or request content enters stdout.
499
+ write_frame(target, {"error": {"code": "RESOURCE_WORKER_REQUEST_FAILED"}})
500
+ return 1
501
+
502
+
503
+ if __name__ == "__main__":
504
+ raise SystemExit(main())
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
23
23
  class _LangGraphStreamMixin:
24
24
  async def stream(self, input_data: Dict[str, Any]) -> AsyncIterator[Dict[str, Any]]:
25
25
  """流式调用 LangGraph 图"""
26
+ await self.prepare_runtime_capabilities()
26
27
  payload = dict(input_data)
27
28
  payload.pop("_ksadk_force_graph_invoke", None)
28
29
  session_id = payload.pop("session_id", None) or str(uuid.uuid4())[:8]
@@ -41,7 +42,10 @@ class _LangGraphStreamMixin:
41
42
  payload["input"] = self._gateway_approval_follow_up_input()
42
43
  resume_value = payload["input"]
43
44
  checkpoint_ref = self._extract_langgraph_checkpoint_ref(payload)
44
- native_context = self.build_native_context(payload.get("platform_context"))
45
+ native_context = self.build_native_context(
46
+ payload.get("platform_context"),
47
+ context_schema=getattr(self._agent, "context_schema", None),
48
+ )
45
49
  invoke_payload = dict(payload)
46
50
  invoke_payload["session_id"] = session_id
47
51
  if history:
@@ -66,7 +70,7 @@ class _LangGraphStreamMixin:
66
70
  elif is_resume and not is_gateway_approval_resume:
67
71
  # Keep the interrupt value intact for ``Command(resume=...)``;
68
72
  # prepare-state hooks only shape fresh user turns.
69
- state = resume_value
73
+ state = self._unwrap_resume_value(resume_value)
70
74
  elif self._has_prepare_state_hook():
71
75
  state = self._prepare_state_with_hook(
72
76
  payload,
@@ -390,9 +394,28 @@ class _LangGraphStreamMixin:
390
394
  output = event.get("data", {}).get("output", {})
391
395
  if isinstance(output, dict) and "__interrupt__" in output:
392
396
  emitted_non_text_event = True
397
+ # __interrupt__ 是 LangGraph 原始 Interrupt 对象列表,
398
+ # 直接 yield 会导致下游拿不到 tool_name/description(非 Mapping)。
399
+ # 用 _get_interrupt_info 从 state 提取结构化 interrupt_info,
400
+ # 与 406-412 的异常路径和 419-436 的 pending_approval 兜底一致。
401
+ _interrupt_info = {}
402
+ try:
403
+ _get_state = getattr(self._agent, "aget_state", None) or getattr(
404
+ self._agent, "get_state", None
405
+ )
406
+ if _get_state is not None:
407
+ _maybe_state = _get_state(config)
408
+ if inspect.isawaitable(_maybe_state):
409
+ _maybe_state = await _maybe_state
410
+ _interrupt_info = self._get_interrupt_info(_maybe_state)
411
+ except Exception:
412
+ _interrupt_info = {}
413
+ if not _interrupt_info:
414
+ # 取不到 state 时 fallback 到原始 __interrupt__(兼容旧行为)。
415
+ _interrupt_info = output["__interrupt__"]
393
416
  yield {
394
417
  "type": "interrupt",
395
- "interrupt_info": output["__interrupt__"],
418
+ "interrupt_info": _interrupt_info,
396
419
  "session_id": session_id,
397
420
  }
398
421
  return
@@ -553,7 +576,10 @@ class _LangGraphStreamMixin:
553
576
  resume_interrupt_id = str(payload.pop("resume_interrupt_id", "") or "")
554
577
  resume_value = payload.get("input")
555
578
  checkpoint_ref = self._extract_langgraph_checkpoint_ref(payload)
556
- native_context = self.build_native_context(payload.get("platform_context"))
579
+ native_context = self.build_native_context(
580
+ payload.get("platform_context"),
581
+ context_schema=getattr(self._agent, "context_schema", None),
582
+ )
557
583
 
558
584
  config = self._get_config(session_id)
559
585
  if is_checkpoint_resume:
@@ -567,7 +593,7 @@ class _LangGraphStreamMixin:
567
593
  if is_checkpoint_resume:
568
594
  state = resume_value
569
595
  elif is_resume:
570
- state = resume_value
596
+ state = self._unwrap_resume_value(resume_value)
571
597
  elif self._has_prepare_state_hook():
572
598
  state = self._prepare_state_with_hook(payload, session_id, history)
573
599
  else:
@@ -693,6 +719,47 @@ class _LangGraphStreamMixin:
693
719
  (ckpt_config.get("configurable") or {}).get("checkpoint_id", "") or ""
694
720
  )
695
721
  if ckpt_id:
722
+ # Extract next_node from graph state so the
723
+ # projection layer can surface it in the REST
724
+ # checkpoint payload.
725
+ next_nodes_raw = (
726
+ ckpt_state.get("next")
727
+ if isinstance(ckpt_state, dict)
728
+ else getattr(ckpt_state, "next", None)
729
+ )
730
+ ckpt_next_node = ""
731
+ if isinstance(next_nodes_raw, str):
732
+ ckpt_next_node = next_nodes_raw.strip()
733
+ elif isinstance(next_nodes_raw, (list, tuple, set)):
734
+ ckpt_next_node = str(next(iter(next_nodes_raw)) or "").strip()
735
+ # Enrich source metadata with checkpoint
736
+ # capability (backend/scope/durable) so the
737
+ # projection layer does not fall back to unknown.
738
+ ckpt_capability = self.describe_checkpoint_capability()
739
+ ckpt_source_metadata: dict[str, Any] = {"checkpoint": True}
740
+ if isinstance(ckpt_capability, dict):
741
+ ckpt_is_terminal = not bool(ckpt_next_node)
742
+ ckpt_is_resumable = bool(
743
+ ckpt_capability.get("Supported")
744
+ and ckpt_next_node
745
+ and ckpt_capability.get("Scope") != "process_local"
746
+ )
747
+ ckpt_source_metadata["capability"] = {
748
+ "backend": str(ckpt_capability.get("Backend") or "unknown"),
749
+ "scope": str(ckpt_capability.get("Scope") or "unknown"),
750
+ "durable": bool(ckpt_capability.get("Durable", False)),
751
+ "is_terminal": ckpt_is_terminal,
752
+ "is_resumable": ckpt_is_resumable,
753
+ "resume_status": (
754
+ "resumable" if ckpt_is_resumable else "disabled"
755
+ ),
756
+ "resume_disabled_reason": (
757
+ "该 checkpoint 已是终态;可选择更早恢复点重跑"
758
+ if ckpt_is_terminal
759
+ else str(ckpt_capability.get("Reason") or "")
760
+ ),
761
+ **({"next_node": ckpt_next_node} if ckpt_next_node else {}),
762
+ }
696
763
  ckpt_ref = {
697
764
  "thread_id": str(
698
765
  (ckpt_config.get("configurable") or {}).get(
@@ -701,6 +768,7 @@ class _LangGraphStreamMixin:
701
768
  ),
702
769
  "checkpoint_ns": "",
703
770
  "checkpoint_id": ckpt_id,
771
+ **({"next_node": ckpt_next_node} if ckpt_next_node else {}),
704
772
  }
705
773
  continuation_id = stable_item_id(
706
774
  "langgraph",
@@ -729,7 +797,7 @@ class _LangGraphStreamMixin:
729
797
  source=SourceRef(
730
798
  framework="langgraph",
731
799
  native_run_id=run_id,
732
- metadata={"checkpoint": True},
800
+ metadata=ckpt_source_metadata,
733
801
  ),
734
802
  continuation_id=continuation_id,
735
803
  continuation_kind="graph_checkpoint",