agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__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 (476) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +25 -12
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/a2a/_space_client_events.py +381 -0
  5. ksadk/a2a/event_adapter.py +156 -64
  6. ksadk/a2a/executor.py +179 -63
  7. ksadk/a2a/space_client.py +6 -333
  8. ksadk/a2ui/core.py +222 -53
  9. ksadk/agui/_agent_helpers.py +247 -0
  10. ksadk/agui/a2ui_projection.py +12 -5
  11. ksadk/agui/agent.py +443 -259
  12. ksadk/api/client.py +528 -27
  13. ksadk/builders/code_builder.py +284 -8
  14. ksadk/builders/container_builder.py +8 -1
  15. ksadk/builders/managed_runtime_builder.py +42 -35
  16. ksadk/cli/__init__.py +23 -0
  17. ksadk/cli/cmd_dashboard.py +15 -1
  18. ksadk/cli/cmd_deploy.py +10 -2
  19. ksadk/cli/cmd_eval.py +66 -9
  20. ksadk/cli/cmd_evalset.py +284 -0
  21. ksadk/cli/cmd_files.py +5 -1
  22. ksadk/cli/cmd_hermes.py +1 -126
  23. ksadk/cli/cmd_invoke.py +28 -38
  24. ksadk/cli/cmd_managed_runtime.py +95 -0
  25. ksadk/cli/cmd_observe.py +85 -0
  26. ksadk/cli/cmd_openclaw.py +1 -435
  27. ksadk/cli/cmd_plugin.py +657 -0
  28. ksadk/cli/cmd_replay.py +28 -4
  29. ksadk/cli/cmd_studio.py +99 -8
  30. ksadk/cli/cmd_web.py +10 -2
  31. ksadk/cli/hermes_env.py +151 -0
  32. ksadk/cli/invoke_payload.py +49 -0
  33. ksadk/cli/openclaw_env.py +458 -0
  34. ksadk/codex/client.py +180 -30
  35. ksadk/codex/runtime.py +475 -331
  36. ksadk/configs/env_registry.py +94 -12
  37. ksadk/configs/env_registry_pcm.py +181 -0
  38. ksadk/configs/env_var_spec.py +18 -0
  39. ksadk/configs/global_config.py +5 -0
  40. ksadk/configs/settings.py +9 -0
  41. ksadk/context_engine/__init__.py +98 -0
  42. ksadk/context_engine/assembler.py +176 -0
  43. ksadk/context_engine/baseline.py +419 -0
  44. ksadk/context_engine/cache_observability.py +228 -0
  45. ksadk/context_engine/capabilities.py +443 -0
  46. ksadk/context_engine/contributors.py +409 -0
  47. ksadk/context_engine/hosted_pipeline.py +417 -0
  48. ksadk/context_engine/models.py +117 -0
  49. ksadk/context_engine/planner.py +698 -0
  50. ksadk/context_engine/policies.py +319 -0
  51. ksadk/context_engine/projection.py +31 -0
  52. ksadk/context_engine/shadow_plan.py +266 -0
  53. ksadk/context_engine/tokenizer.py +164 -0
  54. ksadk/conversations/__init__.py +19 -0
  55. ksadk/conversations/context.py +230 -30
  56. ksadk/conversations/contracts.py +266 -0
  57. ksadk/conversations/message_projection.py +308 -26
  58. ksadk/conversations/model_context.py +49 -3
  59. ksadk/conversations/projector.py +616 -0
  60. ksadk/conversations/reducer.py +98 -0
  61. ksadk/conversations/runtime_compaction.py +207 -5
  62. ksadk/conversations/runtime_input.py +184 -2
  63. ksadk/conversations/runtime_invocation.py +81 -3
  64. ksadk/conversations/runtime_observability.py +141 -0
  65. ksadk/conversations/runtime_payloads.py +42 -0
  66. ksadk/conversations/runtime_preparation.py +272 -2
  67. ksadk/conversations/runtime_resume.py +20 -1
  68. ksadk/conversations/runtime_stream_events.py +94 -9
  69. ksadk/conversations/semantic_summary.py +311 -1
  70. ksadk/conversations/session_lock.py +51 -0
  71. ksadk/deployment/env_forward.py +72 -0
  72. ksadk/deployment/managed_runtime.py +5 -0
  73. ksadk/deployment/providers/serverless.py +143 -69
  74. ksadk/evaluation/__init__.py +32 -0
  75. ksadk/evaluation/a2a_adapter.py +9 -1
  76. ksadk/evaluation/adapters.py +18 -5
  77. ksadk/evaluation/agent_eval_client.py +395 -0
  78. ksadk/evaluation/cloud_binding.py +80 -0
  79. ksadk/evaluation/cloud_converter.py +194 -0
  80. ksadk/evaluation/cloud_service.py +199 -0
  81. ksadk/evaluation/contracts.py +73 -4
  82. ksadk/evaluation/evaluators.py +183 -17
  83. ksadk/evaluation/evidence.py +258 -0
  84. ksadk/evaluation/executor.py +31 -6
  85. ksadk/evaluation/local_adapter.py +550 -0
  86. ksadk/evaluation/service_env.py +27 -0
  87. ksadk/evaluation/studio_build_adapter.py +253 -0
  88. ksadk/evaluation/target.py +15 -6
  89. ksadk/events/__init__.py +13 -13
  90. ksadk/events/_v1_compat/__init__.py +1 -0
  91. ksadk/events/_v1_compat/models.py +299 -0
  92. ksadk/events/_v1_compat/parser.py +247 -0
  93. ksadk/events/_v1_compat/projection.py +755 -0
  94. ksadk/events/adapters/__init__.py +34 -0
  95. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  96. ksadk/events/adapters/_a2a_support.py +275 -0
  97. ksadk/events/adapters/_codex_interactions.py +375 -0
  98. ksadk/events/adapters/_codex_items.py +801 -0
  99. ksadk/events/adapters/_codex_validators.py +311 -0
  100. ksadk/events/adapters/_langgraph_support.py +785 -0
  101. ksadk/events/adapters/a2a.py +841 -0
  102. ksadk/events/adapters/adk.py +503 -0
  103. ksadk/events/adapters/codex.py +907 -0
  104. ksadk/events/adapters/langgraph.py +745 -0
  105. ksadk/events/canonical.py +440 -0
  106. ksadk/events/canonical_replay.py +497 -0
  107. ksadk/events/canonical_store.py +468 -0
  108. ksadk/events/cold_recovery.py +257 -0
  109. ksadk/events/content.py +89 -0
  110. ksadk/events/identity.py +86 -0
  111. ksadk/events/pipeline.py +455 -0
  112. ksadk/events/projections.py +66 -0
  113. ksadk/events/reducer.py +661 -0
  114. ksadk/events/replay.py +3 -36
  115. ksadk/events/runtime_event.py +20 -265
  116. ksadk/events/session_event.py +324 -0
  117. ksadk/events/store.py +3 -316
  118. ksadk/events/v1_compat.py +41 -0
  119. ksadk/harness/__init__.py +45 -35
  120. ksadk/harness/runtime.py +220 -58
  121. ksadk/identity/resolver.py +4 -3
  122. ksadk/interaction/__init__.py +28 -0
  123. ksadk/interaction/contracts.py +136 -0
  124. ksadk/interaction/ledger.py +189 -0
  125. ksadk/interaction/provider.py +122 -0
  126. ksadk/interaction/providers/__init__.py +52 -0
  127. ksadk/interaction/providers/adk.py +40 -0
  128. ksadk/interaction/providers/codex.py +94 -0
  129. ksadk/interaction/providers/langgraph.py +58 -0
  130. ksadk/kernel/__init__.py +117 -0
  131. ksadk/kernel/authorization.py +258 -0
  132. ksadk/kernel/bootstrap.py +1074 -0
  133. ksadk/kernel/contract_fingerprints.py +62 -0
  134. ksadk/kernel/contracts.py +370 -0
  135. ksadk/kernel/control.py +220 -0
  136. ksadk/kernel/errors.py +79 -0
  137. ksadk/kernel/ingress.py +1123 -0
  138. ksadk/kernel/mapping.py +111 -0
  139. ksadk/kernel/memory_store.py +1134 -0
  140. ksadk/kernel/postgres_store.py +1757 -0
  141. ksadk/kernel/recovery.py +452 -0
  142. ksadk/kernel/runtime_identity.py +103 -0
  143. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  144. ksadk/kernel/sqlite_store.py +1411 -0
  145. ksadk/kernel/state.py +145 -0
  146. ksadk/kernel/store.py +232 -0
  147. ksadk/kernel/worker.py +964 -0
  148. ksadk/knowledge_base/client.py +7 -0
  149. ksadk/knowledge_base/service.py +32 -5
  150. ksadk/memory/__init__.py +61 -0
  151. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  152. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  153. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  154. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  155. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  156. ksadk/memory/coordinator.py +461 -0
  157. ksadk/memory/events.py +202 -0
  158. ksadk/memory/extraction.py +228 -0
  159. ksadk/memory/ltm_backend_factory.py +16 -3
  160. ksadk/memory/models.py +316 -0
  161. ksadk/memory/policy.py +215 -0
  162. ksadk/memory/provider.py +47 -0
  163. ksadk/memory/provider_adapter.py +159 -0
  164. ksadk/memory/provider_resolver.py +71 -0
  165. ksadk/memory/providers/__init__.py +5 -0
  166. ksadk/memory/providers/local_sqlite.py +497 -0
  167. ksadk/memory/resolved_policy.py +145 -0
  168. ksadk/memory/service.py +188 -6
  169. ksadk/model_proxy/bootstrap.py +16 -9
  170. ksadk/model_proxy/detect.py +202 -9
  171. ksadk/model_proxy/namespace.py +39 -15
  172. ksadk/model_proxy/server.py +24 -5
  173. ksadk/model_proxy/transform.py +60 -2
  174. ksadk/observability/__init__.py +25 -0
  175. ksadk/observability/session_log.py +420 -0
  176. ksadk/observability/trajectory.py +105 -0
  177. ksadk/plugins/__init__.py +167 -0
  178. ksadk/plugins/bridges/__init__.py +45 -0
  179. ksadk/plugins/bridges/codex.py +552 -0
  180. ksadk/plugins/bridges/dsh.py +1116 -0
  181. ksadk/plugins/builtins.py +747 -0
  182. ksadk/plugins/bundle.py +246 -0
  183. ksadk/plugins/bundle_security.py +167 -0
  184. ksadk/plugins/composition.py +529 -0
  185. ksadk/plugins/context_contributor.py +437 -0
  186. ksadk/plugins/contracts.py +451 -0
  187. ksadk/plugins/dsh_toolchain.py +935 -0
  188. ksadk/plugins/ecosystem_bridge.py +1105 -0
  189. ksadk/plugins/ecosystem_probe.py +191 -0
  190. ksadk/plugins/host.py +724 -0
  191. ksadk/plugins/providers/__init__.py +85 -0
  192. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  193. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  194. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  195. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  196. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  197. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  198. ksadk/plugins/providers/codex.py +722 -0
  199. ksadk/plugins/providers/codex_dsh.py +83 -0
  200. ksadk/plugins/providers/dsh.py +951 -0
  201. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  202. ksadk/plugins/providers/harness.py +627 -0
  203. ksadk/plugins/providers/harness_dsh.py +91 -0
  204. ksadk/plugins/providers/legacy.py +215 -0
  205. ksadk/plugins/providers/legacy_catalog.py +100 -0
  206. ksadk/plugins/providers/shipped_dsh.py +370 -0
  207. ksadk/plugins/resolver.py +331 -0
  208. ksadk/plugins/subagent_providers/__init__.py +12 -0
  209. ksadk/plugins/subagent_providers/codex.py +443 -0
  210. ksadk/plugins/subagents.py +333 -0
  211. ksadk/prompts/__init__.py +71 -0
  212. ksadk/prompts/compiler.py +215 -0
  213. ksadk/prompts/models.py +82 -0
  214. ksadk/prompts/projection.py +89 -0
  215. ksadk/prompts/resolved.py +137 -0
  216. ksadk/prompts/sources.py +233 -0
  217. ksadk/runners/_langgraph_runner_streams.py +822 -0
  218. ksadk/runners/adk_runner.py +5 -5
  219. ksadk/runners/base_runner.py +16 -0
  220. ksadk/runners/factory.py +1 -2
  221. ksadk/runners/langgraph_runner.py +198 -437
  222. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  223. ksadk/runtime/_runner_adapter/stream_mapping.py +797 -0
  224. ksadk/runtime/adapter.py +119 -2
  225. ksadk/runtime/conversation_execution.py +316 -182
  226. ksadk/runtime/executor.py +144 -3
  227. ksadk/runtime/factory.py +268 -8
  228. ksadk/runtime/framework_adapters.py +18 -0
  229. ksadk/runtime/hosted_finalizer.py +268 -0
  230. ksadk/runtime/launch.py +14 -1
  231. ksadk/runtime/preprocessing.py +25 -3
  232. ksadk/runtime/runner_adapter.py +293 -508
  233. ksadk/runtime/usage.py +33 -0
  234. ksadk/sandbox/__init__.py +2 -1
  235. ksadk/sandbox/backends/e2b.py +35 -2
  236. ksadk/sandbox/factory.py +72 -0
  237. ksadk/scheduler/__init__.py +18 -0
  238. ksadk/scheduler/calendar.py +102 -0
  239. ksadk/scheduler/contracts.py +254 -0
  240. ksadk/scheduler/dispatcher.py +129 -0
  241. ksadk/scheduler/engine.py +416 -0
  242. ksadk/scheduler/sqlite_store.py +563 -0
  243. ksadk/server/composition.py +8 -0
  244. ksadk/server/factory.py +69 -6
  245. ksadk/server/routes/kernel_ingress.py +258 -0
  246. ksadk/server/routes/openai_compat.py +88 -8
  247. ksadk/server/routes/projection.py +35 -20
  248. ksadk/server/routes/run.py +94 -0
  249. ksadk/server/routes/sessions.py +2 -0
  250. ksadk/server/routes/streaming.py +5 -2
  251. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
  252. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
  253. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  254. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
  255. ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
  256. ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
  257. ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
  258. ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
  259. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
  260. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
  261. ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
  262. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
  263. ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
  264. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
  265. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
  266. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
  267. ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
  268. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
  269. ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
  270. ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
  271. ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
  272. ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
  273. ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
  274. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
  275. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
  276. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
  277. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
  278. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
  279. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  280. ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
  281. ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
  282. ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
  283. ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
  284. ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
  285. ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
  286. ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
  287. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
  288. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
  289. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
  290. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
  291. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
  292. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
  293. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
  294. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
  295. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
  296. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
  297. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
  298. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
  299. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
  300. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
  301. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
  302. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
  303. ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
  304. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
  305. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
  306. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
  307. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
  308. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
  309. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
  310. ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
  311. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
  312. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
  313. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
  314. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
  315. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
  316. ksadk/server/static/assets/index-B2k_urY8.js +241 -0
  317. ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
  318. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
  319. ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
  320. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
  321. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
  322. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
  323. ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
  324. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
  325. ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
  326. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
  327. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
  328. ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
  329. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
  330. ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
  331. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
  332. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
  333. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
  334. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
  335. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
  336. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
  337. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
  338. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
  339. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
  340. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
  341. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
  342. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
  343. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
  344. ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
  345. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
  346. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
  347. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
  348. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
  349. ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
  350. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
  351. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
  352. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.js +7 -0
  353. ksadk/server/static/index.html +2 -2
  354. ksadk/sessions/__init__.py +26 -9
  355. ksadk/sessions/_local_service_sync.py +688 -0
  356. ksadk/sessions/_local_tables.py +21 -0
  357. ksadk/sessions/_postgres_schema.py +305 -0
  358. ksadk/sessions/_postgres_tables.py +15 -0
  359. ksadk/sessions/base.py +80 -1
  360. ksadk/sessions/in_memory.py +53 -2
  361. ksadk/sessions/local_service.py +63 -604
  362. ksadk/sessions/postgres_service.py +58 -148
  363. ksadk/sessions/resilient.py +35 -1
  364. ksadk/skills/service_client.py +48 -0
  365. ksadk/studio/agent_lifecycle.py +26 -20
  366. ksadk/studio/api.py +1063 -69
  367. ksadk/studio/api_catalog_routes.py +5 -0
  368. ksadk/studio/api_contracts.py +148 -6
  369. ksadk/studio/api_memory_routes.py +82 -0
  370. ksadk/studio/api_plugin_routes.py +480 -0
  371. ksadk/studio/attachment_store.py +187 -0
  372. ksadk/studio/authoring.py +259 -28
  373. ksadk/studio/authoring_coordinator.py +809 -67
  374. ksadk/studio/builder.py +197 -40
  375. ksadk/studio/capabilities.py +17 -0
  376. ksadk/studio/cloud.py +1920 -95
  377. ksadk/studio/codex_agent_service.py +137 -15
  378. ksadk/studio/codex_authoring.py +469 -0
  379. ksadk/studio/codex_builder.py +177 -25
  380. ksadk/studio/codex_manifest.py +71 -22
  381. ksadk/studio/codex_run.py +59 -4
  382. ksadk/studio/compatibility_report.py +445 -0
  383. ksadk/studio/compiler.py +7 -1
  384. ksadk/studio/contracts.py +234 -4
  385. ksadk/studio/dsh_provider_registration.py +768 -0
  386. ksadk/studio/event_store.py +79 -101
  387. ksadk/studio/framework_run.py +264 -3
  388. ksadk/studio/hosted_kernel.py +317 -0
  389. ksadk/studio/manifest_resolver.py +131 -0
  390. ksadk/studio/model_client.py +95 -9
  391. ksadk/studio/model_profile_service.py +1 -1
  392. ksadk/studio/operations.py +47 -5
  393. ksadk/studio/otel_trace.py +348 -42
  394. ksadk/studio/pcm_memory.py +85 -0
  395. ksadk/studio/plugin_composition.py +301 -0
  396. ksadk/studio/plugin_kernel_adapter.py +128 -0
  397. ksadk/studio/plugin_runtime.py +652 -0
  398. ksadk/studio/repository.py +23 -2
  399. ksadk/studio/resource_catalog.py +49 -1
  400. ksadk/studio/run_service.py +1266 -202
  401. ksadk/studio/runtime_source.py +51 -17
  402. ksadk/studio/scheduler_runtime.py +374 -0
  403. ksadk/studio/scheduler_service.py +211 -0
  404. ksadk/studio/service.py +1815 -117
  405. ksadk/studio/shared_web.py +199 -50
  406. ksadk/studio/soul.py +52 -0
  407. ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
  408. ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
  409. ksadk/studio/static/index.html +2 -2
  410. ksadk/studio/templates.py +100 -8
  411. ksadk/studio/validator.py +20 -1
  412. ksadk/studio/workspace.py +31 -32
  413. ksadk/tracing/setup.py +304 -3
  414. ksadk/version.py +1 -1
  415. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  416. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  417. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  418. ksadk/events/parser.py +0 -191
  419. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  420. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  421. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  422. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  423. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  424. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  425. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  426. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  427. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  428. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  429. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  430. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  431. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  432. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  435. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  436. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  437. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  438. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  439. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  440. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  441. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  442. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  443. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  444. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  445. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  446. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  447. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  448. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  449. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  450. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  451. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  452. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  453. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  454. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  455. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  456. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  457. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  458. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  459. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  460. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  461. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  462. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  463. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  464. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  465. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  466. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  467. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  468. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  469. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  470. ksadk/studio/evaluation.py +0 -192
  471. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  472. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  473. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
  474. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
  475. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
  476. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Package-resident fingerprints for the frozen Agent Kernel wire contract.
3
+
4
+ The contract manifest lives at repository root for schema review, so it is not
5
+ available from an installed wheel. Hosted Runtime therefore cannot trust an
6
+ environment value that merely *claims* compatibility: the supported aggregate
7
+ digest is shipped in this Python module. The contract regression test locks
8
+ this constant to ``contracts/agent-kernel/v1/manifest.json``.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import json
14
+ from typing import Any
15
+
16
+ AGENT_KERNEL_V1_CONTRACT_SET = "agent-kernel/v1"
17
+ AGENT_KERNEL_V1_AGGREGATE_DIGEST = (
18
+ "b610a25aae957306b9f84a2cc2c948b30d1ce6218585cfd2a91f96736b92d102"
19
+ )
20
+
21
+
22
+ def runtime_capability_matrix_wire_value(matrix: Any) -> dict[str, Any]:
23
+ """Serialize the additive matrix without materializing absent v2 modes.
24
+
25
+ Pydantic includes optional ``None`` defaults in ``model_dump``. Omitting
26
+ those additive top-level keys preserves the exact pre-extension wire value
27
+ and capability digest for runtimes that do not publish execution controls
28
+ or an interaction delivery mode.
29
+ """
30
+
31
+ dump = matrix.model_dump(mode="json")
32
+ for key in ("interaction_mode", "goal", "loop", "plan"):
33
+ if dump.get(key) is None:
34
+ dump.pop(key, None)
35
+ return dump
36
+
37
+
38
+ def runtime_capability_matrix_digest(matrix: Any) -> str:
39
+ """Return the stable SHA-256 of the RuntimeCapabilityMatrix wire value.
40
+
41
+ ``model_dump(mode=\"json\")`` is deliberate: it binds the digest to the
42
+ public typed matrix rather than a framework object's in-memory layout.
43
+ JSON key sort and compact separators make the value independent of Python
44
+ dict insertion order and whitespace.
45
+ """
46
+
47
+ dump = runtime_capability_matrix_wire_value(matrix)
48
+ canonical = json.dumps(
49
+ dump,
50
+ ensure_ascii=False,
51
+ sort_keys=True,
52
+ separators=(",", ":"),
53
+ ).encode("utf-8")
54
+ return hashlib.sha256(canonical).hexdigest()
55
+
56
+
57
+ __all__ = [
58
+ "AGENT_KERNEL_V1_AGGREGATE_DIGEST",
59
+ "AGENT_KERNEL_V1_CONTRACT_SET",
60
+ "runtime_capability_matrix_digest",
61
+ "runtime_capability_matrix_wire_value",
62
+ ]
@@ -0,0 +1,370 @@
1
+ """Agent Kernel v1 冻结合同(Pydantic 判别模型)。
2
+
3
+ 对应 docs/superpowers/plans/2026-08-17-agent-runtime-v2-phase1-agent-kernel.md 第 2 节。
4
+ 所有 envelope 使用 extra="allow" 保存未知 optional 字段,保证 forward-compatible round-trip;
5
+ payload 按 command_type 判别为独立模型。
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from typing import Annotated, Any, Literal, Union
10
+ from uuid import UUID
11
+
12
+ from pydantic import AfterValidator, BaseModel, ConfigDict, Field, model_validator
13
+
14
+
15
+ def _validate_json_value(value: Any) -> Any:
16
+ """运行时校验 JsonValue(py3.10 兼容取舍)。
17
+
18
+ Pydantic 2 对旧式递归 Union alias 在类型求值阶段直接 RecursionError
19
+ (实测 3.10/3.11 + pydantic 2.13 均如此),PEP 695 ``type`` 语句又是
20
+ 3.12+ 语法。因此 ``JsonValue = Annotated[Any, AfterValidator(...)]``:
21
+ 静态上不再递归,运行时保证值是合法 JSON(str key / 基本类型递归)。
22
+ """
23
+
24
+ def walk(node: Any) -> None:
25
+ if node is None or isinstance(node, (str, bool, int, float)):
26
+ return
27
+ if isinstance(node, dict):
28
+ for key, item in node.items():
29
+ if not isinstance(key, str):
30
+ raise ValueError(
31
+ f"JsonValue dict keys must be str, got {type(key).__name__}"
32
+ )
33
+ walk(item)
34
+ return
35
+ if isinstance(node, list):
36
+ for item in node:
37
+ walk(item)
38
+ return
39
+ raise ValueError(f"value is not JSON-serializable: {type(node).__name__}")
40
+
41
+ walk(value)
42
+ return value
43
+
44
+
45
+ JsonValue = Annotated[Any, AfterValidator(_validate_json_value)]
46
+
47
+
48
+ class WireModel(BaseModel):
49
+ model_config = ConfigDict(extra="allow", frozen=True)
50
+
51
+
52
+ # ------------------------------------------------------------------ payloads
53
+
54
+
55
+ class EnqueuePayload(WireModel):
56
+ content: JsonValue
57
+ reply_to: str | None = None
58
+
59
+
60
+ class SteerPayload(WireModel):
61
+ content: JsonValue
62
+ run_id: str | None = None
63
+
64
+
65
+ class InjectPayload(WireModel):
66
+ context: JsonValue
67
+ run_id: str | None = None
68
+
69
+
70
+ class InterruptPayload(WireModel):
71
+ run_id: str | None = None
72
+ reason: str | None = None
73
+
74
+
75
+ class PausePayload(WireModel):
76
+ run_id: str | None = None
77
+ reason: str | None = None
78
+
79
+
80
+ class ResumeTarget(WireModel):
81
+ kind: Literal["checkpoint", "continuation", "run"]
82
+ id: str
83
+
84
+
85
+ class ResumePayload(WireModel):
86
+ target: ResumeTarget
87
+ input: JsonValue = None
88
+
89
+
90
+ class SubmitInteractionPayload(WireModel):
91
+ run_id: str
92
+ interaction_id: str
93
+ # token_ref 是一次性 interaction 授权引用,不是可持久化的原始 token。
94
+ token_ref: str
95
+ response: JsonValue
96
+ # 以下为 additive 字段(Task 6):允许 wire 侧携带完整 submitInteractionRequest;
97
+ # 缺省时 Worker 以权威 InteractionRecord 补齐(expected_revision=当前 revision,
98
+ # action=submit,idempotency_key=command.idempotency_key)。
99
+ action: str | None = None
100
+ expected_revision: int | None = None
101
+ idempotency_key: str | None = None
102
+
103
+
104
+ PAYLOAD_MODELS: dict[str, type[WireModel]] = {
105
+ "enqueue": EnqueuePayload,
106
+ "steer": SteerPayload,
107
+ "inject": InjectPayload,
108
+ "interrupt": InterruptPayload,
109
+ "pause": PausePayload,
110
+ "resume": ResumePayload,
111
+ "submit_interaction": SubmitInteractionPayload,
112
+ }
113
+
114
+
115
+ # ----------------------------------------------------------------- commands
116
+
117
+
118
+ class ControlSource(WireModel):
119
+ kind: Literal[
120
+ "studio", "responses", "agui", "a2a", "parent_agent",
121
+ "scheduler", "workflow", "channel", "system",
122
+ ]
123
+ ref: str
124
+
125
+
126
+ class AgentControlCommand(WireModel):
127
+ schema_version: Literal[1] = 1
128
+ command_id: UUID
129
+ idempotency_key: str
130
+ tenant_id: str
131
+ agent_instance_id: str
132
+ session_id: str
133
+ command_type: Literal[
134
+ "enqueue", "steer", "inject", "interrupt",
135
+ "pause", "resume", "submit_interaction",
136
+ ]
137
+ payload: dict[str, JsonValue]
138
+ source: ControlSource
139
+ authorization_ref: str
140
+ submitted_at: str
141
+ causation_id: str | None = None
142
+ correlation_id: str | None = None
143
+
144
+ @model_validator(mode="after")
145
+ def _validate_payload_shape(self) -> "AgentControlCommand":
146
+ PAYLOAD_MODELS[self.command_type].model_validate(dict(self.payload))
147
+ return self
148
+
149
+
150
+ class AgentControlPermit(WireModel):
151
+ schema_version: Literal[1] = 1
152
+ permit_id: str
153
+ subject_ref: str
154
+ tenant_id: str
155
+ agent_instance_id: str
156
+ session_id: str | None
157
+ allowed_operations: list[Literal[
158
+ "enqueue", "steer", "inject", "interrupt", "pause", "resume",
159
+ "submit_interaction", "get_status", "subscribe_events",
160
+ ]]
161
+ issued_at: str
162
+ expires_at: str
163
+ nonce: str
164
+ key_id: str
165
+ alg: Literal["Ed25519"] = "Ed25519"
166
+ claims_digest: str
167
+ signature: str
168
+
169
+
170
+ # ----------------------------------------------------------------- receipts
171
+
172
+
173
+ class ControlError(WireModel):
174
+ code: str
175
+ message: str
176
+ retryable: bool
177
+ details: dict[str, JsonValue] = Field(default_factory=dict)
178
+
179
+
180
+ class AgentControlReceipt(WireModel):
181
+ schema_version: Literal[1] = 1
182
+ command_id: UUID
183
+ status: Literal[
184
+ "accepted", "duplicate", "rejected", "unsupported",
185
+ "queue_full", "persistence_uncertain",
186
+ ]
187
+ message_id: UUID | None = None
188
+ run_id: str | None = None
189
+ accepted_seq: int | None = None
190
+ error: ControlError | None = None
191
+
192
+ @model_validator(mode="after")
193
+ def _validate_receipt_constraints(self) -> "AgentControlReceipt":
194
+ if self.status in ("accepted", "duplicate"):
195
+ if self.message_id is None:
196
+ raise ValueError(f"{self.status} receipt must carry message_id")
197
+ else:
198
+ if self.error is None:
199
+ raise ValueError(f"{self.status} receipt must carry error")
200
+ return self
201
+
202
+
203
+ class AgentStatusQuery(WireModel):
204
+ schema_version: Literal[1] = 1
205
+ tenant_id: str
206
+ agent_instance_id: str
207
+ authorization_ref: str
208
+ session_id: str | None = None
209
+
210
+
211
+ class SessionEventSubscription(WireModel):
212
+ schema_version: Literal[1] = 1
213
+ tenant_id: str
214
+ agent_instance_id: str
215
+ session_id: str
216
+ authorization_ref: str
217
+ after_seq: int = 0
218
+
219
+
220
+ # ------------------------------------------------------------- session events
221
+
222
+
223
+ class SessionEventEnvelope(WireModel):
224
+ schema_version: Literal[1] = 1
225
+ event_id: UUID
226
+ session_id: str
227
+ seq: int
228
+ timestamp: str
229
+ family: Literal[
230
+ "control", "runtime", "workflow", "schedule", "job", "relationship",
231
+ "interaction",
232
+ ]
233
+ family_version: int
234
+ event_type: str
235
+ payload: dict[str, JsonValue]
236
+ run_id: str | None = None
237
+ causation_id: str | None = None
238
+ correlation_id: str | None = None
239
+ actor_ref: str | None = None
240
+
241
+ @model_validator(mode="after")
242
+ def _validate_family_version(self) -> "SessionEventEnvelope":
243
+ expected = {"control": 1, "runtime": 2, "interaction": 1}.get(self.family)
244
+ if expected is not None and self.family_version != expected:
245
+ raise ValueError(
246
+ f"family {self.family} requires family_version {expected}, "
247
+ f"got {self.family_version}"
248
+ )
249
+ return self
250
+
251
+
252
+ # ------------------------------------------------------------------- guards
253
+
254
+
255
+ class AdmissionWriteGuard(WireModel):
256
+ authorization_ref: str
257
+ command_id: UUID
258
+
259
+
260
+ class ActivationWriteGuard(WireModel):
261
+ activation_id: str
262
+ fencing_token: int
263
+
264
+
265
+ SessionEventWriteGuard = Union[AdmissionWriteGuard, ActivationWriteGuard]
266
+ WriteContext = ActivationWriteGuard
267
+
268
+
269
+ # -------------------------------------------------------------------- lease
270
+
271
+
272
+ class ActivationLease(WireModel):
273
+ schema_version: Literal[1] = 1
274
+ agent_instance_id: str
275
+ activation_id: str
276
+ fencing_token: int
277
+ lease_expires_at: str
278
+ bundle_digest: str
279
+ runtime_type: str
280
+ capability_digest: str
281
+
282
+
283
+ # --------------------------------------------------------------- capability
284
+
285
+
286
+ class RuntimeCapability(WireModel):
287
+ supported: bool
288
+ mode: Literal["native", "emulated", "unavailable"]
289
+ reason: str | None = None
290
+
291
+ @model_validator(mode="after")
292
+ def _validate_unavailable(self) -> "RuntimeCapability":
293
+ if not self.supported:
294
+ if self.mode != "unavailable":
295
+ raise ValueError("supported=false must pair with mode=unavailable")
296
+ if not self.reason:
297
+ raise ValueError("supported=false must carry a stable reason code")
298
+ return self
299
+
300
+
301
+ class RuntimeCapabilityMatrix(WireModel):
302
+ schema_version: Literal[1] = 1
303
+ cancel: RuntimeCapability
304
+ pause: RuntimeCapability
305
+ resume: RuntimeCapability
306
+ submit_interaction: RuntimeCapability
307
+ attach: RuntimeCapability
308
+ steer: RuntimeCapability
309
+ inject: RuntimeCapability
310
+ checkpoint: RuntimeCapability
311
+ durable_restore: RuntimeCapability
312
+ # Interaction delivery is deliberately separate from the verb matrix:
313
+ # ``submit_interaction`` alone does not tell a caller whether the reply
314
+ # reaches a live process, resumes a checkpoint, or has no native route.
315
+ # It remains optional so a v1 consumer can read records emitted before
316
+ # this additive declaration without inventing support.
317
+ interaction_mode: Literal[
318
+ "live_submit", "durable_resume", "unavailable"
319
+ ] | None = None
320
+ # Runtime v2 execution controls are additive optional capabilities. Older
321
+ # runtimes omit them; a runtime must never infer support from UI presence.
322
+ # ``loop`` specifically means an externally bounded, eval-driven
323
+ # improvement loop. It is not the runtime's ordinary agent loop and it is
324
+ # not an alias for collaboration_mode=default.
325
+ goal: RuntimeCapability | None = None
326
+ loop: RuntimeCapability | None = None
327
+ plan: RuntimeCapability | None = None
328
+
329
+
330
+ class AgentStatusSnapshot(WireModel):
331
+ schema_version: Literal[1] = 1
332
+ agent_instance_id: str
333
+ instance_state: Literal["ready", "degraded", "unavailable"]
334
+ session_id: str | None = None
335
+ active_run_id: str | None = None
336
+ active_run_state: Literal["pending", "running", "paused", "waiting"] | None = None
337
+ inbox_depth: int
338
+ activation_id: str | None = None
339
+ lease_expires_at: str | None = None
340
+ capability: RuntimeCapabilityMatrix
341
+
342
+
343
+ __all__ = [
344
+ "JsonValue",
345
+ "WireModel",
346
+ "EnqueuePayload",
347
+ "SteerPayload",
348
+ "InjectPayload",
349
+ "InterruptPayload",
350
+ "PausePayload",
351
+ "ResumeTarget",
352
+ "ResumePayload",
353
+ "SubmitInteractionPayload",
354
+ "ControlSource",
355
+ "AgentControlCommand",
356
+ "AgentControlPermit",
357
+ "ControlError",
358
+ "AgentControlReceipt",
359
+ "AgentStatusQuery",
360
+ "SessionEventSubscription",
361
+ "SessionEventEnvelope",
362
+ "AdmissionWriteGuard",
363
+ "ActivationWriteGuard",
364
+ "SessionEventWriteGuard",
365
+ "WriteContext",
366
+ "ActivationLease",
367
+ "RuntimeCapability",
368
+ "RuntimeCapabilityMatrix",
369
+ "AgentStatusSnapshot",
370
+ ]
@@ -0,0 +1,220 @@
1
+ # -*- coding: utf-8 -*-
2
+ """深模块 AgentKernel control facade(Phase 1 Task 6 Step 3)。
3
+
4
+ 小接口 ``submit`` / ``status`` / ``subscribe``:
5
+
6
+ - ``submit``:先 permit 验证(fail closed)、capability 判定、queue limit,
7
+ 再进入单个 Store transaction(accept_command 内部完成 Inbox 行 +
8
+ ``control.command_accepted`` 事件的 persist-before-ack)。
9
+ - ``status``:只读 Store(active Run / Inbox depth / lease)+ capability
10
+ matrix,不创建 Run。
11
+ - ``subscribe``:直接委托 SessionEventStore cursor(replay 后 live)。
12
+ """
13
+ from __future__ import annotations
14
+
15
+ from collections.abc import AsyncIterator, Awaitable, Callable
16
+ from datetime import datetime
17
+ from typing import Any
18
+
19
+ from ksadk.events.session_event import SessionEventStore
20
+ from ksadk.kernel.authorization import (
21
+ AgentControlPermitVerifier,
22
+ PermitExpiredError,
23
+ )
24
+ from ksadk.kernel.contracts import (
25
+ AgentControlCommand,
26
+ AgentControlPermit,
27
+ AgentControlReceipt,
28
+ AgentStatusQuery,
29
+ AgentStatusSnapshot,
30
+ RuntimeCapability,
31
+ RuntimeCapabilityMatrix,
32
+ SessionEventEnvelope,
33
+ SessionEventSubscription,
34
+ )
35
+ from ksadk.kernel.errors import InvalidPermitError
36
+ from ksadk.kernel.mapping import (
37
+ CapabilityProvider,
38
+ capability_of,
39
+ )
40
+ from ksadk.kernel.store import AgentKernelStore, command_digest, now_utc
41
+
42
+
43
+ def _unavailable(reason: str = "not_implemented") -> RuntimeCapability:
44
+ return RuntimeCapability(supported=False, mode="unavailable", reason=reason)
45
+
46
+
47
+ def default_capability_matrix() -> RuntimeCapabilityMatrix:
48
+ """未提供 adapter capability 时的诚实默认值(全部 unavailable)。"""
49
+
50
+ return RuntimeCapabilityMatrix(
51
+ cancel=_unavailable(),
52
+ pause=_unavailable(),
53
+ resume=_unavailable(),
54
+ submit_interaction=_unavailable(),
55
+ attach=_unavailable(),
56
+ steer=_unavailable("runtime_no_native_steer"),
57
+ inject=_unavailable("runtime_no_native_inject"),
58
+ checkpoint=_unavailable(),
59
+ durable_restore=_unavailable(),
60
+ interaction_mode="unavailable",
61
+ )
62
+
63
+
64
+ class AgentKernel:
65
+ def __init__(
66
+ self,
67
+ store: AgentKernelStore,
68
+ session_events: SessionEventStore,
69
+ permit_verifier: AgentControlPermitVerifier,
70
+ *,
71
+ queue_limit: int = 100,
72
+ capabilities: CapabilityProvider | None = None,
73
+ clock: Callable[[], datetime] = now_utc,
74
+ ) -> None:
75
+ self._store = store
76
+ self._events = session_events
77
+ self._permit_verifier = permit_verifier
78
+ self._queue_limit = int(queue_limit)
79
+ self._capabilities = capabilities or default_capability_matrix
80
+ self._clock = clock
81
+
82
+ def capabilities(self) -> RuntimeCapabilityMatrix:
83
+ """Return the runtime's current typed capability snapshot.
84
+
85
+ Readiness propagation uses this same source as admission, so an
86
+ Operator/Server never treats a deploy-time digest as a substitute for
87
+ the actual operation support matrix.
88
+ """
89
+
90
+ return self._capabilities()
91
+
92
+ # ---------------------------------------------------------------- submit
93
+
94
+ async def submit(
95
+ self, command: AgentControlCommand, *, permit: AgentControlPermit
96
+ ) -> AgentControlReceipt:
97
+ try:
98
+ await self._permit_verifier.verify(
99
+ permit, command, command.command_type, self._clock()
100
+ )
101
+ except PermitExpiredError:
102
+ return await self._expired_permit_receipt(command)
103
+ except InvalidPermitError as error:
104
+ return await self._store.reject_command(
105
+ command,
106
+ status="rejected",
107
+ code="invalid_permit",
108
+ message=error.message,
109
+ )
110
+
111
+ field, capability = capability_of(command.command_type, self._capabilities())
112
+ if field is not None and not capability.supported:
113
+ # steer/inject 等绝不降级为 enqueue:直接 unsupported。
114
+ return await self._store.reject_command(
115
+ command,
116
+ status="unsupported",
117
+ code=capability.reason or "not_implemented",
118
+ message=f"runtime capability {field} is unavailable",
119
+ )
120
+
121
+ return await self._store.accept_command(
122
+ command, queue_limit=self._queue_limit
123
+ )
124
+
125
+ async def _expired_permit_receipt(
126
+ self, command: AgentControlCommand
127
+ ) -> AgentControlReceipt:
128
+ """permit 过期:只有 Store 已有完全相同请求(同 digest/幂等域)才 duplicate。"""
129
+
130
+ existing = await self._store.load_by_idempotency(
131
+ command.session_id, command.idempotency_key
132
+ )
133
+ if existing is not None and existing.request_digest == command_digest(command):
134
+ return AgentControlReceipt(
135
+ command_id=command.command_id,
136
+ status="duplicate",
137
+ message_id=existing.message_id,
138
+ accepted_seq=existing.accepted_seq,
139
+ )
140
+ return await self._store.reject_command(
141
+ command,
142
+ status="rejected",
143
+ code="invalid_permit",
144
+ message="permit_expired",
145
+ )
146
+
147
+ # ---------------------------------------------------------------- status
148
+
149
+ async def status(
150
+ self, query: AgentStatusQuery, *, permit: AgentControlPermit
151
+ ) -> AgentStatusSnapshot:
152
+ try:
153
+ await self._permit_verifier.verify(
154
+ permit, query, "get_status", self._clock()
155
+ )
156
+ except (InvalidPermitError, PermitExpiredError):
157
+ return AgentStatusSnapshot(
158
+ agent_instance_id=query.agent_instance_id,
159
+ instance_state="unavailable",
160
+ session_id=query.session_id,
161
+ inbox_depth=0,
162
+ capability=self._capabilities(),
163
+ )
164
+ active = await self._store.find_active_run(
165
+ query.agent_instance_id, query.session_id
166
+ )
167
+ lease = await self._store.current_lease(
168
+ query.agent_instance_id, query.session_id
169
+ )
170
+ return AgentStatusSnapshot(
171
+ agent_instance_id=query.agent_instance_id,
172
+ instance_state="ready" if lease is not None else "degraded",
173
+ session_id=query.session_id or (active.session_id if active else None),
174
+ active_run_id=active.run_id if active else None,
175
+ active_run_state=active.state.value if active else None,
176
+ inbox_depth=await self._store.inbox_depth(
177
+ query.agent_instance_id, query.session_id
178
+ ),
179
+ activation_id=lease.activation_id if lease else None,
180
+ lease_expires_at=lease.lease_expires_at if lease else None,
181
+ capability=self._capabilities(),
182
+ )
183
+
184
+ # ------------------------------------------------------------- subscribe
185
+
186
+ async def subscribe(
187
+ self,
188
+ subscription: SessionEventSubscription,
189
+ *,
190
+ permit: AgentControlPermit,
191
+ should_stop: Callable[[], Awaitable[bool]] | None = None,
192
+ timeout: float | None = None,
193
+ ) -> AsyncIterator[SessionEventEnvelope]:
194
+ await self._permit_verifier.verify(
195
+ permit, subscription, "subscribe_events", self._clock()
196
+ )
197
+ subscribe = self._events.subscribe
198
+ kwargs: dict[str, Any] = {}
199
+ try:
200
+ signature = signature_of(subscribe)
201
+ except (TypeError, ValueError):
202
+ signature = None
203
+ parameters = getattr(signature, "parameters", {}) or {}
204
+ if should_stop is not None and "should_stop" in parameters:
205
+ kwargs["should_stop"] = should_stop
206
+ if timeout is not None and "timeout" in parameters:
207
+ kwargs["timeout"] = timeout
208
+ async for envelope in subscribe(
209
+ subscription.session_id, subscription.after_seq, **kwargs
210
+ ):
211
+ yield envelope
212
+
213
+
214
+ def signature_of(func: Any) -> Any:
215
+ import inspect
216
+
217
+ return inspect.signature(func)
218
+
219
+
220
+ __all__ = ["AgentKernel", "default_capability_matrix"]