tide-commander 1.64.0 → 1.64.1

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 (34) hide show
  1. package/dist/assets/{BossLogsModal-DLR42-IT.js → BossLogsModal-B72_7BHt.js} +1 -1
  2. package/dist/assets/{BossSpawnModal-DAgHl3R6.js → BossSpawnModal-I2gd6Haa.js} +1 -1
  3. package/dist/assets/{ControlsModal-gP0MLYlM.js → ControlsModal-C6N5J1b9.js} +1 -1
  4. package/dist/assets/{DockerLogsModal-CFIev1fE.js → DockerLogsModal-Sbka63uD.js} +1 -1
  5. package/dist/assets/{EmbeddedEditor-DHavC0_4.js → EmbeddedEditor-CWXIFbqO.js} +1 -1
  6. package/dist/assets/{GmailOAuthSetup-C-lLv5zX.js → GmailOAuthSetup-BD7iFY_z.js} +1 -1
  7. package/dist/assets/{GoogleOAuthSetup-Y8xqNYab.js → GoogleOAuthSetup-BFA7pkjF.js} +1 -1
  8. package/dist/assets/{IframeModal-ChWDJAUG.js → IframeModal-CSNQoKQp.js} +1 -1
  9. package/dist/assets/{IntegrationsPanel-BIkMvY4c.js → IntegrationsPanel-CxIlAfwM.js} +2 -2
  10. package/dist/assets/{LogViewerModal-A1BqkaSG.js → LogViewerModal-oR_MJdlg.js} +1 -1
  11. package/dist/assets/{MonitoringModal-B-exbiAO.js → MonitoringModal-DQgasofL.js} +1 -1
  12. package/dist/assets/{PM2LogsModal-W8QwyfIH.js → PM2LogsModal-BUuealrs.js} +1 -1
  13. package/dist/assets/{RestoreArchivedAreaModal-DWBL-dIK.js → RestoreArchivedAreaModal-Cw_fsm0f.js} +1 -1
  14. package/dist/assets/{Scene2DCanvas-m8C3YWvc.js → Scene2DCanvas-Ct8tkxrX.js} +1 -1
  15. package/dist/assets/{SceneManager-C0mDJleN.js → SceneManager-ksMw6QzO.js} +1 -1
  16. package/dist/assets/{SkillsPanel-DyQC5vmc.js → SkillsPanel-CIKjBsqK.js} +1 -1
  17. package/dist/assets/{SpawnModal-DRZb4yQv.js → SpawnModal-ClEPoXzz.js} +1 -1
  18. package/dist/assets/{SubordinateAssignmentModal-GspXu4uJ.js → SubordinateAssignmentModal-fBH0D-n0.js} +1 -1
  19. package/dist/assets/{TriggerManagerPanel-C2-JZ9Td.js → TriggerManagerPanel-DQaewpQE.js} +1 -1
  20. package/dist/assets/{WorkflowEditorPanel-BKZIKBbb.js → WorkflowEditorPanel-BbQPfsAP.js} +1 -1
  21. package/dist/assets/{index-B-9UaF21.js → index-3YGJoOHV.js} +1 -1
  22. package/dist/assets/{index-BTWI52EO.js → index-B9GgZYql.js} +1 -1
  23. package/dist/assets/{index-CJzaSVsT.js → index-BB5wf97o.js} +1 -1
  24. package/dist/assets/{index-CbxBgs9P.js → index-BVOPPyiD.js} +1 -1
  25. package/dist/assets/{index-QXsncANJ.js → index-CqU-Wd9O.js} +2 -2
  26. package/dist/assets/{index-C2j4gLM5.js → index-IKCoEdSk.js} +1 -1
  27. package/dist/assets/{index-BootSGxG.js → index-XGJvKAEa.js} +1 -1
  28. package/dist/assets/{index-8tA-hcUN.js → index-ecMsTrrV.js} +3 -3
  29. package/dist/assets/{main-BqGYHsUJ.js → main-KYv9Wb4s.js} +4 -4
  30. package/dist/assets/{web-CxCQRl7w.js → web-BlD_xY8D.js} +1 -1
  31. package/dist/assets/{web-CrNLIUD2.js → web-CTASmenh.js} +1 -1
  32. package/dist/index.html +1 -1
  33. package/dist/src/packages/server/integrations/slack/slack-skill.js +32 -0
  34. package/package.json +1 -1
@@ -1 +1 @@
1
- import{bH as s}from"./main-BqGYHsUJ.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{bH as s}from"./main-KYv9Wb4s.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{bH as a}from"./main-BqGYHsUJ.js";import{ImpactStyle as i,NotificationType as r}from"./index-QXsncANJ.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{bH as a}from"./main-KYv9Wb4s.js";import{ImpactStyle as i,NotificationType as r}from"./index-CqU-Wd9O.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,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-BqGYHsUJ.js"></script>
25
+ <script type="module" crossorigin src="/assets/main-KYv9Wb4s.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-DpE84tMP.css">
@@ -43,6 +43,38 @@ curl -s "http://localhost:5174/api/slack/users/search?q=john"
43
43
  \`\`\`
44
44
 
45
45
  Searches by name, display name, real name, or email. Returns matching users with their IDs.
46
+ Requires the bot token to have **\`users:read\`** (plus \`users:read.email\` if you want to match on email).
47
+
48
+ ## Mentioning Users (Real Pings)
49
+
50
+ Slack does **not** render \`@Name\` as a real mention — that's just text and will **not** notify anyone. Real mentions use a bracketed syntax that includes the Slack user ID.
51
+
52
+ **Format:** \`<@USERID>\` (e.g. \`<@U0ABCDEF>\`).
53
+
54
+ **Flow: find the ID, then embed it.**
55
+ \`\`\`bash
56
+ # 1. Look up the user's ID by name/email
57
+ curl -s "http://localhost:5174/api/slack/users/search?q=mark"
58
+ # → [{ "id": "U0ABCDEF", "name": "mark", "realName": "Mark Wu", ... }]
59
+
60
+ # 2. Include <@U0ABCDEF> in the message text — this renders as @Mark and notifies them
61
+ curl -s -X POST http://localhost:5174/api/slack/send \\
62
+ -H "Content-Type: application/json" \\
63
+ -d '{"channel":"C0123456789","text":"Hey <@U0ABCDEF>, please take a look"}'
64
+ \`\`\`
65
+
66
+ **Broadcast / special mentions** (notify many people at once — use sparingly):
67
+ - \`<!channel>\` — notifies everyone in the channel, equivalent to typing \`@channel\`
68
+ - \`<!here>\` — notifies only currently-active members, equivalent to \`@here\`
69
+ - \`<!everyone>\` — notifies everyone in the workspace (only valid in DMs and #general), equivalent to \`@everyone\`
70
+ - \`<!subteam^SXXXXXXX>\` — pings a user group by its subteam id, equivalent to \`@groupname\`
71
+ - \`<!subteam^SXXXXXXX|@groupname>\` — same, but with a display fallback for older clients
72
+
73
+ **Rules of thumb:**
74
+ - Always look up the user's ID first — never guess or hardcode, and never rely on \`@Name\` as plain text.
75
+ - For multiple mentions, include multiple \`<@...>\` tokens in the same \`text\` field.
76
+ - The \`<\` and \`>\` are literal — do NOT URL-encode them when sending through \`/api/slack/send\` (the endpoint accepts JSON, not query strings).
77
+ - If you can't resolve a user's ID (not in the workspace, lookup returns no match), fall back to their human name as plain text and tell the caller you couldn't ping them directly.
46
78
 
47
79
  ## Read Channel Messages
48
80
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tide-commander",
3
- "version": "1.64.0",
3
+ "version": "1.64.1",
4
4
  "description": "Visual multi-agent orchestrator and manager for Claude Code with 3D/2D interface",
5
5
  "repository": {
6
6
  "type": "git",