@xopcai/xopc 0.0.253 → 0.0.255
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/dist/background.js +59 -13
- package/dist/browser-ext/dist/content.js +0 -5
- package/dist/browser-ext/manifest.json +2 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-CeS1bgXP.js → activity-store-DvjK5FEm.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BdF3HhCW.js → agent-avatar-dicebear-Cqspzbf_.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CL3Mi-uM.js +1 -0
- package/dist/gateway/static/root/assets/agents-odqXmGhA.js +1 -0
- package/dist/gateway/static/root/assets/{api-zMPeC0yU.js → api-CsYi3heY.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BaAFln8W.js → app-management-settings-panel-Gd4a5hdE.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CXvsoBlw.js → appearance-settings-CZ6KOnbd.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DyBDoCam.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-C0o_mVQI.js → archive-plugin-y82Rwhjm.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-B5Ry3tGL.js → attachment-load-D46SGNpv.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DY5QAEQd.js → automations-page-wilciIZ1.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-8U86Umig.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BydpEgBA.js → binary-plugins-CuMkNNCe.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-D0CpUOMo.js → block-editor-DFnPsrxI.js} +44 -44
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DzbTsGI6.js → browser-automation-inputs-hlmcSp4p.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-D7fZYjni.js → browser-automations-page-OjZvbARU.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-DOUG84qV.js +8 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CG73Mwi8.js +7 -0
- package/dist/gateway/static/root/assets/channels-settings-MDywEWWM.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-BGGRTkn6.js → channels-status-swr-D1HHFzkE.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-_CP4nvlg.js → chat-terminal-dock-Ce_T9BPq.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-D29p6Zvm.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-g2U8Rllf.js → cron-expression-BRrCwYyD.js} +1 -1
- package/dist/gateway/static/root/assets/date-picker-C35RuuWW.js +1 -0
- package/dist/gateway/static/root/assets/{dependency-picker-D-0gcbbM.js → dependency-picker-4pNXVcRM.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-D7kvWQ9H.js → desktop-pet-settings-BvV1UA5g.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-Cl3JRIu6.js → desktop-pet-z91GYnPf.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DtP2tJHY.js → extension-debug-page-CkVF5HvV.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CphZDdoT.js → extension-page-DW0zQGaB.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CsxVLV4-.js → extension-settings-page-BLQhizZ3.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BW3Bx-aV.js → gateway-config-swr-02BBC1mK.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DxBZ05dX.js → gateway-settings-rAXx8FGP.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DAq74TZe.js → gateway-startup-retry-XZnY6621.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-BaW_r1t9.js +1 -0
- package/dist/gateway/static/root/assets/home-page-BoTS8-Z9.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-MPuaXDRs.js → image-generation-api-CIcKz4Xs.js} +1 -1
- package/dist/gateway/static/root/assets/index-DsonmRCH.css +2 -0
- package/dist/gateway/static/root/assets/index-PksHo9hS.js +74 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CfhaTqgE.js → keyboard-shortcuts-settings-yfaGz6SE.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-CR6asX7L.js → local-app-workbench-page-B3flRQH1.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-g01W3kEK.js → local-apps-page-Cp-nEtgV.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-BkeaPZpn.js → locale-store-VsboRLD7.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DkqsRCri.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-DeGxJF_Z.js → management-settings-24_JyDPk.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-Ca7BRBLL.js → markdown-view-CPXhy6nh.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-FmOhmzlD.js → media-plugins-CwLvIb9r.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DngsF_Kx.js +3 -0
- package/dist/gateway/static/root/assets/{mobile-pairing-wizard-BXNbn05L.js → mobile-pairing-wizard-BbJCDv57.js} +1 -1
- package/dist/gateway/static/root/assets/note-detail-panel-OklYXK7y.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-BjfgJIQw.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-pyukZ1PJ.js → page-tabs-0YXn9Gkl.js} +1 -1
- package/dist/gateway/static/root/assets/popover-select-CKBYnT3c.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-slFHoMUe.js → preview-open-alternatives-2jVV5kfZ.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CXa3FNNk.js → product-open-page-D7p0NfTK.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-rLNM2mP0.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-D6jY2ZWl.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-CviQoUBf.js → registry-api-DlTWbXQA.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CZZg0kXc.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-O9D9o7-O.js → runtime-tools-settings-panel-B-NDgmJ4.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-8FesicnL.js → schema-form-DZYeBS1v.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BvuxJegi.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BAQHP4mB.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CBic9TFH.js → settings-form-section-zy5UMvPk.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Xz66_Mjg.js → settings-page-CTuipbJq.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BkWoc5j5.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page--JpjwB58.js → share-preview-page-D3Uawo_h.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-B2doziIn.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-D2ymjqG5.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-fVKExKv5.js → skills-page-DDbabz7p.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-Yv9u3uJp.js → skills-page.utils-DkGhbiMa.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-CCWjVdc2.js → system-settings-panel-Fc-WbX6-.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-7w7eB9nB.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BtkaVpMm.js → theme-store-vdB57bTn.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-C__W9BaN.js → tunnel-api-DZ0evABj.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-Dow9RRcq.js → use-autosave-Ckof_m7e.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-CcNCyrXZ.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-CvF3lEyx.js → voice-api-key-field-CnmtpWlq.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-BEUVAyM6.js → voice-config-api-OA04c71t.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-B9PDfReq.js → work-discovery-overlay-sxvsDIC3.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-CUCfBpPF.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-Bp-nvnLa.js +5 -0
- package/dist/gateway/static/root/index.html +11 -11
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
- package/dist/src/agent/service.js +2 -2
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +17 -2
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +85 -1
- package/dist/src/agent/tools/browser/tool/schemas.js +212 -5
- package/dist/src/agent/tools/create-share-tool.js +39 -1
- package/dist/src/agent/tools/xopc-use-tool.js +2 -2
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/oauth/xopc-cloud.js +1 -1
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/browser/drivers/extension-driver.d.ts +4 -4
- package/dist/src/browser/drivers/extension-driver.js +20 -8
- package/dist/src/browser/drivers/playwright-driver.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +3 -0
- package/dist/src/browser/providers/browser-ext-install.js +19 -4
- package/dist/src/browser/providers/extension.d.ts +14 -1
- package/dist/src/browser/providers/extension.js +89 -11
- package/dist/src/browser/providers/playwright-install.js +8 -12
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/tunnel.js +3 -3
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/device-routes.js +1 -1
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +2 -2
- package/dist/src/gateway/hono/routes/browser.js +149 -27
- package/dist/src/gateway/hono/routes/lazy-bundles.js +3 -3
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +404 -7
- package/dist/src/gateway/hono/routes/site-shares.js +19 -13
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/sessions-api.js +1 -1
- package/dist/src/gateway/service.js +13 -13
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/model-thinking.js +57 -20
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/remote-access/exposure-manager.js +1 -1
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/share/hosted-note-publication.d.ts +22 -0
- package/dist/src/share/hosted-note-publication.js +96 -0
- package/dist/src/share/hosted-session-share.d.ts +86 -7
- package/dist/src/share/hosted-session-share.js +72 -15
- package/dist/src/share/hosted-static-site-publication.d.ts +16 -0
- package/dist/src/share/hosted-static-site-publication.js +108 -0
- package/dist/src/share/hosted-static-site-publish.d.ts +23 -0
- package/dist/src/share/hosted-static-site-publish.js +53 -0
- package/dist/src/share/note-share-service.d.ts +1 -0
- package/dist/src/share/note-share-service.js +4 -4
- package/dist/src/share/share-url.d.ts +1 -1
- package/dist/src/share/share-url.js +14 -9
- package/dist/src/tasks/home-query-service.js +2 -2
- package/dist/src/tui/backends/embedded-backend.js +2 -2
- package/dist/src/tui/tui-agent-events.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/tunnel/index.js +1 -1
- package/dist/src/tunnel/tunnel-service.js +1 -1
- package/dist/src/voice/realtime/agentEngine.js +17 -0
- package/dist/src/voice/realtime/memory-context.js +1 -1
- package/dist/src/voice/realtime/playback-echo.d.ts +2 -0
- package/dist/src/voice/realtime/playback-echo.js +15 -0
- package/dist/src/work-discovery/service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +2 -2
- package/package.json +2 -2
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Bs34Kp0K.js +0 -1
- package/dist/gateway/static/root/assets/agents-DARlgjTm.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BhgvfBJT.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-BzX4lILP.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BBdMqxl0.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D_WfftDW.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-bdRLT9KA.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CPDjU5wU.js +0 -2
- package/dist/gateway/static/root/assets/date-picker-SmVlhtj_.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DWcKsIoZ.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BdvLZKQZ.js +0 -1
- package/dist/gateway/static/root/assets/index-C7RDs6S-.js +0 -74
- package/dist/gateway/static/root/assets/index-Cu8xqZQ9.css +0 -2
- package/dist/gateway/static/root/assets/logs-page-ZP4QTWoC.js +0 -2
- package/dist/gateway/static/root/assets/messages-C72stReU.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-EeVeF4II.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-D7bMff96.js +0 -8
- package/dist/gateway/static/root/assets/popover-select-C-Hj-nXR.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-BDF88VdN.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DeTD6pu1.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CxKrdQ6a.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DUFJN-2t.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CcSYDjaH.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C6DuwrP5.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CovcdHSC.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CrHagTsE.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-I8hueJnG.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-CU6nxmoM.js +0 -2
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-kWGFkhjz.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-B4Is5E42.js +0 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatBrowserObservation } from "../../../../browser/observation/format.js";
|
|
2
|
-
import { BrowserUseSchema } from "./schemas.js";
|
|
2
|
+
import { BrowserUseSchema, decodeBrowserUseInput } from "./schemas.js";
|
|
3
3
|
//#region src/agent/tools/browser/tool/browser-use-tool.ts
|
|
4
4
|
function createBrowserUseTool(deps) {
|
|
5
5
|
return {
|
|
@@ -8,6 +8,21 @@ function createBrowserUseTool(deps) {
|
|
|
8
8
|
description: "Control a persistent browser through typed semantic actions. Start with observe or navigate, then use only refs and revision values from the latest observation. Screenshots are attached only when requested or semantic observation is insufficient.",
|
|
9
9
|
parameters: BrowserUseSchema,
|
|
10
10
|
async execute(_toolCallId, params, signal) {
|
|
11
|
+
const input = decodeBrowserUseInput(params);
|
|
12
|
+
if (!input) return {
|
|
13
|
+
content: [{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: `[INVALID_INPUT] Invalid parameters for browser action "${params.action}".`
|
|
16
|
+
}],
|
|
17
|
+
details: {
|
|
18
|
+
ok: false,
|
|
19
|
+
kind: "browser_error",
|
|
20
|
+
error: {
|
|
21
|
+
code: "INVALID_INPUT",
|
|
22
|
+
message: `Invalid parameters for browser action "${params.action}".`
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
11
26
|
const readiness = await deps.getReadiness?.();
|
|
12
27
|
if (readiness) return {
|
|
13
28
|
content: [{
|
|
@@ -20,7 +35,7 @@ function createBrowserUseTool(deps) {
|
|
|
20
35
|
hint: readiness.hint
|
|
21
36
|
}
|
|
22
37
|
};
|
|
23
|
-
return presentResult(await deps.getRuntime().execute(deps.getTaskId(),
|
|
38
|
+
return presentResult(await deps.getRuntime().execute(deps.getTaskId(), input, signal));
|
|
24
39
|
}
|
|
25
40
|
};
|
|
26
41
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { BrowserActionInput } from '@xopcai/browser-control-contract';
|
|
1
2
|
import { type Static } from '@sinclair/typebox';
|
|
2
|
-
export declare const
|
|
3
|
+
export declare const BrowserUseActionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
3
4
|
action: import("@sinclair/typebox").TLiteral<"observe">;
|
|
4
5
|
sessionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
5
6
|
approvalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
@@ -200,4 +201,87 @@ export declare const BrowserUseSchema: import("@sinclair/typebox").TUnion<[impor
|
|
|
200
201
|
sessionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
201
202
|
approvalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
202
203
|
}>]>;
|
|
204
|
+
export declare const BrowserUseSchema: import("@sinclair/typebox").TObject<{
|
|
205
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"observe">, import("@sinclair/typebox").TLiteral<"navigate">, import("@sinclair/typebox").TLiteral<"click">, import("@sinclair/typebox").TLiteral<"fill">, import("@sinclair/typebox").TLiteral<"select">, import("@sinclair/typebox").TLiteral<"press">, import("@sinclair/typebox").TLiteral<"scroll">, import("@sinclair/typebox").TLiteral<"wait">, import("@sinclair/typebox").TLiteral<"upload">, import("@sinclair/typebox").TLiteral<"tabs">, import("@sinclair/typebox").TLiteral<"sequence">, import("@sinclair/typebox").TLiteral<"close">]>;
|
|
206
|
+
sessionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
207
|
+
approvalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
208
|
+
revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
209
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
210
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
211
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
212
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
213
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
214
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
215
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
216
|
+
}>>;
|
|
217
|
+
visual: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"never">, import("@sinclair/typebox").TLiteral<"auto">, import("@sinclair/typebox").TLiteral<"always">]>>;
|
|
218
|
+
url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
219
|
+
value: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
220
|
+
submit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
221
|
+
key: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
222
|
+
deltaY: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
223
|
+
condition: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"page_idle">, import("@sinclair/typebox").TLiteral<"text">, import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
224
|
+
timeoutMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
225
|
+
paths: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
226
|
+
operation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"activate">, import("@sinclair/typebox").TLiteral<"close">]>>;
|
|
227
|
+
tabId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
228
|
+
steps: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
229
|
+
action: import("@sinclair/typebox").TLiteral<"click">;
|
|
230
|
+
ref: import("@sinclair/typebox").TString;
|
|
231
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
232
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
233
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
234
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
235
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
236
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
237
|
+
}>>;
|
|
238
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
239
|
+
action: import("@sinclair/typebox").TLiteral<"fill">;
|
|
240
|
+
ref: import("@sinclair/typebox").TString;
|
|
241
|
+
value: import("@sinclair/typebox").TString;
|
|
242
|
+
submit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
243
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
244
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
245
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
246
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
247
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
248
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
249
|
+
}>>;
|
|
250
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
251
|
+
action: import("@sinclair/typebox").TLiteral<"select">;
|
|
252
|
+
ref: import("@sinclair/typebox").TString;
|
|
253
|
+
value: import("@sinclair/typebox").TString;
|
|
254
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
255
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
256
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
257
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
258
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
259
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
260
|
+
}>>;
|
|
261
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
262
|
+
action: import("@sinclair/typebox").TLiteral<"press">;
|
|
263
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
264
|
+
key: import("@sinclair/typebox").TString;
|
|
265
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
266
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
267
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
268
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
269
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
270
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
271
|
+
}>>;
|
|
272
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
273
|
+
action: import("@sinclair/typebox").TLiteral<"scroll">;
|
|
274
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
275
|
+
deltaY: import("@sinclair/typebox").TNumber;
|
|
276
|
+
expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
277
|
+
urlIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
278
|
+
titleIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
279
|
+
textIncludes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
280
|
+
ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
281
|
+
state: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"visible">, import("@sinclair/typebox").TLiteral<"hidden">]>>;
|
|
282
|
+
}>>;
|
|
283
|
+
}>]>>>;
|
|
284
|
+
}>;
|
|
203
285
|
export type BrowserUseInput = Static<typeof BrowserUseSchema>;
|
|
286
|
+
/** Decode the provider-facing superset into one exact Browser Control action. */
|
|
287
|
+
export declare function decodeBrowserUseInput(value: unknown): BrowserActionInput | null;
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Value } from "@sinclair/typebox/value";
|
|
2
3
|
//#region src/agent/tools/browser/tool/schemas.ts
|
|
3
4
|
const ApprovalId = Type.Optional(Type.String({ description: "One-time local-owner approval id for this exact action." }));
|
|
4
5
|
const SessionId = Type.Optional(Type.String({ description: "Browser session id returned by the previous observation." }));
|
|
5
6
|
const Revision = Type.Number({ description: "Observation revision used to resolve element refs." });
|
|
6
|
-
const Ref = Type.String({
|
|
7
|
-
|
|
7
|
+
const Ref = Type.String({
|
|
8
|
+
minLength: 1,
|
|
9
|
+
description: "Ephemeral element ref from the latest observation."
|
|
10
|
+
});
|
|
11
|
+
const ExpectationSchema = Type.Object({
|
|
8
12
|
urlIncludes: Type.Optional(Type.String()),
|
|
9
13
|
titleIncludes: Type.Optional(Type.String()),
|
|
10
14
|
textIncludes: Type.Optional(Type.String()),
|
|
11
15
|
ref: Type.Optional(Type.String()),
|
|
12
16
|
state: Type.Optional(Type.Union([Type.Literal("visible"), Type.Literal("hidden")]))
|
|
13
|
-
}, { additionalProperties: false })
|
|
17
|
+
}, { additionalProperties: false });
|
|
18
|
+
const Expectation = Type.Optional(ExpectationSchema);
|
|
14
19
|
function action(name, properties) {
|
|
15
20
|
return Type.Object({
|
|
16
21
|
action: Type.Literal(name),
|
|
@@ -133,7 +138,7 @@ const Sequence = action("sequence", {
|
|
|
133
138
|
expect: Expectation
|
|
134
139
|
});
|
|
135
140
|
const Close = action("close", {});
|
|
136
|
-
const
|
|
141
|
+
const BrowserUseActionSchema = Type.Union([
|
|
137
142
|
Observe,
|
|
138
143
|
Navigate,
|
|
139
144
|
Click,
|
|
@@ -147,5 +152,207 @@ const BrowserUseSchema = Type.Union([
|
|
|
147
152
|
Sequence,
|
|
148
153
|
Close
|
|
149
154
|
]);
|
|
155
|
+
const BrowserUseSchema = Type.Object({
|
|
156
|
+
action: Type.Union([
|
|
157
|
+
Type.Literal("observe"),
|
|
158
|
+
Type.Literal("navigate"),
|
|
159
|
+
Type.Literal("click"),
|
|
160
|
+
Type.Literal("fill"),
|
|
161
|
+
Type.Literal("select"),
|
|
162
|
+
Type.Literal("press"),
|
|
163
|
+
Type.Literal("scroll"),
|
|
164
|
+
Type.Literal("wait"),
|
|
165
|
+
Type.Literal("upload"),
|
|
166
|
+
Type.Literal("tabs"),
|
|
167
|
+
Type.Literal("sequence"),
|
|
168
|
+
Type.Literal("close")
|
|
169
|
+
]),
|
|
170
|
+
sessionId: SessionId,
|
|
171
|
+
approvalId: ApprovalId,
|
|
172
|
+
revision: Type.Optional(Revision),
|
|
173
|
+
ref: Type.Optional(Ref),
|
|
174
|
+
expect: Type.Optional(ExpectationSchema),
|
|
175
|
+
visual: Type.Optional(Type.Union([
|
|
176
|
+
Type.Literal("never"),
|
|
177
|
+
Type.Literal("auto"),
|
|
178
|
+
Type.Literal("always")
|
|
179
|
+
])),
|
|
180
|
+
url: Type.Optional(Type.String({ minLength: 1 })),
|
|
181
|
+
value: Type.Optional(Type.String()),
|
|
182
|
+
submit: Type.Optional(Type.Boolean()),
|
|
183
|
+
key: Type.Optional(Type.String({ minLength: 1 })),
|
|
184
|
+
deltaY: Type.Optional(Type.Number()),
|
|
185
|
+
condition: Type.Optional(Type.Union([
|
|
186
|
+
Type.Literal("page_idle"),
|
|
187
|
+
Type.Literal("text"),
|
|
188
|
+
Type.Literal("visible"),
|
|
189
|
+
Type.Literal("hidden")
|
|
190
|
+
])),
|
|
191
|
+
timeoutMs: Type.Optional(Type.Number({
|
|
192
|
+
minimum: 100,
|
|
193
|
+
maximum: 12e4
|
|
194
|
+
})),
|
|
195
|
+
paths: Type.Optional(Type.Array(Type.String({ minLength: 1 }), {
|
|
196
|
+
minItems: 1,
|
|
197
|
+
maxItems: 20
|
|
198
|
+
})),
|
|
199
|
+
operation: Type.Optional(Type.Union([
|
|
200
|
+
Type.Literal("list"),
|
|
201
|
+
Type.Literal("create"),
|
|
202
|
+
Type.Literal("activate"),
|
|
203
|
+
Type.Literal("close")
|
|
204
|
+
])),
|
|
205
|
+
tabId: Type.Optional(Type.String()),
|
|
206
|
+
steps: Type.Optional(Type.Array(SequenceStep, {
|
|
207
|
+
minItems: 1,
|
|
208
|
+
maxItems: 10
|
|
209
|
+
}))
|
|
210
|
+
}, { additionalProperties: false });
|
|
211
|
+
const ACTION_FIELDS = {
|
|
212
|
+
observe: ["visual"],
|
|
213
|
+
navigate: ["url", "expect"],
|
|
214
|
+
click: [
|
|
215
|
+
"revision",
|
|
216
|
+
"ref",
|
|
217
|
+
"expect"
|
|
218
|
+
],
|
|
219
|
+
fill: [
|
|
220
|
+
"revision",
|
|
221
|
+
"ref",
|
|
222
|
+
"value",
|
|
223
|
+
"submit",
|
|
224
|
+
"expect"
|
|
225
|
+
],
|
|
226
|
+
select: [
|
|
227
|
+
"revision",
|
|
228
|
+
"ref",
|
|
229
|
+
"value",
|
|
230
|
+
"expect"
|
|
231
|
+
],
|
|
232
|
+
press: [
|
|
233
|
+
"revision",
|
|
234
|
+
"ref",
|
|
235
|
+
"key",
|
|
236
|
+
"expect"
|
|
237
|
+
],
|
|
238
|
+
scroll: [
|
|
239
|
+
"revision",
|
|
240
|
+
"ref",
|
|
241
|
+
"deltaY",
|
|
242
|
+
"expect"
|
|
243
|
+
],
|
|
244
|
+
wait: [
|
|
245
|
+
"revision",
|
|
246
|
+
"condition",
|
|
247
|
+
"value",
|
|
248
|
+
"ref",
|
|
249
|
+
"timeoutMs"
|
|
250
|
+
],
|
|
251
|
+
upload: [
|
|
252
|
+
"revision",
|
|
253
|
+
"ref",
|
|
254
|
+
"paths",
|
|
255
|
+
"expect"
|
|
256
|
+
],
|
|
257
|
+
tabs: [
|
|
258
|
+
"operation",
|
|
259
|
+
"tabId",
|
|
260
|
+
"url"
|
|
261
|
+
],
|
|
262
|
+
sequence: [
|
|
263
|
+
"revision",
|
|
264
|
+
"steps",
|
|
265
|
+
"expect"
|
|
266
|
+
],
|
|
267
|
+
close: []
|
|
268
|
+
};
|
|
269
|
+
const SEQUENCE_STEP_FIELDS = {
|
|
270
|
+
click: ["ref", "expect"],
|
|
271
|
+
fill: [
|
|
272
|
+
"ref",
|
|
273
|
+
"value",
|
|
274
|
+
"submit",
|
|
275
|
+
"expect"
|
|
276
|
+
],
|
|
277
|
+
select: [
|
|
278
|
+
"ref",
|
|
279
|
+
"value",
|
|
280
|
+
"expect"
|
|
281
|
+
],
|
|
282
|
+
press: [
|
|
283
|
+
"ref",
|
|
284
|
+
"key",
|
|
285
|
+
"expect"
|
|
286
|
+
],
|
|
287
|
+
scroll: [
|
|
288
|
+
"ref",
|
|
289
|
+
"deltaY",
|
|
290
|
+
"expect"
|
|
291
|
+
]
|
|
292
|
+
};
|
|
293
|
+
/** Decode the provider-facing superset into one exact Browser Control action. */
|
|
294
|
+
function decodeBrowserUseInput(value) {
|
|
295
|
+
if (!isRecord(value) || !isBrowserActionName(value.action)) return null;
|
|
296
|
+
const candidate = { action: value.action };
|
|
297
|
+
copyNonEmptyString(value, candidate, "sessionId");
|
|
298
|
+
copyNonEmptyString(value, candidate, "approvalId");
|
|
299
|
+
for (const field of ACTION_FIELDS[value.action]) {
|
|
300
|
+
const fieldValue = value[field];
|
|
301
|
+
if (fieldValue === void 0 || fieldValue === null) continue;
|
|
302
|
+
if (field === "expect") {
|
|
303
|
+
const expectation = decodeExpectation(fieldValue);
|
|
304
|
+
if (expectation) candidate.expect = expectation;
|
|
305
|
+
} else if (field === "steps") {
|
|
306
|
+
if (!Array.isArray(fieldValue)) {
|
|
307
|
+
candidate.steps = fieldValue;
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
const steps = fieldValue.map(decodeSequenceStep);
|
|
311
|
+
if (steps.some((step) => step === null)) return null;
|
|
312
|
+
candidate.steps = steps;
|
|
313
|
+
} else if ((field === "ref" || field === "tabId" || field === "url") && fieldValue === "") continue;
|
|
314
|
+
else candidate[field] = fieldValue;
|
|
315
|
+
}
|
|
316
|
+
return Value.Check(BrowserUseActionSchema, candidate) ? candidate : null;
|
|
317
|
+
}
|
|
318
|
+
function decodeSequenceStep(value) {
|
|
319
|
+
if (!isRecord(value) || !isSequenceActionName(value.action)) return null;
|
|
320
|
+
const candidate = { action: value.action };
|
|
321
|
+
for (const field of SEQUENCE_STEP_FIELDS[value.action]) {
|
|
322
|
+
const fieldValue = value[field];
|
|
323
|
+
if (fieldValue === void 0 || fieldValue === null) continue;
|
|
324
|
+
if (field === "expect") {
|
|
325
|
+
const expectation = decodeExpectation(fieldValue);
|
|
326
|
+
if (expectation) candidate.expect = expectation;
|
|
327
|
+
} else if (field === "ref" && fieldValue === "") continue;
|
|
328
|
+
else candidate[field] = fieldValue;
|
|
329
|
+
}
|
|
330
|
+
return candidate;
|
|
331
|
+
}
|
|
332
|
+
function decodeExpectation(value) {
|
|
333
|
+
if (!isRecord(value)) return null;
|
|
334
|
+
const expectation = {};
|
|
335
|
+
for (const field of [
|
|
336
|
+
"urlIncludes",
|
|
337
|
+
"titleIncludes",
|
|
338
|
+
"textIncludes",
|
|
339
|
+
"ref"
|
|
340
|
+
]) copyNonEmptyString(value, expectation, field);
|
|
341
|
+
if (expectation.ref && (value.state === "visible" || value.state === "hidden")) expectation.state = value.state;
|
|
342
|
+
return Object.keys(expectation).length > 0 ? expectation : null;
|
|
343
|
+
}
|
|
344
|
+
function copyNonEmptyString(source, target, field) {
|
|
345
|
+
const value = source[field];
|
|
346
|
+
if (typeof value === "string" && value.length > 0) target[field] = value;
|
|
347
|
+
}
|
|
348
|
+
function isBrowserActionName(value) {
|
|
349
|
+
return typeof value === "string" && Object.hasOwn(ACTION_FIELDS, value);
|
|
350
|
+
}
|
|
351
|
+
function isSequenceActionName(value) {
|
|
352
|
+
return typeof value === "string" && Object.hasOwn(SEQUENCE_STEP_FIELDS, value);
|
|
353
|
+
}
|
|
354
|
+
function isRecord(value) {
|
|
355
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
356
|
+
}
|
|
150
357
|
//#endregion
|
|
151
|
-
export { BrowserUseSchema };
|
|
358
|
+
export { BrowserUseActionSchema, BrowserUseSchema, decodeBrowserUseInput };
|
|
@@ -6,6 +6,7 @@ import { mergeWithDefaults } from "../../share/site-share-config.js";
|
|
|
6
6
|
import { getShareStore } from "../../share/share-store.js";
|
|
7
7
|
import { getSiteShareStore } from "../../share/site-share-store.js";
|
|
8
8
|
import { resolveShareUrl, resolveSiteShareUrl } from "../../share/share-url.js";
|
|
9
|
+
import { publishHostedStaticSite } from "../../share/hosted-static-site-publish.js";
|
|
9
10
|
import { resolveReverseProxyPublicUrl } from "../../gateway/public-url.js";
|
|
10
11
|
import { audienceDefaults, decideShareKind, makeDescription, makeTitle, probeShareTarget, rememberStagedSite, stageSingleHtmlAsSite } from "../../share/share-auto.js";
|
|
11
12
|
import { scheduleThumbnail } from "../../share/share-thumbnail.js";
|
|
@@ -110,6 +111,44 @@ function createCreateShareTool(deps) {
|
|
|
110
111
|
const siteStore = getSiteShareStore(siteCfg);
|
|
111
112
|
let sitePath = relPath;
|
|
112
113
|
let stagedDir = null;
|
|
114
|
+
const titleOut = makeTitle(probe.kind === "directory" ? relPath.split("/").pop() || relPath : probe.absolutePath.split(/[\\/]/).pop() || relPath, p.title);
|
|
115
|
+
if (resolveSiteShareUrl({
|
|
116
|
+
...urlCtx,
|
|
117
|
+
token: "reachability-check",
|
|
118
|
+
subdomainLabel: "reachability-check",
|
|
119
|
+
publicHostSuffix: siteCfg.publicHostSuffix
|
|
120
|
+
}).reachability !== "public") {
|
|
121
|
+
const { binding } = await publishHostedStaticSite({
|
|
122
|
+
workspaceRoot: workspace,
|
|
123
|
+
path: sitePath,
|
|
124
|
+
title: titleOut,
|
|
125
|
+
description: p.description,
|
|
126
|
+
spaFallback: true,
|
|
127
|
+
ttlMs,
|
|
128
|
+
maxViews: maxViews ?? null,
|
|
129
|
+
agentId: deps.getAgentId?.()
|
|
130
|
+
});
|
|
131
|
+
return successResult(locale, {
|
|
132
|
+
kind: "site",
|
|
133
|
+
delivery: "hosted",
|
|
134
|
+
shareUrl: binding.shareUrl,
|
|
135
|
+
thumbnailUrl: "",
|
|
136
|
+
reachability: "public",
|
|
137
|
+
reachabilityHint: null,
|
|
138
|
+
title: binding.title,
|
|
139
|
+
description: makeDescription({
|
|
140
|
+
audience,
|
|
141
|
+
expiresAt: binding.expiresAt,
|
|
142
|
+
override: p.description
|
|
143
|
+
}),
|
|
144
|
+
expiresAt: binding.expiresAt,
|
|
145
|
+
maxViews: binding.maxViews,
|
|
146
|
+
routing: {
|
|
147
|
+
reason: decision.reason,
|
|
148
|
+
hint: decision.hint
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
113
152
|
if (probe.kind === "file") {
|
|
114
153
|
const staged = await stageSingleHtmlAsSite(workspace, probe.absolutePath);
|
|
115
154
|
sitePath = staged.relativePath;
|
|
@@ -142,7 +181,6 @@ function createCreateShareTool(deps) {
|
|
|
142
181
|
internalBaseUrl: shareCfg.thumbnail.internalGatewayUrl ?? `http://127.0.0.1:${gatewayPort}`
|
|
143
182
|
});
|
|
144
183
|
siteStore.setThumbnailStatus(siteRec.id, "pending");
|
|
145
|
-
const titleOut = makeTitle(probe.kind === "directory" ? relPath.split("/").pop() || relPath : probe.absolutePath.split(/[\\/]/).pop() || relPath, p.title);
|
|
146
184
|
const descOut = makeDescription({
|
|
147
185
|
audience,
|
|
148
186
|
expiresAt: siteRec.expiresAt,
|
|
@@ -9,12 +9,12 @@ import "../../storage/sqlite/index.js";
|
|
|
9
9
|
import { ObjectLinkService } from "../../activity/service.js";
|
|
10
10
|
import "../../activity/index.js";
|
|
11
11
|
import { getDefaultAgentId, init_resolve_route } from "../../routing/resolve-route.js";
|
|
12
|
+
import { CreateAutomationSchema, UpdateAutomationSchema } from "../../automations/domain/validation.js";
|
|
13
|
+
import "../../automations/index.js";
|
|
12
14
|
import { TaskRepository } from "../../tasks/task-repository.js";
|
|
13
15
|
import { TaskReadModelProjector } from "../../tasks/task-read-model-projector.js";
|
|
14
16
|
import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "../../projects/project-agent.js";
|
|
15
17
|
import "../../projects/index.js";
|
|
16
|
-
import { CreateAutomationSchema, UpdateAutomationSchema } from "../../automations/domain/validation.js";
|
|
17
|
-
import "../../automations/index.js";
|
|
18
18
|
import { TaskContextRepository } from "../../tasks/task-context-repository.js";
|
|
19
19
|
import { TaskDependencyError, TaskDependencyService } from "../../tasks/task-dependency-service.js";
|
|
20
20
|
import { TaskApplicationService } from "../../tasks/task-application-service.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
|
|
3
4
|
import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
4
5
|
import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
|
|
5
6
|
import { isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions } from "../providers/model-call.js";
|
|
6
|
-
import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
|
|
7
7
|
//#region src/ai-assist/text-assist.ts
|
|
8
8
|
init_providers();
|
|
9
9
|
init_logger();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
5
4
|
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
|
-
import {
|
|
5
|
+
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
7
6
|
import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
|
|
7
|
+
import { getOAuthProviderDefinition, init_registry } from "./oauth/registry.js";
|
|
8
8
|
import { init_oauth_provider_lock, withOAuthProviderLock } from "./oauth-provider-lock.js";
|
|
9
9
|
import { dirname, join } from "path";
|
|
10
10
|
import { mkdir, readFile, readdir, rm } from "fs/promises";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_resolution, resolveConnectedPlatformEndpoint } from "../../platform/resolution.js";
|
|
3
2
|
import { generatePKCE, init_pkce } from "./pkce.js";
|
|
3
|
+
import { init_resolution, resolveConnectedPlatformEndpoint } from "../../platform/resolution.js";
|
|
4
4
|
import { hostname } from "node:os";
|
|
5
5
|
import { randomBytes } from "node:crypto";
|
|
6
6
|
import http from "node:http";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
|
|
2
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
+
import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
3
2
|
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
|
|
4
|
-
import { init_loader, loadConfig } from "../config/loader.js";
|
|
5
3
|
import { init_registry, isOAuthOnlyProvider } from "./oauth/registry.js";
|
|
4
|
+
import { init_loader, loadConfig } from "../config/loader.js";
|
|
5
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
6
6
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
7
|
//#region src/auth/sync-provider-auth.ts
|
|
8
8
|
/**
|
|
@@ -12,9 +12,9 @@ export declare class ExtensionDriver implements BrowserDriver {
|
|
|
12
12
|
disconnect(): Promise<void>;
|
|
13
13
|
createSession(_sessionId: string): Promise<void>;
|
|
14
14
|
closeSession(sessionId: string): Promise<void>;
|
|
15
|
-
navigate(
|
|
16
|
-
observe(
|
|
17
|
-
perform(
|
|
18
|
-
tabs(
|
|
15
|
+
navigate(sessionId: string, input: BrowserNavigateInput): Promise<BrowserControlResult>;
|
|
16
|
+
observe(sessionId: string, input: BrowserObserveInput): Promise<BrowserObservation>;
|
|
17
|
+
perform(sessionId: string, input: BrowserPrimitiveInput): Promise<BrowserControlResult>;
|
|
18
|
+
tabs(sessionId: string, input: BrowserTabsInput): Promise<BrowserControlResult>;
|
|
19
19
|
private send;
|
|
20
20
|
}
|
|
@@ -23,21 +23,33 @@ var ExtensionDriver = class {
|
|
|
23
23
|
sessionId
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
navigate(
|
|
27
|
-
return this.send(
|
|
26
|
+
navigate(sessionId, input) {
|
|
27
|
+
return this.send({
|
|
28
|
+
...input,
|
|
29
|
+
sessionId
|
|
30
|
+
});
|
|
28
31
|
}
|
|
29
|
-
async observe(
|
|
30
|
-
const result = await this.send(
|
|
32
|
+
async observe(sessionId, input) {
|
|
33
|
+
const result = await this.send({
|
|
34
|
+
...input,
|
|
35
|
+
sessionId
|
|
36
|
+
});
|
|
31
37
|
if ("error" in result) throw new Error(result.error.message);
|
|
32
38
|
const observation = result.receipt.observation;
|
|
33
39
|
if (!observation) throw new Error("Extension returned no browser observation");
|
|
34
40
|
return observation;
|
|
35
41
|
}
|
|
36
|
-
perform(
|
|
37
|
-
return this.send(
|
|
42
|
+
perform(sessionId, input) {
|
|
43
|
+
return this.send({
|
|
44
|
+
...input,
|
|
45
|
+
sessionId
|
|
46
|
+
});
|
|
38
47
|
}
|
|
39
|
-
tabs(
|
|
40
|
-
return this.send(
|
|
48
|
+
tabs(sessionId, input) {
|
|
49
|
+
return this.send({
|
|
50
|
+
...input,
|
|
51
|
+
sessionId
|
|
52
|
+
});
|
|
41
53
|
}
|
|
42
54
|
async send(input) {
|
|
43
55
|
return (await this.provider.send(input, this.timeoutMs, this.visualFallback)).result;
|
|
@@ -104,7 +104,7 @@ var PlaywrightDriver = class {
|
|
|
104
104
|
const explicitRole = element.getAttribute("role");
|
|
105
105
|
const implicitRole = tag === "a" ? "link" : tag === "button" ? "button" : tag === "select" ? "combobox" : tag === "textarea" ? "textbox" : tag === "summary" ? "button" : tag === "input" && input.type === "checkbox" ? "checkbox" : tag === "input" && input.type === "radio" ? "radio" : tag === "input" ? "textbox" : "interactive";
|
|
106
106
|
const label = tag === "input" || tag === "textarea" || tag === "select" ? input.labels?.[0]?.innerText ?? "" : "";
|
|
107
|
-
const name = element.getAttribute("aria-label")
|
|
107
|
+
const name = element.getAttribute("aria-label") || label || element.getAttribute("alt") || element.getAttribute("placeholder") || html.innerText || element.getAttribute("title") || "";
|
|
108
108
|
const rect = element.getBoundingClientRect();
|
|
109
109
|
const root = globalThis;
|
|
110
110
|
root.__xopcRefCounter = (root.__xopcRefCounter ?? 0) + 1;
|
|
@@ -8,6 +8,7 @@ export type BrowserExtBundledFrom = 'npm-dist' | 'git-dev' | 'electron-asar' | '
|
|
|
8
8
|
export interface BrowserExtInstallMeta {
|
|
9
9
|
xopcVersion: string;
|
|
10
10
|
manifestVersion: string;
|
|
11
|
+
contentHash: string;
|
|
11
12
|
source: 'bundled';
|
|
12
13
|
bundledFrom: BrowserExtBundledFrom;
|
|
13
14
|
installedAt: string;
|
|
@@ -33,6 +34,7 @@ export interface EnsureBrowserExtResult {
|
|
|
33
34
|
}
|
|
34
35
|
/** Validate a directory contains a loadable extension tree. */
|
|
35
36
|
export declare function validateBrowserExtLayout(dir: string): boolean;
|
|
37
|
+
export declare function browserExtContentHash(dir: string): string;
|
|
36
38
|
/** Resolve the installed extension directory (fixed `browser-ext/` root). */
|
|
37
39
|
export declare function resolveInstalledExtensionPath(cacheDir: string, _meta: BrowserExtInstallMeta | null): string | null;
|
|
38
40
|
/**
|
|
@@ -45,6 +47,7 @@ export declare function resolveBundledBrowserExtDir(): Promise<{
|
|
|
45
47
|
export declare function computeNeedsRefresh(params: {
|
|
46
48
|
force?: boolean;
|
|
47
49
|
bundledManifestVersion: string;
|
|
50
|
+
bundledContentHash: string;
|
|
48
51
|
installedPath: string | null;
|
|
49
52
|
meta: BrowserExtInstallMeta | null;
|
|
50
53
|
}): boolean;
|