agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +25 -12
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
- ksadk/_build_provenance.json +1 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +179 -63
- ksadk/a2a/space_client.py +6 -333
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +247 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +443 -259
- ksadk/api/client.py +528 -27
- ksadk/builders/code_builder.py +284 -8
- ksadk/builders/container_builder.py +8 -1
- ksadk/builders/managed_runtime_builder.py +42 -35
- ksadk/cli/__init__.py +23 -0
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +10 -2
- ksadk/cli/cmd_eval.py +66 -9
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +1 -126
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +1 -435
- ksadk/cli/cmd_plugin.py +657 -0
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_studio.py +99 -8
- ksadk/cli/cmd_web.py +10 -2
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/codex/client.py +180 -30
- ksadk/codex/runtime.py +475 -331
- ksadk/configs/env_registry.py +94 -12
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +5 -0
- ksadk/configs/settings.py +9 -0
- 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 +409 -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 +19 -0
- ksadk/conversations/context.py +230 -30
- ksadk/conversations/contracts.py +266 -0
- ksadk/conversations/message_projection.py +308 -26
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/projector.py +616 -0
- ksadk/conversations/reducer.py +98 -0
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +184 -2
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +141 -0
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +272 -2
- ksadk/conversations/runtime_resume.py +20 -1
- ksadk/conversations/runtime_stream_events.py +94 -9
- 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 +5 -0
- ksadk/deployment/providers/serverless.py +143 -69
- ksadk/evaluation/__init__.py +32 -0
- ksadk/evaluation/a2a_adapter.py +9 -1
- ksadk/evaluation/adapters.py +18 -5
- 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 +73 -4
- ksadk/evaluation/evaluators.py +183 -17
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +31 -6
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +15 -6
- 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 +755 -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 +907 -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 -265
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +45 -35
- ksadk/harness/runtime.py +220 -58
- 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 +62 -0
- ksadk/kernel/contracts.py +370 -0
- ksadk/kernel/control.py +220 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1123 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1134 -0
- ksadk/kernel/postgres_store.py +1757 -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 +1411 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +964 -0
- ksadk/knowledge_base/client.py +7 -0
- ksadk/knowledge_base/service.py +32 -5
- 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 +384 -2
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- 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 +497 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +188 -6
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +39 -15
- ksadk/model_proxy/server.py +24 -5
- ksadk/model_proxy/transform.py +60 -2
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/plugins/__init__.py +167 -0
- ksadk/plugins/bridges/__init__.py +45 -0
- ksadk/plugins/bridges/codex.py +552 -0
- ksadk/plugins/bridges/dsh.py +1116 -0
- ksadk/plugins/builtins.py +747 -0
- ksadk/plugins/bundle.py +246 -0
- ksadk/plugins/bundle_security.py +167 -0
- ksadk/plugins/composition.py +529 -0
- ksadk/plugins/context_contributor.py +437 -0
- ksadk/plugins/contracts.py +451 -0
- ksadk/plugins/dsh_toolchain.py +935 -0
- ksadk/plugins/ecosystem_bridge.py +1105 -0
- ksadk/plugins/ecosystem_probe.py +191 -0
- ksadk/plugins/host.py +724 -0
- ksadk/plugins/providers/__init__.py +85 -0
- ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
- ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
- ksadk/plugins/providers/codex.py +722 -0
- ksadk/plugins/providers/codex_dsh.py +83 -0
- ksadk/plugins/providers/dsh.py +951 -0
- ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
- ksadk/plugins/providers/harness.py +627 -0
- ksadk/plugins/providers/harness_dsh.py +91 -0
- ksadk/plugins/providers/legacy.py +215 -0
- ksadk/plugins/providers/legacy_catalog.py +100 -0
- ksadk/plugins/providers/shipped_dsh.py +370 -0
- ksadk/plugins/resolver.py +331 -0
- ksadk/plugins/subagent_providers/__init__.py +12 -0
- ksadk/plugins/subagent_providers/codex.py +443 -0
- ksadk/plugins/subagents.py +333 -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 +5 -5
- ksadk/runners/base_runner.py +16 -0
- ksadk/runners/factory.py +1 -2
- ksadk/runners/langgraph_runner.py +198 -437
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +797 -0
- ksadk/runtime/adapter.py +119 -2
- ksadk/runtime/conversation_execution.py +316 -182
- ksadk/runtime/executor.py +144 -3
- ksadk/runtime/factory.py +268 -8
- ksadk/runtime/framework_adapters.py +18 -0
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +14 -1
- ksadk/runtime/preprocessing.py +25 -3
- ksadk/runtime/runner_adapter.py +293 -508
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/__init__.py +2 -1
- ksadk/sandbox/backends/e2b.py +35 -2
- ksadk/sandbox/factory.py +72 -0
- ksadk/scheduler/__init__.py +18 -0
- ksadk/scheduler/calendar.py +102 -0
- ksadk/scheduler/contracts.py +254 -0
- ksadk/scheduler/dispatcher.py +129 -0
- ksadk/scheduler/engine.py +416 -0
- ksadk/scheduler/sqlite_store.py +563 -0
- ksadk/server/composition.py +8 -0
- ksadk/server/factory.py +69 -6
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/openai_compat.py +88 -8
- ksadk/server/routes/projection.py +35 -20
- ksadk/server/routes/run.py +94 -0
- ksadk/server/routes/sessions.py +2 -0
- ksadk/server/routes/streaming.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
- ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
- ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
- ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
- ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
- ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
- ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
- ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
- ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
- ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
- ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
- ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
- ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
- ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
- ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
- ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
- ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
- ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
- ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
- ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
- ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
- ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
- ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
- ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
- ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
- ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
- ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
- ksadk/server/static/assets/index-B2k_urY8.js +241 -0
- ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
- ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
- ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.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/service_client.py +48 -0
- ksadk/studio/agent_lifecycle.py +26 -20
- ksadk/studio/api.py +1063 -69
- ksadk/studio/api_catalog_routes.py +5 -0
- ksadk/studio/api_contracts.py +148 -6
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/api_plugin_routes.py +480 -0
- ksadk/studio/attachment_store.py +187 -0
- ksadk/studio/authoring.py +259 -28
- ksadk/studio/authoring_coordinator.py +809 -67
- ksadk/studio/builder.py +197 -40
- ksadk/studio/capabilities.py +17 -0
- ksadk/studio/cloud.py +1920 -95
- ksadk/studio/codex_agent_service.py +137 -15
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +177 -25
- ksadk/studio/codex_manifest.py +71 -22
- ksadk/studio/codex_run.py +59 -4
- ksadk/studio/compatibility_report.py +445 -0
- ksadk/studio/compiler.py +7 -1
- ksadk/studio/contracts.py +234 -4
- ksadk/studio/dsh_provider_registration.py +768 -0
- ksadk/studio/event_store.py +79 -101
- ksadk/studio/framework_run.py +264 -3
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/model_client.py +95 -9
- ksadk/studio/model_profile_service.py +1 -1
- ksadk/studio/operations.py +47 -5
- ksadk/studio/otel_trace.py +348 -42
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/plugin_composition.py +301 -0
- ksadk/studio/plugin_kernel_adapter.py +128 -0
- ksadk/studio/plugin_runtime.py +652 -0
- ksadk/studio/repository.py +23 -2
- ksadk/studio/resource_catalog.py +49 -1
- ksadk/studio/run_service.py +1266 -202
- ksadk/studio/runtime_source.py +51 -17
- ksadk/studio/scheduler_runtime.py +374 -0
- ksadk/studio/scheduler_service.py +211 -0
- ksadk/studio/service.py +1815 -117
- ksadk/studio/shared_web.py +199 -50
- ksadk/studio/soul.py +52 -0
- ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
- ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/studio/templates.py +100 -8
- ksadk/studio/validator.py +20 -1
- ksadk/studio/workspace.py +31 -32
- ksadk/tracing/setup.py +304 -3
- ksadk/version.py +1 -1
- 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/path_utils.py +41 -0
- ksadk/events/parser.py +0 -191
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
- ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
- ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
- ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-R52pJJvg.js +0 -177
- ksadk/server/static/assets/index-jJr3_955.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
- ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
- ksadk/studio/evaluation.py +0 -192
- ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
- ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
"""Frozen ContextContributor/v1 wire contract and source projections.
|
|
2
|
+
|
|
3
|
+
The wire contract is deliberately read-only. A plugin receives an already
|
|
4
|
+
authenticated scope and a bounded request, then returns provenance-bearing
|
|
5
|
+
fragments. This module validates that exchange before projecting it into the
|
|
6
|
+
existing Context Engine dataclasses; it does not grant filesystem access,
|
|
7
|
+
write memory, mutate prompts, or append SessionEvents.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from typing import Annotated, Any, Literal, cast
|
|
16
|
+
|
|
17
|
+
from pydantic import AwareDatetime, Field, WithJsonSchema, field_validator, model_validator
|
|
18
|
+
|
|
19
|
+
from ksadk.context_engine.contributors import (
|
|
20
|
+
ContextContributionRequest,
|
|
21
|
+
ContributorCapabilities,
|
|
22
|
+
)
|
|
23
|
+
from ksadk.context_engine.models import ContextItem, ContextKind, ContextTrustLevel
|
|
24
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
25
|
+
|
|
26
|
+
ContextClassification = Annotated[
|
|
27
|
+
str,
|
|
28
|
+
WithJsonSchema(
|
|
29
|
+
{
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"maxLength": 64,
|
|
33
|
+
"pattern": "^[a-z][a-z0-9._-]*$",
|
|
34
|
+
"not": {"enum": ["credential", "secret"]},
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
]
|
|
38
|
+
ContextSourceReference = Annotated[
|
|
39
|
+
str,
|
|
40
|
+
WithJsonSchema(
|
|
41
|
+
{
|
|
42
|
+
"type": "string",
|
|
43
|
+
"minLength": 4,
|
|
44
|
+
"maxLength": 2048,
|
|
45
|
+
"pattern": "^[a-z][a-z0-9+.-]*://\\S+$",
|
|
46
|
+
"not": {"pattern": "^(?:credential|env|secret|vault)://"},
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
]
|
|
50
|
+
ContextExpiry = Annotated[
|
|
51
|
+
AwareDatetime,
|
|
52
|
+
WithJsonSchema(
|
|
53
|
+
{
|
|
54
|
+
"type": "string",
|
|
55
|
+
"format": "date-time",
|
|
56
|
+
"pattern": "(?:Z|[+-][0-9]{2}:[0-9]{2})$",
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
ContextContributorCacheability = Literal["stable", "turn", "none"]
|
|
61
|
+
ContextContributorFailureMode = Literal["skip", "warn", "fail"]
|
|
62
|
+
|
|
63
|
+
_CLASSIFICATION = re.compile(r"^[a-z][a-z0-9._-]{0,63}$")
|
|
64
|
+
_CONTRIBUTOR_ID = re.compile(r"^[a-z][a-z0-9._-]{0,127}$")
|
|
65
|
+
_POLICY_REF = re.compile(r"^policy://[^\s@]+@[^\s@]+$")
|
|
66
|
+
_SOURCE_REF = re.compile(r"^[a-z][a-z0-9+.-]*://\S+$")
|
|
67
|
+
_DIGEST = re.compile(r"^sha256:[0-9a-f]{64}$")
|
|
68
|
+
_FORBIDDEN_CLASSIFICATIONS = {"credential", "secret"}
|
|
69
|
+
_FORBIDDEN_SOURCE_SCHEMES = {"credential", "env", "secret", "vault"}
|
|
70
|
+
_SENSITIVE_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
|
|
71
|
+
_SECRET_REF_PREFIXES = ("secret://", "env://", "credential://", "vault://")
|
|
72
|
+
_TRUST_RANK: dict[ContextTrustLevel, int] = {
|
|
73
|
+
"untrusted": 0,
|
|
74
|
+
"user": 1,
|
|
75
|
+
"resource": 2,
|
|
76
|
+
"developer": 3,
|
|
77
|
+
"platform": 4,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _validate_classification(value: str) -> str:
|
|
82
|
+
if not _CLASSIFICATION.fullmatch(value) or value in _FORBIDDEN_CLASSIFICATIONS:
|
|
83
|
+
raise ValueError("classification must be a non-secret qualified name")
|
|
84
|
+
return value
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _validate_secret_references(value: Any, *, path: str) -> None:
|
|
88
|
+
"""Permit secret references in metadata, but never clear secret values."""
|
|
89
|
+
|
|
90
|
+
if isinstance(value, dict):
|
|
91
|
+
for key, child in value.items():
|
|
92
|
+
key_text = str(key)
|
|
93
|
+
child_path = f"{path}.{key_text}"
|
|
94
|
+
if _SENSITIVE_KEY.search(key_text) and child is not None:
|
|
95
|
+
if not isinstance(child, str) or not child.startswith(
|
|
96
|
+
_SECRET_REF_PREFIXES
|
|
97
|
+
):
|
|
98
|
+
raise ValueError(f"{child_path} must contain a secret reference")
|
|
99
|
+
_validate_secret_references(child, path=child_path)
|
|
100
|
+
elif isinstance(value, (list, tuple)):
|
|
101
|
+
for index, child in enumerate(value):
|
|
102
|
+
_validate_secret_references(child, path=f"{path}[{index}]")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class AuthenticatedContextScope(PluginContractModel):
|
|
106
|
+
"""Identity established by the Host before a Contributor is invoked."""
|
|
107
|
+
|
|
108
|
+
authenticated: Literal[True]
|
|
109
|
+
actor_id: str = Field(min_length=1, max_length=256)
|
|
110
|
+
agent_id: str = Field(min_length=1, max_length=256)
|
|
111
|
+
session_id: str = Field(min_length=1, max_length=256)
|
|
112
|
+
turn_id: str = Field(min_length=1, max_length=256)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class ContextContributorCapabilities(PluginContractModel):
|
|
116
|
+
"""Maximum authority and resource envelope granted to one Contributor."""
|
|
117
|
+
|
|
118
|
+
contributor_id: str = Field(
|
|
119
|
+
min_length=1,
|
|
120
|
+
max_length=128,
|
|
121
|
+
pattern=r"^[a-z][a-z0-9._-]*$",
|
|
122
|
+
)
|
|
123
|
+
trust_level: ContextTrustLevel
|
|
124
|
+
max_tokens: int = Field(ge=0)
|
|
125
|
+
timeout_ms: int = Field(ge=1)
|
|
126
|
+
cacheability: ContextContributorCacheability
|
|
127
|
+
failure_mode: ContextContributorFailureMode
|
|
128
|
+
|
|
129
|
+
@field_validator("contributor_id")
|
|
130
|
+
@classmethod
|
|
131
|
+
def validate_contributor_id(cls, value: str) -> str:
|
|
132
|
+
if not _CONTRIBUTOR_ID.fullmatch(value):
|
|
133
|
+
raise ValueError("contributorId must be a lowercase qualified name")
|
|
134
|
+
return value
|
|
135
|
+
|
|
136
|
+
def to_context_engine(self) -> ContributorCapabilities:
|
|
137
|
+
"""Project the frozen wire shape into the installed Context Engine type."""
|
|
138
|
+
|
|
139
|
+
return ContributorCapabilities(
|
|
140
|
+
contributor_id=self.contributor_id,
|
|
141
|
+
trust_level=self.trust_level,
|
|
142
|
+
max_tokens=self.max_tokens,
|
|
143
|
+
timeout_ms=self.timeout_ms,
|
|
144
|
+
cacheability=self.cacheability,
|
|
145
|
+
failure_mode=self.failure_mode,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class ContextContributorRequest(PluginContractModel):
|
|
150
|
+
"""One authenticated, policy-bound and token-bounded read request."""
|
|
151
|
+
|
|
152
|
+
request_format: Literal["ksadk.context-request/v1"]
|
|
153
|
+
scope: AuthenticatedContextScope
|
|
154
|
+
invocation_id: str = Field(min_length=1, max_length=256)
|
|
155
|
+
user_input: str = Field(max_length=131_072)
|
|
156
|
+
workspace_root: str = Field(max_length=4096)
|
|
157
|
+
policy_ref: str = Field(
|
|
158
|
+
min_length=1,
|
|
159
|
+
max_length=512,
|
|
160
|
+
pattern=r"^policy://[^\s@]+@[^\s@]+$",
|
|
161
|
+
)
|
|
162
|
+
remaining_budget: int = Field(ge=0)
|
|
163
|
+
allowed_classifications: tuple[ContextClassification, ...] = Field(
|
|
164
|
+
json_schema_extra={"uniqueItems": True}
|
|
165
|
+
)
|
|
166
|
+
metadata: dict[str, Any]
|
|
167
|
+
|
|
168
|
+
@field_validator("policy_ref")
|
|
169
|
+
@classmethod
|
|
170
|
+
def validate_policy_ref(cls, value: str) -> str:
|
|
171
|
+
if not _POLICY_REF.fullmatch(value):
|
|
172
|
+
raise ValueError("policyRef must be a pinned policy:// reference")
|
|
173
|
+
return value
|
|
174
|
+
|
|
175
|
+
@field_validator("allowed_classifications")
|
|
176
|
+
@classmethod
|
|
177
|
+
def validate_allowed_classifications(
|
|
178
|
+
cls, value: tuple[str, ...]
|
|
179
|
+
) -> tuple[str, ...]:
|
|
180
|
+
normalized = tuple(_validate_classification(item) for item in value)
|
|
181
|
+
if len(normalized) != len(set(normalized)):
|
|
182
|
+
raise ValueError("allowedClassifications must be unique")
|
|
183
|
+
return tuple(sorted(normalized))
|
|
184
|
+
|
|
185
|
+
@field_validator("metadata")
|
|
186
|
+
@classmethod
|
|
187
|
+
def validate_metadata(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
188
|
+
_validate_secret_references(value, path="request.metadata")
|
|
189
|
+
return value
|
|
190
|
+
|
|
191
|
+
def to_context_engine(self) -> ContextContributionRequest:
|
|
192
|
+
"""Project scope and policy facts without losing their wire identity."""
|
|
193
|
+
|
|
194
|
+
return ContextContributionRequest(
|
|
195
|
+
user_input=self.user_input,
|
|
196
|
+
session_id=self.scope.session_id,
|
|
197
|
+
invocation_id=self.invocation_id,
|
|
198
|
+
workspace_root=self.workspace_root,
|
|
199
|
+
user_id=self.scope.actor_id,
|
|
200
|
+
agent_id=self.scope.agent_id,
|
|
201
|
+
metadata={
|
|
202
|
+
**self.metadata,
|
|
203
|
+
"authenticated_scope": self.scope.model_dump(
|
|
204
|
+
by_alias=True, mode="json"
|
|
205
|
+
),
|
|
206
|
+
"turn_id": self.scope.turn_id,
|
|
207
|
+
"policy_ref": self.policy_ref,
|
|
208
|
+
"remaining_budget": self.remaining_budget,
|
|
209
|
+
"allowed_classifications": list(self.allowed_classifications),
|
|
210
|
+
},
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class ContextFragment(PluginContractModel):
|
|
215
|
+
"""One read-only, attributed Context candidate returned by a plugin."""
|
|
216
|
+
|
|
217
|
+
fragment_format: Literal["ksadk.context-fragment/v1"]
|
|
218
|
+
item_id: str = Field(min_length=1, max_length=256)
|
|
219
|
+
kind: ContextKind
|
|
220
|
+
content: Any
|
|
221
|
+
source_refs: tuple[ContextSourceReference, ...] = Field(
|
|
222
|
+
min_length=1,
|
|
223
|
+
json_schema_extra={"uniqueItems": True},
|
|
224
|
+
)
|
|
225
|
+
classification: ContextClassification
|
|
226
|
+
expires_at: ContextExpiry | None
|
|
227
|
+
token_estimate: int = Field(ge=0)
|
|
228
|
+
trust_level: ContextTrustLevel
|
|
229
|
+
priority: int
|
|
230
|
+
required: Literal[False]
|
|
231
|
+
droppable: bool
|
|
232
|
+
truncatable: bool
|
|
233
|
+
stable: bool
|
|
234
|
+
group_id: str | None = Field(max_length=256)
|
|
235
|
+
seq_start: int | None = Field(ge=0)
|
|
236
|
+
seq_end: int | None = Field(ge=0)
|
|
237
|
+
score: float | None
|
|
238
|
+
content_hash: Annotated[
|
|
239
|
+
str,
|
|
240
|
+
Field(pattern=r"^sha256:[0-9a-f]{64}$", max_length=71),
|
|
241
|
+
] | None
|
|
242
|
+
metadata: dict[str, Any]
|
|
243
|
+
|
|
244
|
+
@field_validator("content")
|
|
245
|
+
@classmethod
|
|
246
|
+
def validate_content(cls, value: Any) -> Any:
|
|
247
|
+
# Structured context is subject to the same secret-reference rule as
|
|
248
|
+
# metadata. A Contributor cannot bypass admission by moving a clear
|
|
249
|
+
# credential from ``metadata`` into a JSON-shaped ``content`` value.
|
|
250
|
+
_validate_secret_references(value, path="fragment.content")
|
|
251
|
+
return value
|
|
252
|
+
|
|
253
|
+
@field_validator("source_refs")
|
|
254
|
+
@classmethod
|
|
255
|
+
def validate_source_refs(cls, value: tuple[str, ...]) -> tuple[str, ...]:
|
|
256
|
+
if len(value) != len(set(value)):
|
|
257
|
+
raise ValueError("sourceRefs must be unique")
|
|
258
|
+
for source_ref in value:
|
|
259
|
+
if not _SOURCE_REF.fullmatch(source_ref):
|
|
260
|
+
raise ValueError("sourceRefs must be absolute URI-like references")
|
|
261
|
+
scheme, location = source_ref.split("://", 1)
|
|
262
|
+
if scheme in _FORBIDDEN_SOURCE_SCHEMES:
|
|
263
|
+
raise ValueError("sourceRefs cannot point at secret material")
|
|
264
|
+
authority = location.split("/", 1)[0]
|
|
265
|
+
if "@" in authority:
|
|
266
|
+
raise ValueError("sourceRefs cannot contain embedded credentials")
|
|
267
|
+
return tuple(sorted(value))
|
|
268
|
+
|
|
269
|
+
@field_validator("classification")
|
|
270
|
+
@classmethod
|
|
271
|
+
def validate_classification(cls, value: str) -> str:
|
|
272
|
+
return _validate_classification(value)
|
|
273
|
+
|
|
274
|
+
@field_validator("expires_at")
|
|
275
|
+
@classmethod
|
|
276
|
+
def validate_expires_at(cls, value: datetime | None) -> datetime | None:
|
|
277
|
+
if value is not None and (value.tzinfo is None or value.utcoffset() is None):
|
|
278
|
+
raise ValueError("expiresAt must include a timezone")
|
|
279
|
+
return value
|
|
280
|
+
|
|
281
|
+
@field_validator("content_hash")
|
|
282
|
+
@classmethod
|
|
283
|
+
def validate_content_hash(cls, value: str | None) -> str | None:
|
|
284
|
+
if value is not None and not _DIGEST.fullmatch(value):
|
|
285
|
+
raise ValueError("contentHash must be a lowercase sha256: digest")
|
|
286
|
+
return value
|
|
287
|
+
|
|
288
|
+
@field_validator("metadata")
|
|
289
|
+
@classmethod
|
|
290
|
+
def validate_metadata(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
291
|
+
_validate_secret_references(value, path="fragment.metadata")
|
|
292
|
+
return value
|
|
293
|
+
|
|
294
|
+
@model_validator(mode="after")
|
|
295
|
+
def validate_sequence_range(self) -> "ContextFragment":
|
|
296
|
+
if (self.seq_start is None) != (self.seq_end is None):
|
|
297
|
+
raise ValueError("seqStart and seqEnd must be supplied together")
|
|
298
|
+
if (
|
|
299
|
+
self.seq_start is not None
|
|
300
|
+
and self.seq_end is not None
|
|
301
|
+
and self.seq_end < self.seq_start
|
|
302
|
+
):
|
|
303
|
+
raise ValueError("seqEnd cannot precede seqStart")
|
|
304
|
+
return self
|
|
305
|
+
|
|
306
|
+
def to_context_engine(self) -> ContextItem:
|
|
307
|
+
"""Project one already-admitted fragment into a Context Engine item."""
|
|
308
|
+
|
|
309
|
+
expires_at = (
|
|
310
|
+
self.model_dump(by_alias=True, mode="json")["expiresAt"]
|
|
311
|
+
if self.expires_at is not None
|
|
312
|
+
else None
|
|
313
|
+
)
|
|
314
|
+
return ContextItem(
|
|
315
|
+
item_id=self.item_id,
|
|
316
|
+
kind=self.kind,
|
|
317
|
+
content=self.content,
|
|
318
|
+
source=self.source_refs[0],
|
|
319
|
+
trust_level=self.trust_level,
|
|
320
|
+
priority=self.priority,
|
|
321
|
+
estimated_tokens=self.token_estimate,
|
|
322
|
+
required=False,
|
|
323
|
+
droppable=self.droppable,
|
|
324
|
+
truncatable=self.truncatable,
|
|
325
|
+
stable=self.stable,
|
|
326
|
+
group_id=self.group_id,
|
|
327
|
+
seq_start=self.seq_start,
|
|
328
|
+
seq_end=self.seq_end,
|
|
329
|
+
score=self.score,
|
|
330
|
+
content_hash=self.content_hash,
|
|
331
|
+
provenance={
|
|
332
|
+
"source_refs": list(self.source_refs),
|
|
333
|
+
"classification": self.classification,
|
|
334
|
+
"expires_at": expires_at,
|
|
335
|
+
},
|
|
336
|
+
metadata=dict(self.metadata),
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class ContextContributorResponse(PluginContractModel):
|
|
341
|
+
"""Ordered fragments returned for one request."""
|
|
342
|
+
|
|
343
|
+
response_format: Literal["ksadk.context-response/v1"]
|
|
344
|
+
fragments: tuple[ContextFragment, ...]
|
|
345
|
+
|
|
346
|
+
@model_validator(mode="after")
|
|
347
|
+
def validate_unique_item_ids(self) -> "ContextContributorResponse":
|
|
348
|
+
item_ids = [fragment.item_id for fragment in self.fragments]
|
|
349
|
+
if len(item_ids) != len(set(item_ids)):
|
|
350
|
+
raise ValueError("ContextFragment item identity must be unique")
|
|
351
|
+
return self
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
@dataclass(frozen=True)
|
|
355
|
+
class ProjectedContextContribution:
|
|
356
|
+
"""Typed bridge into the pre-existing Context Engine source contracts."""
|
|
357
|
+
|
|
358
|
+
capabilities: ContributorCapabilities
|
|
359
|
+
request: ContextContributionRequest
|
|
360
|
+
items: tuple[ContextItem, ...]
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
class ContextContributorExchange(PluginContractModel):
|
|
364
|
+
"""Complete golden exchange used by hosts and cross-language conformance."""
|
|
365
|
+
|
|
366
|
+
contract_format: Literal["ksadk.context-contributor/v1"]
|
|
367
|
+
capabilities: ContextContributorCapabilities
|
|
368
|
+
request: ContextContributorRequest
|
|
369
|
+
response: ContextContributorResponse
|
|
370
|
+
|
|
371
|
+
@model_validator(mode="after")
|
|
372
|
+
def validate_admission_bounds(self) -> "ContextContributorExchange":
|
|
373
|
+
allowed = set(self.request.allowed_classifications)
|
|
374
|
+
maximum_trust = _TRUST_RANK[self.capabilities.trust_level]
|
|
375
|
+
token_ceiling = min(
|
|
376
|
+
self.capabilities.max_tokens,
|
|
377
|
+
self.request.remaining_budget,
|
|
378
|
+
)
|
|
379
|
+
used_tokens = 0
|
|
380
|
+
for fragment in self.response.fragments:
|
|
381
|
+
if fragment.classification not in allowed:
|
|
382
|
+
raise ValueError("ContextFragment classification is not allowed")
|
|
383
|
+
if _TRUST_RANK[fragment.trust_level] > maximum_trust:
|
|
384
|
+
raise ValueError("ContextFragment cannot elevate contributor trust")
|
|
385
|
+
used_tokens += fragment.token_estimate
|
|
386
|
+
if used_tokens > token_ceiling:
|
|
387
|
+
raise ValueError(
|
|
388
|
+
"ContextFragment token estimate exceeds the effective remaining budget"
|
|
389
|
+
)
|
|
390
|
+
return self
|
|
391
|
+
|
|
392
|
+
def project(
|
|
393
|
+
self,
|
|
394
|
+
*,
|
|
395
|
+
now: datetime | None = None,
|
|
396
|
+
) -> ProjectedContextContribution:
|
|
397
|
+
"""Validate expiry and project the admitted response into engine types."""
|
|
398
|
+
|
|
399
|
+
current = now or datetime.now(timezone.utc)
|
|
400
|
+
if current.tzinfo is None or current.utcoffset() is None:
|
|
401
|
+
raise ValueError("projection time must include a timezone")
|
|
402
|
+
for fragment in self.response.fragments:
|
|
403
|
+
if fragment.expires_at is not None and fragment.expires_at <= current:
|
|
404
|
+
raise ValueError(f"ContextFragment {fragment.item_id} has expired")
|
|
405
|
+
return ProjectedContextContribution(
|
|
406
|
+
capabilities=self.capabilities.to_context_engine(),
|
|
407
|
+
request=self.request.to_context_engine(),
|
|
408
|
+
items=tuple(fragment.to_context_engine() for fragment in self.response.fragments),
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def context_contributor_json_schema() -> dict[str, Any]:
|
|
413
|
+
"""Return the canonical Draft 2020-12 source projection for export gates."""
|
|
414
|
+
|
|
415
|
+
schema = ContextContributorExchange.model_json_schema(by_alias=True)
|
|
416
|
+
schema["$schema"] = "https://json-schema.org/draft/2020-12/schema"
|
|
417
|
+
schema["$id"] = (
|
|
418
|
+
"https://ksadk.local/contracts/plugin/v1/context-contributor.schema.json"
|
|
419
|
+
)
|
|
420
|
+
schema["title"] = "ContextContributor/v1 exchange"
|
|
421
|
+
return cast(dict[str, Any], schema)
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
__all__ = [
|
|
425
|
+
"AuthenticatedContextScope",
|
|
426
|
+
"ContextClassification",
|
|
427
|
+
"ContextContributorCacheability",
|
|
428
|
+
"ContextContributorCapabilities",
|
|
429
|
+
"ContextContributorExchange",
|
|
430
|
+
"ContextContributorFailureMode",
|
|
431
|
+
"ContextContributorRequest",
|
|
432
|
+
"ContextContributorResponse",
|
|
433
|
+
"ContextFragment",
|
|
434
|
+
"ContextSourceReference",
|
|
435
|
+
"ProjectedContextContribution",
|
|
436
|
+
"context_contributor_json_schema",
|
|
437
|
+
]
|