machinaos 0.0.78 → 0.0.80
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.
- package/.env.template +74 -5
- package/{workflows/AI Assistant_workflow-1778504793388-ou1m1tz2x.json → .machina/workflows/AI Assistant_example_workflow-1779017037684-e2e5da7a.json } +164 -105
- package/{workflows/AI Employee_example_workflow-1777720598005-u4cm858dv.json → .machina/workflows/AI Employee_example_workflow-1779102911870-cbc76c82.json } +582 -328
- package/{workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json → .machina/workflows/Claude Assistant_example_workflow-1779095939967-2369cff4.json } +152 -83
- package/README.md +5 -2
- package/bin/cli.js +2 -2
- package/{machina → cli}/__main__.py +11 -7
- package/cli/_common.py +122 -0
- package/cli/buildenv.py +40 -0
- package/cli/cli.py +204 -0
- package/{machina → cli}/colors.py +10 -2
- package/cli/commands/__init__.py +1 -0
- package/cli/commands/_temporal_specs.py +59 -0
- package/{machina → cli}/commands/build.py +35 -45
- package/cli/commands/clean.py +141 -0
- package/cli/commands/daemon/__init__.py +47 -0
- package/cli/commands/daemon/_state.py +97 -0
- package/cli/commands/daemon/restart.py +14 -0
- package/cli/commands/daemon/start.py +49 -0
- package/cli/commands/daemon/status.py +20 -0
- package/cli/commands/daemon/stop.py +22 -0
- package/{machina → cli}/commands/dev.py +32 -42
- package/{machina → cli}/commands/docs.py +13 -11
- package/{machina → cli}/commands/start.py +69 -62
- package/{machina → cli}/commands/stop.py +7 -10
- package/{machina → cli}/commands/version.py +12 -6
- package/cli/config.py +170 -0
- package/cli/platform_.py +169 -0
- package/{machina → cli}/ports.py +42 -3
- package/{machina → cli}/run.py +29 -2
- package/{machina → cli}/supervisor.py +29 -12
- package/{machina → cli}/tcp.py +6 -2
- package/{machina → cli}/tree.py +38 -11
- package/client/dist/assets/{ActionBar-Du2MSFSz.js → ActionBar-Cjr3TF7g.js} +1 -1
- package/client/dist/assets/{ApiKeyInput-k2LBmBjb.js → ApiKeyInput-DIJE2PVA.js} +1 -1
- package/client/dist/assets/{ApiKeyPanel-C_bV9U0X.js → ApiKeyPanel-CPmye7uh.js} +1 -1
- package/client/dist/assets/{ApiUsageSection-CmVfwZzL.js → ApiUsageSection-TF_7gH2D.js} +1 -1
- package/client/dist/assets/{EmailPanel-CeKIMGu-.js → EmailPanel-Bs-xvbKR.js} +1 -1
- package/client/dist/assets/{OAuthPanel-KA3t3Q2K.js → OAuthPanel-BDtVJhAV.js} +1 -1
- package/client/dist/assets/{QrPairingPanel-NgNpJNuk.js → QrPairingPanel-BwJehTuZ.js} +1 -1
- package/client/dist/assets/{RateLimitSection-Du5YNVIA.js → RateLimitSection-CfNOoPIS.js} +1 -1
- package/client/dist/assets/{StatusCard-DNLyayXc.js → StatusCard-DkwIrgdP.js} +1 -1
- package/client/dist/assets/index-P2FzntoL.js +165 -0
- package/client/dist/index.html +1 -1
- package/client/package.json +1 -1
- package/client/src/Dashboard.tsx +128 -76
- package/client/src/adapters/nodeSpecToDescription.ts +7 -0
- package/client/src/assets/icons/index.test.ts +10 -0
- package/client/src/assets/icons/index.ts +16 -3
- package/client/src/components/AIAgentNode.tsx +8 -8
- package/client/src/components/ParameterRenderer.tsx +6 -3
- package/client/src/components/SkillEditorModal.tsx +1 -0
- package/client/src/components/credentials/panels/EmailPanel.tsx +2 -0
- package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +2 -0
- package/client/src/components/credentials/sections/RateLimitSection.tsx +1 -0
- package/client/src/components/icons/AIProviderIcons.tsx +1 -0
- package/client/src/components/maps/GoogleMapsPicker.tsx +1 -0
- package/client/src/components/parameterPanel/InputSection.tsx +1 -0
- package/client/src/components/parameterPanel/MasterSkillEditor.tsx +1 -0
- package/client/src/components/parameterPanel/OutputSection.tsx +1 -0
- package/client/src/components/ui/ComponentPalette.tsx +1 -0
- package/client/src/components/ui/MapSelector.tsx +1 -0
- package/client/src/components/ui/NodeContextMenu.tsx +3 -3
- package/client/src/components/ui/SettingsPanel.tsx +1 -0
- package/client/src/components/ui/action-button.tsx +1 -0
- package/client/src/components/ui/badge.tsx +1 -0
- package/client/src/components/ui/button.tsx +1 -0
- package/client/src/components/ui/form.tsx +1 -0
- package/client/src/components/ui/tabs.tsx +1 -0
- package/client/src/contexts/AuthContext.tsx +1 -0
- package/client/src/contexts/ThemeContext.tsx +1 -0
- package/client/src/contexts/WebSocketContext.tsx +104 -34
- package/client/src/hooks/__tests__/useApiKeys.test.ts +2 -2
- package/client/src/hooks/useReactFlowNodes.ts +1 -0
- package/client/src/hooks/useWorkflowValidation.ts +142 -0
- package/client/src/lib/nodeSpec.ts +1 -0
- package/client/src/test/providers.tsx +1 -0
- package/client/src/types/__tests__/cloudEvents.test.ts +5 -2
- package/client/src/types/cloudEvents.ts +19 -7
- package/client/src/utils/nodeUtils.ts +1 -1
- package/client/src/utils/workflow.ts +8 -2
- package/client/src/utils/workflowExport.ts +60 -3
- package/package.json +24 -23
- package/scripts/install.js +16 -27
- package/scripts/migrate_icons.py +3 -1
- package/scripts/migrate_skill_icons.py +6 -7
- package/scripts/postinstall.js +11 -9
- package/server/config/ai_cli_providers.json +2 -3
- package/server/config/credential_providers.json +15 -15
- package/server/config/llm_defaults.json +1 -1
- package/server/config/model_registry.json +416 -611
- package/server/constants.py +285 -223
- package/server/core/__init__.py +1 -1
- package/server/core/cache.py +9 -29
- package/server/core/cleanup.py +12 -24
- package/server/core/config.py +148 -24
- package/server/core/container.py +68 -59
- package/server/core/credential_backends.py +5 -13
- package/server/core/credentials_database.py +13 -43
- package/server/core/database.py +292 -353
- package/server/core/health.py +4 -5
- package/server/core/logging.py +241 -87
- package/server/core/paths.py +285 -0
- package/server/core/tracing.py +2 -8
- package/server/gunicorn.conf.py +1 -0
- package/server/main.py +150 -74
- package/server/middleware/auth.py +18 -24
- package/server/models/__init__.py +1 -1
- package/server/models/auth.py +5 -12
- package/server/models/database.py +36 -68
- package/server/models/node_metadata.py +25 -18
- package/server/nodejs/dist/index.js +107 -0
- package/server/nodes/README.md +11 -5
- package/server/nodes/__init__.py +1 -1
- package/server/nodes/_visuals.py +146 -14
- package/server/nodes/agent/_events.py +124 -0
- package/server/nodes/agent/_handles.py +15 -29
- package/server/nodes/agent/_inline.py +28 -25
- package/server/nodes/agent/_specialized.py +30 -15
- package/server/nodes/agent/{ai_agent.py → ai_agent/__init__.py} +33 -17
- package/server/nodes/agent/ai_agent/meta.json +3 -0
- package/server/nodes/agent/{ai_employee.py → ai_employee/__init__.py} +5 -2
- package/server/nodes/agent/ai_employee/meta.json +3 -0
- package/server/nodes/agent/{android_agent.py → android_agent/__init__.py} +1 -1
- package/server/nodes/agent/android_agent/meta.json +3 -0
- package/server/nodes/agent/{autonomous_agent.py → autonomous_agent/__init__.py} +2 -1
- package/server/nodes/agent/autonomous_agent/meta.json +3 -0
- package/server/nodes/agent/{chat_agent.py → chat_agent/__init__.py} +29 -12
- package/server/nodes/agent/chat_agent/meta.json +3 -0
- package/server/nodes/agent/{claude_code_agent.py → claude_code_agent/__init__.py} +192 -95
- package/server/nodes/agent/claude_code_agent/_handlers.py +169 -0
- package/server/{services/claude_oauth.py → nodes/agent/claude_code_agent/_oauth.py} +26 -13
- package/server/nodes/agent/claude_code_agent/_pool.py +1020 -0
- package/server/nodes/agent/claude_code_agent/_provider.py +513 -0
- package/server/nodes/agent/claude_code_agent/_skills.py +245 -0
- package/server/nodes/agent/claude_code_agent/meta.json +3 -0
- package/server/nodes/agent/{codex_agent.py → codex_agent/__init__.py} +26 -35
- package/server/nodes/agent/codex_agent/meta.json +3 -0
- package/server/nodes/agent/{coding_agent.py → coding_agent/__init__.py} +1 -1
- package/server/nodes/agent/coding_agent/meta.json +3 -0
- package/server/nodes/agent/{consumer_agent.py → consumer_agent/__init__.py} +1 -1
- package/server/nodes/agent/consumer_agent/meta.json +3 -0
- package/server/nodes/agent/{orchestrator_agent.py → orchestrator_agent/__init__.py} +5 -2
- package/server/nodes/agent/orchestrator_agent/meta.json +3 -0
- package/server/nodes/agent/{payments_agent.py → payments_agent/__init__.py} +1 -1
- package/server/nodes/agent/payments_agent/meta.json +3 -0
- package/server/nodes/agent/{productivity_agent.py → productivity_agent/__init__.py} +1 -1
- package/server/nodes/agent/productivity_agent/meta.json +3 -0
- package/server/nodes/agent/{rlm_agent.py → rlm_agent/__init__.py} +18 -17
- package/server/nodes/agent/rlm_agent/meta.json +3 -0
- package/server/nodes/agent/{social_agent.py → social_agent/__init__.py} +1 -1
- package/server/nodes/agent/social_agent/meta.json +3 -0
- package/server/nodes/agent/{task_agent.py → task_agent/__init__.py} +1 -1
- package/server/nodes/agent/task_agent/meta.json +3 -0
- package/server/nodes/agent/{tool_agent.py → tool_agent/__init__.py} +1 -1
- package/server/nodes/agent/tool_agent/meta.json +3 -0
- package/server/nodes/agent/{travel_agent.py → travel_agent/__init__.py} +1 -1
- package/server/nodes/agent/travel_agent/meta.json +3 -0
- package/server/nodes/agent/{web_agent.py → web_agent/__init__.py} +1 -1
- package/server/nodes/agent/web_agent/meta.json +3 -0
- package/server/nodes/android/__init__.py +24 -0
- package/server/nodes/android/_base.py +93 -76
- package/server/nodes/android/_dispatcher.py +140 -223
- package/server/nodes/android/_events.py +154 -0
- package/server/nodes/android/_handlers.py +13 -7
- package/server/nodes/android/_option_loaders.py +1 -4
- package/server/nodes/android/_refresh.py +27 -37
- package/server/nodes/android/_relay/broadcaster.py +25 -41
- package/server/nodes/android/_relay/client.py +23 -42
- package/server/nodes/android/_relay/manager.py +1 -0
- package/server/nodes/android/_relay/protocol.py +6 -0
- package/server/nodes/android/_router.py +48 -133
- package/server/nodes/android/{airplane_mode_control.py → airplane_mode_control/__init__.py} +2 -1
- package/server/nodes/android/airplane_mode_control/meta.json +3 -0
- package/server/nodes/android/{app_launcher.py → app_launcher/__init__.py} +2 -1
- package/server/nodes/android/app_launcher/meta.json +3 -0
- package/server/nodes/android/{app_list.py → app_list/__init__.py} +2 -1
- package/server/nodes/android/app_list/meta.json +3 -0
- package/server/nodes/android/{audio_automation.py → audio_automation/__init__.py} +2 -1
- package/server/nodes/android/audio_automation/meta.json +3 -0
- package/server/nodes/android/{battery_monitor.py → battery_monitor/__init__.py} +2 -1
- package/server/nodes/android/battery_monitor/meta.json +3 -0
- package/server/nodes/android/{bluetooth_automation.py → bluetooth_automation/__init__.py} +2 -1
- package/server/nodes/android/bluetooth_automation/meta.json +3 -0
- package/server/nodes/android/{camera_control.py → camera_control/__init__.py} +2 -1
- package/server/nodes/android/camera_control/meta.json +3 -0
- package/server/nodes/android/{device_state_automation.py → device_state_automation/__init__.py} +2 -1
- package/server/nodes/android/device_state_automation/meta.json +3 -0
- package/server/nodes/android/{environmental_sensors.py → environmental_sensors/__init__.py} +2 -1
- package/server/nodes/android/environmental_sensors/meta.json +3 -0
- package/server/nodes/android/{location.py → location/__init__.py} +2 -1
- package/server/nodes/android/location/meta.json +3 -0
- package/server/nodes/android/{media_control.py → media_control/__init__.py} +2 -1
- package/server/nodes/android/media_control/meta.json +3 -0
- package/server/nodes/android/{motion_detection.py → motion_detection/__init__.py} +2 -1
- package/server/nodes/android/motion_detection/meta.json +3 -0
- package/server/nodes/android/{network_monitor.py → network_monitor/__init__.py} +2 -1
- package/server/nodes/android/network_monitor/meta.json +3 -0
- package/server/nodes/android/{screen_control_automation.py → screen_control_automation/__init__.py} +2 -1
- package/server/nodes/android/screen_control_automation/meta.json +3 -0
- package/server/nodes/android/{system_info.py → system_info/__init__.py} +2 -1
- package/server/nodes/android/system_info/meta.json +3 -0
- package/server/nodes/android/{wifi_automation.py → wifi_automation/__init__.py} +2 -1
- package/server/nodes/android/wifi_automation/meta.json +3 -0
- package/server/nodes/browser/__init__.py +22 -1
- package/server/nodes/browser/_install.py +63 -0
- package/server/nodes/browser/_service.py +21 -25
- package/server/nodes/browser/{browser.py → browser/__init__.py} +58 -25
- package/server/nodes/browser/browser/meta.json +3 -0
- package/server/nodes/chat/{chat_history.py → chat_history/__init__.py} +2 -4
- package/server/nodes/chat/chat_history/meta.json +3 -0
- package/server/nodes/chat/{chat_send.py → chat_send/__init__.py} +2 -4
- package/server/nodes/chat/chat_send/icon.svg +1 -0
- package/server/nodes/chat/chat_send/meta.json +3 -0
- package/server/nodes/code/_base.py +1 -1
- package/server/nodes/code/{javascript_executor.py → javascript_executor/__init__.py} +5 -5
- package/server/nodes/code/javascript_executor/meta.json +3 -0
- package/server/nodes/code/{python_executor.py → python_executor/__init__.py} +32 -14
- package/server/nodes/code/python_executor/meta.json +3 -0
- package/server/nodes/code/{typescript_executor.py → typescript_executor/__init__.py} +5 -5
- package/server/nodes/code/typescript_executor/meta.json +3 -0
- package/server/nodes/document/{document_parser.py → document_parser/__init__.py} +26 -15
- package/server/nodes/document/document_parser/meta.json +3 -0
- package/server/nodes/document/{embedding_generator.py → embedding_generator/__init__.py} +16 -9
- package/server/nodes/document/embedding_generator/meta.json +3 -0
- package/server/nodes/document/{file_downloader.py → file_downloader/__init__.py} +30 -20
- package/server/nodes/document/file_downloader/meta.json +3 -0
- package/server/nodes/document/{http_scraper.py → http_scraper/__init__.py} +31 -21
- package/server/nodes/document/http_scraper/meta.json +3 -0
- package/server/nodes/document/{text_chunker.py → text_chunker/__init__.py} +17 -12
- package/server/nodes/document/text_chunker/meta.json +3 -0
- package/server/nodes/document/{vector_store.py → vector_store/__init__.py} +88 -72
- package/server/nodes/document/vector_store/meta.json +3 -0
- package/server/nodes/email/__init__.py +9 -2
- package/server/nodes/email/_events.py +54 -0
- package/server/nodes/email/_filters.py +3 -3
- package/server/nodes/email/_himalaya.py +95 -50
- package/server/nodes/email/_service.py +23 -13
- package/server/nodes/email/{email_read.py → email_read/__init__.py} +23 -11
- package/server/nodes/email/email_read/icon.svg +6 -0
- package/server/nodes/email/email_read/meta.json +3 -0
- package/server/nodes/email/{email_receive.py → email_receive/__init__.py} +45 -23
- package/server/nodes/email/email_receive/meta.json +3 -0
- package/server/nodes/email/{email_send.py → email_send/__init__.py} +13 -7
- package/server/nodes/email/email_send/meta.json +3 -0
- package/server/nodes/filesystem/_backend.py +1 -5
- package/server/nodes/filesystem/{file_modify.py → file_modify/__init__.py} +10 -5
- package/server/nodes/filesystem/file_modify/meta.json +3 -0
- package/server/nodes/filesystem/{file_read.py → file_read/__init__.py} +7 -3
- package/server/nodes/filesystem/file_read/meta.json +3 -0
- package/server/nodes/filesystem/{fs_search.py → fs_search/__init__.py} +11 -3
- package/server/nodes/filesystem/fs_search/meta.json +3 -0
- package/server/nodes/filesystem/{shell.py → shell/__init__.py} +12 -5
- package/server/nodes/filesystem/shell/meta.json +3 -0
- package/server/nodes/google/__init__.py +12 -0
- package/server/nodes/google/_auth_helper.py +7 -13
- package/server/nodes/google/_base.py +14 -11
- package/server/nodes/google/_credentials.py +2 -1
- package/server/nodes/google/_events.py +47 -0
- package/server/nodes/google/_filters.py +3 -3
- package/server/nodes/google/_gmail.py +70 -47
- package/server/nodes/google/_handlers.py +3 -1
- package/server/nodes/google/_oauth.py +25 -11
- package/server/nodes/google/_option_loaders.py +9 -30
- package/server/nodes/google/_refresh.py +8 -12
- package/server/nodes/google/_router.py +4 -5
- package/server/nodes/google/{calendar.py → calendar/__init__.py} +87 -64
- package/server/nodes/google/calendar/meta.json +3 -0
- package/server/nodes/google/{contacts.py → contacts/__init__.py} +84 -72
- package/server/nodes/google/contacts/meta.json +3 -0
- package/server/nodes/google/{drive.py → drive/__init__.py} +87 -72
- package/server/nodes/google/drive/meta.json +3 -0
- package/server/nodes/google/{gmail.py → gmail/__init__.py} +73 -39
- package/server/nodes/google/gmail/meta.json +3 -0
- package/server/nodes/google/{gmail_receive.py → gmail_receive/__init__.py} +31 -24
- package/server/nodes/google/gmail_receive/icon.svg +7 -0
- package/server/nodes/google/gmail_receive/meta.json +3 -0
- package/server/nodes/google/google.svg +7 -0
- package/server/nodes/google/{sheets.py → sheets/__init__.py} +54 -42
- package/server/nodes/google/sheets/meta.json +3 -0
- package/server/nodes/google/{tasks.py → tasks/__init__.py} +56 -43
- package/server/nodes/google/tasks/meta.json +3 -0
- package/server/nodes/groups.py +28 -28
- package/server/nodes/location/__init__.py +31 -1
- package/server/nodes/location/_credentials.py +1 -6
- package/server/nodes/location/_service.py +88 -107
- package/server/nodes/location/{gmaps_create.py → gmaps_create/__init__.py} +6 -6
- package/server/nodes/location/gmaps_create/meta.json +3 -0
- package/server/nodes/location/{gmaps_locations.py → gmaps_locations/__init__.py} +8 -6
- package/server/nodes/location/gmaps_locations/meta.json +3 -0
- package/server/nodes/location/{gmaps_nearby_places.py → gmaps_nearby_places/__init__.py} +8 -6
- package/server/nodes/location/gmaps_nearby_places/meta.json +3 -0
- package/server/nodes/model/_base.py +10 -7
- package/server/nodes/model/_credentials.py +10 -10
- package/server/nodes/model/_local_validator.py +28 -24
- package/server/nodes/model/{anthropic_chat_model.py → anthropic_chat_model/__init__.py} +5 -3
- package/server/nodes/model/anthropic_chat_model/meta.json +3 -0
- package/server/nodes/model/{cerebras_chat_model.py → cerebras_chat_model/__init__.py} +5 -3
- package/server/nodes/model/cerebras_chat_model/meta.json +3 -0
- package/server/nodes/model/{deepseek_chat_model.py → deepseek_chat_model/__init__.py} +8 -4
- package/server/nodes/model/deepseek_chat_model/meta.json +3 -0
- package/server/nodes/model/{gemini_chat_model.py → gemini_chat_model/__init__.py} +5 -3
- package/server/nodes/model/gemini_chat_model/meta.json +3 -0
- package/server/nodes/model/{groq_chat_model.py → groq_chat_model/__init__.py} +2 -2
- package/server/nodes/model/groq_chat_model/meta.json +3 -0
- package/server/nodes/model/{kimi_chat_model.py → kimi_chat_model/__init__.py} +2 -2
- package/server/nodes/model/kimi_chat_model/meta.json +3 -0
- package/server/nodes/model/{lmstudio_chat_model.py → lmstudio_chat_model/__init__.py} +2 -2
- package/server/nodes/model/lmstudio_chat_model/meta.json +3 -0
- package/server/nodes/model/{mistral_chat_model.py → mistral_chat_model/__init__.py} +2 -2
- package/server/nodes/model/mistral_chat_model/meta.json +3 -0
- package/server/nodes/model/{ollama_chat_model.py → ollama_chat_model/__init__.py} +2 -2
- package/server/nodes/model/ollama_chat_model/meta.json +3 -0
- package/server/nodes/model/{openai_chat_model.py → openai_chat_model/__init__.py} +8 -4
- package/server/nodes/model/openai_chat_model/meta.json +3 -0
- package/server/nodes/model/{openrouter_chat_model.py → openrouter_chat_model/__init__.py} +8 -4
- package/server/nodes/model/openrouter_chat_model/meta.json +3 -0
- package/server/nodes/proxy/_usage.py +14 -15
- package/server/nodes/proxy/{proxy_config.py → proxy_config/__init__.py} +39 -30
- package/server/nodes/proxy/proxy_config/meta.json +3 -0
- package/server/nodes/proxy/{proxy_request.py → proxy_request/__init__.py} +30 -16
- package/server/nodes/proxy/proxy_request/meta.json +3 -0
- package/server/nodes/proxy/{proxy_status.py → proxy_status/__init__.py} +2 -0
- package/server/nodes/proxy/proxy_status/meta.json +3 -0
- package/server/nodes/scheduler/{cron_scheduler.py → cron_scheduler/__init__.py} +96 -23
- package/server/nodes/scheduler/cron_scheduler/_workflow.py +155 -0
- package/server/nodes/scheduler/cron_scheduler/meta.json +3 -0
- package/server/nodes/scheduler/{timer.py → timer/__init__.py} +6 -5
- package/server/nodes/scheduler/timer/meta.json +3 -0
- package/server/nodes/scraper/_credentials.py +0 -1
- package/server/nodes/scraper/{apify_actor.py → apify_actor/__init__.py} +44 -35
- package/server/nodes/scraper/apify_actor/icon.svg +5 -0
- package/server/nodes/scraper/apify_actor/meta.json +3 -0
- package/server/nodes/scraper/{crawlee_scraper.py → crawlee_scraper/__init__.py} +96 -57
- package/server/nodes/scraper/crawlee_scraper/meta.json +3 -0
- package/server/nodes/search/{brave_search.py → brave_search/__init__.py} +6 -5
- package/server/nodes/search/brave_search/icon.svg +3 -0
- package/server/nodes/search/brave_search/meta.json +3 -0
- package/server/nodes/search/{duckduckgo_search.py → duckduckgo_search/__init__.py} +17 -6
- package/server/nodes/search/duckduckgo_search/meta.json +3 -0
- package/server/nodes/search/{perplexity_search.py → perplexity_search/__init__.py} +4 -5
- package/server/nodes/search/perplexity_search/icon.svg +3 -0
- package/server/nodes/search/perplexity_search/meta.json +3 -0
- package/server/nodes/search/{serper_search.py → serper_search/__init__.py} +32 -25
- package/server/nodes/search/serper_search/icon.svg +3 -0
- package/server/nodes/search/serper_search/meta.json +3 -0
- package/server/nodes/skill/__init__.py +21 -1
- package/server/nodes/skill/_expander.py +75 -0
- package/server/nodes/skill/{master_skill.py → master_skill/__init__.py} +2 -8
- package/server/nodes/skill/master_skill/_events.py +84 -0
- package/server/nodes/skill/master_skill/meta.json +3 -0
- package/server/nodes/skill/{simple_memory.py → simple_memory/__init__.py} +8 -16
- package/server/nodes/skill/simple_memory/meta.json +3 -0
- package/server/nodes/social/_base.py +223 -231
- package/server/nodes/social/{social_receive.py → social_receive/__init__.py} +38 -13
- package/server/nodes/social/social_receive/meta.json +3 -0
- package/server/nodes/social/{social_send.py → social_send/__init__.py} +71 -29
- package/server/nodes/social/social_send/icon.svg +1 -0
- package/server/nodes/social/social_send/meta.json +3 -0
- package/server/nodes/stripe/__init__.py +7 -3
- package/server/nodes/stripe/_credentials.py +0 -1
- package/server/nodes/stripe/_handlers.py +18 -7
- package/server/nodes/stripe/_install.py +14 -15
- package/server/nodes/stripe/_source.py +5 -5
- package/server/nodes/stripe/icon.svg +1 -0
- package/server/nodes/stripe/meta.json +3 -0
- package/server/nodes/stripe/stripe_action.py +4 -4
- package/server/nodes/stripe/stripe_receive.py +6 -9
- package/server/nodes/telegram/__init__.py +13 -0
- package/server/nodes/telegram/_credentials.py +2 -7
- package/server/nodes/telegram/_events.py +167 -0
- package/server/nodes/telegram/_filters.py +3 -11
- package/server/nodes/telegram/_handlers.py +17 -7
- package/server/nodes/telegram/_refresh.py +24 -34
- package/server/nodes/telegram/_service.py +29 -45
- package/server/nodes/telegram/meta.json +3 -0
- package/server/nodes/telegram/telegram.svg +3 -0
- package/server/nodes/telegram/telegram_receive.py +38 -18
- package/server/nodes/telegram/telegram_send.py +21 -19
- package/server/nodes/text/{file_handler.py → file_handler/__init__.py} +7 -1
- package/server/nodes/text/file_handler/meta.json +3 -0
- package/server/nodes/text/{text_generator.py → text_generator/__init__.py} +2 -1
- package/server/nodes/text/text_generator/meta.json +3 -0
- package/server/nodes/tool/{agent_builder.py → agent_builder/__init__.py} +105 -100
- package/server/nodes/tool/agent_builder/_events.py +91 -0
- package/server/nodes/tool/agent_builder/meta.json +3 -0
- package/server/nodes/tool/{calculator_tool.py → calculator_tool/__init__.py} +19 -7
- package/server/nodes/tool/calculator_tool/meta.json +3 -0
- package/server/nodes/tool/{current_time_tool.py → current_time_tool/__init__.py} +6 -4
- package/server/nodes/tool/current_time_tool/meta.json +3 -0
- package/server/nodes/tool/{task_manager.py → task_manager/__init__.py} +17 -18
- package/server/nodes/tool/task_manager/meta.json +3 -0
- package/server/nodes/tool/{write_todos.py → write_todos/__init__.py} +20 -6
- package/server/nodes/tool/write_todos/meta.json +3 -0
- package/server/nodes/trigger/{chat_trigger.py → chat_trigger/__init__.py} +11 -7
- package/server/nodes/trigger/chat_trigger/_events.py +53 -0
- package/server/nodes/trigger/chat_trigger/meta.json +3 -0
- package/server/nodes/trigger/{task_trigger.py → task_trigger/__init__.py} +10 -7
- package/server/nodes/trigger/task_trigger/meta.json +3 -0
- package/server/nodes/trigger/{webhook_trigger.py → webhook_trigger/__init__.py} +10 -7
- package/server/nodes/trigger/webhook_trigger/_events.py +54 -0
- package/server/nodes/trigger/webhook_trigger/meta.json +3 -0
- package/server/nodes/twitter/__init__.py +7 -1
- package/server/nodes/twitter/_base.py +86 -61
- package/server/nodes/twitter/_credentials.py +7 -5
- package/server/nodes/twitter/_events.py +101 -0
- package/server/nodes/twitter/_filters.py +9 -9
- package/server/nodes/twitter/_handlers.py +3 -1
- package/server/nodes/twitter/_oauth.py +1 -2
- package/server/nodes/twitter/_refresh.py +8 -12
- package/server/nodes/twitter/{twitter_receive.py → twitter_receive/__init__.py} +7 -7
- package/server/nodes/twitter/twitter_receive/icon.svg +1 -0
- package/server/nodes/twitter/twitter_receive/meta.json +3 -0
- package/server/nodes/twitter/{twitter_search.py → twitter_search/__init__.py} +16 -11
- package/server/nodes/twitter/twitter_search/icon.svg +1 -0
- package/server/nodes/twitter/twitter_search/meta.json +3 -0
- package/server/nodes/twitter/{twitter_send.py → twitter_send/__init__.py} +60 -27
- package/server/nodes/twitter/twitter_send/icon.svg +1 -0
- package/server/nodes/twitter/twitter_send/meta.json +3 -0
- package/server/nodes/twitter/{twitter_user.py → twitter_user/__init__.py} +34 -19
- package/server/nodes/twitter/twitter_user/icon.svg +1 -0
- package/server/nodes/twitter/twitter_user/meta.json +3 -0
- package/server/nodes/utility/{console.py → console/__init__.py} +17 -22
- package/server/nodes/utility/console/meta.json +3 -0
- package/server/nodes/utility/{http_request.py → http_request/__init__.py} +9 -6
- package/server/nodes/utility/http_request/meta.json +3 -0
- package/server/nodes/utility/{process_manager.py → process_manager/__init__.py} +10 -6
- package/server/nodes/utility/process_manager/meta.json +3 -0
- package/server/nodes/utility/team_monitor/meta.json +3 -0
- package/server/nodes/utility/{webhook_response.py → webhook_response/__init__.py} +12 -7
- package/server/nodes/utility/webhook_response/meta.json +3 -0
- package/server/nodes/visuals.json +69 -251
- package/server/nodes/whatsapp/__init__.py +24 -0
- package/server/nodes/whatsapp/_base.py +283 -338
- package/server/nodes/whatsapp/_credentials.py +44 -0
- package/server/nodes/whatsapp/_events.py +277 -0
- package/server/nodes/whatsapp/_filters.py +36 -37
- package/server/nodes/whatsapp/_handlers.py +2 -0
- package/server/nodes/whatsapp/_option_loaders.py +1 -3
- package/server/nodes/whatsapp/_refresh.py +13 -18
- package/server/nodes/whatsapp/_runtime.py +9 -6
- package/server/nodes/whatsapp/_service.py +89 -152
- package/server/nodes/whatsapp/meta.json +3 -0
- package/server/nodes/whatsapp/whatsapp_db.py +116 -54
- package/server/nodes/whatsapp/whatsapp_receive.py +30 -13
- package/server/nodes/whatsapp/whatsapp_send.py +60 -37
- package/server/nodes/workflow/{start.py → start/__init__.py} +1 -4
- package/server/nodes/workflow/start/meta.json +3 -0
- package/server/package-lock.json +3 -3
- package/server/package.json +3 -0
- package/server/pyproject.toml +39 -10
- package/server/requirements.txt +3 -5
- package/server/routers/__init__.py +1 -1
- package/server/routers/auth.py +16 -56
- package/server/routers/database.py +27 -50
- package/server/routers/nodejs_compat.py +25 -87
- package/server/routers/schemas.py +66 -2
- package/server/routers/webhook.py +12 -12
- package/server/routers/websocket.py +312 -1716
- package/server/routers/workflow.py +28 -53
- package/server/scripts/smoke_test_skills.py +178 -0
- package/server/services/__init__.py +1 -1
- package/server/services/_supervisor/process.py +9 -3
- package/server/services/_supervisor/registry.py +3 -3
- package/server/services/_supervisor/util.py +1 -1
- package/server/services/agent_team.py +15 -43
- package/server/services/agent_teams/__init__.py +17 -0
- package/server/services/agent_teams/handlers.py +195 -0
- package/server/services/ai.py +853 -1108
- package/server/services/auth.py +10 -34
- package/server/services/chat_client.py +5 -34
- package/server/services/circuit_breaker.py +2 -6
- package/server/services/cli_agent/__init__.py +28 -4
- package/server/services/cli_agent/_cli_auth.py +61 -0
- package/server/services/cli_agent/_handlers.py +24 -183
- package/server/services/cli_agent/config.py +5 -8
- package/server/services/cli_agent/factory.py +168 -22
- package/server/services/cli_agent/jsonl_watcher.py +380 -0
- package/server/services/cli_agent/lockfile.py +9 -2
- package/server/services/cli_agent/mcp_server.py +110 -34
- package/server/services/cli_agent/protocol.py +37 -19
- package/server/services/cli_agent/providers/__init__.py +8 -4
- package/server/services/cli_agent/providers/google_gemini.py +11 -5
- package/server/services/cli_agent/providers/openai_codex.py +34 -34
- package/server/services/cli_agent/service.py +245 -83
- package/server/services/cli_agent/session.py +409 -229
- package/server/services/cli_agent/transports/__init__.py +47 -0
- package/server/services/cli_agent/transports/base.py +111 -0
- package/server/services/cli_agent/transports/posix.py +196 -0
- package/server/services/cli_agent/transports/windows.py +189 -0
- package/server/services/cli_agent/types.py +45 -18
- package/server/services/cli_agent/workflow_tools.py +28 -15
- package/server/services/compaction.py +68 -52
- package/server/services/credential_registry.py +6 -20
- package/server/services/credentials/__init__.py +18 -0
- package/server/services/credentials/handlers.py +196 -0
- package/server/services/deployment/__init__.py +12 -1
- package/server/services/deployment/canary_registry.py +137 -0
- package/server/services/deployment/handlers.py +382 -0
- package/server/services/deployment/manager.py +653 -163
- package/server/services/deployment/poll_registry.py +2 -6
- package/server/services/deployment/state.py +2 -0
- package/server/services/deployment/triggers.py +87 -93
- package/server/services/event_waiter.py +47 -54
- package/server/services/events/__init__.py +11 -0
- package/server/services/events/admin_handlers.py +368 -0
- package/server/services/events/daemon.py +3 -1
- package/server/services/events/dispatch.py +188 -0
- package/server/services/events/envelope.py +264 -45
- package/server/services/events/oauth_lifecycle.py +98 -42
- package/server/services/events/triggers.py +3 -13
- package/server/services/events/verifiers/hmac_basic.py +1 -1
- package/server/services/events/verifiers/standard_webhooks.py +2 -4
- package/server/services/events/webhook.py +2 -3
- package/server/services/example_loader.py +73 -15
- package/server/services/execution/cache.py +36 -76
- package/server/services/execution/conditions.py +7 -20
- package/server/services/execution/dlq.py +20 -24
- package/server/services/execution/executor.py +234 -265
- package/server/services/execution/models.py +40 -46
- package/server/services/execution/recovery.py +23 -46
- package/server/services/handlers/__init__.py +12 -16
- package/server/services/handlers/todo.py +3 -6
- package/server/services/handlers/tools.py +143 -194
- package/server/services/handlers/triggers.py +24 -23
- package/server/services/llm/config.py +10 -1
- package/server/services/llm/factory.py +16 -4
- package/server/services/llm/messages.py +1 -5
- package/server/services/llm/protocol.py +9 -1
- package/server/services/llm/providers/anthropic.py +23 -12
- package/server/services/llm/providers/gemini.py +43 -22
- package/server/services/llm/providers/openai.py +14 -6
- package/server/services/llm/providers/openrouter.py +6 -1
- package/server/services/markdown_formatter.py +1 -2
- package/server/services/memory/__init__.py +2 -2
- package/server/services/memory/jsonl.py +6 -2
- package/server/services/memory/markdown.py +6 -6
- package/server/services/memory/state.py +6 -5
- package/server/services/memory_store.py +8 -12
- package/server/services/model_registry.py +22 -20
- package/server/services/node_executor.py +85 -80
- package/server/services/node_output_schemas.py +4 -7
- package/server/services/node_registry.py +40 -4
- package/server/services/node_spec.py +3 -7
- package/server/services/nodejs_client.py +4 -14
- package/server/services/oauth_utils.py +11 -7
- package/server/services/parameter_resolver.py +30 -36
- package/server/services/plugin/base.py +321 -38
- package/server/services/plugin/connection.py +12 -7
- package/server/services/plugin/credential.py +80 -22
- package/server/services/plugin/edge_walker.py +128 -105
- package/server/services/plugin/identifiers.py +48 -0
- package/server/services/plugin/interceptor.py +1 -1
- package/server/services/plugin/oauth.py +25 -21
- package/server/services/plugin/operation.py +1 -1
- package/server/services/plugin/polling.py +151 -26
- package/server/services/plugin/registry.py +52 -4
- package/server/services/plugin/routing.py +6 -9
- package/server/services/plugin/scaling.py +36 -18
- package/server/services/plugin/service_factories.py +95 -0
- package/server/services/plugin/shutdown_hooks.py +103 -0
- package/server/services/plugin/social_provider_registry.py +80 -0
- package/server/services/plugin/ws.py +2 -1
- package/server/services/pricing.py +26 -40
- package/server/services/pricing_handlers.py +90 -0
- package/server/services/process_service.py +33 -32
- package/server/services/proxy/models.py +15 -9
- package/server/services/proxy/service.py +26 -40
- package/server/services/rlm/adapters.py +43 -40
- package/server/services/rlm/constants.py +9 -9
- package/server/services/rlm/service.py +57 -45
- package/server/services/scheduler.py +8 -39
- package/server/services/settings/__init__.py +16 -0
- package/server/services/settings/handlers.py +275 -0
- package/server/services/skill_loader.py +53 -45
- package/server/services/skill_prompt.py +8 -6
- package/server/services/skills/__init__.py +23 -0
- package/server/services/skills/handlers.py +479 -0
- package/server/services/status_broadcaster.py +314 -291
- package/server/services/temporal/__init__.py +22 -1
- package/server/services/temporal/_handlers.py +65 -0
- package/server/services/temporal/_install.py +158 -0
- package/server/services/temporal/_refresh.py +57 -0
- package/server/services/temporal/_retry_policies.py +85 -0
- package/server/services/temporal/_runtime.py +181 -0
- package/server/services/temporal/_supervised_runtime.py +102 -0
- package/server/services/temporal/activities.py +168 -11
- package/server/services/temporal/agent_activities.py +683 -0
- package/server/services/temporal/agent_workflow.py +601 -0
- package/server/services/temporal/client.py +58 -13
- package/server/services/temporal/executor.py +2 -3
- package/server/services/temporal/plugin_activities.py +37 -2
- package/server/services/temporal/plugin_registry.py +82 -0
- package/server/services/temporal/polling_trigger_workflow.py +267 -0
- package/server/services/temporal/schedules.py +220 -0
- package/server/services/temporal/search_attributes.py +177 -0
- package/server/services/temporal/trigger_listener_workflow.py +378 -0
- package/server/services/temporal/worker.py +111 -18
- package/server/services/temporal/workflow.py +259 -40
- package/server/services/temporal/ws_client.py +22 -11
- package/server/services/text.py +14 -28
- package/server/services/tracked_http.py +29 -49
- package/server/services/user_auth.py +7 -21
- package/server/services/workflow.py +28 -20
- package/server/services/workflow_import.py +351 -0
- package/server/services/workflow_ops.py +4 -0
- package/server/services/workflow_storage/__init__.py +18 -0
- package/server/services/workflow_storage/handlers.py +132 -0
- package/server/services/workflow_validator.py +209 -0
- package/server/services/ws_handler_registry.py +80 -9
- package/server/skills/assistant/agent-builder-skill/SKILL.md +6 -6
- package/server/tests/conftest.py +54 -3
- package/server/tests/credentials/test_auth_service.py +9 -21
- package/server/tests/credentials/test_credential_broadcasts.py +116 -22
- package/server/tests/credentials/test_credentials_database.py +12 -38
- package/server/tests/credentials/test_encryption.py +3 -9
- package/server/tests/credentials/test_google_oauth.py +1 -3
- package/server/tests/credentials/test_oauth_utils.py +31 -38
- package/server/tests/credentials/test_twitter_oauth.py +1 -3
- package/server/tests/credentials/test_websocket_handlers.py +37 -72
- package/server/tests/fixtures/tool_names_snapshot.json +78 -0
- package/server/tests/llm/test_factory.py +12 -4
- package/server/tests/llm/test_providers.py +25 -32
- package/server/tests/llm/test_wiring.py +27 -22
- package/server/tests/nodes/_compat.py +4 -5
- package/server/tests/nodes/_harness.py +31 -24
- package/server/tests/nodes/_mocks.py +2 -6
- package/server/tests/nodes/test_agent_builder.py +43 -35
- package/server/tests/nodes/test_ai_agents.py +29 -24
- package/server/tests/nodes/test_ai_chat_models.py +3 -9
- package/server/tests/nodes/test_ai_tools.py +29 -24
- package/server/tests/nodes/test_android.py +34 -64
- package/server/tests/nodes/test_chat_utility.py +2 -2
- package/server/tests/nodes/test_code_fs_process.py +26 -84
- package/server/tests/nodes/test_document.py +23 -47
- package/server/tests/nodes/test_email.py +88 -51
- package/server/tests/nodes/test_google_workspace.py +26 -20
- package/server/tests/nodes/test_http_proxy.py +43 -89
- package/server/tests/nodes/test_search.py +3 -9
- package/server/tests/nodes/test_specialized_agents.py +58 -162
- package/server/tests/nodes/test_stripe_plugin.py +25 -5
- package/server/tests/nodes/test_telegram_social.py +33 -37
- package/server/tests/nodes/test_twitter.py +59 -150
- package/server/tests/nodes/test_web_automation.py +21 -51
- package/server/tests/nodes/test_whatsapp.py +13 -19
- package/server/tests/nodes/test_workflow_triggers.py +16 -45
- package/server/tests/services/cli_agent/test_claude_session_events.py +201 -0
- package/server/tests/services/cli_agent/test_jsonl_watcher.py +190 -0
- package/server/tests/services/cli_agent/test_mcp_server.py +67 -29
- package/server/tests/services/cli_agent/test_providers.py +236 -47
- package/server/tests/services/cli_agent/test_service.py +9 -7
- package/server/tests/services/memory/test_jsonl.py +30 -25
- package/server/tests/services/test_events.py +26 -7
- package/server/tests/services/test_identifiers.py +122 -0
- package/server/tests/services/test_process_lifecycle.py +129 -0
- package/server/tests/services/test_supervisor.py +0 -1
- package/server/tests/temporal/__init__.py +0 -0
- package/server/tests/temporal/test_agent_workflow.py +215 -0
- package/server/tests/temporal/test_dispatch.py +231 -0
- package/server/tests/test_admin_handlers.py +394 -0
- package/server/tests/test_auto_skill.py +4 -2
- package/server/tests/test_canary_registry.py +310 -0
- package/server/tests/test_chat_trigger_canary_producer.py +101 -0
- package/server/tests/test_cloudevents_node_parameters.py +129 -0
- package/server/tests/test_credential_icon.py +115 -0
- package/server/tests/test_cron_canary.py +511 -0
- package/server/tests/test_deployment_canary_listener.py +692 -0
- package/server/tests/test_event_framework_phase_a.py +537 -0
- package/server/tests/test_no_raw_prints.py +131 -0
- package/server/tests/test_node_spec.py +196 -103
- package/server/tests/test_parameter_resolver.py +20 -20
- package/server/tests/test_plugin_contract.py +76 -49
- package/server/tests/test_plugin_helpers.py +0 -1
- package/server/tests/test_plugin_self_containment.py +40 -47
- package/server/tests/test_polling_trigger_workflow.py +572 -0
- package/server/tests/test_retry_policies.py +146 -0
- package/server/tests/test_service_factories.py +168 -0
- package/server/tests/test_shutdown_hooks.py +199 -0
- package/server/tests/test_social_provider_registry.py +177 -0
- package/server/tests/test_status_broadcasts.py +214 -63
- package/server/tests/test_task_trigger_canary_producer.py +131 -0
- package/server/tests/test_telegram_trigger_canary_producer.py +113 -0
- package/server/tests/test_tool_registry.py +110 -0
- package/server/tests/test_trigger_listener_workflow.py +365 -0
- package/server/tests/test_whatsapp_trigger_canary_producer.py +164 -0
- package/server/tests/test_workflow_ops.py +1 -3
- package/server/tests/test_workflow_validator.py +791 -0
- package/server/uv.lock +3539 -0
- package/client/dist/assets/index-DQ0nwhec.js +0 -257
- package/client/src/assets/icons/apify/index.ts +0 -19
- package/client/src/assets/icons/browser/index.ts +0 -17
- package/client/src/assets/icons/email/index.ts +0 -22
- package/client/src/assets/icons/google/index.ts +0 -34
- package/client/src/assets/icons/llm/deepseek.svg +0 -1
- package/client/src/assets/icons/llm/index.ts +0 -18
- package/client/src/assets/icons/llm/kimi.svg +0 -1
- package/client/src/assets/icons/llm/mistral.svg +0 -1
- package/client/src/assets/icons/search/index.ts +0 -28
- package/client/src/assets/icons/telegram/index.ts +0 -19
- package/machina/buildenv.py +0 -44
- package/machina/cli.py +0 -55
- package/machina/commands/__init__.py +0 -1
- package/machina/commands/clean.py +0 -80
- package/machina/commands/daemon.py +0 -150
- package/machina/config.py +0 -93
- package/machina/platform_.py +0 -37
- package/machina/pyproject.toml +0 -33
- package/server/nodes/agent/deep_agent.py +0 -103
- package/server/services/agents/__init__.py +0 -9
- package/server/services/agents/adapters.py +0 -199
- package/server/services/agents/constants.py +0 -10
- package/server/services/agents/service.py +0 -297
- package/server/services/cli_agent/providers/anthropic_claude.py +0 -419
- /package/{machina → cli}/README.md +0 -0
- /package/{machina → cli}/__init__.py +0 -0
- /package/{client/src/assets/icons/apify → server/credentials/icons}/apify.svg +0 -0
- /package/{client/src/assets/icons/search/brave.svg → server/credentials/icons/brave_search.svg} +0 -0
- /package/{client/src/assets/icons/email/read.svg → server/credentials/icons/email_himalaya.svg} +0 -0
- /package/{client/src/assets/icons/search → server/credentials/icons}/perplexity.svg +0 -0
- /package/{client/src/assets/icons/search/google.svg → server/credentials/icons/serper.svg} +0 -0
- /package/{client/src/assets → server/credentials}/icons/stripe.svg +0 -0
- /package/{client/src/assets/icons/twitter/x.svg → server/credentials/icons/twitter.svg} +0 -0
- /package/{client/src/assets/icons/browser/chrome.svg → server/nodes/browser/browser/icon.svg} +0 -0
- /package/{client/src/assets/icons/chat/chat.svg → server/nodes/chat/chat_history/icon.svg} +0 -0
- /package/{client/src/assets/icons/code/javascript.svg → server/nodes/code/javascript_executor/icon.svg} +0 -0
- /package/{client/src/assets/icons/code/python.svg → server/nodes/code/python_executor/icon.svg} +0 -0
- /package/{client/src/assets/icons/code/typescript.svg → server/nodes/code/typescript_executor/icon.svg} +0 -0
- /package/{client/src/assets/icons/email/receive.svg → server/nodes/email/email_receive/icon.svg} +0 -0
- /package/{client/src/assets/icons/email/send.svg → server/nodes/email/email_send/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/calendar.svg → server/nodes/google/calendar/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/contacts.svg → server/nodes/google/contacts/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/drive.svg → server/nodes/google/drive/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/gmail.svg → server/nodes/google/gmail/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/sheets.svg → server/nodes/google/sheets/icon.svg} +0 -0
- /package/{client/src/assets/icons/google/tasks.svg → server/nodes/google/tasks/icon.svg} +0 -0
- /package/{client/src/assets/icons/search/duckduckgo.svg → server/nodes/search/duckduckgo_search/icon.svg} +0 -0
- /package/{client/src/assets/icons/social/social.svg → server/nodes/social/social_receive/icon.svg} +0 -0
- /package/{client/src/assets/icons/telegram/telegram.svg → server/nodes/telegram/icon.svg} +0 -0
- /package/server/nodes/utility/{team_monitor.py → team_monitor/__init__.py} +0 -0
- /package/{client/src/assets/icons/whatsapp/whatsapp-db.svg → server/nodes/whatsapp/icon_whatsappDb.svg} +0 -0
- /package/{client/src/assets/icons/whatsapp/whatsapp-receive.svg → server/nodes/whatsapp/icon_whatsappReceive.svg} +0 -0
- /package/{client/src/assets/icons/whatsapp/whatsapp-send.svg → server/nodes/whatsapp/icon_whatsappSend.svg} +0 -0
- /package/{client/src/assets/icons → server/nodes}/whatsapp/whatsapp.svg +0 -0
|
@@ -17,15 +17,15 @@ from typing import Annotated, Any, Dict, List, Literal, Optional, Union
|
|
|
17
17
|
|
|
18
18
|
from pydantic import BaseModel, ConfigDict, Field
|
|
19
19
|
|
|
20
|
-
from services.cli_agent.protocol import CanonicalUsage
|
|
21
|
-
|
|
22
20
|
|
|
23
21
|
# ---------------------------------------------------------------------------
|
|
24
22
|
# Task specs (discriminated union)
|
|
25
23
|
# ---------------------------------------------------------------------------
|
|
26
24
|
|
|
25
|
+
|
|
27
26
|
class BaseAICliTaskSpec(BaseModel):
|
|
28
27
|
"""Shared fields for every CLI task."""
|
|
28
|
+
|
|
29
29
|
task_id: Optional[str] = Field(
|
|
30
30
|
default=None,
|
|
31
31
|
description="Auto-assigned `t_<8hex>` if omitted.",
|
|
@@ -37,15 +37,16 @@ class BaseAICliTaskSpec(BaseModel):
|
|
|
37
37
|
)
|
|
38
38
|
branch: Optional[str] = Field(
|
|
39
39
|
default=None,
|
|
40
|
-
description="Branch name for the per-task git worktree. "
|
|
41
|
-
"Auto-named `machina/<task_id>` if omitted.",
|
|
40
|
+
description="Branch name for the per-task git worktree. " "Auto-named `machina/<task_id>` if omitted.",
|
|
42
41
|
)
|
|
43
42
|
model: Optional[str] = Field(default=None)
|
|
44
43
|
timeout_seconds: int = Field(
|
|
45
|
-
default=600,
|
|
44
|
+
default=600,
|
|
45
|
+
ge=10,
|
|
46
|
+
le=3600,
|
|
46
47
|
description="Hard timeout per task. On expiry the session is "
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
"terminate_then_kill'd and a diagnostic dump is "
|
|
49
|
+
"written to ~/.claude-machina/logs/.",
|
|
49
50
|
)
|
|
50
51
|
system_prompt: Optional[str] = Field(
|
|
51
52
|
default=None,
|
|
@@ -61,31 +62,51 @@ class BaseAICliTaskSpec(BaseModel):
|
|
|
61
62
|
class ClaudeTaskSpec(BaseAICliTaskSpec):
|
|
62
63
|
"""Claude Code CLI task. Full feature set: sessions, resume, budget,
|
|
63
64
|
turns, allowed_tools, permission_mode."""
|
|
65
|
+
|
|
64
66
|
provider: Literal["claude"] = "claude"
|
|
65
67
|
session_id: Optional[str] = Field(
|
|
66
68
|
default=None,
|
|
67
69
|
description="Start a named session. Pair with `resume_session_id` "
|
|
68
|
-
|
|
70
|
+
"to chain conversations. Note: silently dropped in "
|
|
71
|
+
"interactive mode (claude assigns its own UUID); "
|
|
72
|
+
"kept for back-compat.",
|
|
69
73
|
)
|
|
70
74
|
resume_session_id: Optional[str] = Field(
|
|
71
75
|
default=None,
|
|
72
|
-
description="Resume from a prior
|
|
73
|
-
|
|
76
|
+
description="Resume from a specific prior session UUID. Mutually "
|
|
77
|
+
"exclusive with `continue_session`. Generally unset by "
|
|
78
|
+
"claude_code_agent — set `continue_session=True` for "
|
|
79
|
+
"memory-bound runs and let claude find its own latest.",
|
|
80
|
+
)
|
|
81
|
+
continue_session: bool = Field(
|
|
82
|
+
default=False,
|
|
83
|
+
description="Emit `--continue` so claude auto-loads the most "
|
|
84
|
+
"recent conversation under the current cwd (per "
|
|
85
|
+
"code.claude.com/docs/en/cli-reference). The cleaner "
|
|
86
|
+
"alternative to passing a specific UUID via "
|
|
87
|
+
"`resume_session_id` — claude handles session "
|
|
88
|
+
"tracking itself, no UUID round-trip through the "
|
|
89
|
+
"memory node's params required.",
|
|
74
90
|
)
|
|
75
91
|
max_turns: Optional[int] = Field(
|
|
76
|
-
default=None,
|
|
92
|
+
default=None,
|
|
93
|
+
ge=1,
|
|
77
94
|
description="Per-task turn cap. Defaults to provider config.",
|
|
78
95
|
)
|
|
79
96
|
max_budget_usd: Optional[float] = Field(
|
|
80
|
-
default=None,
|
|
97
|
+
default=None,
|
|
98
|
+
ge=0,
|
|
81
99
|
description="Per-task USD budget. Defaults to provider config.",
|
|
82
100
|
)
|
|
83
101
|
allowed_tools: Optional[str] = Field(
|
|
84
102
|
default=None,
|
|
85
|
-
description="Comma-separated tool list.
|
|
86
|
-
|
|
103
|
+
description="Comma-separated tool list. Default is empty — "
|
|
104
|
+
"claude built-ins (Read/Edit/Bash/Glob/Grep/Write/"
|
|
105
|
+
"Skill/WebSearch/WebFetch) are intentionally NOT in "
|
|
106
|
+
"the allowlist; the agent only gets connected MCP "
|
|
107
|
+
"tools + MachinaOs's own MCP infrastructure tools.",
|
|
87
108
|
)
|
|
88
|
-
permission_mode: Literal["default", "acceptEdits", "plan", "auto", "dontAsk", "bypassPermissions"] = "
|
|
109
|
+
permission_mode: Literal["default", "acceptEdits", "plan", "auto", "dontAsk", "bypassPermissions"] = "dontAsk"
|
|
89
110
|
|
|
90
111
|
# ---- optional documented CLI flags (cli-reference) ----
|
|
91
112
|
effort: Optional[Literal["low", "medium", "high", "xhigh", "max"]] = Field(
|
|
@@ -112,10 +133,9 @@ class ClaudeTaskSpec(BaseAICliTaskSpec):
|
|
|
112
133
|
|
|
113
134
|
class CodexTaskSpec(BaseAICliTaskSpec):
|
|
114
135
|
"""OpenAI Codex CLI task. Sandbox-first; no session/resume/budget/turns."""
|
|
136
|
+
|
|
115
137
|
provider: Literal["codex"] = "codex"
|
|
116
|
-
sandbox: Literal["read-only", "workspace-write", "danger-full-access"] =
|
|
117
|
-
"workspace-write"
|
|
118
|
-
)
|
|
138
|
+
sandbox: Literal["read-only", "workspace-write", "danger-full-access"] = "workspace-write"
|
|
119
139
|
ask_for_approval: Literal["untrusted", "on-request", "never"] = "never"
|
|
120
140
|
|
|
121
141
|
|
|
@@ -125,6 +145,7 @@ class GeminiTaskSpec(BaseAICliTaskSpec):
|
|
|
125
145
|
Schema lives in v1 so the discriminated union JSON Schema for the
|
|
126
146
|
LLM tool fast-path doesn't change when v2 lands.
|
|
127
147
|
"""
|
|
148
|
+
|
|
128
149
|
provider: Literal["gemini"] = "gemini"
|
|
129
150
|
session_id: Optional[str] = None
|
|
130
151
|
resume: Optional[str] = Field(
|
|
@@ -145,8 +166,10 @@ AICliTaskSpec = Annotated[
|
|
|
145
166
|
# Result models (Pydantic for serialisation; mirror dataclasses in protocol.py)
|
|
146
167
|
# ---------------------------------------------------------------------------
|
|
147
168
|
|
|
169
|
+
|
|
148
170
|
class CanonicalUsagePydantic(BaseModel):
|
|
149
171
|
"""Pydantic mirror of `protocol.CanonicalUsage` for output serialisation."""
|
|
172
|
+
|
|
150
173
|
input_tokens: int = 0
|
|
151
174
|
output_tokens: int = 0
|
|
152
175
|
cache_read: int = 0
|
|
@@ -157,6 +180,7 @@ class CanonicalUsagePydantic(BaseModel):
|
|
|
157
180
|
|
|
158
181
|
class SessionResultModel(BaseModel):
|
|
159
182
|
"""Per-task result, JSON-serialisable."""
|
|
183
|
+
|
|
160
184
|
task_id: str
|
|
161
185
|
session_id: Optional[str] = None
|
|
162
186
|
provider: str = ""
|
|
@@ -178,6 +202,7 @@ class SessionResultModel(BaseModel):
|
|
|
178
202
|
|
|
179
203
|
class BatchSummary(BaseModel):
|
|
180
204
|
"""Aggregated batch summary."""
|
|
205
|
+
|
|
181
206
|
n_tasks: int = 0
|
|
182
207
|
n_succeeded: int = 0
|
|
183
208
|
n_failed: int = 0
|
|
@@ -188,6 +213,7 @@ class BatchSummary(BaseModel):
|
|
|
188
213
|
|
|
189
214
|
class BatchResultModel(BaseModel):
|
|
190
215
|
"""Top-level batch result returned by `run_batch()`."""
|
|
216
|
+
|
|
191
217
|
tasks: List[SessionResultModel] = Field(default_factory=list)
|
|
192
218
|
summary: BatchSummary = Field(default_factory=BatchSummary)
|
|
193
219
|
provider: str = ""
|
|
@@ -198,6 +224,7 @@ class BatchResultModel(BaseModel):
|
|
|
198
224
|
# Helpers
|
|
199
225
|
# ---------------------------------------------------------------------------
|
|
200
226
|
|
|
227
|
+
|
|
201
228
|
def session_result_to_model(sr: Any) -> SessionResultModel:
|
|
202
229
|
"""Convert a `protocol.SessionResult` dataclass to its Pydantic mirror."""
|
|
203
230
|
cu = CanonicalUsagePydantic(
|
|
@@ -63,9 +63,9 @@ def expose_workflow_tools(connected_tools: List[Dict[str, Any]]) -> None:
|
|
|
63
63
|
try:
|
|
64
64
|
handler = _build_handler(node_type, cls.Params)
|
|
65
65
|
mcp.add_tool(
|
|
66
|
-
handler,
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
handler,
|
|
67
|
+
name=node_type,
|
|
68
|
+
description=(getattr(cls, "description", None) or f"MachinaOs workflow tool: {node_type}"),
|
|
69
69
|
)
|
|
70
70
|
logger.info("[CC-Agent MCP] exposed mcp__machinaos__%s", node_type)
|
|
71
71
|
except Exception as exc: # pragma: no cover
|
|
@@ -99,9 +99,11 @@ def unexpose_workflow_tools(connected_tools: List[Dict[str, Any]]) -> None:
|
|
|
99
99
|
# Internals
|
|
100
100
|
# ---------------------------------------------------------------------------
|
|
101
101
|
|
|
102
|
+
|
|
102
103
|
def _get_mcp() -> Optional[Any]:
|
|
103
104
|
"""Late import to avoid a circular import with ``mcp_server``."""
|
|
104
105
|
from services.cli_agent import mcp_server
|
|
106
|
+
|
|
105
107
|
return mcp_server._mcp_singleton
|
|
106
108
|
|
|
107
109
|
|
|
@@ -130,10 +132,7 @@ def _schedule_list_changed_notify() -> None:
|
|
|
130
132
|
|
|
131
133
|
async def _do_notify() -> None:
|
|
132
134
|
try:
|
|
133
|
-
session = (
|
|
134
|
-
getattr(mcp, "session", None)
|
|
135
|
-
or getattr(getattr(mcp, "_mcp_server", None), "session", None)
|
|
136
|
-
)
|
|
135
|
+
session = getattr(mcp, "session", None) or getattr(getattr(mcp, "_mcp_server", None), "session", None)
|
|
137
136
|
if session is not None and hasattr(session, "send_tool_list_changed"):
|
|
138
137
|
await session.send_tool_list_changed()
|
|
139
138
|
except Exception as exc:
|
|
@@ -168,13 +167,18 @@ def _build_handler(node_type: str, params_cls: type):
|
|
|
168
167
|
default = None
|
|
169
168
|
else:
|
|
170
169
|
default = finfo.default
|
|
171
|
-
parameters.append(
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
170
|
+
parameters.append(
|
|
171
|
+
inspect.Parameter(
|
|
172
|
+
fname,
|
|
173
|
+
inspect.Parameter.KEYWORD_ONLY,
|
|
174
|
+
annotation=finfo.annotation,
|
|
175
|
+
default=default,
|
|
176
|
+
)
|
|
177
|
+
)
|
|
175
178
|
|
|
176
179
|
async def _handler(**kwargs: Any) -> Dict[str, Any]:
|
|
177
180
|
from services.cli_agent.mcp_server import _require_batch
|
|
181
|
+
|
|
178
182
|
ctx = _require_batch()
|
|
179
183
|
entry = next(
|
|
180
184
|
(t for t in ctx.connected_tools if t.get("node_type") == node_type),
|
|
@@ -195,9 +199,13 @@ def _build_handler(node_type: str, params_cls: type):
|
|
|
195
199
|
args = dict(kwargs)
|
|
196
200
|
logger.info(
|
|
197
201
|
"[CC-Agent MCP %s] node=%s wf=%s args_keys=%s",
|
|
198
|
-
node_type,
|
|
202
|
+
node_type,
|
|
203
|
+
ctx.node_id,
|
|
204
|
+
ctx.workflow_id,
|
|
205
|
+
list(args.keys()),
|
|
199
206
|
)
|
|
200
207
|
from services.handlers.tools import execute_tool
|
|
208
|
+
|
|
201
209
|
config: Dict[str, Any] = {
|
|
202
210
|
"node_type": node_type,
|
|
203
211
|
"node_id": entry.get("node_id"),
|
|
@@ -211,19 +219,24 @@ def _build_handler(node_type: str, params_cls: type):
|
|
|
211
219
|
if "error" in result:
|
|
212
220
|
logger.warning(
|
|
213
221
|
"[CC-Agent MCP %s] node=%s ERROR: %s",
|
|
214
|
-
node_type,
|
|
222
|
+
node_type,
|
|
223
|
+
entry.get("node_id"),
|
|
224
|
+
result.get("error"),
|
|
215
225
|
)
|
|
216
226
|
else:
|
|
217
227
|
logger.info(
|
|
218
228
|
"[CC-Agent MCP %s] node=%s OK (result_keys=%s)",
|
|
219
|
-
node_type,
|
|
229
|
+
node_type,
|
|
230
|
+
entry.get("node_id"),
|
|
231
|
+
list(result.keys())[:8],
|
|
220
232
|
)
|
|
221
233
|
return result
|
|
222
234
|
|
|
223
235
|
_handler.__name__ = node_type
|
|
224
236
|
_handler.__annotations__ = annotations
|
|
225
237
|
_handler.__signature__ = inspect.Signature( # type: ignore[attr-defined]
|
|
226
|
-
parameters,
|
|
238
|
+
parameters,
|
|
239
|
+
return_annotation=Dict[str, Any],
|
|
227
240
|
)
|
|
228
241
|
return _handler
|
|
229
242
|
|
|
@@ -39,13 +39,13 @@ def _extract_text_from_response(content) -> str:
|
|
|
39
39
|
text_parts = []
|
|
40
40
|
for block in content:
|
|
41
41
|
if isinstance(block, dict):
|
|
42
|
-
if block.get(
|
|
43
|
-
text_parts.append(block[
|
|
44
|
-
elif
|
|
45
|
-
text_parts.append(str(block[
|
|
42
|
+
if block.get("type") == "text" and block.get("text"):
|
|
43
|
+
text_parts.append(block["text"])
|
|
44
|
+
elif "text" in block:
|
|
45
|
+
text_parts.append(str(block["text"]))
|
|
46
46
|
elif isinstance(block, str):
|
|
47
47
|
text_parts.append(block)
|
|
48
|
-
return
|
|
48
|
+
return "\n".join(text_parts)
|
|
49
49
|
|
|
50
50
|
# Handle string content
|
|
51
51
|
if isinstance(content, str):
|
|
@@ -57,6 +57,7 @@ def _extract_text_from_response(content) -> str:
|
|
|
57
57
|
|
|
58
58
|
class CompactionConfig(BaseModel):
|
|
59
59
|
"""Provider-agnostic compaction configuration."""
|
|
60
|
+
|
|
60
61
|
enabled: bool = True
|
|
61
62
|
|
|
62
63
|
|
|
@@ -76,6 +77,7 @@ class CompactionService:
|
|
|
76
77
|
"""Per-user override from ``user_settings.compaction_ratio``, falling
|
|
77
78
|
back to ``agent.compaction.ratio`` in ``llm_defaults.json``."""
|
|
78
79
|
from services.model_registry import get_model_registry
|
|
80
|
+
|
|
79
81
|
try:
|
|
80
82
|
settings = await self._db.get_user_settings("default")
|
|
81
83
|
if settings and "compaction_ratio" in settings:
|
|
@@ -95,6 +97,7 @@ class CompactionService:
|
|
|
95
97
|
wins over the value returned here.
|
|
96
98
|
"""
|
|
97
99
|
from services.model_registry import get_model_registry
|
|
100
|
+
|
|
98
101
|
registry = get_model_registry()
|
|
99
102
|
if ratio is None:
|
|
100
103
|
ratio = float(registry.get_agent_defaults()["compaction"]["ratio"])
|
|
@@ -108,10 +111,7 @@ class CompactionService:
|
|
|
108
111
|
if not threshold:
|
|
109
112
|
ratio = await self._get_compaction_ratio()
|
|
110
113
|
threshold = self.get_model_threshold(model, provider, ratio=ratio)
|
|
111
|
-
return {
|
|
112
|
-
"enabled": self._config.enabled,
|
|
113
|
-
"context_token_threshold": threshold
|
|
114
|
-
}
|
|
114
|
+
return {"enabled": self._config.enabled, "context_token_threshold": threshold}
|
|
115
115
|
|
|
116
116
|
async def anthropic_api_config(self, threshold: Optional[int] = None, model: str = "", provider: str = "anthropic") -> Dict[str, Any]:
|
|
117
117
|
"""Anthropic Messages API context_management config."""
|
|
@@ -120,12 +120,7 @@ class CompactionService:
|
|
|
120
120
|
threshold = self.get_model_threshold(model, provider, ratio=ratio)
|
|
121
121
|
return {
|
|
122
122
|
"betas": ["compact-2026-01-12"],
|
|
123
|
-
"context_management": {
|
|
124
|
-
"edits": [{
|
|
125
|
-
"type": "compact_20260112",
|
|
126
|
-
"trigger": {"type": "input_tokens", "value": threshold}
|
|
127
|
-
}]
|
|
128
|
-
}
|
|
123
|
+
"context_management": {"edits": [{"type": "compact_20260112", "trigger": {"type": "input_tokens", "value": threshold}}]},
|
|
129
124
|
}
|
|
130
125
|
|
|
131
126
|
async def openai_config(self, threshold: Optional[int] = None, model: str = "", provider: str = "openai") -> Dict[str, Any]:
|
|
@@ -146,35 +141,40 @@ class CompactionService:
|
|
|
146
141
|
output_tokens=usage.get("output_tokens", 0),
|
|
147
142
|
cache_read_tokens=usage.get("cache_read_tokens", 0),
|
|
148
143
|
cache_creation_tokens=usage.get("cache_creation_tokens", 0),
|
|
149
|
-
reasoning_tokens=usage.get("reasoning_tokens", 0)
|
|
144
|
+
reasoning_tokens=usage.get("reasoning_tokens", 0),
|
|
150
145
|
)
|
|
151
146
|
|
|
152
147
|
# Save token metric with cost fields
|
|
153
|
-
await self._db.save_token_metric(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
148
|
+
await self._db.save_token_metric(
|
|
149
|
+
{
|
|
150
|
+
"session_id": session_id,
|
|
151
|
+
"node_id": node_id,
|
|
152
|
+
"provider": provider,
|
|
153
|
+
"model": model,
|
|
154
|
+
**usage,
|
|
155
|
+
"input_cost": cost["input_cost"],
|
|
156
|
+
"output_cost": cost["output_cost"],
|
|
157
|
+
"cache_cost": cost["cache_cost"],
|
|
158
|
+
"total_cost": cost["total_cost"],
|
|
159
|
+
}
|
|
160
|
+
)
|
|
164
161
|
|
|
165
162
|
state = await self._db.get_or_create_session_token_state(session_id)
|
|
166
163
|
new_total = state["cumulative_total"] + usage.get("total_tokens", 0)
|
|
167
164
|
new_total_cost = state.get("cumulative_total_cost", 0.0) + cost["total_cost"]
|
|
168
165
|
|
|
169
166
|
# Update cumulative state with cost
|
|
170
|
-
await self._db.update_session_token_state(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
167
|
+
await self._db.update_session_token_state(
|
|
168
|
+
session_id,
|
|
169
|
+
{
|
|
170
|
+
"cumulative_input_tokens": state["cumulative_input_tokens"] + usage.get("input_tokens", 0),
|
|
171
|
+
"cumulative_output_tokens": state["cumulative_output_tokens"] + usage.get("output_tokens", 0),
|
|
172
|
+
"cumulative_total": new_total,
|
|
173
|
+
"cumulative_input_cost": state.get("cumulative_input_cost", 0.0) + cost["input_cost"],
|
|
174
|
+
"cumulative_output_cost": state.get("cumulative_output_cost", 0.0) + cost["output_cost"],
|
|
175
|
+
"cumulative_total_cost": new_total_cost,
|
|
176
|
+
},
|
|
177
|
+
)
|
|
178
178
|
|
|
179
179
|
# Priority: per-session custom > model-aware (with user ratio) > global default
|
|
180
180
|
custom = state.get("custom_threshold")
|
|
@@ -186,6 +186,7 @@ class CompactionService:
|
|
|
186
186
|
|
|
187
187
|
# Get the model's full context window size for frontend display
|
|
188
188
|
from services.model_registry import get_model_registry
|
|
189
|
+
|
|
189
190
|
registry = get_model_registry()
|
|
190
191
|
context_length = registry.get_context_length(model, provider)
|
|
191
192
|
|
|
@@ -195,22 +196,35 @@ class CompactionService:
|
|
|
195
196
|
"cost": cost,
|
|
196
197
|
"threshold": threshold,
|
|
197
198
|
"context_length": context_length,
|
|
198
|
-
"needs_compaction": self._config.enabled and new_total >= threshold
|
|
199
|
+
"needs_compaction": self._config.enabled and new_total >= threshold,
|
|
199
200
|
}
|
|
200
201
|
|
|
201
|
-
async def record(
|
|
202
|
+
async def record(
|
|
203
|
+
self, session_id: str, node_id: str, provider: str, model: str, tokens_before: int, tokens_after: int, summary: Optional[str] = None
|
|
204
|
+
) -> None:
|
|
202
205
|
"""Record compaction event after native API handles it."""
|
|
203
206
|
state = await self._db.get_or_create_session_token_state(session_id)
|
|
204
|
-
await self._db.save_compaction_event(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
207
|
+
await self._db.save_compaction_event(
|
|
208
|
+
{
|
|
209
|
+
"session_id": session_id,
|
|
210
|
+
"node_id": node_id,
|
|
211
|
+
"trigger_reason": "native",
|
|
212
|
+
"tokens_before": tokens_before,
|
|
213
|
+
"tokens_after": tokens_after,
|
|
214
|
+
"summary_model": model,
|
|
215
|
+
"summary_provider": provider,
|
|
216
|
+
"success": True,
|
|
217
|
+
"summary_content": summary,
|
|
218
|
+
}
|
|
219
|
+
)
|
|
220
|
+
await self._db.update_session_token_state(
|
|
221
|
+
session_id,
|
|
222
|
+
{
|
|
223
|
+
"cumulative_total": tokens_after,
|
|
224
|
+
"last_compaction_at": datetime.now(timezone.utc),
|
|
225
|
+
"compaction_count": state["compaction_count"] + 1,
|
|
226
|
+
},
|
|
227
|
+
)
|
|
214
228
|
|
|
215
229
|
async def stats(self, session_id: str, model: str = "", provider: str = "") -> Dict[str, Any]:
|
|
216
230
|
"""Get session statistics.
|
|
@@ -229,6 +243,7 @@ class CompactionService:
|
|
|
229
243
|
context_length = 0
|
|
230
244
|
if model and provider:
|
|
231
245
|
from services.model_registry import get_model_registry
|
|
246
|
+
|
|
232
247
|
registry = get_model_registry()
|
|
233
248
|
context_length = registry.get_context_length(model, provider)
|
|
234
249
|
|
|
@@ -299,17 +314,16 @@ Provide a concise but complete summary."""
|
|
|
299
314
|
|
|
300
315
|
# Use a reasonable summary size: min(4096, model's max output)
|
|
301
316
|
from services.model_registry import get_model_registry
|
|
317
|
+
|
|
302
318
|
model_max = get_model_registry().get_max_output_tokens(model, provider)
|
|
303
319
|
summary_tokens = min(4096, model_max)
|
|
304
320
|
|
|
305
|
-
llm = self._ai_service.create_model(
|
|
306
|
-
provider=provider, api_key=api_key, model=model,
|
|
307
|
-
temperature=0.3, max_tokens=summary_tokens
|
|
308
|
-
)
|
|
321
|
+
llm = self._ai_service.create_model(provider=provider, api_key=api_key, model=model, temperature=0.3, max_tokens=summary_tokens)
|
|
309
322
|
|
|
310
323
|
from langchain_core.messages import HumanMessage
|
|
324
|
+
|
|
311
325
|
response = await llm.ainvoke([HumanMessage(content=prompt)])
|
|
312
|
-
raw_content = response.content if hasattr(response,
|
|
326
|
+
raw_content = response.content if hasattr(response, "content") else str(response)
|
|
313
327
|
summary = _extract_text_from_response(raw_content)
|
|
314
328
|
|
|
315
329
|
new_memory = f"# Conversation Summary (Compacted)\n*Generated: {datetime.now(timezone.utc).isoformat()}*\n\n{summary}"
|
|
@@ -326,9 +340,11 @@ Provide a concise but complete summary."""
|
|
|
326
340
|
|
|
327
341
|
_service: Optional[CompactionService] = None
|
|
328
342
|
|
|
343
|
+
|
|
329
344
|
def get_compaction_service() -> Optional[CompactionService]:
|
|
330
345
|
return _service
|
|
331
346
|
|
|
347
|
+
|
|
332
348
|
def init_compaction_service(database: "Database", settings: "Settings") -> CompactionService:
|
|
333
349
|
global _service
|
|
334
350
|
_service = CompactionService(database, settings)
|
|
@@ -64,13 +64,9 @@ class CredentialRegistry:
|
|
|
64
64
|
with _CONFIG_PATH.open(encoding="utf-8") as f:
|
|
65
65
|
self._raw = json.load(f)
|
|
66
66
|
except FileNotFoundError as e:
|
|
67
|
-
raise CredentialRegistryError(
|
|
68
|
-
f"credential_providers.json not found at {_CONFIG_PATH}"
|
|
69
|
-
) from e
|
|
67
|
+
raise CredentialRegistryError(f"credential_providers.json not found at {_CONFIG_PATH}") from e
|
|
70
68
|
except json.JSONDecodeError as e:
|
|
71
|
-
raise CredentialRegistryError(
|
|
72
|
-
f"credential_providers.json is not valid JSON: {e}"
|
|
73
|
-
) from e
|
|
69
|
+
raise CredentialRegistryError(f"credential_providers.json is not valid JSON: {e}") from e
|
|
74
70
|
return self._raw
|
|
75
71
|
|
|
76
72
|
def _resolve_all(self) -> Dict[str, Dict[str, Any]]:
|
|
@@ -98,13 +94,10 @@ class CredentialRegistry:
|
|
|
98
94
|
"""Walk the extends chain, deep-merge parent then child overrides."""
|
|
99
95
|
if provider_id in visiting:
|
|
100
96
|
raise CredentialRegistryError(
|
|
101
|
-
f"extends cycle detected involving provider {provider_id!r}: "
|
|
102
|
-
f"{' -> '.join(sorted(visiting))} -> {provider_id}"
|
|
97
|
+
f"extends cycle detected involving provider {provider_id!r}: " f"{' -> '.join(sorted(visiting))} -> {provider_id}"
|
|
103
98
|
)
|
|
104
99
|
if provider_id not in raw:
|
|
105
|
-
raise CredentialRegistryError(
|
|
106
|
-
f"provider {provider_id!r} referenced via extends but not defined"
|
|
107
|
-
)
|
|
100
|
+
raise CredentialRegistryError(f"provider {provider_id!r} referenced via extends but not defined")
|
|
108
101
|
|
|
109
102
|
entry = raw[provider_id]
|
|
110
103
|
extends = entry.get("extends")
|
|
@@ -158,10 +151,7 @@ class CredentialRegistry:
|
|
|
158
151
|
categories = raw.get("categories", {})
|
|
159
152
|
if not isinstance(categories, dict):
|
|
160
153
|
return []
|
|
161
|
-
out = [
|
|
162
|
-
{"key": key, "label": cfg.get("label", key), "order": cfg.get("order", 0)}
|
|
163
|
-
for key, cfg in categories.items()
|
|
164
|
-
]
|
|
154
|
+
out = [{"key": key, "label": cfg.get("label", key), "order": cfg.get("order", 0)} for key, cfg in categories.items()]
|
|
165
155
|
out.sort(key=lambda c: (c["order"], c["key"]))
|
|
166
156
|
return out
|
|
167
157
|
|
|
@@ -238,11 +228,7 @@ def _deep_merge(parent: Dict[str, Any], child: Dict[str, Any]) -> Dict[str, Any]
|
|
|
238
228
|
parent_value = result.get(key)
|
|
239
229
|
if isinstance(parent_value, dict) and isinstance(child_value, dict):
|
|
240
230
|
result[key] = _deep_merge(parent_value, child_value)
|
|
241
|
-
elif (
|
|
242
|
-
key in _MERGE_BY_KEY_ARRAYS
|
|
243
|
-
and isinstance(parent_value, list)
|
|
244
|
-
and isinstance(child_value, list)
|
|
245
|
-
):
|
|
231
|
+
elif key in _MERGE_BY_KEY_ARRAYS and isinstance(parent_value, list) and isinstance(child_value, list):
|
|
246
232
|
result[key] = _merge_array_by_key(parent_value, child_value)
|
|
247
233
|
else:
|
|
248
234
|
result[key] = copy.deepcopy(child_value)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Credential-management WS handlers — Wave 13.5 extraction.
|
|
2
|
+
|
|
3
|
+
Side-effect import registers the 4 credential CRUD handlers
|
|
4
|
+
(validate_api_key / get_stored_api_key / save_api_key / delete_api_key)
|
|
5
|
+
into ``ws_handler_registry``. The per-provider validation logic lives
|
|
6
|
+
in ``services/plugin/credential.py``'s ``CREDENTIAL_REGISTRY``; these
|
|
7
|
+
handlers just shape the request + response envelope around it.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from services.ws_handler_registry import register_ws_handlers as _register_ws_handlers
|
|
13
|
+
|
|
14
|
+
from .handlers import WS_HANDLERS as _CREDENTIALS_WS_HANDLERS
|
|
15
|
+
|
|
16
|
+
_register_ws_handlers(_CREDENTIALS_WS_HANDLERS)
|
|
17
|
+
|
|
18
|
+
__all__ = ["handlers"]
|