tide-commander 1.110.0 → 1.110.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/assets/{BossLogsModal-CHz_pHYe.js → BossLogsModal-DBeMak5-.js} +1 -1
  2. package/dist/assets/{BossSpawnModal-DjfYj13S.js → BossSpawnModal-DDl6qgnq.js} +1 -1
  3. package/dist/assets/{ControlsModal-CraYW8Z0.js → ControlsModal-BBUukX-p.js} +1 -1
  4. package/dist/assets/{DockerLogsModal-D1JQVnoZ.js → DockerLogsModal-BWf3XDEI.js} +1 -1
  5. package/dist/assets/{EmbeddedEditor-DpDyHuwU.js → EmbeddedEditor-CIOdhnaW.js} +1 -1
  6. package/dist/assets/{GmailOAuthSetup-CZy-Ws3b.js → GmailOAuthSetup-qG-_WeOb.js} +1 -1
  7. package/dist/assets/{GoogleOAuthSetup-CEqR8wjo.js → GoogleOAuthSetup-BK3lzU4n.js} +1 -1
  8. package/dist/assets/{IframeModal-Dpcyj2hp.js → IframeModal-D_NEs_Ld.js} +1 -1
  9. package/dist/assets/{IntegrationsPanel-CK5riko1.js → IntegrationsPanel-yphWX1ZD.js} +2 -2
  10. package/dist/assets/{LogViewerModal-D_A_tQ-i.js → LogViewerModal-B0h9NNRk.js} +1 -1
  11. package/dist/assets/{MonitoringModal-BeOcJLIv.js → MonitoringModal-Ciw7KnXH.js} +1 -1
  12. package/dist/assets/{PM2LogsModal-1GykGk6O.js → PM2LogsModal-C1dYQaff.js} +1 -1
  13. package/dist/assets/{RestoreArchivedAreaModal-CK0jtYkm.js → RestoreArchivedAreaModal-DOwzfu-D.js} +1 -1
  14. package/dist/assets/{Scene2DCanvas-UvOoyUKe.js → Scene2DCanvas-MHfv4Rzg.js} +1 -1
  15. package/dist/assets/{SceneManager-BEpxBwe6.js → SceneManager-cm1Kj0YD.js} +1 -1
  16. package/dist/assets/{SkillsPanel-CKG7RYKH.js → SkillsPanel-DLwMkORc.js} +1 -1
  17. package/dist/assets/{SlackMultiInstanceSetup-7lS8KrHh.js → SlackMultiInstanceSetup-Dql_wPMX.js} +1 -1
  18. package/dist/assets/{SpawnModal-D6eoFjpf.js → SpawnModal-DzPTSOKV.js} +1 -1
  19. package/dist/assets/{SubordinateAssignmentModal-DdbqIYQb.js → SubordinateAssignmentModal-CoLzD3z2.js} +1 -1
  20. package/dist/assets/{TriggerManagerPanel-fbE1V_tU.js → TriggerManagerPanel-BOi2zr7N.js} +1 -1
  21. package/dist/assets/{WorkflowEditorPanel-AyTwrOx1.js → WorkflowEditorPanel-DB1ygPDS.js} +1 -1
  22. package/dist/assets/{index-CSAmEctZ.js → index-6Wak7CPm.js} +1 -1
  23. package/dist/assets/{index--1xg_5j8.js → index-BP6ukiYG.js} +1 -1
  24. package/dist/assets/{index-xAeBTdAq.js → index-BXJSMT4a.js} +3 -3
  25. package/dist/assets/{index-CZJX8_ne.js → index-BZsQOteM.js} +1 -1
  26. package/dist/assets/{index-CjzwiyFR.js → index-C6EHHgC0.js} +1 -1
  27. package/dist/assets/{index-CUQZOPZi.js → index-D4XW6MSF.js} +2 -2
  28. package/dist/assets/{index-DKPVsnkm.js → index-DKASWGtq.js} +1 -1
  29. package/dist/assets/{index-CFc2HdBA.js → index-DKdZI-Ar.js} +1 -1
  30. package/dist/assets/{index-DAVC1kVs.js → index-ThbMNdRp.js} +1 -1
  31. package/dist/assets/{main-B7DHCEPO.js → main-BxA3Bhkv.js} +4 -4
  32. package/dist/assets/{web-DVTyi94O.js → web-BskC98UQ.js} +1 -1
  33. package/dist/assets/{web-BVV5fDvM.js → web-CSRmX8Ge.js} +1 -1
  34. package/dist/assets/{web-DRTwnSJw.js → web-zdygXcYu.js} +1 -1
  35. package/dist/index.html +1 -1
  36. package/dist/src/packages/server/data/index.js +3 -0
  37. package/dist/src/packages/server/services/cron-service.js +2 -2
  38. package/dist/src/packages/server/services/trigger-service.js +6 -1
  39. package/package.json +1 -1
@@ -1 +1 @@
1
- import{cl as a}from"./main-B7DHCEPO.js";import{ImpactStyle as i,NotificationType as r}from"./index-CUQZOPZi.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};
1
+ import{cl as a}from"./main-BxA3Bhkv.js";import{ImpactStyle as i,NotificationType as r}from"./index-D4XW6MSF.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};
@@ -1 +1 @@
1
- import{cl as t}from"./main-B7DHCEPO.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";class o extends t{constructor(){super(),this.handleVisibilityChange=()=>{const e={isActive:document.hidden!==!0};this.notifyListeners("appStateChange",e),document.hidden?this.notifyListeners("pause",null):this.notifyListeners("resume",null)},document.addEventListener("visibilitychange",this.handleVisibilityChange,!1)}exitApp(){throw this.unimplemented("Not implemented on web.")}async getInfo(){throw this.unimplemented("Not implemented on web.")}async getLaunchUrl(){return{url:""}}async getState(){return{isActive:document.hidden!==!0}}async minimizeApp(){throw this.unimplemented("Not implemented on web.")}async toggleBackButtonHandler(){throw this.unimplemented("Not implemented on web.")}async getAppLanguage(){return{value:navigator.language.split("-")[0].toLowerCase()}}}export{o as AppWeb};
1
+ import{cl as t}from"./main-BxA3Bhkv.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";class o extends t{constructor(){super(),this.handleVisibilityChange=()=>{const e={isActive:document.hidden!==!0};this.notifyListeners("appStateChange",e),document.hidden?this.notifyListeners("pause",null):this.notifyListeners("resume",null)},document.addEventListener("visibilitychange",this.handleVisibilityChange,!1)}exitApp(){throw this.unimplemented("Not implemented on web.")}async getInfo(){throw this.unimplemented("Not implemented on web.")}async getLaunchUrl(){return{url:""}}async getState(){return{isActive:document.hidden!==!0}}async minimizeApp(){throw this.unimplemented("Not implemented on web.")}async toggleBackButtonHandler(){throw this.unimplemented("Not implemented on web.")}async getAppLanguage(){return{value:navigator.language.split("-")[0].toLowerCase()}}}export{o as AppWeb};
@@ -1 +1 @@
1
- import{cl as s}from"./main-B7DHCEPO.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
+ import{cl as s}from"./main-BxA3Bhkv.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};
package/dist/index.html CHANGED
@@ -22,7 +22,7 @@
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-B7DHCEPO.js"></script>
25
+ <script type="module" crossorigin src="/assets/main-BxA3Bhkv.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
28
  <link rel="stylesheet" crossorigin href="/assets/main-BLrGoeQ_.css">
@@ -139,6 +139,9 @@ function toStoredAgents(agents) {
139
139
  trackingStatus: agent.trackingStatus,
140
140
  trackingStatusDetail: agent.trackingStatusDetail,
141
141
  trackingStatusTimestamp: agent.trackingStatusTimestamp,
142
+ shortcut: agent.shortcut,
143
+ customInstructions: agent.customInstructions,
144
+ memory: agent.memory,
142
145
  isBoss: agent.isBoss,
143
146
  subordinateIds: agent.subordinateIds,
144
147
  bossId: agent.bossId,
@@ -181,7 +181,7 @@ export function scheduleOnce(runAtIso, callback) {
181
181
  log.log(`Scheduled one-shot cron ${id} for ${runAtIso}`);
182
182
  return job;
183
183
  }
184
- export function schedule(expression, timezone, callback) {
184
+ export function schedule(expression, timezone, callback, options) {
185
185
  const id = `cron_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
186
186
  const job = {
187
187
  id,
@@ -189,7 +189,7 @@ export function schedule(expression, timezone, callback) {
189
189
  timezone,
190
190
  callback,
191
191
  timer: null,
192
- lastFired: null,
192
+ lastFired: options?.initialLastFired ?? null,
193
193
  };
194
194
  // Check at interval whether it's time to fire
195
195
  job.timer = setInterval(() => {
@@ -627,6 +627,11 @@ function startCronJob(trigger) {
627
627
  startOneShotJob(trigger);
628
628
  return;
629
629
  }
630
+ // Seed the new job's same-minute guard with the persisted `lastFiredAt`. Without
631
+ // this, every `fireTrigger` re-enters `updateTrigger` → re-arms the cron → a
632
+ // fresh job with `lastFired: null` polls and fires a SECOND time in the same
633
+ // minute. Reading from the persisted trigger record also defends against
634
+ // pm2/server restarts within the same minute as the last fire.
630
635
  const job = cronService.schedule(trigger.config.expression, trigger.config.timezone, () => {
631
636
  const variables = {
632
637
  'cron.expression': trigger.config.expression,
@@ -634,7 +639,7 @@ function startCronJob(trigger) {
634
639
  ...(trigger.config.payload || {}),
635
640
  };
636
641
  void fireTrigger(trigger.id, variables);
637
- });
642
+ }, { initialLastFired: trigger.lastFiredAt ?? null });
638
643
  cronJobs.set(trigger.id, job);
639
644
  log.log(`Started cron job for trigger ${trigger.name}: ${trigger.config.expression}`);
640
645
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tide-commander",
3
- "version": "1.110.0",
3
+ "version": "1.110.2",
4
4
  "description": "Visual multi-agent orchestrator and manager for Claude Code with 3D/2D interface",
5
5
  "repository": {
6
6
  "type": "git",