@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.
Files changed (172) hide show
  1. package/dist/scripts/supervisor.js +26 -8
  2. package/dist/server/executable-resolution/windows.js +3 -0
  3. package/dist/server/server/agent/activity-curator.d.ts +17 -0
  4. package/dist/server/server/agent/activity-curator.js +101 -24
  5. package/dist/server/server/agent/agent-manager.d.ts +10 -0
  6. package/dist/server/server/agent/agent-manager.js +69 -27
  7. package/dist/server/server/agent/agent-sdk-types.d.ts +15 -2
  8. package/dist/server/server/agent/mcp-server.d.ts +2 -45
  9. package/dist/server/server/agent/mcp-server.js +45 -1985
  10. package/dist/server/server/agent/prompt-attachments.js +6 -2
  11. package/dist/server/server/agent/provider-snapshot-manager.d.ts +12 -1
  12. package/dist/server/server/agent/provider-snapshot-manager.js +132 -42
  13. package/dist/server/server/agent/providers/acp-agent.d.ts +27 -1
  14. package/dist/server/server/agent/providers/acp-agent.js +178 -27
  15. package/dist/server/server/agent/providers/claude/agent.js +111 -24
  16. package/dist/server/server/agent/providers/claude/query.d.ts +3 -0
  17. package/dist/server/server/agent/providers/claude/query.js +4 -2
  18. package/dist/server/server/agent/providers/codex-app-server-agent.js +6 -57
  19. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +1 -0
  20. package/dist/server/server/agent/providers/diagnostic-utils.js +1 -1
  21. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +3 -0
  22. package/dist/server/server/agent/providers/generic-acp-agent.js +41 -23
  23. package/dist/server/server/agent/providers/mock-load-test-agent.js +12 -2
  24. package/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  25. package/dist/server/server/agent/providers/opencode/paths.js +7 -0
  26. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +2 -0
  27. package/dist/server/server/agent/providers/opencode/server-manager.js +34 -5
  28. package/dist/server/server/agent/providers/opencode-agent.d.ts +4 -0
  29. package/dist/server/server/agent/providers/opencode-agent.js +14 -2
  30. package/dist/server/server/agent/providers/pi/agent.d.ts +5 -1
  31. package/dist/server/server/agent/providers/pi/agent.js +12 -3
  32. package/dist/server/server/agent/providers/provider-image-output.d.ts +5 -0
  33. package/dist/server/server/agent/providers/provider-image-output.js +61 -1
  34. package/dist/server/server/agent/tools/paseo-tools.d.ts +48 -0
  35. package/dist/server/server/agent/tools/paseo-tools.js +2119 -0
  36. package/dist/server/server/agent/tools/types.d.ts +36 -0
  37. package/dist/server/server/agent/tools/types.js +2 -0
  38. package/dist/server/server/bootstrap.d.ts +7 -1
  39. package/dist/server/server/bootstrap.js +89 -62
  40. package/dist/server/server/config.d.ts +2 -0
  41. package/dist/server/server/config.js +57 -1
  42. package/dist/server/server/daemon-worker.js +19 -7
  43. package/dist/server/server/lifecycle-reasons.d.ts +4 -0
  44. package/dist/server/server/lifecycle-reasons.js +6 -0
  45. package/dist/server/server/persisted-config.d.ts +12 -0
  46. package/dist/server/server/persisted-config.js +18 -2
  47. package/dist/server/server/process-diagnostics.d.ts +17 -0
  48. package/dist/server/server/process-diagnostics.js +22 -0
  49. package/dist/server/server/relay-transport.js +1 -0
  50. package/dist/server/server/resolve-worktree-creation-intent.js +3 -1
  51. package/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  52. package/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  53. package/dist/server/server/session/checkout/checkout-session.d.ts +13 -15
  54. package/dist/server/server/session/checkout/checkout-session.js +18 -16
  55. package/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  56. package/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  57. package/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  58. package/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  59. package/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  60. package/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  61. package/dist/server/server/session/daemon/daemon-session.d.ts +26 -0
  62. package/dist/server/server/session/daemon/daemon-session.js +50 -0
  63. package/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  64. package/dist/server/server/session/daemon/diagnostics.js +431 -0
  65. package/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  66. package/dist/server/server/session/daemon/install-origin.js +64 -0
  67. package/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  68. package/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  69. package/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  70. package/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  71. package/dist/server/server/session/provider/provider-catalog-session.js +8 -4
  72. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  73. package/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  74. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  75. package/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  76. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  77. package/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  78. package/dist/server/server/session.d.ts +12 -54
  79. package/dist/server/server/session.js +187 -970
  80. package/dist/server/server/speech/providers/openai/config.d.ts +1 -2
  81. package/dist/server/server/speech/providers/openai/config.js +13 -9
  82. package/dist/server/server/speech/providers/openai/runtime.js +2 -16
  83. package/dist/server/server/speech/providers/openai/stt.d.ts +1 -0
  84. package/dist/server/server/speech/providers/openai/stt.js +4 -2
  85. package/dist/server/server/speech/providers/openai/tts.d.ts +1 -0
  86. package/dist/server/server/speech/providers/openai/tts.js +1 -0
  87. package/dist/server/server/web-ui.d.ts +10 -0
  88. package/dist/server/server/web-ui.js +205 -0
  89. package/dist/server/server/websocket/runtime-metrics.d.ts +23 -0
  90. package/dist/server/server/websocket-server.d.ts +4 -2
  91. package/dist/server/server/websocket-server.js +215 -52
  92. package/dist/server/server/worktree-bootstrap.d.ts +1 -1
  93. package/dist/server/server/worktree-branch-name-generator.js +3 -1
  94. package/dist/server/services/quota-fetcher/manifest.js +5 -0
  95. package/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  96. package/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  97. package/dist/server/terminal/agent-hooks/agent-hook-installer.js +2 -2
  98. package/dist/server/utils/checkout-git.js +203 -25
  99. package/dist/server/utils/directory-suggestions.js +1 -4
  100. package/dist/server/utils/path.d.ts +2 -0
  101. package/dist/server/utils/path.js +13 -0
  102. package/dist/server/utils/worktree.d.ts +1 -0
  103. package/dist/server/utils/worktree.js +92 -11
  104. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  105. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  106. package/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  107. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js +1 -0
  108. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.br +0 -0
  109. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-b01555c9b42665a03988c0a0032ef528.js.gz +0 -0
  110. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js +1 -0
  111. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.br +0 -0
  112. package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-648388eca5c510b496e1eddf523f70ff.js.gz +0 -0
  113. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js +16157 -0
  114. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.br +0 -0
  115. package/dist/server/web-ui/_expo/static/js/web/index-0ebbea2cd337f0c0680fdb3f8d4d5af3.js.gz +0 -0
  116. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js +1 -0
  117. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.br +0 -0
  118. package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c64fa2416284927857a39087fd8d1332.js.gz +0 -0
  119. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js +3 -0
  120. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.br +0 -0
  121. package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-a9784226715772edf87ef36c596599c2.js.gz +0 -0
  122. package/dist/server/web-ui/apple-touch-icon.png +0 -0
  123. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  124. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  125. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  126. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  127. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  128. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  129. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  130. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  131. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  132. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  133. package/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  134. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  135. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  136. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  137. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  138. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  139. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  140. package/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  141. package/dist/server/web-ui/assets/assets/images/editor-apps/antigravity.6e91a685c33435e0b466a56db86cf141.png +0 -0
  142. package/dist/server/web-ui/assets/assets/images/editor-apps/cursor.c31d6bce4fe9aadc3fe59962f4c4fcf3.png +0 -0
  143. package/dist/server/web-ui/assets/assets/images/editor-apps/file-explorer.3e15e8f72c825c85ce336bcb0cdef776.png +0 -0
  144. package/dist/server/web-ui/assets/assets/images/editor-apps/finder.7f68fc2c475621a672e1be09309d5567.png +0 -0
  145. package/dist/server/web-ui/assets/assets/images/editor-apps/vscode.832bdb4c685d930f1c864c793703600b.png +0 -0
  146. package/dist/server/web-ui/assets/assets/images/editor-apps/webstorm.aa5dc2cd8c20cc0a155c4c5c5ab3c5f5.png +0 -0
  147. package/dist/server/web-ui/assets/assets/images/editor-apps/zed.f3a670b7f9aa226da4fe53fb86f1abbd.png +0 -0
  148. package/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  149. package/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  150. package/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  151. package/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  152. package/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  153. package/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  154. package/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  155. package/dist/server/web-ui/favicon.ico +0 -0
  156. package/dist/server/web-ui/index.html +90 -0
  157. package/dist/server/web-ui/index.html.br +0 -0
  158. package/dist/server/web-ui/index.html.gz +0 -0
  159. package/dist/server/web-ui/manifest.json +27 -0
  160. package/dist/server/web-ui/manifest.json.br +0 -0
  161. package/dist/server/web-ui/manifest.json.gz +0 -0
  162. package/dist/server/web-ui/metadata.json +1 -0
  163. package/dist/server/web-ui/metadata.json.br +1 -0
  164. package/dist/server/web-ui/metadata.json.gz +0 -0
  165. package/dist/server/web-ui/pwa-icon-192.png +0 -0
  166. package/dist/server/web-ui/pwa-icon-512.png +0 -0
  167. package/dist/server/web-ui/robots.txt +2 -0
  168. package/dist/src/executable-resolution/windows.js +3 -0
  169. package/dist/src/server/persisted-config.js +18 -2
  170. package/package.json +7 -7
  171. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +0 -42
  172. 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.env.OPENAI_API_KEY,
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 { DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL, DEFAULT_OPENAI_TTS_MODEL, } from "./config.js";
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 = createOpenAiDictationService(openAiCredentials.openaiDictationApiKey, openaiConfig);
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