agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/memory/models.py ADDED
@@ -0,0 +1,316 @@
1
+ """长期记忆结构化模型、操作结果与稳定异常类型。
2
+
3
+ 按《Hermes × KsADK 长期记忆实时性与纠错能力技术改造方案》§7.1/§7.2/§7.8 设计:
4
+
5
+ - LongTermMemoryRecord: 结构化记忆记录(memory_id 来自服务端返回值)
6
+ - MemoryWriteResult: 写入受理结果(accepted + queued/failed)
7
+ - MemoryMutationResult: update/delete 结果(updated/deleted/already_absent/not_found/failed)
8
+ - MemoryExtractionStatus: 后台提取状态
9
+ (queued/extracting/extracted/duplicate_skipped/failed/unknown)
10
+ - MemoryOperationError 族: 稳定异常类型,供上层归一化处理
11
+
12
+ 设计要点:
13
+ - memory_id 不能由正文 hash 临时生成;大部分情况稳定,但融合/人工编辑可能变化,
14
+ 不能作为永久业务主键长期缓存。
15
+ - 写入受理(accepted)与提取状态(extraction status)使用不同类型,
16
+ 避免布尔值同时表示"请求成功"和"已经可检索"。
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ from dataclasses import dataclass, field
22
+ from typing import Any, Literal
23
+
24
+ __all__ = [
25
+ "LongTermMemoryRecord",
26
+ "MemoryWriteResult",
27
+ "MemoryMutationResult",
28
+ "MemoryExtractionStatus",
29
+ "MemoryOperationError",
30
+ "MemoryNotFoundError",
31
+ "UnsupportedMemoryOperation",
32
+ "MemoryPermissionError",
33
+ "MemoryConflictError",
34
+ "SESSION_STATE_PENDING",
35
+ "SESSION_STATE_EXTRACTING",
36
+ "SESSION_STATE_EXTRACTED",
37
+ "SESSION_STATE_DUPLICATE_SKIPPED",
38
+ "SESSION_STATE_EXTRACT_FAILED",
39
+ "map_session_state",
40
+ ]
41
+
42
+ # ---- AICP ListSessions State 枚举(服务端已确认) ----
43
+ SESSION_STATE_PENDING = 0 # 待提取
44
+ SESSION_STATE_EXTRACTING = 50 # 提取中
45
+ SESSION_STATE_EXTRACTED = 100 # 提取成功
46
+ SESSION_STATE_DUPLICATE_SKIPPED = -50 # 重复跳过
47
+ SESSION_STATE_EXTRACT_FAILED = -100 # 提取失败
48
+
49
+
50
+ @dataclass(frozen=True)
51
+ class LongTermMemoryRecord:
52
+ """结构化长期记忆记录。
53
+
54
+ Attributes:
55
+ memory_id: 服务端返回的记忆 ID。大部分情况稳定,但系统融合或
56
+ 人工编辑可能改变 ID,不能作为永久业务主键长期缓存。
57
+ content: 记忆正文。
58
+ score: 相关度得分;后端没有 score 时为 None。
59
+ user_id: 归属用户 ID。
60
+ session_id: 来源 Session ID(后端能提供时)。
61
+ created_at: 创建时间(后端原始字符串,通常为 ISO 时间或毫秒时间戳)。
62
+ updated_at: 更新时间(后端原始字符串)。
63
+ metadata: 其他必要元数据。禁止放入 AK/SK、token、内部 endpoint 等敏感信息。
64
+ """
65
+
66
+ memory_id: str
67
+ content: str
68
+ score: float | None = None
69
+ user_id: str = ""
70
+ session_id: str = ""
71
+ created_at: str | None = None
72
+ updated_at: str | None = None
73
+ metadata: dict[str, Any] = field(default_factory=dict)
74
+
75
+
76
+ @dataclass(frozen=True)
77
+ class MemoryWriteResult:
78
+ """写入受理结果。
79
+
80
+ status 只表达受理层状态:queued(已入队)/ failed(受理失败)。
81
+ 后续提取进展用 MemoryExtractionStatus 查询,不在写入热路径等待。
82
+ """
83
+
84
+ accepted: bool
85
+ status: str # queued | failed
86
+ session_id: str = ""
87
+ message: str = ""
88
+
89
+
90
+ @dataclass(frozen=True)
91
+ class MemoryMutationResult:
92
+ """update/delete 操作结果。
93
+
94
+ status:
95
+ updated - 原地更新成功;new_memory_id 为服务端返回的新句柄
96
+ deleted - 软删除成功
97
+ already_absent - 目标已不存在(如重复删除),与 deleted 分开审计
98
+ not_found - 目标记录不存在
99
+ failed - 操作失败
100
+ """
101
+
102
+ ok: bool
103
+ memory_id: str
104
+ new_memory_id: str = ""
105
+ status: str = "" # updated | deleted | already_absent | not_found | failed
106
+ message: str = ""
107
+
108
+
109
+ @dataclass(frozen=True)
110
+ class MemoryExtractionStatus:
111
+ """后台提取状态查询结果。
112
+
113
+ status:
114
+ queued - 写请求已被服务端接受,等待后台处理
115
+ extracting - 后台已经开始提取
116
+ extracted - ListSessions.State=100,提取完成
117
+ duplicate_skipped- State=-50,本次内容因重复被跳过(不是系统失败)
118
+ failed - State=-100 或查询过程失败
119
+ unknown - 状态未知(如 Session 未在 ListSessions 返回中)
120
+
121
+ searchable 单独用布尔标志表达:State=100 后通过 ListMemories 确认目标
122
+ 记录可见时才为 True(见方案 §7.2:状态与 searchable 分离建模)。
123
+ """
124
+
125
+ session_id: str
126
+ state: int | None
127
+ status: str
128
+ searchable: bool = False
129
+ message: str = ""
130
+
131
+
132
+ def map_session_state(state: int | None) -> str:
133
+ """将 AICP Session State 映射为统一提取状态字符串。"""
134
+ mapping = {
135
+ SESSION_STATE_PENDING: "queued",
136
+ SESSION_STATE_EXTRACTING: "extracting",
137
+ SESSION_STATE_EXTRACTED: "extracted",
138
+ SESSION_STATE_DUPLICATE_SKIPPED: "duplicate_skipped",
139
+ SESSION_STATE_EXTRACT_FAILED: "failed",
140
+ }
141
+ if state is None:
142
+ return "unknown"
143
+ return mapping.get(int(state), "unknown")
144
+
145
+
146
+ # ---- 稳定异常类型(§7.8) ----
147
+
148
+
149
+ class MemoryOperationError(RuntimeError):
150
+ """长期记忆操作基础异常。子类供上层按类型归一化处理。"""
151
+
152
+
153
+ class MemoryNotFoundError(MemoryOperationError):
154
+ """目标记忆记录不存在。"""
155
+
156
+
157
+ class UnsupportedMemoryOperation(MemoryOperationError):
158
+ """当前 backend 不支持该操作。
159
+
160
+ 不支持某能力的 backend 必须显式抛出本异常(或返回 unsupported 结果),
161
+ 不能静默追加一条新记忆来模拟 update。
162
+ """
163
+
164
+
165
+ class MemoryPermissionError(MemoryOperationError):
166
+ """跨用户或越权访问记忆资源。"""
167
+
168
+
169
+ class MemoryConflictError(MemoryOperationError):
170
+ """并发修改冲突(如记录已被融合导致 ID 变化)。"""
171
+
172
+
173
+ # ---- PCM v2 数据模型(feature-prompt-context-optimize 分支)----
174
+ # 与 master 的 LongTermMemoryRecord 共存;PCM 模块用这些类型
175
+
176
+ MEMORY_MODEL_VERSION = "v1"
177
+
178
+ MemoryScope = Literal["user", "agent", "workspace", "org"]
179
+ MemoryType = Literal["profile", "fact", "episode"]
180
+ MemoryStatus = Literal["active", "superseded", "deleted", "expired"]
181
+ MemoryOperation = Literal["add", "update", "delete", "ignore"]
182
+ MemorySearchStatus = Literal["ok", "not_configured", "timeout", "unauthorized", "failed"]
183
+ SensitiveLabel = Literal[
184
+ "api_key",
185
+ "secret_key",
186
+ "access_key",
187
+ "cookie",
188
+ "auth_header",
189
+ "signed_url",
190
+ "dsn",
191
+ "pii",
192
+ "token",
193
+ "binary",
194
+ "none",
195
+ ]
196
+
197
+
198
+ @dataclass(frozen=True)
199
+ class MemoryRecord:
200
+ memory_id: str
201
+ tenant_id: str
202
+ workspace_id: str
203
+ scope: MemoryScope
204
+ scope_id: str
205
+ memory_type: MemoryType
206
+ content: str
207
+ summary: str
208
+ status: MemoryStatus
209
+ confidence: float
210
+ importance: float
211
+ valid_from: str
212
+ valid_to: str
213
+ expires_at: str
214
+ source_session_id: str
215
+ source_event_ids: list[str]
216
+ source_seq_range: tuple[int, int] | None
217
+ content_hash: str
218
+ version: int
219
+ metadata: dict[str, Any] = field(default_factory=dict)
220
+ created_at: str = ""
221
+ updated_at: str = ""
222
+
223
+ def is_active_now(self, *, now_iso: str = "") -> bool:
224
+ if self.status != "active":
225
+ return False
226
+ if self.expires_at and now_iso and self.expires_at < now_iso:
227
+ return False
228
+ if self.valid_to and now_iso and self.valid_to < now_iso:
229
+ return False
230
+ return True
231
+
232
+
233
+ @dataclass(frozen=True)
234
+ class MemoryCandidate:
235
+ candidate_id: str
236
+ operation: MemoryOperation
237
+ memory_type: MemoryType
238
+ scope: MemoryScope
239
+ scope_id: str
240
+ content: str
241
+ confidence: float
242
+ importance: float
243
+ source_event_ids: list[str]
244
+ conflicts_with: list[str] = field(default_factory=list)
245
+ sensitive_labels: list[SensitiveLabel] = field(default_factory=list)
246
+ reason: str = ""
247
+ slot_key: str = ""
248
+
249
+ def is_hard_rejected(self) -> bool:
250
+ return any(label != "none" for label in self.sensitive_labels)
251
+
252
+
253
+ @dataclass(frozen=True)
254
+ class MemorySearchRequest:
255
+ query: str
256
+ scopes: list[tuple[MemoryScope, str]]
257
+ memory_types: list[MemoryType]
258
+ top_k: int = 8
259
+ max_tokens: int = 4000
260
+ min_score: float = 0.45
261
+ as_of: str = ""
262
+ filters: dict[str, Any] = field(default_factory=dict)
263
+
264
+
265
+ @dataclass(frozen=True)
266
+ class MemorySearchResult:
267
+ status: MemorySearchStatus
268
+ records: list[MemoryRecord]
269
+ error_code: str | None
270
+ provider: str
271
+ latency_ms: int
272
+ accounting_accuracy: str
273
+ truncated_by_budget: bool = False
274
+
275
+
276
+ @dataclass(frozen=True)
277
+ class MemoryCapabilities:
278
+ semantic_search: bool
279
+ keyword_search: bool
280
+ metadata_filter: bool
281
+ versioned_update: bool
282
+ hard_delete: bool
283
+ ttl: bool
284
+ max_record_chars: int
285
+
286
+
287
+ @dataclass(frozen=True)
288
+ class CoreMemoryBlock:
289
+ name: str
290
+ description: str
291
+ content: str
292
+ max_tokens: int
293
+ writable: bool
294
+ source_memory_ids: list[str] = field(default_factory=list)
295
+
296
+
297
+ @dataclass(frozen=True)
298
+ class MemoryDeleteRequest:
299
+ memory_id: str
300
+ scope: MemoryScope
301
+ scope_id: str
302
+ hard: bool = False
303
+
304
+
305
+ @dataclass(frozen=True)
306
+ class MemoryDeleteResult:
307
+ status: MemorySearchStatus
308
+ deleted: bool
309
+ error_code: str | None = None
310
+
311
+
312
+ @dataclass(frozen=True)
313
+ class CoreMemoryRequest:
314
+ scopes: list[tuple[MemoryScope, str]]
315
+ max_blocks: int = 8
316
+ max_tokens: int = 4096
ksadk/memory/policy.py ADDED
@@ -0,0 +1,215 @@
1
+ """Memory 写入策略、敏感信息拒绝与冲突解决(方案 §10.4 / §19)。
2
+
3
+ 策略与阈值必须属于 ``MemoryPolicy``,不能硬编码在 Runner(方案 §10.4 末)。Candidate 进入
4
+ Provider 前必须执行 Secret/PII 检查;硬拒绝标签(api_key/secret_key/access_key/cookie/
5
+ auth_header/signed_url/dsn/token/binary)一律 ``reject``,不写入长期记忆(方案 §19)。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import hashlib
11
+ import re
12
+ from dataclasses import dataclass, field
13
+ from typing import Literal
14
+
15
+ from ksadk.memory.models import MemoryCandidate, MemoryOperation, MemoryRecord, SensitiveLabel
16
+
17
+ # 硬拒绝敏感标签:出现任一即 reject,绝不写入(方案 §19)。
18
+ HARD_REJECT_LABELS: frozenset[SensitiveLabel] = frozenset(
19
+ {
20
+ "api_key",
21
+ "secret_key",
22
+ "access_key",
23
+ "cookie",
24
+ "auth_header",
25
+ "signed_url",
26
+ "dsn",
27
+ "token",
28
+ "binary",
29
+ }
30
+ )
31
+
32
+ PolicyDecision = Literal["commit", "pending", "reject"]
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class MemoryPolicyThresholds:
37
+ """候选写入阈值(方案 §10.4 初始值)。
38
+
39
+ 阈值属于 Policy,不硬编码在 Runner。可由部署/配置覆盖。
40
+ """
41
+
42
+ explicit_user_request: float = 0.60
43
+ verified_tool_fact: float = 0.80
44
+ implicit_preference: float = 0.85
45
+ implicit_preference_min_observations: int = 2
46
+ episode_importance: float = 0.70
47
+
48
+
49
+ @dataclass(frozen=True)
50
+ class MemoryEvaluation:
51
+ """对单个 Candidate 的策略判定结果。"""
52
+
53
+ decision: PolicyDecision
54
+ operation: MemoryOperation
55
+ reason: str
56
+ new_version: int | None = None
57
+ conflicts_with: list[str] = field(default_factory=list)
58
+
59
+
60
+ # 敏感信息正则(best-effort,方案 §19)。只做写入前拦截,不做完整 DLP。
61
+ _SECRET_PATTERNS: tuple[tuple[re.Pattern[str], SensitiveLabel], ...] = (
62
+ (re.compile(r"(?i)api[_-]?key\s*[:=]\s*\S+"), "api_key"),
63
+ (re.compile(r"(?i)secret[_-]?key\s*[:=]\s*\S+"), "secret_key"),
64
+ (re.compile(r"(?i)access[_-]?key\s*[:=]\s*\S+"), "access_key"),
65
+ (re.compile(r"(?i)AKIA[0-9A-Z]{16}"), "access_key"),
66
+ (re.compile(r"(?i)cookie\s*[:=]\s*\S+"), "cookie"),
67
+ (re.compile(r"(?i)authorization\s*[:=]\s*bearer\s+\S+"), "auth_header"),
68
+ (
69
+ re.compile(r"https?://\S+?(?:X-Amz-Signature|X-Amz-Security-Token|signed)=", re.I),
70
+ "signed_url",
71
+ ),
72
+ (re.compile(r"(?i)(postgres|mysql|mongodb|redis)://\S+:\S+@\S+"), "dsn"),
73
+ (re.compile(r"(?i)sk-[A-Za-z0-9]{20,}"), "token"),
74
+ )
75
+
76
+
77
+ def detect_sensitive_labels(
78
+ content: str, candidate_labels: list[SensitiveLabel]
79
+ ) -> list[SensitiveLabel]:
80
+ """对 Candidate 正文做敏感信息检测(方案 §19)。
81
+
82
+ 先采纳 Candidate 自带的 ``sensitive_labels``,再用正则做 best-effort 补检。任一硬拒绝
83
+ 标签命中即整体拒绝。
84
+ """
85
+ labels: set[SensitiveLabel] = set()
86
+ for label in candidate_labels:
87
+ if label and label != "none":
88
+ labels.add(label)
89
+ text = str(content or "")
90
+ for pattern, label in _SECRET_PATTERNS:
91
+ if pattern.search(text):
92
+ labels.add(label)
93
+ # 二进制特征:大量非文本/重复字节不做完整检测,仅按显式标签处理。
94
+ return sorted(labels)
95
+
96
+
97
+ def _content_hash(content: str) -> str:
98
+ return "sha256:" + hashlib.sha256(str(content or "").encode("utf-8")).hexdigest()
99
+
100
+
101
+ @dataclass(frozen=True)
102
+ class MemoryPolicy:
103
+ """写入策略与冲突解决(方案 §10.4)。
104
+
105
+ 无状态、可复用。``evaluate`` 不接触 Provider;commit 由 Coordinator 执行。
106
+ """
107
+
108
+ thresholds: MemoryPolicyThresholds = field(default_factory=MemoryPolicyThresholds)
109
+
110
+ def evaluate(
111
+ self,
112
+ candidate: MemoryCandidate,
113
+ *,
114
+ existing: MemoryRecord | None = None,
115
+ observations: int = 1,
116
+ ) -> MemoryEvaluation:
117
+ """评估单个 Candidate(方案 §10.4 决策表)。
118
+
119
+ - 硬拒绝敏感标签 → ``reject``(绝不写入)。
120
+ - 用户明确"记住"(reason 含 explicit)→ 同步 propose,达阈值 commit。
121
+ - 用户明确"忘掉"(operation=delete)→ 解析目标删除;歧义时不猜测 → reject。
122
+ - 一次性当前任务状态 / 模型猜测 → 留 Session,不写 → ``reject``
123
+ (reason 标 ``not_durable``)。
124
+ - 与旧事实冲突 → ``update``/``supersede``,不覆盖历史来源。
125
+ """
126
+ labels = detect_sensitive_labels(candidate.content, list(candidate.sensitive_labels))
127
+ hard_hit = any(label in HARD_REJECT_LABELS for label in labels)
128
+ if hard_hit or candidate.is_hard_rejected():
129
+ return MemoryEvaluation(
130
+ decision="reject",
131
+ operation="ignore",
132
+ reason=f"sensitive_label_rejected:{','.join(labels) or 'explicit'}",
133
+ conflicts_with=list(candidate.conflicts_with),
134
+ )
135
+
136
+ if candidate.operation == "delete":
137
+ # 删除需明确目标;reason 为空或含 "ambiguous" 时不猜测(方案 §10.4)。
138
+ if not candidate.conflicts_with and not candidate.reason.strip():
139
+ return MemoryEvaluation(
140
+ decision="reject",
141
+ operation="ignore",
142
+ reason="delete_without_target",
143
+ )
144
+ return MemoryEvaluation(
145
+ decision="commit",
146
+ operation="delete",
147
+ reason="explicit_delete",
148
+ conflicts_with=list(candidate.conflicts_with),
149
+ )
150
+
151
+ # 一次性当前任务状态 / 模型猜测不写长期记忆(方案 §10.4)。
152
+ reason_lc = candidate.reason.lower()
153
+ if "model_guess" in reason_lc or "transient" in reason_lc or "current_plan" in reason_lc:
154
+ return MemoryEvaluation(
155
+ decision="reject",
156
+ operation="ignore",
157
+ reason="not_durable",
158
+ )
159
+
160
+ # 阈值判定(方案 §10.4 初始阈值)。
161
+ threshold = self._threshold_for(candidate, observations)
162
+ if candidate.confidence < threshold:
163
+ return MemoryEvaluation(
164
+ decision="pending",
165
+ operation=candidate.operation,
166
+ reason=f"below_threshold:{candidate.confidence:.2f}<{threshold:.2f}",
167
+ )
168
+
169
+ # 冲突:update/supersede,不覆盖历史来源(方案 §10.4)。
170
+ if existing is not None and candidate.operation != "add":
171
+ return MemoryEvaluation(
172
+ decision="commit",
173
+ operation="update",
174
+ reason="conflict_supersede",
175
+ new_version=existing.version + 1,
176
+ conflicts_with=[existing.memory_id],
177
+ )
178
+
179
+ return MemoryEvaluation(
180
+ decision="commit",
181
+ operation=candidate.operation,
182
+ reason="threshold_met",
183
+ new_version=1,
184
+ )
185
+
186
+ def _threshold_for(self, candidate: MemoryCandidate, observations: int) -> float:
187
+ t = self.thresholds
188
+ reason_lc = candidate.reason.lower()
189
+ if "explicit" in reason_lc or "user_request" in reason_lc:
190
+ return t.explicit_user_request
191
+ if "tool_fact" in reason_lc or "verified" in reason_lc:
192
+ return t.verified_tool_fact
193
+ if candidate.memory_type == "episode":
194
+ return t.episode_importance
195
+ # implicit preference
196
+ if observations < t.implicit_preference_min_observations:
197
+ # 观察次数不足,抬高到 implicit 阈值且要求更多观察 → pending。
198
+ return float("inf")
199
+ return t.implicit_preference
200
+
201
+
202
+ def content_hash(content: str) -> str:
203
+ """暴露给 Coordinator/Provider 的稳定 content hash。"""
204
+ return _content_hash(content)
205
+
206
+
207
+ __all__ = [
208
+ "HARD_REJECT_LABELS",
209
+ "MemoryEvaluation",
210
+ "MemoryPolicy",
211
+ "MemoryPolicyThresholds",
212
+ "PolicyDecision",
213
+ "content_hash",
214
+ "detect_sensitive_labels",
215
+ ]
@@ -0,0 +1,47 @@
1
+ """MemoryProvider Protocol 与能力声明(方案 §10.5)。
2
+
3
+ Provider 合同是本地与云端一致性的运行时边界:本地用 SQLite Provider,云端用 HTTP/SDK
4
+ Provider,二者共用同一套契约测试(方案 §17.4)。``expected_version`` 用于并发更新乐观锁,
5
+ 避免多个 Run 并发更新同一偏好时静默覆盖。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Protocol
11
+
12
+ from ksadk.memory.models import (
13
+ CoreMemoryRequest,
14
+ MemoryCapabilities,
15
+ MemoryDeleteRequest,
16
+ MemoryDeleteResult,
17
+ MemoryRecord,
18
+ MemorySearchRequest,
19
+ MemorySearchResult,
20
+ )
21
+
22
+
23
+ class MemoryProvider(Protocol):
24
+ """平台长期记忆 Provider 合同(方案 §10.5)。
25
+
26
+ 实现必须按 ``scope`` 隔离;``scope_id`` 由可信 Principal/Runtime Projection 决定,
27
+ 不能信任用户自行提交的 scope_id(方案 §19)。异常路径不得把错误文本塞进检索结果正文。
28
+ """
29
+
30
+ def capabilities(self) -> MemoryCapabilities: ...
31
+
32
+ def search(self, request: MemorySearchRequest) -> MemorySearchResult: ...
33
+
34
+ def get(self, memory_id: str) -> MemoryRecord | None: ...
35
+
36
+ def upsert(
37
+ self, record: MemoryRecord, *, expected_version: int | None
38
+ ) -> MemoryRecord: ...
39
+
40
+ def delete(self, request: MemoryDeleteRequest) -> MemoryDeleteResult: ...
41
+
42
+ def list_core(self, request: CoreMemoryRequest) -> list[MemoryRecord]: ...
43
+
44
+
45
+ __all__ = [
46
+ "MemoryProvider",
47
+ ]