@xopcai/xopc 0.0.415 → 0.0.416
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/_locales/en/messages.json +4 -1
- package/dist/browser-ext/_locales/zh_CN/messages.json +4 -1
- package/dist/browser-ext/dist/assets/{page-context-MuzjMBlJ.js → page-context-CVvmTWZb.js} +33 -9
- package/dist/browser-ext/dist/background.js +39 -10
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +22 -3
- 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-CJFwitU2.js → agent-avatar-dicebear-CufU7cqe.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DHDAcss8.js +1 -0
- package/dist/gateway/static/root/assets/agents-BV3dAoa0.js +77 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DgwqNi5i.js → app-management-settings-panel-D4-n1uBg.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C0wJfFyz.js → appearance-settings-Cgn4eNsX.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BOYzD7Zz.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Ch7wolHE.js → archive-plugin-B4btCsiV.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DK7AU79v.js → automations-page-yb1EL_3N.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-J7LJ4RuV.js +8 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B4HcHYsC.js → binary-plugins-DQT9e258.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BQAWEZF-.js → block-editor-B50rU9tL.js} +4 -4
- package/dist/gateway/static/root/assets/browser-automations-page-BiQz6lJA.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-W9kuxBbE.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-page-iXe87MdG.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CRLSXe7Z.js +8 -0
- package/dist/gateway/static/root/assets/{capability-header-actions-D4Yq35fD.js → capability-header-actions-BMnbzHms.js} +1 -1
- package/dist/gateway/static/root/assets/channels-CrRJkOKX.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-zdMySdMm.js → chat-terminal-dock-Bd3af4gL.js} +2 -2
- package/dist/gateway/static/root/assets/{computer-settings-page-C5Z6Jr0p.js → computer-settings-page-DXfqy7xh.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-Cxus0qrZ.js → connector-service-page-B-cw0CPU.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DbFxc0Fd.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-DuyyD6jz.js → date-picker-CqzXevH6.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-BZN72rrk.js → dependency-picker-pgT4Gyaf.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BcyP7Z6v.js → desktop-pet-settings-Dy_-i2L8.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-BtvTIDCi.js → desktop-pet-zICeqw9c.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-ByGbxqkg.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DOusKz-O.js → directory-picker-path-field-C-aQ7qoM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Bt4FwsFu.js → extension-debug-page-2NwpYkS5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-0vsxX3FB.js → extension-page-y9J0z7_Q.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-5Pt5_ELc.js → extension-settings-page-BtowusUh.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-C52ghnBK.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-BYSKzUMR.js +1 -0
- package/dist/gateway/static/root/assets/highlight-code-Cz6eeDH5.js +1 -0
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-Cbk7eMlg.js → highlighted-body-KQOG7T2V-BiAa8HKC.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-Cd1BjYHj.js +2 -0
- package/dist/gateway/static/root/assets/{image-generation-api-CAS8QVla.js → image-generation-api-gBFro48x.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-BCLBYzV1.js → imports-page-BZQpXgjj.js} +1 -1
- package/dist/gateway/static/root/assets/index-Cy16gQST.css +1 -0
- package/dist/gateway/static/root/assets/index-DRyGCING.js +710 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CM_kt5XN.js → keyboard-shortcuts-settings-CYunR34k.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-B_Ac1lly.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BTSOChhk.js → local-apps-page-w-J5bY02.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Dnjvvx2i.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-w1EDwgLW.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-DYQDjCVQ.js → media-plugins-CIx1koXw.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DISkHmEC.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-CNkxMTFU.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-D5GH2wuC.js +1 -0
- package/dist/gateway/static/root/assets/notes-page-DZgKqFBG.js +8 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-DVn_dU83.js → page-context-capture-button-DusR2Itk.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-CR5JFkQ9.js +1 -0
- package/dist/gateway/static/root/assets/{personal-settings-panel-C16Iqe7X.js → personal-settings-panel-B7undvlr.js} +1 -1
- package/dist/gateway/static/root/assets/phone-model-picker-fWDltRUJ.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-CsOirAiy.js +1 -0
- package/dist/gateway/static/root/assets/plugin-details-dialog-BOBVIB3j.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-RlHk76TI.js → preview-open-alternatives-CMxjsKSw.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-Dh-HqLrE.js → product-open-page-CrlyJx5M.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-c3K-4DWc.js → product-preview-content-B-Jhzi7W.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DoYUbtcI.js +7 -0
- package/dist/gateway/static/root/assets/{projects-page-B8HAt9sD.js → projects-page-xGQd9oAZ.js} +1 -1
- package/dist/gateway/static/root/assets/refresh-cw-BRlGaq2w.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Gs0Xkws9.js +1 -0
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bwg7U7TR.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-CXO1B1k4.js → schema-form-ByzTNR_C.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-CA1NkTR_.js → session-manager-B_h0jlLb.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-XzK1ftbR.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D_8Mvnog.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BQxKmbbJ.js → settings-form-section-Brgd8IOV.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DvVMpKiA.js → settings-page-B6Mv02eg.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-header-BWyxJKOG.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-B20AfmFG.js → settings-page-layout-DLHcS-0T.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DSCj5yis.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-XgZk8Oa1.js → share-preview-page-DF8Of0aZ.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DXNPe4Tl.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-CV-WT2hj.js → skill-api-CKCDCHLq.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BH0WF6Br.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DFWMVRW4.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DB-ttubV.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-BJY7c8wb.js +2 -0
- package/dist/gateway/static/root/assets/{task-result-evidence-D-gGKNX9.js → task-result-evidence-B-vt1BgK.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-CQw3G-FB.js → tracing-settings-page-Dt51Z_ws.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-B2HnCi0U.js → tunnel-api-Dok3t7Qe.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-lJym5G7F.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-Dc0nwUpX.js → use-autosave-D4EMIB-V.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-BXdNkITp.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BSWXZkGa.js → voice-api-key-field-CO3KuanA.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-H3cdwq3l.js → work-discovery-overlay-BJRtgQM3.js} +1 -1
- package/dist/gateway/static/root/assets/wrench-DFb4r8bH.js +1 -0
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CS-_GxHV.js +1 -0
- package/dist/gateway/static/root/browser-setup-test.html +5 -0
- package/dist/gateway/static/root/browser-setup-test.js +7 -0
- package/dist/gateway/static/root/index.html +7 -4
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/browser-setup.js +6 -0
- package/dist/packages/gateway-contract/src/index.js +4 -0
- package/dist/packages/gateway-contract/src/phone-setup.js +6 -0
- package/dist/packages/realtime-client/src/index.js +1 -0
- package/dist/packages/realtime-protocol/src/index.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +4 -0
- package/dist/src/agent/agent-manager.js +12 -1
- package/dist/src/agent/embedded/tool-search-extension.js +14 -1
- package/dist/src/agent/service.d.ts +1 -0
- package/dist/src/agent/service.js +5 -0
- package/dist/src/agent/service.types.d.ts +2 -0
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +1 -1
- package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +2 -0
- package/dist/src/agent/tool-manuals/xopc-configuration.js +25 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +2 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +6 -2
- package/dist/src/agent/tools/factory.d.ts +3 -0
- package/dist/src/agent/tools/factory.js +11 -1
- package/dist/src/agent/tools/phone-use-tool.d.ts +1 -0
- package/dist/src/agent/tools/phone-use-tool.js +9 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +1 -1
- package/dist/src/agent/tools/tool-manual-tool.js +3 -1
- package/dist/src/agent/tools/toolExposure.js +3 -0
- package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
- package/dist/src/agent/tools/xopc-use-tool.js +40 -2
- package/dist/src/browser/drivers/browser-driver.d.ts +2 -2
- package/dist/src/browser/drivers/extension-driver.d.ts +2 -2
- package/dist/src/browser/drivers/extension-driver.js +6 -3
- package/dist/src/browser/providers/browser-ext-install.js +2 -1
- package/dist/src/browser/runtime/browser-runtime.d.ts +4 -1
- package/dist/src/browser/runtime/browser-runtime.js +29 -17
- package/dist/src/browser/setup/repository.d.ts +5 -0
- package/dist/src/browser/setup/repository.js +42 -0
- package/dist/src/browser/setup/service.d.ts +152 -0
- package/dist/src/browser/setup/service.js +404 -0
- package/dist/src/browser/setup/types.d.ts +38 -0
- package/dist/src/browser/setup/types.js +1 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/connectors/connected-source-understanding.js +1 -1
- package/dist/src/connectors/learning-coordinator.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/hono/routes/browser-setup.d.ts +3 -0
- package/dist/src/gateway/hono/routes/browser-setup.js +114 -0
- package/dist/src/gateway/hono/routes/browser.d.ts +2 -1
- package/dist/src/gateway/hono/routes/browser.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/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/phone-dependencies.js +1 -1
- package/dist/src/gateway/hono/routes/phone-setup.d.ts +7 -0
- package/dist/src/gateway/hono/routes/phone-setup.js +162 -0
- package/dist/src/gateway/hono/routes/phone.js +3 -7
- package/dist/src/gateway/hono/routes/public-gateway.js +3 -1
- package/dist/src/gateway/provider-model-setup.js +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +2 -0
- package/dist/src/gateway/service.d.ts +5 -0
- package/dist/src/gateway/service.js +57 -12
- package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -1
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/phone/adb-driver.d.ts +2 -0
- package/dist/src/phone/adb-driver.js +35 -17
- package/dist/src/phone/contracts.d.ts +40 -0
- package/dist/src/phone/contracts.js +17 -4
- package/dist/src/phone/model-adapter.d.ts +59 -2
- package/dist/src/phone/model-adapter.js +107 -13
- package/dist/src/phone/numeric-entry.d.ts +31 -0
- package/dist/src/phone/numeric-entry.js +126 -0
- package/dist/src/phone/planning.d.ts +27 -0
- package/dist/src/phone/planning.js +79 -0
- package/dist/src/phone/recovery.d.ts +37 -0
- package/dist/src/phone/recovery.js +81 -0
- package/dist/src/phone/repository.d.ts +1 -0
- package/dist/src/phone/repository.js +3 -0
- package/dist/src/phone/runtime.js +232 -54
- package/dist/src/phone/semantic-controls.d.ts +13 -0
- package/dist/src/phone/semantic-controls.js +76 -0
- package/dist/src/phone/setup/service.d.ts +148 -0
- package/dist/src/phone/setup/service.js +251 -0
- package/dist/src/providers/presentation.js +2 -2
- package/dist/src/providers/xopc-cloud-model-source.js +6 -2
- package/dist/src/realtime/runtime.js +1 -1
- package/dist/src/storage/sqlite/schema.d.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +7 -7
- package/dist/src/storage/sqlite/schema.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/260_browser_setup.sql +9 -0
- package/dist/src/user-context/sources/index.js +1 -1
- package/dist/src/work-discovery/service.js +2 -2
- package/package.json +6 -6
- package/skills/tools/configure-xopc/SKILL.md +47 -0
- package/skills/tools/configure-xopc/references/browser/acceptance.md +31 -0
- package/skills/tools/configure-xopc/references/browser/chrome-extension.md +19 -0
- package/skills/tools/configure-xopc/references/browser/overview.md +22 -0
- package/skills/tools/configure-xopc/references/browser/permissions.md +25 -0
- package/skills/tools/configure-xopc/references/browser/troubleshooting.md +24 -0
- package/skills/tools/configure-xopc/references/phone/acceptance.md +25 -0
- package/skills/tools/configure-xopc/references/phone/aliyun.md +29 -0
- package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -0
- package/skills/tools/configure-xopc/references/phone/local.md +19 -0
- package/skills/tools/configure-xopc/references/phone/models.md +18 -0
- package/skills/tools/configure-xopc/references/phone/overview.md +30 -0
- package/skills/tools/configure-xopc/references/phone/troubleshooting.md +24 -0
- package/skills/tools/configure-xopc/references/scene-index.md +12 -0
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DclyJr1N.js +0 -1
- package/dist/gateway/static/root/assets/agents-jhErNtzi.js +0 -77
- package/dist/gateway/static/root/assets/apps-page-C0LcnI4h.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CBxiV34x.js +0 -8
- package/dist/gateway/static/root/assets/browser-automations-page-vJIrTxdi.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-in5Roh_E.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-CiGx8wpQ.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-a8kqjzQu.js +0 -8
- package/dist/gateway/static/root/assets/channels-C_CxcjKT.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DCBO2CxK.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-Ctbgr50F.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-DkWCHVzI.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BsVOcmV5.js +0 -1
- package/dist/gateway/static/root/assets/highlight-code-C8eS9949.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BZDZnmyc.js +0 -2
- package/dist/gateway/static/root/assets/index-Bys6njTY.js +0 -710
- package/dist/gateway/static/root/assets/index-Vsf0bj5e.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Dk87jtcc.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-D3gVdm8S.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-BQNYFE4J.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-ChweJKTv.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-CYKwUCte.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-BTSZb9ZT.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-CJ5nhWfL.js +0 -8
- package/dist/gateway/static/root/assets/personal-page-DcW14lqn.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-D3l9uPFM.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-DOv38vBn.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-DUHp1q_9.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-BpfgDlVa.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-GD8TxKad.js +0 -7
- package/dist/gateway/static/root/assets/remote-access-hub-D3el7lHK.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Dbskk6RG.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-07liaSHH.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BGjU8rfN.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-header-CYpuTXUW.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DKo_VTx-.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BODFqK8k.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Ce6OUk2C.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-B7ehOIML.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-CxJkZRT4.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CxRR0QuW.js +0 -2
- package/dist/gateway/static/root/assets/usage-page-uUEkO38r.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-ICUutbKL.js +0 -2
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CvT_W6YS.js +0 -1
|
@@ -285,5 +285,8 @@
|
|
|
285
285
|
"clarifyApprove": { "message": "Approve once" },
|
|
286
286
|
"clarifyCompose": { "message": "Select and add details" },
|
|
287
287
|
"clarifyClear": { "message": "Clear selection" },
|
|
288
|
-
"clarifyRecommended": { "message": "Recommended" }
|
|
288
|
+
"clarifyRecommended": { "message": "Recommended" },
|
|
289
|
+
"browserControlStopped": { "message": "You stopped Chrome control. Page operations stay paused until you choose to resume. Return to the original chat to retry the test." },
|
|
290
|
+
"browserControlResume": { "message": "Resume browser control" },
|
|
291
|
+
"errorLocalHostBlockedHelp": { "message": "The local connection program could not start. Return to the original chat to check and repair installation, then retry. If your system shows a security prompt, review it yourself; do not disable system protection." }
|
|
289
292
|
}
|
|
@@ -285,5 +285,8 @@
|
|
|
285
285
|
"clarifyApprove": { "message": "批准本次操作" },
|
|
286
286
|
"clarifyCompose": { "message": "选择并补充" },
|
|
287
287
|
"clarifyClear": { "message": "清除选择" },
|
|
288
|
-
"clarifyRecommended": { "message": "推荐" }
|
|
288
|
+
"clarifyRecommended": { "message": "推荐" },
|
|
289
|
+
"browserControlStopped": { "message": "你已停止 Chrome 控制。网页操作将保持暂停,直到你主动恢复。恢复后请返回原对话重新验收。" },
|
|
290
|
+
"browserControlResume": { "message": "恢复网页控制" },
|
|
291
|
+
"errorLocalHostBlockedHelp": { "message": "本机连接程序启动被阻止。请返回原对话检查并修复安装,再重试连接。若系统显示安全提示,请自行审阅决定,不要关闭系统保护。" }
|
|
289
292
|
}
|
|
@@ -5805,12 +5805,14 @@ ${credentialId}
|
|
|
5805
5805
|
${timestamp}
|
|
5806
5806
|
${nonce}
|
|
5807
5807
|
${requestId}
|
|
5808
|
-
${nextRefreshToken}
|
|
5808
|
+
${nextRefreshToken}
|
|
5809
|
+
request-proof:1`;
|
|
5809
5810
|
const signature = await sign(pair, proof);
|
|
5810
5811
|
const body = {
|
|
5811
5812
|
refreshToken,
|
|
5812
5813
|
nextRefreshToken,
|
|
5813
5814
|
requestId,
|
|
5815
|
+
requestProofVersion: 1,
|
|
5814
5816
|
timestamp,
|
|
5815
5817
|
nonce,
|
|
5816
5818
|
signature
|
|
@@ -5833,7 +5835,7 @@ ${nextRefreshToken}`;
|
|
|
5833
5835
|
}
|
|
5834
5836
|
if (typeof response.signedPayload !== "string" || typeof response.signature !== "string" || !await verifyGateway(gateway.gatewayPublicKey, response.signedPayload, response.signature)) throw new Error(t("errorGatewayVerification"));
|
|
5835
5837
|
const responseProof = decodeJson(response.signedPayload);
|
|
5836
|
-
if (responseProof.purpose !== "device-refresh-v3" || responseProof.gatewayId !== gateway.gatewayId || responseProof.requestId !== requestId || responseProof.nonce !== nonce || !(responseProof.expiresAt > Date.now()) || responseProof.expiresAt > Date.now() + 6e4) throw new Error("Gateway refresh response does not match this request");
|
|
5838
|
+
if (responseProof.purpose !== "device-refresh-v3" || responseProof.gatewayId !== gateway.gatewayId || responseProof.requestId !== requestId || responseProof.requestProofVersion !== 1 || responseProof.nonce !== nonce || !(responseProof.expiresAt > Date.now()) || responseProof.expiresAt > Date.now() + 6e4) throw new Error("Gateway refresh response does not match this request");
|
|
5837
5839
|
const payload = responseProof.tokens;
|
|
5838
5840
|
if (!payload?.accessToken || !payload.accessTokenExpiresAt || payload.refreshToken !== nextRefreshToken) {
|
|
5839
5841
|
throw new Error(t("errorInvalidCredentials"));
|
|
@@ -6077,14 +6079,37 @@ async function getAccessProfile(options) {
|
|
|
6077
6079
|
refreshTask = void 0;
|
|
6078
6080
|
}
|
|
6079
6081
|
}
|
|
6082
|
+
async function createBrowserRequestProof(profile, outgoing, credential, method) {
|
|
6083
|
+
const bearer = credential ?? outgoing.headers.get("Authorization").slice("Bearer ".length);
|
|
6084
|
+
const digest = async (bytes) => Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256", bytes))).map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
6085
|
+
const timestamp = Date.now();
|
|
6086
|
+
const nonce = randomNonce();
|
|
6087
|
+
const bodyDigest = await digest(await outgoing.clone().arrayBuffer());
|
|
6088
|
+
const url = new URL(outgoing.url);
|
|
6089
|
+
const signedHeaders = ["content-type", "idempotency-key", "x-xopc-expected-session-key", "x-endpoint-id", "x-endpoint-upload-token"];
|
|
6090
|
+
const proof = [
|
|
6091
|
+
"xopc-request-v1",
|
|
6092
|
+
profile.gatewayId,
|
|
6093
|
+
await digest(new TextEncoder().encode(bearer)),
|
|
6094
|
+
method ?? outgoing.method,
|
|
6095
|
+
url.pathname + url.search,
|
|
6096
|
+
bodyDigest,
|
|
6097
|
+
...signedHeaders.map((name) => outgoing.headers.get(name) ?? ""),
|
|
6098
|
+
String(timestamp),
|
|
6099
|
+
nonce
|
|
6100
|
+
].join("\n");
|
|
6101
|
+
return `${timestamp}.${nonce}.${bodyDigest}.${await sign(await getOrCreateKeyPair(), proof)}`;
|
|
6102
|
+
}
|
|
6080
6103
|
async function gatewayFetch(path, init = {}, expectedIdentity) {
|
|
6081
6104
|
let profile = await getAccessProfile();
|
|
6082
6105
|
const identity = expectedIdentity ?? profile;
|
|
6083
6106
|
assertProfileIdentity(profile, identity);
|
|
6084
|
-
const request = () => {
|
|
6107
|
+
const request = async () => {
|
|
6085
6108
|
const headers = new Headers(init.headers);
|
|
6086
6109
|
headers.set("Authorization", `Bearer ${profile.accessToken}`);
|
|
6087
|
-
|
|
6110
|
+
const outgoing = new Request(`${profile.gatewayUrl}${path}`, { ...init, headers });
|
|
6111
|
+
outgoing.headers.set("X-Xopc-Proof", await createBrowserRequestProof(profile, outgoing));
|
|
6112
|
+
return fetch(outgoing.url, { ...init, headers: outgoing.headers, body: outgoing.body ? await outgoing.arrayBuffer() : void 0 });
|
|
6088
6113
|
};
|
|
6089
6114
|
let response = await request();
|
|
6090
6115
|
assertProfileIdentity(await readProfile(), identity);
|
|
@@ -6140,10 +6165,7 @@ async function forgetProfile() {
|
|
|
6140
6165
|
async function revokeAndForgetProfile() {
|
|
6141
6166
|
try {
|
|
6142
6167
|
const profile = await getAccessProfile();
|
|
6143
|
-
await
|
|
6144
|
-
method: "DELETE",
|
|
6145
|
-
headers: { Authorization: `Bearer ${profile.accessToken}` }
|
|
6146
|
-
});
|
|
6168
|
+
await gatewayFetch("/api/devices/me", { method: "DELETE" }, profile);
|
|
6147
6169
|
} finally {
|
|
6148
6170
|
await forgetProfile();
|
|
6149
6171
|
try {
|
|
@@ -6192,6 +6214,7 @@ const realtimeSubscriptionSchema = object({
|
|
|
6192
6214
|
discriminatedUnion("kind", [
|
|
6193
6215
|
envelope("realtime.hello", object({
|
|
6194
6216
|
ticket: string().min(32).max(512),
|
|
6217
|
+
connectionProof: string().min(1).max(256).optional(),
|
|
6195
6218
|
clientId: string().min(1).max(160),
|
|
6196
6219
|
clientKind: realtimeClientKindSchema,
|
|
6197
6220
|
subscriptions: array(realtimeSubscriptionSchema).max(100).default([]),
|
|
@@ -6423,6 +6446,7 @@ class RealtimeClient {
|
|
|
6423
6446
|
}));
|
|
6424
6447
|
this.send(this.clientMessage("realtime.hello", {
|
|
6425
6448
|
ticket,
|
|
6449
|
+
...issuedTicket.connectionProof ? { connectionProof: issuedTicket.connectionProof } : {},
|
|
6426
6450
|
clientId: this.options.clientId,
|
|
6427
6451
|
clientKind: this.options.clientKind,
|
|
6428
6452
|
subscriptions,
|
|
@@ -6742,4 +6766,4 @@ ${marker.timeOrigin}`),
|
|
|
6742
6766
|
});
|
|
6743
6767
|
}
|
|
6744
6768
|
|
|
6745
|
-
export {
|
|
6769
|
+
export { record as A, registerBrowserEndpoint as B, revokeAndForgetProfile as C, runWithTabSiteAccess as D, ENDPOINT_PROTOCOL_VERSION as E, saveExtensionLocalePreference as F, setAutoConnectEnabled as G, strictObject as H, string as I, t as J, unknown as K, MAX_BROWSER_CONTEXTS_PER_TURN as M, PENDING_CONTEXT_KEY as P, REALTIME_PROTOCOL_VERSION as R, TAB_BINDING_PREFIX as T, _enum as _, RealtimeClient as a, activeTabId as b, array as c, boolean as d, browserPageContextsInputSchema as e, cancelPendingBrowserPairing as f, canonicalJson as g, captureContextMenuSelection as h, captureTabWithPermission as i, createBrowserEndpointHello as j, createBrowserRequestProof as k, currentTabDescriptor as l, discoverLocalGateway as m, discriminatedUnion as n, endpointToolContentSchema as o, extensionLocale as p, gatewayFetch as q, getAccessProfile as r, literal as s, loadExtensionLocalePreference as t, number as u, object as v, openDatabase as w, pairGateway as x, readPendingBrowserPairing as y, readProfile as z };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z as readProfile, q as gatewayFetch, o as endpointToolContentSchema, E as ENDPOINT_PROTOCOL_VERSION, g as canonicalJson, T as TAB_BINDING_PREFIX, h as captureContextMenuSelection, P as PENDING_CONTEXT_KEY, J as t, B as registerBrowserEndpoint, r as getAccessProfile, a as RealtimeClient, j as createBrowserEndpointHello, R as REALTIME_PROTOCOL_VERSION, k as createBrowserRequestProof } from './assets/page-context-CVvmTWZb.js';
|
|
2
2
|
|
|
3
3
|
const LOG_COLORS = {
|
|
4
4
|
debug: "color: #888",
|
|
@@ -1214,11 +1214,25 @@ class EndpointToolHostController {
|
|
|
1214
1214
|
|
|
1215
1215
|
const log$1 = createLogger("CDP");
|
|
1216
1216
|
const attached = /* @__PURE__ */ new Set();
|
|
1217
|
+
const CONTROL_PAUSED_KEY = "xopc.browser.control-paused";
|
|
1218
|
+
let controlPaused = false;
|
|
1219
|
+
let pausePersistence = Promise.resolve();
|
|
1220
|
+
async function isControlPaused() {
|
|
1221
|
+
await pausePersistence;
|
|
1222
|
+
const stored = await chrome.storage.local.get(CONTROL_PAUSED_KEY);
|
|
1223
|
+
return controlPaused || stored[CONTROL_PAUSED_KEY] === true;
|
|
1224
|
+
}
|
|
1225
|
+
async function resumeControl() {
|
|
1226
|
+
await pausePersistence;
|
|
1227
|
+
await chrome.storage.local.remove(CONTROL_PAUSED_KEY);
|
|
1228
|
+
controlPaused = false;
|
|
1229
|
+
}
|
|
1217
1230
|
function isDebuggableUrl(url) {
|
|
1218
1231
|
if (!url) return true;
|
|
1219
1232
|
return url.startsWith("http://") || url.startsWith("https://") || url === "about:blank" || url.startsWith("data:");
|
|
1220
1233
|
}
|
|
1221
1234
|
async function ensureAttached(tabId) {
|
|
1235
|
+
if (await isControlPaused()) throw new Error("BROWSER_CONTROL_REVOKED: You stopped Chrome control. Resume browser control in the xopc extension before retrying.");
|
|
1222
1236
|
try {
|
|
1223
1237
|
const tab = await chrome.tabs.get(tabId);
|
|
1224
1238
|
if (!isDebuggableUrl(tab.url)) {
|
|
@@ -1246,10 +1260,7 @@ async function ensureAttached(tabId) {
|
|
|
1246
1260
|
let lastError = "";
|
|
1247
1261
|
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
1248
1262
|
try {
|
|
1249
|
-
|
|
1250
|
-
await chrome.debugger.detach({ tabId });
|
|
1251
|
-
} catch {
|
|
1252
|
-
}
|
|
1263
|
+
if (await isControlPaused()) throw new Error("BROWSER_CONTROL_REVOKED: Resume browser control in the xopc extension.");
|
|
1253
1264
|
await chrome.debugger.attach({ tabId }, "1.3");
|
|
1254
1265
|
attached.add(tabId);
|
|
1255
1266
|
await chrome.debugger.sendCommand({ tabId }, "Runtime.enable", {});
|
|
@@ -1257,6 +1268,7 @@ async function ensureAttached(tabId) {
|
|
|
1257
1268
|
log$1.debug("Attached to tab", { tabId, attempt });
|
|
1258
1269
|
return;
|
|
1259
1270
|
} catch (e) {
|
|
1271
|
+
if (await isControlPaused()) throw new Error("BROWSER_CONTROL_REVOKED: Resume browser control in the xopc extension.");
|
|
1260
1272
|
lastError = e instanceof Error ? e.message : String(e);
|
|
1261
1273
|
if (attempt < MAX_RETRIES) {
|
|
1262
1274
|
await new Promise((r) => setTimeout(r, RETRY_DELAY));
|
|
@@ -1291,8 +1303,14 @@ async function captureScreenshot(tabId, options) {
|
|
|
1291
1303
|
async function dispatchInput(tabId, type, params) {
|
|
1292
1304
|
await sendCommand(tabId, `Input.${type}`, params);
|
|
1293
1305
|
}
|
|
1294
|
-
chrome.debugger.onDetach.addListener((source) => {
|
|
1295
|
-
if (source.tabId) attached.delete(source.tabId);
|
|
1306
|
+
chrome.debugger.onDetach.addListener((source, reason) => {
|
|
1307
|
+
if (source.tabId !== void 0) attached.delete(source.tabId);
|
|
1308
|
+
if (reason === "canceled_by_user") {
|
|
1309
|
+
controlPaused = true;
|
|
1310
|
+
pausePersistence = chrome.storage.local.set({ [CONTROL_PAUSED_KEY]: true }).catch((error) => {
|
|
1311
|
+
log$1.warn("Could not persist Chrome control stop", { error: String(error) });
|
|
1312
|
+
});
|
|
1313
|
+
}
|
|
1296
1314
|
});
|
|
1297
1315
|
|
|
1298
1316
|
const observations = /* @__PURE__ */ new Map();
|
|
@@ -1336,7 +1354,7 @@ async function resolveAttachedTarget(input) {
|
|
|
1336
1354
|
if (origin !== binding.urlOrigin) {
|
|
1337
1355
|
return fail("STALE_OBSERVATION", "The attached tab navigated to another site. Bind it again.");
|
|
1338
1356
|
}
|
|
1339
|
-
if (await markerDigest(tabId) !== binding.documentId) {
|
|
1357
|
+
if (input.action !== "close" && await markerDigest(tabId) !== binding.documentId) {
|
|
1340
1358
|
return fail("STALE_OBSERVATION", "The attached tab document changed. Bind it again.");
|
|
1341
1359
|
}
|
|
1342
1360
|
return { binding, tabId, stateKey: `attached:${binding.id}` };
|
|
@@ -1369,6 +1387,7 @@ async function executeBrowserCommand(command, signal) {
|
|
|
1369
1387
|
}
|
|
1370
1388
|
}
|
|
1371
1389
|
async function execute(input, timeoutMs, visualFallback, startedAt, signal) {
|
|
1390
|
+
if (input.action !== "close" && await isControlPaused()) return fail("DRIVER_UNAVAILABLE", "BROWSER_CONTROL_REVOKED: You stopped Chrome control. Resume browser control in the xopc extension before retrying.");
|
|
1372
1391
|
const sessionId = input.sessionId;
|
|
1373
1392
|
if (!sessionId) return fail("INVALID_INPUT", "Extension actions require a session id.");
|
|
1374
1393
|
const attached = await resolveAttachedTarget(input);
|
|
@@ -1767,7 +1786,11 @@ async function connect(generation) {
|
|
|
1767
1786
|
});
|
|
1768
1787
|
const body = await response.json();
|
|
1769
1788
|
if (!response.ok || !body.payload?.ticket || !body.payload.realtime) throw new Error(`Realtime ticket failed (${response.status})`);
|
|
1770
|
-
return {
|
|
1789
|
+
return {
|
|
1790
|
+
ticket: body.payload.ticket,
|
|
1791
|
+
realtime: body.payload.realtime,
|
|
1792
|
+
connectionProof: await createBrowserRequestProof(profile, new Request(`${profile.gatewayUrl}/api/realtime/v1/ws`), body.payload.ticket, "CONNECT")
|
|
1793
|
+
};
|
|
1771
1794
|
},
|
|
1772
1795
|
createWebSocket: (url) => new WebSocket(url),
|
|
1773
1796
|
onStateChange: (state, error) => {
|
|
@@ -1834,9 +1857,15 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
1834
1857
|
}
|
|
1835
1858
|
void recordingCommand(message.operation ?? "status", message.tabId).then((value) => sendResponse({ ok: true, value })).catch((error) => sendResponse({ ok: false, error: error instanceof Error ? error.message : String(error) }));
|
|
1836
1859
|
} else if (message.type === "browser/get-status") {
|
|
1837
|
-
sendResponse({ connected: Boolean(endpointClaim), transport: "gateway-realtime", error: lastConnectionError });
|
|
1860
|
+
void isControlPaused().then((controlPaused) => sendResponse({ connected: Boolean(endpointClaim), transport: "gateway-realtime", error: lastConnectionError, controlPaused }));
|
|
1838
1861
|
} else if (message.type === "browser/get-endpoint-claim") {
|
|
1839
1862
|
sendResponse({ claim: endpointClaim, error: lastConnectionError });
|
|
1863
|
+
} else if (message.type === "browser/resume-control") {
|
|
1864
|
+
if (sender.url?.split("?")[0] !== chrome.runtime.getURL("dist/sidepanel.html")) {
|
|
1865
|
+
sendResponse({ ok: false, error: "Use the extension control to resume." });
|
|
1866
|
+
return true;
|
|
1867
|
+
}
|
|
1868
|
+
void resumeControl().then(() => sendResponse({ ok: true })).catch(() => sendResponse({ ok: false, error: "Control could not be resumed." }));
|
|
1840
1869
|
} else if (message.type === "browser/reconnect") {
|
|
1841
1870
|
disconnect();
|
|
1842
1871
|
connectWithLogging();
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>xopc</title>
|
|
7
7
|
<script type="module" crossorigin src="./sidepanel.js"></script>
|
|
8
|
-
<link rel="modulepreload" crossorigin href="./assets/page-context-
|
|
8
|
+
<link rel="modulepreload" crossorigin href="./assets/page-context-CVvmTWZb.js">
|
|
9
9
|
<link rel="stylesheet" crossorigin href="./assets/sidepanel-CQeQB5vW.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { H as strictObject, u as number, d as boolean, I as string, c as array, _ as _enum, s as literal, v as object, n as discriminatedUnion, e as browserPageContextsInputSchema, A as record$1, K as unknown, J as t, q as gatewayFetch, M as MAX_BROWSER_CONTEXTS_PER_TURN, p as extensionLocale, w as openDatabase, a as RealtimeClient, R as REALTIME_PROTOCOL_VERSION, b as activeTabId, l as currentTabDescriptor, T as TAB_BINDING_PREFIX, r as getAccessProfile, z as readProfile, D as runWithTabSiteAccess, P as PENDING_CONTEXT_KEY, i as captureTabWithPermission, x as pairGateway, G as setAutoConnectEnabled, y as readPendingBrowserPairing, m as discoverLocalGateway, F as saveExtensionLocalePreference, C as revokeAndForgetProfile, f as cancelPendingBrowserPairing, t as loadExtensionLocalePreference } from './assets/page-context-CVvmTWZb.js';
|
|
2
2
|
|
|
3
3
|
const AppContextResourceSchema = strictObject({
|
|
4
4
|
kind: _enum(["note", "task", "project", "local_app"]),
|
|
@@ -46271,9 +46271,20 @@ function pairingErrorMessage(cause) {
|
|
|
46271
46271
|
if (message.startsWith("PAIRING_ROUTE_PERMISSION_REQUIRED:")) {
|
|
46272
46272
|
return t("errorNextRoutePermission");
|
|
46273
46273
|
}
|
|
46274
|
+
if (/Failed to start native messaging host|Access to the specified native messaging host is forbidden/i.test(message)) return t("errorLocalHostBlockedHelp");
|
|
46274
46275
|
return message;
|
|
46275
46276
|
}
|
|
46276
46277
|
function SidePanelApp({ initialLocale, initialTheme }) {
|
|
46278
|
+
const [controlPaused, setControlPaused] = reactExports.useState(false);
|
|
46279
|
+
reactExports.useEffect(() => {
|
|
46280
|
+
const refresh = () => {
|
|
46281
|
+
void chrome.runtime.sendMessage({ type: "browser/get-status" }).then((status) => setControlPaused(status?.controlPaused === true)).catch(() => {
|
|
46282
|
+
});
|
|
46283
|
+
};
|
|
46284
|
+
refresh();
|
|
46285
|
+
const timer = setInterval(refresh, 1500);
|
|
46286
|
+
return () => clearInterval(timer);
|
|
46287
|
+
}, []);
|
|
46277
46288
|
const [profile, setProfile] = reactExports.useState();
|
|
46278
46289
|
const [invitation, setInvitation] = reactExports.useState("");
|
|
46279
46290
|
const [confirmationCode, setConfirmationCode] = reactExports.useState("");
|
|
@@ -46396,7 +46407,7 @@ function SidePanelApp({ initialLocale, initialTheme }) {
|
|
|
46396
46407
|
setLocalInvitation(local.invitation);
|
|
46397
46408
|
await connect(local.invitation);
|
|
46398
46409
|
} catch (cause) {
|
|
46399
|
-
setError(
|
|
46410
|
+
setError(pairingErrorMessage(cause));
|
|
46400
46411
|
setState("unpaired");
|
|
46401
46412
|
}
|
|
46402
46413
|
}
|
|
@@ -46410,7 +46421,7 @@ function SidePanelApp({ initialLocale, initialTheme }) {
|
|
|
46410
46421
|
setConfirmationCode("");
|
|
46411
46422
|
setState("unpaired");
|
|
46412
46423
|
} catch (cause) {
|
|
46413
|
-
setError(
|
|
46424
|
+
setError(pairingErrorMessage(cause));
|
|
46414
46425
|
setState("unpaired");
|
|
46415
46426
|
}
|
|
46416
46427
|
}
|
|
@@ -46488,6 +46499,14 @@ function SidePanelApp({ initialLocale, initialTheme }) {
|
|
|
46488
46499
|
] }) : null
|
|
46489
46500
|
] })
|
|
46490
46501
|
] }),
|
|
46502
|
+
controlPaused && /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "card", role: "alert", children: [
|
|
46503
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: t("browserControlStopped") }),
|
|
46504
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary", onClick: () => {
|
|
46505
|
+
void chrome.runtime.sendMessage({ type: "browser/resume-control" }).then((result) => {
|
|
46506
|
+
if (result?.ok) setControlPaused(false);
|
|
46507
|
+
});
|
|
46508
|
+
}, children: t("browserControlResume") })
|
|
46509
|
+
] }),
|
|
46491
46510
|
state !== "online" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "center", children: [
|
|
46492
46511
|
state === "loading" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "muted", children: t("loading") }) : null,
|
|
46493
46512
|
state === "unpaired" || state === "pairing" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "card", children: [
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"minimum_chrome_version": "120",
|
|
4
4
|
"default_locale": "en",
|
|
5
5
|
"name": "__MSG_appName__",
|
|
6
|
-
"version": "0.0.
|
|
6
|
+
"version": "0.0.416",
|
|
7
7
|
"description": "__MSG_appDescription__",
|
|
8
8
|
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnpr4vpLC/nmvy+wiOWk3SWlp2nEZkFijfk8ivGw7StNZgCK90nOMvwhdEtlkk3GOWDvdVnq8HxCsM3UNQ8FnGUyerpH1FJXqXuradxeHf8ZxFjiQU/mIWfnKbUuONWQORon3/pigyoXoK/VUXgg0Wbm/rbVwsS0bv+25R6m+mZgBspOLeKuoH7ivhL+48WV6POtMBsFPZweY26477EM7ukh+56Ff5ENevB8ymxBBn7qK5ZoeZd2a23U8ioX5TsHfe6fnrjitPWjIxD8G0NoKQxcaa/Mo+xs+T6UiLKxP0wjz5bm7jB5H+CXtkRJqzBWUB0h+RSLJckzZfA8BAJrRwIDAQAB",
|
|
9
9
|
"permissions": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "telegram",
|
|
3
3
|
"name": "Telegram Channel",
|
|
4
4
|
"description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.416",
|
|
6
6
|
"kind": "channel",
|
|
7
7
|
"main": "src/index.js",
|
|
8
8
|
"channels": [
|