@xopcai/xopc 0.0.413 → 0.0.415
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BT6oqCMD.js → agent-avatar-dicebear-CJFwitU2.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DclyJr1N.js +1 -0
- package/dist/gateway/static/root/assets/{agents-admin-api-CeBkHnl8.js → agents-admin-api-B1p-ghg9.js} +1 -1
- package/dist/gateway/static/root/assets/agents-jhErNtzi.js +77 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BdCgtTfT.js → app-management-settings-panel-DgwqNi5i.js} +1 -1
- package/dist/gateway/static/root/assets/app-window-DXFNqt_0.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-C3-hCFlF.js → appearance-settings-C0wJfFyz.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-C0LcnI4h.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BviFGCy4.js → archive-plugin-Ch7wolHE.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-CfzazXE5.js → automations-page-DK7AU79v.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CBxiV34x.js +8 -0
- package/dist/gateway/static/root/assets/{binary-plugins-Dp-gtJEk.js → binary-plugins-B4HcHYsC.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-D-DEPdpi.js → block-editor-BQAWEZF-.js} +4 -4
- package/dist/gateway/static/root/assets/{browser-automation-inputs-D1pDgMJu.js → browser-automation-inputs-D6AccXaA.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-vJIrTxdi.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-in5Roh_E.js +3 -0
- package/dist/gateway/static/root/assets/{capabilities-Bpeh6E22.js → capabilities-BlxF36t-.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-CiGx8wpQ.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-a8kqjzQu.js +8 -0
- package/dist/gateway/static/root/assets/{capability-header-actions-CP2fI9Fe.js → capability-header-actions-D4Yq35fD.js} +1 -1
- package/dist/gateway/static/root/assets/channels-C_CxcjKT.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-BL3tFntQ.js → chat-terminal-dock-zdMySdMm.js} +2 -2
- package/dist/gateway/static/root/assets/chevron-down-ccbiQQz_.js +1 -0
- package/dist/gateway/static/root/assets/{computer-settings-page-DEQ5GYfC.js → computer-settings-page-C5Z6Jr0p.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-CecwMnC5.js → connector-service-page-Cxus0qrZ.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DCBO2CxK.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-N5jnlvPs.js → date-picker-DuyyD6jz.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-BZN72rrk.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-BtvTIDCi.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-settings-BcyP7Z6v.js +1 -0
- package/dist/gateway/static/root/assets/device-pairing-wizard-Ctbgr50F.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-CbMbPimD.js → directory-picker-path-field-DOusKz-O.js} +1 -1
- package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-OE1nJMQ8.js → extension-debug-page-Bt4FwsFu.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BEomiKhy.js → extension-page-0vsxX3FB.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BFOjQeSX.js → extension-settings-page-5Pt5_ELc.js} +1 -1
- package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
- package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-DF_HV6NP.js → gateway-config-swr-fQKBHBi1.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-DMAzNlm-.js → gateway-realtime-DkWCHVzI.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-Bx9KCID-.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-BsVOcmV5.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B91CBTzO.js → gateway-startup-retry-Cfwxof4k.js} +1 -1
- package/dist/gateway/static/root/assets/{highlight-code-6ONPRH5r.js → highlight-code-C8eS9949.js} +1 -1
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-EJ9Kg4iQ.js → highlighted-body-KQOG7T2V-Cbk7eMlg.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-BZDZnmyc.js +2 -0
- package/dist/gateway/static/root/assets/{image-generation-api-D0HNic89.js → image-generation-api-CAS8QVla.js} +1 -1
- package/dist/gateway/static/root/assets/imports-page-BCLBYzV1.js +1 -0
- package/dist/gateway/static/root/assets/index-Bys6njTY.js +710 -0
- package/dist/gateway/static/root/assets/index-Vsf0bj5e.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Cmi-2SIh.js → keyboard-shortcuts-settings-CM_kt5XN.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Dk87jtcc.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-jgaogH9Z.js → local-apps-page-BTSOChhk.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-DvmwiLUx.js → local-session-drafts-iGX_6O0O.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-JogcXC4J.js → locale-store-B7s2Hb35.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-D3gVdm8S.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-BQNYFE4J.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-BRS9puQV.js → media-plugins-DYQDjCVQ.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-ChweJKTv.js +1 -0
- package/dist/gateway/static/root/assets/{messages-RzwPiQNL.js → messages-BYq0cPbn.js} +2 -2
- package/dist/gateway/static/root/assets/note-detail-panel-CYKwUCte.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-BTSZb9ZT.js +1 -0
- package/dist/gateway/static/root/assets/notes-page-CJ5nhWfL.js +8 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-D_VOB2_C.js → page-context-capture-button-DVn_dU83.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-DcW14lqn.js +1 -0
- package/dist/gateway/static/root/assets/personal-settings-panel-C16Iqe7X.js +1 -0
- package/dist/gateway/static/root/assets/phone-dependencies-card-D3l9uPFM.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-picker-DOv38vBn.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-DUHp1q_9.js +1 -0
- package/dist/gateway/static/root/assets/plugin-details-dialog-BpfgDlVa.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DaTaSKox.js → preview-open-alternatives-RlHk76TI.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-wYlC0IVZ.js → product-open-page-Dh-HqLrE.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-Bxur-p6S.js → product-preview-content-c3K-4DWc.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-GD8TxKad.js +7 -0
- package/dist/gateway/static/root/assets/projects-page-B8HAt9sD.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BGqSwITi.js → registry-api-BcfoLEna.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-D3el7lHK.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-CSm5SpnR.js → runtime-tools-api-DesqGCnE.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DXNidliV.js → runtime-tools-settings-panel-Dbskk6RG.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DeSZ7SiO.js → schema-form-CXO1B1k4.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DTxZyMta.js → session-api-DdQnMwkl.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-B2HDomj4.js → session-manager-CA1NkTR_.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-07liaSHH.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BGjU8rfN.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BNYQjZU4.js → settings-form-section-BQxKmbbJ.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-29Ix0jSQ.js → settings-page-DvVMpKiA.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-COQZgKX9.js → setup-status-panel-DKo_VTx-.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CwMRULXc.js → share-preview-page-XgZk8Oa1.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BODFqK8k.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-xfB5fUAh.js → skill-api-CV-WT2hj.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Ce6OUk2C.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-B7ehOIML.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-DRJu1ehM.js → system-settings-panel-CxJkZRT4.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-CxRR0QuW.js +2 -0
- package/dist/gateway/static/root/assets/{task-result-evidence-C4o_Yue_.js → task-result-evidence-D-gGKNX9.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-CYslh-Pu.js → tracing-settings-page-CQw3G-FB.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-Bi_kw6bv.js → tunnel-api-B2HnCi0U.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-uUEkO38r.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-BkB9uD93.js → use-autosave-Dc0nwUpX.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-ICUutbKL.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-bt8_Agih.js → voice-api-key-field-BSWXZkGa.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D7xsWrdh.js → voice-config-api-BkUlN7GH.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-D3NG14dX.js → work-discovery-overlay-H3cdwq3l.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-B2OUKOQi.js → xopc-cloud-account-card-CvT_W6YS.js} +1 -1
- package/dist/gateway/static/root/index.html +19 -14
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +1 -1
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/coding/workspace-revision.js +1 -1
- package/dist/src/agent/commands/command-registry.js +1 -1
- package/dist/src/agent/external-tools/cliProvider.js +2 -2
- package/dist/src/agent/external-tools/composio-provider.js +2 -2
- package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
- package/dist/src/agent/memory/context-recovery.d.ts +1 -1
- package/dist/src/agent/service.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/installer.js +3 -3
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +5 -3
- package/dist/src/agent/tools/personal-read-tool.js +1 -1
- package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
- package/dist/src/agent/tools/personal-task-tool.js +23 -21
- package/dist/src/agent/tools/phone-use-tool.js +22 -2
- package/dist/src/agent/tools/xopc-use-tool.js +2 -2
- package/dist/src/agent-catalog/capabilities.js +2 -2
- package/dist/src/agent-catalog/repository.js +1 -1
- package/dist/src/automations/capabilities/drafts.js +1 -1
- package/dist/src/backup/archive.js +2 -1
- package/dist/src/browser/providers/browser-ext-install.js +2 -2
- package/dist/src/capabilities/runtime/dispatcher.js +1 -1
- package/dist/src/capabilities/runtime/product.js +1 -1
- package/dist/src/cli/commands/agents.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/connectors/connected-source-understanding.js +1 -1
- package/dist/src/connectors/learning-coordinator.js +1 -1
- package/dist/src/execution-environments/local-worktree-manager.js +1 -1
- package/dist/src/extensions/agent-plugins/skill-catalog.js +1 -1
- package/dist/src/extensions/agent-plugins/validation.js +1 -1
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/global-defaults-admin.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +7 -7
- package/dist/src/gateway/hono/routes/home.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +2 -2
- package/dist/src/gateway/hono/routes/phone.js +33 -4
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/public-gateway.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
- package/dist/src/gateway/hono/routes/tasks.js +1 -1
- package/dist/src/gateway/image-generation-setup.js +1 -1
- package/dist/src/gateway/service/session-input-coordinator.js +1 -1
- package/dist/src/gateway/service.js +7 -7
- package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
- package/dist/src/imports/importService.js +1 -1
- package/dist/src/infra/unhandled-rejections.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/local-apps/service.js +1 -1
- package/dist/src/personal-agent/prompts.js +1 -1
- package/dist/src/personal-agent/service.js +1 -1
- package/dist/src/phone/adb-driver.d.ts +9 -2
- package/dist/src/phone/adb-driver.js +113 -37
- package/dist/src/phone/app-access.d.ts +10 -0
- package/dist/src/phone/app-access.js +21 -0
- package/dist/src/phone/applications.d.ts +4 -0
- package/dist/src/phone/applications.js +49 -0
- package/dist/src/phone/cloud-adb.d.ts +1 -0
- package/dist/src/phone/cloud-adb.js +60 -2
- package/dist/src/phone/cloud-phones.js +2 -1
- package/dist/src/phone/cloud-scrcpy.d.ts +3 -1
- package/dist/src/phone/cloud-scrcpy.js +19 -4
- package/dist/src/phone/contracts.d.ts +54 -1
- package/dist/src/phone/contracts.js +18 -4
- package/dist/src/phone/model-adapter.d.ts +90 -2
- package/dist/src/phone/model-adapter.js +87 -19
- package/dist/src/phone/reliability.d.ts +7 -0
- package/dist/src/phone/reliability.js +66 -0
- package/dist/src/phone/repository.js +4 -3
- package/dist/src/phone/runtime.d.ts +14 -1
- package/dist/src/phone/runtime.js +215 -19
- package/dist/src/phone/scrcpy-assets.d.ts +4 -0
- package/dist/src/phone/scrcpy-assets.js +16 -0
- package/dist/src/phone/scrcpy-text.d.ts +11 -0
- package/dist/src/phone/scrcpy-text.js +72 -0
- package/dist/src/phone/scrcpy.d.ts +6 -5
- package/dist/src/phone/scrcpy.js +51 -14
- package/dist/src/runtime-tools/archive.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/offline-access.js +13 -7
- package/dist/src/storage/sqlite/schema-errors.d.ts +12 -0
- package/dist/src/storage/sqlite/schema-errors.js +21 -3
- package/dist/src/storage/sqlite/schema-upgrade.d.ts +4 -0
- package/dist/src/storage/sqlite/schema-upgrade.js +78 -0
- package/dist/src/storage/sqlite/schema.d.ts +2 -1
- package/dist/src/storage/sqlite/schema.js +9 -3
- package/dist/src/storage/sqlite/upgrades/203_remove_retired_proactive_contracts.sql +70 -0
- package/dist/src/storage/sqlite/upgrades/204_home_intelligence.sql +78 -0
- package/dist/src/storage/sqlite/upgrades/205_agent_catalog.sql +66 -0
- package/dist/src/storage/sqlite/upgrades/206_home_advice_strategy_version.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/207_user_model_policy_contract.sql +121 -0
- package/dist/src/storage/sqlite/upgrades/208_automation_management.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/209_automation_event_hub.sql +48 -0
- package/dist/src/storage/sqlite/upgrades/210_remove_legacy_automation_timeout.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/211_automation_result_deliveries.sql +16 -0
- package/dist/src/storage/sqlite/upgrades/212_automation_delivery_policy.sql +30 -0
- package/dist/src/storage/sqlite/upgrades/213_automation_reliability_contract.sql +188 -0
- package/dist/src/storage/sqlite/upgrades/214_ai_usage_ledger.sql +41 -0
- package/dist/src/storage/sqlite/upgrades/215_scene_execution_adapters.sql +6 -0
- package/dist/src/storage/sqlite/upgrades/216_remove_scene_model_usage.sql +1 -0
- package/dist/src/storage/sqlite/upgrades/217_remove_legacy_memory_tables.sql +4 -0
- package/dist/src/storage/sqlite/upgrades/218_core_relation_indexes.sql +26 -0
- package/dist/src/storage/sqlite/upgrades/219_json_contracts.sql +123 -0
- package/dist/src/storage/sqlite/upgrades/220_normalize_timestamps.sql +339 -0
- package/dist/src/storage/sqlite/upgrades/221_ai_usage_retention_index.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/222_session_config_authority.sql +13 -0
- package/dist/src/storage/sqlite/upgrades/223_session_creation_receipts.sql +59 -0
- package/dist/src/storage/sqlite/upgrades/224_task_origin_links.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/225_task_collaboration.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/226_task_main_updates.sql +9 -0
- package/dist/src/storage/sqlite/upgrades/227_task_main_update_decisions.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/228_task_main_agent_links.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/229_task_criterion_reviews.sql +12 -0
- package/dist/src/storage/sqlite/upgrades/230_personal_agent_onboarding.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/231_task_result_deliveries.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/232_personal_requests.sql +28 -0
- package/dist/src/storage/sqlite/upgrades/233_observability_usage_links.sql +3 -0
- package/dist/src/storage/sqlite/upgrades/234_task_result_reply.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/235_personal_conversation_priority.sql +3 -0
- package/dist/src/storage/sqlite/upgrades/236_personal_proactivity.sql +53 -0
- package/dist/src/storage/sqlite/upgrades/237_personal_strategy_versions.sql +18 -0
- package/dist/src/storage/sqlite/upgrades/238_browser_record_replay.sql +45 -0
- package/dist/src/storage/sqlite/upgrades/239_clarification_notifications.sql +26 -0
- package/dist/src/storage/sqlite/upgrades/240_device_settings.sql +5 -0
- package/dist/src/storage/sqlite/upgrades/241_device_grant_audit.sql +13 -0
- package/dist/src/storage/sqlite/upgrades/242_cloud_usage_receipts.sql +5 -0
- package/dist/src/storage/sqlite/upgrades/243_voice_opening_greetings.sql +12 -0
- package/dist/src/storage/sqlite/upgrades/244_device_request_proofs.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/245_memory_learning.sql +125 -0
- package/dist/src/storage/sqlite/upgrades/246_personal_session_thinking.sql +22 -0
- package/dist/src/storage/sqlite/upgrades/247_agent_selection_records.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/248_next_turn_suggestions.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/249_task_allocations.sql +17 -0
- package/dist/src/storage/sqlite/upgrades/250_research_checkpoints.sql +15 -0
- package/dist/src/storage/sqlite/upgrades/251_personal_result_reads.sql +40 -0
- package/dist/src/storage/sqlite/upgrades/252_task_work_revisions.sql +15 -0
- package/dist/src/storage/sqlite/upgrades/253_discussion_processing_recovery.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/254_discussion_annotations.sql +17 -0
- package/dist/src/storage/sqlite/upgrades/255_discussion_chapter_progress.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/256_task_main_update_retries.sql +21 -0
- package/dist/src/storage/sqlite/upgrades/257_session_composer_history.sql +11 -0
- package/dist/src/storage/sqlite/upgrades/258_task_phase_changes.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/259_personal_default_style.sql +10 -0
- package/dist/src/storage/sqlite/windows-database-owners.js +33 -28
- package/dist/src/tasks/capabilities/read.js +2 -2
- package/dist/src/tasks/capabilities/relations.d.ts +2 -2
- package/dist/src/tasks/capabilities/write.js +1 -1
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/sources/index.js +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/voice/realtime/persona-context.js +1 -1
- package/dist/src/work-discovery/probe.js +1 -1
- package/dist/src/work-discovery/service.js +2 -2
- package/package.json +6 -6
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BFmRRD_4.js +0 -1
- package/dist/gateway/static/root/assets/agents-Clwskw2J.js +0 -77
- package/dist/gateway/static/root/assets/apps-page-DJbKg3va.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-D_X0_1X3.js +0 -8
- package/dist/gateway/static/root/assets/browser-automations-page-BI-ep6uM.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-BTyQ4-vN.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-GNS95mG9.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DBiv1HN-.js +0 -8
- package/dist/gateway/static/root/assets/channels-DWlrUKBr.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BcpUvrtl.js +0 -1
- package/dist/gateway/static/root/assets/dependency-picker-C4jddxFl.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-BCbiUNQG.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CkKU0JMY.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard--E2GQoY1.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CR4CsfNN.js +0 -1
- package/dist/gateway/static/root/assets/home-page-B9w3a6r2.js +0 -2
- package/dist/gateway/static/root/assets/imports-page-bxTINe-2.js +0 -1
- package/dist/gateway/static/root/assets/index-D1oivYvN.js +0 -710
- package/dist/gateway/static/root/assets/index-D_7q1UkI.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-NGCmXpa_.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-drrr-c2W.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-Dc1opXVr.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-B--edI1I.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-C3s4-ytB.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-D7q5-KuS.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-qVxoErUS.js +0 -8
- package/dist/gateway/static/root/assets/personal-page-B-T8NzQo.js +0 -1
- package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-DhEsfEUN.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-J4mFDk21.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-BLflz8CQ.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-1BwvmKZi.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-DwowzxzD.js +0 -7
- package/dist/gateway/static/root/assets/projects-page-Bwvn4i_e.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DrHisOUe.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-seP7t0kv.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-VqBu7gHu.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BWaykw9E.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Bq-3_MCt.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C3LfWsAZ.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-XCJFP-Aa.js +0 -2
- package/dist/gateway/static/root/assets/usage-page-CTTmklCs.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-BDqguzRE.js +0 -2
|
@@ -4,8 +4,8 @@ import { acknowledgeHomeAttention } from "../../../storage/sqlite/home-attention
|
|
|
4
4
|
import { decideConnectorApproval } from "../../../storage/sqlite/connector-repository.js";
|
|
5
5
|
import { init_sqlite } from "../../../storage/sqlite/index.js";
|
|
6
6
|
import { HomeQueryService, buildHomeWorkbench, decisionFromTask } from "../../../tasks/home-query-service.js";
|
|
7
|
-
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
8
7
|
import { HomeOpportunityActionError, HomeOpportunityNotFoundError } from "../../../home-intelligence/application-service.js";
|
|
8
|
+
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
9
9
|
//#region src/gateway/hono/routes/home.ts
|
|
10
10
|
init_src();
|
|
11
11
|
init_sqlite();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { NoteDeleteOutputSchema, NoteGetOutputSchema, ProductReadContracts } from "../../../../packages/gateway-contract/src/capabilities.js";
|
|
2
2
|
import { init_src } from "../../../../packages/gateway-contract/src/index.js";
|
|
3
|
-
import { init_session_key, resolveConversationId } from "../../../routing/session-key.js";
|
|
4
|
-
import { agentExists, getDefaultAgentId, init_resolve_route } from "../../../routing/resolve-route.js";
|
|
5
3
|
import { CapabilityError } from "../../../capabilities/runtime/errors.js";
|
|
6
4
|
import "../../../capabilities/runtime/dispatcher.js";
|
|
5
|
+
import { init_session_key, resolveConversationId } from "../../../routing/session-key.js";
|
|
6
|
+
import { agentExists, getDefaultAgentId, init_resolve_route } from "../../../routing/resolve-route.js";
|
|
7
7
|
import { resolveGatewayEffectiveHost } from "../../../config/gateway-bind.js";
|
|
8
8
|
import { getShareStore } from "../../../share/share-store.js";
|
|
9
9
|
import { resolveShareUrl } from "../../../share/share-url.js";
|
|
@@ -4,6 +4,7 @@ import { MOCK_PHONE_MODEL, PhoneActionSchema, PhoneConfigSchema, PhoneDeviceSche
|
|
|
4
4
|
import { getDefaultAgentId, init_resolve_route } from "../../../routing/resolve-route.js";
|
|
5
5
|
import { getModelRegistry, init_model_registry } from "../../../providers/model-registry.js";
|
|
6
6
|
import { init_providers, isProviderConfiguredSync } from "../../../providers/index.js";
|
|
7
|
+
import { normalizePhoneAppAccess, phoneAppAccess } from "../../../phone/app-access.js";
|
|
7
8
|
import { createPhoneModel, phoneModelProfile } from "../../../phone/model-adapter.js";
|
|
8
9
|
import { getPhoneRuntime, phoneExecutionContext } from "../../../phone/runtime.js";
|
|
9
10
|
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
@@ -129,6 +130,31 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
|
|
|
129
130
|
}
|
|
130
131
|
});
|
|
131
132
|
});
|
|
133
|
+
app.get("/api/phone/apps", async (c) => {
|
|
134
|
+
const input = z.object({ serial: z.string().min(1).max(200) }).strict().parse(c.req.query());
|
|
135
|
+
const applications = await runtime.applications(input, service.currentConfig, c.req.raw.signal);
|
|
136
|
+
c.header("Cache-Control", "no-store");
|
|
137
|
+
return c.json({
|
|
138
|
+
ok: true,
|
|
139
|
+
payload: { applications }
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
app.get("/api/phone/devices/:id/apps", async (c) => {
|
|
143
|
+
const applications = await runtime.applications({ deviceId: c.req.param("id") }, service.currentConfig, c.req.raw.signal);
|
|
144
|
+
c.header("Cache-Control", "no-store");
|
|
145
|
+
return c.json({
|
|
146
|
+
ok: true,
|
|
147
|
+
payload: { applications }
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
app.get("/api/phone/devices/:id/input-status", async (c) => {
|
|
151
|
+
const payload = await runtime.textInputStatus(c.req.param("id"), service.currentConfig, c.req.raw.signal);
|
|
152
|
+
c.header("Cache-Control", "no-store");
|
|
153
|
+
return c.json({
|
|
154
|
+
ok: true,
|
|
155
|
+
payload
|
|
156
|
+
});
|
|
157
|
+
});
|
|
132
158
|
app.post("/api/phone/devices", strictRateLimitMiddleware, async (c) => {
|
|
133
159
|
const input = deviceInput.parse(await c.req.json());
|
|
134
160
|
if (!(await runtime.discover(service.currentConfig, c.req.raw.signal)).some((device) => device.serial === input.serial && device.state === "device")) throw new PhoneError("PHONE_DEVICE_OFFLINE", "Choose a connected and authorized ADB device");
|
|
@@ -143,13 +169,15 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
|
|
|
143
169
|
const id = c.req.param("id");
|
|
144
170
|
const previous = runtime.repository.get(id);
|
|
145
171
|
const patch = deviceInput.omit({ serial: true }).partial().parse(await c.req.json());
|
|
172
|
+
const next = normalizePhoneAppAccess({
|
|
173
|
+
...previous,
|
|
174
|
+
...patch,
|
|
175
|
+
...patch.allowedApps && patch.appAccess === void 0 ? { appAccess: "selected" } : {}
|
|
176
|
+
});
|
|
146
177
|
await runtime.stopDevice(id);
|
|
147
178
|
return c.json({
|
|
148
179
|
ok: true,
|
|
149
|
-
payload: runtime.repository.save(
|
|
150
|
-
...previous,
|
|
151
|
-
...patch
|
|
152
|
-
}, id)
|
|
180
|
+
payload: runtime.repository.save(next, id)
|
|
153
181
|
});
|
|
154
182
|
});
|
|
155
183
|
app.delete("/api/phone/devices/:id", strictRateLimitMiddleware, async (c) => {
|
|
@@ -173,6 +201,7 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
|
|
|
173
201
|
state: found?.state ?? "disconnected",
|
|
174
202
|
emulator: found?.emulator ?? false,
|
|
175
203
|
runner: "gateway-local",
|
|
204
|
+
appAccess: phoneAppAccess(device),
|
|
176
205
|
allowedApps: device.allowedApps
|
|
177
206
|
}
|
|
178
207
|
});
|
|
@@ -6,12 +6,12 @@ import { loadTranscriptRowsForSession } from "../../../storage/sqlite/transcript
|
|
|
6
6
|
import { init_sqlite } from "../../../storage/sqlite/index.js";
|
|
7
7
|
import { ActivityService } from "../../../activity/service.js";
|
|
8
8
|
import "../../../activity/index.js";
|
|
9
|
+
import { CapabilityError } from "../../../capabilities/runtime/errors.js";
|
|
10
|
+
import "../../../capabilities/runtime/dispatcher.js";
|
|
9
11
|
import { listKnowledgeItems, writeKnowledgeItem } from "../../../knowledge-memory/repository.js";
|
|
10
12
|
import "../../../knowledge-memory/index.js";
|
|
11
13
|
import { resolveEffectiveAgentProfile } from "../../../config/agent-profile.js";
|
|
12
14
|
import { TaskReadModelProjector } from "../../../tasks/task-read-model-projector.js";
|
|
13
|
-
import { CapabilityError } from "../../../capabilities/runtime/errors.js";
|
|
14
|
-
import "../../../capabilities/runtime/dispatcher.js";
|
|
15
15
|
import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError } from "../../../projects/workspace-project.js";
|
|
16
16
|
import { inferProjectExecutionMode, inferProjectKind } from "../../../projects/project-kind.js";
|
|
17
17
|
import { ProjectDeletionBlockedError, ProjectWorkspaceInUseError } from "../../../projects/project-service.js";
|
|
@@ -2,8 +2,8 @@ import { PACKAGE_VERSION, init_package_version } from "../../../package-version.
|
|
|
2
2
|
import { claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, releaseConnectorWebhookDelivery } from "../../../storage/sqlite/connector-repository.js";
|
|
3
3
|
import { init_sqlite } from "../../../storage/sqlite/index.js";
|
|
4
4
|
import { resolveAutomationWebhookSecret } from "../../../automations/webhook-secrets.js";
|
|
5
|
-
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
6
5
|
import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
|
|
6
|
+
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
7
7
|
import { serveStaticFile } from "../lib/static-ui.js";
|
|
8
8
|
import { createHash, timingSafeEqual } from "node:crypto";
|
|
9
9
|
//#region src/gateway/hono/routes/public-gateway.ts
|
|
@@ -5,9 +5,9 @@ import { endpointContextSchema } from "../../../../packages/gateway-contract/src
|
|
|
5
5
|
import { parseUserTurnDocument, userTurnDocumentRefIds } from "../../../../packages/gateway-contract/src/user-turn-document.js";
|
|
6
6
|
import { init_src } from "../../../../packages/gateway-contract/src/index.js";
|
|
7
7
|
import { endpointTurnClaimSchema, init_src as init_src$1 } from "../../../../packages/endpoint-tools-protocol/src/index.js";
|
|
8
|
-
import { init_providers, resolveModel } from "../../../providers/index.js";
|
|
9
8
|
import { CapabilityError } from "../../../capabilities/runtime/errors.js";
|
|
10
9
|
import "../../../capabilities/runtime/dispatcher.js";
|
|
10
|
+
import { init_providers, resolveModel } from "../../../providers/index.js";
|
|
11
11
|
import { getModelThinking } from "../../../providers/model-thinking.js";
|
|
12
12
|
import { parseTurnContextRefs } from "../../../agent/source-context/types.js";
|
|
13
13
|
import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
|
|
@@ -6,9 +6,9 @@ import { hasGatewayScope, init_gateway_scopes } from "../../security/gateway-sco
|
|
|
6
6
|
import { enqueueTaskChangedEvent, init_task_change_events } from "../../../tasks/task-change-events.js";
|
|
7
7
|
import { TaskRepository, init_task_repository } from "../../../tasks/task-repository.js";
|
|
8
8
|
import { TaskRunRepository, init_task_run_repository } from "../../../tasks/task-run-repository.js";
|
|
9
|
-
import { TaskConversationRepository } from "../../../tasks/task-conversation-repository.js";
|
|
10
9
|
import { CapabilityError } from "../../../capabilities/runtime/errors.js";
|
|
11
10
|
import "../../../capabilities/runtime/dispatcher.js";
|
|
11
|
+
import { TaskConversationRepository } from "../../../tasks/task-conversation-repository.js";
|
|
12
12
|
import { TaskCollaborationRepository } from "../../../tasks/task-collaboration-repository.js";
|
|
13
13
|
import { TaskCriterionReviewRepository } from "../../../tasks/task-criterion-review-repository.js";
|
|
14
14
|
import { TaskContextMutationOutputSchema } from "../../../tasks/capabilities/relations.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { normalizeAgentId } from "../agent-catalog/id.js";
|
|
2
2
|
import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
|
|
3
3
|
import { init_agent_scope } from "../agent/agent-scope.js";
|
|
4
|
+
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
4
5
|
import { ConfigSchema, init_schema } from "../config/schema.js";
|
|
5
6
|
import { resolveEffectiveAgentConfigForAgent } from "../config/agent-profile.js";
|
|
6
7
|
import { fetchWithTimeoutGuarded } from "../media-shared/http/provider-http.js";
|
|
7
8
|
import "../media-shared/http/index.js";
|
|
8
|
-
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
9
9
|
import { getImageGenerationProvider, listImageGenerationProvidersSummary } from "../agent/image/generation/provider-registry.js";
|
|
10
10
|
//#region src/gateway/image-generation-setup.ts
|
|
11
11
|
init_repository();
|
|
@@ -15,8 +15,8 @@ import { TaskApplicationService } from "../../tasks/task-application-service.js"
|
|
|
15
15
|
import { injectSourceContextsIntoUserMessage } from "../../agent/source-context/injector.js";
|
|
16
16
|
import { deleteMediaUrisNoLongerReferenced } from "../../media/session-references.js";
|
|
17
17
|
import { fitSourceContextsToBudget } from "../../agent/source-context/budget.js";
|
|
18
|
-
import { isDeepStrictEqual } from "node:util";
|
|
19
18
|
import crypto from "node:crypto";
|
|
19
|
+
import { isDeepStrictEqual } from "node:util";
|
|
20
20
|
//#region src/gateway/service/session-input-coordinator.ts
|
|
21
21
|
init_session_input_repository();
|
|
22
22
|
init_connection_wait_repository();
|
|
@@ -95,13 +95,6 @@ import { DiscussionSealer } from "../discussions/sealer.js";
|
|
|
95
95
|
import "../discussions/index.js";
|
|
96
96
|
import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
|
|
97
97
|
import "../endpoint-tools/index.js";
|
|
98
|
-
import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
|
|
99
|
-
import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
|
|
100
|
-
import "../knowledge/index.js";
|
|
101
|
-
import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
|
|
102
|
-
import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
|
|
103
|
-
import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
|
|
104
|
-
import { startConnectorSupervisor } from "../connectors/supervisor.js";
|
|
105
98
|
import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
|
|
106
99
|
import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
|
|
107
100
|
import { HomeIntelligenceHost } from "../home-intelligence/host.js";
|
|
@@ -119,6 +112,8 @@ import { buildFileAgentContext } from "../agent/source-context/file-context.js";
|
|
|
119
112
|
import { buildSessionAgentContext } from "../agent/source-context/session-context.js";
|
|
120
113
|
import { buildBrowserTabAgentContext } from "../agent/source-context/browser-tab.js";
|
|
121
114
|
import { WorkDiscoveryService } from "../work-discovery/service.js";
|
|
115
|
+
import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
|
|
116
|
+
import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
|
|
122
117
|
import { buildVoiceMemoryContext } from "../voice/realtime/memory-context.js";
|
|
123
118
|
import { buildVoicePersonaContext } from "../voice/realtime/persona-context.js";
|
|
124
119
|
import { voiceMemoryBudget, voicePersonaBudget } from "../voice/realtime/conversation-context.js";
|
|
@@ -156,6 +151,10 @@ import { DurableVoiceAgentBroker } from "../voice/realtime/agentBroker.js";
|
|
|
156
151
|
import { reconcileMemoryMaintenanceAutomations } from "./memory-maintenance-automation-reconciler.js";
|
|
157
152
|
import { GatewayReadiness } from "./startup-readiness.js";
|
|
158
153
|
import { createGatewayStartupTrace } from "./startup-trace.js";
|
|
154
|
+
import { startConnectorSupervisor } from "../connectors/supervisor.js";
|
|
155
|
+
import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
|
|
156
|
+
import "../knowledge/index.js";
|
|
157
|
+
import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
|
|
159
158
|
import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
|
|
160
159
|
import { TaskMainUpdateExhaustedError } from "../tasks/task-main-update-retry.js";
|
|
161
160
|
import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
|
|
@@ -163,6 +162,7 @@ import { allowsPersonalTaskNotification, personalReplyNotification, personalRunD
|
|
|
163
162
|
import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
|
|
164
163
|
import { selectTaskMainUpdateAttempt, submitAndConfirmTaskMainUpdate } from "../tasks/task-main-update-input.js";
|
|
165
164
|
import { checkAppContextAccess, prepareAppContext } from "./service/app-context-access.js";
|
|
165
|
+
import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
|
|
166
166
|
import { applyAutomaticVoiceLanguage, inferProductLanguageFromEnvironment, initializeVoiceDefaults } from "../voice/language-profile.js";
|
|
167
167
|
import crypto from "node:crypto";
|
|
168
168
|
//#region src/gateway/service.ts
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import "../agent-config/schema.js";
|
|
2
2
|
import { init_agent_config } from "../agent-config/index.js";
|
|
3
3
|
import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
|
|
4
|
+
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
4
5
|
import { ConfigSchema, init_schema } from "../config/schema.js";
|
|
5
6
|
import { init_model_policy, isComputerModel, isDedicatedComputerProfile } from "../computer/model-policy.js";
|
|
6
7
|
import { voiceSupportsMode } from "../../packages/realtime-protocol/src/voice-catalog.js";
|
|
7
8
|
import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
|
|
8
9
|
import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
|
|
9
10
|
import { compareCatalogModels } from "../providers/model-catalog-ranking.js";
|
|
10
|
-
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
11
11
|
import { prepareUpdateGlobalDefaults } from "./global-defaults-admin.js";
|
|
12
12
|
//#region src/gateway/xopc-cloud-capability-setup.ts
|
|
13
13
|
init_voice();
|
|
@@ -11,8 +11,8 @@ import { scanLocal } from "./scanner.js";
|
|
|
11
11
|
import { dirname, join } from "node:path";
|
|
12
12
|
import { existsSync, lstatSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { randomUUID } from "node:crypto";
|
|
14
|
-
import lockfile from "proper-lockfile";
|
|
15
14
|
import yaml from "js-yaml";
|
|
15
|
+
import lockfile from "proper-lockfile";
|
|
16
16
|
//#region src/imports/importService.ts
|
|
17
17
|
init_write_file_atomic();
|
|
18
18
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_global_singleton, resolveGlobalSingleton } from "../utils/global-singleton.js";
|
|
3
|
-
import { init_process_diagnostics, recordProcessDiagnostic } from "./process-diagnostics.js";
|
|
4
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
5
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { init_global_singleton, resolveGlobalSingleton } from "../utils/global-singleton.js";
|
|
5
|
+
import { init_process_diagnostics, recordProcessDiagnostic } from "./process-diagnostics.js";
|
|
6
6
|
import { init_sqlite_errors, isTransientSqliteError } from "./sqlite-errors.js";
|
|
7
7
|
//#region src/infra/unhandled-rejections.ts
|
|
8
8
|
function installSqliteTransientRejectionHandler() {
|
|
@@ -2,8 +2,8 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
4
4
|
import { loadConfig } from "../config/loader.js";
|
|
5
|
-
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
6
5
|
import { resolveGatewayService } from "../daemon/service.js";
|
|
6
|
+
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
7
7
|
import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
|
|
8
8
|
import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
|
|
9
9
|
import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
|
|
@@ -5,10 +5,10 @@ import { init_logger } from "../utils/logger.js";
|
|
|
5
5
|
import { afterSqliteCommit, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
6
6
|
import { ExtensionCapabilityBindingsSchema, extensionCapabilityPermissions } from "../../packages/gateway-contract/src/extension-capabilities.js";
|
|
7
7
|
import { init_src } from "../../packages/gateway-contract/src/index.js";
|
|
8
|
+
import { CapabilityError } from "../capabilities/runtime/errors.js";
|
|
8
9
|
import { init_paths, resolveExtensionsDir } from "../config/paths.js";
|
|
9
10
|
import { slugifyProjectName } from "../projects/project-store.js";
|
|
10
11
|
import { LocalAppStore } from "./store.js";
|
|
11
|
-
import { CapabilityError } from "../capabilities/runtime/errors.js";
|
|
12
12
|
import { DomainOutboxDispatcher } from "../infra/domain-outbox-dispatcher.js";
|
|
13
13
|
import { validateLocalAppCapabilityContracts } from "./capabilities/contracts.js";
|
|
14
14
|
import { buildLocalAppFixGuidance } from "./fix-guidance.js";
|
|
@@ -5,7 +5,7 @@ import { PERSONAL_REPLY_EXAMPLES, PERSONAL_REPLY_STYLE_RULES } from "./reply-sty
|
|
|
5
5
|
//#region src/personal-agent/prompts.ts
|
|
6
6
|
const DELEGATION_RULES = [
|
|
7
7
|
"Answer directly when your capabilities suffice. Otherwise call personal_task(command=\"submit\") with a short objective. For a self-contained current request send {command:\"submit\", objective:\"short outcome\", useOriginalRequest:true}; command is required. With this mode, the host copies its entire stored text, including exact constraints. Preserve sourceRefs and explicitly requested Agent/Skills. Use a concise complete description instead when earlier conversation must be synthesized. Submit before reading materials. The background Task Router selects and starts the executor. After the tool succeeds, reply only with a short confirmation such as \"Submitted; I will report the result here.\" in the conversation language, then finish. Do not restate any task details, files, requirements or acceptance criteria, and do not wait for the worker. Remain available for conversation.",
|
|
8
|
-
"Reuse the existing Task. Inspect get/list only when status is needed; updates and results arrive automatically. Read full questions with get/entry (follow nextBodyOffset); use collaboration/afterSequence for older messages.
|
|
8
|
+
"Reuse the existing Task. Inspect get/list only when status is needed; updates and results arrive automatically. Read full questions with get/entry (follow nextBodyOffset); use collaboration/afterSequence for older messages. For running work send {command:\"instruct\", taskId, instruction} directly for new direction; no baseline lookup is needed. Use revise only after completion with an actual returned result baseline; a missing baseline means use instruct, never fabricate baselineResultId/baselineVersion. Use answer with the exact questionId for a worker question, resolving it from the brief or conversation first. If you asked the user a worker question, deliver their next answer to that question on this same Task. Do not just acknowledge it in chat. Report saved, delivered and executor-confirmed separately; do not wait or poll for acknowledgement. The final result must reflect the latest direction and disclose anything unconfirmed or unmet. retry_allocation retries selection before execution; inspect previous effects before retrying an execution.",
|
|
9
9
|
"For current news or other live facts, require dated sources in the brief. For recurring work, specify the required automation capability. Report actual allocation, execution and verification states; do not treat submission as execution or a successful run as accepted completion."
|
|
10
10
|
];
|
|
11
11
|
const TASK_BRIEF_RULE = "When useOriginalRequest=true, keep objective to one short outcome (not a list of files or requirements), and omit description and redundant structured fields; the host copies the complete current input, so do not rewrite or summarize away its constraints. For a context-dependent request, prepare the Task brief by preserving the user request, not by planning the execution. For a straightforward request, use one short paragraph or a few bullets, usually no longer than the user request. Preserve all requested inputs, outputs, permissions and verification. Do not invent extra analyses, edge cases, steps, files or constraints; the worker plans and inspects the data. Default submit fields are objective and description, plus a short title when useful. Omit requirements, expectedOutputs, acceptanceCriteria and constraints when they only repeat the description; use requiredSkills or requirements.requestedAgentId only for an explicit user instruction. Preserve long or exact user specifications completely.";
|
|
@@ -2,13 +2,13 @@ import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js
|
|
|
2
2
|
import { init_session_repository, patchSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
3
3
|
import { init_config_repository, setSessionConfig } from "../storage/sqlite/config-repository.js";
|
|
4
4
|
import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
|
|
5
|
+
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
5
6
|
import { createConversation, init_conversation_repository } from "../storage/sqlite/conversation-repository.js";
|
|
6
7
|
import { getAvailableModels, init_providers } from "../providers/index.js";
|
|
7
8
|
import { getPersonalAgent, personalAgentId } from "./repository.js";
|
|
8
9
|
import { PERSONAL_MAIN_TOOL_IDS, PERSONAL_READ_TOOL_ALIASES } from "./policy.js";
|
|
9
10
|
import { getModelThinking } from "../providers/model-thinking.js";
|
|
10
11
|
import { personalInstructions } from "./prompts.js";
|
|
11
|
-
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
12
12
|
import { completePersonalOnboarding } from "./onboarding.js";
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
//#region src/personal-agent/service.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
|
|
1
|
+
import { type PhoneApplication, type PhoneTextInputStatus, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
|
|
2
2
|
export declare function resolveAdbPath(configured?: string, stateDir?: string): string;
|
|
3
3
|
export declare function runAdb(path: string, args: string[], signal?: AbortSignal, timeout?: number): Promise<Buffer>;
|
|
4
4
|
export declare function parseAdbDevices(text: string): DiscoveredPhone[];
|
|
@@ -6,6 +6,8 @@ export declare function parsePhoneUi(xml: string): PhoneElement[];
|
|
|
6
6
|
export declare function parseAndroidLayout(raw: string): PhoneElement[];
|
|
7
7
|
export interface PhoneDriver {
|
|
8
8
|
discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
|
|
9
|
+
applications?(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
10
|
+
textInputStatus?(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
9
11
|
observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
10
12
|
capture?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
11
13
|
observeForText?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
@@ -20,14 +22,19 @@ export declare class AdbPhoneDriver implements PhoneDriver {
|
|
|
20
22
|
private readonly adbPath;
|
|
21
23
|
private readonly command;
|
|
22
24
|
private readonly useAndroidCli;
|
|
23
|
-
|
|
25
|
+
private readonly readApplications?;
|
|
26
|
+
private readonly pasteText?;
|
|
27
|
+
constructor(adbPath?: string, command?: typeof runAdb, useAndroidCli?: boolean, readApplications?: (signal: AbortSignal) => Promise<PhoneApplication[]>, pasteText?: (text: string, signal: AbortSignal) => Promise<void>);
|
|
28
|
+
textInputStatus(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
24
29
|
discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
|
|
30
|
+
applications(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
25
31
|
foreground(serial: string, signal: AbortSignal): Promise<string>;
|
|
26
32
|
private shell;
|
|
27
33
|
observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
28
34
|
observeForText(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
29
35
|
/** Pixel capture avoids accessibility dumps on the human interaction path. */
|
|
30
36
|
capture(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
37
|
+
private confirmText;
|
|
31
38
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
32
39
|
settleMs: number;
|
|
33
40
|
resetTask?: boolean;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PhoneError, init_contracts } from "./contracts.js";
|
|
2
2
|
import { runPhoneCommandBuffer, runPhoneCommandText } from "../process/phone-process.js";
|
|
3
3
|
import { managedPhoneAdbPath } from "../runtime-tools/phone-dependency-catalog.js";
|
|
4
|
+
import { readScrcpyServer, scrcpyServerPath } from "./scrcpy-assets.js";
|
|
5
|
+
import { parsePhoneApplications, phoneApplicationsCommand } from "./applications.js";
|
|
4
6
|
import { homedir } from "node:os";
|
|
5
7
|
import { delimiter, join } from "node:path";
|
|
6
8
|
import { existsSync } from "node:fs";
|
|
@@ -130,15 +132,57 @@ function parseAndroidFocusedEditor(raw, app) {
|
|
|
130
132
|
};
|
|
131
133
|
}
|
|
132
134
|
}
|
|
135
|
+
function sameTextEditor(target, node) {
|
|
136
|
+
return node.focused && Boolean(node.editable) && !node.password && (target.resourceId ? node.resourceId === target.resourceId : node.bounds.every((value, index) => value === target.bounds[index]));
|
|
137
|
+
}
|
|
133
138
|
var AdbPhoneDriver = class {
|
|
134
|
-
constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true) {
|
|
139
|
+
constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true, readApplications, pasteText) {
|
|
135
140
|
this.adbPath = adbPath;
|
|
136
141
|
this.command = command;
|
|
137
142
|
this.useAndroidCli = useAndroidCli;
|
|
143
|
+
this.readApplications = readApplications;
|
|
144
|
+
this.pasteText = pasteText;
|
|
145
|
+
}
|
|
146
|
+
async textInputStatus(serial, signal) {
|
|
147
|
+
const androidSdk = Number((await this.shell(serial, ["getprop", "ro.build.version.sdk"], signal)).trim()) || 0;
|
|
148
|
+
let ready = false;
|
|
149
|
+
try {
|
|
150
|
+
await readScrcpyServer();
|
|
151
|
+
ready = true;
|
|
152
|
+
} catch {
|
|
153
|
+
signal.throwIfAborted();
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
androidSdk,
|
|
157
|
+
unicode: androidSdk < 24 ? "unsupported" : ready ? "available" : "setup_required",
|
|
158
|
+
method: "scrcpy-clipboard",
|
|
159
|
+
keyboardRequired: false
|
|
160
|
+
};
|
|
138
161
|
}
|
|
139
162
|
async discover(signal) {
|
|
140
163
|
return parseAdbDevices((await this.command(this.adbPath, ["devices", "-l"], signal)).toString());
|
|
141
164
|
}
|
|
165
|
+
async applications(serial, signal) {
|
|
166
|
+
if (this.readApplications) return this.readApplications(signal);
|
|
167
|
+
await readScrcpyServer();
|
|
168
|
+
const remote = `/data/local/tmp/xopc-apps-${randomUUID()}.jar`;
|
|
169
|
+
try {
|
|
170
|
+
await this.command(this.adbPath, [
|
|
171
|
+
"-s",
|
|
172
|
+
serial,
|
|
173
|
+
"push",
|
|
174
|
+
scrcpyServerPath(),
|
|
175
|
+
remote
|
|
176
|
+
], signal);
|
|
177
|
+
return parsePhoneApplications(await this.shell(serial, phoneApplicationsCommand(remote), signal));
|
|
178
|
+
} finally {
|
|
179
|
+
await this.shell(serial, [
|
|
180
|
+
"rm",
|
|
181
|
+
"-f",
|
|
182
|
+
remote
|
|
183
|
+
], AbortSignal.timeout(3e3)).catch(() => {});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
142
186
|
async foreground(serial, signal) {
|
|
143
187
|
const activity = await this.shell(serial, [
|
|
144
188
|
"sh",
|
|
@@ -261,6 +305,21 @@ var AdbPhoneDriver = class {
|
|
|
261
305
|
throw error;
|
|
262
306
|
}
|
|
263
307
|
}
|
|
308
|
+
async confirmText(serial, app, target, matches, signal) {
|
|
309
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
310
|
+
await setTimeout(150, void 0, { signal });
|
|
311
|
+
const after = await this.observe(serial, signal);
|
|
312
|
+
try {
|
|
313
|
+
if (after.package !== app) break;
|
|
314
|
+
const candidates = after.elements.filter((node) => target.resourceId === "android:active-editor" ? node.focused && node.editable && !node.password : sameTextEditor(target, node));
|
|
315
|
+
if (candidates.length === 1 && matches(candidates[0].text)) return;
|
|
316
|
+
if (candidates.length !== 1) break;
|
|
317
|
+
} finally {
|
|
318
|
+
after.frame.fill(0);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text was sent but the target field value could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
322
|
+
}
|
|
264
323
|
async execute(serial, action, observation, signal, options) {
|
|
265
324
|
const point = ([x, y]) => [String(Math.min(observation.width - 1, Math.round(x * observation.width / 1e3))), String(Math.min(observation.height - 1, Math.round(y * observation.height / 1e3)))];
|
|
266
325
|
const input = (args) => this.shell(serial, ["input", ...args], signal);
|
|
@@ -310,47 +369,64 @@ var AdbPhoneDriver = class {
|
|
|
310
369
|
String(action.durationMs)
|
|
311
370
|
]);
|
|
312
371
|
break;
|
|
313
|
-
case "typeText":
|
|
314
|
-
|
|
315
|
-
if (
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
const
|
|
324
|
-
if (!(await this.shell(serial, [
|
|
325
|
-
"ime",
|
|
326
|
-
"list",
|
|
327
|
-
"-s"
|
|
328
|
-
], signal)).split(/\s+/).includes(keyboard)) throw new PhoneError("PHONE_KEYBOARD_REQUIRED", "Unicode input requires ADB Keyboard. Install and enable it on the device first.");
|
|
372
|
+
case "typeText": {
|
|
373
|
+
const editors = observation.elements.filter((node) => node.focused && node.editable && !node.password);
|
|
374
|
+
if (editors.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "Focus one non-password editable field before typing");
|
|
375
|
+
const ascii = /^[a-zA-Z0-9 .,_@+-]+$/.test(action.text) && !action.text.includes("%");
|
|
376
|
+
if (!ascii) {
|
|
377
|
+
if ((await this.textInputStatus(serial, signal)).unicode !== "available") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is unavailable. Check Phone settings or take over and type with the phone keyboard.", 409);
|
|
378
|
+
}
|
|
379
|
+
let target = editors[0];
|
|
380
|
+
if (action.mode === "replace") {
|
|
381
|
+
if (target.resourceId === "android:active-editor") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Replacing text requires a visible editable field. Take over and inspect the field.", 409);
|
|
382
|
+
const fresh = await this.observe(serial, signal);
|
|
329
383
|
try {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
keyboard
|
|
334
|
-
], signal);
|
|
335
|
-
const result = await this.shell(serial, [
|
|
336
|
-
"am",
|
|
337
|
-
"broadcast",
|
|
338
|
-
"-a",
|
|
339
|
-
"ADB_INPUT_B64",
|
|
340
|
-
"--es",
|
|
341
|
-
"msg",
|
|
342
|
-
Buffer.from(action.text).toString("base64")
|
|
343
|
-
], signal);
|
|
344
|
-
if (!/Broadcast completed/.test(result)) throw new PhoneError("PHONE_INPUT_FAILED", "Keyboard input was not acknowledged");
|
|
384
|
+
const current = fresh.elements.filter((node) => sameTextEditor(target, node));
|
|
385
|
+
if (fresh.package !== observation.package || current.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "The focused input field changed before replacement", 409);
|
|
386
|
+
target = current[0];
|
|
345
387
|
} finally {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
388
|
+
fresh.frame.fill(0);
|
|
389
|
+
}
|
|
390
|
+
if (target.text) {
|
|
391
|
+
if (!(await this.shell(serial, ["input"], signal)).includes("keycombination")) throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "This phone cannot safely select all text. Take over and replace the field manually.", 409);
|
|
392
|
+
try {
|
|
393
|
+
await input([
|
|
394
|
+
"keycombination",
|
|
395
|
+
"KEYCODE_CTRL_LEFT",
|
|
396
|
+
"KEYCODE_A"
|
|
397
|
+
]);
|
|
398
|
+
const selected = await this.observe(serial, signal);
|
|
399
|
+
try {
|
|
400
|
+
if (selected.package !== observation.package || selected.elements.filter((node) => sameTextEditor(target, node) && node.text === target.text).length !== 1) throw new Error("Editor changed during selection");
|
|
401
|
+
} finally {
|
|
402
|
+
selected.frame.fill(0);
|
|
403
|
+
}
|
|
404
|
+
} catch {
|
|
405
|
+
signal.throwIfAborted();
|
|
406
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text selection started but the target field could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
407
|
+
}
|
|
351
408
|
}
|
|
352
409
|
}
|
|
410
|
+
try {
|
|
411
|
+
if (ascii) await input(["text", action.text.replaceAll(" ", "%s")]);
|
|
412
|
+
else if (this.pasteText) await this.pasteText(action.text, signal);
|
|
413
|
+
else {
|
|
414
|
+
const { LocalScrcpyProvider } = await import("./scrcpy.js");
|
|
415
|
+
const provider = new LocalScrcpyProvider(this.adbPath, serial, () => {}, void 0, true);
|
|
416
|
+
try {
|
|
417
|
+
await provider.pasteText(action.text, signal);
|
|
418
|
+
} finally {
|
|
419
|
+
await provider.close();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
await this.confirmText(serial, observation.package, target, (text) => action.mode === "replace" ? text === action.text : text.includes(action.text), signal);
|
|
423
|
+
} catch (error) {
|
|
424
|
+
signal.throwIfAborted();
|
|
425
|
+
if (error instanceof PhoneError && error.code === "PHONE_TEXT_INPUT_UNCONFIRMED") throw error;
|
|
426
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text may have been sent but insertion could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
427
|
+
}
|
|
353
428
|
break;
|
|
429
|
+
}
|
|
354
430
|
case "home":
|
|
355
431
|
await input(["keyevent", "KEYCODE_HOME"]);
|
|
356
432
|
break;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type PhoneAppAccess = {
|
|
2
|
+
appAccess?: 'all' | 'selected';
|
|
3
|
+
allowedApps: string[];
|
|
4
|
+
};
|
|
5
|
+
/** Preserve legacy allowlists while new connections default to all applications. */
|
|
6
|
+
export declare function phoneAppAccess(device: PhoneAppAccess): 'all' | 'selected';
|
|
7
|
+
export declare function phoneAllowsApp(device: PhoneAppAccess, application: string): boolean;
|
|
8
|
+
export declare function normalizePhoneAppAccess<T extends PhoneAppAccess>(device: T): T & {
|
|
9
|
+
appAccess: 'all' | 'selected';
|
|
10
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PhoneError, init_contracts } from "./contracts.js";
|
|
2
|
+
//#region src/phone/app-access.ts
|
|
3
|
+
init_contracts();
|
|
4
|
+
/** Preserve legacy allowlists while new connections default to all applications. */
|
|
5
|
+
function phoneAppAccess(device) {
|
|
6
|
+
return device.appAccess ?? (device.allowedApps.length ? "selected" : "all");
|
|
7
|
+
}
|
|
8
|
+
function phoneAllowsApp(device, application) {
|
|
9
|
+
return phoneAppAccess(device) === "all" || device.allowedApps.includes(application);
|
|
10
|
+
}
|
|
11
|
+
function normalizePhoneAppAccess(device) {
|
|
12
|
+
const appAccess = phoneAppAccess(device);
|
|
13
|
+
if (appAccess === "selected" && !device.allowedApps.length) throw new PhoneError("PHONE_APPS_REQUIRED", "Select at least one application");
|
|
14
|
+
return {
|
|
15
|
+
...device,
|
|
16
|
+
appAccess,
|
|
17
|
+
allowedApps: appAccess === "all" ? [] : [...new Set(device.allowedApps)]
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { normalizePhoneAppAccess, phoneAllowsApp, phoneAppAccess };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type PhoneApplication } from './contracts.js';
|
|
2
|
+
export declare function phoneApplicationsCommand(remote: string): string[];
|
|
3
|
+
/** Parse the pinned scrcpy server's app list, including wrapped long labels. */
|
|
4
|
+
export declare function parsePhoneApplications(raw: string): PhoneApplication[];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { PhoneError, init_contracts } from "./contracts.js";
|
|
2
|
+
import { SCRCPY_VERSION } from "../runtime-tools/phone-dependency-catalog.js";
|
|
3
|
+
//#region src/phone/applications.ts
|
|
4
|
+
init_contracts();
|
|
5
|
+
const packageName = /^[a-zA-Z]\w*(?:\.\w+)+$/;
|
|
6
|
+
function phoneApplicationsCommand(remote) {
|
|
7
|
+
return [
|
|
8
|
+
"env",
|
|
9
|
+
`CLASSPATH=${remote}`,
|
|
10
|
+
"app_process",
|
|
11
|
+
"/",
|
|
12
|
+
"com.genymobile.scrcpy.Server",
|
|
13
|
+
SCRCPY_VERSION,
|
|
14
|
+
"list_apps=true",
|
|
15
|
+
"video=false",
|
|
16
|
+
"audio=false",
|
|
17
|
+
"control=false"
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
/** Parse the pinned scrcpy server's app list, including wrapped long labels. */
|
|
21
|
+
function parsePhoneApplications(raw) {
|
|
22
|
+
const text = raw.replace(/\u001b\[[\d;]*m/g, "");
|
|
23
|
+
if (text.length > 1024 * 1024 || !text.includes("List of apps:")) throw new PhoneError("PHONE_APPS_UNAVAILABLE", "Unable to read the phone application list. Check the phone connection and scrcpy dependency.");
|
|
24
|
+
const apps = /* @__PURE__ */ new Map();
|
|
25
|
+
let pending;
|
|
26
|
+
for (const line of text.split(/\r?\n/)) {
|
|
27
|
+
const entry = /^\s*[*-]\s+(.+)$/.exec(line);
|
|
28
|
+
if (entry) {
|
|
29
|
+
const match = /^(.*?)\s+([a-zA-Z]\w*(?:\.\w+)+)$/.exec(entry[1].trim());
|
|
30
|
+
if (match) {
|
|
31
|
+
pending = void 0;
|
|
32
|
+
apps.set(match[2], {
|
|
33
|
+
packageName: match[2],
|
|
34
|
+
label: match[1].trim().slice(0, 120) || match[2]
|
|
35
|
+
});
|
|
36
|
+
} else pending = entry[1].trim().slice(0, 120);
|
|
37
|
+
} else if (pending && packageName.test(line.trim())) {
|
|
38
|
+
apps.set(line.trim(), {
|
|
39
|
+
packageName: line.trim(),
|
|
40
|
+
label: pending
|
|
41
|
+
});
|
|
42
|
+
pending = void 0;
|
|
43
|
+
}
|
|
44
|
+
if (apps.size > 500) throw new PhoneError("PHONE_APPS_LIMIT", "Phone application list exceeds 500 entries");
|
|
45
|
+
}
|
|
46
|
+
return [...apps.values()].sort((a, b) => a.label.localeCompare(b.label));
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { parsePhoneApplications, phoneApplicationsCommand };
|