@a5c-ai/agent-mux-gateway 0.0.0 → 0.4.1

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 (89) hide show
  1. package/README.md +10 -3
  2. package/dist/auth/hashing.d.ts +3 -0
  3. package/dist/auth/hashing.d.ts.map +1 -0
  4. package/dist/auth/hashing.js +25 -0
  5. package/dist/auth/hashing.js.map +1 -0
  6. package/dist/auth/middleware.d.ts +4 -0
  7. package/dist/auth/middleware.d.ts.map +1 -0
  8. package/dist/auth/middleware.js +17 -0
  9. package/dist/auth/middleware.js.map +1 -0
  10. package/dist/auth/tokens.d.ts +45 -0
  11. package/dist/auth/tokens.d.ts.map +1 -0
  12. package/dist/auth/tokens.js +182 -0
  13. package/dist/auth/tokens.js.map +1 -0
  14. package/dist/builtin-adapters.d.ts +15 -0
  15. package/dist/builtin-adapters.d.ts.map +1 -0
  16. package/dist/builtin-adapters.js +110 -0
  17. package/dist/builtin-adapters.js.map +1 -0
  18. package/dist/config.d.ts +20 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +14 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/fanout/client-conn.d.ts +21 -0
  23. package/dist/fanout/client-conn.d.ts.map +1 -0
  24. package/dist/fanout/client-conn.js +53 -0
  25. package/dist/fanout/client-conn.js.map +1 -0
  26. package/dist/fanout/subscriber.d.ts +13 -0
  27. package/dist/fanout/subscriber.d.ts.map +1 -0
  28. package/dist/fanout/subscriber.js +40 -0
  29. package/dist/fanout/subscriber.js.map +1 -0
  30. package/dist/index.d.ts +15 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +14 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/logging.d.ts.map +1 -1
  35. package/dist/logging.js +1 -12
  36. package/dist/logging.js.map +1 -1
  37. package/dist/notifications/types.d.ts +19 -0
  38. package/dist/notifications/types.d.ts.map +1 -0
  39. package/dist/notifications/types.js +2 -0
  40. package/dist/notifications/types.js.map +1 -0
  41. package/dist/notifications/webhook-out.d.ts +4 -0
  42. package/dist/notifications/webhook-out.d.ts.map +1 -0
  43. package/dist/notifications/webhook-out.js +55 -0
  44. package/dist/notifications/webhook-out.js.map +1 -0
  45. package/dist/pairing/short-code.d.ts +21 -0
  46. package/dist/pairing/short-code.d.ts.map +1 -0
  47. package/dist/pairing/short-code.js +50 -0
  48. package/dist/pairing/short-code.js.map +1 -0
  49. package/dist/protocol/errors.d.ts +11 -0
  50. package/dist/protocol/errors.d.ts.map +1 -0
  51. package/dist/protocol/errors.js +15 -0
  52. package/dist/protocol/errors.js.map +1 -0
  53. package/dist/protocol/frames.d.ts +93 -0
  54. package/dist/protocol/frames.d.ts.map +1 -0
  55. package/dist/protocol/frames.js +139 -0
  56. package/dist/protocol/frames.js.map +1 -0
  57. package/dist/protocol/v1.d.ts +104 -0
  58. package/dist/protocol/v1.d.ts.map +1 -0
  59. package/dist/protocol/v1.js +2 -0
  60. package/dist/protocol/v1.js.map +1 -0
  61. package/dist/runs/event-log-index.d.ts +29 -0
  62. package/dist/runs/event-log-index.d.ts.map +1 -0
  63. package/dist/runs/event-log-index.js +195 -0
  64. package/dist/runs/event-log-index.js.map +1 -0
  65. package/dist/runs/event-log.d.ts +26 -0
  66. package/dist/runs/event-log.d.ts.map +1 -0
  67. package/dist/runs/event-log.js +104 -0
  68. package/dist/runs/event-log.js.map +1 -0
  69. package/dist/runs/hook-broker.d.ts +19 -0
  70. package/dist/runs/hook-broker.d.ts.map +1 -0
  71. package/dist/runs/hook-broker.js +97 -0
  72. package/dist/runs/hook-broker.js.map +1 -0
  73. package/dist/runs/manager.d.ts +51 -0
  74. package/dist/runs/manager.d.ts.map +1 -0
  75. package/dist/runs/manager.js +575 -0
  76. package/dist/runs/manager.js.map +1 -0
  77. package/dist/runs/types.d.ts +49 -0
  78. package/dist/runs/types.d.ts.map +1 -0
  79. package/dist/runs/types.js +2 -0
  80. package/dist/runs/types.js.map +1 -0
  81. package/dist/server.d.ts +16 -0
  82. package/dist/server.d.ts.map +1 -0
  83. package/dist/server.js +500 -0
  84. package/dist/server.js.map +1 -0
  85. package/dist/static/webui-server.d.ts +3 -0
  86. package/dist/static/webui-server.d.ts.map +1 -0
  87. package/dist/static/webui-server.js +97 -0
  88. package/dist/static/webui-server.js.map +1 -0
  89. package/package.json +10 -1
@@ -0,0 +1,40 @@
1
+ function asRunFrame(runId, event) {
2
+ return {
3
+ type: 'run.event',
4
+ runId,
5
+ seq: event.seq,
6
+ source: event.source,
7
+ event: event.event,
8
+ };
9
+ }
10
+ export class RunSubscriber {
11
+ conn;
12
+ runId;
13
+ queuedLiveEvents = [];
14
+ catchUpTailSeq;
15
+ constructor(conn, runId, catchUpTailSeq) {
16
+ this.conn = conn;
17
+ this.runId = runId;
18
+ this.catchUpTailSeq = catchUpTailSeq;
19
+ }
20
+ replay(events) {
21
+ for (const event of events) {
22
+ this.conn.send(asRunFrame(this.runId, event));
23
+ }
24
+ }
25
+ sendLive(event) {
26
+ if (this.catchUpTailSeq !== null && event.seq > this.catchUpTailSeq) {
27
+ this.queuedLiveEvents.push(event);
28
+ return;
29
+ }
30
+ this.conn.send(asRunFrame(this.runId, event));
31
+ }
32
+ finishCatchUp() {
33
+ this.catchUpTailSeq = null;
34
+ this.queuedLiveEvents.sort((left, right) => left.seq - right.seq);
35
+ for (const event of this.queuedLiveEvents.splice(0, this.queuedLiveEvents.length)) {
36
+ this.conn.send(asRunFrame(this.runId, event));
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/fanout/subscriber.ts"],"names":[],"mappings":"AAIA,SAAS,UAAU,CAAC,KAAa,EAAE,KAAqB;IACtD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAa;IAKb;IACA;IALM,gBAAgB,GAAqB,EAAE,CAAC;IACjD,cAAc,CAAgB;IAEtC,YACW,IAAgB,EAChB,KAAa,EACtB,cAAsB;QAFb,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAQ;QAGtB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,MAAiC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAqB;QAC5B,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACpE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,aAAa;QACX,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,27 @@
1
1
  import { GatewayConfig } from './config.js';
2
2
  import { GatewayLogger } from './logging.js';
3
+ import { type GatewayServer } from './server.js';
4
+ import type { RunManager } from './runs/manager.js';
3
5
  export type { GatewayConfig } from './config.js';
4
6
  export { DEFAULT_GATEWAY_CONFIG, resolveGatewayConfig, } from './config.js';
7
+ export type { GatewayRunClient } from './config.js';
5
8
  export type { GatewayLogger } from './logging.js';
6
9
  export { createGatewayLogger } from './logging.js';
10
+ export type { TokenStore, TokenRecord, TokenIssueResult } from './auth/tokens.js';
11
+ export { MemoryTokenStore, SqliteTokenStore } from './auth/tokens.js';
12
+ export { encodeFrame, decodeFrame, gatewayFrameSchema } from './protocol/frames.js';
13
+ export { GATEWAY_CLOSE_CODES, GatewayProtocolError } from './protocol/errors.js';
14
+ export type * from './protocol/v1.js';
15
+ export type { RunEntry, RunOwner, RunStartInput, RunStatus } from './runs/types.js';
16
+ export { RunManager } from './runs/manager.js';
17
+ export { resolveWebuiRoot, serveWebuiRequest } from './static/webui-server.js';
18
+ export type { NotificationWebhookConfig, HookRequestWebhookPayload, PushTarget } from './notifications/types.js';
19
+ export { createHookWebhookPayload, emitHookWebhook } from './notifications/webhook-out.js';
7
20
  export interface Gateway {
8
21
  readonly config: GatewayConfig;
9
22
  readonly logger: GatewayLogger;
23
+ readonly server: GatewayServer;
24
+ readonly runManager: RunManager;
10
25
  readonly started: boolean;
11
26
  start(): Promise<void>;
12
27
  stop(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,aAAa,EACd,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO,CAiC1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAGd,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjF,mBAAmB,kBAAkB,CAAC;AACtC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAE3F,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO,CAwC1E"}
package/dist/index.js CHANGED
@@ -1,14 +1,26 @@
1
1
  import { resolveGatewayConfig, } from './config.js';
2
2
  import { createGatewayLogger, } from './logging.js';
3
+ import { createGatewayServer } from './server.js';
3
4
  export { DEFAULT_GATEWAY_CONFIG, resolveGatewayConfig, } from './config.js';
4
5
  export { createGatewayLogger } from './logging.js';
6
+ export { MemoryTokenStore, SqliteTokenStore } from './auth/tokens.js';
7
+ export { encodeFrame, decodeFrame, gatewayFrameSchema } from './protocol/frames.js';
8
+ export { GATEWAY_CLOSE_CODES, GatewayProtocolError } from './protocol/errors.js';
9
+ export { RunManager } from './runs/manager.js';
10
+ export { resolveWebuiRoot, serveWebuiRequest } from './static/webui-server.js';
11
+ export { createHookWebhookPayload, emitHookWebhook } from './notifications/webhook-out.js';
5
12
  export function createGateway(config = {}) {
6
13
  const resolvedConfig = resolveGatewayConfig(config);
7
14
  const logger = createGatewayLogger();
15
+ const server = createGatewayServer(resolvedConfig, logger);
8
16
  let started = false;
9
17
  return {
10
18
  config: resolvedConfig,
11
19
  logger,
20
+ server,
21
+ get runManager() {
22
+ return server.runManager;
23
+ },
12
24
  get started() {
13
25
  return started;
14
26
  },
@@ -16,6 +28,7 @@ export function createGateway(config = {}) {
16
28
  if (started) {
17
29
  return;
18
30
  }
31
+ await server.start();
19
32
  started = true;
20
33
  logger.info('Gateway started', {
21
34
  host: resolvedConfig.host,
@@ -27,6 +40,7 @@ export function createGateway(config = {}) {
27
40
  if (!started) {
28
41
  return;
29
42
  }
43
+ await server.stop();
30
44
  started = false;
31
45
  logger.info('Gateway stopped', {
32
46
  host: resolvedConfig.host,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAUnD,MAAM,UAAU,aAAa,CAAC,SAAiC,EAAE;IAC/D,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,MAAM;QACN,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC7B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,WAAW,EAAE,cAAc,CAAC,WAAW;aACxC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC7B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,IAAI,EAAE,cAAc,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAMtE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAY3F,MAAM,UAAU,aAAa,CAAC,SAAiC,EAAE;IAC/D,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,MAAM;QACN,MAAM;QACN,IAAI,UAAU;YACZ,OAAO,MAAM,CAAC,UAAU,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC7B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,WAAW,EAAE,cAAc,CAAC,WAAW;aACxC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC7B,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,IAAI,EAAE,cAAc,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAoBD,wBAAgB,mBAAmB,IAAI,aAAa,CAenD"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAQD,wBAAgB,mBAAmB,IAAI,aAAa,CAenD"}
package/dist/logging.js CHANGED
@@ -1,18 +1,7 @@
1
1
  function write(level, message, meta) {
2
2
  const suffix = meta ? ` ${JSON.stringify(meta)}` : '';
3
3
  const line = `[agent-mux-gateway:${level}] ${message}${suffix}`;
4
- switch (level) {
5
- case 'debug':
6
- case 'info':
7
- console.log(line);
8
- return;
9
- case 'warn':
10
- console.warn(line);
11
- return;
12
- case 'error':
13
- console.error(line);
14
- return;
15
- }
4
+ process.stderr.write(`${line}\n`);
16
5
  }
17
6
  export function createGatewayLogger() {
18
7
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAOA,SAAS,KAAK,CAAC,KAA0C,EAAE,OAAe,EAAE,IAA8B;IACxG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,sBAAsB,KAAK,KAAK,OAAO,GAAG,MAAM,EAAE,CAAC;IAEhE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,CAAC,OAAO,EAAE,IAAI;YACjB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,IAAI;YAChB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,IAAI;YAChB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,IAAI;YACjB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAOA,SAAS,KAAK,CAAC,KAA0C,EAAE,OAAe,EAAE,IAA8B;IACxG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,sBAAsB,KAAK,KAAK,OAAO,GAAG,MAAM,EAAE,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,CAAC,OAAO,EAAE,IAAI;YACjB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,IAAI;YAChB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,IAAI;YAChB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,IAAI;YACjB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface PushTarget {
2
+ platform: 'ios';
3
+ deviceToken?: string;
4
+ topic?: string;
5
+ }
6
+ export interface HookRequestWebhookPayload {
7
+ type: 'hook.request';
8
+ runId: string;
9
+ hookRequestId: string;
10
+ kind: string;
11
+ compact: string;
12
+ pushTargets: PushTarget[];
13
+ }
14
+ export interface NotificationWebhookConfig {
15
+ url: string;
16
+ token?: string;
17
+ timeoutMs?: number;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/notifications/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/notifications/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { HookRequestWebhookPayload, NotificationWebhookConfig } from './types.js';
2
+ export declare function createHookWebhookPayload(runId: string, hookRequestId: string, kind: string, payload: Record<string, unknown>): HookRequestWebhookPayload;
3
+ export declare function emitHookWebhook(config: NotificationWebhookConfig, payload: HookRequestWebhookPayload): Promise<void>;
4
+ //# sourceMappingURL=webhook-out.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-out.d.ts","sourceRoot":"","sources":["../../src/notifications/webhook-out.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAc,MAAM,YAAY,CAAC;AA2BnG,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,yBAAyB,CAS3B;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1H"}
@@ -0,0 +1,55 @@
1
+ function compactSummary(kind, payload) {
2
+ const command = typeof payload['command'] === 'string' ? payload['command'] : null;
3
+ const toolName = typeof payload['toolName'] === 'string' ? payload['toolName'] : null;
4
+ const input = typeof payload['input'] === 'string' ? payload['input'] : null;
5
+ return [toolName ?? kind, command, input].filter(Boolean).join(' | ').slice(0, 220);
6
+ }
7
+ function normalizePushTargets(payload) {
8
+ const targets = payload['pushTargets'];
9
+ if (!Array.isArray(targets)) {
10
+ return [];
11
+ }
12
+ return targets.reduce((acc, target) => {
13
+ if (!target || typeof target !== 'object') {
14
+ return acc;
15
+ }
16
+ acc.push({
17
+ platform: 'ios',
18
+ deviceToken: typeof target['deviceToken'] === 'string' ? target['deviceToken'] : undefined,
19
+ topic: typeof target['topic'] === 'string' ? target['topic'] : undefined,
20
+ });
21
+ return acc;
22
+ }, []);
23
+ }
24
+ export function createHookWebhookPayload(runId, hookRequestId, kind, payload) {
25
+ return {
26
+ type: 'hook.request',
27
+ runId,
28
+ hookRequestId,
29
+ kind,
30
+ compact: compactSummary(kind, payload),
31
+ pushTargets: normalizePushTargets(payload),
32
+ };
33
+ }
34
+ export async function emitHookWebhook(config, payload) {
35
+ const controller = new AbortController();
36
+ const timer = setTimeout(() => controller.abort(), config.timeoutMs ?? 5000);
37
+ try {
38
+ const response = await fetch(config.url, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'content-type': 'application/json',
42
+ ...(config.token ? { authorization: `Bearer ${config.token}` } : {}),
43
+ },
44
+ body: JSON.stringify(payload),
45
+ signal: controller.signal,
46
+ });
47
+ if (!response.ok) {
48
+ throw new Error(`Notification webhook failed: ${response.status}`);
49
+ }
50
+ }
51
+ finally {
52
+ clearTimeout(timer);
53
+ }
54
+ }
55
+ //# sourceMappingURL=webhook-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-out.js","sourceRoot":"","sources":["../../src/notifications/webhook-out.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface PairingRecord {
2
+ code: string;
3
+ url: string;
4
+ token: string;
5
+ expiresAt: number;
6
+ }
7
+ export declare class ShortCodeStore {
8
+ private readonly ttlMs;
9
+ private readonly records;
10
+ constructor(ttlMs?: number);
11
+ generateCode(length?: number): string;
12
+ register(input: {
13
+ code?: string;
14
+ url: string;
15
+ token: string;
16
+ ttlMs?: number;
17
+ }): PairingRecord;
18
+ consume(code: string): PairingRecord | null;
19
+ cleanup(): void;
20
+ }
21
+ //# sourceMappingURL=short-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"short-code.d.ts","sourceRoot":"","sources":["../../src/pairing/short-code.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;gBAE/B,KAAK,GAAE,MAAsB;IAE1D,YAAY,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM;IAaxC,QAAQ,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa;IAY7F,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAY3C,OAAO,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,50 @@
1
+ export class ShortCodeStore {
2
+ ttlMs;
3
+ records = new Map();
4
+ constructor(ttlMs = 5 * 60 * 1000) {
5
+ this.ttlMs = ttlMs;
6
+ }
7
+ generateCode(length = 8) {
8
+ const digits = '0123456789';
9
+ let code = '';
10
+ do {
11
+ code = '';
12
+ for (let index = 0; index < length; index += 1) {
13
+ code += digits[Math.floor(Math.random() * digits.length)];
14
+ }
15
+ this.cleanup();
16
+ } while (this.records.has(code));
17
+ return code;
18
+ }
19
+ register(input) {
20
+ const code = input.code?.trim() || this.generateCode();
21
+ const record = {
22
+ code,
23
+ url: input.url,
24
+ token: input.token,
25
+ expiresAt: Date.now() + (input.ttlMs ?? this.ttlMs),
26
+ };
27
+ this.records.set(code, record);
28
+ return record;
29
+ }
30
+ consume(code) {
31
+ const record = this.records.get(code);
32
+ if (!record) {
33
+ return null;
34
+ }
35
+ this.records.delete(code);
36
+ if (record.expiresAt <= Date.now()) {
37
+ return null;
38
+ }
39
+ return record;
40
+ }
41
+ cleanup() {
42
+ const now = Date.now();
43
+ for (const [code, record] of this.records.entries()) {
44
+ if (record.expiresAt <= now) {
45
+ this.records.delete(code);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=short-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"short-code.js","sourceRoot":"","sources":["../../src/pairing/short-code.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IAGI;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5D,YAA6B,QAAgB,CAAC,GAAG,EAAE,GAAG,IAAI;QAA7B,UAAK,GAAL,KAAK,CAAwB;IAAG,CAAC;IAE9D,YAAY,CAAC,SAAiB,CAAC;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC;QAC5B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;YACV,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/C,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAE,CAAC;YAC7D,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,KAAoE;QAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvD,MAAM,MAAM,GAAkB;YAC5B,IAAI;YACJ,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;SACpD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,MAAM,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export declare const GATEWAY_CLOSE_CODES: Readonly<{
2
+ invalidFrame: 4400;
3
+ unauthorized: 4401;
4
+ backpressure: 4008;
5
+ rateLimit: 4029;
6
+ }>;
7
+ export declare class GatewayProtocolError extends Error {
8
+ readonly closeCode: number;
9
+ constructor(message: string, closeCode: number);
10
+ }
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/protocol/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB;;;;;EAK9B,CAAC;AAEH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAK/C"}
@@ -0,0 +1,15 @@
1
+ export const GATEWAY_CLOSE_CODES = Object.freeze({
2
+ invalidFrame: 4400,
3
+ unauthorized: 4401,
4
+ backpressure: 4008,
5
+ rateLimit: 4029,
6
+ });
7
+ export class GatewayProtocolError extends Error {
8
+ closeCode;
9
+ constructor(message, closeCode) {
10
+ super(message);
11
+ this.name = 'GatewayProtocolError';
12
+ this.closeCode = closeCode;
13
+ }
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/protocol/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC;AAEH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,SAAS,CAAS;IAE3B,YAAY,OAAe,EAAE,SAAiB;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,93 @@
1
+ import { z } from 'zod';
2
+ import type { GatewayFrame } from './v1.js';
3
+ export declare const gatewayFrameSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4
+ type: z.ZodLiteral<"auth">;
5
+ token: z.ZodString;
6
+ }, z.core.$strip>, z.ZodObject<{
7
+ type: z.ZodLiteral<"hello">;
8
+ protocolVersions: z.ZodArray<z.ZodLiteral<"1">>;
9
+ serverVersion: z.ZodString;
10
+ serverTime: z.ZodString;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ type: z.ZodLiteral<"error">;
13
+ code: z.ZodString;
14
+ message: z.ZodString;
15
+ runId: z.ZodOptional<z.ZodString>;
16
+ tailSeq: z.ZodOptional<z.ZodNumber>;
17
+ }, z.core.$strip>, z.ZodObject<{
18
+ type: z.ZodLiteral<"subscribe">;
19
+ runId: z.ZodString;
20
+ sinceSeq: z.ZodOptional<z.ZodNumber>;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ type: z.ZodLiteral<"unsubscribe">;
23
+ runId: z.ZodString;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ type: z.ZodLiteral<"session.subscribe">;
26
+ sessionId: z.ZodString;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ type: z.ZodLiteral<"session.unsubscribe">;
29
+ sessionId: z.ZodString;
30
+ }, z.core.$strip>, z.ZodObject<{
31
+ type: z.ZodLiteral<"session.start">;
32
+ agent: z.ZodString;
33
+ prompt: z.ZodString;
34
+ model: z.ZodOptional<z.ZodString>;
35
+ sessionId: z.ZodOptional<z.ZodString>;
36
+ runId: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strip>, z.ZodObject<{
38
+ type: z.ZodLiteral<"session.message">;
39
+ sessionId: z.ZodString;
40
+ prompt: z.ZodString;
41
+ agent: z.ZodOptional<z.ZodString>;
42
+ model: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strip>, z.ZodObject<{
44
+ type: z.ZodLiteral<"ping">;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ type: z.ZodLiteral<"pong">;
47
+ }, z.core.$strip>, z.ZodObject<{
48
+ type: z.ZodLiteral<"run.event">;
49
+ runId: z.ZodString;
50
+ seq: z.ZodNumber;
51
+ source: z.ZodString;
52
+ event: z.ZodRecord<z.ZodString, z.ZodUnknown>;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<"hook.request">;
55
+ hookRequestId: z.ZodString;
56
+ runId: z.ZodString;
57
+ hookKind: z.ZodString;
58
+ payload: z.ZodRecord<z.ZodString, z.ZodUnknown>;
59
+ deadlineTs: z.ZodNumber;
60
+ }, z.core.$strip>, z.ZodObject<{
61
+ type: z.ZodLiteral<"hook.decision">;
62
+ hookRequestId: z.ZodString;
63
+ decision: z.ZodEnum<{
64
+ allow: "allow";
65
+ deny: "deny";
66
+ }>;
67
+ reason: z.ZodOptional<z.ZodString>;
68
+ }, z.core.$strip>, z.ZodObject<{
69
+ type: z.ZodLiteral<"hook.resolved">;
70
+ hookRequestId: z.ZodString;
71
+ resolvedBy: z.ZodString;
72
+ decision: z.ZodEnum<{
73
+ allow: "allow";
74
+ deny: "deny";
75
+ }>;
76
+ }, z.core.$strip>, z.ZodObject<{
77
+ type: z.ZodLiteral<"pairing.register">;
78
+ code: z.ZodString;
79
+ url: z.ZodString;
80
+ token: z.ZodString;
81
+ }, z.core.$strip>, z.ZodObject<{
82
+ type: z.ZodLiteral<"pairing.consume">;
83
+ code: z.ZodString;
84
+ }, z.core.$strip>, z.ZodObject<{
85
+ type: z.ZodLiteral<"pairing.consumed">;
86
+ code: z.ZodString;
87
+ url: z.ZodString;
88
+ token: z.ZodString;
89
+ expiresAt: z.ZodNumber;
90
+ }, z.core.$strip>], "type">;
91
+ export declare function encodeFrame(frame: GatewayFrame): string;
92
+ export declare function decodeFrame(input: string): GatewayFrame;
93
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/protocol/frames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAwH5C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmB7B,CAAC;AAEH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAgBvD"}
@@ -0,0 +1,139 @@
1
+ import { z } from 'zod';
2
+ import { GATEWAY_CLOSE_CODES, GatewayProtocolError } from './errors.js';
3
+ const authFrameSchema = z.object({
4
+ type: z.literal('auth'),
5
+ token: z.string().min(1),
6
+ });
7
+ const helloFrameSchema = z.object({
8
+ type: z.literal('hello'),
9
+ protocolVersions: z.array(z.literal('1')).min(1),
10
+ serverVersion: z.string().min(1),
11
+ serverTime: z.string().min(1),
12
+ });
13
+ const errorFrameSchema = z.object({
14
+ type: z.literal('error'),
15
+ code: z.string().min(1),
16
+ message: z.string().min(1),
17
+ runId: z.string().optional(),
18
+ tailSeq: z.number().int().nonnegative().optional(),
19
+ });
20
+ const subscribeFrameSchema = z.object({
21
+ type: z.literal('subscribe'),
22
+ runId: z.string().min(1),
23
+ sinceSeq: z.number().int().nonnegative().optional(),
24
+ });
25
+ const unsubscribeFrameSchema = z.object({
26
+ type: z.literal('unsubscribe'),
27
+ runId: z.string().min(1),
28
+ });
29
+ const sessionSubscribeFrameSchema = z.object({
30
+ type: z.literal('session.subscribe'),
31
+ sessionId: z.string().min(1),
32
+ });
33
+ const sessionUnsubscribeFrameSchema = z.object({
34
+ type: z.literal('session.unsubscribe'),
35
+ sessionId: z.string().min(1),
36
+ });
37
+ const sessionStartFrameSchema = z.object({
38
+ type: z.literal('session.start'),
39
+ agent: z.string().min(1),
40
+ prompt: z.string(),
41
+ model: z.string().optional(),
42
+ sessionId: z.string().optional(),
43
+ runId: z.string().optional(),
44
+ });
45
+ const sessionMessageFrameSchema = z.object({
46
+ type: z.literal('session.message'),
47
+ sessionId: z.string().min(1),
48
+ prompt: z.string(),
49
+ agent: z.string().optional(),
50
+ model: z.string().optional(),
51
+ });
52
+ const pingFrameSchema = z.object({
53
+ type: z.literal('ping'),
54
+ });
55
+ const pongFrameSchema = z.object({
56
+ type: z.literal('pong'),
57
+ });
58
+ const runEventFrameSchema = z.object({
59
+ type: z.literal('run.event'),
60
+ runId: z.string().min(1),
61
+ seq: z.number().int().nonnegative(),
62
+ source: z.string().min(1),
63
+ event: z.record(z.string(), z.unknown()),
64
+ });
65
+ const hookRequestFrameSchema = z.object({
66
+ type: z.literal('hook.request'),
67
+ hookRequestId: z.string().min(1),
68
+ runId: z.string().min(1),
69
+ hookKind: z.string().min(1),
70
+ payload: z.record(z.string(), z.unknown()),
71
+ deadlineTs: z.number().int(),
72
+ });
73
+ const hookDecisionFrameSchema = z.object({
74
+ type: z.literal('hook.decision'),
75
+ hookRequestId: z.string().min(1),
76
+ decision: z.enum(['allow', 'deny']),
77
+ reason: z.string().optional(),
78
+ });
79
+ const hookResolvedFrameSchema = z.object({
80
+ type: z.literal('hook.resolved'),
81
+ hookRequestId: z.string().min(1),
82
+ resolvedBy: z.string().min(1),
83
+ decision: z.enum(['allow', 'deny']),
84
+ });
85
+ const pairingRegisterFrameSchema = z.object({
86
+ type: z.literal('pairing.register'),
87
+ code: z.string().min(1),
88
+ url: z.string().min(1),
89
+ token: z.string().min(1),
90
+ });
91
+ const pairingConsumeFrameSchema = z.object({
92
+ type: z.literal('pairing.consume'),
93
+ code: z.string().min(1),
94
+ });
95
+ const pairingConsumedFrameSchema = z.object({
96
+ type: z.literal('pairing.consumed'),
97
+ code: z.string().min(1),
98
+ url: z.string().min(1),
99
+ token: z.string().min(1),
100
+ expiresAt: z.number().int().positive(),
101
+ });
102
+ export const gatewayFrameSchema = z.discriminatedUnion('type', [
103
+ authFrameSchema,
104
+ helloFrameSchema,
105
+ errorFrameSchema,
106
+ subscribeFrameSchema,
107
+ unsubscribeFrameSchema,
108
+ sessionSubscribeFrameSchema,
109
+ sessionUnsubscribeFrameSchema,
110
+ sessionStartFrameSchema,
111
+ sessionMessageFrameSchema,
112
+ pingFrameSchema,
113
+ pongFrameSchema,
114
+ runEventFrameSchema,
115
+ hookRequestFrameSchema,
116
+ hookDecisionFrameSchema,
117
+ hookResolvedFrameSchema,
118
+ pairingRegisterFrameSchema,
119
+ pairingConsumeFrameSchema,
120
+ pairingConsumedFrameSchema,
121
+ ]);
122
+ export function encodeFrame(frame) {
123
+ return JSON.stringify(gatewayFrameSchema.parse(frame));
124
+ }
125
+ export function decodeFrame(input) {
126
+ let parsed;
127
+ try {
128
+ parsed = JSON.parse(input);
129
+ }
130
+ catch (error) {
131
+ throw new GatewayProtocolError(error instanceof Error ? error.message : 'Invalid JSON frame', GATEWAY_CLOSE_CODES.invalidFrame);
132
+ }
133
+ const result = gatewayFrameSchema.safeParse(parsed);
134
+ if (!result.success) {
135
+ throw new GatewayProtocolError(result.error.message, GATEWAY_CLOSE_CODES.invalidFrame);
136
+ }
137
+ return result.data;
138
+ }
139
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/protocol/frames.ts"],"names":[],"mappings":"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"}