@floegence/floeterm-terminal-web 0.3.2 → 0.4.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/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export { TerminalCore } from './core/TerminalCore';
2
2
  export { useTerminalInstance } from './hooks/useTerminalInstance';
3
+ export { TerminalSessionsCoordinator } from './sessions/TerminalSessionsCoordinator';
4
+ export type { TerminalSessionsCoordinatorOptions } from './sessions/TerminalSessionsCoordinator';
3
5
  export type { Logger, TerminalConfig, TerminalResponsiveConfig, TerminalEventHandlers, TerminalState, TerminalID, TerminalSessionInfo, TerminalDataChunk, TerminalDataEvent, TerminalNameUpdateEvent, TerminalTransport, TerminalEventSource, TerminalManagerOptions, TerminalManagerReturn, TerminalManagerActions, TerminalManagerState, TerminalError, TerminalThemeName } from './types';
4
6
  export { getThemeColors, getDefaultTerminalConfig } from './utils/config';
5
7
  export { filterXtermAutoResponses } from './utils/xtermAutoResponseFilter';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,YAAY,EACV,MAAM,EACN,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,kCAAkC,EAAE,MAAM,wCAAwC,CAAC;AAEjG,YAAY,EACV,MAAM,EACN,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { TerminalCore } from './core/TerminalCore';
2
2
  export { useTerminalInstance } from './hooks/useTerminalInstance';
3
+ export { TerminalSessionsCoordinator } from './sessions/TerminalSessionsCoordinator';
3
4
  export { getThemeColors, getDefaultTerminalConfig } from './utils/config';
4
5
  export { filterXtermAutoResponses } from './utils/xtermAutoResponseFilter';
5
6
  //# 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAuBlE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAwBrF,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { Logger, TerminalSessionInfo, TerminalTransport } from '../types';
2
+ export type TerminalSessionsCoordinatorOptions = {
3
+ transport: TerminalTransport;
4
+ pollMs?: number;
5
+ logger?: Logger;
6
+ };
7
+ type sessions_listener = (sessions: TerminalSessionInfo[]) => void;
8
+ export declare class TerminalSessionsCoordinator {
9
+ private transport;
10
+ private pollMs;
11
+ private logger;
12
+ private sessions;
13
+ private listeners;
14
+ private pollTimer;
15
+ private refreshInFlight;
16
+ private refreshSeq;
17
+ private lastAppliedRefreshSeq;
18
+ private pendingDeletions;
19
+ private disposed;
20
+ constructor(opts: TerminalSessionsCoordinatorOptions);
21
+ getSnapshot(): TerminalSessionInfo[];
22
+ subscribe(listener: sessions_listener): () => void;
23
+ dispose(): void;
24
+ private emit;
25
+ private setSessions;
26
+ private ensurePolling;
27
+ private stopPolling;
28
+ refresh(): Promise<void>;
29
+ private runRefresh;
30
+ createSession(name?: string, workingDir?: string, cols?: number, rows?: number): Promise<TerminalSessionInfo>;
31
+ deleteSession(sessionId: string): Promise<void>;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=TerminalSessionsCoordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalSessionsCoordinator.d.ts","sourceRoot":"","sources":["../../src/sessions/TerminalSessionsCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG/E,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,iBAAiB,CAAC;IAI7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,iBAAiB,GAAG,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAkCnE,qBAAa,2BAA2B;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAgC;IAEjD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,qBAAqB,CAAK;IAElC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,kCAAkC;IAMpD,WAAW,IAAI,mBAAmB,EAAE;IAKpC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAwBlD,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,WAAW;IAMb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,UAAU;IAoCZ,aAAa,CACjB,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC;IAoBzB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BtD"}
@@ -0,0 +1,207 @@
1
+ import { noopLogger } from '../utils/logger';
2
+ const normalizeSessions = (list) => {
3
+ const byId = new Map();
4
+ for (const raw of list) {
5
+ const id = String(raw?.id ?? '').trim();
6
+ if (!id)
7
+ continue;
8
+ byId.set(id, { ...raw, id });
9
+ }
10
+ return [...byId.values()].sort((a, b) => {
11
+ const t = (a.createdAtMs ?? 0) - (b.createdAtMs ?? 0);
12
+ if (t !== 0)
13
+ return t;
14
+ return a.id.localeCompare(b.id);
15
+ });
16
+ };
17
+ const sessionsEqual = (a, b) => {
18
+ if (a === b)
19
+ return true;
20
+ if (a.length !== b.length)
21
+ return false;
22
+ for (let i = 0; i < a.length; i += 1) {
23
+ const sa = a[i];
24
+ const sb = b[i];
25
+ // Shallow compare the fields we rely on for UI: id + commonly displayed metadata.
26
+ if (sa.id !== sb.id)
27
+ return false;
28
+ if ((sa.name ?? '') !== (sb.name ?? ''))
29
+ return false;
30
+ if ((sa.workingDir ?? '') !== (sb.workingDir ?? ''))
31
+ return false;
32
+ if ((sa.createdAtMs ?? 0) !== (sb.createdAtMs ?? 0))
33
+ return false;
34
+ if ((sa.lastActiveAtMs ?? 0) !== (sb.lastActiveAtMs ?? 0))
35
+ return false;
36
+ if (Boolean(sa.isActive) !== Boolean(sb.isActive))
37
+ return false;
38
+ }
39
+ return true;
40
+ };
41
+ export class TerminalSessionsCoordinator {
42
+ constructor(opts) {
43
+ this.sessions = [];
44
+ this.listeners = new Set();
45
+ this.pollTimer = null;
46
+ this.refreshInFlight = null;
47
+ this.refreshSeq = 0;
48
+ this.lastAppliedRefreshSeq = 0;
49
+ this.pendingDeletions = new Set();
50
+ this.disposed = false;
51
+ this.transport = opts.transport;
52
+ this.pollMs = typeof opts.pollMs === 'number' && opts.pollMs > 0 ? opts.pollMs : 10000;
53
+ this.logger = opts.logger ?? noopLogger;
54
+ }
55
+ getSnapshot() {
56
+ // Protect internal state from accidental external mutations.
57
+ return [...this.sessions];
58
+ }
59
+ subscribe(listener) {
60
+ this.listeners.add(listener);
61
+ // Emit current snapshot immediately so subscribers can render synchronously.
62
+ try {
63
+ listener(this.getSnapshot());
64
+ }
65
+ catch (error) {
66
+ this.logger.warn('[TerminalSessionsCoordinator] listener threw on subscribe', { error });
67
+ }
68
+ if (this.listeners.size === 1) {
69
+ this.ensurePolling();
70
+ // Best-effort initial reconcile.
71
+ void this.refresh().catch(() => undefined);
72
+ }
73
+ return () => {
74
+ this.listeners.delete(listener);
75
+ if (this.listeners.size === 0) {
76
+ this.stopPolling();
77
+ }
78
+ };
79
+ }
80
+ dispose() {
81
+ if (this.disposed)
82
+ return;
83
+ this.disposed = true;
84
+ this.stopPolling();
85
+ this.listeners.clear();
86
+ this.sessions = [];
87
+ this.pendingDeletions.clear();
88
+ }
89
+ emit(next) {
90
+ for (const listener of this.listeners) {
91
+ try {
92
+ listener([...next]);
93
+ }
94
+ catch (error) {
95
+ this.logger.warn('[TerminalSessionsCoordinator] listener threw', { error });
96
+ }
97
+ }
98
+ }
99
+ setSessions(next) {
100
+ if (this.disposed)
101
+ return;
102
+ if (sessionsEqual(this.sessions, next))
103
+ return;
104
+ this.sessions = next;
105
+ this.emit(next);
106
+ }
107
+ ensurePolling() {
108
+ if (this.pollTimer)
109
+ return;
110
+ if (this.pollMs <= 0)
111
+ return;
112
+ if (!this.transport.listSessions)
113
+ return;
114
+ if (this.disposed)
115
+ return;
116
+ if (this.listeners.size === 0)
117
+ return;
118
+ this.pollTimer = setInterval(() => {
119
+ void this.refresh().catch(() => undefined);
120
+ }, this.pollMs);
121
+ }
122
+ stopPolling() {
123
+ if (!this.pollTimer)
124
+ return;
125
+ clearInterval(this.pollTimer);
126
+ this.pollTimer = null;
127
+ }
128
+ async refresh() {
129
+ return this.runRefresh(false);
130
+ }
131
+ runRefresh(force) {
132
+ if (this.disposed)
133
+ return Promise.resolve();
134
+ if (!this.transport.listSessions) {
135
+ return Promise.reject(new Error('Terminal transport does not support listSessions()'));
136
+ }
137
+ if (!force && this.refreshInFlight) {
138
+ return this.refreshInFlight;
139
+ }
140
+ const seq = ++this.refreshSeq;
141
+ const promise = (async () => {
142
+ const list = await this.transport.listSessions?.();
143
+ if (this.disposed)
144
+ return;
145
+ if (seq < this.lastAppliedRefreshSeq)
146
+ return;
147
+ const normalized = normalizeSessions(Array.isArray(list) ? list : []);
148
+ const filtered = this.pendingDeletions.size > 0
149
+ ? normalized.filter((s) => !this.pendingDeletions.has(s.id))
150
+ : normalized;
151
+ this.setSessions(filtered);
152
+ this.lastAppliedRefreshSeq = seq;
153
+ })();
154
+ let inFlight;
155
+ inFlight = promise.finally(() => {
156
+ if (this.refreshInFlight === inFlight) {
157
+ this.refreshInFlight = null;
158
+ }
159
+ });
160
+ this.refreshInFlight = inFlight;
161
+ return inFlight;
162
+ }
163
+ async createSession(name, workingDir, cols, rows) {
164
+ if (!this.transport.createSession) {
165
+ throw new Error('Terminal transport does not support createSession()');
166
+ }
167
+ const session = await this.transport.createSession(name, workingDir, cols, rows);
168
+ const id = String(session?.id ?? '').trim();
169
+ if (!id) {
170
+ throw new Error('Invalid createSession response: missing id');
171
+ }
172
+ const merged = normalizeSessions([...this.sessions, { ...session, id }]);
173
+ const filtered = this.pendingDeletions.size > 0
174
+ ? merged.filter((s) => !this.pendingDeletions.has(s.id))
175
+ : merged;
176
+ this.setSessions(filtered);
177
+ return { ...session, id };
178
+ }
179
+ async deleteSession(sessionId) {
180
+ if (!this.transport.deleteSession) {
181
+ throw new Error('Terminal transport does not support deleteSession()');
182
+ }
183
+ const id = String(sessionId ?? '').trim();
184
+ if (!id)
185
+ return;
186
+ this.pendingDeletions.add(id);
187
+ this.setSessions(this.sessions.filter((s) => s.id !== id));
188
+ try {
189
+ await this.transport.deleteSession(id);
190
+ this.pendingDeletions.delete(id);
191
+ // Best-effort reconcile to reflect any server-side changes (ordering, active flags, etc.).
192
+ void this.refresh().catch(() => undefined);
193
+ }
194
+ catch (error) {
195
+ // Remove the pending marker first so refresh can re-include the session if it still exists.
196
+ this.pendingDeletions.delete(id);
197
+ try {
198
+ await this.runRefresh(true);
199
+ }
200
+ catch (refreshError) {
201
+ this.logger.debug('[TerminalSessionsCoordinator] refresh failed after delete error', { refreshError });
202
+ }
203
+ throw error;
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=TerminalSessionsCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalSessionsCoordinator.js","sourceRoot":"","sources":["../../src/sessions/TerminalSessionsCoordinator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floegence/floeterm-terminal-web",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "Headless ghostty-web (xterm.js API-compatible) integration with data flow utilities. Provides TerminalCore and a React hook without UI components.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {