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.
Files changed (57) hide show
  1. package/claude-mod/.claude-plugin/plugin.json +6 -0
  2. package/claude-mod/hooks/hooks.json +3 -0
  3. package/claude-mod/hooks/register.js +137 -0
  4. package/dist/agent-commands.js +17 -2
  5. package/dist/agent-commands.js.map +1 -1
  6. package/dist/attention-store.d.ts +21 -1
  7. package/dist/attention-store.js +131 -3
  8. package/dist/attention-store.js.map +1 -1
  9. package/dist/claude-mod-installer.d.ts +9 -0
  10. package/dist/claude-mod-installer.js +55 -0
  11. package/dist/claude-mod-installer.js.map +1 -0
  12. package/dist/claude-runner.d.ts +8 -0
  13. package/dist/claude-runner.js +11 -4
  14. package/dist/claude-runner.js.map +1 -1
  15. package/dist/ftown-cli.d.ts +1 -1
  16. package/dist/ftown-cli.js +11 -3
  17. package/dist/ftown-cli.js.map +1 -1
  18. package/dist/harness-registry.js +4 -0
  19. package/dist/harness-registry.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +719 -671
  22. package/dist/index.js.map +1 -1
  23. package/dist/install-ftown-command-cli.d.ts +1 -1
  24. package/dist/install-ftown-command-cli.js +35 -44
  25. package/dist/install-ftown-command-cli.js.map +1 -1
  26. package/dist/installation-manifest.d.ts +25 -0
  27. package/dist/installation-manifest.js +37 -0
  28. package/dist/installation-manifest.js.map +1 -0
  29. package/dist/local-api-server.d.ts +8 -0
  30. package/dist/local-api-server.js +73 -1
  31. package/dist/local-api-server.js.map +1 -1
  32. package/dist/mail-delivery.d.ts +30 -0
  33. package/dist/mail-delivery.js +202 -8
  34. package/dist/mail-delivery.js.map +1 -1
  35. package/dist/mcp/fleet.d.ts +2 -2
  36. package/dist/native-mail.d.ts +31 -0
  37. package/dist/native-mail.js +142 -0
  38. package/dist/native-mail.js.map +1 -0
  39. package/dist/production-dependencies.d.ts +13 -0
  40. package/dist/production-dependencies.js +175 -0
  41. package/dist/production-dependencies.js.map +1 -0
  42. package/dist/push-notifier.d.ts +40 -0
  43. package/dist/push-notifier.js +126 -0
  44. package/dist/push-notifier.js.map +1 -0
  45. package/dist/sessions-commands.js +278 -310
  46. package/dist/sessions-commands.js.map +1 -1
  47. package/dist/setup-state.d.ts +1 -2
  48. package/dist/setup-state.js +31 -11
  49. package/dist/setup-state.js.map +1 -1
  50. package/dist/setup.js +3 -1
  51. package/dist/setup.js.map +1 -1
  52. package/dist/start-commands.d.ts +10 -0
  53. package/dist/start-commands.js +15 -0
  54. package/dist/start-commands.js.map +1 -0
  55. package/opencode-plugin/ftown.js +142 -129
  56. package/package.json +3 -2
  57. 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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"}