@proletariat/cli 0.3.111 → 0.3.112

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 (52) hide show
  1. package/dist/commands/gateway/connect.d.ts +33 -0
  2. package/dist/commands/gateway/connect.js +130 -0
  3. package/dist/commands/gateway/connect.js.map +1 -0
  4. package/dist/commands/gateway/disconnect.d.ts +21 -0
  5. package/dist/commands/gateway/disconnect.js +69 -0
  6. package/dist/commands/gateway/disconnect.js.map +1 -0
  7. package/dist/commands/gateway/start.d.ts +23 -0
  8. package/dist/commands/gateway/start.js +133 -0
  9. package/dist/commands/gateway/start.js.map +1 -0
  10. package/dist/commands/gateway/status.d.ts +16 -0
  11. package/dist/commands/gateway/status.js +76 -0
  12. package/dist/commands/gateway/status.js.map +1 -0
  13. package/dist/commands/gateway/test.d.ts +22 -0
  14. package/dist/commands/gateway/test.js +83 -0
  15. package/dist/commands/gateway/test.js.map +1 -0
  16. package/dist/commands/reconcile.d.ts +29 -0
  17. package/dist/commands/reconcile.js +140 -0
  18. package/dist/commands/reconcile.js.map +1 -0
  19. package/dist/commands/work/ship.js +131 -61
  20. package/dist/commands/work/ship.js.map +1 -1
  21. package/dist/lib/gateway/channel-factory.d.ts +13 -0
  22. package/dist/lib/gateway/channel-factory.js +37 -0
  23. package/dist/lib/gateway/channel-factory.js.map +1 -0
  24. package/dist/lib/gateway/channels/telegram.d.ts +115 -0
  25. package/dist/lib/gateway/channels/telegram.js +215 -0
  26. package/dist/lib/gateway/channels/telegram.js.map +1 -0
  27. package/dist/lib/gateway/router.d.ts +84 -0
  28. package/dist/lib/gateway/router.js +140 -0
  29. package/dist/lib/gateway/router.js.map +1 -0
  30. package/dist/lib/gateway/session-poker.d.ts +35 -0
  31. package/dist/lib/gateway/session-poker.js +85 -0
  32. package/dist/lib/gateway/session-poker.js.map +1 -0
  33. package/dist/lib/gateway/types.d.ts +124 -0
  34. package/dist/lib/gateway/types.js +17 -0
  35. package/dist/lib/gateway/types.js.map +1 -0
  36. package/dist/lib/machine-db.d.ts +87 -0
  37. package/dist/lib/machine-db.js +135 -0
  38. package/dist/lib/machine-db.js.map +1 -1
  39. package/dist/lib/pr/index.d.ts +34 -2
  40. package/dist/lib/pr/index.js +95 -4
  41. package/dist/lib/pr/index.js.map +1 -1
  42. package/dist/lib/reconcile/core.d.ts +62 -0
  43. package/dist/lib/reconcile/core.js +137 -0
  44. package/dist/lib/reconcile/core.js.map +1 -0
  45. package/dist/lib/reconcile/index.d.ts +54 -0
  46. package/dist/lib/reconcile/index.js +377 -0
  47. package/dist/lib/reconcile/index.js.map +1 -0
  48. package/dist/lib/reconcile/types.d.ts +133 -0
  49. package/dist/lib/reconcile/types.js +16 -0
  50. package/dist/lib/reconcile/types.js.map +1 -0
  51. package/oclif.manifest.json +2534 -2192
  52. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Default SessionPoker implementation (PRLT-1255)
3
+ *
4
+ * Shells out to `prlt session poke <agent> <message> --wait --timeout N --json`
5
+ * and extracts the captured response from the JSON output.
6
+ *
7
+ * The router code itself is agnostic to this — tests inject a fake
8
+ * SessionPoker. This file exists so production code can pick up the real
9
+ * poker with zero wiring.
10
+ */
11
+ import { execFile } from 'node:child_process';
12
+ import { promisify } from 'node:util';
13
+ const execFileAsync = promisify(execFile);
14
+ /**
15
+ * Shell-based SessionPoker. Uses `execFile` (no shell) so nothing in the
16
+ * message body can trigger shell expansion or injection.
17
+ */
18
+ export class ShellSessionPoker {
19
+ binary;
20
+ cwd;
21
+ constructor(options = {}) {
22
+ this.binary = options.binary ?? 'prlt';
23
+ this.cwd = options.cwd;
24
+ }
25
+ async poke(agent, message, options) {
26
+ const timeoutSec = options?.waitTimeoutSec ?? 90;
27
+ const args = [
28
+ 'session',
29
+ 'poke',
30
+ agent,
31
+ message,
32
+ '--wait',
33
+ '--timeout',
34
+ String(timeoutSec),
35
+ '--json',
36
+ ];
37
+ const { stdout } = await execFileAsync(this.binary, args, {
38
+ cwd: this.cwd,
39
+ // Give the child a little longer than the internal wait so we
40
+ // don't race the --timeout.
41
+ timeout: (timeoutSec + 15) * 1000,
42
+ maxBuffer: 8 * 1024 * 1024,
43
+ });
44
+ // `prlt session poke --json` emits a single JSON object on success.
45
+ const parsed = parseFirstJsonObject(stdout);
46
+ if (!parsed)
47
+ return null;
48
+ if (typeof parsed.response === 'string')
49
+ return parsed.response;
50
+ return null;
51
+ }
52
+ }
53
+ /**
54
+ * Pull the first JSON object out of a mixed stdout stream. Needed because
55
+ * some oclif commands still emit human banners alongside `--json` output
56
+ * depending on terminal state.
57
+ */
58
+ function parseFirstJsonObject(stdout) {
59
+ const trimmed = stdout.trim();
60
+ if (!trimmed)
61
+ return null;
62
+ // Fast path: whole payload is JSON.
63
+ try {
64
+ const parsed = JSON.parse(trimmed);
65
+ if (parsed && typeof parsed === 'object')
66
+ return parsed;
67
+ }
68
+ catch {
69
+ // Fall through to scan.
70
+ }
71
+ const start = trimmed.indexOf('{');
72
+ const end = trimmed.lastIndexOf('}');
73
+ if (start === -1 || end === -1 || end < start)
74
+ return null;
75
+ try {
76
+ const parsed = JSON.parse(trimmed.slice(start, end + 1));
77
+ if (parsed && typeof parsed === 'object')
78
+ return parsed;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ return null;
84
+ }
85
+ //# sourceMappingURL=session-poker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-poker.js","sourceRoot":"","sources":["../../../src/lib/gateway/session-poker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGrC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAezC;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAQ;IACd,GAAG,CAAoB;IAExC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAA;QACtC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAAe,EAAE,OAAqC;QAC9E,MAAM,UAAU,GAAG,OAAO,EAAE,cAAc,IAAI,EAAE,CAAA;QAChD,MAAM,IAAI,GAAG;YACX,SAAS;YACT,MAAM;YACN,KAAK;YACL,OAAO;YACP,QAAQ;YACR,WAAW;YACX,MAAM,CAAC,UAAU,CAAC;YAClB,QAAQ;SACT,CAAA;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;YACxD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,8DAA8D;YAC9D,4BAA4B;YAC5B,OAAO,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,IAAI;YACjC,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;SAC3B,CAAC,CAAA;QAEF,oEAAoE;QACpE,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;QAC/D,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEzB,oCAAoC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAiC,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,IAAI,CAAA;IAE1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACxD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAiC,CAAA;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Messaging Gateway Types
3
+ *
4
+ * Defines the channel-agnostic abstraction that sits between external
5
+ * messaging platforms (Telegram, Slack, Discord, WhatsApp, ...) and the
6
+ * internal `prlt session poke` path that forwards user input to agent
7
+ * sessions.
8
+ *
9
+ * The gateway is designed so adding a new platform is a new adapter that
10
+ * implements `MessagingChannel` — zero changes to the router, storage,
11
+ * or commands.
12
+ *
13
+ * Epic: PRLT-1251 (Messaging Gateway)
14
+ * Ticket: PRLT-1255 (Telegram bot MVP)
15
+ */
16
+ /**
17
+ * A platform-specific identifier for a user or conversation on a channel.
18
+ *
19
+ * `channel` is the channel name (e.g. "telegram", "slack"), and `id` is the
20
+ * platform's own identifier. For Telegram, `id` is the numeric chat id
21
+ * encoded as a string (e.g. `"123456789"`).
22
+ *
23
+ * `displayName` is a best-effort human-readable label for logs/UI. It must
24
+ * never be used for routing.
25
+ */
26
+ export interface ChannelAddress {
27
+ channel: string;
28
+ id: string;
29
+ displayName?: string;
30
+ }
31
+ /**
32
+ * A normalized inbound message from any channel.
33
+ *
34
+ * Adapters convert platform payloads into this shape before handing them
35
+ * to the router. Adapters are responsible for idempotency via `id` — the
36
+ * router uses it to de-duplicate re-delivered messages.
37
+ */
38
+ export interface Message {
39
+ /** Stable per-channel message id (platform's id, stringified). */
40
+ id: string;
41
+ /** Channel name (matches MessagingChannel.name). */
42
+ channel: string;
43
+ /** Who sent the message. */
44
+ from: ChannelAddress;
45
+ /** Optional text body. Either `text` or `audio` should be set. */
46
+ text?: string;
47
+ /** Optional raw audio payload (voice note / audio message). */
48
+ audio?: Buffer;
49
+ /** Server-side timestamp of the message. */
50
+ timestamp: Date;
51
+ }
52
+ /**
53
+ * Handler signature used by channels to deliver inbound messages to the
54
+ * router. Channels call this from their read loop.
55
+ */
56
+ export type MessageHandler = (msg: Message) => Promise<void>;
57
+ /**
58
+ * A bidirectional adapter to an external messaging platform.
59
+ *
60
+ * Implementations MUST:
61
+ * - Normalize their inbound payloads into `Message` objects.
62
+ * - Deliver inbound messages by invoking the handler registered via
63
+ * `onMessage`.
64
+ * - Honor `start()` / `stop()` lifecycle cleanly so the gateway can shut
65
+ * down without leaking sockets, timers, or worker threads.
66
+ *
67
+ * Adapters MUST NOT touch the database, the session system, or the
68
+ * router directly. Their only public entry points are the methods
69
+ * defined here.
70
+ */
71
+ export interface MessagingChannel {
72
+ /** Stable channel name (e.g. "telegram"). Used as a primary key. */
73
+ readonly name: string;
74
+ /** Begin reading messages (e.g. open socket, start polling loop). */
75
+ start(): Promise<void>;
76
+ /** Stop reading and release all resources. Must be idempotent. */
77
+ stop(): Promise<void>;
78
+ /** Register the inbound-message handler. Called before `start()`. */
79
+ onMessage(handler: MessageHandler): void;
80
+ /** Send an outbound text message to a ChannelAddress. */
81
+ sendMessage(to: ChannelAddress, text: string): Promise<void>;
82
+ /** Optional: send an outbound voice note (PRLT-1234 territory). */
83
+ sendVoiceNote?(to: ChannelAddress, audio: Buffer): Promise<void>;
84
+ }
85
+ /**
86
+ * Persisted configuration for a registered channel.
87
+ *
88
+ * Stored in `machine.db` → `messaging_channels`. `configJson` is an
89
+ * adapter-specific blob — for Telegram it contains the bot token and
90
+ * allowlist of permitted user ids.
91
+ */
92
+ export interface MessagingChannelRecord {
93
+ name: string;
94
+ type: string;
95
+ configJson: string;
96
+ active: boolean;
97
+ lastMessageAt: Date | undefined;
98
+ }
99
+ /**
100
+ * A user → agent routing binding. The router creates one on first
101
+ * contact and reuses it for all subsequent messages.
102
+ */
103
+ export interface MessagingRouteRecord {
104
+ channel: string;
105
+ userId: string;
106
+ agentSessionId: string;
107
+ createdAt: Date;
108
+ lastUsedAt: Date | undefined;
109
+ }
110
+ /**
111
+ * Shape of `messaging_channels.config_json` when `type === "telegram"`.
112
+ *
113
+ * - `token`: Telegram Bot API token from @BotFather.
114
+ * - `allowlist`: numeric Telegram user ids (stringified) that are allowed
115
+ * to poke agents. Messages from non-allowlisted users are rejected at
116
+ * the router boundary.
117
+ * - `pollIntervalMs`: how often to long-poll getUpdates. Defaults to 0
118
+ * (use Telegram's long-poll timeout of 25 seconds).
119
+ */
120
+ export interface TelegramChannelConfig {
121
+ token: string;
122
+ allowlist: string[];
123
+ pollIntervalMs?: number;
124
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Messaging Gateway Types
3
+ *
4
+ * Defines the channel-agnostic abstraction that sits between external
5
+ * messaging platforms (Telegram, Slack, Discord, WhatsApp, ...) and the
6
+ * internal `prlt session poke` path that forwards user input to agent
7
+ * sessions.
8
+ *
9
+ * The gateway is designed so adding a new platform is a new adapter that
10
+ * implements `MessagingChannel` — zero changes to the router, storage,
11
+ * or commands.
12
+ *
13
+ * Epic: PRLT-1251 (Messaging Gateway)
14
+ * Ticket: PRLT-1255 (Telegram bot MVP)
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/gateway/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -16,6 +16,43 @@
16
16
  export type MachineExecutionStatus = 'starting' | 'running' | 'completed' | 'failed' | 'stopped';
17
17
  export type MachineLifecycleState = 'healthy' | 'idle' | 'died' | 'completed';
18
18
  export type MachineCleanupPolicy = 'on-exit' | 'persistent' | 'on-error-keep';
19
+ /**
20
+ * A registered messaging channel (Telegram, Slack, Discord, ...).
21
+ * `configJson` is an adapter-specific blob stored as text.
22
+ */
23
+ export interface MessagingChannelRow {
24
+ name: string;
25
+ type: string;
26
+ config_json: string;
27
+ active: number;
28
+ last_message_at: number | null;
29
+ }
30
+ export interface MessagingChannelRecord {
31
+ name: string;
32
+ type: string;
33
+ configJson: string;
34
+ active: boolean;
35
+ lastMessageAt: Date | undefined;
36
+ }
37
+ /**
38
+ * A persistent binding of `(channel, userId)` to an agent session.
39
+ * The router looks this up on every inbound message so a given user
40
+ * always lands on the same agent.
41
+ */
42
+ export interface MessagingRouteRow {
43
+ channel: string;
44
+ user_id: string;
45
+ agent_session_id: string;
46
+ created_at: number;
47
+ last_used_at: number | null;
48
+ }
49
+ export interface MessagingRouteRecord {
50
+ channel: string;
51
+ userId: string;
52
+ agentSessionId: string;
53
+ createdAt: Date;
54
+ lastUsedAt: Date | undefined;
55
+ }
19
56
  export interface MachineExecution {
20
57
  id: string;
21
58
  prompt: string;
@@ -151,5 +188,55 @@ export declare class MachineDB {
151
188
  * Get executions with stale heartbeats (older than timeoutMinutes).
152
189
  */
153
190
  getStaleExecutions(timeoutMinutes: number): MachineExecution[];
191
+ /**
192
+ * Insert or replace a registered messaging channel.
193
+ *
194
+ * Channels are keyed by `name` (e.g. "telegram"). Re-registering the
195
+ * same channel updates its config and marks it active — this is what
196
+ * `prlt gateway connect` does on repeat calls.
197
+ */
198
+ upsertMessagingChannel(params: {
199
+ name: string;
200
+ type: string;
201
+ configJson: string;
202
+ active?: boolean;
203
+ }): void;
204
+ /** Look up a single channel by name. */
205
+ getMessagingChannel(name: string): MessagingChannelRecord | null;
206
+ /**
207
+ * List channels. When `onlyActive` is true (the default), only channels
208
+ * with `active = 1` are returned — this is what the gateway daemon
209
+ * uses at startup.
210
+ */
211
+ listMessagingChannels(options?: {
212
+ onlyActive?: boolean;
213
+ }): MessagingChannelRecord[];
214
+ /** Mark a channel inactive (keeps config around for re-enable). */
215
+ setMessagingChannelActive(name: string, active: boolean): void;
216
+ /** Remove a channel's registration entirely. */
217
+ deleteMessagingChannel(name: string): void;
218
+ /**
219
+ * Stamp a channel's `last_message_at` to now — called each time the
220
+ * router successfully routes an inbound message. Used by
221
+ * `prlt gateway status` to show channel activity.
222
+ */
223
+ touchMessagingChannel(name: string, timestamp?: number): void;
224
+ /** Look up an existing route, or null if this user has never been seen. */
225
+ getMessagingRoute(channel: string, userId: string): MessagingRouteRecord | null;
226
+ /**
227
+ * Bind a `(channel, user)` pair to an agent session. Idempotent — if a
228
+ * binding already exists it is updated to point at the new agent.
229
+ */
230
+ upsertMessagingRoute(params: {
231
+ channel: string;
232
+ userId: string;
233
+ agentSessionId: string;
234
+ }): MessagingRouteRecord;
235
+ /** Stamp `last_used_at` to now — called every time a route is used. */
236
+ touchMessagingRoute(channel: string, userId: string, timestamp?: number): void;
237
+ /** List routes for a channel (or all channels when `channel` omitted). */
238
+ listMessagingRoutes(channel?: string): MessagingRouteRecord[];
239
+ /** Count messages handled by a channel since `since` (for status output). */
240
+ countMessagingRoutesForChannel(channel: string): number;
154
241
  close(): void;
155
242
  }
@@ -102,6 +102,28 @@ export class MachineDB {
102
102
  lifecycle_state TEXT NOT NULL DEFAULT 'healthy',
103
103
  retries INTEGER NOT NULL DEFAULT 0
104
104
  );
105
+
106
+ -- Messaging gateway (PRLT-1255) — bridges external messaging platforms
107
+ -- (Telegram, Slack, ...) to agent sessions via prlt session poke.
108
+ CREATE TABLE IF NOT EXISTS messaging_channels (
109
+ name TEXT PRIMARY KEY,
110
+ type TEXT NOT NULL,
111
+ config_json TEXT NOT NULL,
112
+ active INTEGER NOT NULL DEFAULT 1,
113
+ last_message_at INTEGER
114
+ );
115
+
116
+ CREATE TABLE IF NOT EXISTS messaging_routes (
117
+ channel TEXT NOT NULL,
118
+ user_id TEXT NOT NULL,
119
+ agent_session_id TEXT NOT NULL,
120
+ created_at INTEGER NOT NULL,
121
+ last_used_at INTEGER,
122
+ PRIMARY KEY (channel, user_id)
123
+ );
124
+
125
+ CREATE INDEX IF NOT EXISTS idx_messaging_routes_agent
126
+ ON messaging_routes(agent_session_id);
105
127
  `);
106
128
  // Migrate existing databases that don't have the persistent columns
107
129
  this.addColumnIfMissing('executions', 'persistent', 'INTEGER NOT NULL DEFAULT 0');
@@ -348,8 +370,121 @@ export class MachineDB {
348
370
  `).all(cutoff, Date.now() - timeoutMinutes * 60 * 1000);
349
371
  return rows.map(rowToExecution);
350
372
  }
373
+ // ===========================================================================
374
+ // Messaging gateway (PRLT-1255)
375
+ // ===========================================================================
376
+ /**
377
+ * Insert or replace a registered messaging channel.
378
+ *
379
+ * Channels are keyed by `name` (e.g. "telegram"). Re-registering the
380
+ * same channel updates its config and marks it active — this is what
381
+ * `prlt gateway connect` does on repeat calls.
382
+ */
383
+ upsertMessagingChannel(params) {
384
+ const active = params.active === false ? 0 : 1;
385
+ this.db.prepare(`
386
+ INSERT INTO messaging_channels (name, type, config_json, active, last_message_at)
387
+ VALUES (?, ?, ?, ?, NULL)
388
+ ON CONFLICT(name) DO UPDATE SET
389
+ type = excluded.type,
390
+ config_json = excluded.config_json,
391
+ active = excluded.active
392
+ `).run(params.name, params.type, params.configJson, active);
393
+ }
394
+ /** Look up a single channel by name. */
395
+ getMessagingChannel(name) {
396
+ const row = this.db.prepare('SELECT * FROM messaging_channels WHERE name = ?').get(name);
397
+ return row ? messagingChannelRowToRecord(row) : null;
398
+ }
399
+ /**
400
+ * List channels. When `onlyActive` is true (the default), only channels
401
+ * with `active = 1` are returned — this is what the gateway daemon
402
+ * uses at startup.
403
+ */
404
+ listMessagingChannels(options) {
405
+ const onlyActive = options?.onlyActive !== false;
406
+ const rows = onlyActive
407
+ ? this.db.prepare('SELECT * FROM messaging_channels WHERE active = 1 ORDER BY name ASC').all()
408
+ : this.db.prepare('SELECT * FROM messaging_channels ORDER BY name ASC').all();
409
+ return rows.map(messagingChannelRowToRecord);
410
+ }
411
+ /** Mark a channel inactive (keeps config around for re-enable). */
412
+ setMessagingChannelActive(name, active) {
413
+ this.db.prepare('UPDATE messaging_channels SET active = ? WHERE name = ?').run(active ? 1 : 0, name);
414
+ }
415
+ /** Remove a channel's registration entirely. */
416
+ deleteMessagingChannel(name) {
417
+ this.db.prepare('DELETE FROM messaging_channels WHERE name = ?').run(name);
418
+ }
419
+ /**
420
+ * Stamp a channel's `last_message_at` to now — called each time the
421
+ * router successfully routes an inbound message. Used by
422
+ * `prlt gateway status` to show channel activity.
423
+ */
424
+ touchMessagingChannel(name, timestamp = Date.now()) {
425
+ this.db.prepare('UPDATE messaging_channels SET last_message_at = ? WHERE name = ?').run(timestamp, name);
426
+ }
427
+ // ---------------------------------------------------------------------------
428
+ // Routes — (channel, user) → agent session
429
+ // ---------------------------------------------------------------------------
430
+ /** Look up an existing route, or null if this user has never been seen. */
431
+ getMessagingRoute(channel, userId) {
432
+ const row = this.db.prepare('SELECT * FROM messaging_routes WHERE channel = ? AND user_id = ?').get(channel, userId);
433
+ return row ? messagingRouteRowToRecord(row) : null;
434
+ }
435
+ /**
436
+ * Bind a `(channel, user)` pair to an agent session. Idempotent — if a
437
+ * binding already exists it is updated to point at the new agent.
438
+ */
439
+ upsertMessagingRoute(params) {
440
+ const now = Date.now();
441
+ this.db.prepare(`
442
+ INSERT INTO messaging_routes (channel, user_id, agent_session_id, created_at, last_used_at)
443
+ VALUES (?, ?, ?, ?, NULL)
444
+ ON CONFLICT(channel, user_id) DO UPDATE SET
445
+ agent_session_id = excluded.agent_session_id
446
+ `).run(params.channel, params.userId, params.agentSessionId, now);
447
+ return this.getMessagingRoute(params.channel, params.userId);
448
+ }
449
+ /** Stamp `last_used_at` to now — called every time a route is used. */
450
+ touchMessagingRoute(channel, userId, timestamp = Date.now()) {
451
+ this.db.prepare('UPDATE messaging_routes SET last_used_at = ? WHERE channel = ? AND user_id = ?').run(timestamp, channel, userId);
452
+ }
453
+ /** List routes for a channel (or all channels when `channel` omitted). */
454
+ listMessagingRoutes(channel) {
455
+ const rows = channel
456
+ ? this.db.prepare('SELECT * FROM messaging_routes WHERE channel = ? ORDER BY created_at DESC').all(channel)
457
+ : this.db.prepare('SELECT * FROM messaging_routes ORDER BY created_at DESC').all();
458
+ return rows.map(messagingRouteRowToRecord);
459
+ }
460
+ /** Count messages handled by a channel since `since` (for status output). */
461
+ countMessagingRoutesForChannel(channel) {
462
+ const row = this.db.prepare('SELECT COUNT(*) AS n FROM messaging_routes WHERE channel = ?').get(channel);
463
+ return row?.n ?? 0;
464
+ }
351
465
  close() {
352
466
  this.db.close();
353
467
  }
354
468
  }
469
+ // =============================================================================
470
+ // Row → record converters for messaging tables
471
+ // =============================================================================
472
+ function messagingChannelRowToRecord(row) {
473
+ return {
474
+ name: row.name,
475
+ type: row.type,
476
+ configJson: row.config_json,
477
+ active: row.active === 1,
478
+ lastMessageAt: row.last_message_at ? new Date(row.last_message_at) : undefined,
479
+ };
480
+ }
481
+ function messagingRouteRowToRecord(row) {
482
+ return {
483
+ channel: row.channel,
484
+ userId: row.user_id,
485
+ agentSessionId: row.agent_session_id,
486
+ createdAt: new Date(row.created_at),
487
+ lastUsedAt: row.last_used_at ? new Date(row.last_used_at) : undefined,
488
+ };
489
+ }
355
490
  //# sourceMappingURL=machine-db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"machine-db.js","sourceRoot":"","sources":["../../src/lib/machine-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"machine-db.js","sourceRoot":"","sources":["../../src/lib/machine-db.ts"],"names":[],"mappings":"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"}
@@ -118,14 +118,46 @@ export declare function getCommitLog(base: string, cwd?: string): string[];
118
118
  * Create a GitHub pull request using `gh` CLI.
119
119
  */
120
120
  export declare function createPR(options: CreatePROptions): CreatePRResult;
121
+ /**
122
+ * Options accepted by PR lookup helpers.
123
+ *
124
+ * Either `cwd` (local git repo that gh infers the repo from) OR `repo`
125
+ * (explicit "owner/repo" passed via `--repo`) may be supplied. If both are
126
+ * set, `repo` is preferred — it's immune to cwd/git state and works
127
+ * regardless of where the process is running.
128
+ */
129
+ export interface PRLookupOptions {
130
+ /** Working directory for gh (used to infer repo from git remote). */
131
+ cwd?: string;
132
+ /** Explicit "owner/repo" string. When set, passed via `gh --repo`. */
133
+ repo?: string;
134
+ }
121
135
  /**
122
136
  * Get PR info for a branch.
137
+ *
138
+ * Pass `{ repo }` to bypass git-cwd inference (useful when the process is
139
+ * not running inside the repo, e.g. workspace root).
123
140
  */
124
- export declare function getPRForBranch(branch: string, cwd?: string): PRInfo | null;
141
+ export declare function getPRForBranch(branch: string, cwdOrOptions?: string | PRLookupOptions): PRInfo | null;
125
142
  /**
126
143
  * Get PR info by number.
144
+ *
145
+ * Pass `{ repo }` to bypass git-cwd inference (useful when the process is
146
+ * not running inside the repo, e.g. workspace root or non-git directory).
147
+ */
148
+ export declare function getPRByNumber(prNumber: number, cwdOrOptions?: string | PRLookupOptions): PRInfo | null;
149
+ /**
150
+ * Find a PR (open, closed, or merged) for a ticket by querying GitHub live.
151
+ *
152
+ * Searches GitHub for PRs whose head branch matches any of the provided
153
+ * ticket identifiers. This is the live-GitHub fallback used by `work ship`
154
+ * when local ticket metadata has no `pr_number` and the branch can't be
155
+ * resolved locally (e.g. after a Linear sync wiped metadata, or when the
156
+ * branch has already been deleted post-merge).
157
+ *
158
+ * Returns the first matching PR, preferring open PRs, then merged, then closed.
127
159
  */
128
- export declare function getPRByNumber(prNumber: number, cwd?: string): PRInfo | null;
160
+ export declare function findPRForTicket(ticketIds: string[], cwdOrOptions?: string | PRLookupOptions): PRInfo | null;
129
161
  /**
130
162
  * List open PRs for the current repo.
131
163
  */