@sumicom/quicksave 0.8.9 → 0.8.10
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/ai/cardBuilder.d.ts +62 -2
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +331 -25
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +14 -0
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +83 -2
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
- package/dist/ai/claudeCodeProvider.js +2 -0
- package/dist/ai/claudeCodeProvider.js.map +1 -1
- package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
- package/dist/ai/claudeSdkProvider.js +13 -2
- package/dist/ai/claudeSdkProvider.js.map +1 -1
- package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
- package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/cardSynth.js +92 -0
- package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.js +131 -0
- package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.js +124 -0
- package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
- package/dist/ai/claudeTerminal/index.d.ts +5 -0
- package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/index.js +7 -0
- package/dist/ai/claudeTerminal/index.js.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
- package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
- package/dist/ai/claudeTerminal/provider.d.ts +106 -0
- package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/provider.js +579 -0
- package/dist/ai/claudeTerminal/provider.js.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
- package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.js +13 -5
- package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
- package/dist/ai/codexAppServer/provider.d.ts +9 -2
- package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
- package/dist/ai/codexAppServer/provider.js +157 -22
- package/dist/ai/codexAppServer/provider.js.map +1 -1
- package/dist/ai/profiles/project-sandbox.sb +26 -0
- package/dist/ai/provider.d.ts +29 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +1 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/queuedUserPrompts.d.ts +8 -0
- package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
- package/dist/ai/queuedUserPrompts.js +19 -0
- package/dist/ai/queuedUserPrompts.js.map +1 -0
- package/dist/ai/realtimeTranscription.d.ts +39 -0
- package/dist/ai/realtimeTranscription.d.ts.map +1 -0
- package/dist/ai/realtimeTranscription.js +154 -0
- package/dist/ai/realtimeTranscription.js.map +1 -0
- package/dist/ai/sandboxMcp.d.ts +7 -0
- package/dist/ai/sandboxMcp.d.ts.map +1 -1
- package/dist/ai/sandboxMcp.js +4 -0
- package/dist/ai/sandboxMcp.js.map +1 -1
- package/dist/ai/sandboxMcpStdio.d.ts +1 -1
- package/dist/ai/sandboxMcpStdio.js +120 -47
- package/dist/ai/sandboxMcpStdio.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +14 -0
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +144 -3
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/sessionRegistry.d.ts +6 -0
- package/dist/ai/sessionRegistry.d.ts.map +1 -1
- package/dist/ai/sessionRegistry.js +13 -0
- package/dist/ai/sessionRegistry.js.map +1 -1
- package/dist/ai/sessionRegistryLocator.d.ts +14 -0
- package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
- package/dist/ai/sessionRegistryLocator.js +44 -0
- package/dist/ai/sessionRegistryLocator.js.map +1 -0
- package/dist/ai/systemPrompt.d.ts.map +1 -1
- package/dist/ai/systemPrompt.js +1 -0
- package/dist/ai/systemPrompt.js.map +1 -1
- package/dist/ai/voiceStream.d.ts +74 -0
- package/dist/ai/voiceStream.d.ts.map +1 -0
- package/dist/ai/voiceStream.js +179 -0
- package/dist/ai/voiceStream.js.map +1 -0
- package/dist/ai/voiceTranscription.d.ts +33 -0
- package/dist/ai/voiceTranscription.d.ts.map +1 -0
- package/dist/ai/voiceTranscription.js +122 -0
- package/dist/ai/voiceTranscription.js.map +1 -0
- package/dist/files/fileBrowser.d.ts.map +1 -1
- package/dist/files/fileBrowser.js +3 -2
- package/dist/files/fileBrowser.js.map +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
- package/dist/handlers/legacyBusAdapter.js +6 -1
- package/dist/handlers/legacyBusAdapter.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +5 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +100 -5
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/ipcClient.js.map +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +74 -3
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- package/package.json +6 -3
package/dist/ai/provider.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentId, Attachment, CardEvent, CardStreamEnd, ContextUsageBreakdown } from '@sumicom/quicksave-shared';
|
|
1
|
+
import type { AgentId, Attachment, CardEvent, CardStreamEnd, ContextUsageBreakdown, SessionQueueState } from '@sumicom/quicksave-shared';
|
|
2
2
|
import type { StreamCardBuilder } from './cardBuilder.js';
|
|
3
3
|
export declare const CLAUDE_PERMISSION_MODES: readonly ["default", "acceptEdits", "bypassPermissions", "plan", "auto"];
|
|
4
4
|
export declare const CODEX_PERMISSION_PRESETS: readonly ["read-only", "default", "auto-review", "full-access"];
|
|
@@ -15,9 +15,24 @@ export type ProviderHistoryMode = 'claude-jsonl' | 'memory';
|
|
|
15
15
|
/** Represents a running provider session. */
|
|
16
16
|
export interface ProviderSession {
|
|
17
17
|
sendUserMessage(prompt: string, attachments?: readonly Attachment[]): void;
|
|
18
|
+
interruptThenSendUserMessage?(prompt: string, attachments?: readonly Attachment[]): void;
|
|
18
19
|
interrupt(): void;
|
|
19
20
|
kill(): void;
|
|
20
21
|
readonly alive: boolean;
|
|
22
|
+
/** Optional — `terminalManager` terminal id when this provider owns a PTY
|
|
23
|
+
* the PWA should render alongside the structured card stream. Only the
|
|
24
|
+
* `claude-terminal` provider sets this today. SessionManager copies it into
|
|
25
|
+
* the session config so the PWA can pick it up via the existing
|
|
26
|
+
* config-updated channel. */
|
|
27
|
+
readonly terminalId?: string;
|
|
28
|
+
/** Optional in-memory queue snapshot for provider sessions that serialize
|
|
29
|
+
* user turns instead of accepting mid-turn input directly. */
|
|
30
|
+
getQueueState?(): SessionQueueState | null;
|
|
31
|
+
/** Optional — inject the provider's queued user message into the current
|
|
32
|
+
* active turn instead of waiting for the next turn. */
|
|
33
|
+
steerQueuedMessage?(opts?: {
|
|
34
|
+
interruptCurrentTurn?: boolean;
|
|
35
|
+
}): Promise<boolean> | boolean;
|
|
21
36
|
/** Optional — ask the provider for a breakdown of current context window
|
|
22
37
|
* usage. Only supported by the Claude Code CLI (via `get_context_usage`
|
|
23
38
|
* control_request). Returns null on providers that don't support it. */
|
|
@@ -56,6 +71,8 @@ export interface ProviderCallbacks {
|
|
|
56
71
|
* resets the 5-minute (or 1h) cache TTL on the server. SessionManager uses
|
|
57
72
|
* this to anchor the PWA's countdown without waiting for the turn to end. */
|
|
58
73
|
onCacheTouch?(sessionId: string): void;
|
|
74
|
+
/** Fired when a provider's in-memory user-message queue changes. */
|
|
75
|
+
onQueueStateChange?(sessionId: string): void;
|
|
59
76
|
onModelDetected(model: string): void;
|
|
60
77
|
/** Fired when the underlying provider process has fully exited. SessionManager
|
|
61
78
|
* uses this to remove the session from its in-memory map and emit
|
|
@@ -91,6 +108,10 @@ export interface StartSessionOpts {
|
|
|
91
108
|
* hook consults to auto-approve every tool. Presence of the file means bypass
|
|
92
109
|
* is active. Only ClaudeCliProvider uses it; other providers ignore it. */
|
|
93
110
|
bypassFlagPath?: string;
|
|
111
|
+
/** Correlation id minted by the daemon at spawn. Threaded into the sandbox
|
|
112
|
+
* MCP server's `--corr` so it can locate this session's registry entry
|
|
113
|
+
* before the real sessionId exists. See `sandboxMcp.ts` / `sandboxMcpStdio.ts`. */
|
|
114
|
+
mcpCorrId?: string;
|
|
94
115
|
}
|
|
95
116
|
export interface ResumeSessionOpts {
|
|
96
117
|
sessionId: string;
|
|
@@ -105,6 +126,9 @@ export interface ResumeSessionOpts {
|
|
|
105
126
|
reasoningEffort?: string;
|
|
106
127
|
contextWindow?: number;
|
|
107
128
|
bypassFlagPath?: string;
|
|
129
|
+
/** See {@link StartSessionOpts.mcpCorrId}. On resume the stdio server also
|
|
130
|
+
* gets `--session-id`, so this is belt-and-suspenders for cold re-spawns. */
|
|
131
|
+
mcpCorrId?: string;
|
|
108
132
|
}
|
|
109
133
|
export declare const DEFAULT_AGENT_LABELS: Record<AgentId, string>;
|
|
110
134
|
export declare function getAgentLabel(agentId: AgentId): string;
|
|
@@ -115,6 +139,10 @@ export interface AgentCapabilities {
|
|
|
115
139
|
supportsResume: boolean;
|
|
116
140
|
supportsSandbox: boolean;
|
|
117
141
|
supportsStreaming: boolean;
|
|
142
|
+
/** Opt-in only: true when attachments are forwarded into the provider turn. */
|
|
143
|
+
supportsAttachments?: true;
|
|
144
|
+
/** Positive list of attachment kinds the provider forwards. */
|
|
145
|
+
supportedAttachmentKinds?: Array<Attachment['kind']>;
|
|
118
146
|
}
|
|
119
147
|
export type ProbeResult = {
|
|
120
148
|
version?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/provider.js
CHANGED
package/dist/ai/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,MAAM;IACN,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,aAAa;CACL,CAAC;AAMX,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAgB,EAAE,KAAc;IAChF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,uBAAuB,CAAC,KAAK,CAAC;eAChC,KAAK,KAAK,mBAAmB;eAC7B,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,aAAa,CAAC;IAC/B,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAgB,EAChB,KAAc;IAEd,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,2EAA2E;QAC3E,IAAI,KAAK,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,WAAW,CAAC;QACzC,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,aAAa,CAAC;QAC3C,IAAI,KAAK,KAAK,aAAa;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,KAAsB;IAC7E,OAAO,OAAO,KAAK,OAAO;QACxB,CAAC,CAAC,KAAK,KAAK,aAAa;QACzB,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC;AACpC,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,MAAM;IACN,MAAM;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,aAAa;CACL,CAAC;AAMX,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAgB;IAC7D,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAgB,EAAE,KAAc;IAChF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,uBAAuB,CAAC,KAAK,CAAC;eAChC,KAAK,KAAK,mBAAmB;eAC7B,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,MAAM;eAChB,KAAK,KAAK,aAAa,CAAC;IAC/B,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAgB,EAChB,KAAc;IAEd,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,2EAA2E;QAC3E,IAAI,KAAK,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACxD,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,WAAW,CAAC;QACzC,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,aAAa,CAAC;QAC3C,IAAI,KAAK,KAAK,aAAa;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,KAAsB;IAC7E,OAAO,OAAO,KAAK,OAAO;QACxB,CAAC,CAAC,KAAK,KAAK,aAAa;QACzB,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC;AACpC,CAAC;AA2HD,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC3D,aAAa,EAAE,aAAa;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,UAAU;IACtB,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,oBAAoB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Attachment, SessionQueueState } from '@sumicom/quicksave-shared';
|
|
2
|
+
export interface QueuedUserPrompt {
|
|
3
|
+
prompt: string;
|
|
4
|
+
attachments?: readonly Attachment[];
|
|
5
|
+
}
|
|
6
|
+
export declare function previewQueuedPrompt(prompt: string): string;
|
|
7
|
+
export declare function queueStateFor(queued: readonly QueuedUserPrompt[], canInterruptCurrentTurn: boolean): SessionQueueState | null;
|
|
8
|
+
//# sourceMappingURL=queuedUserPrompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queuedUserPrompts.d.ts","sourceRoot":"","sources":["../../src/ai/queuedUserPrompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAI/E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,gBAAgB,EAAE,EACnC,uBAAuB,EAAE,OAAO,GAC/B,iBAAiB,GAAG,IAAI,CAS1B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const QUEUE_PREVIEW_MAX = 80;
|
|
2
|
+
export function previewQueuedPrompt(prompt) {
|
|
3
|
+
const normalized = prompt.replace(/\s+/g, ' ').trim();
|
|
4
|
+
return normalized.length > QUEUE_PREVIEW_MAX
|
|
5
|
+
? `${normalized.slice(0, QUEUE_PREVIEW_MAX - 3)}...`
|
|
6
|
+
: normalized;
|
|
7
|
+
}
|
|
8
|
+
export function queueStateFor(queued, canInterruptCurrentTurn) {
|
|
9
|
+
if (queued.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
const queuedPromptPreviews = queued.map((turn) => previewQueuedPrompt(turn.prompt));
|
|
12
|
+
return {
|
|
13
|
+
pendingUserMessages: queued.length,
|
|
14
|
+
latestPromptPreview: queuedPromptPreviews[queuedPromptPreviews.length - 1],
|
|
15
|
+
queuedPromptPreviews,
|
|
16
|
+
canInterruptCurrentTurn,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=queuedUserPrompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queuedUserPrompts.js","sourceRoot":"","sources":["../../src/ai/queuedUserPrompts.ts"],"names":[],"mappings":"AAIA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAO7B,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,UAAU,CAAC,MAAM,GAAG,iBAAiB;QAC1C,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,KAAK;QACpD,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAmC,EACnC,uBAAgC;IAEhC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,OAAO;QACL,mBAAmB,EAAE,MAAM,CAAC,MAAM;QAClC,mBAAmB,EAAE,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1E,oBAAoB;QACpB,uBAAuB;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { VoiceConfig } from '@sumicom/quicksave-shared';
|
|
2
|
+
export interface RealtimeCallbacks {
|
|
3
|
+
onPartial(text: string): void;
|
|
4
|
+
onFinal(text: string): void;
|
|
5
|
+
onError(message: string): void;
|
|
6
|
+
onClose?(): void;
|
|
7
|
+
}
|
|
8
|
+
/** Minimal surface we use from a WebSocket; satisfied by `ws`. */
|
|
9
|
+
export interface RealtimeSocket {
|
|
10
|
+
send(data: string): void;
|
|
11
|
+
close(): void;
|
|
12
|
+
on(event: 'open' | 'message' | 'error' | 'close', cb: (arg?: unknown) => void): void;
|
|
13
|
+
}
|
|
14
|
+
export type SocketFactory = (url: string, headers: Record<string, string>) => RealtimeSocket;
|
|
15
|
+
/** Derive the realtime WS URL from an http(s) base URL. */
|
|
16
|
+
export declare function realtimeUrl(baseUrl: string): string;
|
|
17
|
+
export declare class RealtimeTranscriber {
|
|
18
|
+
private readonly config;
|
|
19
|
+
private readonly sampleRate;
|
|
20
|
+
private readonly cb;
|
|
21
|
+
private readonly factory;
|
|
22
|
+
private socket;
|
|
23
|
+
private opened;
|
|
24
|
+
private closed;
|
|
25
|
+
private appendedSinceCommit;
|
|
26
|
+
private readonly pending;
|
|
27
|
+
constructor(config: VoiceConfig, sampleRate: number, cb: RealtimeCallbacks, factory?: SocketFactory);
|
|
28
|
+
start(): void;
|
|
29
|
+
/** Queue a frame of PCM16 mono audio for transcription. */
|
|
30
|
+
appendAudio(pcm16: Buffer | Uint8Array): void;
|
|
31
|
+
/** Signal end-of-utterance so the server finalizes the transcript. Skipped
|
|
32
|
+
* when nothing new was appended (server VAD may have already committed). */
|
|
33
|
+
commit(): void;
|
|
34
|
+
close(): void;
|
|
35
|
+
private send;
|
|
36
|
+
private rawSend;
|
|
37
|
+
private handleMessage;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=realtimeTranscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtimeTranscription.d.ts","sourceRoot":"","sources":["../../src/ai/realtimeTranscription.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CACtF;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,cAAc,CAAC;AAK7F,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,qBAAa,mBAAmB;IAQ5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAGrB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,aAA8B;IAG1D,KAAK,IAAI,IAAI;IA+Cb,2DAA2D;IAC3D,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAM7C;iFAC6E;IAC7E,MAAM,IAAI,IAAI;IAMd,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,aAAa;CA+BtB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 King Young Technology
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* Agent-side bridge to a streaming, OpenAI-Realtime-compatible transcription
|
|
5
|
+
* API. Runs on the agent (Node) so there is no browser CORS limit and the same
|
|
6
|
+
* code path serves OpenAI's hosted endpoint and self-hosted servers that speak
|
|
7
|
+
* the Realtime protocol.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle: construct → `start()` (opens the WS, configures the session) →
|
|
10
|
+
* `appendAudio(pcm16)` repeatedly as frames arrive → `commit()` at end of
|
|
11
|
+
* utterance → `close()`. Partial/final transcripts arrive via callbacks.
|
|
12
|
+
*
|
|
13
|
+
* The `ws` constructor is injectable so unit tests can drive the protocol
|
|
14
|
+
* without a real socket.
|
|
15
|
+
*/
|
|
16
|
+
import WS from 'ws';
|
|
17
|
+
const defaultFactory = (url, headers) => new WS(url, { headers });
|
|
18
|
+
/** Derive the realtime WS URL from an http(s) base URL. */
|
|
19
|
+
export function realtimeUrl(baseUrl) {
|
|
20
|
+
const trimmed = baseUrl.trim().replace(/\/+$/, '');
|
|
21
|
+
const ws = trimmed.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:');
|
|
22
|
+
return `${ws}/realtime?intent=transcription`;
|
|
23
|
+
}
|
|
24
|
+
export class RealtimeTranscriber {
|
|
25
|
+
config;
|
|
26
|
+
sampleRate;
|
|
27
|
+
cb;
|
|
28
|
+
factory;
|
|
29
|
+
socket = null;
|
|
30
|
+
opened = false;
|
|
31
|
+
closed = false;
|
|
32
|
+
appendedSinceCommit = false;
|
|
33
|
+
pending = [];
|
|
34
|
+
constructor(config, sampleRate, cb, factory = defaultFactory) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
this.sampleRate = sampleRate;
|
|
37
|
+
this.cb = cb;
|
|
38
|
+
this.factory = factory;
|
|
39
|
+
}
|
|
40
|
+
start() {
|
|
41
|
+
if (!(this.sampleRate > 0)) {
|
|
42
|
+
this.cb.onError('Invalid audio sample rate');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!this.config.streamModel.trim()) {
|
|
46
|
+
this.cb.onError('No streaming model configured. Set a realtime model (e.g. gpt-4o-transcribe) in Settings.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// GA Realtime API: no `OpenAI-Beta` header (the beta interface is gone).
|
|
50
|
+
const headers = {};
|
|
51
|
+
if (this.config.apiKey.trim())
|
|
52
|
+
headers.Authorization = `Bearer ${this.config.apiKey.trim()}`;
|
|
53
|
+
const socket = this.factory(realtimeUrl(this.config.baseUrl), headers);
|
|
54
|
+
this.socket = socket;
|
|
55
|
+
socket.on('open', () => {
|
|
56
|
+
this.opened = true;
|
|
57
|
+
// Configure the transcription session (GA shape): raw PCM16 in at our
|
|
58
|
+
// capture rate, chosen model. `gpt-realtime-whisper` requires manual
|
|
59
|
+
// commit (no server VAD), which matches our explicit `commit()`.
|
|
60
|
+
this.rawSend(JSON.stringify({
|
|
61
|
+
type: 'session.update',
|
|
62
|
+
session: {
|
|
63
|
+
type: 'transcription',
|
|
64
|
+
audio: {
|
|
65
|
+
input: {
|
|
66
|
+
format: { type: 'audio/pcm', rate: this.sampleRate },
|
|
67
|
+
transcription: { model: this.config.streamModel.trim() },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
}));
|
|
72
|
+
for (const msg of this.pending.splice(0))
|
|
73
|
+
this.rawSend(msg);
|
|
74
|
+
});
|
|
75
|
+
socket.on('message', (data) => this.handleMessage(data));
|
|
76
|
+
socket.on('error', (err) => {
|
|
77
|
+
this.cb.onError(err instanceof Error ? err.message : 'Realtime socket error');
|
|
78
|
+
});
|
|
79
|
+
socket.on('close', () => {
|
|
80
|
+
this.closed = true;
|
|
81
|
+
this.cb.onClose?.();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Queue a frame of PCM16 mono audio for transcription. */
|
|
85
|
+
appendAudio(pcm16) {
|
|
86
|
+
const audio = Buffer.from(pcm16).toString('base64');
|
|
87
|
+
this.appendedSinceCommit = true;
|
|
88
|
+
this.send(JSON.stringify({ type: 'input_audio_buffer.append', audio }));
|
|
89
|
+
}
|
|
90
|
+
/** Signal end-of-utterance so the server finalizes the transcript. Skipped
|
|
91
|
+
* when nothing new was appended (server VAD may have already committed). */
|
|
92
|
+
commit() {
|
|
93
|
+
if (!this.appendedSinceCommit)
|
|
94
|
+
return;
|
|
95
|
+
this.appendedSinceCommit = false;
|
|
96
|
+
this.send(JSON.stringify({ type: 'input_audio_buffer.commit' }));
|
|
97
|
+
}
|
|
98
|
+
close() {
|
|
99
|
+
this.closed = true;
|
|
100
|
+
this.socket?.close();
|
|
101
|
+
this.socket = null;
|
|
102
|
+
}
|
|
103
|
+
send(msg) {
|
|
104
|
+
if (this.closed)
|
|
105
|
+
return;
|
|
106
|
+
if (!this.opened) {
|
|
107
|
+
this.pending.push(msg);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.rawSend(msg);
|
|
111
|
+
}
|
|
112
|
+
rawSend(msg) {
|
|
113
|
+
try {
|
|
114
|
+
this.socket?.send(msg);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
this.cb.onError(err instanceof Error ? err.message : 'Failed to send to realtime socket');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
handleMessage(data) {
|
|
121
|
+
let evt;
|
|
122
|
+
try {
|
|
123
|
+
const text = typeof data === 'string' ? data : Buffer.isBuffer(data) ? data.toString('utf8') : String(data);
|
|
124
|
+
evt = JSON.parse(text);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return; // ignore unparseable frames
|
|
128
|
+
}
|
|
129
|
+
const type = typeof evt.type === 'string' ? evt.type : '';
|
|
130
|
+
// Tolerant matching so minor schema drift across providers/versions still
|
|
131
|
+
// routes partial vs final correctly.
|
|
132
|
+
if (type.endsWith('input_audio_transcription.delta')) {
|
|
133
|
+
if (typeof evt.delta === 'string' && evt.delta.length > 0)
|
|
134
|
+
this.cb.onPartial(evt.delta);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (type.endsWith('input_audio_transcription.completed')) {
|
|
138
|
+
if (typeof evt.transcript === 'string')
|
|
139
|
+
this.cb.onFinal(evt.transcript);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (type === 'error') {
|
|
143
|
+
const code = typeof evt.error?.code === 'string' ? evt.error.code : '';
|
|
144
|
+
const msg = typeof evt.error?.message === 'string' ? evt.error.message : 'Realtime API error';
|
|
145
|
+
// Benign: committing an empty/too-short buffer — typically because server
|
|
146
|
+
// VAD already flushed it. Recognition is unaffected, so don't surface it.
|
|
147
|
+
if (code === 'input_audio_buffer_commit_empty' || /buffer too small|buffer is empty/i.test(msg)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
this.cb.onError(msg);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=realtimeTranscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtimeTranscription.js","sourceRoot":"","sources":["../../src/ai/realtimeTranscription.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/sandboxMcp.d.ts
CHANGED
|
@@ -46,5 +46,12 @@ export declare function buildSandboxMcpServerConfig(opts: {
|
|
|
46
46
|
cwd: string;
|
|
47
47
|
/** When resuming, lets the server's UpdateSessionStatus dry-run read the registry file. */
|
|
48
48
|
sessionId?: string;
|
|
49
|
+
/** Correlation id for fresh sessions, where `sessionId` isn't known yet at
|
|
50
|
+
* spawn. Becomes `--corr`; the stdio server resolves its registry file by
|
|
51
|
+
* matching this against each entry's `mcpCorrId`. See `sandboxMcpStdio.ts`. */
|
|
52
|
+
corrId?: string;
|
|
53
|
+
/** Hide SandboxBash from the MCP inventory. Codex has native shell execution
|
|
54
|
+
* and only needs UpdateSessionStatus from this server. */
|
|
55
|
+
includeSandboxBash?: boolean;
|
|
49
56
|
}): SandboxMcpServerConfig;
|
|
50
57
|
//# sourceMappingURL=sandboxMcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandboxMcp.d.ts","sourceRoot":"","sources":["../../src/ai/sandboxMcp.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAKH,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,kBAAkB,6BAA+B,CAAC;AAC/D,eAAO,MAAM,iBAAiB,wCAAqC,CAAC;AACpE,eAAO,MAAM,0BAA0B,gDAA6C,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD;;wFAEoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"sandboxMcp.d.ts","sourceRoot":"","sources":["../../src/ai/sandboxMcp.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAKH,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AACpD,eAAO,MAAM,kBAAkB,6BAA+B,CAAC;AAC/D,eAAO,MAAM,iBAAiB,wCAAqC,CAAC;AACpE,eAAO,MAAM,0BAA0B,gDAA6C,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD;;wFAEoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;oFAEgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;+DAC2D;IAC3D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,sBAAsB,CAmBzB"}
|
package/dist/ai/sandboxMcp.js
CHANGED
|
@@ -50,6 +50,10 @@ export function buildSandboxMcpServerConfig(opts) {
|
|
|
50
50
|
const args = [scriptPath, '--cwd', opts.cwd];
|
|
51
51
|
if (opts.sessionId)
|
|
52
52
|
args.push('--session-id', opts.sessionId);
|
|
53
|
+
if (opts.corrId)
|
|
54
|
+
args.push('--corr', opts.corrId);
|
|
55
|
+
if (opts.includeSandboxBash === false)
|
|
56
|
+
args.push('--no-sandbox-bash');
|
|
53
57
|
return { type: 'stdio', command, args };
|
|
54
58
|
}
|
|
55
59
|
//# sourceMappingURL=sandboxMcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandboxMcp.js","sourceRoot":"","sources":["../../src/ai/sandboxMcp.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+BAA+B;AAC/B;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,6FAA6F;AAC7F,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,gBAAgB,IAAI,CAAC;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,aAAa,CAAC;AACpE,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,kBAAkB,qBAAqB,CAAC;AAQrF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,2BAA2B,CAAC,
|
|
1
|
+
{"version":3,"file":"sandboxMcp.js","sourceRoot":"","sources":["../../src/ai/sandboxMcp.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+BAA+B;AAC/B;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,6FAA6F;AAC7F,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,gBAAgB,IAAI,CAAC;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,aAAa,CAAC;AACpE,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,kBAAkB,qBAAqB,CAAC;AAQrF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAgB3C;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEjC,wEAAwE;IACxE,+BAA+B;IAC/B,6EAA6E;IAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC;QAC9D,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAEtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Standalone stdio MCP server for project-scoped sandbox bash.
|
|
4
4
|
*
|
|
5
|
-
* Usage: node sandboxMcpStdio.js --cwd /path/to/project
|
|
5
|
+
* Usage: node sandboxMcpStdio.js --cwd /path/to/project [--no-sandbox-bash]
|
|
6
6
|
*
|
|
7
7
|
* Provides a `SandboxBash` tool that executes shell commands within a
|
|
8
8
|
* kernel-level sandbox:
|