@hexidecibel/companion 0.0.1 → 0.1.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.
- package/dist/__tests__/task-parser.test.js +29 -29
- package/dist/__tests__/task-parser.test.js.map +1 -1
- package/dist/anthropic-usage.d.ts.map +1 -1
- package/dist/anthropic-usage.js +1 -1
- package/dist/anthropic-usage.js.map +1 -1
- package/dist/cert-generator.d.ts.map +1 -1
- package/dist/cert-generator.js +4 -21
- package/dist/cert-generator.js.map +1 -1
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +413 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -7
- package/dist/config.js.map +1 -1
- package/dist/escalation.d.ts +51 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +198 -0
- package/dist/escalation.js.map +1 -0
- package/dist/index.js +67 -30
- package/dist/index.js.map +1 -1
- package/dist/input-injector.d.ts.map +1 -1
- package/dist/input-injector.js +9 -5
- package/dist/input-injector.js.map +1 -1
- package/dist/notification-store.d.ts +35 -0
- package/dist/notification-store.d.ts.map +1 -0
- package/dist/notification-store.js +272 -0
- package/dist/notification-store.js.map +1 -0
- package/dist/parser.d.ts +15 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +106 -61
- package/dist/parser.js.map +1 -1
- package/dist/push.d.ts +18 -26
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +90 -184
- package/dist/push.js.map +1 -1
- package/dist/qr-server.d.ts.map +1 -1
- package/dist/qr-server.js +159 -139
- package/dist/qr-server.js.map +1 -1
- package/dist/rules-engine.d.ts +20 -0
- package/dist/rules-engine.d.ts.map +1 -0
- package/dist/rules-engine.js +71 -0
- package/dist/rules-engine.js.map +1 -0
- package/dist/scaffold/claude-commands.d.ts +18 -0
- package/dist/scaffold/claude-commands.d.ts.map +1 -0
- package/dist/scaffold/claude-commands.js +352 -0
- package/dist/scaffold/claude-commands.js.map +1 -0
- package/dist/scaffold/generator.d.ts.map +1 -1
- package/dist/scaffold/generator.js +26 -1
- package/dist/scaffold/generator.js.map +1 -1
- package/dist/scaffold/scorer.d.ts +19 -0
- package/dist/scaffold/scorer.d.ts.map +1 -0
- package/dist/scaffold/scorer.js +92 -0
- package/dist/scaffold/scorer.js.map +1 -0
- package/dist/scaffold/templates/go-cli.d.ts +3 -0
- package/dist/scaffold/templates/go-cli.d.ts.map +1 -0
- package/dist/scaffold/templates/go-cli.js +249 -0
- package/dist/scaffold/templates/go-cli.js.map +1 -0
- package/dist/scaffold/templates/index.d.ts.map +1 -1
- package/dist/scaffold/templates/index.js +8 -2
- package/dist/scaffold/templates/index.js.map +1 -1
- package/dist/scaffold/templates/nextjs.d.ts +3 -0
- package/dist/scaffold/templates/nextjs.d.ts.map +1 -0
- package/dist/scaffold/templates/nextjs.js +336 -0
- package/dist/scaffold/templates/nextjs.js.map +1 -0
- package/dist/scaffold/templates/node-express.d.ts.map +1 -1
- package/dist/scaffold/templates/node-express.js +170 -157
- package/dist/scaffold/templates/node-express.js.map +1 -1
- package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -1
- package/dist/scaffold/templates/python-fastapi.js +234 -221
- package/dist/scaffold/templates/python-fastapi.js.map +1 -1
- package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -1
- package/dist/scaffold/templates/react-mui-website.js +337 -324
- package/dist/scaffold/templates/react-mui-website.js.map +1 -1
- package/dist/scaffold/templates/react-typescript.d.ts.map +1 -1
- package/dist/scaffold/templates/react-typescript.js +219 -206
- package/dist/scaffold/templates/react-typescript.js.map +1 -1
- package/dist/scaffold/templates/typescript-library.d.ts +3 -0
- package/dist/scaffold/templates/typescript-library.d.ts.map +1 -0
- package/dist/scaffold/templates/typescript-library.js +241 -0
- package/dist/scaffold/templates/typescript-library.js.map +1 -0
- package/dist/scaffold/types.d.ts +7 -0
- package/dist/scaffold/types.d.ts.map +1 -1
- package/dist/subagent-watcher.d.ts.map +1 -1
- package/dist/subagent-watcher.js +3 -3
- package/dist/subagent-watcher.js.map +1 -1
- package/dist/tmux-manager.d.ts +37 -0
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +165 -5
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-config.d.ts.map +1 -1
- package/dist/tool-config.js +2 -2
- package/dist/tool-config.js.map +1 -1
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -1
- package/dist/watcher.d.ts +7 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +118 -9
- package/dist/watcher.js.map +1 -1
- package/dist/websocket.d.ts +16 -2
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +758 -117
- package/dist/websocket.js.map +1 -1
- package/dist/work-group-manager.d.ts +69 -0
- package/dist/work-group-manager.d.ts.map +1 -0
- package/dist/work-group-manager.js +610 -0
- package/dist/work-group-manager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EscalationService = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
class EscalationService {
|
|
6
|
+
pendingEvents = new Map();
|
|
7
|
+
timers = new Map();
|
|
8
|
+
lastNotifiedPerSession = new Map();
|
|
9
|
+
store;
|
|
10
|
+
push;
|
|
11
|
+
// Auto-expire pending events after 1 hour
|
|
12
|
+
cleanupInterval;
|
|
13
|
+
EXPIRE_MS = 60 * 60 * 1000;
|
|
14
|
+
constructor(store, push) {
|
|
15
|
+
this.store = store;
|
|
16
|
+
this.push = push;
|
|
17
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60 * 1000);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Handle a notification event. Checks escalation config, muted sessions,
|
|
21
|
+
* and rate limits. Returns whether to broadcast to WS clients.
|
|
22
|
+
*/
|
|
23
|
+
handleEvent(event) {
|
|
24
|
+
const config = this.store.getEscalation();
|
|
25
|
+
// Check: event type enabled?
|
|
26
|
+
if (!config.events[event.eventType]) {
|
|
27
|
+
return { shouldBroadcast: false };
|
|
28
|
+
}
|
|
29
|
+
// Check: session muted?
|
|
30
|
+
if (this.store.isSessionMuted(event.sessionId)) {
|
|
31
|
+
return { shouldBroadcast: false };
|
|
32
|
+
}
|
|
33
|
+
// Check: rate-limited?
|
|
34
|
+
if (config.rateLimitSeconds > 0) {
|
|
35
|
+
const lastTime = this.lastNotifiedPerSession.get(event.sessionId);
|
|
36
|
+
if (lastTime && Date.now() - lastTime < config.rateLimitSeconds * 1000) {
|
|
37
|
+
console.log(`Escalation: Rate-limited for session ${event.sessionId} (${config.rateLimitSeconds}s)`);
|
|
38
|
+
return { shouldBroadcast: false };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Record notification time for rate limiting
|
|
42
|
+
this.lastNotifiedPerSession.set(event.sessionId, Date.now());
|
|
43
|
+
// Tier 1 (immediate): broadcast to WS clients -> browser notifications fire
|
|
44
|
+
// Log to history as browser tier
|
|
45
|
+
const preview = event.content.substring(0, 200);
|
|
46
|
+
this.store.addHistoryEntry({
|
|
47
|
+
eventType: event.eventType,
|
|
48
|
+
sessionId: event.sessionId,
|
|
49
|
+
sessionName: event.sessionName,
|
|
50
|
+
preview,
|
|
51
|
+
tier: 'browser',
|
|
52
|
+
acknowledged: false,
|
|
53
|
+
});
|
|
54
|
+
// Create pending event and schedule push timer
|
|
55
|
+
const pendingId = (0, uuid_1.v4)();
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
const pushScheduledAt = now + config.pushDelaySeconds * 1000;
|
|
58
|
+
const pendingEvent = {
|
|
59
|
+
id: pendingId,
|
|
60
|
+
sessionId: event.sessionId,
|
|
61
|
+
sessionName: event.sessionName,
|
|
62
|
+
eventType: event.eventType,
|
|
63
|
+
preview,
|
|
64
|
+
createdAt: now,
|
|
65
|
+
pushScheduledAt,
|
|
66
|
+
pushSent: false,
|
|
67
|
+
};
|
|
68
|
+
this.pendingEvents.set(pendingId, pendingEvent);
|
|
69
|
+
// Schedule push escalation timer
|
|
70
|
+
if (config.pushDelaySeconds === 0) {
|
|
71
|
+
// Immediate push
|
|
72
|
+
this.firePush(pendingId);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const timer = setTimeout(() => {
|
|
76
|
+
this.firePush(pendingId);
|
|
77
|
+
}, config.pushDelaySeconds * 1000);
|
|
78
|
+
this.timers.set(pendingId, timer);
|
|
79
|
+
}
|
|
80
|
+
console.log(`Escalation: Event ${event.eventType} for session "${event.sessionName}" — push scheduled in ${config.pushDelaySeconds}s`);
|
|
81
|
+
return { shouldBroadcast: true, pendingEvent };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Acknowledge a session — cancels any pending push timers for that session.
|
|
85
|
+
* Called when user views session, sends input, or session stops waiting.
|
|
86
|
+
*/
|
|
87
|
+
acknowledgeSession(sessionId) {
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
let cancelled = 0;
|
|
90
|
+
for (const [pendingId, event] of this.pendingEvents) {
|
|
91
|
+
if (event.sessionId === sessionId && !event.pushSent && !event.acknowledgedAt) {
|
|
92
|
+
event.acknowledgedAt = now;
|
|
93
|
+
// Cancel the push timer
|
|
94
|
+
const timer = this.timers.get(pendingId);
|
|
95
|
+
if (timer) {
|
|
96
|
+
clearTimeout(timer);
|
|
97
|
+
this.timers.delete(pendingId);
|
|
98
|
+
}
|
|
99
|
+
cancelled++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (cancelled > 0) {
|
|
103
|
+
console.log(`Escalation: Acknowledged session "${sessionId}" — cancelled ${cancelled} pending push(es)`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get all pending (unacknowledged, unsent) events.
|
|
108
|
+
*/
|
|
109
|
+
getPendingEvents() {
|
|
110
|
+
return Array.from(this.pendingEvents.values()).filter((e) => !e.pushSent && !e.acknowledgedAt);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Fire push notification for a pending event (Tier 2 escalation).
|
|
114
|
+
*/
|
|
115
|
+
firePush(pendingId) {
|
|
116
|
+
const event = this.pendingEvents.get(pendingId);
|
|
117
|
+
if (!event)
|
|
118
|
+
return;
|
|
119
|
+
// Already acknowledged or sent?
|
|
120
|
+
if (event.acknowledgedAt || event.pushSent) {
|
|
121
|
+
this.timers.delete(pendingId);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Check quiet hours
|
|
125
|
+
const config = this.store.getEscalation();
|
|
126
|
+
if (config.quietHours.enabled &&
|
|
127
|
+
this.isInQuietHours(config.quietHours.start, config.quietHours.end)) {
|
|
128
|
+
console.log(`Escalation: Push suppressed for "${event.sessionName}" — quiet hours`);
|
|
129
|
+
event.pushSent = true; // Mark as handled so it doesn't retry
|
|
130
|
+
this.timers.delete(pendingId);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Send push to all registered devices
|
|
134
|
+
event.pushSent = true;
|
|
135
|
+
this.timers.delete(pendingId);
|
|
136
|
+
this.push.sendToAllDevices(event.preview, event.eventType, event.sessionId, event.sessionName);
|
|
137
|
+
// Update history: add a push tier entry
|
|
138
|
+
this.store.addHistoryEntry({
|
|
139
|
+
eventType: event.eventType,
|
|
140
|
+
sessionId: event.sessionId,
|
|
141
|
+
sessionName: event.sessionName,
|
|
142
|
+
preview: event.preview,
|
|
143
|
+
tier: 'push',
|
|
144
|
+
acknowledged: false,
|
|
145
|
+
});
|
|
146
|
+
console.log(`Escalation: Push sent for "${event.sessionName}" (${event.eventType})`);
|
|
147
|
+
}
|
|
148
|
+
isInQuietHours(start, end) {
|
|
149
|
+
const now = new Date();
|
|
150
|
+
const currentMinutes = now.getHours() * 60 + now.getMinutes();
|
|
151
|
+
const [startH, startM] = start.split(':').map(Number);
|
|
152
|
+
const [endH, endM] = end.split(':').map(Number);
|
|
153
|
+
const startMinutes = startH * 60 + startM;
|
|
154
|
+
const endMinutes = endH * 60 + endM;
|
|
155
|
+
// Handle overnight quiet hours (e.g., 22:00 - 08:00)
|
|
156
|
+
if (startMinutes > endMinutes) {
|
|
157
|
+
return currentMinutes >= startMinutes || currentMinutes < endMinutes;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return currentMinutes >= startMinutes && currentMinutes < endMinutes;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Auto-expire old pending events.
|
|
165
|
+
*/
|
|
166
|
+
cleanup() {
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
let cleaned = 0;
|
|
169
|
+
for (const [pendingId, event] of this.pendingEvents) {
|
|
170
|
+
if (now - event.createdAt > this.EXPIRE_MS) {
|
|
171
|
+
// Cancel timer if still running
|
|
172
|
+
const timer = this.timers.get(pendingId);
|
|
173
|
+
if (timer) {
|
|
174
|
+
clearTimeout(timer);
|
|
175
|
+
this.timers.delete(pendingId);
|
|
176
|
+
}
|
|
177
|
+
this.pendingEvents.delete(pendingId);
|
|
178
|
+
cleaned++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (cleaned > 0) {
|
|
182
|
+
console.log(`Escalation: Cleaned up ${cleaned} expired pending event(s)`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Destroy the service (clear timers).
|
|
187
|
+
*/
|
|
188
|
+
destroy() {
|
|
189
|
+
clearInterval(this.cleanupInterval);
|
|
190
|
+
for (const timer of this.timers.values()) {
|
|
191
|
+
clearTimeout(timer);
|
|
192
|
+
}
|
|
193
|
+
this.timers.clear();
|
|
194
|
+
this.pendingEvents.clear();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.EscalationService = EscalationService;
|
|
198
|
+
//# sourceMappingURL=escalation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../src/escalation.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,11 +7,24 @@ const subagent_watcher_1 = require("./subagent-watcher");
|
|
|
7
7
|
const input_injector_1 = require("./input-injector");
|
|
8
8
|
const mdns_1 = require("./mdns");
|
|
9
9
|
const push_1 = require("./push");
|
|
10
|
+
const notification_store_1 = require("./notification-store");
|
|
10
11
|
const websocket_1 = require("./websocket");
|
|
11
12
|
const tmux_manager_1 = require("./tmux-manager");
|
|
13
|
+
const work_group_manager_1 = require("./work-group-manager");
|
|
12
14
|
const tls_1 = require("./tls");
|
|
13
15
|
const cert_generator_1 = require("./cert-generator");
|
|
14
16
|
const qr_server_1 = require("./qr-server");
|
|
17
|
+
const cli_1 = require("./cli");
|
|
18
|
+
// Check CLI commands before starting daemon
|
|
19
|
+
const cliArgs = process.argv.slice(2);
|
|
20
|
+
(0, cli_1.dispatchCli)(cliArgs).then((handled) => {
|
|
21
|
+
if (!handled) {
|
|
22
|
+
main().catch((err) => {
|
|
23
|
+
console.error('Fatal error:', err);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
15
28
|
async function main() {
|
|
16
29
|
console.log('Companion Daemon v0.0.1');
|
|
17
30
|
console.log('==============================');
|
|
@@ -55,7 +68,8 @@ async function main() {
|
|
|
55
68
|
const watcher = new watcher_1.SessionWatcher(config.codeHome);
|
|
56
69
|
const subAgentWatcher = new subagent_watcher_1.SubAgentWatcher(config.codeHome);
|
|
57
70
|
const injector = new input_injector_1.InputInjector(config.tmuxSession);
|
|
58
|
-
const
|
|
71
|
+
const notificationStore = new notification_store_1.NotificationStore();
|
|
72
|
+
const push = new push_1.PushNotificationService(config.fcmCredentialsPath, config.pushDelayMs, notificationStore);
|
|
59
73
|
// Create HTTP/HTTPS server with QR code endpoint
|
|
60
74
|
const qrHandler = (0, qr_server_1.createQRRequestHandler)(config);
|
|
61
75
|
const server = (0, tls_1.createServer)({
|
|
@@ -63,8 +77,27 @@ async function main() {
|
|
|
63
77
|
certPath: config.certPath,
|
|
64
78
|
keyPath: config.keyPath,
|
|
65
79
|
}, qrHandler);
|
|
80
|
+
// Initialize work group manager for parallel /work orchestration
|
|
81
|
+
const workGroupTmux = new tmux_manager_1.TmuxManager('companion');
|
|
82
|
+
const workGroupManager = new work_group_manager_1.WorkGroupManager(workGroupTmux, injector, watcher);
|
|
83
|
+
// Work group push notifications
|
|
84
|
+
workGroupManager.on('worker-waiting', ({ groupName, worker }) => {
|
|
85
|
+
const preview = worker.lastQuestion?.text
|
|
86
|
+
? `${worker.taskSlug}: ${worker.lastQuestion.text}`
|
|
87
|
+
: `Worker "${worker.taskSlug}" needs input`;
|
|
88
|
+
push.sendToAllDevices(preview, 'worker_waiting', worker.sessionId, groupName);
|
|
89
|
+
});
|
|
90
|
+
workGroupManager.on('worker-error', ({ groupName, worker }) => {
|
|
91
|
+
const preview = worker.error
|
|
92
|
+
? `${worker.taskSlug}: ${worker.error}`
|
|
93
|
+
: `Worker "${worker.taskSlug}" encountered an error`;
|
|
94
|
+
push.sendToAllDevices(preview, 'worker_error', worker.sessionId, groupName);
|
|
95
|
+
});
|
|
96
|
+
workGroupManager.on('group-ready-to-merge', ({ name }) => {
|
|
97
|
+
push.sendToAllDevices(`All workers complete. Ready to merge.`, 'work_group_ready', undefined, name);
|
|
98
|
+
});
|
|
66
99
|
// Initialize WebSocket handler
|
|
67
|
-
const wsHandler = new websocket_1.WebSocketHandler(server, config, watcher, injector, push, undefined, subAgentWatcher);
|
|
100
|
+
const wsHandler = new websocket_1.WebSocketHandler(server, config, watcher, injector, push, undefined, subAgentWatcher, workGroupManager);
|
|
68
101
|
// Start mDNS advertisement
|
|
69
102
|
let mdns = null;
|
|
70
103
|
if (config.mdnsEnabled) {
|
|
@@ -74,23 +107,26 @@ async function main() {
|
|
|
74
107
|
// Start file watchers
|
|
75
108
|
watcher.start();
|
|
76
109
|
subAgentWatcher.start();
|
|
77
|
-
// Auto-approve
|
|
110
|
+
// Auto-approve tools (from config and/or per-session client toggle)
|
|
78
111
|
{
|
|
79
112
|
console.log(`Auto-approve tools from config: ${config.autoApproveTools.length > 0 ? config.autoApproveTools.join(', ') : '(none - client toggle only)'}`);
|
|
80
113
|
const tmux = new tmux_manager_1.TmuxManager('companion');
|
|
81
|
-
// Track
|
|
82
|
-
|
|
114
|
+
// Track recent approvals per session to avoid double-firing for the same prompt.
|
|
115
|
+
// Key: sessionId, Value: timestamp of last approval sent.
|
|
116
|
+
const lastApprovalBySession = new Map();
|
|
83
117
|
watcher.on('pending-approval', async ({ sessionId, projectPath, tools }) => {
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
118
|
+
// Check per-session toggle OR config-level tools
|
|
119
|
+
const sessionEnabled = wsHandler.autoApproveSessions.has(sessionId);
|
|
120
|
+
if (config.autoApproveTools.length === 0 && !sessionEnabled) {
|
|
121
|
+
console.log(`[AUTO-APPROVE] Skipped: not enabled for session ${sessionId}`);
|
|
87
122
|
return;
|
|
88
123
|
}
|
|
89
|
-
//
|
|
124
|
+
// Only approve tools that are in the config list OR if the session has auto-approve on.
|
|
125
|
+
// Either way, only APPROVAL_TOOLS are valid (getPendingApprovalTools already filters).
|
|
90
126
|
const autoApprovable = tools.filter((tool) => {
|
|
91
127
|
if (config.autoApproveTools.includes(tool))
|
|
92
128
|
return true;
|
|
93
|
-
if (
|
|
129
|
+
if (sessionEnabled)
|
|
94
130
|
return true;
|
|
95
131
|
return false;
|
|
96
132
|
});
|
|
@@ -98,21 +134,21 @@ async function main() {
|
|
|
98
134
|
console.log(`[AUTO-APPROVE] No auto-approvable tools in: [${tools.join(', ')}]`);
|
|
99
135
|
return;
|
|
100
136
|
}
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
|
|
137
|
+
// Per-session dedup: don't re-fire within 3 seconds of the last approval
|
|
138
|
+
// for the same session. This prevents double-sends when the file watcher
|
|
139
|
+
// re-fires before the CLI has processed the previous "yes".
|
|
140
|
+
// Short window (3s) so sequential tool approvals still work.
|
|
105
141
|
const now = Date.now();
|
|
106
|
-
const lastApproval =
|
|
107
|
-
if (lastApproval && now - lastApproval <
|
|
108
|
-
console.log(`[AUTO-APPROVE] Dedup: skipping (last approval ${now - lastApproval}ms ago for ${
|
|
142
|
+
const lastApproval = lastApprovalBySession.get(sessionId);
|
|
143
|
+
if (lastApproval && now - lastApproval < 3000) {
|
|
144
|
+
console.log(`[AUTO-APPROVE] Dedup: skipping (last approval ${now - lastApproval}ms ago for ${sessionId})`);
|
|
109
145
|
return;
|
|
110
146
|
}
|
|
111
|
-
|
|
147
|
+
lastApprovalBySession.set(sessionId, now);
|
|
112
148
|
// Clean up old entries
|
|
113
|
-
for (const [key, ts] of
|
|
149
|
+
for (const [key, ts] of lastApprovalBySession) {
|
|
114
150
|
if (now - ts > 30000)
|
|
115
|
-
|
|
151
|
+
lastApprovalBySession.delete(key);
|
|
116
152
|
}
|
|
117
153
|
try {
|
|
118
154
|
// Find the tmux session that matches this conversation's project path
|
|
@@ -120,14 +156,14 @@ async function main() {
|
|
|
120
156
|
if (projectPath) {
|
|
121
157
|
const tmuxSessions = await tmux.listSessions();
|
|
122
158
|
// Try exact match first
|
|
123
|
-
const exactMatch = tmuxSessions.find(ts => ts.workingDir === projectPath);
|
|
159
|
+
const exactMatch = tmuxSessions.find((ts) => ts.workingDir === projectPath);
|
|
124
160
|
if (exactMatch) {
|
|
125
161
|
targetTmuxSession = exactMatch.name;
|
|
126
162
|
}
|
|
127
163
|
else {
|
|
128
164
|
// Try normalized path match (trailing slash differences, symlinks)
|
|
129
165
|
const normalizedPath = projectPath.replace(/\/+$/, '');
|
|
130
|
-
const fuzzyMatch = tmuxSessions.find(ts => ts.workingDir?.replace(/\/+$/, '') === normalizedPath);
|
|
166
|
+
const fuzzyMatch = tmuxSessions.find((ts) => ts.workingDir?.replace(/\/+$/, '') === normalizedPath);
|
|
131
167
|
if (fuzzyMatch) {
|
|
132
168
|
targetTmuxSession = fuzzyMatch.name;
|
|
133
169
|
console.log(`[AUTO-APPROVE] Fuzzy path match: "${fuzzyMatch.name}" for ${projectPath}`);
|
|
@@ -135,7 +171,7 @@ async function main() {
|
|
|
135
171
|
}
|
|
136
172
|
}
|
|
137
173
|
// Wait for terminal to settle before sending approval
|
|
138
|
-
await new Promise(resolve => setTimeout(resolve, 300));
|
|
174
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
139
175
|
const sendApproval = async (target) => {
|
|
140
176
|
try {
|
|
141
177
|
await injector.sendInput('yes', target);
|
|
@@ -150,9 +186,8 @@ async function main() {
|
|
|
150
186
|
console.log(`[AUTO-APPROVE] Sending to tmux="${targetTmuxSession}" for tools [${autoApprovable.join(', ')}] (session: ${sessionId})`);
|
|
151
187
|
const success = await sendApproval(targetTmuxSession);
|
|
152
188
|
if (!success) {
|
|
153
|
-
// Retry once after 500ms
|
|
154
189
|
console.log(`[AUTO-APPROVE] Retrying after 500ms...`);
|
|
155
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
190
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
156
191
|
await sendApproval(targetTmuxSession);
|
|
157
192
|
}
|
|
158
193
|
}
|
|
@@ -161,7 +196,7 @@ async function main() {
|
|
|
161
196
|
const success = await sendApproval();
|
|
162
197
|
if (!success) {
|
|
163
198
|
console.log(`[AUTO-APPROVE] Retrying after 500ms...`);
|
|
164
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
199
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
165
200
|
await sendApproval();
|
|
166
201
|
}
|
|
167
202
|
}
|
|
@@ -171,6 +206,8 @@ async function main() {
|
|
|
171
206
|
}
|
|
172
207
|
});
|
|
173
208
|
}
|
|
209
|
+
// Write PID file for CLI management
|
|
210
|
+
(0, cli_1.writePidFile)();
|
|
174
211
|
// Start HTTP server
|
|
175
212
|
server.listen(config.port, () => {
|
|
176
213
|
console.log(`Server listening on port ${config.port}`);
|
|
@@ -180,6 +217,9 @@ async function main() {
|
|
|
180
217
|
// Graceful shutdown
|
|
181
218
|
const shutdown = async () => {
|
|
182
219
|
console.log('\nShutting down...');
|
|
220
|
+
(0, cli_1.removePidFile)();
|
|
221
|
+
notificationStore.flush();
|
|
222
|
+
workGroupManager.stop();
|
|
183
223
|
watcher.stop();
|
|
184
224
|
subAgentWatcher.stop();
|
|
185
225
|
if (mdns)
|
|
@@ -204,8 +244,5 @@ async function main() {
|
|
|
204
244
|
`push devices: ${push.getRegisteredDeviceCount()}`);
|
|
205
245
|
}, 60000);
|
|
206
246
|
}
|
|
207
|
-
main()
|
|
208
|
-
console.error('Fatal error:', err);
|
|
209
|
-
process.exit(1);
|
|
210
|
-
});
|
|
247
|
+
// main() is called from the CLI dispatcher above
|
|
211
248
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,qCAAsC;AACtC,uCAA2C;AAC3C,yDAAqD;AACrD,qDAAiD;AACjD,iCAAwC;AACxC,iCAAiD;AACjD,2CAA+C;AAC/C,iDAA6C;AAC7C,+BAAwD;AACxD,qDAAyF;AACzF,2CAAqD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-injector.d.ts","sourceRoot":"","sources":["../src/input-injector.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAoC;gBAExC,WAAW,EAAE,MAAM;IAK/B;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA4B1D,WAAW;
|
|
1
|
+
{"version":3,"file":"input-injector.d.ts","sourceRoot":"","sources":["../src/input-injector.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAoC;gBAExC,WAAW,EAAE,MAAM;IAK/B;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YA4B1D,WAAW;IAwCzB,OAAO,CAAC,eAAe;IAWjB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBvC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI3C,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,IAAI,MAAM;IAK3B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKrC,UAAU,IAAI,MAAM;CAGrB"}
|
package/dist/input-injector.js
CHANGED
|
@@ -18,7 +18,7 @@ class InputInjector {
|
|
|
18
18
|
// Wait for any pending send to complete before starting this one
|
|
19
19
|
const previousLock = this.sendLock;
|
|
20
20
|
let releaseLock;
|
|
21
|
-
this.sendLock = new Promise(resolve => {
|
|
21
|
+
this.sendLock = new Promise((resolve) => {
|
|
22
22
|
releaseLock = resolve;
|
|
23
23
|
});
|
|
24
24
|
try {
|
|
@@ -43,23 +43,27 @@ class InputInjector {
|
|
|
43
43
|
console.log(`Sending input to tmux session '${session}': ${input.substring(0, 80)}...`);
|
|
44
44
|
const { spawnSync } = require('child_process');
|
|
45
45
|
// Send the text using spawnSync (avoids shell interpretation)
|
|
46
|
-
const textResult = spawnSync('tmux', ['send-keys', '-t', session, '-l', '--', input], {
|
|
46
|
+
const textResult = spawnSync('tmux', ['send-keys', '-t', session, '-l', '--', input], {
|
|
47
|
+
timeout: 5000,
|
|
48
|
+
});
|
|
47
49
|
if (textResult.status !== 0) {
|
|
48
50
|
console.error('Failed to send text:', textResult.stderr?.toString());
|
|
49
51
|
return false;
|
|
50
52
|
}
|
|
51
53
|
console.log('Text sent to tmux');
|
|
52
54
|
// Wait for tmux to process the text before sending Enter
|
|
53
|
-
await new Promise(resolve => setTimeout(resolve, 150));
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
54
56
|
// Send Enter
|
|
55
|
-
const enterResult = spawnSync('tmux', ['send-keys', '-t', session, 'Enter'], {
|
|
57
|
+
const enterResult = spawnSync('tmux', ['send-keys', '-t', session, 'Enter'], {
|
|
58
|
+
timeout: 5000,
|
|
59
|
+
});
|
|
56
60
|
if (enterResult.status !== 0) {
|
|
57
61
|
console.error('Failed to send Enter:', enterResult.stderr?.toString());
|
|
58
62
|
return false;
|
|
59
63
|
}
|
|
60
64
|
console.log('Enter sent to tmux');
|
|
61
65
|
// Small delay after Enter to ensure tmux processes it before next message
|
|
62
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
66
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
63
67
|
console.log(`Input sent successfully to tmux session '${session}'`);
|
|
64
68
|
return true;
|
|
65
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-injector.js","sourceRoot":"","sources":["../src/input-injector.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"input-injector.js","sourceRoot":"","sources":["../src/input-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RegisteredDevice, EscalationConfig, NotificationHistoryEntry } from './types';
|
|
2
|
+
export declare class NotificationStore {
|
|
3
|
+
private escalation;
|
|
4
|
+
private devices;
|
|
5
|
+
private mutedSessions;
|
|
6
|
+
private history;
|
|
7
|
+
private saveTimer;
|
|
8
|
+
private historySaveTimer;
|
|
9
|
+
constructor();
|
|
10
|
+
private ensureDir;
|
|
11
|
+
private load;
|
|
12
|
+
private scheduleSave;
|
|
13
|
+
private scheduleHistorySave;
|
|
14
|
+
private saveState;
|
|
15
|
+
private saveHistory;
|
|
16
|
+
getEscalation(): EscalationConfig;
|
|
17
|
+
setEscalation(config: Partial<EscalationConfig>): EscalationConfig;
|
|
18
|
+
getDevices(): RegisteredDevice[];
|
|
19
|
+
getDevice(deviceId: string): RegisteredDevice | undefined;
|
|
20
|
+
setDevice(device: RegisteredDevice): void;
|
|
21
|
+
removeDevice(deviceId: string): boolean;
|
|
22
|
+
updateDeviceLastSeen(deviceId: string): void;
|
|
23
|
+
getDeviceCount(): number;
|
|
24
|
+
getMutedSessions(): string[];
|
|
25
|
+
isSessionMuted(sessionId: string): boolean;
|
|
26
|
+
setSessionMuted(sessionId: string, muted: boolean): void;
|
|
27
|
+
getHistory(limit?: number): {
|
|
28
|
+
entries: NotificationHistoryEntry[];
|
|
29
|
+
total: number;
|
|
30
|
+
};
|
|
31
|
+
addHistoryEntry(entry: Omit<NotificationHistoryEntry, 'id' | 'timestamp'>): NotificationHistoryEntry;
|
|
32
|
+
clearHistory(): void;
|
|
33
|
+
flush(): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=notification-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-store.d.ts","sourceRoot":"","sources":["../src/notification-store.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAEhB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AASjB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAsD;IACxE,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,OAAO,CAAkC;IAEjD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,gBAAgB,CAA+B;;IAOvD,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,IAAI;IA0EZ,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,WAAW;IAUnB,aAAa,IAAI,gBAAgB;IAIjC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;IAmBlE,UAAU,IAAI,gBAAgB,EAAE;IAIhC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIzD,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAKzC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMvC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5C,cAAc,IAAI,MAAM;IAMxB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI1C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAWxD,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAMlF,eAAe,CACb,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,GAAG,WAAW,CAAC,GACxD,wBAAwB;IAc3B,YAAY,IAAI,IAAI;IAMpB,KAAK,IAAI,IAAI;CAYd"}
|