tide-commander 1.4.2 → 1.5.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/{index-DIOiOsBx.js → index-CYRUTmGn.js} +2 -2
- package/dist/assets/{main-CUMFPKhU.js → main-DZozksxb.js} +99 -99
- package/dist/assets/main-D_INBNo0.css +1 -0
- package/dist/assets/{web-B1SUNjoE.js → web-1yPmczl-.js} +1 -1
- package/dist/assets/{web-Dj2_95Ub.js → web-3ECbmz_M.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/routes/files.js +2 -12
- package/dist/src/packages/server/websocket/listeners/runtime-listeners.js +16 -1
- package/package.json +1 -1
- package/dist/assets/main-bYps5b_t.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{W as s}from"./main-
|
|
1
|
+
import{W as s}from"./main-DZozksxb.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react-uS-d4TUT.js";import"./vendor-three-DJ4p3FLF.js";class f 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{f as LocalNotificationsWeb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{W as a}from"./main-
|
|
1
|
+
import{W as a}from"./main-DZozksxb.js";import{ImpactStyle as i,NotificationType as r}from"./index-CYRUTmGn.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react-uS-d4TUT.js";import"./vendor-three-DJ4p3FLF.js";class u 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{u as HapticsWeb};
|
package/dist/index.html
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
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-DZozksxb.js"></script>
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-uS-d4TUT.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/vendor-three-DJ4p3FLF.js">
|
|
29
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
29
|
+
<link rel="stylesheet" crossorigin href="/assets/main-D_INBNo0.css">
|
|
30
30
|
</head>
|
|
31
31
|
<body>
|
|
32
32
|
<div id="app"></div>
|
|
@@ -291,9 +291,6 @@ router.get('/list', async (req, res) => {
|
|
|
291
291
|
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
292
292
|
const files = [];
|
|
293
293
|
for (const entry of entries) {
|
|
294
|
-
// Skip hidden files by default
|
|
295
|
-
if (entry.name.startsWith('.'))
|
|
296
|
-
continue;
|
|
297
294
|
const fullPath = path.join(dirPath, entry.name);
|
|
298
295
|
try {
|
|
299
296
|
const entryStats = fs.statSync(fullPath);
|
|
@@ -336,9 +333,6 @@ function buildTree(dirPath, depth, maxDepth) {
|
|
|
336
333
|
try {
|
|
337
334
|
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
338
335
|
for (const entry of entries) {
|
|
339
|
-
// Skip hidden files
|
|
340
|
-
if (entry.name.startsWith('.'))
|
|
341
|
-
continue;
|
|
342
336
|
// Skip common non-essential directories (but keep 'build' for APK access)
|
|
343
337
|
if (['node_modules', 'dist', '.git', '__pycache__', 'venv', '.venv'].includes(entry.name))
|
|
344
338
|
continue;
|
|
@@ -544,9 +538,7 @@ function searchFiles(dirPath, query, results, maxResults, depth = 0) {
|
|
|
544
538
|
for (const entry of entries) {
|
|
545
539
|
if (results.length >= maxResults)
|
|
546
540
|
break;
|
|
547
|
-
// Skip
|
|
548
|
-
if (entry.name.startsWith('.') && entry.name !== '.claude')
|
|
549
|
-
continue;
|
|
541
|
+
// Skip common non-essential directories
|
|
550
542
|
if (['node_modules', 'dist', '.git', '__pycache__', 'venv', '.venv'].includes(entry.name))
|
|
551
543
|
continue;
|
|
552
544
|
const fullPath = path.join(dirPath, entry.name);
|
|
@@ -631,9 +623,7 @@ function searchFileContents(dirPath, query, results, maxResults, depth = 0) {
|
|
|
631
623
|
for (const entry of entries) {
|
|
632
624
|
if (results.length >= maxResults)
|
|
633
625
|
break;
|
|
634
|
-
// Skip
|
|
635
|
-
if (entry.name.startsWith('.'))
|
|
636
|
-
continue;
|
|
626
|
+
// Skip common non-essential directories
|
|
637
627
|
if (['node_modules', 'dist', 'build', '.git', '__pycache__', 'venv', '.venv', 'target', 'vendor'].includes(entry.name))
|
|
638
628
|
continue;
|
|
639
629
|
const fullPath = path.join(dirPath, entry.name);
|
|
@@ -9,6 +9,20 @@ import { parseBossDelegation, parseBossSpawn, getBossForSubordinate, clearDelega
|
|
|
9
9
|
import { startWatching as startJsonlWatching, stopWatching as stopJsonlWatching, getSubagentsDir } from '../../services/subagent-jsonl-watcher.js';
|
|
10
10
|
const log = logger.ws;
|
|
11
11
|
const MAX_SYNTHETIC_DIFF_FILE_BYTES = 256 * 1024;
|
|
12
|
+
function sanitizeParsedContextStats(stats) {
|
|
13
|
+
if (stats.totalTokens <= stats.contextWindow)
|
|
14
|
+
return stats;
|
|
15
|
+
return {
|
|
16
|
+
...stats,
|
|
17
|
+
totalTokens: 0,
|
|
18
|
+
usedPercent: 0,
|
|
19
|
+
categories: {
|
|
20
|
+
...stats.categories,
|
|
21
|
+
messages: { tokens: 0, percent: 0 },
|
|
22
|
+
freeSpace: { tokens: stats.contextWindow, percent: 100 },
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
12
26
|
export function setupRuntimeListeners(ctx) {
|
|
13
27
|
const pendingBashCommands = new Map();
|
|
14
28
|
runtimeService.on('event', (agentId, event) => {
|
|
@@ -174,7 +188,8 @@ export function setupRuntimeListeners(ctx) {
|
|
|
174
188
|
if (event.type === 'context_stats' && event.contextStatsRaw) {
|
|
175
189
|
log.log(`[context_stats] Received for agent ${agentId}, raw length: ${event.contextStatsRaw.length}`);
|
|
176
190
|
// Try all known formats: markdown table, visual bar chart, etc.
|
|
177
|
-
const
|
|
191
|
+
const parsedStats = parseAllFormats(event.contextStatsRaw) || parseContextOutput(event.contextStatsRaw);
|
|
192
|
+
const stats = parsedStats ? sanitizeParsedContextStats(parsedStats) : null;
|
|
178
193
|
if (stats) {
|
|
179
194
|
log.log(`[context_stats] Parsed: ${stats.usedPercent}% used, ${stats.totalTokens}/${stats.contextWindow} tokens`);
|
|
180
195
|
agentService.updateAgent(agentId, {
|