@xopcai/xopc 0.0.371 → 0.0.372
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-C8MqXy6W.js → agent-avatar-dicebear-D4iAZErG.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-BLaL4law.js → agent-defaults-settings-panel-BdxzGSiO.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-BrysdA6F.js → agent-plugin-dialog-BYB0G2aF.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-BJRyMNx2.js → agents-D0JBkZPV.js} +3 -3
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Bi02swpZ.js → app-management-settings-panel-C1tQxHaP.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-rr0qirDm.js → appearance-settings-BfavIBbb.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-Sz3wl3lV.js → apps-page-CUS5S1qa.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DqdbP0hD.js → automations-page-iY0KMPSa.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-CxgKlA5d.js → automations-workspace-LQsa5ohY.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CfVR1zGa.js → block-editor-Cft0fd_O.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-DeYnh3mY.js → browser-automations-page-C6EWx_Y4.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-DDZvlGCD.js → browser-settings-page-CKlt_8IS.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-Bl6PZqx3.js → capabilities-page-UrQ8EY_o.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-B-MM4LJA.js → capabilities-settings-panel-C9HIr2CZ.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-header-actions-CAiY7HK1.js → capability-header-actions-uxIiW_2_.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-D1_fDkhu.js → channels-By3dmQ4Y.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-D6slpF2a.js → chat-terminal-dock-DeDTSl64.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-D1n_uQHN.js → computer-settings-page-Cw1Z1epy.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-FvSCyJzn.js → connector-service-page-D664WEhj.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-DroD-gQn.js → connectors-page-sjyjY7Fl.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-Bl-HqvGU.js → date-picker-BVmFrPfX.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DY4nU-HL.js → dependency-picker-YIoP-e5-.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-_A89B2xw.js → desktop-pet-CzS468vR.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BJWkGynu.js → desktop-pet-settings-BPcgZUcK.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-DJ_ITvkI.js → device-pairing-wizard-Cgba-4m9.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Bj2Cpmxs.js → directory-picker-path-field-_nHmZtnY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BfAtjhoK.js → extension-debug-page-IIky9Iqr.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BFjc1zDp.js → extension-page-C-7ngTTj.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-Br6LXyIj.js → extension-provider-VFWspV08.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-oAwllsMb.js → extension-settings-page-_hovFCWi.js} +1 -1
- package/dist/gateway/static/root/assets/{fallback-models-KHd6tw_t.js → fallback-models-CUHrPpGV.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-BwX_fHUS.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-BIyhyiOq.js → gateway-settings-sbaOzlEH.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-CEjaIUTF.js → home-page-DjquRIFR.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-ClFqRiGQ.js → imports-page-xWWIeT_t.js} +1 -1
- package/dist/gateway/static/root/assets/{index-GBFmI8im.js → index-BWDK2eIj.js} +6 -6
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Ca9_GJSQ.js → keyboard-shortcuts-settings-DWazrDgz.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BaK9zX1-.js → local-app-workbench-page-CkxDdlYU.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-1CjSftZ3.js → local-apps-page-BISZ4bi5.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-6joZBbcx.js → logs-page-GiCulc9k.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-Cnubkklb.js → management-settings-GUpOcTqa.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-panel-B6DHbMzT.js → note-detail-panel-CqealmSc.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-page-CGZkIKdi.js → notes-page-BtTU5mnS.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-y3QmhTu2.js → page-context-capture-button-Yt-BpPRh.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-C_roXCJB.js → personal-page-C8SEQpEu.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CSRYWt0f.js → product-open-page-etM6Ijfe.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-DuOML6gs.js → product-preview-content-C6aeRrWe.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-v7xtnvha.js → project-detail-page-K4ASOTki.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-BuJCBT6n.js → projects-page-BssImjwl.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-DpHnyBnG.js → remote-access-hub-BznC_5H0.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DTMTL0hy.js → runtime-tools-settings-panel-BJAzqQik.js} +1 -1
- package/dist/gateway/static/root/assets/{scenes-page-B0JqO_fM.js → scenes-page-uZUXm03X.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-g4z7GH4W.js → schema-form-SA3Ld7zf.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-BW40VHiL.js → send-session-input-Di3Q846r.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-BqlvrjPE.js → session-manager-CWjhJxJs.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-CftImbH7.js → sessions-page-DdL8zVrF.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DmawLOHR.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-YD-U8BVw.js → settings-page-CUJQMNF7.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-q_X3kxw2.js → setup-status-panel-BGBWC0Bc.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-Ce6FNWt1.js → share-preview-page-DJmyACyp.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-KHRg_-03.js → shares-settings-BzqcGh7W.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-BpqDMkNB.js → skill-api-9XSn7R8L.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Bnfn51ks.js → skills-page-DwyDfh9g.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-CncvC2CI.js → system-settings-panel-B6axBPLO.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-BVJKdnMC.js → task-detail-page-ftCTqBDB.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-g7etuoaT.js → tunnel-api-BYU2v0im.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-Dao1I-5F.js → usage-page-BvPcpxTQ.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-DJya1hIL.js → use-composer-attachments-OFlldkKg.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-C5ONO7sF.js → use-file-preview-expanded-BF1TeNXP.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-jr986ucl.js → user-model-page-CqnGITYf.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-CC3mr7tX.js → work-discovery-overlay-BDM7BEKH.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CqpXZJxs.js → workflow-run-setup-panel-BBwx-tUb.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-DOk6tBbK.js → workflows-page-BHigZn6E.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-WhbMvdBE.js → workspace-api-CTm8s6Jr.js} +2 -2
- package/dist/gateway/static/root/index.html +8 -8
- package/dist/package.js +1 -1
- package/dist/packages/endpoint-tools-protocol/src/index.js +4 -110
- package/dist/packages/endpoint-tools-protocol/src/personal.js +2 -2
- package/dist/packages/endpoint-tools-protocol/src/shared-schemas.js +116 -0
- package/dist/src/endpoint-tools/policy.js +2 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/gateway-realtime-F6D4A7N5.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BkvbSieZ.js +0 -1
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_shared_schemas } from "./shared-schemas.js";
|
|
2
3
|
import { init_bridge } from "./bridge.js";
|
|
3
4
|
import { init_location } from "./location.js";
|
|
4
5
|
import { init_personal } from "./personal.js";
|
|
5
6
|
import { z } from "zod";
|
|
6
7
|
//#region packages/endpoint-tools-protocol/src/index.ts
|
|
7
|
-
function contactOutputSchema(multiple) {
|
|
8
|
-
return {
|
|
9
|
-
type: "array",
|
|
10
|
-
minItems: 1,
|
|
11
|
-
maxItems: 1,
|
|
12
|
-
items: {
|
|
13
|
-
type: "object",
|
|
14
|
-
additionalProperties: false,
|
|
15
|
-
required: ["type", "value"],
|
|
16
|
-
properties: {
|
|
17
|
-
type: { const: "json" },
|
|
18
|
-
value: multiple ? {
|
|
19
|
-
type: "array",
|
|
20
|
-
maxItems: 20,
|
|
21
|
-
items: ENDPOINT_CONTACT_RECORD_SCHEMA
|
|
22
|
-
} : ENDPOINT_CONTACT_RECORD_SCHEMA
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
8
|
function canonicalJson(value) {
|
|
28
9
|
if (value === null) return "null";
|
|
29
10
|
if (typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
|
|
@@ -42,8 +23,9 @@ function endpointHelloSigningPayload(payload) {
|
|
|
42
23
|
const { signature: _signature, ...unsigned } = payload;
|
|
43
24
|
return canonicalJson(unsigned);
|
|
44
25
|
}
|
|
45
|
-
var ENDPOINT_MAX_FILE_BYTES, ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS, endpointKindSchema, endpointAvailabilitySchema, endpointEffectSchema, endpointConfirmationSchema, endpointResultKindSchema, endpointSensitivitySchema, identifierSchema, turnTokenSchema, turnOriginSchema, endpointTurnOriginSchema, endpointTurnClaimSchema, messageIdSchema, timestampSchema, jsonObjectSchema, endpointToolDescriptorSchema, endpointPrincipalRegistrationSchema, endpointSessionBindingRequestSchema, backgroundCapabilitySchema, endpointHelloPayloadSchema, toolInvokePayloadSchema, toolCancelPayloadSchema, invocationPayloadSchema, endpointToolContentSchema, endpointToolErrorCodeSchema, envelope, clientEndpointMessageSchema, serverEndpointMessageSchema, ENDPOINT_TEXT_OUTPUT_SCHEMA,
|
|
26
|
+
var ENDPOINT_MAX_FILE_BYTES, ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS, endpointKindSchema, endpointAvailabilitySchema, endpointEffectSchema, endpointConfirmationSchema, endpointResultKindSchema, endpointSensitivitySchema, identifierSchema, turnTokenSchema, turnOriginSchema, endpointTurnOriginSchema, endpointTurnClaimSchema, messageIdSchema, timestampSchema, jsonObjectSchema, endpointToolDescriptorSchema, endpointPrincipalRegistrationSchema, endpointSessionBindingRequestSchema, backgroundCapabilitySchema, endpointHelloPayloadSchema, toolInvokePayloadSchema, toolCancelPayloadSchema, invocationPayloadSchema, endpointToolContentSchema, endpointToolErrorCodeSchema, envelope, clientEndpointMessageSchema, serverEndpointMessageSchema, ENDPOINT_TEXT_OUTPUT_SCHEMA, DEVICE_STATE_OUTPUT_SCHEMA, DEVICE_POWER_OUTPUT_SCHEMA;
|
|
46
27
|
var init_src = __esmMin((() => {
|
|
28
|
+
init_shared_schemas();
|
|
47
29
|
init_bridge();
|
|
48
30
|
init_location();
|
|
49
31
|
init_personal();
|
|
@@ -270,94 +252,6 @@ var init_src = __esmMin((() => {
|
|
|
270
252
|
}
|
|
271
253
|
}
|
|
272
254
|
};
|
|
273
|
-
ENDPOINT_FILE_OUTPUT_SCHEMA = {
|
|
274
|
-
type: "array",
|
|
275
|
-
minItems: 1,
|
|
276
|
-
maxItems: 20,
|
|
277
|
-
items: {
|
|
278
|
-
type: "object",
|
|
279
|
-
additionalProperties: false,
|
|
280
|
-
required: [
|
|
281
|
-
"type",
|
|
282
|
-
"fileId",
|
|
283
|
-
"name",
|
|
284
|
-
"mimeType",
|
|
285
|
-
"size",
|
|
286
|
-
"sha256"
|
|
287
|
-
],
|
|
288
|
-
properties: {
|
|
289
|
-
type: { const: "file" },
|
|
290
|
-
fileId: {
|
|
291
|
-
type: "string",
|
|
292
|
-
minLength: 1,
|
|
293
|
-
maxLength: 160
|
|
294
|
-
},
|
|
295
|
-
name: {
|
|
296
|
-
type: "string",
|
|
297
|
-
minLength: 1,
|
|
298
|
-
maxLength: 255
|
|
299
|
-
},
|
|
300
|
-
mimeType: {
|
|
301
|
-
type: "string",
|
|
302
|
-
minLength: 1,
|
|
303
|
-
maxLength: 255
|
|
304
|
-
},
|
|
305
|
-
size: {
|
|
306
|
-
type: "integer",
|
|
307
|
-
minimum: 0
|
|
308
|
-
},
|
|
309
|
-
sha256: {
|
|
310
|
-
type: "string",
|
|
311
|
-
pattern: "^[a-f0-9]{64}$"
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
ENDPOINT_CONTACT_RECORD_SCHEMA = {
|
|
317
|
-
type: "object",
|
|
318
|
-
additionalProperties: false,
|
|
319
|
-
required: [
|
|
320
|
-
"id",
|
|
321
|
-
"name",
|
|
322
|
-
"phones",
|
|
323
|
-
"emails"
|
|
324
|
-
],
|
|
325
|
-
properties: {
|
|
326
|
-
id: {
|
|
327
|
-
type: "string",
|
|
328
|
-
minLength: 1,
|
|
329
|
-
maxLength: 512
|
|
330
|
-
},
|
|
331
|
-
name: {
|
|
332
|
-
type: "string",
|
|
333
|
-
minLength: 1,
|
|
334
|
-
maxLength: 500
|
|
335
|
-
},
|
|
336
|
-
phones: {
|
|
337
|
-
type: "array",
|
|
338
|
-
maxItems: 20,
|
|
339
|
-
items: {
|
|
340
|
-
type: "string",
|
|
341
|
-
maxLength: 100
|
|
342
|
-
}
|
|
343
|
-
},
|
|
344
|
-
emails: {
|
|
345
|
-
type: "array",
|
|
346
|
-
maxItems: 20,
|
|
347
|
-
items: {
|
|
348
|
-
type: "string",
|
|
349
|
-
maxLength: 320
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
};
|
|
354
|
-
ENDPOINT_CONTACT_OUTPUT_SCHEMA = contactOutputSchema(false);
|
|
355
|
-
ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA = contactOutputSchema(true);
|
|
356
|
-
DEVICE_EMPTY_INPUT_SCHEMA = {
|
|
357
|
-
type: "object",
|
|
358
|
-
properties: {},
|
|
359
|
-
additionalProperties: false
|
|
360
|
-
};
|
|
361
255
|
DEVICE_STATE_OUTPUT_SCHEMA = {
|
|
362
256
|
type: "array",
|
|
363
257
|
minItems: 1,
|
|
@@ -443,4 +337,4 @@ var init_src = __esmMin((() => {
|
|
|
443
337
|
}));
|
|
444
338
|
//#endregion
|
|
445
339
|
init_src();
|
|
446
|
-
export {
|
|
340
|
+
export { DEVICE_POWER_OUTPUT_SCHEMA, DEVICE_STATE_OUTPUT_SCHEMA, ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS, ENDPOINT_MAX_FILE_BYTES, ENDPOINT_TEXT_OUTPUT_SCHEMA, canonicalJson, clientEndpointMessageSchema, endpointHelloPayloadSchema, endpointHelloSigningPayload, endpointPrincipalRegistrationSchema, endpointSessionBindingRequestSchema, endpointToolContentSchema, endpointTurnClaimSchema, init_src, serverEndpointMessageSchema, turnOriginSchema };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { DEVICE_EMPTY_INPUT_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_FILE_OUTPUT_SCHEMA,
|
|
2
|
+
import { DEVICE_EMPTY_INPUT_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_FILE_OUTPUT_SCHEMA, init_shared_schemas } from "./shared-schemas.js";
|
|
3
3
|
//#region packages/endpoint-tools-protocol/src/personal.ts
|
|
4
4
|
/** User-mediated reads disclose only the selected item, never a device inventory. */
|
|
5
5
|
function personalDescriptor(name) {
|
|
@@ -34,7 +34,7 @@ function personalDescriptor(name) {
|
|
|
34
34
|
}
|
|
35
35
|
var PERSONAL_TOOL_NAMES, CONTACT_PICK_INPUT_SCHEMA, CALENDAR_INPUT_SCHEMA, CALENDAR_OUTPUT_SCHEMA;
|
|
36
36
|
var init_personal = __esmMin((() => {
|
|
37
|
-
|
|
37
|
+
init_shared_schemas();
|
|
38
38
|
PERSONAL_TOOL_NAMES = [
|
|
39
39
|
"mobile.file.pick",
|
|
40
40
|
"mobile.media.pick",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region packages/endpoint-tools-protocol/src/shared-schemas.ts
|
|
3
|
+
function contactOutputSchema(multiple) {
|
|
4
|
+
return {
|
|
5
|
+
type: "array",
|
|
6
|
+
minItems: 1,
|
|
7
|
+
maxItems: 1,
|
|
8
|
+
items: {
|
|
9
|
+
type: "object",
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
required: ["type", "value"],
|
|
12
|
+
properties: {
|
|
13
|
+
type: { const: "json" },
|
|
14
|
+
value: multiple ? {
|
|
15
|
+
type: "array",
|
|
16
|
+
maxItems: 20,
|
|
17
|
+
items: ENDPOINT_CONTACT_RECORD_SCHEMA
|
|
18
|
+
} : ENDPOINT_CONTACT_RECORD_SCHEMA
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var ENDPOINT_FILE_OUTPUT_SCHEMA, ENDPOINT_CONTACT_RECORD_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA, DEVICE_EMPTY_INPUT_SCHEMA;
|
|
24
|
+
var init_shared_schemas = __esmMin((() => {
|
|
25
|
+
ENDPOINT_FILE_OUTPUT_SCHEMA = {
|
|
26
|
+
type: "array",
|
|
27
|
+
minItems: 1,
|
|
28
|
+
maxItems: 20,
|
|
29
|
+
items: {
|
|
30
|
+
type: "object",
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
required: [
|
|
33
|
+
"type",
|
|
34
|
+
"fileId",
|
|
35
|
+
"name",
|
|
36
|
+
"mimeType",
|
|
37
|
+
"size",
|
|
38
|
+
"sha256"
|
|
39
|
+
],
|
|
40
|
+
properties: {
|
|
41
|
+
type: { const: "file" },
|
|
42
|
+
fileId: {
|
|
43
|
+
type: "string",
|
|
44
|
+
minLength: 1,
|
|
45
|
+
maxLength: 160
|
|
46
|
+
},
|
|
47
|
+
name: {
|
|
48
|
+
type: "string",
|
|
49
|
+
minLength: 1,
|
|
50
|
+
maxLength: 255
|
|
51
|
+
},
|
|
52
|
+
mimeType: {
|
|
53
|
+
type: "string",
|
|
54
|
+
minLength: 1,
|
|
55
|
+
maxLength: 255
|
|
56
|
+
},
|
|
57
|
+
size: {
|
|
58
|
+
type: "integer",
|
|
59
|
+
minimum: 0
|
|
60
|
+
},
|
|
61
|
+
sha256: {
|
|
62
|
+
type: "string",
|
|
63
|
+
pattern: "^[a-f0-9]{64}$"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
ENDPOINT_CONTACT_RECORD_SCHEMA = {
|
|
69
|
+
type: "object",
|
|
70
|
+
additionalProperties: false,
|
|
71
|
+
required: [
|
|
72
|
+
"id",
|
|
73
|
+
"name",
|
|
74
|
+
"phones",
|
|
75
|
+
"emails"
|
|
76
|
+
],
|
|
77
|
+
properties: {
|
|
78
|
+
id: {
|
|
79
|
+
type: "string",
|
|
80
|
+
minLength: 1,
|
|
81
|
+
maxLength: 512
|
|
82
|
+
},
|
|
83
|
+
name: {
|
|
84
|
+
type: "string",
|
|
85
|
+
minLength: 1,
|
|
86
|
+
maxLength: 500
|
|
87
|
+
},
|
|
88
|
+
phones: {
|
|
89
|
+
type: "array",
|
|
90
|
+
maxItems: 20,
|
|
91
|
+
items: {
|
|
92
|
+
type: "string",
|
|
93
|
+
maxLength: 100
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
emails: {
|
|
97
|
+
type: "array",
|
|
98
|
+
maxItems: 20,
|
|
99
|
+
items: {
|
|
100
|
+
type: "string",
|
|
101
|
+
maxLength: 320
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
ENDPOINT_CONTACT_OUTPUT_SCHEMA = contactOutputSchema(false);
|
|
107
|
+
ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA = contactOutputSchema(true);
|
|
108
|
+
DEVICE_EMPTY_INPUT_SCHEMA = {
|
|
109
|
+
type: "object",
|
|
110
|
+
properties: {},
|
|
111
|
+
additionalProperties: false
|
|
112
|
+
};
|
|
113
|
+
}));
|
|
114
|
+
//#endregion
|
|
115
|
+
init_shared_schemas();
|
|
116
|
+
export { DEVICE_EMPTY_INPUT_SCHEMA, ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_CONTACT_RECORD_SCHEMA, ENDPOINT_FILE_OUTPUT_SCHEMA, init_shared_schemas };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { DEVICE_EMPTY_INPUT_SCHEMA, ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_FILE_OUTPUT_SCHEMA } from "../../packages/endpoint-tools-protocol/src/shared-schemas.js";
|
|
1
2
|
import { BRIDGE_LIST_OUTPUT_SCHEMA, BRIDGE_READ_INPUT_SCHEMA, BRIDGE_READ_OUTPUT_SCHEMA } from "../../packages/endpoint-tools-protocol/src/bridge.js";
|
|
2
3
|
import { LOCATION_INPUT_SCHEMA, LOCATION_OUTPUT_SCHEMA } from "../../packages/endpoint-tools-protocol/src/location.js";
|
|
3
4
|
import { PERSONAL_TOOL_NAMES, personalDescriptor } from "../../packages/endpoint-tools-protocol/src/personal.js";
|
|
4
|
-
import {
|
|
5
|
+
import { DEVICE_POWER_OUTPUT_SCHEMA, DEVICE_STATE_OUTPUT_SCHEMA, ENDPOINT_TEXT_OUTPUT_SCHEMA, canonicalJson, init_src } from "../../packages/endpoint-tools-protocol/src/index.js";
|
|
5
6
|
import { COMPUTER_INPUT_SCHEMA, COMPUTER_OUTPUT_SCHEMA, init_src as init_src$1 } from "../../packages/computer-control-contract/src/index.js";
|
|
6
7
|
import { BROWSER_CONTROL_ENDPOINT_DESCRIPTOR, BROWSER_CONTROL_ENDPOINT_INPUT_SCHEMA, BROWSER_CONTROL_ENDPOINT_OUTPUT_SCHEMA, BROWSER_RECORDING_ENDPOINT_DESCRIPTOR, BROWSER_RECORDING_ENDPOINT_INPUT_SCHEMA } from "../../packages/browser-control-contract/src/index.js";
|
|
7
8
|
import Ajv2020 from "ajv/dist/2020.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xopcai/xopc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.372",
|
|
4
4
|
"description": "Local-first personal AI with Ada, task delegation, files, projects, workflows, and automations. Use cloud or local models.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -165,11 +165,11 @@
|
|
|
165
165
|
"vitepress": "^1.6.4",
|
|
166
166
|
"vitest": "4.1.5",
|
|
167
167
|
"vue": "^3.5.35",
|
|
168
|
-
"@xopcai/browser-control-contract": "0.1.0",
|
|
169
168
|
"@xopcai/computer-control-contract": "0.1.0",
|
|
169
|
+
"@xopcai/browser-control-contract": "0.1.0",
|
|
170
|
+
"@xopcai/endpoint-tools-client": "0.0.0",
|
|
170
171
|
"@xopcai/endpoint-tools-protocol": "0.0.0",
|
|
171
172
|
"@xopcai/gateway-contract": "0.0.0",
|
|
172
|
-
"@xopcai/endpoint-tools-client": "0.0.0",
|
|
173
173
|
"@xopcai/image-providers": "0.1.0",
|
|
174
174
|
"@xopcai/realtime-protocol": "0.0.0",
|
|
175
175
|
"@xopcai/realtime-client": "0.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./locale-store-COVscAqC.js";import{a as t,d as n,f as r,g as i,i as a,l as o,p as s,r as c,s as l,t as u,u as d,v as f}from"./schemas-CObaziC7.js";import{t as p}from"./gateway-realtime-store-BheKaO6d.js";var ee=d({purpose:u([`weather`,`nearby`]),precision:u([`approximate`,`precise`]),category:u([`restaurant`,`cafe`,`pharmacy`,`park`]).optional()}).strict().superRefine((e,t)=>{e.purpose===`nearby`!=(e.category!==void 0)&&t.addIssue({code:`custom`,message:`Category is required only for nearby queries`})}),te={type:`object`,additionalProperties:!1,required:[`purpose`,`precision`],properties:{purpose:{enum:[`weather`,`nearby`]},precision:{enum:[`approximate`,`precise`]},category:{enum:[`restaurant`,`cafe`,`pharmacy`,`park`]}},allOf:[{if:{properties:{purpose:{const:`nearby`}},required:[`purpose`]},then:{properties:{category:{}},required:[`category`]},else:{not:{properties:{category:{}},required:[`category`]}}}]};d({latitude:o().min(-90).max(90),longitude:o().min(-180).max(180),accuracyMeters:o().min(0).max(1e5),capturedAt:o().int().nonnegative(),precision:u([`approximate`,`precise`]),coordinateSystem:l(`WGS84`)}).strict();var m={type:`array`,minItems:1,maxItems:1,items:{type:`object`,additionalProperties:!1,required:[`type`,`value`],properties:{type:{const:`json`},value:{type:`object`,additionalProperties:!1,required:[`latitude`,`longitude`,`accuracyMeters`,`capturedAt`,`precision`,`coordinateSystem`],properties:{latitude:{type:`number`,minimum:-90,maximum:90},longitude:{type:`number`,minimum:-180,maximum:180},accuracyMeters:{type:`number`,minimum:0,maximum:1e5},capturedAt:{type:`integer`,minimum:0},precision:{enum:[`approximate`,`precise`]},coordinateSystem:{const:`WGS84`}}}}}};function ne(e){return{name:`${e}.device.get_location`,title:`Use location once`,description:`With on-device consent, use one fresh WGS84 location for current weather (Open-Meteo) or nearby places (OpenStreetMap). Raw coordinates are consumed transiently by Gateway, never returned to the Agent or saved in history. Select approximate or precise; nearby requires a category. Each call requires new consent.`,inputSchema:te,outputSchema:m,policyId:`personal.foreground-read`,sensitivity:`personal`,effect:`read`,confirmation:`always`,requiresForeground:!0,requiredPermissions:[`location-read-once`],timeoutMs:9e4,maxConcurrency:1,supportsCancellation:!0,idempotent:!0,resultKinds:[`json`]}}var re=25*1024*1024,h=u([`web`,`desktop`,`mobile`,`browser`]),g=u([`foreground`,`background`]),ie=u([`read`,`write`,`destructive`]),ae=u([`never`,`always`]),oe=u([`text`,`json`,`file`]),_=u([`public`,`personal`]),v=s().min(1).max(160),se=s().min(32).max(160).regex(/^[A-Za-z0-9_-]+$/);t(`type`,[r({type:l(`endpoint`),endpointId:v}),r({type:l(`channel`),channel:s().min(1).max(64)}),r({type:l(`system`),source:u([`cli`,`automation`,`heartbeat`,`workflow`,`internal`,`task_update`])})]).options[0].extend({token:se});var ce=f(),y=o().int().nonnegative(),b=n(s(),i()),x=r({name:s().regex(/^[a-z][a-z0-9_]*(?:\.[a-z][a-z0-9_]*)+$/).max(120),title:s().min(1).max(120),description:s().min(1).max(2e3),inputSchema:b,outputSchema:b,policyId:s().regex(/^[a-z][a-z0-9_.-]+$/).max(120),sensitivity:_,effect:ie,confirmation:ae,requiresForeground:a(),requiredPermissions:c(s().min(1).max(120)).max(20),timeoutMs:o().int().min(1e3).max(3e5),maxConcurrency:o().int().min(1).max(4),supportsCancellation:a(),idempotent:a(),resultKinds:c(oe).min(1).max(3)});r({principalId:v,displayName:s().min(1).max(120),kind:h,platform:s().min(1).max(80),publicKey:s().min(32).max(2048)}),r({endpointId:v});var S=s().regex(/^[a-z][a-z0-9_]*(?:\.[a-z][a-z0-9_]*)+$/).max(120);r({jobId:f(),endpointId:v,capability:S,input:b,idempotencyKey:v,consentGrantId:v,createdAt:y,expiresAt:y}),r({jobId:f(),status:u([`queued`,`running`,`succeeded`,`failed`,`cancelled`]),updatedAt:y,output:b.optional(),error:r({code:v,message:s().min(1).max(2e3)}).optional()}),r({eventId:f(),endpointId:v,subscriptionId:v,eventType:S,data:b,occurredAt:y});var le=r({principalId:v,endpointId:v,connectionInstanceId:f(),displayName:s().min(1).max(120),kind:h,platform:s().min(1).max(80),appVersion:s().min(1).max(80),availability:g,nonce:v,signedAt:y,signature:s().min(16).max(1024),tools:c(x).max(100)}),ue=r({invocationId:f(),toolCallId:v,toolName:x.shape.name,arguments:b,descriptorRevision:s().min(1).max(128),confirmationRequired:a(),deadlineAt:y,uploadGrant:r({path:s().startsWith(`/`).max(500),token:v,maxBytes:o().int().positive(),maxFiles:o().int().min(1).max(20),expiresAt:y}).optional()}),de=r({invocationId:f(),reason:s().min(1).max(500)}),C=r({invocationId:f()}),w=t(`type`,[r({type:l(`text`),text:s().max(256*1024)}),r({type:l(`json`),value:i()}),r({type:l(`file`),fileId:v,name:s().min(1).max(255),mimeType:s().min(1).max(255),size:o().int().nonnegative(),sha256:s().regex(/^[a-f0-9]{64}$/)})]),fe=u([`ENDPOINT_OFFLINE`,`ENDPOINT_NOT_FOREGROUND`,`ENDPOINT_DISCONNECTED`,`TOOL_NOT_FOUND`,`TOOL_REVISION_MISMATCH`,`INVALID_ARGUMENTS`,`PERMISSION_DENIED`,`USER_DENIED`,`TOOL_BUSY`,`TOOL_TIMEOUT`,`TOOL_CANCELLED`,`RESULT_TOO_LARGE`,`PROTOCOL_ERROR`]),T=(e,t)=>r({protocolVersion:l(2),messageId:ce,type:l(e),sentAt:y,payload:t}),pe=t(`type`,[T(`endpoint.availability_changed`,r({availability:g})),T(`tool.received`,C),T(`tool.progress`,r({invocationId:f(),message:s().max(500).optional(),percent:o().min(0).max(100).optional()})),T(`tool.result`,r({invocationId:f(),content:c(w).min(1).max(20),details:b.optional()})),T(`tool.error`,r({invocationId:f(),code:fe,message:s().min(1).max(2e3)})),T(`tool.cancelled`,C)]),E=t(`type`,[T(`tool.invoke`,ue),T(`tool.cancel`,de)]),D={type:`array`,minItems:1,maxItems:20,items:{type:`object`,additionalProperties:!1,required:[`type`,`text`],properties:{type:{const:`text`},text:{type:`string`,maxLength:256*1024}}}},O={type:`array`,minItems:1,maxItems:20,items:{type:`object`,additionalProperties:!1,required:[`type`,`fileId`,`name`,`mimeType`,`size`,`sha256`],properties:{type:{const:`file`},fileId:{type:`string`,minLength:1,maxLength:160},name:{type:`string`,minLength:1,maxLength:255},mimeType:{type:`string`,minLength:1,maxLength:255},size:{type:`integer`,minimum:0},sha256:{type:`string`,pattern:`^[a-f0-9]{64}$`}}}};function k(e){if(e===null)return`null`;if(typeof e==`string`||typeof e==`boolean`)return JSON.stringify(e);if(typeof e==`number`){if(!Number.isFinite(e))throw Error(`Canonical JSON only supports finite numbers`);return JSON.stringify(e)}if(typeof e!=`object`)throw Error(`Canonical JSON does not support ${typeof e}`);if(Array.isArray(e))return`[${e.map(k).join(`,`)}]`;let t=Object.getPrototypeOf(e);if(t!==Object.prototype&&t!==null)throw Error(`Canonical JSON only supports plain objects`);let n=e;return`{${Object.keys(n).sort().map(e=>`${JSON.stringify(e)}:${k(n[e])}`).join(`,`)}}`}function A(e){let{signature:t,...n}=e;return k(n)}var j={type:`object`,properties:{},additionalProperties:!1},M={type:`array`,minItems:1,maxItems:1,items:{type:`object`,additionalProperties:!1,required:[`type`,`value`],properties:{type:{const:`json`},value:{type:`object`,additionalProperties:!1,required:[`capturedAt`,`platform`,`systemVersion`,`locale`,`timezone`],properties:{capturedAt:{type:`integer`,minimum:0},platform:{type:`string`,minLength:1,maxLength:40},systemVersion:{type:`string`,maxLength:80},locale:{type:`string`,maxLength:80},timezone:{type:`string`,maxLength:80},online:{type:`boolean`}}}}}},N={type:`array`,minItems:1,maxItems:1,items:{type:`object`,additionalProperties:!1,required:[`type`,`value`],properties:{type:{const:`json`},value:{type:`object`,additionalProperties:!1,required:[`capturedAt`,`levelPercent`,`charging`],properties:{capturedAt:{type:`integer`,minimum:0},levelPercent:{type:[`number`,`null`],minimum:0,maximum:100},charging:{type:[`boolean`,`null`]}}}}}};function P(e,t){return{name:`${e}.device.get_${t}`,title:t===`power`?`Read this device’s battery`:`Read this device’s environment`,description:t===`power`?`Read a fresh battery sample from the device that sent this user message. Unknown readings are null.`:`Read bounded platform, system version, language and timezone from the device that sent this user message. No files, page content, network addresses or identifiers are collected.`,inputSchema:j,outputSchema:t===`power`?N:M,policyId:`public.background-read`,sensitivity:`public`,effect:`read`,confirmation:`never`,requiresForeground:!1,requiredPermissions:[],timeoutMs:1e4,maxConcurrency:1,supportsCancellation:!0,idempotent:!0,resultKinds:[`json`]}}var F=256*1024,I=15e3,L=45e3,R=[`realtime.capability-negotiation.v1`],z=u([`web`,`desktop`,`mobile`,`browser_extension`,`tui`,`mcp`]),B=s().min(1).max(512),me=s().regex(/^[a-z][a-z0-9_.-]*$/).max(160),he=f(),ge=o().int().nonnegative(),V=o().int().positive(),H=s().min(1).max(160),U=(e,t)=>d({protocolVersion:l(2),messageId:he,kind:l(e),sentAt:ge,payload:t}),W=d({topic:B,afterSeq:o().int().nonnegative().optional(),view:l(`compact`).optional()});t(`kind`,[U(`realtime.hello`,d({ticket:s().min(32).max(512),clientId:s().min(1).max(160),clientKind:z,subscriptions:c(W).max(100).default([]),capabilities:c(H).max(64).optional(),endpoint:le.optional()})),U(`realtime.subscribe`,d({subscriptions:c(W).min(1).max(100)})),U(`realtime.unsubscribe`,d({topics:c(B).min(1).max(100)})),U(`realtime.ping`,d({})),U(`endpoint.message`,pe)]);var _e=d({topic:B,seq:V,event:me,data:i()}),ve=t(`kind`,[U(`realtime.ready`,d({connectionId:f(),heartbeatIntervalMs:l(I),heartbeatTimeoutMs:l(L),negotiatedCapabilities:c(H).max(64).optional(),endpoint:d({endpointId:s().min(1).max(160),turnToken:s().min(32).max(160)}).optional()})),U(`realtime.event`,_e),U(`realtime.subscribed`,d({topic:B,cursor:o().int().nonnegative()})),U(`realtime.gap`,d({topic:B,requestedSeq:o().int().nonnegative(),earliestSeq:V,recoverable:a()})),U(`realtime.pong`,d({})),U(`realtime.error`,d({code:s().min(1).max(80),message:s().min(1).max(500)})),U(`endpoint.message`,E)]);function ye(e){return ve.parse(e)}var G=class extends Error{retryable;constructor(e,t){super(e),this.retryable=t,this.name=`RealtimeConnectionError`}},be=class extends Error{bytes;maxBytes;constructor(e,t){super(`Realtime client frame is ${e} bytes; maximum is ${t} bytes`),this.bytes=e,this.maxBytes=t,this.name=`RealtimeFrameTooLargeError`}};function xe(e){if(typeof e==`string`)return e;if(e instanceof ArrayBuffer)return new TextDecoder().decode(e);if(ArrayBuffer.isView(e)){let t=Uint8Array.from(new Uint8Array(e.buffer,e.byteOffset,e.byteLength));return new TextDecoder().decode(t)}throw Error(`Realtime server sent a non-text frame`)}function Se(e){return e===1009||e===4400||e===4401||e===4409||e===4413}var Ce=class{options;desiredSubscriptions=new Map;cursors=new Map;socket;reconnectTimer;heartbeatTimer;connectionTimer;ticketAbort;generation=0;reconnectAttempts=0;shouldReconnect=!1;ready=!1;lastServerMessageAt=0;endpointBinding;reconnectWhenSocketOpens=!1;offeredCapabilities=new Set;constructor(e){this.options=e}connect(){this.shouldReconnect||(this.shouldReconnect=!0,this.open(!1))}disconnect(){this.shouldReconnect=!1,this.reconnectWhenSocketOpens=!1,this.generation+=1,this.clearTimers(),this.ready=!1,this.offeredCapabilities.clear(),this.endpointBinding?.onDisconnected?.(),this.socket?.close(1e3,`Client disconnected`),this.socket=void 0,this.options.onStateChange?.(`disconnected`)}reconnect(){this.reconnectWhenSocketOpens=!1,this.generation+=1,this.clearTimers(),this.ready=!1,this.endpointBinding?.onDisconnected?.(),this.socket?.close(1e3,`Client reconnecting`),this.socket=void 0,this.reconnectAttempts=0,this.shouldReconnect=!0,this.open(!0)}subscribe(e,t){this.desiredSubscriptions.set(e,t),t!==void 0&&this.cursors.set(e,t),this.ready&&this.sendSubscriptions([{topic:e,afterSeq:this.cursors.get(e)??t}])}unsubscribe(e){this.desiredSubscriptions.delete(e),this.ready&&this.send(this.clientMessage(`realtime.unsubscribe`,{topics:[e]}))}sendEndpointMessage(e){if(!this.ready)throw Error(`Realtime connection is not ready`);this.send(this.clientMessage(`endpoint.message`,e))}setEndpoint(e){this.endpointBinding=e,this.refreshEndpointConnection()}clearEndpoint(e){if(e&&this.endpointBinding!==e)return;let t=this.endpointBinding;this.endpointBinding=void 0,t?.onDisconnected?.(),this.refreshEndpointConnection()}refreshEndpointConnection(){if(this.shouldReconnect){if(this.socket?.readyState===0){this.reconnectWhenSocketOpens=!0;return}this.reconnect()}}async open(e){let t=++this.generation,n=this.options.connectionTimeoutMs??15e3,r=new AbortController;this.ticketAbort?.abort(),this.ticketAbort=r;let i,a=!1,o,s=(e,n=!0)=>{a||t!==this.generation||(a=!0,this.clearConnectionTimer(),r.abort(),this.ticketAbort===r&&(this.ticketAbort=void 0),this.ready=!1,this.offeredCapabilities.clear(),this.endpointBinding?.onDisconnected?.(),this.clearHeartbeat(),this.socket===i&&(this.socket=void 0),i&&(i.onopen=null,i.onmessage=null,i.onerror=null,i.onclose=null,i.close(4e3,e.slice(0,120))),this.shouldReconnect&&n?this.scheduleReconnect(e):this.shouldReconnect?(this.shouldReconnect=!1,this.options.onStateChange?.(`error`,e)):this.options.onStateChange?.(`disconnected`))};this.connectionTimer=setTimeout(()=>s(`Realtime connection timed out`),n),this.options.onStateChange?.(e?`reconnecting`:`connecting`);try{let[e,n]=await Promise.all([this.options.issueTicket(r.signal),this.endpointBinding?.createHello()]),c=e.ticket;if(2<e.realtime.minVersion)throw new G(`CLIENT_UPDATE_REQUIRED`,!1);if(2>e.realtime.maxVersion)throw new G(`GATEWAY_UPDATE_REQUIRED`,!1);let l=R.filter(t=>e.realtime.capabilities.includes(t));if(a||!this.shouldReconnect||t!==this.generation)return;this.offeredCapabilities=new Set(l??[]),i=this.options.createWebSocket(this.options.getWebSocketUrl()),this.socket=i,i.onopen=()=>{if(t!==this.generation)return;if(this.reconnectWhenSocketOpens){this.reconnect();return}let e=[...this.desiredSubscriptions].map(([e,t])=>({topic:e,afterSeq:this.cursors.get(e)??t}));this.send(this.clientMessage(`realtime.hello`,{ticket:c,clientId:this.options.clientId,clientKind:this.options.clientKind,subscriptions:e,...l?.length?{capabilities:l}:{},...n?{endpoint:n}:{}}))},i.onmessage=e=>{if(t!==this.generation)return;let n=()=>{if(!(a||t!==this.generation))return this.handleServerMessage(xe(e.data))};if(!o){try{let e=n();if(!e)return;let t=e.catch(e=>s(e instanceof Error?e.message:`Invalid realtime server message`)).then(()=>void 0);o=t,t.finally(()=>{o===t&&(o=void 0)})}catch(e){s(e instanceof Error?e.message:`Invalid realtime server message`)}return}let r=o.then(n).catch(e=>s(e instanceof Error?e.message:`Invalid realtime server message`)).then(()=>void 0);o=r,r.finally(()=>{o===r&&(o=void 0)})},i.onerror=()=>{},i.onclose=e=>{s(e.reason||`WebSocket closed (${e.code??0})`,!Se(e.code))}}catch(e){s(e instanceof Error?e.message:`Realtime connection failed`,!(e instanceof G)||e.retryable)}}handleServerMessage(e){let t=ye(JSON.parse(e));if(this.lastServerMessageAt=Date.now(),t.kind===`realtime.ready`){let e=t.payload.negotiatedCapabilities??[];if(e.some(e=>!this.offeredCapabilities.has(e)))throw Error(`Realtime server negotiated a capability the client did not offer`);this.ready=!0,this.reconnectAttempts=0,this.clearConnectionTimer(),this.ticketAbort=void 0,this.options.onStateChange?.(`connected`),this.options.onCapabilities?.(e),t.payload.endpoint&&this.endpointBinding?.onReady(t.payload.endpoint),this.clearHeartbeat(),this.heartbeatTimer=setInterval(()=>{if(this.ready){if(Date.now()-this.lastServerMessageAt>=t.payload.heartbeatTimeoutMs){this.reconnect();return}this.send(this.clientMessage(`realtime.ping`,{}))}},t.payload.heartbeatIntervalMs)}else if(t.kind===`realtime.event`){let e=this.cursors.get(t.payload.topic);if(e!==void 0&&t.payload.seq<=e)return;this.options.onEvent?.(t.payload),this.cursors.set(t.payload.topic,t.payload.seq)}else if(t.kind===`realtime.subscribed`)this.cursors.set(t.payload.topic,t.payload.cursor),this.options.onSubscribed?.(t.payload);else if(t.kind===`realtime.gap`)return this.cursors.set(t.payload.topic,t.payload.earliestSeq-1),this.options.onGap?.(t.payload);else t.kind===`realtime.error`?this.options.onStateChange?.(`error`,t.payload.message):t.kind===`endpoint.message`&&(this.endpointBinding?.onMessage(t.payload),this.options.onEndpointMessage?.(t.payload))}sendSubscriptions(e){this.send(this.clientMessage(`realtime.subscribe`,{subscriptions:e}))}clientMessage(e,t){let n=this.options.createMessageId?.()??globalThis.crypto?.randomUUID?.();if(!n)throw Error(`RealtimeClient requires createMessageId when crypto.randomUUID is unavailable`);return{protocolVersion:2,messageId:n,kind:e,sentAt:Date.now(),payload:t}}send(e){if(!this.socket||this.socket.readyState!==1)return;let t=JSON.stringify(e),n=new TextEncoder().encode(t).byteLength;if(n>262144)throw new be(n,F);this.socket.send(t)}scheduleReconnect(e){if(!this.shouldReconnect)return;this.reconnectAttempts+=1;let t=this.options.maxReconnectAttempts;if(t!==void 0&&this.reconnectAttempts>t){this.shouldReconnect=!1,this.options.onStateChange?.(`error`,e);return}this.options.onStateChange?.(`reconnecting`,e);let n=Math.min(3e4,1e3*2**Math.min(this.reconnectAttempts-1,5)),r=Math.round(n*(.5+Math.random()*.5));this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.open(!0)},r)}clearHeartbeat(){this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0}clearTimers(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0,this.clearConnectionTimer(),this.ticketAbort?.abort(),this.ticketAbort=void 0,this.clearHeartbeat()}clearConnectionTimer(){this.connectionTimer&&clearTimeout(this.connectionTimer),this.connectionTimer=void 0}},we=500,K=null,q;function J(e){q=e,K!==null&&clearTimeout(K),K=setTimeout(()=>{K=null;let e=q;q=void 0,window.dispatchEvent(new CustomEvent(`config-reload`,{detail:e}))},we)}function Y(e,t){if(e===`config.reload`){J(t);return}window.dispatchEvent(new CustomEvent(e.replace(/[._]/g,`-`),{detail:t}))}var X=new Map,Z=new Map,Q,$;function Te(){let e=`xopc:realtime-client-id`,t=sessionStorage.getItem(e);if(t)return t;let n=crypto.randomUUID();return sessionStorage.setItem(e,n),n}function Ee(){let t=new URL(e(`/api/realtime/v1/ws`));return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.toString()}function De(){let t=Te(),n=window.electronAPI?`desktop`:`web`,r=new Ce({clientId:t,clientKind:n,getWebSocketUrl:Ee,issueTicket:async r=>{let i=await fetch(e(`/api/realtime/tickets`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({clientId:t,clientKind:n,protocolVersion:2}),signal:r}),a=await i.json().catch(()=>null);if(!i.ok||!a?.payload?.ticket||!a.payload.realtime)throw Error(a?.error?.message??`Realtime ticket failed (${i.status})`);return{ticket:a.payload.ticket,realtime:a.payload.realtime}},createWebSocket:e=>new WebSocket(e),onStateChange:(e,t)=>{p({connectionState:e,error:t??null}),e===`connected`&&window.dispatchEvent(new CustomEvent(`gateway-realtime-connected`))},onEvent:e=>{(e.topic===`gateway`||e.topic===`sessions`)&&Y(e.event,e.data);let t=Z.get(e.topic);(t===void 0||e.seq>t)&&Z.set(e.topic,e.seq);for(let t of X.get(e.topic)??[])if(!(t.cursor!==void 0&&e.seq<=t.cursor))try{t.listener.onEvent(e)}catch(e){console.error(`[realtime] topic listener failed:`,e)}finally{t.cursor=Math.max(t.cursor??0,e.seq)}},onGap:async e=>{window.dispatchEvent(new CustomEvent(`realtime-gap`,{detail:e}));let t=[...X.get(e.topic)??[]].filter(t=>!e.recoverable||t.cursor===void 0||t.cursor<e.earliestSeq-1),n=await Promise.allSettled(t.map(t=>t.listener.onGap?.(e)));for(let e of n)e.status===`rejected`&&console.error(`[realtime] topic gap handler failed:`,e.reason)}});Q?.disconnect(),Q=r,$&&r.setEndpoint($),r.subscribe(`gateway`,Z.get(`gateway`)),r.subscribe(`sessions`,Z.get(`sessions`));for(let e of X.keys())r.subscribe(e,Z.get(e));return p({connectionState:`connecting`,error:null}),r.connect(),()=>{Q===r&&(r.disconnect(),Q=void 0)}}function Oe(e){return $=e,Q?.setEndpoint(e),()=>{$===e&&($=void 0,Q?.clearEndpoint(e))}}function ke(e){Q?.sendEndpointMessage(e)}function Ae(){Q?.reconnect()}function je(e,t,n){let r=X.get(e)??new Set,i=r.size===0,a=Z.get(e),o={listener:t,cursor:n??a};if(r.add(o),X.set(e,r),i){let t=n??a;Z.set(e,t),Q?.subscribe(e,t)}else n!==void 0&&(a===void 0||n<a)&&Q?.subscribe(e,n);return()=>{let t=X.get(e);t?.delete(o),(!t||t.size===0)&&(X.delete(e),Z.delete(e),Q?.unsubscribe(e))}}export{je as a,re as c,P as d,A as f,ee as h,De as i,D as l,ne as m,Ae as n,J as o,w as p,ke as r,O as s,Oe as t,k as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Sn as e}from"./index-GBFmI8im.js";function t(t){let{children:n,fallback:r}=t,i=r===void 0?null:r;return e()?n:i}export{t};
|