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
@@ -0,0 +1,451 @@
1
+ """Frozen source contracts and internal records for plugin composition.
2
+
3
+ Only the models exported through ``__all__`` are public Phase 2 contracts.
4
+ ``PluginManifest`` and its supporting models are internal admission records:
5
+ they project DSH/Codex host inventory into the Python composition engine and
6
+ are not a third installable package format or a stable public contract.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import json
12
+ import re
13
+ from collections.abc import Mapping
14
+ from typing import Any, Literal
15
+
16
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
17
+
18
+
19
+ def _to_camel(value: str) -> str:
20
+ head, *tail = value.split("_")
21
+ return head + "".join(part.capitalize() for part in tail)
22
+
23
+
24
+ class PluginContractModel(BaseModel):
25
+ model_config = ConfigDict(
26
+ alias_generator=_to_camel,
27
+ populate_by_name=True,
28
+ extra="forbid",
29
+ frozen=True,
30
+ )
31
+
32
+
33
+ _SEMVER = re.compile(r"^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$")
34
+ _PLUGIN_ID = re.compile(r"^[a-z0-9]+(?:[._-][a-z0-9]+)*$")
35
+ _DIGEST = re.compile(r"^sha256:[0-9a-f]{64}$")
36
+ _DEFINITION = re.compile(r"^[a-z][a-z0-9._-]*/v[1-9][0-9]*$")
37
+ _SENSITIVE_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
38
+ _SECRET_REF_PREFIXES = ("secret://", "env://", "credential://", "vault://")
39
+
40
+
41
+ def _validate_semver(value: str, *, field: str) -> str:
42
+ if not _SEMVER.fullmatch(value):
43
+ raise ValueError(f"{field} must use an exact semantic version")
44
+ return value
45
+
46
+
47
+ def _validate_digest(value: str) -> str:
48
+ if not _DIGEST.fullmatch(value):
49
+ raise ValueError("digest must be a lowercase sha256: digest")
50
+ return value
51
+
52
+
53
+ def _validate_secret_references(value: Any, *, path: str = "config") -> None:
54
+ """Configuration may carry references but never clear secret material."""
55
+
56
+ if isinstance(value, Mapping):
57
+ for key, child in value.items():
58
+ key_text = str(key)
59
+ child_path = f"{path}.{key_text}"
60
+ if _SENSITIVE_KEY.search(key_text) and child is not None:
61
+ if not isinstance(child, str) or not child.startswith(_SECRET_REF_PREFIXES):
62
+ raise ValueError(f"{child_path} must contain a secret reference, not a value")
63
+ _validate_secret_references(child, path=child_path)
64
+ elif isinstance(value, list):
65
+ for index, child in enumerate(value):
66
+ _validate_secret_references(child, path=f"{path}[{index}]")
67
+
68
+
69
+ class PluginMetadata(PluginContractModel):
70
+ id: str = Field(min_length=3, max_length=128)
71
+ version: str
72
+
73
+ @field_validator("id")
74
+ @classmethod
75
+ def validate_plugin_id(cls, value: str) -> str:
76
+ if not _PLUGIN_ID.fullmatch(value):
77
+ raise ValueError("plugin id must be lowercase dot/dash/underscore qualified")
78
+ return value
79
+
80
+ @field_validator("version")
81
+ @classmethod
82
+ def validate_version(cls, value: str) -> str:
83
+ return _validate_semver(value, field="plugin version")
84
+
85
+
86
+ class CapabilityOffer(PluginContractModel):
87
+ definition: str
88
+ slot: str = Field(min_length=3, max_length=128)
89
+ mode: Literal["unique", "multiple"]
90
+
91
+ @field_validator("definition")
92
+ @classmethod
93
+ def validate_definition(cls, value: str) -> str:
94
+ if not _DEFINITION.fullmatch(value):
95
+ raise ValueError(
96
+ "definition must be a versioned capability name such as agent.provider/v1"
97
+ )
98
+ return value
99
+
100
+
101
+ class CapabilityRequirement(PluginContractModel):
102
+ definition: str
103
+ version: str = Field(min_length=1, max_length=128)
104
+
105
+ @field_validator("definition")
106
+ @classmethod
107
+ def validate_definition(cls, value: str) -> str:
108
+ if not _DEFINITION.fullmatch(value):
109
+ raise ValueError("definition must be a versioned capability name")
110
+ return value
111
+
112
+
113
+ class PluginCompatibility(PluginContractModel):
114
+ kernel_api: str = Field(min_length=1, max_length=128)
115
+ runtime_protocols: list[str] = Field(default_factory=list)
116
+ python: str | None = Field(default=None, max_length=128)
117
+ platforms: list[str] = Field(default_factory=list)
118
+
119
+
120
+ class PluginProvenance(PluginContractModel):
121
+ source: Literal["builtin", "registry", "local", "market", "runtime-native"]
122
+ digest: str
123
+ signature_ref: str | None = Field(default=None, max_length=512)
124
+ license: str | None = Field(default=None, max_length=128)
125
+
126
+ @field_validator("digest")
127
+ @classmethod
128
+ def validate_digest(cls, value: str) -> str:
129
+ return _validate_digest(value)
130
+
131
+
132
+ class PluginSpec(PluginContractModel):
133
+ domain: Literal["ksadk-platform", "runtime-native"]
134
+ runtime: Literal["python", "node", "process", "remote", "native"]
135
+ entrypoint: str | None = Field(default=None, max_length=512)
136
+ provides: list[CapabilityOffer] = Field(min_length=1)
137
+ requires: list[CapabilityRequirement] = Field(default_factory=list)
138
+ optional: list[CapabilityRequirement] = Field(default_factory=list)
139
+ config_schema: str | None = Field(default=None, max_length=512)
140
+ secret_fields: list[str] = Field(default_factory=list)
141
+ permissions: list[str] = Field(default_factory=list)
142
+ isolation: Literal["in-process", "process", "sidecar", "remote", "native"]
143
+ compatibility: PluginCompatibility
144
+ health_contract: str = Field(min_length=1, max_length=128)
145
+ provenance: PluginProvenance
146
+
147
+ @model_validator(mode="after")
148
+ def validate_shape(self) -> "PluginSpec":
149
+ if self.runtime == "native" and self.domain != "runtime-native":
150
+ raise ValueError("native runtime plugins must use runtime-native domain")
151
+ if self.runtime != "native" and not self.entrypoint:
152
+ raise ValueError("non-native plugins require an entrypoint")
153
+ offers = [(item.definition, item.slot) for item in self.provides]
154
+ if len(offers) != len(set(offers)):
155
+ raise ValueError("plugin provides duplicate capability/slot offers")
156
+ if len(self.secret_fields) != len(set(self.secret_fields)):
157
+ raise ValueError("plugin secretFields must be unique")
158
+ if len(self.permissions) != len(set(self.permissions)):
159
+ raise ValueError("plugin permissions must be unique")
160
+ return self
161
+
162
+
163
+ class PluginManifest(PluginContractModel):
164
+ """Internal host projection; never a developer-authored plugin package."""
165
+
166
+ api_version: Literal["plugin.ksadk.io/v1"] = "plugin.ksadk.io/v1"
167
+ kind: Literal["Plugin"] = "Plugin"
168
+ metadata: PluginMetadata
169
+ spec: PluginSpec
170
+
171
+
172
+ class CapabilityDefinitionSpec(PluginContractModel):
173
+ definition: str
174
+ slot: str = Field(min_length=3, max_length=128)
175
+ multiplicity: Literal["unique", "multiple"]
176
+ owner_required: bool = True
177
+ config_schema: str | None = Field(default=None, max_length=512)
178
+
179
+ @field_validator("definition")
180
+ @classmethod
181
+ def validate_definition(cls, value: str) -> str:
182
+ if not _DEFINITION.fullmatch(value):
183
+ raise ValueError("definition must be a versioned capability name")
184
+ return value
185
+
186
+
187
+ class CapabilityDefinition(PluginContractModel):
188
+ api_version: Literal["capability.ksadk.io/v1"] = "capability.ksadk.io/v1"
189
+ kind: Literal["CapabilityDefinition"] = "CapabilityDefinition"
190
+ metadata: PluginMetadata
191
+ spec: CapabilityDefinitionSpec
192
+
193
+
194
+ class PluginReference(PluginContractModel):
195
+ ref: str = Field(min_length=12, max_length=256)
196
+ config: dict[str, Any] = Field(default_factory=dict)
197
+
198
+ @field_validator("ref")
199
+ @classmethod
200
+ def validate_reference(cls, value: str) -> str:
201
+ if not value.startswith("plugin://") or "@" not in value:
202
+ raise ValueError("plugin reference must be plugin://<id>@<exact-version>")
203
+ plugin_id, version = value.removeprefix("plugin://").rsplit("@", 1)
204
+ if not _PLUGIN_ID.fullmatch(plugin_id):
205
+ raise ValueError("plugin reference id is invalid")
206
+ _validate_semver(version, field="plugin reference version")
207
+ return value
208
+
209
+ @field_validator("config")
210
+ @classmethod
211
+ def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
212
+ _validate_secret_references(value)
213
+ return value
214
+
215
+
216
+ class CompositionCapability(PluginContractModel):
217
+ ref: str = Field(min_length=8, max_length=512)
218
+ required: bool = True
219
+ config: dict[str, Any] = Field(default_factory=dict)
220
+
221
+ @field_validator("ref")
222
+ @classmethod
223
+ def validate_reference(cls, value: str) -> str:
224
+ if not value.startswith(("plugin://", "mcp://", "skill://")) or "@" not in value:
225
+ raise ValueError(
226
+ "capability ref must be a pinned plugin://, mcp://, or skill:// reference"
227
+ )
228
+ return value
229
+
230
+ @field_validator("config")
231
+ @classmethod
232
+ def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
233
+ _validate_secret_references(value)
234
+ return value
235
+
236
+
237
+ class NativeExtension(PluginContractModel):
238
+ runtime: str = Field(min_length=1, max_length=64)
239
+ ref: str = Field(min_length=8, max_length=512)
240
+
241
+
242
+ class CompositionProfile(PluginContractModel):
243
+ api_version: Literal["composition.ksadk.io/v1"] = "composition.ksadk.io/v1"
244
+ agent_provider: PluginReference
245
+ capabilities: list[CompositionCapability] = Field(default_factory=list)
246
+ native_extensions: list[NativeExtension] = Field(default_factory=list)
247
+ policies: dict[str, str] = Field(default_factory=dict)
248
+ ui_contributions: list[str] = Field(default_factory=list)
249
+
250
+ @model_validator(mode="after")
251
+ def validate_profile(self) -> "CompositionProfile":
252
+ refs = [item.ref for item in self.capabilities]
253
+ if len(refs) != len(set(refs)):
254
+ raise ValueError("composition capabilities must not repeat a reference")
255
+ extensions = [(item.runtime, item.ref) for item in self.native_extensions]
256
+ if len(extensions) != len(set(extensions)):
257
+ raise ValueError("native extensions must not repeat a runtime/reference pair")
258
+ return self
259
+
260
+
261
+ class LockedCapability(PluginContractModel):
262
+ definition: str
263
+ slot: str = Field(min_length=3, max_length=128)
264
+ owner: str = Field(min_length=3, max_length=128)
265
+
266
+ @field_validator("definition")
267
+ @classmethod
268
+ def validate_definition(cls, value: str) -> str:
269
+ if not _DEFINITION.fullmatch(value):
270
+ raise ValueError("definition must be a versioned capability name")
271
+ return value
272
+
273
+
274
+ class PluginDependency(PluginContractModel):
275
+ id: str = Field(min_length=3, max_length=128)
276
+ version: str
277
+ digest: str
278
+
279
+ @field_validator("id")
280
+ @classmethod
281
+ def validate_id(cls, value: str) -> str:
282
+ if not _PLUGIN_ID.fullmatch(value):
283
+ raise ValueError("dependency id is invalid")
284
+ return value
285
+
286
+ @field_validator("version")
287
+ @classmethod
288
+ def validate_version(cls, value: str) -> str:
289
+ return _validate_semver(value, field="dependency version")
290
+
291
+ @field_validator("digest")
292
+ @classmethod
293
+ def validate_digest(cls, value: str) -> str:
294
+ return _validate_digest(value)
295
+
296
+
297
+ class PluginLockEntry(PluginContractModel):
298
+ id: str = Field(min_length=3, max_length=128)
299
+ version: str
300
+ digest: str
301
+ source: Literal["builtin", "registry", "local", "market", "runtime-native"]
302
+ signature_ref: str | None = Field(default=None, max_length=512)
303
+ license: str | None = Field(default=None, max_length=128)
304
+ provides: list[LockedCapability] = Field(default_factory=list)
305
+ dependencies: list[PluginDependency] = Field(default_factory=list)
306
+
307
+ @field_validator("id")
308
+ @classmethod
309
+ def validate_id(cls, value: str) -> str:
310
+ if not _PLUGIN_ID.fullmatch(value):
311
+ raise ValueError("plugin lock id is invalid")
312
+ return value
313
+
314
+ @field_validator("version")
315
+ @classmethod
316
+ def validate_version(cls, value: str) -> str:
317
+ return _validate_semver(value, field="plugin lock version")
318
+
319
+ @field_validator("digest")
320
+ @classmethod
321
+ def validate_digest(cls, value: str) -> str:
322
+ return _validate_digest(value)
323
+
324
+
325
+ class PluginLock(PluginContractModel):
326
+ """The current Bundle v2 lock shape, now with an exact typed entry form."""
327
+
328
+ lock_format: Literal["agentkit.plugin-lock/v1"] = "agentkit.plugin-lock/v1"
329
+ plugins: list[PluginLockEntry] = Field(default_factory=list)
330
+
331
+ @field_validator("plugins")
332
+ @classmethod
333
+ def sort_plugins(cls, value: list[PluginLockEntry]) -> list[PluginLockEntry]:
334
+ return sorted(value, key=lambda item: (item.id, item.version, item.digest))
335
+
336
+ @model_validator(mode="after")
337
+ def validate_graph(self) -> "PluginLock":
338
+ by_id = {item.id: item for item in self.plugins}
339
+ if len(by_id) != len(self.plugins):
340
+ raise ValueError("plugin lock must pin exactly one version for each plugin id")
341
+ for item in self.plugins:
342
+ for dependency in item.dependencies:
343
+ target = by_id.get(dependency.id)
344
+ if target is None:
345
+ raise ValueError(f"plugin dependency {dependency.id!r} is not pinned")
346
+ if (target.version, target.digest) != (dependency.version, dependency.digest):
347
+ raise ValueError(
348
+ f"plugin dependency {dependency.id!r} does not match its lock entry"
349
+ )
350
+ if dependency.id == item.id:
351
+ raise ValueError("plugin lock cannot depend on itself")
352
+ visiting: set[str] = set()
353
+ visited: set[str] = set()
354
+
355
+ def visit(plugin_id: str) -> None:
356
+ if plugin_id in visiting:
357
+ raise ValueError("plugin lock dependency cycle")
358
+ if plugin_id in visited:
359
+ return
360
+ visiting.add(plugin_id)
361
+ for dependency in by_id[plugin_id].dependencies:
362
+ visit(dependency.id)
363
+ visiting.remove(plugin_id)
364
+ visited.add(plugin_id)
365
+
366
+ for plugin_id in by_id:
367
+ visit(plugin_id)
368
+ return self
369
+
370
+
371
+ class PluginInventoryItem(PluginContractModel):
372
+ id: str = Field(min_length=3, max_length=128)
373
+ version: str
374
+ digest: str
375
+ state: Literal[
376
+ "resolved",
377
+ "admitted",
378
+ "staged",
379
+ "starting",
380
+ "ready",
381
+ "degraded",
382
+ "failed",
383
+ "draining",
384
+ "stopped",
385
+ "disposed",
386
+ "rejected",
387
+ ]
388
+ health: Literal["unknown", "healthy", "unhealthy"] = "unknown"
389
+ reason: str | None = Field(default=None, max_length=1024)
390
+
391
+ @field_validator("id")
392
+ @classmethod
393
+ def validate_id(cls, value: str) -> str:
394
+ if not _PLUGIN_ID.fullmatch(value):
395
+ raise ValueError("plugin inventory id is invalid")
396
+ return value
397
+
398
+ @field_validator("version")
399
+ @classmethod
400
+ def validate_version(cls, value: str) -> str:
401
+ return _validate_semver(value, field="plugin inventory version")
402
+
403
+ @field_validator("digest")
404
+ @classmethod
405
+ def validate_digest(cls, value: str) -> str:
406
+ return _validate_digest(value)
407
+
408
+
409
+ class PluginInventory(PluginContractModel):
410
+ api_version: Literal["plugin.ksadk.io/v1"] = "plugin.ksadk.io/v1"
411
+ kind: Literal["PluginInventory"] = "PluginInventory"
412
+ profile_digest: str = Field(min_length=8, max_length=80)
413
+ plugin_lock_digest: str = Field(min_length=8, max_length=80)
414
+ plugins: list[PluginInventoryItem] = Field(default_factory=list)
415
+
416
+ @field_validator("profile_digest", "plugin_lock_digest")
417
+ @classmethod
418
+ def validate_optional_digest(cls, value: str) -> str:
419
+ return _validate_digest(value)
420
+
421
+ @field_validator("plugins")
422
+ @classmethod
423
+ def sort_plugins(cls, value: list[PluginInventoryItem]) -> list[PluginInventoryItem]:
424
+ return sorted(value, key=lambda item: item.id)
425
+
426
+
427
+ def canonical_plugin_lock(lock: PluginLock) -> bytes:
428
+ """Canonical JSON bytes used by Bundle v2 and admission fingerprinting."""
429
+
430
+ return json.dumps(
431
+ lock.model_dump(by_alias=True, exclude_none=True, mode="json"),
432
+ ensure_ascii=False,
433
+ sort_keys=True,
434
+ separators=(",", ":"),
435
+ ).encode("utf-8")
436
+
437
+
438
+ def plugin_lock_digest(lock: PluginLock) -> str:
439
+ return f"sha256:{hashlib.sha256(canonical_plugin_lock(lock)).hexdigest()}"
440
+
441
+
442
+ __all__ = [
443
+ "CapabilityDefinition",
444
+ "CompositionProfile",
445
+ "PluginLock",
446
+ "PluginLockEntry",
447
+ "PluginInventory",
448
+ "PluginInventoryItem",
449
+ "canonical_plugin_lock",
450
+ "plugin_lock_digest",
451
+ ]