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,552 @@
1
+ """Restricted Codex App Server plugin lifecycle bridge.
2
+
3
+ Codex remains the native owner of Codex plugins. KsADK only calls the
4
+ allowlisted App Server lifecycle methods and projects their inventory into
5
+ strict local models. There is intentionally no arbitrary JSON-RPC escape
6
+ hatch and no attempt to execute a Codex plugin inside PluginHost.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import asyncio
12
+ import re
13
+ from pathlib import Path
14
+ from typing import Any, Literal, Protocol, TypeVar, cast
15
+
16
+ from pydantic import BaseModel, ConfigDict, Field
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 _CodexWireModel(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
+ class _LocalSource(_CodexWireModel):
34
+ type: Literal["local"]
35
+ path: str
36
+
37
+
38
+ class _GitSource(_CodexWireModel):
39
+ type: Literal["git"]
40
+ url: str
41
+ ref_name: str | None = None
42
+ sha: str | None = None
43
+ path: str | None = None
44
+
45
+
46
+ class _NpmSource(_CodexWireModel):
47
+ type: Literal["npm"]
48
+ package: str
49
+ version: str | None = None
50
+ registry: str | None = None
51
+
52
+
53
+ class _RemoteSource(_CodexWireModel):
54
+ type: Literal["remote"]
55
+
56
+
57
+ CodexPluginSource = _LocalSource | _GitSource | _NpmSource | _RemoteSource
58
+
59
+
60
+ class _PluginSummary(_CodexWireModel):
61
+ id: str
62
+ name: str
63
+ source: CodexPluginSource = Field(discriminator="type")
64
+ installed: bool
65
+ enabled: bool
66
+ install_policy: Literal["NOT_AVAILABLE", "AVAILABLE", "INSTALLED_BY_DEFAULT"]
67
+ auth_policy: Literal["ON_INSTALL", "ON_USE"]
68
+ remote_plugin_id: str | None = None
69
+ version: str | None = None
70
+ local_version: str | None = None
71
+ installed_at: int | None = None
72
+ install_policy_source: str | None = None
73
+ must_show_installation_interstitial: bool | None = None
74
+ availability: str = "AVAILABLE"
75
+ disabled_reason: str | None = None
76
+ eligible_plan_types: tuple[str, ...] | None = None
77
+ share_context: dict[str, Any] | None = None
78
+ interface: dict[str, Any] | None = None
79
+ keywords: tuple[str, ...] = ()
80
+
81
+
82
+ class _Marketplace(_CodexWireModel):
83
+ name: str
84
+ path: str | None = None
85
+ interface: dict[str, Any] | None = None
86
+ plugins: tuple[_PluginSummary, ...]
87
+
88
+
89
+ class _MarketplaceLoadError(_CodexWireModel):
90
+ marketplace_path: str
91
+ message: str
92
+
93
+
94
+ class _PluginListResponse(_CodexWireModel):
95
+ marketplaces: tuple[_Marketplace, ...]
96
+ marketplace_load_errors: tuple[_MarketplaceLoadError, ...] = ()
97
+ featured_plugin_ids: tuple[str, ...] = ()
98
+
99
+
100
+ class _PluginDetailWire(_CodexWireModel):
101
+ marketplace_name: str
102
+ marketplace_path: str | None
103
+ summary: _PluginSummary
104
+ description: str | None = None
105
+ share_url: str | None = None
106
+ skills: tuple[dict[str, Any], ...]
107
+ hooks: tuple[dict[str, Any], ...]
108
+ apps: tuple[dict[str, Any], ...]
109
+ app_templates: tuple[dict[str, Any], ...]
110
+ mcp_servers: tuple[str, ...]
111
+ scheduled_tasks: tuple[dict[str, Any], ...] | None = None
112
+
113
+
114
+ class _PluginReadResponse(_CodexWireModel):
115
+ plugin: _PluginDetailWire
116
+
117
+
118
+ class _MarketplaceAddResponse(_CodexWireModel):
119
+ marketplace_name: str
120
+ installed_root: str
121
+ already_added: bool
122
+
123
+
124
+ class _PluginInstallResponse(_CodexWireModel):
125
+ auth_policy: Literal["ON_INSTALL", "ON_USE"]
126
+ apps_needing_auth: tuple[dict[str, Any], ...]
127
+
128
+
129
+ class _PluginUninstallResponse(_CodexWireModel):
130
+ pass
131
+
132
+
133
+ class CodexPluginInventory(_CodexWireModel):
134
+ """Normalized observed state; install receipt never implies these fields."""
135
+
136
+ plugin_id: str
137
+ name: str
138
+ marketplace_name: str
139
+ marketplace_path: str | None
140
+ version: str | None
141
+ installed: bool
142
+ enabled: bool
143
+ availability: str
144
+ source: CodexPluginSource = Field(discriminator="type")
145
+ permissions_declared: Literal[False] = False
146
+ risk_disclosures: tuple[str, ...] = (
147
+ "Codex plugin permissions are host-managed and not declared in the plugin manifest.",
148
+ "The Codex App Server and installed plugin run with the current host user privileges.",
149
+ )
150
+
151
+
152
+ class CodexPluginDetail(_CodexWireModel):
153
+ inventory: CodexPluginInventory
154
+ description: str | None = None
155
+ skills: tuple[str, ...] = ()
156
+ mcp_servers: tuple[str, ...] = ()
157
+ hooks: tuple[str, ...] = ()
158
+ apps: tuple[str, ...] = ()
159
+ scheduled_tasks: tuple[str, ...] = ()
160
+
161
+
162
+ class CodexPluginInstallResult(_CodexWireModel):
163
+ inventory: CodexPluginInventory
164
+ auth_policy: Literal["ON_INSTALL", "ON_USE"]
165
+ apps_needing_auth: tuple[str, ...] = ()
166
+
167
+
168
+ class CodexPluginUninstallResult(_CodexWireModel):
169
+ plugin_id: str
170
+ installed: Literal[False] = False
171
+ enabled: Literal[False] = False
172
+
173
+
174
+ class CodexBridgeHost(_CodexWireModel):
175
+ host_id: Literal["codex-app-server"] = "codex-app-server"
176
+ version: str
177
+ protocol: Literal["codex.app-server/v1"] = "codex.app-server/v1"
178
+ available: Literal[True] = True
179
+
180
+
181
+ class CodexBridgeError(RuntimeError):
182
+ """Base error for a bounded Codex plugin lifecycle operation."""
183
+
184
+
185
+ class CodexPluginNotFoundError(CodexBridgeError):
186
+ pass
187
+
188
+
189
+ class CodexPluginApprovalRequired(CodexBridgeError):
190
+ pass
191
+
192
+
193
+ ResponseT = TypeVar("ResponseT", bound=BaseModel)
194
+
195
+
196
+ class _CodexTransport(Protocol):
197
+ async def start(self) -> None: ...
198
+
199
+ async def close(self) -> None: ...
200
+
201
+ async def initialize(self) -> Any: ...
202
+
203
+ async def request(
204
+ self,
205
+ method: str,
206
+ params: dict[str, Any] | None,
207
+ *,
208
+ response_model: type[ResponseT],
209
+ ) -> ResponseT: ...
210
+
211
+
212
+ _HOST_VERSION = re.compile(r"(?:Codex(?: Desktop)?/)(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)")
213
+
214
+
215
+ def _reported_host_version(metadata: Any) -> str:
216
+ """Return an App Server version without making its user-agent a gate.
217
+
218
+ App Server exposes plugin lifecycle methods as the compatibility contract.
219
+ Its ``userAgent`` field is diagnostic metadata and has changed shape across
220
+ CLI, Desktop, and SDK launches. A missing or unfamiliar value must remain
221
+ visible to callers, but must not prevent an otherwise compatible host from
222
+ listing, installing, or removing a plugin.
223
+ """
224
+ raw = getattr(metadata, "user_agent", None) or getattr(metadata, "userAgent", None)
225
+ if raw is None and isinstance(metadata, dict):
226
+ raw = metadata.get("userAgent") or metadata.get("user_agent")
227
+ if raw is None and isinstance(metadata, BaseModel):
228
+ payload = metadata.model_dump(by_alias=True)
229
+ raw = payload.get("userAgent") or payload.get("user_agent")
230
+ match = _HOST_VERSION.search(str(raw or ""))
231
+ return match.group(1) if match is not None else "unreported"
232
+
233
+
234
+ class CodexAppServerPluginBridge:
235
+ """Allowlisted Codex plugin manager backed by one App Server process."""
236
+
237
+ def __init__(
238
+ self,
239
+ *,
240
+ codex_home: Path | None = None,
241
+ codex_bin: str | None = None,
242
+ transport: _CodexTransport | None = None,
243
+ ) -> None:
244
+ if transport is not None and (codex_home is not None or codex_bin is not None):
245
+ raise ValueError("an injected transport cannot be combined with Codex launch options")
246
+ self._codex_home = codex_home
247
+ self._codex_bin = codex_bin
248
+ self._transport = transport
249
+ self._owns_transport = transport is None
250
+ self._started = False
251
+ self._host: CodexBridgeHost | None = None
252
+ self._lock = asyncio.Lock()
253
+
254
+ async def __aenter__(self) -> "CodexAppServerPluginBridge":
255
+ await self.start()
256
+ return self
257
+
258
+ async def __aexit__(self, _exc_type: object, _exc: object, _tb: object) -> None:
259
+ await self.close()
260
+
261
+ @property
262
+ def host(self) -> CodexBridgeHost:
263
+ if self._host is None:
264
+ raise CodexBridgeError("Codex App Server bridge is not started")
265
+ return self._host
266
+
267
+ async def start(self) -> CodexBridgeHost:
268
+ if self._started:
269
+ return self.host
270
+ if self._codex_home is not None:
271
+ self._codex_home.mkdir(parents=True, exist_ok=True)
272
+ if self._transport is None:
273
+ self._transport = self._create_transport()
274
+ try:
275
+ await self._transport.start()
276
+ metadata = await self._transport.initialize()
277
+ self._host = CodexBridgeHost(version=_reported_host_version(metadata))
278
+ self._started = True
279
+ return self._host
280
+ except BaseException:
281
+ await self.close()
282
+ raise
283
+
284
+ async def close(self) -> None:
285
+ transport = self._transport
286
+ self._transport = None if self._owns_transport else transport
287
+ self._started = False
288
+ self._host = None
289
+ if transport is not None:
290
+ await transport.close()
291
+
292
+ async def add_marketplace(self, source: str, *, ref_name: str | None = None) -> str:
293
+ response = await self._request(
294
+ "marketplace/add",
295
+ {"source": source, "refName": ref_name, "sparsePaths": None},
296
+ _MarketplaceAddResponse,
297
+ )
298
+ return response.marketplace_name
299
+
300
+ async def list_plugins(
301
+ self, *, force_refetch: bool = False
302
+ ) -> tuple[CodexPluginInventory, ...]:
303
+ response = await self._list_wire(force_refetch=force_refetch)
304
+ return tuple(
305
+ self._inventory(marketplace, summary)
306
+ for marketplace in response.marketplaces
307
+ for summary in marketplace.plugins
308
+ )
309
+
310
+ async def read_plugin(
311
+ self,
312
+ plugin_name_or_id: str,
313
+ *,
314
+ marketplace_name: str | None = None,
315
+ ) -> CodexPluginDetail:
316
+ marketplace, summary = await self._resolve(plugin_name_or_id, marketplace_name)
317
+ response = await self._request(
318
+ "plugin/read",
319
+ {
320
+ "pluginName": summary.name,
321
+ "marketplacePath": marketplace.path,
322
+ "remoteMarketplaceName": None if marketplace.path else marketplace.name,
323
+ },
324
+ _PluginReadResponse,
325
+ )
326
+ plugin = response.plugin
327
+ return CodexPluginDetail(
328
+ inventory=self._inventory(marketplace, plugin.summary),
329
+ description=plugin.description,
330
+ skills=tuple(str(item.get("name", "")) for item in plugin.skills if item.get("name")),
331
+ mcp_servers=plugin.mcp_servers,
332
+ hooks=tuple(str(item.get("key", "")) for item in plugin.hooks if item.get("key")),
333
+ apps=tuple(str(item.get("id", "")) for item in plugin.apps if item.get("id")),
334
+ scheduled_tasks=tuple(
335
+ str(item.get("key", ""))
336
+ for item in (plugin.scheduled_tasks or ())
337
+ if item.get("key")
338
+ ),
339
+ )
340
+
341
+ async def install_plugin(
342
+ self,
343
+ plugin_name_or_id: str,
344
+ *,
345
+ marketplace_name: str | None = None,
346
+ accept_undeclared_permissions: bool = False,
347
+ install_attempt_id: str | None = None,
348
+ ) -> CodexPluginInstallResult:
349
+ if not accept_undeclared_permissions:
350
+ raise CodexPluginApprovalRequired(
351
+ "Codex plugins do not expose complete install/runtime permissions; "
352
+ "explicit accept_undeclared_permissions=True is required"
353
+ )
354
+ async with self._lock:
355
+ marketplace, summary = await self._resolve(plugin_name_or_id, marketplace_name)
356
+ before = self._inventory(marketplace, summary)
357
+ try:
358
+ response = await self._request(
359
+ "plugin/install",
360
+ {
361
+ "pluginName": summary.name,
362
+ "marketplacePath": marketplace.path,
363
+ "remoteMarketplaceName": None if marketplace.path else marketplace.name,
364
+ "installAttemptId": install_attempt_id,
365
+ },
366
+ _PluginInstallResponse,
367
+ )
368
+ observed = await self._resolve_inventory(
369
+ summary.id,
370
+ marketplace.name,
371
+ force_refetch=True,
372
+ )
373
+ if not observed.installed or not observed.enabled:
374
+ raise CodexBridgeError(
375
+ "Codex host did not reconcile the installed plugin as enabled"
376
+ )
377
+ except BaseException as install_error:
378
+ try:
379
+ restored = await asyncio.shield(self._restore_failed_install(before))
380
+ except BaseException as rollback_error:
381
+ raise CodexBridgeError(
382
+ "Codex plugin install failed and its previous inventory "
383
+ "could not be restored"
384
+ ) from rollback_error
385
+ raise CodexBridgeError(
386
+ "Codex plugin install failed; previous inventory was restored "
387
+ f"(installed={restored.installed}, enabled={restored.enabled})"
388
+ ) from install_error
389
+ return CodexPluginInstallResult(
390
+ inventory=observed,
391
+ auth_policy=response.auth_policy,
392
+ apps_needing_auth=tuple(
393
+ str(item.get("id", "")) for item in response.apps_needing_auth if item.get("id")
394
+ ),
395
+ )
396
+
397
+ async def uninstall_plugin(self, plugin_id: str) -> CodexPluginUninstallResult:
398
+ async with self._lock:
399
+ marketplace, summary = await self._resolve(plugin_id, None)
400
+ await self._request(
401
+ "plugin/uninstall",
402
+ {"pluginId": summary.id},
403
+ _PluginUninstallResponse,
404
+ )
405
+ observed = await self._resolve_inventory(summary.id, marketplace.name)
406
+ if observed.installed or observed.enabled:
407
+ raise CodexBridgeError("Codex host still reports the uninstalled plugin as active")
408
+ return CodexPluginUninstallResult(plugin_id=summary.id)
409
+
410
+ def _create_transport(self) -> _CodexTransport:
411
+ try:
412
+ from openai_codex.async_client import AsyncCodexClient
413
+ from openai_codex.client import CodexConfig
414
+ except ImportError as exc: # pragma: no cover - depends on optional extra
415
+ raise CodexBridgeError("Codex plugin bridge requires the ksadk[codex] extra") from exc
416
+ env = None
417
+ if self._codex_home is not None:
418
+ env = {"CODEX_HOME": str(self._codex_home.resolve())}
419
+ return cast(
420
+ _CodexTransport,
421
+ AsyncCodexClient(CodexConfig(codex_bin=self._codex_bin, env=env)),
422
+ )
423
+
424
+ async def _request(
425
+ self,
426
+ method: Literal[
427
+ "marketplace/add",
428
+ "plugin/list",
429
+ "plugin/read",
430
+ "plugin/install",
431
+ "plugin/uninstall",
432
+ ],
433
+ params: dict[str, Any] | None,
434
+ response_model: type[ResponseT],
435
+ ) -> ResponseT:
436
+ if not self._started or self._transport is None:
437
+ raise CodexBridgeError("Codex App Server bridge is not started")
438
+ return await self._transport.request(method, params, response_model=response_model)
439
+
440
+ async def _list_wire(self, *, force_refetch: bool = False) -> _PluginListResponse:
441
+ return await self._request(
442
+ "plugin/list",
443
+ {"forceRefetch": force_refetch, "cwds": None, "marketplaceKinds": None},
444
+ _PluginListResponse,
445
+ )
446
+
447
+ async def _resolve(
448
+ self,
449
+ plugin_name_or_id: str,
450
+ marketplace_name: str | None,
451
+ *,
452
+ force_refetch: bool = False,
453
+ ) -> tuple[_Marketplace, _PluginSummary]:
454
+ response = await self._list_wire(force_refetch=force_refetch)
455
+ matches = [
456
+ (marketplace, summary)
457
+ for marketplace in response.marketplaces
458
+ if marketplace_name is None or marketplace.name == marketplace_name
459
+ for summary in marketplace.plugins
460
+ if summary.id == plugin_name_or_id or summary.name == plugin_name_or_id
461
+ ]
462
+ if len(matches) != 1:
463
+ qualifier = f" in marketplace {marketplace_name!r}" if marketplace_name else ""
464
+ if not matches:
465
+ raise CodexPluginNotFoundError(
466
+ f"Codex plugin {plugin_name_or_id!r}{qualifier} was not found"
467
+ )
468
+ raise CodexBridgeError(
469
+ f"Codex plugin name {plugin_name_or_id!r} is ambiguous; use its full plugin id"
470
+ )
471
+ return matches[0]
472
+
473
+ async def _resolve_inventory(
474
+ self,
475
+ plugin_id: str,
476
+ marketplace_name: str,
477
+ *,
478
+ force_refetch: bool = False,
479
+ ) -> CodexPluginInventory:
480
+ marketplace, summary = await self._resolve(
481
+ plugin_id,
482
+ marketplace_name,
483
+ force_refetch=force_refetch,
484
+ )
485
+ return self._inventory(marketplace, summary)
486
+
487
+ async def _restore_failed_install(
488
+ self,
489
+ before: CodexPluginInventory,
490
+ ) -> CodexPluginInventory:
491
+ """Compensate an install whose receipt/reconciliation failed.
492
+
493
+ App Server may have committed files before its response is lost. For
494
+ the only state transition exposed by ``install_plugin`` (available ->
495
+ installed), uninstall is the native compensating action. An already
496
+ installed plugin is never silently reinstalled because the App Server
497
+ API cannot pin its previous local bytes; any observed drift therefore
498
+ fails closed rather than claiming rollback.
499
+ """
500
+
501
+ observed = await self._resolve_inventory(
502
+ before.plugin_id,
503
+ before.marketplace_name,
504
+ force_refetch=True,
505
+ )
506
+ if not before.installed and observed.installed:
507
+ await self._request(
508
+ "plugin/uninstall",
509
+ {"pluginId": before.plugin_id},
510
+ _PluginUninstallResponse,
511
+ )
512
+ observed = await self._resolve_inventory(
513
+ before.plugin_id,
514
+ before.marketplace_name,
515
+ force_refetch=True,
516
+ )
517
+ if (observed.installed, observed.enabled) != (
518
+ before.installed,
519
+ before.enabled,
520
+ ):
521
+ raise CodexBridgeError("Codex host inventory differs from the pre-install snapshot")
522
+ return observed
523
+
524
+ @staticmethod
525
+ def _inventory(
526
+ marketplace: _Marketplace,
527
+ summary: _PluginSummary,
528
+ ) -> CodexPluginInventory:
529
+ return CodexPluginInventory(
530
+ plugin_id=summary.id,
531
+ name=summary.name,
532
+ marketplace_name=marketplace.name,
533
+ marketplace_path=marketplace.path,
534
+ version=summary.local_version or summary.version,
535
+ installed=summary.installed,
536
+ enabled=summary.enabled,
537
+ availability=summary.availability,
538
+ source=summary.source,
539
+ )
540
+
541
+
542
+ __all__ = [
543
+ "CodexAppServerPluginBridge",
544
+ "CodexBridgeError",
545
+ "CodexBridgeHost",
546
+ "CodexPluginApprovalRequired",
547
+ "CodexPluginDetail",
548
+ "CodexPluginInstallResult",
549
+ "CodexPluginInventory",
550
+ "CodexPluginNotFoundError",
551
+ "CodexPluginUninstallResult",
552
+ ]