agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
- agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
- ksadk/a2a/__init__.py +178 -11
- ksadk/a2a/bootstrap.py +334 -0
- ksadk/a2a/card.py +120 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +818 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +406 -89
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +105 -0
- ksadk/a2a/server.py +107 -60
- ksadk/a2a/space_client.py +1101 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +857 -0
- ksadk/agui/config.py +86 -0
- ksadk/agui/routes.py +55 -0
- ksadk/api/client.py +233 -191
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +318 -236
- ksadk/builders/container_builder.py +187 -167
- ksadk/builders/framework_requirements.py +29 -11
- ksadk/builders/ks3_uploader.py +58 -27
- ksadk/builders/managed_runtime_builder.py +145 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +89 -171
- ksadk/cli/cmd_a2a.py +254 -70
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +500 -720
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +117 -58
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +168 -89
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +64 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +483 -227
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +33 -10
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +89 -13
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +5 -3
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +1 -2
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +34 -14
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +5 -3
- ksadk/cli/workflow_common.py +51 -17
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +408 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +449 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -12
- ksadk/configs/env_registry.py +500 -100
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +151 -124
- ksadk/conversations/__init__.py +7 -5
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +652 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +355 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +418 -0
- ksadk/conversations/runtime_resume.py +816 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +547 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/manager.py +63 -65
- ksadk/deployment/providers/serverless.py +309 -202
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +264 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +34 -0
- ksadk/harness/app.py +278 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runner.py +211 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +23 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +23 -29
- ksadk/managed_runtime.py +188 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
- ksadk/memory/adk/long_term_memory.py +31 -35
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +10 -8
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +45 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +173 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +300 -0
- ksadk/model_proxy/transform.py +691 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +345 -120
- ksadk/runners/base_runner.py +46 -29
- ksadk/runners/codex_runner.py +132 -0
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +17 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +352 -90
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/langfuse.py +3 -3
- ksadk/runners/utils/loader.py +7 -7
- ksadk/runtime/__init__.py +41 -0
- ksadk/runtime/adapter.py +345 -0
- ksadk/runtime/framework_adapters.py +124 -0
- ksadk/runtime/preprocessing.py +118 -0
- ksadk/runtime/runner_adapter.py +873 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +455 -3885
- ksadk/server/composition.py +21 -0
- ksadk/server/factory.py +624 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +713 -0
- ksadk/server/routes/control.py +327 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +448 -0
- ksadk/server/routes/models.py +443 -0
- ksadk/server/routes/openai_compat.py +207 -0
- ksadk/server/routes/projection.py +795 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +726 -0
- ksadk/server/routes/sessions.py +649 -0
- ksadk/server/routes/streaming.py +223 -0
- ksadk/server/routes/workspace.py +381 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
- ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
- ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
- ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +38 -17
- ksadk/skills/tool_defs.py +15 -10
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +92 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +134 -36
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/exporters/langfuse_exporter.py +91 -76
- ksadk/tracing/setup.py +69 -53
- ksadk/tracing/span_utils.py +5 -2
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/builders/mcp_builder.py
CHANGED
|
@@ -10,66 +10,69 @@ import os
|
|
|
10
10
|
import shutil
|
|
11
11
|
import subprocess
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import List
|
|
13
|
+
from typing import List, Optional
|
|
14
14
|
|
|
15
15
|
import click
|
|
16
16
|
|
|
17
|
-
from ksadk.builders.code_builder import CodeBuilder
|
|
18
17
|
from ksadk.builders.base import BuildResult
|
|
18
|
+
from ksadk.builders.code_builder import CodeBuilder
|
|
19
19
|
from ksadk.builders.container_builder import ContainerBuilder, ensure_docker_running
|
|
20
20
|
from ksadk.builders.requirements_utils import merge_requirement_lists, parse_requirements_text
|
|
21
|
-
from ksadk.detection.mcp_detector import
|
|
21
|
+
from ksadk.detection.mcp_detector import MCPDetectionResult, MCPDetector
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class MCPCodeBuilder(CodeBuilder):
|
|
25
25
|
"""MCP 代码构建器"""
|
|
26
|
-
|
|
27
|
-
def __init__(self, project_dir: Path, config: dict = None):
|
|
26
|
+
|
|
27
|
+
def __init__(self, project_dir: Path, config: Optional[dict] = None):
|
|
28
28
|
super().__init__(project_dir, config)
|
|
29
29
|
self.build_dir = self.project_dir / ".agentengine" / "mcp_build"
|
|
30
30
|
self.deps_dir = self.build_dir / "linux_deps"
|
|
31
|
-
self._mcp_detection: MCPDetectionResult = None
|
|
32
|
-
|
|
31
|
+
self._mcp_detection: Optional[MCPDetectionResult] = None
|
|
32
|
+
|
|
33
33
|
def build(self) -> BuildResult:
|
|
34
34
|
"""执行 MCP 构建"""
|
|
35
35
|
self._load_dotenv()
|
|
36
36
|
config = self._load_config()
|
|
37
|
-
|
|
37
|
+
|
|
38
38
|
# 检测 MCP 项目
|
|
39
39
|
detector = MCPDetector(str(self.project_dir))
|
|
40
40
|
detection_result = detector.detect()
|
|
41
41
|
self._mcp_detection = detection_result
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
if not detection_result.is_valid:
|
|
44
|
-
return BuildResult(
|
|
45
|
-
|
|
46
|
-
error_message="未检测到 FastMCP 项目"
|
|
47
|
-
)
|
|
48
|
-
|
|
44
|
+
return BuildResult(success=False, error_message="未检测到 FastMCP 项目")
|
|
45
|
+
|
|
49
46
|
click.echo(f"📦 MCP Server: {click.style(detection_result.name, fg='green')}")
|
|
50
47
|
if detection_result.tools:
|
|
51
48
|
click.echo(f" 工具: {', '.join(detection_result.tools[:5])}")
|
|
52
49
|
if len(detection_result.tools) > 5:
|
|
53
50
|
click.echo(f" ... 及其他 {len(detection_result.tools) - 5} 个")
|
|
54
|
-
|
|
55
|
-
mcp_name = config.get(
|
|
56
|
-
|
|
51
|
+
|
|
52
|
+
mcp_name = config.get("name", self.project_dir.name).replace("-", "_").replace(".", "_")
|
|
53
|
+
|
|
57
54
|
# 创建构建目录
|
|
58
55
|
self.build_dir.mkdir(parents=True, exist_ok=True)
|
|
59
56
|
zip_path = self.build_dir / f"{mcp_name}.zip"
|
|
60
|
-
|
|
57
|
+
|
|
61
58
|
# 检查是否需要重新构建
|
|
62
59
|
no_cache = self.config.get("no_cache", False) if self.config else False
|
|
63
|
-
if
|
|
60
|
+
if (
|
|
61
|
+
zip_path.exists()
|
|
62
|
+
and not no_cache
|
|
63
|
+
and not self._need_rebuild(zip_path, detection_result)
|
|
64
|
+
):
|
|
64
65
|
incompatibles = self._scan_incompatible_binaries_in_zip(zip_path)
|
|
65
66
|
if incompatibles:
|
|
66
|
-
click.secho(
|
|
67
|
+
click.secho(
|
|
68
|
+
"\n⚠️ 检测到缓存 MCP 构建包含非 Linux 兼容关键二进制,自动重建...", fg="yellow"
|
|
69
|
+
)
|
|
67
70
|
for item in incompatibles[:5]:
|
|
68
71
|
click.echo(f" - {item}")
|
|
69
72
|
else:
|
|
70
73
|
self._save_input_fingerprint(zip_path, detection_result)
|
|
71
74
|
zip_size = zip_path.stat().st_size / (1024 * 1024)
|
|
72
|
-
click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg=
|
|
75
|
+
click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg="green")
|
|
73
76
|
return BuildResult(
|
|
74
77
|
success=True,
|
|
75
78
|
artifact_path=zip_path,
|
|
@@ -77,36 +80,34 @@ class MCPCodeBuilder(CodeBuilder):
|
|
|
77
80
|
metadata={
|
|
78
81
|
"mcp_name": mcp_name,
|
|
79
82
|
"mcp_variable": detection_result.mcp_variable,
|
|
80
|
-
"tools": detection_result.tools
|
|
81
|
-
}
|
|
83
|
+
"tools": detection_result.tools,
|
|
84
|
+
},
|
|
82
85
|
)
|
|
83
|
-
|
|
86
|
+
|
|
84
87
|
# Step 1: 准备依赖
|
|
85
88
|
click.echo("\n📋 Step 1/3: 准备依赖清单...")
|
|
86
89
|
requirements_path = self._prepare_mcp_requirements(detection_result)
|
|
87
|
-
|
|
90
|
+
|
|
88
91
|
# Step 2: 安装依赖(在 Mac 上安装后自动替换为 Linux 二进制,和 agent code 模式一致)
|
|
89
92
|
click.echo("\n📦 Step 2/3: 安装依赖...")
|
|
90
93
|
if self.deps_dir.exists():
|
|
91
94
|
import shutil
|
|
95
|
+
|
|
92
96
|
shutil.rmtree(self.deps_dir)
|
|
93
97
|
self.deps_dir.mkdir(parents=True)
|
|
94
|
-
|
|
98
|
+
|
|
95
99
|
if not self._install_dependencies(requirements_path):
|
|
96
|
-
return BuildResult(
|
|
97
|
-
|
|
98
|
-
error_message="依赖安装失败"
|
|
99
|
-
)
|
|
100
|
-
|
|
100
|
+
return BuildResult(success=False, error_message="依赖安装失败")
|
|
101
|
+
|
|
101
102
|
# Step 3: 打包
|
|
102
103
|
click.echo("\n📦 Step 3/3: 打包 zip...")
|
|
103
104
|
self._package_mcp_zip(zip_path, detection_result)
|
|
104
105
|
self._save_input_fingerprint(zip_path, detection_result)
|
|
105
|
-
|
|
106
|
+
|
|
106
107
|
zip_size = zip_path.stat().st_size
|
|
107
108
|
click.echo(f" zip 文件: {zip_path}")
|
|
108
109
|
click.echo(f" 大小: {zip_size / (1024 * 1024):.2f} MB")
|
|
109
|
-
|
|
110
|
+
|
|
110
111
|
return BuildResult(
|
|
111
112
|
success=True,
|
|
112
113
|
artifact_path=zip_path,
|
|
@@ -115,33 +116,33 @@ class MCPCodeBuilder(CodeBuilder):
|
|
|
115
116
|
"mcp_name": mcp_name,
|
|
116
117
|
"mcp_variable": detection_result.mcp_variable,
|
|
117
118
|
"tools": detection_result.tools,
|
|
118
|
-
"deps_dir": str(self.deps_dir)
|
|
119
|
-
}
|
|
119
|
+
"deps_dir": str(self.deps_dir),
|
|
120
|
+
},
|
|
120
121
|
)
|
|
121
|
-
|
|
122
|
+
|
|
122
123
|
def _prepare_mcp_requirements(self, detection_result: MCPDetectionResult) -> Path:
|
|
123
124
|
"""准备 MCP 依赖"""
|
|
124
125
|
base_deps = self._get_mcp_base_requirements()
|
|
125
126
|
final_deps = list(base_deps)
|
|
126
|
-
|
|
127
|
+
|
|
127
128
|
# 合并用户依赖
|
|
128
129
|
user_requirements = self.project_dir / "requirements.txt"
|
|
129
130
|
if user_requirements.exists():
|
|
130
|
-
click.echo(
|
|
131
|
+
click.echo(" 发现 requirements.txt,正在合并...")
|
|
131
132
|
user_content = user_requirements.read_text()
|
|
132
133
|
user_deps = parse_requirements_text(user_content)
|
|
133
134
|
final_deps = merge_requirement_lists(final_deps, user_deps)
|
|
134
135
|
else:
|
|
135
|
-
click.echo(
|
|
136
|
-
|
|
136
|
+
click.echo(" 使用默认 MCP 依赖")
|
|
137
|
+
|
|
137
138
|
# 写入构建目录
|
|
138
139
|
requirements_path = self.build_dir / "requirements.txt"
|
|
139
140
|
requirements_path.write_text("\n".join(final_deps))
|
|
140
|
-
|
|
141
|
+
|
|
141
142
|
click.echo(f" 共 {len(final_deps)} 个依赖包")
|
|
142
|
-
|
|
143
|
+
|
|
143
144
|
return requirements_path
|
|
144
|
-
|
|
145
|
+
|
|
145
146
|
def _get_mcp_base_requirements(self) -> List[str]:
|
|
146
147
|
"""MCP 基础依赖"""
|
|
147
148
|
return [
|
|
@@ -154,40 +155,38 @@ class MCPCodeBuilder(CodeBuilder):
|
|
|
154
155
|
"python-dotenv>=1.0.0",
|
|
155
156
|
"pydantic>=2.0.0",
|
|
156
157
|
]
|
|
157
|
-
|
|
158
|
+
|
|
158
159
|
def _package_mcp_zip(self, zip_path: Path, detection_result: MCPDetectionResult) -> None:
|
|
159
160
|
"""打包 MCP zip"""
|
|
160
161
|
import zipfile
|
|
161
|
-
|
|
162
|
+
|
|
162
163
|
file_count = 0
|
|
163
|
-
|
|
164
|
-
with zipfile.ZipFile(zip_path,
|
|
164
|
+
|
|
165
|
+
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
|
165
166
|
# 添加项目文件
|
|
166
167
|
for file_path in self._iter_project_files():
|
|
167
168
|
arcname = file_path.relative_to(self.project_dir).as_posix()
|
|
168
169
|
zf.write(file_path, arcname)
|
|
169
170
|
file_count += 1
|
|
170
|
-
|
|
171
|
+
|
|
171
172
|
# 添加依赖(已替换为 Linux 二进制)
|
|
172
173
|
deps_count = 0
|
|
173
|
-
for file_path in self.deps_dir.rglob(
|
|
174
|
+
for file_path in self.deps_dir.rglob("*"):
|
|
174
175
|
if file_path.is_file():
|
|
175
176
|
arcname = str(file_path.relative_to(self.deps_dir))
|
|
176
177
|
zf.write(file_path, arcname)
|
|
177
178
|
deps_count += 1
|
|
178
|
-
|
|
179
|
+
|
|
179
180
|
# 生成 MCP entrypoint
|
|
180
181
|
entrypoint_content = self._generate_mcp_entrypoint(detection_result)
|
|
181
182
|
zf.writestr("entrypoint.py", entrypoint_content)
|
|
182
|
-
|
|
183
|
+
|
|
183
184
|
click.echo(f" ✓ 打包完成: {file_count} 个项目文件 + {deps_count} 个依赖文件")
|
|
184
|
-
|
|
185
|
+
|
|
185
186
|
def _generate_mcp_entrypoint(self, detection_result: MCPDetectionResult) -> str:
|
|
186
187
|
"""生成 MCP 入口脚本"""
|
|
187
188
|
# 确定包名
|
|
188
189
|
entry_point = detection_result.entry_point
|
|
189
|
-
package_path = Path(detection_result.package_path)
|
|
190
|
-
|
|
191
190
|
# 计算模块路径
|
|
192
191
|
if "/" in entry_point:
|
|
193
192
|
# 如果入口在子目录,如 my_mcp/server.py
|
|
@@ -195,9 +194,9 @@ class MCPCodeBuilder(CodeBuilder):
|
|
|
195
194
|
else:
|
|
196
195
|
# 根目录
|
|
197
196
|
module_path = entry_point.replace(".py", "")
|
|
198
|
-
|
|
197
|
+
|
|
199
198
|
mcp_variable = detection_result.mcp_variable
|
|
200
|
-
|
|
199
|
+
|
|
201
200
|
return f'''"""
|
|
202
201
|
AgentEngine MCP 入口
|
|
203
202
|
|
|
@@ -244,15 +243,20 @@ except ImportError:
|
|
|
244
243
|
from {module_path} import {mcp_variable}
|
|
245
244
|
|
|
246
245
|
logger.info(f"MCP 实例: {mcp_variable}")
|
|
247
|
-
|
|
246
|
+
tool_count = (
|
|
247
|
+
len(getattr({mcp_variable}, "_tool_manager", {{}}).list_tools())
|
|
248
|
+
if hasattr({mcp_variable}, "_tool_manager")
|
|
249
|
+
else "N/A"
|
|
250
|
+
)
|
|
251
|
+
logger.info(f"工具数量: {{tool_count}}")
|
|
248
252
|
|
|
249
253
|
if __name__ == "__main__":
|
|
250
254
|
port = int(os.environ.get("PORT", 8080))
|
|
251
255
|
host = os.environ.get("HOST", "0.0.0.0")
|
|
252
|
-
|
|
256
|
+
|
|
253
257
|
logger.info(f"启动 HTTP Server: {{host}}:{{port}}")
|
|
254
258
|
logger.info("MCP endpoint: /mcp")
|
|
255
|
-
|
|
259
|
+
|
|
256
260
|
{mcp_variable}.run(
|
|
257
261
|
transport="http",
|
|
258
262
|
host=host,
|
|
@@ -264,8 +268,14 @@ if __name__ == "__main__":
|
|
|
264
268
|
class MCPContainerBuilder(ContainerBuilder):
|
|
265
269
|
"""FastMCP Docker 镜像构建器。"""
|
|
266
270
|
|
|
267
|
-
def __init__(
|
|
268
|
-
|
|
271
|
+
def __init__(
|
|
272
|
+
self,
|
|
273
|
+
project_dir: Path,
|
|
274
|
+
config: Optional[dict] = None,
|
|
275
|
+
tag: Optional[str] = None,
|
|
276
|
+
registry: Optional[str] = None,
|
|
277
|
+
no_cache: bool = False,
|
|
278
|
+
):
|
|
269
279
|
super().__init__(project_dir, config=config, tag=tag, registry=registry, no_cache=no_cache)
|
|
270
280
|
|
|
271
281
|
def build(self) -> BuildResult:
|
|
@@ -277,28 +287,25 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
277
287
|
result = detector.detect()
|
|
278
288
|
|
|
279
289
|
if not result.is_valid:
|
|
280
|
-
return BuildResult(
|
|
281
|
-
success=False,
|
|
282
|
-
error_message="未检测到 FastMCP 项目"
|
|
283
|
-
)
|
|
290
|
+
return BuildResult(success=False, error_message="未检测到 FastMCP 项目")
|
|
284
291
|
|
|
285
292
|
click.echo(f"📦 MCP Server: {click.style(result.name, fg='green')}")
|
|
286
293
|
|
|
287
|
-
image_name = config.get(
|
|
294
|
+
image_name = config.get("name", self.project_dir.name).replace("-", "_").replace(".", "_")
|
|
288
295
|
|
|
289
296
|
image_tag = self.tag
|
|
290
297
|
if not image_tag:
|
|
291
|
-
image_tag = config.get(
|
|
298
|
+
image_tag = config.get("version", "")
|
|
292
299
|
if not image_tag:
|
|
293
|
-
image_tag = config.get(
|
|
300
|
+
image_tag = config.get("image", {}).get("tag", "latest")
|
|
294
301
|
|
|
295
302
|
image_registry = self.registry
|
|
296
303
|
if not image_registry:
|
|
297
|
-
image_registry = os.getenv(
|
|
304
|
+
image_registry = os.getenv("KCR_REGISTRY", "")
|
|
298
305
|
if not image_registry:
|
|
299
|
-
image_registry = config.get(
|
|
306
|
+
image_registry = config.get("image", {}).get("registry", "")
|
|
300
307
|
if not image_registry:
|
|
301
|
-
image_registry = self._get_smart_kcr_endpoint(os.getenv(
|
|
308
|
+
image_registry = self._get_smart_kcr_endpoint(os.getenv("KSYUN_REGION", "cn-beijing-6"))
|
|
302
309
|
else:
|
|
303
310
|
image_registry = self._optimize_kcr_endpoint(image_registry)
|
|
304
311
|
|
|
@@ -310,22 +317,16 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
310
317
|
package_info = self._package_mcp_project(result)
|
|
311
318
|
click.echo("✅ 打包完成")
|
|
312
319
|
except Exception as e:
|
|
313
|
-
return BuildResult(
|
|
314
|
-
success=False,
|
|
315
|
-
error_message=f"打包失败: {e}"
|
|
316
|
-
)
|
|
320
|
+
return BuildResult(success=False, error_message=f"打包失败: {e}")
|
|
317
321
|
|
|
318
322
|
if not ensure_docker_running():
|
|
319
|
-
return BuildResult(
|
|
320
|
-
success=False,
|
|
321
|
-
error_message="Docker 未运行"
|
|
322
|
-
)
|
|
323
|
+
return BuildResult(success=False, error_message="Docker 未运行")
|
|
323
324
|
|
|
324
325
|
click.echo("\n🔨 构建 Docker 镜像 (目标平台: linux/amd64)...")
|
|
325
326
|
try:
|
|
326
|
-
cmd = [
|
|
327
|
+
cmd = ["docker", "build", "--platform", "linux/amd64", "-t", full_image]
|
|
327
328
|
if self.no_cache:
|
|
328
|
-
cmd.append(
|
|
329
|
+
cmd.append("--no-cache")
|
|
329
330
|
cmd.append(package_info.build_dir)
|
|
330
331
|
|
|
331
332
|
quiet_mode = os.getenv("AGENTENGINE_OUTPUT_MODE", "").strip().lower() == "json"
|
|
@@ -335,7 +336,7 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
335
336
|
capture_output=quiet_mode,
|
|
336
337
|
text=quiet_mode,
|
|
337
338
|
)
|
|
338
|
-
click.secho(f"\n✅ 镜像构建成功: {full_image}", fg=
|
|
339
|
+
click.secho(f"\n✅ 镜像构建成功: {full_image}", fg="green")
|
|
339
340
|
|
|
340
341
|
return BuildResult(
|
|
341
342
|
success=True,
|
|
@@ -346,7 +347,7 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
346
347
|
"build_dir": package_info.build_dir,
|
|
347
348
|
"mcp_variable": result.mcp_variable,
|
|
348
349
|
"tools": result.tools,
|
|
349
|
-
}
|
|
350
|
+
},
|
|
350
351
|
)
|
|
351
352
|
except subprocess.CalledProcessError as e:
|
|
352
353
|
error_message = f"镜像构建失败: {e}"
|
|
@@ -356,10 +357,7 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
356
357
|
detail = stderr or stdout
|
|
357
358
|
if detail:
|
|
358
359
|
error_message = f"{error_message}: {detail}"
|
|
359
|
-
return BuildResult(
|
|
360
|
-
success=False,
|
|
361
|
-
error_message=error_message
|
|
362
|
-
)
|
|
360
|
+
return BuildResult(success=False, error_message=error_message)
|
|
363
361
|
|
|
364
362
|
def _package_mcp_project(self, detection_result: MCPDetectionResult):
|
|
365
363
|
"""复制项目并生成 FastMCP 容器运行所需文件。"""
|
|
@@ -372,16 +370,17 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
372
370
|
for item in project_path.iterdir():
|
|
373
371
|
if CodeBuilder._is_real_dotenv_file(item.name):
|
|
374
372
|
continue
|
|
375
|
-
if (
|
|
376
|
-
|
|
377
|
-
|
|
373
|
+
if (item.name.startswith(".") and item.name != ".env.example") or item.name in (
|
|
374
|
+
"__pycache__",
|
|
375
|
+
".git",
|
|
376
|
+
"node_modules",
|
|
378
377
|
):
|
|
379
378
|
continue
|
|
380
379
|
dest = output_dir / item.name
|
|
381
380
|
if item.is_dir():
|
|
382
381
|
if dest.exists():
|
|
383
382
|
shutil.rmtree(dest)
|
|
384
|
-
shutil.copytree(item, dest, ignore=shutil.ignore_patterns(
|
|
383
|
+
shutil.copytree(item, dest, ignore=shutil.ignore_patterns("__pycache__", "*.pyc"))
|
|
385
384
|
else:
|
|
386
385
|
shutil.copy2(item, dest)
|
|
387
386
|
|
|
@@ -406,7 +405,7 @@ class MCPContainerBuilder(ContainerBuilder):
|
|
|
406
405
|
"entrypoint": str(entrypoint_path),
|
|
407
406
|
"mcp_variable": detection_result.mcp_variable,
|
|
408
407
|
"tools": detection_result.tools,
|
|
409
|
-
}
|
|
408
|
+
},
|
|
410
409
|
)
|
|
411
410
|
|
|
412
411
|
def _generate_mcp_requirements(self, project_path: Path) -> str:
|
|
@@ -5,7 +5,6 @@ from typing import Iterable, List
|
|
|
5
5
|
|
|
6
6
|
from packaging.requirements import InvalidRequirement, Requirement
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
_NORMALIZED_NAME_RE = re.compile(r"[-_.]+")
|
|
10
9
|
|
|
11
10
|
|
|
@@ -47,10 +46,7 @@ def exclude_requirement_names(
|
|
|
47
46
|
*,
|
|
48
47
|
excluded_names: Iterable[str],
|
|
49
48
|
) -> List[str]:
|
|
50
|
-
excluded = {
|
|
51
|
-
_NORMALIZED_NAME_RE.sub("-", name).lower()
|
|
52
|
-
for name in excluded_names
|
|
53
|
-
}
|
|
49
|
+
excluded = {_NORMALIZED_NAME_RE.sub("-", name).lower() for name in excluded_names}
|
|
54
50
|
filtered: List[str] = []
|
|
55
51
|
|
|
56
52
|
for raw_requirement in requirements:
|