@getpaseo/server 0.1.84 → 0.1.86

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 (60) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +1 -0
  2. package/dist/server/server/agent/agent-manager.d.ts +4 -0
  3. package/dist/server/server/agent/agent-manager.js +23 -0
  4. package/dist/server/server/agent/agent-metadata-generator.d.ts +9 -0
  5. package/dist/server/server/agent/agent-metadata-generator.js +11 -2
  6. package/dist/server/server/agent/agent-response-loop.d.ts +1 -1
  7. package/dist/server/server/agent/agent-response-loop.js +3 -13
  8. package/dist/server/server/agent/create-agent/create.d.ts +2 -0
  9. package/dist/server/server/agent/create-agent/create.js +7 -0
  10. package/dist/server/server/agent/create-agent-lifecycle-dispatch.js +0 -1
  11. package/dist/server/server/agent/import-sessions.d.ts +3 -0
  12. package/dist/server/server/agent/import-sessions.js +11 -0
  13. package/dist/server/server/agent/mcp-server.d.ts +0 -1
  14. package/dist/server/server/agent/mcp-server.js +0 -4
  15. package/dist/server/server/agent/providers/claude/agent.d.ts +2 -1
  16. package/dist/server/server/agent/providers/claude/agent.js +70 -0
  17. package/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  18. package/dist/server/server/agent/providers/claude/feature-definitions.js +36 -0
  19. package/dist/server/server/agent/providers/claude/models.js +19 -5
  20. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +6 -3
  21. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +5 -0
  22. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +62 -0
  23. package/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  24. package/dist/server/server/agent/structured-generation-providers.js +192 -0
  25. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +0 -2
  26. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +0 -1
  27. package/dist/server/server/bootstrap.d.ts +7 -0
  28. package/dist/server/server/bootstrap.js +11 -2
  29. package/dist/server/server/config.js +1 -0
  30. package/dist/server/server/daemon-config-store.js +46 -6
  31. package/dist/server/server/daemon-worker.js +1 -0
  32. package/dist/server/server/file-explorer/service.js +4 -4
  33. package/dist/server/server/paseo-worktree-archive-service.d.ts +2 -6
  34. package/dist/server/server/paseo-worktree-archive-service.js +13 -33
  35. package/dist/server/server/persisted-config.d.ts +77 -22
  36. package/dist/server/server/persisted-config.js +13 -0
  37. package/dist/server/server/schedule/service.d.ts +1 -0
  38. package/dist/server/server/schedule/service.js +15 -0
  39. package/dist/server/server/session.d.ts +3 -2
  40. package/dist/server/server/session.js +77 -25
  41. package/dist/server/server/speech/providers/local/runtime.js +52 -133
  42. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +9 -2
  43. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +7 -0
  44. package/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  45. package/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  46. package/dist/server/server/speech/providers/local/worker-client.d.ts +80 -0
  47. package/dist/server/server/speech/providers/local/worker-client.js +438 -0
  48. package/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  49. package/dist/server/server/speech/providers/local/worker-process.js +270 -0
  50. package/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  51. package/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  52. package/dist/server/server/websocket-server.js +2 -0
  53. package/dist/server/server/worktree-branch-name-generator.d.ts +9 -0
  54. package/dist/server/server/worktree-branch-name-generator.js +11 -2
  55. package/dist/server/utils/worktree.d.ts +1 -1
  56. package/dist/server/utils/worktree.js +2 -2
  57. package/dist/src/server/persisted-config.js +13 -0
  58. package/package.json +5 -10
  59. package/dist/server/utils/branch-slug.d.ts +0 -14
  60. package/dist/server/utils/branch-slug.js +0 -49
@@ -1,12 +1,5 @@
1
- import { getLocalSpeechModelDir, DEFAULT_LOCAL_STT_MODEL, DEFAULT_LOCAL_TTS_MODEL, LocalSttModelIdSchema, LocalTtsModelIdSchema, } from "./models.js";
2
- import { SherpaOfflineRecognizerEngine } from "./sherpa/sherpa-offline-recognizer.js";
3
- import { SherpaOnnxParakeetSTT } from "./sherpa/sherpa-parakeet-stt.js";
4
- import { SherpaParakeetRealtimeTranscriptionSession } from "./sherpa/sherpa-parakeet-realtime-session.js";
5
- import { SherpaOnnxTTS } from "./sherpa/sherpa-tts.js";
6
- import { ensureSileroVadModel, SherpaSileroTurnDetectionProvider, } from "./sherpa/silero-vad-provider.js";
7
- function buildModelDownloadHint(modelId) {
8
- return `Use 'paseo speech download --model ${modelId}' to download this model.`;
9
- }
1
+ import { DEFAULT_LOCAL_STT_MODEL, DEFAULT_LOCAL_TTS_MODEL, LocalSttModelIdSchema, LocalTtsModelIdSchema, } from "./models.js";
2
+ import { LocalSpeechWorkerClient, WorkerBackedSpeechToTextProvider, WorkerBackedTextToSpeechProvider, WorkerBackedTurnDetectionProvider, } from "./worker-client.js";
10
3
  function resolveConfiguredLocalModels(speechConfig) {
11
4
  return {
12
5
  dictationLocalSttModel: LocalSttModelIdSchema.parse(speechConfig?.local?.models.dictationStt ?? DEFAULT_LOCAL_STT_MODEL),
@@ -37,84 +30,27 @@ function computeRequiredLocalModelIds(params) {
37
30
  }
38
31
  return Array.from(ids);
39
32
  }
40
- async function createLocalSttEngine(params) {
41
- const { modelId, modelsDir, logger } = params;
42
- const modelDir = getLocalSpeechModelDir(modelsDir, modelId);
43
- return new SherpaOfflineRecognizerEngine({
44
- model: {
45
- kind: "nemo_transducer",
46
- encoder: `${modelDir}/encoder.int8.onnx`,
47
- decoder: `${modelDir}/decoder.int8.onnx`,
48
- joiner: `${modelDir}/joiner.int8.onnx`,
49
- tokens: `${modelDir}/tokens.txt`,
50
- },
51
- numThreads: 2,
52
- debug: 0,
53
- }, logger);
54
- }
55
33
  function isLocalProviderEnabled(provider) {
56
34
  return provider.enabled !== false && provider.provider === "local";
57
35
  }
58
- async function initializeLocalTurnDetection(localConfig, logger) {
59
- let vadModelPath;
60
- if (localConfig) {
61
- try {
62
- vadModelPath = await ensureSileroVadModel(localConfig.modelsDir, logger);
63
- }
64
- catch (err) {
65
- logger.warn({ err }, "Failed to provision Silero VAD model, falling back to bundled");
66
- }
67
- }
68
- return new SherpaSileroTurnDetectionProvider({ modelPath: vadModelPath }, logger);
36
+ function warnLocalConfigMissing(logger, feature) {
37
+ logger.warn({ configured: false }, `Local ${feature} selected but local provider config is missing; ${feature} will be unavailable`);
69
38
  }
70
- async function initializeLocalVoiceStt(params) {
71
- const { localConfig, modelId, logger, getLocalSttEngine } = params;
72
- if (!localConfig) {
73
- logger.warn({ configured: false }, "Local STT selected for voice but local provider config is missing; STT will be unavailable");
74
- return null;
75
- }
76
- const voiceEngine = await getLocalSttEngine(modelId);
77
- return voiceEngine ? new SherpaOnnxParakeetSTT({ engine: voiceEngine }, logger) : null;
39
+ function initializeLocalTurnDetection(params) {
40
+ const { client } = params;
41
+ return new WorkerBackedTurnDetectionProvider(client);
78
42
  }
79
- async function initializeLocalDictationStt(params) {
80
- const { localConfig, modelId, logger, getLocalSttEngine } = params;
81
- if (!localConfig) {
82
- logger.warn({ configured: false }, "Local STT selected for dictation but local provider config is missing; dictation STT will be unavailable");
83
- return null;
84
- }
85
- const dictationEngine = await getLocalSttEngine(modelId);
86
- if (dictationEngine) {
87
- return {
88
- id: "local",
89
- createSession: () => new SherpaParakeetRealtimeTranscriptionSession({ engine: dictationEngine }),
90
- };
91
- }
92
- return null;
43
+ function initializeLocalVoiceStt(params) {
44
+ const { client } = params;
45
+ return new WorkerBackedSpeechToTextProvider(client, "voiceStt");
93
46
  }
94
- async function initializeLocalVoiceTts(params) {
95
- const { localConfig, speechConfig, localModels, logger } = params;
96
- if (!localConfig) {
97
- logger.warn({ configured: false }, "Local TTS selected for voice but local provider config is missing; TTS will be unavailable");
98
- return null;
99
- }
100
- try {
101
- const modelDir = getLocalSpeechModelDir(localConfig.modelsDir, localModels.voiceLocalTtsModel);
102
- return new SherpaOnnxTTS({
103
- preset: localModels.voiceLocalTtsModel,
104
- modelDir,
105
- speakerId: speechConfig?.local?.models.voiceTtsSpeakerId,
106
- speed: speechConfig?.local?.models.voiceTtsSpeed,
107
- }, logger);
108
- }
109
- catch (err) {
110
- logger.warn({
111
- err,
112
- modelsDir: localConfig.modelsDir,
113
- modelId: localModels.voiceLocalTtsModel,
114
- hint: buildModelDownloadHint(localModels.voiceLocalTtsModel),
115
- }, "Local TTS engine unavailable");
116
- return null;
117
- }
47
+ function initializeLocalDictationStt(params) {
48
+ const { client } = params;
49
+ return new WorkerBackedSpeechToTextProvider(client, "dictationStt");
50
+ }
51
+ function initializeLocalVoiceTts(params) {
52
+ const { client } = params;
53
+ return new WorkerBackedTextToSpeechProvider(client);
118
54
  }
119
55
  export async function initializeLocalSpeechServices(params) {
120
56
  const { providers, logger, speechConfig } = params;
@@ -129,72 +65,55 @@ export async function initializeLocalSpeechServices(params) {
129
65
  providers,
130
66
  models: localModels,
131
67
  });
132
- const localSttEngines = new Map();
133
- const getLocalSttEngine = async (modelId) => {
134
- const existing = localSttEngines.get(modelId);
135
- if (existing) {
136
- return existing;
137
- }
138
- if (!localConfig) {
139
- return null;
140
- }
141
- try {
142
- const created = await createLocalSttEngine({
143
- modelId,
68
+ const workerClient = localConfig
69
+ ? new LocalSpeechWorkerClient({
70
+ config: {
144
71
  modelsDir: localConfig.modelsDir,
145
- logger,
146
- });
147
- localSttEngines.set(modelId, created);
148
- return created;
72
+ voiceSttModel: localModels.voiceLocalSttModel,
73
+ dictationSttModel: localModels.dictationLocalSttModel,
74
+ voiceTtsModel: localModels.voiceLocalTtsModel,
75
+ voiceTtsSpeakerId: speechConfig?.local?.models.voiceTtsSpeakerId,
76
+ voiceTtsSpeed: speechConfig?.local?.models.voiceTtsSpeed,
77
+ },
78
+ })
79
+ : null;
80
+ if (isLocalProviderEnabled(providers.voiceTurnDetection)) {
81
+ if (workerClient) {
82
+ turnDetectionService = initializeLocalTurnDetection({ client: workerClient });
149
83
  }
150
- catch (err) {
151
- logger.warn({
152
- err,
153
- modelsDir: localConfig.modelsDir,
154
- modelId,
155
- hint: buildModelDownloadHint(modelId),
156
- }, "Local STT engine unavailable");
157
- return null;
84
+ else {
85
+ warnLocalConfigMissing(logger, "turn detection");
158
86
  }
159
- };
160
- if (isLocalProviderEnabled(providers.voiceTurnDetection)) {
161
- turnDetectionService = await initializeLocalTurnDetection(localConfig, logger);
162
87
  }
163
88
  if (isLocalProviderEnabled(providers.voiceStt)) {
164
- sttService = await initializeLocalVoiceStt({
165
- localConfig,
166
- modelId: localModels.voiceLocalSttModel,
167
- logger,
168
- getLocalSttEngine,
169
- });
89
+ if (workerClient) {
90
+ sttService = initializeLocalVoiceStt({ client: workerClient });
91
+ }
92
+ else {
93
+ warnLocalConfigMissing(logger, "voice STT");
94
+ }
170
95
  }
171
96
  if (isLocalProviderEnabled(providers.dictationStt)) {
172
- dictationSttService = await initializeLocalDictationStt({
173
- localConfig,
174
- modelId: localModels.dictationLocalSttModel,
175
- logger,
176
- getLocalSttEngine,
177
- });
97
+ if (workerClient) {
98
+ dictationSttService = initializeLocalDictationStt({ client: workerClient });
99
+ }
100
+ else {
101
+ warnLocalConfigMissing(logger, "dictation STT");
102
+ }
178
103
  }
179
104
  if (isLocalProviderEnabled(providers.voiceTts)) {
180
- localVoiceTtsProvider = await initializeLocalVoiceTts({
181
- localConfig,
182
- speechConfig,
183
- localModels,
184
- logger,
185
- });
105
+ if (workerClient) {
106
+ localVoiceTtsProvider = initializeLocalVoiceTts({ client: workerClient });
107
+ }
108
+ else {
109
+ warnLocalConfigMissing(logger, "voice TTS");
110
+ }
186
111
  if (localVoiceTtsProvider) {
187
112
  ttsService = localVoiceTtsProvider;
188
113
  }
189
114
  }
190
115
  const cleanup = () => {
191
- const maybeFreeable = localVoiceTtsProvider;
192
- if (typeof maybeFreeable?.free === "function") {
193
- maybeFreeable.free();
194
- }
195
- for (const engine of localSttEngines.values()) {
196
- engine.free();
197
- }
116
+ workerClient?.shutdown();
198
117
  };
199
118
  return {
200
119
  turnDetectionService,
@@ -18,6 +18,13 @@ export declare const SHERPA_ONNX_MODEL_CATALOG: {
18
18
  readonly description: "NVIDIA Parakeet TDT v2 (offline NeMo transducer, English).";
19
19
  readonly defaultFor: "stt";
20
20
  };
21
+ readonly "parakeet-tdt-0.6b-v3-int8": {
22
+ readonly kind: "stt-offline";
23
+ readonly archiveUrl: "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8.tar.bz2";
24
+ readonly extractedDir: "sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8";
25
+ readonly requiredFiles: ["encoder.int8.onnx", "decoder.int8.onnx", "joiner.int8.onnx", "tokens.txt"];
26
+ readonly description: "NVIDIA Parakeet TDT v3 (offline NeMo transducer, 25 European languages, auto-detected).";
27
+ };
21
28
  readonly "kokoro-en-v0_19": {
22
29
  readonly kind: "tts";
23
30
  readonly archiveUrl: "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-en-v0_19.tar.bz2";
@@ -36,9 +43,9 @@ export type LocalSttModelId = ModelIdByKind<"stt-offline">;
36
43
  export type LocalTtsModelId = ModelIdByKind<"tts">;
37
44
  export declare const LOCAL_STT_MODEL_IDS: LocalSttModelId[];
38
45
  export declare const LOCAL_TTS_MODEL_IDS: LocalTtsModelId[];
39
- export declare const DEFAULT_LOCAL_STT_MODEL: "parakeet-tdt-0.6b-v2-int8";
46
+ export declare const DEFAULT_LOCAL_STT_MODEL: LocalSttModelId;
40
47
  export declare const DEFAULT_LOCAL_TTS_MODEL: "kokoro-en-v0_19";
41
- export declare const LocalSttModelIdSchema: z.ZodType<"parakeet-tdt-0.6b-v2-int8", z.ZodTypeDef, string>;
48
+ export declare const LocalSttModelIdSchema: z.ZodType<LocalSttModelId, z.ZodTypeDef, string>;
42
49
  export declare const LocalTtsModelIdSchema: z.ZodType<"kokoro-en-v0_19", z.ZodTypeDef, string>;
43
50
  export type SherpaOnnxModelSpec = SherpaOnnxCatalogEntry & {
44
51
  id: SherpaOnnxModelId;
@@ -8,6 +8,13 @@ export const SHERPA_ONNX_MODEL_CATALOG = {
8
8
  description: "NVIDIA Parakeet TDT v2 (offline NeMo transducer, English).",
9
9
  defaultFor: "stt",
10
10
  },
11
+ "parakeet-tdt-0.6b-v3-int8": {
12
+ kind: "stt-offline",
13
+ archiveUrl: "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8.tar.bz2",
14
+ extractedDir: "sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8",
15
+ requiredFiles: ["encoder.int8.onnx", "decoder.int8.onnx", "joiner.int8.onnx", "tokens.txt"],
16
+ description: "NVIDIA Parakeet TDT v3 (offline NeMo transducer, 25 European languages, auto-detected).",
17
+ },
11
18
  "kokoro-en-v0_19": {
12
19
  kind: "tts",
13
20
  archiveUrl: "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-en-v0_19.tar.bz2",
@@ -0,0 +1,4 @@
1
+ export type LocalSpeechWorkerBytes = ArrayBuffer;
2
+ export declare function bufferToWorkerBytes(buffer: Buffer): LocalSpeechWorkerBytes;
3
+ export declare function workerBytesToBuffer(bytes: LocalSpeechWorkerBytes): Buffer;
4
+ //# sourceMappingURL=worker-bytes.d.ts.map
@@ -0,0 +1,9 @@
1
+ export function bufferToWorkerBytes(buffer) {
2
+ const bytes = new Uint8Array(buffer.byteLength);
3
+ bytes.set(buffer);
4
+ return bytes.buffer;
5
+ }
6
+ export function workerBytesToBuffer(bytes) {
7
+ return Buffer.from(bytes);
8
+ }
9
+ //# sourceMappingURL=worker-bytes.js.map
@@ -0,0 +1,80 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type pino from "pino";
3
+ import type { SpeechStreamResult, SpeechToTextProvider, StreamingTranscriptionSession, TextToSpeechProvider } from "../../speech-provider.js";
4
+ import type { TurnDetectionProvider, TurnDetectionSession } from "../../turn-detection-provider.js";
5
+ import type { LocalSpeechSessionKind, LocalSpeechTranscriptionResult, LocalSpeechWorkerConfig, LocalSpeechWorkerRequest, LocalSpeechWorkerToParentMessage } from "./worker-protocol.js";
6
+ interface LocalSpeechWorkerProcess {
7
+ connected: boolean;
8
+ killed: boolean;
9
+ send(message: LocalSpeechWorkerRequest, callback: (error: Error | null) => void): boolean;
10
+ disconnect(): void;
11
+ kill(): boolean;
12
+ on(event: "message", listener: (message: LocalSpeechWorkerToParentMessage) => void): this;
13
+ on(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
14
+ }
15
+ interface LocalSpeechWorkerClientOptions {
16
+ config: LocalSpeechWorkerConfig;
17
+ requestTimeoutMs?: number;
18
+ idleTtlMs?: number;
19
+ forkWorker?: () => LocalSpeechWorkerProcess;
20
+ }
21
+ export declare class LocalSpeechWorkerClient {
22
+ private readonly config;
23
+ private readonly requestTimeoutMs;
24
+ private readonly idleTtlMs;
25
+ private readonly forkWorker;
26
+ private readonly pendingRequests;
27
+ private readonly activeSessionIds;
28
+ private readonly sessionEmitters;
29
+ private worker;
30
+ private inFlightRequests;
31
+ private idleTimer;
32
+ constructor(options: LocalSpeechWorkerClientOptions);
33
+ synthesizeSpeech(text: string): Promise<SpeechStreamResult>;
34
+ transcribeVoice(audio: Buffer, format: string): Promise<LocalSpeechTranscriptionResult>;
35
+ createSession(kind: LocalSpeechSessionKind, emitter: EventEmitter): Promise<{
36
+ sessionId: string;
37
+ requiredSampleRate: number;
38
+ }>;
39
+ appendSessionAudio(sessionId: string, audio: Buffer): void;
40
+ commitSession(sessionId: string): void;
41
+ clearSession(sessionId: string): void;
42
+ flushSession(sessionId: string): void;
43
+ resetSession(sessionId: string): void;
44
+ closeSession(sessionId: string): void;
45
+ shutdown(): void;
46
+ private sendRequest;
47
+ private ensureWorker;
48
+ private handleWorkerMessage;
49
+ private handleWorkerExit;
50
+ private rejectAllPending;
51
+ private emitSessionError;
52
+ private scheduleIdleShutdownIfReady;
53
+ private clearIdleTimer;
54
+ }
55
+ export declare class WorkerBackedTextToSpeechProvider implements TextToSpeechProvider {
56
+ private readonly client;
57
+ constructor(client: LocalSpeechWorkerClient);
58
+ synthesizeSpeech(text: string): Promise<SpeechStreamResult>;
59
+ }
60
+ export declare class WorkerBackedSpeechToTextProvider implements SpeechToTextProvider {
61
+ private readonly client;
62
+ private readonly kind;
63
+ readonly id: "local";
64
+ constructor(client: LocalSpeechWorkerClient, kind: Extract<LocalSpeechSessionKind, "voiceStt" | "dictationStt">);
65
+ createSession(_params: {
66
+ logger: pino.Logger;
67
+ language?: string;
68
+ prompt?: string;
69
+ }): StreamingTranscriptionSession;
70
+ }
71
+ export declare class WorkerBackedTurnDetectionProvider implements TurnDetectionProvider {
72
+ private readonly client;
73
+ readonly id: "local";
74
+ constructor(client: LocalSpeechWorkerClient);
75
+ createSession(_params: {
76
+ logger: pino.Logger;
77
+ }): TurnDetectionSession;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=worker-client.d.ts.map