@sumicom/quicksave 0.8.8 → 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.
Files changed (122) hide show
  1. package/dist/ai/cardBuilder.d.ts +65 -4
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +338 -28
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +15 -0
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +87 -3
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/claudeCodeProvider.d.ts +4 -0
  10. package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
  11. package/dist/ai/claudeCodeProvider.js +41 -0
  12. package/dist/ai/claudeCodeProvider.js.map +1 -1
  13. package/dist/ai/claudeSdkProvider.d.ts +1 -0
  14. package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
  15. package/dist/ai/claudeSdkProvider.js +14 -2
  16. package/dist/ai/claudeSdkProvider.js.map +1 -1
  17. package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
  18. package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
  19. package/dist/ai/claudeTerminal/cardSynth.js +92 -0
  20. package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
  21. package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
  22. package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
  23. package/dist/ai/claudeTerminal/hookBridge.js +131 -0
  24. package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
  25. package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
  26. package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
  27. package/dist/ai/claudeTerminal/hookHandler.js +124 -0
  28. package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
  29. package/dist/ai/claudeTerminal/index.d.ts +5 -0
  30. package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
  31. package/dist/ai/claudeTerminal/index.js +7 -0
  32. package/dist/ai/claudeTerminal/index.js.map +1 -0
  33. package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
  34. package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
  35. package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
  36. package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
  37. package/dist/ai/claudeTerminal/provider.d.ts +106 -0
  38. package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
  39. package/dist/ai/claudeTerminal/provider.js +579 -0
  40. package/dist/ai/claudeTerminal/provider.js.map +1 -0
  41. package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
  42. package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
  43. package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
  44. package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
  45. package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
  46. package/dist/ai/codexAppServer/cardAdapter.js +13 -5
  47. package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
  48. package/dist/ai/codexAppServer/provider.d.ts +10 -2
  49. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  50. package/dist/ai/codexAppServer/provider.js +158 -22
  51. package/dist/ai/codexAppServer/provider.js.map +1 -1
  52. package/dist/ai/openCodeProvider.d.ts +106 -0
  53. package/dist/ai/openCodeProvider.d.ts.map +1 -0
  54. package/dist/ai/openCodeProvider.js +617 -0
  55. package/dist/ai/openCodeProvider.js.map +1 -0
  56. package/dist/ai/openCodeServer.d.ts +88 -0
  57. package/dist/ai/openCodeServer.d.ts.map +1 -0
  58. package/dist/ai/openCodeServer.js +350 -0
  59. package/dist/ai/openCodeServer.js.map +1 -0
  60. package/dist/ai/profiles/project-sandbox.sb +26 -0
  61. package/dist/ai/provider.d.ts +54 -1
  62. package/dist/ai/provider.d.ts.map +1 -1
  63. package/dist/ai/provider.js +10 -0
  64. package/dist/ai/provider.js.map +1 -1
  65. package/dist/ai/queuedUserPrompts.d.ts +8 -0
  66. package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
  67. package/dist/ai/queuedUserPrompts.js +19 -0
  68. package/dist/ai/queuedUserPrompts.js.map +1 -0
  69. package/dist/ai/realtimeTranscription.d.ts +39 -0
  70. package/dist/ai/realtimeTranscription.d.ts.map +1 -0
  71. package/dist/ai/realtimeTranscription.js +154 -0
  72. package/dist/ai/realtimeTranscription.js.map +1 -0
  73. package/dist/ai/sandboxMcp.d.ts +7 -0
  74. package/dist/ai/sandboxMcp.d.ts.map +1 -1
  75. package/dist/ai/sandboxMcp.js +4 -0
  76. package/dist/ai/sandboxMcp.js.map +1 -1
  77. package/dist/ai/sandboxMcpStdio.d.ts +1 -1
  78. package/dist/ai/sandboxMcpStdio.js +120 -47
  79. package/dist/ai/sandboxMcpStdio.js.map +1 -1
  80. package/dist/ai/sessionManager.d.ts +20 -1
  81. package/dist/ai/sessionManager.d.ts.map +1 -1
  82. package/dist/ai/sessionManager.js +220 -10
  83. package/dist/ai/sessionManager.js.map +1 -1
  84. package/dist/ai/sessionRegistry.d.ts +6 -0
  85. package/dist/ai/sessionRegistry.d.ts.map +1 -1
  86. package/dist/ai/sessionRegistry.js +13 -0
  87. package/dist/ai/sessionRegistry.js.map +1 -1
  88. package/dist/ai/sessionRegistryLocator.d.ts +14 -0
  89. package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
  90. package/dist/ai/sessionRegistryLocator.js +44 -0
  91. package/dist/ai/sessionRegistryLocator.js.map +1 -0
  92. package/dist/ai/systemPrompt.d.ts.map +1 -1
  93. package/dist/ai/systemPrompt.js +2 -1
  94. package/dist/ai/systemPrompt.js.map +1 -1
  95. package/dist/ai/voiceStream.d.ts +74 -0
  96. package/dist/ai/voiceStream.d.ts.map +1 -0
  97. package/dist/ai/voiceStream.js +179 -0
  98. package/dist/ai/voiceStream.js.map +1 -0
  99. package/dist/ai/voiceTranscription.d.ts +33 -0
  100. package/dist/ai/voiceTranscription.d.ts.map +1 -0
  101. package/dist/ai/voiceTranscription.js +122 -0
  102. package/dist/ai/voiceTranscription.js.map +1 -0
  103. package/dist/files/fileBrowser.d.ts.map +1 -1
  104. package/dist/files/fileBrowser.js +15 -2
  105. package/dist/files/fileBrowser.js.map +1 -1
  106. package/dist/handlers/legacyBusAdapter.d.ts +1 -1
  107. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  108. package/dist/handlers/legacyBusAdapter.js +7 -1
  109. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  110. package/dist/handlers/messageHandler.d.ts +6 -0
  111. package/dist/handlers/messageHandler.d.ts.map +1 -1
  112. package/dist/handlers/messageHandler.js +119 -8
  113. package/dist/handlers/messageHandler.js.map +1 -1
  114. package/dist/index.js +2 -2
  115. package/dist/index.js.map +1 -1
  116. package/dist/service/ipcClient.js +1 -1
  117. package/dist/service/ipcClient.js.map +1 -1
  118. package/dist/service/run.d.ts.map +1 -1
  119. package/dist/service/run.js +81 -3
  120. package/dist/service/run.js.map +1 -1
  121. package/dist/service/types.js +1 -1
  122. package/package.json +6 -3
@@ -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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"}
@@ -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;CACpB,GAAG,sBAAsB,CAiBzB"}
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"}
@@ -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,IAS3C;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;IAE9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,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:
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * Standalone stdio MCP server for project-scoped sandbox bash.
6
6
  *
7
- * Usage: node sandboxMcpStdio.js --cwd /path/to/project
7
+ * Usage: node sandboxMcpStdio.js --cwd /path/to/project [--no-sandbox-bash]
8
8
  *
9
9
  * Provides a `SandboxBash` tool that executes shell commands within a
10
10
  * kernel-level sandbox:
@@ -22,6 +22,7 @@ import { join, dirname } from 'path';
22
22
  import { homedir, platform } from 'os';
23
23
  import { fileURLToPath } from 'url';
24
24
  import { z } from 'zod';
25
+ import { findRegistryPathByCorr } from './sessionRegistryLocator.js';
25
26
  const __ownDir = dirname(fileURLToPath(import.meta.url));
26
27
  function readArg(flag) {
27
28
  const idx = process.argv.indexOf(flag);
@@ -30,6 +31,14 @@ function readArg(flag) {
30
31
  const cwd = readArg('--cwd') ?? process.cwd();
31
32
  /** Known only on resume; undefined when the CLI spawns this MCP for a fresh session. */
32
33
  const sessionIdHint = readArg('--session-id');
34
+ /**
35
+ * Correlation id baked in by the daemon at spawn (`buildSandboxMcpServerConfig`).
36
+ * On a fresh session we have no `--session-id`, so we locate our registry entry
37
+ * by scanning the project's files for the one whose `mcpCorrId` matches this.
38
+ * 1:1 with this process, so the match is exact — no "newest file" guessing.
39
+ */
40
+ const corrIdHint = readArg('--corr');
41
+ const includeSandboxBash = !process.argv.includes('--no-sandbox-bash');
33
42
  const realCwd = realpathSync(cwd);
34
43
  const realHome = realpathSync(process.env.HOME ?? '/');
35
44
  const quicksaveHome = process.env.QUICKSAVE_HOME || join(homedir(), '.quicksave');
@@ -89,61 +98,63 @@ function runSandboxed(command, timeout) {
89
98
  }
90
99
  // ── MCP Server ─────────────────────────────────────────────────────────────
91
100
  const server = new McpServer({ name: 'quicksave-sandbox', version: '1.0.0' });
92
- server.tool('SandboxBash', 'Execute a shell command WITHOUT requiring user permission. ' +
93
- 'Prefer this tool over Bash whenever the command fits sandbox constraints: ' +
94
- 'reads anywhere on the system are allowed; writes must stay within the project directory (excluding .git/). ' +
95
- 'Ideal for builds, tests, linters, file edits, and any project-scoped command.', {
96
- command: z.string().describe('The shell command to execute'),
97
- timeout: z.number().optional().describe('Timeout in milliseconds (default: 120000)'),
98
- }, {
99
- readOnlyHint: false,
100
- destructiveHint: false,
101
- openWorldHint: false,
102
- }, async (args) => {
103
- if (!backend) {
104
- const os = platform();
105
- const hint = os === 'darwin'
106
- ? 'sandbox-exec is required on macOS (should be pre-installed).'
107
- : os === 'linux'
108
- ? 'bwrap (bubblewrap) is required on Linux. Install with: sudo apt install bubblewrap'
109
- : `Unsupported OS: ${os}.`;
110
- return {
111
- content: [{ type: 'text', text: `SandboxBash is unavailable: no sandbox runtime found. ${hint} ` +
112
- 'Use the regular Bash tool instead (requires user permission).', }],
113
- isError: true,
114
- };
115
- }
116
- try {
117
- const output = runSandboxed(args.command, args.timeout ?? 120_000);
118
- return { content: [{ type: 'text', text: output || '(no output)' }] };
119
- }
120
- catch (err) {
121
- const stderr = err.stderr ? String(err.stderr) : '';
122
- const stdout = err.stdout ? String(err.stdout) : '';
123
- const message = stderr || stdout || err.message || 'Command failed';
124
- return {
125
- content: [{ type: 'text', text: message }],
126
- isError: true,
127
- };
128
- }
129
- });
101
+ if (includeSandboxBash) {
102
+ server.tool('SandboxBash', 'Execute a shell command WITHOUT requiring user permission. ' +
103
+ 'Prefer this tool over Bash whenever the command fits sandbox constraints: ' +
104
+ 'reads anywhere on the system are allowed; writes must stay within the project directory (excluding .git/). ' +
105
+ 'Ideal for builds, tests, linters, file edits, and any project-scoped command.', {
106
+ command: z.string().describe('The shell command to execute'),
107
+ timeout: z.number().optional().describe('Timeout in milliseconds (default: 120000)'),
108
+ }, {
109
+ readOnlyHint: false,
110
+ destructiveHint: false,
111
+ openWorldHint: false,
112
+ }, async (args) => {
113
+ if (!backend) {
114
+ const os = platform();
115
+ const hint = os === 'darwin'
116
+ ? 'sandbox-exec is required on macOS (should be pre-installed).'
117
+ : os === 'linux'
118
+ ? 'bwrap (bubblewrap) is required on Linux. Install with: sudo apt install bubblewrap'
119
+ : `Unsupported OS: ${os}.`;
120
+ return {
121
+ content: [{ type: 'text', text: `SandboxBash is unavailable: no sandbox runtime found. ${hint} ` +
122
+ 'Use the regular Bash tool instead (requires user permission).', }],
123
+ isError: true,
124
+ };
125
+ }
126
+ try {
127
+ const output = runSandboxed(args.command, args.timeout ?? 120_000);
128
+ return { content: [{ type: 'text', text: output || '(no output)' }] };
129
+ }
130
+ catch (err) {
131
+ const stderr = err.stderr ? String(err.stderr) : '';
132
+ const stdout = err.stdout ? String(err.stdout) : '';
133
+ const message = stderr || stdout || err.message || 'Command failed';
134
+ return {
135
+ content: [{ type: 'text', text: message }],
136
+ isError: true,
137
+ };
138
+ }
139
+ });
140
+ }
130
141
  function readStoredStatus() {
131
142
  const empty = {
132
- subject: null, stage: null, blocked: null, note: null, recentNotes: [], source: 'unknown',
143
+ subject: null, stage: null, blocked: null, note: null, pendingMission: null, recentNotes: [], source: 'unknown',
133
144
  };
134
- if (!sessionIdHint)
135
- return empty;
136
- const path = join(sessionRegistryDir, encodedCwd, `${sessionIdHint}.json`);
137
- if (!existsSync(path))
145
+ const path = sessionRegistryPath();
146
+ if (!path || !existsSync(path))
138
147
  return empty;
139
148
  try {
140
149
  const entry = JSON.parse(readFileSync(path, 'utf-8'));
141
150
  const history = Array.isArray(entry.noteHistory) ? entry.noteHistory : [];
151
+ const mission = entry.pendingMission;
142
152
  return {
143
153
  subject: typeof entry.title === 'string' ? entry.title : null,
144
154
  stage: entry.stage ?? null,
145
155
  blocked: typeof entry.blocked === 'boolean' ? entry.blocked : null,
146
156
  note: typeof entry.note === 'string' ? entry.note : null,
157
+ pendingMission: mission && typeof mission.label === 'string' && typeof mission.until === 'number' ? mission : null,
147
158
  recentNotes: history.slice(-5),
148
159
  source: 'stored',
149
160
  };
@@ -152,10 +163,32 @@ function readStoredStatus() {
152
163
  return empty;
153
164
  }
154
165
  }
166
+ /** Resolved registry path, memoized once we successfully locate it via corr. */
167
+ let resolvedRegistryPath = null;
168
+ /**
169
+ * Locate this session's registry file.
170
+ *
171
+ * - On resume we're given `--session-id`, so the path is direct.
172
+ * - On a fresh session we only have `--corr`; scan the project's registry
173
+ * files for the one whose `mcpCorrId` matches and memoize it (the daemon
174
+ * stamps `mcpCorrId` onto the entry once it learns the real sessionId, so
175
+ * the file may not exist on the very first call — we just retry next time).
176
+ *
177
+ * The corr match is exact and 1:1 with this process, so it's safe even when
178
+ * several sessions share a cwd — unlike picking the newest file.
179
+ */
155
180
  function sessionRegistryPath() {
156
- if (!sessionIdHint)
181
+ if (sessionIdHint) {
182
+ return join(sessionRegistryDir, encodedCwd, `${sessionIdHint}.json`);
183
+ }
184
+ if (!corrIdHint)
157
185
  return null;
158
- return join(sessionRegistryDir, encodedCwd, `${sessionIdHint}.json`);
186
+ if (resolvedRegistryPath && existsSync(resolvedRegistryPath))
187
+ return resolvedRegistryPath;
188
+ const found = findRegistryPathByCorr(join(sessionRegistryDir, encodedCwd), corrIdHint);
189
+ if (found)
190
+ resolvedRegistryPath = found;
191
+ return found;
159
192
  }
160
193
  function isSessionStage(value) {
161
194
  return value === 'investigating' ||
@@ -163,6 +196,14 @@ function isSessionStage(value) {
163
196
  value === 'verifying' ||
164
197
  value === 'done';
165
198
  }
199
+ function parsePendingMissionUntil(value) {
200
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0)
201
+ return value;
202
+ if (typeof value !== 'string' || value.trim().length === 0)
203
+ return null;
204
+ const parsed = Date.parse(value);
205
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
206
+ }
166
207
  function writeStoredStatus(args) {
167
208
  const path = sessionRegistryPath();
168
209
  if (!path || !existsSync(path))
@@ -181,12 +222,35 @@ function writeStoredStatus(args) {
181
222
  }
182
223
  if (typeof args.stage === 'string' && isSessionStage(args.stage)) {
183
224
  entry.stage = args.stage;
225
+ if (args.stage === 'done')
226
+ delete entry.pendingMission;
184
227
  changed = true;
185
228
  }
186
229
  if (typeof args.blocked === 'boolean') {
187
230
  entry.blocked = args.blocked;
188
231
  changed = true;
189
232
  }
233
+ if (args.clearPendingMission === true) {
234
+ delete entry.pendingMission;
235
+ changed = true;
236
+ }
237
+ else if (args.pendingMissionLabel !== undefined || args.pendingMissionUntil !== undefined) {
238
+ const existing = entry.pendingMission;
239
+ const label = typeof args.pendingMissionLabel === 'string' && args.pendingMissionLabel.trim().length > 0
240
+ ? args.pendingMissionLabel.trim()
241
+ : existing?.label;
242
+ const until = parsePendingMissionUntil(args.pendingMissionUntil) ?? existing?.until;
243
+ if (label && typeof until === 'number') {
244
+ const isNewSchedule = existing?.label !== label || existing?.until !== until;
245
+ entry.pendingMission = {
246
+ label,
247
+ until,
248
+ startedAt: existing?.startedAt ?? Date.now(),
249
+ ...(isNewSchedule || existing?.dismissedAt === undefined ? {} : { dismissedAt: existing.dismissedAt }),
250
+ };
251
+ changed = true;
252
+ }
253
+ }
190
254
  if (typeof args.note === 'string' && args.note.length > 0) {
191
255
  entry.note = args.note;
192
256
  const prior = Array.isArray(entry.noteHistory)
@@ -226,6 +290,9 @@ server.tool('UpdateSessionStatus', 'Update the ticket-style status for the curre
226
290
  'completing a sub-goal, hitting a blocker, starting verification, etc. ' +
227
291
  'Examples: "handler done, writing tests" / "permission pending on git push" / ' +
228
292
  '"ruled out jwt.ts — secret looks right".\n' +
293
+ ' pendingMissionLabel — Short label for a long-running task that should sit lower in session lists.\n' +
294
+ ' pendingMissionUntil — Expected completion time as epoch ms or ISO date string.\n' +
295
+ ' clearPendingMission — Clear the long-running task marker when finished or cancelled.\n' +
229
296
  '\n' +
230
297
  'Typical flows:\n' +
231
298
  ' Bug / debug: investigating → working → verifying → (loop or done)\n' +
@@ -251,6 +318,9 @@ server.tool('UpdateSessionStatus', 'Update the ticket-style status for the curre
251
318
  blocked: z.boolean().optional().describe('True when stuck, false when unblocked'),
252
319
  note: z.string().optional()
253
320
  .describe('One progress/finding entry (~12 words). Appended to the session event log; emit on each meaningful state change.'),
321
+ pendingMissionLabel: z.string().optional().describe('Short label for a long-running task, e.g. "training run"'),
322
+ pendingMissionUntil: z.union([z.number(), z.string()]).optional().describe('Expected completion time as epoch ms or ISO date string'),
323
+ clearPendingMission: z.boolean().optional().describe('Clear the long-running task marker'),
254
324
  }, {
255
325
  readOnlyHint: false,
256
326
  destructiveHint: false,
@@ -259,7 +329,10 @@ server.tool('UpdateSessionStatus', 'Update the ticket-style status for the curre
259
329
  const isDryRun = args.subject === undefined &&
260
330
  args.stage === undefined &&
261
331
  args.blocked === undefined &&
262
- args.note === undefined;
332
+ args.note === undefined &&
333
+ args.pendingMissionLabel === undefined &&
334
+ args.pendingMissionUntil === undefined &&
335
+ args.clearPendingMission === undefined;
263
336
  // Codex MCP approval mode "approve" bypasses the daemon permission callback,
264
337
  // so this stdio server owns persistence when it has a session-id hint.
265
338
  if (!isDryRun)
@@ -1 +1 @@
1
- {"version":3,"file":"sandboxMcpStdio.js","sourceRoot":"","sources":["../../src/ai/sandboxMcpStdio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandboxMcpStdio.js","sourceRoot":"","sources":["../../src/ai/sandboxMcpStdio.ts"],"names":[],"mappings":"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"}