@getpaseo/server 0.1.100 → 0.1.102-beta.2
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/scripts/supervisor.js +26 -8
- package/dist/server/executable-resolution/windows.js +3 -0
- package/dist/server/server/agent/activity-curator.d.ts +17 -0
- package/dist/server/server/agent/activity-curator.js +101 -24
- package/dist/server/server/agent/agent-manager.d.ts +10 -0
- package/dist/server/server/agent/agent-manager.js +69 -27
- package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
- package/dist/server/server/agent/mcp-server.d.ts +2 -45
- package/dist/server/server/agent/mcp-server.js +45 -1985
- package/dist/server/server/agent/prompt-attachments.js +6 -2
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +12 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +132 -42
- package/dist/server/server/agent/providers/acp-agent.d.ts +27 -1
- package/dist/server/server/agent/providers/acp-agent.js +178 -27
- package/dist/server/server/agent/providers/claude/agent.js +111 -24
- package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
- package/dist/server/server/agent/providers/claude/query.js +4 -2
- package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -57
- package/dist/server/server/agent/providers/diagnostic-utils.d.ts +1 -0
- package/dist/server/server/agent/providers/diagnostic-utils.js +1 -1
- package/dist/server/server/agent/providers/generic-acp-agent.d.ts +3 -0
- package/dist/server/server/agent/providers/generic-acp-agent.js +41 -23
- package/dist/server/server/agent/providers/mock-load-test-agent.js +12 -2
- package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/paths.js +7 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
- package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
- package/dist/server/server/agent/providers/opencode-agent.js +14 -2
- package/dist/server/server/agent/providers/pi/agent.d.ts +5 -1
- package/dist/server/server/agent/providers/pi/agent.js +12 -3
- package/dist/server/server/agent/providers/provider-image-output.d.ts +5 -0
- package/dist/server/server/agent/providers/provider-image-output.js +61 -1
- package/dist/server/server/agent/tools/paseo-tools.d.ts +48 -0
- package/dist/server/server/agent/tools/paseo-tools.js +2119 -0
- package/dist/server/server/agent/tools/types.d.ts +36 -0
- package/dist/server/server/agent/tools/types.js +2 -0
- package/dist/server/server/bootstrap.d.ts +7 -1
- package/dist/server/server/bootstrap.js +89 -62
- package/dist/server/server/config.d.ts +2 -0
- package/dist/server/server/config.js +57 -1
- package/dist/server/server/daemon-worker.js +19 -7
- package/dist/server/server/lifecycle-reasons.d.ts +4 -0
- package/dist/server/server/lifecycle-reasons.js +6 -0
- package/dist/server/server/persisted-config.d.ts +12 -0
- package/dist/server/server/persisted-config.js +18 -2
- package/dist/server/server/process-diagnostics.d.ts +17 -0
- package/dist/server/server/process-diagnostics.js +22 -0
- package/dist/server/server/relay-transport.js +1 -0
- package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
- package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
- package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
- package/dist/server/server/session/checkout/checkout-session.d.ts +13 -15
- package/dist/server/server/session/checkout/checkout-session.js +18 -16
- package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
- package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
- package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
- package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
- package/dist/server/server/session/daemon/daemon-session.d.ts +26 -0
- package/dist/server/server/session/daemon/daemon-session.js +50 -0
- package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
- package/dist/server/server/session/daemon/diagnostics.js +431 -0
- package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
- package/dist/server/server/session/daemon/install-origin.js +64 -0
- package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
- package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
- package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
- package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
- package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
- package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
- package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
- package/dist/server/server/session.d.ts +12 -54
- package/dist/server/server/session.js +187 -970
- package/dist/server/server/speech/providers/openai/config.d.ts +1 -2
- package/dist/server/server/speech/providers/openai/config.js +13 -9
- package/dist/server/server/speech/providers/openai/runtime.js +2 -16
- package/dist/server/server/speech/providers/openai/stt.d.ts +1 -0
- package/dist/server/server/speech/providers/openai/stt.js +4 -2
- package/dist/server/server/speech/providers/openai/tts.d.ts +1 -0
- package/dist/server/server/speech/providers/openai/tts.js +1 -0
- package/dist/server/server/web-ui.d.ts +10 -0
- package/dist/server/server/web-ui.js +205 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts +23 -0
- package/dist/server/server/websocket-server.d.ts +4 -2
- package/dist/server/server/websocket-server.js +215 -52
- package/dist/server/server/worktree-bootstrap.d.ts +1 -1
- package/dist/server/server/worktree-branch-name-generator.js +3 -1
- package/dist/server/services/quota-fetcher/manifest.js +5 -0
- package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
- package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
- package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
- package/dist/server/utils/checkout-git.js +203 -25
- package/dist/server/utils/directory-suggestions.js +1 -4
- package/dist/server/utils/path.d.ts +2 -0
- package/dist/server/utils/path.js +13 -0
- package/dist/server/utils/worktree.d.ts +1 -0
- package/dist/server/utils/worktree.js +92 -11
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
- package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.gz +0 -0
- package/dist/server/web-ui/apple-touch-icon.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
- package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
- package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
- package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
- package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
- package/dist/server/web-ui/favicon.ico +0 -0
- package/dist/server/web-ui/index.html +90 -0
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/server/web-ui/manifest.json +27 -0
- package/dist/server/web-ui/manifest.json.br +0 -0
- package/dist/server/web-ui/manifest.json.gz +0 -0
- package/dist/server/web-ui/metadata.json +1 -0
- package/dist/server/web-ui/metadata.json.br +1 -0
- package/dist/server/web-ui/metadata.json.gz +0 -0
- package/dist/server/web-ui/pwa-icon-192.png +0 -0
- package/dist/server/web-ui/pwa-icon-512.png +0 -0
- package/dist/server/web-ui/robots.txt +2 -0
- package/dist/src/executable-resolution/windows.js +3 -0
- package/dist/src/server/persisted-config.js +18 -2
- package/package.json +7 -7
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +0 -42
- package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +0 -168
|
@@ -2,17 +2,16 @@ import type { PersistedConfig } from "../../../persisted-config.js";
|
|
|
2
2
|
import type { RequestedSpeechProviders } from "../../speech-types.js";
|
|
3
3
|
import type { STTConfig } from "./stt.js";
|
|
4
4
|
import type { TTSConfig } from "./tts.js";
|
|
5
|
-
export declare const DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL = "gpt-4o-transcribe";
|
|
6
5
|
export declare const DEFAULT_OPENAI_TTS_MODEL = "tts-1";
|
|
7
6
|
export interface OpenAiSpeechProviderConfig {
|
|
8
7
|
apiKey?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
9
|
stt?: Partial<STTConfig> & {
|
|
10
10
|
apiKey?: string;
|
|
11
11
|
};
|
|
12
12
|
tts?: Partial<TTSConfig> & {
|
|
13
13
|
apiKey?: string;
|
|
14
14
|
};
|
|
15
|
-
realtimeTranscriptionModel?: string;
|
|
16
15
|
}
|
|
17
16
|
export declare function resolveOpenAiSpeechConfig(params: {
|
|
18
17
|
env: NodeJS.ProcessEnv;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export const DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL = "gpt-4o-transcribe";
|
|
3
2
|
export const DEFAULT_OPENAI_TTS_MODEL = "tts-1";
|
|
4
3
|
const OpenAiTtsVoiceSchema = z.enum(["alloy", "echo", "fable", "onyx", "nova", "shimmer"]);
|
|
5
4
|
const OpenAiTtsModelSchema = z.enum(["tts-1", "tts-1-hd"]);
|
|
@@ -12,6 +11,7 @@ const OptionalTrimmedStringSchema = z
|
|
|
12
11
|
.transform((value) => (value && value.length > 0 ? value : undefined));
|
|
13
12
|
const OpenAiSpeechResolutionSchema = z.object({
|
|
14
13
|
apiKey: OptionalTrimmedStringSchema,
|
|
14
|
+
baseUrl: OptionalTrimmedStringSchema,
|
|
15
15
|
sttConfidenceThreshold: OptionalFiniteNumberSchema,
|
|
16
16
|
sttModel: OptionalTrimmedStringSchema,
|
|
17
17
|
ttsVoice: z.string().trim().toLowerCase().pipe(OpenAiTtsVoiceSchema).default("alloy"),
|
|
@@ -21,7 +21,6 @@ const OpenAiSpeechResolutionSchema = z.object({
|
|
|
21
21
|
.toLowerCase()
|
|
22
22
|
.pipe(OpenAiTtsModelSchema)
|
|
23
23
|
.default(DEFAULT_OPENAI_TTS_MODEL),
|
|
24
|
-
realtimeTranscriptionModel: OptionalTrimmedStringSchema.default(DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL),
|
|
25
24
|
});
|
|
26
25
|
function isOpenAiProviderActive(provider) {
|
|
27
26
|
return provider.enabled !== false && provider.provider === "openai";
|
|
@@ -49,11 +48,6 @@ function buildOpenAiSttInput(params) {
|
|
|
49
48
|
pickIfOpenAi(providers.voiceStt, persisted.features?.voiceMode?.stt?.model),
|
|
50
49
|
pickIfOpenAi(providers.dictationStt, persisted.features?.dictation?.stt?.model),
|
|
51
50
|
]),
|
|
52
|
-
realtimeTranscriptionModel: firstDefined([
|
|
53
|
-
env.OPENAI_REALTIME_TRANSCRIPTION_MODEL,
|
|
54
|
-
pickIfOpenAi(providers.dictationStt, persisted.features?.dictation?.stt?.model),
|
|
55
|
-
DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL,
|
|
56
|
-
]),
|
|
57
51
|
};
|
|
58
52
|
}
|
|
59
53
|
function buildOpenAiTtsInput(params) {
|
|
@@ -74,8 +68,16 @@ function buildOpenAiTtsInput(params) {
|
|
|
74
68
|
function buildOpenAiResolutionInput(params) {
|
|
75
69
|
return {
|
|
76
70
|
apiKey: firstDefined([
|
|
77
|
-
params.
|
|
71
|
+
params.persisted.providers?.openai?.voice?.apiKey,
|
|
72
|
+
params.env.OPENAI_VOICE_API_KEY,
|
|
78
73
|
params.persisted.providers?.openai?.apiKey,
|
|
74
|
+
params.env.OPENAI_API_KEY,
|
|
75
|
+
]),
|
|
76
|
+
baseUrl: firstDefined([
|
|
77
|
+
params.persisted.providers?.openai?.voice?.baseUrl,
|
|
78
|
+
params.env.OPENAI_VOICE_BASE_URL,
|
|
79
|
+
params.persisted.providers?.openai?.baseUrl,
|
|
80
|
+
params.env.OPENAI_BASE_URL,
|
|
79
81
|
]),
|
|
80
82
|
...buildOpenAiSttInput(params),
|
|
81
83
|
...buildOpenAiTtsInput(params),
|
|
@@ -88,8 +90,10 @@ export function resolveOpenAiSpeechConfig(params) {
|
|
|
88
90
|
}
|
|
89
91
|
return {
|
|
90
92
|
apiKey: parsed.apiKey,
|
|
93
|
+
...(parsed.baseUrl ? { baseUrl: parsed.baseUrl } : {}),
|
|
91
94
|
stt: {
|
|
92
95
|
apiKey: parsed.apiKey,
|
|
96
|
+
...(parsed.baseUrl ? { baseUrl: parsed.baseUrl } : {}),
|
|
93
97
|
...(parsed.sttConfidenceThreshold !== undefined
|
|
94
98
|
? { confidenceThreshold: parsed.sttConfidenceThreshold }
|
|
95
99
|
: {}),
|
|
@@ -97,11 +101,11 @@ export function resolveOpenAiSpeechConfig(params) {
|
|
|
97
101
|
},
|
|
98
102
|
tts: {
|
|
99
103
|
apiKey: parsed.apiKey,
|
|
104
|
+
...(parsed.baseUrl ? { baseUrl: parsed.baseUrl } : {}),
|
|
100
105
|
voice: parsed.ttsVoice,
|
|
101
106
|
model: parsed.ttsModel,
|
|
102
107
|
responseFormat: "pcm",
|
|
103
108
|
},
|
|
104
|
-
realtimeTranscriptionModel: parsed.realtimeTranscriptionModel,
|
|
105
109
|
};
|
|
106
110
|
}
|
|
107
111
|
//# sourceMappingURL=config.js.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { OpenAIRealtimeTranscriptionSession } from "./realtime-transcription-session.js";
|
|
1
|
+
import { DEFAULT_OPENAI_TTS_MODEL } from "./config.js";
|
|
3
2
|
import { OpenAISTT } from "./stt.js";
|
|
4
3
|
import { OpenAITTS } from "./tts.js";
|
|
5
4
|
function resolveOpenAiCredentials(openaiConfig) {
|
|
@@ -62,19 +61,6 @@ function createOpenAiTts(apiKey, openaiConfig, logger) {
|
|
|
62
61
|
...ttsConfig,
|
|
63
62
|
}, logger);
|
|
64
63
|
}
|
|
65
|
-
function createOpenAiDictationService(apiKey, openaiConfig) {
|
|
66
|
-
return {
|
|
67
|
-
id: "openai",
|
|
68
|
-
createSession: ({ logger: sessionLogger, language, prompt }) => new OpenAIRealtimeTranscriptionSession({
|
|
69
|
-
apiKey,
|
|
70
|
-
logger: sessionLogger,
|
|
71
|
-
transcriptionModel: openaiConfig?.realtimeTranscriptionModel ?? DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL,
|
|
72
|
-
...(language ? { language } : {}),
|
|
73
|
-
...(prompt ? { prompt } : {}),
|
|
74
|
-
turnDetection: null,
|
|
75
|
-
}),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
64
|
export function initializeOpenAiSpeechServices(params) {
|
|
79
65
|
const { providers, openaiConfig, existing, logger } = params;
|
|
80
66
|
const openAiCredentials = resolveOpenAiCredentials(openaiConfig);
|
|
@@ -100,7 +86,7 @@ export function initializeOpenAiSpeechServices(params) {
|
|
|
100
86
|
ttsService = createOpenAiTts(openAiCredentials.openaiTtsApiKey, openaiConfig, logger);
|
|
101
87
|
}
|
|
102
88
|
if (needsOpenAiDictation && openAiCredentials.openaiDictationApiKey) {
|
|
103
|
-
dictationSttService =
|
|
89
|
+
dictationSttService = createOpenAiStt(openAiCredentials.openaiDictationApiKey, openaiConfig, logger);
|
|
104
90
|
}
|
|
105
91
|
}
|
|
106
92
|
else if (needsAnyOpenAi) {
|
|
@@ -3,6 +3,7 @@ import type { LogprobToken, SpeechToTextProvider, StreamingTranscriptionSession,
|
|
|
3
3
|
export type { LogprobToken, TranscriptionResult };
|
|
4
4
|
export interface STTConfig {
|
|
5
5
|
apiKey: string;
|
|
6
|
+
baseUrl?: string;
|
|
6
7
|
model?: "whisper-1" | "gpt-4o-transcribe" | "gpt-4o-mini-transcribe" | (string & {});
|
|
7
8
|
confidenceThreshold?: number;
|
|
8
9
|
}
|
|
@@ -33,6 +33,7 @@ export class OpenAISTT {
|
|
|
33
33
|
this.logger = parentLogger.child({ module: "agent", provider: "openai", component: "stt" });
|
|
34
34
|
this.openaiClient = new OpenAI({
|
|
35
35
|
apiKey: sttConfig.apiKey,
|
|
36
|
+
...(sttConfig.baseUrl ? { baseURL: sttConfig.baseUrl } : {}),
|
|
36
37
|
});
|
|
37
38
|
this.logger.info({ model: sttConfig.model || "whisper-1" }, "STT (OpenAI Whisper) initialized");
|
|
38
39
|
}
|
|
@@ -102,7 +103,7 @@ export class OpenAISTT {
|
|
|
102
103
|
return;
|
|
103
104
|
}
|
|
104
105
|
const wav = convertPCMToWavBuffer(pcm16);
|
|
105
|
-
const result = await transcribeAudio(wav, "audio/wav", params.language ?? "en", logger);
|
|
106
|
+
const result = await transcribeAudio(wav, "audio/wav", params.language ?? "en", logger, params.prompt);
|
|
106
107
|
emitter.emit("transcript", {
|
|
107
108
|
segmentId: committedId,
|
|
108
109
|
transcript: result.text,
|
|
@@ -137,7 +138,7 @@ export class OpenAISTT {
|
|
|
137
138
|
},
|
|
138
139
|
};
|
|
139
140
|
}
|
|
140
|
-
async transcribeAudioInternal(audioBuffer, format, language, logger) {
|
|
141
|
+
async transcribeAudioInternal(audioBuffer, format, language, logger, prompt) {
|
|
141
142
|
const startTime = Date.now();
|
|
142
143
|
let tempFilePath = null;
|
|
143
144
|
try {
|
|
@@ -152,6 +153,7 @@ export class OpenAISTT {
|
|
|
152
153
|
file: await import("fs").then((fs) => fs.createReadStream(tempFilePath)),
|
|
153
154
|
language,
|
|
154
155
|
model: modelToUse,
|
|
156
|
+
...(prompt ? { prompt } : {}),
|
|
155
157
|
...(supportsLogprobs ? { include: includeLogprobs } : {}),
|
|
156
158
|
response_format: "json",
|
|
157
159
|
});
|
|
@@ -3,6 +3,7 @@ import type { SpeechStreamResult, TextToSpeechProvider } from "../../speech-prov
|
|
|
3
3
|
export type { SpeechStreamResult };
|
|
4
4
|
export interface TTSConfig {
|
|
5
5
|
apiKey: string;
|
|
6
|
+
baseUrl?: string;
|
|
6
7
|
model?: "tts-1" | "tts-1-hd";
|
|
7
8
|
voice?: "alloy" | "echo" | "fable" | "onyx" | "nova" | "shimmer";
|
|
8
9
|
responseFormat?: "mp3" | "opus" | "aac" | "flac" | "wav" | "pcm";
|
|
@@ -10,6 +10,7 @@ export class OpenAITTS {
|
|
|
10
10
|
this.logger = parentLogger.child({ module: "agent", provider: "openai", component: "tts" });
|
|
11
11
|
this.openaiClient = new OpenAI({
|
|
12
12
|
apiKey: ttsConfig.apiKey,
|
|
13
|
+
...(ttsConfig.baseUrl ? { baseURL: ttsConfig.baseUrl } : {}),
|
|
13
14
|
});
|
|
14
15
|
this.logger.info({ voice: this.config.voice, model: this.config.model, format: this.config.responseFormat }, "TTS (OpenAI) initialized");
|
|
15
16
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RequestHandler } from "express";
|
|
2
|
+
import type { Logger } from "pino";
|
|
3
|
+
export interface WebUiMiddlewareOptions {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
distDir: string | null;
|
|
6
|
+
label: string;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
}
|
|
9
|
+
export declare function createWebUiMiddleware(options: WebUiMiddlewareOptions): RequestHandler;
|
|
10
|
+
//# sourceMappingURL=web-ui.d.ts.map
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { createReadStream, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const EXCLUDED_PATH_PREFIXES = ["/api/", "/mcp/", "/public/"];
|
|
4
|
+
const EXCLUDED_PATHS = new Set(["/api", "/mcp", "/public"]);
|
|
5
|
+
function isExcludedPath(requestPath) {
|
|
6
|
+
for (const prefix of EXCLUDED_PATH_PREFIXES) {
|
|
7
|
+
if (requestPath.startsWith(prefix)) {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return EXCLUDED_PATHS.has(requestPath);
|
|
12
|
+
}
|
|
13
|
+
const CONTENT_TYPES = {
|
|
14
|
+
".html": "text/html; charset=utf-8",
|
|
15
|
+
".js": "application/javascript; charset=utf-8",
|
|
16
|
+
".mjs": "application/javascript; charset=utf-8",
|
|
17
|
+
".css": "text/css; charset=utf-8",
|
|
18
|
+
".json": "application/json; charset=utf-8",
|
|
19
|
+
".png": "image/png",
|
|
20
|
+
".jpg": "image/jpeg",
|
|
21
|
+
".jpeg": "image/jpeg",
|
|
22
|
+
".gif": "image/gif",
|
|
23
|
+
".svg": "image/svg+xml",
|
|
24
|
+
".ico": "image/x-icon",
|
|
25
|
+
".woff": "font/woff",
|
|
26
|
+
".woff2": "font/woff2",
|
|
27
|
+
".ttf": "font/ttf",
|
|
28
|
+
".otf": "font/otf",
|
|
29
|
+
".eot": "application/vnd.ms-fontobject",
|
|
30
|
+
".map": "application/json",
|
|
31
|
+
};
|
|
32
|
+
function getContentType(filePath) {
|
|
33
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
34
|
+
return CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
35
|
+
}
|
|
36
|
+
function selectEncoding(acceptEncoding) {
|
|
37
|
+
if (!acceptEncoding) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const normalized = acceptEncoding.toLowerCase();
|
|
41
|
+
if (normalized.includes("br")) {
|
|
42
|
+
return "br";
|
|
43
|
+
}
|
|
44
|
+
if (normalized.includes("gzip")) {
|
|
45
|
+
return "gzip";
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function isHashedAsset(filePath) {
|
|
50
|
+
const base = path.basename(filePath);
|
|
51
|
+
// Match content hashes like index-abc123def456.js or main.abc123def456.css.
|
|
52
|
+
return /[-.][0-9a-f]{16,}[-.]/i.test(base);
|
|
53
|
+
}
|
|
54
|
+
function isInsideDir(targetPath, dirPath) {
|
|
55
|
+
const resolvedDir = path.resolve(dirPath);
|
|
56
|
+
const resolvedTarget = path.resolve(targetPath);
|
|
57
|
+
return resolvedTarget === resolvedDir || resolvedTarget.startsWith(resolvedDir + path.sep);
|
|
58
|
+
}
|
|
59
|
+
function resolveTargetFile(distDir, requestPath) {
|
|
60
|
+
const safePath = path.normalize(requestPath).replace(/^(\.\.[/\\])+/, "");
|
|
61
|
+
let filePath = path.join(distDir, safePath);
|
|
62
|
+
const stat = safeStat(filePath);
|
|
63
|
+
if (stat?.isDirectory()) {
|
|
64
|
+
filePath = path.join(filePath, "index.html");
|
|
65
|
+
}
|
|
66
|
+
const finalStat = safeStat(filePath);
|
|
67
|
+
if (!finalStat?.isFile()) {
|
|
68
|
+
filePath = path.join(distDir, "index.html");
|
|
69
|
+
const fallbackStat = safeStat(filePath);
|
|
70
|
+
if (!fallbackStat?.isFile()) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!isInsideDir(filePath, distDir)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const resolvedFile = path.resolve(filePath);
|
|
78
|
+
const isIndexHtml = path.basename(resolvedFile).toLowerCase() === "index.html";
|
|
79
|
+
return { resolvedFile, isIndexHtml };
|
|
80
|
+
}
|
|
81
|
+
function safeStat(filePath) {
|
|
82
|
+
try {
|
|
83
|
+
return statSync(filePath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function resolveContentEncoding(resolvedFile, acceptEncoding) {
|
|
90
|
+
const encoding = selectEncoding(acceptEncoding);
|
|
91
|
+
if (!encoding) {
|
|
92
|
+
return { finalFile: resolvedFile, contentEncoding: null };
|
|
93
|
+
}
|
|
94
|
+
const compressedFile = `${resolvedFile}.${encoding === "br" ? "br" : "gz"}`;
|
|
95
|
+
const compressedStat = safeStat(compressedFile);
|
|
96
|
+
if (compressedStat?.isFile()) {
|
|
97
|
+
return { finalFile: compressedFile, contentEncoding: encoding };
|
|
98
|
+
}
|
|
99
|
+
return { finalFile: resolvedFile, contentEncoding: null };
|
|
100
|
+
}
|
|
101
|
+
function setResponseCacheHeaders(res, isIndexHtml, resolvedFile) {
|
|
102
|
+
if (isIndexHtml) {
|
|
103
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
|
|
104
|
+
res.setHeader("Pragma", "no-cache");
|
|
105
|
+
res.setHeader("Expires", "0");
|
|
106
|
+
}
|
|
107
|
+
else if (isHashedAsset(resolvedFile)) {
|
|
108
|
+
res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function createWebUiMiddleware(options) {
|
|
115
|
+
const { enabled, distDir, label, logger } = options;
|
|
116
|
+
const childLogger = logger.child({ module: "web-ui" });
|
|
117
|
+
if (!enabled || !distDir) {
|
|
118
|
+
childLogger.info({ enabled, hasDistDir: !!distDir }, "Daemon web UI disabled or missing dist directory");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
childLogger.info({ distDir }, "Daemon web UI mounted");
|
|
122
|
+
}
|
|
123
|
+
return (req, res, next) => {
|
|
124
|
+
if (req.method !== "GET" && req.method !== "HEAD") {
|
|
125
|
+
next();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (isExcludedPath(req.path)) {
|
|
129
|
+
next();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!enabled || !distDir) {
|
|
133
|
+
res.status(404).end();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
serveWebUiFile({ distDir, requestPath: req.path, label, req, res });
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function serveWebUiFile(options) {
|
|
140
|
+
const { distDir, requestPath, label, req, res } = options;
|
|
141
|
+
const target = resolveTargetFile(distDir, requestPath);
|
|
142
|
+
if (!target) {
|
|
143
|
+
res.status(404).end();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { resolvedFile, isIndexHtml } = target;
|
|
147
|
+
const acceptEncoding = isIndexHtml ? undefined : req.headers["accept-encoding"];
|
|
148
|
+
const { finalFile, contentEncoding } = resolveContentEncoding(resolvedFile, acceptEncoding);
|
|
149
|
+
res.setHeader("Content-Type", getContentType(resolvedFile));
|
|
150
|
+
if (contentEncoding) {
|
|
151
|
+
res.setHeader("Content-Encoding", contentEncoding);
|
|
152
|
+
res.setHeader("Vary", "Accept-Encoding");
|
|
153
|
+
}
|
|
154
|
+
setResponseCacheHeaders(res, isIndexHtml, resolvedFile);
|
|
155
|
+
if (req.method === "HEAD") {
|
|
156
|
+
res.status(200).end();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (isIndexHtml) {
|
|
160
|
+
sendIndexHtml(res, finalFile, req, label);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const stream = createReadStream(finalFile);
|
|
164
|
+
stream.on("error", () => {
|
|
165
|
+
if (!res.headersSent) {
|
|
166
|
+
res.status(500).end();
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
res.end();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
stream.pipe(res);
|
|
173
|
+
}
|
|
174
|
+
function sendIndexHtml(res, filePath, req, label) {
|
|
175
|
+
try {
|
|
176
|
+
const html = readFileSync(filePath, "utf-8");
|
|
177
|
+
const injected = injectConnectionHint(html, req, label);
|
|
178
|
+
res.status(200).send(injected);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
res.status(500).end();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function serializeInlineScriptJson(value) {
|
|
185
|
+
return JSON.stringify(value)
|
|
186
|
+
.replace(/</g, "\\u003C")
|
|
187
|
+
.replace(/>/g, "\\u003E")
|
|
188
|
+
.replace(/&/g, "\\u0026");
|
|
189
|
+
}
|
|
190
|
+
function injectConnectionHint(html, req, label) {
|
|
191
|
+
const host = typeof req.headers.host === "string" ? req.headers.host : "";
|
|
192
|
+
const useTls = req.protocol === "https";
|
|
193
|
+
const hint = {
|
|
194
|
+
listen: host,
|
|
195
|
+
useTls,
|
|
196
|
+
label,
|
|
197
|
+
};
|
|
198
|
+
const script = `<script>window.__PASEO_INITIAL_DAEMON_CONNECTION__=${serializeInlineScriptJson(hint)}</script>`;
|
|
199
|
+
const headClose = /<\/head>/i;
|
|
200
|
+
if (headClose.test(html)) {
|
|
201
|
+
return html.replace(headClose, `${script}</head>`);
|
|
202
|
+
}
|
|
203
|
+
return script + html;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=web-ui.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WSOutboundMessage } from "../messages.js";
|
|
2
|
+
import type { ProcessMemoryDiagnostics } from "../process-diagnostics.js";
|
|
2
3
|
export interface WebSocketRuntimeCounters {
|
|
3
4
|
connectedAwaitingHello: number;
|
|
4
5
|
helloResumed: number;
|
|
@@ -39,6 +40,28 @@ export interface WebSocketRuntimeMetricsSnapshot {
|
|
|
39
40
|
totalMs: number;
|
|
40
41
|
}>;
|
|
41
42
|
}
|
|
43
|
+
export interface WebSocketRuntimeDiagnosticSnapshot<TRuntime = unknown, TAgents = unknown> extends WebSocketRuntimeMetricsSnapshot {
|
|
44
|
+
collectedAt: string;
|
|
45
|
+
final: boolean;
|
|
46
|
+
sessions: {
|
|
47
|
+
activeConnections: number;
|
|
48
|
+
externalSessionKeys: number;
|
|
49
|
+
reconnectGraceSessions: number;
|
|
50
|
+
};
|
|
51
|
+
sockets: {
|
|
52
|
+
activeSockets: number;
|
|
53
|
+
pendingConnections: number;
|
|
54
|
+
};
|
|
55
|
+
eventLoopDelay: {
|
|
56
|
+
p50Ms: number;
|
|
57
|
+
p99Ms: number;
|
|
58
|
+
maxMs: number;
|
|
59
|
+
} | null;
|
|
60
|
+
uptimeSeconds: number;
|
|
61
|
+
memory: ProcessMemoryDiagnostics;
|
|
62
|
+
runtime: TRuntime;
|
|
63
|
+
agents: TAgents;
|
|
64
|
+
}
|
|
42
65
|
type Clock = () => number;
|
|
43
66
|
export declare class WebSocketRuntimeMetricsWindow {
|
|
44
67
|
private readonly clock;
|
|
@@ -26,6 +26,7 @@ import { type DaemonAuthConfig } from "./auth.js";
|
|
|
26
26
|
export interface ExternalSocketMetadata {
|
|
27
27
|
transport: "relay";
|
|
28
28
|
externalSessionKey?: string;
|
|
29
|
+
relayConnectionId?: string;
|
|
29
30
|
}
|
|
30
31
|
interface WebSocketServerConfig {
|
|
31
32
|
allowedOrigins: Set<string>;
|
|
@@ -50,8 +51,8 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
50
51
|
private readonly wss;
|
|
51
52
|
private readonly pendingConnections;
|
|
52
53
|
private readonly sessions;
|
|
54
|
+
private readonly socketIdentities;
|
|
53
55
|
private readonly externalSessionsByKey;
|
|
54
|
-
private readonly socketMessageQueues;
|
|
55
56
|
private readonly serverId;
|
|
56
57
|
private readonly daemonVersion;
|
|
57
58
|
private readonly daemonRuntimeConfig;
|
|
@@ -89,6 +90,7 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
89
90
|
private onBranchChanged;
|
|
90
91
|
private serverCapabilities;
|
|
91
92
|
private readonly runtimeMetrics;
|
|
93
|
+
private lastRuntimeMetricsSnapshot;
|
|
92
94
|
private runtimeMetricsInterval;
|
|
93
95
|
private eventLoopDelayMonitor;
|
|
94
96
|
private unsubscribeSpeechReadiness;
|
|
@@ -135,7 +137,6 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
135
137
|
private broadcastCapabilitiesUpdate;
|
|
136
138
|
private broadcastDaemonConfigChanged;
|
|
137
139
|
private bindSocketHandlers;
|
|
138
|
-
private enqueueRawMessage;
|
|
139
140
|
resolveVoiceSpeakHandler(callerAgentId: string): VoiceSpeakHandler | null;
|
|
140
141
|
resolveVoiceCallerContext(callerAgentId: string): VoiceCallerContext | null;
|
|
141
142
|
private detachSocket;
|
|
@@ -157,5 +158,6 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
157
158
|
private broadcastAgentAttention;
|
|
158
159
|
private broadcastTerminalAttention;
|
|
159
160
|
}
|
|
161
|
+
export declare function isWebSocketSameOrigin(origin: string | undefined, requestHost: string | null): boolean;
|
|
160
162
|
export {};
|
|
161
163
|
//# sourceMappingURL=websocket-server.d.ts.map
|