tide-commander 1.66.2 → 1.67.0
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/assets/{BossLogsModal-0wLAFY8o.js → BossLogsModal-DCwS2sUl.js} +1 -1
- package/dist/assets/{BossSpawnModal-KmlORzV6.js → BossSpawnModal-G7rDRY0s.js} +1 -1
- package/dist/assets/{ControlsModal-D6AByCGe.js → ControlsModal-CGRAjHup.js} +1 -1
- package/dist/assets/{DockerLogsModal-Bp1jShxL.js → DockerLogsModal-D2Q30Fua.js} +1 -1
- package/dist/assets/{EmbeddedEditor-BfzqmAfy.js → EmbeddedEditor-0YnlrcwV.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-BkryQqkx.js → GmailOAuthSetup-jvEwPGIi.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-D7GJc_Tp.js → GoogleOAuthSetup-BtG-j2uF.js} +1 -1
- package/dist/assets/{IframeModal-TBl1nkE6.js → IframeModal-DObwdZKc.js} +1 -1
- package/dist/assets/{IntegrationsPanel-CrC-7s3C.js → IntegrationsPanel-BJM7-5-l.js} +2 -2
- package/dist/assets/{LogViewerModal-BUx5t5A_.js → LogViewerModal-DO4L6d1p.js} +1 -1
- package/dist/assets/{MonitoringModal-CdEBDhPs.js → MonitoringModal-5GsKsJnc.js} +1 -1
- package/dist/assets/{PM2LogsModal-CiW5DbV7.js → PM2LogsModal-jb2FyI3U.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-CCyZo3as.js → RestoreArchivedAreaModal-D1L6h6km.js} +1 -1
- package/dist/assets/{Scene2DCanvas-CARFRp4q.js → Scene2DCanvas-D48fjiT7.js} +1 -1
- package/dist/assets/{SceneManager-BWNzLSKo.js → SceneManager-CDSFCv1W.js} +5 -5
- package/dist/assets/SkillsPanel-C4PPXR75.js +28 -0
- package/dist/assets/SpawnModal-D_s9EvPc.js +1 -0
- package/dist/assets/{SubordinateAssignmentModal-BAF7cWaT.js → SubordinateAssignmentModal-DtQXYtTK.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-C9J_KbGA.js → TriggerManagerPanel-f-yMJ3Qq.js} +2 -2
- package/dist/assets/{WorkflowEditorPanel-DjTG4lQ1.js → WorkflowEditorPanel-BGrkMH_W.js} +1 -1
- package/dist/assets/index-0uR1rrxK.js +1 -0
- package/dist/assets/{index-DTYriM_K.js → index-B2Y8957o.js} +27 -27
- package/dist/assets/index-C3IFhz-6.js +1 -0
- package/dist/assets/{index-CPfO9E2Z.js → index-CrvjzE7c.js} +2 -2
- package/dist/assets/index-DKZCR5P7.js +1 -0
- package/dist/assets/index-Dl8mT_ZQ.js +1 -0
- package/dist/assets/{index-BMiK5Kho.js → index-Tf75NFV0.js} +5 -5
- package/dist/assets/{index-94gPt5fm.js → index-f_yYt9B7.js} +4 -4
- package/dist/assets/{index-L84OBSoD.js → index-sbUW8LEQ.js} +1 -1
- package/dist/assets/index-uNQFgIER.css +1 -0
- package/dist/assets/main-DYZn_CH2.css +1 -0
- package/dist/assets/main-DoRHB7F9.js +200 -0
- package/dist/assets/{web-DpoaoQc0.js → web-CQnGhMaw.js} +1 -1
- package/dist/assets/{web-ojhnBPVV.js → web-Cq-ByMZ4.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/locales/en/common.json +4 -2
- package/dist/locales/es/common.json +4 -2
- package/dist/src/packages/server/claude/runner.js +96 -22
- package/package.json +6 -5
- package/dist/assets/SkillsPanel-LFXR0iy0.js +0 -28
- package/dist/assets/SpawnModal-BPlf3wKM.js +0 -1
- package/dist/assets/index-BGEtbFfN.js +0 -1
- package/dist/assets/index-BOj1gGma.js +0 -1
- package/dist/assets/index-CvRDWTQl.js +0 -1
- package/dist/assets/main-CYGaAWMo.css +0 -1
- package/dist/assets/main-DeBWAhnp.js +0 -199
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bY as s}from"./main-DoRHB7F9.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";class l extends s{constructor(){super(...arguments),this.pending=[],this.deliveredNotifications=[],this.hasNotificationSupport=()=>{if(!("Notification"in window)||!Notification.requestPermission)return!1;if(Notification.permission!=="granted")try{new Notification("")}catch(i){if(i instanceof Error&&i.name==="TypeError")return!1}return!0}}async getDeliveredNotifications(){const i=[];for(const t of this.deliveredNotifications){const e={title:t.title,id:parseInt(t.tag),body:t.body};i.push(e)}return{notifications:i}}async removeDeliveredNotifications(i){for(const t of i.notifications){const e=this.deliveredNotifications.find(n=>n.tag===String(t.id));e==null||e.close(),this.deliveredNotifications=this.deliveredNotifications.filter(()=>!e)}}async removeAllDeliveredNotifications(){for(const i of this.deliveredNotifications)i.close();this.deliveredNotifications=[]}async createChannel(){throw this.unimplemented("Not implemented on web.")}async deleteChannel(){throw this.unimplemented("Not implemented on web.")}async listChannels(){throw this.unimplemented("Not implemented on web.")}async schedule(i){if(!this.hasNotificationSupport())throw this.unavailable("Notifications not supported in this browser.");for(const t of i.notifications)this.sendNotification(t);return{notifications:i.notifications.map(t=>({id:t.id}))}}async getPending(){return{notifications:this.pending}}async registerActionTypes(){throw this.unimplemented("Not implemented on web.")}async cancel(i){this.pending=this.pending.filter(t=>!i.notifications.find(e=>e.id===t.id))}async areEnabled(){const{display:i}=await this.checkPermissions();return{value:i==="granted"}}async changeExactNotificationSetting(){throw this.unimplemented("Not implemented on web.")}async checkExactNotificationSetting(){throw this.unimplemented("Not implemented on web.")}async requestPermissions(){if(!this.hasNotificationSupport())throw this.unavailable("Notifications not supported in this browser.");return{display:this.transformNotificationPermission(await Notification.requestPermission())}}async checkPermissions(){if(!this.hasNotificationSupport())throw this.unavailable("Notifications not supported in this browser.");return{display:this.transformNotificationPermission(Notification.permission)}}transformNotificationPermission(i){switch(i){case"granted":return"granted";case"denied":return"denied";default:return"prompt"}}sendPending(){var i;const t=[],e=new Date().getTime();for(const n of this.pending)!((i=n.schedule)===null||i===void 0)&&i.at&&n.schedule.at.getTime()<=e&&(this.buildNotification(n),t.push(n));this.pending=this.pending.filter(n=>!t.find(o=>o===n))}sendNotification(i){var t;if(!((t=i.schedule)===null||t===void 0)&&t.at){const e=i.schedule.at.getTime()-new Date().getTime();this.pending.push(i),setTimeout(()=>{this.sendPending()},e);return}this.buildNotification(i)}buildNotification(i){const t=new Notification(i.title,{body:i.body,tag:String(i.id)});return t.addEventListener("click",this.onClick.bind(this,i),!1),t.addEventListener("show",this.onShow.bind(this,i),!1),t.addEventListener("close",()=>{this.deliveredNotifications=this.deliveredNotifications.filter(()=>!this)},!1),this.deliveredNotifications.push(t),t}onClick(i){const t={actionId:"tap",notification:i};this.notifyListeners("localNotificationActionPerformed",t)}onShow(i){this.notifyListeners("localNotificationReceived",i)}}export{l as LocalNotificationsWeb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bY as a}from"./main-DoRHB7F9.js";import{ImpactStyle as i,NotificationType as r}from"./index-CrvjzE7c.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";class h extends a{constructor(){super(...arguments),this.selectionStarted=!1}async impact(t){const e=this.patternForImpact(t==null?void 0:t.style);this.vibrateWithPattern(e)}async notification(t){const e=this.patternForNotification(t==null?void 0:t.type);this.vibrateWithPattern(e)}async vibrate(t){const e=(t==null?void 0:t.duration)||300;this.vibrateWithPattern([e])}async selectionStart(){this.selectionStarted=!0}async selectionChanged(){this.selectionStarted&&this.vibrateWithPattern([70])}async selectionEnd(){this.selectionStarted=!1}patternForImpact(t=i.Heavy){return t===i.Medium?[43]:t===i.Light?[20]:[61]}patternForNotification(t=r.Success){return t===r.Warning?[30,40,30,50,60]:t===r.Error?[27,45,50]:[35,65,21]}vibrateWithPattern(t){if(navigator.vibrate)navigator.vibrate(t);else throw this.unavailable("Browser does not support the vibrate API")}}export{h as HapticsWeb};
|
package/dist/index.html
CHANGED
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
<link rel="icon" type="image/png" sizes="16x16" href="/assets/icons/favicon-16x16.png" />
|
|
23
23
|
<link rel="apple-touch-icon" sizes="180x180" href="/assets/icons/apple-touch-icon.png" />
|
|
24
24
|
<title>Tide Commander</title>
|
|
25
|
-
<script type="module" crossorigin src="/assets/main-
|
|
25
|
+
<script type="module" crossorigin src="/assets/main-DoRHB7F9.js"></script>
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react--Eh9ivFN.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/vendor-three-Chj50gSY.js">
|
|
28
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
28
|
+
<link rel="stylesheet" crossorigin href="/assets/main-DYZn_CH2.css">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
|
31
31
|
<div id="app"></div>
|
|
@@ -141,12 +141,14 @@
|
|
|
141
141
|
"labels": {
|
|
142
142
|
"2d": "2D",
|
|
143
143
|
"3d": "3D",
|
|
144
|
-
"dashboard": "Dashboard"
|
|
144
|
+
"dashboard": "Dashboard",
|
|
145
|
+
"flat": "Flat"
|
|
145
146
|
},
|
|
146
147
|
"descriptions": {
|
|
147
148
|
"2d": "Lightweight top-down view",
|
|
148
149
|
"3d": "Full 3D isometric view",
|
|
149
|
-
"dashboard": "Metrics and status overview"
|
|
150
|
+
"dashboard": "Metrics and status overview",
|
|
151
|
+
"flat": "Flat UI layout"
|
|
150
152
|
}
|
|
151
153
|
},
|
|
152
154
|
"buttons2": {
|
|
@@ -141,12 +141,14 @@
|
|
|
141
141
|
"labels": {
|
|
142
142
|
"2d": "2D",
|
|
143
143
|
"3d": "3D",
|
|
144
|
-
"dashboard": "Panel de control"
|
|
144
|
+
"dashboard": "Panel de control",
|
|
145
|
+
"flat": "Plano"
|
|
145
146
|
},
|
|
146
147
|
"descriptions": {
|
|
147
148
|
"2d": "Vista cenital ligera",
|
|
148
149
|
"3d": "Vista isometrica 3D completa",
|
|
149
|
-
"dashboard": "Resumen de metricas y estado"
|
|
150
|
+
"dashboard": "Resumen de metricas y estado",
|
|
151
|
+
"flat": "Diseño plano"
|
|
150
152
|
}
|
|
151
153
|
},
|
|
152
154
|
"buttons2": {
|
|
@@ -190,6 +190,16 @@ export class ClaudeRunner {
|
|
|
190
190
|
log.error(`❌ [EXIT] Agent ${agentId}: Process exited with error code ${code}, pid was ${pid}, runtime ${(runtime / 1000).toFixed(1)}s${!wasTracked ? ' (unexpected - was not being tracked)' : ''}`);
|
|
191
191
|
this.watchdog.recordDeath(deathInfo);
|
|
192
192
|
}
|
|
193
|
+
// If the backend closes stdin per-turn (e.g. opencode) and a user sent a
|
|
194
|
+
// message while this turn was in flight, that message is still queued.
|
|
195
|
+
// Detect a clean turn-end exit and respawn with session resume so the
|
|
196
|
+
// queued message gets delivered as the next prompt.
|
|
197
|
+
const queuedCount = this.messageQueue.get(agentId)?.length ?? 0;
|
|
198
|
+
const cleanTurnEnd = wasTracked
|
|
199
|
+
&& code === 0
|
|
200
|
+
&& !signal
|
|
201
|
+
&& !!trackedProcess?.lastRequest
|
|
202
|
+
&& queuedCount > 0;
|
|
193
203
|
if (!wasTracked && (signal === 'SIGINT' || signal === 'SIGTERM')) {
|
|
194
204
|
log.log(`⏭️ [EXIT] Agent ${agentId}: Skipping onComplete - process was explicitly stopped (signal=${signal})`);
|
|
195
205
|
// Belt-and-suspenders: ensure the agent ends up idle even if stale
|
|
@@ -205,10 +215,16 @@ export class ClaudeRunner {
|
|
|
205
215
|
});
|
|
206
216
|
}
|
|
207
217
|
}
|
|
218
|
+
else if (cleanTurnEnd) {
|
|
219
|
+
log.log(`⏭️ [EXIT] Agent ${agentId}: Skipping onComplete - respawning to deliver ${queuedCount} queued message(s)`);
|
|
220
|
+
}
|
|
208
221
|
else {
|
|
209
222
|
this.callbacks.onComplete(agentId, code === 0);
|
|
210
223
|
}
|
|
211
|
-
if (
|
|
224
|
+
if (cleanTurnEnd && trackedProcess) {
|
|
225
|
+
this.respawnWithQueuedMessage(agentId, trackedProcess);
|
|
226
|
+
}
|
|
227
|
+
else if (trackedProcess && code !== 0 && signal !== 'SIGINT' && signal !== 'SIGTERM') {
|
|
212
228
|
this.restartPolicy.maybeAutoRestart(agentId, trackedProcess, code, signal);
|
|
213
229
|
}
|
|
214
230
|
});
|
|
@@ -280,23 +296,15 @@ export class ClaudeRunner {
|
|
|
280
296
|
}
|
|
281
297
|
return ok;
|
|
282
298
|
}
|
|
283
|
-
const stdin = activeProcess.process.stdin;
|
|
284
|
-
if (!stdin) {
|
|
285
|
-
log.error(`❌ [SEND_MESSAGE] stdin is null for agent ${agentId}`);
|
|
286
|
-
return false;
|
|
287
|
-
}
|
|
288
|
-
if (!stdin.writable) {
|
|
289
|
-
log.error(`❌ [SEND_MESSAGE] stdin is not writable for agent ${agentId} (destroyed: ${stdin.destroyed}, closed: ${stdin.closed})`);
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
299
|
const turnState = activeProcess.turnState || 'processing';
|
|
293
300
|
const messageLen = message.length;
|
|
301
|
+
// Queue mid-turn messages BEFORE any stdin-writability check. Writing to the OS
|
|
302
|
+
// stdin pipe mid-turn is unreliable on all backends (async callback + possible
|
|
303
|
+
// pipe close), and backends like opencode explicitly close stdin after the initial
|
|
304
|
+
// prompt so there is nothing to write to at all. In both cases the queue is the
|
|
305
|
+
// source of truth; drain happens after the current turn ends (via stdin for
|
|
306
|
+
// stdin-open backends, or via session-resume respawn for stdin-closed ones).
|
|
294
307
|
if (turnState === 'processing') {
|
|
295
|
-
// Agent is mid-turn: queue the message for delivery once the current turn completes.
|
|
296
|
-
// Writing to the OS stdin pipe buffer mid-turn is unreliable — the write callback is
|
|
297
|
-
// async, and if the process exits or stdin closes before the buffer is read the message
|
|
298
|
-
// is silently dropped. The queue is drained in the step_complete handler, which fires
|
|
299
|
-
// after the turn ends and the process is confirmed waiting for input.
|
|
300
308
|
const queue = this.messageQueue.get(agentId) ?? [];
|
|
301
309
|
queue.push(message);
|
|
302
310
|
this.messageQueue.set(agentId, queue);
|
|
@@ -304,6 +312,15 @@ export class ClaudeRunner {
|
|
|
304
312
|
return true;
|
|
305
313
|
}
|
|
306
314
|
// Agent is waiting for input: send directly via stdin (immediate processing)
|
|
315
|
+
const stdin = activeProcess.process.stdin;
|
|
316
|
+
if (!stdin) {
|
|
317
|
+
log.error(`❌ [SEND_MESSAGE] stdin is null for agent ${agentId}`);
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
if (!stdin.writable) {
|
|
321
|
+
log.error(`❌ [SEND_MESSAGE] stdin is not writable for agent ${agentId} (destroyed: ${stdin.destroyed}, closed: ${stdin.closed})`);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
307
324
|
log.log(`📨 [SEND_MESSAGE] Agent ${agentId} is idle (turnState=${turnState}), sending directly via stdin (${messageLen} chars)`);
|
|
308
325
|
return this.writeToStdin(agentId, activeProcess, message);
|
|
309
326
|
}
|
|
@@ -337,17 +354,20 @@ export class ClaudeRunner {
|
|
|
337
354
|
/**
|
|
338
355
|
* Drain the next queued message (if any) to the process stdin.
|
|
339
356
|
* Called after step_complete when the process transitions to waiting_for_input.
|
|
357
|
+
*
|
|
358
|
+
* For backends that close stdin after each turn (e.g. opencode), the process
|
|
359
|
+
* is about to exit — we leave the message in the queue and let the
|
|
360
|
+
* runner.process_closed handler respawn with session resume.
|
|
340
361
|
*/
|
|
341
362
|
drainMessageQueue(agentId, activeProcess) {
|
|
342
363
|
const queue = this.messageQueue.get(agentId);
|
|
343
364
|
if (!queue || queue.length === 0)
|
|
344
365
|
return;
|
|
345
|
-
const nextMessage = queue.shift();
|
|
346
|
-
if (queue.length === 0) {
|
|
347
|
-
this.messageQueue.delete(agentId);
|
|
348
|
-
}
|
|
349
|
-
log.log(`📤 [QUEUE-DRAIN] Agent ${agentId}: Delivering queued message (${queue.length} remaining, ${nextMessage.length} chars)`);
|
|
350
366
|
if (activeProcess.tmuxSession) {
|
|
367
|
+
const nextMessage = queue.shift();
|
|
368
|
+
if (queue.length === 0)
|
|
369
|
+
this.messageQueue.delete(agentId);
|
|
370
|
+
log.log(`📤 [QUEUE-DRAIN] Agent ${agentId}: Delivering queued message via tmux (${queue.length} remaining, ${nextMessage.length} chars)`);
|
|
351
371
|
const stdinInput = this.backend.formatStdinInput(nextMessage);
|
|
352
372
|
const ok = sendToTmux(agentId, stdinInput);
|
|
353
373
|
if (ok) {
|
|
@@ -356,10 +376,64 @@ export class ClaudeRunner {
|
|
|
356
376
|
else {
|
|
357
377
|
log.error(`❌ [QUEUE-DRAIN] Agent ${agentId}: tmux send failed for queued message`);
|
|
358
378
|
}
|
|
379
|
+
return;
|
|
359
380
|
}
|
|
360
|
-
|
|
361
|
-
|
|
381
|
+
const stdin = activeProcess.process.stdin;
|
|
382
|
+
if (!stdin || !stdin.writable) {
|
|
383
|
+
// Backend closes stdin per-turn (e.g. opencode). The process will exit on
|
|
384
|
+
// its own now that the turn is done and stdin is at EOF. The message stays
|
|
385
|
+
// in the queue; the runner.process_closed handler will respawn with session
|
|
386
|
+
// resume and deliver it as the next prompt.
|
|
387
|
+
log.log(`⏸️ [QUEUE-DRAIN] Agent ${agentId}: stdin closed, deferring delivery to respawn after process exit (${queue.length} queued)`);
|
|
388
|
+
return;
|
|
362
389
|
}
|
|
390
|
+
const nextMessage = queue.shift();
|
|
391
|
+
if (queue.length === 0)
|
|
392
|
+
this.messageQueue.delete(agentId);
|
|
393
|
+
log.log(`📤 [QUEUE-DRAIN] Agent ${agentId}: Delivering queued message via stdin (${queue.length} remaining, ${nextMessage.length} chars)`);
|
|
394
|
+
this.writeToStdin(agentId, activeProcess, nextMessage);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Respawn the agent process with session resume, using the next queued
|
|
398
|
+
* message as the new prompt. Used for backends that close stdin per-turn
|
|
399
|
+
* (e.g. opencode): after the process exits at end-of-turn we create a new
|
|
400
|
+
* process that resumes the same session, delivering the queued message.
|
|
401
|
+
*/
|
|
402
|
+
respawnWithQueuedMessage(agentId, exitedProcess) {
|
|
403
|
+
const queue = this.messageQueue.get(agentId);
|
|
404
|
+
if (!queue || queue.length === 0)
|
|
405
|
+
return;
|
|
406
|
+
const lastRequest = exitedProcess.lastRequest;
|
|
407
|
+
if (!lastRequest) {
|
|
408
|
+
log.error(`❌ [RESPAWN] No lastRequest for ${agentId}, cannot respawn with queued message — queue preserved for next user send`);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
const nextMessage = queue.shift();
|
|
412
|
+
if (queue.length === 0)
|
|
413
|
+
this.messageQueue.delete(agentId);
|
|
414
|
+
const sessionId = exitedProcess.sessionId ?? lastRequest.sessionId;
|
|
415
|
+
log.log(`🔁 [RESPAWN] Agent ${agentId}: Spawning new process to deliver queued message (session=${sessionId ?? 'none'}, prompt=${nextMessage.length} chars, ${queue.length} more queued)`);
|
|
416
|
+
const newRequest = {
|
|
417
|
+
...lastRequest,
|
|
418
|
+
prompt: nextMessage,
|
|
419
|
+
sessionId,
|
|
420
|
+
forceNewSession: false,
|
|
421
|
+
};
|
|
422
|
+
// Re-assert 'working' state so the brief window between the old process's
|
|
423
|
+
// exit and the new process's first event doesn't show the agent as idle.
|
|
424
|
+
agentService.updateAgent(agentId, {
|
|
425
|
+
status: 'working',
|
|
426
|
+
currentTask: nextMessage.substring(0, 100),
|
|
427
|
+
isDetached: false,
|
|
428
|
+
});
|
|
429
|
+
void this.run(newRequest).catch((err) => {
|
|
430
|
+
log.error(`❌ [RESPAWN] Failed to respawn ${agentId} with queued message: ${err}`);
|
|
431
|
+
// Put the message back at the head of the queue so it isn't lost.
|
|
432
|
+
const currentQueue = this.messageQueue.get(agentId) ?? [];
|
|
433
|
+
currentQueue.unshift(nextMessage);
|
|
434
|
+
this.messageQueue.set(agentId, currentQueue);
|
|
435
|
+
this.callbacks.onError(agentId, `Failed to deliver queued message: ${err}`);
|
|
436
|
+
});
|
|
363
437
|
}
|
|
364
438
|
/**
|
|
365
439
|
* Reconnect to a live tmux session after a server restart.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tide-commander",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.67.0",
|
|
4
4
|
"description": "Visual multi-agent orchestrator and manager for Claude Code with 3D/2D interface",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"LICENSE"
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
|
-
"dev": "
|
|
20
|
+
"dev": "concurrently \"bun run dev:client\" \"bun run dev:server\"",
|
|
21
21
|
"dev:client": "vite",
|
|
22
22
|
"dev:server": "tsx watch src/packages/server/index.ts",
|
|
23
23
|
"docs:dev": "npm --prefix src/packages/landing run dev",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@tanstack/react-virtual": "^3.13.18",
|
|
65
65
|
"@types/better-sqlite3": "^7.6.13",
|
|
66
66
|
"@types/http-proxy": "^1.17.17",
|
|
67
|
-
"@types/mssql": "^
|
|
67
|
+
"@types/mssql": "^12.3.0",
|
|
68
68
|
"@types/multer": "^2.1.0",
|
|
69
69
|
"@types/oracledb": "^6.10.1",
|
|
70
70
|
"@types/pizzip": "^3.0.5",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"i18next": "^26.0.3",
|
|
86
86
|
"i18next-browser-languagedetector": "^8.2.1",
|
|
87
87
|
"i18next-http-backend": "^3.0.2",
|
|
88
|
-
"mssql": "^12.
|
|
88
|
+
"mssql": "^12.4.0",
|
|
89
89
|
"multer": "^2.1.1",
|
|
90
90
|
"mysql2": "^3.16.2",
|
|
91
91
|
"oracledb": "^6.10.0",
|
|
@@ -104,7 +104,8 @@
|
|
|
104
104
|
"ws": "^8.18.0"
|
|
105
105
|
},
|
|
106
106
|
"overrides": {
|
|
107
|
-
"tar": "7.5.13"
|
|
107
|
+
"tar": "7.5.13",
|
|
108
|
+
"uuid": "^14.0.0"
|
|
108
109
|
},
|
|
109
110
|
"devDependencies": {
|
|
110
111
|
"@capacitor/android": "^8.1.0",
|