@xopcai/xopc 0.0.221 → 0.0.223
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/{activity-store-NItGQmvR.js → activity-store--GBciH10.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B8SBTGg3.js → agent-avatar-dicebear-C93T3FLD.js} +1 -1
- package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +68 -0
- package/dist/gateway/static/root/assets/{api-53ZXsuyr.js → api-HoIz_ija.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BtmPXaqu.js → app-management-settings-panel-Bhl8Xluk.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-t7HoJyNN.js → appearance-settings-CywEN-kG.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BZY09nuJ.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D8o8CP9Y.js → archive-plugin-CteCVsBP.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CsLXzas8.js → attachment-load-CbNE_EPd.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-D-zgoAKz.js → automations-page-Bcqk6tOx.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B-MjP_22.js → binary-plugins-M_i3WS5M.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-eg9LEH2o.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-kKwbvzjj.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-Bi6RSSpD.js → browser-workflow-inputs-1UZ0vnIy.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-EEFHUm1i.js → browser-workflows-page-D8ATQqZ5.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-pC2fno7r.js → capability-presets-api-yNqTIuyd.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CgdRkwnk.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-B5Szgu_z.js → channel-recipient-api-krezGsKc.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DT-OFl4r.js → chat-terminal-dock-DQ5bB4Su.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-MZ_AJqrm.js → cron-expression-CEwPkdhh.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-Bv9hZLuD.js → date-picker-DDAxTir8.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-D-6oO_Vk.js → dependency-picker-CYVoSZwI.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CiI5caKj.js → desktop-pet-CrNKfW_c.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DhkSOy4K.js → desktop-pet-settings-C06PaB46.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-C4s4Pz8I.js → directory-picker-path-field--D7laeLF.js} +1 -1
- package/dist/gateway/static/root/assets/dist-DaxPZj9e.js +1 -0
- package/dist/gateway/static/root/assets/{dist-DY4Af0fY.js → dist-J_ySZvz0.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DE7J1-6W.js → extension-debug-page-Dn4Px9KQ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DSnACD7E.js → extension-page-DzLf3fMQ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Dk7k2Pok.js → extension-settings-page-DIchwtvB.js} +1 -1
- package/dist/gateway/static/root/assets/floating-ui.dom-B7uQOZZW.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-api-IOA1OlHx.js → gateway-config-api-SmTGLhqK.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BzTbnu4O.js → gateway-config-swr-yUxMMVjK.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-FX7QsgSQ.js → gateway-settings-yCDkOYzA.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B2zpkNvi.js → gateway-startup-retry-9mrsL84j.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CquIULHX.js +1 -0
- package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-BXRjz-iY.js → image-generation-api-CgFAGDi8.js} +1 -1
- package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +2 -0
- package/dist/gateway/static/root/assets/index-wnDPGRTi.js +74 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BjYiM4xq.js → keyboard-shortcuts-settings-DI2To7yl.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-7DHvwSgA.js → local-apps-page-CSEJsQ1F.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-iKjqemWG.js → locale-store-CPylQjH9.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-BSxppo9Z.js → management-settings-CgyaIyuk.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-D4oDjZtl.js → markdown-split-paG9qap9.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-CUsob4Pz.js +69 -0
- package/dist/gateway/static/root/assets/{media-plugins-BPNTGROA.js → media-plugins-0Q-c_QIy.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B82nsi9k.js +3 -0
- package/dist/gateway/static/root/assets/notes-api-CfKZYrBC.js +1 -0
- package/dist/gateway/static/root/assets/{notes-page-DU5tKPTq.js → notes-page-Bvb-ycX_.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +4 -0
- package/dist/gateway/static/root/assets/oauth-authorization-window-Cdolr2wE.js +1 -0
- package/dist/gateway/static/root/assets/{popover-select-BzdnTy3h.js → popover-select-CccGri5Y.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CPoQvD6P.js → product-open-page-DrvBwAns.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-Cx3JxXSL.js → registry-api-B_5D8epF.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-xqnWcvIv.js → runtime-tools-settings-panel-DKjdN4Lr.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CuIDPYu6.js → schema-form-DskqaNqC.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DkAv9ncE.js → settings-form-section-CZlMvHA9.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BJUQiEKb.js → settings-loading-skeleton-DS6lcAg9.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-KHRbLwmw.js → settings-page-oE5J9tsV.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-C8jd20Db.js → setup-status-panel-C7oFCIqD.js} +1 -1
- package/dist/gateway/static/root/assets/share-preview-page-CPFAj8NE.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-CKhR9J81.js → skills-page-Bh4gFi8e.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-AYX-e5sD.js → skills-page.utils-BQaUWP9z.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-IIF-K9ML.js → system-settings-panel-COAZoh_O.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BOD2D0dJ.js → theme-store-BN-32Fz5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DcktF1j1.js → use-autosave-BAkToU15.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-Br5wgARM.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BMkNTHHE.js → voice-api-key-field-CC4z9-ux.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DVoiXekA.js → work-discovery-overlay-dLVUYSSE.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Cw4LQjuM.js → workflow-run-setup-panel-BYU5-0KF.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +5 -0
- package/dist/gateway/static/root/index.html +15 -14
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +3 -0
- package/dist/src/agent/agent-manager.d.ts +3 -0
- package/dist/src/agent/agent-manager.js +34 -28
- package/dist/src/agent/embedded/index.d.ts +1 -1
- package/dist/src/agent/embedded/index.js +2 -2
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +102 -63
- package/dist/src/agent/embedded/run-turn.js +56 -28
- package/dist/src/agent/embedded/runs.d.ts +16 -29
- package/dist/src/agent/embedded/runs.js +44 -65
- package/dist/src/agent/embedded/types.d.ts +4 -0
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/ipc/inbox.js +1 -1
- package/dist/src/agent/memory/create-memory-manager.js +1 -1
- package/dist/src/agent/orchestration/agent-run-supervisor.d.ts +28 -0
- package/dist/src/agent/orchestration/agent-run-supervisor.js +49 -0
- package/dist/src/agent/orchestration/agent-turn-policy.d.ts +18 -0
- package/dist/src/agent/orchestration/agent-turn-policy.js +36 -0
- package/dist/src/agent/orchestration/llm-turn-retry.d.ts +5 -0
- package/dist/src/agent/orchestration/llm-turn-retry.js +34 -4
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +10 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +25 -4
- package/dist/src/agent/service/async-queue.d.ts +16 -3
- package/dist/src/agent/service/async-queue.js +29 -11
- package/dist/src/agent/service/process-direct-streaming.js +27 -4
- package/dist/src/agent/service.js +3 -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/exec-command.d.ts +2 -0
- package/dist/src/agent/tools/exec-command.js +70 -7
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/runtime-profile.js +1 -1
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/oauth/index.js +3 -3
- package/dist/src/auth/oauth/registry.d.ts +2 -0
- package/dist/src/auth/oauth/registry.js +20 -12
- package/dist/src/auth/oauth/xopc-cloud.d.ts +1 -0
- package/dist/src/auth/oauth/xopc-cloud.js +32 -16
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/channels/attachments/voice-stt-webchat.js +20 -3
- 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 +4 -5
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +18 -0
- package/dist/src/config/schema.js +19 -1
- package/dist/src/connectors/learning-coordinator.js +3 -19
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/hono/app.js +2 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/oauth-async.d.ts +1 -0
- package/dist/src/gateway/hono/oauth-async.js +11 -4
- package/dist/src/gateway/hono/routes/config.js +10 -0
- package/dist/src/gateway/hono/routes/host-fs.js +40 -1
- package/dist/src/gateway/hono/routes/media.js +33 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +162 -7
- package/dist/src/gateway/hono/routes/shares.js +141 -6
- package/dist/src/gateway/hono/routes/tunnel.js +47 -10
- package/dist/src/gateway/hono/routes/voice.d.ts +2 -6
- package/dist/src/gateway/hono/routes/voice.js +28 -5
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service.js +3 -3
- package/dist/src/notes/service.d.ts +6 -2
- package/dist/src/notes/service.js +36 -4
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +3 -3
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/share/note-share-service.d.ts +67 -0
- package/dist/src/share/note-share-service.js +283 -0
- package/dist/src/share/share-config.js +32 -3
- package/dist/src/share/share-landing.d.ts +5 -1
- package/dist/src/share/share-landing.js +28 -1
- package/dist/src/share/share-store.d.ts +34 -5
- package/dist/src/share/share-store.js +125 -19
- package/dist/src/share/share-thumbnail.js +4 -2
- package/dist/src/share/share-types.d.ts +52 -14
- package/dist/src/share/share-types.js +9 -0
- package/dist/src/share/share-zip.d.ts +2 -2
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/tunnel/env.d.ts +12 -6
- package/dist/src/tunnel/env.js +34 -26
- package/dist/src/tunnel/gateway-lifecycle.js +2 -13
- package/dist/src/tunnel/index.d.ts +1 -1
- package/dist/src/tunnel/index.js +2 -2
- package/dist/src/tunnel/tunnel-audit.d.ts +1 -1
- package/dist/src/tunnel/tunnel-config.d.ts +1 -1
- package/dist/src/tunnel/tunnel-config.js +9 -4
- package/dist/src/tunnel/tunnel-service.d.ts +1 -1
- package/dist/src/tunnel/tunnel-service.js +3 -0
- package/dist/src/tunnel/well-known.d.ts +1 -1
- package/dist/src/tunnel/well-known.js +1 -1
- package/dist/src/tunnel/xopc-cloud-registration.d.ts +9 -0
- package/dist/src/tunnel/xopc-cloud-registration.js +42 -0
- package/dist/src/voice/audio/normalize.d.ts +7 -0
- package/dist/src/voice/audio/normalize.js +30 -4
- package/dist/src/voice/local/runtime-worker.js +26 -6
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/package.json +8 -14
- package/dist/gateway/static/root/assets/agents-Brs2-m6t.js +0 -68
- package/dist/gateway/static/root/assets/apps-page-DJ_Dsb1j.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-DehLRXfd.js +0 -6
- package/dist/gateway/static/root/assets/block-editor-i4CfDqLG.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-C3QIO4Ti.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BHhUp7FW.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DoClNVLz.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-Je-9a5ZC.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-ByRbxC6z.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-D8z9Trw4.js +0 -2
- package/dist/gateway/static/root/assets/dist-C230izr8.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-D5CGVyci.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DzfZFZx5.js +0 -1
- package/dist/gateway/static/root/assets/index-Dcj5KJRg.css +0 -2
- package/dist/gateway/static/root/assets/index-EvA8c7fo.js +0 -74
- package/dist/gateway/static/root/assets/local-app-workbench-page-hPyTaVYU.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-DW0xMKWP.js +0 -2
- package/dist/gateway/static/root/assets/markdown-view-DYkxMtJA.js +0 -69
- package/dist/gateway/static/root/assets/messages-kx5W39dO.js +0 -3
- package/dist/gateway/static/root/assets/notes-api-DJizatxh.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-D669d98r.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CpsQ9PTA.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CitO1LMc.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-C9-bL4V6.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CPSARi4y.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BxT80Fmr.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-WCVtJ3sX.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-DrQ_cOXh.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-C_4cG30x.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CYjsecEr.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-Cy1D2hkt.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DKKH1_Yt.js +0 -5
|
@@ -38,7 +38,7 @@ function configureTunnel(ctx) {
|
|
|
38
38
|
const brokerUrl = resolveTunnelBrokerUrl(config.tunnel?.brokerUrl);
|
|
39
39
|
getTunnelService().configure({
|
|
40
40
|
brokerUrl,
|
|
41
|
-
registrationSecret: resolveTunnelRegistrationSecret(
|
|
41
|
+
registrationSecret: resolveTunnelRegistrationSecret(brokerUrl, config.tunnel?.registrationSecret),
|
|
42
42
|
autoStart: config.tunnel?.autoStart ?? false,
|
|
43
43
|
gatewayHost: host,
|
|
44
44
|
frpSubdomainHost: resolveFrpSubdomainHost(resolveTunnelBrokerUrl(config.tunnel?.brokerUrl))
|
|
@@ -131,13 +131,12 @@ function createTunnelCommand(ctx) {
|
|
|
131
131
|
});
|
|
132
132
|
console.log("Tunnel security consent recorded.");
|
|
133
133
|
});
|
|
134
|
-
cmd.command("secret").description("Manage tunnel broker registration secret in config").command("set").description("Save tunnel.registrationSecret to xopc.json
|
|
134
|
+
cmd.command("secret").description("Manage tunnel broker registration secret in config").command("set").description("Save tunnel.registrationSecret to xopc.json").argument("[secret]", "Registration secret (prompts securely when omitted in a TTY)").option("--stdin", "Read secret from stdin (single line, trimmed)").action(async (secretArg, opts) => {
|
|
135
135
|
try {
|
|
136
136
|
await saveTunnelRegistrationSecret(ctx, await readTunnelRegistrationSecretFromCli({
|
|
137
137
|
secretArg,
|
|
138
138
|
stdin: opts.stdin
|
|
139
139
|
}));
|
|
140
|
-
if (process.env.XOPC_TUNNEL_REGISTRATION_SECRET?.trim()) console.log("Note: XOPC_TUNNEL_REGISTRATION_SECRET is set in the environment and overrides the saved config at runtime.");
|
|
141
140
|
console.log(`Saved tunnel registration secret to ${ctx.configPath}.`);
|
|
142
141
|
} catch (err) {
|
|
143
142
|
const em = err instanceof Error ? err.message : String(err);
|
|
@@ -227,7 +226,7 @@ function createTunnelCommand(ctx) {
|
|
|
227
226
|
console.log(`# Self-hosted FRP broker sketch for ${domain}`);
|
|
228
227
|
console.log("# 1. Run frps with vhost HTTP/HTTPS and a registration token");
|
|
229
228
|
console.log(`# 2. Point tunnel.brokerUrl to https://${domain}/api`);
|
|
230
|
-
console.log(
|
|
229
|
+
console.log("# 3. Save the broker registration key as tunnel.registrationSecret");
|
|
231
230
|
console.log("");
|
|
232
231
|
console.log(JSON.stringify({
|
|
233
232
|
frps: {
|
|
@@ -237,7 +236,7 @@ function createTunnelCommand(ctx) {
|
|
|
237
236
|
},
|
|
238
237
|
broker: {
|
|
239
238
|
apiUrl: `https://${domain}/api`,
|
|
240
|
-
|
|
239
|
+
registrationSecretConfig: "tunnel.registrationSecret"
|
|
241
240
|
}
|
|
242
241
|
}, null, 2));
|
|
243
242
|
}));
|
package/dist/src/config/index.js
CHANGED
|
@@ -2,15 +2,15 @@ import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXop
|
|
|
2
2
|
import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
|
|
3
3
|
import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
|
|
4
4
|
import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
|
|
5
|
-
import {
|
|
5
|
+
import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
|
|
6
6
|
import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
|
|
7
7
|
import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
|
|
8
8
|
import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
9
|
+
import { extractProfileAgentId, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
|
|
9
10
|
import { FILENAMES, WORKSPACE_FILES, existsSync, hasBundledExtensionManifest, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
|
|
10
|
-
import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
11
11
|
import { init_loader, loadConfig, saveConfig } from "./loader.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
|
|
13
|
+
import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
14
14
|
import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
|
|
15
15
|
import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
|
|
16
16
|
import { getWorkspacePath } from "./workspace-path-helpers.js";
|
|
@@ -2,8 +2,8 @@ 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
4
|
import { ConfigSchema, init_schema } from "./schema.js";
|
|
5
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
5
|
import { init_paths, resolveConfigPath } from "./paths.js";
|
|
6
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
7
7
|
import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
|
|
8
8
|
import { dirname } from "path";
|
|
9
9
|
import { existsSync, mkdirSync, promises, readFileSync } from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
3
2
|
import { init_paths, resolveModelsJsonPath } from "./paths.js";
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
4
4
|
import { existsSync, readFileSync } from "fs";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
//#region src/config/models-json.ts
|
|
@@ -991,6 +991,15 @@ export declare const GatewayConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
991
991
|
listingCacheMs: z.ZodDefault<z.ZodNumber>;
|
|
992
992
|
zipConcurrency: z.ZodDefault<z.ZodNumber>;
|
|
993
993
|
}, z.core.$strip>>;
|
|
994
|
+
note: z.ZodDefault<z.ZodObject<{
|
|
995
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
996
|
+
maxMarkdownBytes: z.ZodDefault<z.ZodNumber>;
|
|
997
|
+
maxAttachmentCount: z.ZodDefault<z.ZodNumber>;
|
|
998
|
+
maxAttachmentSize: z.ZodDefault<z.ZodNumber>;
|
|
999
|
+
maxTotalSize: z.ZodDefault<z.ZodNumber>;
|
|
1000
|
+
assetTicketTtlMs: z.ZodDefault<z.ZodNumber>;
|
|
1001
|
+
revokeOnSourceDelete: z.ZodDefault<z.ZodBoolean>;
|
|
1002
|
+
}, z.core.$strip>>;
|
|
994
1003
|
}, z.core.$strip>>;
|
|
995
1004
|
siteShare: z.ZodOptional<z.ZodObject<{
|
|
996
1005
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -2067,6 +2076,15 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
2067
2076
|
listingCacheMs: z.ZodDefault<z.ZodNumber>;
|
|
2068
2077
|
zipConcurrency: z.ZodDefault<z.ZodNumber>;
|
|
2069
2078
|
}, z.core.$strip>>;
|
|
2079
|
+
note: z.ZodDefault<z.ZodObject<{
|
|
2080
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
2081
|
+
maxMarkdownBytes: z.ZodDefault<z.ZodNumber>;
|
|
2082
|
+
maxAttachmentCount: z.ZodDefault<z.ZodNumber>;
|
|
2083
|
+
maxAttachmentSize: z.ZodDefault<z.ZodNumber>;
|
|
2084
|
+
maxTotalSize: z.ZodDefault<z.ZodNumber>;
|
|
2085
|
+
assetTicketTtlMs: z.ZodDefault<z.ZodNumber>;
|
|
2086
|
+
revokeOnSourceDelete: z.ZodDefault<z.ZodBoolean>;
|
|
2087
|
+
}, z.core.$strip>>;
|
|
2070
2088
|
}, z.core.$strip>>;
|
|
2071
2089
|
siteShare: z.ZodOptional<z.ZodObject<{
|
|
2072
2090
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -490,7 +490,7 @@ strict: z.boolean().optional() }).optional();
|
|
|
490
490
|
TunnelConfigSchema = z.object({
|
|
491
491
|
enabled: z.boolean().default(false),
|
|
492
492
|
brokerUrl: z.string().url().default("https://frp.xopc.ai/api"),
|
|
493
|
-
/** Broker register API secret
|
|
493
|
+
/** Broker register API secret. */
|
|
494
494
|
registrationSecret: z.string().min(1).optional(),
|
|
495
495
|
autoStart: z.boolean().default(false),
|
|
496
496
|
subdomain: z.string().optional(),
|
|
@@ -620,6 +620,24 @@ activityDetailDefault: z.enum([
|
|
|
620
620
|
maxDepth: 20,
|
|
621
621
|
listingCacheMs: 6e4,
|
|
622
622
|
zipConcurrency: 1
|
|
623
|
+
}),
|
|
624
|
+
/** Note snapshot-sharing controls. */
|
|
625
|
+
note: z.object({
|
|
626
|
+
enabled: z.boolean().default(true),
|
|
627
|
+
maxMarkdownBytes: z.number().int().min(1024).max(10485760).default(2097152),
|
|
628
|
+
maxAttachmentCount: z.number().int().min(0).max(500).default(50),
|
|
629
|
+
maxAttachmentSize: z.number().int().min(1024).max(1073741824).default(104857600),
|
|
630
|
+
maxTotalSize: z.number().int().min(1024).max(2147483648).default(262144e3),
|
|
631
|
+
assetTicketTtlMs: z.number().int().min(6e4).max(36e5).default(6e5),
|
|
632
|
+
revokeOnSourceDelete: z.boolean().default(true)
|
|
633
|
+
}).default({
|
|
634
|
+
enabled: true,
|
|
635
|
+
maxMarkdownBytes: 2097152,
|
|
636
|
+
maxAttachmentCount: 50,
|
|
637
|
+
maxAttachmentSize: 104857600,
|
|
638
|
+
maxTotalSize: 262144e3,
|
|
639
|
+
assetTicketTtlMs: 6e5,
|
|
640
|
+
revokeOnSourceDelete: true
|
|
623
641
|
})
|
|
624
642
|
}).optional(),
|
|
625
643
|
/** Site-share configuration (static directory or reverse-proxy a local dev server). */
|
|
@@ -10,7 +10,7 @@ import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-id
|
|
|
10
10
|
import { ComposioSessionsAdapter } from "./composio-sessions.js";
|
|
11
11
|
import { buildConnectorLearningArguments, getConnectorLearningPlan } from "./learning-recipes.js";
|
|
12
12
|
import { getConnectorDefinition } from "./catalog.js";
|
|
13
|
-
import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant
|
|
13
|
+
import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
|
|
14
14
|
import { claimRegisteredExtraction } from "../user-context/extraction/registry.js";
|
|
15
15
|
import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
|
16
16
|
import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
|
|
@@ -227,20 +227,10 @@ function startConnectorLearningCoordinator(options) {
|
|
|
227
227
|
};
|
|
228
228
|
if (structuralExtraction.shouldExecute) try {
|
|
229
229
|
understanding = await new ConnectedUnderstandingPipeline(options.getMemoryManager()).process(job.agentId, structuralExtraction.run.id);
|
|
230
|
-
const structuralFocuses = understanding.createdRecords.filter((item) => item.kind === "project_context").map((record) => upsertUserFocus({
|
|
231
|
-
canonicalKey: `connector-focus:${job.accountId}:${record.id}`,
|
|
232
|
-
title: record.content.slice(0, 120),
|
|
233
|
-
summary: record.content,
|
|
234
|
-
horizon: "ongoing",
|
|
235
|
-
status: "candidate",
|
|
236
|
-
confidence: .72,
|
|
237
|
-
evidenceRefs: [`connector-account:${job.accountId}`],
|
|
238
|
-
sourceRunId: sourceRun.id
|
|
239
|
-
}));
|
|
240
230
|
finishContextExtractionRun({
|
|
241
231
|
runId: structuralExtraction.run.id,
|
|
242
232
|
status: "completed",
|
|
243
|
-
outputs:
|
|
233
|
+
outputs: (understanding.writeOutputs ?? []).map((output) => ({
|
|
244
234
|
candidateKey: output.candidateKey,
|
|
245
235
|
...output.objectId ? {
|
|
246
236
|
objectType: "understanding",
|
|
@@ -248,13 +238,7 @@ function startConnectorLearningCoordinator(options) {
|
|
|
248
238
|
} : {},
|
|
249
239
|
...output.versionId ? { versionId: output.versionId } : {},
|
|
250
240
|
outcome: output.outcome
|
|
251
|
-
}))
|
|
252
|
-
candidateKey: focus.canonicalKey,
|
|
253
|
-
objectType: "focus",
|
|
254
|
-
objectId: focus.id,
|
|
255
|
-
versionId: focus.versionId,
|
|
256
|
-
outcome: "created"
|
|
257
|
-
}))]
|
|
241
|
+
}))
|
|
258
242
|
});
|
|
259
243
|
} catch (error) {
|
|
260
244
|
finishContextExtractionRun({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
4
3
|
import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
5
5
|
import { dirname, join } from "path";
|
|
6
6
|
import { existsSync } from "fs";
|
|
7
7
|
import { mkdir, readFile } from "fs/promises";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
2
2
|
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
3
|
-
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
4
3
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
4
|
+
import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
|
|
6
6
|
import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
|
|
7
7
|
import { seedAgentProfileMarkdownFiles } from "../agent/context/workspace-seed.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
2
2
|
import { init_agent_scope, resolveAgentProfileDir } from "../agent/agent-scope.js";
|
|
3
|
-
import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
|
|
4
3
|
import { extractProfileAgentId } from "../config/agent-profile.js";
|
|
4
|
+
import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
|
|
5
5
|
import { isBareProfileMarkdownFileName, resolveProfileMarkdownPathIfBareName } from "../agent/tools/tool-paths.js";
|
|
6
6
|
import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
|
|
7
7
|
import { basename, isAbsolute, resolve } from "node:path";
|
|
@@ -147,6 +147,7 @@ function createHonoApp(config) {
|
|
|
147
147
|
const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;
|
|
148
148
|
const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;
|
|
149
149
|
const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;
|
|
150
|
+
const MEDIA_UPLOAD_BODY_MAX = 33 * 1024 * 1024;
|
|
150
151
|
const VOICE_TRANSCRIBE_BODY_MAX = 26 * 1024 * 1024;
|
|
151
152
|
const SESSION_INPUT_BODY_MAX = maxSessionInputRequestBodyBytes();
|
|
152
153
|
const isNoteMediaUploadRequest = (path, method, contentType) => {
|
|
@@ -175,7 +176,7 @@ function createHonoApp(config) {
|
|
|
175
176
|
}));
|
|
176
177
|
app.use("/api/*", async (c, next) => {
|
|
177
178
|
const contentType = c.req.header("content-type");
|
|
178
|
-
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
|
|
179
|
+
const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : c.req.path === "/api/media" && c.req.method === "POST" ? MEDIA_UPLOAD_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
|
|
179
180
|
const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
|
|
180
181
|
return bodyLimit({
|
|
181
182
|
maxSize,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ContextCompactionPolicySchema, UserContextDreamingSchema, UserContextPrivacySchema, init_config } from "../../../user-context/config.js";
|
|
2
2
|
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
3
3
|
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
4
|
+
import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
|
|
4
5
|
import { init_models_json, loadModelsJson } from "../../../config/models-json.js";
|
|
5
6
|
import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
|
|
6
|
-
import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
|
|
7
7
|
import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
|
|
8
8
|
import { getAllProviders, init_providers, isProviderConfigured } from "../../../providers/index.js";
|
|
9
9
|
import { normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
|
|
@@ -23,6 +23,7 @@ export interface OAuthCompletionReadiness {
|
|
|
23
23
|
export declare function buildOAuthCompletionReadiness(config: Config, catalog: CatalogReadiness): OAuthCompletionReadiness;
|
|
24
24
|
export declare function refreshModelCatalogAfterOAuth(provider: string, service: Pick<GatewayService, 'getModelCatalogSync'>): Promise<CatalogReadiness | undefined>;
|
|
25
25
|
export declare function normalizeDesktopOAuthReturnPath(value: unknown): string | undefined;
|
|
26
|
+
export declare function buildDesktopOAuthReturnUrl(provider: string, sessionId: string, returnPath: unknown): string | undefined;
|
|
26
27
|
export declare function resolveOAuthLoginMethodPreference(params: {
|
|
27
28
|
requestedMethod?: unknown;
|
|
28
29
|
supportedMethods?: readonly string[];
|
|
@@ -82,11 +82,17 @@ function normalizeDesktopOAuthReturnPath(value) {
|
|
|
82
82
|
if (path.length === 0 || path.length > 2048 || !path.startsWith("/") || path.startsWith("//") || path.includes("\\") || /[\u0000-\u001f\u007f]/.test(path)) return;
|
|
83
83
|
return path;
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
const DESKTOP_OAUTH_CALLBACK_PATHS = {
|
|
86
|
+
"xopc-cloud": "model-connected",
|
|
87
|
+
"xopc-tunnel": "tunnel-connected"
|
|
88
|
+
};
|
|
89
|
+
function buildDesktopOAuthReturnUrl(provider, sessionId, returnPath) {
|
|
90
|
+
const callbackPath = DESKTOP_OAUTH_CALLBACK_PATHS[provider];
|
|
91
|
+
if (!callbackPath) return void 0;
|
|
86
92
|
const params = new URLSearchParams({ request_id: sessionId });
|
|
87
93
|
const normalizedReturnPath = normalizeDesktopOAuthReturnPath(returnPath);
|
|
88
94
|
if (normalizedReturnPath) params.set("return_path", normalizedReturnPath);
|
|
89
|
-
return `xopc://cloud
|
|
95
|
+
return `xopc://cloud/${callbackPath}?${params.toString()}`;
|
|
90
96
|
}
|
|
91
97
|
function cancelOAuthSession(session, message = "OAuth flow cancelled") {
|
|
92
98
|
if (session.abortController) session.abortController.abort();
|
|
@@ -142,10 +148,11 @@ function createOAuthAsyncHandler(service) {
|
|
|
142
148
|
const oauthProvider = OAUTH_PROVIDERS[provider];
|
|
143
149
|
if (!oauthProvider) return c.json({ error: `Unknown OAuth provider: ${provider}` }, 400);
|
|
144
150
|
const sessionId = generateSessionId();
|
|
151
|
+
const returnToAppUrl = body.client === "desktop" ? buildDesktopOAuthReturnUrl(provider, sessionId, body.returnPath) : void 0;
|
|
145
152
|
const session = {
|
|
146
153
|
id: sessionId,
|
|
147
154
|
provider,
|
|
148
|
-
...
|
|
155
|
+
...returnToAppUrl ? { returnToAppUrl } : {},
|
|
149
156
|
preferredLoginMethod: preferredOAuthLoginMethod({
|
|
150
157
|
provider,
|
|
151
158
|
requestedMethod: body.loginMethod,
|
|
@@ -378,4 +385,4 @@ async function runOAuthFlow(session, oauthProvider, service) {
|
|
|
378
385
|
}
|
|
379
386
|
}
|
|
380
387
|
//#endregion
|
|
381
|
-
export { buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
|
|
388
|
+
export { buildDesktopOAuthReturnUrl, buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { enumerateLanGatewayCandidates } from "../../host.js";
|
|
2
|
+
import { getTunnelService } from "../../../tunnel/tunnel-service.js";
|
|
2
3
|
import { prepareLocalVoiceModelAfterProviderSwitch } from "../../../voice/local/provider-switch.js";
|
|
3
4
|
import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
|
|
4
5
|
import { applyAgentsPatch } from "./config-patch/agents.js";
|
|
@@ -70,6 +71,15 @@ function registerConfigRoutes(authenticated, deps) {
|
|
|
70
71
|
ok: false,
|
|
71
72
|
error: finalGwCheck.error
|
|
72
73
|
}, finalGwCheck.status);
|
|
74
|
+
if (body?.tunnel && typeof body.tunnel === "object" && !Array.isArray(body.tunnel) && body.tunnel.registrationSecret === null) try {
|
|
75
|
+
await getTunnelService().stop();
|
|
76
|
+
} catch (err) {
|
|
77
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
+
return c.json({
|
|
79
|
+
ok: false,
|
|
80
|
+
error: `Failed to stop tunnel before clearing key: ${message}`
|
|
81
|
+
}, 500);
|
|
82
|
+
}
|
|
73
83
|
const result = await service.saveConfig(config);
|
|
74
84
|
if (!result.saved) return c.json({
|
|
75
85
|
ok: false,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
2
2
|
import * as os$1 from "node:os";
|
|
3
3
|
import * as path$1 from "node:path";
|
|
4
|
-
import { readdir, realpath, stat } from "node:fs/promises";
|
|
4
|
+
import { mkdir, readdir, realpath, stat } from "node:fs/promises";
|
|
5
5
|
//#region src/gateway/hono/routes/host-fs.ts
|
|
6
6
|
const log = createGatewayRouteLogger("HostFs");
|
|
7
7
|
function jsonError(status, message) {
|
|
@@ -172,6 +172,45 @@ function registerHostFsRoutes(authenticated, _deps) {
|
|
|
172
172
|
return jsonError(500, msg || "Failed to read directory");
|
|
173
173
|
}
|
|
174
174
|
});
|
|
175
|
+
/** Create one directory below an existing absolute directory on the gateway host. */
|
|
176
|
+
authenticated.post("/api/host/fs/directory", async (c) => {
|
|
177
|
+
const body = await c.req.json().catch(() => null);
|
|
178
|
+
const parentPath = body && typeof body === "object" && typeof body.parentPath === "string" ? body.parentPath.trim() : "";
|
|
179
|
+
const name = body && typeof body === "object" && typeof body.name === "string" ? body.name.trim() : "";
|
|
180
|
+
if (!parentPath || !path$1.isAbsolute(parentPath)) return jsonError(400, "An absolute parent path is required");
|
|
181
|
+
if (!name || name === "." || name === ".." || name.includes("/") || name.includes("\\") || name.includes("\0") || name.length > 255) return jsonError(400, "Invalid folder name");
|
|
182
|
+
let resolvedParent;
|
|
183
|
+
try {
|
|
184
|
+
resolvedParent = await realpath(path$1.normalize(parentPath));
|
|
185
|
+
if (!(await stat(resolvedParent)).isDirectory()) return jsonError(400, "Parent path is not a directory");
|
|
186
|
+
} catch (err) {
|
|
187
|
+
log.warn({
|
|
188
|
+
err,
|
|
189
|
+
path: parentPath
|
|
190
|
+
}, "Host fs create parent lookup failed");
|
|
191
|
+
return jsonError(404, "Parent path not found");
|
|
192
|
+
}
|
|
193
|
+
const directoryPath = path$1.join(resolvedParent, name);
|
|
194
|
+
try {
|
|
195
|
+
await mkdir(directoryPath);
|
|
196
|
+
const createdPath = await realpath(directoryPath);
|
|
197
|
+
log.info({ path: createdPath }, "Host fs directory created");
|
|
198
|
+
return c.json({
|
|
199
|
+
ok: true,
|
|
200
|
+
payload: { absolutePath: createdPath }
|
|
201
|
+
}, 201);
|
|
202
|
+
} catch (err) {
|
|
203
|
+
const code = err?.code;
|
|
204
|
+
if (code === "EEXIST") return jsonError(409, "A file or folder with this name already exists");
|
|
205
|
+
log.warn({
|
|
206
|
+
err,
|
|
207
|
+
path: directoryPath
|
|
208
|
+
}, "Host fs directory create failed");
|
|
209
|
+
if (code === "EACCES" || code === "EPERM" || code === "EROFS") return jsonError(403, "Permission denied");
|
|
210
|
+
if (code === "ENOENT") return jsonError(404, "Parent path not found");
|
|
211
|
+
return jsonError(500, "Failed to create folder");
|
|
212
|
+
}
|
|
213
|
+
});
|
|
175
214
|
}
|
|
176
215
|
//#endregion
|
|
177
216
|
export { registerHostFsRoutes };
|
|
@@ -1,15 +1,47 @@
|
|
|
1
1
|
import { TaskRepository } from "../../../tasks/task-repository.js";
|
|
2
2
|
import { parseMediaUri } from "../../../media/uri.js";
|
|
3
|
-
import { mimeTypeFromMediaPath } from "../../../media/store.js";
|
|
3
|
+
import { mimeTypeFromMediaPath, saveMediaBuffer } from "../../../media/store.js";
|
|
4
4
|
import { readMediaReference } from "../../../media/media-reference.js";
|
|
5
5
|
import { TaskContextRepository } from "../../../tasks/task-context-repository.js";
|
|
6
6
|
import { pendingTranscriptReferencesMediaUri } from "../../../agent/inbound/attachment-pipeline.js";
|
|
7
|
+
import { MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from "../../chat-limits.js";
|
|
7
8
|
import { messagesReferenceMediaUri } from "../../../media/session-references.js";
|
|
8
9
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
9
10
|
//#region src/gateway/hono/routes/media.ts
|
|
10
11
|
const log = createGatewayRouteLogger("Media");
|
|
11
12
|
function registerMediaRoutes(authenticated, deps) {
|
|
12
13
|
const tasks = new TaskRepository();
|
|
14
|
+
authenticated.post("/api/media", deps.strictRateLimitMiddleware, async (c) => {
|
|
15
|
+
const file = (await c.req.formData().catch(() => null))?.get("file");
|
|
16
|
+
if (!(file instanceof Blob)) return c.json({
|
|
17
|
+
ok: false,
|
|
18
|
+
error: { message: "Missing required file field: file" }
|
|
19
|
+
}, 400);
|
|
20
|
+
if (file.size === 0) return c.json({
|
|
21
|
+
ok: false,
|
|
22
|
+
error: { message: "Uploaded file is empty" }
|
|
23
|
+
}, 400);
|
|
24
|
+
if (file.size > 33554432) return c.json({
|
|
25
|
+
ok: false,
|
|
26
|
+
error: { message: "Uploaded file exceeds 32 MB limit" }
|
|
27
|
+
}, 413);
|
|
28
|
+
const name = "name" in file && typeof file.name === "string" && file.name.trim() ? file.name.trim() : `upload-${Date.now()}`;
|
|
29
|
+
const saved = await saveMediaBuffer(Buffer.from(await file.arrayBuffer()), {
|
|
30
|
+
bucket: "inbound",
|
|
31
|
+
contentType: file.type || "application/octet-stream",
|
|
32
|
+
maxBytes: MAX_WEBCHAT_ATTACHMENT_FILE_BYTES,
|
|
33
|
+
originalFilename: name
|
|
34
|
+
});
|
|
35
|
+
return c.json({
|
|
36
|
+
ok: true,
|
|
37
|
+
payload: {
|
|
38
|
+
uri: saved.uri,
|
|
39
|
+
mimeType: saved.contentType,
|
|
40
|
+
name,
|
|
41
|
+
size: saved.size
|
|
42
|
+
}
|
|
43
|
+
}, 201);
|
|
44
|
+
});
|
|
13
45
|
authenticated.get("/api/media/read", async (c) => {
|
|
14
46
|
const uriRaw = c.req.query("uri");
|
|
15
47
|
if (!uriRaw || typeof uriRaw !== "string") return c.json({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
|
|
2
1
|
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
2
|
+
import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
|
|
3
3
|
import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
|
|
4
4
|
import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
|
|
5
5
|
import { getModelRegistry } from "../../../providers/model-registry.js";
|