@relaycast/engine 5.0.0 → 5.0.2

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 (202) hide show
  1. package/dist/adapters/node/index.d.ts.map +1 -1
  2. package/dist/adapters/node/index.js +0 -1
  3. package/dist/adapters/node/index.js.map +1 -1
  4. package/dist/adapters/node/realtime.d.ts +13 -41
  5. package/dist/adapters/node/realtime.d.ts.map +1 -1
  6. package/dist/adapters/node/realtime.js +68 -230
  7. package/dist/adapters/node/realtime.js.map +1 -1
  8. package/dist/auth/index.d.ts.map +1 -1
  9. package/dist/auth/index.js +31 -9
  10. package/dist/auth/index.js.map +1 -1
  11. package/dist/auth/tokenKind.d.ts +40 -0
  12. package/dist/auth/tokenKind.d.ts.map +1 -0
  13. package/dist/auth/tokenKind.js +89 -0
  14. package/dist/auth/tokenKind.js.map +1 -0
  15. package/dist/db/migrations/0025_node_kind_role_adapter.sql +45 -0
  16. package/dist/db/migrations/0026_observer_tokens.sql +32 -0
  17. package/dist/db/schema.d.ts +329 -0
  18. package/dist/db/schema.d.ts.map +1 -1
  19. package/dist/db/schema.js +32 -3
  20. package/dist/db/schema.js.map +1 -1
  21. package/dist/engine/action.d.ts +2 -2
  22. package/dist/engine/action.d.ts.map +1 -1
  23. package/dist/engine/action.js +182 -7
  24. package/dist/engine/action.js.map +1 -1
  25. package/dist/engine/activity.d.ts +6 -0
  26. package/dist/engine/activity.d.ts.map +1 -1
  27. package/dist/engine/activity.js +9 -2
  28. package/dist/engine/activity.js.map +1 -1
  29. package/dist/engine/agent.d.ts +0 -33
  30. package/dist/engine/agent.d.ts.map +1 -1
  31. package/dist/engine/agent.js +0 -155
  32. package/dist/engine/agent.js.map +1 -1
  33. package/dist/engine/attachments.d.ts +6 -0
  34. package/dist/engine/attachments.d.ts.map +1 -1
  35. package/dist/engine/attachments.js +37 -0
  36. package/dist/engine/attachments.js.map +1 -1
  37. package/dist/engine/console.d.ts +78 -1
  38. package/dist/engine/console.d.ts.map +1 -1
  39. package/dist/engine/console.js +175 -19
  40. package/dist/engine/console.js.map +1 -1
  41. package/dist/engine/delivery.d.ts +2 -0
  42. package/dist/engine/delivery.d.ts.map +1 -1
  43. package/dist/engine/delivery.js +4 -0
  44. package/dist/engine/delivery.js.map +1 -1
  45. package/dist/engine/deliveryWire.d.ts +4 -0
  46. package/dist/engine/deliveryWire.d.ts.map +1 -1
  47. package/dist/engine/deliveryWire.js +2 -0
  48. package/dist/engine/deliveryWire.js.map +1 -1
  49. package/dist/engine/deliveryWrites.d.ts +1 -0
  50. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  51. package/dist/engine/deliveryWrites.js +7 -2
  52. package/dist/engine/deliveryWrites.js.map +1 -1
  53. package/dist/engine/dm.d.ts.map +1 -1
  54. package/dist/engine/dm.js +11 -33
  55. package/dist/engine/dm.js.map +1 -1
  56. package/dist/engine/dmAll.d.ts.map +1 -1
  57. package/dist/engine/dmAll.js +2 -0
  58. package/dist/engine/dmAll.js.map +1 -1
  59. package/dist/engine/groupDm.d.ts +2 -3
  60. package/dist/engine/groupDm.d.ts.map +1 -1
  61. package/dist/engine/groupDm.js +8 -26
  62. package/dist/engine/groupDm.js.map +1 -1
  63. package/dist/engine/invocationCompletion.d.ts +1 -1
  64. package/dist/engine/invocationCompletion.d.ts.map +1 -1
  65. package/dist/engine/invocationCompletion.js +9 -2
  66. package/dist/engine/invocationCompletion.js.map +1 -1
  67. package/dist/engine/message.d.ts.map +1 -1
  68. package/dist/engine/message.js +15 -44
  69. package/dist/engine/message.js.map +1 -1
  70. package/dist/engine/node.d.ts +13 -1
  71. package/dist/engine/node.d.ts.map +1 -1
  72. package/dist/engine/node.js +100 -31
  73. package/dist/engine/node.js.map +1 -1
  74. package/dist/engine/nodeContext.d.ts +6 -1
  75. package/dist/engine/nodeContext.d.ts.map +1 -1
  76. package/dist/engine/nodeContext.js +47 -32
  77. package/dist/engine/nodeContext.js.map +1 -1
  78. package/dist/engine/nodeDeliver.d.ts +23 -0
  79. package/dist/engine/nodeDeliver.d.ts.map +1 -0
  80. package/dist/engine/nodeDeliver.js +81 -0
  81. package/dist/engine/nodeDeliver.js.map +1 -0
  82. package/dist/engine/observerToken.d.ts +110 -0
  83. package/dist/engine/observerToken.d.ts.map +1 -0
  84. package/dist/engine/observerToken.js +528 -0
  85. package/dist/engine/observerToken.js.map +1 -0
  86. package/dist/engine/search.d.ts +4 -0
  87. package/dist/engine/search.d.ts.map +1 -1
  88. package/dist/engine/search.js +6 -1
  89. package/dist/engine/search.js.map +1 -1
  90. package/dist/engine/thread.d.ts +4 -3
  91. package/dist/engine/thread.d.ts.map +1 -1
  92. package/dist/engine/thread.js +8 -0
  93. package/dist/engine/thread.js.map +1 -1
  94. package/dist/engine/wsAuth.d.ts +2 -6
  95. package/dist/engine/wsAuth.d.ts.map +1 -1
  96. package/dist/engine/wsAuth.js +20 -12
  97. package/dist/engine/wsAuth.js.map +1 -1
  98. package/dist/engine/wsTransform.d.ts.map +1 -1
  99. package/dist/engine/wsTransform.js +52 -36
  100. package/dist/engine/wsTransform.js.map +1 -1
  101. package/dist/engine.d.ts.map +1 -1
  102. package/dist/engine.js +4 -26
  103. package/dist/engine.js.map +1 -1
  104. package/dist/entrypoints/node.d.ts.map +1 -1
  105. package/dist/entrypoints/node.js +1 -14
  106. package/dist/entrypoints/node.js.map +1 -1
  107. package/dist/env.d.ts +3 -1
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/index.d.ts +3 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/middleware/auth.d.ts +8 -0
  114. package/dist/middleware/auth.d.ts.map +1 -1
  115. package/dist/middleware/auth.js +62 -0
  116. package/dist/middleware/auth.js.map +1 -1
  117. package/dist/middleware/logger.d.ts.map +1 -1
  118. package/dist/middleware/logger.js +4 -4
  119. package/dist/middleware/logger.js.map +1 -1
  120. package/dist/middleware/planLimits.d.ts.map +1 -1
  121. package/dist/middleware/planLimits.js +9 -2
  122. package/dist/middleware/planLimits.js.map +1 -1
  123. package/dist/middleware/rateLimit.d.ts.map +1 -1
  124. package/dist/middleware/rateLimit.js +13 -1
  125. package/dist/middleware/rateLimit.js.map +1 -1
  126. package/dist/middleware/usageTracker.d.ts.map +1 -1
  127. package/dist/middleware/usageTracker.js +2 -1
  128. package/dist/middleware/usageTracker.js.map +1 -1
  129. package/dist/node-reconnect.d.ts +13 -0
  130. package/dist/node-reconnect.d.ts.map +1 -0
  131. package/dist/node-reconnect.js +15 -0
  132. package/dist/node-reconnect.js.map +1 -0
  133. package/dist/ports/auth.d.ts +6 -2
  134. package/dist/ports/auth.d.ts.map +1 -1
  135. package/dist/ports/entitlements.d.ts +3 -1
  136. package/dist/ports/entitlements.d.ts.map +1 -1
  137. package/dist/ports/index.d.ts +1 -1
  138. package/dist/ports/index.d.ts.map +1 -1
  139. package/dist/ports/presence.d.ts +1 -3
  140. package/dist/ports/presence.d.ts.map +1 -1
  141. package/dist/ports/realtime.d.ts +16 -68
  142. package/dist/ports/realtime.d.ts.map +1 -1
  143. package/dist/ports/realtime.js +9 -9
  144. package/dist/providers/static-entitlements.js +4 -4
  145. package/dist/providers/static-entitlements.js.map +1 -1
  146. package/dist/routes/action.d.ts.map +1 -1
  147. package/dist/routes/action.js +13 -5
  148. package/dist/routes/action.js.map +1 -1
  149. package/dist/routes/agent.d.ts.map +1 -1
  150. package/dist/routes/agent.js +107 -51
  151. package/dist/routes/agent.js.map +1 -1
  152. package/dist/routes/channel.d.ts.map +1 -1
  153. package/dist/routes/channel.js +39 -46
  154. package/dist/routes/channel.js.map +1 -1
  155. package/dist/routes/console.d.ts.map +1 -1
  156. package/dist/routes/console.js +39 -9
  157. package/dist/routes/console.js.map +1 -1
  158. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  159. package/dist/routes/deliveryRouting.js +39 -20
  160. package/dist/routes/deliveryRouting.js.map +1 -1
  161. package/dist/routes/fanout.d.ts +1 -4
  162. package/dist/routes/fanout.d.ts.map +1 -1
  163. package/dist/routes/fanout.js +44 -55
  164. package/dist/routes/fanout.js.map +1 -1
  165. package/dist/routes/file.d.ts.map +1 -1
  166. package/dist/routes/file.js +15 -5
  167. package/dist/routes/file.js.map +1 -1
  168. package/dist/routes/inboundWebhook.js +1 -1
  169. package/dist/routes/inboundWebhook.js.map +1 -1
  170. package/dist/routes/message.d.ts.map +1 -1
  171. package/dist/routes/message.js +22 -4
  172. package/dist/routes/message.js.map +1 -1
  173. package/dist/routes/node.d.ts.map +1 -1
  174. package/dist/routes/node.js +61 -10
  175. package/dist/routes/node.js.map +1 -1
  176. package/dist/routes/observerToken.d.ts +4 -0
  177. package/dist/routes/observerToken.d.ts.map +1 -0
  178. package/dist/routes/observerToken.js +105 -0
  179. package/dist/routes/observerToken.js.map +1 -0
  180. package/dist/routes/presence.d.ts.map +1 -1
  181. package/dist/routes/presence.js +8 -12
  182. package/dist/routes/presence.js.map +1 -1
  183. package/dist/routes/reaction.d.ts.map +1 -1
  184. package/dist/routes/reaction.js +59 -7
  185. package/dist/routes/reaction.js.map +1 -1
  186. package/dist/routes/receipt.d.ts.map +1 -1
  187. package/dist/routes/receipt.js +20 -3
  188. package/dist/routes/receipt.js.map +1 -1
  189. package/dist/routes/search.d.ts.map +1 -1
  190. package/dist/routes/search.js +7 -4
  191. package/dist/routes/search.js.map +1 -1
  192. package/dist/routes/thread.d.ts.map +1 -1
  193. package/dist/routes/thread.js +20 -3
  194. package/dist/routes/thread.js.map +1 -1
  195. package/dist/routes/workspace.d.ts.map +1 -1
  196. package/dist/routes/workspace.js +20 -7
  197. package/dist/routes/workspace.js.map +1 -1
  198. package/package.json +7 -3
  199. package/dist/engine/resyncQuery.d.ts +0 -15
  200. package/dist/engine/resyncQuery.d.ts.map +0 -1
  201. package/dist/engine/resyncQuery.js +0 -125
  202. package/dist/engine/resyncQuery.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import { eq } from 'drizzle-orm';
2
- import { workspaces, agents } from '../db/schema.js';
2
+ import { workspaces, agents, nodes } from '../db/schema.js';
3
3
  import { sha256Hex } from '../lib/crypto.js';
4
+ import { getActiveObserverTokenByHash } from '../engine/observerToken.js';
5
+ import { parseAuthToken, validateTokenRequirement } from './tokenKind.js';
4
6
  /** SHA-256 hash of a raw token to its stored form. */
5
7
  export function hashToken(token) {
6
8
  return sha256Hex(token);
@@ -22,20 +24,22 @@ export class SqliteApiKeyAuthProvider {
22
24
  }
23
25
  async authenticate(args) {
24
26
  const { token, require, db } = args;
27
+ const parsedToken = parseAuthToken(token);
28
+ if (!parsedToken) {
29
+ return unauthorized('Invalid token format');
30
+ }
31
+ const requirement = validateTokenRequirement(parsedToken.kind, require);
32
+ if (!requirement.ok) {
33
+ return unauthorized(requirement.message, requirement.code);
34
+ }
25
35
  const hash = await hashToken(token);
26
- if (token.startsWith('rk_live_')) {
27
- if (require === 'agent') {
28
- return unauthorized('Agent token required (at_live_...)');
29
- }
36
+ if (parsedToken.kind === 'workspace') {
30
37
  const [workspace] = await db.select().from(workspaces).where(eq(workspaces.apiKeyHash, hash));
31
38
  if (!workspace)
32
39
  return unauthorized('Invalid API key');
33
40
  return { ok: true, workspace };
34
41
  }
35
- if (token.startsWith('at_live_')) {
36
- if (require === 'workspace') {
37
- return unauthorized('Workspace key required (rk_live_...)');
38
- }
42
+ if (parsedToken.kind === 'agent') {
39
43
  const [agent] = await db.select().from(agents).where(eq(agents.tokenHash, hash));
40
44
  if (!agent)
41
45
  return unauthorized('Invalid agent token', 'agent_token_invalid');
@@ -44,6 +48,24 @@ export class SqliteApiKeyAuthProvider {
44
48
  return unauthorized('Workspace not found');
45
49
  return { ok: true, workspace, agent };
46
50
  }
51
+ if (parsedToken.kind === 'node') {
52
+ const [node] = await db.select().from(nodes).where(eq(nodes.tokenHash, hash));
53
+ if (!node)
54
+ return unauthorized('Invalid node token', 'node_token_invalid');
55
+ const [workspace] = await db.select().from(workspaces).where(eq(workspaces.id, node.workspaceId));
56
+ if (!workspace)
57
+ return unauthorized('Workspace not found');
58
+ return { ok: true, workspace, node };
59
+ }
60
+ if (parsedToken.kind === 'observer') {
61
+ const observerToken = await getActiveObserverTokenByHash(db, hash);
62
+ if (!observerToken)
63
+ return unauthorized('Invalid observer token', 'observer_token_invalid');
64
+ const [workspace] = await db.select().from(workspaces).where(eq(workspaces.id, observerToken.workspaceId));
65
+ if (!workspace)
66
+ return unauthorized('Workspace not found');
67
+ return { ok: true, workspace, observerToken };
68
+ }
47
69
  return unauthorized('Invalid token format');
48
70
  }
49
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI7C,sDAAsD;AACtD,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,IAAI,GAAG,cAAc;IAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAwB;IACnC,SAAS,CAAC,KAAa;QACrB,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA2D;QAC5E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,OAAO,YAAY,CAAC,oCAAoC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,SAAS;gBAAE,OAAO,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,OAAO,YAAY,CAAC,sCAAsC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK;gBAAE,OAAO,YAAY,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;YAC9E,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACnG,IAAI,CAAC,SAAS;gBAAE,OAAO,YAAY,CAAC,qBAAqB,CAAC,CAAC;YAC3D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import type { AuthRequire } from '../ports/auth.js';
3
+ declare const tokenKindConfig: {
4
+ readonly workspace: {
5
+ readonly prefix: "rk_live_";
6
+ readonly requiredMessage: "Workspace key required (rk_live_...)";
7
+ };
8
+ readonly agent: {
9
+ readonly prefix: "at_live_";
10
+ readonly requiredMessage: "Agent token required (at_live_...)";
11
+ };
12
+ readonly node: {
13
+ readonly prefix: "nt_live_";
14
+ readonly requiredMessage: "Node token required (nt_live_...)";
15
+ };
16
+ readonly observer: {
17
+ readonly prefix: "ot_live_";
18
+ readonly requiredMessage: "Observer token required (ot_live_...)";
19
+ };
20
+ };
21
+ export type AuthTokenKind = keyof typeof tokenKindConfig;
22
+ type ParsedTokenFor<Kind extends AuthTokenKind> = {
23
+ kind: Kind;
24
+ token: string;
25
+ };
26
+ export declare const authTokenSchema: z.ZodUnion<readonly [z.ZodPipe<z.ZodString, z.ZodTransform<ParsedTokenFor<"workspace">, string>>, z.ZodPipe<z.ZodString, z.ZodTransform<ParsedTokenFor<"agent">, string>>, z.ZodPipe<z.ZodString, z.ZodTransform<ParsedTokenFor<"node">, string>>, z.ZodPipe<z.ZodString, z.ZodTransform<ParsedTokenFor<"observer">, string>>]>;
27
+ export type ParsedAuthToken = z.infer<typeof authTokenSchema>;
28
+ export declare function parseAuthToken(token: string): ParsedAuthToken | undefined;
29
+ export declare function getAuthTokenKind(token: string): AuthTokenKind | undefined;
30
+ export declare function requiredTokenMessage(kind: Exclude<AuthRequire, 'any'>): string;
31
+ export type AuthRequirementValidation = {
32
+ ok: true;
33
+ } | {
34
+ ok: false;
35
+ code: string;
36
+ message: string;
37
+ };
38
+ export declare function validateTokenRequirement(tokenKind: AuthTokenKind, require: AuthRequire): AuthRequirementValidation;
39
+ export {};
40
+ //# sourceMappingURL=tokenKind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenKind.d.ts","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;CAiBX,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,eAAe,CAAC;AAEzD,KAAK,cAAc,CAAC,IAAI,SAAS,aAAa,IAAI;IAChD,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsBF,eAAO,MAAM,eAAe,iUAK1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,CAE9E;AAYD,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,GACnB,yBAAyB,CA+B3B"}
@@ -0,0 +1,89 @@
1
+ import { z } from 'zod';
2
+ const tokenKindConfig = {
3
+ workspace: {
4
+ prefix: 'rk_live_',
5
+ requiredMessage: 'Workspace key required (rk_live_...)',
6
+ },
7
+ agent: {
8
+ prefix: 'at_live_',
9
+ requiredMessage: 'Agent token required (at_live_...)',
10
+ },
11
+ node: {
12
+ prefix: 'nt_live_',
13
+ requiredMessage: 'Node token required (nt_live_...)',
14
+ },
15
+ observer: {
16
+ prefix: 'ot_live_',
17
+ requiredMessage: 'Observer token required (ot_live_...)',
18
+ },
19
+ };
20
+ const workspaceTokenSchema = z
21
+ .string()
22
+ .startsWith(tokenKindConfig.workspace.prefix)
23
+ .transform((token) => ({ kind: 'workspace', token }));
24
+ const agentTokenSchema = z
25
+ .string()
26
+ .startsWith(tokenKindConfig.agent.prefix)
27
+ .transform((token) => ({ kind: 'agent', token }));
28
+ const nodeTokenSchema = z
29
+ .string()
30
+ .startsWith(tokenKindConfig.node.prefix)
31
+ .transform((token) => ({ kind: 'node', token }));
32
+ const observerTokenSchema = z
33
+ .string()
34
+ .startsWith(tokenKindConfig.observer.prefix)
35
+ .transform((token) => ({ kind: 'observer', token }));
36
+ export const authTokenSchema = z.union([
37
+ workspaceTokenSchema,
38
+ agentTokenSchema,
39
+ nodeTokenSchema,
40
+ observerTokenSchema,
41
+ ]);
42
+ export function parseAuthToken(token) {
43
+ const parsed = authTokenSchema.safeParse(token);
44
+ return parsed.success ? parsed.data : undefined;
45
+ }
46
+ export function getAuthTokenKind(token) {
47
+ return parseAuthToken(token)?.kind;
48
+ }
49
+ export function requiredTokenMessage(kind) {
50
+ return tokenKindConfig[kind].requiredMessage;
51
+ }
52
+ const allowedKindsByRequire = {
53
+ workspace: ['workspace'],
54
+ agent: ['agent'],
55
+ node: ['node'],
56
+ observer: ['observer'],
57
+ // `any` intentionally means user/workspace API credentials, not transport-only
58
+ // node credentials or scoped observer credentials.
59
+ any: ['workspace', 'agent'],
60
+ };
61
+ export function validateTokenRequirement(tokenKind, require) {
62
+ const allowedKinds = allowedKindsByRequire[require];
63
+ if (allowedKinds.includes(tokenKind)) {
64
+ return { ok: true };
65
+ }
66
+ if (tokenKind === 'node') {
67
+ return {
68
+ ok: false,
69
+ code: 'node_token_forbidden',
70
+ message: 'Node token cannot perform this operation',
71
+ };
72
+ }
73
+ if (tokenKind === 'observer') {
74
+ return {
75
+ ok: false,
76
+ code: 'observer_token_forbidden',
77
+ message: 'Observer token cannot perform this operation',
78
+ };
79
+ }
80
+ if (require === 'any') {
81
+ return { ok: false, code: 'unauthorized', message: 'Invalid token format' };
82
+ }
83
+ return {
84
+ ok: false,
85
+ code: 'unauthorized',
86
+ message: requiredTokenMessage(require),
87
+ };
88
+ }
89
+ //# sourceMappingURL=tokenKind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenKind.js","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ -- Split node kind (transport) from node role (ownership/capability) and
2
+ -- collapse WebSocket delivery onto one node envelope.
3
+
4
+ ALTER TABLE nodes ADD COLUMN role TEXT NOT NULL DEFAULT 'broker';
5
+ ALTER TABLE deliveries ADD COLUMN route_node_role TEXT DEFAULT NULL;
6
+
7
+ UPDATE nodes
8
+ SET
9
+ role = CASE
10
+ WHEN kind = 'direct_ws' THEN 'direct'
11
+ WHEN kind = 'fleet_ws' THEN 'broker'
12
+ WHEN kind = 'http_push' AND max_agents = 1 THEN 'direct'
13
+ WHEN kind = 'http_push' THEN 'broker'
14
+ ELSE role
15
+ END,
16
+ kind = CASE
17
+ WHEN kind IN ('direct_ws', 'fleet_ws') THEN 'ws'
18
+ ELSE kind
19
+ END,
20
+ delivery_adapter = CASE
21
+ WHEN delivery_adapter IN ('direct.ws.v1', 'fleet.ws.v1') THEN 'ws.node.v1'
22
+ ELSE delivery_adapter
23
+ END;
24
+
25
+ UPDATE deliveries
26
+ SET
27
+ route_node_role = CASE
28
+ WHEN route_node_kind = 'direct_ws' THEN 'direct'
29
+ WHEN route_node_kind = 'fleet_ws' THEN 'broker'
30
+ WHEN route_node_id IS NOT NULL THEN (
31
+ SELECT n.role
32
+ FROM nodes n
33
+ WHERE n.workspace_id = deliveries.workspace_id
34
+ AND n.id = deliveries.route_node_id
35
+ )
36
+ ELSE NULL
37
+ END,
38
+ route_node_kind = CASE
39
+ WHEN route_node_kind IN ('direct_ws', 'fleet_ws') THEN 'ws'
40
+ ELSE route_node_kind
41
+ END,
42
+ delivery_adapter = CASE
43
+ WHEN delivery_adapter IN ('direct.ws.v1', 'fleet.ws.v1') THEN 'ws.node.v1'
44
+ ELSE delivery_adapter
45
+ END;
@@ -0,0 +1,32 @@
1
+ -- Add scoped observer tokens for workspace realtime and read-only REST.
2
+
3
+ CREATE TABLE observer_tokens (
4
+ id TEXT PRIMARY KEY NOT NULL,
5
+ workspace_id TEXT NOT NULL,
6
+ name TEXT NOT NULL,
7
+ description TEXT,
8
+ token_hash TEXT NOT NULL,
9
+ scopes TEXT NOT NULL DEFAULT '[]',
10
+ filters TEXT NOT NULL DEFAULT '{}',
11
+ status TEXT NOT NULL DEFAULT 'active',
12
+ expires_at INTEGER,
13
+ created_by TEXT,
14
+ created_by_type TEXT NOT NULL DEFAULT 'workspace',
15
+ last_used_at INTEGER,
16
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
17
+ updated_at INTEGER,
18
+ revoked_at INTEGER,
19
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
20
+ );
21
+
22
+ CREATE UNIQUE INDEX observer_tokens_workspace_name_unique
23
+ ON observer_tokens (workspace_id, name);
24
+
25
+ CREATE UNIQUE INDEX observer_tokens_token_hash_unique
26
+ ON observer_tokens (token_hash);
27
+
28
+ CREATE INDEX idx_observer_tokens_workspace_status
29
+ ON observer_tokens (workspace_id, status);
30
+
31
+ CREATE INDEX idx_observer_tokens_expires_at
32
+ ON observer_tokens (expires_at);
@@ -8,6 +8,15 @@ export interface WorkspaceRetentionSettings {
8
8
  delivery_ttl_days?: number | null;
9
9
  message_log_ttl_days?: number | null;
10
10
  }
11
+ export interface ObserverTokenFilters {
12
+ channel_ids?: string[];
13
+ channel_names?: string[];
14
+ include_dms?: boolean;
15
+ dm_conversation_ids?: string[];
16
+ agent_ids?: string[];
17
+ event_types?: string[];
18
+ created_after?: string;
19
+ }
11
20
  export declare const workspaces: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
12
21
  name: "workspaces";
13
22
  schema: undefined;
@@ -605,6 +614,25 @@ export declare const nodes: import("drizzle-orm/sqlite-core").SQLiteTableWithCol
605
614
  }, {}, {
606
615
  length: number | undefined;
607
616
  }>;
617
+ role: import("drizzle-orm/sqlite-core").SQLiteColumn<{
618
+ name: "role";
619
+ tableName: "nodes";
620
+ dataType: "string";
621
+ columnType: "SQLiteText";
622
+ data: string;
623
+ driverParam: string;
624
+ notNull: true;
625
+ hasDefault: true;
626
+ isPrimaryKey: false;
627
+ isAutoincrement: false;
628
+ hasRuntimeDefault: false;
629
+ enumValues: [string, ...string[]];
630
+ baseColumn: never;
631
+ identity: undefined;
632
+ generated: undefined;
633
+ }, {}, {
634
+ length: number | undefined;
635
+ }>;
608
636
  deliveryAdapter: import("drizzle-orm/sqlite-core").SQLiteColumn<{
609
637
  name: "delivery_adapter";
610
638
  tableName: "nodes";
@@ -849,6 +877,288 @@ export declare const nodes: import("drizzle-orm/sqlite-core").SQLiteTableWithCol
849
877
  };
850
878
  dialect: "sqlite";
851
879
  }>;
880
+ export declare const observerTokens: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
881
+ name: "observer_tokens";
882
+ schema: undefined;
883
+ columns: {
884
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
885
+ name: "id";
886
+ tableName: "observer_tokens";
887
+ dataType: "string";
888
+ columnType: "SQLiteText";
889
+ data: string;
890
+ driverParam: string;
891
+ notNull: true;
892
+ hasDefault: false;
893
+ isPrimaryKey: true;
894
+ isAutoincrement: false;
895
+ hasRuntimeDefault: false;
896
+ enumValues: [string, ...string[]];
897
+ baseColumn: never;
898
+ identity: undefined;
899
+ generated: undefined;
900
+ }, {}, {
901
+ length: number | undefined;
902
+ }>;
903
+ workspaceId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
904
+ name: "workspace_id";
905
+ tableName: "observer_tokens";
906
+ dataType: "string";
907
+ columnType: "SQLiteText";
908
+ data: string;
909
+ driverParam: string;
910
+ notNull: true;
911
+ hasDefault: false;
912
+ isPrimaryKey: false;
913
+ isAutoincrement: false;
914
+ hasRuntimeDefault: false;
915
+ enumValues: [string, ...string[]];
916
+ baseColumn: never;
917
+ identity: undefined;
918
+ generated: undefined;
919
+ }, {}, {
920
+ length: number | undefined;
921
+ }>;
922
+ name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
923
+ name: "name";
924
+ tableName: "observer_tokens";
925
+ dataType: "string";
926
+ columnType: "SQLiteText";
927
+ data: string;
928
+ driverParam: string;
929
+ notNull: true;
930
+ hasDefault: false;
931
+ isPrimaryKey: false;
932
+ isAutoincrement: false;
933
+ hasRuntimeDefault: false;
934
+ enumValues: [string, ...string[]];
935
+ baseColumn: never;
936
+ identity: undefined;
937
+ generated: undefined;
938
+ }, {}, {
939
+ length: number | undefined;
940
+ }>;
941
+ description: import("drizzle-orm/sqlite-core").SQLiteColumn<{
942
+ name: "description";
943
+ tableName: "observer_tokens";
944
+ dataType: "string";
945
+ columnType: "SQLiteText";
946
+ data: string;
947
+ driverParam: string;
948
+ notNull: false;
949
+ hasDefault: false;
950
+ isPrimaryKey: false;
951
+ isAutoincrement: false;
952
+ hasRuntimeDefault: false;
953
+ enumValues: [string, ...string[]];
954
+ baseColumn: never;
955
+ identity: undefined;
956
+ generated: undefined;
957
+ }, {}, {
958
+ length: number | undefined;
959
+ }>;
960
+ tokenHash: import("drizzle-orm/sqlite-core").SQLiteColumn<{
961
+ name: "token_hash";
962
+ tableName: "observer_tokens";
963
+ dataType: "string";
964
+ columnType: "SQLiteText";
965
+ data: string;
966
+ driverParam: string;
967
+ notNull: true;
968
+ hasDefault: false;
969
+ isPrimaryKey: false;
970
+ isAutoincrement: false;
971
+ hasRuntimeDefault: false;
972
+ enumValues: [string, ...string[]];
973
+ baseColumn: never;
974
+ identity: undefined;
975
+ generated: undefined;
976
+ }, {}, {
977
+ length: number | undefined;
978
+ }>;
979
+ scopes: import("drizzle-orm/sqlite-core").SQLiteColumn<{
980
+ name: "scopes";
981
+ tableName: "observer_tokens";
982
+ dataType: "json";
983
+ columnType: "SQLiteTextJson";
984
+ data: string[];
985
+ driverParam: string;
986
+ notNull: true;
987
+ hasDefault: true;
988
+ isPrimaryKey: false;
989
+ isAutoincrement: false;
990
+ hasRuntimeDefault: false;
991
+ enumValues: undefined;
992
+ baseColumn: never;
993
+ identity: undefined;
994
+ generated: undefined;
995
+ }, {}, {
996
+ $type: string[];
997
+ }>;
998
+ filters: import("drizzle-orm/sqlite-core").SQLiteColumn<{
999
+ name: "filters";
1000
+ tableName: "observer_tokens";
1001
+ dataType: "json";
1002
+ columnType: "SQLiteTextJson";
1003
+ data: ObserverTokenFilters;
1004
+ driverParam: string;
1005
+ notNull: true;
1006
+ hasDefault: true;
1007
+ isPrimaryKey: false;
1008
+ isAutoincrement: false;
1009
+ hasRuntimeDefault: false;
1010
+ enumValues: undefined;
1011
+ baseColumn: never;
1012
+ identity: undefined;
1013
+ generated: undefined;
1014
+ }, {}, {
1015
+ $type: ObserverTokenFilters;
1016
+ }>;
1017
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1018
+ name: "status";
1019
+ tableName: "observer_tokens";
1020
+ dataType: "string";
1021
+ columnType: "SQLiteText";
1022
+ data: string;
1023
+ driverParam: string;
1024
+ notNull: true;
1025
+ hasDefault: true;
1026
+ isPrimaryKey: false;
1027
+ isAutoincrement: false;
1028
+ hasRuntimeDefault: false;
1029
+ enumValues: [string, ...string[]];
1030
+ baseColumn: never;
1031
+ identity: undefined;
1032
+ generated: undefined;
1033
+ }, {}, {
1034
+ length: number | undefined;
1035
+ }>;
1036
+ expiresAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1037
+ name: "expires_at";
1038
+ tableName: "observer_tokens";
1039
+ dataType: "date";
1040
+ columnType: "SQLiteTimestamp";
1041
+ data: Date;
1042
+ driverParam: number;
1043
+ notNull: false;
1044
+ hasDefault: false;
1045
+ isPrimaryKey: false;
1046
+ isAutoincrement: false;
1047
+ hasRuntimeDefault: false;
1048
+ enumValues: undefined;
1049
+ baseColumn: never;
1050
+ identity: undefined;
1051
+ generated: undefined;
1052
+ }, {}, {}>;
1053
+ createdBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1054
+ name: "created_by";
1055
+ tableName: "observer_tokens";
1056
+ dataType: "string";
1057
+ columnType: "SQLiteText";
1058
+ data: string;
1059
+ driverParam: string;
1060
+ notNull: false;
1061
+ hasDefault: false;
1062
+ isPrimaryKey: false;
1063
+ isAutoincrement: false;
1064
+ hasRuntimeDefault: false;
1065
+ enumValues: [string, ...string[]];
1066
+ baseColumn: never;
1067
+ identity: undefined;
1068
+ generated: undefined;
1069
+ }, {}, {
1070
+ length: number | undefined;
1071
+ }>;
1072
+ createdByType: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1073
+ name: "created_by_type";
1074
+ tableName: "observer_tokens";
1075
+ dataType: "string";
1076
+ columnType: "SQLiteText";
1077
+ data: string;
1078
+ driverParam: string;
1079
+ notNull: true;
1080
+ hasDefault: true;
1081
+ isPrimaryKey: false;
1082
+ isAutoincrement: false;
1083
+ hasRuntimeDefault: false;
1084
+ enumValues: [string, ...string[]];
1085
+ baseColumn: never;
1086
+ identity: undefined;
1087
+ generated: undefined;
1088
+ }, {}, {
1089
+ length: number | undefined;
1090
+ }>;
1091
+ lastUsedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1092
+ name: "last_used_at";
1093
+ tableName: "observer_tokens";
1094
+ dataType: "date";
1095
+ columnType: "SQLiteTimestamp";
1096
+ data: Date;
1097
+ driverParam: number;
1098
+ notNull: false;
1099
+ hasDefault: false;
1100
+ isPrimaryKey: false;
1101
+ isAutoincrement: false;
1102
+ hasRuntimeDefault: false;
1103
+ enumValues: undefined;
1104
+ baseColumn: never;
1105
+ identity: undefined;
1106
+ generated: undefined;
1107
+ }, {}, {}>;
1108
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1109
+ name: "created_at";
1110
+ tableName: "observer_tokens";
1111
+ dataType: "date";
1112
+ columnType: "SQLiteTimestamp";
1113
+ data: Date;
1114
+ driverParam: number;
1115
+ notNull: true;
1116
+ hasDefault: true;
1117
+ isPrimaryKey: false;
1118
+ isAutoincrement: false;
1119
+ hasRuntimeDefault: false;
1120
+ enumValues: undefined;
1121
+ baseColumn: never;
1122
+ identity: undefined;
1123
+ generated: undefined;
1124
+ }, {}, {}>;
1125
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1126
+ name: "updated_at";
1127
+ tableName: "observer_tokens";
1128
+ dataType: "date";
1129
+ columnType: "SQLiteTimestamp";
1130
+ data: Date;
1131
+ driverParam: number;
1132
+ notNull: false;
1133
+ hasDefault: false;
1134
+ isPrimaryKey: false;
1135
+ isAutoincrement: false;
1136
+ hasRuntimeDefault: false;
1137
+ enumValues: undefined;
1138
+ baseColumn: never;
1139
+ identity: undefined;
1140
+ generated: undefined;
1141
+ }, {}, {}>;
1142
+ revokedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
1143
+ name: "revoked_at";
1144
+ tableName: "observer_tokens";
1145
+ dataType: "date";
1146
+ columnType: "SQLiteTimestamp";
1147
+ data: Date;
1148
+ driverParam: number;
1149
+ notNull: false;
1150
+ hasDefault: false;
1151
+ isPrimaryKey: false;
1152
+ isAutoincrement: false;
1153
+ hasRuntimeDefault: false;
1154
+ enumValues: undefined;
1155
+ baseColumn: never;
1156
+ identity: undefined;
1157
+ generated: undefined;
1158
+ }, {}, {}>;
1159
+ };
1160
+ dialect: "sqlite";
1161
+ }>;
852
1162
  export declare const agentNodeBindings: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
853
1163
  name: "agent_node_bindings";
854
1164
  schema: undefined;
@@ -5539,6 +5849,25 @@ export declare const deliveries: import("drizzle-orm/sqlite-core").SQLiteTableWi
5539
5849
  }, {}, {
5540
5850
  length: number | undefined;
5541
5851
  }>;
5852
+ routeNodeRole: import("drizzle-orm/sqlite-core").SQLiteColumn<{
5853
+ name: "route_node_role";
5854
+ tableName: "deliveries";
5855
+ dataType: "string";
5856
+ columnType: "SQLiteText";
5857
+ data: string;
5858
+ driverParam: string;
5859
+ notNull: false;
5860
+ hasDefault: false;
5861
+ isPrimaryKey: false;
5862
+ isAutoincrement: false;
5863
+ hasRuntimeDefault: false;
5864
+ enumValues: [string, ...string[]];
5865
+ baseColumn: never;
5866
+ identity: undefined;
5867
+ generated: undefined;
5868
+ }, {}, {
5869
+ length: number | undefined;
5870
+ }>;
5542
5871
  deliveryAdapter: import("drizzle-orm/sqlite-core").SQLiteColumn<{
5543
5872
  name: "delivery_adapter";
5544
5873
  tableName: "deliveries";