agentengine-sdk-python 0.8.2__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 (250) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +18 -25
  2. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +224 -169
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +3 -0
  6. ksadk/builders/managed_runtime_builder.py +3 -0
  7. ksadk/cli/__init__.py +6 -0
  8. ksadk/cli/cmd_plugin.py +657 -0
  9. ksadk/codex/runtime.py +50 -8
  10. ksadk/configs/env_registry.py +31 -3
  11. ksadk/configs/settings.py +9 -0
  12. ksadk/context_engine/contributors.py +73 -8
  13. ksadk/conversations/__init__.py +19 -0
  14. ksadk/conversations/context.py +104 -24
  15. ksadk/conversations/contracts.py +266 -0
  16. ksadk/conversations/message_projection.py +19 -1
  17. ksadk/conversations/projector.py +616 -0
  18. ksadk/conversations/reducer.py +98 -0
  19. ksadk/events/_v1_compat/projection.py +2 -0
  20. ksadk/events/adapters/codex.py +190 -0
  21. ksadk/harness/__init__.py +45 -35
  22. ksadk/harness/runtime.py +60 -1
  23. ksadk/kernel/contract_fingerprints.py +5 -4
  24. ksadk/kernel/contracts.py +8 -0
  25. ksadk/kernel/control.py +1 -0
  26. ksadk/kernel/ingress.py +21 -0
  27. ksadk/kernel/memory_store.py +1 -0
  28. ksadk/kernel/postgres_store.py +1 -0
  29. ksadk/kernel/sqlite_store.py +1 -0
  30. ksadk/kernel/worker.py +11 -0
  31. ksadk/memory/providers/local_sqlite.py +7 -0
  32. ksadk/plugins/__init__.py +167 -0
  33. ksadk/plugins/bridges/__init__.py +45 -0
  34. ksadk/plugins/bridges/codex.py +552 -0
  35. ksadk/plugins/bridges/dsh.py +1116 -0
  36. ksadk/plugins/builtins.py +747 -0
  37. ksadk/plugins/bundle.py +246 -0
  38. ksadk/plugins/bundle_security.py +167 -0
  39. ksadk/plugins/composition.py +529 -0
  40. ksadk/plugins/context_contributor.py +437 -0
  41. ksadk/plugins/contracts.py +451 -0
  42. ksadk/plugins/dsh_toolchain.py +935 -0
  43. ksadk/plugins/ecosystem_bridge.py +1105 -0
  44. ksadk/plugins/ecosystem_probe.py +191 -0
  45. ksadk/plugins/host.py +724 -0
  46. ksadk/plugins/providers/__init__.py +85 -0
  47. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  48. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  49. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  50. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  51. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  52. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  53. ksadk/plugins/providers/codex.py +722 -0
  54. ksadk/plugins/providers/codex_dsh.py +83 -0
  55. ksadk/plugins/providers/dsh.py +951 -0
  56. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  57. ksadk/plugins/providers/harness.py +627 -0
  58. ksadk/plugins/providers/harness_dsh.py +91 -0
  59. ksadk/plugins/providers/legacy.py +215 -0
  60. ksadk/plugins/providers/legacy_catalog.py +100 -0
  61. ksadk/plugins/providers/shipped_dsh.py +370 -0
  62. ksadk/plugins/resolver.py +331 -0
  63. ksadk/plugins/subagent_providers/__init__.py +12 -0
  64. ksadk/plugins/subagent_providers/codex.py +443 -0
  65. ksadk/plugins/subagents.py +333 -0
  66. ksadk/runtime/_runner_adapter/stream_mapping.py +51 -42
  67. ksadk/runtime/adapter.py +1 -0
  68. ksadk/runtime/factory.py +76 -2
  69. ksadk/runtime/framework_adapters.py +18 -0
  70. ksadk/runtime/runner_adapter.py +5 -0
  71. ksadk/sandbox/__init__.py +2 -1
  72. ksadk/sandbox/factory.py +72 -0
  73. ksadk/scheduler/__init__.py +18 -0
  74. ksadk/scheduler/calendar.py +102 -0
  75. ksadk/scheduler/contracts.py +254 -0
  76. ksadk/scheduler/dispatcher.py +129 -0
  77. ksadk/scheduler/engine.py +416 -0
  78. ksadk/scheduler/sqlite_store.py +563 -0
  79. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
  80. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-BXk1l-G1.js} +1 -1
  81. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-D9uB55Oh.js} +1 -1
  82. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock--OEYoXIJ.js} +6 -6
  83. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-DrEe1syq.js} +1 -1
  84. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-eeTFJLvo.js} +1 -1
  85. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-S3ZNbIAd.js} +1 -1
  86. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
  87. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-CRjgEJDX.js} +1 -1
  88. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-C7bsBoNH.js} +1 -1
  89. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-BX3c33Ob.js} +1 -1
  90. ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
  91. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
  92. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
  93. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
  94. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-CZwF3oUP.js} +1 -1
  95. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
  96. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-CnorGV5q.js} +1 -1
  97. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CexntQA-.js} +1 -1
  98. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-CHTC7UxA.js} +1 -1
  99. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-BC1EWt_-.js} +1 -1
  100. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-BTG24xN0.js} +1 -1
  101. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
  102. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
  103. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
  104. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
  105. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-DEOCBe15.js} +1 -1
  106. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-DBThPuLa.js} +1 -1
  107. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-ClTPrTht.js} +1 -1
  108. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-DsZHrnpJ.js} +1 -1
  109. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-BJR4nhVr.js} +1 -1
  110. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-xzcERX0a.js} +1 -1
  111. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-tn2xM1xu.js} +1 -1
  112. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-BZPGBkw5.js} +1 -1
  113. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-4zN1_tq5.js} +1 -1
  114. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-8VWI-2bZ.js} +1 -1
  115. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-B-46q3Hk.js} +1 -1
  116. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-B0gdk4rl.js} +1 -1
  117. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-B1oWRmrH.js} +1 -1
  118. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-BI1qQH4n.js} +1 -1
  119. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-BJLUwH6W.js} +1 -1
  120. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-Bbwqa8TG.js} +1 -1
  121. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-Btyo4vX4.js} +1 -1
  122. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C71CsujO.js} +1 -1
  123. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-CXpH_Rdd.js} +1 -1
  124. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-Cq4OL6nO.js} +1 -1
  125. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-D1V3f1B4.js} +1 -1
  126. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-DJmCPRVB.js} +1 -1
  127. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-DQAB0qn_.js} +1 -1
  128. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DUwKa_l6.js} +1 -1
  129. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-DdRBIceA.js} +1 -1
  130. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-DfGFrb0v.js} +1 -1
  131. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-DjhwGUgZ.js} +1 -1
  132. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-DyqV4fL4.js} +1 -1
  133. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-M67Hwu0n.js} +1 -1
  134. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-u8tVH5Ak.js} +1 -1
  135. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-DVfMsLge.js} +1 -1
  136. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CWEZSYaw.js} +1 -1
  137. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
  138. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
  139. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-TWIxoyYL.js} +1 -1
  140. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
  141. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-DDh2hd2S.js} +1 -1
  142. ksadk/server/static/assets/index-B2k_urY8.js +241 -0
  143. ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
  144. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
  145. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CgoyWiDR.js} +1 -1
  146. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +1 -1
  147. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +1 -1
  148. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CNP3ui66.js} +1 -1
  149. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-DWEzQy1d.js} +1 -1
  150. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-C-qHp7d2.js} +1 -1
  151. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-Cl-K943T.js} +2 -2
  152. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +1 -1
  153. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
  154. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-BQVc9ia_.js} +1 -1
  155. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
  156. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-B6UCAvtY.js} +1 -1
  157. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +1 -1
  158. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
  159. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
  160. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
  161. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
  162. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
  163. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-Dt3FFDmK.js} +1 -1
  164. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-Cz_vQtgF.js} +1 -1
  165. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +1 -1
  166. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +1 -1
  167. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DXX54iyO.js} +1 -1
  168. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-Dp_lw9II.js} +1 -1
  169. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
  170. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-D8O5UlLG.js} +1 -1
  171. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
  172. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +1 -1
  173. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
  174. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
  175. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-EnNl0DE7.js} +1 -1
  176. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
  177. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-DBu5fbYr.js} +1 -1
  178. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-BSVXs4IY.js} +1 -1
  179. ksadk/server/static/index.html +2 -2
  180. ksadk/skills/service_client.py +48 -0
  181. ksadk/studio/agent_lifecycle.py +26 -20
  182. ksadk/studio/api.py +513 -71
  183. ksadk/studio/api_catalog_routes.py +5 -0
  184. ksadk/studio/api_contracts.py +34 -1
  185. ksadk/studio/api_plugin_routes.py +480 -0
  186. ksadk/studio/attachment_store.py +187 -0
  187. ksadk/studio/authoring.py +10 -4
  188. ksadk/studio/authoring_coordinator.py +12 -2
  189. ksadk/studio/builder.py +123 -43
  190. ksadk/studio/cloud.py +4 -0
  191. ksadk/studio/codex_agent_service.py +12 -1
  192. ksadk/studio/codex_builder.py +54 -15
  193. ksadk/studio/codex_manifest.py +21 -1
  194. ksadk/studio/codex_run.py +16 -4
  195. ksadk/studio/compatibility_report.py +445 -0
  196. ksadk/studio/compiler.py +6 -1
  197. ksadk/studio/contracts.py +123 -4
  198. ksadk/studio/dsh_provider_registration.py +768 -0
  199. ksadk/studio/event_store.py +54 -6
  200. ksadk/studio/framework_run.py +37 -4
  201. ksadk/studio/hosted_kernel.py +1 -1
  202. ksadk/studio/operations.py +12 -2
  203. ksadk/studio/plugin_composition.py +301 -0
  204. ksadk/studio/plugin_kernel_adapter.py +128 -0
  205. ksadk/studio/plugin_runtime.py +652 -0
  206. ksadk/studio/resource_catalog.py +6 -1
  207. ksadk/studio/run_service.py +713 -75
  208. ksadk/studio/runtime_source.py +9 -1
  209. ksadk/studio/scheduler_runtime.py +374 -0
  210. ksadk/studio/scheduler_service.py +211 -0
  211. ksadk/studio/service.py +672 -82
  212. ksadk/studio/shared_web.py +167 -28
  213. ksadk/studio/soul.py +52 -0
  214. ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
  215. ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
  216. ksadk/studio/static/index.html +2 -2
  217. ksadk/studio/validator.py +1 -1
  218. ksadk/studio/workspace.py +1 -0
  219. ksadk/version.py +1 -1
  220. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  221. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  222. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  223. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  224. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  225. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  226. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  227. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  228. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  229. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  230. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  231. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  232. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  233. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  234. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  235. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  236. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  237. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  238. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  239. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  240. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  241. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  242. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  243. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  244. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  245. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  246. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  247. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
  248. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
  249. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
  250. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,16 @@ from datetime import datetime, timezone
9
9
  from typing import Any
10
10
  from uuid import uuid4
11
11
 
12
- from ksadk.studio.contracts import BuildStatus, OperationStatus, RunRecord, RunStatus
12
+ from ksadk.conversations.contracts import (
13
+ APPROVAL_MODE_EXTENSION,
14
+ COLLABORATION_MODE_EXTENSION,
15
+ GOAL_OBJECTIVE_EXTENSION,
16
+ ConversationAttachmentPart,
17
+ ConversationInput,
18
+ ConversationTextPart,
19
+ validate_conversation_input,
20
+ )
21
+ from ksadk.studio.contracts import OperationStatus, RunRecord, RunStatus
13
22
  from ksadk.studio.errors import StudioError, not_found
14
23
  from ksadk.studio.service import StudioService
15
24
  from ksadk.tools.gateway import tool_approval_capability
@@ -247,12 +256,38 @@ class StudioSharedWebBridge:
247
256
  prompt = self._input_text(payload)
248
257
  runtime_input = self._runtime_input(payload)
249
258
  model = self._select_model(agent_id, str(payload.get("Model") or ""))
259
+ model_explicit = bool(payload.get("ModelExplicit", str(payload.get("Model") or "")))
250
260
  approval_mode = str(payload.get("ApprovalMode") or "")
251
261
  collaboration_mode = str(payload.get("CollaborationMode") or "")
252
262
  goal_objective = str(payload.get("GoalObjective") or "")
253
263
  reasoning_effort = str(payload.get("ReasoningEffort") or "")
264
+ try:
265
+ build = await self._ensure_build(agent_id)
266
+ self._validate_conversation_turn(
267
+ build_id=build.id,
268
+ session_id=session_id,
269
+ invocation_id=invocation_id,
270
+ prompt=prompt,
271
+ runtime_input=runtime_input,
272
+ model=model if model_explicit else "",
273
+ approval_mode=approval_mode,
274
+ collaboration_mode=collaboration_mode,
275
+ goal_objective=goal_objective,
276
+ reasoning_effort=reasoning_effort,
277
+ )
278
+ except StudioError as exc:
279
+ # StreamingResponse starts the HTTP response before advancing this
280
+ # generator. Preflight failures therefore belong in the stream;
281
+ # raising here would turn an actionable Studio error into Starlette's
282
+ # "response already started" RuntimeError.
283
+ yield self._failed_sse(invocation_id, exc.message)
284
+ return
285
+ except Exception:
286
+ yield self._failed_sse(invocation_id, "本地 Agent 运行失败")
287
+ return
254
288
  execution = asyncio.create_task(
255
289
  self._execute_run(
290
+ build=build,
256
291
  agent_id=agent_id,
257
292
  session_id=session_id,
258
293
  invocation_id=invocation_id,
@@ -355,17 +390,34 @@ class StudioSharedWebBridge:
355
390
  session_id = str(payload.get("SessionId") or f"ses_{uuid4().hex}")
356
391
  invocation_id = str(payload.get("InvocationId") or f"resp_{uuid4().hex}")
357
392
  model = self._select_model(agent_id, str(payload.get("Model") or ""))
393
+ model_explicit = bool(payload.get("ModelExplicit", str(payload.get("Model") or "")))
358
394
  approval_mode = str(payload.get("ApprovalMode") or "")
359
395
  collaboration_mode = str(payload.get("CollaborationMode") or "")
360
396
  goal_objective = str(payload.get("GoalObjective") or "")
361
397
  reasoning_effort = str(payload.get("ReasoningEffort") or "")
398
+ build = await self._ensure_build(agent_id)
399
+ prompt = self._input_text(payload)
400
+ runtime_input = self._runtime_input(payload)
401
+ self._validate_conversation_turn(
402
+ build_id=build.id,
403
+ session_id=session_id,
404
+ invocation_id=invocation_id,
405
+ prompt=prompt,
406
+ runtime_input=runtime_input,
407
+ model=model if model_explicit else "",
408
+ approval_mode=approval_mode,
409
+ collaboration_mode=collaboration_mode,
410
+ goal_objective=goal_objective,
411
+ reasoning_effort=reasoning_effort,
412
+ )
362
413
  try:
363
414
  run = await self._execute_run(
415
+ build=build,
364
416
  agent_id=agent_id,
365
417
  session_id=session_id,
366
418
  invocation_id=invocation_id,
367
- prompt=self._input_text(payload),
368
- runtime_input=self._runtime_input(payload),
419
+ prompt=prompt,
420
+ runtime_input=runtime_input,
369
421
  model=model,
370
422
  approval_mode=approval_mode,
371
423
  collaboration_mode=collaboration_mode,
@@ -383,6 +435,7 @@ class StudioSharedWebBridge:
383
435
  async def _execute_run(
384
436
  self,
385
437
  *,
438
+ build: Any = None,
386
439
  agent_id: str,
387
440
  session_id: str,
388
441
  invocation_id: str,
@@ -394,7 +447,17 @@ class StudioSharedWebBridge:
394
447
  goal_objective: str = "",
395
448
  reasoning_effort: str = "",
396
449
  ) -> RunRecord:
397
- build = await self._ensure_build(agent_id)
450
+ if build is None:
451
+ build = await self._ensure_build(agent_id)
452
+ bound_agent = str(
453
+ getattr(build, "agent_name", None) or getattr(build, "agent_id", "")
454
+ )
455
+ if bound_agent != agent_id:
456
+ raise StudioError(
457
+ "CONVERSATION_BUILD_MISMATCH",
458
+ "会话 Build 不属于当前 Agent",
459
+ status_code=409,
460
+ )
398
461
 
399
462
  def observe(event: Any) -> None:
400
463
  if event.type == "run.created":
@@ -659,29 +722,94 @@ class StudioSharedWebBridge:
659
722
  }
660
723
 
661
724
  async def _ensure_build(self, agent_id: str):
662
- if self.studio.is_codex_agent(agent_id):
663
- self.studio.codex_agent_detail(agent_id)
664
- builds = [
665
- record
666
- for record in self.studio.codex_builds.list()
667
- if record.agent_name == agent_id and self.studio.codex_builder.is_current(record)
668
- ]
669
- if builds:
670
- return builds[0]
671
- return await asyncio.to_thread(self.studio.codex_builder.build, agent_id)
672
- for record in self.studio.builds.list_for_agent(agent_id):
673
- if record.status == BuildStatus.SUCCEEDED:
674
- return record
675
- draft = self.studio.drafts.get(agent_id)
676
- if draft.spec.model is None and not draft.spec.bindings.model_profile_id:
725
+ return await self.studio.ensure_current_build(agent_id)
726
+
727
+ def _validate_conversation_turn(
728
+ self,
729
+ *,
730
+ build_id: str,
731
+ session_id: str,
732
+ invocation_id: str,
733
+ prompt: str,
734
+ runtime_input: Any,
735
+ model: str,
736
+ approval_mode: str,
737
+ collaboration_mode: str,
738
+ goal_objective: str,
739
+ reasoning_effort: str,
740
+ ) -> None:
741
+ """Revalidate compatibility requests against the active Surface.
742
+
743
+ `/v1/responses` and the legacy RunAgent action remain supported wire
744
+ shapes, but neither may smuggle provider-only input past the shared
745
+ ConversationInput contract.
746
+ """
747
+
748
+ surface = self.studio.conversation_surface(build_id, session_id=session_id)
749
+ parts: list[ConversationTextPart | ConversationAttachmentPart] = [
750
+ ConversationTextPart(text=prompt)
751
+ ]
752
+ for index, item in enumerate(runtime_input if isinstance(runtime_input, list) else []):
753
+ if not isinstance(item, dict):
754
+ continue
755
+ kind = str(item.get("type") or "")
756
+ if kind in {"image", "input_image"}:
757
+ media_type = self._data_url_media_type(
758
+ str(item.get("url") or item.get("image_url") or ""),
759
+ fallback="image/*",
760
+ )
761
+ parts.append(
762
+ ConversationAttachmentPart(
763
+ attachment_ref=f"attachment://inline/{invocation_id}/{index}",
764
+ media_type=media_type,
765
+ name=str(item.get("filename") or "image"),
766
+ )
767
+ )
768
+ elif kind == "input_file":
769
+ parts.append(
770
+ ConversationAttachmentPart(
771
+ attachment_ref=f"attachment://inline/{invocation_id}/{index}",
772
+ media_type=self._data_url_media_type(
773
+ str(item.get("file_data") or item.get("file_url") or ""),
774
+ fallback="application/octet-stream",
775
+ ),
776
+ name=str(item.get("filename") or "attachment"),
777
+ )
778
+ )
779
+ conversation_input = ConversationInput(
780
+ input_id=invocation_id,
781
+ session_id=session_id,
782
+ idempotency_key=f"responses:{invocation_id}",
783
+ parts=tuple(parts),
784
+ model_ref=model or None,
785
+ reasoning=reasoning_effort or None,
786
+ extensions={
787
+ key: value
788
+ for key, value in (
789
+ (APPROVAL_MODE_EXTENSION, approval_mode or None),
790
+ (COLLABORATION_MODE_EXTENSION, collaboration_mode or None),
791
+ (GOAL_OBJECTIVE_EXTENSION, goal_objective or None),
792
+ )
793
+ if value is not None
794
+ },
795
+ )
796
+ try:
797
+ validate_conversation_input(surface, conversation_input)
798
+ except ValueError as exc:
677
799
  raise StudioError(
678
- "AGENT_MODEL_REQUIRED",
679
- "当前 Agent 未绑定 Model Profile,请先在 Agent 配置中选择模型;"
680
- "API Key 只提供访问凭证,不会自动绑定模型。",
800
+ "CONVERSATION_INPUT_UNSUPPORTED",
801
+ "当前 Agent 不支持此会话输入",
681
802
  status_code=422,
682
- field="spec.bindings.modelProfileId",
683
- )
684
- return await asyncio.to_thread(self.studio.builder.build, draft)
803
+ details={"reason": str(exc), "surfaceId": surface.surface_id},
804
+ ) from exc
805
+
806
+ @staticmethod
807
+ def _data_url_media_type(value: str, *, fallback: str) -> str:
808
+ if value.startswith("data:"):
809
+ media_type = value[5:].split(";", 1)[0].strip().lower()
810
+ if media_type:
811
+ return media_type
812
+ return fallback
685
813
 
686
814
  def _sessions(self, agent_id: str) -> list[dict[str, Any]]:
687
815
  grouped: dict[str, list[RunRecord]] = {}
@@ -939,7 +1067,7 @@ class StudioSharedWebBridge:
939
1067
  if not isinstance(content, list):
940
1068
  continue
941
1069
  items: list[dict[str, str]] = []
942
- has_image = False
1070
+ has_attachment = False
943
1071
  for part in content:
944
1072
  if not isinstance(part, dict):
945
1073
  continue
@@ -954,8 +1082,19 @@ class StudioSharedWebBridge:
954
1082
  )
955
1083
  if url:
956
1084
  items.append({"type": "image", "url": url})
957
- has_image = True
958
- if items and has_image:
1085
+ has_attachment = True
1086
+ elif kind == "input_file":
1087
+ data = str(part.get("file_data") or part.get("file_url") or "")
1088
+ if data:
1089
+ items.append(
1090
+ {
1091
+ "type": "input_file",
1092
+ "file_data": data,
1093
+ "filename": str(part.get("filename") or "attachment"),
1094
+ }
1095
+ )
1096
+ has_attachment = True
1097
+ if items and has_attachment:
959
1098
  return items
960
1099
  return []
961
1100
 
ksadk/studio/soul.py ADDED
@@ -0,0 +1,52 @@
1
+ """Deterministic SoulDocument rendering and prompt compilation helpers."""
2
+ from __future__ import annotations
3
+
4
+ import hashlib
5
+ import json
6
+
7
+ from ksadk.studio.contracts import Instructions, SoulDocument
8
+
9
+
10
+ def render_soul_markdown(soul: SoulDocument) -> str:
11
+ """Render a portable ``soul.md`` snapshot without executable directives."""
12
+
13
+ lines = ["# Soul", "", "## Identity", soul.identity.strip()]
14
+ if soul.principles:
15
+ lines.extend(["", "## Principles", *[f"- {item.strip()}" for item in soul.principles]])
16
+ if soul.boundaries:
17
+ lines.extend(["", "## Boundaries", *[f"- {item.strip()}" for item in soul.boundaries]])
18
+ if soul.tone:
19
+ lines.extend(["", "## Tone", soul.tone.strip()])
20
+ return "\n".join(lines).rstrip() + "\n"
21
+
22
+
23
+ def soul_digest(soul: SoulDocument) -> str:
24
+ """Content-address the reviewed structured source, not rendered whitespace."""
25
+
26
+ payload = soul.model_dump(by_alias=True, exclude_none=True, mode="json")
27
+ canonical = json.dumps(
28
+ payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")
29
+ ).encode("utf-8")
30
+ return f"sha256:{hashlib.sha256(canonical).hexdigest()}"
31
+
32
+
33
+ def compose_system_instruction(
34
+ instructions: Instructions, soul: SoulDocument | None
35
+ ) -> Instructions:
36
+ """Put the reviewed identity before mutable task-specific system guidance."""
37
+
38
+ if soul is None:
39
+ return instructions
40
+ soul_section = render_soul_markdown(soul).rstrip()
41
+ system = "\n\n".join(
42
+ part
43
+ for part in (
44
+ soul_section,
45
+ instructions.system.strip(),
46
+ )
47
+ if part
48
+ )
49
+ return instructions.model_copy(update={"system": system})
50
+
51
+
52
+ __all__ = ["compose_system_instruction", "render_soul_markdown", "soul_digest"]