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.
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
- agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +2 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/bootstrap.py +0 -2
- ksadk/a2a/card.py +6 -111
- ksadk/a2a/control_plane.py +239 -1
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +195 -172
- ksadk/a2a/routes.py +12 -5
- ksadk/a2a/server.py +1 -8
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +43 -349
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +474 -275
- ksadk/agui/config.py +11 -5
- ksadk/agui/routes.py +7 -15
- ksadk/api/client.py +530 -40
- ksadk/api/environment.py +27 -0
- ksadk/builders/code_builder.py +352 -53
- ksadk/builders/container_builder.py +71 -44
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +2 -2
- ksadk/builders/managed_runtime_builder.py +60 -28
- ksadk/cli/__init__.py +25 -0
- ksadk/cli/cmd_a2a.py +18 -31
- ksadk/cli/cmd_create.py +13 -26
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +28 -3
- ksadk/cli/cmd_eval.py +443 -0
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +137 -163
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_launch.py +12 -0
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +85 -479
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_run.py +29 -67
- ksadk/cli/cmd_studio.py +201 -0
- ksadk/cli/cmd_web.py +15 -6
- ksadk/cli/dry_run.py +2 -1
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/global_options.py +3 -1
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/network_options.py +7 -5
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/ui.py +6 -0
- ksadk/cli/workflow_common.py +5 -5
- ksadk/codex/__init__.py +3 -3
- ksadk/codex/client.py +833 -49
- ksadk/codex/phase.py +1 -1
- ksadk/codex/runtime.py +720 -127
- ksadk/common/kop_client.py +232 -0
- ksadk/configs/__init__.py +1 -3
- ksadk/configs/env_registry.py +244 -45
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +6 -1
- ksadk/configs/settings.py +5 -108
- ksadk/context_engine/__init__.py +98 -0
- ksadk/context_engine/assembler.py +176 -0
- ksadk/context_engine/baseline.py +419 -0
- ksadk/context_engine/cache_observability.py +228 -0
- ksadk/context_engine/capabilities.py +443 -0
- ksadk/context_engine/contributors.py +344 -0
- ksadk/context_engine/hosted_pipeline.py +417 -0
- ksadk/context_engine/models.py +117 -0
- ksadk/context_engine/planner.py +698 -0
- ksadk/context_engine/policies.py +319 -0
- ksadk/context_engine/projection.py +31 -0
- ksadk/context_engine/shadow_plan.py +266 -0
- ksadk/context_engine/tokenizer.py +164 -0
- ksadk/conversations/__init__.py +85 -94
- ksadk/conversations/context.py +126 -6
- ksadk/conversations/message_projection.py +292 -28
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +193 -3
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +157 -4
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +280 -2
- ksadk/conversations/runtime_resume.py +71 -32
- ksadk/conversations/runtime_stream_events.py +94 -9
- ksadk/conversations/runtime_streaming.py +175 -22
- ksadk/conversations/semantic_summary.py +311 -1
- ksadk/conversations/session_lock.py +51 -0
- ksadk/deployment/env_forward.py +72 -0
- ksadk/deployment/managed_runtime.py +38 -0
- ksadk/deployment/manager.py +24 -8
- ksadk/deployment/providers/serverless.py +228 -92
- ksadk/evaluation/__init__.py +116 -0
- ksadk/evaluation/a2a_adapter.py +452 -0
- ksadk/evaluation/adapters.py +67 -0
- ksadk/evaluation/agent_eval_client.py +395 -0
- ksadk/evaluation/cloud_binding.py +80 -0
- ksadk/evaluation/cloud_converter.py +194 -0
- ksadk/evaluation/cloud_service.py +199 -0
- ksadk/evaluation/contracts.py +478 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +627 -0
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +143 -0
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +82 -0
- ksadk/events/__init__.py +13 -13
- ksadk/events/_v1_compat/__init__.py +1 -0
- ksadk/events/_v1_compat/models.py +299 -0
- ksadk/events/_v1_compat/parser.py +247 -0
- ksadk/events/_v1_compat/projection.py +753 -0
- ksadk/events/adapters/__init__.py +34 -0
- ksadk/events/adapters/_a2a_snapshot.py +622 -0
- ksadk/events/adapters/_a2a_support.py +275 -0
- ksadk/events/adapters/_codex_interactions.py +375 -0
- ksadk/events/adapters/_codex_items.py +801 -0
- ksadk/events/adapters/_codex_validators.py +311 -0
- ksadk/events/adapters/_langgraph_support.py +785 -0
- ksadk/events/adapters/a2a.py +841 -0
- ksadk/events/adapters/adk.py +503 -0
- ksadk/events/adapters/codex.py +717 -0
- ksadk/events/adapters/langgraph.py +745 -0
- ksadk/events/canonical.py +440 -0
- ksadk/events/canonical_replay.py +497 -0
- ksadk/events/canonical_store.py +468 -0
- ksadk/events/cold_recovery.py +257 -0
- ksadk/events/content.py +89 -0
- ksadk/events/identity.py +86 -0
- ksadk/events/pipeline.py +455 -0
- ksadk/events/projections.py +66 -0
- ksadk/events/reducer.py +661 -0
- ksadk/events/replay.py +3 -36
- ksadk/events/runtime_event.py +20 -256
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +3 -2
- ksadk/harness/app.py +114 -123
- ksadk/harness/config.py +1 -1
- ksadk/harness/runtime.py +467 -0
- ksadk/hermes_terminal.py +5 -0
- ksadk/identity/resolver.py +4 -3
- ksadk/interaction/__init__.py +28 -0
- ksadk/interaction/contracts.py +136 -0
- ksadk/interaction/ledger.py +189 -0
- ksadk/interaction/provider.py +122 -0
- ksadk/interaction/providers/__init__.py +52 -0
- ksadk/interaction/providers/adk.py +40 -0
- ksadk/interaction/providers/codex.py +94 -0
- ksadk/interaction/providers/langgraph.py +58 -0
- ksadk/kernel/__init__.py +117 -0
- ksadk/kernel/authorization.py +258 -0
- ksadk/kernel/bootstrap.py +1074 -0
- ksadk/kernel/contract_fingerprints.py +61 -0
- ksadk/kernel/contracts.py +362 -0
- ksadk/kernel/control.py +219 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1102 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1133 -0
- ksadk/kernel/postgres_store.py +1756 -0
- ksadk/kernel/recovery.py +452 -0
- ksadk/kernel/runtime_identity.py +103 -0
- ksadk/kernel/sql/001_agent_kernel.sql +120 -0
- ksadk/kernel/sqlite_store.py +1410 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +953 -0
- ksadk/knowledge_base/client.py +22 -4
- ksadk/knowledge_base/service.py +32 -5
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +16 -9
- ksadk/memory/__init__.py +61 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
- ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
- ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- ksadk/memory/adk/long_term_memory.py +3 -2
- ksadk/memory/coordinator.py +461 -0
- ksadk/memory/events.py +202 -0
- ksadk/memory/extraction.py +228 -0
- ksadk/memory/ltm_backend_factory.py +16 -3
- ksadk/memory/models.py +316 -0
- ksadk/memory/policy.py +215 -0
- ksadk/memory/provider.py +47 -0
- ksadk/memory/provider_adapter.py +159 -0
- ksadk/memory/provider_resolver.py +71 -0
- ksadk/memory/providers/__init__.py +5 -0
- ksadk/memory/providers/local_sqlite.py +490 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +198 -8
- ksadk/memory/tool.py +4 -0
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/config.py +22 -1
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +67 -15
- ksadk/model_proxy/server.py +168 -6
- ksadk/model_proxy/transform.py +105 -3
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/prompts/__init__.py +71 -0
- ksadk/prompts/compiler.py +215 -0
- ksadk/prompts/models.py +82 -0
- ksadk/prompts/projection.py +89 -0
- ksadk/prompts/resolved.py +137 -0
- ksadk/prompts/sources.py +233 -0
- ksadk/runners/_langgraph_runner_streams.py +822 -0
- ksadk/runners/adk_runner.py +14 -31
- ksadk/runners/base_runner.py +44 -3
- ksadk/runners/factory.py +3 -3
- ksadk/runners/langgraph_runner.py +252 -433
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +16 -0
- ksadk/runtime/__init__.py +67 -41
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +199 -16
- ksadk/runtime/conversation_execution.py +687 -0
- ksadk/runtime/executor.py +392 -0
- ksadk/runtime/factory.py +342 -0
- ksadk/runtime/framework_adapters.py +6 -12
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +61 -0
- ksadk/runtime/preprocessing.py +49 -14
- ksadk/runtime/runner_adapter.py +330 -391
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +36 -3
- ksadk/server/__init__.py +39 -4
- ksadk/server/app.py +18 -492
- ksadk/server/composition.py +36 -2
- ksadk/server/factory.py +210 -149
- ksadk/server/routes/common.py +15 -46
- ksadk/server/routes/control.py +13 -9
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/misc.py +10 -33
- ksadk/server/routes/models.py +14 -6
- ksadk/server/routes/openai_compat.py +129 -27
- ksadk/server/routes/projection.py +84 -16
- ksadk/server/routes/run.py +347 -460
- ksadk/server/routes/sessions.py +37 -40
- ksadk/server/routes/streaming.py +52 -7
- ksadk/server/routes/workspace.py +54 -21
- ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
- ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
- ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
- ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
- ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
- ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
- ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +26 -9
- ksadk/sessions/_local_service_sync.py +688 -0
- ksadk/sessions/_local_tables.py +21 -0
- ksadk/sessions/_postgres_schema.py +305 -0
- ksadk/sessions/_postgres_tables.py +15 -0
- ksadk/sessions/base.py +80 -1
- ksadk/sessions/in_memory.py +53 -2
- ksadk/sessions/local_service.py +63 -604
- ksadk/sessions/postgres_service.py +58 -148
- ksadk/sessions/resilient.py +35 -1
- ksadk/skills/runtime/backends/e2b.py +1 -1
- ksadk/skills/service_client.py +13 -3
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1598 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +286 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +749 -0
- ksadk/studio/authoring_coordinator.py +1017 -0
- ksadk/studio/builder.py +397 -0
- ksadk/studio/capabilities.py +368 -0
- ksadk/studio/cloud.py +2099 -0
- ksadk/studio/codex_agent_service.py +694 -0
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +437 -0
- ksadk/studio/codex_manifest.py +307 -0
- ksadk/studio/codex_run.py +395 -0
- ksadk/studio/compiler.py +190 -0
- ksadk/studio/contracts.py +755 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/event_store.py +214 -0
- ksadk/studio/framework_run.py +342 -0
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +629 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +275 -0
- ksadk/studio/otel_trace.py +1060 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +327 -0
- ksadk/studio/resource_catalog.py +1260 -0
- ksadk/studio/run_service.py +1133 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +365 -0
- ksadk/studio/service.py +2249 -0
- ksadk/studio/shared_web.py +1004 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +722 -0
- ksadk/studio/validator.py +265 -0
- ksadk/studio/workspace.py +135 -0
- ksadk/tools/gateway.py +9 -0
- ksadk/toolsets/__init__.py +27 -1
- ksadk/toolsets/a2a.py +426 -0
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/setup.py +317 -403
- ksadk/tracing/span_utils.py +0 -44
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/events/parser.py +0 -191
- ksadk/harness/runner.py +0 -211
- ksadk/runners/codex_runner.py +0 -132
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
- ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
- ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
- ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
- ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
- ksadk/server/static/assets/katex-DATssjp1.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
- ksadk/tracing/exporters/langfuse_exporter.py +0 -460
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""``InteractionLedger`` port 与跨后端共享的台账语义(Phase 1 Task 5)。
|
|
3
|
+
|
|
4
|
+
所有 mutation 都接受 :class:`~ksadk.kernel.contracts.ActivationWriteGuard`
|
|
5
|
+
并在 store 事务内与 activation lease 做 fence CAS;request 写 pending 行 +
|
|
6
|
+
``interaction.requested``;terminal(resolve/cancel/expire)做 revision CAS、
|
|
7
|
+
first-wins,并在**同一个 store 事务**内追加恰好一个 terminal SessionEvent
|
|
8
|
+
(family=interaction, family_version=1)。
|
|
9
|
+
|
|
10
|
+
公共事件 payload 是 interactionEvent 投影,省略
|
|
11
|
+
``provider_id`` / ``native_target`` / ``continuation_metadata``。
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import hashlib
|
|
17
|
+
import json
|
|
18
|
+
from typing import Protocol, runtime_checkable
|
|
19
|
+
from uuid import uuid4
|
|
20
|
+
|
|
21
|
+
from ksadk.interaction.contracts import (
|
|
22
|
+
InteractionRecord,
|
|
23
|
+
InteractionReceipt,
|
|
24
|
+
InteractionSubmission,
|
|
25
|
+
RESOLVE_OUTCOMES,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.kernel.contracts import (
|
|
28
|
+
ActivationWriteGuard,
|
|
29
|
+
SessionEventEnvelope,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
INTERACTION_FAMILY = "interaction"
|
|
33
|
+
INTERACTION_FAMILY_VERSION = 1
|
|
34
|
+
|
|
35
|
+
ALREADY_RESOLVED = "interaction_already_resolved"
|
|
36
|
+
REVISION_MISMATCH = "interaction_revision_mismatch"
|
|
37
|
+
REQUEST_CONFLICT = "interaction_request_conflict"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def request_digest(record: InteractionRecord) -> str:
|
|
41
|
+
"""幂等域摘要:排除 revision/status/created_at 等可变或时钟字段。"""
|
|
42
|
+
|
|
43
|
+
canonical = json.dumps(
|
|
44
|
+
record.model_dump(
|
|
45
|
+
mode="json",
|
|
46
|
+
exclude={"revision", "status", "created_at"},
|
|
47
|
+
),
|
|
48
|
+
sort_keys=True,
|
|
49
|
+
separators=(",", ":"),
|
|
50
|
+
ensure_ascii=False,
|
|
51
|
+
).encode("utf-8")
|
|
52
|
+
return hashlib.sha256(canonical).hexdigest()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def submission_digest(submission: InteractionSubmission) -> str:
|
|
56
|
+
canonical = json.dumps(
|
|
57
|
+
submission.model_dump(mode="json"),
|
|
58
|
+
sort_keys=True,
|
|
59
|
+
separators=(",", ":"),
|
|
60
|
+
ensure_ascii=False,
|
|
61
|
+
).encode("utf-8")
|
|
62
|
+
return hashlib.sha256(canonical).hexdigest()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def interaction_event(
|
|
66
|
+
record: InteractionRecord,
|
|
67
|
+
*,
|
|
68
|
+
event_type: str,
|
|
69
|
+
timestamp: str,
|
|
70
|
+
request: dict | None = None,
|
|
71
|
+
outcome: str | None = None,
|
|
72
|
+
response=None,
|
|
73
|
+
actor_ref: str | None = None,
|
|
74
|
+
reason: str | None = None,
|
|
75
|
+
) -> SessionEventEnvelope:
|
|
76
|
+
"""构造 family=interaction/v1 的公共 interactionEvent。
|
|
77
|
+
|
|
78
|
+
payload 是 schema 的 interactionEvent 投影:不含 provider_id /
|
|
79
|
+
native_target / continuation_metadata 等内部字段。
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
payload: dict = {
|
|
83
|
+
"schema_version": 1,
|
|
84
|
+
"event_type": event_type,
|
|
85
|
+
"interaction_id": record.interaction_id,
|
|
86
|
+
"tenant_id": record.tenant_id,
|
|
87
|
+
"agent_instance_id": record.agent_instance_id,
|
|
88
|
+
"session_id": record.session_id,
|
|
89
|
+
"run_id": record.run_id,
|
|
90
|
+
"kind": record.kind,
|
|
91
|
+
"revision": record.revision,
|
|
92
|
+
"timestamp": timestamp,
|
|
93
|
+
}
|
|
94
|
+
if request is not None:
|
|
95
|
+
payload["request"] = request
|
|
96
|
+
if outcome is not None:
|
|
97
|
+
payload["outcome"] = outcome
|
|
98
|
+
if response is not None:
|
|
99
|
+
payload["response"] = response
|
|
100
|
+
if actor_ref is not None:
|
|
101
|
+
payload["actor_ref"] = actor_ref
|
|
102
|
+
if reason is not None:
|
|
103
|
+
payload["reason"] = reason
|
|
104
|
+
return SessionEventEnvelope(
|
|
105
|
+
event_id=uuid4(),
|
|
106
|
+
session_id=record.session_id,
|
|
107
|
+
seq=0, # 由 SessionEventStore 在持久化后分配
|
|
108
|
+
timestamp=timestamp,
|
|
109
|
+
family=INTERACTION_FAMILY,
|
|
110
|
+
family_version=INTERACTION_FAMILY_VERSION,
|
|
111
|
+
event_type=event_type,
|
|
112
|
+
payload=payload,
|
|
113
|
+
run_id=record.run_id,
|
|
114
|
+
actor_ref=actor_ref or "agent-kernel",
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def requested_event_payload(record: InteractionRecord, timestamp: str) -> SessionEventEnvelope:
|
|
119
|
+
request = {
|
|
120
|
+
"kind": record.kind,
|
|
121
|
+
"request_schema": record.request_schema,
|
|
122
|
+
}
|
|
123
|
+
if record.expires_at is not None:
|
|
124
|
+
request["expires_at"] = record.expires_at
|
|
125
|
+
if record.presentation is not None:
|
|
126
|
+
request["presentation"] = record.presentation.model_dump(mode="json")
|
|
127
|
+
return interaction_event(
|
|
128
|
+
record,
|
|
129
|
+
event_type="interaction.requested",
|
|
130
|
+
timestamp=timestamp,
|
|
131
|
+
request=request,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def resolve_outcome(action: str) -> str:
|
|
136
|
+
try:
|
|
137
|
+
return RESOLVE_OUTCOMES[action]
|
|
138
|
+
except KeyError: # pragma: no cover - schema 已约束 action 枚举
|
|
139
|
+
raise ValueError(f"non-resolve action {action!r}") from None
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
@runtime_checkable
|
|
143
|
+
class InteractionLedger(Protocol):
|
|
144
|
+
"""Durable first-wins interaction 台账 port(AgentKernelStore 一致性域)。"""
|
|
145
|
+
|
|
146
|
+
async def request(
|
|
147
|
+
self, record: InteractionRecord, *, guard: ActivationWriteGuard
|
|
148
|
+
) -> InteractionRecord: ...
|
|
149
|
+
|
|
150
|
+
async def resolve(
|
|
151
|
+
self, submission: InteractionSubmission, *, guard: ActivationWriteGuard
|
|
152
|
+
) -> InteractionReceipt: ...
|
|
153
|
+
|
|
154
|
+
async def cancel(
|
|
155
|
+
self, interaction_id: str, expected_revision: int, *, guard: ActivationWriteGuard
|
|
156
|
+
) -> InteractionReceipt: ...
|
|
157
|
+
|
|
158
|
+
async def expire(
|
|
159
|
+
self, interaction_id: str, expected_revision: int, *, guard: ActivationWriteGuard
|
|
160
|
+
) -> InteractionReceipt: ...
|
|
161
|
+
|
|
162
|
+
async def get(
|
|
163
|
+
self,
|
|
164
|
+
interaction_id: str,
|
|
165
|
+
*,
|
|
166
|
+
tenant_id: str | None = None,
|
|
167
|
+
agent_instance_id: str | None = None,
|
|
168
|
+
session_id: str | None = None,
|
|
169
|
+
run_id: str | None = None,
|
|
170
|
+
) -> InteractionRecord | None: ...
|
|
171
|
+
|
|
172
|
+
async def list_pending_interactions(
|
|
173
|
+
self, tenant_id: str, session_id: str
|
|
174
|
+
) -> list[InteractionRecord]: ...
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
__all__ = [
|
|
178
|
+
"ALREADY_RESOLVED",
|
|
179
|
+
"INTERACTION_FAMILY",
|
|
180
|
+
"INTERACTION_FAMILY_VERSION",
|
|
181
|
+
"InteractionLedger",
|
|
182
|
+
"REVISION_MISMATCH",
|
|
183
|
+
"REQUEST_CONFLICT",
|
|
184
|
+
"interaction_event",
|
|
185
|
+
"request_digest",
|
|
186
|
+
"requested_event_payload",
|
|
187
|
+
"resolve_outcome",
|
|
188
|
+
"submission_digest",
|
|
189
|
+
]
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""InteractionProvider seam(Phase 1 Task 6 Step 1)。
|
|
3
|
+
|
|
4
|
+
Interaction 回包的分发 seam:Worker 载入权威 :class:`InteractionRecord`
|
|
5
|
+
后,把回包交给 record 绑定的 provider,由 provider 用 **activation 持有的**
|
|
6
|
+
``RuntimeAdapter``/``RunHandle`` 以框架原生方式送达:
|
|
7
|
+
|
|
8
|
+
- ``live_submit``:runtime 有 live 命令通道(如 Codex JSON-RPC approval),
|
|
9
|
+
回包经 ``adapter.submit`` 原路送达同一 client 实例,不重启流。
|
|
10
|
+
- ``durable_resume``:runtime 以 checkpoint/continuation 收口(如
|
|
11
|
+
LangGraph),回包映射为存的 checkpoint/thread target 经 ``adapter.resume``
|
|
12
|
+
恢复执行。
|
|
13
|
+
- ``unavailable``:生产 Adapter 无法以框架原生身份送达回包时**诚实拒绝**,
|
|
14
|
+
绝不静默重放一个新 run 冒充 resume。
|
|
15
|
+
|
|
16
|
+
provider 的 mode 必须与 adapter 的
|
|
17
|
+
:class:`~ksadk.kernel.contracts.RuntimeCapabilityMatrix` 一致:mode 只是
|
|
18
|
+
静态声明,``resolve`` 内部仍逐次校验当前 adapter 的真实 capability,
|
|
19
|
+
不一致时 fail closed(``runtime_interaction_unavailable``,不标 resolved)。
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from typing import Literal, Protocol, runtime_checkable
|
|
26
|
+
|
|
27
|
+
from ksadk.interaction.contracts import (
|
|
28
|
+
InteractionRecord,
|
|
29
|
+
InteractionSubmission,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.runtime.adapter import RunHandle, RuntimeAdapter
|
|
32
|
+
|
|
33
|
+
InteractionProviderMode = Literal["live_submit", "durable_resume", "unavailable"]
|
|
34
|
+
|
|
35
|
+
RUNTIME_INTERACTION_UNAVAILABLE = "runtime_interaction_unavailable"
|
|
36
|
+
"""provider 无法以框架原生身份送达回包时的稳定错误码(typed rejection)。"""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class InteractionResolveContext:
|
|
41
|
+
"""一次回包分发的执行上下文——全部来自当前 activation 的 ActiveExecution。"""
|
|
42
|
+
|
|
43
|
+
adapter: RuntimeAdapter
|
|
44
|
+
handle: RunHandle
|
|
45
|
+
activation_id: str
|
|
46
|
+
fencing_token: int
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@runtime_checkable
|
|
50
|
+
class InteractionProvider(Protocol):
|
|
51
|
+
"""把 Interaction 回包映射为框架原生 resume/submit 的 provider 协议。"""
|
|
52
|
+
|
|
53
|
+
provider_id: str
|
|
54
|
+
mode: InteractionProviderMode
|
|
55
|
+
|
|
56
|
+
async def resolve(
|
|
57
|
+
self,
|
|
58
|
+
context: InteractionResolveContext,
|
|
59
|
+
record: InteractionRecord,
|
|
60
|
+
submission: InteractionSubmission,
|
|
61
|
+
) -> RunHandle: ...
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def require_capability(
|
|
65
|
+
context: InteractionResolveContext,
|
|
66
|
+
capability_name: str,
|
|
67
|
+
*,
|
|
68
|
+
provider_id: str,
|
|
69
|
+
) -> None:
|
|
70
|
+
"""fail-closed capability 校验:mode 声明与真实 adapter 能力不一致即拒绝。"""
|
|
71
|
+
|
|
72
|
+
from ksadk.kernel.errors import AgentKernelError
|
|
73
|
+
|
|
74
|
+
capability = getattr(context.adapter.capabilities(), capability_name, None)
|
|
75
|
+
if capability is None or not capability.supported:
|
|
76
|
+
reason = getattr(capability, "reason", "not_implemented") or "not_implemented"
|
|
77
|
+
raise AgentKernelError(
|
|
78
|
+
RUNTIME_INTERACTION_UNAVAILABLE,
|
|
79
|
+
f"interaction provider {provider_id!r} requires adapter capability "
|
|
80
|
+
f"{capability_name!r}, which is unavailable: {reason}",
|
|
81
|
+
retryable=False,
|
|
82
|
+
details={
|
|
83
|
+
"provider_id": provider_id,
|
|
84
|
+
"capability": capability_name,
|
|
85
|
+
"reason": reason,
|
|
86
|
+
},
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class UnavailableInteractionProvider:
|
|
91
|
+
"""诚实占位:该 runtime 的回包送达路径尚未实现。"""
|
|
92
|
+
|
|
93
|
+
provider_id = ""
|
|
94
|
+
mode: InteractionProviderMode = "unavailable"
|
|
95
|
+
|
|
96
|
+
async def resolve(
|
|
97
|
+
self,
|
|
98
|
+
context: InteractionResolveContext,
|
|
99
|
+
record: InteractionRecord,
|
|
100
|
+
submission: InteractionSubmission,
|
|
101
|
+
) -> RunHandle:
|
|
102
|
+
from ksadk.kernel.errors import AgentKernelError
|
|
103
|
+
|
|
104
|
+
provider_id = type(self).provider_id or record.provider_id
|
|
105
|
+
raise AgentKernelError(
|
|
106
|
+
RUNTIME_INTERACTION_UNAVAILABLE,
|
|
107
|
+
f"interaction provider for {provider_id!r} is unavailable: "
|
|
108
|
+
"runtime cannot deliver an interaction response with its native "
|
|
109
|
+
"identity; refusing to replay a new run",
|
|
110
|
+
retryable=False,
|
|
111
|
+
details={"provider_id": provider_id, "mode": "unavailable"},
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
__all__ = [
|
|
116
|
+
"RUNTIME_INTERACTION_UNAVAILABLE",
|
|
117
|
+
"InteractionProvider",
|
|
118
|
+
"InteractionProviderMode",
|
|
119
|
+
"InteractionResolveContext",
|
|
120
|
+
"UnavailableInteractionProvider",
|
|
121
|
+
"require_capability",
|
|
122
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""框架原生 InteractionProvider 注册表(Phase 1 Task 6)。
|
|
3
|
+
|
|
4
|
+
provider 是无状态映射器(adapter/handle 由
|
|
5
|
+
:class:`~ksadk.interaction.provider.InteractionResolveContext` 注入),
|
|
6
|
+
因此注册表返回共享实例即可。key 同时覆盖 ``provider_id`` 与
|
|
7
|
+
``runtime_type``(当前两者一致:codex/langgraph/adk)。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Mapping
|
|
13
|
+
|
|
14
|
+
from ksadk.interaction.provider import (
|
|
15
|
+
InteractionProvider,
|
|
16
|
+
UnavailableInteractionProvider,
|
|
17
|
+
)
|
|
18
|
+
from ksadk.interaction.providers.adk import ADKInteractionProvider
|
|
19
|
+
from ksadk.interaction.providers.codex import CodexInteractionProvider
|
|
20
|
+
from ksadk.interaction.providers.langgraph import LangGraphInteractionProvider
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def default_interaction_providers() -> dict[str, InteractionProvider]:
|
|
24
|
+
"""默认 provider 注册表:provider_id / runtime_type -> provider。"""
|
|
25
|
+
|
|
26
|
+
providers: list[InteractionProvider] = [
|
|
27
|
+
CodexInteractionProvider(),
|
|
28
|
+
LangGraphInteractionProvider(),
|
|
29
|
+
ADKInteractionProvider(),
|
|
30
|
+
]
|
|
31
|
+
registry: dict[str, InteractionProvider] = {}
|
|
32
|
+
for provider in providers:
|
|
33
|
+
registry[provider.provider_id] = provider
|
|
34
|
+
return registry
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def provider_for(
|
|
38
|
+
registry: Mapping[str, InteractionProvider], runtime_type: str
|
|
39
|
+
) -> InteractionProvider:
|
|
40
|
+
"""按 runtime_type 取 provider;未知 runtime 诚实返回 unavailable 占位。"""
|
|
41
|
+
|
|
42
|
+
return registry.get(runtime_type, UnavailableInteractionProvider())
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
"ADKInteractionProvider",
|
|
47
|
+
"CodexInteractionProvider",
|
|
48
|
+
"LangGraphInteractionProvider",
|
|
49
|
+
"UnavailableInteractionProvider",
|
|
50
|
+
"default_interaction_providers",
|
|
51
|
+
"provider_for",
|
|
52
|
+
]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""ADK InteractionProvider:诚实声明 unavailable(Phase 1 Task 6 Step 6)。
|
|
3
|
+
|
|
4
|
+
ADK 的 confirmation/function-response 回包语义上要求以原 invocation 的
|
|
5
|
+
native 身份续跑;当前生产 ``ADKRuntimeAdapter``(forward-only resume 经
|
|
6
|
+
invocation_id)无法在一次 Interaction 回包中保留该 native 身份——
|
|
7
|
+
``submit_interaction`` capability 是 unavailable(无 live 命令通道),
|
|
8
|
+
resume 则会以新 invocation 重放。因此本 provider 诚实 advertise
|
|
9
|
+
``unavailable`` 并 fail closed,**绝不静默重放一个新 run 冒充回包送达**。
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from ksadk.interaction.contracts import (
|
|
15
|
+
InteractionRecord,
|
|
16
|
+
InteractionSubmission,
|
|
17
|
+
)
|
|
18
|
+
from ksadk.interaction.provider import (
|
|
19
|
+
InteractionResolveContext,
|
|
20
|
+
UnavailableInteractionProvider,
|
|
21
|
+
)
|
|
22
|
+
from ksadk.runtime.adapter import RunHandle
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ADKInteractionProvider(UnavailableInteractionProvider):
|
|
26
|
+
"""provider_id=adk,mode=unavailable(对齐 RunnerRuntimeAdapter 矩阵)。"""
|
|
27
|
+
|
|
28
|
+
provider_id = "adk"
|
|
29
|
+
mode = "unavailable"
|
|
30
|
+
|
|
31
|
+
async def resolve(
|
|
32
|
+
self,
|
|
33
|
+
context: InteractionResolveContext,
|
|
34
|
+
record: InteractionRecord,
|
|
35
|
+
submission: InteractionSubmission,
|
|
36
|
+
) -> RunHandle:
|
|
37
|
+
return await super().resolve(context, record, submission)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
__all__ = ["ADKInteractionProvider"]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Codex InteractionProvider:live JSON-RPC approval 回包(Phase 1 Task 6 Step 6)。
|
|
3
|
+
|
|
4
|
+
Codex 的 HITL 模型是**事件流 + 独立 live 命令通道**:审批卡阻塞在
|
|
5
|
+
``item/commandExecution/requestApproval``,回包必须经
|
|
6
|
+
:meth:`ksadk.codex.runtime.CodexRuntimeAdapter.submit` 以原 ``call_id`` 送达
|
|
7
|
+
**同一 client 实例**(thread 表在 adapter 进程内,换实例 = 回包丢失)。
|
|
8
|
+
本 provider 不重启流,也不伪造新 run。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from ksadk.interaction.contracts import (
|
|
16
|
+
InteractionRecord,
|
|
17
|
+
InteractionSubmission,
|
|
18
|
+
)
|
|
19
|
+
from ksadk.interaction.provider import (
|
|
20
|
+
InteractionResolveContext,
|
|
21
|
+
require_capability,
|
|
22
|
+
)
|
|
23
|
+
from ksadk.runtime.adapter import ResumePayload, RunHandle
|
|
24
|
+
|
|
25
|
+
# interaction action -> codex 原生 approval decision 词表。
|
|
26
|
+
_CODEX_APPROVAL_DECISIONS = {
|
|
27
|
+
"approve": "approve",
|
|
28
|
+
"reject": "deny",
|
|
29
|
+
"cancel": "cancel",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CodexInteractionProvider:
|
|
34
|
+
"""provider_id=codex,mode=live_submit(对齐 CodexRuntimeAdapter 矩阵)。"""
|
|
35
|
+
|
|
36
|
+
provider_id = "codex"
|
|
37
|
+
mode = "live_submit"
|
|
38
|
+
|
|
39
|
+
async def resolve(
|
|
40
|
+
self,
|
|
41
|
+
context: InteractionResolveContext,
|
|
42
|
+
record: InteractionRecord,
|
|
43
|
+
submission: InteractionSubmission,
|
|
44
|
+
) -> RunHandle:
|
|
45
|
+
require_capability(
|
|
46
|
+
context, "submit_interaction", provider_id=self.provider_id
|
|
47
|
+
)
|
|
48
|
+
native_target = record.native_target or {}
|
|
49
|
+
call_id = str(native_target.get("call_id") or record.interaction_id)
|
|
50
|
+
if not call_id:
|
|
51
|
+
raise ValueError("codex interaction requires a native call_id")
|
|
52
|
+
if record.kind == "approval":
|
|
53
|
+
payload_kind = "approval_decision"
|
|
54
|
+
data = self._approval_data(submission.response, submission.action)
|
|
55
|
+
else:
|
|
56
|
+
payload_kind = "hitl_answer"
|
|
57
|
+
data = self._structured_data(submission.response)
|
|
58
|
+
await context.adapter.submit(
|
|
59
|
+
context.handle,
|
|
60
|
+
ResumePayload(kind=payload_kind, call_id=call_id, data=data),
|
|
61
|
+
)
|
|
62
|
+
# live_submit 不换 handle、不重启流:回包送达后原 stream 自然续跑。
|
|
63
|
+
return context.handle
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def _approval_data(response: Any, action: str) -> Any:
|
|
67
|
+
"""approve/reject 映射为 codex 原生 decision;显式 response 优先。"""
|
|
68
|
+
|
|
69
|
+
decision = _CODEX_APPROVAL_DECISIONS.get(str(action), str(action))
|
|
70
|
+
if isinstance(response, dict):
|
|
71
|
+
data = {
|
|
72
|
+
key: value for key, value in response.items() if value is not None
|
|
73
|
+
}
|
|
74
|
+
if not any(key in data for key in ("decision", "name")):
|
|
75
|
+
data["decision"] = decision
|
|
76
|
+
elif "decision" in data:
|
|
77
|
+
# The runtime advertises the public Interaction vocabulary
|
|
78
|
+
# (decision enum approve/reject) in request_schema; a client
|
|
79
|
+
# echoing it must be normalized to the codex-native word
|
|
80
|
+
# instead of failing the client vocab check fail-closed.
|
|
81
|
+
data["decision"] = _CODEX_APPROVAL_DECISIONS.get(
|
|
82
|
+
str(data["decision"]), str(data["decision"])
|
|
83
|
+
)
|
|
84
|
+
return data
|
|
85
|
+
return {"decision": decision}
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _structured_data(response: Any) -> Any:
|
|
89
|
+
if isinstance(response, dict):
|
|
90
|
+
return dict(response)
|
|
91
|
+
return {"answer": response}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
__all__ = ["CodexInteractionProvider"]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""LangGraph InteractionProvider:checkpoint resume 回包(Phase 1 Task 6 Step 6)。
|
|
3
|
+
|
|
4
|
+
LangGraph 的 HITL 模型是 interrupt + checkpoint:graph 停在
|
|
5
|
+
``__interrupt__``,durable 状态保存在 thread 的 checkpoint。回包必须映射为
|
|
6
|
+
request 时存的 checkpoint/thread target,经
|
|
7
|
+
:meth:`ksadk.runtime.framework_adapters.LangGraphRuntimeAdapter.resume`
|
|
8
|
+
恢复**同一个 thread**(time-travel 语义),绝不新起一个 run。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from ksadk.interaction.contracts import (
|
|
14
|
+
InteractionRecord,
|
|
15
|
+
InteractionSubmission,
|
|
16
|
+
)
|
|
17
|
+
from ksadk.interaction.provider import (
|
|
18
|
+
InteractionResolveContext,
|
|
19
|
+
require_capability,
|
|
20
|
+
)
|
|
21
|
+
from ksadk.runtime.adapter import ResumePayload, ResumeTarget, RunHandle
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LangGraphInteractionProvider:
|
|
25
|
+
"""provider_id=langgraph,mode=durable_resume(对齐 checkpoint 矩阵)。"""
|
|
26
|
+
|
|
27
|
+
provider_id = "langgraph"
|
|
28
|
+
mode = "durable_resume"
|
|
29
|
+
|
|
30
|
+
async def resolve(
|
|
31
|
+
self,
|
|
32
|
+
context: InteractionResolveContext,
|
|
33
|
+
record: InteractionRecord,
|
|
34
|
+
submission: InteractionSubmission,
|
|
35
|
+
) -> RunHandle:
|
|
36
|
+
require_capability(context, "resume", provider_id=self.provider_id)
|
|
37
|
+
native_target = record.native_target or {}
|
|
38
|
+
checkpoint_id = str(native_target.get("checkpoint_id") or "")
|
|
39
|
+
if not checkpoint_id:
|
|
40
|
+
raise ValueError(
|
|
41
|
+
"langgraph interaction requires a stored checkpoint_id target"
|
|
42
|
+
)
|
|
43
|
+
thread_id = str(native_target.get("thread_id") or context.handle.session_id)
|
|
44
|
+
context.handle.native_ref.setdefault("thread_id", thread_id)
|
|
45
|
+
payload_kind = "approval_decision" if record.kind == "approval" else "hitl_answer"
|
|
46
|
+
payload = ResumePayload(
|
|
47
|
+
kind=payload_kind,
|
|
48
|
+
call_id=str(native_target.get("call_id") or record.interaction_id),
|
|
49
|
+
data=submission.response,
|
|
50
|
+
)
|
|
51
|
+
return await context.adapter.resume(
|
|
52
|
+
context.handle,
|
|
53
|
+
ResumeTarget(kind="checkpoint_id", id=checkpoint_id),
|
|
54
|
+
payload,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
__all__ = ["LangGraphInteractionProvider"]
|
ksadk/kernel/__init__.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Agent Kernel v1 合同与稳定错误码的公开入口。
|
|
2
|
+
from ksadk.kernel.authorization import (
|
|
3
|
+
AgentControlPermitVerifier,
|
|
4
|
+
JwksSource,
|
|
5
|
+
PermitExpiredError,
|
|
6
|
+
VerifiedAdmission,
|
|
7
|
+
)
|
|
8
|
+
from ksadk.kernel.contract_fingerprints import (
|
|
9
|
+
AGENT_KERNEL_V1_AGGREGATE_DIGEST,
|
|
10
|
+
AGENT_KERNEL_V1_CONTRACT_SET,
|
|
11
|
+
runtime_capability_matrix_digest,
|
|
12
|
+
runtime_capability_matrix_wire_value,
|
|
13
|
+
)
|
|
14
|
+
from ksadk.kernel.contracts import (
|
|
15
|
+
ActivationLease,
|
|
16
|
+
ActivationWriteGuard,
|
|
17
|
+
AdmissionWriteGuard,
|
|
18
|
+
AgentControlCommand,
|
|
19
|
+
AgentControlPermit,
|
|
20
|
+
AgentControlReceipt,
|
|
21
|
+
AgentStatusQuery,
|
|
22
|
+
AgentStatusSnapshot,
|
|
23
|
+
ControlError,
|
|
24
|
+
ControlSource,
|
|
25
|
+
EnqueuePayload,
|
|
26
|
+
InjectPayload,
|
|
27
|
+
InterruptPayload,
|
|
28
|
+
JsonValue,
|
|
29
|
+
PausePayload,
|
|
30
|
+
ResumePayload,
|
|
31
|
+
ResumeTarget,
|
|
32
|
+
RuntimeCapability,
|
|
33
|
+
RuntimeCapabilityMatrix,
|
|
34
|
+
SessionEventEnvelope,
|
|
35
|
+
SessionEventSubscription,
|
|
36
|
+
SessionEventWriteGuard,
|
|
37
|
+
SteerPayload,
|
|
38
|
+
SubmitInteractionPayload,
|
|
39
|
+
WireModel,
|
|
40
|
+
WriteContext,
|
|
41
|
+
)
|
|
42
|
+
from ksadk.kernel.control import AgentKernel, default_capability_matrix
|
|
43
|
+
from ksadk.kernel.errors import (
|
|
44
|
+
ERROR_CODES,
|
|
45
|
+
AgentKernelError,
|
|
46
|
+
ContractMismatchError,
|
|
47
|
+
InvalidCommandError,
|
|
48
|
+
InvalidPermitError,
|
|
49
|
+
PersistenceUncertainError,
|
|
50
|
+
QueueFullError,
|
|
51
|
+
StaleFenceError,
|
|
52
|
+
UnsupportedError,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# worker 依赖 ksadk.runtime.adapter;runtime.adapter 又经 ksadk.events 回指本包的
|
|
56
|
+
# contracts,急切导入会成环,故用 PEP 562 惰性导出。
|
|
57
|
+
|
|
58
|
+
_LAZY_EXPORTS = {"AgentKernelWorker": "ksadk.kernel.worker", "WorkResult": "ksadk.kernel.worker"}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def __getattr__(name: str): # noqa: ANN001
|
|
62
|
+
module_path = _LAZY_EXPORTS.get(name)
|
|
63
|
+
if module_path is None:
|
|
64
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
65
|
+
import importlib
|
|
66
|
+
|
|
67
|
+
return getattr(importlib.import_module(module_path), name)
|
|
68
|
+
|
|
69
|
+
__all__ = [
|
|
70
|
+
"AgentControlPermitVerifier",
|
|
71
|
+
"AgentKernel",
|
|
72
|
+
"AgentKernelWorker",
|
|
73
|
+
"JwksSource",
|
|
74
|
+
"PermitExpiredError",
|
|
75
|
+
"VerifiedAdmission",
|
|
76
|
+
"WorkResult",
|
|
77
|
+
"default_capability_matrix",
|
|
78
|
+
"AGENT_KERNEL_V1_AGGREGATE_DIGEST",
|
|
79
|
+
"AGENT_KERNEL_V1_CONTRACT_SET",
|
|
80
|
+
"runtime_capability_matrix_digest",
|
|
81
|
+
"runtime_capability_matrix_wire_value",
|
|
82
|
+
"ERROR_CODES",
|
|
83
|
+
"AgentKernelError",
|
|
84
|
+
"ContractMismatchError",
|
|
85
|
+
"InvalidCommandError",
|
|
86
|
+
"InvalidPermitError",
|
|
87
|
+
"PersistenceUncertainError",
|
|
88
|
+
"QueueFullError",
|
|
89
|
+
"StaleFenceError",
|
|
90
|
+
"UnsupportedError",
|
|
91
|
+
"ActivationLease",
|
|
92
|
+
"ActivationWriteGuard",
|
|
93
|
+
"AdmissionWriteGuard",
|
|
94
|
+
"AgentControlCommand",
|
|
95
|
+
"AgentControlPermit",
|
|
96
|
+
"AgentControlReceipt",
|
|
97
|
+
"AgentStatusQuery",
|
|
98
|
+
"AgentStatusSnapshot",
|
|
99
|
+
"ControlError",
|
|
100
|
+
"ControlSource",
|
|
101
|
+
"EnqueuePayload",
|
|
102
|
+
"InjectPayload",
|
|
103
|
+
"InterruptPayload",
|
|
104
|
+
"JsonValue",
|
|
105
|
+
"PausePayload",
|
|
106
|
+
"ResumePayload",
|
|
107
|
+
"ResumeTarget",
|
|
108
|
+
"RuntimeCapability",
|
|
109
|
+
"RuntimeCapabilityMatrix",
|
|
110
|
+
"SessionEventEnvelope",
|
|
111
|
+
"SessionEventSubscription",
|
|
112
|
+
"SessionEventWriteGuard",
|
|
113
|
+
"SteerPayload",
|
|
114
|
+
"SubmitInteractionPayload",
|
|
115
|
+
"WireModel",
|
|
116
|
+
"WriteContext",
|
|
117
|
+
]
|