@spinabot/brigade 1.14.0 → 1.15.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/protocol.js CHANGED
@@ -18,6 +18,86 @@
18
18
  *
19
19
  * Compatible with: any WebSocket client speaking this JSON shape.
20
20
  */
21
+ /* ─────────────────────── runtime discovery arrays ─────────────────────── */
22
+ /**
23
+ * Runtime list of every core request method, mirroring the `RequestMethod`
24
+ * union (types are erased at compile time, so a client can't enumerate them
25
+ * otherwise). The gateway advertises this (plus any plugin-registered methods)
26
+ * in `HelloOk.features.methods` on connect, so a web/mobile client discovers
27
+ * what it can call instead of hardcoding strings. `satisfies` makes adding an
28
+ * invalid method a compile error.
29
+ */
30
+ export const REQUEST_METHODS = [
31
+ "prompt",
32
+ "abort",
33
+ "steer",
34
+ "set-model",
35
+ "switch-model-mid-turn",
36
+ "set-thinking",
37
+ "compact",
38
+ "approval-resolve",
39
+ "exec-allow-all",
40
+ "exec-grant-skill",
41
+ "list-models",
42
+ "refresh-models",
43
+ "add-provider",
44
+ "get-state",
45
+ "resume",
46
+ "memory-graph",
47
+ "memory-query",
48
+ "shutdown",
49
+ "subscribe",
50
+ "unsubscribe",
51
+ "agents.list",
52
+ "sessions.list",
53
+ "cron.status",
54
+ "cron.list",
55
+ "cron.add",
56
+ "cron.update",
57
+ "cron.remove",
58
+ "cron.run",
59
+ "cron.runs",
60
+ "wake",
61
+ "org.snapshot",
62
+ ];
63
+ /**
64
+ * Runtime list of every server-pushed event name, mirroring `EventName`.
65
+ * Advertised in `HelloOk.features.events` so a client knows what to subscribe
66
+ * to. `satisfies` keeps it in lock-step with the union.
67
+ */
68
+ export const EVENT_NAMES = [
69
+ "pi",
70
+ "state",
71
+ "error",
72
+ "log",
73
+ "system-event",
74
+ "approval-request",
75
+ ];
76
+ /* ─────────────────────── pi inner-event contract ─────────────────────── */
77
+ /**
78
+ * The set of `pi.event.type` values the gateway forwards (mirrors Pi's
79
+ * `AgentSessionEvent` union). A web/mobile renderer switches on `pi.event.type`;
80
+ * this is the authoritative list so it can be exhaustive.
81
+ */
82
+ export const PI_EVENT_TYPES = [
83
+ "agent_start",
84
+ "turn_start",
85
+ "turn_end",
86
+ "message_start",
87
+ "message_update",
88
+ "message_end",
89
+ "tool_execution_start",
90
+ "tool_execution_update",
91
+ "tool_execution_end",
92
+ "agent_end",
93
+ "queue_update",
94
+ "compaction_start",
95
+ "compaction_end",
96
+ "auto_retry_start",
97
+ "auto_retry_end",
98
+ "session_info_changed",
99
+ "thinking_level_changed",
100
+ ];
21
101
  export function modelToSummary(model) {
22
102
  return {
23
103
  provider: model.provider,
@@ -48,18 +128,28 @@ export const EXIT_FAILURE = 1;
48
128
  export const EXIT_USAGE_ERROR = 2;
49
129
  export const EXIT_CONFIG_ERROR = 78;
50
130
  /**
51
- * Tick interval for the heartbeat. Server pushes a `pi`-wrapped tick event
52
- * every TICK_INTERVAL_MS so the client can detect a stalled connection.
53
- * Client closes if no frame received in this interval.
131
+ * Heartbeat interval. The server's keepalive today is the periodic `state`
132
+ * broadcast (a real frame that bumps the client's `lastFrameAt`), plus
133
+ * WS-protocol pings; the dedicated `TickFrame` type exists for forward-compat
134
+ * but is not emitted yet. The client closes + reconnects if NO frame arrives in
135
+ * 2× this interval (catches half-open sockets — the common backgrounded-mobile
136
+ * case), then `resume`s.
54
137
  */
55
138
  export const TICK_INTERVAL_MS = 30_000;
56
139
  /* ─────────────────────────── tiny runtime guards ─────────────────────────── */
57
- /** Cheap shape check before routing. Avoids dragging in AJV for v1's small surface. */
140
+ /** Cheap shape check before routing. Avoids dragging in AJV for v1's small surface.
141
+ * Accepts `tick`/`shutdown` too so the client never silently drops a keepalive
142
+ * or a graceful-shutdown notice (the old guard rejected both). */
58
143
  export function isFrame(value) {
59
144
  if (!value || typeof value !== "object")
60
145
  return false;
61
146
  const t = value.type;
62
- return t === "req" || t === "res" || t === "event";
147
+ return (t === "req" ||
148
+ t === "res" ||
149
+ t === "event" ||
150
+ t === "tick" ||
151
+ t === "shutdown" ||
152
+ t === "hello-ok");
63
153
  }
64
154
  /* ─────────────────────── Step 24 protocol barrel re-export ─────────────────────── */
65
155
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAolBH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC/C,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;QAC5B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACvC,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtE,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,iFAAiF;AAEjF,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAI,KAAa,CAAC,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,OAAO,CAAC;AACpD,CAAC;AAED,uFAAuF;AACvF;;;;;;GAMG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqQH,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,QAAQ;IACR,OAAO;IACP,OAAO;IACP,WAAW;IACX,uBAAuB;IACvB,cAAc;IACd,SAAS;IACT,kBAAkB;IAClB,gBAAgB;IAChB,kBAAkB;IAClB,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,WAAW;IACX,QAAQ;IACR,cAAc;IACd,cAAc;IACd,UAAU;IACV,WAAW;IACX,aAAa;IACb,aAAa;IACb,eAAe;IACf,aAAa;IACb,WAAW;IACX,UAAU;IACV,aAAa;IACb,aAAa;IACb,UAAU;IACV,WAAW;IACX,MAAM;IACN,cAAc;CAC8B,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,IAAI;IACJ,OAAO;IACP,OAAO;IACP,KAAK;IACL,cAAc;IACd,kBAAkB;CACsB,CAAC;AAE1C,6EAA6E;AAE7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,aAAa;IACb,YAAY;IACZ,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;IACpB,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,wBAAwB;CACf,CAAC;AAygBX,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC/C,OAAO;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;QAC5B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACvC,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtE,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,iFAAiF;AAEjF;;mEAEmE;AACnE,MAAM,UAAU,OAAO,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAI,KAAa,CAAC,IAAI,CAAC;IAC9B,OAAO,CACN,CAAC,KAAK,KAAK;QACX,CAAC,KAAK,KAAK;QACX,CAAC,KAAK,OAAO;QACb,CAAC,KAAK,MAAM;QACZ,CAAC,KAAK,UAAU;QAChB,CAAC,KAAK,UAAU,CAChB,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF;;;;;;GAMG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
@@ -17,7 +17,18 @@
17
17
  * - One-shot connect: caller awaits `client.ready` before sending requests
18
18
  */
19
19
  import { EventEmitter } from "node:events";
20
- import { type EventName, type EventPayload, type RequestMethod, type RequestParams, type ResponseFor } from "../protocol.js";
20
+ import { type EventName, type EventPayload, type RequestMethod, type RequestParams, type ResponseFor, type ResumeSnapshot, type ShutdownFrame } from "../protocol.js";
21
+ import type { HelloOk } from "../protocol/handshake.js";
22
+ /** Payload of the client-emitted `"resync"` event: a seq gap was detected on a
23
+ * session's ordered `pi` stream, so the consumer should `resume()` to backfill. */
24
+ export interface ClientResyncInfo {
25
+ sessionId: string;
26
+ lastSeq: number;
27
+ gotSeq: number;
28
+ }
29
+ /** Connection lifecycle state, emitted as the `"connection-state"` event so a
30
+ * UI can bind a status indicator directly. */
31
+ export type ClientConnectionState = "connecting" | "connected" | "reconnecting" | "closed";
21
32
  export interface ClientOptions {
22
33
  /** WebSocket URL. Defaults to `ws://127.0.0.1:7777`. */
23
34
  url?: string;
@@ -69,6 +80,20 @@ export declare class BrigadeClient extends EventEmitter {
69
80
  /** Last time we received any frame from the server. Tick watchdog reads this. */
70
81
  private lastFrameAt;
71
82
  private tickWatchTimer;
83
+ /**
84
+ * Last `seq` seen per session on the ordered `pi` stream. Used to detect a
85
+ * gap: when a frame's seq isn't `last + 1`, a frame was dropped or reordered
86
+ * (or the gateway restarted and reset its counters), so we emit `"resync"`
87
+ * and the consumer issues a `resume` to backfill from the transcript. Keyed
88
+ * by sessionId (= sessionKey), the same key `resume` syncs. Survives
89
+ * reconnects so the cursor stays meaningful across a blip.
90
+ */
91
+ private lastSeqBySession;
92
+ /** The most recent HelloOk frame (server connId, build version, epoch,
93
+ * advertised methods/events, policy limits). Undefined until first connect. */
94
+ private lastHelloOk;
95
+ /** Connection lifecycle state, mirrored by the "connection-state" event. */
96
+ private connState;
72
97
  /** Reconnect state. */
73
98
  private reconnectAttempt;
74
99
  private reconnectTimer;
@@ -77,6 +102,16 @@ export declare class BrigadeClient extends EventEmitter {
77
102
  connect(): Promise<void>;
78
103
  /** Close the connection permanently. Cancels reconnect, rejects pending. */
79
104
  close(): void;
105
+ /**
106
+ * Server handshake info from the last `HelloOk` — connId, build version,
107
+ * `epoch` (session generation), the advertised `features.{methods,events}`,
108
+ * and `policy` limits. Undefined before the first connect. A web/mobile
109
+ * client reads this to discover what it can call/subscribe to + the limits.
110
+ */
111
+ get server(): HelloOk | undefined;
112
+ /** Current connection lifecycle state (also pushed via "connection-state"). */
113
+ get connectionState(): ClientConnectionState;
114
+ private setConnState;
80
115
  /** True if the underlying socket is currently OPEN. */
81
116
  get isConnected(): boolean;
82
117
  /**
@@ -85,9 +120,39 @@ export declare class BrigadeClient extends EventEmitter {
85
120
  * timeout elapses, or the socket closes before a response arrives.
86
121
  */
87
122
  request<M extends RequestMethod>(method: M, params?: RequestParams[M], options?: RequestOptions): Promise<ResponseFor[M]>;
88
- /** Type-aware event subscription. Returns `this` for chaining (matches EventEmitter). */
123
+ /**
124
+ * Type-aware event subscription. Two families:
125
+ * - server-pushed events, typed by `EventName` → `EventPayload[K]`
126
+ * - client lifecycle events BrigadeClient emits itself: `"hello"` (the
127
+ * server's HelloOk handshake landed), `"connection-state"` (connecting /
128
+ * connected / reconnecting / closed), `"reconnected"` (socket re-opened),
129
+ * `"resync"` (a seq gap → call `resume()`), and `"shutdown"` (the gateway
130
+ * sent a graceful-shutdown frame).
131
+ * Returns `this` for chaining (matches EventEmitter).
132
+ */
89
133
  on<K extends EventName>(event: K, listener: (payload: EventPayload[K]) => void): this;
134
+ on(event: "hello", listener: (hello: HelloOk) => void): this;
135
+ on(event: "connection-state", listener: (state: ClientConnectionState) => void): this;
136
+ on(event: "reconnected", listener: () => void): this;
137
+ on(event: "resync", listener: (info: ClientResyncInfo) => void): this;
138
+ on(event: "shutdown", listener: (frame: ShutdownFrame) => void): this;
90
139
  off<K extends EventName>(event: K, listener: (payload: EventPayload[K]) => void): this;
140
+ off(event: "hello", listener: (hello: HelloOk) => void): this;
141
+ off(event: "connection-state", listener: (state: ClientConnectionState) => void): this;
142
+ off(event: "reconnected", listener: () => void): this;
143
+ off(event: "resync", listener: (info: ClientResyncInfo) => void): this;
144
+ off(event: "shutdown", listener: (frame: ShutdownFrame) => void): this;
145
+ /**
146
+ * Resume a session: fetch its committed transcript + head seq + header
147
+ * snapshot, and sync the local seq cursor so live frames continue cleanly
148
+ * from `headSeq + 1`. Call this on connect, on reconnect, and on a
149
+ * `"resync"` event. The consumer renders the returned `messages` through
150
+ * its identity-keyed applier (idempotent), so overlapping with live frames
151
+ * is harmless. This is the reliable-streaming recovery primitive — the
152
+ * transcript is the source of truth, so a dropped/reordered/missed frame
153
+ * always self-heals here.
154
+ */
155
+ resume(params?: RequestParams["resume"]): Promise<ResumeSnapshot>;
91
156
  private openSocket;
92
157
  private scheduleReconnect;
93
158
  private dispatchFrame;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tui/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,YAAY,EAGjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,aAAa;IAC7B,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC9B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,yEAAyE;IACzE,OAAO,CAAC,SAAS,CAAS;IAC1B,mDAAmD;IACnD,OAAO,CAAC,MAAM,CAAS;IAEvB;;oEAEgE;IAChE,OAAO,CAAC,OAAO,CAOX;IACJ,OAAO,CAAC,MAAM,CAAK;IAEnB,iFAAiF;IACjF,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAA6B;IAEnD,uBAAuB;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA6B;gBAEvC,IAAI,GAAE,aAAkB;IAOpC,6DAA6D;IACvD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,4EAA4E;IAC5E,KAAK,IAAI,IAAI;IAoBb,uDAAuD;IACvD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID;;;;OAIG;IACG,OAAO,CAAC,CAAC,SAAS,aAAa,EACpC,MAAM,EAAE,CAAC,EACT,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAiC1B,yFAAyF;IAChF,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAIrF,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAM/F,OAAO,CAAC,UAAU;IA2DlB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,aAAa;CAIrB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tui/client.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@
19
19
  import { EventEmitter } from "node:events";
20
20
  import WebSocket from "ws";
21
21
  import { DEFAULT_PORT, isFrame, TICK_INTERVAL_MS, } from "../protocol.js";
22
+ import { isSeqGap } from "../protocol/stream-seq.js";
22
23
  import { clientAuthHeaders } from "../core/gateway-auth.js";
23
24
  /**
24
25
  * Brigade gateway client. Construct → `await client.connect()` → use.
@@ -48,6 +49,20 @@ export class BrigadeClient extends EventEmitter {
48
49
  /** Last time we received any frame from the server. Tick watchdog reads this. */
49
50
  lastFrameAt = 0;
50
51
  tickWatchTimer;
52
+ /**
53
+ * Last `seq` seen per session on the ordered `pi` stream. Used to detect a
54
+ * gap: when a frame's seq isn't `last + 1`, a frame was dropped or reordered
55
+ * (or the gateway restarted and reset its counters), so we emit `"resync"`
56
+ * and the consumer issues a `resume` to backfill from the transcript. Keyed
57
+ * by sessionId (= sessionKey), the same key `resume` syncs. Survives
58
+ * reconnects so the cursor stays meaningful across a blip.
59
+ */
60
+ lastSeqBySession = new Map();
61
+ /** The most recent HelloOk frame (server connId, build version, epoch,
62
+ * advertised methods/events, policy limits). Undefined until first connect. */
63
+ lastHelloOk;
64
+ /** Connection lifecycle state, mirrored by the "connection-state" event. */
65
+ connState = "connecting";
51
66
  /** Reconnect state. */
52
67
  reconnectAttempt = 0;
53
68
  reconnectTimer;
@@ -84,6 +99,26 @@ export class BrigadeClient extends EventEmitter {
84
99
  }
85
100
  this.ws = undefined;
86
101
  this.connected = false;
102
+ this.setConnState("closed");
103
+ }
104
+ /**
105
+ * Server handshake info from the last `HelloOk` — connId, build version,
106
+ * `epoch` (session generation), the advertised `features.{methods,events}`,
107
+ * and `policy` limits. Undefined before the first connect. A web/mobile
108
+ * client reads this to discover what it can call/subscribe to + the limits.
109
+ */
110
+ get server() {
111
+ return this.lastHelloOk;
112
+ }
113
+ /** Current connection lifecycle state (also pushed via "connection-state"). */
114
+ get connectionState() {
115
+ return this.connState;
116
+ }
117
+ setConnState(state) {
118
+ if (this.connState === state)
119
+ return;
120
+ this.connState = state;
121
+ super.emit("connection-state", state);
87
122
  }
88
123
  /** True if the underlying socket is currently OPEN. */
89
124
  get isConnected() {
@@ -127,13 +162,34 @@ export class BrigadeClient extends EventEmitter {
127
162
  }
128
163
  });
129
164
  }
130
- /** Type-aware event subscription. Returns `this` for chaining (matches EventEmitter). */
131
165
  on(event, listener) {
132
166
  return super.on(event, listener);
133
167
  }
134
168
  off(event, listener) {
135
169
  return super.off(event, listener);
136
170
  }
171
+ /**
172
+ * Resume a session: fetch its committed transcript + head seq + header
173
+ * snapshot, and sync the local seq cursor so live frames continue cleanly
174
+ * from `headSeq + 1`. Call this on connect, on reconnect, and on a
175
+ * `"resync"` event. The consumer renders the returned `messages` through
176
+ * its identity-keyed applier (idempotent), so overlapping with live frames
177
+ * is harmless. This is the reliable-streaming recovery primitive — the
178
+ * transcript is the source of truth, so a dropped/reordered/missed frame
179
+ * always self-heals here.
180
+ */
181
+ async resume(params) {
182
+ // NOTE: we deliberately do NOT write `lastSeqBySession` here. The seq
183
+ // cursor is owned by `dispatchFrame`, which advances it to each live
184
+ // frame's seq as it arrives — so after a gap the cursor already reflects
185
+ // the last frame actually received, and the next contiguous frame won't
186
+ // re-trigger. Writing `headSeq` here (a snapshot that can LAG the live
187
+ // frames still streaming during the resume round-trip) would rewind the
188
+ // cursor below an already-applied frame, making the next live frame look
189
+ // like a fresh gap → a resync/resume storm on a busy session. resume()
190
+ // recovers CONTENT (the transcript); the cursor is pure live bookkeeping.
191
+ return this.request("resume", params);
192
+ }
137
193
  /* ─────────────────────────── socket lifecycle ─────────────────────────── */
138
194
  openSocket() {
139
195
  return new Promise((resolve, reject) => {
@@ -144,6 +200,7 @@ export class BrigadeClient extends EventEmitter {
144
200
  this.connected = true;
145
201
  this.reconnectAttempt = 0;
146
202
  this.lastFrameAt = Date.now();
203
+ this.setConnState("connected");
147
204
  resolved = true;
148
205
  resolve();
149
206
  });
@@ -183,8 +240,10 @@ export class BrigadeClient extends EventEmitter {
183
240
  }
184
241
  if (!resolved)
185
242
  reject(new Error("socket closed before open"));
186
- if (!this.closed)
243
+ if (!this.closed) {
244
+ this.setConnState("reconnecting");
187
245
  this.scheduleReconnect();
246
+ }
188
247
  });
189
248
  ws.on("error", (err) => {
190
249
  if (!resolved) {
@@ -230,10 +289,55 @@ export class BrigadeClient extends EventEmitter {
230
289
  return;
231
290
  }
232
291
  if (frame.type === "event") {
292
+ // Gap detection on the ordered stream. The server stamps a per-session
293
+ // monotonic `seq` on every ordered frame — `pi` (top-level),
294
+ // `approval-request`, and `system-event` — all sharing one counter, so
295
+ // any frame carrying a `seq` is part of it. If the next seq isn't
296
+ // `last + 1` we missed a frame (dropped by backpressure, reordered, or
297
+ // a gateway restart); emit `"resync"` so the consumer `resume`s and
298
+ // backfills (transcript + pending approvals + recent system-events).
299
+ // Frames without `seq` (state/error/log + sub-agent pi) are unordered
300
+ // side-channels and skip the check.
301
+ if (typeof frame.seq === "number") {
302
+ const sid = frame.payload?.sessionId;
303
+ if (sid) {
304
+ const last = this.lastSeqBySession.get(sid);
305
+ this.lastSeqBySession.set(sid, frame.seq);
306
+ if (isSeqGap(last, frame.seq)) {
307
+ super.emit("resync", { sessionId: sid, lastSeq: last, gotSeq: frame.seq });
308
+ }
309
+ }
310
+ }
233
311
  // Re-emit with the typed event name so on() handlers fire.
234
312
  super.emit(frame.event, frame.payload);
235
313
  return;
236
314
  }
315
+ if (frame.type === "hello-ok") {
316
+ // Server handshake (connId / build version / epoch / advertised
317
+ // methods+events / policy limits). If the `epoch` changed since the
318
+ // last HelloOk, the gateway restarted and its per-session seq counters
319
+ // reset — invalidate our cursors so the fresh low seqs aren't misread
320
+ // as a backwards gap; the consumer's reconnect → `resume` rebuilds.
321
+ const prevEpoch = this.lastHelloOk?.server.epoch;
322
+ this.lastHelloOk = frame;
323
+ if (prevEpoch !== undefined && prevEpoch !== frame.server.epoch) {
324
+ this.lastSeqBySession.clear();
325
+ }
326
+ super.emit("hello", frame);
327
+ return;
328
+ }
329
+ if (frame.type === "tick") {
330
+ // Keepalive — `lastFrameAt` already bumped in the message handler;
331
+ // receiving it is enough to keep the tick watchdog satisfied.
332
+ return;
333
+ }
334
+ if (frame.type === "shutdown") {
335
+ // Graceful shutdown notice — surface it so the consumer can show a
336
+ // "gateway restarting" line instead of a bare disconnect. The socket
337
+ // close that follows still drives the normal reconnect+resume path.
338
+ super.emit("shutdown", frame);
339
+ return;
340
+ }
237
341
  // type === "req" — server doesn't make requests of clients in v1; ignore.
238
342
  }
239
343
  /* ─────────────────────────── tick watchdog ─────────────────────────── */
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tui/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tui/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spinabot/brigade",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "description": "Brigade — your personal AI crew",
5
5
  "homepage": "https://brigade.spinabot.com",
6
6
  "author": "Spinabot <hello@brigade-agent.ai>",