ftown-bridge 0.19.44 → 0.19.49
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/claude-mod/.claude-plugin/plugin.json +6 -0
- package/claude-mod/hooks/hooks.json +3 -0
- package/claude-mod/hooks/register.js +137 -0
- package/dist/agent-commands.js +17 -2
- package/dist/agent-commands.js.map +1 -1
- package/dist/attention-store.d.ts +21 -1
- package/dist/attention-store.js +131 -3
- package/dist/attention-store.js.map +1 -1
- package/dist/claude-mod-installer.d.ts +9 -0
- package/dist/claude-mod-installer.js +55 -0
- package/dist/claude-mod-installer.js.map +1 -0
- package/dist/claude-runner.d.ts +8 -0
- package/dist/claude-runner.js +11 -4
- package/dist/claude-runner.js.map +1 -1
- package/dist/ftown-cli.d.ts +1 -1
- package/dist/ftown-cli.js +11 -3
- package/dist/ftown-cli.js.map +1 -1
- package/dist/harness-registry.js +4 -0
- package/dist/harness-registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +719 -671
- package/dist/index.js.map +1 -1
- package/dist/install-ftown-command-cli.d.ts +1 -1
- package/dist/install-ftown-command-cli.js +35 -44
- package/dist/install-ftown-command-cli.js.map +1 -1
- package/dist/installation-manifest.d.ts +25 -0
- package/dist/installation-manifest.js +37 -0
- package/dist/installation-manifest.js.map +1 -0
- package/dist/local-api-server.d.ts +8 -0
- package/dist/local-api-server.js +73 -1
- package/dist/local-api-server.js.map +1 -1
- package/dist/mail-delivery.d.ts +30 -0
- package/dist/mail-delivery.js +202 -8
- package/dist/mail-delivery.js.map +1 -1
- package/dist/mcp/fleet.d.ts +2 -2
- package/dist/native-mail.d.ts +31 -0
- package/dist/native-mail.js +142 -0
- package/dist/native-mail.js.map +1 -0
- package/dist/production-dependencies.d.ts +13 -0
- package/dist/production-dependencies.js +175 -0
- package/dist/production-dependencies.js.map +1 -0
- package/dist/push-notifier.d.ts +40 -0
- package/dist/push-notifier.js +126 -0
- package/dist/push-notifier.js.map +1 -0
- package/dist/sessions-commands.js +278 -310
- package/dist/sessions-commands.js.map +1 -1
- package/dist/setup-state.d.ts +1 -2
- package/dist/setup-state.js +31 -11
- package/dist/setup-state.js.map +1 -1
- package/dist/setup.js +3 -1
- package/dist/setup.js.map +1 -1
- package/dist/start-commands.d.ts +10 -0
- package/dist/start-commands.js +15 -0
- package/dist/start-commands.js.map +1 -0
- package/opencode-plugin/ftown.js +142 -129
- package/package.json +3 -2
- package/skills/ftown/SKILL.md +7 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const defaults = { fetch: (...args) => fetch(...args), now: Date.now,
|
|
2
|
+
schedule: (fn, ms) => setTimeout(fn, ms), cancel: clearTimeout };
|
|
3
|
+
/** A bounded, best-effort queue. Cloud event/delivery keys provide durable dedup. */
|
|
4
|
+
export class BridgePushNotifier {
|
|
5
|
+
options;
|
|
6
|
+
deps;
|
|
7
|
+
queue = new Map();
|
|
8
|
+
running = false;
|
|
9
|
+
stopped = false;
|
|
10
|
+
timer;
|
|
11
|
+
inflight;
|
|
12
|
+
constructor(options, deps = defaults) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.deps = deps;
|
|
15
|
+
}
|
|
16
|
+
notify(sessionId, notice) {
|
|
17
|
+
if (this.stopped || !/^[a-zA-Z0-9_-]+$/.test(sessionId))
|
|
18
|
+
return;
|
|
19
|
+
const key = `${sessionId}:${notice.eventKey}`;
|
|
20
|
+
if (this.queue.has(key) || this.queue.size >= 100)
|
|
21
|
+
return;
|
|
22
|
+
this.queue.set(key, { sessionId, notice, expires: this.deps.now() + 300_000, attempt: 0, nextAttemptAt: this.deps.now(), canceled: false });
|
|
23
|
+
this.wake();
|
|
24
|
+
}
|
|
25
|
+
cancelIdle(sessionId) {
|
|
26
|
+
for (const [key, item] of this.queue) {
|
|
27
|
+
if (item.sessionId !== sessionId || item.notice.kind !== 'idle')
|
|
28
|
+
continue;
|
|
29
|
+
item.canceled = true;
|
|
30
|
+
this.queue.delete(key);
|
|
31
|
+
if (this.inflight?.item === item)
|
|
32
|
+
this.inflight.controller.abort();
|
|
33
|
+
}
|
|
34
|
+
this.wake();
|
|
35
|
+
}
|
|
36
|
+
stop() {
|
|
37
|
+
this.stopped = true;
|
|
38
|
+
for (const item of this.queue.values())
|
|
39
|
+
item.canceled = true;
|
|
40
|
+
this.queue.clear();
|
|
41
|
+
if (this.timer)
|
|
42
|
+
this.deps.cancel(this.timer);
|
|
43
|
+
this.timer = undefined;
|
|
44
|
+
this.inflight?.controller.abort();
|
|
45
|
+
}
|
|
46
|
+
wake() {
|
|
47
|
+
if (this.stopped || this.running)
|
|
48
|
+
return;
|
|
49
|
+
if (this.timer)
|
|
50
|
+
this.deps.cancel(this.timer);
|
|
51
|
+
this.timer = undefined;
|
|
52
|
+
void this.drain();
|
|
53
|
+
}
|
|
54
|
+
async drain() {
|
|
55
|
+
if (this.running || this.stopped)
|
|
56
|
+
return;
|
|
57
|
+
this.running = true;
|
|
58
|
+
try {
|
|
59
|
+
while (this.queue.size && !this.stopped) {
|
|
60
|
+
for (const [key, item] of this.queue)
|
|
61
|
+
if (this.deps.now() >= item.expires)
|
|
62
|
+
this.queue.delete(key);
|
|
63
|
+
if (!this.queue.size)
|
|
64
|
+
return;
|
|
65
|
+
const entry = Array.from(this.queue.entries()).find(([, item]) => item.nextAttemptAt <= this.deps.now());
|
|
66
|
+
if (!entry) {
|
|
67
|
+
const next = Math.min(...Array.from(this.queue.values(), (item) => Math.min(item.nextAttemptAt, item.expires)));
|
|
68
|
+
this.timer = this.deps.schedule(() => { this.timer = undefined; void this.drain(); }, Math.max(0, next - this.deps.now()));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const [key, item] = entry;
|
|
72
|
+
const current = () => !this.stopped && !item.canceled && this.queue.get(key) === item;
|
|
73
|
+
let transient = false;
|
|
74
|
+
try {
|
|
75
|
+
const session = await this.options.getSession(item.sessionId);
|
|
76
|
+
if (!current())
|
|
77
|
+
continue;
|
|
78
|
+
if (!session || session.shellType === 'shell' || (session.status !== undefined && session.status !== 'running')) {
|
|
79
|
+
this.queue.delete(key);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const token = await this.options.getToken();
|
|
83
|
+
if (!current())
|
|
84
|
+
continue;
|
|
85
|
+
if (this.deps.now() >= item.expires) {
|
|
86
|
+
this.queue.delete(key);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const controller = new AbortController();
|
|
90
|
+
this.inflight = { item, controller };
|
|
91
|
+
const timeout = this.deps.schedule(() => controller.abort(), Math.min(10_000, item.expires - this.deps.now()));
|
|
92
|
+
try {
|
|
93
|
+
if (!current())
|
|
94
|
+
continue;
|
|
95
|
+
const response = await this.deps.fetch(`${this.options.apiUrl.replace(/\/$/, '')}/api/push/events`, {
|
|
96
|
+
method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
|
|
97
|
+
body: JSON.stringify({ ...item.notice, bridgeId: this.options.bridgeId, sessionId: item.sessionId, sessionName: session.name }),
|
|
98
|
+
signal: controller.signal,
|
|
99
|
+
});
|
|
100
|
+
transient = response.status === 408 || response.status === 429 || response.status >= 500;
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
this.deps.cancel(timeout);
|
|
104
|
+
if (this.inflight?.item === item)
|
|
105
|
+
this.inflight = undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
transient = true;
|
|
110
|
+
}
|
|
111
|
+
if (!current())
|
|
112
|
+
continue;
|
|
113
|
+
if (!transient || this.deps.now() >= item.expires) {
|
|
114
|
+
this.queue.delete(key);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const wait = Math.min([5_000, 15_000, 60_000][Math.min(item.attempt++, 2)], item.expires - this.deps.now());
|
|
118
|
+
item.nextAttemptAt = this.deps.now() + wait;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
this.running = false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=push-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-notifier.js","sourceRoot":"","sources":["../src/push-notifier.ts"],"names":[],"mappings":"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"}
|